Skip to content

fix(eve): manage long-running sandbox commands - #2593

Open
cmpadden wants to merge 5 commits into
mainfrom
fix/managed-bash-commands
Open

fix(eve): manage long-running sandbox commands#2593
cmpadden wants to merge 5 commits into
mainfrom
fix/managed-bash-commands

Conversation

@cmpadden

@cmpadden cmpadden commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

Summary

Closes #440. A long-running command or stalled sandbox exit stream can hold the built-in bash tool—and its workflow step—open indefinitely, leaving the model and user without a way to inspect or stop it.

This change moves command lifecycle management behind an internal eve-owned sandbox boundary:

  • run waits for yieldTimeMs (30 seconds by default), then returns a process id without terminating a command that is still running.
  • The same tool uses that id to poll immediately, wait for another bounded interval (five minutes by default), or kill the command.
  • Generic backends retain native SandboxProcess handles and bounded output in the app runtime; Vercel uses detached command ids and getCommand() to reconnect after app-runtime relocation.
  • Starts are deduplicated by durable session and tool-call identity within a live registry, which tracks at most 64 commands per sandbox and reclaims completed entries under capacity pressure.
  • Cancellation during the initial foreground run terminates the command. Once a command has yielded, it can outlive the turn; a lost backend-local handle is reported as unavailable rather than replayed.

Yielded commands are pull-based and do not proactively start a new turn when they complete. This does not expand the public SandboxSession API, and recovery when an initial submission fails before its process id reaches durable history remains separate in #2575.

image

Validation

Focused coverage exercises completion, yielding, polling, waiting, termination, cancellation, idempotent starts, capacity limits, bounded output, provider-compatible schemas, Vercel command reconnection, and sandbox cleanup. The full unit tier passed with 7,152 tests and one skip, and the hosted-runtime scenario passed all nine tests.

A manual smoke test used a real openai/gpt-5.6-sol agent against the Docker backend. A command yielded after 100 ms, reused one process id across three polls, accumulated output through completion, and returned exit code 0; its start marker remained exactly one. The local workflow transport also retried an inline step during this run, and recovery completed without duplicating the command. A separate termination smoke test returned killed and confirmed that a heartbeat file stopped growing after termination.

Checklist

  • This change was requested or approved by a maintainer
  • I ran the relevant checks from CONTRIBUTING.md
  • I added tests and documentation where relevant
  • I added a changeset if this touches the published eve package
  • DCO sign-off passes for every commit (git commit --signoff)

Diff size

Docs — 2 files · +7 / -1

Documents the user-facing tool behavior and includes the required release note.

Implementation — 6 files · +629 / -111

Adds the managed-command registry, bounded stream capture, Bash lifecycle actions, Vercel reconnection adapter, and sandbox cleanup integration. Most of the new code is the eve-owned process and output lifecycle needed to avoid shell protocols while keeping provider handles out of the public SandboxSession API.

Tests — 6 files · +488 / -43

Covers the managed command lifecycle and schemas across unit, provider, scenario, and isolated prompt-cache fixtures, including retry identity and output truncation behavior.

Signed-off-by: Colton Padden <colton.padden@vercel.com>
@vercel

vercel Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview, v0 Aug 26, 2026 6:26pm
eve-docs-4759 Ready Ready Preview, v0 Aug 26, 2026 6:26pm
eve-pkg Ready Ready Preview, v0 Aug 26, 2026 6:26pm

Comment thread packages/eve/src/tools/provided/bash.ts Outdated
@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Bundle + Package Summary: apps/fixtures/weather-agent

Key takeaways

  • No notable deltas vs main (a3a5ddd).

Delta vs main (a3a5ddd)

Area Metric Baseline Current Delta
Package Packed tarball 8.24 MB 8.25 MB +3.8 kB ⚠️
Package Unpacked publish size 31.09 MB 31.10 MB +15.0 kB ⚠️
Package Installed footprint 74.72 MB 74.74 MB +15.0 kB ⚠️
Package Published files 3534 3538 +4
Package Installed files 7249 7253 +4
Package Installed package instances 35 35 0
Package Distinct installed package names 34 34 0
Package Installed dependency edges 53 53 0
Package Installed optional peer edges 47 47 0
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 18.45 MB 18.47 MB +25.8 kB ⚠️
Runtime Public routes 16 16 0
Changed function payloads vs main (a3a5ddd) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 9.22 MB 9.24 MB +12.9 kB ⚠️ none
functions/.well-known/workflow/v1/flow.func changed 9.22 MB 9.24 MB +12.9 kB ⚠️ none

