{"record":{"id":"0a7e5bcee9b3cd01","repo":"Tencent/WeKnora","slug":"e2b-backend-does-not-support-nevertimeout","errorCode":null,"errorMessage":"E2B backend does not support NeverTimeout","messagePattern":"E2B backend does not support NeverTimeout","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sandbox/e2b_remote_client.go","lineNumber":1101,"sourceCode":"\t\tif value > 0 && value < time.Second {\n\t\t\treturn 0, errors.New(\"E2B timeout must be at least one second\")\n\t\t}\n\t\tseconds := value / time.Second\n\t\tif value%time.Second != 0 {\n\t\t\tseconds++\n\t\t}\n\t\treturn int(seconds), nil\n\t}\n\n\tswitch policy.Mode {\n\tcase \"\", RemoteTimeoutServerDefault:\n\t\tif fallback <= 0 {\n\t\t\treturn 0, nil\n\t\t}\n\t\treturn toSeconds(fallback)\n\tcase RemoteTimeoutExplicit:\n\t\tif policy.Value < 0 {\n\t\t\treturn 0, errors.New(\"E2B backend does not support NeverTimeout\")\n\t\t}\n\t\treturn toSeconds(policy.Value)\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unsupported timeout mode %q\", policy.Mode)\n\t}\n}\n\n// toE2BVolumeMounts converts the provider-neutral RemoteVolumeMount slice to\n// E2B SDK VolumeMount values. Nil and empty inputs both produce nil.\nfunc toE2BVolumeMounts(src []RemoteVolumeMount) []e2b.VolumeMount {\n\tif len(src) == 0 {\n\t\treturn nil\n\t}\n\tresult := make([]e2b.VolumeMount, len(src))\n\tfor i, mount := range src {\n\t\tresult[i] = e2b.VolumeMount{\n\t\t\tName: mount.Name,\n\t\t\tPath: mount.Path,","sourceCodeStart":1083,"sourceCodeEnd":1119,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/sandbox/e2b_remote_client.go#L1083-L1119","documentation":"E2B sandboxes always have a finite TTL, so a RemoteTimeoutPolicy of mode RemoteTimeoutExplicit carrying a negative value — the library's encoding of NeverTimeout — is unsupported and rejected by e2bTimeoutSeconds. The error tells the lifecycle coordinator to choose a different timeout policy or backend instead of issuing an impossible request.","triggerScenarios":"Mapping a RemoteTimeoutPolicy via e2bTimeoutSeconds (called from Create, Connect, Get, Delete, CreateSnapshot) where Mode is RemoteTimeoutExplicit and Value < 0 (the NeverTimeout encoding).","commonSituations":"A caller explicitly requests an immortal/never-expiring sandbox on E2B; a policy computed for the Docker backend (which supports no-timeout) is reused for E2B; config migration converts 'no timeout' into a negative explicit value.","solutions":["Use a large finite explicit timeout instead of NeverTimeout when targeting E2B","Let the lifecycle coordinator pick a supported policy — do not force RemoteTimeoutPolicy{Mode: RemoteTimeoutExplicit, Value: -1} for E2B","Switch to a backend that supports no-timeout (e.g. Docker) if unbounded lifetimes are required"],"exampleFix":"// before\npolicy := sandbox.RemoteTimeoutPolicy{Mode: sandbox.RemoteTimeoutExplicit, Value: -1} // never\n// after\npolicy := sandbox.RemoteTimeoutPolicy{Mode: sandbox.RemoteTimeoutExplicit, Value: 24 * time.Hour}","handlingStrategy":"validation","validationCode":"if policy.Mode == sandbox.RemoteTimeoutExplicit && policy.Value < 0 {\n    // E2B cannot express NeverTimeout: substitute a large finite TTL\n    policy.Value = 24 * time.Hour\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never reuse Docker-style no-timeout policies for the E2B backend","Centralize timeout-policy construction per backend so backend constraints are encoded once","Prefer the lifecycle coordinator's supported policies over hand-built RemoteTimeoutPolicy values"],"tags":["go","sandbox","e2b","timeout","unsupported-feature"],"backgroundTag":"unsupported-timeout-policy","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}