Releases: e2b-dev/E2B
Release list
e2b@2.36.0
Minor Changes
- 4fcf7cb: Add
FileType.SYMLINKto the sandbox filesystem types. Newer envd versions report symlinks with a dedicatedFILE_TYPE_SYMLINKentry type; previously the SDKs treated it as unknown, sofiles.list()silently omitted symlink entries andgetInfo()/get_info()returned anundefined/Nonetype for them. Symlinks now surface asFileType.SYMLINK('symlink') withsymlinkTarget/symlink_targetpopulated, in JS and both sync and async Python.
Patch Changes
- 3f46d56: Select template build-step stack-trace frames by SDK boundary instead of fixed depth. The caller's frame is now the first one whose file lies outside the SDK package, so traces stay correct when transpilers inject extra frames (e.g. TS class-field initializers) or runtimes elide delegating frames (e.g. Bun's tail-call elision). The suppress/override stack-trace collection machinery this made redundant (
runInNewStackTraceContext,runInStackTraceOverrideContextand their Python equivalents) is removed. - 1ae3f92: Recognize Cloudflare Workers'
Network connection lostas a dropped sandbox connection so a sandbox killed mid-request surfaces as the health-checkedTimeoutError(matching Node/Bun/Deno), and fix streaming downloads releasing their pooled connection twice when cancelled while a read was in flight - 9ee4414: Fix template file uploads under Deno. Deno's native
fetchignores aContent-Lengthheader on stream bodies and fell back toTransfer-Encoding: chunked, which S3-compatible presigned upload URLs reject (see #1243).Template.builduploads now stream the spooled archive through undici'sfetch, which honors the header on every runtime, falling back to the globalfetchwhere undici isn't resolvable. - 5e141a7: Fix the
Sandbox.getHost()documentation example so it can be copy-pasted. The@examplecalledsandbox.commands.exec(...), which is not a method on theCommandsclass (it exposesrun), so running the snippet threwTypeError: sandbox.commands.exec is not a function. It now usessandbox.commands.run(..., { background: true }), allowing the long-running HTTP server to start before the example callsgetHost(). Documentation only, no behavior change. - 4fcf7cb: Regenerate API clients from the latest specs, which are now synced with Copybara from their source-of-truth repositories (e2b-dev/infra@e2255f0 for the REST and envd specs, belt for the volume-content spec) instead of being copied by hand. Picks up the latest spec changes: named
SandboxTimeoutRequest/SandboxSnapshotRequest/SandboxRefreshRequestrequest schemas,SandboxNetworkConfigandSandboxIamworkload-identity models, theFILE_TYPE_SYMLINKfilesystem entry type, and deprecation of access-token auth in favor of API keys. Anything the upstream specs markx-not-implemented: true(currently the SOCKS5 egress-proxy config) is excluded from the generated clients. Generated Python client models now list fields in spec order instead of alphabetical order (the tag filtering moved from a custom script to Redocly CLI); construct them with keyword arguments if you don't already - 5417dd4: Bump the minimum
tardependency to 7.5.19 to pull in upstream fixes for node-tar denial-of-service vulnerabilities (GHSA advisories covering PAX parsing, negative entry sizes, and unbounded decompression)
@e2b/python-sdk@2.35.0
Minor Changes
-
00253c3: Migrate the sandbox RPC layer (commands, PTY, filesystem watch) from the
vendorede2b_connectclient to the official Connect RPC client for Python
(connectrpc), whose HTTP transport
ispyqwest(Rust reqwest/hyper), and switch the envd protobuf messages from
Google'sprotobufruntime to Buf's
protobuf-py.Closing a command or watch stream early now sends
RST_STREAMto the server,
so abandoned streams no longer leak on the shared HTTP/2 connection, and peer
resets surface as typed errors instead of ambiguous EOFs. The REST API and
file upload/download keep usinghttpx.Notes:
- The SDK no longer depends on the
protobufpackage, removing a common
source of dependency conflicts with other libraries that pin it. - The
e2b_connectmodule is no longer shipped with the package. Code that
imported it directly should useconnectrpc(ConnectError,Code)
instead; SDK exception types (SandboxException,TimeoutException, ...)
are unchanged. - The generated
e2b.envd.*.*_pb2modules were replaced byprotobuf-py
equivalents (e2b.envd.process.process_pb,
e2b.envd.filesystem.filesystem_pb) with a different message API. - Connection retries for sandbox RPC calls (
E2B_CONNECTION_RETRIES, default 3) now retry only failures establishing the connection — before the request
could have reached envd — with exponential backoff. Unary RPCs are no
longer replayed when the connection drops mid-request, which could
re-execute a delivered call (e.g. re-send process input); such drops
surface as errors immediately, the way they always did for streaming calls. - The
proxyoption applies to sandbox RPC calls the same way it does to the
REST API and file transfer requests. URL strings,httpx.URL, and
httpx.Proxyvalues keep working (credentials in the URL or in
httpx.Proxy(auth=...));httpx.Proxycustom headers andssl_context
are not supported for RPC calls and raiseInvalidArgumentException. CommandResult.error(andCommandHandle.error) is nowNonewhen a
command finishes without an error, matching the declaredOptional[str]
type and the JS SDK'serror?: string. It used to be""on success —
code comparingresult.error == ""or treating it as always-strshould
check forNone/falsiness instead.- For async streaming calls (
commands.run/connect, PTY,
files.watch_dir),request_timeoutnow bounds opening the stream — the
wait until envd confirms with a start event, matching the JS SDK's
requestTimeoutMs— and raisesTimeoutExceptionwhen exceeded. The
running stream is bounded by the command/watchtimeout(as before). In
the sync SDK there is no way to interrupt the blocking wait, so
request_timeoutis not applied to opening the stream — both stream setup
and the running stream are bounded bytimeout(unlimited when0). E2B_MAX_CONNECTIONSno longer applies to sandbox RPC traffic: the new
transport bounds only idle connections per host (E2B_KEEPALIVE_EXPIRY,
E2B_MAX_KEEPALIVE_CONNECTIONS), not the total number of open
connections. It still applies to the REST API and file transfers.
- The SDK no longer depends on the
-
4fcf7cb: Add
FileType.SYMLINKto the sandbox filesystem types. Newer envd versions report symlinks with a dedicatedFILE_TYPE_SYMLINKentry type; previously the SDKs treated it as unknown, sofiles.list()silently omitted symlink entries andgetInfo()/get_info()returned anundefined/Nonetype for them. Symlinks now surface asFileType.SYMLINK('symlink') withsymlinkTarget/symlink_targetpopulated, in JS and both sync and async Python.
Patch Changes
- 3f46d56: Select template build-step stack-trace frames by SDK boundary instead of fixed depth. The caller's frame is now the first one whose file lies outside the SDK package, so traces stay correct when transpilers inject extra frames (e.g. TS class-field initializers) or runtimes elide delegating frames (e.g. Bun's tail-call elision). The suppress/override stack-trace collection machinery this made redundant (
runInNewStackTraceContext,runInStackTraceOverrideContextand their Python equivalents) is removed. - 4fcf7cb: Regenerate API clients from the latest specs, which are now synced with Copybara from their source-of-truth repositories (e2b-dev/infra@e2255f0 for the REST and envd specs, belt for the volume-content spec) instead of being copied by hand. Picks up the latest spec changes: named
SandboxTimeoutRequest/SandboxSnapshotRequest/SandboxRefreshRequestrequest schemas,SandboxNetworkConfigandSandboxIamworkload-identity models, theFILE_TYPE_SYMLINKfilesystem entry type, and deprecation of access-token auth in favor of API keys. Anything the upstream specs markx-not-implemented: true(currently the SOCKS5 egress-proxy config) is excluded from the generated clients. Generated Python client models now list fields in spec order instead of alphabetical order (the tag filtering moved from a custom script to Redocly CLI); construct them with keyword arguments if you don't already
@e2b/cli@2.15.1
Patch Changes
- 5417dd4: Rebuild the CLI so the bundled
tarpicks up 7.5.19+, fixing the node-tar denial-of-service vulnerabilities (the CLI bundles the SDK and its dependencies intodist/index.js) - Updated dependencies [3f46d56]
- Updated dependencies [1ae3f92]
- Updated dependencies [9ee4414]
- Updated dependencies [5e141a7]
- Updated dependencies [4fcf7cb]
- Updated dependencies [5417dd4]
- Updated dependencies [4fcf7cb]
- e2b@2.36.0
e2b@2.35.3
Patch Changes
-
a406f78: Fix fetch handling on non-Node runtimes (Bun, Deno, browsers, edge):
- The SDK now late-binds
globalThis.fetchinstead of capturing the reference at client creation, so a fetch replaced afterwards (msw, instrumentation) is picked up, and per-proxy fetcher cache entries stay distinct. - Request/idle timeout abort reasons are pinned to their
AbortControllerto work around Bun dropping weakly-heldAbortSignal.reasonvalues, so timeouts on Bun surface asTimeoutErrorinstead of anundefinedreason.
- The SDK now late-binds
-
d417e9c: Detect the Cloudflare Workers runtime before the generic Node check so Node compatibility shims (workerd's
nodejs_compat,@cloudflare/vitest-pool-workers) no longer make the SDK loadundiciinside Workers
e2b@2.35.2
Patch Changes
- f109898: Fix ESM bundle crashing at import time in Cloudflare Workers (and other edge runtimes) with
The argument 'path' must be a file URL object, a file URL string, or an absolute path string. Received 'undefined'. Barerequirecalls in the SDK source made the bundler emit an eagercreateRequire(import.meta.url)shim at module scope, which throws in workerd whereimport.meta.urlis undefined. SHA-256 hashing now uses WebCrypto directly,node:urlis imported statically like the other Node.js built-ins, and a bundle test fails if arequireshim ever reappears in the ESM bundle.
@e2b/cli@2.15.0
Minor Changes
- 2defe39: Rename the
teamfields in~/.e2b/config.jsontoproject: the config format version is bumped to 2 andteamName,teamId, andteamApiKeybecomeprojectName,projectId, andprojectApiKey. Existing v1 configs keep working — they are converted to the new format in memory on read, and the file on disk is only rewritten in the new format when the config is persisted anyway (login,e2b auth configure, token refresh), so older CLI versions can still read it in the meantime. Unrecognized configs are no longer deleted; the CLI treats them as signed out ande2b auth loginoverwrites them. Tools that read the config file directly must handle the new field names. CLI output and flags are unchanged and still say "team".
Patch Changes
@e2b/cli@2.14.0
Minor Changes
- a16dcdf: Rename the
--teamflag to--projectontemplate list,template publish,template unpublish, andtemplate delete. The--teamflag keeps working but is hidden from help and prints a deprecation warning. The project ID can also be set via the newE2B_PROJECT_IDenvironment variable;E2B_TEAM_IDis still supported and is used whenE2B_PROJECT_IDis not set.
Patch Changes
- Updated dependencies [f109898]
- e2b@2.35.2
e2b@2.35.1
Patch Changes
- e5a4bd6: Prefer Undici 8 on Node 22.19 and newer so graceful HTTP/2
GOAWAYframes drain accepted requests instead of failing them, while retaining Undici 7 as the Node 20 fallback.
@e2b/cli@2.13.4
Patch Changes
- c0fe608: Rename user-visible "team" wording to "project" in CLI terminal output: auth login confirmation and hints,
auth infostatus line and fallback,auth configurepicker and confirmation, error messages, and the template publish/unpublish visibility prompt. Copy-only change — no flag, env var, config key, or API behavior changes. - 36639f5: Remove the per-command
e2b-cli-command/<command>tag from the User-Agent integration attribution; CLI requests are now attributed with thee2b-cli/<version>tag only - be1ffa1: Rebuild with patched transitive dependencies to resolve Dependabot security alerts (brace-expansion, js-yaml, and others bundled into the CLI executable)
- 4990471: Fix
sandbox listsorting sandboxes by locale-formatted date string instead of the underlying timestamp, which broke chronological order across single-digit/double-digit month and day boundaries - 04827ab: Remove dead
e2b.tomlcode paths — the CLI no longer writes the file, sosaveConfigis gone, and the unusedteam_idfield is no longer part of the config schema or team ID resolution. Parsing stays for legacy projects (template migrate,template publish,template delete,sandbox create) - Updated dependencies [e5a4bd6]
- e2b@2.35.1
e2b@2.35.0
Minor Changes
-
95e4dc2: Add
sandbox.fork()andSandbox.fork(sandboxId)for forking a running sandbox. The sandbox is checkpointed in place (briefly paused, snapshotted with its full memory state, and resumed — its ID and expiration stay untouched) andcountnew sandboxes are created from that snapshot. Each fork succeeds or fails independently: the returned array contains one entry per requested fork, either a runningSandboxinstance or anError(Promise.allSettled-style). Per-fork error codes map to the same error classes as other API errors (e.g. 429 toRateLimitError).const sandbox = await Sandbox.create() const [fork1, fork2] = await sandbox.fork({ count: 2, timeoutMs: 60_000 }) if (fork1 instanceof Sandbox) { await fork1.commands.run('echo "hello from fork"') }