From 3390136aa61895c3afc20fab7a03d1ac1c0ccc3d Mon Sep 17 00:00:00 2001 From: Alex Lavaee Date: Sun, 25 Oct 2026 11:20:56 -0700 Subject: [PATCH] Upgrade Atomic to the stable 0.9.44 release The harness catalog now pins @bastani/atomic 0.9.44, and the lockfile resolves @bastani/atomic, @bastani/atomic-natives with its eight platform packages, and @bastani/pi-ai at 0.9.44, with no older @bastani package left. Atomic's @earendil-works pi packages stay at 1.4.0; undici moves to 8.12.3 with it. The breaking change in @bastani/pi-ai, appendGrammarToolInputJsonDelta() no longer closing the input, does not reach Chopin: nothing here calls it, and the toolcall_delta events the adapter forwards still carry only the new text. Nothing else the adapter calls changed shape, so it needs no code change. Two changes do affect a Chopin server, and the guides now say so. A workflow now runs up to 1000 stages at once (3 before), nests at most three levels (4 before), and a stage's subagent tool runs up to 1000 children (3 and 4 before), all in the server process without a pool. A Planner workflow under a maxDepth of 1 in the agent directory's extensions/workflow/config.json failed with "maxDepth exceeded", so Planner sessions read that file, and the self-hosting guide names it and the subagent file for throttling. Intercom messages the Planner sends a busy stage now arrive after its tool calls instead of cancelling them, unless sent as an interrupt; the hosted agent guide says so. Worker pools now run under a coordinator process. A real Planner workflow with an operator-enabled pool ran its two children in separate worker processes, kept the pool's tables in Chopin's journal and no default journal, and finished; with a child that crashes it kept the failed workers' logs beside that journal, inside the 0700 directory, and the run card ended failed. Messages a busy Planner session receives over Intercom are still refused, and one queued on an idle session still starts a turn the adapter stops, so nothing changes there. Assistant-model: Claude Opus 5.5 (fast) Assistant-workflow: inline (fast subagents) Assistant-verification: bun test (6734 pass, 22 skip, 0 fail), bun run types, bun run ci Assistant-verification: real Planner workflow with a local worker pool finished on worker processes, journaled where Chopin chose; a crashing child failed the run and kept its worker logs there Assistant-verification: a workflow maxDepth set in the agent directory's workflow config limited a Planner's workflow Assistant-verification: docker build of the server image; container started healthy with HARNESS=atomic and imports Atomic 0.9.44 Assistant-verification: targeted bun run e2e (35 passed) User-preference: Keep Atomic and its transitive packages on the same release everywhere Co-authored-by: Alex Lavaee --- bun.lock | 26 +++++++++++++------------- docs/hosted-agent.md | 4 +++- docs/self-hosting.md | 19 ++++++++++++++++--- package.json | 2 +- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/bun.lock b/bun.lock index ddab69ea1..0874eae83 100644 --- a/bun.lock +++ b/bun.lock @@ -315,7 +315,7 @@ "@ai-sdk/harness": "1.0.146", "@ai-sdk/mcp": "2.0.72", "@ai-sdk/sandbox-just-bash": "1.0.146", - "@bastani/atomic": "0.9.43", + "@bastani/atomic": "0.9.44", "ai": "7.0.135", "typebox": "1.3.7", "zod": "4.4.3", @@ -456,27 +456,27 @@ "@base-ui/utils": ["@base-ui/utils@0.3.2", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@floating-ui/utils": "^0.2.12", "reselect": "^5.2.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ=="], - "@bastani/atomic": ["@bastani/atomic@0.9.43", "", { "dependencies": { "@bastani/atomic-natives": "0.9.43", "@bastani/pi-ai": "0.9.43", "@earendil-works/pi-agent-core": "1.4.0", "@earendil-works/pi-codemode": "1.4.0", "@earendil-works/pi-tui": "1.4.0", "@modelcontextprotocol/ext-apps": "^1.7.5", "@modelcontextprotocol/sdk": "1.32.1", "@mozilla/readability": "^0.6.0", "@silvia-odwyer/photon-node": "0.3.4", "@typesafe-ai/sdk": "0.7.0", "brace-expansion": "5.0.12", "chalk": "6.0.0", "cross-spawn": "7.0.6", "diff": "8.0.4", "glob": "13.0.6", "grok-mermaid": "0.2.3", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.8", "jiti": "2.7.0", "linkedom": "^0.18.13", "lru-cache": "11.5.3", "markit-ai": "0.5.3", "minimatch": "10.2.6", "open": "^11.0.1", "p-limit": "^7.3.2", "proper-lockfile": "4.1.2", "quickjs-wasi": "3.6.2", "semver": "7.8.5", "turndown": "^7.2.0", "typebox": "1.3.27", "undici": "8.10.2", "unpdf": "1.8.1", "yaml": "2.9.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalDependencies": { "@mariozechner/clipboard": "0.3.9" }, "bin": { "atomic": "dist/cli.js" } }, "sha512-3vxPdLY2RtFw52sdjVJK/nOQ8tMBJJezLwXbwuW0Fiba/zO+hlv9OqVmco+UK+lITdr4WUP1pNhbVdOHiDCGcQ=="], + "@bastani/atomic": ["@bastani/atomic@0.9.44", "", { "dependencies": { "@bastani/atomic-natives": "0.9.44", "@bastani/pi-ai": "0.9.44", "@earendil-works/pi-agent-core": "1.4.0", "@earendil-works/pi-codemode": "1.4.0", "@earendil-works/pi-tui": "1.4.0", "@modelcontextprotocol/ext-apps": "^1.7.5", "@modelcontextprotocol/sdk": "1.32.1", "@mozilla/readability": "^0.6.0", "@silvia-odwyer/photon-node": "0.3.4", "@typesafe-ai/sdk": "0.7.0", "brace-expansion": "5.0.12", "chalk": "6.0.0", "cross-spawn": "7.0.6", "diff": "8.0.4", "glob": "13.0.6", "grok-mermaid": "0.2.3", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.8", "jiti": "2.7.0", "linkedom": "^0.18.13", "lru-cache": "11.5.3", "markit-ai": "0.5.3", "minimatch": "10.2.6", "open": "^11.0.1", "p-limit": "^7.3.2", "proper-lockfile": "4.1.2", "quickjs-wasi": "3.6.2", "semver": "7.8.5", "turndown": "^7.2.0", "typebox": "1.3.27", "undici": "8.12.3", "unpdf": "1.8.1", "yaml": "2.9.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalDependencies": { "@mariozechner/clipboard": "0.3.9" }, "bin": { "atomic": "dist/cli.js" } }, "sha512-+djpJFpwapmahpi0azu0P3upWx1Ho1ZvxRw05vqQCqhZGtp2mHu+ADYjkUweAzKUsG8NCtCIg6WFt+V6lcqG6g=="], - "@bastani/atomic-natives": ["@bastani/atomic-natives@0.9.43", "", { "optionalDependencies": { "@bastani/atomic-natives-darwin-arm64": "0.9.43", "@bastani/atomic-natives-darwin-x64": "0.9.43", "@bastani/atomic-natives-linux-arm64-gnu": "0.9.43", "@bastani/atomic-natives-linux-arm64-musl": "0.9.43", "@bastani/atomic-natives-linux-x64-gnu": "0.9.43", "@bastani/atomic-natives-linux-x64-musl": "0.9.43", "@bastani/atomic-natives-win32-arm64-msvc": "0.9.43", "@bastani/atomic-natives-win32-x64-msvc": "0.9.43" } }, "sha512-Z2kaOXqIV6Hzt8TPIiYulqXYjwSXsdD4WVyyD9AlsxOQYh0ZAVxcn2sofI2Lrbjv+ZVAoNcGnXRG+9mYXIvpFA=="], + "@bastani/atomic-natives": ["@bastani/atomic-natives@0.9.44", "", { "optionalDependencies": { "@bastani/atomic-natives-darwin-arm64": "0.9.44", "@bastani/atomic-natives-darwin-x64": "0.9.44", "@bastani/atomic-natives-linux-arm64-gnu": "0.9.44", "@bastani/atomic-natives-linux-arm64-musl": "0.9.44", "@bastani/atomic-natives-linux-x64-gnu": "0.9.44", "@bastani/atomic-natives-linux-x64-musl": "0.9.44", "@bastani/atomic-natives-win32-arm64-msvc": "0.9.44", "@bastani/atomic-natives-win32-x64-msvc": "0.9.44" } }, "sha512-SAsOiJt1jdh5DtVa7mkyyhVWqWzWyWzhQU+RLzDX9xKz5jg8bMj7jCuVJcdQerRO7XR+uyB5B6ZnR0b2XveFRQ=="], - "@bastani/atomic-natives-darwin-arm64": ["@bastani/atomic-natives-darwin-arm64@0.9.43", "", { "os": "darwin", "cpu": "arm64" }, "sha512-L6IdGXu9byEYt5qDJo95DXhvdd8yreSHC0FcorNWQQHTDcJ0KQJp4vQv4wF2lEjXhyIUuQ6jbk2Akfy60XGjxA=="], + "@bastani/atomic-natives-darwin-arm64": ["@bastani/atomic-natives-darwin-arm64@0.9.44", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JOeo8W0wB7EH/Kt5wJK+07gBwIMnnnJ8XhS6NVH0QylSkEMQjDKY3N3z+1QZaqzeArr4Uu/aM8bykDOFCd4BXw=="], - "@bastani/atomic-natives-darwin-x64": ["@bastani/atomic-natives-darwin-x64@0.9.43", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZPaZKQDIqN1mS8+UQWwoujZcHngMW00ZBtnZSmovtI4uHjlt7Uq6bLT4oDpV9w/j3C8m7eyuwqWc+hc2QLPzFQ=="], + "@bastani/atomic-natives-darwin-x64": ["@bastani/atomic-natives-darwin-x64@0.9.44", "", { "os": "darwin", "cpu": "x64" }, "sha512-CnZxuPzMYfNMWApzY8GHfhlY17lRVcNBkUEh2Ymf70xIZgxv6XE5LAfF1P2ibIn+SuFtpZnjv2UXZADo25+qoQ=="], - "@bastani/atomic-natives-linux-arm64-gnu": ["@bastani/atomic-natives-linux-arm64-gnu@0.9.43", "", { "os": "linux", "cpu": "arm64", "libc": "glibc" }, "sha512-NlzeDTd1xfMnaUK4k7r3sVJnk6tUwQFXM+2bn9TMT/y9PmCwf/zdwhELeYmq1Dw3lTmCLDVCEvO+VLC19A6a5g=="], + "@bastani/atomic-natives-linux-arm64-gnu": ["@bastani/atomic-natives-linux-arm64-gnu@0.9.44", "", { "os": "linux", "cpu": "arm64", "libc": "glibc" }, "sha512-DLiruji4I/ZgNpDVyrGf8lsauaOLahFZezBFCqh/JpWPt+lyGl7U/S+QCBYziXeXk/86uEdYWJ8uBr6xWjJa0g=="], - "@bastani/atomic-natives-linux-arm64-musl": ["@bastani/atomic-natives-linux-arm64-musl@0.9.43", "", { "os": "linux", "cpu": "arm64", "libc": "musl" }, "sha512-KB5CxYvCTo3xpEk+1jVL4E1BfpqEy8SoUB929KkYw5BW/6a58iuBwSPVh7G8l4rttflQGS38SSBEB5zR9NyYLg=="], + "@bastani/atomic-natives-linux-arm64-musl": ["@bastani/atomic-natives-linux-arm64-musl@0.9.44", "", { "os": "linux", "cpu": "arm64", "libc": "musl" }, "sha512-+UYmuRO7+Rf/vc8wvdjXxy9uu2MEYno+5q38nU8PC7e56PTGFucPQVY45zPNBiBI+2DkTdsGz9+5Iw+8kRGY5g=="], - "@bastani/atomic-natives-linux-x64-gnu": ["@bastani/atomic-natives-linux-x64-gnu@0.9.43", "", { "os": "linux", "cpu": "x64", "libc": "glibc" }, "sha512-axRBq+r8nbh/aUHWpxs5vY1Y5CWAmM3Dbvc2irQzvIwJwlh3kJJ2YGtyqRlOJ865Kug/3kyebASoGnPfgA5mtw=="], + "@bastani/atomic-natives-linux-x64-gnu": ["@bastani/atomic-natives-linux-x64-gnu@0.9.44", "", { "os": "linux", "cpu": "x64", "libc": "glibc" }, "sha512-+tKW1fiqP3ORV2FAYvuo5KGY8B+j0hCjZ/uCvbwdvP40osxZ8F+wyrdUaaKL5L5ePo7GBoFoWQnSZfCVzJQd0A=="], - "@bastani/atomic-natives-linux-x64-musl": ["@bastani/atomic-natives-linux-x64-musl@0.9.43", "", { "os": "linux", "cpu": "x64", "libc": "musl" }, "sha512-OhI/WtyJQ7A1LKMhzkpZZDPvnRACJ83pt3t/TrPBxyNNpjJi8nkZssC26WxCUJUQfAHkMfeXJoHrS2+WveIqNw=="], + "@bastani/atomic-natives-linux-x64-musl": ["@bastani/atomic-natives-linux-x64-musl@0.9.44", "", { "os": "linux", "cpu": "x64", "libc": "musl" }, "sha512-FW7jvmV3MPMa8QqXFhX/XeDAmX/Gak7N+OH/RFgqLATWT4mfnIwxkVSplFpdvyzDZtRmnpqx10Fh2p2suwDenA=="], - "@bastani/atomic-natives-win32-arm64-msvc": ["@bastani/atomic-natives-win32-arm64-msvc@0.9.43", "", { "os": "win32", "cpu": "arm64" }, "sha512-xVp0zj+aGvpS5N3Uvx4ik8woYo3wOotMK3epeW+sr+6LsySglB+ndxxMs5kCcnfBIu5jYcwU134Ja+KDaYwIkA=="], + "@bastani/atomic-natives-win32-arm64-msvc": ["@bastani/atomic-natives-win32-arm64-msvc@0.9.44", "", { "os": "win32", "cpu": "arm64" }, "sha512-nfX6hVxQFbyoPZK0n3YcHZOBXFzEK/RdPLJTmGiHOkBIyB6wGqgX1FvXHyAATkn/K8FKp5VVoDlvIRrcfWoffA=="], - "@bastani/atomic-natives-win32-x64-msvc": ["@bastani/atomic-natives-win32-x64-msvc@0.9.43", "", { "os": "win32", "cpu": "x64" }, "sha512-9pld9tA/dB8IfBe4vWoGMfX2tHWTaVpH5uhoMrzhGB71+3vvYWaWYtyqJ+xeMiQg6gueT3N0ihHpSpo8QPl/9A=="], + "@bastani/atomic-natives-win32-x64-msvc": ["@bastani/atomic-natives-win32-x64-msvc@0.9.44", "", { "os": "win32", "cpu": "x64" }, "sha512-F3w02hmhwWDxaOr/jYWBzsUMjTEdEA9gjhsM3g2Hn+Nr0wYyrzrzBbA+TIGtV1KaK0COrs0OYEQTQLMU7zAbQw=="], - "@bastani/pi-ai": ["@bastani/pi-ai@0.9.43", "", { "dependencies": { "@anthropic-ai/sdk": "0.129.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "1.4.0", "@google/genai": "2.21.0", "@smithy/node-http-handler": "4.12.1", "http-proxy-agent": "9.1.0", "https-proxy-agent": "9.1.0", "openai": "7.19.0", "partial-json": "0.1.7", "typebox": "1.3.27" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-KO+sc350H9Xv9G1LhMr57yuqu/N02s9ch/8KNe0L4VM/iShcuCWOd4bWkP956cVGDJYpd4/INylONAi3RHjLhg=="], + "@bastani/pi-ai": ["@bastani/pi-ai@0.9.44", "", { "dependencies": { "@anthropic-ai/sdk": "0.129.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "1.4.0", "@google/genai": "2.21.0", "@smithy/node-http-handler": "4.12.1", "http-proxy-agent": "9.1.0", "https-proxy-agent": "9.1.0", "openai": "7.19.0", "partial-json": "0.1.7", "typebox": "1.3.27" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-ZokOT6jdtax/lI9sIrsJO/Cf1XucR5Q0Yg5Of2wg7YHzA4GuB9WM/GI1y7yaNC+n9p6I1E79Oa4+sUGr2qTMEg=="], "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], @@ -2310,7 +2310,7 @@ "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], - "undici": ["undici@8.10.2", "", {}, "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ=="], + "undici": ["undici@8.12.3", "", {}, "sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw=="], "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], diff --git a/docs/hosted-agent.md b/docs/hosted-agent.md index fddb3a594..ab51acace 100644 --- a/docs/hosted-agent.md +++ b/docs/hosted-agent.md @@ -628,7 +628,9 @@ launched it, and its runs belong to that session, so Chopin keeps the session and its owner binding, and keeps the document loaded, until every run has finished. The next turn reuses that session, so the Planner can still see and steer its runs over Intercom; people steer through Chat and Decisions, never a -stage directly. **Stop Planner** also pauses the session's live runs, resumably, +stage directly. Since Atomic 0.9.44 such a message reaches a busy stage after +its current tool calls finish rather than cancelling them, unless the Planner +sends it as an `interrupt`. **Stop Planner** also pauses the session's live runs, resumably, through Atomic's session run control, and **Resume Planner** resumes the runs it paused. A run waiting on a question pauses too: Atomic withdraws the question from Decisions while the run is paused and presents it again on Resume, and an diff --git a/docs/self-hosting.md b/docs/self-hosting.md index d5b8a1b0f..2799e843b 100644 --- a/docs/self-hosting.md +++ b/docs/self-hosting.md @@ -75,7 +75,7 @@ each owner's GitHub App user token and does not consume `HARNESS_AUTH`; setting `auto` on loopback passes the startup guard but does not enable host login in that adapter. -`HARNESS=atomic` runs Atomic 0.9.43 in the Chopin server process through its +`HARNESS=atomic` runs Atomic 0.9.44 in the Chopin server process through its headless SDK (`createAgentSession()`). It does not spawn the `atomic` CLI or use RPC mode. @@ -166,8 +166,11 @@ Atomic caveats: sets `XDG_STATE_HOME=/var/lib/chopin`; mount a volume there to keep runs and those directories when the container is replaced. - Local workflow worker pools stay off unless the operator's Atomic settings - set `workflows.localWorkers`. With a pool, Atomic 0.9.43 keeps each worker's - standard error in `worker-logs/` beside the journal, so under + set `workflows.localWorkers`. Since Atomic 0.9.44 a pool runs as one + coordinator process per root run, started by the Chopin server process, with + the worker processes under it; it uses the same journal, and if the server + exits, the coordinator and its workers exit with it. Atomic keeps each + worker's standard error in `worker-logs/` beside the journal, so under `$XDG_STATE_HOME/chopin/atomic/worker-logs//`, inside the directory Chopin creates for the journal with access for the server's user only. It deletes a log when its worker shuts down normally but keeps the logs of @@ -176,6 +179,16 @@ Atomic caveats: its card in Chat says so. The settings `workflows.localWorkers.startupTimeoutMs` and `leaseMs` set how long a worker may take to start and how long an unresponsive one keeps its child. +- Since Atomic 0.9.44 a workflow runs up to 1000 of its stages at once unless + it says otherwise (`defaultConcurrency`, 3 before), nests child workflows at + most three levels deep (`maxDepth`, 4 before), and a stage's `subagent` tool + runs up to 1000 children at once (`parallel.concurrency` and + `parallel.runningCapacity`, 3 and 4 before). Without a pool, all of them run + in the Chopin server process and share its memory and the provider rate + limit above. To throttle a server, lower `defaultConcurrency` in + `extensions/workflow/config.json` and the `parallel` limits in + `extensions/subagent/config.json` under the Atomic agent directory, which + Planner sessions read; Chopin sets none of these itself. - Atomic depends on `typebox` 1.3.27 while Chopin pins 1.3.7. Host tool schemas pass to Atomic as plain JSON Schema, so the two versions never meet. diff --git a/package.json b/package.json index 4e19f7aa1..53fb94d69 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@ai-sdk/harness": "1.0.146", "@ai-sdk/mcp": "2.0.72", "@ai-sdk/sandbox-just-bash": "1.0.146", - "@bastani/atomic": "0.9.43", + "@bastani/atomic": "0.9.44", "ai": "7.0.135", "typebox": "1.3.7", "zod": "4.4.3"