eve init install

Metric Baseline Current Delta
Installed footprint 113.16 MB 113.18 MB +15.0 kB ⚠️
Installed packages 120 120 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 45.69 MB 45.71 MB +15.0 kB ⚠️
devDependency package bytes 5.04 MB 5.04 MB 0 B ➖
Build Metadata
  • Preset: vercel
  • Nitro: nitro@3.0.260610-beta
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-08-26T18:27:33.382Z
  • Route aliases: 16 public, 1 internal (17 total aliases)
  • Vercel routes in config: 19
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: eve@0.45.0
  • Package directory: packages/eve
  • Tarball: 8.25 MB (eve-0.45.0.tgz)
  • Unpacked payload: 31.10 MB across 3538 published files
  • Installed footprint: 74.74 MB across 7253 installed files
  • Installed root package: 29.75 MB
  • Installed dependencies: 44.99 MB
  • Installed package instances: 35
  • Distinct installed package names: 34
  • Installed dependency edges: 53
  • Installed optional peer edges: 47
  • Runtime dependencies: 2
  • Peer dependencies: 5 (4 optional)

Installed footprint is measured from an isolated temporary npm install of the packed tarball.
Graph metrics read only package.json files in package directories directly beneath a node_modules boundary, including nested boundaries. Each directory is one package instance; distinct names come from those manifests. Dependency edges count each unique name in dependencies or optionalDependencies per instance; optional peer edges count peerDependencies marked optional.

