Skip to content

feat(dev): drained transactional dev server on the stock Nitro contract#787

Merged
ctgowrie merged 4 commits into
mainfrom
feat/dev2-rebuilds
Jul 15, 2026
Merged

feat(dev): drained transactional dev server on the stock Nitro contract#787
ctgowrie merged 4 commits into
mainfrom
feat/dev2-rebuilds

Conversation

@ctgowrie

@ctgowrie ctgowrie commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

First PR of the stock-Nitro dev-server stack (followed by #790#792#798), based on main.

What

Rebuilds the dev server on stock Nitro's stable-parent/disposable-worker architecture, with two guarantees beyond the stock runner manager:

  • Drained worker replacement. The parent tracks admitted responses and upgraded sockets per worker. A retired worker terminates only after its last exchange settles, preventing the ECONNRESET class of structural-reload failures. Crashed workers restart, shutdown has a bounded deadline, and a failed upgrade destroys only its socket.
  • Transactional authored rebuilds. A candidate is compiled, bundled, and readiness-gated while the previous worker keeps serving. Commit is worker-first, generation-pointer-second. Failures before the swap preserve the old worker and generation; activation failures after the swap keep the live generation-neutral host and retry activation on the next rebuild. Runtime-only edits publish a generation without replacing the worker.

The dev schedule route now resolves the committed runtime generation instead of the removed legacy <app>/.eve/compile location. Schedule lookup and task execution share that one resolved artifact source, so a concurrent rebuild cannot split a dispatch across generations.

Build-publication lock transitions also retain atomic rename semantics while retrying bounded Windows EPERM/EACCES/EBUSY contention.

Tests

  • Drain and rebuild scenario coverage for readiness failure, worker crashes, open streams and sockets, failed upgrades, activation failure, environment rollback, and bounded shutdown.
  • Focused unit coverage proving schedule lookup and execution use the same active generation.
  • The agent-schedules local E2E fixture exercises the dev route through a real rebuild; both configured model jobs pass on this branch.
  • Unit, integration, typecheck, lint, docs, and invariant checks.

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview, Comment Jul 15, 2026 12:05am
eve-docs-1644 Ready Ready Preview, Comment, Open in v0 Jul 15, 2026 12:05am
eve-docs-4759 Ready Ready Preview, Comment, Open in v0 Jul 15, 2026 12:05am

Request Review

Comment thread packages/eve/src/internal/nitro/host/dev-authored-rebuild-coordinator.ts Outdated
@ctgowrie ctgowrie force-pushed the feat/dev2-rebuilds branch from a69e44e to ad41594 Compare July 14, 2026 18:47
@ctgowrie ctgowrie force-pushed the feat/dev2-rebuilds branch from ad41594 to 2eec894 Compare July 14, 2026 18:49
@vercel vercel Bot temporarily deployed to Preview – eve-docs-4759 July 14, 2026 18:49 Inactive
@vercel vercel Bot temporarily deployed to Preview – eve-docs-1644 July 14, 2026 18:49 Inactive
@ctgowrie ctgowrie force-pushed the feat/dev2-rebuilds branch from 2eec894 to 98c9d48 Compare July 14, 2026 19:15
@ctgowrie ctgowrie changed the title feat(dev): make authored dev rebuilds transactional on the drained server feat(dev): drained transactional dev server on the stock Nitro contract Jul 14, 2026
@ctgowrie ctgowrie changed the base branch from feat/dev2-drain to main July 14, 2026 19:15
@vercel vercel Bot temporarily deployed to Preview – eve-docs-1644 July 14, 2026 19:15 Inactive
@vercel vercel Bot temporarily deployed to Preview – eve-docs-4759 July 14, 2026 19:15 Inactive
@ctgowrie ctgowrie force-pushed the feat/dev2-rebuilds branch from 98c9d48 to 51ba184 Compare July 14, 2026 19:19
@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

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

Key takeaways

  • No notable deltas vs main (58dd402).

Delta vs main (58dd402)

Area Metric Baseline Current Delta
Package Packed tarball 3.65 MB 3.69 MB +38.7 kB ⚠️
Package Unpacked publish size 13.26 MB 13.38 MB +118.5 kB ⚠️
Package Installed footprint 52.52 MB 52.64 MB +118.5 kB ⚠️
Package Published files 2563 2588 +25
Package Installed files 5803 5828 +25
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 9.35 MB 9.37 MB +12.5 kB ⚠️
Runtime Public routes 9 9 0
Changed function payloads vs main (58dd402) (2)
Function Status Baseline Current Delta Route changes
functions/.well-known/workflow/v1/flow.func changed 5.87 MB 5.88 MB +6.3 kB ⚠️ none
functions/__server.func changed 3.48 MB 3.49 MB +6.3 kB ⚠️ none

eve init install

Metric Baseline Current Delta
Installed footprint 90.79 MB 90.90 MB +118.5 kB ⚠️
Installed packages 122 122 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 27.46 MB 27.58 MB +118.5 kB ⚠️
devDependency package bytes 5.04 MB 5.04 MB 0 B ➖
Build Metadata
  • Preset: vercel
  • Nitro: [email protected]
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-07-15T00:06:04.728Z
  • Route aliases: 9 public, 1 internal (10 total aliases)
  • Vercel routes in config: 10
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: [email protected]
  • Package directory: packages/eve
  • Tarball: 3.69 MB (eve-0.24.2.tgz)
  • Unpacked payload: 13.38 MB across 2588 published files
  • Installed footprint: 52.64 MB across 5828 installed files
  • Installed root package: 12.10 MB
  • Installed dependencies: 40.54 MB
  • Runtime dependencies: 1
  • Peer dependencies: 5 (4 optional)

Installed footprint is measured from an isolated temporary npm install of the packed tarball.

Heavy installed dependencies

  • @rolldown/binding-linux-x64-gnu: 19.13 MB (36.3%)
  • eve: 12.10 MB (23.0%)
  • ai: 6.39 MB (12.1%)
  • zod: 5.04 MB (9.6%)
  • nitro: 2.41 MB (4.6%)
Publish payload breakdown
Published file size
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [####....................] 1.51 MB 11.3%
🟡 dist/src/compiled/@vercel/sandbox/index.js       [#.......................] 622.2 kB 4.7%
🟡 dist/src/compiled/_chunks/workflow/undici-fb5... [#.......................] 502.4 kB 3.8%
🟡 dist/src/compiled/@chat-adapter/slack/index.js   [#.......................] 433.8 kB 3.2%
🟡 dist/src/compiled/_chunks/workflow/dist-Blxny... [#.......................] 277.7 kB 2.1%
🔴 Other published files                            [########################] 10.04 MB 75.0%
Installed footprint breakdown
Installed package size
🔴 @rolldown/binding-linux-x64-gnu [########################] 19.13 MB 36.3%
🔴 eve                             [###############.........] 12.10 MB 23.0%
🔴 ai                              [########................] 6.39 MB 12.1%
🔴 zod                             [######..................] 5.04 MB 9.6%
🟠 nitro                           [###.....................] 2.41 MB 4.6%
🟡 @ai-sdk/provider-utils          [#.......................] 847.4 kB 1.6%
🔴 Other installed packages        [########................] 6.73 MB 12.8%
Runtime dependencies (1)
Package Range Notes
nitro 3.0.260610-beta
Peer dependencies (5)
Package Range Notes
@opentelemetry/api ^1.0.0 optional peer
ai catalog:
braintrust ^3.0.0 optional peer
just-bash ^3.0.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: 90.90 MB across 7646 installed files
  • Installed packages: 122 total (116 transitive-only)
  • dependencies: 4 direct packages totaling 27.58 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 58.28 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 (30.7%)
  • @rolldown/binding-linux-x64-gnu: 19.13 MB (21.0%)
  • eve: 12.10 MB (13.3%)
  • zod: 9.00 MB (9.9%)
  • ai: 6.39 MB (7.0%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 27.95 MB 30.7%
🔴 @rolldown/binding-linux-x64-gnu  [################........] 19.13 MB 21.0%
🔴 eve                              [##########..............] 12.10 MB 13.3%
🔴 zod                              [########................] 9.00 MB 9.9%
🔴 ai                               [#####...................] 6.39 MB 7.0%
🟠 @types/node                      [##......................] 2.54 MB 2.8%
🔴 Other installed packages         [############............] 13.80 MB 15.2%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.2.2 98.6 kB 0.1%
ai ^7.0.26 6.39 MB 7.0%
eve file:eve-0.24.2.tgz 12.10 MB 13.3%
zod 4.4.3 9.00 MB 9.9%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.8%
typescript 7.0.2 2.50 MB 2.7%
Function Drill-Down

Payload Size Graph

Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func     [########################] 5.88 MB 62.7%
🟠 functions/__server.func                         [##############..........] 3.49 MB 37.3%

Top Function Payloads

🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 5.88 MB
Metric Value
Public routes /.well-known/workflow/v1/flow
Runtime nodejs24.x
Handler index.mjs
Payload 5.88 MB
Function files 5.88 MB across 36 files
Traced dependencies 0 B
Signal 🟠 Bundled file __eve_nitro_handler__.mjs is 2.18 MB (37.1%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 __eve_nitro_handler__.mjs       [########################] 2.18 MB 37.1%
🟡 _chunks/world-vercel.mjs        [#########...............] 826.4 kB 14.1%
🟡 _chunks/sandbox.mjs             [########................] 754.9 kB 12.8%
🟡 _libs/@ai-sdk/gateway+[...].mjs [#####...................] 430.4 kB 7.3%
🟡 _chunks/dist-Blxnyb7-.mjs       [####....................] 349.1 kB 5.9%
🟠 Other bundled files             [###############.........] 1.33 MB 22.7%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "environment": {
    "NODE_OPTIONS": "--experimental-require-module"
  },
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ]
}

🟠 functions/__server.func • 8 public routes, 1 internal alias • 3.49 MB
Metric Value
Public routes /
/eve/v1/callback/[token]
/eve/v1/connections/[name]/callback/[token]
/eve/v1/health
/eve/v1/info
/eve/v1/session
/eve/v1/session/[sessionId]
/eve/v1/session/[sessionId]/stream
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 3.49 MB
Function files 3.49 MB across 26 files
Traced dependencies 0 B
Signal 🟠 Bundled file _chunks/runtime-artifacts.mjs is 942.0 kB (27.0%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 _chunks/runtime-artifacts.mjs [########################] 942.0 kB 27.0%
🟠 _chunks/world-vercel.mjs      [#####################...] 826.4 kB 23.7%
🟠 _chunks/sandbox.mjs           [###################.....] 754.9 kB 21.6%
🟡 _chunks/dist-Blxnyb7-.mjs     [#########...............] 348.1 kB 10.0%
⚪ _libs/zod.mjs                 [###.....................] 114.2 kB 3.3%
🟡 Other bundled files           [#############...........] 503.0 kB 14.4%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x"
}

@ctgowrie ctgowrie marked this pull request as ready for review July 14, 2026 19:31
ctgowrie and others added 2 commits July 14, 2026 18:33
Rebuild the dev server on the stock Nitro dev-server architecture with two
guarantees the stock RunnerManager lacks:

- Drained worker replacement: the parent listener tracks in-flight
  exchanges (responses and upgraded sockets) per worker and terminates a
  retired worker only after its last exchange settles, so structural
  reloads never reset admitted work. Crashed workers restart with their
  own workspace; shutdown completes within a bounded deadline.

- Transactional authored rebuilds: a candidate is compiled, bundled, and
  readiness-checked while the previous worker keeps serving; the swap is
  worker-first, then generation-pointer activation, so any failure before
  the swap leaves the previous worker and generation untouched, and hosts
  are generation-neutral in the instant between the two steps. Runtime-only
  edits publish a generation without touching the worker. Environment files
  stage with each attempt and roll back on failure.

Co-Authored-By: Claude Fable 5 <[email protected]>
Signed-off-by: Casey Gowrie <[email protected]>
- A crash restart now yields to a replacement that was already in flight
  instead of swapping retired code back in over the newer worker, and the
  crashed workspace is disposed when the restart loses or the server is
  closing.
- The client abort signal rides the proxied worker request, so a client
  that disconnects before response headers arrive releases its exchange
  instead of pinning the worker until the handler returns.
- close() terminates a candidate still waiting on readiness and awaits the
  replace chain, bounding shutdown during a structural rebuild.
- A worker response that fails after headers were sent destroys the client
  connection instead of framing the truncated body as a complete response.
- A candidate that fails readiness disposes its workspace instead of
  leaking it.
- Pointer publication retries transient Windows rename failures
  (EPERM/EBUSY/EACCES) before surfacing an activation failure.

Co-Authored-By: Claude Fable 5 <[email protected]>
Signed-off-by: Casey Gowrie <[email protected]>
@ctgowrie ctgowrie merged commit 0333a63 into main Jul 15, 2026
138 of 140 checks passed
@ctgowrie ctgowrie deleted the feat/dev2-rebuilds branch July 15, 2026 00:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants