diff --git a/apps/server/src/harness/atomic/full.test.ts b/apps/server/src/harness/atomic/full.test.ts index c6e5a45f8..5c9f55f91 100644 --- a/apps/server/src/harness/atomic/full.test.ts +++ b/apps/server/src/harness/atomic/full.test.ts @@ -99,6 +99,7 @@ async function run( projectPackage = false, operatorPackage = false, askingWorkflow = false, + operatorSettings, afterTurn, events, reports, @@ -114,6 +115,8 @@ async function run( operatorPackage?: boolean; /** Load a workflow whose stage calls ask_user_question, through the operator's extension paths. */ askingWorkflow?: boolean; + /** The operator's Atomic `settings.json`, as the host CLI would have written it. */ + operatorSettings?: Record; /** Runs once the Planner's turn has ended, while its session and workflow runs are still live. */ afterTurn?: () => Promise; /** Collects, in order, the tool reports the adapter makes and the stream parts a tool yields. */ @@ -277,6 +280,9 @@ export default workflow({ ); } process.env.ATOMIC_CODING_AGENT_DIR = agentDir; + if (operatorSettings) { + await writeFile(join(agentDir, "settings.json"), JSON.stringify(operatorSettings)); + } let humanInput: HostInput = host ?? { confirm: async () => false, select: async () => undefined, @@ -560,6 +566,27 @@ test( 60_000, ); +test( + "an operator's shared storage selection, even an adapter package, does not move a Planner's workflow journal", + async () => { + let result = await run(true, "launch", { + askingWorkflow: true, + // What `atomic storage join` writes; the adapter package is not installed here. + operatorSettings: { + storage: { + adapter: "@bastani/atomic-storage-libsql", + options: { url: "libsql://chopin-test.invalid" }, + }, + }, + }); + let launched = result.requests.at(-1)!.toolResults.join("\n"); + expect(launched).toContain("asking-workflow"); + expect(launched).not.toContain('"failed"'); + expect(result.files).toMatchObject({ journal: true, defaultJournal: false }); + }, + WORKFLOW_TOOL_TIMEOUT_MS, +); + // Atomic starts a turn for its own notices, and since 0.9.41 for a message queued on an idle session. test.each(["notice", "queued"])( "a turn Atomic starts by itself (%s) between the Planner's turns is stopped before it reaches the model", diff --git a/bun.lock b/bun.lock index f3cc0e991..8d620cdfa 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.41-alpha.1", + "@bastani/atomic": "0.9.42", "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.41-alpha.1", "", { "dependencies": { "@bastani/atomic-natives": "0.9.41-alpha.1", "@bastani/pi-ai": "0.9.41-alpha.1", "@earendil-works/pi-agent-core": "1.3.0", "@earendil-works/pi-codemode": "1.3.0", "@earendil-works/pi-tui": "1.3.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-WxeHXJKCvVlCCeF+Z0vGGIuVFjGrZZU2gZZ9MPWgKJMPG4pdKemJ5wIJCFUk5b8/FRhAlgPAr6vSHQNdRHG8FA=="], + "@bastani/atomic": ["@bastani/atomic@0.9.42", "", { "dependencies": { "@bastani/atomic-natives": "0.9.42", "@bastani/pi-ai": "0.9.42", "@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-oumUw1AdVFvnGRdRFNl2Sv1JBd8feRQE2qLhsZ5ZLSF1NCKtKKlFjvKb71ENCcZ9DKBkSTibNwp99vTQyUCPRA=="], - "@bastani/atomic-natives": ["@bastani/atomic-natives@0.9.41-alpha.1", "", { "optionalDependencies": { "@bastani/atomic-natives-darwin-arm64": "0.9.41-alpha.1", "@bastani/atomic-natives-darwin-x64": "0.9.41-alpha.1", "@bastani/atomic-natives-linux-arm64-gnu": "0.9.41-alpha.1", "@bastani/atomic-natives-linux-arm64-musl": "0.9.41-alpha.1", "@bastani/atomic-natives-linux-x64-gnu": "0.9.41-alpha.1", "@bastani/atomic-natives-linux-x64-musl": "0.9.41-alpha.1", "@bastani/atomic-natives-win32-arm64-msvc": "0.9.41-alpha.1", "@bastani/atomic-natives-win32-x64-msvc": "0.9.41-alpha.1" } }, "sha512-KPJKe5N+LRTmvn4Jgww4GxKuRqutZQ03gCvPwYLDE5fn94A9/zL3DCnmLidSTvtuYH9rYSoP7IA9gp2idj2bSA=="], + "@bastani/atomic-natives": ["@bastani/atomic-natives@0.9.42", "", { "optionalDependencies": { "@bastani/atomic-natives-darwin-arm64": "0.9.42", "@bastani/atomic-natives-darwin-x64": "0.9.42", "@bastani/atomic-natives-linux-arm64-gnu": "0.9.42", "@bastani/atomic-natives-linux-arm64-musl": "0.9.42", "@bastani/atomic-natives-linux-x64-gnu": "0.9.42", "@bastani/atomic-natives-linux-x64-musl": "0.9.42", "@bastani/atomic-natives-win32-arm64-msvc": "0.9.42", "@bastani/atomic-natives-win32-x64-msvc": "0.9.42" } }, "sha512-WZCjkRF8R3BqqaoSalF6sl0HmCJCW0dJd+XahCFWLeUn51nmd8I3F0ew/IiOuXYMNOjW6xtyu+1RI4seAa8Yzg=="], - "@bastani/atomic-natives-darwin-arm64": ["@bastani/atomic-natives-darwin-arm64@0.9.41-alpha.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-1G6jy/BpHL5ax8u/ZhWYJby5bRwo8M3uiWgfcPLchYjmsTA6n/HetuWkDjEwoAYd/2DnEbMcYpTOaS5MWcFJRg=="], + "@bastani/atomic-natives-darwin-arm64": ["@bastani/atomic-natives-darwin-arm64@0.9.42", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kB8p6Cu4C6Cbk5M8htoo0HeSVg7ASs83nvfUlu8j7mR/OVIojIieWhzQnFM/OvAhTrzzkwmFlY1fg7cd9ytSTw=="], - "@bastani/atomic-natives-darwin-x64": ["@bastani/atomic-natives-darwin-x64@0.9.41-alpha.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aPSqjJIeh64+cHu7zYBGbmd1OWjETIk26ZNlPGAMih4u5MEDbzek58LXtR8KE0zEvs1GxS4Z8z4zfdoF/CnWTQ=="], + "@bastani/atomic-natives-darwin-x64": ["@bastani/atomic-natives-darwin-x64@0.9.42", "", { "os": "darwin", "cpu": "x64" }, "sha512-q5n6eq9mYTi/UkOC1KyQ9RLT5FwgCrxWkFBGiYOgAAVogCSe93b8kpPiMd1m+RUFzeDDmbXkp3pRC9JewXqK+g=="], - "@bastani/atomic-natives-linux-arm64-gnu": ["@bastani/atomic-natives-linux-arm64-gnu@0.9.41-alpha.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-lFsmpi8/bqQwxUoylZmSdaVbMC53g8QyTNxuz3ywKyfZ2YPoFmnnRqVbgZepsCzaJ9SA9uusq6fX2CuAjXeu/Q=="], + "@bastani/atomic-natives-linux-arm64-gnu": ["@bastani/atomic-natives-linux-arm64-gnu@0.9.42", "", { "os": "linux", "cpu": "arm64", "libc": "glibc" }, "sha512-MWFfXLBauY9bCOSJG2yDFz/JqCw6SQnCH7j/HpMwVFlH50I0sqycqchp/WPmkgKj1RIDALmJdsiSgk+HoH3iJg=="], - "@bastani/atomic-natives-linux-arm64-musl": ["@bastani/atomic-natives-linux-arm64-musl@0.9.41-alpha.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-dsWDdBv9tbtQKuvMwl/hXvicPtazD35IReiZ/FbAgtkRkuYLyF0g6lI3xhW11di1QVsKZrxg+PXIYx5j6EBbzg=="], + "@bastani/atomic-natives-linux-arm64-musl": ["@bastani/atomic-natives-linux-arm64-musl@0.9.42", "", { "os": "linux", "cpu": "arm64", "libc": "musl" }, "sha512-6R+7YjhRcnhoR00J7+NYiCmzhT5I0zH3LHxnAWIf0Q1aBJ7BmR9eFPFkyrh4kiqUoDtHypz6BtVyoDGWRL5hTA=="], - "@bastani/atomic-natives-linux-x64-gnu": ["@bastani/atomic-natives-linux-x64-gnu@0.9.41-alpha.1", "", { "os": "linux", "cpu": "x64" }, "sha512-zpYpSr5Az5lCO5XQV0raIGLH0toIIKn5XEWTH1rtOWOwcxPKJDPpqP+IMFU8VGH3q6jOfVstMQZhqHnETRsLTg=="], + "@bastani/atomic-natives-linux-x64-gnu": ["@bastani/atomic-natives-linux-x64-gnu@0.9.42", "", { "os": "linux", "cpu": "x64", "libc": "glibc" }, "sha512-3PYdlncGACpv0RCAQND4aoQVgmceItH0kO+4NX9gBGioxV2tyl+lXQBXDrxGrtbwCFnoWo4tHK1VmiNVI00JmA=="], - "@bastani/atomic-natives-linux-x64-musl": ["@bastani/atomic-natives-linux-x64-musl@0.9.41-alpha.1", "", { "os": "linux", "cpu": "x64" }, "sha512-clq4YywgeBsLJMWY+qNy+rhEojelHHus8vt2c1hx2VhBz8xdM3bh8+4nWBAbxrEDj2xTTDR1BS+sWJDwpfvMXw=="], + "@bastani/atomic-natives-linux-x64-musl": ["@bastani/atomic-natives-linux-x64-musl@0.9.42", "", { "os": "linux", "cpu": "x64", "libc": "musl" }, "sha512-0KNKhSaqpYmiltI/Hn/OyRdCPu8j3yH+OoxKJOvdUjC7Yz8JbmBgXAS8iCzxW2j3ImVRafq/TDnZjkC8E0mSNA=="], - "@bastani/atomic-natives-win32-arm64-msvc": ["@bastani/atomic-natives-win32-arm64-msvc@0.9.41-alpha.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-CTzXyqUQtmptXt6BHr33BvjJ1c0yB5sjlh1WupqMIFl5mVgsN8COZYWTG4yD3MGNgsHbVNKkFEfyFe8081KjZw=="], + "@bastani/atomic-natives-win32-arm64-msvc": ["@bastani/atomic-natives-win32-arm64-msvc@0.9.42", "", { "os": "win32", "cpu": "arm64" }, "sha512-GOZ0bpq4nMyiN1Rf1qvTON7SPfXhSNutEX69/V0nXjZyMW+76F7FBltaPGOuTZwNo/IeYDsSdpRDOK/+nZWBAA=="], - "@bastani/atomic-natives-win32-x64-msvc": ["@bastani/atomic-natives-win32-x64-msvc@0.9.41-alpha.1", "", { "os": "win32", "cpu": "x64" }, "sha512-JEG/wkkrb4MUhiOgsFGXesplTTk2rc0XpTCi/yOWwxiQsl64sfrQgB2qWlvcfjh7QMBw4HKcpaoh2oGtY8H7gw=="], + "@bastani/atomic-natives-win32-x64-msvc": ["@bastani/atomic-natives-win32-x64-msvc@0.9.42", "", { "os": "win32", "cpu": "x64" }, "sha512-fLS42PRe/2TOtIie06cDqYWAP9dWBQN6AzyG8vI0BjJCA3OfYHj2MSl7alW/j8KdK9tXD1t9i5FC3COVi895bQ=="], - "@bastani/pi-ai": ["@bastani/pi-ai@0.9.41-alpha.1", "", { "dependencies": { "@anthropic-ai/sdk": "0.129.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "1.3.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-bWL7hqgdDtBZR6od/tItQuWwETe7iZdDb7YAiGZTWPVG5R0MmiD+X7+Aa4qkpkTK3i/pVONgvj6d8azSTcFx7w=="], + "@bastani/pi-ai": ["@bastani/pi-ai@0.9.42", "", { "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-ORPzQhHtEMhcQ4Fc4mMS4vP+Gli2IRAyHoKUnVLg/rKMmDJmdsIZtOOyS55NGyP7qoRD7mPMjEl+4JQjv7a7tA=="], "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], @@ -592,15 +592,15 @@ "@dprint/win32-x64": ["@dprint/win32-x64@0.50.2", "", { "os": "win32", "cpu": "x64" }, "sha512-N3l9k31c3IMfVXqL0L6ygIhJFvCIrfQ+Z5Jph6RnCcBO6oDYWeYhAv/qBk1vLsF2y/e79TKsR1tvaEwnrQ03XA=="], - "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@1.3.0", "", { "dependencies": { "@earendil-works/pi-ai": "1.3.0", "typebox": "1.3.27" } }, "sha512-2jvpxZs47PFD5mSQb/yK0pGHJ5yO7Nu22u9mFjHbSLRgu62vZ9rupimDSIp4arnqOadyv0AWvYHtCSpFoJV7ag=="], + "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@1.4.0", "", { "dependencies": { "@earendil-works/pi-ai": "1.4.0", "typebox": "1.3.27" } }, "sha512-PoKY84SKUwnt7S5QBZaGUqfNO1kjP3KHpHUA9QpFTj4cOjaVWMYIcBPJ6FDRCdE8Zen9OSECQUd0uUfVgtSmgA=="], - "@earendil-works/pi-ai": ["@earendil-works/pi-ai@1.3.0", "", { "dependencies": { "@anthropic-ai/sdk": "0.129.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "1.3.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-KaBI8x7q7sPoFUXICNGD9efHzDG+oRNwVvkA9jdIsSQWH1RjFssOlEGsbLtewUPPgCrvmz0l2KTgSLXTyj3acw=="], + "@earendil-works/pi-ai": ["@earendil-works/pi-ai@1.4.0", "", { "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-hQM/C4+1w8rHYACzDDf+0vQMnEnpzIop1tptIERVgR3ZeT/hHSzBNG8PaWPgxWQjqSeKCyBZSyp8uTT6eKK1pQ=="], - "@earendil-works/pi-codemode": ["@earendil-works/pi-codemode@1.3.0", "", { "dependencies": { "quickjs-wasi": "3.6.2" } }, "sha512-2G9tmbsPhgzwfz7cmzJpbLSLqOx3eu22Gbzm+Wc3HqeZMjLQS4F3KfAabozVhv7uEjq3k2O1dZTHmhhWr2xbfQ=="], + "@earendil-works/pi-codemode": ["@earendil-works/pi-codemode@1.4.0", "", { "dependencies": { "quickjs-wasi": "3.6.2" } }, "sha512-23CNAXpS9DuLzPMyYuvrXVVio46x4YhffCgCqaWmF7F5H8PooqjrQvX4ucF6M0BhUd+x2tV6r1J0dv8cCME4Cg=="], - "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@1.3.0", "", {}, "sha512-ERGZr+aXjNJzoUbB7ZzHVH3g5otzMHjHLs2Fyizm12By5X+gBEhod9cJXFOk13S7M8a29Am+Mq21zm73mRJFLg=="], + "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@1.4.0", "", {}, "sha512-MLIfowwUYIY65jSjMX82paZOrX/NTvLk6D08h+3Jq42a99RzUOewzuCR0zOlPul3D6UBfddat76VT6LvsHEs1w=="], - "@earendil-works/pi-tui": ["@earendil-works/pi-tui@1.3.0", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.11" } }, "sha512-AlKvEwEWyVtnuw7SVb4N/mUhlfIohyFslUNWarZVdLHHSdt3ca5EhMLwTzblBpDpaofSz+f+tAHie6CfxVrWKA=="], + "@earendil-works/pi-tui": ["@earendil-works/pi-tui@1.4.0", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.11", "marked-cjk-friendly": "0.1.2" } }, "sha512-4obPOjgOD7g4mGSlngIvxyujC1UPdmyI9zdVthbr8GufacFEX+Ce0+scPgHg++k2xj5+QjESM2d5TxvIuzCVmg=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], @@ -1848,6 +1848,8 @@ "marked": ["marked@16.4.2", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA=="], + "marked-cjk-friendly": ["marked-cjk-friendly@0.1.2", "", { "peerDependencies": { "marked": ">=15.0.0" } }, "sha512-GUj8HjiEbur9yhgUo52FBgKizggF1QtT6gVdrYdWW6ZB4lVVjgS3EyyXPyfyRD0V4ghGRPlO7MO80rgSWbm0eA=="], + "markit-ai": ["markit-ai@0.5.3", "", { "dependencies": { "chalk": "^5.6.2", "commander": "^14.0.3", "exifr": "^7.1.3", "fast-xml-parser": "^5.5.9", "jszip": "^3.10.1", "mammoth": "^1.9.0", "mupdf": "^1.27.0", "music-metadata": "^11.12.3", "rss-parser": "^3.13.0", "turndown": "^7.2.0", "turndown-plugin-gfm": "^1.0.2" }, "bin": { "markit": "dist/main.js" } }, "sha512-h4nhn6a/SNXEdc3kLVtL37TspxjUNCNL0OM7LRWxd389ZByI/B7bjNNgxFdVAT0O+H7ZekSwLdVe/lws1l2AZQ=="], "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], diff --git a/docs/hosted-agent.md b/docs/hosted-agent.md index f8b92a1f4..fddb3a594 100644 --- a/docs/hosted-agent.md +++ b/docs/hosted-agent.md @@ -678,7 +678,12 @@ given that file through Atomic's `createAgentSession({ journal })`, so the server's process environment is left unchanged. An operator's non-empty `ATOMIC_WORKFLOW_JOURNAL_PATH` names another file instead; Atomic's `workflows.journal` setting and its `ATOMIC_WORKFLOWS_JOURNAL` and -`ATOMIC_STORAGE` selections do not move a Planner session's journal. Atomic +`ATOMIC_STORAGE` selections do not move a Planner session's journal, and +neither does the shared top-level `storage` setting, including an adapter named +by package such as the libSQL selection `atomic storage join` writes. That +setting does reach the Planner's Intercom: its sessions use the machine's +Intercom broker, which keeps its routing in the selected database and so can +reach sessions on every machine that selects the same one. Atomic still checks every set `ATOMIC_STORAGE`, `ATOMIC_SESSIONS_STORAGE`, and `ATOMIC_WORKFLOWS_JOURNAL` when it creates a session, so an invalid value fails every Atomic turn with a `StorageConfigError` naming the variable. A Build is not a workflow run and has no card in Chat: its tasks, their diff --git a/docs/self-hosting.md b/docs/self-hosting.md index a00d15edb..685ee3e31 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.41-alpha.1 in the Chopin server process through its +`HARNESS=atomic` runs Atomic 0.9.42 in the Chopin server process through its headless SDK (`createAgentSession()`). It does not spawn the `atomic` CLI or use RPC mode. @@ -143,6 +143,14 @@ Atomic caveats: - Harness-level compaction, suspending a turn, and supplied harness skills are unsupported. A Planner session's own resource discovery does load Atomic skills. Atomic's automatic retries remain on. +- Since Atomic 0.9.42 a provider's rate limit is shared by the whole server + process. After one request gets a 429, every Atomic session in the server, + Planner turns and workers alike, waits for that provider's cooldown (its + `Retry-After`, otherwise backoff of up to 60 seconds) before sending its next + request, instead of each hitting the limit in turn. A turn waiting there shows + no output yet; stopping it ends the wait without sending the request. Chopin + sets no request budget (`configureProviderRequestBudget()`) or + `resourceAdmission` of its own. - Under `auto`, refreshing an OAuth token in memory can rotate the refresh token stored by the host CLI, which may then ask the operator to sign in again. `auto` also runs `!command` API-key entries in `auth.json` to resolve them. diff --git a/package.json b/package.json index 3fdbe59dd..077145c29 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.41-alpha.1", + "@bastani/atomic": "0.9.42", "ai": "7.0.135", "typebox": "1.3.7", "zod": "4.4.3"