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"