Repository navigation
Conversation
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 7.79 MB | 7.79 MB | +5.2 kB |
| Package | Unpacked publish size | 27.34 MB | 27.36 MB | +20.8 kB |
| Package | Installed footprint | 75.65 MB | 75.67 MB | +20.8 kB |
| Package | Published files | 4230 | 4234 | +4 |
| Package | Installed files | 8223 | 8227 | +4 |
| 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 | 9 | 9 | 0 |
| Runtime | Unique function payloads | 2 | 2 | 0 |
| Runtime | Total function bytes | 20.93 MB | 21.03 MB | +104.0 kB |
| Runtime | Public routes | 18 | 18 | 0 |
Changed function payloads vs main (6bc6d68) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/__server.func |
changed | 10.46 MB | 10.52 MB | +52.0 kB |
none |
functions/.well-known/workflow/v1/flow.func |
changed | 10.46 MB | 10.52 MB | +52.0 kB |
none |
eve init install
| Metric | Baseline | Current | Delta |
|---|---|---|---|
| Installed footprint | 114.04 MB | 114.06 MB | +20.8 kB |
| Installed packages | 97 | 97 | 0 |
| dependencies | 4 | 4 | 0 |
| devDependencies | 2 | 2 | 0 |
| Dependency package bytes | 45.74 MB | 45.76 MB | +20.8 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-26T17:32:30.445Z
- 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.2 - Package directory:
packages/eve - Tarball: 7.79 MB (
eve-0.83.2.tgz) - Unpacked payload: 27.36 MB across 4234 published files
- Installed footprint: 75.67 MB across 8227 installed files
- Installed root package: 27.36 MB
- Installed dependencies: 48.32 MB
- Installed package instances: 34
- Distinct installed package names: 32
- Installed dependency edges: 51
- Installed optional peer edges: 9
- Runtime dependencies: 2
- Peer dependencies: 7 (6 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.36 MB (36.2%)@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.09 MB 69.8%
Installed footprint breakdown
Installed package size
🔴 eve [########################] 27.36 MB 36.2%
🔴 @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.1%
Runtime dependencies (2)
| Package | Range | Notes |
|---|---|---|
nitro |
3.0.260903-beta |
|
undici |
8.10.2 |
Peer dependencies (7)
| 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 |
next |
^16.0.0 |
optional peer |
eve init install drill-down
eve init install details
- Command:
eve init my-agent - Package manager:
npm - Installed footprint: 114.06 MB across 10144 installed files
- Installed packages: 97 total (91 transitive-only)
- dependencies: 4 direct packages totaling 45.76 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.36 MB (24.0%)@rolldown/binding-linux-x64-gnu: 19.89 MB (17.4%)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.36 MB 24.0%
🔴 @rolldown/binding-linux-x64-gnu [#################.......] 19.89 MB 17.4%
🔴 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.2.tgz |
27.36 MB | 24.0% |
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.52 MB 50.0%
🔴 functions/__server.func [########################] 10.52 MB 50.0%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 10.52 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 10.52 MB |
| Function files | 10.52 MB across 121 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file _chunks/vercel.web.mjs is 2.55 MB (24.2%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 _chunks/vercel.web.mjs [#############...........] 2.55 MB 24.2%
🟡 _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 44.9%
🧾 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.52 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.52 MB |
| Function files | 10.52 MB across 121 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file _chunks/vercel.web.mjs is 2.55 MB (24.2%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 _chunks/vercel.web.mjs [#############...........] 2.55 MB 24.2%
🟡 _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 44.9%
🧾 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.86 s -> 3.95 s (+87.4 ms) vs
main (6bc6d68). - Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `main (6bc6d68)`
| Phase | Baseline | Current | Delta |
|---|---|---|---|
extension.check |
16.4 ms | 18.4 ms | +2.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 |
576.3 ms | 534.3 ms | -42.0 ms |
vercel.service-prefix.resolve |
1.5 ms | 1.8 ms | +0.3 ms |
nitro.create |
718.7 ms | 727.3 ms | +8.6 ms |
sandbox.prewarm |
572.9 ms | 538.8 ms | -34.1 ms |
nitro.cache.prepare |
0.3 ms | 0.2 ms | -0.1 ms |
nitro.prepare |
0.8 ms | 0.7 ms | -0.1 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 |
1.84 s | 1.98 s | +149.1 ms |
nitro.cache.write |
0.3 ms | 0.3 ms | 0.0 ms |
vercel.workflow-function.materialize |
49.1 ms | 49.8 ms | +0.7 ms |
agent-summary.emit |
0.8 ms | 0.7 ms | -0.1 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.3 ms | 3.3 ms | 0.0 ms |
workspace.remove |
2.5 ms | 2.5 ms | 0.0 ms |
| export function continueSessionUsage(session: DurableSession): DurableSession { | ||
| const relays = readHitlState(session.state).relays; | ||
| const tasks = readTaskTable(session.state).tasks; | ||
| const unreported = { cacheReadTokens: 0, cacheWriteTokens: 0, inputTokens: 0, outputTokens: 0 }; |
There was a problem hiding this comment.
The credit skips costUsd. unreported only has the four token fields, and the loop on line 53 walks Object.keys(unreported), so a relayed prompt's total.costUsd never gets credited.
The prompt does carry cost (toJsonUsage in harness/hitl/budget-request.ts), resetSessionUsageWindow handles it, and docs/agent-config.md documents a cost limit ((window.costUsd ?? 0) >= 1.5). So with a cost-based sessionUsage, the parent still asks again once the child's already-approved cost reports up. That's the same double ask this PR fixes for tokens.
Suggested fix: credit costUsd when the prompt has it, clamped at 0 like the other fields. A shared clamped-delta helper with usageSince in execution/agent-sessions/usage.ts (which already handles costUsd) would keep the two field lists from drifting apart again.
| ]; | ||
| await Promise.all( | ||
| runs.map((run) => | ||
| ignoreGoneTarget(resumeHook(run.hookToken, USAGE_CONTINUED)).catch((error: unknown) => { |
There was a problem hiding this comment.
An execute workflow tool run that only opens ctx.agent sessions never gets this push.
workflow.ts registers the control hook up front only for task/serve runs (isTask). An execute run registers it later, and only when it relays a message that passes isAnsweredOnControlHook (an ask request or a withdrawal). A ctx.agent child's session-limit prompt goes up as an input-batch, which doesn't pass that check. So the hook can still be missing here while the run is live. ignoreGoneTarget then treats the HookNotFoundError as "gone" and drops the push without logging anything. The run's other ctx.agent sessions keep their old windows and ask again, even though the docs say the running sessions below get the new window.
Suggested fix: register the execute run's hook before it shows up in getBlockingWorkflowToolRuns, at least once it opens a ctx.agent session. Or skip runs whose hook isn't registered yet, and log it, instead of treating them as gone. A test with an execute tool whose ctx.agent children never call ctx.ask would cover this.
| "eve": patch | ||
| --- | ||
|
|
||
| A turn's principal no longer changes while it runs. Only the turn's own principal can answer a pending `ctx.ask()` or `ask_question` by typing, whether a workflow tool, a subagent or a remote agent asked; another person's text waits and runs as their own turn instead of answering the question under the asker's auth. A typed answer updates the claims on `ctx.session.auth.current`, so its `message.received` hook and the rest of the turn see the request that sent it. Someone else's button answer still settles the request as its responder. |
There was a problem hiding this comment.
Nit: AGENTS.md (Changesets) asks for a 1 to 2 sentence body. This one has four, and the message.received and claims details are already in docs/guides/hooks.md and auth-and-route-protection.md. Something like: "A turn's principal no longer changes while it runs: only the turn's own principal can answer a pending ctx.ask() or ask_question by typing, and anyone else's text runs as their own turn. Someone else's button answer still settles the request as its responder."
e68cff2 to
19a694c
Compare
Squash of the tree-allowance commits from #5182, rebased onto main. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
19a694c to
9735c70
Compare
Squash of the tree-allowance commits from #5182, rebased onto main. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
Squash of the tree-allowance commits from #5182, rebased onto main. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
9735c70 to
32d9e85
Compare
Squash of the tree-allowance commits from #5182, rebased onto main. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
32d9e85 to
d977e6b
Compare
…request's auth Pins #4923 as an expected failure: a plain-text answer's message.received hook and the rest of the turn see the asking request's auth. Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
…s question Pins #4923's cross-principal case as an expected failure: while alice's turn waits on ctx.ask() or ask_question, bob's typed text answers the question, and the same holds for a question relayed from a subagent, a remote agent or a workflow tool. Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com> Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
…d on its prompt Refs #4923 Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com> Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
A typed answer to a pending question now passes the same principal gate as steering, for a workflow tool's ctx.ask(), a subagent and a remote agent. Text from anyone else waits and runs as its own turn. Every message that joins a running turn sets the turn's auth through continueTurnAuth, which updates only the claims of the turn's own principal and throws if another principal's message gets through. Someone else's answers still settle a request as its responder and keep the turn's identity. Removes the cross-principal expected-failure markers. Refs #4923 Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com> Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
A turn parked on its own prompt, such as the session-limit continuation, is still open. Input from another principal now waits for it to end; their answers to its requests still go through. Refs #4923 Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com> Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
Another principal's answer can resume a parked turn, but the turn keeps the principal that started it, so its owner's text still steers it and the other person's text waits. Refs #4923 Co-authored-by: ruiconti <1834568+ruiconti@users.noreply.github.com> Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
A delivery from another principal that answered one open approval and one closed request lost its responder for both, so the open turn's caller stood in as the approver and requester-only approvals passed. Each answer to an open approval now carries its responder, and another principal's answer to a closed request is dropped instead of becoming text the open turn reads. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
Squash of the tree-allowance commits from #5182, rebased onto main. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
The root of a delegation tree mints one grant per answered payload, with a sequence number and the relayed prompts it approved. Every forwarded answer and every push carries that same grant, and each session applies the first copy that reaches it: a grant at or below the one it applied changes nothing. This replaces the record of recent prompt ids and its overlap check. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
…mints A Continue resumes every session in the tree parked on a session-limit prompt, not only the one answered, so the grant now approves every session-limit prompt open where it is minted. Without that, two parked 45M workers resumed and their 90M report left 45M in the root's window, which asked again. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
…rompt The root's own Continue minted a grant that approved every open session-limit prompt, its children's relayed ones included, but started the window without crediting their unreported spend. The grant push then resumed those children, whose reports filled the new window, so the root asked again for spend the Continue had approved. Both minting entry points now apply their grant through continueSessionUsage. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
… Continue mints A Continue on a relayed session-limit prompt minted the root's grant and started its next window, but left the root's own pending limit prompt open, so the parked root needed a second click. Routing now returns the session's own prompts the grant settled, and the owner queues an auth-less Continue for them, as a grant pushed from above already does. A prompt the same delivery answers, a Stop included, is left to it. Signed-off-by: ruiconti <1834568+ruiconti@users.noreply.github.com>
8d4473f to
d4f6b5e
Compare
Continue on a subagent's session-limit prompt now raises the allowance of every session in the asking tree, so the parent and the subagent's siblings no longer ask again for the same spend. This replaces #5061 with a much smaller design.
Why
Since #5028, each session owns a usage window, and a Continue only reset the window of the session that answered. In a delegation tree, that meant the same spend got approved more than once. A worker asked at 45M and the user chose Continue. Then the root asked again as soon as that 45M reported up, and so did any sibling worker near its own limit. The
session-limit-renewaleval reproduces this: two lease workers under one root produced 3 asks, where 2 are expected.Approach
An allowance stays what #5028 made it: the window start plus the quota. A Continue only moves the window start, and it moves it for the whole asking tree.
totalminus what the session has already counted from the run, cost included. When one run relays several prompts, it gets the largest of these, not their sum, because nested prompts share spend. That spend then counts in the window being approved, not the next one. The run's count includes everything already reported through it, so this credit can fall short but never overshoot. Prompts relayed through runs that don't report usage up earn no credit.sessionLimitDecision, shared by the session and the proxy). Answers like "maybe" or a typed "Approve" do not.usage-continuedcontrol message to its started task runs and blocking workflow tool runs. Those runs pass it to thectx.agentsessions they opened.{ seq, askers: [{ requestId, total }] }. Every forwarded copy of the answer and every push down the tree carries that same grant.A relayed Stop is resolved by the parent before it cancels its turn, and the child's own Stop resolution isn't relayed back up.
Compared with #5061, this drops the extra window fields, the task-table
usageWindow, the extension-contract changes and epoch bumps, the renewal-id dedup and overlap check, and the hook-wait, retry and stale-session tracking.Validation
agent-subagents, mock model):session-limit-renewal: 2 asks, the second one from the root at 90M against 85M approved. It was 3 asks before.session-limit-renewal-parked: still 1 answer.responder, and the root turn keeps Alice's auth.hitl/relayed-budget-stop-cancels-parentpasses. A relayed Stop's answered resolution is recorded at the parent, and the child's Stop isn't relayed back.ctx.agentsessions;continueUsagefails.tsc,oxlintandoxfmtare clean.Relevant context
ctx.askanswers from another principal no longer drive the turn. The cross-principal tests above need it. The follow-up commit adapts its tests tolimits.sessionUsageand keyed admission.main, which already contains feat(eve)!: replace numeric session limits with a limits.sessionUsage function #5028.