@m4ike1/ion-agent-core 0.1.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 +622 -0
- package/dist/agent-loop.d.ts +24 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +560 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent.d.ts +122 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +422 -0
- package/dist/agent.js.map +1 -0
- package/dist/harness/agent-harness.d.ts +716 -0
- package/dist/harness/agent-harness.d.ts.map +1 -0
- package/dist/harness/agent-harness.js +6 -0
- package/dist/harness/agent-harness.js.map +1 -0
- package/dist/harness/compaction/branch-summarization.d.ts +68 -0
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/harness/compaction/branch-summarization.js +176 -0
- package/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/dist/harness/compaction/compaction.d.ts +126 -0
- package/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/dist/harness/compaction/compaction.js +560 -0
- package/dist/harness/compaction/compaction.js.map +1 -0
- package/dist/harness/compaction/utils.d.ts +25 -0
- package/dist/harness/compaction/utils.d.ts.map +1 -0
- package/dist/harness/compaction/utils.js +120 -0
- package/dist/harness/compaction/utils.js.map +1 -0
- package/dist/harness/config.d.ts +9 -0
- package/dist/harness/config.d.ts.map +1 -0
- package/dist/harness/config.js +35 -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 +43 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -0
- package/dist/harness/env/nodejs.js +865 -0
- package/dist/harness/env/nodejs.js.map +1 -0
- package/dist/harness/events.d.ts +25 -0
- package/dist/harness/events.d.ts.map +1 -0
- package/dist/harness/events.js +250 -0
- package/dist/harness/events.js.map +1 -0
- 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 +51 -0
- package/dist/harness/messages.d.ts.map +1 -0
- package/dist/harness/messages.js +102 -0
- package/dist/harness/messages.js.map +1 -0
- package/dist/harness/prompt-templates.d.ts +49 -0
- package/dist/harness/prompt-templates.d.ts.map +1 -0
- package/dist/harness/prompt-templates.js +225 -0
- package/dist/harness/prompt-templates.js.map +1 -0
- package/dist/harness/result.d.ts +133 -0
- package/dist/harness/result.d.ts.map +1 -0
- package/dist/harness/result.js +81 -0
- package/dist/harness/result.js.map +1 -0
- 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 +173 -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 +34 -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 +10 -0
- package/dist/harness/session/context.d.ts.map +1 -0
- package/dist/harness/session/context.js +49 -0
- package/dist/harness/session/context.js.map +1 -0
- package/dist/harness/session/fork-policy.d.ts +21 -0
- package/dist/harness/session/fork-policy.d.ts.map +1 -0
- package/dist/harness/session/fork-policy.js +55 -0
- package/dist/harness/session/fork-policy.js.map +1 -0
- package/dist/harness/session/fork.d.ts +16 -0
- package/dist/harness/session/fork.d.ts.map +1 -0
- package/dist/harness/session/fork.js +79 -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 +276 -0
- package/dist/harness/session/in-memory-storage-state.js.map +1 -0
- package/dist/harness/session/index.d.ts +11 -0
- package/dist/harness/session/index.d.ts.map +1 -0
- package/dist/harness/session/index.js +9 -0
- package/dist/harness/session/index.js.map +1 -0
- package/dist/harness/session/jsonl/codec.d.ts +21 -0
- package/dist/harness/session/jsonl/codec.d.ts.map +1 -0
- package/dist/harness/session/jsonl/codec.js +45 -0
- package/dist/harness/session/jsonl/codec.js.map +1 -0
- package/dist/harness/session/jsonl/fork.d.ts +38 -0
- package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
- package/dist/harness/session/jsonl/fork.js +264 -0
- package/dist/harness/session/jsonl/fork.js.map +1 -0
- 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/io.d.ts +14 -0
- package/dist/harness/session/jsonl/io.d.ts.map +1 -0
- package/dist/harness/session/jsonl/io.js +86 -0
- package/dist/harness/session/jsonl/io.js.map +1 -0
- package/dist/harness/session/jsonl/legacy-v3.d.ts +43 -0
- package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
- package/dist/harness/session/jsonl/legacy-v3.js +462 -0
- package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
- package/dist/harness/session/jsonl/repo.d.ts +35 -0
- package/dist/harness/session/jsonl/repo.d.ts.map +1 -0
- package/dist/harness/session/jsonl/repo.js +301 -0
- package/dist/harness/session/jsonl/repo.js.map +1 -0
- package/dist/harness/session/jsonl/storage.d.ts +40 -0
- package/dist/harness/session/jsonl/storage.d.ts.map +1 -0
- package/dist/harness/session/jsonl/storage.js +200 -0
- package/dist/harness/session/jsonl/storage.js.map +1 -0
- package/dist/harness/session/jsonl/types.d.ts +39 -0
- package/dist/harness/session/jsonl/types.d.ts.map +1 -0
- package/dist/harness/session/jsonl/types.js +3 -0
- package/dist/harness/session/jsonl/types.js.map +1 -0
- package/dist/harness/session/memory.d.ts +48 -0
- package/dist/harness/session/memory.d.ts.map +1 -0
- package/dist/harness/session/memory.js +369 -0
- package/dist/harness/session/memory.js.map +1 -0
- 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 +82 -0
- package/dist/harness/session/session.d.ts.map +1 -0
- package/dist/harness/session/session.js +361 -0
- package/dist/harness/session/session.js.map +1 -0
- 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 +23 -0
- package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
- package/dist/harness/session/testing/conformance/session-repo.js +809 -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 +10 -0
- package/dist/harness/session/testing/index.d.ts.map +1 -0
- package/dist/harness/session/testing/index.js +9 -0
- package/dist/harness/session/testing/index.js.map +1 -0
- 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 +12 -0
- package/dist/harness/session/testing/types.d.ts.map +1 -0
- package/dist/harness/session/testing/types.js +2 -0
- package/dist/harness/session/testing/types.js.map +1 -0
- package/dist/harness/session/types.d.ts +512 -0
- package/dist/harness/session/types.d.ts.map +1 -0
- package/dist/harness/session/types.js +9 -0
- package/dist/harness/session/types.js.map +1 -0
- 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 +46 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +326 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/system-prompt.d.ts +3 -0
- package/dist/harness/system-prompt.d.ts.map +1 -0
- package/dist/harness/system-prompt.js +30 -0
- package/dist/harness/system-prompt.js.map +1 -0
- package/dist/harness/telemetry.d.ts +1242 -0
- package/dist/harness/telemetry.d.ts.map +1 -0
- package/dist/harness/telemetry.js +527 -0
- package/dist/harness/telemetry.js.map +1 -0
- package/dist/harness/tools/bash.d.ts +27 -0
- package/dist/harness/tools/bash.d.ts.map +1 -0
- package/dist/harness/tools/bash.js +105 -0
- package/dist/harness/tools/bash.js.map +1 -0
- package/dist/harness/tools/edit-diff.d.ts +89 -0
- package/dist/harness/tools/edit-diff.d.ts.map +1 -0
- package/dist/harness/tools/edit-diff.js +386 -0
- package/dist/harness/tools/edit-diff.js.map +1 -0
- package/dist/harness/tools/edit.d.ts +19 -0
- package/dist/harness/tools/edit.d.ts.map +1 -0
- package/dist/harness/tools/edit.js +108 -0
- package/dist/harness/tools/edit.js.map +1 -0
- package/dist/harness/tools/file-mutation-queue.d.ts +5 -0
- package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/harness/tools/file-mutation-queue.js +46 -0
- package/dist/harness/tools/file-mutation-queue.js.map +1 -0
- package/dist/harness/tools/image.d.ts +3 -0
- package/dist/harness/tools/image.d.ts.map +1 -0
- package/dist/harness/tools/image.js +106 -0
- package/dist/harness/tools/image.js.map +1 -0
- package/dist/harness/tools/index.d.ts +6 -0
- package/dist/harness/tools/index.d.ts.map +1 -0
- package/dist/harness/tools/index.js +5 -0
- package/dist/harness/tools/index.js.map +1 -0
- package/dist/harness/tools/path-utils.d.ts +5 -0
- package/dist/harness/tools/path-utils.d.ts.map +1 -0
- package/dist/harness/tools/path-utils.js +26 -0
- package/dist/harness/tools/path-utils.js.map +1 -0
- package/dist/harness/tools/read.d.ts +35 -0
- package/dist/harness/tools/read.d.ts.map +1 -0
- package/dist/harness/tools/read.js +108 -0
- package/dist/harness/tools/read.js.map +1 -0
- package/dist/harness/tools/tool-context.d.ts +6 -0
- package/dist/harness/tools/tool-context.d.ts.map +1 -0
- package/dist/harness/tools/tool-context.js +2 -0
- package/dist/harness/tools/tool-context.js.map +1 -0
- package/dist/harness/tools/write.d.ts +11 -0
- package/dist/harness/tools/write.d.ts.map +1 -0
- package/dist/harness/tools/write.js +31 -0
- package/dist/harness/tools/write.js.map +1 -0
- package/dist/harness/types.d.ts +305 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +75 -0
- package/dist/harness/types.js.map +1 -0
- 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 +29 -0
- package/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/dist/harness/utils/shell-output.js +71 -0
- package/dist/harness/utils/shell-output.js.map +1 -0
- package/dist/harness/utils/truncate.d.ts +71 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -0
- package/dist/harness/utils/truncate.js +296 -0
- package/dist/harness/utils/truncate.js.map +1 -0
- 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 +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/proxy.d.ts +72 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +310 -0
- package/dist/proxy.js.map +1 -0
- package/dist/search/index.d.ts +29 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -0
- package/dist/stream-fn.d.ts +10 -0
- package/dist/stream-fn.d.ts.map +1 -0
- package/dist/stream-fn.js +17 -0
- package/dist/stream-fn.js.map +1 -0
- package/dist/types.d.ts +416 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-harness.d.ts","sourceRoot":"","sources":["../../src/harness/agent-harness.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRepresentation } from \"@m4ike1/chord\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEvent,\n\tAssistantMessageFrame,\n\tDeferredHandle,\n\tImageContent,\n\tMessage,\n\tModel,\n\tModels,\n\tRetryPolicy,\n\tToolResultMessage,\n\tUsage,\n} from \"@m4ike1/ion-ai\";\nimport type { AgentMessage, AgentToolResult, QueueMode, ThinkingLevel } from \"../types.ts\";\nimport type { BranchPreparation, BranchSummaryResult } from \"./compaction/branch-summarization.ts\";\nimport type { CompactionPreparation, CompactionSettings, CompactResult } from \"./compaction/compaction.ts\";\nimport type { Context } from \"./context.ts\";\nimport type {\n\tClosed,\n\tInvalidMessage,\n\tInvalidNavigation,\n\tLaneBusy,\n\tNoActiveOperation,\n\tNothingToCompact,\n\tNothingToResume,\n\tOperationMismatch,\n\tResult,\n\tUnknownSkill,\n\tUnknownTarget,\n\tUnknownTemplate,\n} from \"./result.ts\";\n\nexport {\n\tClosed,\n\tHarnessClosed,\n\tHarnessFault,\n\tInvalidLane,\n\tInvalidMessage,\n\tInvalidNavigation,\n\tLaneBusy,\n\tNoActiveOperation,\n\tNoActiveRun,\n\tNothingToCompact,\n\tNothingToResume,\n\tOperationMismatch,\n\tUnknownSkill,\n\tUnknownTarget,\n\tUnknownTemplate,\n} from \"./result.ts\";\nexport { SliceNotImplemented } from \"./runtime/types.ts\";\n\nimport { createAgentHarness } from \"./runtime/harness.ts\";\nimport type {\n\tBranchScan,\n\tEntry,\n\tEntryProjector,\n\tJsonValue,\n\tLaneConfiguration,\n\tOperationError,\n\tOperationResultRecord,\n\tSession,\n\tSessionStats,\n\tSettledAssistantMessage,\n\tUsageRow,\n} from \"./session/types.ts\";\nimport type {\n\tAgentHarnessResources,\n\tAgentHarnessStreamOptions,\n\tAgentHarnessStreamOptionsPatch,\n\tAgentHarnessTool,\n\tPromptTemplate,\n\tSkill,\n} from \"./types.ts\";\n\n/** Convenience-only suspended run observation, constructed when M8 exposes public drive. */\nexport interface SuspendedRun {\n\toperationId: string;\n\tstatus: \"suspended\";\n\tdeferred: DeferredHandle;\n}\n\nexport type RunResult = Result<\n\tOperationResultRecord | SuspendedRun,\n\tLaneBusy | InvalidMessage | UnknownSkill | UnknownTemplate | Closed\n>;\nexport type CompactionResult = Result<\n\t{ compaction: OperationResultRecord; run?: OperationResultRecord | SuspendedRun },\n\tLaneBusy | NothingToCompact | Closed\n>;\nexport type NavigationResult = Result<\n\t{ navigation: OperationResultRecord; run?: OperationResultRecord | SuspendedRun },\n\tLaneBusy | InvalidNavigation | UnknownTarget | Closed\n>;\nexport type ResumeResult = Result<OperationResultRecord | SuspendedRun, NothingToResume | Closed>;\nexport type QueueResult = Result<{ entryId: string }, InvalidMessage | Closed>;\nexport type CancelQueuedResult = Result<{ kind: \"cancelled\" | \"already_consumed\" | \"not_found\" }, Closed>;\nexport type AbortResult = Result<\n\t{ operationId: string; steer: AgentMessage[]; followUp: AgentMessage[] },\n\tNoActiveOperation | Closed\n>;\nexport type RecordUsageResult = Result<{ usageId: string }, Closed>;\n\nexport interface NavigateOptions {\n\tsummarize?: boolean;\n\tlabel?: string;\n\tcustomInstructions?: string;\n}\n\nexport type OperationRequest =\n\t| { kind: \"prompt\"; operationId?: string; prompt: string; images?: ImageContent[] }\n\t| { kind: \"prompt\"; operationId?: string; prompt: AgentMessage | AgentMessage[]; images?: never }\n\t| { kind: \"skill\"; operationId?: string; name: string; additionalInstructions?: string }\n\t| { kind: \"prompt_template\"; operationId?: string; name: string; args?: string[] }\n\t| { kind: \"compaction\"; operationId?: string; customInstructions?: string }\n\t| { kind: \"navigation\"; operationId?: string; targetId: string | null; options?: NavigateOptions };\n\nexport interface OperationAdmission {\n\toperationId: string;\n\tkind: \"run\" | \"compaction\" | \"navigation\";\n\tstartedAt: number;\n}\n\nexport type OperationAdmissionError =\n\t| LaneBusy\n\t| InvalidMessage\n\t| UnknownSkill\n\t| UnknownTemplate\n\t| NothingToCompact\n\t| InvalidNavigation\n\t| UnknownTarget\n\t| Closed;\nexport type OperationAdmissionResult = Result<OperationAdmission, OperationAdmissionError>;\n\nexport interface DriveOptions {\n\toperationId: string;\n\twaitForRetry?: boolean;\n\tpollDeferred?: boolean;\n}\n\nexport interface ModelIdentity {\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport type OperationStatus = \"running\" | \"open\" | \"aborting\";\n\nexport interface CurrentOperationInfo {\n\tid: string;\n\tkind: \"run\" | \"compaction\" | \"navigation\";\n\tstartedAt: number;\n\tstatus: OperationStatus;\n\tcapturedModel?: ModelIdentity;\n}\n\nexport interface LaneExecutionInfo {\n\tlane: string;\n\ttipId: string | null;\n\tconfiguredModel: ModelIdentity;\n\tcurrent: CurrentOperationInfo | null;\n\tlastOperationId: string | null;\n}\n\nexport type DriveOutcome =\n\t| { kind: \"settled\"; outcome: OperationResultRecord }\n\t| { kind: \"waiting\"; operationId: string; reason: \"retry\"; notBefore: number }\n\t| { kind: \"waiting\"; operationId: string; reason: \"deferred\"; deferred: DeferredHandle };\nexport type DriveResult = Result<DriveOutcome, OperationMismatch | Closed>;\n\nexport type AbortRequestResult = Result<\n\t{\n\t\toperationId: string;\n\t\tnewlyRequested: boolean;\n\t\tsteer: AgentMessage[];\n\t\tfollowUp: AgentMessage[];\n\t},\n\tOperationMismatch | Closed\n>;\n\nexport interface WatchHandle<T> {\n\tsnapshot: T;\n\tstart(listener: EventListener): void;\n\tresnapshot(context: Context): Promise<T>;\n\tunsubscribe(): void;\n}\n\nexport interface LaneInfo {\n\tname: string;\n\ttipId: string | null;\n\toperation: CurrentOperationInfo | null;\n}\n\nexport type LaneSnapshotTool =\n\t| {\n\t\t\tstatus: \"running\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t\t\tresult?: AgentToolResult<unknown>;\n\t }\n\t| {\n\t\t\tstatus: \"settled\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t\t\tresult: AgentToolResult<unknown>;\n\t\t\tisError: boolean;\n\t };\n\nexport interface OpenOperation {\n\tlane: string;\n\toperationId: string;\n\tkind: \"run\" | \"compaction\" | \"navigation\";\n\tstartedAt: number;\n\taborting?: true;\n}\n\nexport type LaneQueuedItem =\n\t| {\n\t\t\tentryId: string;\n\t\t\tkind: \"steer\" | \"followUp\" | \"nextRun\" | \"write\";\n\t\t\ttype: \"message\";\n\t\t\tmessage: AgentMessage;\n\t }\n\t| { entryId: string; kind: \"write\"; type: \"custom\"; customType: string; data?: JsonValue };\n\nexport interface LaneSnapshot {\n\tlane: string;\n\ttranscript: Entry[];\n\ttipId: string | null;\n\tlastResult?: OperationResultRecord;\n\tconfiguration: LaneConfiguration;\n\tstats: SessionStats;\n\toperation: null | {\n\t\tid: string;\n\t\tkind: \"run\" | \"compaction\" | \"navigation\";\n\t\tstartedAt: number;\n\t\tfromTipId: string | null;\n\t\tstatus: OperationStatus;\n\t\tretry?: { attempt: number; maxAttempts: number; nextAttemptAt: number };\n\t\tdeferred?: { handle: DeferredHandle; poll: number };\n\t\tstreamingMessage?: AssistantMessage;\n\t\trunningTools: LaneSnapshotTool[];\n\t};\n\tqueues: LaneQueuedItem[];\n\tfaulted: boolean;\n}\n\nexport interface SessionSnapshot {\n\tlanes: LaneInfo[];\n\tfaulted: boolean;\n}\n\nexport type HarnessEventPayload =\n\t| { type: \"run_start\"; runId: string; startedAt: number }\n\t| { type: \"run_resume\"; runId: string }\n\t| { type: \"run_suspend\"; runId: string; reason: \"deferred\"; deferred: DeferredHandle; poll: number }\n\t| { type: \"operation_abort\"; operationId: string; steer: AgentMessage[]; followUp: AgentMessage[] }\n\t| ({ type: \"run_end\"; runId: string; fromTipId: string | null; tipId: string | null; endedAt: number } & (\n\t\t\t| { status: \"completed\" | \"aborted\"; error?: never }\n\t\t\t| { status: \"failed\"; error: OperationError }\n\t ))\n\t| { type: \"fault\"; code: string; message: string }\n\t| ({ type: \"handler_error\"; error: string; stack?: string } & (\n\t\t\t| { kind: \"hook\"; hook: string }\n\t\t\t| { kind: \"event\"; event: string }\n\t ))\n\t| { type: \"turn_start\"; runId: string; turnId: string }\n\t| {\n\t\t\ttype: \"turn_end\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\tmessage: AssistantMessage;\n\t\t\ttoolResults: ToolResultMessage[];\n\t }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\trunId: string;\n\t\t\tstep: string;\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\tnotBefore: number;\n\t\t\terrorMessage: string;\n\t }\n\t| { type: \"retry_start\"; runId: string; step: string; attempt: number }\n\t| {\n\t\t\ttype: \"retry_end\";\n\t\t\trunId: string;\n\t\t\tstep: string;\n\t\t\tattempt: number;\n\t\t\tsuccess: boolean;\n\t\t\tfinalError?: string;\n\t }\n\t| { type: \"message_start\"; runId?: string; message: AgentMessage }\n\t| {\n\t\t\ttype: \"message_update\";\n\t\t\trunId: string;\n\t\t\tmessage: AgentMessage;\n\t\t\tevent: AssistantMessageEvent;\n\t\t\tframe?: AssistantMessageFrame;\n\t }\n\t| { type: \"message_end\"; runId?: string; message: AgentMessage; entryId?: string }\n\t| {\n\t\t\ttype: \"tool_start\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t }\n\t| {\n\t\t\ttype: \"tool_update\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tpartialResult: AgentToolResult<unknown>;\n\t }\n\t| {\n\t\t\ttype: \"tool_end\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tresult: AgentToolResult<unknown>;\n\t\t\tisError: boolean;\n\t\t\tterminate: boolean;\n\t }\n\t| { type: \"entry_added\"; entry: Entry }\n\t| { type: \"queue_update\"; queues: LaneQueuedItem[] }\n\t| ({ type: \"value_update\" } & (\n\t\t\t| { value: \"session_name\"; name: string | undefined }\n\t\t\t| { value: \"entry_label\"; targetId: string; label: string | undefined }\n\t ))\n\t| ({ type: \"config_update\" } & (\n\t\t\t| {\n\t\t\t\t\tproperty: \"model\";\n\t\t\t\t\tvalue: { provider: string; modelId: string };\n\t\t\t\t\tprevious: unknown;\n\t\t\t }\n\t\t\t| { property: \"thinkingLevel\"; value: ThinkingLevel; previous: ThinkingLevel }\n\t\t\t| { property: \"activeTools\"; value: string[]; previous: string[] }\n\t\t\t| { property: \"tools\" | \"resources\" }\n\t\t\t| {\n\t\t\t\t\tproperty: \"streamOptions\";\n\t\t\t\t\tvalue: AgentHarnessStreamOptions;\n\t\t\t\t\tprevious: AgentHarnessStreamOptions;\n\t\t\t }\n\t\t\t| { property: \"retryPolicy\"; value: RetryPolicy; previous: RetryPolicy }\n\t\t\t| { property: \"compactionSettings\"; value: CompactionSettings; previous: CompactionSettings }\n\t\t\t| { property: \"steeringMode\"; value: QueueMode; previous: QueueMode }\n\t\t\t| { property: \"followUpMode\"; value: QueueMode; previous: QueueMode }\n\t ))\n\t| {\n\t\t\ttype: \"compaction_start\";\n\t\t\trunId: string;\n\t\t\treason: \"manual\" | \"threshold\" | \"overflow\";\n\t\t\tstartedAt: number;\n\t }\n\t| ({ type: \"compaction_end\"; runId: string; reason: \"manual\" | \"threshold\" | \"overflow\"; endedAt: number } & (\n\t\t\t| { status: \"completed\"; entryId: string; error?: never }\n\t\t\t| { status: \"declined\" | \"aborted\"; entryId?: never; error?: never }\n\t\t\t| { status: \"failed\"; entryId?: never; error: OperationError }\n\t ))\n\t| { type: \"navigation_start\"; runId: string; targetId: string | null; startedAt: number }\n\t| ({ type: \"navigation_end\"; runId: string; fromTipId: string | null; tipId: string | null; endedAt: number } & (\n\t\t\t| { status: \"completed\" | \"declined\" | \"aborted\"; error?: never }\n\t\t\t| { status: \"failed\"; error: OperationError }\n\t ))\n\t| { type: \"lane_created\"; at: string | null }\n\t| { type: \"usage\"; lane: string; row: UsageRow; totals: Usage };\n\nexport type SpecialEventPayload = Extract<\n\tHarnessEventPayload,\n\t{ type: \"fault\" | \"value_update\" | \"usage\" | \"config_update\" | \"handler_error\" }\n>;\nexport type LaneEventPayload = Exclude<HarnessEventPayload, SpecialEventPayload>;\nexport type ConfigEventPayload = Extract<HarnessEventPayload, { type: \"config_update\" }>;\nexport type LaneConfigEventPayload = Extract<\n\tConfigEventPayload,\n\t{ property: \"model\" | \"thinkingLevel\" | \"activeTools\" }\n>;\nexport type GlobalConfigEventPayload = Exclude<ConfigEventPayload, LaneConfigEventPayload>;\nexport type HandlerErrorPayload = Extract<HarnessEventPayload, { type: \"handler_error\" }>;\n\nexport type HarnessEvent =\n\t| (LaneEventPayload & { lane: string; recovery?: true })\n\t| (LaneConfigEventPayload & { lane: string; recovery?: true })\n\t| (Extract<HarnessEventPayload, { type: \"fault\" | \"value_update\" }> & {\n\t\t\tlane?: never;\n\t\t\trecovery?: never;\n\t })\n\t| (Extract<HarnessEventPayload, { type: \"usage\" }> & { recovery?: never })\n\t| (GlobalConfigEventPayload & { lane?: never; recovery?: never })\n\t| (HandlerErrorPayload & ({ lane: string; recovery?: true } | { lane?: never; recovery?: never }));\n\ntype LaneWatchSourceEvent =\n\t| Exclude<\n\t\t\tHarnessEvent,\n\t\t\t| { type: \"handler_error\" | \"turn_start\" | \"turn_end\" | \"value_update\" | \"lane_created\" | \"message_update\" }\n\t\t\t| ({ type: \"config_update\" } & { property: string })\n\t >\n\t| Extract<HarnessEvent, { type: \"config_update\"; property: \"model\" | \"thinkingLevel\" | \"activeTools\" }>\n\t| Omit<Extract<HarnessEvent, { type: \"message_update\" }>, \"event\">;\n\n/** Strict-JSON snapshot representation published to remote transcript consumers. */\nexport type LaneTranscriptSnapshot = JsonRepresentation<LaneSnapshot>;\n/** Reducer-relevant strict-JSON Harness events published to remote transcript consumers. */\nexport type LaneWatchEvent = JsonRepresentation<LaneWatchSourceEvent>;\n\nexport type HarnessEventType = HarnessEvent[\"type\"];\nexport type EventListener<TEvent extends HarnessEvent = HarnessEvent> = (\n\tevent: TEvent,\n\tcontext: Context,\n) => void | Promise<void>;\n\nexport interface Events {\n\ton<TType extends HarnessEventType>(\n\t\ttype: TType,\n\t\tlistener: EventListener<Extract<HarnessEvent, { type: TType }>>,\n\t): () => void;\n}\n\nexport type Resources = AgentHarnessResources<Skill, PromptTemplate>;\n\ntype VoidHookResult = ReturnType<() => void>;\n\nexport interface HookMap {\n\tbefore_run: {\n\t\tevent: { prompt: AgentMessage[]; resources: Resources };\n\t\tresult: { messages?: AgentMessage[] } | undefined;\n\t};\n\tbefore_drive: {\n\t\tevent: { operation: \"run\" | \"compaction\" | \"navigation\" };\n\t\tresult: VoidHookResult;\n\t};\n\tbefore_run_end: {\n\t\tevent: { runId: string; messages: AgentMessage[] };\n\t\tresult: { followUp?: string } | undefined;\n\t};\n\ttransform_context: {\n\t\tevent: { messages: AgentMessage[]; systemPrompt: string };\n\t\tresult: { messages?: AgentMessage[]; systemPrompt?: string } | undefined;\n\t};\n\tbefore_request: {\n\t\tevent: {\n\t\t\tmodel: Model<Api>;\n\t\t\tstep: \"assistant\" | \"deferred\" | \"compaction\" | \"branch_summary\";\n\t\t\tattempt: number;\n\t\t\tstreamOptions: AgentHarnessStreamOptions;\n\t\t};\n\t\tresult: { streamOptions?: AgentHarnessStreamOptionsPatch } | undefined;\n\t};\n\tbefore_payload: {\n\t\tevent: { model: Model<Api>; payload: unknown };\n\t\tresult: { payload: unknown } | undefined;\n\t};\n\tafter_response: {\n\t\tevent: { status?: number; headers?: Record<string, string>; message: SettledAssistantMessage };\n\t\tresult: { message?: SettledAssistantMessage } | undefined;\n\t};\n\tbefore_tool: {\n\t\tevent: { toolCallId: string; toolName: string; args: Record<string, JsonValue> };\n\t\tresult: { args?: Record<string, JsonValue>; block?: { reason: string; terminate?: boolean } } | undefined;\n\t};\n\tafter_tool: {\n\t\tevent: {\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: Record<string, JsonValue>;\n\t\t\tcontent: AgentToolResult<unknown>[\"content\"];\n\t\t\tdetails?: JsonValue;\n\t\t\tisError: boolean;\n\t\t\tusage?: Usage;\n\t\t};\n\t\tresult:\n\t\t\t| {\n\t\t\t\t\tcontent?: AgentToolResult<unknown>[\"content\"];\n\t\t\t\t\tdetails?: JsonValue;\n\t\t\t\t\tisError?: boolean;\n\t\t\t\t\tusage?: Usage;\n\t\t\t\t\tterminate?: boolean;\n\t\t\t }\n\t\t\t| undefined;\n\t};\n\tbefore_compaction: {\n\t\tevent: {\n\t\t\treason: \"manual\" | \"threshold\" | \"overflow\";\n\t\t\tpreparation: CompactionPreparation;\n\t\t\tcustomInstructions?: string;\n\t\t};\n\t\tresult: { decline?: boolean; compaction?: CompactResult } | undefined;\n\t};\n\tbefore_navigation: {\n\t\tevent: { targetId: string; preparation: BranchPreparation; customInstructions?: string };\n\t\tresult: { decline?: boolean; summary?: BranchSummaryResult } | undefined;\n\t};\n}\n\nexport type HookName = keyof HookMap;\nexport type HookInvocation<TName extends HookName> = HookMap[TName][\"event\"] & {\n\tlane: string;\n\trunId: string;\n};\nexport type HookHandler<TName extends HookName> = (\n\tevent: HookInvocation<TName>,\n\tcontext: Context,\n) => Promise<HookMap[TName][\"result\"]> | HookMap[TName][\"result\"];\n\nexport interface Hooks {\n\ton<TName extends HookName>(name: TName, handler: HookHandler<TName>, options?: { id?: string }): () => void;\n}\n\nexport type { EntryProjector } from \"./session/types.ts\";\n\nexport interface AgentHarnessOptions<TContext extends object | undefined = object | undefined> {\n\tsession: Session;\n\tmodels: Models;\n\tmodel: Model<Api>;\n\tthinkingLevel?: ThinkingLevel;\n\tactiveToolNames?: string[];\n\ttools?: AgentHarnessTool<TContext>[];\n\ttoolContext?: TContext | ((context: Context) => TContext | Promise<TContext>);\n\tsystemPrompt?: string | ((toolContext: TContext, context: Context) => string | Promise<string>);\n\tresources?: Resources;\n\tstreamOptions?: AgentHarnessStreamOptions;\n\tretry?: RetryPolicy;\n\tcompaction?: CompactionSettings;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\ttoolExecution?: \"sequential\" | \"parallel\";\n\ttoProviderMessages?: (messages: AgentMessage[], context: Context) => Message[] | Promise<Message[]>;\n\tentryProjectors?: Record<string, EntryProjector>;\n}\n\nexport interface AgentLane {\n\treadonly name: string;\n\tgetTipId(context: Context): Promise<string | null>;\n\tfindEntries(query: BranchScan | undefined, context: Context): Promise<Entry[]>;\n\tfindEntry(query: BranchScan | undefined, context: Context): Promise<Entry | undefined>;\n\tappendMessage(message: AgentMessage, context: Context): Promise<string>;\n\tappendCustomEntry(customType: string, data: JsonValue | undefined, context: Context): Promise<string>;\n\tgetResult(operationId: string, context: Context): Promise<OperationResultRecord | undefined>;\n\taccept(request: OperationRequest, context: Context): Promise<OperationAdmissionResult>;\n\tdrive(options: DriveOptions, context: Context): Promise<DriveResult>;\n\trequestAbort(operationId: string, context: Context): Promise<AbortRequestResult>;\n\tinspectExecution(context: Context): Promise<LaneExecutionInfo>;\n\tprompt(text: string, images: ImageContent[] | undefined, context: Context): Promise<RunResult>;\n\tprompt(message: AgentMessage | AgentMessage[], context: Context): Promise<RunResult>;\n\tskill(name: string, additionalInstructions: string | undefined, context: Context): Promise<RunResult>;\n\tpromptFromTemplate(name: string, args: string[] | undefined, context: Context): Promise<RunResult>;\n\tcompact(options: { customInstructions?: string } | undefined, context: Context): Promise<CompactionResult>;\n\tnavigateTree(\n\t\ttargetId: string | null,\n\t\toptions: NavigateOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<NavigationResult>;\n\tresume(context: Context): Promise<ResumeResult>;\n\tabort(context: Context): Promise<AbortResult>;\n\tsteer(message: string | AgentMessage, images: ImageContent[] | undefined, context: Context): Promise<QueueResult>;\n\tfollowUp(message: string | AgentMessage, images: ImageContent[] | undefined, context: Context): Promise<QueueResult>;\n\tnextRun(message: string | AgentMessage, images: ImageContent[] | undefined, context: Context): Promise<QueueResult>;\n\tcancelQueued(entryId: string, context: Context): Promise<CancelQueuedResult>;\n\trecordUsage(\n\t\tusage: Usage,\n\t\toptions: { entryId?: string; details?: JsonValue } | undefined,\n\t\tcontext: Context,\n\t): Promise<RecordUsageResult>;\n\twaitForIdle(context: Context): Promise<void>;\n\trunWhenIdle(callback: (context: Context) => void | Promise<void>, context: Context): Promise<void>;\n\tgetModel(context: Context): Promise<Model<Api> | undefined>;\n\tsetModel(model: ModelIdentity, context: Context): Promise<void>;\n\tgetThinkingLevel(context: Context): Promise<ThinkingLevel>;\n\tsetThinkingLevel(level: ThinkingLevel, context: Context): Promise<void>;\n\tgetActiveTools(context: Context): Promise<string[]>;\n\tsetActiveTools(names: string[], context: Context): Promise<void>;\n\twatch(context: Context): Promise<WatchHandle<LaneSnapshot>>;\n}\n\nexport interface AcquireLaneOptions {\n\tcreateAt?: string | null;\n}\n\nexport interface AgentHarness<TContext extends object | undefined = object | undefined> {\n\tlane(name: string, context: Context): Promise<AgentLane>;\n\tlane(name: string, options: AcquireLaneOptions, context: Context): Promise<AgentLane>;\n\tlanes(context: Context): Promise<LaneInfo[]>;\n\tgetName(context: Context): Promise<string | undefined>;\n\tsetName(name: string | undefined, context: Context): Promise<void>;\n\tgetLabel(targetId: string, context: Context): Promise<string | undefined>;\n\tsetLabel(targetId: string, label: string | undefined, context: Context): Promise<void>;\n\tgetTools(context: Context): Promise<AgentHarnessTool<TContext>[]>;\n\tsetTools(tools: AgentHarnessTool<TContext>[], context: Context): Promise<void>;\n\tgetResources(context: Context): Promise<Resources>;\n\tsetResources(resources: Resources, context: Context): Promise<void>;\n\tgetStreamOptions(context: Context): Promise<AgentHarnessStreamOptions>;\n\tsetStreamOptions(options: AgentHarnessStreamOptions, context: Context): Promise<void>;\n\tgetRetryPolicy(context: Context): Promise<RetryPolicy>;\n\tsetRetryPolicy(policy: RetryPolicy, context: Context): Promise<void>;\n\tgetCompactionSettings(context: Context): Promise<CompactionSettings>;\n\tsetCompactionSettings(settings: CompactionSettings, context: Context): Promise<void>;\n\tgetSteeringMode(context: Context): Promise<QueueMode>;\n\tsetSteeringMode(mode: QueueMode, context: Context): Promise<void>;\n\tgetFollowUpMode(context: Context): Promise<QueueMode>;\n\tsetFollowUpMode(mode: QueueMode, context: Context): Promise<void>;\n\twatchSession(context: Context): Promise<WatchHandle<SessionSnapshot>>;\n\treadonly hooks: Hooks;\n\treadonly events: Events;\n\tclose(context: Context): Promise<void>;\n}\n\nexport interface AgentHarnessConstructor {\n\tcreate<TContext extends object | undefined = object | undefined>(\n\t\toptions: AgentHarnessOptions<TContext>,\n\t\tcontext: Context,\n\t): Promise<{ harness: AgentHarness<TContext>; open: OpenOperation[] }>;\n}\n\n/** Runtime constructor for attaching the durable harness to one open session. */\nexport const AgentHarness = { create: createAgentHarness } satisfies AgentHarnessConstructor;\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Closed, HarnessClosed, HarnessFault, InvalidLane, InvalidMessage, InvalidNavigation, LaneBusy, NoActiveOperation, NoActiveRun, NothingToCompact, NothingToResume, OperationMismatch, UnknownSkill, UnknownTarget, UnknownTemplate, } from "./result.js";
|
|
2
|
+
export { SliceNotImplemented } from "./runtime/types.js";
|
|
3
|
+
import { createAgentHarness } from "./runtime/harness.js";
|
|
4
|
+
/** Runtime constructor for attaching the durable harness to one open session. */
|
|
5
|
+
export const AgentHarness = { create: createAgentHarness };
|
|
6
|
+
//# sourceMappingURL=agent-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-harness.js","sourceRoot":"","sources":["../../src/harness/agent-harness.ts"],"names":[],"mappings":"AAkCA,OAAO,EACN,MAAM,EACN,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAujB1D,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAoC,CAAC","sourcesContent":["import type { JsonRepresentation } from \"@m4ike1/chord\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAssistantMessageEvent,\n\tAssistantMessageFrame,\n\tDeferredHandle,\n\tImageContent,\n\tMessage,\n\tModel,\n\tModels,\n\tRetryPolicy,\n\tToolResultMessage,\n\tUsage,\n} from \"@m4ike1/ion-ai\";\nimport type { AgentMessage, AgentToolResult, QueueMode, ThinkingLevel } from \"../types.ts\";\nimport type { BranchPreparation, BranchSummaryResult } from \"./compaction/branch-summarization.ts\";\nimport type { CompactionPreparation, CompactionSettings, CompactResult } from \"./compaction/compaction.ts\";\nimport type { Context } from \"./context.ts\";\nimport type {\n\tClosed,\n\tInvalidMessage,\n\tInvalidNavigation,\n\tLaneBusy,\n\tNoActiveOperation,\n\tNothingToCompact,\n\tNothingToResume,\n\tOperationMismatch,\n\tResult,\n\tUnknownSkill,\n\tUnknownTarget,\n\tUnknownTemplate,\n} from \"./result.ts\";\n\nexport {\n\tClosed,\n\tHarnessClosed,\n\tHarnessFault,\n\tInvalidLane,\n\tInvalidMessage,\n\tInvalidNavigation,\n\tLaneBusy,\n\tNoActiveOperation,\n\tNoActiveRun,\n\tNothingToCompact,\n\tNothingToResume,\n\tOperationMismatch,\n\tUnknownSkill,\n\tUnknownTarget,\n\tUnknownTemplate,\n} from \"./result.ts\";\nexport { SliceNotImplemented } from \"./runtime/types.ts\";\n\nimport { createAgentHarness } from \"./runtime/harness.ts\";\nimport type {\n\tBranchScan,\n\tEntry,\n\tEntryProjector,\n\tJsonValue,\n\tLaneConfiguration,\n\tOperationError,\n\tOperationResultRecord,\n\tSession,\n\tSessionStats,\n\tSettledAssistantMessage,\n\tUsageRow,\n} from \"./session/types.ts\";\nimport type {\n\tAgentHarnessResources,\n\tAgentHarnessStreamOptions,\n\tAgentHarnessStreamOptionsPatch,\n\tAgentHarnessTool,\n\tPromptTemplate,\n\tSkill,\n} from \"./types.ts\";\n\n/** Convenience-only suspended run observation, constructed when M8 exposes public drive. */\nexport interface SuspendedRun {\n\toperationId: string;\n\tstatus: \"suspended\";\n\tdeferred: DeferredHandle;\n}\n\nexport type RunResult = Result<\n\tOperationResultRecord | SuspendedRun,\n\tLaneBusy | InvalidMessage | UnknownSkill | UnknownTemplate | Closed\n>;\nexport type CompactionResult = Result<\n\t{ compaction: OperationResultRecord; run?: OperationResultRecord | SuspendedRun },\n\tLaneBusy | NothingToCompact | Closed\n>;\nexport type NavigationResult = Result<\n\t{ navigation: OperationResultRecord; run?: OperationResultRecord | SuspendedRun },\n\tLaneBusy | InvalidNavigation | UnknownTarget | Closed\n>;\nexport type ResumeResult = Result<OperationResultRecord | SuspendedRun, NothingToResume | Closed>;\nexport type QueueResult = Result<{ entryId: string }, InvalidMessage | Closed>;\nexport type CancelQueuedResult = Result<{ kind: \"cancelled\" | \"already_consumed\" | \"not_found\" }, Closed>;\nexport type AbortResult = Result<\n\t{ operationId: string; steer: AgentMessage[]; followUp: AgentMessage[] },\n\tNoActiveOperation | Closed\n>;\nexport type RecordUsageResult = Result<{ usageId: string }, Closed>;\n\nexport interface NavigateOptions {\n\tsummarize?: boolean;\n\tlabel?: string;\n\tcustomInstructions?: string;\n}\n\nexport type OperationRequest =\n\t| { kind: \"prompt\"; operationId?: string; prompt: string; images?: ImageContent[] }\n\t| { kind: \"prompt\"; operationId?: string; prompt: AgentMessage | AgentMessage[]; images?: never }\n\t| { kind: \"skill\"; operationId?: string; name: string; additionalInstructions?: string }\n\t| { kind: \"prompt_template\"; operationId?: string; name: string; args?: string[] }\n\t| { kind: \"compaction\"; operationId?: string; customInstructions?: string }\n\t| { kind: \"navigation\"; operationId?: string; targetId: string | null; options?: NavigateOptions };\n\nexport interface OperationAdmission {\n\toperationId: string;\n\tkind: \"run\" | \"compaction\" | \"navigation\";\n\tstartedAt: number;\n}\n\nexport type OperationAdmissionError =\n\t| LaneBusy\n\t| InvalidMessage\n\t| UnknownSkill\n\t| UnknownTemplate\n\t| NothingToCompact\n\t| InvalidNavigation\n\t| UnknownTarget\n\t| Closed;\nexport type OperationAdmissionResult = Result<OperationAdmission, OperationAdmissionError>;\n\nexport interface DriveOptions {\n\toperationId: string;\n\twaitForRetry?: boolean;\n\tpollDeferred?: boolean;\n}\n\nexport interface ModelIdentity {\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport type OperationStatus = \"running\" | \"open\" | \"aborting\";\n\nexport interface CurrentOperationInfo {\n\tid: string;\n\tkind: \"run\" | \"compaction\" | \"navigation\";\n\tstartedAt: number;\n\tstatus: OperationStatus;\n\tcapturedModel?: ModelIdentity;\n}\n\nexport interface LaneExecutionInfo {\n\tlane: string;\n\ttipId: string | null;\n\tconfiguredModel: ModelIdentity;\n\tcurrent: CurrentOperationInfo | null;\n\tlastOperationId: string | null;\n}\n\nexport type DriveOutcome =\n\t| { kind: \"settled\"; outcome: OperationResultRecord }\n\t| { kind: \"waiting\"; operationId: string; reason: \"retry\"; notBefore: number }\n\t| { kind: \"waiting\"; operationId: string; reason: \"deferred\"; deferred: DeferredHandle };\nexport type DriveResult = Result<DriveOutcome, OperationMismatch | Closed>;\n\nexport type AbortRequestResult = Result<\n\t{\n\t\toperationId: string;\n\t\tnewlyRequested: boolean;\n\t\tsteer: AgentMessage[];\n\t\tfollowUp: AgentMessage[];\n\t},\n\tOperationMismatch | Closed\n>;\n\nexport interface WatchHandle<T> {\n\tsnapshot: T;\n\tstart(listener: EventListener): void;\n\tresnapshot(context: Context): Promise<T>;\n\tunsubscribe(): void;\n}\n\nexport interface LaneInfo {\n\tname: string;\n\ttipId: string | null;\n\toperation: CurrentOperationInfo | null;\n}\n\nexport type LaneSnapshotTool =\n\t| {\n\t\t\tstatus: \"running\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t\t\tresult?: AgentToolResult<unknown>;\n\t }\n\t| {\n\t\t\tstatus: \"settled\";\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t\t\tresult: AgentToolResult<unknown>;\n\t\t\tisError: boolean;\n\t };\n\nexport interface OpenOperation {\n\tlane: string;\n\toperationId: string;\n\tkind: \"run\" | \"compaction\" | \"navigation\";\n\tstartedAt: number;\n\taborting?: true;\n}\n\nexport type LaneQueuedItem =\n\t| {\n\t\t\tentryId: string;\n\t\t\tkind: \"steer\" | \"followUp\" | \"nextRun\" | \"write\";\n\t\t\ttype: \"message\";\n\t\t\tmessage: AgentMessage;\n\t }\n\t| { entryId: string; kind: \"write\"; type: \"custom\"; customType: string; data?: JsonValue };\n\nexport interface LaneSnapshot {\n\tlane: string;\n\ttranscript: Entry[];\n\ttipId: string | null;\n\tlastResult?: OperationResultRecord;\n\tconfiguration: LaneConfiguration;\n\tstats: SessionStats;\n\toperation: null | {\n\t\tid: string;\n\t\tkind: \"run\" | \"compaction\" | \"navigation\";\n\t\tstartedAt: number;\n\t\tfromTipId: string | null;\n\t\tstatus: OperationStatus;\n\t\tretry?: { attempt: number; maxAttempts: number; nextAttemptAt: number };\n\t\tdeferred?: { handle: DeferredHandle; poll: number };\n\t\tstreamingMessage?: AssistantMessage;\n\t\trunningTools: LaneSnapshotTool[];\n\t};\n\tqueues: LaneQueuedItem[];\n\tfaulted: boolean;\n}\n\nexport interface SessionSnapshot {\n\tlanes: LaneInfo[];\n\tfaulted: boolean;\n}\n\nexport type HarnessEventPayload =\n\t| { type: \"run_start\"; runId: string; startedAt: number }\n\t| { type: \"run_resume\"; runId: string }\n\t| { type: \"run_suspend\"; runId: string; reason: \"deferred\"; deferred: DeferredHandle; poll: number }\n\t| { type: \"operation_abort\"; operationId: string; steer: AgentMessage[]; followUp: AgentMessage[] }\n\t| ({ type: \"run_end\"; runId: string; fromTipId: string | null; tipId: string | null; endedAt: number } & (\n\t\t\t| { status: \"completed\" | \"aborted\"; error?: never }\n\t\t\t| { status: \"failed\"; error: OperationError }\n\t ))\n\t| { type: \"fault\"; code: string; message: string }\n\t| ({ type: \"handler_error\"; error: string; stack?: string } & (\n\t\t\t| { kind: \"hook\"; hook: string }\n\t\t\t| { kind: \"event\"; event: string }\n\t ))\n\t| { type: \"turn_start\"; runId: string; turnId: string }\n\t| {\n\t\t\ttype: \"turn_end\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\tmessage: AssistantMessage;\n\t\t\ttoolResults: ToolResultMessage[];\n\t }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\trunId: string;\n\t\t\tstep: string;\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\tnotBefore: number;\n\t\t\terrorMessage: string;\n\t }\n\t| { type: \"retry_start\"; runId: string; step: string; attempt: number }\n\t| {\n\t\t\ttype: \"retry_end\";\n\t\t\trunId: string;\n\t\t\tstep: string;\n\t\t\tattempt: number;\n\t\t\tsuccess: boolean;\n\t\t\tfinalError?: string;\n\t }\n\t| { type: \"message_start\"; runId?: string; message: AgentMessage }\n\t| {\n\t\t\ttype: \"message_update\";\n\t\t\trunId: string;\n\t\t\tmessage: AgentMessage;\n\t\t\tevent: AssistantMessageEvent;\n\t\t\tframe?: AssistantMessageFrame;\n\t }\n\t| { type: \"message_end\"; runId?: string; message: AgentMessage; entryId?: string }\n\t| {\n\t\t\ttype: \"tool_start\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t }\n\t| {\n\t\t\ttype: \"tool_update\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tpartialResult: AgentToolResult<unknown>;\n\t }\n\t| {\n\t\t\ttype: \"tool_end\";\n\t\t\trunId: string;\n\t\t\tturnId: string;\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\tresult: AgentToolResult<unknown>;\n\t\t\tisError: boolean;\n\t\t\tterminate: boolean;\n\t }\n\t| { type: \"entry_added\"; entry: Entry }\n\t| { type: \"queue_update\"; queues: LaneQueuedItem[] }\n\t| ({ type: \"value_update\" } & (\n\t\t\t| { value: \"session_name\"; name: string | undefined }\n\t\t\t| { value: \"entry_label\"; targetId: string; label: string | undefined }\n\t ))\n\t| ({ type: \"config_update\" } & (\n\t\t\t| {\n\t\t\t\t\tproperty: \"model\";\n\t\t\t\t\tvalue: { provider: string; modelId: string };\n\t\t\t\t\tprevious: unknown;\n\t\t\t }\n\t\t\t| { property: \"thinkingLevel\"; value: ThinkingLevel; previous: ThinkingLevel }\n\t\t\t| { property: \"activeTools\"; value: string[]; previous: string[] }\n\t\t\t| { property: \"tools\" | \"resources\" }\n\t\t\t| {\n\t\t\t\t\tproperty: \"streamOptions\";\n\t\t\t\t\tvalue: AgentHarnessStreamOptions;\n\t\t\t\t\tprevious: AgentHarnessStreamOptions;\n\t\t\t }\n\t\t\t| { property: \"retryPolicy\"; value: RetryPolicy; previous: RetryPolicy }\n\t\t\t| { property: \"compactionSettings\"; value: CompactionSettings; previous: CompactionSettings }\n\t\t\t| { property: \"steeringMode\"; value: QueueMode; previous: QueueMode }\n\t\t\t| { property: \"followUpMode\"; value: QueueMode; previous: QueueMode }\n\t ))\n\t| {\n\t\t\ttype: \"compaction_start\";\n\t\t\trunId: string;\n\t\t\treason: \"manual\" | \"threshold\" | \"overflow\";\n\t\t\tstartedAt: number;\n\t }\n\t| ({ type: \"compaction_end\"; runId: string; reason: \"manual\" | \"threshold\" | \"overflow\"; endedAt: number } & (\n\t\t\t| { status: \"completed\"; entryId: string; error?: never }\n\t\t\t| { status: \"declined\" | \"aborted\"; entryId?: never; error?: never }\n\t\t\t| { status: \"failed\"; entryId?: never; error: OperationError }\n\t ))\n\t| { type: \"navigation_start\"; runId: string; targetId: string | null; startedAt: number }\n\t| ({ type: \"navigation_end\"; runId: string; fromTipId: string | null; tipId: string | null; endedAt: number } & (\n\t\t\t| { status: \"completed\" | \"declined\" | \"aborted\"; error?: never }\n\t\t\t| { status: \"failed\"; error: OperationError }\n\t ))\n\t| { type: \"lane_created\"; at: string | null }\n\t| { type: \"usage\"; lane: string; row: UsageRow; totals: Usage };\n\nexport type SpecialEventPayload = Extract<\n\tHarnessEventPayload,\n\t{ type: \"fault\" | \"value_update\" | \"usage\" | \"config_update\" | \"handler_error\" }\n>;\nexport type LaneEventPayload = Exclude<HarnessEventPayload, SpecialEventPayload>;\nexport type ConfigEventPayload = Extract<HarnessEventPayload, { type: \"config_update\" }>;\nexport type LaneConfigEventPayload = Extract<\n\tConfigEventPayload,\n\t{ property: \"model\" | \"thinkingLevel\" | \"activeTools\" }\n>;\nexport type GlobalConfigEventPayload = Exclude<ConfigEventPayload, LaneConfigEventPayload>;\nexport type HandlerErrorPayload = Extract<HarnessEventPayload, { type: \"handler_error\" }>;\n\nexport type HarnessEvent =\n\t| (LaneEventPayload & { lane: string; recovery?: true })\n\t| (LaneConfigEventPayload & { lane: string; recovery?: true })\n\t| (Extract<HarnessEventPayload, { type: \"fault\" | \"value_update\" }> & {\n\t\t\tlane?: never;\n\t\t\trecovery?: never;\n\t })\n\t| (Extract<HarnessEventPayload, { type: \"usage\" }> & { recovery?: never })\n\t| (GlobalConfigEventPayload & { lane?: never; recovery?: never })\n\t| (HandlerErrorPayload & ({ lane: string; recovery?: true } | { lane?: never; recovery?: never }));\n\ntype LaneWatchSourceEvent =\n\t| Exclude<\n\t\t\tHarnessEvent,\n\t\t\t| { type: \"handler_error\" | \"turn_start\" | \"turn_end\" | \"value_update\" | \"lane_created\" | \"message_update\" }\n\t\t\t| ({ type: \"config_update\" } & { property: string })\n\t >\n\t| Extract<HarnessEvent, { type: \"config_update\"; property: \"model\" | \"thinkingLevel\" | \"activeTools\" }>\n\t| Omit<Extract<HarnessEvent, { type: \"message_update\" }>, \"event\">;\n\n/** Strict-JSON snapshot representation published to remote transcript consumers. */\nexport type LaneTranscriptSnapshot = JsonRepresentation<LaneSnapshot>;\n/** Reducer-relevant strict-JSON Harness events published to remote transcript consumers. */\nexport type LaneWatchEvent = JsonRepresentation<LaneWatchSourceEvent>;\n\nexport type HarnessEventType = HarnessEvent[\"type\"];\nexport type EventListener<TEvent extends HarnessEvent = HarnessEvent> = (\n\tevent: TEvent,\n\tcontext: Context,\n) => void | Promise<void>;\n\nexport interface Events {\n\ton<TType extends HarnessEventType>(\n\t\ttype: TType,\n\t\tlistener: EventListener<Extract<HarnessEvent, { type: TType }>>,\n\t): () => void;\n}\n\nexport type Resources = AgentHarnessResources<Skill, PromptTemplate>;\n\ntype VoidHookResult = ReturnType<() => void>;\n\nexport interface HookMap {\n\tbefore_run: {\n\t\tevent: { prompt: AgentMessage[]; resources: Resources };\n\t\tresult: { messages?: AgentMessage[] } | undefined;\n\t};\n\tbefore_drive: {\n\t\tevent: { operation: \"run\" | \"compaction\" | \"navigation\" };\n\t\tresult: VoidHookResult;\n\t};\n\tbefore_run_end: {\n\t\tevent: { runId: string; messages: AgentMessage[] };\n\t\tresult: { followUp?: string } | undefined;\n\t};\n\ttransform_context: {\n\t\tevent: { messages: AgentMessage[]; systemPrompt: string };\n\t\tresult: { messages?: AgentMessage[]; systemPrompt?: string } | undefined;\n\t};\n\tbefore_request: {\n\t\tevent: {\n\t\t\tmodel: Model<Api>;\n\t\t\tstep: \"assistant\" | \"deferred\" | \"compaction\" | \"branch_summary\";\n\t\t\tattempt: number;\n\t\t\tstreamOptions: AgentHarnessStreamOptions;\n\t\t};\n\t\tresult: { streamOptions?: AgentHarnessStreamOptionsPatch } | undefined;\n\t};\n\tbefore_payload: {\n\t\tevent: { model: Model<Api>; payload: unknown };\n\t\tresult: { payload: unknown } | undefined;\n\t};\n\tafter_response: {\n\t\tevent: { status?: number; headers?: Record<string, string>; message: SettledAssistantMessage };\n\t\tresult: { message?: SettledAssistantMessage } | undefined;\n\t};\n\tbefore_tool: {\n\t\tevent: { toolCallId: string; toolName: string; args: Record<string, JsonValue> };\n\t\tresult: { args?: Record<string, JsonValue>; block?: { reason: string; terminate?: boolean } } | undefined;\n\t};\n\tafter_tool: {\n\t\tevent: {\n\t\t\ttoolCallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: Record<string, JsonValue>;\n\t\t\tcontent: AgentToolResult<unknown>[\"content\"];\n\t\t\tdetails?: JsonValue;\n\t\t\tisError: boolean;\n\t\t\tusage?: Usage;\n\t\t};\n\t\tresult:\n\t\t\t| {\n\t\t\t\t\tcontent?: AgentToolResult<unknown>[\"content\"];\n\t\t\t\t\tdetails?: JsonValue;\n\t\t\t\t\tisError?: boolean;\n\t\t\t\t\tusage?: Usage;\n\t\t\t\t\tterminate?: boolean;\n\t\t\t }\n\t\t\t| undefined;\n\t};\n\tbefore_compaction: {\n\t\tevent: {\n\t\t\treason: \"manual\" | \"threshold\" | \"overflow\";\n\t\t\tpreparation: CompactionPreparation;\n\t\t\tcustomInstructions?: string;\n\t\t};\n\t\tresult: { decline?: boolean; compaction?: CompactResult } | undefined;\n\t};\n\tbefore_navigation: {\n\t\tevent: { targetId: string; preparation: BranchPreparation; customInstructions?: string };\n\t\tresult: { decline?: boolean; summary?: BranchSummaryResult } | undefined;\n\t};\n}\n\nexport type HookName = keyof HookMap;\nexport type HookInvocation<TName extends HookName> = HookMap[TName][\"event\"] & {\n\tlane: string;\n\trunId: string;\n};\nexport type HookHandler<TName extends HookName> = (\n\tevent: HookInvocation<TName>,\n\tcontext: Context,\n) => Promise<HookMap[TName][\"result\"]> | HookMap[TName][\"result\"];\n\nexport interface Hooks {\n\ton<TName extends HookName>(name: TName, handler: HookHandler<TName>, options?: { id?: string }): () => void;\n}\n\nexport type { EntryProjector } from \"./session/types.ts\";\n\nexport interface AgentHarnessOptions<TContext extends object | undefined = object | undefined> {\n\tsession: Session;\n\tmodels: Models;\n\tmodel: Model<Api>;\n\tthinkingLevel?: ThinkingLevel;\n\tactiveToolNames?: string[];\n\ttools?: AgentHarnessTool<TContext>[];\n\ttoolContext?: TContext | ((context: Context) => TContext | Promise<TContext>);\n\tsystemPrompt?: string | ((toolContext: TContext, context: Context) => string | Promise<string>);\n\tresources?: Resources;\n\tstreamOptions?: AgentHarnessStreamOptions;\n\tretry?: RetryPolicy;\n\tcompaction?: CompactionSettings;\n\tsteeringMode?: QueueMode;\n\tfollowUpMode?: QueueMode;\n\ttoolExecution?: \"sequential\" | \"parallel\";\n\ttoProviderMessages?: (messages: AgentMessage[], context: Context) => Message[] | Promise<Message[]>;\n\tentryProjectors?: Record<string, EntryProjector>;\n}\n\nexport interface AgentLane {\n\treadonly name: string;\n\tgetTipId(context: Context): Promise<string | null>;\n\tfindEntries(query: BranchScan | undefined, context: Context): Promise<Entry[]>;\n\tfindEntry(query: BranchScan | undefined, context: Context): Promise<Entry | undefined>;\n\tappendMessage(message: AgentMessage, context: Context): Promise<string>;\n\tappendCustomEntry(customType: string, data: JsonValue | undefined, context: Context): Promise<string>;\n\tgetResult(operationId: string, context: Context): Promise<OperationResultRecord | undefined>;\n\taccept(request: OperationRequest, context: Context): Promise<OperationAdmissionResult>;\n\tdrive(options: DriveOptions, context: Context): Promise<DriveResult>;\n\trequestAbort(operationId: string, context: Context): Promise<AbortRequestResult>;\n\tinspectExecution(context: Context): Promise<LaneExecutionInfo>;\n\tprompt(text: string, images: ImageContent[] | undefined, context: Context): Promise<RunResult>;\n\tprompt(message: AgentMessage | AgentMessage[], context: Context): Promise<RunResult>;\n\tskill(name: string, additionalInstructions: string | undefined, context: Context): Promise<RunResult>;\n\tpromptFromTemplate(name: string, args: string[] | undefined, context: Context): Promise<RunResult>;\n\tcompact(options: { customInstructions?: string } | undefined, context: Context): Promise<CompactionResult>;\n\tnavigateTree(\n\t\ttargetId: string | null,\n\t\toptions: NavigateOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<NavigationResult>;\n\tresume(context: Context): Promise<ResumeResult>;\n\tabort(context: Context): Promise<AbortResult>;\n\tsteer(message: string | AgentMessage, images: ImageContent[] | undefined, context: Context): Promise<QueueResult>;\n\tfollowUp(message: string | AgentMessage, images: ImageContent[] | undefined, context: Context): Promise<QueueResult>;\n\tnextRun(message: string | AgentMessage, images: ImageContent[] | undefined, context: Context): Promise<QueueResult>;\n\tcancelQueued(entryId: string, context: Context): Promise<CancelQueuedResult>;\n\trecordUsage(\n\t\tusage: Usage,\n\t\toptions: { entryId?: string; details?: JsonValue } | undefined,\n\t\tcontext: Context,\n\t): Promise<RecordUsageResult>;\n\twaitForIdle(context: Context): Promise<void>;\n\trunWhenIdle(callback: (context: Context) => void | Promise<void>, context: Context): Promise<void>;\n\tgetModel(context: Context): Promise<Model<Api> | undefined>;\n\tsetModel(model: ModelIdentity, context: Context): Promise<void>;\n\tgetThinkingLevel(context: Context): Promise<ThinkingLevel>;\n\tsetThinkingLevel(level: ThinkingLevel, context: Context): Promise<void>;\n\tgetActiveTools(context: Context): Promise<string[]>;\n\tsetActiveTools(names: string[], context: Context): Promise<void>;\n\twatch(context: Context): Promise<WatchHandle<LaneSnapshot>>;\n}\n\nexport interface AcquireLaneOptions {\n\tcreateAt?: string | null;\n}\n\nexport interface AgentHarness<TContext extends object | undefined = object | undefined> {\n\tlane(name: string, context: Context): Promise<AgentLane>;\n\tlane(name: string, options: AcquireLaneOptions, context: Context): Promise<AgentLane>;\n\tlanes(context: Context): Promise<LaneInfo[]>;\n\tgetName(context: Context): Promise<string | undefined>;\n\tsetName(name: string | undefined, context: Context): Promise<void>;\n\tgetLabel(targetId: string, context: Context): Promise<string | undefined>;\n\tsetLabel(targetId: string, label: string | undefined, context: Context): Promise<void>;\n\tgetTools(context: Context): Promise<AgentHarnessTool<TContext>[]>;\n\tsetTools(tools: AgentHarnessTool<TContext>[], context: Context): Promise<void>;\n\tgetResources(context: Context): Promise<Resources>;\n\tsetResources(resources: Resources, context: Context): Promise<void>;\n\tgetStreamOptions(context: Context): Promise<AgentHarnessStreamOptions>;\n\tsetStreamOptions(options: AgentHarnessStreamOptions, context: Context): Promise<void>;\n\tgetRetryPolicy(context: Context): Promise<RetryPolicy>;\n\tsetRetryPolicy(policy: RetryPolicy, context: Context): Promise<void>;\n\tgetCompactionSettings(context: Context): Promise<CompactionSettings>;\n\tsetCompactionSettings(settings: CompactionSettings, context: Context): Promise<void>;\n\tgetSteeringMode(context: Context): Promise<QueueMode>;\n\tsetSteeringMode(mode: QueueMode, context: Context): Promise<void>;\n\tgetFollowUpMode(context: Context): Promise<QueueMode>;\n\tsetFollowUpMode(mode: QueueMode, context: Context): Promise<void>;\n\twatchSession(context: Context): Promise<WatchHandle<SessionSnapshot>>;\n\treadonly hooks: Hooks;\n\treadonly events: Events;\n\tclose(context: Context): Promise<void>;\n}\n\nexport interface AgentHarnessConstructor {\n\tcreate<TContext extends object | undefined = object | undefined>(\n\t\toptions: AgentHarnessOptions<TContext>,\n\t\tcontext: Context,\n\t): Promise<{ harness: AgentHarness<TContext>; open: OpenOperation[] }>;\n}\n\n/** Runtime constructor for attaching the durable harness to one open session. */\nexport const AgentHarness = { create: createAgentHarness } satisfies AgentHarnessConstructor;\n"]}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type Api, type Model, type Models, type RetryCallbacks, type RetryPolicy, type Usage } from "@m4ike1/ion-ai";
|
|
2
|
+
import type { AgentMessage } from "../../types.ts";
|
|
3
|
+
import type { Context } from "../context.ts";
|
|
4
|
+
import type { Branch, Entry, Session } from "../session/index.ts";
|
|
5
|
+
import { BranchSummaryError, type Result } from "../types.ts";
|
|
6
|
+
import { type SummaryRequest } from "./compaction.ts";
|
|
7
|
+
import { type FileOperations } from "./utils.ts";
|
|
8
|
+
/** Generated branch summary data ready to be persisted as a branch-summary entry. */
|
|
9
|
+
export interface BranchSummaryResult {
|
|
10
|
+
summary: string;
|
|
11
|
+
usage?: Usage;
|
|
12
|
+
readFiles: string[];
|
|
13
|
+
modifiedFiles: string[];
|
|
14
|
+
}
|
|
15
|
+
/** File-operation details stored on generated branch summary entries. */
|
|
16
|
+
export interface BranchSummaryDetails {
|
|
17
|
+
/** Files read while exploring the summarized branch. */
|
|
18
|
+
readFiles: string[];
|
|
19
|
+
/** Files modified while exploring the summarized branch. */
|
|
20
|
+
modifiedFiles: string[];
|
|
21
|
+
}
|
|
22
|
+
export type { FileOperations } from "./utils.ts";
|
|
23
|
+
/** Prepared branch content for summarization. */
|
|
24
|
+
export interface BranchPreparation {
|
|
25
|
+
/** Messages selected for the branch summary. */
|
|
26
|
+
messages: AgentMessage[];
|
|
27
|
+
/** File operations extracted from the branch. */
|
|
28
|
+
fileOps: FileOperations;
|
|
29
|
+
/** Estimated token count for selected messages. */
|
|
30
|
+
totalTokens: number;
|
|
31
|
+
}
|
|
32
|
+
/** Entries selected for branch summarization. */
|
|
33
|
+
export interface CollectEntriesResult {
|
|
34
|
+
/** Entries to summarize in chronological order. */
|
|
35
|
+
entries: Entry[];
|
|
36
|
+
/** Deepest common ancestor between the previous tip and target entry. */
|
|
37
|
+
commonAncestorId: string | null;
|
|
38
|
+
}
|
|
39
|
+
/** Options for generating a branch summary. */
|
|
40
|
+
export interface GenerateBranchSummaryOptions {
|
|
41
|
+
/** Provider collection the summarization request goes through; owns auth resolution. */
|
|
42
|
+
models: Models;
|
|
43
|
+
/** Model used for summarization. */
|
|
44
|
+
model: Model<Api>;
|
|
45
|
+
/** Optional instructions appended to or replacing the default prompt. */
|
|
46
|
+
customInstructions?: string;
|
|
47
|
+
/** Replace the default prompt with custom instructions instead of appending them. */
|
|
48
|
+
replaceInstructions?: boolean;
|
|
49
|
+
/** Tokens reserved for prompt and model output. Defaults to 16384. */
|
|
50
|
+
reserveTokens?: number;
|
|
51
|
+
/** Optional retry policy for transient summarization errors. */
|
|
52
|
+
retry?: RetryPolicy;
|
|
53
|
+
/** Optional callbacks for retry reporting. */
|
|
54
|
+
callbacks?: RetryCallbacks;
|
|
55
|
+
}
|
|
56
|
+
/** Collect entries that should be summarized before navigating to a different session tree entry. */
|
|
57
|
+
export declare function collectEntriesForBranchSummary(branch: Pick<Branch, "findEntries">, session: Pick<Session, "getEntry">, oldTipId: string | null, targetId: string, context: Context): Promise<CollectEntriesResult>;
|
|
58
|
+
/** Prepare branch entries for summarization within an optional token budget. */
|
|
59
|
+
export declare function prepareBranchEntries(entries: Entry[], tokenBudget?: number): BranchPreparation;
|
|
60
|
+
/** Generate a summary for abandoned branch entries. */
|
|
61
|
+
export declare function generateBranchSummary(entries: Entry[], options: GenerateBranchSummaryOptions, context: Context): Promise<Result<BranchSummaryResult, BranchSummaryError>>;
|
|
62
|
+
export interface PreparedBranchSummaryOptions {
|
|
63
|
+
customInstructions?: string;
|
|
64
|
+
replaceInstructions?: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** Generate a prepared branch summary through a caller-owned one-request boundary. */
|
|
67
|
+
export declare function generateBranchSummaryWithRequest(preparation: BranchPreparation, options: PreparedBranchSummaryOptions, request: SummaryRequest, context: Context): Promise<Result<BranchSummaryResult, BranchSummaryError>>;
|
|
68
|
+
//# sourceMappingURL=branch-summarization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-summarization.d.ts","sourceRoot":"","sources":["../../../src/harness/compaction/branch-summarization.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\tcontentText,\n\ttype Model,\n\ttype Models,\n\ttype RetryCallbacks,\n\ttype RetryPolicy,\n\ttype Usage,\n} from \"@m4ike1/ion-ai\";\n\nimport type { AgentMessage } from \"../../types.ts\";\nimport type { Context } from \"../context.ts\";\nimport { convertToLlm, createBranchSummaryMessage, createCompactionSummaryMessage } from \"../messages.ts\";\nimport type { Branch, Entry, Session } from \"../session/index.ts\";\nimport { BranchSummaryError, err, ok, type Result } from \"../types.ts\";\nimport {\n\tcompleteSimpleWithRetries,\n\tcreateSummaryRequestOptions,\n\testimateTokens,\n\tSUMMARIZATION_SYSTEM_PROMPT,\n\ttype SummaryRequest,\n} from \"./compaction.ts\";\nimport {\n\tcomputeFileLists,\n\tcreateFileOps,\n\textractFileOpsFromMessage,\n\ttype FileOperations,\n\tformatFileOperations,\n\tserializeConversation,\n} from \"./utils.ts\";\n\n/** Generated branch summary data ready to be persisted as a branch-summary entry. */\nexport interface BranchSummaryResult {\n\tsummary: string;\n\tusage?: Usage;\n\treadFiles: string[];\n\tmodifiedFiles: string[];\n}\n\n/** File-operation details stored on generated branch summary entries. */\nexport interface BranchSummaryDetails {\n\t/** Files read while exploring the summarized branch. */\n\treadFiles: string[];\n\t/** Files modified while exploring the summarized branch. */\n\tmodifiedFiles: string[];\n}\n\nexport type { FileOperations } from \"./utils.ts\";\n\n/** Prepared branch content for summarization. */\nexport interface BranchPreparation {\n\t/** Messages selected for the branch summary. */\n\tmessages: AgentMessage[];\n\t/** File operations extracted from the branch. */\n\tfileOps: FileOperations;\n\t/** Estimated token count for selected messages. */\n\ttotalTokens: number;\n}\n\n/** Entries selected for branch summarization. */\nexport interface CollectEntriesResult {\n\t/** Entries to summarize in chronological order. */\n\tentries: Entry[];\n\t/** Deepest common ancestor between the previous tip and target entry. */\n\tcommonAncestorId: string | null;\n}\n\n/** Options for generating a branch summary. */\nexport interface GenerateBranchSummaryOptions {\n\t/** Provider collection the summarization request goes through; owns auth resolution. */\n\tmodels: Models;\n\t/** Model used for summarization. */\n\tmodel: Model<Api>;\n\t/** Optional instructions appended to or replacing the default prompt. */\n\tcustomInstructions?: string;\n\t/** Replace the default prompt with custom instructions instead of appending them. */\n\treplaceInstructions?: boolean;\n\t/** Tokens reserved for prompt and model output. Defaults to 16384. */\n\treserveTokens?: number;\n\t/** Optional retry policy for transient summarization errors. */\n\tretry?: RetryPolicy;\n\t/** Optional callbacks for retry reporting. */\n\tcallbacks?: RetryCallbacks;\n}\n\n/** Collect entries that should be summarized before navigating to a different session tree entry. */\nexport async function collectEntriesForBranchSummary(\n\tbranch: Pick<Branch, \"findEntries\">,\n\tsession: Pick<Session, \"getEntry\">,\n\toldTipId: string | null,\n\ttargetId: string,\n\tcontext: Context,\n): Promise<CollectEntriesResult> {\n\tif (!oldTipId) {\n\t\treturn { entries: [], commonAncestorId: null };\n\t}\n\tconst oldPath = new Set((await branch.findEntries({ start: oldTipId }, context)).map((entry) => entry.id));\n\tconst targetPath = await branch.findEntries({ start: targetId }, context);\n\tlet commonAncestorId: string | null = null;\n\tfor (const entry of targetPath) {\n\t\tif (oldPath.has(entry.id)) {\n\t\t\tcommonAncestorId = entry.id;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst entries: Entry[] = [];\n\tlet current: string | null = oldTipId;\n\n\twhile (current && current !== commonAncestorId) {\n\t\tconst entry = await session.getEntry(current, context);\n\t\tif (!entry) throw new Error(`Corrupt session: entry ${current} not found`);\n\t\tentries.push(entry);\n\t\tcurrent = entry.parentId;\n\t}\n\tentries.reverse();\n\n\treturn { entries, commonAncestorId };\n}\nfunction getMessageFromEntry(entry: Entry): AgentMessage | undefined {\n\tswitch (entry.type) {\n\t\tcase \"message\":\n\t\t\tif (entry.message.role === \"toolResult\") return undefined;\n\t\t\treturn entry.message;\n\n\t\tcase \"branch_summary\":\n\t\t\treturn createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);\n\n\t\tcase \"compaction\":\n\t\t\treturn createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);\n\t\tcase \"custom\":\n\t\t\treturn undefined;\n\t}\n}\n\n/** Prepare branch entries for summarization within an optional token budget. */\nexport function prepareBranchEntries(entries: Entry[], tokenBudget: number = 0): BranchPreparation {\n\tconst messages: AgentMessage[] = [];\n\tconst fileOps = createFileOps();\n\tlet totalTokens = 0;\n\tfor (const entry of entries) {\n\t\tif (\n\t\t\tentry.type !== \"branch_summary\" ||\n\t\t\ttypeof entry.details !== \"object\" ||\n\t\t\tentry.details === null ||\n\t\t\tArray.isArray(entry.details)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(entry.details.readFiles)) {\n\t\t\tfor (const path of entry.details.readFiles) {\n\t\t\t\tif (typeof path === \"string\") fileOps.read.add(path);\n\t\t\t}\n\t\t}\n\t\tif (Array.isArray(entry.details.modifiedFiles)) {\n\t\t\tfor (const path of entry.details.modifiedFiles) {\n\t\t\t\tif (typeof path === \"string\") fileOps.edited.add(path);\n\t\t\t}\n\t\t}\n\t}\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tconst message = getMessageFromEntry(entry);\n\t\tif (!message) continue;\n\t\textractFileOpsFromMessage(message, fileOps);\n\n\t\tconst tokens = estimateTokens(message);\n\t\tif (tokenBudget > 0 && totalTokens + tokens > tokenBudget) {\n\t\t\tif (entry.type === \"compaction\" || entry.type === \"branch_summary\") {\n\t\t\t\tif (totalTokens < tokenBudget * 0.9) {\n\t\t\t\t\tmessages.unshift(message);\n\t\t\t\t\ttotalTokens += tokens;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tmessages.unshift(message);\n\t\ttotalTokens += tokens;\n\t}\n\n\treturn { messages, fileOps, totalTokens };\n}\n\nconst BRANCH_SUMMARY_PREAMBLE = `The user explored a different conversation branch before returning here.\nSummary of that exploration:\n\n`;\n\nconst BRANCH_SUMMARY_PROMPT = `Create a structured summary of this conversation branch for context when returning later.\n\nUse this EXACT format:\n\n## Goal\n[What was the user trying to accomplish in this branch?]\n\n## Constraints & Preferences\n- [Any constraints, preferences, or requirements mentioned]\n- [Or \"(none)\" if none were mentioned]\n\n## Progress\n### Done\n- [x] [Completed tasks/changes]\n\n### In Progress\n- [ ] [Work that was started but not finished]\n\n### Blocked\n- [Issues preventing progress, if any]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale]\n\n## Next Steps\n1. [What should happen next to continue this work]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\n/** Generate a summary for abandoned branch entries. */\nexport function generateBranchSummary(\n\tentries: Entry[],\n\toptions: GenerateBranchSummaryOptions,\n\tcontext: Context,\n): Promise<Result<BranchSummaryResult, BranchSummaryError>> {\n\tconst { models, model, customInstructions, replaceInstructions, reserveTokens = 16384, retry, callbacks } = options;\n\tconst contextWindow = model.contextWindow || 128000;\n\tconst preparation = prepareBranchEntries(entries, contextWindow - reserveTokens);\n\treturn generateBranchSummaryWithRequest(\n\t\tpreparation,\n\t\t{ customInstructions, replaceInstructions },\n\t\t(aiContext, requestOptions, requestContext) =>\n\t\t\tcompleteSimpleWithRetries(models, model, aiContext, requestOptions, retry, callbacks, requestContext),\n\t\tcontext,\n\t);\n}\n\nexport interface PreparedBranchSummaryOptions {\n\tcustomInstructions?: string;\n\treplaceInstructions?: boolean;\n}\n\n/** Generate a prepared branch summary through a caller-owned one-request boundary. */\nexport async function generateBranchSummaryWithRequest(\n\tpreparation: BranchPreparation,\n\toptions: PreparedBranchSummaryOptions,\n\trequest: SummaryRequest,\n\tcontext: Context,\n): Promise<Result<BranchSummaryResult, BranchSummaryError>> {\n\tconst { customInstructions, replaceInstructions } = options;\n\tconst { messages, fileOps } = preparation;\n\tif (messages.length === 0) {\n\t\treturn ok({ summary: \"No content to summarize\", readFiles: [], modifiedFiles: [] });\n\t}\n\tconst llmMessages = convertToLlm(messages);\n\tconst conversationText = serializeConversation(llmMessages);\n\tlet instructions: string;\n\tif (replaceInstructions && customInstructions) {\n\t\tinstructions = customInstructions;\n\t} else if (customInstructions) {\n\t\tinstructions = `${BRANCH_SUMMARY_PROMPT}\\n\\nAdditional focus: ${customInstructions}`;\n\t} else {\n\t\tinstructions = BRANCH_SUMMARY_PROMPT;\n\t}\n\tconst promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n${instructions}`;\n\n\tconst summarizationMessages = [\n\t\t{\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: [{ type: \"text\" as const, text: promptText }],\n\t\t\ttimestamp: Date.now(),\n\t\t},\n\t];\n\tconst response = await request(\n\t\t{ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: summarizationMessages },\n\t\tcreateSummaryRequestOptions({ maxTokens: 2048 }, context),\n\t\tcontext,\n\t);\n\tif (response.stopReason === \"aborted\") {\n\t\treturn err(new BranchSummaryError(\"aborted\", response.errorMessage || \"Branch summary aborted\"));\n\t}\n\tif (response.stopReason === \"error\") {\n\t\treturn err(\n\t\t\tnew BranchSummaryError(\n\t\t\t\t\"summarization_failed\",\n\t\t\t\t`Branch summary failed: ${response.errorMessage || \"Unknown error\"}`,\n\t\t\t),\n\t\t);\n\t}\n\n\tlet summary = contentText(response.content);\n\tsummary = BRANCH_SUMMARY_PREAMBLE + summary;\n\tconst { readFiles, modifiedFiles } = computeFileLists(fileOps);\n\tsummary += formatFileOperations(readFiles, modifiedFiles);\n\n\treturn ok({\n\t\tsummary: summary || \"No summary generated\",\n\t\tusage: response.usage,\n\t\treadFiles,\n\t\tmodifiedFiles,\n\t});\n}\n"]}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { contentText, } from "@m4ike1/ion-ai";
|
|
2
|
+
import { convertToLlm, createBranchSummaryMessage, createCompactionSummaryMessage } from "../messages.js";
|
|
3
|
+
import { BranchSummaryError, err, ok } from "../types.js";
|
|
4
|
+
import { completeSimpleWithRetries, createSummaryRequestOptions, estimateTokens, SUMMARIZATION_SYSTEM_PROMPT, } from "./compaction.js";
|
|
5
|
+
import { computeFileLists, createFileOps, extractFileOpsFromMessage, formatFileOperations, serializeConversation, } from "./utils.js";
|
|
6
|
+
/** Collect entries that should be summarized before navigating to a different session tree entry. */
|
|
7
|
+
export async function collectEntriesForBranchSummary(branch, session, oldTipId, targetId, context) {
|
|
8
|
+
if (!oldTipId) {
|
|
9
|
+
return { entries: [], commonAncestorId: null };
|
|
10
|
+
}
|
|
11
|
+
const oldPath = new Set((await branch.findEntries({ start: oldTipId }, context)).map((entry) => entry.id));
|
|
12
|
+
const targetPath = await branch.findEntries({ start: targetId }, context);
|
|
13
|
+
let commonAncestorId = null;
|
|
14
|
+
for (const entry of targetPath) {
|
|
15
|
+
if (oldPath.has(entry.id)) {
|
|
16
|
+
commonAncestorId = entry.id;
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const entries = [];
|
|
21
|
+
let current = oldTipId;
|
|
22
|
+
while (current && current !== commonAncestorId) {
|
|
23
|
+
const entry = await session.getEntry(current, context);
|
|
24
|
+
if (!entry)
|
|
25
|
+
throw new Error(`Corrupt session: entry ${current} not found`);
|
|
26
|
+
entries.push(entry);
|
|
27
|
+
current = entry.parentId;
|
|
28
|
+
}
|
|
29
|
+
entries.reverse();
|
|
30
|
+
return { entries, commonAncestorId };
|
|
31
|
+
}
|
|
32
|
+
function getMessageFromEntry(entry) {
|
|
33
|
+
switch (entry.type) {
|
|
34
|
+
case "message":
|
|
35
|
+
if (entry.message.role === "toolResult")
|
|
36
|
+
return undefined;
|
|
37
|
+
return entry.message;
|
|
38
|
+
case "branch_summary":
|
|
39
|
+
return createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);
|
|
40
|
+
case "compaction":
|
|
41
|
+
return createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);
|
|
42
|
+
case "custom":
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Prepare branch entries for summarization within an optional token budget. */
|
|
47
|
+
export function prepareBranchEntries(entries, tokenBudget = 0) {
|
|
48
|
+
const messages = [];
|
|
49
|
+
const fileOps = createFileOps();
|
|
50
|
+
let totalTokens = 0;
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
if (entry.type !== "branch_summary" ||
|
|
53
|
+
typeof entry.details !== "object" ||
|
|
54
|
+
entry.details === null ||
|
|
55
|
+
Array.isArray(entry.details)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(entry.details.readFiles)) {
|
|
59
|
+
for (const path of entry.details.readFiles) {
|
|
60
|
+
if (typeof path === "string")
|
|
61
|
+
fileOps.read.add(path);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(entry.details.modifiedFiles)) {
|
|
65
|
+
for (const path of entry.details.modifiedFiles) {
|
|
66
|
+
if (typeof path === "string")
|
|
67
|
+
fileOps.edited.add(path);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
72
|
+
const entry = entries[i];
|
|
73
|
+
const message = getMessageFromEntry(entry);
|
|
74
|
+
if (!message)
|
|
75
|
+
continue;
|
|
76
|
+
extractFileOpsFromMessage(message, fileOps);
|
|
77
|
+
const tokens = estimateTokens(message);
|
|
78
|
+
if (tokenBudget > 0 && totalTokens + tokens > tokenBudget) {
|
|
79
|
+
if (entry.type === "compaction" || entry.type === "branch_summary") {
|
|
80
|
+
if (totalTokens < tokenBudget * 0.9) {
|
|
81
|
+
messages.unshift(message);
|
|
82
|
+
totalTokens += tokens;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
messages.unshift(message);
|
|
88
|
+
totalTokens += tokens;
|
|
89
|
+
}
|
|
90
|
+
return { messages, fileOps, totalTokens };
|
|
91
|
+
}
|
|
92
|
+
const BRANCH_SUMMARY_PREAMBLE = `The user explored a different conversation branch before returning here.
|
|
93
|
+
Summary of that exploration:
|
|
94
|
+
|
|
95
|
+
`;
|
|
96
|
+
const BRANCH_SUMMARY_PROMPT = `Create a structured summary of this conversation branch for context when returning later.
|
|
97
|
+
|
|
98
|
+
Use this EXACT format:
|
|
99
|
+
|
|
100
|
+
## Goal
|
|
101
|
+
[What was the user trying to accomplish in this branch?]
|
|
102
|
+
|
|
103
|
+
## Constraints & Preferences
|
|
104
|
+
- [Any constraints, preferences, or requirements mentioned]
|
|
105
|
+
- [Or "(none)" if none were mentioned]
|
|
106
|
+
|
|
107
|
+
## Progress
|
|
108
|
+
### Done
|
|
109
|
+
- [x] [Completed tasks/changes]
|
|
110
|
+
|
|
111
|
+
### In Progress
|
|
112
|
+
- [ ] [Work that was started but not finished]
|
|
113
|
+
|
|
114
|
+
### Blocked
|
|
115
|
+
- [Issues preventing progress, if any]
|
|
116
|
+
|
|
117
|
+
## Key Decisions
|
|
118
|
+
- **[Decision]**: [Brief rationale]
|
|
119
|
+
|
|
120
|
+
## Next Steps
|
|
121
|
+
1. [What should happen next to continue this work]
|
|
122
|
+
|
|
123
|
+
Keep each section concise. Preserve exact file paths, function names, and error messages.`;
|
|
124
|
+
/** Generate a summary for abandoned branch entries. */
|
|
125
|
+
export function generateBranchSummary(entries, options, context) {
|
|
126
|
+
const { models, model, customInstructions, replaceInstructions, reserveTokens = 16384, retry, callbacks } = options;
|
|
127
|
+
const contextWindow = model.contextWindow || 128000;
|
|
128
|
+
const preparation = prepareBranchEntries(entries, contextWindow - reserveTokens);
|
|
129
|
+
return generateBranchSummaryWithRequest(preparation, { customInstructions, replaceInstructions }, (aiContext, requestOptions, requestContext) => completeSimpleWithRetries(models, model, aiContext, requestOptions, retry, callbacks, requestContext), context);
|
|
130
|
+
}
|
|
131
|
+
/** Generate a prepared branch summary through a caller-owned one-request boundary. */
|
|
132
|
+
export async function generateBranchSummaryWithRequest(preparation, options, request, context) {
|
|
133
|
+
const { customInstructions, replaceInstructions } = options;
|
|
134
|
+
const { messages, fileOps } = preparation;
|
|
135
|
+
if (messages.length === 0) {
|
|
136
|
+
return ok({ summary: "No content to summarize", readFiles: [], modifiedFiles: [] });
|
|
137
|
+
}
|
|
138
|
+
const llmMessages = convertToLlm(messages);
|
|
139
|
+
const conversationText = serializeConversation(llmMessages);
|
|
140
|
+
let instructions;
|
|
141
|
+
if (replaceInstructions && customInstructions) {
|
|
142
|
+
instructions = customInstructions;
|
|
143
|
+
}
|
|
144
|
+
else if (customInstructions) {
|
|
145
|
+
instructions = `${BRANCH_SUMMARY_PROMPT}\n\nAdditional focus: ${customInstructions}`;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
instructions = BRANCH_SUMMARY_PROMPT;
|
|
149
|
+
}
|
|
150
|
+
const promptText = `<conversation>\n${conversationText}\n</conversation>\n\n${instructions}`;
|
|
151
|
+
const summarizationMessages = [
|
|
152
|
+
{
|
|
153
|
+
role: "user",
|
|
154
|
+
content: [{ type: "text", text: promptText }],
|
|
155
|
+
timestamp: Date.now(),
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
const response = await request({ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: summarizationMessages }, createSummaryRequestOptions({ maxTokens: 2048 }, context), context);
|
|
159
|
+
if (response.stopReason === "aborted") {
|
|
160
|
+
return err(new BranchSummaryError("aborted", response.errorMessage || "Branch summary aborted"));
|
|
161
|
+
}
|
|
162
|
+
if (response.stopReason === "error") {
|
|
163
|
+
return err(new BranchSummaryError("summarization_failed", `Branch summary failed: ${response.errorMessage || "Unknown error"}`));
|
|
164
|
+
}
|
|
165
|
+
let summary = contentText(response.content);
|
|
166
|
+
summary = BRANCH_SUMMARY_PREAMBLE + summary;
|
|
167
|
+
const { readFiles, modifiedFiles } = computeFileLists(fileOps);
|
|
168
|
+
summary += formatFileOperations(readFiles, modifiedFiles);
|
|
169
|
+
return ok({
|
|
170
|
+
summary: summary || "No summary generated",
|
|
171
|
+
usage: response.usage,
|
|
172
|
+
readFiles,
|
|
173
|
+
modifiedFiles,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=branch-summarization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-summarization.js","sourceRoot":"","sources":["../../../src/harness/compaction/branch-summarization.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\tcontentText,\n\ttype Model,\n\ttype Models,\n\ttype RetryCallbacks,\n\ttype RetryPolicy,\n\ttype Usage,\n} from \"@m4ike1/ion-ai\";\n\nimport type { AgentMessage } from \"../../types.ts\";\nimport type { Context } from \"../context.ts\";\nimport { convertToLlm, createBranchSummaryMessage, createCompactionSummaryMessage } from \"../messages.ts\";\nimport type { Branch, Entry, Session } from \"../session/index.ts\";\nimport { BranchSummaryError, err, ok, type Result } from \"../types.ts\";\nimport {\n\tcompleteSimpleWithRetries,\n\tcreateSummaryRequestOptions,\n\testimateTokens,\n\tSUMMARIZATION_SYSTEM_PROMPT,\n\ttype SummaryRequest,\n} from \"./compaction.ts\";\nimport {\n\tcomputeFileLists,\n\tcreateFileOps,\n\textractFileOpsFromMessage,\n\ttype FileOperations,\n\tformatFileOperations,\n\tserializeConversation,\n} from \"./utils.ts\";\n\n/** Generated branch summary data ready to be persisted as a branch-summary entry. */\nexport interface BranchSummaryResult {\n\tsummary: string;\n\tusage?: Usage;\n\treadFiles: string[];\n\tmodifiedFiles: string[];\n}\n\n/** File-operation details stored on generated branch summary entries. */\nexport interface BranchSummaryDetails {\n\t/** Files read while exploring the summarized branch. */\n\treadFiles: string[];\n\t/** Files modified while exploring the summarized branch. */\n\tmodifiedFiles: string[];\n}\n\nexport type { FileOperations } from \"./utils.ts\";\n\n/** Prepared branch content for summarization. */\nexport interface BranchPreparation {\n\t/** Messages selected for the branch summary. */\n\tmessages: AgentMessage[];\n\t/** File operations extracted from the branch. */\n\tfileOps: FileOperations;\n\t/** Estimated token count for selected messages. */\n\ttotalTokens: number;\n}\n\n/** Entries selected for branch summarization. */\nexport interface CollectEntriesResult {\n\t/** Entries to summarize in chronological order. */\n\tentries: Entry[];\n\t/** Deepest common ancestor between the previous tip and target entry. */\n\tcommonAncestorId: string | null;\n}\n\n/** Options for generating a branch summary. */\nexport interface GenerateBranchSummaryOptions {\n\t/** Provider collection the summarization request goes through; owns auth resolution. */\n\tmodels: Models;\n\t/** Model used for summarization. */\n\tmodel: Model<Api>;\n\t/** Optional instructions appended to or replacing the default prompt. */\n\tcustomInstructions?: string;\n\t/** Replace the default prompt with custom instructions instead of appending them. */\n\treplaceInstructions?: boolean;\n\t/** Tokens reserved for prompt and model output. Defaults to 16384. */\n\treserveTokens?: number;\n\t/** Optional retry policy for transient summarization errors. */\n\tretry?: RetryPolicy;\n\t/** Optional callbacks for retry reporting. */\n\tcallbacks?: RetryCallbacks;\n}\n\n/** Collect entries that should be summarized before navigating to a different session tree entry. */\nexport async function collectEntriesForBranchSummary(\n\tbranch: Pick<Branch, \"findEntries\">,\n\tsession: Pick<Session, \"getEntry\">,\n\toldTipId: string | null,\n\ttargetId: string,\n\tcontext: Context,\n): Promise<CollectEntriesResult> {\n\tif (!oldTipId) {\n\t\treturn { entries: [], commonAncestorId: null };\n\t}\n\tconst oldPath = new Set((await branch.findEntries({ start: oldTipId }, context)).map((entry) => entry.id));\n\tconst targetPath = await branch.findEntries({ start: targetId }, context);\n\tlet commonAncestorId: string | null = null;\n\tfor (const entry of targetPath) {\n\t\tif (oldPath.has(entry.id)) {\n\t\t\tcommonAncestorId = entry.id;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst entries: Entry[] = [];\n\tlet current: string | null = oldTipId;\n\n\twhile (current && current !== commonAncestorId) {\n\t\tconst entry = await session.getEntry(current, context);\n\t\tif (!entry) throw new Error(`Corrupt session: entry ${current} not found`);\n\t\tentries.push(entry);\n\t\tcurrent = entry.parentId;\n\t}\n\tentries.reverse();\n\n\treturn { entries, commonAncestorId };\n}\nfunction getMessageFromEntry(entry: Entry): AgentMessage | undefined {\n\tswitch (entry.type) {\n\t\tcase \"message\":\n\t\t\tif (entry.message.role === \"toolResult\") return undefined;\n\t\t\treturn entry.message;\n\n\t\tcase \"branch_summary\":\n\t\t\treturn createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp);\n\n\t\tcase \"compaction\":\n\t\t\treturn createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp);\n\t\tcase \"custom\":\n\t\t\treturn undefined;\n\t}\n}\n\n/** Prepare branch entries for summarization within an optional token budget. */\nexport function prepareBranchEntries(entries: Entry[], tokenBudget: number = 0): BranchPreparation {\n\tconst messages: AgentMessage[] = [];\n\tconst fileOps = createFileOps();\n\tlet totalTokens = 0;\n\tfor (const entry of entries) {\n\t\tif (\n\t\t\tentry.type !== \"branch_summary\" ||\n\t\t\ttypeof entry.details !== \"object\" ||\n\t\t\tentry.details === null ||\n\t\t\tArray.isArray(entry.details)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(entry.details.readFiles)) {\n\t\t\tfor (const path of entry.details.readFiles) {\n\t\t\t\tif (typeof path === \"string\") fileOps.read.add(path);\n\t\t\t}\n\t\t}\n\t\tif (Array.isArray(entry.details.modifiedFiles)) {\n\t\t\tfor (const path of entry.details.modifiedFiles) {\n\t\t\t\tif (typeof path === \"string\") fileOps.edited.add(path);\n\t\t\t}\n\t\t}\n\t}\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tconst message = getMessageFromEntry(entry);\n\t\tif (!message) continue;\n\t\textractFileOpsFromMessage(message, fileOps);\n\n\t\tconst tokens = estimateTokens(message);\n\t\tif (tokenBudget > 0 && totalTokens + tokens > tokenBudget) {\n\t\t\tif (entry.type === \"compaction\" || entry.type === \"branch_summary\") {\n\t\t\t\tif (totalTokens < tokenBudget * 0.9) {\n\t\t\t\t\tmessages.unshift(message);\n\t\t\t\t\ttotalTokens += tokens;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tmessages.unshift(message);\n\t\ttotalTokens += tokens;\n\t}\n\n\treturn { messages, fileOps, totalTokens };\n}\n\nconst BRANCH_SUMMARY_PREAMBLE = `The user explored a different conversation branch before returning here.\nSummary of that exploration:\n\n`;\n\nconst BRANCH_SUMMARY_PROMPT = `Create a structured summary of this conversation branch for context when returning later.\n\nUse this EXACT format:\n\n## Goal\n[What was the user trying to accomplish in this branch?]\n\n## Constraints & Preferences\n- [Any constraints, preferences, or requirements mentioned]\n- [Or \"(none)\" if none were mentioned]\n\n## Progress\n### Done\n- [x] [Completed tasks/changes]\n\n### In Progress\n- [ ] [Work that was started but not finished]\n\n### Blocked\n- [Issues preventing progress, if any]\n\n## Key Decisions\n- **[Decision]**: [Brief rationale]\n\n## Next Steps\n1. [What should happen next to continue this work]\n\nKeep each section concise. Preserve exact file paths, function names, and error messages.`;\n\n/** Generate a summary for abandoned branch entries. */\nexport function generateBranchSummary(\n\tentries: Entry[],\n\toptions: GenerateBranchSummaryOptions,\n\tcontext: Context,\n): Promise<Result<BranchSummaryResult, BranchSummaryError>> {\n\tconst { models, model, customInstructions, replaceInstructions, reserveTokens = 16384, retry, callbacks } = options;\n\tconst contextWindow = model.contextWindow || 128000;\n\tconst preparation = prepareBranchEntries(entries, contextWindow - reserveTokens);\n\treturn generateBranchSummaryWithRequest(\n\t\tpreparation,\n\t\t{ customInstructions, replaceInstructions },\n\t\t(aiContext, requestOptions, requestContext) =>\n\t\t\tcompleteSimpleWithRetries(models, model, aiContext, requestOptions, retry, callbacks, requestContext),\n\t\tcontext,\n\t);\n}\n\nexport interface PreparedBranchSummaryOptions {\n\tcustomInstructions?: string;\n\treplaceInstructions?: boolean;\n}\n\n/** Generate a prepared branch summary through a caller-owned one-request boundary. */\nexport async function generateBranchSummaryWithRequest(\n\tpreparation: BranchPreparation,\n\toptions: PreparedBranchSummaryOptions,\n\trequest: SummaryRequest,\n\tcontext: Context,\n): Promise<Result<BranchSummaryResult, BranchSummaryError>> {\n\tconst { customInstructions, replaceInstructions } = options;\n\tconst { messages, fileOps } = preparation;\n\tif (messages.length === 0) {\n\t\treturn ok({ summary: \"No content to summarize\", readFiles: [], modifiedFiles: [] });\n\t}\n\tconst llmMessages = convertToLlm(messages);\n\tconst conversationText = serializeConversation(llmMessages);\n\tlet instructions: string;\n\tif (replaceInstructions && customInstructions) {\n\t\tinstructions = customInstructions;\n\t} else if (customInstructions) {\n\t\tinstructions = `${BRANCH_SUMMARY_PROMPT}\\n\\nAdditional focus: ${customInstructions}`;\n\t} else {\n\t\tinstructions = BRANCH_SUMMARY_PROMPT;\n\t}\n\tconst promptText = `<conversation>\\n${conversationText}\\n</conversation>\\n\\n${instructions}`;\n\n\tconst summarizationMessages = [\n\t\t{\n\t\t\trole: \"user\" as const,\n\t\t\tcontent: [{ type: \"text\" as const, text: promptText }],\n\t\t\ttimestamp: Date.now(),\n\t\t},\n\t];\n\tconst response = await request(\n\t\t{ systemPrompt: SUMMARIZATION_SYSTEM_PROMPT, messages: summarizationMessages },\n\t\tcreateSummaryRequestOptions({ maxTokens: 2048 }, context),\n\t\tcontext,\n\t);\n\tif (response.stopReason === \"aborted\") {\n\t\treturn err(new BranchSummaryError(\"aborted\", response.errorMessage || \"Branch summary aborted\"));\n\t}\n\tif (response.stopReason === \"error\") {\n\t\treturn err(\n\t\t\tnew BranchSummaryError(\n\t\t\t\t\"summarization_failed\",\n\t\t\t\t`Branch summary failed: ${response.errorMessage || \"Unknown error\"}`,\n\t\t\t),\n\t\t);\n\t}\n\n\tlet summary = contentText(response.content);\n\tsummary = BRANCH_SUMMARY_PREAMBLE + summary;\n\tconst { readFiles, modifiedFiles } = computeFileLists(fileOps);\n\tsummary += formatFileOperations(readFiles, modifiedFiles);\n\n\treturn ok({\n\t\tsummary: summary || \"No summary generated\",\n\t\tusage: response.usage,\n\t\treadFiles,\n\t\tmodifiedFiles,\n\t});\n}\n"]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { type Context as AiContext, type Api, type AssistantMessage, type Model, type Models, type RetryCallbacks, type RetryPolicy, type SimpleStreamOptions, type Usage } from "@m4ike1/ion-ai";
|
|
2
|
+
import type { AgentMessage, ThinkingLevel } from "../../types.ts";
|
|
3
|
+
import { type Context } from "../context.ts";
|
|
4
|
+
import type { Entry, JsonValue } from "../session/types.ts";
|
|
5
|
+
import { CompactionError, type Result } from "../types.ts";
|
|
6
|
+
import { type FileOperations } from "./utils.ts";
|
|
7
|
+
/** File-operation details stored on generated compaction entries. */
|
|
8
|
+
export interface CompactionDetails extends Record<string, JsonValue> {
|
|
9
|
+
/** Files read in the compacted history. */
|
|
10
|
+
readFiles: string[];
|
|
11
|
+
/** Files modified in the compacted history. */
|
|
12
|
+
modifiedFiles: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Generated compaction data ready to be persisted as a compaction entry. */
|
|
15
|
+
export interface CompactResult<T = JsonValue> {
|
|
16
|
+
/** Summary text that replaces compacted history in future context. */
|
|
17
|
+
summary: string;
|
|
18
|
+
/** Estimated context tokens before compaction. */
|
|
19
|
+
tokensBefore: number;
|
|
20
|
+
/** Usage from the LLM call(s) that generated this summary, if available. */
|
|
21
|
+
usage?: Usage;
|
|
22
|
+
/** Retained recent messages stored directly on the compaction entry. */
|
|
23
|
+
retainedTail: AgentMessage[];
|
|
24
|
+
/** Optional implementation-specific details stored with the compaction entry. */
|
|
25
|
+
details?: T;
|
|
26
|
+
}
|
|
27
|
+
export type SummaryRequest = (aiContext: AiContext, options: SimpleStreamOptions, context: Context) => Promise<AssistantMessage>;
|
|
28
|
+
export declare function createSummaryRequestOptions(options: SimpleStreamOptions, context: Context): SimpleStreamOptions;
|
|
29
|
+
export declare function completeSimpleWithRetries(models: Models, model: Model<Api>, aiContext: AiContext, options: SimpleStreamOptions, retry: RetryPolicy | undefined, callbacks: RetryCallbacks | undefined, context: Context): Promise<AssistantMessage>;
|
|
30
|
+
/** Compaction thresholds and retention settings. */
|
|
31
|
+
export interface CompactionSettings {
|
|
32
|
+
/** Enable automatic compaction decisions. */
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
/** Tokens reserved for summary prompt and output. */
|
|
35
|
+
reserveTokens: number;
|
|
36
|
+
/** Approximate recent-context tokens to keep after compaction. */
|
|
37
|
+
keepRecentTokens: number;
|
|
38
|
+
}
|
|
39
|
+
/** Default compaction settings used by the harness. */
|
|
40
|
+
export declare const DEFAULT_COMPACTION_SETTINGS: CompactionSettings;
|
|
41
|
+
/** Calculate total context tokens from provider usage. */
|
|
42
|
+
export declare function calculateContextTokens(usage: Usage): number;
|
|
43
|
+
/** Return usage from the last valid assistant message in session entries. */
|
|
44
|
+
export declare function getLastAssistantUsage(entries: Entry[]): Usage | undefined;
|
|
45
|
+
/** Estimated context-token usage for a message list. */
|
|
46
|
+
export interface ContextUsageEstimate {
|
|
47
|
+
/** Estimated total context tokens. */
|
|
48
|
+
tokens: number;
|
|
49
|
+
/** Tokens reported by the most recent assistant usage block. */
|
|
50
|
+
usageTokens: number;
|
|
51
|
+
/** Estimated tokens after the most recent assistant usage block. */
|
|
52
|
+
trailingTokens: number;
|
|
53
|
+
/** Index of the message that provided usage, or null when none exists. */
|
|
54
|
+
lastUsageIndex: number | null;
|
|
55
|
+
}
|
|
56
|
+
/** Estimate context tokens for messages using provider usage when available. */
|
|
57
|
+
export declare function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate;
|
|
58
|
+
/** Return whether context usage exceeds the configured compaction threshold. */
|
|
59
|
+
export declare function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean;
|
|
60
|
+
/** Estimate token count for one message using a conservative character heuristic. */
|
|
61
|
+
export declare function estimateTokens(message: AgentMessage): number;
|
|
62
|
+
/** Find the user-visible message that starts the turn containing an entry. */
|
|
63
|
+
export declare function findTurnStartIndex(entries: Entry[], entryIndex: number, startIndex: number): number;
|
|
64
|
+
/** Cut point selected for compaction. */
|
|
65
|
+
export interface CutPointResult {
|
|
66
|
+
/** Index of the first entry retained after compaction. */
|
|
67
|
+
firstKeptEntryIndex: number;
|
|
68
|
+
/** Index of the turn-start entry when the cut splits a turn, otherwise -1. */
|
|
69
|
+
turnStartIndex: number;
|
|
70
|
+
/** Whether the selected cut point splits an in-progress turn. */
|
|
71
|
+
isSplitTurn: boolean;
|
|
72
|
+
}
|
|
73
|
+
/** Find the compaction cut point that keeps approximately the requested recent-token budget. */
|
|
74
|
+
export declare function findCutPoint(entries: Entry[], startIndex: number, endIndex: number, keepRecentTokens: number): CutPointResult;
|
|
75
|
+
export declare const SUMMARIZATION_SYSTEM_PROMPT = "You are a context summarization assistant. Your task is to read a conversation between a user and an AI assistant, then produce a structured summary following the exact format specified.\n\nDo NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.";
|
|
76
|
+
/** Generate or update a conversation summary for compaction. */
|
|
77
|
+
export declare function generateSummary(currentMessages: AgentMessage[], models: Models, model: Model<Api>, reserveTokens: number, customInstructions: string | undefined, previousSummary: string | undefined, thinkingLevel: ThinkingLevel | undefined, retry: RetryPolicy | undefined, callbacks: RetryCallbacks | undefined, context: Context): Promise<Result<string, CompactionError>>;
|
|
78
|
+
/** Generate or update a conversation summary and return its provider usage. */
|
|
79
|
+
export declare function generateSummaryWithUsage(currentMessages: AgentMessage[], models: Models, model: Model<Api>, reserveTokens: number, customInstructions: string | undefined, previousSummary: string | undefined, thinkingLevel: ThinkingLevel | undefined, retry: RetryPolicy | undefined, callbacks: RetryCallbacks | undefined, context: Context): Promise<Result<{
|
|
80
|
+
text: string;
|
|
81
|
+
usage: Usage;
|
|
82
|
+
}, CompactionError>>;
|
|
83
|
+
export interface SummaryGenerationOptions {
|
|
84
|
+
model: Model<Api>;
|
|
85
|
+
reserveTokens: number;
|
|
86
|
+
customInstructions?: string;
|
|
87
|
+
previousSummary?: string;
|
|
88
|
+
thinkingLevel?: ThinkingLevel;
|
|
89
|
+
}
|
|
90
|
+
/** Generate one summary through a caller-owned one-request boundary. */
|
|
91
|
+
export declare function generateSummaryWithRequest(currentMessages: AgentMessage[], options: SummaryGenerationOptions, request: SummaryRequest, context: Context): Promise<Result<{
|
|
92
|
+
text: string;
|
|
93
|
+
usage: Usage;
|
|
94
|
+
}, CompactionError>>;
|
|
95
|
+
/** Prepared inputs for a compaction run. */
|
|
96
|
+
export interface CompactionPreparation {
|
|
97
|
+
/** Messages summarized into the history summary. */
|
|
98
|
+
messagesToSummarize: AgentMessage[];
|
|
99
|
+
/** Prefix messages summarized separately when compaction splits a turn. */
|
|
100
|
+
turnPrefixMessages: AgentMessage[];
|
|
101
|
+
/** Recent messages retained after compaction and stored on the compaction entry. */
|
|
102
|
+
retainedTail: AgentMessage[];
|
|
103
|
+
/** Whether compaction splits a turn. */
|
|
104
|
+
isSplitTurn: boolean;
|
|
105
|
+
/** Estimated context tokens before compaction. */
|
|
106
|
+
tokensBefore: number;
|
|
107
|
+
/** Previous compaction summary used for iterative updates. */
|
|
108
|
+
previousSummary?: string;
|
|
109
|
+
/** File operations extracted from summarized history. */
|
|
110
|
+
fileOps: FileOperations;
|
|
111
|
+
/** Settings used to prepare compaction. */
|
|
112
|
+
settings: CompactionSettings;
|
|
113
|
+
}
|
|
114
|
+
/** Prepare session entries for compaction, or return undefined when compaction is not applicable. */
|
|
115
|
+
export declare function prepareCompaction(pathEntries: Entry[], settings: CompactionSettings): Result<CompactionPreparation | undefined, CompactionError>;
|
|
116
|
+
export { serializeConversation } from "./utils.ts";
|
|
117
|
+
/** Generate compaction summary data from prepared session history. */
|
|
118
|
+
export declare function compact(preparation: CompactionPreparation, models: Models, model: Model<Api>, customInstructions: string | undefined, thinkingLevel: ThinkingLevel | undefined, retry: RetryPolicy | undefined, callbacks: RetryCallbacks | undefined, context: Context): Promise<Result<CompactResult, CompactionError>>;
|
|
119
|
+
export interface CompactGenerationOptions {
|
|
120
|
+
model: Model<Api>;
|
|
121
|
+
customInstructions?: string;
|
|
122
|
+
thinkingLevel?: ThinkingLevel;
|
|
123
|
+
}
|
|
124
|
+
/** Generate compaction data through a caller-owned boundary for each provider request. */
|
|
125
|
+
export declare function compactWithRequest(preparation: CompactionPreparation, options: CompactGenerationOptions, request: SummaryRequest, context: Context): Promise<Result<CompactResult, CompactionError>>;
|
|
126
|
+
//# sourceMappingURL=compaction.d.ts.map
|