Heavy installed dependencies

  • eve: 29.75 MB (39.8%)
  • @rolldown/binding-linux-x64-gnu: 19.33 MB (25.9%)
  • ai: 6.77 MB (9.1%)
  • zod: 5.07 MB (6.8%)
  • undici: 3.50 MB (4.7%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js       [##############..........] 9.76 MB 31.4%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [####....................] 2.44 MB 7.9%
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [##......................] 1.51 MB 4.8%
🟡 dist/src/compiled/_chunks/workflow/undici-Dzn... [#.......................] 512.7 kB 1.6%
🟡 dist/src/compiled/_chunks/node/undici-CUIybhQ... [#.......................] 508.8 kB 1.6%
🔴 Other published files                            [########################] 16.37 MB 52.6%
Installed footprint breakdown
Installed package size
🔴 eve                             [########################] 29.75 MB 39.8%
🔴 @rolldown/binding-linux-x64-gnu [################........] 19.33 MB 25.9%
🔴 ai                              [#####...................] 6.77 MB 9.1%
🔴 zod                             [####....................] 5.07 MB 6.8%
🟠 undici                          [###.....................] 3.50 MB 4.7%
🟠 nitro                           [##......................] 2.41 MB 3.2%
🔴 Other installed packages        [######..................] 7.92 MB 10.6%
Runtime dependencies (2)
Package Range Notes
nitro 3.0.260610-beta
undici 8.9.0
Peer dependencies (5)
Package Range Notes
@opentelemetry/api ^1.0.0 optional peer
ai catalog:
braintrust ^3.0.0 optional peer
just-bash ^3.1.0 optional peer
microsandbox ^0.5.0 optional peer
eve init install drill-down

eve init install details

  • Command: eve init my-agent
  • Package manager: npm
  • Installed footprint: 113.18 MB across 9149 installed files
  • Installed packages: 120 total (114 transitive-only)
  • dependencies: 4 direct packages totaling 45.71 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 62.43 MB

Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.

Heavy installed dependencies

  • eve: 29.75 MB (26.3%)
  • @typescript/typescript-linux-x64: 27.95 MB (24.7%)
  • @rolldown/binding-linux-x64-gnu: 19.33 MB (17.1%)
  • zod: 9.02 MB (8.0%)
  • ai: 6.77 MB (6.0%)
Installed footprint breakdown
Installed package size
🔴 eve                              [########################] 29.75 MB 26.3%
🔴 @typescript/typescript-linux-x64 [#######################.] 27.95 MB 24.7%
🔴 @rolldown/binding-linux-x64-gnu  [################........] 19.33 MB 17.1%
🔴 zod                              [#######.................] 9.02 MB 8.0%
🔴 ai                               [#####...................] 6.77 MB 6.0%
🟠 undici                           [###.....................] 3.50 MB 3.1%
🔴 Other installed packages         [##############..........] 16.86 MB 14.9%
dependencies (4)
Package Range Installed size Share
@vercel/connect 1.0.0 167.9 kB 0.1%
ai ^7.0.58 6.77 MB 6.0%
eve file:eve-0.45.0.tgz 29.75 MB 26.3%
zod 4.4.3 9.02 MB 8.0%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.2%
typescript 7.0.2 2.50 MB 2.2%
Function Drill-Down

Payload Size Graph

Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func     [########################] 9.24 MB 50.0%
🔴 functions/__server.func                         [########################] 9.24 MB 50.0%

Top Function Payloads

🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 9.24 MB
Metric Value
Public routes /.well-known/workflow/v1/flow
Runtime nodejs24.x
Handler index.mjs
Payload 9.24 MB
Function files 9.24 MB across 108 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 1.82 MB (19.7%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                   [##########..............] 1.82 MB 19.7%
🟡 _libs/undici.mjs            [#####...................] 980.5 kB 10.6%
🟡 _chunks/sandbox.mjs         [####....................] 781.9 kB 8.5%
🟡 _chunks/frames-Dl2Hcma4.mjs [####....................] 678.7 kB 7.3%
🟡 _chunks/chatgpt-model.mjs   [####....................] 665.1 kB 7.2%
🔴 Other bundled files         [########################] 4.31 MB 46.7%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ],
  "environment": {
    "WORKFLOW_PRECONDITION_GUARD": "1"
  }
}

🟠 functions/__server.func • 15 public routes, 1 internal alias • 9.24 MB
Metric Value
Public routes /
/eve/v1/callback/[token]
/eve/v1/connections/[name]/callback/[attemptId]/[token]
/eve/v1/connections/[name]/callback/[token]
/eve/v1/health
/eve/v1/info
/eve/v1/session
/eve/v1/session/[parentSessionId]/subagents/[callId]/[childSessionId]/stream
/eve/v1/session/[sessionId]
/eve/v1/session/[sessionId]/cancel
/eve/v1/session/[sessionId]/clear
/eve/v1/session/[sessionId]/compact
/eve/v1/session/[sessionId]/reset
/eve/v1/session/[sessionId]/stream
/eve/v1/task-input/[token]
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 9.24 MB
Function files 9.24 MB across 108 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 1.82 MB (19.7%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                   [##########..............] 1.82 MB 19.7%
🟡 _libs/undici.mjs            [#####...................] 980.5 kB 10.6%
🟡 _chunks/sandbox.mjs         [####....................] 781.9 kB 8.5%
🟡 _chunks/frames-Dl2Hcma4.mjs [####....................] 678.7 kB 7.3%
🟡 _chunks/chatgpt-model.mjs   [####....................] 665.1 kB 7.2%
🔴 Other bundled files         [########################] 4.31 MB 46.7%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x"
}

Build Timing: e2e/fixtures/agent-tools-sandbox

This is an informational timing measurement inside eve build, from preflight through publication. Output-size measurement and profile writing are excluded.

Build mode: deployable Vercel build with sandbox template prewarm included.

  • Build pipeline: 2.48 s -> 2.33 s (-150.3 ms) vs main (a3a5ddd).
  • Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `main (a3a5ddd)`
Phase Baseline Current Delta
extension.check 11.4 ms 12.1 ms +0.7 ms
project.resolve 0.4 ms 0.3 ms -0.1 ms
workspace.create 0.7 ms 0.7 ms 0.0 ms
host.prepare 410.9 ms 376.7 ms -34.2 ms
vercel.service-prefix.resolve 1.6 ms 1.6 ms 0.0 ms
nitro.create 281.7 ms 241.3 ms -40.4 ms
sandbox.prewarm 366.9 ms 295.1 ms -71.8 ms
nitro.cache.prepare 0.3 ms 0.2 ms -0.1 ms
nitro.prepare 0.6 ms 1.0 ms +0.4 ms
nitro.public-assets 0.7 ms 0.7 ms 0.0 ms
nitro.prerender 0.4 ms 0.5 ms +0.1 ms
nitro.bundle 1.37 s 1.37 s -3.5 ms
nitro.cache.write 0.3 ms 0.3 ms 0.0 ms
vercel.workflow-function.materialize 33.8 ms 32.4 ms -1.4 ms
agent-summary.emit 0.7 ms 0.7 ms 0.0 ms
nitro.close 0.1 ms 0.1 ms 0.0 ms
output.publish 3.0 ms 2.8 ms -0.2 ms
workspace.remove 1.5 ms 1.6 ms +0.1 ms

Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Signed-off-by: Colton Padden <colton.padden@vercel.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

microsandbox sandbox exec can hang indefinitely — no per-command timeout/abort on the exec stream

1 participant