Repository navigation
Conversation
…ching Signed-off-by: Colton Padden <cmpadden@users.noreply.github.com>
| async writeFiles({ abortSignal, files }) { | ||
| abortSignal?.throwIfAborted(); | ||
| // A batch is not atomic: files written before a rejection stay written. | ||
| await mapConcurrent( |
There was a problem hiding this comment.
Running writes concurrently changes what happens when a batch lists the same path twice. Before this change the writes ran one after another, so the last entry won. Vercel's tar batch also ends with the last entry. Here, both entries' writeFiles run against the same file at once, and Node says that's unsafe (fsPromises.writeFile: "unsafe to use fsPromises.writeFile() multiple times on the same file without waiting for the promise to be settled"). Docker has the same problem: two cat > execs racing on one path (line 157 of docker-connection.ts).
Repro with just-bash's ReadWriteFs, running this PR's per-file op (mkdir and then writeFile) for [1 MB, "small"] on one path at the same time: the last-listed "small" was lost in 50 of 50 runs. The file kept the earlier 1 MB content. Duplicates can happen through the public sandbox.writeFiles(), and also in populate() when skills fall back to skills/ under the workspace root and a workspace file uses the same relative path.
The simplest fix is to keep only the last entry per resolved path in createConnectionSession().writeFiles (session.ts), for example [...new Map(files.map((f) => [f.path, f])).values()]. That keeps last-wins on every provider, including custom ones, and neither binding has to handle it.
|
|
||
| ### Write several files at once | ||
|
|
||
| `writeFiles()` writes a batch of files from raw bytes, which is much faster than one call per file: |
There was a problem hiding this comment.
"much faster than one call per file" is a speed claim nobody has measured, and the PR description explicitly makes no speedup claim. Say what the batch does instead, e.g. "writeFiles() writes several files from raw bytes in one call:". The paragraph below already explains how each provider sends the batch.
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 7.77 MB | 7.77 MB | -586 B ✅ |
| Package | Unpacked publish size | 27.30 MB | 27.30 MB | +1.2 kB |
| Package | Installed footprint | 75.61 MB | 75.61 MB | +1.2 kB |
| Package | Published files | 4222 | 4222 | 0 |
| Package | Installed files | 8215 | 8215 | 0 |
| Package | Installed package instances | 34 | 34 | 0 |
| Package | Distinct installed package names | 32 | 32 | 0 |
| Package | Installed dependency edges | 51 | 51 | 0 |
| Package | Installed optional peer edges | 8 | 8 | 0 |
| Runtime | Unique function payloads | 2 | 2 | 0 |
| Runtime | Total function bytes | 20.90 MB | 20.90 MB | -80 B ✅ |
| Runtime | Public routes | 18 | 18 | 0 |
Changed function payloads vs main (13399a5) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/__server.func |
changed | 10.45 MB | 10.45 MB | -40 B ✅ | none |
functions/.well-known/workflow/v1/flow.func |
changed | 10.45 MB | 10.45 MB | -40 B ✅ | none |
eve init install
| Metric | Baseline | Current | Delta |
|---|---|---|---|
| Installed footprint | 113.99 MB | 113.99 MB | +1.2 kB |
| Installed packages | 97 | 97 | 0 |
| dependencies | 4 | 4 | 0 |
| devDependencies | 2 | 2 | 0 |
| Dependency package bytes | 45.70 MB | 45.70 MB | +1.2 kB |
| devDependency package bytes | 5.11 MB | 5.11 MB | 0 B ➖ |
Build Metadata
- Preset:
vercel - Nitro:
nitro@3.0.260903-beta - Output directory:
apps/fixtures/weather-agent/.vercel/output - Build metadata timestamp: 2026-10-23T22:26:38.231Z
- Route aliases: 18 public, 1 internal (19 total aliases)
- Vercel routes in config: 21
- Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down
Package Details
- Package:
eve@0.83.0 - Package directory:
packages/eve - Tarball: 7.77 MB (
eve-0.83.0.tgz) - Unpacked payload: 27.30 MB across 4222 published files
- Installed footprint: 75.61 MB across 8215 installed files
- Installed root package: 27.30 MB
- Installed dependencies: 48.31 MB
- Installed package instances: 34
- Distinct installed package names: 32
- Installed dependency edges: 51
- Installed optional peer edges: 8
- Runtime dependencies: 2
- Peer dependencies: 6 (5 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: 27.30 MB (36.1%)@rolldown/binding-linux-x64-gnu: 19.89 MB (26.3%)ai: 8.37 MB (11.1%)zod: 6.15 MB (8.1%)undici: 3.58 MB (4.7%)
Publish payload breakdown
Published file size
🟠 dist/src/compiled/shadcn-registry/index.js [#####...................] 3.85 MB 14.1%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [###.....................] 2.29 MB 8.4%
🟠 dist/src/compiled/run/index.js [#.......................] 1.00 MB 3.7%
🟡 dist/src/compiled/@vercel/blob/index.js [#.......................] 604.9 kB 2.2%
🟡 dist/src/compiled/_chunks/workflow/undici-D-I... [#.......................] 521.9 kB 1.9%
🔴 Other published files [########################] 19.03 MB 69.7%
Installed footprint breakdown
Installed package size
🔴 eve [########################] 27.30 MB 36.1%
🔴 @rolldown/binding-linux-x64-gnu [#################.......] 19.89 MB 26.3%
🔴 ai [#######.................] 8.37 MB 11.1%
🔴 zod [#####...................] 6.15 MB 8.1%
🟠 undici [###.....................] 3.58 MB 4.7%
🟠 nitro [##......................] 1.89 MB 2.5%
🔴 Other installed packages [#######.................] 8.43 MB 11.2%
Runtime dependencies (2)
| Package | Range | Notes |
|---|---|---|
nitro |
3.0.260903-beta |
|
undici |
8.10.2 |
Peer dependencies (6)
| Package | Range | Notes |
|---|---|---|
@opentelemetry/api |
^1.0.0 |
optional peer |
ai |
catalog: |
|
braintrust |
^3.0.0 |
optional peer |
chat |
^4.42.0 |
optional peer |
dd-trace |
^6.13.0 |
optional peer |
just-bash |
^3.1.0 |
optional peer |
eve init install drill-down
eve init install details
- Command:
eve init my-agent - Package manager:
npm - Installed footprint: 113.99 MB across 10132 installed files
- Installed packages: 97 total (91 transitive-only)
- dependencies: 4 direct packages totaling 45.70 MB
- devDependencies: 2 direct packages totaling 5.11 MB
- Other transitive package files: 63.18 MB
Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.
Heavy installed dependencies
@typescript/typescript-linux-x64: 27.95 MB (24.5%)eve: 27.30 MB (23.9%)@rolldown/binding-linux-x64-gnu: 19.89 MB (17.5%)zod: 9.76 MB (8.6%)ai: 8.37 MB (7.3%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 27.95 MB 24.5%
🔴 eve [#######################.] 27.30 MB 23.9%
🔴 @rolldown/binding-linux-x64-gnu [#################.......] 19.89 MB 17.5%
🔴 zod [########................] 9.76 MB 8.6%
🔴 ai [#######.................] 8.37 MB 7.3%
🟠 undici [###.....................] 3.58 MB 3.1%
🔴 Other installed packages [###############.........] 17.16 MB 15.0%
dependencies (4)
| Package | Range | Installed size | Share |
|---|---|---|---|
@vercel/connect |
2.5.2 |
276.3 kB | 0.2% |
ai |
^7.0.137 |
8.37 MB | 7.3% |
eve |
file:eve-0.83.0.tgz |
27.30 MB | 23.9% |
zod |
4.5.4 |
9.76 MB | 8.6% |
devDependencies (2)
| Package | Range | Installed size | Share |
|---|---|---|---|
@types/node |
24.x |
2.61 MB | 2.3% |
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 [########################] 10.45 MB 50.0%
🔴 functions/__server.func [########################] 10.45 MB 50.0%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 10.45 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 10.45 MB |
| Function files | 10.45 MB across 121 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file _chunks/vercel.web.mjs is 2.48 MB (23.8%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 _chunks/vercel.web.mjs [#############...........] 2.48 MB 23.8%
🟡 _libs/undici.mjs [#####...................] 994.5 kB 9.5%
🟡 _chunks/sandbox2.mjs [####....................] 815.0 kB 7.8%
🟡 _chunks/compiled-artifacts-instrumentation.mjs [####....................] 732.3 kB 7.0%
🟡 _chunks/token-util-Bla5Z0G9.mjs [####....................] 704.5 kB 6.7%
🔴 Other bundled files [########################] 4.72 MB 45.2%
🧾 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 • 17 public routes, 1 internal alias • 10.45 MB
| Metric | Value |
|---|---|
| Public routes | //.well-known/workflow/v1/webhook/[token]/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/session/[sessionId]/stubs/eve/v1/task-input/[token] |
| Internal aliases | /__server |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 10.45 MB |
| Function files | 10.45 MB across 121 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file _chunks/vercel.web.mjs is 2.48 MB (23.8%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 _chunks/vercel.web.mjs [#############...........] 2.48 MB 23.8%
🟡 _libs/undici.mjs [#####...................] 994.5 kB 9.5%
🟡 _chunks/sandbox2.mjs [####....................] 815.0 kB 7.8%
🟡 _chunks/compiled-artifacts-instrumentation.mjs [####....................] 732.3 kB 7.0%
🟡 _chunks/token-util-Bla5Z0G9.mjs [####....................] 704.5 kB 6.7%
🔴 Other bundled files [########################] 4.72 MB 45.2%
🧾 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: 3.96 s -> 3.75 s (-213.6 ms) vs
main (13399a5). - Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `main (13399a5)`
| Phase | Baseline | Current | Delta |
|---|---|---|---|
extension.check |
0.5 ms | 0.5 ms | 0.0 ms |
project.resolve |
0.4 ms | 0.4 ms | 0.0 ms |
workspace.create |
0.6 ms | 0.6 ms | 0.0 ms |
host.prepare |
758.4 ms | 539.2 ms | -219.2 ms |
vercel.service-prefix.resolve |
2.0 ms | 1.9 ms | -0.1 ms |
nitro.create |
734.9 ms | 692.2 ms | -42.7 ms |
sandbox.prewarm |
388.5 ms | 376.0 ms | -12.5 ms |
nitro.cache.prepare |
0.2 ms | 0.2 ms | 0.0 ms |
nitro.prepare |
0.8 ms | 0.8 ms | 0.0 ms |
nitro.public-assets |
0.8 ms | 0.8 ms | 0.0 ms |
nitro.prerender |
0.6 ms | 0.6 ms | 0.0 ms |
nitro.bundle |
1.92 s | 1.97 s | +46.6 ms |
nitro.cache.write |
0.4 ms | 0.4 ms | 0.0 ms |
vercel.workflow-function.materialize |
56.2 ms | 56.2 ms | 0.0 ms |
agent-summary.emit |
0.6 ms | 0.6 ms | 0.0 ms |
connect-manifest.emit |
0.3 ms | 0.4 ms | +0.1 ms |
nitro.close |
0.1 ms | 0.1 ms | 0.0 ms |
output.publish |
3.5 ms | 3.6 ms | +0.1 ms |
workspace.remove |
2.9 ms | 3.1 ms | +0.2 ms |
Summary
SandboxSession.writeFilesalready exists and the Vercel adapter already resolves every write path and then sends one nativesandbox.writeFilesbatch, so the remaining gap from #4774 was the fallback path and the contract. Providers without a native batch API, just-bash and Docker, wrote strictly one file at a time and ignored an abort until their next provider call. They now write with a bounded number of writes in flight, 16 locally and 8 for Docker exec, and reject an already-aborted batch before writing anything. The sandbox docs now state the partial-failure contract: a batch is not atomic, and eve rolls nothing back. Related to #4774.The benchmark the issue asks for is not included. It needs a Vercel sandbox with a fixed region and configuration, which this change set cannot run, so this PR makes no speedup claim. Please keep #4774 open for the measurement.
Validation
pnpm --filter eve exec vitest run --config vitest.unit.config.ts src/execution/sandbox(19 files, 194 tests)pnpm lint,pnpm typecheck,pnpm docs:check,pnpm guard:invariantsChecklist
evepackagegit commit --signoff)