@bastani/atomic 0.9.39 → 0.9.40-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/builtin/intercom/CHANGELOG.md +14 -0
- package/dist/builtin/intercom/broker/broker.ts +523 -72
- package/dist/builtin/intercom/broker/client.ts +136 -5
- package/dist/builtin/intercom/broker/database-wake-up-bus.ts +274 -0
- package/dist/builtin/intercom/broker/group-membership.ts +2 -2
- package/dist/builtin/intercom/broker/multinode-router.ts +1500 -0
- package/dist/builtin/intercom/broker/multinode-state-store.ts +569 -0
- package/dist/builtin/intercom/broker/open-broker-state.ts +160 -0
- package/dist/builtin/intercom/broker/paths.ts +6 -0
- package/dist/builtin/intercom/broker/pending-send-registry.ts +14 -0
- package/dist/builtin/intercom/broker/recipient-receipts.ts +93 -0
- package/dist/builtin/intercom/broker/restoring-recipients.ts +263 -0
- package/dist/builtin/intercom/broker/send-handler.ts +241 -25
- package/dist/builtin/intercom/broker/session-id-reclaim.ts +41 -0
- package/dist/builtin/intercom/broker/socket-writes.ts +47 -0
- package/dist/builtin/intercom/broker/spawn.ts +10 -2
- package/dist/builtin/intercom/broker/sql-held-send-store.ts +96 -0
- package/dist/builtin/intercom/broker/sql-known-session-store.ts +129 -0
- package/dist/builtin/intercom/broker/sql-lease-store.ts +194 -0
- package/dist/builtin/intercom/broker/sql-outbox-store.ts +249 -0
- package/dist/builtin/intercom/broker/sql-pending-ask-store.ts +105 -0
- package/dist/builtin/intercom/broker/sql-restoring-reservation-store.ts +295 -0
- package/dist/builtin/intercom/broker/sql-sent-message-authority.ts +126 -0
- package/dist/builtin/intercom/broker/supervisor-channel.ts +10 -0
- package/dist/builtin/intercom/broker/wake-up-bus.ts +60 -0
- package/dist/builtin/intercom/index.bundle.mjs +793 -91
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/retry-policy.ts +4 -0
- package/dist/builtin/intercom/session-target.ts +24 -0
- package/dist/builtin/intercom/types.ts +57 -3
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +31 -0
- package/dist/builtin/subagents/README.md +18 -12
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/skills/agent-browser/SKILL.md +1 -1
- package/dist/builtin/subagents/skills/cua-driver/BROWSER.md +55 -8
- package/dist/builtin/subagents/skills/cua-driver/EMBEDDING.md +7 -2
- package/dist/builtin/subagents/skills/cua-driver/LINUX.md +7 -1
- package/dist/builtin/subagents/skills/cua-driver/MACOS.md +151 -27
- package/dist/builtin/subagents/skills/cua-driver/RUNTIME.md +1 -1
- package/dist/builtin/subagents/skills/cua-driver/SKILL.md +33 -17
- package/dist/builtin/subagents/skills/cua-driver/WINDOWS.md +5 -0
- package/dist/builtin/subagents/skills/cua-driver/WORKFLOW.md +46 -8
- package/dist/builtin/subagents/skills/subagent/SKILL.md +18 -20
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +8032 -6034
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +18 -0
- package/dist/builtin/workflows/README.md +1 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +8 -8
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/audit.md +4 -2
- package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +22 -9
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +2 -2
- package/dist/builtin/workflows/skills/impeccable/reference/distill.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/extract.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/harden.md +2 -4
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +4 -4
- package/dist/builtin/workflows/skills/impeccable/reference/live.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +6 -6
- package/dist/builtin/workflows/skills/impeccable/reference/onboard.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/optimize.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +3 -3
- package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +10 -0
- package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/VERSION +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/impeccable +6 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/impeccable.cmd +47 -22
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-dom.js +34 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +25 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +33 -8
- package/dist/builtin/workflows/src/durable/journal/resolution.d.ts +7 -7
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +22855 -22308
- package/dist/builtin/workflows/src/index.js +106 -35
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +16 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +2 -0
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +6 -6
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +6 -3
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.d.ts +7 -2
- package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.js +29 -12
- package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
- package/dist/core/agent-session-recovery.d.ts +14 -0
- package/dist/core/agent-session-recovery.d.ts.map +1 -0
- package/dist/core/agent-session-recovery.js +83 -0
- package/dist/core/agent-session-recovery.js.map +1 -0
- package/dist/core/agent-session-tasks.d.ts.map +1 -1
- package/dist/core/agent-session-tasks.js +4 -6
- package/dist/core/agent-session-tasks.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +13 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +6 -2
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/event-results.d.ts +21 -0
- package/dist/core/extensions/event-results.d.ts.map +1 -1
- package/dist/core/extensions/event-results.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +4 -0
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/runner-events.d.ts +9 -2
- package/dist/core/extensions/runner-events.d.ts.map +1 -1
- package/dist/core/extensions/runner-events.js +29 -0
- package/dist/core/extensions/runner-events.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +7 -2
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +1 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/session-events.d.ts +30 -2
- package/dist/core/extensions/session-events.d.ts.map +1 -1
- package/dist/core/extensions/session-events.js.map +1 -1
- package/dist/core/sdk-types.d.ts +3 -2
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-storage.d.ts.map +1 -1
- package/dist/core/session-storage.js +15 -9
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/storage/process-selection.d.ts +39 -0
- package/dist/core/storage/process-selection.d.ts.map +1 -0
- package/dist/core/storage/process-selection.js +154 -0
- package/dist/core/storage/process-selection.js.map +1 -0
- package/dist/core/storage/provider.d.ts +6 -1
- package/dist/core/storage/provider.d.ts.map +1 -1
- package/dist/core/storage/provider.js +3 -2
- package/dist/core/storage/provider.js.map +1 -1
- package/dist/core/storage/selection.d.ts +1 -1
- package/dist/core/storage/selection.d.ts.map +1 -1
- package/dist/core/storage/selection.js.map +1 -1
- package/dist/core/storage/session/jsonl-session-store.d.ts +2 -0
- package/dist/core/storage/session/jsonl-session-store.d.ts.map +1 -1
- package/dist/core/storage/session/jsonl-session-store.js +38 -2
- package/dist/core/storage/session/jsonl-session-store.js.map +1 -1
- package/dist/core/tasks/completion.d.ts +11 -2
- package/dist/core/tasks/completion.d.ts.map +1 -1
- package/dist/core/tasks/completion.js +40 -16
- package/dist/core/tasks/completion.js.map +1 -1
- package/dist/core/tasks/pause.d.ts +4 -1
- package/dist/core/tasks/pause.d.ts.map +1 -1
- package/dist/core/tasks/pause.js +8 -5
- package/dist/core/tasks/pause.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +7 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js +11 -1
- package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.d.ts +2 -0
- package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-state.js +2 -0
- package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +4 -0
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +3 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +2 -0
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.d.ts +2 -1
- package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +29 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +4 -1
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-args.js +4 -0
- package/dist/modes/interactive-engine/engine-args.js.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.js +4 -4
- package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +4 -0
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/remote-renderer.js +1 -1
- package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
- package/dist/modes/rpc/rpc-client-api.d.ts +4 -1
- package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-api.js +4 -0
- package/dist/modes/rpc/rpc-client-api.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +3 -0
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-command-timeouts.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-timeouts.js +1 -0
- package/dist/modes/rpc/rpc-command-timeouts.js.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.js +6 -1
- package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +12 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +44 -11
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/tools-manager.js +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/background-tasks.md +5 -3
- package/docs/computer-use.md +2 -2
- package/docs/environment-variables.md +4 -1
- package/docs/extensions/events.md +29 -2
- package/docs/getting-started/first-session.md +1 -1
- package/docs/guides/intercom.md +1 -1
- package/docs/intercom/operations.md +103 -1
- package/docs/intercom/reference.md +10 -3
- package/docs/intercom.md +8 -6
- package/docs/keybindings.md +1 -1
- package/docs/models.md +1 -1
- package/docs/providers.md +4 -2
- package/docs/reference/cli.md +5 -0
- package/docs/rpc/protocol.md +19 -0
- package/docs/rpc.md +3 -0
- package/docs/sdk/web-server.md +1 -1
- package/docs/sdk.md +5 -2
- package/docs/sessions.md +17 -1
- package/docs/settings.md +5 -3
- package/docs/skills.md +1 -1
- package/docs/storage.md +54 -3
- package/docs/subagents.md +49 -9
- package/docs/usage.md +1 -1
- package/docs/windows.md +14 -4
- package/docs/workflows/api-reference.md +1 -1
- package/docs/workflows/authoring.md +1 -1
- package/docs/workflows/operations.md +10 -6
- package/npm-shrinkwrap.json +37 -37
- package/package.json +4 -4
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { StorageSelection } from "./provider.js";
|
|
2
|
+
export declare const STORAGE_ENV = "ATOMIC_STORAGE";
|
|
3
|
+
export declare const SESSIONS_STORAGE_ENV = "ATOMIC_SESSIONS_STORAGE";
|
|
4
|
+
export declare const WORKFLOWS_JOURNAL_ENV = "ATOMIC_WORKFLOWS_JOURNAL";
|
|
5
|
+
export declare const WORKFLOW_JOURNAL_PATH_ENV = "ATOMIC_WORKFLOW_JOURNAL_PATH";
|
|
6
|
+
export type StorageDomain = "sessions" | "journal";
|
|
7
|
+
export type StorageFlag = "--storage" | "--storage-file";
|
|
8
|
+
export interface StorageFlagArgument {
|
|
9
|
+
readonly flag: StorageFlag;
|
|
10
|
+
readonly value: string;
|
|
11
|
+
}
|
|
12
|
+
/** A storage selection chosen by the launching process rather than by settings. */
|
|
13
|
+
export interface ProcessStorageChoice {
|
|
14
|
+
readonly selection: StorageSelection;
|
|
15
|
+
readonly source: "cli" | "env";
|
|
16
|
+
readonly field: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Record this process's `--storage` or `--storage-file` selection, or clear it with `undefined`.
|
|
20
|
+
* A relative `--storage-file` path resolves against `cwd`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function setCliStorageSelection(argument: StorageFlagArgument | undefined, cwd?: string): void;
|
|
23
|
+
/** Check every set storage variable, whether or not any selection uses it. */
|
|
24
|
+
export declare function validateProcessStorage(agentDir: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* The process-level storage selection for one domain: `--storage`/`--storage-file`, then the domain
|
|
27
|
+
* variable or its legacy path variable, then `ATOMIC_STORAGE`. `undefined` leaves the choice to settings.
|
|
28
|
+
* Every set storage variable is validated, whichever one applies.
|
|
29
|
+
*/
|
|
30
|
+
export declare function selectProcessStorage(domain: StorageDomain, agentDir: string, cwd?: string): ProcessStorageChoice | undefined;
|
|
31
|
+
/** Whether the launching process selected this domain's storage, without validating the selection. */
|
|
32
|
+
export declare function hasProcessStorageSelection(domain: StorageDomain): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* The shared `storage` selection this process was launched with, as the `ATOMIC_STORAGE` value a child process it
|
|
35
|
+
* spawns should receive: `--storage`/`--storage-file`, then `ATOMIC_STORAGE`. `undefined` leaves the choice to
|
|
36
|
+
* settings. Validated when it was recorded or when this process started, not again here.
|
|
37
|
+
*/
|
|
38
|
+
export declare function processSharedStorageSelection(): string | undefined;
|
|
39
|
+
//# sourceMappingURL=process-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-selection.d.ts","sourceRoot":"","sources":["../../../src/core/storage/process-selection.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAC5C,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAC9D,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,yBAAyB,iCAAiC,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AACnD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AACzD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AACD,mFAAmF;AACnF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AA4DD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,EAAE,GAAG,SAAgB,GAAG,IAAI,CAe3G;AAqBD,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,GAAG,SAAgB,GACjB,oBAAoB,GAAG,SAAS,CA6BlC;AAED,sGAAsG;AACtG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAQzE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,GAAG,SAAS,CAGlE"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, join } from "node:path";
|
|
3
|
+
import { Value } from "typebox/value";
|
|
4
|
+
import { ENV_SESSION_DIR } from "../../config.js";
|
|
5
|
+
import { resolvePath } from "../../utils/paths.js";
|
|
6
|
+
import { SessionStorageSelectionSchema, StorageSelectionSchema } from "../settings-schema.js";
|
|
7
|
+
import { StorageConfigError, StoragePrefixError } from "./errors.js";
|
|
8
|
+
import { validateStoragePrefix } from "./prefix.js";
|
|
9
|
+
import { selectStorage } from "./selection.js";
|
|
10
|
+
export const STORAGE_ENV = "ATOMIC_STORAGE";
|
|
11
|
+
export const SESSIONS_STORAGE_ENV = "ATOMIC_SESSIONS_STORAGE";
|
|
12
|
+
export const WORKFLOWS_JOURNAL_ENV = "ATOMIC_WORKFLOWS_JOURNAL";
|
|
13
|
+
export const WORKFLOW_JOURNAL_PATH_ENV = "ATOMIC_WORKFLOW_JOURNAL_PATH";
|
|
14
|
+
// Process-wide, and shared by every loaded copy of this module, but never inherited by child processes.
|
|
15
|
+
const CLI_SELECTION = Symbol.for("@bastani/atomic/storage/cli-selection");
|
|
16
|
+
const registry = globalThis;
|
|
17
|
+
function environmentValue(name) {
|
|
18
|
+
const value = process.env[name];
|
|
19
|
+
return value === undefined || value.length === 0 ? undefined : value;
|
|
20
|
+
}
|
|
21
|
+
function parseSelection(text, schema, source, field) {
|
|
22
|
+
let value;
|
|
23
|
+
try {
|
|
24
|
+
value = JSON.parse(text);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new StorageConfigError(source, field, "invalid-json");
|
|
28
|
+
}
|
|
29
|
+
if (!Value.Check(schema, value))
|
|
30
|
+
throw new StorageConfigError(source, field, "invalid-selection");
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function choose(value, source, field, agentDir, defaultPath) {
|
|
34
|
+
const resolve = (path) => {
|
|
35
|
+
try {
|
|
36
|
+
return resolvePath(path, dirname(agentDir));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new StorageConfigError(source, field, "invalid-path");
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
if ("dir" in value)
|
|
43
|
+
return { selection: { kind: "jsonl", dir: resolve(value.dir) }, source, field };
|
|
44
|
+
try {
|
|
45
|
+
validateStoragePrefix(value.prefix);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error instanceof StoragePrefixError)
|
|
49
|
+
throw new StorageConfigError(source, field, "invalid-prefix");
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
const selection = selectStorage(value, source, field, defaultPath);
|
|
53
|
+
return {
|
|
54
|
+
selection: selection.kind === "sqlite" && !isAbsolute(selection.path)
|
|
55
|
+
? { ...selection, path: resolve(selection.path) }
|
|
56
|
+
: selection,
|
|
57
|
+
source,
|
|
58
|
+
field,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Record this process's `--storage` or `--storage-file` selection, or clear it with `undefined`.
|
|
63
|
+
* A relative `--storage-file` path resolves against `cwd`.
|
|
64
|
+
*/
|
|
65
|
+
export function setCliStorageSelection(argument, cwd = process.cwd()) {
|
|
66
|
+
delete registry[CLI_SELECTION];
|
|
67
|
+
if (argument === undefined)
|
|
68
|
+
return;
|
|
69
|
+
let text = argument.value;
|
|
70
|
+
if (argument.flag === "--storage-file") {
|
|
71
|
+
try {
|
|
72
|
+
text = readFileSync(resolvePath(argument.value, cwd), "utf8");
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new StorageConfigError("cli", argument.flag, "unreadable-file");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
registry[CLI_SELECTION] = {
|
|
79
|
+
field: argument.flag,
|
|
80
|
+
value: parseSelection(text, StorageSelectionSchema, "cli", argument.flag),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** Every set storage variable, parsed and checked even when another selection outranks it. */
|
|
84
|
+
function environmentChoices(agentDir) {
|
|
85
|
+
const domainDefault = join(dirname(agentDir), "workflows", "journal.sqlite");
|
|
86
|
+
const read = (field, schema, defaultPath) => {
|
|
87
|
+
const text = environmentValue(field);
|
|
88
|
+
if (text === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
return choose(parseSelection(text, schema, "env", field), "env", field, agentDir, defaultPath);
|
|
91
|
+
};
|
|
92
|
+
return {
|
|
93
|
+
sessions: read(SESSIONS_STORAGE_ENV, SessionStorageSelectionSchema, domainDefault),
|
|
94
|
+
journal: read(WORKFLOWS_JOURNAL_ENV, StorageSelectionSchema, domainDefault),
|
|
95
|
+
shared: read(STORAGE_ENV, StorageSelectionSchema, join(dirname(agentDir), "storage.sqlite")),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Check every set storage variable, whether or not any selection uses it. */
|
|
99
|
+
export function validateProcessStorage(agentDir) {
|
|
100
|
+
environmentChoices(agentDir);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The process-level storage selection for one domain: `--storage`/`--storage-file`, then the domain
|
|
104
|
+
* variable or its legacy path variable, then `ATOMIC_STORAGE`. `undefined` leaves the choice to settings.
|
|
105
|
+
* Every set storage variable is validated, whichever one applies.
|
|
106
|
+
*/
|
|
107
|
+
export function selectProcessStorage(domain, agentDir, cwd = process.cwd()) {
|
|
108
|
+
const legacyField = domain === "sessions" ? ENV_SESSION_DIR : WORKFLOW_JOURNAL_PATH_ENV;
|
|
109
|
+
const legacy = environmentValue(legacyField);
|
|
110
|
+
const environment = environmentChoices(agentDir);
|
|
111
|
+
const cli = registry[CLI_SELECTION];
|
|
112
|
+
if (cli !== undefined) {
|
|
113
|
+
if (legacy !== undefined) {
|
|
114
|
+
throw new StorageConfigError("cli", `${cli.field}, ${legacyField}`, "conflicting-overrides");
|
|
115
|
+
}
|
|
116
|
+
return choose(cli.value, "cli", cli.field, agentDir, join(dirname(agentDir), "storage.sqlite"));
|
|
117
|
+
}
|
|
118
|
+
const domainField = domain === "sessions" ? SESSIONS_STORAGE_ENV : WORKFLOWS_JOURNAL_ENV;
|
|
119
|
+
const domainChoice = domain === "sessions" ? environment.sessions : environment.journal;
|
|
120
|
+
if (domainChoice !== undefined) {
|
|
121
|
+
if (legacy !== undefined) {
|
|
122
|
+
throw new StorageConfigError("env", `${domainField}, ${legacyField}`, "conflicting-overrides");
|
|
123
|
+
}
|
|
124
|
+
return domainChoice;
|
|
125
|
+
}
|
|
126
|
+
if (legacy !== undefined) {
|
|
127
|
+
if (domain === "journal")
|
|
128
|
+
return { selection: { kind: "sqlite", path: legacy }, source: "env", field: legacyField };
|
|
129
|
+
try {
|
|
130
|
+
return { selection: { kind: "jsonl", dir: resolvePath(legacy, cwd) }, source: "env", field: legacyField };
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
throw new StorageConfigError("env", legacyField, "invalid-path");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return environment.shared;
|
|
137
|
+
}
|
|
138
|
+
/** Whether the launching process selected this domain's storage, without validating the selection. */
|
|
139
|
+
export function hasProcessStorageSelection(domain) {
|
|
140
|
+
return (registry[CLI_SELECTION] !== undefined ||
|
|
141
|
+
(domain === "sessions"
|
|
142
|
+
? [SESSIONS_STORAGE_ENV, ENV_SESSION_DIR, STORAGE_ENV]
|
|
143
|
+
: [WORKFLOWS_JOURNAL_ENV, WORKFLOW_JOURNAL_PATH_ENV, STORAGE_ENV]).some((name) => environmentValue(name) !== undefined));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The shared `storage` selection this process was launched with, as the `ATOMIC_STORAGE` value a child process it
|
|
147
|
+
* spawns should receive: `--storage`/`--storage-file`, then `ATOMIC_STORAGE`. `undefined` leaves the choice to
|
|
148
|
+
* settings. Validated when it was recorded or when this process started, not again here.
|
|
149
|
+
*/
|
|
150
|
+
export function processSharedStorageSelection() {
|
|
151
|
+
const cli = registry[CLI_SELECTION];
|
|
152
|
+
return cli === undefined ? environmentValue(STORAGE_ENV) : JSON.stringify(cli.value);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=process-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-selection.js","sourceRoot":"","sources":["../../../src/core/storage/process-selection.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport type { Static, TSchema } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport { ENV_SESSION_DIR } from \"../../config.js\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { SessionStorageSelectionSchema, StorageSelectionSchema } from \"../settings-schema.ts\";\nimport { StorageConfigError, StoragePrefixError } from \"./errors.js\";\nimport { validateStoragePrefix } from \"./prefix.js\";\nimport type { StorageSelection } from \"./provider.js\";\nimport { selectStorage } from \"./selection.js\";\n\nexport const STORAGE_ENV = \"ATOMIC_STORAGE\";\nexport const SESSIONS_STORAGE_ENV = \"ATOMIC_SESSIONS_STORAGE\";\nexport const WORKFLOWS_JOURNAL_ENV = \"ATOMIC_WORKFLOWS_JOURNAL\";\nexport const WORKFLOW_JOURNAL_PATH_ENV = \"ATOMIC_WORKFLOW_JOURNAL_PATH\";\n\nexport type StorageDomain = \"sessions\" | \"journal\";\nexport type StorageFlag = \"--storage\" | \"--storage-file\";\nexport interface StorageFlagArgument {\n\treadonly flag: StorageFlag;\n\treadonly value: string;\n}\n/** A storage selection chosen by the launching process rather than by settings. */\nexport interface ProcessStorageChoice {\n\treadonly selection: StorageSelection;\n\treadonly source: \"cli\" | \"env\";\n\treadonly field: string;\n}\n\ntype JsonValue = string | number | boolean | null | readonly JsonValue[] | { readonly [key: string]: JsonValue };\ntype SharedSelection = Static<typeof StorageSelectionSchema>;\ntype DomainSelection = Static<typeof SessionStorageSelectionSchema>;\n\n// Process-wide, and shared by every loaded copy of this module, but never inherited by child processes.\nconst CLI_SELECTION = Symbol.for(\"@bastani/atomic/storage/cli-selection\");\nconst registry: typeof globalThis & {\n\t[CLI_SELECTION]?: { readonly field: StorageFlag; readonly value: SharedSelection };\n} = globalThis;\n\nfunction environmentValue(name: string): string | undefined {\n\tconst value = process.env[name];\n\treturn value === undefined || value.length === 0 ? undefined : value;\n}\n\nfunction parseSelection<T extends TSchema>(text: string, schema: T, source: \"cli\" | \"env\", field: string): Static<T> {\n\tlet value: JsonValue;\n\ttry {\n\t\tvalue = JSON.parse(text);\n\t} catch {\n\t\tthrow new StorageConfigError(source, field, \"invalid-json\");\n\t}\n\tif (!Value.Check(schema, value)) throw new StorageConfigError(source, field, \"invalid-selection\");\n\treturn value;\n}\n\nfunction choose(\n\tvalue: DomainSelection,\n\tsource: \"cli\" | \"env\",\n\tfield: string,\n\tagentDir: string,\n\tdefaultPath: string,\n): ProcessStorageChoice {\n\tconst resolve = (path: string): string => {\n\t\ttry {\n\t\t\treturn resolvePath(path, dirname(agentDir));\n\t\t} catch {\n\t\t\tthrow new StorageConfigError(source, field, \"invalid-path\");\n\t\t}\n\t};\n\tif (\"dir\" in value) return { selection: { kind: \"jsonl\", dir: resolve(value.dir) }, source, field };\n\ttry {\n\t\tvalidateStoragePrefix(value.prefix);\n\t} catch (error) {\n\t\tif (error instanceof StoragePrefixError) throw new StorageConfigError(source, field, \"invalid-prefix\");\n\t\tthrow error;\n\t}\n\tconst selection = selectStorage(value, source, field, defaultPath);\n\treturn {\n\t\tselection:\n\t\t\tselection.kind === \"sqlite\" && !isAbsolute(selection.path)\n\t\t\t\t? { ...selection, path: resolve(selection.path) }\n\t\t\t\t: selection,\n\t\tsource,\n\t\tfield,\n\t};\n}\n\n/**\n * Record this process's `--storage` or `--storage-file` selection, or clear it with `undefined`.\n * A relative `--storage-file` path resolves against `cwd`.\n */\nexport function setCliStorageSelection(argument: StorageFlagArgument | undefined, cwd = process.cwd()): void {\n\tdelete registry[CLI_SELECTION];\n\tif (argument === undefined) return;\n\tlet text = argument.value;\n\tif (argument.flag === \"--storage-file\") {\n\t\ttry {\n\t\t\ttext = readFileSync(resolvePath(argument.value, cwd), \"utf8\");\n\t\t} catch {\n\t\t\tthrow new StorageConfigError(\"cli\", argument.flag, \"unreadable-file\");\n\t\t}\n\t}\n\tregistry[CLI_SELECTION] = {\n\t\tfield: argument.flag,\n\t\tvalue: parseSelection(text, StorageSelectionSchema, \"cli\", argument.flag),\n\t};\n}\n\n/** Every set storage variable, parsed and checked even when another selection outranks it. */\nfunction environmentChoices(agentDir: string) {\n\tconst domainDefault = join(dirname(agentDir), \"workflows\", \"journal.sqlite\");\n\tconst read = (\n\t\tfield: string,\n\t\tschema: typeof SessionStorageSelectionSchema | typeof StorageSelectionSchema,\n\t\tdefaultPath: string,\n\t): ProcessStorageChoice | undefined => {\n\t\tconst text = environmentValue(field);\n\t\tif (text === undefined) return undefined;\n\t\treturn choose(parseSelection(text, schema, \"env\", field), \"env\", field, agentDir, defaultPath);\n\t};\n\treturn {\n\t\tsessions: read(SESSIONS_STORAGE_ENV, SessionStorageSelectionSchema, domainDefault),\n\t\tjournal: read(WORKFLOWS_JOURNAL_ENV, StorageSelectionSchema, domainDefault),\n\t\tshared: read(STORAGE_ENV, StorageSelectionSchema, join(dirname(agentDir), \"storage.sqlite\")),\n\t};\n}\n\n/** Check every set storage variable, whether or not any selection uses it. */\nexport function validateProcessStorage(agentDir: string): void {\n\tenvironmentChoices(agentDir);\n}\n\n/**\n * The process-level storage selection for one domain: `--storage`/`--storage-file`, then the domain\n * variable or its legacy path variable, then `ATOMIC_STORAGE`. `undefined` leaves the choice to settings.\n * Every set storage variable is validated, whichever one applies.\n */\nexport function selectProcessStorage(\n\tdomain: StorageDomain,\n\tagentDir: string,\n\tcwd = process.cwd(),\n): ProcessStorageChoice | undefined {\n\tconst legacyField = domain === \"sessions\" ? ENV_SESSION_DIR : WORKFLOW_JOURNAL_PATH_ENV;\n\tconst legacy = environmentValue(legacyField);\n\tconst environment = environmentChoices(agentDir);\n\tconst cli = registry[CLI_SELECTION];\n\tif (cli !== undefined) {\n\t\tif (legacy !== undefined) {\n\t\t\tthrow new StorageConfigError(\"cli\", `${cli.field}, ${legacyField}`, \"conflicting-overrides\");\n\t\t}\n\t\treturn choose(cli.value, \"cli\", cli.field, agentDir, join(dirname(agentDir), \"storage.sqlite\"));\n\t}\n\tconst domainField = domain === \"sessions\" ? SESSIONS_STORAGE_ENV : WORKFLOWS_JOURNAL_ENV;\n\tconst domainChoice = domain === \"sessions\" ? environment.sessions : environment.journal;\n\tif (domainChoice !== undefined) {\n\t\tif (legacy !== undefined) {\n\t\t\tthrow new StorageConfigError(\"env\", `${domainField}, ${legacyField}`, \"conflicting-overrides\");\n\t\t}\n\t\treturn domainChoice;\n\t}\n\tif (legacy !== undefined) {\n\t\tif (domain === \"journal\")\n\t\t\treturn { selection: { kind: \"sqlite\", path: legacy }, source: \"env\", field: legacyField };\n\t\ttry {\n\t\t\treturn { selection: { kind: \"jsonl\", dir: resolvePath(legacy, cwd) }, source: \"env\", field: legacyField };\n\t\t} catch {\n\t\t\tthrow new StorageConfigError(\"env\", legacyField, \"invalid-path\");\n\t\t}\n\t}\n\treturn environment.shared;\n}\n\n/** Whether the launching process selected this domain's storage, without validating the selection. */\nexport function hasProcessStorageSelection(domain: StorageDomain): boolean {\n\treturn (\n\t\tregistry[CLI_SELECTION] !== undefined ||\n\t\t(domain === \"sessions\"\n\t\t\t? [SESSIONS_STORAGE_ENV, ENV_SESSION_DIR, STORAGE_ENV]\n\t\t\t: [WORKFLOWS_JOURNAL_ENV, WORKFLOW_JOURNAL_PATH_ENV, STORAGE_ENV]\n\t\t).some((name) => environmentValue(name) !== undefined)\n\t);\n}\n\n/**\n * The shared `storage` selection this process was launched with, as the `ATOMIC_STORAGE` value a child process it\n * spawns should receive: `--storage`/`--storage-file`, then `ATOMIC_STORAGE`. `undefined` leaves the choice to\n * settings. Validated when it was recorded or when this process started, not again here.\n */\nexport function processSharedStorageSelection(): string | undefined {\n\tconst cli = registry[CLI_SELECTION];\n\treturn cli === undefined ? environmentValue(STORAGE_ENV) : JSON.stringify(cli.value);\n}\n"]}
|
|
@@ -43,7 +43,8 @@ export type StorageSelection = {
|
|
|
43
43
|
};
|
|
44
44
|
export interface StorageOpenContext {
|
|
45
45
|
readonly agentDir: string;
|
|
46
|
-
|
|
46
|
+
/** `intercom`: the shared Intercom broker state that multi-node brokers open on the top-level selection. */
|
|
47
|
+
readonly domain: "sessions" | "journal" | "intercom";
|
|
47
48
|
readonly signal?: AbortSignal;
|
|
48
49
|
}
|
|
49
50
|
export interface StorageAdapterModule {
|
|
@@ -64,6 +65,10 @@ export interface JournalFactories {
|
|
|
64
65
|
}
|
|
65
66
|
export declare function storageSelectionKey(selection: StorageSelection, agentDir?: string): string;
|
|
66
67
|
export declare function loadStorageAdapter(module: string, context: StorageOpenContext): Promise<StorageAdapterModule>;
|
|
68
|
+
/** The adapter's options with every `secrets` reference resolved, as the provider passes them to its hooks. */
|
|
69
|
+
export declare function resolveAdapterOptions(selection: Extract<StorageSelection, {
|
|
70
|
+
kind: "adapter";
|
|
71
|
+
}>, context: StorageOpenContext): Promise<AdapterOptions>;
|
|
67
72
|
export interface StorageProvider {
|
|
68
73
|
openSessionStore(selection: StorageSelection, context: StorageOpenContext): Promise<SessionStore>;
|
|
69
74
|
openRunJournal(selection: StorageSelection, context: StorageOpenContext): Promise<RunJournal>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/core/storage/provider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAUpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;AAC7E,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAChB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7G,UAAU,CAAC;AACd,MAAM,MAAM,gBAAgB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1F;IACA,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AACL,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/core/storage/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,8 @@ export async function loadStorageAdapter(module, context) {
|
|
|
60
60
|
throw new StorageAdapterLoadError(module, cause);
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
/** The adapter's options with every `secrets` reference resolved, as the provider passes them to its hooks. */
|
|
64
|
+
export async function resolveAdapterOptions(selection, context) {
|
|
64
65
|
const options = { ...selection.options };
|
|
65
66
|
for (const [name, ref] of Object.entries(selection.secrets ?? {})) {
|
|
66
67
|
let value;
|
|
@@ -167,7 +168,7 @@ export const StorageProvider = class {
|
|
|
167
168
|
let openDatabase;
|
|
168
169
|
if (selection.kind === "adapter") {
|
|
169
170
|
const adapter = await loadStorageAdapter(selection.module, context);
|
|
170
|
-
const options = await
|
|
171
|
+
const options = await resolveAdapterOptions(selection, context);
|
|
171
172
|
try {
|
|
172
173
|
const direct = factories.direct(adapter, options, { prefix: selection.prefix });
|
|
173
174
|
if (direct !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/core/storage/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createJiti } from \"jiti\";\nimport { createSessionCwdMatcher } from \"../../utils/canonical-path.ts\";\nimport type { SqliteDatabase, SqliteValue, StorageDescriptor } from \"./database.js\";\nimport {\n\tStorageAdapterLoadError,\n\tStorageConfigError,\n\tStorageError,\n\ttype StorageFailureCause,\n\tStorageUnavailableError,\n} from \"./errors.js\";\nimport { openNodeSqliteDatabase } from \"./node-sqlite.js\";\nimport { validateStoragePrefix } from \"./prefix.js\";\nimport type { RunJournal } from \"./run-journal.js\";\nimport { selectStorage } from \"./selection.js\";\nimport type { SessionStore } from \"./session/types.js\";\n\nexport type SecretRef = { readonly env: string } | { readonly file: string };\nexport type AdapterOptions = Readonly<Record<string, SqliteValue | boolean>>;\nexport type RunJournalOption =\n\t| { path: string; prefix?: string }\n\t| { database: SqliteDatabase; prefix?: string }\n\t| { memory: true }\n\t| { adapter: string; options?: AdapterOptions; secrets?: Readonly<Record<string, SecretRef>>; prefix?: string }\n\t| RunJournal;\nexport type StorageSelection =\n\t| { readonly kind: \"memory\" }\n\t| { readonly kind: \"jsonl\"; readonly dir: string }\n\t| { readonly kind: \"sqlite\"; readonly path: string; readonly prefix?: string }\n\t| { readonly kind: \"database\"; readonly database: SqliteDatabase; readonly prefix?: string }\n\t| {\n\t\t\treadonly kind: \"adapter\";\n\t\t\treadonly module: string;\n\t\t\treadonly options?: AdapterOptions;\n\t\t\treadonly secrets?: Readonly<Record<string, SecretRef>>;\n\t\t\treadonly prefix?: string;\n\t };\nexport interface StorageOpenContext {\n\treadonly agentDir: string;\n\treadonly domain: \"sessions\" | \"journal\";\n\treadonly signal?: AbortSignal;\n}\nexport interface StorageAdapterModule {\n\treadonly atomicStorageAdapter: 1;\n\topenDatabase?(options: AdapterOptions, context: StorageOpenContext): Promise<SqliteDatabase>;\n\topenSessionStore?(\n\t\toptions: AdapterOptions,\n\t\tcontext: StorageOpenContext,\n\t\tstorage: { readonly prefix?: string },\n\t): Promise<SessionStore>;\n\topenRunJournal?(\n\t\toptions: AdapterOptions,\n\t\tcontext: StorageOpenContext,\n\t\tstorage: { readonly prefix?: string },\n\t): Promise<RunJournal>;\n}\nexport interface JournalFactories {\n\tmemory(descriptor: StorageDescriptor): RunJournal;\n\tsql(database: SqliteDatabase, options: { readonly prefix?: string }): Promise<RunJournal>;\n}\n\nconst databaseIds = new WeakMap<SqliteDatabase, number>();\nlet nextDatabaseId = 0;\n\nfunction storageOptionKey(\n\tvalue: SqliteValue | boolean,\n): readonly [string, string | boolean | readonly number[] | null] {\n\tif (value instanceof Uint8Array) return [\"bytes\", Array.from(value)];\n\tif (value === null) return [\"null\", null];\n\tif (typeof value === \"number\") return [\"number\", Object.is(value, -0) ? \"-0\" : String(value)];\n\tif (typeof value === \"bigint\") return [\"bigint\", String(value)];\n\treturn [typeof value, value];\n}\n\nexport function storageSelectionKey(selection: StorageSelection, agentDir?: string): string {\n\tif (selection.kind === \"database\") {\n\t\tlet id = databaseIds.get(selection.database);\n\t\tif (id === undefined) {\n\t\t\tid = ++nextDatabaseId;\n\t\t\tdatabaseIds.set(selection.database, id);\n\t\t}\n\t\treturn JSON.stringify([\"database\", id, selection.prefix ?? \"\"]);\n\t}\n\tif (selection.kind === \"sqlite\") {\n\t\tconst path = selection.path === \"\" || selection.path === \":memory:\" ? selection.path : resolve(selection.path);\n\t\treturn JSON.stringify([\"sqlite\", path, selection.prefix ?? \"\"]);\n\t}\n\tif (selection.kind === \"adapter\") {\n\t\tconst options = Object.entries(selection.options ?? {})\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t.map(([name, value]) => [name, storageOptionKey(value)]);\n\t\tconst secrets = Object.entries(selection.secrets ?? {}).sort(([a], [b]) => a.localeCompare(b));\n\t\treturn JSON.stringify([\"adapter\", agentDir, selection.module, options, secrets, selection.prefix ?? \"\"]);\n\t}\n\treturn JSON.stringify(selection);\n}\n\nexport async function loadStorageAdapter(module: string, context: StorageOpenContext): Promise<StorageAdapterModule> {\n\ttry {\n\t\tconst loader = createJiti(pathToFileURL(join(context.agentDir, \"storage-adapter.js\")).href, {\n\t\t\tinteropDefault: true,\n\t\t});\n\t\tconst adapter = await loader.import<StorageAdapterModule>(module, { default: true });\n\t\tif (\n\t\t\tadapter === null ||\n\t\t\ttypeof adapter !== \"object\" ||\n\t\t\tadapter.atomicStorageAdapter !== 1 ||\n\t\t\t[adapter.openDatabase, adapter.openSessionStore, adapter.openRunJournal].some(\n\t\t\t\t(hook) => hook !== undefined && typeof hook !== \"function\",\n\t\t\t)\n\t\t) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"adapter\", \"invalid-module-contract\");\n\t\t}\n\t\treturn adapter;\n\t} catch (cause) {\n\t\tthrow new StorageAdapterLoadError(module, cause as StorageFailureCause);\n\t}\n}\n\nasync function adapterOptions(\n\tselection: Extract<StorageSelection, { kind: \"adapter\" }>,\n\tcontext: StorageOpenContext,\n): Promise<AdapterOptions> {\n\tconst options = { ...selection.options };\n\tfor (const [name, ref] of Object.entries(selection.secrets ?? {})) {\n\t\tlet value: string;\n\t\tif (\"env\" in ref) {\n\t\t\tconst environment = process.env[ref.env];\n\t\t\tif (environment === undefined) throw new StorageConfigError(\"sdk\", `secrets.${name}`, \"secret-env-missing\");\n\t\t\tvalue = environment;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tvalue = await readFile(isAbsolute(ref.file) ? ref.file : join(dirname(context.agentDir), ref.file), \"utf8\");\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new StorageUnavailableError(\n\t\t\t\t\t{ adapter: selection.module, location: ref.file },\n\t\t\t\t\tcause as StorageFailureCause,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tObject.defineProperty(options, name, { value, enumerable: true, writable: true, configurable: true });\n\t}\n\treturn options;\n}\n\nfunction withIdempotentClose<T extends { close(): Promise<void> }>(store: T, release?: () => Promise<void>): T {\n\tconst close = store.close.bind(store);\n\tlet closing: Promise<void> | undefined;\n\tstore.close = () => {\n\t\tclosing ??= (async () => {\n\t\t\ttry {\n\t\t\t\tawait close();\n\t\t\t} finally {\n\t\t\t\tawait release?.();\n\t\t\t}\n\t\t})();\n\t\treturn closing;\n\t};\n\treturn store;\n}\n\ninterface SharedDatabase {\n\treadonly ready: Promise<SqliteDatabase>;\n\treferences: number;\n}\n\nconst sharedDatabases = new Map<string, SharedDatabase>();\n\nexport interface StorageProvider {\n\topenSessionStore(selection: StorageSelection, context: StorageOpenContext): Promise<SessionStore>;\n\topenRunJournal(selection: StorageSelection, context: StorageOpenContext): Promise<RunJournal>;\n}\n\nexport const StorageProvider: new (journals?: JournalFactories) => StorageProvider = class {\n\tprivate readonly journals?: JournalFactories;\n\tprivate readonly databases = sharedDatabases;\n\n\tconstructor(journals?: JournalFactories) {\n\t\tthis.journals = journals;\n\t}\n\n\tasync openSessionStore(selection: StorageSelection, context: StorageOpenContext): Promise<SessionStore> {\n\t\treturn this.open<SessionStore>(selection, context, {\n\t\t\tmemory: async () =>\n\t\t\t\tnew (await import(\"./session/memory-session-store.js\")).MemorySessionStore(createSessionCwdMatcher),\n\t\t\tjsonl: async (dir) =>\n\t\t\t\t(await import(\"./session/jsonl-session-store.js\")).JsonlSessionStore.open(dir, { exactDirectory: true }),\n\t\t\tdirect: (adapter, options, storage) => adapter.openSessionStore?.(options, context, storage),\n\t\t\tsql: async (database, options) =>\n\t\t\t\t(await import(\"./session/sql-session-store.js\")).SqlSessionStore.open(database, {\n\t\t\t\t\t...options,\n\t\t\t\t\tcwdMatcher: createSessionCwdMatcher,\n\t\t\t\t}),\n\t\t});\n\t}\n\n\tasync openRunJournal(selection: StorageSelection, context: StorageOpenContext): Promise<RunJournal> {\n\t\tconst journals = this.journals;\n\t\tif (!journals) throw new StorageConfigError(\"sdk\", \"journal\", \"adapter-domain-unsupported\");\n\t\treturn this.open<RunJournal>(selection, context, {\n\t\t\tmemory: () => journals.memory({ adapter: \"memory\", location: \":memory:\" }),\n\t\t\tdirect: (adapter, options, storage) => adapter.openRunJournal?.(options, context, storage),\n\t\t\tsql: async (database, options) => {\n\t\t\t\tconst journal = await journals.sql(database, options);\n\t\t\t\tconst createRun = journal.createRun.bind(journal);\n\t\t\t\tjournal.createRun = (header) => createRun({ ...header, storage: { ...database.descriptor } });\n\t\t\t\treturn journal;\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate async open<T extends { close(): Promise<void> }>(\n\t\tselection: StorageSelection,\n\t\tcontext: StorageOpenContext,\n\t\tfactories: {\n\t\t\tmemory(): T | Promise<T>;\n\t\t\tjsonl?(dir: string): Promise<T>;\n\t\t\tdirect(\n\t\t\t\tadapter: StorageAdapterModule,\n\t\t\t\toptions: AdapterOptions,\n\t\t\t\tstorage: { readonly prefix?: string },\n\t\t\t): Promise<T> | undefined;\n\t\t\tsql(database: SqliteDatabase, options: { readonly prefix?: string }): Promise<T>;\n\t\t},\n\t): Promise<T> {\n\t\tif (selection === null || typeof selection !== \"object\" || Array.isArray(selection)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"selection-object-required\");\n\t\t}\n\t\tif (![\"memory\", \"jsonl\", \"sqlite\", \"database\", \"adapter\"].includes(selection.kind)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"invalid-kind\");\n\t\t}\n\t\tconst selector = { memory: undefined, jsonl: \"dir\", sqlite: \"path\", database: \"database\", adapter: \"module\" }[\n\t\t\tselection.kind\n\t\t];\n\t\tif (\n\t\t\t[\"path\", \"dir\", \"database\", \"module\", \"memory\", \"adapter\"].some((key) => key in selection && key !== selector)\n\t\t) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"multiple-selection-forms\");\n\t\t}\n\t\tif (selection.kind === \"sqlite\" && typeof selection.path !== \"string\") {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"invalid-path\");\n\t\t}\n\t\tif (selection.kind === \"adapter\" && (typeof selection.module !== \"string\" || selection.module.length === 0)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"invalid-adapter\");\n\t\t}\n\t\tif (selection.kind === \"database\" && !(\"database\" in selection)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"async-database-required\");\n\t\t}\n\t\tif (selection.kind === \"sqlite\" || selection.kind === \"database\" || selection.kind === \"adapter\") {\n\t\t\tselectStorage(\n\t\t\t\tselection.kind === \"adapter\" ? { ...selection, adapter: selection.module } : selection,\n\t\t\t\t\"sdk\",\n\t\t\t\t\"storage\",\n\t\t\t\t\"\",\n\t\t\t);\n\t\t}\n\t\tif (selection.kind === \"memory\") return withIdempotentClose(await factories.memory());\n\t\tif (selection.kind === \"jsonl\") {\n\t\t\tif (typeof selection.dir !== \"string\") throw new StorageConfigError(\"sdk\", \"dir\", \"invalid-dir\");\n\t\t\tif (factories.jsonl) return withIdempotentClose(await factories.jsonl(selection.dir));\n\t\t\tthrow new StorageConfigError(\"sdk\", \"dir\", \"adapter-domain-unsupported\");\n\t\t}\n\t\tvalidateStoragePrefix(selection.prefix);\n\t\tlet openDatabase: () => Promise<SqliteDatabase>;\n\t\tif (selection.kind === \"adapter\") {\n\t\t\tconst adapter = await loadStorageAdapter(selection.module, context);\n\t\t\tconst options = await adapterOptions(selection, context);\n\t\t\ttry {\n\t\t\t\tconst direct = factories.direct(adapter, options, { prefix: selection.prefix });\n\t\t\t\tif (direct !== undefined) return withIdempotentClose(await direct);\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof StorageError) throw cause;\n\t\t\t\tthrow new StorageUnavailableError(\n\t\t\t\t\t{ adapter: selection.module, location: selection.module },\n\t\t\t\t\tcause as StorageFailureCause,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!adapter.openDatabase) throw new StorageConfigError(\"sdk\", \"adapter\", \"adapter-domain-unsupported\");\n\t\t\tconst hook = adapter.openDatabase.bind(adapter);\n\t\t\topenDatabase = async () => {\n\t\t\t\ttry {\n\t\t\t\t\treturn await hook(options, context);\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tif (cause instanceof StorageError) throw cause;\n\t\t\t\t\tthrow new StorageUnavailableError(\n\t\t\t\t\t\t{ adapter: selection.module, location: selection.module },\n\t\t\t\t\t\tcause as StorageFailureCause,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t} else if (selection.kind === \"database\") {\n\t\t\treturn withIdempotentClose(await factories.sql(selection.database, { prefix: selection.prefix }));\n\t\t} else {\n\t\t\topenDatabase = () => openNodeSqliteDatabase(selection.path);\n\t\t}\n\t\tconst key = storageSelectionKey({ ...selection, prefix: undefined }, context.agentDir);\n\t\tlet shared = this.databases.get(key);\n\t\tif (!shared) {\n\t\t\tshared = { ready: openDatabase(), references: 0 };\n\t\t\tthis.databases.set(key, shared);\n\t\t}\n\t\tshared.references++;\n\t\tconst entry = shared;\n\t\tlet database: SqliteDatabase;\n\t\ttry {\n\t\t\tdatabase = await entry.ready;\n\t\t} catch (cause) {\n\t\t\tif (this.databases.get(key) === entry) this.databases.delete(key);\n\t\t\tthrow cause;\n\t\t}\n\t\tconst release = async () => {\n\t\t\tif (--entry.references === 0) {\n\t\t\t\tif (this.databases.get(key) === entry) this.databases.delete(key);\n\t\t\t\tawait database.close();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\treturn withIdempotentClose(await factories.sql(database, { prefix: selection.prefix }), release);\n\t\t} catch (cause) {\n\t\t\ttry {\n\t\t\t\tawait release();\n\t\t\t} catch (cleanupCause) {\n\t\t\t\tconst openingError =\n\t\t\t\t\tcause instanceof Error\n\t\t\t\t\t\t? cause\n\t\t\t\t\t\t: new StorageUnavailableError(database.descriptor, cause as StorageFailureCause);\n\t\t\t\tObject.defineProperty(openingError, \"cleanupCause\", { value: cleanupCause, configurable: true });\n\t\t\t\tthrow openingError;\n\t\t\t}\n\t\t\tthrow cause;\n\t\t}\n\t}\n};\n"]}
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/core/storage/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createJiti } from \"jiti\";\nimport { createSessionCwdMatcher } from \"../../utils/canonical-path.ts\";\nimport type { SqliteDatabase, SqliteValue, StorageDescriptor } from \"./database.js\";\nimport {\n\tStorageAdapterLoadError,\n\tStorageConfigError,\n\tStorageError,\n\ttype StorageFailureCause,\n\tStorageUnavailableError,\n} from \"./errors.js\";\nimport { openNodeSqliteDatabase } from \"./node-sqlite.js\";\nimport { validateStoragePrefix } from \"./prefix.js\";\nimport type { RunJournal } from \"./run-journal.js\";\nimport { selectStorage } from \"./selection.js\";\nimport type { SessionStore } from \"./session/types.js\";\n\nexport type SecretRef = { readonly env: string } | { readonly file: string };\nexport type AdapterOptions = Readonly<Record<string, SqliteValue | boolean>>;\nexport type RunJournalOption =\n\t| { path: string; prefix?: string }\n\t| { database: SqliteDatabase; prefix?: string }\n\t| { memory: true }\n\t| { adapter: string; options?: AdapterOptions; secrets?: Readonly<Record<string, SecretRef>>; prefix?: string }\n\t| RunJournal;\nexport type StorageSelection =\n\t| { readonly kind: \"memory\" }\n\t| { readonly kind: \"jsonl\"; readonly dir: string }\n\t| { readonly kind: \"sqlite\"; readonly path: string; readonly prefix?: string }\n\t| { readonly kind: \"database\"; readonly database: SqliteDatabase; readonly prefix?: string }\n\t| {\n\t\t\treadonly kind: \"adapter\";\n\t\t\treadonly module: string;\n\t\t\treadonly options?: AdapterOptions;\n\t\t\treadonly secrets?: Readonly<Record<string, SecretRef>>;\n\t\t\treadonly prefix?: string;\n\t };\nexport interface StorageOpenContext {\n\treadonly agentDir: string;\n\t/** `intercom`: the shared Intercom broker state that multi-node brokers open on the top-level selection. */\n\treadonly domain: \"sessions\" | \"journal\" | \"intercom\";\n\treadonly signal?: AbortSignal;\n}\nexport interface StorageAdapterModule {\n\treadonly atomicStorageAdapter: 1;\n\topenDatabase?(options: AdapterOptions, context: StorageOpenContext): Promise<SqliteDatabase>;\n\topenSessionStore?(\n\t\toptions: AdapterOptions,\n\t\tcontext: StorageOpenContext,\n\t\tstorage: { readonly prefix?: string },\n\t): Promise<SessionStore>;\n\topenRunJournal?(\n\t\toptions: AdapterOptions,\n\t\tcontext: StorageOpenContext,\n\t\tstorage: { readonly prefix?: string },\n\t): Promise<RunJournal>;\n}\nexport interface JournalFactories {\n\tmemory(descriptor: StorageDescriptor): RunJournal;\n\tsql(database: SqliteDatabase, options: { readonly prefix?: string }): Promise<RunJournal>;\n}\n\nconst databaseIds = new WeakMap<SqliteDatabase, number>();\nlet nextDatabaseId = 0;\n\nfunction storageOptionKey(\n\tvalue: SqliteValue | boolean,\n): readonly [string, string | boolean | readonly number[] | null] {\n\tif (value instanceof Uint8Array) return [\"bytes\", Array.from(value)];\n\tif (value === null) return [\"null\", null];\n\tif (typeof value === \"number\") return [\"number\", Object.is(value, -0) ? \"-0\" : String(value)];\n\tif (typeof value === \"bigint\") return [\"bigint\", String(value)];\n\treturn [typeof value, value];\n}\n\nexport function storageSelectionKey(selection: StorageSelection, agentDir?: string): string {\n\tif (selection.kind === \"database\") {\n\t\tlet id = databaseIds.get(selection.database);\n\t\tif (id === undefined) {\n\t\t\tid = ++nextDatabaseId;\n\t\t\tdatabaseIds.set(selection.database, id);\n\t\t}\n\t\treturn JSON.stringify([\"database\", id, selection.prefix ?? \"\"]);\n\t}\n\tif (selection.kind === \"sqlite\") {\n\t\tconst path = selection.path === \"\" || selection.path === \":memory:\" ? selection.path : resolve(selection.path);\n\t\treturn JSON.stringify([\"sqlite\", path, selection.prefix ?? \"\"]);\n\t}\n\tif (selection.kind === \"adapter\") {\n\t\tconst options = Object.entries(selection.options ?? {})\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t.map(([name, value]) => [name, storageOptionKey(value)]);\n\t\tconst secrets = Object.entries(selection.secrets ?? {}).sort(([a], [b]) => a.localeCompare(b));\n\t\treturn JSON.stringify([\"adapter\", agentDir, selection.module, options, secrets, selection.prefix ?? \"\"]);\n\t}\n\treturn JSON.stringify(selection);\n}\n\nexport async function loadStorageAdapter(module: string, context: StorageOpenContext): Promise<StorageAdapterModule> {\n\ttry {\n\t\tconst loader = createJiti(pathToFileURL(join(context.agentDir, \"storage-adapter.js\")).href, {\n\t\t\tinteropDefault: true,\n\t\t});\n\t\tconst adapter = await loader.import<StorageAdapterModule>(module, { default: true });\n\t\tif (\n\t\t\tadapter === null ||\n\t\t\ttypeof adapter !== \"object\" ||\n\t\t\tadapter.atomicStorageAdapter !== 1 ||\n\t\t\t[adapter.openDatabase, adapter.openSessionStore, adapter.openRunJournal].some(\n\t\t\t\t(hook) => hook !== undefined && typeof hook !== \"function\",\n\t\t\t)\n\t\t) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"adapter\", \"invalid-module-contract\");\n\t\t}\n\t\treturn adapter;\n\t} catch (cause) {\n\t\tthrow new StorageAdapterLoadError(module, cause as StorageFailureCause);\n\t}\n}\n\n/** The adapter's options with every `secrets` reference resolved, as the provider passes them to its hooks. */\nexport async function resolveAdapterOptions(\n\tselection: Extract<StorageSelection, { kind: \"adapter\" }>,\n\tcontext: StorageOpenContext,\n): Promise<AdapterOptions> {\n\tconst options = { ...selection.options };\n\tfor (const [name, ref] of Object.entries(selection.secrets ?? {})) {\n\t\tlet value: string;\n\t\tif (\"env\" in ref) {\n\t\t\tconst environment = process.env[ref.env];\n\t\t\tif (environment === undefined) throw new StorageConfigError(\"sdk\", `secrets.${name}`, \"secret-env-missing\");\n\t\t\tvalue = environment;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tvalue = await readFile(isAbsolute(ref.file) ? ref.file : join(dirname(context.agentDir), ref.file), \"utf8\");\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new StorageUnavailableError(\n\t\t\t\t\t{ adapter: selection.module, location: ref.file },\n\t\t\t\t\tcause as StorageFailureCause,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tObject.defineProperty(options, name, { value, enumerable: true, writable: true, configurable: true });\n\t}\n\treturn options;\n}\n\nfunction withIdempotentClose<T extends { close(): Promise<void> }>(store: T, release?: () => Promise<void>): T {\n\tconst close = store.close.bind(store);\n\tlet closing: Promise<void> | undefined;\n\tstore.close = () => {\n\t\tclosing ??= (async () => {\n\t\t\ttry {\n\t\t\t\tawait close();\n\t\t\t} finally {\n\t\t\t\tawait release?.();\n\t\t\t}\n\t\t})();\n\t\treturn closing;\n\t};\n\treturn store;\n}\n\ninterface SharedDatabase {\n\treadonly ready: Promise<SqliteDatabase>;\n\treferences: number;\n}\n\nconst sharedDatabases = new Map<string, SharedDatabase>();\n\nexport interface StorageProvider {\n\topenSessionStore(selection: StorageSelection, context: StorageOpenContext): Promise<SessionStore>;\n\topenRunJournal(selection: StorageSelection, context: StorageOpenContext): Promise<RunJournal>;\n}\n\nexport const StorageProvider: new (journals?: JournalFactories) => StorageProvider = class {\n\tprivate readonly journals?: JournalFactories;\n\tprivate readonly databases = sharedDatabases;\n\n\tconstructor(journals?: JournalFactories) {\n\t\tthis.journals = journals;\n\t}\n\n\tasync openSessionStore(selection: StorageSelection, context: StorageOpenContext): Promise<SessionStore> {\n\t\treturn this.open<SessionStore>(selection, context, {\n\t\t\tmemory: async () =>\n\t\t\t\tnew (await import(\"./session/memory-session-store.js\")).MemorySessionStore(createSessionCwdMatcher),\n\t\t\tjsonl: async (dir) =>\n\t\t\t\t(await import(\"./session/jsonl-session-store.js\")).JsonlSessionStore.open(dir, { exactDirectory: true }),\n\t\t\tdirect: (adapter, options, storage) => adapter.openSessionStore?.(options, context, storage),\n\t\t\tsql: async (database, options) =>\n\t\t\t\t(await import(\"./session/sql-session-store.js\")).SqlSessionStore.open(database, {\n\t\t\t\t\t...options,\n\t\t\t\t\tcwdMatcher: createSessionCwdMatcher,\n\t\t\t\t}),\n\t\t});\n\t}\n\n\tasync openRunJournal(selection: StorageSelection, context: StorageOpenContext): Promise<RunJournal> {\n\t\tconst journals = this.journals;\n\t\tif (!journals) throw new StorageConfigError(\"sdk\", \"journal\", \"adapter-domain-unsupported\");\n\t\treturn this.open<RunJournal>(selection, context, {\n\t\t\tmemory: () => journals.memory({ adapter: \"memory\", location: \":memory:\" }),\n\t\t\tdirect: (adapter, options, storage) => adapter.openRunJournal?.(options, context, storage),\n\t\t\tsql: async (database, options) => {\n\t\t\t\tconst journal = await journals.sql(database, options);\n\t\t\t\tconst createRun = journal.createRun.bind(journal);\n\t\t\t\tjournal.createRun = (header) => createRun({ ...header, storage: { ...database.descriptor } });\n\t\t\t\treturn journal;\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate async open<T extends { close(): Promise<void> }>(\n\t\tselection: StorageSelection,\n\t\tcontext: StorageOpenContext,\n\t\tfactories: {\n\t\t\tmemory(): T | Promise<T>;\n\t\t\tjsonl?(dir: string): Promise<T>;\n\t\t\tdirect(\n\t\t\t\tadapter: StorageAdapterModule,\n\t\t\t\toptions: AdapterOptions,\n\t\t\t\tstorage: { readonly prefix?: string },\n\t\t\t): Promise<T> | undefined;\n\t\t\tsql(database: SqliteDatabase, options: { readonly prefix?: string }): Promise<T>;\n\t\t},\n\t): Promise<T> {\n\t\tif (selection === null || typeof selection !== \"object\" || Array.isArray(selection)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"selection-object-required\");\n\t\t}\n\t\tif (![\"memory\", \"jsonl\", \"sqlite\", \"database\", \"adapter\"].includes(selection.kind)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"invalid-kind\");\n\t\t}\n\t\tconst selector = { memory: undefined, jsonl: \"dir\", sqlite: \"path\", database: \"database\", adapter: \"module\" }[\n\t\t\tselection.kind\n\t\t];\n\t\tif (\n\t\t\t[\"path\", \"dir\", \"database\", \"module\", \"memory\", \"adapter\"].some((key) => key in selection && key !== selector)\n\t\t) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"multiple-selection-forms\");\n\t\t}\n\t\tif (selection.kind === \"sqlite\" && typeof selection.path !== \"string\") {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"invalid-path\");\n\t\t}\n\t\tif (selection.kind === \"adapter\" && (typeof selection.module !== \"string\" || selection.module.length === 0)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"invalid-adapter\");\n\t\t}\n\t\tif (selection.kind === \"database\" && !(\"database\" in selection)) {\n\t\t\tthrow new StorageConfigError(\"sdk\", \"storage\", \"async-database-required\");\n\t\t}\n\t\tif (selection.kind === \"sqlite\" || selection.kind === \"database\" || selection.kind === \"adapter\") {\n\t\t\tselectStorage(\n\t\t\t\tselection.kind === \"adapter\" ? { ...selection, adapter: selection.module } : selection,\n\t\t\t\t\"sdk\",\n\t\t\t\t\"storage\",\n\t\t\t\t\"\",\n\t\t\t);\n\t\t}\n\t\tif (selection.kind === \"memory\") return withIdempotentClose(await factories.memory());\n\t\tif (selection.kind === \"jsonl\") {\n\t\t\tif (typeof selection.dir !== \"string\") throw new StorageConfigError(\"sdk\", \"dir\", \"invalid-dir\");\n\t\t\tif (factories.jsonl) return withIdempotentClose(await factories.jsonl(selection.dir));\n\t\t\tthrow new StorageConfigError(\"sdk\", \"dir\", \"adapter-domain-unsupported\");\n\t\t}\n\t\tvalidateStoragePrefix(selection.prefix);\n\t\tlet openDatabase: () => Promise<SqliteDatabase>;\n\t\tif (selection.kind === \"adapter\") {\n\t\t\tconst adapter = await loadStorageAdapter(selection.module, context);\n\t\t\tconst options = await resolveAdapterOptions(selection, context);\n\t\t\ttry {\n\t\t\t\tconst direct = factories.direct(adapter, options, { prefix: selection.prefix });\n\t\t\t\tif (direct !== undefined) return withIdempotentClose(await direct);\n\t\t\t} catch (cause) {\n\t\t\t\tif (cause instanceof StorageError) throw cause;\n\t\t\t\tthrow new StorageUnavailableError(\n\t\t\t\t\t{ adapter: selection.module, location: selection.module },\n\t\t\t\t\tcause as StorageFailureCause,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!adapter.openDatabase) throw new StorageConfigError(\"sdk\", \"adapter\", \"adapter-domain-unsupported\");\n\t\t\tconst hook = adapter.openDatabase.bind(adapter);\n\t\t\topenDatabase = async () => {\n\t\t\t\ttry {\n\t\t\t\t\treturn await hook(options, context);\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tif (cause instanceof StorageError) throw cause;\n\t\t\t\t\tthrow new StorageUnavailableError(\n\t\t\t\t\t\t{ adapter: selection.module, location: selection.module },\n\t\t\t\t\t\tcause as StorageFailureCause,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t} else if (selection.kind === \"database\") {\n\t\t\treturn withIdempotentClose(await factories.sql(selection.database, { prefix: selection.prefix }));\n\t\t} else {\n\t\t\topenDatabase = () => openNodeSqliteDatabase(selection.path);\n\t\t}\n\t\tconst key = storageSelectionKey({ ...selection, prefix: undefined }, context.agentDir);\n\t\tlet shared = this.databases.get(key);\n\t\tif (!shared) {\n\t\t\tshared = { ready: openDatabase(), references: 0 };\n\t\t\tthis.databases.set(key, shared);\n\t\t}\n\t\tshared.references++;\n\t\tconst entry = shared;\n\t\tlet database: SqliteDatabase;\n\t\ttry {\n\t\t\tdatabase = await entry.ready;\n\t\t} catch (cause) {\n\t\t\tif (this.databases.get(key) === entry) this.databases.delete(key);\n\t\t\tthrow cause;\n\t\t}\n\t\tconst release = async () => {\n\t\t\tif (--entry.references === 0) {\n\t\t\t\tif (this.databases.get(key) === entry) this.databases.delete(key);\n\t\t\t\tawait database.close();\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\treturn withIdempotentClose(await factories.sql(database, { prefix: selection.prefix }), release);\n\t\t} catch (cause) {\n\t\t\ttry {\n\t\t\t\tawait release();\n\t\t\t} catch (cleanupCause) {\n\t\t\t\tconst openingError =\n\t\t\t\t\tcause instanceof Error\n\t\t\t\t\t\t? cause\n\t\t\t\t\t\t: new StorageUnavailableError(database.descriptor, cause as StorageFailureCause);\n\t\t\t\tObject.defineProperty(openingError, \"cleanupCause\", { value: cleanupCause, configurable: true });\n\t\t\t\tthrow openingError;\n\t\t\t}\n\t\t\tthrow cause;\n\t\t}\n\t}\n};\n"]}
|
|
@@ -12,5 +12,5 @@ export type StorageInputSelection = StorageSettingsSelection | {
|
|
|
12
12
|
readonly database: SqliteDatabase;
|
|
13
13
|
readonly prefix?: string;
|
|
14
14
|
};
|
|
15
|
-
export declare function selectStorage(value: StorageInputSelection, source: "sdk" | "settings", field: string, defaultPath: string): StorageSelection;
|
|
15
|
+
export declare function selectStorage(value: StorageInputSelection, source: "sdk" | "settings" | "env" | "cli", field: string, defaultPath: string): StorageSelection;
|
|
16
16
|
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/core/storage/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjF,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,qBAAqB,GAC9B,wBAAwB,GACxB;IAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,wBAAgB,aAAa,CAC5B,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,KAAK,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/core/storage/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjF,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,qBAAqB,GAC9B,wBAAwB,GACxB;IAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,wBAAgB,aAAa,CAC5B,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,EAC1C,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GACjB,gBAAgB,CA0ElB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/core/storage/selection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAejD,MAAM,UAAU,aAAa,CAC5B,KAA4B,EAC5B,
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/core/storage/selection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAejD,MAAM,UAAU,aAAa,CAC5B,KAA4B,EAC5B,MAA0C,EAC1C,KAAa,EACb,WAAmB;IAEnB,MAAM,OAAO,GAAG,CAAC,MAAc,EAAS,EAAE;QACzC,MAAM,IAAI,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC,CAAC;IACF,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACrH,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACjE,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QACtF,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;QACtF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACjE,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;QACtF,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACjF,IAAI,SAAS,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YAC1F,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC1G,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC1B,IACC,EAAE,KAAK,IAAI;YACX,OAAO,EAAE,KAAK,QAAQ;YACtB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,UAAU,CAAC;YACtG,CAAC,EAAE,CAAC,UAAU;YACd,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,KAAK,QAAQ;YACzC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,QAAQ;YAE1C,OAAO,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC5G,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/F,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtG,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACvG,IAAI,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK;YAAE,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACrF,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9F,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACnC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IACC,MAAM,KAAK,IAAI;oBACf,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,MAAM,CAAC;oBAClE,CAAC,CAAC,MAAM,YAAY,UAAU,CAAC;oBAE/B,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9F,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACnC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG;oBAClG,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBACtC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;oBAC5E,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACvC,CAAC;QACF,CAAC;QACD,OAAO;YACN,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAClE,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAClE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;SAC/D,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnG,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrD,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW;QAC3F,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;KAC/D,CAAC;AACH,CAAC","sourcesContent":["import type { SqliteDatabase } from \"./database.js\";\nimport { StorageConfigError } from \"./errors.js\";\nimport type { AdapterOptions, SecretRef, StorageSelection } from \"./provider.js\";\n\nexport interface StorageSettingsSelection {\n\treadonly path?: string;\n\treadonly memory?: boolean;\n\treadonly adapter?: string;\n\treadonly options?: AdapterOptions;\n\treadonly secrets?: Readonly<Record<string, SecretRef>>;\n\treadonly prefix?: string;\n}\nexport type StorageInputSelection =\n\t| StorageSettingsSelection\n\t| { readonly database: SqliteDatabase; readonly prefix?: string };\n\nexport function selectStorage(\n\tvalue: StorageInputSelection,\n\tsource: \"sdk\" | \"settings\" | \"env\" | \"cli\",\n\tfield: string,\n\tdefaultPath: string,\n): StorageSelection {\n\tconst invalid = (reason: string): never => {\n\t\tthrow new StorageConfigError(source, field, reason);\n\t};\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) return invalid(\"selection-object-required\");\n\tif (\"dir\" in value) return invalid(\"adapter-domain-unsupported\");\n\tif (\"prefix\" in value && value.prefix !== undefined && typeof value.prefix !== \"string\")\n\t\treturn invalid(\"invalid-prefix\");\n\tif (source === \"sdk\") {\n\t\tconst forms = [\"path\", \"memory\", \"adapter\", \"database\"].filter((key) => key in value);\n\t\tif (forms.length === 0) return invalid(\"selection-required\");\n\t\tif (forms.length > 1) return invalid(\"multiple-selection-forms\");\n\t\tif (\"path\" in value && typeof value.path !== \"string\") return invalid(\"invalid-path\");\n\t\tif (\"memory\" in value && value.memory !== true) return invalid(\"invalid-memory\");\n\t\tif (\"adapter\" in value && (typeof value.adapter !== \"string\" || value.adapter.length === 0))\n\t\t\treturn invalid(\"invalid-adapter\");\n\t}\n\tif (\"database\" in value) {\n\t\tif ([\"path\", \"memory\", \"adapter\"].some((key) => key in value)) return invalid(\"multiple-selection-forms\");\n\t\tconst db = value.database;\n\t\tif (\n\t\t\tdb === null ||\n\t\t\ttypeof db !== \"object\" ||\n\t\t\t[db.exec, db.run, db.get, db.all, db.transaction, db.close].some((hook) => typeof hook !== \"function\") ||\n\t\t\t!db.descriptor ||\n\t\t\ttypeof db.descriptor.adapter !== \"string\" ||\n\t\t\ttypeof db.descriptor.location !== \"string\"\n\t\t)\n\t\t\treturn invalid(\"async-database-required\");\n\t\treturn { kind: \"database\", database: db, ...(value.prefix === undefined ? {} : { prefix: value.prefix }) };\n\t}\n\tif (value.path !== undefined && typeof value.path !== \"string\") return invalid(\"invalid-path\");\n\tif (value.memory !== undefined && typeof value.memory !== \"boolean\") return invalid(\"invalid-memory\");\n\tif (value.adapter !== undefined) {\n\t\tif (typeof value.adapter !== \"string\" || value.adapter.length === 0) return invalid(\"invalid-adapter\");\n\t\tif (\"path\" in value || \"memory\" in value) return invalid(\"multiple-selection-forms\");\n\t\tif (value.options !== undefined) {\n\t\t\tif (value.options === null || typeof value.options !== \"object\" || Array.isArray(value.options))\n\t\t\t\treturn invalid(\"invalid-options\");\n\t\t\tfor (const option of Object.values(value.options)) {\n\t\t\t\tif (\n\t\t\t\t\toption !== null &&\n\t\t\t\t\t![\"string\", \"number\", \"bigint\", \"boolean\"].includes(typeof option) &&\n\t\t\t\t\t!(option instanceof Uint8Array)\n\t\t\t\t)\n\t\t\t\t\treturn invalid(\"invalid-options\");\n\t\t\t}\n\t\t}\n\t\tif (value.secrets !== undefined) {\n\t\t\tif (value.secrets === null || typeof value.secrets !== \"object\" || Array.isArray(value.secrets))\n\t\t\t\treturn invalid(\"invalid-secrets\");\n\t\t\tfor (const ref of Object.values(value.secrets)) {\n\t\t\t\tif (ref === null || typeof ref !== \"object\" || Array.isArray(ref) || \"env\" in ref === \"file\" in ref)\n\t\t\t\t\treturn invalid(\"invalid-secret-ref\");\n\t\t\t\tif (\"env\" in ref ? typeof ref.env !== \"string\" : typeof ref.file !== \"string\")\n\t\t\t\t\treturn invalid(\"invalid-secret-ref\");\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tkind: \"adapter\",\n\t\t\tmodule: value.adapter,\n\t\t\t...(value.options === undefined ? {} : { options: value.options }),\n\t\t\t...(value.secrets === undefined ? {} : { secrets: value.secrets }),\n\t\t\t...(value.prefix === undefined ? {} : { prefix: value.prefix }),\n\t\t};\n\t}\n\tif (value.options !== undefined || value.secrets !== undefined) return invalid(\"adapter-required\");\n\tif (value.path && value.memory === true) return invalid(\"path-and-memory\");\n\tif (value.memory === true) return { kind: \"memory\" };\n\treturn {\n\t\tkind: \"sqlite\",\n\t\tpath: source === \"sdk\" && value.path !== undefined ? value.path : value.path || defaultPath,\n\t\t...(value.prefix === undefined ? {} : { prefix: value.prefix }),\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-session-store.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/session/jsonl-session-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"jsonl-session-store.d.ts","sourceRoot":"","sources":["../../../../src/core/storage/session/jsonl-session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -344,11 +344,21 @@ export class JsonlSessionStore {
|
|
|
344
344
|
}
|
|
345
345
|
async locate(sessionId) {
|
|
346
346
|
validateSessionText("sessionId", sessionId);
|
|
347
|
-
|
|
347
|
+
const known = await this.locateKnown(sessionId);
|
|
348
|
+
if (known)
|
|
349
|
+
return known;
|
|
350
|
+
const suffix = `_${this.key(sessionId)}.jsonl`;
|
|
351
|
+
const paths = await this.paths();
|
|
352
|
+
const named = paths.filter((path) => basename(path).endsWith(suffix));
|
|
353
|
+
const others = paths.filter((path) => !named.includes(path));
|
|
354
|
+
return (await this.scan(sessionId, named)) ?? (await this.scan(sessionId, others));
|
|
355
|
+
}
|
|
356
|
+
async scan(sessionId, paths) {
|
|
357
|
+
for (const path of paths) {
|
|
348
358
|
const cached = this.fileStates.get(path);
|
|
349
359
|
let stored;
|
|
350
360
|
try {
|
|
351
|
-
stored = await this.readFirstLine(path);
|
|
361
|
+
stored = await this.readFirstLine(path, SCAN_FIRST_LINE_CHUNK_BYTES);
|
|
352
362
|
}
|
|
353
363
|
catch (cause) {
|
|
354
364
|
// Preserve requested-file errors only while its cached inode still owns the path.
|
|
@@ -377,6 +387,32 @@ export class JsonlSessionStore {
|
|
|
377
387
|
}
|
|
378
388
|
return undefined;
|
|
379
389
|
}
|
|
390
|
+
async locateKnown(sessionId) {
|
|
391
|
+
for (const [path, cached] of this.fileStates) {
|
|
392
|
+
if (cached.headerId !== sessionId)
|
|
393
|
+
continue;
|
|
394
|
+
const parent = dirname(path);
|
|
395
|
+
if (parent !== this.directory && (this.exactDirectory || dirname(parent) !== this.directory))
|
|
396
|
+
return undefined;
|
|
397
|
+
let stored;
|
|
398
|
+
try {
|
|
399
|
+
stored = await this.readFirstLine(path);
|
|
400
|
+
}
|
|
401
|
+
catch (cause) {
|
|
402
|
+
if (cause.code === "ENOENT")
|
|
403
|
+
this.fileStates.delete(path);
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
406
|
+
if (stored.id !== sessionId) {
|
|
407
|
+
this.fileStates.delete(path);
|
|
408
|
+
return undefined;
|
|
409
|
+
}
|
|
410
|
+
const header = await this.readHeaderAt(path, stored);
|
|
411
|
+
const stats = await stat(path, { bigint: true });
|
|
412
|
+
return { path, header, stored, stats, state: this.fileStates.get(path) };
|
|
413
|
+
}
|
|
414
|
+
return undefined;
|
|
415
|
+
}
|
|
380
416
|
key(sessionId) {
|
|
381
417
|
return createHash("sha256").update(sessionId).digest("hex");
|
|
382
418
|
}
|