Skip to content

Add authored sandbox destruction - #2398

Draft
vercel-gh-bot-5[bot] wants to merge 1 commit into
mainfrom
e0/38a26078-1eb1-4ced-a728-69df129abedc
Draft

Add authored sandbox destruction#2398
vercel-gh-bot-5[bot] wants to merge 1 commit into
mainfrom
e0/38a26078-1eb1-4ced-a728-69df129abedc

Conversation

@vercel-gh-bot-5

@vercel-gh-bot-5 vercel-gh-bot-5 Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Authored callbacks can stop sandbox compute, but they cannot permanently discard a session workspace and start clean. This adds await ctx.sandbox.destroy() for that lifecycle boundary.

Motivation

A stopped sandbox remains reattachable, including its files and session snapshots. Workflows that need a clean workspace currently have no authored API to remove that state.

Approach

Because permanent cleanup belongs to each sandbox backend, exposing one eve-owned lifecycle method should provide consistent behavior without leaking provider APIs.

ctx.sandbox.destroy() now:

  1. Stops active compute
  2. Deletes the physical sandbox and session-owned persisted state
  3. Preserves reusable template snapshots
  4. Clears reconnect state only after provider cleanup succeeds
  5. Provisions a fresh workspace and reruns onSession on the next access

Vercel cleanup deletes created session snapshots before deleting the sandbox record. Docker, microsandbox, and just-bash discard their corresponding session state. Provider and abort failures reject without clearing eve's cached state.

Only the owning session can destroy a shared sandbox. Inherited child sessions reject before acquiring the shared handle, which keeps the owner's reconnect state consistent.

Validation

  • 76 focused unit tests passed across sandbox access and backend lifecycle behavior
  • 13 integration tests passed for callback access and just-bash filesystem removal
  • pnpm --filter eve typecheck
  • pnpm docs:check
  • pnpm guard:invariants
  • pnpm update:extension-contracts
  • pnpm lint with one pre-existing warning in teamsChannel.test.ts
  • git diff --check
  • Follow-up correctness review passed with no remaining findings

Requested by: ruiconti

@vercel

vercel Bot commented Aug 21, 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 Aug 21, 2026 9:31pm
eve-docs-4759 Ready Ready Preview, v0 Aug 21, 2026 9:31pm
eve-pkg Ready Ready Preview Aug 21, 2026 9:31pm

Comment thread packages/eve/src/context/dynamic-tool-lifecycle.test.ts Outdated
Comment on lines +496 to +512
const credentials = await resolveVercelSnapshotCredentials(input.createOptions);
for await (const metadata of snapshots) {
if (
metadata.status !== "created" ||
(sandbox.sourceSnapshotId !== undefined && metadata.id === sandbox.sourceSnapshotId)
) {
continue;
}
const snapshot = await input.sandboxModule.Snapshot.get({
...credentials,
fetch: getVercelSandboxFetch(input.createOptions),
signal: options?.abortSignal,
snapshotId: metadata.id,
});
await snapshot.delete({ signal: options?.abortSignal });
}
await sandbox.delete({ signal: options?.abortSignal });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@!e0 can't we do this directly via the sandbox handle? If not, can we expose this?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not currently. sandbox.delete() removes the sandbox and sessions but intentionally leaves snapshots, while sandbox.listSnapshots() returns metadata rather than deletable Snapshot handles. so the Snapshot.get() round-trip is unavoidable with the pinned SDK.

we should expose this upstream, ideally as sandbox.delete({ snapshots: true }), so cleanup shares the handle’s client and credentials. until that lands, this explicit loop is the correct implementation.

Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

Key takeaways

  • No notable deltas vs main (a4fd288).

Delta vs main (a4fd288)

Area Metric Baseline Current Delta
Package Packed tarball 8.18 MB 8.18 MB +807 B ⚠️
Package Unpacked publish size 30.81 MB 30.81 MB +4.8 kB ⚠️
Package Installed footprint 74.93 MB 74.94 MB +4.8 kB ⚠️
Package Published files 3404 3404 0
Package Installed files 7117 7117 0
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.20 MB 18.20 MB +3.2 kB ⚠️
Runtime Public routes 16 16 0
Changed function payloads vs main (a4fd288) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 9.10 MB 9.10 MB +1.6 kB ⚠️ none
functions/.well-known/workflow/v1/flow.func changed 9.10 MB 9.10 MB +1.6 kB ⚠️ none

eve init install

Metric Baseline Current Delta
Installed footprint 113.34 MB 113.35 MB +4.8 kB ⚠️
Installed packages 121 121 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 45.37 MB 45.38 MB +4.8 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-21T21:32:27.303Z
  • 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.44.0
  • Package directory: packages/eve
  • Tarball: 8.18 MB (eve-0.44.0.tgz)
  • Unpacked payload: 30.81 MB across 3404 published files
  • Installed footprint: 74.94 MB across 7117 installed files
  • Installed root package: 29.46 MB
  • Installed dependencies: 45.48 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.46 MB (39.3%)
  • @rolldown/binding-linux-x64-gnu: 19.91 MB (26.6%)
  • ai: 6.75 MB (9.0%)
  • 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.7%
