Conversation
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 8.57 MB | 8.57 MB | +6.7 kB |
| Package | Unpacked publish size | 31.95 MB | 31.97 MB | +24.5 kB |
| Package | Installed footprint | 78.11 MB | 78.14 MB | +24.5 kB |
| Package | Published files | 3765 | 3775 | +10 |
| Package | Installed files | 7725 | 7735 | +10 |
| Package | Installed package instances | 33 | 33 | 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 | 21.92 MB | 21.92 MB | +170 B |
| Runtime | Public routes | 18 | 18 | 0 |
Changed function payloads vs spike/dockerfile-sandbox-local (e227a0a) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/__server.func |
changed | 10.96 MB | 10.96 MB | +85 B |
none |
functions/.well-known/workflow/v1/flow.func |
changed | 10.96 MB | 10.96 MB | +85 B |
none |
eve init install
| Metric | Baseline | Current | Delta |
|---|---|---|---|
| Installed footprint | 116.33 MB | 116.36 MB | +24.5 kB |
| Installed packages | 98 | 98 | 0 |
| dependencies | 4 | 4 | 0 |
| devDependencies | 2 | 2 | 0 |
| Dependency package bytes | 49.43 MB | 49.45 MB | +24.5 kB |
| devDependency package bytes | 5.04 MB | 5.04 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-09-21T22:10:42.670Z
- 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.63.0 - Package directory:
packages/eve - Tarball: 8.57 MB (
eve-0.63.0.tgz) - Unpacked payload: 31.97 MB across 3775 published files
- Installed footprint: 78.14 MB across 7735 installed files
- Installed root package: 31.32 MB
- Installed dependencies: 46.82 MB
- Installed package instances: 33
- 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: 31.32 MB (40.1%)@rolldown/binding-linux-x64-gnu: 19.10 MB (24.4%)ai: 7.65 MB (9.8%)zod: 6.67 MB (8.5%)undici: 3.51 MB (4.5%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js [#############...........] 9.70 MB 30.3%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [###.....................] 2.29 MB 7.2%
🟠 dist/src/compiled/@ai-sdk/code-mode/index.js [#.......................] 1.03 MB 3.2%
🟡 dist/src/compiled/@vercel/blob/index.js [#.......................] 902.9 kB 2.8%
🟡 dist/src/compiled/_chunks/workflow/signal-exi... [#.......................] 514.5 kB 1.6%
🔴 Other published files [########################] 17.53 MB 54.8%
Installed footprint breakdown
Installed package size
🔴 eve [########################] 31.32 MB 40.1%
🔴 @rolldown/binding-linux-x64-gnu [###############.........] 19.10 MB 24.4%
🔴 ai [######..................] 7.65 MB 9.8%
🔴 zod [#####...................] 6.67 MB 8.5%
🟠 undici [###.....................] 3.51 MB 4.5%
🟠 nitro [#.......................] 1.89 MB 2.4%
🔴 Other installed packages [######..................] 7.98 MB 10.2%
Runtime dependencies (2)
| Package | Range | Notes |
|---|---|---|
nitro |
3.0.260903-beta |
|
undici |
8.9.0 |
Peer dependencies (6)
| Package | Range | Notes |
|---|---|---|
@opentelemetry/api |
^1.0.0 |
optional peer |
ai |
catalog: |
|
braintrust |
^3.0.0 |
optional peer |
dd-trace |
^6.13.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: 116.36 MB across 9629 installed files
- Installed packages: 98 total (92 transitive-only)
- dependencies: 4 direct packages totaling 49.45 MB
- devDependencies: 2 direct packages totaling 5.04 MB
- Other transitive package files: 61.87 MB
Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.
Heavy installed dependencies
eve: 31.32 MB (26.9%)@typescript/typescript-linux-x64: 27.95 MB (24.0%)@rolldown/binding-linux-x64-gnu: 19.10 MB (16.4%)zod: 10.29 MB (8.8%)ai: 7.65 MB (6.6%)
Installed footprint breakdown
Installed package size
🔴 eve [########################] 31.32 MB 26.9%
🔴 @typescript/typescript-linux-x64 [#####################...] 27.95 MB 24.0%
🔴 @rolldown/binding-linux-x64-gnu [###############.........] 19.10 MB 16.4%
🔴 zod [########................] 10.29 MB 8.8%
🔴 ai [######..................] 7.65 MB 6.6%
🟠 undici [###.....................] 3.51 MB 3.0%
🔴 Other installed packages [#############...........] 16.54 MB 14.2%
dependencies (4)
| Package | Range | Installed size | Share |
|---|---|---|---|
@vercel/connect |
2.2.0 |
188.7 kB | 0.2% |
ai |
^7.0.105 |
7.65 MB | 6.6% |
eve |
file:eve-0.63.0.tgz |
31.32 MB | 26.9% |
zod |
4.5.4 |
10.29 MB | 8.8% |
devDependencies (2)
| Package | Range | Installed size | Share |
|---|---|---|---|
@types/node |
24.x |
2.54 MB | 2.2% |
typescript |
7.0.2 |
2.50 MB | 2.1% |
Function Drill-Down
Payload Size Graph
Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func [########################] 10.96 MB 50.0%
🔴 functions/__server.func [########################] 10.96 MB 50.0%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 10.96 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 10.96 MB |
| Function files | 10.96 MB across 120 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 2.87 MB (26.2%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [#############...........] 2.87 MB 26.2%
🟡 _libs/undici.mjs [#####...................] 980.8 kB 8.9%
🟡 _chunks/sandbox.mjs [####....................] 809.9 kB 7.4%
🟡 _chunks/signal-exit-B9U6kH7R.mjs [###.....................] 616.2 kB 5.6%
🟡 _chunks/oidc.mjs [###.....................] 570.8 kB 5.2%
🔴 Other bundled files [########################] 5.11 MB 46.6%
🧾 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.96 MB
| Metric | Value |
|---|---|
| Public routes | //.well-known/workflow/v1/webhook/[token]/eve/v1/activity/[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/task-input/[token] |
| Internal aliases | /__server |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 10.96 MB |
| Function files | 10.96 MB across 120 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 2.87 MB (26.2%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [#############...........] 2.87 MB 26.2%
🟡 _libs/undici.mjs [#####...................] 980.8 kB 8.9%
🟡 _chunks/sandbox.mjs [####....................] 809.9 kB 7.4%
🟡 _chunks/signal-exit-B9U6kH7R.mjs [###.....................] 616.2 kB 5.6%
🟡 _chunks/oidc.mjs [###.....................] 570.8 kB 5.2%
🔴 Other bundled files [########################] 5.11 MB 46.6%
🧾 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: 4.34 s -> 4.23 s (-116.2 ms) vs
spike/dockerfile-sandbox-local (e227a0a). - Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `spike/dockerfile-sandbox-local (e227a0a)`
| Phase | Baseline | Current | Delta |
|---|---|---|---|
extension.check |
0.5 ms | 11.4 ms | +10.9 ms |
project.resolve |
0.3 ms | 0.4 ms | +0.1 ms |
workspace.create |
0.5 ms | 0.6 ms | +0.1 ms |
host.prepare |
687.9 ms | 655.2 ms | -32.7 ms |
vercel.service-prefix.resolve |
2.3 ms | 2.6 ms | +0.3 ms |
nitro.create |
317.6 ms | 324.8 ms | +7.2 ms |
sandbox.prewarm |
300.0 ms | 262.2 ms | -37.8 ms |
nitro.cache.prepare |
0.2 ms | 0.3 ms | +0.1 ms |
nitro.prepare |
0.9 ms | 0.9 ms | 0.0 ms |
nitro.public-assets |
0.8 ms | 0.8 ms | 0.0 ms |
nitro.prerender |
0.5 ms | 0.5 ms | 0.0 ms |
nitro.bundle |
2.88 s | 2.81 s | -63.8 ms |
nitro.cache.write |
0.4 ms | 0.4 ms | 0.0 ms |
vercel.workflow-function.materialize |
57.0 ms | 55.2 ms | -1.8 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.8 ms | 3.6 ms | -0.2 ms |
workspace.remove |
2.5 ms | 2.4 ms | -0.1 ms |
| const runner = input.runner ?? createOciCommandRunner(); | ||
| return { | ||
| async publish(publishInput) { | ||
| const engine = input.engine ?? (process.env.VERCEL ? "buildah" : "docker"); |
There was a problem hiding this comment.
[P1] Distinguish local vercel build from the hosted builder. The repository models a local Vercel build as VERCEL="1" with no deployment ID in vercel-build-prewarm.scenario.test.ts:48-65, so this selects Buildah locally even though the documented local dependency is Docker. A normal machine with Docker but no Buildah fails before the image build starts. Select Buildah only from a hosted-build-specific capability or signal, fall back to Docker locally, and cover both defaults.
| return { | ||
| async publish(publishInput) { | ||
| const engine = input.engine ?? (process.env.VERCEL ? "buildah" : "docker"); | ||
| if (engine === "docker" || !hasRegistryAuthFile()) { |
There was a problem hiding this comment.
[P1] Use an isolated, registry-scoped credential context. Docker login currently writes the VCR token into the caller's inherited Docker config and never removes it. Buildah takes the opposite shortcut: any existing auth file, including the empty file in the new test, suppresses login without proving that it authenticates input.registry. This can both leave credentials behind and ignore a valid supplied token. Create a private temporary Docker config or Buildah auth file for login, build, and push, then remove it in finally.
| ); | ||
| } catch (error) { | ||
| const message = error instanceof Error ? error.message : String(error); | ||
| throw new Error(message.replaceAll(input.authToken, "[redacted]"), { cause: error }); |
There was a problem hiding this comment.
[P1] Remove the raw credential from the error cause. replaceAll sanitizes only the wrapper message, while the original token-bearing error remains unchanged in cause. The standard logger's formatError() and inspectError() intentionally serialize the full cause chain, so the test's Error("rejected secret-token") still exposes secret-token in diagnostic logs and telemetry. Drop the raw cause at this credential boundary or construct a recursively sanitized cause, and assert that formatted logging contains no token.
| stdio: [options.stdin === undefined ? "ignore" : "pipe", "pipe", "pipe"], | ||
| }); | ||
| const stdout: Buffer[] = []; | ||
| const stderr: Buffer[] = []; |
There was a problem hiding this comment.
[P1] Bound child-process output. Every Docker or Buildah command appends all stdout and stderr to in-memory arrays until exit, including successful build output that callers discard. An authored Dockerfile can emit enough output to exhaust the Node build process before the child exits. Stream normal build output and retain only a bounded tail for errors and digest parsing, matching the repository's existing bounded-output behavior.
| if (drive === null) { | ||
| throw new VercelImageResourceUnavailableError(artifact.resourceKey); | ||
| } | ||
| mounts[artifact.mountPath] = drive.snapshot(); |
There was a problem hiding this comment.
[P1] Make the prepared artifact identify immutable resource bytes. The artifact stores only driveName, and Drive.snapshot() in @vercel/sandbox@3.3.0 returns a name-only mount descriptor. This therefore snapshots whatever the mutable Drive contains when the runtime sandbox is created. If the Drive is modified or deleted and recreated under the same project-unique name, this resolver accepts different bytes without even checking resourceKey. Persist and verify an immutable service revision if available; otherwise use an actually immutable artifact rather than claiming that a mutable Drive name pins prepared content.
| readonly signal?: AbortSignal; | ||
| }): Promise<boolean> { | ||
| const credentials = await getVercelSandboxCredentials(input.createOptions); | ||
| const writer = await input.module.Sandbox.create({ |
There was a problem hiding this comment.
[P1] Serialize publication for each content-addressed Drive. Two builds, or two concurrent template prepares with the same resource key, can both resolve the same Drive and attempt this sole read-write mount. Vercel permits only one read-write Drive attachment, and this path has no lock, conflict retry, or wait for the other publisher's completed manifest, so one prepare aborts the deployment. Coordinate by Drive name and retry or poll until a complete verified publication is available.
| }); | ||
| const drive = | ||
| existing ?? | ||
| (await module.Drive.getOrCreate({ |
There was a problem hiding this comment.
[P2] Add a lifecycle for persistent resource Drives. Every resource content hash creates a new Drive, but neither superseded revisions nor Drives created before a later prepare failure are deleted. Normal workspace edits and failed builds therefore accumulate persistent storage indefinitely. Roll back unpublished Drives and add retention-aware cleanup that preserves revisions still referenced by deployable artifacts or live sandboxes.
| } | ||
| throw error; | ||
| } | ||
| } else { |
There was a problem hiding this comment.
[P1] Complete resource hydration when recovering an existing named sandbox. If creation succeeds but the process stops during ensureBaseRuntime() or hydrateResources() before session state is persisted, the retry finds that deterministic sandbox here. The fresh path hydrates the Drive mounts into the mutable targets, but this recovery path only installs the base runtime and tags, then returns an incomplete workspace. Run idempotent hydration here too, or persist and validate an initialization marker before reusing the sandbox.
| ); | ||
| ``` | ||
|
|
||
| The build requires Vercel project credentials and an OCI builder: Docker locally or buildah in a hosted build environment. Registry credentials never appear in command arguments or prepared artifacts. |
There was a problem hiding this comment.
[P2] State the prerequisites for each image path. The new no-Dockerfile branch returns VERCEL_EVE_SANDBOX_IMAGE without invoking the OCI publisher, so it does not require Docker or Buildah. Conversely, a custom Dockerfile requires a project-scoped OIDC JWT with owner and project claims at vercel-image.ts:430-455; generic Vercel project credentials such as a PAT fail with an opaque scope error. Qualify the builder requirement and link the exact OIDC setup.
|
|
||
| The build requires Vercel project credentials and an OCI builder: Docker locally or buildah in a hosted build environment. Registry credentials never appear in command arguments or prepared artifacts. | ||
|
|
||
| This environment does not accept `prepare`. Add a Dockerfile when the eve base image is not sufficient, and put immutable software setup there. The build artifact records only the digest-pinned image reference and content-addressed Drive identities; it never records credentials. Runtime strictly resolves those resources and fails with rebuild or redeploy guidance when they are unavailable. |
There was a problem hiding this comment.
[P2] Align these artifact and recovery claims with the implementation. Without a Dockerfile, prepare() stores VERCEL_EVE_SANDBOX_IMAGE, which is a tag accepted separately from DIGEST_PINNED_IMAGE, not a digest-pinned reference. Also, a missing Drive raises only Prepared sandbox resource ... is unavailable, while image or pending errors say only to run eve build; neither path provides redeploy guidance. Either implement the stated guarantees or document the actual artifact and recovery behavior.
9dfbac3 to
6e4984a
Compare
6e4984a to
8ac49bf
Compare
8ac49bf to
c2c58e1
Compare
c2c58e1 to
83aaf0d
Compare
4fa0841 to
9ecf053
Compare
3e2970a to
4fab28a
Compare
5db3bba to
0d11f2c
Compare
0d11f2c to
78f823c
Compare
78f823c to
d07886a
Compare
d07886a to
56210d3
Compare
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Signed-off-by: Casey Gowrie <ctgowrie@gmail.com>
Summary
Stacked on #3271. Adds an experimental Vercel image environment that uses eve's base image by default, builds and publishes a Linux AMD64 OCI image when a Dockerfile is present, and prepares managed workspace and skill resources as immutable Drive snapshots. Runtime starts directly from the recorded image and exact named Drive snapshot mounts, validates provider-owned state on direct resume, and never rebuilds, republishes, repairs, or substitutes prepared resources. Drive preparation and lookup are private provider functions rather than an injectable resource subsystem.
The existing
VercelSandboxremains snapshot-backed.ExperimentalVercelDockerfilehas no authoredpreparecallback—add a Dockerfile when the eve base image is not sufficient, and put immutable custom setup there—and uses the same providerprepare()/start()/resume()contract introduced by the base PR. Build-only OCI publication code is pruned from hosted runtime bundles, credentials are passed through standard input or existing standard registry authentication, and artifacts contain no credentials.Review should focus on immutable Drive publication/validation, digest-pinned image identity, credential handling, and the build/runtime pruning boundary. This PR intentionally excludes cross-session native compute reuse, which remains on a separate local branch.
Validation
Direct TypeScript compilation passes against stable
@vercel/sandbox@3.3.0. Focused Vercel image, Drive resource, OCI publication, public API, and runtime-pruning coverage passes, including base-image fallback, credential redaction, strict missing-resource failures, dedicated session identity, and exclusion of build-only publication code from hosted runtime output. Two deterministic fixtures add Vercel-world coverage for the base-image fallback, authored Dockerfiles, Drive-backed workspace and skills, post-open file initialization, and persistence across turns. Documentation and disclosure scans also pass; credentialed publication against a real Vercel project remains for hosted validation.Checklist
CONTRIBUTING.mdevepackagegit commit --signoff)Diff size
Docs — 2 files ·
+29 / -0Documents the experimental environment, its Dockerfile-first setup model, immutable artifact behavior, and release-note impact.
Implementation — 11 files ·
+1021 / -5Implements OCI publication, immutable Drive resource preparation, image-backed provider lifecycle, stable SDK types, public exports, and hosted-runtime pruning.
Tests — 28 files ·
+726 / -1Covers image publication and redaction, direct Drive creation and strict lookup, provider identity/state, public construction, pruning of build-only code, and two Vercel-world fixtures spanning base-image and Dockerfile paths with workspace, skills, and post-open persistence.