refactor(eve): unify durable HITL request lifecycle - #2822
Conversation
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
Signed-off-by: Rui Conti <ruiconti@gmail.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 8.54 MB | 8.54 MB | -30 B ✅ |
| Package | Unpacked publish size | 32.19 MB | 32.19 MB | +412 B |
| Package | Installed footprint | 77.21 MB | 77.21 MB | +412 B |
| Package | Published files | 3672 | 3672 | 0 |
| Package | Installed files | 7507 | 7507 | 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 | 19.87 MB | 19.87 MB | +254 B |
| Runtime | Public routes | 17 | 17 | 0 |
Changed function payloads vs rui/hitl-authorization-interpreter (de7c03d) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/__server.func |
changed | 9.93 MB | 9.93 MB | +127 B |
none |
functions/.well-known/workflow/v1/flow.func |
changed | 9.93 MB | 9.93 MB | +127 B |
none |
eve init install
| Metric | Baseline | Current | Delta |
|---|---|---|---|
| Installed footprint | 115.65 MB | 115.65 MB | +412 B |
| Installed packages | 120 | 120 | 0 |
| dependencies | 4 | 4 | 0 |
| devDependencies | 2 | 2 | 0 |
| Dependency package bytes | 48.16 MB | 48.16 MB | +412 B |
| 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-09-01T04:43:24.409Z
- Route aliases: 17 public, 1 internal (18 total aliases)
- Vercel routes in config: 20
- Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down
Package Details
- Package:
eve@0.47.6 - Package directory:
packages/eve - Tarball: 8.54 MB (
eve-0.47.6.tgz) - Unpacked payload: 32.19 MB across 3672 published files
- Installed footprint: 77.21 MB across 7507 installed files
- Installed root package: 30.73 MB
- Installed dependencies: 46.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: 30.73 MB (39.8%)@rolldown/binding-linux-x64-gnu: 19.33 MB (25.0%)ai: 6.89 MB (8.9%)zod: 6.41 MB (8.3%)undici: 3.50 MB (4.5%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js [#############...........] 9.76 MB 30.3%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [###.....................] 2.27 MB 7.1%
🟠 dist/src/compiled/@ai-sdk/code-mode/index.js [#.......................] 1.03 MB 3.2%
🟡 dist/src/compiled/@vercel/blob/index.js [#.......................] 901.8 kB 2.8%
🟡 dist/src/compiled/_chunks/workflow/undici-Dzn... [#.......................] 512.7 kB 1.6%
🔴 Other published files [########################] 17.72 MB 55.0%
Installed footprint breakdown
Installed package size
🔴 eve [########################] 30.73 MB 39.8%
🔴 @rolldown/binding-linux-x64-gnu [###############.........] 19.33 MB 25.0%
🔴 ai [#####...................] 6.89 MB 8.9%
🔴 zod [#####...................] 6.41 MB 8.3%
🟠 undici [###.....................] 3.50 MB 4.5%
🟠 nitro [##......................] 2.41 MB 3.1%
🔴 Other installed packages [######..................] 7.94 MB 10.3%
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: 115.65 MB across 9403 installed files
- Installed packages: 120 total (114 transitive-only)
- dependencies: 4 direct packages totaling 48.16 MB
- devDependencies: 2 direct packages totaling 5.04 MB
- Other transitive package files: 62.45 MB
Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.
Heavy installed dependencies
eve: 30.73 MB (26.6%)@typescript/typescript-linux-x64: 27.95 MB (24.2%)@rolldown/binding-linux-x64-gnu: 19.33 MB (16.7%)zod: 10.37 MB (9.0%)ai: 6.89 MB (6.0%)
Installed footprint breakdown
Installed package size
🔴 eve [########################] 30.73 MB 26.6%
🔴 @typescript/typescript-linux-x64 [######################..] 27.95 MB 24.2%
🔴 @rolldown/binding-linux-x64-gnu [###############.........] 19.33 MB 16.7%
🔴 zod [########................] 10.37 MB 9.0%
🔴 ai [#####...................] 6.89 MB 6.0%
🟠 undici [###.....................] 3.50 MB 3.0%
🔴 Other installed packages [#############...........] 16.88 MB 14.6%
dependencies (4)
| Package | Range | Installed size | Share |
|---|---|---|---|
@vercel/connect |
1.0.0 |
167.9 kB | 0.1% |
ai |
^7.0.82 |
6.89 MB | 6.0% |
eve |
file:eve-0.47.6.tgz |
30.73 MB | 26.6% |
zod |
4.5.4 |
10.37 MB | 9.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.93 MB 50.0%
🔴 functions/__server.func [########################] 9.93 MB 50.0%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 9.93 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 9.93 MB |
| Function files | 9.93 MB across 110 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 1.97 MB (19.8%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [##########..............] 1.97 MB 19.8%
🟡 _libs/undici.mjs [#####...................] 980.5 kB 9.9%
🟡 _chunks/decode_jwt-Col8JOnf.mjs [###.....................] 702.6 kB 7.1%
🟡 _chunks/frames-Dl2Hcma4.mjs [###.....................] 678.7 kB 6.8%
🟡 _chunks/chatgpt-model.mjs [###.....................] 667.7 kB 6.7%
🔴 Other bundled files [########################] 4.93 MB 49.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 • 16 public routes, 1 internal alias • 9.93 MB
| Metric | Value |
|---|---|
| Public routes | //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 | 9.93 MB |
| Function files | 9.93 MB across 110 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 1.97 MB (19.8%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [##########..............] 1.97 MB 19.8%
🟡 _libs/undici.mjs [#####...................] 980.5 kB 9.9%
🟡 _chunks/decode_jwt-Col8JOnf.mjs [###.....................] 702.6 kB 7.1%
🟡 _chunks/frames-Dl2Hcma4.mjs [###.....................] 678.7 kB 6.8%
🟡 _chunks/chatgpt-model.mjs [###.....................] 667.7 kB 6.7%
🔴 Other bundled files [########################] 4.93 MB 49.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.52 s -> 2.37 s (-157.9 ms) vs
rui/hitl-authorization-interpreter (de7c03d). - Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `rui/hitl-authorization-interpreter (de7c03d)`
| Phase | Baseline | Current | Delta |
|---|---|---|---|
extension.check |
1.1 ms | 11.8 ms | +10.7 ms |
project.resolve |
0.3 ms | 0.3 ms | 0.0 ms |
workspace.create |
0.7 ms | 0.7 ms | 0.0 ms |
host.prepare |
573.2 ms | 389.8 ms | -183.4 ms |
vercel.service-prefix.resolve |
1.9 ms | 2.4 ms | +0.5 ms |
nitro.create |
258.1 ms | 262.5 ms | +4.4 ms |
sandbox.prewarm |
225.9 ms | 256.0 ms | +30.1 ms |
nitro.cache.prepare |
0.2 ms | 0.2 ms | 0.0 ms |
nitro.prepare |
0.6 ms | 0.7 ms | +0.1 ms |
nitro.public-assets |
0.7 ms | 0.7 ms | 0.0 ms |
nitro.prerender |
0.5 ms | 0.5 ms | 0.0 ms |
nitro.bundle |
1.41 s | 1.39 s | -20.0 ms |
nitro.cache.write |
0.3 ms | 0.3 ms | 0.0 ms |
vercel.workflow-function.materialize |
43.1 ms | 42.6 ms | -0.5 ms |
agent-summary.emit |
0.7 ms | 0.7 ms | 0.0 ms |
nitro.close |
0.2 ms | 0.1 ms | -0.1 ms |
output.publish |
3.0 ms | 3.3 ms | +0.3 ms |
workspace.remove |
1.8 ms | 1.8 ms | 0.0 ms |
Signed-off-by: Rui Conti <ruiconti@gmail.com>
|
Marking this draft again: the current branch centralizes storage and routing, but it does not yet establish the interpreter as the sole lifecycle authority. I am continuing on this PR with reducer verdicts, durable ready/delivered Group completion, ResponseAttempt identity, internal Authorization Requests, and forced closure before requesting review. |
Signed-off-by: Rui Conti <ruiconti@gmail.com>
| readonly limitContinuation: { readonly granted: boolean }; | ||
| } { | ||
| const messages = [...input.messages]; | ||
| appendResolvedBatchTranscript(messages, input.batch, []); | ||
| const limitContinuation = resolveSessionLimitContinuation({ | ||
| requests: input.pendingBatch.requests, | ||
| requests: input.batch.requests, | ||
| responses: input.responses, | ||
| }); | ||
| if (limitContinuation === undefined) { | ||
| throw new TypeError("Answered session-limit batches must resolve a continuation verdict."); | ||
| } |
There was a problem hiding this comment.
| readonly limitContinuation: { readonly granted: boolean }; | |
| } { | |
| const messages = [...input.messages]; | |
| appendResolvedBatchTranscript(messages, input.batch, []); | |
| const limitContinuation = resolveSessionLimitContinuation({ | |
| requests: input.pendingBatch.requests, | |
| requests: input.batch.requests, | |
| responses: input.responses, | |
| }); | |
| if (limitContinuation === undefined) { | |
| throw new TypeError("Answered session-limit batches must resolve a continuation verdict."); | |
| } | |
| readonly limitContinuation?: { readonly granted: boolean }; | |
| } { | |
| const messages = [...input.messages]; | |
| appendResolvedBatchTranscript(messages, input.batch, []); | |
| // An ambiguous answer (invalid `optionId`, text-only, or missing option) | |
| // resolves the batch without a continuation grant. The violation still | |
| // holds, so the harness re-prompts on the next step rather than crashing. | |
| const limitContinuation = resolveSessionLimitContinuation({ | |
| requests: input.batch.requests, | |
| responses: input.responses, | |
| }); |
reduceSessionLimitRequestVerdict throws a TypeError (crashing the harness step) when a client answers a session-limit continuation prompt with an ambiguous response (invalid optionId, text-only, or missing optionId), a regression from the HITL interpreter refactor.
Summary
Related to #1224. Approval, Question, Limit, and internal Authorization currently persist and interpret the same park/resume lifecycle through separate state machines. This replaces them with one versioned Request ledger and interpreter, then represents the framework approval gate as a Group owner rather than another durable waiting state.
Requests and Groups now retain terminal identity for stale-versus-invalid classification, migrate legacy pending state on first mutation, and use conditional ledger writes. Approval response attempts keep their existing two-phase policy and Authorization flow. AI SDK approval parts, public approval policies, request IDs, events, and transcript behavior are preserved.
Review the ledger migration and conditional-write boundary first, then the approval-attempt migration. Workflow-backed tool bodies and public
ctx.request/ctx.authremain out of scope.Validation
The focused ledger, Authorization, approval-response, lifecycle, input-request, and full tool-loop unit suites passed: 291 tests for the approval-interpreter migration and 268 tests for framework-gate ownership. Package typechecking and formatting passed. The two approval integration files could not start in the isolated worktree because its generated workflow-bundle prerequisite was absent; CI runs them after the normal build.
Checklist
CONTRIBUTING.mdevepackagegit commit --signoff)Diff size
Docs — 1 file ·
+5 / -0One release-note changeset covers the complete runtime migration.
Implementation — 9 files ·
+748 / -478The new ledger and interpreter account for most additions. Existing pending-input and stale-response routers shrink to adapters, while approval coordination moves under the interpreter namespace.
Tests — 5 files ·
+390 / -12Adds ledger migration and cross-kind conformance coverage, moves approval tests with their implementation, and updates one tool-loop assertion to use the supported pending-input projection.