From 70e53c504f3d5bc741eced7dd04bd7ebd814c5f6 Mon Sep 17 00:00:00 2001 From: Alex Lavaee Date: Sat, 17 Oct 2026 18:31:48 -0700 Subject: [PATCH] Upgrade Atomic to 0.9.38-alpha.9 and keep Planner workflow runs in Chopin's state directory Atomic 0.9.38 drops DBOS and embedded PostgreSQL and journals workflow runs in a local SQLite file, by default under the user's home. The atomic harness now points that journal at $XDG_STATE_HOME/chopin/atomic/workflows.sqlite, beside the per-document Planner directories a run must resume in, unless the operator sets ATOMIC_WORKFLOW_JOURNAL_PATH. The adapter sets the variable while it is open, restores it on shutdown, and creates the journal's directory private. The Docker image sets XDG_STATE_HOME to /var/lib/chopin, owned by the server user, so an operator can mount one volume to keep runs and Planner directories. No Postgres or DBOS setup existed for Atomic in the image or Compose files, and none is needed now. Assistant-model: Claude Opus 5.5 (fast) Assistant-workflow: inline (fast subagents) Assistant-verification: bun test (6194 pass, 0 fail), bun run types, bun run ci Assistant-verification: docker build of the server image; container started healthy with HARNESS=atomic Assistant-verification: targeted bun run e2e (24 passed) Co-authored-by: Alex Lavaee --- Dockerfile | 8 +- apps/server/src/harness/atomic/adapter.ts | 20 +++- apps/server/src/harness/atomic/full.test.ts | 10 +- apps/server/src/harness/atomic/workspace.ts | 9 ++ apps/server/src/harness/harnesses.test.ts | 29 ++++++ apps/server/src/harness/harnesses.ts | 5 +- bun.lock | 102 ++++---------------- docs/hosted-agent.md | 11 ++- docs/self-hosting.md | 13 ++- package.json | 2 +- 10 files changed, 108 insertions(+), 101 deletions(-) diff --git a/Dockerfile b/Dockerfile index 348bdf2b0..48aaa8a35 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,11 +39,15 @@ WORKDIR /app RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* \ + && install -d -o bun -g bun -m 0700 /var/lib/chopin +# The atomic Planner's per-document directories and workflow journal live under +# $XDG_STATE_HOME/chopin; mount a volume at /var/lib/chopin to keep them. ENV NODE_ENV=production \ PORT=8787 \ - SERVER_HOST=0.0.0.0 + SERVER_HOST=0.0.0.0 \ + XDG_STATE_HOME=/var/lib/chopin COPY --from=production-dependencies --chown=bun:bun /app/node_modules ./node_modules COPY --from=production-dependencies --chown=bun:bun /app/apps/server/node_modules ./apps/server/node_modules diff --git a/apps/server/src/harness/atomic/adapter.ts b/apps/server/src/harness/atomic/adapter.ts index 10ec0113e..65912288d 100644 --- a/apps/server/src/harness/atomic/adapter.ts +++ b/apps/server/src/harness/atomic/adapter.ts @@ -22,9 +22,9 @@ import { SessionManager, SettingsManager, } from "@bastani/atomic"; -import { mkdtemp, readFile, rm } from "node:fs/promises"; +import { mkdir, mkdtemp, readFile, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; -import { join } from "node:path"; +import { dirname, join } from "node:path"; import { fullPlanner, workflowRuns } from "./full"; import type { @@ -154,6 +154,13 @@ export type AtomicSettings = { * sessions never load them. */ extensions?: readonly string[]; + /** + * The SQLite file the workflows of Planner sessions are journaled in, in place + * of Atomic's default beside its agent directory. Atomic reads the journal + * location only from `ATOMIC_WORKFLOW_JOURNAL_PATH` and the on-disk settings, + * so the adapter sets that variable until it shuts down. + */ + journal?: string; }; export class ToolBoundaryError extends Error { @@ -465,6 +472,8 @@ export function createAtomicAdapter( } let runtime: Promise | undefined; let open = new Set(); + let journal = process.env.ATOMIC_WORKFLOW_JOURNAL_PATH; + if (settings.journal) process.env.ATOMIC_WORKFLOW_JOURNAL_PATH = settings.journal; return { specificationVersion: "harness-v1", @@ -615,6 +624,10 @@ export function createAtomicAdapter( let cwd = full?.cwd ?? directory!; let agentDir = full ? getAgentDir() : directory!; if (full) settingsManager = await fullSettings(agentDir, cwd); + // The journal holds workflow inputs and outputs; Atomic would create its directory world-readable. + if (full && settings.journal) { + await mkdir(dirname(settings.journal), { recursive: true, mode: 0o700 }); + } sessionManager ??= SessionManager.inMemory(cwd); let loader = new DefaultResourceLoader({ cwd, @@ -825,6 +838,9 @@ export function createAtomicAdapter( async shutdown() { await Promise.allSettled([...open].map(session => session.doDestroy())); + if (!settings.journal) return; + if (journal === undefined) delete process.env.ATOMIC_WORKFLOW_JOURNAL_PATH; + else process.env.ATOMIC_WORKFLOW_JOURNAL_PATH = journal; }, }; } diff --git a/apps/server/src/harness/atomic/full.test.ts b/apps/server/src/harness/atomic/full.test.ts index 300b0d817..12765c1bc 100644 --- a/apps/server/src/harness/atomic/full.test.ts +++ b/apps/server/src/harness/atomic/full.test.ts @@ -116,9 +116,11 @@ async function run( let previous = process.env.ATOMIC_CODING_AGENT_DIR; let received: QuestionParams[] = []; let operatorPackageDir = join(root, "operator-package"); + let journal = join(root, "state", "workflows.sqlite"); let harness = createAtomicAdapter({ auth: "ai-gateway", model: "stub/model", + journal, extensions: operatorPackage || askingWorkflow ? [operatorPackageDir] : undefined, providers: { stub: { @@ -316,6 +318,8 @@ export default workflow({ if (!worker) { let files = { operator: await Bun.file(join(agentDir, "settings.json")).exists(), + journal: await Bun.file(journal).exists(), + defaultJournal: await Bun.file(join(root, "workflows", "journal.sqlite")).exists(), project: projectPackage ? await Bun.file(join(cwd, ".atomic", "settings.json")).text() : undefined, @@ -443,7 +447,7 @@ test("a checkout's project settings add its packages without writing either sett expect(plain.requests[0]!.system).not.toContain("PROJECT-SKILL-MARKER"); }); -/** The first workflow tool call starts Atomic's durable backend, which falls back slowly without Postgres. */ +/** The first workflow tool call loads Atomic's workflow runtime and opens its journal. */ const WORKFLOW_TOOL_TIMEOUT_MS = 30_000; test( @@ -490,7 +494,7 @@ test( delete process.env.NODE_ENV; try { let seen: string[] = []; - await run(true, "launch", { + let result = await run(true, "launch", { host: room.input, askingWorkflow: true, afterTurn: async () => { @@ -527,6 +531,8 @@ test( expect(stage.toolNames).toContain("write"); expect(stage.toolNames).not.toContain(ATOMIC_RESULT_TOOL_NAME); expect(stage.system).not.toContain("CHOPIN-INSTRUCTIONS-MARKER"); + // The run is journaled where Chopin chose, not in Atomic's default beside its agent directory. + expect(result.files).toMatchObject({ journal: true, defaultJournal: false }); } finally { if (environment !== undefined) process.env.NODE_ENV = environment; await room.close(); diff --git a/apps/server/src/harness/atomic/workspace.ts b/apps/server/src/harness/atomic/workspace.ts index b8053a18d..79e49e141 100644 --- a/apps/server/src/harness/atomic/workspace.ts +++ b/apps/server/src/harness/atomic/workspace.ts @@ -50,6 +50,15 @@ export function stateDirectory(): string { return join(process.env.XDG_STATE_HOME || join(homedir(), ".local", "state"), "chopin"); } +/** + * Where Planner sessions journal their workflow runs. A run resumes only with + * the journal and working directory it started with, so the journal lives + * beside the channel directories rather than in Atomic's own home. + */ +export function workflowJournal(): string { + return join(stateDirectory(), "atomic", "workflows.sqlite"); +} + /** * A stable directory per channel, private to the server's user. It lives in a * per-user directory rather than the shared tmp, so a predictable name is safe; diff --git a/apps/server/src/harness/harnesses.test.ts b/apps/server/src/harness/harnesses.test.ts index ccce304b5..297fc1a4d 100644 --- a/apps/server/src/harness/harnesses.test.ts +++ b/apps/server/src/harness/harnesses.test.ts @@ -52,6 +52,35 @@ it("refuses Atomic's host-login auto mode on a non-loopback bind but accepts ai- .toBe("atomic"); }); +it("journals Atomic workflow runs in Chopin's state directory unless the operator names a journal", async () => { + let previous = { + state: process.env.XDG_STATE_HOME, + journal: process.env.ATOMIC_WORKFLOW_JOURNAL_PATH, + }; + let state = join(tmpdir(), `chopin-state-${crypto.randomUUID()}`); + let restore = (name: string, value: string | undefined) => + value === undefined ? delete process.env[name] : process.env[name] = value; + let journal = (): string | undefined => process.env.ATOMIC_WORKFLOW_JOURNAL_PATH; + try { + process.env.XDG_STATE_HOME = state; + delete process.env.ATOMIC_WORKFLOW_JOURNAL_PATH; + harnessFor({ harness: "atomic", harnessAuth: "ai-gateway", host: "0.0.0.0" }); + if (process.platform === "linux") { + expect(journal()).toBe(join(state, "chopin", "atomic", "workflows.sqlite")); + } + await shutdownHarnesses(); + expect(journal()).toBeUndefined(); + + process.env.ATOMIC_WORKFLOW_JOURNAL_PATH = "/srv/atomic/runs.sqlite"; + harnessFor({ harness: "atomic", harnessAuth: "ai-gateway", host: "0.0.0.0" }); + expect(journal()).toBe("/srv/atomic/runs.sqlite"); + } finally { + await shutdownHarnesses(); + restore("XDG_STATE_HOME", previous.state); + restore("ATOMIC_WORKFLOW_JOURNAL_PATH", previous.journal); + } +}); + it("accepts the remote harness on any bind without HARNESS_AUTH, and refuses one", () => { for (let host of ["0.0.0.0", "::", "192.168.1.2", "127.0.0.1"]) { expect(harnessFor({ harness: "remote", host }).harnessId).toBe("remote"); diff --git a/apps/server/src/harness/harnesses.ts b/apps/server/src/harness/harnesses.ts index ad6eb1a3a..9aede6d57 100644 --- a/apps/server/src/harness/harnesses.ts +++ b/apps/server/src/harness/harnesses.ts @@ -2,7 +2,7 @@ import { existsSync } from "node:fs"; import { isAbsolute } from "node:path"; import { ATOMIC_AUTH_MODES, createAtomicAdapter } from "./atomic/adapter"; -import { forgetWorkspaces } from "./atomic/workspace"; +import { forgetWorkspaces, workflowJournal } from "./atomic/workspace"; import { createCopilotSdk } from "./copilot-sdk/adapter"; import { createRemoteAdapter } from "./remote/adapter"; @@ -18,10 +18,11 @@ function createAtomicHarness( settings: { auth?: string; extensions?: readonly string[] }, ): HarnessV1 & { shutdown(): Promise } { // Atomic takes neither a GitHub credential nor a credit limit; only `auth` (validated by - // `harnessFor` below) and the extensions reach the real adapter. + // `harnessFor` below), the extensions, and the workflow journal reach the real adapter. return createAtomicAdapter({ auth: settings.auth as AtomicAuthMode, extensions: settings.extensions, + journal: process.env.ATOMIC_WORKFLOW_JOURNAL_PATH || workflowJournal(), }); } diff --git a/bun.lock b/bun.lock index 54862c3ed..5d0914a8f 100644 --- a/bun.lock +++ b/bun.lock @@ -309,7 +309,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.37", + "@bastani/atomic": "0.9.38-alpha.9", "ai": "7.0.135", "typebox": "1.3.7", "zod": "4.4.3", @@ -450,27 +450,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.37", "", { "dependencies": { "@bastani/atomic-natives": "0.9.37", "@bastani/pi-ai": "0.9.37", "@dbos-inc/dbos-sdk": "4.25.14", "@earendil-works/pi-agent-core": "1.2.0", "@earendil-works/pi-codemode": "1.2.0", "@earendil-works/pi-tui": "1.2.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.6.0", "brace-expansion": "5.0.12", "chalk": "6.0.0", "cross-spawn": "7.0.6", "diff": "8.0.4", "embedded-postgres": "18.4.0-beta.17", "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", "pg": "8.23.0", "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-F4KjyTlKFnh0F1YQHSO6Uv5jbUkV5tB+XzC5Z9h3fnKEEmswW1UjZslinNQbWhGFuMriCCq6eb0hiJD7jB8Vcw=="], + "@bastani/atomic": ["@bastani/atomic@0.9.38-alpha.9", "", { "dependencies": { "@bastani/atomic-natives": "0.9.38-alpha.9", "@bastani/pi-ai": "0.9.38-alpha.9", "@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.6.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-6i8lc2intSDy5kP3/lqCcUDD8HlA+AUiayhMp8Qzmfs5IiYZB2GrbddmzAlHJ9Qr8rPTaanIC8y6Qnv8ID07sQ=="], - "@bastani/atomic-natives": ["@bastani/atomic-natives@0.9.37", "", { "optionalDependencies": { "@bastani/atomic-natives-darwin-arm64": "0.9.37", "@bastani/atomic-natives-darwin-x64": "0.9.37", "@bastani/atomic-natives-linux-arm64-gnu": "0.9.37", "@bastani/atomic-natives-linux-arm64-musl": "0.9.37", "@bastani/atomic-natives-linux-x64-gnu": "0.9.37", "@bastani/atomic-natives-linux-x64-musl": "0.9.37", "@bastani/atomic-natives-win32-arm64-msvc": "0.9.37", "@bastani/atomic-natives-win32-x64-msvc": "0.9.37" } }, "sha512-9V0nyP3fTmPB/FA+tft+Y0KxZ+Zr/XUxujBM3JLS56WK8x27PFOfXLWIFQnKyvsAxDYAjozmlY2tsA6ASvwkNQ=="], + "@bastani/atomic-natives": ["@bastani/atomic-natives@0.9.38-alpha.9", "", { "optionalDependencies": { "@bastani/atomic-natives-darwin-arm64": "0.9.38-alpha.9", "@bastani/atomic-natives-darwin-x64": "0.9.38-alpha.9", "@bastani/atomic-natives-linux-arm64-gnu": "0.9.38-alpha.9", "@bastani/atomic-natives-linux-arm64-musl": "0.9.38-alpha.9", "@bastani/atomic-natives-linux-x64-gnu": "0.9.38-alpha.9", "@bastani/atomic-natives-linux-x64-musl": "0.9.38-alpha.9", "@bastani/atomic-natives-win32-arm64-msvc": "0.9.38-alpha.9", "@bastani/atomic-natives-win32-x64-msvc": "0.9.38-alpha.9" } }, "sha512-yN7eLytoNYRKmxm2HABjV1qMk70ey+NmQP7gEo5kmEwecOJIkPdLsnbRJs3l5KBIC9DUrP7/J/cFWJ9PIxr4Fg=="], - "@bastani/atomic-natives-darwin-arm64": ["@bastani/atomic-natives-darwin-arm64@0.9.37", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gI5Caa0eD53jWr1j64wvbDnGNAplowLtCz68wErlvfl6/SxC0PnP08sfQwBEnagJYEFI2EGU8UwyjU6lBahm1Q=="], + "@bastani/atomic-natives-darwin-arm64": ["@bastani/atomic-natives-darwin-arm64@0.9.38-alpha.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-r3YA8iXAGp+QsxQeTPJHFFCFMqL34lHjg5bXGWWeVN8qQdxt54yvk1QPfe1DplhnIXhYrDNbNtXTmzQAo1ShvQ=="], - "@bastani/atomic-natives-darwin-x64": ["@bastani/atomic-natives-darwin-x64@0.9.37", "", { "os": "darwin", "cpu": "x64" }, "sha512-4ul4Z+ndUELqjDf1N1+iql7CU2mvjkbTJGXWx31Bw5DxlnU0RvBM4dPj7f37oXVzbW1yNKI4iYQfyOwjYuptIQ=="], + "@bastani/atomic-natives-darwin-x64": ["@bastani/atomic-natives-darwin-x64@0.9.38-alpha.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-cBQByncHUKUaJUNTHIutK8J5Z2MX9jAw/EFIy6NldxdbIc4WStjXqwRoAbiRArzGRpLO7uCqPCmi3iKatXF2fQ=="], - "@bastani/atomic-natives-linux-arm64-gnu": ["@bastani/atomic-natives-linux-arm64-gnu@0.9.37", "", { "os": "linux", "cpu": "arm64" }, "sha512-6ex8XGCfBce+eOOFZltDYIHX9EfpjFMJJcm6UpGJMwpEbeD7BfCXdGORQQvtXm2q7zYFQ3uoneOkyUFYtt6DmA=="], + "@bastani/atomic-natives-linux-arm64-gnu": ["@bastani/atomic-natives-linux-arm64-gnu@0.9.38-alpha.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-yOvXM7qSSIb8YX0eDDyXxvHV0CbiPFh/KE/CPBkpfyVE+538tLQpQb3pQHTNcDFbhNl4evZivHSoNk4QYhrujQ=="], - "@bastani/atomic-natives-linux-arm64-musl": ["@bastani/atomic-natives-linux-arm64-musl@0.9.37", "", { "os": "linux", "cpu": "arm64" }, "sha512-6gprXp3YU2J6zkA8gqrurUYqs7Hb1khR4C4Q92da7jEaFQHZkYrRm76OqVLu1XJvwjS+gK+ltF7tOlhk9+riAg=="], + "@bastani/atomic-natives-linux-arm64-musl": ["@bastani/atomic-natives-linux-arm64-musl@0.9.38-alpha.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-VQyhpKNLwxHMY1xUQFetLTRi1BayqQ7C4sVpYpwB38rNltInufLhjbbK6XwIVYq1OrkIFccIqwbKuFUGHKGzFw=="], - "@bastani/atomic-natives-linux-x64-gnu": ["@bastani/atomic-natives-linux-x64-gnu@0.9.37", "", { "os": "linux", "cpu": "x64" }, "sha512-xY80PKMOGvFPIlUTJsCFXpdLHmwkCedwAUaVFEhjI44iqef3ZtZelqkF2bgGULzztdRRvIzYEDaolYRx6FwrWg=="], + "@bastani/atomic-natives-linux-x64-gnu": ["@bastani/atomic-natives-linux-x64-gnu@0.9.38-alpha.9", "", { "os": "linux", "cpu": "x64" }, "sha512-4JGo4I8stKgAXWudGKwJNMgzeO6ZJBjTHW5odcNWKnn2rQIpjhZGBSCq5sJpEcYOJD1JGUJ+iZs2KvyIPKXARg=="], - "@bastani/atomic-natives-linux-x64-musl": ["@bastani/atomic-natives-linux-x64-musl@0.9.37", "", { "os": "linux", "cpu": "x64" }, "sha512-260aOGRjEDtpFRC5r4n7DvYSYNXS6x74LfMetCzu1dAstWm1TCMsXtxrpTvZM+ALP/DeEWXw0ZN4e2QJiDPS+Q=="], + "@bastani/atomic-natives-linux-x64-musl": ["@bastani/atomic-natives-linux-x64-musl@0.9.38-alpha.9", "", { "os": "linux", "cpu": "x64" }, "sha512-jtetHCxqz4GaBz/+3R4PWlX178snWWI/7PwxzEqUpONbJBMCA/JolYSXa9YZLm9VA8kRndW2DxIMVr0cRxy+Lg=="], - "@bastani/atomic-natives-win32-arm64-msvc": ["@bastani/atomic-natives-win32-arm64-msvc@0.9.37", "", { "os": "win32", "cpu": "arm64" }, "sha512-C4zAB+HWtuJ09BfOXwMJYI1EwHJ0ZP4fgFZqYs68jI7fJx2Qij1x3p/AQx3Eo7n5Ujn3wTMxdSFiWp+vCnjoAQ=="], + "@bastani/atomic-natives-win32-arm64-msvc": ["@bastani/atomic-natives-win32-arm64-msvc@0.9.38-alpha.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-CTMtzHbHtdRwJ0dnHyy/ZK9m+89LYGIPUBp2Ee4ydREgtc4tlLsWW3iFpx20/tTOisQPieuTz7uZ0ze4CIoKZw=="], - "@bastani/atomic-natives-win32-x64-msvc": ["@bastani/atomic-natives-win32-x64-msvc@0.9.37", "", { "os": "win32", "cpu": "x64" }, "sha512-Iki5rYnILxwnqKeGyBOfFMAmXu/eZY0T/xZnO4B5OL3oI03Z0robOxC4rWhl5Ktw1Cs+QQyJKDJoZF/EdnB2BA=="], + "@bastani/atomic-natives-win32-x64-msvc": ["@bastani/atomic-natives-win32-x64-msvc@0.9.38-alpha.9", "", { "os": "win32", "cpu": "x64" }, "sha512-AbTr4sCS3BdxUMWoiWq8XFKvPH2AtHf222sr+vZMsTQ9wB/eILdv/wPy38+gB66HOWf5OTUyCPvDNrGeVtV4oQ=="], - "@bastani/pi-ai": ["@bastani/pi-ai@0.9.37", "", { "dependencies": { "@anthropic-ai/sdk": "0.129.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "1.2.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-7XljKBBcIJGvendTVby6iHKGLIay4JpodTrm1B/m3nJLuyBwKAFmr/gmKBxKslj+mZ8k4rFhio8ik4aIvjDjcQ=="], + "@bastani/pi-ai": ["@bastani/pi-ai@0.9.38-alpha.9", "", { "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-pVnnc3AlV3PXNZrQCPrmIPgrIrHvFT/CQnA/ok3HUM74/BugfYGRPMZSj1XQQYb5ZZDTGnBZygoLQ3+DPsOkSA=="], "@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="], @@ -568,8 +568,6 @@ "@codemirror/view": ["@codemirror/view@6.43.6", "", { "dependencies": { "@codemirror/state": "^6.7.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA=="], - "@dbos-inc/dbos-sdk": ["@dbos-inc/dbos-sdk@4.25.14", "", { "dependencies": { "commander": "^12.0.0", "pg": "^8.11.3", "serialize-error": "^8.1.0", "superjson": "^1.13.3", "ws": "^8.18.1", "yaml": "^2.8.3" }, "bin": { "dbos": "dist/src/cli/cli.js", "dbos-sdk": "dist/src/cli/cli.js" } }, "sha512-vBGuqlZQExzCiBpr6mW04BckqWi3n3+VLAv5p/odVfY3DGqDxxEscDXGDiUiFXYlaORkZa70GTnmzx8RVWxpzQ=="], - "@dprint/darwin-arm64": ["@dprint/darwin-arm64@0.50.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4d08INZlTxbPW9LK9W8+93viN543/qA2Kxn4azVnPW/xCb2Im03UqJBz8mMm3nJZdtNnK3uTVG3ib1VW+XJisw=="], "@dprint/darwin-x64": ["@dprint/darwin-x64@0.50.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZXWPBwdLojhdBATq+bKwJvB7D8bIzrD6eR/Xuq9UYE7evQazUiR069d9NPF0iVuzTo6wNf9ub9SXI7qDl11EGA=="], @@ -588,31 +586,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.2.0", "", { "dependencies": { "@earendil-works/pi-ai": "^1.2.0", "typebox": "1.3.27" } }, "sha512-pUR0vYmGhHkBQGeCeWjwVIA+l1+MrDu6m6VGuysjh6KBzBpovTV/MlcVrEIOaM8jv/slpAyUmuCEQl1jOBqHJQ=="], - - "@earendil-works/pi-ai": ["@earendil-works/pi-ai@1.2.0", "", { "dependencies": { "@anthropic-ai/sdk": "0.129.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "^1.2.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-U5/1zXqfV1on7/9sbez03tT4Ru49Lvfb4+zXSDK3DBKF5cRk6KxvAOTOY3HJ4jimlZth+rs7vbJqN6iBQAoNuQ=="], - - "@earendil-works/pi-codemode": ["@earendil-works/pi-codemode@1.2.0", "", { "dependencies": { "quickjs-wasi": "3.6.2" } }, "sha512-UZF7IN0IIrf3bop2wTxrwoAakGctH6d3zdPwhPN+QHMECfoI5E6B6l6I17YGFZPj8cmGex6xX7mLCNJXRf7wsw=="], - - "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@1.2.0", "", {}, "sha512-NZ3aJE6dr7aTgzzXDe53OW7BsAsF8ZUKHPJTtnjaQcxtlagkUT0Ew8Qas0EvYQsZqR/KpF1lB+z209XBzIC7xg=="], - - "@earendil-works/pi-tui": ["@earendil-works/pi-tui@1.2.0", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.11" } }, "sha512-OdJCiYklkL3TqmdmGKUflHoLy9zw18GBYO0DPASZvGlP4RkDXAZzLLDt7cidJ6wUR7DBrKb13rrekDsXgMF60g=="], - - "@embedded-postgres/darwin-arm64": ["@embedded-postgres/darwin-arm64@18.4.0-beta.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Kg1ZMNFzkVIJs3g4V2UYEc5X005km9rGinxFBH8R1sOU2Rblvz4pt2Uf93Pu8Rk273Ue9HIdrbMPpgUqwjUi0Q=="], - - "@embedded-postgres/darwin-x64": ["@embedded-postgres/darwin-x64@18.4.0-beta.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-4tShSYWMxUQTSWoQAdLnHISvRj6L9gTch9/31ASJPg6wgyN64LDRwMcOINEWybM7N0ropJ3nTYhFT3UX1bKY5Q=="], - - "@embedded-postgres/linux-arm": ["@embedded-postgres/linux-arm@18.4.0-beta.17", "", { "os": "linux", "cpu": "arm" }, "sha512-VuD1nFasN7yG57zpJcp6MBXM0nXqGfb8GBQV+f1FGJ17+VMNYLIFLhFp99UlY4xnWG74FQC4NPYw8eCwSTJ6qg=="], - - "@embedded-postgres/linux-arm64": ["@embedded-postgres/linux-arm64@18.4.0-beta.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-TIzjtGnDGSD/LbdW0OWCEcbI+YVT0WKSfSr20TCkkP4UR8zeKe+QCZbO0/CM4hS9EWyZ4cDebjRvpRc3iMi6wg=="], + "@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=="], - "@embedded-postgres/linux-ia32": ["@embedded-postgres/linux-ia32@18.4.0-beta.17", "", { "os": "linux", "cpu": "ia32" }, "sha512-aSRe4kknqRHuedtpo/rDIaqa8r9VrKIgW9p5FkJyIFqUUkIkxRqND1dg8xrDRREcSUXRJKS0x+j/AuxflgYIfg=="], + "@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=="], - "@embedded-postgres/linux-ppc64": ["@embedded-postgres/linux-ppc64@18.4.0-beta.17", "", { "os": "linux", "cpu": "ppc64" }, "sha512-zO2RRUFdKRPplrdhmglG39VXJZzDXu3P3ONAG1sFPhGh89vbk24Btd5P7uOmQLIpWehzL0s+UqUWoeE/ZUKvgw=="], + "@earendil-works/pi-codemode": ["@earendil-works/pi-codemode@1.3.0", "", { "dependencies": { "quickjs-wasi": "3.6.2" } }, "sha512-2G9tmbsPhgzwfz7cmzJpbLSLqOx3eu22Gbzm+Wc3HqeZMjLQS4F3KfAabozVhv7uEjq3k2O1dZTHmhhWr2xbfQ=="], - "@embedded-postgres/linux-x64": ["@embedded-postgres/linux-x64@18.4.0-beta.17", "", { "os": "linux", "cpu": "x64" }, "sha512-jVw/MdDtIX/vICH/DKIe6/mHpiCggdx6QVyza4vt/NbcZFsL0KhwglF6F1Koqx3gRBZ9XtN+vi63EsqSyqOSxA=="], + "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@1.3.0", "", {}, "sha512-ERGZr+aXjNJzoUbB7ZzHVH3g5otzMHjHLs2Fyizm12By5X+gBEhod9cJXFOk13S7M8a29Am+Mq21zm73mRJFLg=="], - "@embedded-postgres/windows-x64": ["@embedded-postgres/windows-x64@18.4.0-beta.17", "", { "os": "win32", "cpu": "x64" }, "sha512-AwRerliA4IGWyW5jWBvHt5vidVUSB0QQW9Tt2y7ScnmifnCb/awfxZr4BkBSTv+gNt8Djcddqs+xSF5Z6/CkTg=="], + "@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=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], @@ -1328,8 +1310,6 @@ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], - "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], - "axe-core": ["axe-core@4.13.0", "", {}, "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], @@ -1408,8 +1388,6 @@ "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], - "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="], - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], @@ -1562,8 +1540,6 @@ "electron-to-chromium": ["electron-to-chromium@1.5.396", "", {}, "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ=="], - "embedded-postgres": ["embedded-postgres@18.4.0-beta.17", "", { "dependencies": { "async-exit-hook": "^2.0.1", "pg": "^8.7.3" }, "optionalDependencies": { "@embedded-postgres/darwin-arm64": "^18.4.0-beta.17", "@embedded-postgres/darwin-x64": "^18.4.0-beta.17", "@embedded-postgres/linux-arm": "^18.4.0-beta.17", "@embedded-postgres/linux-arm64": "^18.4.0-beta.17", "@embedded-postgres/linux-ia32": "^18.4.0-beta.17", "@embedded-postgres/linux-ppc64": "^18.4.0-beta.17", "@embedded-postgres/linux-x64": "^18.4.0-beta.17", "@embedded-postgres/windows-x64": "^18.4.0-beta.17" } }, "sha512-ORT/A1YiO6ecpRHpyIIBgyCR/8ASqqYZuFw11aX9PkqTX3FUM5+9sNOXY1mGIixxsm2TWSIA5WghJEk7A5ZxVw=="], - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], @@ -1762,8 +1738,6 @@ "is-unsafe": ["is-unsafe@2.0.2", "", {}, "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ=="], - "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], - "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], @@ -2082,22 +2056,6 @@ "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], - "pg": ["pg@8.23.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.16.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg=="], - - "pg-cloudflare": ["pg-cloudflare@1.4.1", "", {}, "sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ=="], - - "pg-connection-string": ["pg-connection-string@2.14.1", "", {}, "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA=="], - - "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - - "pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="], - - "pg-protocol": ["pg-protocol@1.16.1", "", {}, "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg=="], - - "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], - - "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], @@ -2116,14 +2074,6 @@ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], - - "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], - - "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], - - "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "powershell-utils": ["powershell-utils@0.2.1", "", {}, "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A=="], "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], @@ -2230,8 +2180,6 @@ "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], - "serialize-error": ["serialize-error@8.1.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ=="], - "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], @@ -2268,8 +2216,6 @@ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], "sql.js": ["sql.js@1.14.2", "", {}, "sha512-3ZGPovObMFrdw79zrUHbfdE/DLIsy8jdNdssmMSQuRAymedU6q84asPt0kgiqrdMYlPegDItiIMfmIXzZnYFcw=="], @@ -2306,8 +2252,6 @@ "stylis": ["stylis@4.4.0", "", {}, "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA=="], - "superjson": ["superjson@1.13.3", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg=="], - "tabbable": ["tabbable@6.5.0", "", {}, "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA=="], "tailwindcss": ["tailwindcss@4.3.0", "", {}, "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q=="], @@ -2348,8 +2292,6 @@ "turndown-plugin-gfm": ["turndown-plugin-gfm@1.0.2", "", {}, "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg=="], - "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - "type-is": ["type-is@2.1.0", "", { "dependencies": { "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA=="], "typebox": ["typebox@1.3.7", "", {}, "sha512-meKuifc33Pccx0O6PdIzYMq3Og8zvP4TIi/a+Bw3AEMZMxOD0+RHGQvpglEe6Zdy3wZ8nqn/j95h8LUZLk/6Hg=="], @@ -2436,8 +2378,6 @@ "xmlbuilder": ["xmlbuilder@10.1.1", "", {}, "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg=="], - "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - "y-protocols": ["y-protocols@1.0.7", "", { "dependencies": { "lib0": "^0.2.85" }, "peerDependencies": { "yjs": "^13.0.0" } }, "sha512-YSVsLoXxO67J6eE/nV4AtFtT3QEotZf5sK5BHxFBXso7VDUT3Tx07IfA6hsu5Q5OmBdMkQVmFZ9QOA7fikWvnw=="], "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], @@ -2470,12 +2410,6 @@ "@bastani/pi-ai/typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="], - "@dbos-inc/dbos-sdk/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - - "@dbos-inc/dbos-sdk/pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="], - - "@dbos-inc/dbos-sdk/yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], - "@earendil-works/pi-agent-core/typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="], "@earendil-works/pi-ai/typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="], @@ -2518,8 +2452,6 @@ "ecdsa-sig-formatter/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "embedded-postgres/pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="], - "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "happy-dom/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], diff --git a/docs/hosted-agent.md b/docs/hosted-agent.md index 43865a066..6f83bffc8 100644 --- a/docs/hosted-agent.md +++ b/docs/hosted-agent.md @@ -257,7 +257,7 @@ them. Chopin's compaction, summary, and cache overrides still apply on top. Chopin appends its Planner instructions to Atomic's assembled prompt. Session, settings, and model credentials remain in memory; Atomic's own enabled tools, extensions, MCP -servers, and workflow storage can perform writes as the server process's user. +servers, and workflow journal can perform writes as the server process's user. Background summary and research workers still use the isolated sessions described above. @@ -603,8 +603,13 @@ stopped comes back stopped. Ended rows stay until the next workflow starts in th document. When a run ends, Chat also records a line saying how it ended and how long it took. The session is let go when its runs finish, when its owner binding ends, or when the document closes; run state is durable in Atomic's -workflow store, so runs interrupted that way can be resumed from a later -session. A Build is not a workflow run and has no card in Chat: its tasks, their +workflow journal, so runs interrupted that way can be resumed from a later +session. Chopin keeps that journal at +`$XDG_STATE_HOME/chopin/atomic/workflows.sqlite` under the same per-user state +directory as the documents' own directories, because a run resumes only with +the journal and working directory it started in. A non-empty +`ATOMIC_WORKFLOW_JOURNAL_PATH` names another file instead; Atomic's +`workflows.journal` setting is not used for Planner sessions. A Build is not a workflow run and has no card in Chat: its tasks, their state and pull requests show under **Build**, whichever machine runs it. The Planner's instructions say so, so it does not point people to Chat for a Build. diff --git a/docs/self-hosting.md b/docs/self-hosting.md index 902465765..0d7eabe3e 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.37 in the Chopin server process through its +`HARNESS=atomic` runs Atomic 0.9.38-alpha.9 in the Chopin server process through its headless SDK (`createAgentSession()`). It does not spawn the `atomic` CLI or use RPC mode. @@ -148,9 +148,14 @@ Atomic caveats: `auto` also runs `!command` API-key entries in `auth.json` to resolve them. - There is no per-session credit limit like Copilot's, so a worker's `maxAiCredits` does not apply. Use the provider's spend limits. -- `@bastani/atomic` adds more than 250 MB of installed dependencies on Linux - x64, including glibc and musl native modules and the embedded PostgreSQL - that only Atomic workflows use. Expect a larger image. +- `@bastani/atomic` adds more than 200 MB of installed dependencies on Linux + x64, including glibc and musl native modules. Expect a larger image. +- Atomic workflows need no database server. Their runs are journaled in a + SQLite file, `$XDG_STATE_HOME/chopin/atomic/workflows.sqlite`, beside the + documents' Planner directories (see + [Full Atomic Planner](hosted-agent.md#full-atomic-planner)). The Docker image + sets `XDG_STATE_HOME=/var/lib/chopin`; mount a volume there to keep runs + and those directories when the container is replaced. - 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 b7f8ae029..3567a2541 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,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.37", + "@bastani/atomic": "0.9.38-alpha.9", "ai": "7.0.135", "typebox": "1.3.7", "zod": "4.4.3"