@earendil-works/pi-agent-core 0.84.3 → 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 +32 -25
- 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 +242 -87
- 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 +5 -2
- 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
package/dist/harness/reducer.js
DELETED
|
@@ -1,415 +0,0 @@
|
|
|
1
|
-
import { Guard } from "typebox/guard";
|
|
2
|
-
export class RecordLogCorruption extends Error {
|
|
3
|
-
reason;
|
|
4
|
-
constructor(reason, message) {
|
|
5
|
-
super(message);
|
|
6
|
-
this.name = "RecordLogCorruption";
|
|
7
|
-
this.reason = reason;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
function corrupt(reason, message) {
|
|
11
|
-
throw new RecordLogCorruption(reason, message);
|
|
12
|
-
}
|
|
13
|
-
function hasRunId(record) {
|
|
14
|
-
return "runId" in record && typeof record.runId === "string";
|
|
15
|
-
}
|
|
16
|
-
function matchesProvisionedEntry(entry, target) {
|
|
17
|
-
const { parentId: _parentId, seq: _seq, timestamp: _timestamp, ...payload } = entry;
|
|
18
|
-
return Guard.IsDeepEqual(payload, target);
|
|
19
|
-
}
|
|
20
|
-
function validateExactProvisionedEntry(entriesById, target) {
|
|
21
|
-
const entry = entriesById.get(target.id);
|
|
22
|
-
if (entry && !matchesProvisionedEntry(entry, target)) {
|
|
23
|
-
corrupt("provisioned_entry_mismatch", `Provisioned entry ${target.id} exists with content different from its intent`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function validateResultEntry(entriesById, resultEntryId, matches, description) {
|
|
27
|
-
const entry = entriesById.get(resultEntryId);
|
|
28
|
-
if (entry && !matches(entry)) {
|
|
29
|
-
corrupt("provisioned_entry_mismatch", `Provisioned ${description} entry ${resultEntryId} exists with different content`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function validateAttemptReason(record) {
|
|
33
|
-
const reason = record.compactionReason;
|
|
34
|
-
if (record.step === "compaction") {
|
|
35
|
-
if (reason !== "manual" && reason !== "threshold" && reason !== "overflow") {
|
|
36
|
-
corrupt("invalid_compaction_reason", `Compaction attempt ${record.id} has no valid compaction reason`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
else if (reason !== undefined) {
|
|
40
|
-
corrupt("invalid_compaction_reason", `${record.step} attempt ${record.id} has a compaction reason`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function validateAttemptSequence(record, previous, entriesById) {
|
|
44
|
-
const previousRecord = previous?.record;
|
|
45
|
-
const previousResult = previousRecord ? entriesById.get(previousRecord.resultEntryId) : undefined;
|
|
46
|
-
const continuesSeries = previousRecord !== undefined &&
|
|
47
|
-
previousRecord.step === record.step &&
|
|
48
|
-
(previousResult === undefined || previousResult.seq >= record.seq);
|
|
49
|
-
const expectedAttempt = continuesSeries ? previousRecord.attempt + 1 : 1;
|
|
50
|
-
if (record.attempt !== expectedAttempt) {
|
|
51
|
-
corrupt("non_consecutive_attempt", `${record.step} attempt ${record.id} is ${record.attempt}; expected ${expectedAttempt}`);
|
|
52
|
-
}
|
|
53
|
-
if (!continuesSeries || record.step === "assistant" || previousRecord === undefined)
|
|
54
|
-
return;
|
|
55
|
-
if (record.resultEntryId !== previousRecord.resultEntryId) {
|
|
56
|
-
corrupt("inconsistent_step", `${record.step} attempts disagree on their result entry id`);
|
|
57
|
-
}
|
|
58
|
-
if (record.compactionReason !== previousRecord.compactionReason) {
|
|
59
|
-
corrupt("inconsistent_step", `${record.step} attempts disagree on their compaction reason`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function validateAttemptResult(entriesById, record) {
|
|
63
|
-
switch (record.step) {
|
|
64
|
-
case "assistant":
|
|
65
|
-
validateResultEntry(entriesById, record.resultEntryId, (entry) => entry.type === "message" && entry.message.role === "assistant", "assistant result");
|
|
66
|
-
break;
|
|
67
|
-
case "compaction":
|
|
68
|
-
validateResultEntry(entriesById, record.resultEntryId, (entry) => entry.type === "compaction", "compaction result");
|
|
69
|
-
break;
|
|
70
|
-
case "branch_summary":
|
|
71
|
-
validateResultEntry(entriesById, record.resultEntryId, (entry) => entry.type === "branch_summary", "branch-summary result");
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
function validateToolStart(record, entriesById, invocations) {
|
|
76
|
-
const invocation = `${record.assistantEntryId}\u0000${record.toolIndex}`;
|
|
77
|
-
if (invocations.has(invocation)) {
|
|
78
|
-
corrupt("duplicate_tool_invocation", `Tool invocation ${record.assistantEntryId}:${record.toolIndex} is duplicated`);
|
|
79
|
-
}
|
|
80
|
-
invocations.add(invocation);
|
|
81
|
-
const assistantEntry = entriesById.get(record.assistantEntryId);
|
|
82
|
-
if (!assistantEntry || assistantEntry.type !== "message" || assistantEntry.message.role !== "assistant") {
|
|
83
|
-
corrupt("tool_call_mismatch", `Tool start ${record.id} does not reference an assistant entry`);
|
|
84
|
-
}
|
|
85
|
-
const toolCalls = assistantEntry.message.content.filter((content) => content.type === "toolCall");
|
|
86
|
-
const toolCall = toolCalls[record.toolIndex];
|
|
87
|
-
if (!toolCall || toolCall.id !== record.toolCallId || toolCall.name !== record.toolName) {
|
|
88
|
-
corrupt("tool_call_mismatch", `Tool start ${record.id} does not match its assistant tool-call ordinal`);
|
|
89
|
-
}
|
|
90
|
-
validateResultEntry(entriesById, record.resultEntryId, (entry) => entry.type === "message" &&
|
|
91
|
-
entry.message.role === "toolResult" &&
|
|
92
|
-
entry.message.toolCallId === record.toolCallId &&
|
|
93
|
-
entry.message.toolName === record.toolName, "tool result");
|
|
94
|
-
}
|
|
95
|
-
function validateDeferredHandles(entries) {
|
|
96
|
-
for (const entry of entries) {
|
|
97
|
-
if (entry.type === "message" &&
|
|
98
|
-
entry.message.role === "assistant" &&
|
|
99
|
-
entry.message.stopReason === "deferred" &&
|
|
100
|
-
!entry.message.deferred) {
|
|
101
|
-
corrupt("invalid_deferred_handle", `Deferred assistant entry ${entry.id} does not carry a handle`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
function validateOperationResult(entriesById, record) {
|
|
106
|
-
switch (record.intent.kind) {
|
|
107
|
-
case "run":
|
|
108
|
-
for (const target of record.intent.initialMessages)
|
|
109
|
-
validateExactProvisionedEntry(entriesById, target);
|
|
110
|
-
break;
|
|
111
|
-
case "compaction":
|
|
112
|
-
validateResultEntry(entriesById, record.intent.resultEntryId, (entry) => entry.type === "compaction", "manual compaction");
|
|
113
|
-
break;
|
|
114
|
-
case "navigation":
|
|
115
|
-
if (record.intent.summaryEntryId) {
|
|
116
|
-
validateResultEntry(entriesById, record.intent.summaryEntryId, (entry) => entry.type === "branch_summary", "navigation summary");
|
|
117
|
-
}
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/** Validates a bounded lane recovery slice without reading or mutating session state. */
|
|
122
|
-
export function validateRecordLog(input) {
|
|
123
|
-
if (input.openOperations.length > 1) {
|
|
124
|
-
corrupt("multiple_open_operations", `Lane ${input.lane} has at least two open operations`);
|
|
125
|
-
}
|
|
126
|
-
const entriesById = new Map(input.entries.map((entry) => [entry.id, entry]));
|
|
127
|
-
validateDeferredHandles(entriesById.values());
|
|
128
|
-
const starts = new Map();
|
|
129
|
-
const finishedAt = new Map();
|
|
130
|
-
const abortedAt = new Map();
|
|
131
|
-
const queueEnqueues = new Map();
|
|
132
|
-
const latestAttempt = new Map();
|
|
133
|
-
const toolInvocations = new Set();
|
|
134
|
-
const records = [...input.records].sort((left, right) => left.seq - right.seq);
|
|
135
|
-
for (const record of records) {
|
|
136
|
-
if (record.type === "operation_started") {
|
|
137
|
-
starts.set(record.id, record);
|
|
138
|
-
validateOperationResult(entriesById, record);
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (hasRunId(record)) {
|
|
142
|
-
if (!starts.has(record.runId)) {
|
|
143
|
-
corrupt("unknown_operation", `Record ${record.id} references unknown operation ${record.runId}`);
|
|
144
|
-
}
|
|
145
|
-
const finishSeq = finishedAt.get(record.runId);
|
|
146
|
-
if (finishSeq !== undefined && record.seq > finishSeq) {
|
|
147
|
-
corrupt("record_after_finish", `Record ${record.id} follows the finish of operation ${record.runId}`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
switch (record.type) {
|
|
151
|
-
case "operation_finished":
|
|
152
|
-
finishedAt.set(record.runId, record.seq);
|
|
153
|
-
break;
|
|
154
|
-
case "abort_requested":
|
|
155
|
-
abortedAt.set(record.runId, record.seq);
|
|
156
|
-
break;
|
|
157
|
-
case "step_attempt":
|
|
158
|
-
validateAttemptReason(record);
|
|
159
|
-
validateAttemptSequence(record, latestAttempt.get(record.runId), entriesById);
|
|
160
|
-
validateAttemptResult(entriesById, record);
|
|
161
|
-
latestAttempt.set(record.runId, { record });
|
|
162
|
-
break;
|
|
163
|
-
case "tool_started":
|
|
164
|
-
validateToolStart(record, entriesById, toolInvocations);
|
|
165
|
-
break;
|
|
166
|
-
case "queue_enqueued":
|
|
167
|
-
if (record.queue !== "nextRun" &&
|
|
168
|
-
abortedAt.get(record.runId) !== undefined &&
|
|
169
|
-
record.seq > abortedAt.get(record.runId)) {
|
|
170
|
-
corrupt("queue_after_abort", `${record.queue} item ${record.target.id} was enqueued after abort`);
|
|
171
|
-
}
|
|
172
|
-
queueEnqueues.set(record.target.id, record);
|
|
173
|
-
validateExactProvisionedEntry(entriesById, record.target);
|
|
174
|
-
break;
|
|
175
|
-
case "queue_cancelled": {
|
|
176
|
-
const enqueue = queueEnqueues.get(record.entryId);
|
|
177
|
-
if (!enqueue ||
|
|
178
|
-
enqueue.seq >= record.seq ||
|
|
179
|
-
enqueue.runId !== record.runId ||
|
|
180
|
-
entriesById.has(record.entryId)) {
|
|
181
|
-
corrupt("invalid_queue_cancellation", `Queue cancellation ${record.id} has no pending matching enqueue`);
|
|
182
|
-
}
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
case "write_deferred":
|
|
186
|
-
validateExactProvisionedEntry(entriesById, record.target);
|
|
187
|
-
break;
|
|
188
|
-
case "usage":
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
function clone(value) {
|
|
194
|
-
return structuredClone(value);
|
|
195
|
-
}
|
|
196
|
-
function bySequence(values) {
|
|
197
|
-
return [...values].sort((left, right) => left.seq - right.seq);
|
|
198
|
-
}
|
|
199
|
-
function deriveEffectiveConfiguration(input) {
|
|
200
|
-
let configuration = clone(input.defaults);
|
|
201
|
-
const entriesById = new Map();
|
|
202
|
-
for (const entry of [...input.configurationEntries, ...input.ownEntries])
|
|
203
|
-
entriesById.set(entry.id, entry);
|
|
204
|
-
for (const entry of bySequence([...entriesById.values()])) {
|
|
205
|
-
switch (entry.type) {
|
|
206
|
-
case "model_change":
|
|
207
|
-
configuration = { ...configuration, model: { provider: entry.provider, modelId: entry.modelId } };
|
|
208
|
-
break;
|
|
209
|
-
case "thinking_level_change":
|
|
210
|
-
configuration = { ...configuration, thinkingLevel: entry.thinkingLevel };
|
|
211
|
-
break;
|
|
212
|
-
case "active_tools_change":
|
|
213
|
-
configuration = { ...configuration, activeToolNames: [...entry.activeToolNames] };
|
|
214
|
-
break;
|
|
215
|
-
case "message":
|
|
216
|
-
if (entry.message.role === "assistant") {
|
|
217
|
-
configuration = {
|
|
218
|
-
...configuration,
|
|
219
|
-
model: { provider: entry.message.provider, modelId: entry.message.model },
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return configuration;
|
|
226
|
-
}
|
|
227
|
-
function deriveNewestOwn(entry) {
|
|
228
|
-
if (!entry)
|
|
229
|
-
return null;
|
|
230
|
-
if (entry.type !== "message")
|
|
231
|
-
return { entryId: entry.id, type: entry.type };
|
|
232
|
-
if (entry.message.role !== "assistant") {
|
|
233
|
-
return { entryId: entry.id, type: entry.type, role: entry.message.role };
|
|
234
|
-
}
|
|
235
|
-
return {
|
|
236
|
-
entryId: entry.id,
|
|
237
|
-
type: entry.type,
|
|
238
|
-
role: entry.message.role,
|
|
239
|
-
stopReason: entry.message.stopReason,
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
function deriveToolBatch(operationId, records, ownEntries, entriesById, deferredWriteIds) {
|
|
243
|
-
const assistantEntry = [...ownEntries]
|
|
244
|
-
.reverse()
|
|
245
|
-
.find((entry) => entry.type === "message" &&
|
|
246
|
-
entry.message.role === "assistant" &&
|
|
247
|
-
entry.message.content.some((content) => content.type === "toolCall"));
|
|
248
|
-
if (!assistantEntry || assistantEntry.type !== "message" || assistantEntry.message.role !== "assistant")
|
|
249
|
-
return null;
|
|
250
|
-
const toolCalls = assistantEntry.message.content.filter((content) => content.type === "toolCall");
|
|
251
|
-
const starts = new Map();
|
|
252
|
-
for (const record of records) {
|
|
253
|
-
if (record.type === "tool_started" &&
|
|
254
|
-
record.runId === operationId &&
|
|
255
|
-
record.assistantEntryId === assistantEntry.id) {
|
|
256
|
-
starts.set(record.toolIndex, record);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
const calls = toolCalls.map((toolCall, toolIndex) => {
|
|
260
|
-
const started = starts.get(toolIndex);
|
|
261
|
-
const startedResult = started ? entriesById.get(started.resultEntryId) : undefined;
|
|
262
|
-
const blockedResult = ownEntries.find((entry) => entry.seq > assistantEntry.seq &&
|
|
263
|
-
!deferredWriteIds.has(entry.id) &&
|
|
264
|
-
entry.type === "message" &&
|
|
265
|
-
entry.message.role === "toolResult" &&
|
|
266
|
-
entry.message.toolCallId === toolCall.id);
|
|
267
|
-
const result = startedResult ?? blockedResult;
|
|
268
|
-
return {
|
|
269
|
-
toolIndex,
|
|
270
|
-
toolCall: clone(toolCall),
|
|
271
|
-
...(started ? { started: clone(started) } : {}),
|
|
272
|
-
resultExists: result !== undefined,
|
|
273
|
-
...(result?.type === "message" && result.terminate === true ? { terminate: true } : {}),
|
|
274
|
-
};
|
|
275
|
-
});
|
|
276
|
-
return {
|
|
277
|
-
assistantEntryId: assistantEntry.id,
|
|
278
|
-
calls,
|
|
279
|
-
truncated: assistantEntry.message.stopReason === "length",
|
|
280
|
-
unresolved: calls.some((call) => !call.resultExists),
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
/** Purely reconstructs one lane's orchestration state from its bounded recovery inputs. */
|
|
284
|
-
export function reduceLaneState(input) {
|
|
285
|
-
validateRecordLog(input);
|
|
286
|
-
const records = bySequence(input.records);
|
|
287
|
-
const ownEntries = bySequence(input.ownEntries);
|
|
288
|
-
const entriesById = new Map();
|
|
289
|
-
for (const entry of [...input.entries, ...ownEntries])
|
|
290
|
-
entriesById.set(entry.id, entry);
|
|
291
|
-
const cancelledQueueIds = new Set(records.filter((record) => record.type === "queue_cancelled").map((record) => record.entryId));
|
|
292
|
-
const pendingQueueRecords = records.filter((record) => record.type === "queue_enqueued" &&
|
|
293
|
-
!entriesById.has(record.target.id) &&
|
|
294
|
-
!cancelledQueueIds.has(record.target.id));
|
|
295
|
-
const started = input.openOperations[0];
|
|
296
|
-
const capturedInitialMessageIds = new Set(started?.intent.kind === "run" ? started.intent.initialMessages.map((target) => target.id) : []);
|
|
297
|
-
const pendingNextRun = pendingQueueRecords
|
|
298
|
-
.filter((record) => record.queue === "nextRun" && !capturedInitialMessageIds.has(record.target.id))
|
|
299
|
-
.map((record) => clone(record.target));
|
|
300
|
-
const effectiveConfiguration = deriveEffectiveConfiguration(input);
|
|
301
|
-
if (!started) {
|
|
302
|
-
return {
|
|
303
|
-
laneState: { lane: input.lane, leafId: input.leafId, operation: null, pendingNextRun },
|
|
304
|
-
effectiveConfiguration,
|
|
305
|
-
terminalFailure: null,
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
const operationRecords = records.filter((record) => record.type === "operation_started" ? record.id === started.id : "runId" in record && record.runId === started.id);
|
|
309
|
-
const aborting = operationRecords.some((record) => record.type === "abort_requested");
|
|
310
|
-
const pendingSteer = aborting
|
|
311
|
-
? []
|
|
312
|
-
: pendingQueueRecords
|
|
313
|
-
.filter((record) => record.queue === "steer" && record.runId === started.id)
|
|
314
|
-
.map((record) => clone(record.target));
|
|
315
|
-
const pendingFollowUp = aborting
|
|
316
|
-
? []
|
|
317
|
-
: pendingQueueRecords
|
|
318
|
-
.filter((record) => record.queue === "followUp" && record.runId === started.id)
|
|
319
|
-
.map((record) => clone(record.target));
|
|
320
|
-
const pendingWrites = operationRecords
|
|
321
|
-
.filter((record) => record.type === "write_deferred" && !entriesById.has(record.target.id))
|
|
322
|
-
.map((record) => clone(record.target));
|
|
323
|
-
const missingInitialMessages = started.intent.kind === "run"
|
|
324
|
-
? started.intent.initialMessages.filter((target) => !entriesById.has(target.id)).map(clone)
|
|
325
|
-
: [];
|
|
326
|
-
const newestAttempt = operationRecords.filter((record) => record.type === "step_attempt").at(-1);
|
|
327
|
-
const step = newestAttempt && !entriesById.has(newestAttempt.resultEntryId)
|
|
328
|
-
? {
|
|
329
|
-
kind: newestAttempt.step,
|
|
330
|
-
attempts: newestAttempt.attempt,
|
|
331
|
-
resultEntryId: newestAttempt.resultEntryId,
|
|
332
|
-
...(newestAttempt.step === "compaction" ? { compactionReason: newestAttempt.compactionReason } : {}),
|
|
333
|
-
}
|
|
334
|
-
: null;
|
|
335
|
-
const consumedInputIds = new Set();
|
|
336
|
-
if (started.intent.kind === "run") {
|
|
337
|
-
for (const target of started.intent.initialMessages)
|
|
338
|
-
consumedInputIds.add(target.id);
|
|
339
|
-
}
|
|
340
|
-
for (const record of operationRecords) {
|
|
341
|
-
if (record.type === "queue_enqueued" && record.queue !== "nextRun")
|
|
342
|
-
consumedInputIds.add(record.target.id);
|
|
343
|
-
}
|
|
344
|
-
let newestConsumedInputSequence = Number.NEGATIVE_INFINITY;
|
|
345
|
-
for (const id of consumedInputIds) {
|
|
346
|
-
const entry = entriesById.get(id);
|
|
347
|
-
if (entry?.type === "message")
|
|
348
|
-
newestConsumedInputSequence = Math.max(newestConsumedInputSequence, entry.seq);
|
|
349
|
-
}
|
|
350
|
-
const overflowRecoveryUsed = operationRecords.some((record) => record.type === "step_attempt" &&
|
|
351
|
-
record.step === "compaction" &&
|
|
352
|
-
record.compactionReason === "overflow" &&
|
|
353
|
-
record.seq > newestConsumedInputSequence);
|
|
354
|
-
const newestOwnEntry = ownEntries.at(-1);
|
|
355
|
-
const newestOwn = deriveNewestOwn(newestOwnEntry);
|
|
356
|
-
const deferred = newestOwnEntry?.type === "message" &&
|
|
357
|
-
newestOwnEntry.message.role === "assistant" &&
|
|
358
|
-
newestOwnEntry.message.stopReason === "deferred" &&
|
|
359
|
-
newestOwnEntry.message.deferred
|
|
360
|
-
? clone(newestOwnEntry.message.deferred)
|
|
361
|
-
: null;
|
|
362
|
-
const targets = {};
|
|
363
|
-
if (started.intent.kind === "compaction") {
|
|
364
|
-
targets.result = entriesById.has(started.intent.resultEntryId);
|
|
365
|
-
}
|
|
366
|
-
else if (started.intent.kind === "navigation" && started.intent.summaryEntryId) {
|
|
367
|
-
targets.summary = entriesById.has(started.intent.summaryEntryId);
|
|
368
|
-
}
|
|
369
|
-
const deferredWriteIds = new Set(operationRecords.filter((record) => record.type === "write_deferred").map((record) => record.target.id));
|
|
370
|
-
let terminalFailure = null;
|
|
371
|
-
if (newestOwnEntry?.type === "message" &&
|
|
372
|
-
newestOwnEntry.message.role === "assistant" &&
|
|
373
|
-
newestOwnEntry.message.stopReason === "error" &&
|
|
374
|
-
!deferredWriteIds.has(newestOwnEntry.id)) {
|
|
375
|
-
const producedByStep = operationRecords.some((record) => record.type === "step_attempt" && record.resultEntryId === newestOwnEntry.id);
|
|
376
|
-
const previousOwnEntry = ownEntries.at(-2);
|
|
377
|
-
const producedByDeferredFetch = operationRecords.some((record) => record.type === "usage" && record.cause === "deferred_fetch" && record.entryId === newestOwnEntry.id) ||
|
|
378
|
-
(previousOwnEntry?.type === "message" &&
|
|
379
|
-
previousOwnEntry.message.role === "assistant" &&
|
|
380
|
-
previousOwnEntry.message.stopReason === "deferred");
|
|
381
|
-
if (producedByStep || producedByDeferredFetch) {
|
|
382
|
-
terminalFailure = {
|
|
383
|
-
entryId: newestOwnEntry.id,
|
|
384
|
-
source: producedByStep ? "step" : "deferred_fetch",
|
|
385
|
-
message: clone(newestOwnEntry.message),
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
return {
|
|
390
|
-
laneState: {
|
|
391
|
-
lane: input.lane,
|
|
392
|
-
leafId: input.leafId,
|
|
393
|
-
operation: {
|
|
394
|
-
id: started.id,
|
|
395
|
-
kind: started.intent.kind,
|
|
396
|
-
intent: clone(started.intent),
|
|
397
|
-
aborting,
|
|
398
|
-
step,
|
|
399
|
-
toolBatch: deriveToolBatch(started.id, operationRecords, ownEntries, entriesById, deferredWriteIds),
|
|
400
|
-
missingInitialMessages,
|
|
401
|
-
pendingSteer,
|
|
402
|
-
pendingFollowUp,
|
|
403
|
-
pendingWrites,
|
|
404
|
-
deferred,
|
|
405
|
-
overflowRecoveryUsed,
|
|
406
|
-
newestOwn,
|
|
407
|
-
targets,
|
|
408
|
-
},
|
|
409
|
-
pendingNextRun,
|
|
410
|
-
},
|
|
411
|
-
effectiveConfiguration,
|
|
412
|
-
terminalFailure,
|
|
413
|
-
};
|
|
414
|
-
}
|
|
415
|
-
//# sourceMappingURL=reducer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.js","sourceRoot":"","sources":["../../src/harness/reducer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, DeferredHandle, StopReason } from \"@earendil-works/pi-ai\";\nimport { Guard } from \"typebox/guard\";\nimport type { AgentMessage, AgentToolCall, ThinkingLevel } from \"../types.ts\";\nimport type {\n\tEntry,\n\tLaneRecord,\n\tOperationStartedRecord,\n\tProvisionedEntry,\n\tQueueEnqueuedRecord,\n\tStepAttemptRecord,\n\tToolStartedRecord,\n\tWriteDeferredRecord,\n} from \"./session/types.ts\";\n\n/**\n * Machine-readable category for a contradiction in a lane's durable recovery\n * slice. These indicate states the single-writer record protocol cannot\n * produce, not ordinary operation failures or incomplete-but-recoverable\n * intent/result prefixes. Restore must reject such states rather than repair or\n * continue it; the accompanying error message supplies human-readable detail.\n */\nexport type RecordLogCorruptionReason =\n\t| \"multiple_open_operations\"\n\t| \"unknown_operation\"\n\t| \"record_after_finish\"\n\t| \"non_consecutive_attempt\"\n\t| \"invalid_compaction_reason\"\n\t| \"queue_after_abort\"\n\t| \"invalid_queue_cancellation\"\n\t| \"inconsistent_step\"\n\t| \"tool_call_mismatch\"\n\t| \"duplicate_tool_invocation\"\n\t| \"provisioned_entry_mismatch\"\n\t| \"invalid_deferred_handle\";\n\nexport class RecordLogCorruption extends Error {\n\treadonly reason: RecordLogCorruptionReason;\n\n\tconstructor(reason: RecordLogCorruptionReason, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RecordLogCorruption\";\n\t\tthis.reason = reason;\n\t}\n}\n\nexport interface RecordLogSlice {\n\tlane: string;\n\topenOperations: readonly OperationStartedRecord[];\n\trecords: readonly LaneRecord[];\n\t/** Operation-owned entries plus entries fetched directly by provisioned or referenced ids. */\n\tentries: readonly Entry[];\n}\n\nexport interface EffectiveLaneConfiguration {\n\tmodel: { provider: string; modelId: string };\n\tthinkingLevel: ThinkingLevel;\n\tactiveToolNames: string[];\n}\n\nexport interface TerminalFailureState {\n\tentryId: string;\n\tsource: \"step\" | \"deferred_fetch\";\n\tmessage: AssistantMessage;\n}\n\nexport interface ToolBatchState {\n\tassistantEntryId: string;\n\tcalls: {\n\t\ttoolIndex: number;\n\t\ttoolCall: AgentToolCall;\n\t\tstarted?: ToolStartedRecord;\n\t\tresultExists: boolean;\n\t\tterminate?: boolean;\n\t}[];\n\ttruncated: boolean;\n\tunresolved: boolean;\n}\n\nexport interface LaneState {\n\tlane: string;\n\tleafId: string | null;\n\toperation: null | {\n\t\tid: string;\n\t\tkind: \"run\" | \"compaction\" | \"navigation\";\n\t\tintent: OperationStartedRecord[\"intent\"];\n\t\taborting: boolean;\n\t\tstep: null | {\n\t\t\tkind: \"assistant\" | \"compaction\" | \"branch_summary\";\n\t\t\tattempts: number;\n\t\t\tresultEntryId: string;\n\t\t\tcompactionReason?: \"manual\" | \"threshold\" | \"overflow\";\n\t\t};\n\t\ttoolBatch: ToolBatchState | null;\n\t\tmissingInitialMessages: ProvisionedEntry[];\n\t\tpendingSteer: ProvisionedEntry[];\n\t\tpendingFollowUp: ProvisionedEntry[];\n\t\tpendingWrites: ProvisionedEntry[];\n\t\tdeferred: DeferredHandle | null;\n\t\toverflowRecoveryUsed: boolean;\n\t\tnewestOwn: null | {\n\t\t\tentryId: string;\n\t\t\ttype: Entry[\"type\"];\n\t\t\trole?: AgentMessage[\"role\"];\n\t\t\tstopReason?: StopReason;\n\t\t};\n\t\ttargets: { result?: boolean; summary?: boolean };\n\t};\n\tpendingNextRun: ProvisionedEntry[];\n}\n\nexport interface LaneReductionInput extends RecordLogSlice {\n\tleafId: string | null;\n\t/** Entries appended by the open operation, oldest first. Empty when idle. */\n\townEntries: readonly Entry[];\n\t/** Bounded effective-state lookups at the operation anchor or idle leaf, oldest first. */\n\tconfigurationEntries: readonly Entry[];\n\t/** Harness option fallbacks used when no persisted value exists. */\n\tdefaults: EffectiveLaneConfiguration;\n}\n\nexport interface LaneReductionResult {\n\tlaneState: LaneState;\n\teffectiveConfiguration: EffectiveLaneConfiguration;\n\tterminalFailure: TerminalFailureState | null;\n}\n\ninterface AttemptSeries {\n\trecord: StepAttemptRecord;\n}\n\nfunction corrupt(reason: RecordLogCorruptionReason, message: string): never {\n\tthrow new RecordLogCorruption(reason, message);\n}\n\nfunction hasRunId(record: LaneRecord): record is Exclude<LaneRecord, OperationStartedRecord> & { runId: string } {\n\treturn \"runId\" in record && typeof record.runId === \"string\";\n}\n\nfunction matchesProvisionedEntry(entry: Entry, target: ProvisionedEntry): boolean {\n\tconst { parentId: _parentId, seq: _seq, timestamp: _timestamp, ...payload } = entry;\n\treturn Guard.IsDeepEqual(payload, target);\n}\n\nfunction validateExactProvisionedEntry(entriesById: ReadonlyMap<string, Entry>, target: ProvisionedEntry): void {\n\tconst entry = entriesById.get(target.id);\n\tif (entry && !matchesProvisionedEntry(entry, target)) {\n\t\tcorrupt(\n\t\t\t\"provisioned_entry_mismatch\",\n\t\t\t`Provisioned entry ${target.id} exists with content different from its intent`,\n\t\t);\n\t}\n}\n\nfunction validateResultEntry(\n\tentriesById: ReadonlyMap<string, Entry>,\n\tresultEntryId: string,\n\tmatches: (entry: Entry) => boolean,\n\tdescription: string,\n): void {\n\tconst entry = entriesById.get(resultEntryId);\n\tif (entry && !matches(entry)) {\n\t\tcorrupt(\n\t\t\t\"provisioned_entry_mismatch\",\n\t\t\t`Provisioned ${description} entry ${resultEntryId} exists with different content`,\n\t\t);\n\t}\n}\n\nfunction validateAttemptReason(record: StepAttemptRecord): void {\n\tconst reason = (record as { compactionReason?: unknown }).compactionReason;\n\tif (record.step === \"compaction\") {\n\t\tif (reason !== \"manual\" && reason !== \"threshold\" && reason !== \"overflow\") {\n\t\t\tcorrupt(\"invalid_compaction_reason\", `Compaction attempt ${record.id} has no valid compaction reason`);\n\t\t}\n\t} else if (reason !== undefined) {\n\t\tcorrupt(\"invalid_compaction_reason\", `${record.step} attempt ${record.id} has a compaction reason`);\n\t}\n}\n\nfunction validateAttemptSequence(\n\trecord: StepAttemptRecord,\n\tprevious: AttemptSeries | undefined,\n\tentriesById: ReadonlyMap<string, Entry>,\n): void {\n\tconst previousRecord = previous?.record;\n\tconst previousResult = previousRecord ? entriesById.get(previousRecord.resultEntryId) : undefined;\n\tconst continuesSeries =\n\t\tpreviousRecord !== undefined &&\n\t\tpreviousRecord.step === record.step &&\n\t\t(previousResult === undefined || previousResult.seq >= record.seq);\n\tconst expectedAttempt = continuesSeries ? previousRecord.attempt + 1 : 1;\n\tif (record.attempt !== expectedAttempt) {\n\t\tcorrupt(\n\t\t\t\"non_consecutive_attempt\",\n\t\t\t`${record.step} attempt ${record.id} is ${record.attempt}; expected ${expectedAttempt}`,\n\t\t);\n\t}\n\tif (!continuesSeries || record.step === \"assistant\" || previousRecord === undefined) return;\n\tif (record.resultEntryId !== previousRecord.resultEntryId) {\n\t\tcorrupt(\"inconsistent_step\", `${record.step} attempts disagree on their result entry id`);\n\t}\n\tif (record.compactionReason !== previousRecord.compactionReason) {\n\t\tcorrupt(\"inconsistent_step\", `${record.step} attempts disagree on their compaction reason`);\n\t}\n}\n\nfunction validateAttemptResult(entriesById: ReadonlyMap<string, Entry>, record: StepAttemptRecord): void {\n\tswitch (record.step) {\n\t\tcase \"assistant\":\n\t\t\tvalidateResultEntry(\n\t\t\t\tentriesById,\n\t\t\t\trecord.resultEntryId,\n\t\t\t\t(entry) => entry.type === \"message\" && entry.message.role === \"assistant\",\n\t\t\t\t\"assistant result\",\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"compaction\":\n\t\t\tvalidateResultEntry(\n\t\t\t\tentriesById,\n\t\t\t\trecord.resultEntryId,\n\t\t\t\t(entry) => entry.type === \"compaction\",\n\t\t\t\t\"compaction result\",\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"branch_summary\":\n\t\t\tvalidateResultEntry(\n\t\t\t\tentriesById,\n\t\t\t\trecord.resultEntryId,\n\t\t\t\t(entry) => entry.type === \"branch_summary\",\n\t\t\t\t\"branch-summary result\",\n\t\t\t);\n\t\t\tbreak;\n\t}\n}\n\nfunction validateToolStart(\n\trecord: Extract<LaneRecord, { type: \"tool_started\" }>,\n\tentriesById: ReadonlyMap<string, Entry>,\n\tinvocations: Set<string>,\n): void {\n\tconst invocation = `${record.assistantEntryId}\\u0000${record.toolIndex}`;\n\tif (invocations.has(invocation)) {\n\t\tcorrupt(\n\t\t\t\"duplicate_tool_invocation\",\n\t\t\t`Tool invocation ${record.assistantEntryId}:${record.toolIndex} is duplicated`,\n\t\t);\n\t}\n\tinvocations.add(invocation);\n\n\tconst assistantEntry = entriesById.get(record.assistantEntryId);\n\tif (!assistantEntry || assistantEntry.type !== \"message\" || assistantEntry.message.role !== \"assistant\") {\n\t\tcorrupt(\"tool_call_mismatch\", `Tool start ${record.id} does not reference an assistant entry`);\n\t}\n\tconst toolCalls = assistantEntry.message.content.filter((content) => content.type === \"toolCall\");\n\tconst toolCall = toolCalls[record.toolIndex];\n\tif (!toolCall || toolCall.id !== record.toolCallId || toolCall.name !== record.toolName) {\n\t\tcorrupt(\"tool_call_mismatch\", `Tool start ${record.id} does not match its assistant tool-call ordinal`);\n\t}\n\n\tvalidateResultEntry(\n\t\tentriesById,\n\t\trecord.resultEntryId,\n\t\t(entry) =>\n\t\t\tentry.type === \"message\" &&\n\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\tentry.message.toolCallId === record.toolCallId &&\n\t\t\tentry.message.toolName === record.toolName,\n\t\t\"tool result\",\n\t);\n}\n\nfunction validateDeferredHandles(entries: Iterable<Entry>): void {\n\tfor (const entry of entries) {\n\t\tif (\n\t\t\tentry.type === \"message\" &&\n\t\t\tentry.message.role === \"assistant\" &&\n\t\t\tentry.message.stopReason === \"deferred\" &&\n\t\t\t!entry.message.deferred\n\t\t) {\n\t\t\tcorrupt(\"invalid_deferred_handle\", `Deferred assistant entry ${entry.id} does not carry a handle`);\n\t\t}\n\t}\n}\n\nfunction validateOperationResult(entriesById: ReadonlyMap<string, Entry>, record: OperationStartedRecord): void {\n\tswitch (record.intent.kind) {\n\t\tcase \"run\":\n\t\t\tfor (const target of record.intent.initialMessages) validateExactProvisionedEntry(entriesById, target);\n\t\t\tbreak;\n\t\tcase \"compaction\":\n\t\t\tvalidateResultEntry(\n\t\t\t\tentriesById,\n\t\t\t\trecord.intent.resultEntryId,\n\t\t\t\t(entry) => entry.type === \"compaction\",\n\t\t\t\t\"manual compaction\",\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"navigation\":\n\t\t\tif (record.intent.summaryEntryId) {\n\t\t\t\tvalidateResultEntry(\n\t\t\t\t\tentriesById,\n\t\t\t\t\trecord.intent.summaryEntryId,\n\t\t\t\t\t(entry) => entry.type === \"branch_summary\",\n\t\t\t\t\t\"navigation summary\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\n/** Validates a bounded lane recovery slice without reading or mutating session state. */\nexport function validateRecordLog(input: RecordLogSlice): void {\n\tif (input.openOperations.length > 1) {\n\t\tcorrupt(\"multiple_open_operations\", `Lane ${input.lane} has at least two open operations`);\n\t}\n\n\tconst entriesById = new Map(input.entries.map((entry) => [entry.id, entry]));\n\tvalidateDeferredHandles(entriesById.values());\n\tconst starts = new Map<string, OperationStartedRecord>();\n\tconst finishedAt = new Map<string, number>();\n\tconst abortedAt = new Map<string, number>();\n\tconst queueEnqueues = new Map<string, Extract<LaneRecord, { type: \"queue_enqueued\" }>>();\n\tconst latestAttempt = new Map<string, AttemptSeries>();\n\tconst toolInvocations = new Set<string>();\n\tconst records = [...input.records].sort((left, right) => left.seq - right.seq);\n\n\tfor (const record of records) {\n\t\tif (record.type === \"operation_started\") {\n\t\t\tstarts.set(record.id, record);\n\t\t\tvalidateOperationResult(entriesById, record);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (hasRunId(record)) {\n\t\t\tif (!starts.has(record.runId)) {\n\t\t\t\tcorrupt(\"unknown_operation\", `Record ${record.id} references unknown operation ${record.runId}`);\n\t\t\t}\n\t\t\tconst finishSeq = finishedAt.get(record.runId);\n\t\t\tif (finishSeq !== undefined && record.seq > finishSeq) {\n\t\t\t\tcorrupt(\"record_after_finish\", `Record ${record.id} follows the finish of operation ${record.runId}`);\n\t\t\t}\n\t\t}\n\n\t\tswitch (record.type) {\n\t\t\tcase \"operation_finished\":\n\t\t\t\tfinishedAt.set(record.runId, record.seq);\n\t\t\t\tbreak;\n\t\t\tcase \"abort_requested\":\n\t\t\t\tabortedAt.set(record.runId, record.seq);\n\t\t\t\tbreak;\n\t\t\tcase \"step_attempt\":\n\t\t\t\tvalidateAttemptReason(record);\n\t\t\t\tvalidateAttemptSequence(record, latestAttempt.get(record.runId), entriesById);\n\t\t\t\tvalidateAttemptResult(entriesById, record);\n\t\t\t\tlatestAttempt.set(record.runId, { record });\n\t\t\t\tbreak;\n\t\t\tcase \"tool_started\":\n\t\t\t\tvalidateToolStart(record, entriesById, toolInvocations);\n\t\t\t\tbreak;\n\t\t\tcase \"queue_enqueued\":\n\t\t\t\tif (\n\t\t\t\t\trecord.queue !== \"nextRun\" &&\n\t\t\t\t\tabortedAt.get(record.runId) !== undefined &&\n\t\t\t\t\trecord.seq > abortedAt.get(record.runId)!\n\t\t\t\t) {\n\t\t\t\t\tcorrupt(\"queue_after_abort\", `${record.queue} item ${record.target.id} was enqueued after abort`);\n\t\t\t\t}\n\t\t\t\tqueueEnqueues.set(record.target.id, record);\n\t\t\t\tvalidateExactProvisionedEntry(entriesById, record.target);\n\t\t\t\tbreak;\n\t\t\tcase \"queue_cancelled\": {\n\t\t\t\tconst enqueue = queueEnqueues.get(record.entryId);\n\t\t\t\tif (\n\t\t\t\t\t!enqueue ||\n\t\t\t\t\tenqueue.seq >= record.seq ||\n\t\t\t\t\tenqueue.runId !== record.runId ||\n\t\t\t\t\tentriesById.has(record.entryId)\n\t\t\t\t) {\n\t\t\t\t\tcorrupt(\"invalid_queue_cancellation\", `Queue cancellation ${record.id} has no pending matching enqueue`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"write_deferred\":\n\t\t\t\tvalidateExactProvisionedEntry(entriesById, record.target);\n\t\t\t\tbreak;\n\t\t\tcase \"usage\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction clone<T>(value: T): T {\n\treturn structuredClone(value);\n}\n\nfunction bySequence<T extends { seq: number }>(values: readonly T[]): T[] {\n\treturn [...values].sort((left, right) => left.seq - right.seq);\n}\n\nfunction deriveEffectiveConfiguration(input: LaneReductionInput): EffectiveLaneConfiguration {\n\tlet configuration = clone(input.defaults);\n\tconst entriesById = new Map<string, Entry>();\n\tfor (const entry of [...input.configurationEntries, ...input.ownEntries]) entriesById.set(entry.id, entry);\n\n\tfor (const entry of bySequence([...entriesById.values()])) {\n\t\tswitch (entry.type) {\n\t\t\tcase \"model_change\":\n\t\t\t\tconfiguration = { ...configuration, model: { provider: entry.provider, modelId: entry.modelId } };\n\t\t\t\tbreak;\n\t\t\tcase \"thinking_level_change\":\n\t\t\t\tconfiguration = { ...configuration, thinkingLevel: entry.thinkingLevel as ThinkingLevel };\n\t\t\t\tbreak;\n\t\t\tcase \"active_tools_change\":\n\t\t\t\tconfiguration = { ...configuration, activeToolNames: [...entry.activeToolNames] };\n\t\t\t\tbreak;\n\t\t\tcase \"message\":\n\t\t\t\tif (entry.message.role === \"assistant\") {\n\t\t\t\t\tconfiguration = {\n\t\t\t\t\t\t...configuration,\n\t\t\t\t\t\tmodel: { provider: entry.message.provider, modelId: entry.message.model },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn configuration;\n}\n\nfunction deriveNewestOwn(\n\tentry: Entry | undefined,\n): NonNullable<NonNullable<LaneState[\"operation\"]>[\"newestOwn\"]> | null {\n\tif (!entry) return null;\n\tif (entry.type !== \"message\") return { entryId: entry.id, type: entry.type };\n\tif (entry.message.role !== \"assistant\") {\n\t\treturn { entryId: entry.id, type: entry.type, role: entry.message.role };\n\t}\n\treturn {\n\t\tentryId: entry.id,\n\t\ttype: entry.type,\n\t\trole: entry.message.role,\n\t\tstopReason: entry.message.stopReason,\n\t};\n}\n\nfunction deriveToolBatch(\n\toperationId: string,\n\trecords: readonly LaneRecord[],\n\townEntries: readonly Entry[],\n\tentriesById: ReadonlyMap<string, Entry>,\n\tdeferredWriteIds: ReadonlySet<string>,\n): ToolBatchState | null {\n\tconst assistantEntry = [...ownEntries]\n\t\t.reverse()\n\t\t.find(\n\t\t\t(entry) =>\n\t\t\t\tentry.type === \"message\" &&\n\t\t\t\tentry.message.role === \"assistant\" &&\n\t\t\t\tentry.message.content.some((content) => content.type === \"toolCall\"),\n\t\t);\n\tif (!assistantEntry || assistantEntry.type !== \"message\" || assistantEntry.message.role !== \"assistant\") return null;\n\n\tconst toolCalls = assistantEntry.message.content.filter(\n\t\t(content): content is AgentToolCall => content.type === \"toolCall\",\n\t);\n\tconst starts = new Map<number, ToolStartedRecord>();\n\tfor (const record of records) {\n\t\tif (\n\t\t\trecord.type === \"tool_started\" &&\n\t\t\trecord.runId === operationId &&\n\t\t\trecord.assistantEntryId === assistantEntry.id\n\t\t) {\n\t\t\tstarts.set(record.toolIndex, record);\n\t\t}\n\t}\n\n\tconst calls = toolCalls.map((toolCall, toolIndex) => {\n\t\tconst started = starts.get(toolIndex);\n\t\tconst startedResult = started ? entriesById.get(started.resultEntryId) : undefined;\n\t\tconst blockedResult = ownEntries.find(\n\t\t\t(entry) =>\n\t\t\t\tentry.seq > assistantEntry.seq &&\n\t\t\t\t!deferredWriteIds.has(entry.id) &&\n\t\t\t\tentry.type === \"message\" &&\n\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\tentry.message.toolCallId === toolCall.id,\n\t\t);\n\t\tconst result = startedResult ?? blockedResult;\n\t\treturn {\n\t\t\ttoolIndex,\n\t\t\ttoolCall: clone(toolCall),\n\t\t\t...(started ? { started: clone(started) } : {}),\n\t\t\tresultExists: result !== undefined,\n\t\t\t...(result?.type === \"message\" && result.terminate === true ? { terminate: true } : {}),\n\t\t};\n\t});\n\n\treturn {\n\t\tassistantEntryId: assistantEntry.id,\n\t\tcalls,\n\t\ttruncated: assistantEntry.message.stopReason === \"length\",\n\t\tunresolved: calls.some((call) => !call.resultExists),\n\t};\n}\n\n/** Purely reconstructs one lane's orchestration state from its bounded recovery inputs. */\nexport function reduceLaneState(input: LaneReductionInput): LaneReductionResult {\n\tvalidateRecordLog(input);\n\n\tconst records = bySequence(input.records);\n\tconst ownEntries = bySequence(input.ownEntries);\n\tconst entriesById = new Map<string, Entry>();\n\tfor (const entry of [...input.entries, ...ownEntries]) entriesById.set(entry.id, entry);\n\tconst cancelledQueueIds = new Set(\n\t\trecords.filter((record) => record.type === \"queue_cancelled\").map((record) => record.entryId),\n\t);\n\tconst pendingQueueRecords = records.filter(\n\t\t(record): record is QueueEnqueuedRecord =>\n\t\t\trecord.type === \"queue_enqueued\" &&\n\t\t\t!entriesById.has(record.target.id) &&\n\t\t\t!cancelledQueueIds.has(record.target.id),\n\t);\n\tconst started = input.openOperations[0];\n\tconst capturedInitialMessageIds = new Set(\n\t\tstarted?.intent.kind === \"run\" ? started.intent.initialMessages.map((target) => target.id) : [],\n\t);\n\tconst pendingNextRun = pendingQueueRecords\n\t\t.filter((record) => record.queue === \"nextRun\" && !capturedInitialMessageIds.has(record.target.id))\n\t\t.map((record) => clone(record.target));\n\tconst effectiveConfiguration = deriveEffectiveConfiguration(input);\n\n\tif (!started) {\n\t\treturn {\n\t\t\tlaneState: { lane: input.lane, leafId: input.leafId, operation: null, pendingNextRun },\n\t\t\teffectiveConfiguration,\n\t\t\tterminalFailure: null,\n\t\t};\n\t}\n\n\tconst operationRecords = records.filter((record) =>\n\t\trecord.type === \"operation_started\" ? record.id === started.id : \"runId\" in record && record.runId === started.id,\n\t);\n\tconst aborting = operationRecords.some((record) => record.type === \"abort_requested\");\n\tconst pendingSteer = aborting\n\t\t? []\n\t\t: pendingQueueRecords\n\t\t\t\t.filter((record) => record.queue === \"steer\" && record.runId === started.id)\n\t\t\t\t.map((record) => clone(record.target));\n\tconst pendingFollowUp = aborting\n\t\t? []\n\t\t: pendingQueueRecords\n\t\t\t\t.filter((record) => record.queue === \"followUp\" && record.runId === started.id)\n\t\t\t\t.map((record) => clone(record.target));\n\tconst pendingWrites = operationRecords\n\t\t.filter(\n\t\t\t(record): record is WriteDeferredRecord =>\n\t\t\t\trecord.type === \"write_deferred\" && !entriesById.has(record.target.id),\n\t\t)\n\t\t.map((record) => clone(record.target));\n\tconst missingInitialMessages =\n\t\tstarted.intent.kind === \"run\"\n\t\t\t? started.intent.initialMessages.filter((target) => !entriesById.has(target.id)).map(clone)\n\t\t\t: [];\n\n\tconst newestAttempt = operationRecords.filter((record) => record.type === \"step_attempt\").at(-1);\n\tconst step =\n\t\tnewestAttempt && !entriesById.has(newestAttempt.resultEntryId)\n\t\t\t? {\n\t\t\t\t\tkind: newestAttempt.step,\n\t\t\t\t\tattempts: newestAttempt.attempt,\n\t\t\t\t\tresultEntryId: newestAttempt.resultEntryId,\n\t\t\t\t\t...(newestAttempt.step === \"compaction\" ? { compactionReason: newestAttempt.compactionReason } : {}),\n\t\t\t\t}\n\t\t\t: null;\n\n\tconst consumedInputIds = new Set<string>();\n\tif (started.intent.kind === \"run\") {\n\t\tfor (const target of started.intent.initialMessages) consumedInputIds.add(target.id);\n\t}\n\tfor (const record of operationRecords) {\n\t\tif (record.type === \"queue_enqueued\" && record.queue !== \"nextRun\") consumedInputIds.add(record.target.id);\n\t}\n\tlet newestConsumedInputSequence = Number.NEGATIVE_INFINITY;\n\tfor (const id of consumedInputIds) {\n\t\tconst entry = entriesById.get(id);\n\t\tif (entry?.type === \"message\") newestConsumedInputSequence = Math.max(newestConsumedInputSequence, entry.seq);\n\t}\n\tconst overflowRecoveryUsed = operationRecords.some(\n\t\t(record) =>\n\t\t\trecord.type === \"step_attempt\" &&\n\t\t\trecord.step === \"compaction\" &&\n\t\t\trecord.compactionReason === \"overflow\" &&\n\t\t\trecord.seq > newestConsumedInputSequence,\n\t);\n\n\tconst newestOwnEntry = ownEntries.at(-1);\n\tconst newestOwn = deriveNewestOwn(newestOwnEntry);\n\tconst deferred =\n\t\tnewestOwnEntry?.type === \"message\" &&\n\t\tnewestOwnEntry.message.role === \"assistant\" &&\n\t\tnewestOwnEntry.message.stopReason === \"deferred\" &&\n\t\tnewestOwnEntry.message.deferred\n\t\t\t? clone(newestOwnEntry.message.deferred)\n\t\t\t: null;\n\tconst targets: { result?: boolean; summary?: boolean } = {};\n\tif (started.intent.kind === \"compaction\") {\n\t\ttargets.result = entriesById.has(started.intent.resultEntryId);\n\t} else if (started.intent.kind === \"navigation\" && started.intent.summaryEntryId) {\n\t\ttargets.summary = entriesById.has(started.intent.summaryEntryId);\n\t}\n\n\tconst deferredWriteIds = new Set(\n\t\toperationRecords.filter((record) => record.type === \"write_deferred\").map((record) => record.target.id),\n\t);\n\tlet terminalFailure: TerminalFailureState | null = null;\n\tif (\n\t\tnewestOwnEntry?.type === \"message\" &&\n\t\tnewestOwnEntry.message.role === \"assistant\" &&\n\t\tnewestOwnEntry.message.stopReason === \"error\" &&\n\t\t!deferredWriteIds.has(newestOwnEntry.id)\n\t) {\n\t\tconst producedByStep = operationRecords.some(\n\t\t\t(record) => record.type === \"step_attempt\" && record.resultEntryId === newestOwnEntry.id,\n\t\t);\n\t\tconst previousOwnEntry = ownEntries.at(-2);\n\t\tconst producedByDeferredFetch =\n\t\t\toperationRecords.some(\n\t\t\t\t(record) =>\n\t\t\t\t\trecord.type === \"usage\" && record.cause === \"deferred_fetch\" && record.entryId === newestOwnEntry.id,\n\t\t\t) ||\n\t\t\t(previousOwnEntry?.type === \"message\" &&\n\t\t\t\tpreviousOwnEntry.message.role === \"assistant\" &&\n\t\t\t\tpreviousOwnEntry.message.stopReason === \"deferred\");\n\t\tif (producedByStep || producedByDeferredFetch) {\n\t\t\tterminalFailure = {\n\t\t\t\tentryId: newestOwnEntry.id,\n\t\t\t\tsource: producedByStep ? \"step\" : \"deferred_fetch\",\n\t\t\t\tmessage: clone(newestOwnEntry.message),\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tlaneState: {\n\t\t\tlane: input.lane,\n\t\t\tleafId: input.leafId,\n\t\t\toperation: {\n\t\t\t\tid: started.id,\n\t\t\t\tkind: started.intent.kind,\n\t\t\t\tintent: clone(started.intent),\n\t\t\t\taborting,\n\t\t\t\tstep,\n\t\t\t\ttoolBatch: deriveToolBatch(started.id, operationRecords, ownEntries, entriesById, deferredWriteIds),\n\t\t\t\tmissingInitialMessages,\n\t\t\t\tpendingSteer,\n\t\t\t\tpendingFollowUp,\n\t\t\t\tpendingWrites,\n\t\t\t\tdeferred,\n\t\t\t\toverflowRecoveryUsed,\n\t\t\t\tnewestOwn,\n\t\t\t\ttargets,\n\t\t\t},\n\t\t\tpendingNextRun,\n\t\t},\n\t\teffectiveConfiguration,\n\t\tterminalFailure,\n\t};\n}\n"]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { FileError, Result } from "../../types.ts";
|
|
2
|
-
import { SessionError } from "../types.ts";
|
|
3
|
-
export declare class JsonlDecodeError extends Error {
|
|
4
|
-
readonly kind: "syntax" | "schema";
|
|
5
|
-
constructor(kind: "syntax" | "schema", message: string, cause?: Error);
|
|
6
|
-
}
|
|
7
|
-
export declare function fileResult<T>(result: Result<T, FileError>, message: string): T;
|
|
8
|
-
export declare function invalidFile(path: string, line: number, cause: Error): SessionError;
|
|
9
|
-
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAEnC,YAAY,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAIpE;CACD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAS9E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,YAAY,CAElF","sourcesContent":["import type { FileError, Result } from \"../../types.ts\";\nimport { SessionError } from \"../types.ts\";\n\nexport class JsonlDecodeError extends Error {\n\treadonly kind: \"syntax\" | \"schema\";\n\n\tconstructor(kind: \"syntax\" | \"schema\", message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlDecodeError\";\n\t\tthis.kind = kind;\n\t}\n}\n\nexport function fileResult<T>(result: Result<T, FileError>, message: string): T {\n\tif (!result.ok) {\n\t\tthrow new SessionError(\n\t\t\tresult.error.code === \"not_found\" ? \"not_found\" : \"storage\",\n\t\t\t`${message}: ${result.error.message}`,\n\t\t\tresult.error,\n\t\t);\n\t}\n\treturn result.value;\n}\n\nexport function invalidFile(path: string, line: number, cause: Error): SessionError {\n\treturn new SessionError(\"invalid_entry\", `Invalid JSONL v4 session ${path}: line ${line} ${cause.message}`, cause);\n}\n"]}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { SessionError } from "../types.js";
|
|
2
|
-
export class JsonlDecodeError extends Error {
|
|
3
|
-
kind;
|
|
4
|
-
constructor(kind, message, cause) {
|
|
5
|
-
super(message, cause === undefined ? undefined : { cause });
|
|
6
|
-
this.name = "JsonlDecodeError";
|
|
7
|
-
this.kind = kind;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export function fileResult(result, message) {
|
|
11
|
-
if (!result.ok) {
|
|
12
|
-
throw new SessionError(result.error.code === "not_found" ? "not_found" : "storage", `${message}: ${result.error.message}`, result.error);
|
|
13
|
-
}
|
|
14
|
-
return result.value;
|
|
15
|
-
}
|
|
16
|
-
export function invalidFile(path, line, cause) {
|
|
17
|
-
return new SessionError("invalid_entry", `Invalid JSONL v4 session ${path}: line ${line} ${cause.message}`, cause);
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACjC,IAAI,CAAsB;IAEnC,YAAY,IAAyB,EAAE,OAAe,EAAE,KAAa,EAAE;QACtE,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAA,CACjB;CACD;AAED,MAAM,UAAU,UAAU,CAAI,MAA4B,EAAE,OAAe,EAAK;IAC/E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACrB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAC3D,GAAG,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EACrC,MAAM,CAAC,KAAK,CACZ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AAAA,CACpB;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,KAAY,EAAgB;IACnF,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,4BAA4B,IAAI,UAAU,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAAA,CACnH","sourcesContent":["import type { FileError, Result } from \"../../types.ts\";\nimport { SessionError } from \"../types.ts\";\n\nexport class JsonlDecodeError extends Error {\n\treadonly kind: \"syntax\" | \"schema\";\n\n\tconstructor(kind: \"syntax\" | \"schema\", message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlDecodeError\";\n\t\tthis.kind = kind;\n\t}\n}\n\nexport function fileResult<T>(result: Result<T, FileError>, message: string): T {\n\tif (!result.ok) {\n\t\tthrow new SessionError(\n\t\t\tresult.error.code === \"not_found\" ? \"not_found\" : \"storage\",\n\t\t\t`${message}: ${result.error.message}`,\n\t\t\tresult.error,\n\t\t);\n\t}\n\treturn result.value;\n}\n\nexport function invalidFile(path: string, line: number, cause: Error): SessionError {\n\treturn new SessionError(\"invalid_entry\", `Invalid JSONL v4 session ${path}: line ${line} ${cause.message}`, cause);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/harness/session/jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EACX,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,aAAa,GACb,MAAM,kBAAkB,CAAC","sourcesContent":["export { JsonlSessionRepo } from \"./jsonl/repo.ts\";\nexport type {\n\tJsonlSessionCreateOptions,\n\tJsonlSessionListOptions,\n\tJsonlSessionMetadata,\n\tJsonlSessionRepoFileSystem,\n\tJsonlSessionRepoOptions,\n\tJsonlV4Header,\n} from \"./jsonl/types.ts\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/harness/session/jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export { JsonlSessionRepo } from \"./jsonl/repo.ts\";\nexport type {\n\tJsonlSessionCreateOptions,\n\tJsonlSessionListOptions,\n\tJsonlSessionMetadata,\n\tJsonlSessionRepoFileSystem,\n\tJsonlSessionRepoOptions,\n\tJsonlV4Header,\n} from \"./jsonl/types.ts\";\n"]}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { type BranchBounds, type Entry, type EntryQuery, type ForkOptions, type LanePointer, type LaneRecord, type LogItem, type LogOptions, type OperationStartedRecord, type RecordQuery, type SessionStats } from "./types.ts";
|
|
2
|
-
export type SessionMutation = {
|
|
3
|
-
kind: "entry";
|
|
4
|
-
lane?: string;
|
|
5
|
-
entry: Entry;
|
|
6
|
-
} | {
|
|
7
|
-
kind: "record";
|
|
8
|
-
record: LaneRecord;
|
|
9
|
-
} | {
|
|
10
|
-
kind: "lane";
|
|
11
|
-
seq: number;
|
|
12
|
-
lane: string;
|
|
13
|
-
leafId: string | null;
|
|
14
|
-
} | {
|
|
15
|
-
kind: "fact";
|
|
16
|
-
seq: number;
|
|
17
|
-
fact: "name";
|
|
18
|
-
name: string | undefined;
|
|
19
|
-
} | {
|
|
20
|
-
kind: "fact";
|
|
21
|
-
seq: number;
|
|
22
|
-
fact: "label";
|
|
23
|
-
targetId: string;
|
|
24
|
-
label: string | undefined;
|
|
25
|
-
};
|
|
26
|
-
type InvalidMutation = (message: string) => never;
|
|
27
|
-
export declare class SessionState {
|
|
28
|
-
private sequence;
|
|
29
|
-
private readonly usedIds;
|
|
30
|
-
private readonly entries;
|
|
31
|
-
private readonly entriesById;
|
|
32
|
-
private readonly records;
|
|
33
|
-
private readonly openOperationsByLane;
|
|
34
|
-
private readonly lanes;
|
|
35
|
-
private readonly log;
|
|
36
|
-
private readonly stats;
|
|
37
|
-
private name;
|
|
38
|
-
private readonly labels;
|
|
39
|
-
get nextSequence(): number;
|
|
40
|
-
getLanes(): LanePointer[];
|
|
41
|
-
requireLane(lane: string): string | null;
|
|
42
|
-
validateNewLane(lane: string): void;
|
|
43
|
-
validateTarget(targetId: string | null): void;
|
|
44
|
-
validateUnusedId(id: string): void;
|
|
45
|
-
applyMutation(mutation: SessionMutation, invalid?: InvalidMutation): void;
|
|
46
|
-
getEntry(id: string): Entry | undefined;
|
|
47
|
-
findEntries(query?: EntryQuery): Entry[];
|
|
48
|
-
findEntriesOnBranch(query: EntryQuery & BranchBounds & {
|
|
49
|
-
start: string;
|
|
50
|
-
}): Entry[];
|
|
51
|
-
findRecords(query?: RecordQuery): LaneRecord[];
|
|
52
|
-
findOpenOperations(lane: string, options?: {
|
|
53
|
-
limit?: number;
|
|
54
|
-
}): OperationStartedRecord[];
|
|
55
|
-
getLog(options?: LogOptions): LogItem[];
|
|
56
|
-
getName(): string | undefined;
|
|
57
|
-
getLabel(id: string): string | undefined;
|
|
58
|
-
getStats(): SessionStats;
|
|
59
|
-
createForkMutations(options: ForkOptions): SessionMutation[];
|
|
60
|
-
private walkToRoot;
|
|
61
|
-
private matchesEntryQuery;
|
|
62
|
-
private matchesRecordQuery;
|
|
63
|
-
}
|
|
64
|
-
export {};
|
|
65
|
-
//# sourceMappingURL=state.d.ts.map
|