@earendil-works/pi-agent-core 0.84.4 → 0.85.0
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/README.md +4 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +9 -0
- package/dist/agent-loop.js.map +1 -1
- package/dist/harness/agent-harness.d.ts +639 -384
- package/dist/harness/agent-harness.d.ts.map +1 -1
- package/dist/harness/agent-harness.js +5 -251
- package/dist/harness/agent-harness.js.map +1 -1
- package/dist/harness/compaction/branch-summarization.d.ts +12 -6
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/harness/compaction/branch-summarization.js +33 -26
- package/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/dist/harness/compaction/compaction.d.ts +30 -8
- package/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/dist/harness/compaction/compaction.js +53 -63
- package/dist/harness/compaction/compaction.js.map +1 -1
- package/dist/harness/config.d.ts +9 -0
- package/dist/harness/config.d.ts.map +1 -0
- package/dist/harness/config.js +27 -0
- package/dist/harness/config.js.map +1 -0
- package/dist/harness/context.d.ts +9 -0
- package/dist/harness/context.d.ts.map +1 -0
- package/dist/harness/context.js +13 -0
- package/dist/harness/context.js.map +1 -0
- package/dist/harness/env/nodejs.d.ts +24 -28
- package/dist/harness/env/nodejs.d.ts.map +1 -1
- package/dist/harness/env/nodejs.js +239 -86
- package/dist/harness/env/nodejs.js.map +1 -1
- package/dist/harness/events.d.ts +20 -38
- package/dist/harness/events.d.ts.map +1 -1
- package/dist/harness/events.js +240 -55
- package/dist/harness/events.js.map +1 -1
- package/dist/harness/execution/assistant.d.ts +42 -0
- package/dist/harness/execution/assistant.d.ts.map +1 -0
- package/dist/harness/execution/assistant.js +82 -0
- package/dist/harness/execution/assistant.js.map +1 -0
- package/dist/harness/execution/effect-gate.d.ts +22 -0
- package/dist/harness/execution/effect-gate.d.ts.map +1 -0
- package/dist/harness/execution/effect-gate.js +49 -0
- package/dist/harness/execution/effect-gate.js.map +1 -0
- package/dist/harness/execution/tools.d.ts +67 -0
- package/dist/harness/execution/tools.d.ts.map +1 -0
- package/dist/harness/execution/tools.js +121 -0
- package/dist/harness/execution/tools.js.map +1 -0
- package/dist/harness/hooks.d.ts +38 -0
- package/dist/harness/hooks.d.ts.map +1 -0
- package/dist/harness/hooks.js +406 -0
- package/dist/harness/hooks.js.map +1 -0
- package/dist/harness/messages.d.ts +2 -2
- package/dist/harness/messages.d.ts.map +1 -1
- package/dist/harness/messages.js.map +1 -1
- package/dist/harness/prompt-templates.d.ts +3 -2
- package/dist/harness/prompt-templates.d.ts.map +1 -1
- package/dist/harness/prompt-templates.js +17 -17
- package/dist/harness/prompt-templates.js.map +1 -1
- package/dist/harness/result.d.ts +93 -0
- package/dist/harness/result.d.ts.map +1 -1
- package/dist/harness/result.js +40 -0
- package/dist/harness/result.js.map +1 -1
- package/dist/harness/runtime/drive/boundary.d.ts +28 -0
- package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
- package/dist/harness/runtime/drive/boundary.js +170 -0
- package/dist/harness/runtime/drive/boundary.js.map +1 -0
- package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
- package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
- package/dist/harness/runtime/drive/checkpoint.js +133 -0
- package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
- package/dist/harness/runtime/drive/deferred.d.ts +15 -0
- package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
- package/dist/harness/runtime/drive/deferred.js +179 -0
- package/dist/harness/runtime/drive/deferred.js.map +1 -0
- package/dist/harness/runtime/drive/generation.d.ts +8 -0
- package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
- package/dist/harness/runtime/drive/generation.js +205 -0
- package/dist/harness/runtime/drive/generation.js.map +1 -0
- package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
- package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
- package/dist/harness/runtime/drive/reconcile.js +140 -0
- package/dist/harness/runtime/drive/reconcile.js.map +1 -0
- package/dist/harness/runtime/drive/recovery.d.ts +8 -0
- package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
- package/dist/harness/runtime/drive/recovery.js +85 -0
- package/dist/harness/runtime/drive/recovery.js.map +1 -0
- package/dist/harness/runtime/drive/response.d.ts +23 -0
- package/dist/harness/runtime/drive/response.d.ts.map +1 -0
- package/dist/harness/runtime/drive/response.js +394 -0
- package/dist/harness/runtime/drive/response.js.map +1 -0
- package/dist/harness/runtime/drive/retry.d.ts +4 -0
- package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
- package/dist/harness/runtime/drive/retry.js +37 -0
- package/dist/harness/runtime/drive/retry.js.map +1 -0
- package/dist/harness/runtime/drive/structural.d.ts +32 -0
- package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
- package/dist/harness/runtime/drive/structural.js +929 -0
- package/dist/harness/runtime/drive/structural.js.map +1 -0
- package/dist/harness/runtime/drive/terminal.d.ts +7 -0
- package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
- package/dist/harness/runtime/drive/terminal.js +49 -0
- package/dist/harness/runtime/drive/terminal.js.map +1 -0
- package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
- package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
- package/dist/harness/runtime/drive/tool-placement.js +244 -0
- package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
- package/dist/harness/runtime/drive/tools.d.ts +6 -0
- package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
- package/dist/harness/runtime/drive/tools.js +449 -0
- package/dist/harness/runtime/drive/tools.js.map +1 -0
- package/dist/harness/runtime/drive.d.ts +6 -0
- package/dist/harness/runtime/drive.d.ts.map +1 -0
- package/dist/harness/runtime/drive.js +93 -0
- package/dist/harness/runtime/drive.js.map +1 -0
- package/dist/harness/runtime/harness.d.ts +59 -0
- package/dist/harness/runtime/harness.d.ts.map +1 -0
- package/dist/harness/runtime/harness.js +311 -0
- package/dist/harness/runtime/harness.js.map +1 -0
- package/dist/harness/runtime/index.d.ts +2 -0
- package/dist/harness/runtime/index.d.ts.map +1 -0
- package/dist/harness/runtime/index.js +2 -0
- package/dist/harness/runtime/index.js.map +1 -0
- package/dist/harness/runtime/lane.d.ts +101 -0
- package/dist/harness/runtime/lane.d.ts.map +1 -0
- package/dist/harness/runtime/lane.js +1575 -0
- package/dist/harness/runtime/lane.js.map +1 -0
- package/dist/harness/runtime/progress.d.ts +15 -0
- package/dist/harness/runtime/progress.d.ts.map +1 -0
- package/dist/harness/runtime/progress.js +66 -0
- package/dist/harness/runtime/progress.js.map +1 -0
- package/dist/harness/runtime/reducer.d.ts +5 -0
- package/dist/harness/runtime/reducer.d.ts.map +1 -0
- package/dist/harness/runtime/reducer.js +240 -0
- package/dist/harness/runtime/reducer.js.map +1 -0
- package/dist/harness/runtime/restore.d.ts +24 -0
- package/dist/harness/runtime/restore.d.ts.map +1 -0
- package/dist/harness/runtime/restore.js +117 -0
- package/dist/harness/runtime/restore.js.map +1 -0
- package/dist/harness/runtime/transcript.d.ts +21 -0
- package/dist/harness/runtime/transcript.d.ts.map +1 -0
- package/dist/harness/runtime/transcript.js +72 -0
- package/dist/harness/runtime/transcript.js.map +1 -0
- package/dist/harness/runtime/types.d.ts +105 -0
- package/dist/harness/runtime/types.d.ts.map +1 -0
- package/dist/harness/runtime/types.js +61 -0
- package/dist/harness/runtime/types.js.map +1 -0
- package/dist/harness/session/commit.d.ts +53 -0
- package/dist/harness/session/commit.d.ts.map +1 -0
- package/dist/harness/session/commit.js +57 -0
- package/dist/harness/session/commit.js.map +1 -0
- package/dist/harness/session/context.d.ts +6 -18
- package/dist/harness/session/context.d.ts.map +1 -1
- package/dist/harness/session/context.js +31 -49
- package/dist/harness/session/context.js.map +1 -1
- package/dist/harness/session/fork-policy.d.ts +13 -0
- package/dist/harness/session/fork-policy.d.ts.map +1 -0
- package/dist/harness/session/fork-policy.js +22 -0
- package/dist/harness/session/fork-policy.js.map +1 -0
- package/dist/harness/session/fork.d.ts +18 -0
- package/dist/harness/session/fork.d.ts.map +1 -0
- package/dist/harness/session/fork.js +127 -0
- package/dist/harness/session/fork.js.map +1 -0
- package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
- package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
- package/dist/harness/session/in-memory-storage-state.js +216 -0
- package/dist/harness/session/in-memory-storage-state.js.map +1 -0
- package/dist/harness/session/index.d.ts +9 -5
- package/dist/harness/session/index.d.ts.map +1 -1
- package/dist/harness/session/index.js +7 -4
- package/dist/harness/session/index.js.map +1 -1
- package/dist/harness/session/jsonl/codec.d.ts +19 -8
- package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/dist/harness/session/jsonl/codec.js +34 -218
- package/dist/harness/session/jsonl/codec.js.map +1 -1
- package/dist/harness/session/jsonl/index.d.ts +4 -0
- package/dist/harness/session/jsonl/index.d.ts.map +1 -0
- package/dist/harness/session/jsonl/index.js +4 -0
- package/dist/harness/session/jsonl/index.js.map +1 -0
- package/dist/harness/session/jsonl/legacy-v3.d.ts +18 -0
- package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
- package/dist/harness/session/jsonl/legacy-v3.js +383 -0
- package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
- package/dist/harness/session/jsonl/repo.d.ts +26 -19
- package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/dist/harness/session/jsonl/repo.js +266 -156
- package/dist/harness/session/jsonl/repo.js.map +1 -1
- package/dist/harness/session/jsonl/storage.d.ts +39 -41
- package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/dist/harness/session/jsonl/storage.js +238 -181
- package/dist/harness/session/jsonl/storage.js.map +1 -1
- package/dist/harness/session/jsonl/types.d.ts +23 -22
- package/dist/harness/session/jsonl/types.d.ts.map +1 -1
- package/dist/harness/session/jsonl/types.js +2 -1
- package/dist/harness/session/jsonl/types.js.map +1 -1
- package/dist/harness/session/memory.d.ts +46 -40
- package/dist/harness/session/memory.d.ts.map +1 -1
- package/dist/harness/session/memory.js +346 -113
- package/dist/harness/session/memory.js.map +1 -1
- package/dist/harness/session/mutation-line.d.ts +8 -0
- package/dist/harness/session/mutation-line.d.ts.map +1 -0
- package/dist/harness/session/mutation-line.js +21 -0
- package/dist/harness/session/mutation-line.js.map +1 -0
- package/dist/harness/session/session.d.ts +78 -46
- package/dist/harness/session/session.d.ts.map +1 -1
- package/dist/harness/session/session.js +343 -209
- package/dist/harness/session/session.js.map +1 -1
- package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
- package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
- package/dist/harness/session/testing/benchmark/datasets.js +24 -0
- package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
- package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
- package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
- package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
- package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
- package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
- package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
- package/dist/harness/session/testing/benchmark/storage.js +114 -0
- package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
- package/dist/harness/session/testing/conformance/session-repo.d.ts +21 -0
- package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
- package/dist/harness/session/testing/conformance/session-repo.js +590 -0
- package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
- package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
- package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
- package/dist/harness/session/testing/conformance/storage.js +600 -0
- package/dist/harness/session/testing/conformance/storage.js.map +1 -0
- package/dist/harness/session/testing/gating-storage.d.ts +26 -0
- package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
- package/dist/harness/session/testing/gating-storage.js +100 -0
- package/dist/harness/session/testing/gating-storage.js.map +1 -0
- package/dist/harness/session/testing/index.d.ts +9 -2
- package/dist/harness/session/testing/index.d.ts.map +1 -1
- package/dist/harness/session/testing/index.js +8 -1
- package/dist/harness/session/testing/index.js.map +1 -1
- package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
- package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
- package/dist/harness/session/testing/instrumented-storage.js +16 -0
- package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
- package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
- package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
- package/dist/harness/session/testing/storage-decorator.js +41 -0
- package/dist/harness/session/testing/storage-decorator.js.map +1 -0
- package/dist/harness/session/testing/types.d.ts +5 -7
- package/dist/harness/session/testing/types.d.ts.map +1 -1
- package/dist/harness/session/testing/types.js.map +1 -1
- package/dist/harness/session/types.d.ts +424 -259
- package/dist/harness/session/types.d.ts.map +1 -1
- package/dist/harness/session/types.js +7 -8
- package/dist/harness/session/types.js.map +1 -1
- package/dist/harness/session/values.d.ts +95 -0
- package/dist/harness/session/values.d.ts.map +1 -0
- package/dist/harness/session/values.js +81 -0
- package/dist/harness/session/values.js.map +1 -0
- package/dist/harness/skills.d.ts +3 -2
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +29 -26
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/telemetry.d.ts +64 -43
- package/dist/harness/telemetry.d.ts.map +1 -1
- package/dist/harness/telemetry.js +45 -26
- package/dist/harness/telemetry.js.map +1 -1
- package/dist/harness/tools/bash.d.ts +4 -4
- package/dist/harness/tools/bash.d.ts.map +1 -1
- package/dist/harness/tools/bash.js +66 -93
- package/dist/harness/tools/bash.js.map +1 -1
- package/dist/harness/tools/edit.d.ts.map +1 -1
- package/dist/harness/tools/edit.js +10 -10
- package/dist/harness/tools/edit.js.map +1 -1
- package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
- package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/harness/tools/file-mutation-queue.js +5 -5
- package/dist/harness/tools/file-mutation-queue.js.map +1 -1
- package/dist/harness/tools/path-utils.d.ts +3 -2
- package/dist/harness/tools/path-utils.d.ts.map +1 -1
- package/dist/harness/tools/path-utils.js +5 -5
- package/dist/harness/tools/path-utils.js.map +1 -1
- package/dist/harness/tools/read.d.ts +2 -1
- package/dist/harness/tools/read.d.ts.map +1 -1
- package/dist/harness/tools/read.js +4 -6
- package/dist/harness/tools/read.js.map +1 -1
- package/dist/harness/tools/write.d.ts.map +1 -1
- package/dist/harness/tools/write.js +7 -7
- package/dist/harness/tools/write.js.map +1 -1
- package/dist/harness/types.d.ts +108 -45
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
- package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
- package/dist/harness/utils/adaptive-publisher.js +79 -0
- package/dist/harness/utils/adaptive-publisher.js.map +1 -0
- package/dist/harness/utils/output-capture.d.ts +31 -0
- package/dist/harness/utils/output-capture.d.ts.map +1 -0
- package/dist/harness/utils/output-capture.js +217 -0
- package/dist/harness/utils/output-capture.js.map +1 -0
- package/dist/harness/utils/shell-output.d.ts +12 -5
- package/dist/harness/utils/shell-output.d.ts.map +1 -1
- package/dist/harness/utils/shell-output.js +64 -174
- package/dist/harness/utils/shell-output.js.map +1 -1
- package/dist/harness/utils/truncate.d.ts +1 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -1
- package/dist/harness/utils/truncate.js +1 -1
- package/dist/harness/utils/truncate.js.map +1 -1
- package/dist/harness/utils/usage.d.ts +4 -0
- package/dist/harness/utils/usage.d.ts.map +1 -0
- package/dist/harness/utils/usage.js +33 -0
- package/dist/harness/utils/usage.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -6
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +2 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +40 -10
- package/dist/proxy.js.map +1 -1
- package/dist/search/index.d.ts +24 -16
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +1 -1
- package/dist/search/index.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +25 -4
- package/dist/harness/reducer.d.ts +0 -100
- package/dist/harness/reducer.d.ts.map +0 -1
- package/dist/harness/reducer.js +0 -415
- package/dist/harness/reducer.js.map +0 -1
- package/dist/harness/session/jsonl/errors.d.ts +0 -9
- package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
- package/dist/harness/session/jsonl/errors.js +0 -19
- package/dist/harness/session/jsonl/errors.js.map +0 -1
- package/dist/harness/session/jsonl.d.ts +0 -3
- package/dist/harness/session/jsonl.d.ts.map +0 -1
- package/dist/harness/session/jsonl.js +0 -2
- package/dist/harness/session/jsonl.js.map +0 -1
- package/dist/harness/session/state.d.ts +0 -65
- package/dist/harness/session/state.d.ts.map +0 -1
- package/dist/harness/session/state.js +0 -319
- package/dist/harness/session/state.js.map +0 -1
- package/dist/harness/session/testing/conformance.d.ts +0 -4
- package/dist/harness/session/testing/conformance.d.ts.map +0 -1
- package/dist/harness/session/testing/conformance.js +0 -762
- package/dist/harness/session/testing/conformance.js.map +0 -1
- package/dist/search/scanning.d.ts +0 -29
- package/dist/search/scanning.d.ts.map +0 -1
- package/dist/search/scanning.js +0 -103
- package/dist/search/scanning.js.map +0 -1
|
@@ -1,227 +1,361 @@
|
|
|
1
|
-
import { uuidv7 } from "@earendil-works/pi-ai";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { uuidv7 } from "@earendil-works/pi-ai/utils/uuid";
|
|
2
|
+
import { insertEntry } from "./commit.js";
|
|
3
|
+
import { MutationLine } from "./mutation-line.js";
|
|
4
|
+
import { appendList as appendListWrite, branchTip, deleteList as deleteListWrite, deleteValue as deleteValueWrite, entryLabel, sessionName, setValue as setValueWrite, } from "./values.js";
|
|
5
|
+
/** Durable session state is internally inconsistent and cannot be safely advanced. */
|
|
6
|
+
export class SessionInvariantError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "SessionInvariantError";
|
|
10
|
+
}
|
|
5
11
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
/** A requested Branch name is invalid. */
|
|
13
|
+
export class SessionInvalidBranchError extends Error {
|
|
14
|
+
branch;
|
|
15
|
+
reason;
|
|
16
|
+
constructor(branch, reason) {
|
|
17
|
+
super(`Invalid branch ${JSON.stringify(branch)}: ${reason}`);
|
|
18
|
+
this.name = "SessionInvalidBranchError";
|
|
19
|
+
this.branch = branch;
|
|
20
|
+
this.reason = reason;
|
|
9
21
|
}
|
|
10
22
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
23
|
+
/** A requested branch already exists. */
|
|
24
|
+
export class SessionBranchExistsError extends Error {
|
|
25
|
+
branch;
|
|
26
|
+
constructor(branch) {
|
|
27
|
+
super(`Branch already exists: ${branch}`);
|
|
28
|
+
this.name = "SessionBranchExistsError";
|
|
29
|
+
this.branch = branch;
|
|
14
30
|
}
|
|
15
31
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
stack.push({ value: descriptor.value });
|
|
32
|
+
/** A pending assistant message cannot be persisted as a session entry. */
|
|
33
|
+
export class SessionPendingAssistantMessageError extends Error {
|
|
34
|
+
constructor() {
|
|
35
|
+
super("Cannot persist a pending assistant message");
|
|
36
|
+
this.name = "SessionPendingAssistantMessageError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** A requested session entry target does not exist. */
|
|
40
|
+
export class SessionUnknownTargetError extends Error {
|
|
41
|
+
targetId;
|
|
42
|
+
constructor(targetId) {
|
|
43
|
+
super(`Unknown target: ${targetId}`);
|
|
44
|
+
this.name = "SessionUnknownTargetError";
|
|
45
|
+
this.targetId = targetId;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
class StorageBackedSessionMutation {
|
|
49
|
+
storage;
|
|
50
|
+
release;
|
|
51
|
+
active = true;
|
|
52
|
+
commitResult;
|
|
53
|
+
endPromise;
|
|
54
|
+
constructor(storage, release) {
|
|
55
|
+
this.storage = storage;
|
|
56
|
+
this.release = release;
|
|
57
|
+
}
|
|
58
|
+
commit(writes, context) {
|
|
59
|
+
this.assertActive();
|
|
60
|
+
if (this.commitResult !== undefined)
|
|
61
|
+
return Promise.reject(new Error("SessionMutator commit already attempted"));
|
|
62
|
+
try {
|
|
63
|
+
for (const write of writes) {
|
|
64
|
+
if (write.kind === "entry" &&
|
|
65
|
+
write.entry.type === "message" &&
|
|
66
|
+
write.entry.message.role === "assistant" &&
|
|
67
|
+
write.entry.message.stopReason === "pending") {
|
|
68
|
+
throw new SessionPendingAssistantMessageError();
|
|
69
|
+
}
|
|
55
70
|
}
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
const prototype = Object.getPrototypeOf(candidate);
|
|
59
|
-
if (prototype !== Object.prototype && prototype !== null) {
|
|
60
|
-
invalidPayload("contains a non-plain object");
|
|
71
|
+
this.commitResult = this.storage.commit(writes, context);
|
|
61
72
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
const keys = Object.keys(candidate);
|
|
66
|
-
if (Object.getOwnPropertyNames(candidate).length !== keys.length) {
|
|
67
|
-
invalidPayload("contains a non-enumerable property");
|
|
68
|
-
}
|
|
69
|
-
for (let index = keys.length - 1; index >= 0; index--) {
|
|
70
|
-
const descriptor = Object.getOwnPropertyDescriptor(candidate, keys[index]);
|
|
71
|
-
if (!("value" in descriptor))
|
|
72
|
-
invalidPayload("contains an accessor");
|
|
73
|
-
stack.push({ value: descriptor.value });
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.commitResult = Promise.reject(error);
|
|
74
75
|
}
|
|
76
|
+
return this.commitResult;
|
|
77
|
+
}
|
|
78
|
+
end(_context) {
|
|
79
|
+
if (this.endPromise !== undefined)
|
|
80
|
+
return this.endPromise;
|
|
81
|
+
this.active = false;
|
|
82
|
+
this.endPromise = this.settle().finally(this.release);
|
|
83
|
+
return this.endPromise;
|
|
84
|
+
}
|
|
85
|
+
getEntries(ids, context) {
|
|
86
|
+
this.assertActive();
|
|
87
|
+
return this.storage.getEntries(ids, context);
|
|
88
|
+
}
|
|
89
|
+
getStats(context) {
|
|
90
|
+
this.assertActive();
|
|
91
|
+
return this.storage.getStats(context);
|
|
92
|
+
}
|
|
93
|
+
getValue(address, context) {
|
|
94
|
+
this.assertActive();
|
|
95
|
+
return this.storage.getValue(address, context);
|
|
96
|
+
}
|
|
97
|
+
scanValues(prefix, context) {
|
|
98
|
+
this.assertActive();
|
|
99
|
+
return this.storage.scanValues(prefix, context);
|
|
100
|
+
}
|
|
101
|
+
readList(address, options, context) {
|
|
102
|
+
this.assertActive();
|
|
103
|
+
return this.storage.readList(address, options, context);
|
|
104
|
+
}
|
|
105
|
+
scanBranch(query, context) {
|
|
106
|
+
this.assertActive();
|
|
107
|
+
return this.storage.scanBranch(query, context);
|
|
108
|
+
}
|
|
109
|
+
settle() {
|
|
110
|
+
return (this.commitResult?.then(() => undefined, () => undefined) ?? Promise.resolve());
|
|
111
|
+
}
|
|
112
|
+
assertActive() {
|
|
113
|
+
if (!this.active)
|
|
114
|
+
throw new Error("SessionMutator cannot be used outside its mutation callback");
|
|
75
115
|
}
|
|
76
116
|
}
|
|
77
|
-
|
|
78
|
-
|
|
117
|
+
class StorageBackedBranch {
|
|
118
|
+
name;
|
|
119
|
+
session;
|
|
120
|
+
constructor(name, session) {
|
|
121
|
+
this.name = name;
|
|
122
|
+
this.session = session;
|
|
123
|
+
}
|
|
124
|
+
getTipId(context) {
|
|
125
|
+
return this.session.getBranchTip(this.name, context);
|
|
126
|
+
}
|
|
127
|
+
async findEntries(query, context) {
|
|
128
|
+
query ??= {};
|
|
129
|
+
const start = query.start ?? (await this.getTipId(context));
|
|
130
|
+
if (start === null)
|
|
131
|
+
return [];
|
|
132
|
+
return this.session.scanBranch({ ...query, start, order: query.order ?? "newestFirst" }, context);
|
|
133
|
+
}
|
|
134
|
+
async findEntry(query, context) {
|
|
135
|
+
query ??= {};
|
|
136
|
+
return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
|
|
137
|
+
}
|
|
138
|
+
appendMessage(message, context) {
|
|
139
|
+
return this.session.appendToBranch(this.name, { type: "message", message }, context);
|
|
140
|
+
}
|
|
141
|
+
appendCustomEntry(customType, data, context) {
|
|
142
|
+
return this.session.appendToBranch(this.name, { type: "custom", customType, ...(data === undefined ? {} : { data }) }, context);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Package-internal typed boundary shared by concrete session repositories. */
|
|
146
|
+
export class StorageBackedSession {
|
|
147
|
+
metadata;
|
|
79
148
|
idGenerator;
|
|
80
|
-
|
|
149
|
+
storage;
|
|
150
|
+
mutationLine;
|
|
151
|
+
onClose;
|
|
152
|
+
branches = new Map();
|
|
153
|
+
closedError = new Error("Session is closed");
|
|
154
|
+
state = "open";
|
|
155
|
+
closePromise;
|
|
156
|
+
constructor(metadata, storage, options = {}) {
|
|
157
|
+
this.metadata = metadata;
|
|
158
|
+
this.idGenerator = options.idGenerator ?? { next: uuidv7 };
|
|
81
159
|
this.storage = storage;
|
|
82
|
-
this.
|
|
160
|
+
this.mutationLine = options.mutationLine ?? new MutationLine();
|
|
161
|
+
this.onClose = options.onClose;
|
|
162
|
+
}
|
|
163
|
+
async beginMutation(_context) {
|
|
164
|
+
this.assertOpen();
|
|
165
|
+
let grant;
|
|
166
|
+
let rejectGrant;
|
|
167
|
+
const granted = new Promise((resolve, reject) => {
|
|
168
|
+
grant = resolve;
|
|
169
|
+
rejectGrant = reject;
|
|
170
|
+
});
|
|
171
|
+
let release;
|
|
172
|
+
const finished = new Promise((resolve) => {
|
|
173
|
+
release = resolve;
|
|
174
|
+
});
|
|
175
|
+
const line = this.mutationLine.run(async () => {
|
|
176
|
+
grant(new StorageBackedSessionMutation(this.storage, release));
|
|
177
|
+
await finished;
|
|
178
|
+
});
|
|
179
|
+
void line.catch(rejectGrant);
|
|
180
|
+
return granted;
|
|
181
|
+
}
|
|
182
|
+
async mutate(mutation, context) {
|
|
183
|
+
const mutator = await this.beginMutation(context);
|
|
184
|
+
try {
|
|
185
|
+
return await mutation(mutator, context);
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
await mutator.end(context);
|
|
189
|
+
}
|
|
83
190
|
}
|
|
84
|
-
async
|
|
85
|
-
|
|
191
|
+
async getEntries(ids, context) {
|
|
192
|
+
this.assertOpen();
|
|
193
|
+
return this.storage.getEntries(ids, context);
|
|
86
194
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
async
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
await this.storage.setLabel(targetId, label);
|
|
126
|
-
}
|
|
127
|
-
async findEntries(query) {
|
|
128
|
-
return this.queryEntries(query);
|
|
129
|
-
}
|
|
130
|
-
async findEntry(query = {}) {
|
|
131
|
-
return (await this.queryEntries(query, 1))[0];
|
|
132
|
-
}
|
|
133
|
-
async findEntriesOnBranch(query) {
|
|
134
|
-
return this.queryBranchEntries("main", query);
|
|
135
|
-
}
|
|
136
|
-
async findEntryOnBranch(query = {}) {
|
|
137
|
-
return (await this.queryBranchEntries("main", query, 1))[0];
|
|
138
|
-
}
|
|
139
|
-
async appendMessage(message) {
|
|
140
|
-
return this.appendMessageToLane("main", message);
|
|
141
|
-
}
|
|
142
|
-
async appendCustomEntry(customType, data) {
|
|
143
|
-
return this.appendCustomEntryToLane("main", customType, data);
|
|
144
|
-
}
|
|
145
|
-
async getLanes() {
|
|
146
|
-
return this.storage.getLanes();
|
|
147
|
-
}
|
|
148
|
-
async createLane(lane, at) {
|
|
149
|
-
await this.storage.createLane(lane, at);
|
|
150
|
-
}
|
|
151
|
-
async moveLane(lane, to) {
|
|
152
|
-
await this.storage.moveLane(lane, to);
|
|
153
|
-
}
|
|
154
|
-
async appendEntry(entry, lane) {
|
|
155
|
-
return this.commitEntry(entry, lane);
|
|
156
|
-
}
|
|
157
|
-
async appendRecord(record) {
|
|
158
|
-
return this.commitRecord(record);
|
|
159
|
-
}
|
|
160
|
-
async findRecords(query) {
|
|
161
|
-
return this.queryRecords(query);
|
|
162
|
-
}
|
|
163
|
-
async findOpenOperations(lane, options) {
|
|
164
|
-
assertValidLimit(options?.limit);
|
|
165
|
-
return this.storage.findOpenOperations(lane, options);
|
|
166
|
-
}
|
|
167
|
-
async getLog(options) {
|
|
168
|
-
return this.queryLog(options);
|
|
169
|
-
}
|
|
170
|
-
/** Returns the lane's current leaf, or null when empty. Throws when the lane does not exist. */
|
|
171
|
-
async getLeafIdForLane(lane) {
|
|
172
|
-
const pointer = (await this.getLanes()).find((candidate) => candidate.lane === lane);
|
|
173
|
-
if (!pointer)
|
|
174
|
-
throw new SessionError("invalid_lane", `Lane not found: ${lane}`);
|
|
175
|
-
return pointer.leafId;
|
|
176
|
-
}
|
|
177
|
-
async queryEntries(query = {}, resultLimit = query.limit) {
|
|
178
|
-
assertValidLimit(query.limit);
|
|
179
|
-
assertValidCursor(query.cursor?.afterSeq);
|
|
180
|
-
return this.storage.findEntries(resultLimit === query.limit ? query : { ...query, limit: resultLimit });
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Queries from `query.start` toward the root, defaulting to the lane's current leaf.
|
|
184
|
-
* `resultLimit` lets single-entry queries cap results without changing the caller's query.
|
|
185
|
-
*/
|
|
186
|
-
async queryBranchEntries(defaultLane, query = {}, resultLimit = query.limit) {
|
|
187
|
-
assertValidLimit(query.limit);
|
|
188
|
-
assertValidCursor(query.cursor?.afterSeq);
|
|
189
|
-
const start = query.start ?? (await this.getLeafIdForLane(defaultLane));
|
|
190
|
-
if (start === null)
|
|
191
|
-
return [];
|
|
192
|
-
const storageQuery = resultLimit === query.limit ? query : { ...query, limit: resultLimit };
|
|
193
|
-
return this.storage.findEntriesOnBranch({ ...storageQuery, start });
|
|
194
|
-
}
|
|
195
|
-
async queryRecords(query = {}) {
|
|
196
|
-
assertValidLimit(query.limit);
|
|
197
|
-
assertValidCursor(query.afterSeq);
|
|
198
|
-
if (query.operationKind !== undefined && query.type !== "operation_started") {
|
|
199
|
-
throw new SessionError("invalid_query", 'operationKind requires type "operation_started"');
|
|
195
|
+
async getEntry(id, context) {
|
|
196
|
+
return (await this.getEntries([id], context)).get(id);
|
|
197
|
+
}
|
|
198
|
+
async getValue(address, context) {
|
|
199
|
+
this.assertOpen();
|
|
200
|
+
return this.storage.getValue(address, context);
|
|
201
|
+
}
|
|
202
|
+
async scanValues(prefix, context) {
|
|
203
|
+
this.assertOpen();
|
|
204
|
+
return this.storage.scanValues(prefix, context);
|
|
205
|
+
}
|
|
206
|
+
async readList(address, options, context) {
|
|
207
|
+
this.assertOpen();
|
|
208
|
+
return this.storage.readList(address, options, context);
|
|
209
|
+
}
|
|
210
|
+
async scanBranch(query, context) {
|
|
211
|
+
this.assertOpen();
|
|
212
|
+
return this.storage.scanBranch(query, context);
|
|
213
|
+
}
|
|
214
|
+
async getStats(context) {
|
|
215
|
+
this.assertOpen();
|
|
216
|
+
return this.storage.getStats(context);
|
|
217
|
+
}
|
|
218
|
+
async getName(context) {
|
|
219
|
+
return (await this.getValue(sessionName, context))?.value;
|
|
220
|
+
}
|
|
221
|
+
async getLabel(targetId, context) {
|
|
222
|
+
return (await this.getValue(entryLabel(targetId), context))?.value;
|
|
223
|
+
}
|
|
224
|
+
async findEntries(query, context) {
|
|
225
|
+
query ??= {};
|
|
226
|
+
this.assertOpen();
|
|
227
|
+
const order = query.order ?? "desc";
|
|
228
|
+
if (query.cursor !== undefined) {
|
|
229
|
+
if (order === "asc" && query.cursor.seq === Number.MAX_SAFE_INTEGER)
|
|
230
|
+
return [];
|
|
231
|
+
if (order === "desc" && query.cursor.seq <= 1)
|
|
232
|
+
return [];
|
|
200
233
|
}
|
|
201
|
-
return this.storage.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
234
|
+
return this.storage.scanEntries({
|
|
235
|
+
type: query.type,
|
|
236
|
+
customType: query.customType,
|
|
237
|
+
order,
|
|
238
|
+
limit: query.limit,
|
|
239
|
+
...(query.cursor === undefined
|
|
240
|
+
? {}
|
|
241
|
+
: order === "asc"
|
|
242
|
+
? { fromSeq: query.cursor.seq + 1 }
|
|
243
|
+
: { toSeq: query.cursor.seq - 1 }),
|
|
244
|
+
}, context);
|
|
245
|
+
}
|
|
246
|
+
async findEntry(query, context) {
|
|
247
|
+
query ??= {};
|
|
248
|
+
return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
|
|
249
|
+
}
|
|
250
|
+
async branch(name, context) {
|
|
251
|
+
this.assertValidBranchName(name);
|
|
252
|
+
if ((await this.getValue(branchTip(name), context)) === undefined)
|
|
253
|
+
return undefined;
|
|
254
|
+
return this.getOrCreateBranchObject(name);
|
|
255
|
+
}
|
|
256
|
+
async createBranch(name, at, context) {
|
|
257
|
+
this.assertOpen();
|
|
258
|
+
this.assertValidBranchName(name);
|
|
259
|
+
await this.mutate(async (mutator) => {
|
|
260
|
+
if ((await mutator.getValue(branchTip(name), context)) !== undefined) {
|
|
261
|
+
throw new SessionBranchExistsError(name);
|
|
262
|
+
}
|
|
263
|
+
if (at !== null && !(await mutator.getEntries([at], context)).has(at)) {
|
|
264
|
+
throw new SessionUnknownTargetError(at);
|
|
265
|
+
}
|
|
266
|
+
await mutator.commit([setValueWrite(branchTip(name), at)], context);
|
|
267
|
+
}, context);
|
|
268
|
+
return this.getOrCreateBranchObject(name);
|
|
269
|
+
}
|
|
270
|
+
setValue(address, next, context) {
|
|
271
|
+
return this.mutate(async (mutator) => {
|
|
272
|
+
await mutator.commit([setValueWrite(address, next)], context);
|
|
273
|
+
}, context);
|
|
274
|
+
}
|
|
275
|
+
deleteValue(address, context) {
|
|
276
|
+
return this.mutate(async (mutator) => {
|
|
277
|
+
await mutator.commit([deleteValueWrite(address)], context);
|
|
278
|
+
}, context);
|
|
279
|
+
}
|
|
280
|
+
appendList(address, element, context) {
|
|
281
|
+
return this.mutate(async (mutator) => {
|
|
282
|
+
await mutator.commit([appendListWrite(address, element)], context);
|
|
283
|
+
}, context);
|
|
284
|
+
}
|
|
285
|
+
deleteList(address, context) {
|
|
286
|
+
return this.mutate(async (mutator) => {
|
|
287
|
+
await mutator.commit([deleteListWrite(address)], context);
|
|
288
|
+
}, context);
|
|
289
|
+
}
|
|
290
|
+
setName(name, context) {
|
|
291
|
+
return name === undefined ? this.deleteValue(sessionName, context) : this.setValue(sessionName, name, context);
|
|
292
|
+
}
|
|
293
|
+
setLabel(targetId, label, context) {
|
|
294
|
+
const address = entryLabel(targetId);
|
|
295
|
+
return label === undefined ? this.deleteValue(address, context) : this.setValue(address, label, context);
|
|
296
|
+
}
|
|
297
|
+
close(context) {
|
|
298
|
+
if (this.closePromise !== undefined)
|
|
299
|
+
return this.closePromise;
|
|
300
|
+
this.state = "closing";
|
|
301
|
+
this.closePromise = this.mutationLine
|
|
302
|
+
.seal(this.closedError)
|
|
303
|
+
.then(() => this.storage.close(context))
|
|
304
|
+
.finally(() => {
|
|
305
|
+
this.state = "closed";
|
|
306
|
+
this.onClose?.();
|
|
307
|
+
});
|
|
308
|
+
return this.closePromise;
|
|
309
|
+
}
|
|
310
|
+
async getBranchTip(name, context) {
|
|
311
|
+
const stored = await this.getValue(branchTip(name), context);
|
|
312
|
+
if (stored === undefined)
|
|
313
|
+
throw new SessionInvariantError(`Unknown branch: ${name}`);
|
|
314
|
+
return stored.value;
|
|
315
|
+
}
|
|
316
|
+
async appendToBranch(name, entry, context) {
|
|
317
|
+
this.assertOpen();
|
|
318
|
+
if (entry.type === "message" && entry.message.role === "assistant" && entry.message.stopReason === "pending") {
|
|
319
|
+
throw new SessionPendingAssistantMessageError();
|
|
320
|
+
}
|
|
321
|
+
const id = this.idGenerator.next();
|
|
322
|
+
await this.mutate(async (mutator) => {
|
|
323
|
+
const tip = await mutator.getValue(branchTip(name), context);
|
|
324
|
+
if (tip === undefined)
|
|
325
|
+
throw new SessionInvariantError(`Unknown branch: ${name}`);
|
|
326
|
+
await mutator.commit([
|
|
327
|
+
insertEntry(entry.type === "message"
|
|
328
|
+
? { id, parentId: tip.value, type: "message", message: entry.message }
|
|
329
|
+
: {
|
|
330
|
+
id,
|
|
331
|
+
parentId: tip.value,
|
|
332
|
+
type: "custom",
|
|
333
|
+
customType: entry.customType,
|
|
334
|
+
...(entry.data === undefined ? {} : { data: entry.data }),
|
|
335
|
+
}),
|
|
336
|
+
setValueWrite(branchTip(name), id),
|
|
337
|
+
], context);
|
|
338
|
+
}, context);
|
|
339
|
+
return id;
|
|
340
|
+
}
|
|
341
|
+
getOrCreateBranchObject(name) {
|
|
342
|
+
let branch = this.branches.get(name);
|
|
343
|
+
if (branch === undefined) {
|
|
344
|
+
branch = new StorageBackedBranch(name, this);
|
|
345
|
+
this.branches.set(name, branch);
|
|
346
|
+
}
|
|
347
|
+
return branch;
|
|
348
|
+
}
|
|
349
|
+
assertValidBranchName(name) {
|
|
350
|
+
if (name.length === 0)
|
|
351
|
+
throw new SessionInvalidBranchError(name, "branch name must not be empty");
|
|
352
|
+
if (name.includes("\u0000")) {
|
|
353
|
+
throw new SessionInvalidBranchError(name, "branch name must not contain \\u0000");
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
assertOpen() {
|
|
357
|
+
if (this.state !== "open")
|
|
358
|
+
throw this.closedError;
|
|
225
359
|
}
|
|
226
360
|
}
|
|
227
361
|
//# sourceMappingURL=session.js.map
|