@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall, AgentToolResult } from \"../../../types.ts\";\nimport { AbortRequested } from \"../../execution/effect-gate.ts\";\nimport {\n\tapplyBeforeToolDecision,\n\ttype ClearedToolCall,\n\tcreateToolResultMessage,\n\ttype ExecutedToolCall,\n\texecuteToolCall,\n\ttype FinalizedToolCall,\n\tfinalizeToolCall,\n\tprepareToolCall,\n\ttoolResultFromMessage,\n} from \"../../execution/tools.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type { JsonValue, ToolBatch, ToolCall, ToolsOperation } from \"../../session/types.ts\";\nimport {\n\tdeleteValue,\n\toperationToolArgs,\n\toperationToolMemo,\n\toperationToolMemoPrefix,\n\tpendingEntry,\n\tpendingToolOutput,\n\tsetValue,\n} from \"../../session/values.ts\";\nimport type { AgentHarnessTool, AgentHarnessToolInvocation } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { openToolProgress } from \"../progress.ts\";\nimport type { ContinueOperationResult, Drive, LaneState, ProcedureResult } from \"../types.ts\";\nimport {\n\tmaterializeReady,\n\treadToolBatchSource,\n\ttype ToolBatchSource,\n\ttoolCallFor,\n\twithToolBatch,\n} from \"./tool-placement.ts\";\n\ntype ToolCallTask = { completion: Promise<void> };\ntype ToolOutcome = { toolCall: AgentToolCall; message: ToolResultMessage<unknown>; terminate: boolean };\ntype PreparedToolInvocation<TContext extends object | undefined> =\n\t| { kind: \"ready\"; cleared: ClearedToolCall<TContext> }\n\t| { kind: \"outcome\"; outcome: ToolOutcome };\n\nconst INTERRUPTION_MARKER =\n\t\"[Tool execution was interrupted. The preceding output is the latest durable progress snapshot; newer live output may be missing, and the external outcome is unknown.]\";\n\nclass ToolInvocationEnded extends Error {\n\tconstructor() {\n\t\tsuper(\"Tool invocation no longer owns its durable effect\");\n\t\tthis.name = \"ToolInvocationEnded\";\n\t}\n}\n\nfunction currentBatch<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n): { run: ToolsOperation; batch: ToolBatch } | undefined {\n\tconst operation = lane.state.operation;\n\tif (operation?.state.at !== \"tools\") return undefined;\n\treturn { run: operation.state, batch: operation.state.batch };\n}\n\nfunction findCall(batch: ToolBatch, sourceIndex: number, resultEntryId: string): ToolCall | undefined {\n\treturn batch.calls.find((call) => call.sourceIndex === sourceIndex && call.resultEntryId === resultEntryId);\n}\n\nfunction replaceCall(batch: ToolBatch, replacement: ToolCall): ToolBatch {\n\treturn {\n\t\t...batch,\n\t\tcalls: batch.calls.map((call) =>\n\t\t\tcall.sourceIndex === replacement.sourceIndex && call.resultEntryId === replacement.resultEntryId\n\t\t\t\t? replacement\n\t\t\t\t: call,\n\t\t),\n\t};\n}\n\nfunction validateMemoName(name: string): void {\n\tif (name.length === 0) throw new TypeError(\"Tool invocation memo name must not be empty\");\n\tif (name.includes(\":\")) throw new TypeError(\"Tool invocation memo name must not contain ':'\");\n}\n\nfunction invocationCapability<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): { invocation: AgentHarnessToolInvocation; expire(): void } {\n\tlet active = true;\n\tconst ownsEffect = (state: LaneState): boolean => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return false;\n\t\treturn findCall(operation.state.batch, call.sourceIndex, call.resultEntryId)?.status === \"effect_pending\";\n\t};\n\tconst ended = (): ToolInvocationEnded => new ToolInvocationEnded();\n\treturn {\n\t\tinvocation: {\n\t\t\tinvocationId: call.resultEntryId,\n\t\t\toperationId: drive.operationId,\n\t\t\tturnId: batch.turnId,\n\t\t\tgetMemo(name) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<JsonValue | undefined>(async (state, reader) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst stored = await reader.getValue(\n\t\t\t\t\t\toperationToolMemo(drive.operationId, call.resultEntryId, name),\n\t\t\t\t\t\tdrive.context,\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"return\", result: stored?.value };\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t\tsetMemo(name, value) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<void>((state) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst address = operationToolMemo(drive.operationId, call.resultEntryId, name);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"commit\",\n\t\t\t\t\t\twrites: [value === undefined ? deleteValue(address) : setValue(address, value)],\n\t\t\t\t\t\tnext: state,\n\t\t\t\t\t\tmaterialize: () => undefined,\n\t\t\t\t\t};\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t},\n\t\texpire() {\n\t\t\tactive = false;\n\t\t},\n\t};\n}\n\nfunction syntheticMessage(\n\ttoolCall: AgentToolCall,\n\tcontent: AgentToolResult<unknown>[\"content\"],\n\toptions: { details?: unknown; usage?: AgentToolResult<unknown>[\"usage\"] } = {},\n): ToolResultMessage<unknown> {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent,\n\t\t...(options.details === undefined ? {} : { details: options.details }),\n\t\t...(options.usage === undefined ? {} : { usage: options.usage }),\n\t\tisError: true,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction abortedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [{ type: \"text\", text: \"Tool execution was cancelled before completion.\" }]),\n\t\tterminate: false,\n\t};\n}\n\nfunction interruptedOutcome(toolCall: AgentToolCall, checkpoint: AgentToolResult<unknown> | undefined): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(\n\t\t\ttoolCall,\n\t\t\t[...(checkpoint?.content ?? []), { type: \"text\", text: INTERRUPTION_MARKER }],\n\t\t\tcheckpoint === undefined ? {} : { details: checkpoint.details, usage: checkpoint.usage },\n\t\t),\n\t\tterminate: false,\n\t};\n}\n\nfunction truncatedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool call ${JSON.stringify(toolCall.name)} was not executed because the assistant response hit the output token limit, so its arguments may be truncated. Re-issue the tool call with complete arguments.`,\n\t\t\t},\n\t\t]),\n\t\tterminate: false,\n\t};\n}\n\nfunction outcomeFromFinalizedCall(finalized: FinalizedToolCall): ToolOutcome {\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function publishToolIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tplanned: Extract<ToolCall, { status: \"planned\" }>,\n\ttoolCall: AgentToolCall,\n\targs: Record<string, JsonValue>,\n\treplay: \"never\" | \"safe\",\n\trecovery: boolean,\n): Promise<ContinueOperationResult<Extract<ToolCall, { status: \"effect_pending\" }>>> {\n\treturn lane.continueOperation(\n\t\trun,\n\t\t(_state, run) => {\n\t\t\tconst effectPending: Extract<ToolCall, { status: \"effect_pending\" }> = {\n\t\t\t\tstatus: \"effect_pending\",\n\t\t\t\tsourceIndex: planned.sourceIndex,\n\t\t\t\tresultEntryId: planned.resultEntryId,\n\t\t\t\treplay,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [setValue(operationToolArgs(drive.operationId, run.batch.turnId, planned.sourceIndex), args)],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, effectPending)),\n\t\t\t\tmaterialize: () => effectPending,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishToolOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tcall: Extract<ToolCall, { status: \"planned\" | \"effect_pending\" }>,\n\tfinalized: ToolOutcome,\n\trecovery: boolean,\n): Promise<void> {\n\tawait lane.settleOperation(\n\t\tcapability,\n\t\tasync (_state, run, _meta, reader) => {\n\t\t\tconst { toolCall } = finalized;\n\t\t\tconst memos = await reader.scanValues(\n\t\t\t\toperationToolMemoPrefix(drive.operationId, call.resultEntryId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tconst durableTerminate = run.control.status === \"running\" && finalized.terminate;\n\t\t\tconst outcome: Extract<ToolCall, { status: \"outcome_ready\" }> = {\n\t\t\t\tstatus: \"outcome_ready\",\n\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\tterminate: durableTerminate,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [\n\t\t\t\t\tsetValue(pendingEntry(call.resultEntryId), { type: \"message\", payload: finalized.message }),\n\t\t\t\t\tdeleteValue(pendingToolOutput(drive.operationId, call.resultEntryId)),\n\t\t\t\t\t...memos.map(({ address }) => deleteValue(address)),\n\t\t\t\t],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, outcome)),\n\t\t\t\tmaterialize: () => undefined,\n\t\t\t\tevents: () => [\n\t\t\t\t\t...(call.status === \"planned\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"tool_start\" as const,\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: []),\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: toolResultFromMessage(finalized.message, durableTerminate),\n\t\t\t\t\t\tisError: finalized.message.isError,\n\t\t\t\t\t\tterminate: durableTerminate,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function clearReplayCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolCall: AgentToolCall,\n): Promise<Record<string, JsonValue>> {\n\treturn lane.command(async (state, reader) => {\n\t\tconst stored = await reader.getValue(\n\t\t\toperationToolArgs(drive.operationId, batch.turnId, call.sourceIndex),\n\t\t\tdrive.context,\n\t\t);\n\t\tif (stored === undefined) {\n\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing persisted arguments`);\n\t\t}\n\t\treturn {\n\t\t\tkind: \"commit\",\n\t\t\twrites: [deleteValue(pendingToolOutput(drive.operationId, call.resultEntryId))],\n\t\t\tnext: state,\n\t\t\tmaterialize: () => stored.value,\n\t\t\tevents: () => [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: stored.value,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}, drive.context);\n}\n\nfunction readCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): Promise<AgentToolResult<unknown> | undefined> {\n\treturn lane.command(async (_state, reader) => {\n\t\tconst stored = await reader.getValue(pendingToolOutput(drive.operationId, call.resultEntryId), drive.context);\n\t\treturn { kind: \"return\", result: stored?.value };\n\t}, drive.context);\n}\n\nasync function resolveToolContext<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<TContext> {\n\tconst source = lane.readConfig().toolContext;\n\treturn (typeof source === \"function\" ? await source(drive.context) : source) as TContext;\n}\n\nasync function performToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\tcleared: ClearedToolCall<TContext>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolOutcome> {\n\tconst capability = invocationCapability(lane, drive, batch, call);\n\tconst progress = openToolProgress(lane, drive, batch.turnId, call.sourceIndex, call.resultEntryId);\n\tlet latestUpdateDelivery: Promise<void> = Promise.resolve();\n\tconst publishUpdate = (partial: AgentToolResult<unknown>): void => {\n\t\tlatestUpdateDelivery = lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_update\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\t\tpartialResult: partial,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t\tvoid latestUpdateDelivery.catch(() => {});\n\t};\n\n\tlet execution: Promise<ExecutedToolCall>;\n\ttry {\n\t\texecution = executeToolCall(\n\t\t\tcleared,\n\t\t\tdrive.gate,\n\t\t\t(partial, options) => {\n\t\t\t\tpublishUpdate(partial);\n\t\t\t\tif (options?.checkpoint === true) progress.write(partial);\n\t\t\t},\n\t\t\ttoolContext,\n\t\t\tcapability.invocation,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t\tawait progress.drain();\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn recovery ? interruptedOutcome(cleared.toolCall, undefined) : abortedOutcome(cleared.toolCall);\n\t}\n\n\tconst executed = await execution.finally(() => {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t});\n\tawait latestUpdateDelivery;\n\tawait progress.drain();\n\n\tlet patch: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"after_tool\">>>;\n\ttry {\n\t\tpatch = await lane.hooks.runToolWithGate(\n\t\t\t\"after_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\targs: cleared.args,\n\t\t\t\tcontent: executed.result.content,\n\t\t\t\t...(executed.result.details === undefined ? {} : { details: executed.result.details as JsonValue }),\n\t\t\t\tisError: executed.isError,\n\t\t\t\t...(executed.result.usage === undefined ? {} : { usage: executed.result.usage }),\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tpatch = undefined;\n\t}\n\tconst finalized = finalizeToolCall(cleared, executed, patch);\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function prepareToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n): Promise<PreparedToolInvocation<TContext>> {\n\tconst toolCall = toolCallFor(sources, call);\n\tif (sources.assistant.stopReason === \"length\") {\n\t\treturn { kind: \"outcome\", outcome: truncatedOutcome(toolCall) };\n\t}\n\tconst prepared = prepareToolCall(toolCall, tools);\n\tif (\"kind\" in prepared) return { kind: \"outcome\", outcome: outcomeFromFinalizedCall(prepared) };\n\n\tlet decision: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"before_tool\">>>;\n\ttry {\n\t\tdecision = await lane.hooks.runToolWithGate(\n\t\t\t\"before_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\targs: prepared.args,\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn { kind: \"outcome\", outcome: abortedOutcome(toolCall) };\n\t}\n\tconst cleared = applyBeforeToolDecision(prepared, decision);\n\treturn \"kind\" in cleared\n\t\t? { kind: \"outcome\", outcome: outcomeFromFinalizedCall(cleared) }\n\t\t: { kind: \"ready\", cleared };\n}\n\nasync function startToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolCallTask> {\n\tconst prepared = await prepareToolInvocation(lane, drive, sources, call, tools);\n\tif (prepared.kind === \"outcome\") {\n\t\treturn { completion: publishToolOutcome(lane, drive, run, call, prepared.outcome, recovery) };\n\t}\n\tconst effectPending = await publishToolIntent(\n\t\tlane,\n\t\tdrive,\n\t\trun,\n\t\tcall,\n\t\tprepared.cleared.toolCall,\n\t\tprepared.cleared.args,\n\t\tprepared.cleared.tool.replay ?? \"never\",\n\t\trecovery,\n\t);\n\treturn {\n\t\tcompletion:\n\t\t\teffectPending.kind === \"cancel_requested\"\n\t\t\t\t? publishToolOutcome(lane, drive, run, call, abortedOutcome(prepared.cleared.toolCall), recovery)\n\t\t\t\t: performToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun.batch,\n\t\t\t\t\t\teffectPending.value,\n\t\t\t\t\t\tprepared.cleared,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t).then((outcome) => publishToolOutcome(lane, drive, run, effectPending.value, outcome, recovery)),\n\t};\n}\n\nasync function recoverToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\tcancelled: boolean,\n): Promise<ToolCallTask> {\n\tconst toolCall = toolCallFor(sources, call);\n\tconst tool = toolsByName.get(toolCall.name);\n\tif (!cancelled && call.replay === \"safe\" && tool?.replay === \"safe\") {\n\t\tconst args = await clearReplayCheckpoint(lane, drive, run.batch, call, toolCall);\n\t\tconst cleared: ClearedToolCall<TContext> = { toolCall, tool, args };\n\t\treturn {\n\t\t\tcompletion: performToolInvocation(lane, drive, run.batch, call, cleared, toolContext, true).then((outcome) =>\n\t\t\t\tpublishToolOutcome(lane, drive, run, call, outcome, true),\n\t\t\t),\n\t\t};\n\t}\n\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\treturn {\n\t\tcompletion: publishToolOutcome(lane, drive, run, call, interruptedOutcome(toolCall, checkpoint), true),\n\t};\n}\n\nasync function runSequential<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\texecution:\n\t\t| {\n\t\t\t\ttools: AgentHarnessTool<TContext>[];\n\t\t\t\ttoolsByName: Map<string, AgentHarnessTool<TContext>>;\n\t\t\t\ttoolContext: TContext;\n\t\t }\n\t\t| undefined,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tfor (let transition = 0; transition <= batch.calls.length * 2 + 1; transition += 1) {\n\t\tawait materializeReady(lane, drive, run, sources, recovery);\n\t\tconst current = currentBatch(lane);\n\t\tif (current === undefined) return { kind: \"continue\" };\n\t\tconst call = current.batch.calls.find((candidate) => candidate.status !== \"completed\");\n\t\tif (call === undefined) throw new SessionInvariantError(\"Tool batch remained open after every call completed\");\n\t\tif (call.status === \"outcome_ready\") throw new SessionInvariantError(\"Ready tool outcome was not materialized\");\n\n\t\tif (current.run.control.status === \"cancel_requested\") {\n\t\t\tconst toolCall = toolCallFor(sources, call);\n\t\t\tif (call.status === \"planned\") {\n\t\t\t\tawait publishToolOutcome(lane, drive, current.run, call, abortedOutcome(toolCall), recovery);\n\t\t\t} else {\n\t\t\t\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\t\t\t\tawait publishToolOutcome(\n\t\t\t\t\tlane,\n\t\t\t\t\tdrive,\n\t\t\t\t\tcurrent.run,\n\t\t\t\t\tcall,\n\t\t\t\t\tinterruptedOutcome(toolCall, checkpoint),\n\t\t\t\t\trecovery,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (execution === undefined) throw new SessionInvariantError(\"Running tool batch is missing execution context\");\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.tools,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.toolsByName,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\tawait started.completion;\n\t}\n\tthrow new SessionInvariantError(\"Sequential tool batch exceeded its bounded transition count\");\n}\n\nasync function runParallel<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tlet materialization = Promise.resolve();\n\tconst scheduleMaterialization = (): Promise<void> => {\n\t\tconst scheduled = materialization.then(() => materializeReady(lane, drive, run, sources, recovery));\n\t\tmaterialization = scheduled.catch(() => {});\n\t\treturn scheduled;\n\t};\n\tconst jobs: Promise<void>[] = [];\n\tfor (const call of batch.calls) {\n\t\tif (call.status === \"completed\" || call.status === \"outcome_ready\") continue;\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(lane, drive, run, sources, call, tools, toolContext, recovery)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\ttoolsByName,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\tlane.state.operation!.state.control.status === \"cancel_requested\",\n\t\t\t\t\t);\n\t\tconst job = started.completion.then(async () => {\n\t\t\tawait scheduleMaterialization();\n\t\t});\n\t\tvoid job.catch(() => {});\n\t\tjobs.push(job);\n\t}\n\tawait Promise.all(jobs);\n\tawait scheduleMaterialization();\n\treturn { kind: \"continue\" };\n}\n\n/** Execute, recover, stage, and source-order one complete durable tool batch. */\nexport async function runTools<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n): Promise<ProcedureResult> {\n\tconst batch = run.batch;\n\tconst recovery = batch.calls.some((call) => call.status === \"effect_pending\" || call.status === \"outcome_ready\");\n\tif (recovery) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n\tconst sources = await readToolBatchSource(lane, drive, batch);\n\tawait materializeReady(lane, drive, run, sources, recovery);\n\tconst current = currentBatch(lane);\n\tif (current === undefined) return { kind: \"continue\" };\n\tif (current.run.control.status === \"cancel_requested\") {\n\t\treturn runSequential(lane, drive, current.run, sources, undefined, recovery);\n\t}\n\tconst config = lane.readConfig();\n\tconst active = new Set(batch.configuration.activeToolNames);\n\tconst tools = config.tools.filter((tool) => active.has(tool.name));\n\tconst toolsByName = new Map(tools.map((tool) => [tool.name, tool]));\n\tconst toolContext = await resolveToolContext(lane, drive);\n\treturn run.settings.toolExecution === \"sequential\"\n\t\t? runSequential(lane, drive, current.run, sources, { tools, toolsByName, toolContext }, recovery)\n\t\t: runParallel(lane, drive, current.run, sources, tools, toolsByName, toolContext, recovery);\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DriveOutcome } from "../agent-harness.ts";
|
|
2
|
+
import type { Lane } from "./lane.ts";
|
|
3
|
+
import type { Drive } from "./types.ts";
|
|
4
|
+
/** Drive one installed pass through direct durable procedures until settlement or a durable wait. */
|
|
5
|
+
export declare function driveOperation<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive): Promise<DriveOutcome>;
|
|
6
|
+
//# sourceMappingURL=drive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../../src/harness/runtime/drive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAgBxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAC;AAUzD,qGAAqG;AACrG,wBAAsB,cAAc,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EACvE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,YAAY,CAAC,CA0EvB","sourcesContent":["import type { DriveOutcome } from \"../agent-harness.ts\";\nimport { AbortRequested } from \"../execution/effect-gate.ts\";\nimport { SessionInvariantError } from \"../session/session.ts\";\nimport { runCheckpoint, startRun } from \"./drive/checkpoint.ts\";\nimport { runDeferred } from \"./drive/deferred.ts\";\nimport { runGeneration } from \"./drive/generation.ts\";\nimport { reconcileOperation } from \"./drive/reconcile.ts\";\nimport { recoverAssistantGeneration } from \"./drive/recovery.ts\";\nimport {\n\tcommitNavigation,\n\trecoverStructuralGeneration,\n\trunStructuralDecision,\n\trunStructuralGeneration,\n\trunStructuralRetryWait,\n} from \"./drive/structural.ts\";\nimport { runTools } from \"./drive/tools.ts\";\nimport type { Lane } from \"./lane.ts\";\nimport type { Drive, ProcedureResult } from \"./types.ts\";\n\nfunction currentOperation<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive) {\n\tconst operation = lane.state.operation;\n\tif (operation === null || operation.meta.operationId !== drive.operationId) {\n\t\tthrow new SessionInvariantError(`Drive ${drive.operationId} has no matching current operation`);\n\t}\n\treturn operation;\n}\n\n/** Drive one installed pass through direct durable procedures until settlement or a durable wait. */\nexport async function driveOperation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<DriveOutcome> {\n\tlet operation = currentOperation(lane, drive);\n\tif (operation.state.control.status === \"running\") {\n\t\ttry {\n\t\t\tawait lane.hooks.runWithGate(\n\t\t\t\t\"before_drive\",\n\t\t\t\t{ lane: lane.name, runId: drive.operationId, operation: operation.meta.intent.kind },\n\t\t\t\tdrive.gate,\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\t\tawait error.cancellation;\n\t\t}\n\t}\n\n\tfor (;;) {\n\t\toperation = currentOperation(lane, drive);\n\t\tconst state = operation.state;\n\t\tlet result: ProcedureResult;\n\t\ttry {\n\t\t\tif (state.control.status === \"cancel_requested\") {\n\t\t\t\tresult = await reconcileOperation(lane, drive);\n\t\t\t} else\n\t\t\t\tswitch (state.at) {\n\t\t\t\t\tcase \"starting\":\n\t\t\t\t\t\tresult = await startRun(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"checkpoint\":\n\t\t\t\t\t\tresult = await runCheckpoint(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assistant.ready\":\n\t\t\t\t\tcase \"assistant.retry_wait\":\n\t\t\t\t\t\tresult = await runGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assistant.effect_pending\":\n\t\t\t\t\t\tresult = await recoverAssistantGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tools\":\n\t\t\t\t\t\tresult = await runTools(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"deferred.suspended\":\n\t\t\t\t\tcase \"deferred.effect_pending\":\n\t\t\t\t\t\tresult = await runDeferred(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.deciding\":\n\t\t\t\t\t\tresult = await runStructuralDecision(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.ready\":\n\t\t\t\t\t\tresult = await runStructuralGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.effect_pending\":\n\t\t\t\t\t\tresult = await recoverStructuralGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.retry_wait\":\n\t\t\t\t\t\tresult = await runStructuralRetryWait(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"navigation.ready_to_commit\":\n\t\t\t\t\t\tresult = await commitNavigation(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\t\tawait error.cancellation;\n\t\t\tresult = { kind: \"continue\" };\n\t\t}\n\n\t\tif (result.kind === \"settled\") return { kind: \"settled\", outcome: result.outcome };\n\t\tif (result.kind === \"waiting\") return result.outcome;\n\t\tconst next = currentOperation(lane, drive).state;\n\t\tif (next === state && next.control.status !== \"cancel_requested\") {\n\t\t\tthrow new SessionInvariantError(`Drive procedure made no progress from ${state.at}`);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { AbortRequested } from "../execution/effect-gate.js";
|
|
2
|
+
import { SessionInvariantError } from "../session/session.js";
|
|
3
|
+
import { runCheckpoint, startRun } from "./drive/checkpoint.js";
|
|
4
|
+
import { runDeferred } from "./drive/deferred.js";
|
|
5
|
+
import { runGeneration } from "./drive/generation.js";
|
|
6
|
+
import { reconcileOperation } from "./drive/reconcile.js";
|
|
7
|
+
import { recoverAssistantGeneration } from "./drive/recovery.js";
|
|
8
|
+
import { commitNavigation, recoverStructuralGeneration, runStructuralDecision, runStructuralGeneration, runStructuralRetryWait, } from "./drive/structural.js";
|
|
9
|
+
import { runTools } from "./drive/tools.js";
|
|
10
|
+
function currentOperation(lane, drive) {
|
|
11
|
+
const operation = lane.state.operation;
|
|
12
|
+
if (operation === null || operation.meta.operationId !== drive.operationId) {
|
|
13
|
+
throw new SessionInvariantError(`Drive ${drive.operationId} has no matching current operation`);
|
|
14
|
+
}
|
|
15
|
+
return operation;
|
|
16
|
+
}
|
|
17
|
+
/** Drive one installed pass through direct durable procedures until settlement or a durable wait. */
|
|
18
|
+
export async function driveOperation(lane, drive) {
|
|
19
|
+
let operation = currentOperation(lane, drive);
|
|
20
|
+
if (operation.state.control.status === "running") {
|
|
21
|
+
try {
|
|
22
|
+
await lane.hooks.runWithGate("before_drive", { lane: lane.name, runId: drive.operationId, operation: operation.meta.intent.kind }, drive.gate, drive.context);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (!(error instanceof AbortRequested))
|
|
26
|
+
throw error;
|
|
27
|
+
await error.cancellation;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (;;) {
|
|
31
|
+
operation = currentOperation(lane, drive);
|
|
32
|
+
const state = operation.state;
|
|
33
|
+
let result;
|
|
34
|
+
try {
|
|
35
|
+
if (state.control.status === "cancel_requested") {
|
|
36
|
+
result = await reconcileOperation(lane, drive);
|
|
37
|
+
}
|
|
38
|
+
else
|
|
39
|
+
switch (state.at) {
|
|
40
|
+
case "starting":
|
|
41
|
+
result = await startRun(lane, drive, state);
|
|
42
|
+
break;
|
|
43
|
+
case "checkpoint":
|
|
44
|
+
result = await runCheckpoint(lane, drive, state);
|
|
45
|
+
break;
|
|
46
|
+
case "assistant.ready":
|
|
47
|
+
case "assistant.retry_wait":
|
|
48
|
+
result = await runGeneration(lane, drive, state);
|
|
49
|
+
break;
|
|
50
|
+
case "assistant.effect_pending":
|
|
51
|
+
result = await recoverAssistantGeneration(lane, drive, state);
|
|
52
|
+
break;
|
|
53
|
+
case "tools":
|
|
54
|
+
result = await runTools(lane, drive, state);
|
|
55
|
+
break;
|
|
56
|
+
case "deferred.suspended":
|
|
57
|
+
case "deferred.effect_pending":
|
|
58
|
+
result = await runDeferred(lane, drive, state);
|
|
59
|
+
break;
|
|
60
|
+
case "summary.deciding":
|
|
61
|
+
result = await runStructuralDecision(lane, drive, state);
|
|
62
|
+
break;
|
|
63
|
+
case "summary.ready":
|
|
64
|
+
result = await runStructuralGeneration(lane, drive, state);
|
|
65
|
+
break;
|
|
66
|
+
case "summary.effect_pending":
|
|
67
|
+
result = await recoverStructuralGeneration(lane, drive, state);
|
|
68
|
+
break;
|
|
69
|
+
case "summary.retry_wait":
|
|
70
|
+
result = await runStructuralRetryWait(lane, drive, state);
|
|
71
|
+
break;
|
|
72
|
+
case "navigation.ready_to_commit":
|
|
73
|
+
result = await commitNavigation(lane, drive, state);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (!(error instanceof AbortRequested))
|
|
79
|
+
throw error;
|
|
80
|
+
await error.cancellation;
|
|
81
|
+
result = { kind: "continue" };
|
|
82
|
+
}
|
|
83
|
+
if (result.kind === "settled")
|
|
84
|
+
return { kind: "settled", outcome: result.outcome };
|
|
85
|
+
if (result.kind === "waiting")
|
|
86
|
+
return result.outcome;
|
|
87
|
+
const next = currentOperation(lane, drive).state;
|
|
88
|
+
if (next === state && next.control.status !== "cancel_requested") {
|
|
89
|
+
throw new SessionInvariantError(`Drive procedure made no progress from ${state.at}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=drive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/harness/runtime/drive.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DriveOutcome } from \"../agent-harness.ts\";\nimport { AbortRequested } from \"../execution/effect-gate.ts\";\nimport { SessionInvariantError } from \"../session/session.ts\";\nimport { runCheckpoint, startRun } from \"./drive/checkpoint.ts\";\nimport { runDeferred } from \"./drive/deferred.ts\";\nimport { runGeneration } from \"./drive/generation.ts\";\nimport { reconcileOperation } from \"./drive/reconcile.ts\";\nimport { recoverAssistantGeneration } from \"./drive/recovery.ts\";\nimport {\n\tcommitNavigation,\n\trecoverStructuralGeneration,\n\trunStructuralDecision,\n\trunStructuralGeneration,\n\trunStructuralRetryWait,\n} from \"./drive/structural.ts\";\nimport { runTools } from \"./drive/tools.ts\";\nimport type { Lane } from \"./lane.ts\";\nimport type { Drive, ProcedureResult } from \"./types.ts\";\n\nfunction currentOperation<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive) {\n\tconst operation = lane.state.operation;\n\tif (operation === null || operation.meta.operationId !== drive.operationId) {\n\t\tthrow new SessionInvariantError(`Drive ${drive.operationId} has no matching current operation`);\n\t}\n\treturn operation;\n}\n\n/** Drive one installed pass through direct durable procedures until settlement or a durable wait. */\nexport async function driveOperation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<DriveOutcome> {\n\tlet operation = currentOperation(lane, drive);\n\tif (operation.state.control.status === \"running\") {\n\t\ttry {\n\t\t\tawait lane.hooks.runWithGate(\n\t\t\t\t\"before_drive\",\n\t\t\t\t{ lane: lane.name, runId: drive.operationId, operation: operation.meta.intent.kind },\n\t\t\t\tdrive.gate,\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\t\tawait error.cancellation;\n\t\t}\n\t}\n\n\tfor (;;) {\n\t\toperation = currentOperation(lane, drive);\n\t\tconst state = operation.state;\n\t\tlet result: ProcedureResult;\n\t\ttry {\n\t\t\tif (state.control.status === \"cancel_requested\") {\n\t\t\t\tresult = await reconcileOperation(lane, drive);\n\t\t\t} else\n\t\t\t\tswitch (state.at) {\n\t\t\t\t\tcase \"starting\":\n\t\t\t\t\t\tresult = await startRun(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"checkpoint\":\n\t\t\t\t\t\tresult = await runCheckpoint(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assistant.ready\":\n\t\t\t\t\tcase \"assistant.retry_wait\":\n\t\t\t\t\t\tresult = await runGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"assistant.effect_pending\":\n\t\t\t\t\t\tresult = await recoverAssistantGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tools\":\n\t\t\t\t\t\tresult = await runTools(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"deferred.suspended\":\n\t\t\t\t\tcase \"deferred.effect_pending\":\n\t\t\t\t\t\tresult = await runDeferred(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.deciding\":\n\t\t\t\t\t\tresult = await runStructuralDecision(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.ready\":\n\t\t\t\t\t\tresult = await runStructuralGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.effect_pending\":\n\t\t\t\t\t\tresult = await recoverStructuralGeneration(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"summary.retry_wait\":\n\t\t\t\t\t\tresult = await runStructuralRetryWait(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"navigation.ready_to_commit\":\n\t\t\t\t\t\tresult = await commitNavigation(lane, drive, state);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\t\tawait error.cancellation;\n\t\t\tresult = { kind: \"continue\" };\n\t\t}\n\n\t\tif (result.kind === \"settled\") return { kind: \"settled\", outcome: result.outcome };\n\t\tif (result.kind === \"waiting\") return result.outcome;\n\t\tconst next = currentOperation(lane, drive).state;\n\t\tif (next === state && next.control.status !== \"cancel_requested\") {\n\t\t\tthrow new SessionInvariantError(`Drive procedure made no progress from ${state.at}`);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Models, RetryPolicy } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { QueueMode } from "../../types.ts";
|
|
3
|
+
import type { AcquireLaneOptions, AgentHarness, AgentHarnessOptions, AgentLane, LaneInfo, OpenOperation, Resources } from "../agent-harness.ts";
|
|
4
|
+
import { type CompactionSettings } from "../compaction/compaction.ts";
|
|
5
|
+
import type { Context } from "../context.ts";
|
|
6
|
+
import { HarnessEventBus } from "../events.ts";
|
|
7
|
+
import { HookRegistry } from "../hooks.ts";
|
|
8
|
+
import type { LaneConfiguration, Session } from "../session/types.ts";
|
|
9
|
+
import type { AgentHarnessStreamOptions, AgentHarnessTool } from "../types.ts";
|
|
10
|
+
import { Lane } from "./lane.ts";
|
|
11
|
+
import { type LaneState } from "./types.ts";
|
|
12
|
+
/** Runtime implementation of AgentHarness. The harness manages lanes but is not itself a lane. */
|
|
13
|
+
export declare class Harness<TContext extends object | undefined> implements AgentHarness<TContext> {
|
|
14
|
+
readonly session: Session;
|
|
15
|
+
readonly models: Models;
|
|
16
|
+
readonly hooks: HookRegistry;
|
|
17
|
+
readonly events: HarnessEventBus;
|
|
18
|
+
readonly lanesByName: Map<string, Lane<TContext>>;
|
|
19
|
+
private readonly seed;
|
|
20
|
+
private readonly configStore;
|
|
21
|
+
private closePromise;
|
|
22
|
+
private closedError;
|
|
23
|
+
private faultError;
|
|
24
|
+
constructor(options: AgentHarnessOptions<TContext>, seed: LaneConfiguration, restored: Map<string, LaneState>);
|
|
25
|
+
lane(name: string, context: Context): Promise<AgentLane>;
|
|
26
|
+
lane(name: string, options: AcquireLaneOptions, context: Context): Promise<AgentLane>;
|
|
27
|
+
lanes(context: Context): Promise<LaneInfo[]>;
|
|
28
|
+
getName(context: Context): Promise<string | undefined>;
|
|
29
|
+
setName(name: string | undefined, context: Context): Promise<void>;
|
|
30
|
+
getLabel(targetId: string, context: Context): Promise<string | undefined>;
|
|
31
|
+
setLabel(targetId: string, label: string | undefined, context: Context): Promise<void>;
|
|
32
|
+
getTools(context: Context): Promise<AgentHarnessTool<TContext>[]>;
|
|
33
|
+
setTools(tools: AgentHarnessTool<TContext>[], context: Context): Promise<void>;
|
|
34
|
+
getResources(context: Context): Promise<Resources>;
|
|
35
|
+
setResources(resources: Resources, context: Context): Promise<void>;
|
|
36
|
+
getStreamOptions(context: Context): Promise<AgentHarnessStreamOptions>;
|
|
37
|
+
setStreamOptions(options: AgentHarnessStreamOptions, context: Context): Promise<void>;
|
|
38
|
+
getRetryPolicy(context: Context): Promise<RetryPolicy>;
|
|
39
|
+
setRetryPolicy(policy: RetryPolicy, context: Context): Promise<void>;
|
|
40
|
+
getCompactionSettings(context: Context): Promise<CompactionSettings>;
|
|
41
|
+
setCompactionSettings(compaction: CompactionSettings, context: Context): Promise<void>;
|
|
42
|
+
getSteeringMode(context: Context): Promise<QueueMode>;
|
|
43
|
+
setSteeringMode(steeringMode: QueueMode, context: Context): Promise<void>;
|
|
44
|
+
getFollowUpMode(context: Context): Promise<QueueMode>;
|
|
45
|
+
setFollowUpMode(followUpMode: QueueMode, context: Context): Promise<void>;
|
|
46
|
+
watchSession(_context: Context): Promise<never>;
|
|
47
|
+
fault(cause: unknown, context: Context): Error;
|
|
48
|
+
close(context: Context): Promise<void>;
|
|
49
|
+
private buildLane;
|
|
50
|
+
private getConfig;
|
|
51
|
+
private setConfig;
|
|
52
|
+
private assertOpen;
|
|
53
|
+
}
|
|
54
|
+
/** Attach runtime without starting provider, tool, hook, or timer effects. */
|
|
55
|
+
export declare function createAgentHarness<TContext extends object | undefined = object | undefined>(options: AgentHarnessOptions<TContext>, context: Context): Promise<{
|
|
56
|
+
harness: AgentHarness<TContext>;
|
|
57
|
+
open: OpenOperation[];
|
|
58
|
+
}>;
|
|
59
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/harness/runtime/harness.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Models, RetryPolicy } from \"@earendil-works/pi-ai\";\nimport type { QueueMode } from \"../../types.ts\";\nimport type {\n\tAcquireLaneOptions,\n\tAgentHarness,\n\tAgentHarnessOptions,\n\tAgentLane,\n\tGlobalConfigEventPayload,\n\tLaneInfo,\n\tOpenOperation,\n\tResources,\n} from \"../agent-harness.ts\";\nimport { type CompactionSettings, DEFAULT_COMPACTION_SETTINGS } from \"../compaction/compaction.ts\";\nimport { DEFAULT_RETRY_POLICY, validateCompactionSettings, validateRetryPolicy, validateToolNames } from \"../config.ts\";\nimport type { Context } from \"../context.ts\";\nimport { HarnessEventBus } from \"../events.ts\";\nimport { HookRegistry } from \"../hooks.ts\";\nimport { convertToLlm } from \"../messages.ts\";\nimport { HarnessClosed, HarnessFault, InvalidLane, UnknownTarget } from \"../result.ts\";\nimport { SessionInvariantError } from \"../session/session.ts\";\nimport type { LaneConfiguration, Session } from \"../session/types.ts\";\nimport { branchTip, deleteValue, entryLabel, laneConfig, laneState, sessionName, setValue } from \"../session/values.ts\";\nimport type { AgentHarnessStreamOptions, AgentHarnessTool } from \"../types.ts\";\nimport { Lane } from \"./lane.ts\";\nimport { readLaneStorage, restoreLaneState, restoreSession } from \"./restore.ts\";\nimport { type Config, type LaneState, SliceNotImplemented } from \"./types.ts\";\n\n/** Runtime implementation of AgentHarness. The harness manages lanes but is not itself a lane. */\nexport class Harness<TContext extends object | undefined> implements AgentHarness<TContext> {\n\treadonly session: Session;\n\treadonly models: Models;\n\treadonly hooks: HookRegistry;\n\treadonly events: HarnessEventBus;\n\treadonly lanesByName = new Map<string, Lane<TContext>>();\n\tprivate readonly seed: LaneConfiguration;\n\tprivate readonly configStore: { value: Config<TContext> };\n\tprivate closePromise: Promise<void> | undefined;\n\tprivate closedError: Error | undefined;\n\tprivate faultError: HarnessFault | undefined;\n\n\tconstructor(options: AgentHarnessOptions<TContext>, seed: LaneConfiguration, restored: Map<string, LaneState>) {\n\t\tthis.session = options.session;\n\t\tthis.models = options.models;\n\t\tthis.seed = seed;\n\t\tthis.events = new HarnessEventBus();\n\t\tthis.hooks = new HookRegistry((error, hook, lane, context) =>\n\t\t\tthis.events.emit(\n\t\t\t\t{\n\t\t\t\t\ttype: \"handler_error\",\n\t\t\t\t\tkind: \"hook\",\n\t\t\t\t\thook,\n\t\t\t\t\terror: error.message,\n\t\t\t\t\t...(error.stack === undefined ? {} : { stack: error.stack }),\n\t\t\t\t\tlane,\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t),\n\t\t);\n\t\tthis.configStore = {\n\t\t\tvalue: {\n\t\t\t\ttools: options.tools ?? [],\n\t\t\t\tresources: options.resources ?? {},\n\t\t\t\tstreamOptions: options.streamOptions ?? {},\n\t\t\t\tretryPolicy: options.retry ?? DEFAULT_RETRY_POLICY,\n\t\t\t\tcompaction: options.compaction ?? DEFAULT_COMPACTION_SETTINGS,\n\t\t\t\tsteeringMode: options.steeringMode ?? \"all\",\n\t\t\t\tfollowUpMode: options.followUpMode ?? \"all\",\n\t\t\t\ttoolExecution: options.toolExecution ?? \"parallel\",\n\t\t\t\ttoolContext: options.toolContext,\n\t\t\t\tsystemPrompt: options.systemPrompt,\n\t\t\t\ttoProviderMessages: options.toProviderMessages ?? ((messages) => convertToLlm(messages)),\n\t\t\t\tentryProjectors: options.entryProjectors ?? {},\n\t\t\t},\n\t\t};\n\t\tfor (const [name, state] of restored) this.lanesByName.set(name, this.buildLane(name, state));\n\t}\n\n\tlane(name: string, context: Context): Promise<AgentLane>;\n\tlane(name: string, options: AcquireLaneOptions, context: Context): Promise<AgentLane>;\n\tasync lane(\n\t\tname: string,\n\t\toptionsOrContext: AcquireLaneOptions | Context,\n\t\tmaybeContext?: Context,\n\t): Promise<AgentLane> {\n\t\tthis.assertOpen();\n\t\tif (name.length === 0 || name.includes(\"\\u0000\")) {\n\t\t\tconst reason = name.length === 0 ? \"lane name must not be empty\" : \"lane name must not contain \\\\u0000\";\n\t\t\tthrow new InvalidLane({\n\t\t\t\tlane: name,\n\t\t\t\treason,\n\t\t\t\tmessage: `Invalid lane ${JSON.stringify(name)}: ${reason}`,\n\t\t\t});\n\t\t}\n\t\tconst options = maybeContext === undefined ? {} : (optionsOrContext as AcquireLaneOptions);\n\t\tconst context = maybeContext ?? (optionsOrContext as Context);\n\t\tlet lane: Lane<TContext> | undefined;\n\t\tlet delivery: Promise<void> | undefined;\n\t\ttry {\n\t\t\tawait this.session.mutate(async (mutator) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\tlane = this.lanesByName.get(name);\n\t\t\t\tif (lane !== undefined) return;\n\n\t\t\t\tconst stored = await readLaneStorage(mutator, name, context);\n\t\t\t\tif (stored.kind === \"lane\") {\n\t\t\t\t\tconst restored = await restoreLaneState(mutator, name, stored, context);\n\t\t\t\t\tlane = this.buildLane(name, restored);\n\t\t\t\t\tthis.lanesByName.set(name, lane);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst tipId = stored.kind === \"branch\" ? stored.tip.value : (options.createAt ?? null);\n\t\t\t\tif (\n\t\t\t\t\tstored.kind === \"absent\" &&\n\t\t\t\t\ttipId !== null &&\n\t\t\t\t\t!(await mutator.getEntries([tipId], context)).has(tipId)\n\t\t\t\t) {\n\t\t\t\t\tthrow new UnknownTarget({\n\t\t\t\t\t\ttargetId: tipId,\n\t\t\t\t\t\tmessage: `Unknown target: ${tipId}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst attachedConfiguration: LaneConfiguration = {\n\t\t\t\t\tmodel: { ...this.seed.model },\n\t\t\t\t\tthinkingLevel: this.seed.thinkingLevel,\n\t\t\t\t\tactiveToolNames: [...this.seed.activeToolNames],\n\t\t\t\t};\n\t\t\t\tconst state: LaneState = {\n\t\t\t\t\ttipId,\n\t\t\t\t\tconfiguration: attachedConfiguration,\n\t\t\t\t\tinbox: [],\n\t\t\t\t\tlastOperationId: null,\n\t\t\t\t\toperation: null,\n\t\t\t\t};\n\t\t\t\tconst writes = [\n\t\t\t\t\t...(stored.kind === \"absent\" ? [setValue(branchTip(name), tipId)] : []),\n\t\t\t\t\tsetValue(laneConfig(name), attachedConfiguration),\n\t\t\t\t\tsetValue(laneState(name), {\n\t\t\t\t\t\tcurrentOperationId: null,\n\t\t\t\t\t\tlastOperationId: null,\n\t\t\t\t\t\tinbox: [],\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t\tawait mutator.commit(writes, context);\n\t\t\t\tlane = this.buildLane(name, state);\n\t\t\t\tthis.lanesByName.set(name, lane);\n\t\t\t\tdelivery = this.events.emitBatch([{ type: \"lane_created\", lane: name, at: tipId }], context);\n\t\t\t}, context);\n\t\t} catch (error) {\n\t\t\tif (this.closedError !== undefined) throw this.closedError;\n\t\t\tif (error instanceof InvalidLane || error instanceof UnknownTarget) throw error;\n\t\t\tthrow this.fault(error, context);\n\t\t}\n\t\tawait delivery;\n\t\tif (lane === undefined)\n\t\t\tthrow this.fault(new SessionInvariantError(`Lane ${JSON.stringify(name)} was not published`), context);\n\t\treturn lane;\n\t}\n\n\tasync lanes(context: Context): Promise<LaneInfo[]> {\n\t\tthis.assertOpen();\n\t\tconst executions = await Promise.all(\n\t\t\t[...this.lanesByName.values()].map((lane) => lane.inspectExecution(context)),\n\t\t);\n\t\treturn executions.map((execution) => ({\n\t\t\tname: execution.lane,\n\t\t\ttipId: execution.tipId,\n\t\t\toperation: execution.current,\n\t\t}));\n\t}\n\n\tgetName(context: Context): Promise<string | undefined> {\n\t\tthis.assertOpen();\n\t\treturn this.session.getName(context);\n\t}\n\n\tasync setName(name: string | undefined, context: Context): Promise<void> {\n\t\tthis.assertOpen();\n\t\tlet delivery: Promise<void> | undefined;\n\t\ttry {\n\t\t\tawait this.session.mutate(async (mutator) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\tawait mutator.commit(\n\t\t\t\t\t[name === undefined ? deleteValue(sessionName) : setValue(sessionName, name)],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tdelivery = this.events.emitBatch([{ type: \"value_update\", value: \"session_name\", name }], context);\n\t\t\t}, context);\n\t\t} catch (error) {\n\t\t\tif (this.closedError !== undefined) throw this.closedError;\n\t\t\tthrow this.fault(error, context);\n\t\t}\n\t\tawait delivery;\n\t}\n\n\tgetLabel(targetId: string, context: Context): Promise<string | undefined> {\n\t\tthis.assertOpen();\n\t\treturn this.session.getLabel(targetId, context);\n\t}\n\n\tasync setLabel(targetId: string, label: string | undefined, context: Context): Promise<void> {\n\t\tthis.assertOpen();\n\t\tlet delivery: Promise<void> | undefined;\n\t\ttry {\n\t\t\tawait this.session.mutate(async (mutator) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\tconst address = entryLabel(targetId);\n\t\t\t\tawait mutator.commit([label === undefined ? deleteValue(address) : setValue(address, label)], context);\n\t\t\t\tdelivery = this.events.emitBatch(\n\t\t\t\t\t[{ type: \"value_update\", value: \"entry_label\", targetId, label }],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t}, context);\n\t\t} catch (error) {\n\t\t\tif (this.closedError !== undefined) throw this.closedError;\n\t\t\tthrow this.fault(error, context);\n\t\t}\n\t\tawait delivery;\n\t}\n\n\tgetTools(context: Context): Promise<AgentHarnessTool<TContext>[]> {\n\t\treturn this.getConfig(\"tools\", context);\n\t}\n\n\tsetTools(tools: AgentHarnessTool<TContext>[], context: Context): Promise<void> {\n\t\tvalidateToolNames(tools);\n\t\treturn this.setConfig(\"tools\", tools, () => ({ type: \"config_update\", property: \"tools\" }), context);\n\t}\n\n\tgetResources(context: Context): Promise<Resources> {\n\t\treturn this.getConfig(\"resources\", context);\n\t}\n\n\tsetResources(resources: Resources, context: Context): Promise<void> {\n\t\treturn this.setConfig(\"resources\", resources, () => ({ type: \"config_update\", property: \"resources\" }), context);\n\t}\n\n\tgetStreamOptions(context: Context): Promise<AgentHarnessStreamOptions> {\n\t\treturn this.getConfig(\"streamOptions\", context);\n\t}\n\n\tsetStreamOptions(options: AgentHarnessStreamOptions, context: Context): Promise<void> {\n\t\treturn this.setConfig(\n\t\t\t\"streamOptions\",\n\t\t\toptions,\n\t\t\t(previous, value) => ({ type: \"config_update\", property: \"streamOptions\", previous, value }),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tgetRetryPolicy(context: Context): Promise<RetryPolicy> {\n\t\treturn this.getConfig(\"retryPolicy\", context);\n\t}\n\n\tsetRetryPolicy(policy: RetryPolicy, context: Context): Promise<void> {\n\t\tvalidateRetryPolicy(policy);\n\t\treturn this.setConfig(\n\t\t\t\"retryPolicy\",\n\t\t\tpolicy,\n\t\t\t(previous, value) => ({ type: \"config_update\", property: \"retryPolicy\", previous, value }),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tgetCompactionSettings(context: Context): Promise<CompactionSettings> {\n\t\treturn this.getConfig(\"compaction\", context);\n\t}\n\n\tsetCompactionSettings(compaction: CompactionSettings, context: Context): Promise<void> {\n\t\tvalidateCompactionSettings(compaction);\n\t\treturn this.setConfig(\n\t\t\t\"compaction\",\n\t\t\tcompaction,\n\t\t\t(previous, value) => ({ type: \"config_update\", property: \"compactionSettings\", previous, value }),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tgetSteeringMode(context: Context): Promise<QueueMode> {\n\t\treturn this.getConfig(\"steeringMode\", context);\n\t}\n\n\tsetSteeringMode(steeringMode: QueueMode, context: Context): Promise<void> {\n\t\treturn this.setConfig(\n\t\t\t\"steeringMode\",\n\t\t\tsteeringMode,\n\t\t\t(previous, value) => ({ type: \"config_update\", property: \"steeringMode\", previous, value }),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tgetFollowUpMode(context: Context): Promise<QueueMode> {\n\t\treturn this.getConfig(\"followUpMode\", context);\n\t}\n\n\tsetFollowUpMode(followUpMode: QueueMode, context: Context): Promise<void> {\n\t\treturn this.setConfig(\n\t\t\t\"followUpMode\",\n\t\t\tfollowUpMode,\n\t\t\t(previous, value) => ({ type: \"config_update\", property: \"followUpMode\", previous, value }),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tasync watchSession(_context: Context): Promise<never> {\n\t\tthrow new SliceNotImplemented(\"watchSession\");\n\t}\n\n\tfault(cause: unknown, context: Context): Error {\n\t\tif (this.faultError !== undefined) return this.faultError;\n\t\tif (this.closedError !== undefined) return this.closedError;\n\t\tconst normalized = cause instanceof Error ? cause : new Error(String(cause));\n\t\tconst fault = new HarnessFault(\"AgentHarness storage or invariant fault\", normalized);\n\t\tthis.faultError = fault;\n\t\tfor (const lane of this.lanesByName.values()) lane.seal(fault);\n\t\tthis.hooks.close(fault);\n\t\tvoid this.events.emit({ type: \"fault\", code: \"harness_fault\", message: fault.message }, context);\n\t\tthis.events.close(fault);\n\t\treturn fault;\n\t}\n\n\tclose(context: Context): Promise<void> {\n\t\tif (this.closePromise !== undefined) return this.closePromise;\n\t\tconst error = new HarnessClosed();\n\t\tthis.closedError = error;\n\t\tconst idleCallbacks = [...this.lanesByName.values()].map((lane) => lane.seal(error));\n\t\tthis.hooks.close(error);\n\t\tthis.events.close(error);\n\t\tconst sessionClose = this.session.close(context);\n\t\tthis.closePromise = Promise.all([sessionClose, ...idleCallbacks]).then(() => undefined);\n\t\treturn this.closePromise;\n\t}\n\n\tprivate buildLane(name: string, state: LaneState): Lane<TContext> {\n\t\treturn new Lane<TContext>(\n\t\t\tname,\n\t\t\tthis.session,\n\t\t\tthis.models,\n\t\t\tthis.hooks,\n\t\t\tstate,\n\t\t\t(cause, context) => this.fault(cause, context),\n\t\t\t(events, context) => this.events.emitBatch(events, context),\n\t\t\t(snapshot, filter, context, resnapshot) => this.events.watch(snapshot, filter, context, resnapshot),\n\t\t\t() => this.configStore.value,\n\t\t);\n\t}\n\n\tprivate async getConfig<TKey extends keyof Config<TContext>>(\n\t\tkey: TKey,\n\t\t_context: Context,\n\t): Promise<Config<TContext>[TKey]> {\n\t\tthis.assertOpen();\n\t\treturn this.configStore.value[key];\n\t}\n\n\tprivate async setConfig<TKey extends keyof Config<TContext>>(\n\t\tkey: TKey,\n\t\tvalue: Config<TContext>[TKey],\n\t\tevent: (previous: Config<TContext>[TKey], value: Config<TContext>[TKey]) => GlobalConfigEventPayload,\n\t\tcontext: Context,\n\t): Promise<void> {\n\t\tthis.assertOpen();\n\t\tconst previous = this.configStore.value[key];\n\t\tthis.configStore.value = { ...this.configStore.value, [key]: value };\n\t\tawait this.events.emit(event(previous, value), context);\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.faultError !== undefined) throw this.faultError;\n\t\tif (this.closedError !== undefined) throw this.closedError;\n\t}\n}\n\n/** Attach runtime without starting provider, tool, hook, or timer effects. */\nexport async function createAgentHarness<TContext extends object | undefined = object | undefined>(\n\toptions: AgentHarnessOptions<TContext>,\n\tcontext: Context,\n): Promise<{ harness: AgentHarness<TContext>; open: OpenOperation[] }> {\n\tconst tools = options.tools ?? [];\n\tvalidateToolNames(tools);\n\tvalidateRetryPolicy(options.retry ?? DEFAULT_RETRY_POLICY);\n\tvalidateCompactionSettings(options.compaction ?? DEFAULT_COMPACTION_SETTINGS);\n\tconst seed: LaneConfiguration = {\n\t\tmodel: { provider: options.model.provider, modelId: options.model.id },\n\t\tthinkingLevel: options.thinkingLevel ?? \"off\",\n\t\tactiveToolNames: [...(options.activeToolNames ?? tools.map((tool) => tool.name))],\n\t};\n\ttry {\n\t\tconst restored = await restoreSession(options.session, context);\n\t\tconst open = [...restored].flatMap(([lane, state]): OpenOperation[] => {\n\t\t\tconst operation = state.operation;\n\t\t\treturn operation === null\n\t\t\t\t? []\n\t\t\t\t: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlane,\n\t\t\t\t\t\t\toperationId: operation.meta.operationId,\n\t\t\t\t\t\t\tkind: operation.meta.intent.kind,\n\t\t\t\t\t\t\tstartedAt: operation.meta.startedAt,\n\t\t\t\t\t\t\t...(operation.state.control.status === \"cancel_requested\" ? { aborting: true as const } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t});\n\t\treturn { harness: new Harness(options, seed, restored), open };\n\t} catch (error) {\n\t\tthrow new HarnessFault(\"AgentHarness storage or invariant fault\", error);\n\t}\n}\n"]}
|