Update dependency e2b - #235
Closed
renovate[bot] wants to merge 1 commit into
Closed
Conversation
renovate
Bot
force-pushed
the
renovate/e2b-2.x-lockfile
branch
from
August 7, 2026 17:09
69e39a4 to
455603d
Compare
renovate
Bot
force-pushed
the
renovate/e2b-2.x-lockfile
branch
from
August 10, 2026 22:12
455603d to
06f64a1
Compare
Member
|
in #247 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
2.36.0→2.38.02.37.0→2.38.3Release Notes
e2b-dev/e2b (e2b)
v2.38.0Minor Changes
b048369: Move the envd HTTP API client (sandbox file transfers, health checks) ontopyqwestvia its httpx-compatibletransport adapter. envd RPC already runs on pyqwest through
connectrpc, soall sandbox traffic now shares one HTTP stack built from the same transport
pieces (with separate connection pools per use).
The per-thread (sync) and per-loop (async) envd httpx clients are gone: the
pyqwest transports are thread-safe and loop-independent, so a single client
per module serves all threads and event loops.
Timeout semantics through the adapter:
files.read(format="stream")): arequest_timeoutset explicitly for the call is the deadline for the whole transfer — by
default the transfer is unbounded in total, as before. A stalled stream is
reclaimed by a 60-second idle read timeout that resets on every chunk.
stream_idle_timeoutkeeps working on the async client (applied perread); the sync client cannot interrupt a blocking read, so it relies on
the transport-wide idle bound and now ignores the parameter.
request_timeoutas awhole-request deadline, and a streamed (file-like) upload carries no
client-side timeout (a stalled one is bounded server-side by envd's idle
read timeout) — both matching the JS SDK.
files.read()as text or bytes) and buffered uploadsare bounded by
request_timeoutfor the whole transfer (default60 seconds), where the previous transport bounded each socket operation
and left total duration unbounded. Reading or writing a file too large to
transfer inside the deadline now raises
httpx.ReadTimeout— pass alarger
request_timeout(or0to disable), or useformat="stream"/file-like data, for large transfers.E2B_MAX_CONNECTIONSis no longer read: it configured httpx's globalconnection cap, and the last transport that took one is gone (reqwest has no
counterpart — it does not cap concurrent connections).
E2B_KEEPALIVE_EXPIRYand
E2B_MAX_KEEPALIVE_CONNECTIONSkeep tuning the pools.a874ced: Move the REST API client (sandbox lifecycle, listing, templates, volumescontrol plane) onto
pyqwest(Rustreqwest/hyper) via its httpx-compatible transport adapter, replacing the
httpx-native
HTTPTransport/AsyncHTTPTransport. The generated httpx clientAPI is unchanged — only the transport underneath is swapped — so logging
event hooks, headers, and redirect handling (
follow_redirects,response.history) behave as before.One timeout semantics change: through the adapter,
request_timeoutis adeadline for the whole API call, where the previous transports applied it to
each phase (connect, read, write) separately — a slow request could exceed it
in total. For the REST API's small JSON exchanges this tightening is what
request_timeoutreads as promising;0still disables it.Because pyqwest transports are thread-safe and loop-independent (I/O runs on
a Rust runtime), the API connection pool is now shared process-wide per
proxy, instead of one pool per thread (sync) or per event loop (async), and
ApiClientno longer maintains per-thread/per-loop httpx client caches — asingle httpx client serves all threads and event loops.
Connection-establishment failures are retried with backoff
(
E2B_CONNECTION_RETRIES, default 3), matching the connect-only retries ofthe previous transports. Timeouts keep raising
httpx.ReadTimeout(anhttpx.TimeoutException), as before, whether they fire while waiting for theresponse head or while reading the response body, and connection, network, and
protocol failures keep raising their
httpxcounterparts (httpx.ConnectError,httpx.ReadError,httpx.RemoteProtocolError).proxyfor API calls takes a URL string (e.g.proxy="http://user:pass@localhost:8030", scheme http, https, socks5, orsocks5h), an
httpx.URL, or anhttpx.Proxy— including its credentials(sent as
Proxy-Authorization) and any headers configured for the proxy. Theone
httpx.Proxyoption pyqwest cannot express, a per-proxyssl_context,raises
InvalidArgumentExceptionrather than being silently dropped.Low-level HTTP logs stay available: where enabling the
httpcorelogger usedto show connection-level detail, pyqwest logs one line per request on the
pyqwest.accesslogger and request lifecycle records onpyqwest, both atDEBUGand off unless enabled:The SDK's own
loggeroption is unchanged and independent of these.envd traffic is not affected: RPC (commands, PTY, filesystem watch) already
runs on pyqwest via
connectrpc, and the envd HTTP API (file transfers,health checks) keeps its httpx transports.
b3a7c9f: Move template build-context uploads (to S3 presigned URLs) ontopyqwestvia its httpx-compatibletransport adapter. Content-Length framing for the streamed archive body is
preserved (S3 rejects chunked transfer encoding), and redirects stay with the
httpx client instead of being followed inside the transport. The 1-hour upload
timeout now bounds the entire upload rather than each socket operation, and
verify_ssl=Falseon the client is no longer honored for uploads (pyqwesthas no insecure-TLS option).
458c2c4: Move the volume content client (Volume/AsyncVolumefile operations) ontopyqwestvia its httpx-compatibletransport adapter, the same stack the REST API client uses. The connection
pool is shared process-wide per proxy instead of one pool per thread (sync)
or per event loop (async), and connection-establishment failures are retried
with backoff (
E2B_CONNECTION_RETRIES, default 3), as before.For streamed volume reads (
Volume.read_file(format="stream")), a stalledstream is by default bounded by a transport-wide idle read timeout of
60 seconds that resets on every chunk (still surfaced as
httpx.ReadTimeout; matches the JS SDK's default stream idle timeout).AsyncVolume.read_filekeeps honoring an explicitstream_idle_timeoutper read (including
0to disable); the sync client ignores it — it cannotinterrupt a blocking read. Passing
request_timeoutto a streamed read nowbounds the whole transfer rather than individual socket operations.
The same whole-transfer semantics apply to non-streamed operations:
read_file(format="text"/"bytes")and uploads are bounded byrequest_timeoutas a total deadline (default 1 hour for file contentoperations), where the previous transports bounded each socket operation
and left total duration unbounded. Pass a larger
request_timeout(or0to disable) for very large transfers on slow links.
Patch Changes
cab27aa: Kill newly created sandboxes when MCP gateway startup fails. The failure now surfaces asSandboxError(JS) /SandboxException(Python) with aFailed to start MCP gateway: <stderr>message instead of a bare command exit error.v2.37.1Patch Changes
88f41f3: Align ANSI stripping of template build log messages across both SDKs. The Python SDK'sstrip_ansi_escape_codesnow ports the JS SDK'sstripAnsiregex: OSC sequences (hyperlinks, window titles) are matched non-greedily up to the first string terminator — including sequences spanning newlines — and CSI sequences are stripped without requiring a terminator. Both implementations additionally strip the remaining ECMA-48 string controls (DCS/Sixel, SOS, PM, APC) through their string terminator so control payloads no longer leak into cleaned logs.998e560: Relax the Python SDK'swcmatchrequirement from>=10.1,<11to>=10.1,<12soe2bcan be installed alongside packages that already requirewcmatch>=11(for exampledeepagents>=0.7.0), which previously failed to resolve. The SDK only callsglob.glob()withGLOBSTAR | DOTMATCHfor template context matching; wcmatch 11.0's single breaking change affectstranslate()callers using extended-glob capture groups, so it is a no-op here. The template glob test suite passes against 10.1, 10.2.1 and 11.0.v2.37.0Compare Source
Minor Changes
2821fb0: Route volume content requests to a team's custom (BYOC) cluster. When a team is connected to a custom cluster, the volume create and get endpoints now return that cluster'sdomain, and the SDK uses it as the destination for volume content requests instead of the defaultapi.<E2B_DOMAIN>host. Teams on the default cluster are unaffected and keep their configured domain.e2b-dev/e2b (e2b)
v2.38.3Compare Source
Patch Changes
cab27aa: Kill newly created sandboxes when MCP gateway startup fails. The failure now surfaces asSandboxError(JS) /SandboxException(Python) with aFailed to start MCP gateway: <stderr>message instead of a bare command exit error.v2.38.2Compare Source
Patch Changes
d5a382e: Bump both undici dependencies past the 2026-07-24 security advisories: the requiredundicifrom^7.28.0to^7.29.0, and the optionalundici8(npm:undici@…) from 8.8.0 to 8.10.0. Both releases fix one High (GHSA-4cwx-7wf7-3272) and four Medium advisories, and undici 8.10.0 additionally fixes HTTP/2 request settling, refused-stream retries and GOAWAY handling, which the SDK exercises because every dispatcher it builds setsallowH2: true. Neither bump moves a Node floor — 7.29.0 still requires Node>=20.18.1and 8.10.0 still requires>=22.19.0, matching theUNDICI_8_MIN_NODEgate — so package selection and behaviour are unchanged.v2.38.1Compare Source
Patch Changes
88f41f3: Align ANSI stripping of template build log messages across both SDKs. The Python SDK'sstrip_ansi_escape_codesnow ports the JS SDK'sstripAnsiregex: OSC sequences (hyperlinks, window titles) are matched non-greedily up to the first string terminator — including sequences spanning newlines — and CSI sequences are stripped without requiring a terminator. Both implementations additionally strip the remaining ECMA-48 string controls (DCS/Sixel, SOS, PM, APC) through their string terminator so control payloads no longer leak into cleaned logs.86f7b8e: ExportGitResetMode,GitResetOpts,GitRestoreOptsandGitStatusLabelfrom the JS SDK entry point, so the argument and status types of the publicgit.reset(),git.restore()andgit.status()methods can be named by callersv2.38.0Compare Source
Minor Changes
2821fb0: Route volume content requests to a team's custom (BYOC) cluster. When a team is connected to a custom cluster, the volume create and get endpoints now return that cluster'sdomain, and the SDK uses it as the destination for volume content requests instead of the defaultapi.<E2B_DOMAIN>host. Teams on the default cluster are unaffected and keep their configured domain.Configuration
📅 Schedule: (in timezone UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.