🟠 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.9%
🟡 dist/src/compiled/_chunks/workflow/undici-Dzn... [#.......................] 512.7 kB 1.7%
🟡 dist/src/compiled/_chunks/node/undici-CUIybhQ... [#.......................] 508.8 kB 1.7%
🔴 Other published files                            [########################] 16.08 MB 52.2%
Installed footprint breakdown
Installed package size
🔴 eve                             [########################] 29.46 MB 39.3%
🔴 @rolldown/binding-linux-x64-gnu [################........] 19.91 MB 26.6%
🔴 ai                              [######..................] 6.75 MB 9.0%
🔴 zod                             [####....................] 5.07 MB 6.8%
🟠 undici                          [###.....................] 3.50 MB 4.7%
🟠 nitro                           [##......................] 2.41 MB 3.2%
🔴 Other installed packages        [######..................] 7.84 MB 10.5%
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.0.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.35 MB across 8993 installed files
  • Installed packages: 121 total (115 transitive-only)
  • dependencies: 4 direct packages totaling 45.38 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 62.93 MB

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

Heavy installed dependencies

  • eve: 29.46 MB (26.0%)
  • @typescript/typescript-linux-x64: 27.95 MB (24.7%)
  • @rolldown/binding-linux-x64-gnu: 19.91 MB (17.6%)
  • zod: 9.02 MB (8.0%)
  • ai: 6.75 MB (6.0%)
Installed footprint breakdown
Installed package size
🔴 eve                              [########################] 29.46 MB 26.0%
🔴 @typescript/typescript-linux-x64 [#######################.] 27.95 MB 24.7%
🔴 @rolldown/binding-linux-x64-gnu  [################........] 19.91 MB 17.6%
🔴 zod                              [#######.................] 9.02 MB 8.0%
🔴 ai                               [######..................] 6.75 MB 6.0%
🟠 undici                           [###.....................] 3.50 MB 3.1%
🔴 Other installed packages         [##############..........] 16.75 MB 14.8%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.4.3 141.0 kB 0.1%
ai ^7.0.58 6.75 MB 6.0%
eve file:eve-0.44.0.tgz 29.46 MB 26.0%
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.10 MB 50.0%
🔴 functions/__server.func                         [########################] 9.10 MB 50.0%

Top Function Payloads

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

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                     [##################......] 2.06 MB 22.6%
🟠 _chunks/runtime-artifacts.mjs [###############.........] 1.80 MB 19.8%
🟡 _libs/undici.mjs              [########................] 980.5 kB 10.8%
🟡 _chunks/sandbox.mjs           [#######.................] 781.9 kB 8.6%
🟡 _chunks/frames-Dl2Hcma4.mjs   [######..................] 678.7 kB 7.5%
🟠 Other bundled files           [########################] 2.80 MB 30.8%

🧾 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.10 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.10 MB
Function files 9.10 MB across 50 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 2.06 MB (22.6%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                     [##################......] 2.06 MB 22.6%
🟠 _chunks/runtime-artifacts.mjs [###############.........] 1.80 MB 19.8%
🟡 _libs/undici.mjs              [########................] 980.5 kB 10.8%
🟡 _chunks/sandbox.mjs           [#######.................] 781.9 kB 8.6%
🟡 _chunks/frames-Dl2Hcma4.mjs   [######..................] 678.7 kB 7.5%
🟠 Other bundled files           [########################] 2.80 MB 30.8%

🧾 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.11 s -> 2.13 s (+22.8 ms) vs main (a4fd288).
  • Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `main (a4fd288)`
Phase Baseline Current Delta
extension.check 10.5 ms 9.2 ms -1.3 ms
project.resolve 0.3 ms 0.3 ms 0.0 ms
workspace.create 0.7 ms 0.6 ms -0.1 ms
host.prepare 270.3 ms 255.8 ms -14.5 ms
vercel.service-prefix.resolve 1.7 ms 1.6 ms -0.1 ms
nitro.create 218.7 ms 214.7 ms -4.0 ms
sandbox.prewarm 283.8 ms 280.1 ms -3.7 ms
nitro.cache.prepare 0.2 ms 0.2 ms 0.0 ms
nitro.prepare 0.7 ms 0.7 ms 0.0 ms
nitro.public-assets 0.7 ms 0.7 ms 0.0 ms
nitro.prerender 0.4 ms 0.4 ms 0.0 ms
nitro.bundle 1.27 s 1.32 s +52.6 ms
nitro.cache.write 0.3 ms 0.3 ms 0.0 ms
vercel.workflow-function.materialize 47.5 ms 41.1 ms -6.4 ms
agent-summary.emit 0.5 ms 0.5 ms 0.0 ms
nitro.close 0.1 ms 0.1 ms 0.0 ms
output.publish 2.6 ms 2.6 ms 0.0 ms
workspace.remove 1.7 ms 1.7 ms 0.0 ms

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.

1 participant