Skip to content

refactor(eve): unify durable HITL request lifecycle - #2822

Draft
ruiconti wants to merge 12 commits into
mainfrom
rui/hitl-framework-gate-owner
Draft

refactor(eve): unify durable HITL request lifecycle#2822
ruiconti wants to merge 12 commits into
mainfrom
rui/hitl-framework-gate-owner

Conversation

@ruiconti

@ruiconti ruiconti commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

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.auth remain 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

  • This change was requested or approved by a maintainer
  • I ran the relevant checks from CONTRIBUTING.md
  • I added tests and documentation where relevant
  • I added a changeset if this touches the published eve package
  • DCO sign-off passes for every commit (git commit --signoff)

Diff size

Docs — 1 file · +5 / -0

One release-note changeset covers the complete runtime migration.

Implementation — 9 files · +748 / -478

The 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 / -12

Adds 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.

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>
@vercel

vercel Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
eve-docs Ready Ready Preview Sep 1, 2026 1:40pm UTC
eve-docs-4759 Ready Ready Preview, v0 Sep 1, 2026 1:40pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
eve-pkg Skipped Skipped Sep 1, 2026 1:40pm UTC
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

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

Key takeaways

  • No notable deltas vs rui/hitl-authorization-interpreter (de7c03d).

Delta vs rui/hitl-authorization-interpreter (de7c03d)

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>
@ruiconti

ruiconti commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

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>
Comment on lines +40 to +50
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.");
}

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.

Suggested change
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.

Fix on Vercel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant