@namzu/sdk 38.2.1 → 40.0.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/CHANGELOG.md +851 -0
- package/dist/advisory/executor.d.ts +10 -1
- package/dist/advisory/executor.d.ts.map +1 -1
- package/dist/advisory/executor.js +5 -26
- package/dist/advisory/executor.js.map +1 -1
- package/dist/advisory/history.d.ts +9 -0
- package/dist/advisory/history.d.ts.map +1 -0
- package/dist/advisory/history.js +120 -0
- package/dist/advisory/history.js.map +1 -0
- package/dist/advisory/index.d.ts +1 -1
- package/dist/advisory/index.d.ts.map +1 -1
- package/dist/advisory/index.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +3 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/runAgent.d.ts +10 -0
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +3 -0
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/compaction/manual.d.ts +6 -0
- package/dist/compaction/manual.d.ts.map +1 -1
- package/dist/compaction/manual.js +21 -2
- package/dist/compaction/manual.js.map +1 -1
- package/dist/compaction/summary.d.ts.map +1 -1
- package/dist/compaction/summary.js +4 -1
- package/dist/compaction/summary.js.map +1 -1
- package/dist/config/runtime.js +2 -2
- package/dist/config/runtime.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +20 -6
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/contracts/schemas.js +1 -1
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/eval/harness-protection.d.ts +18 -0
- package/dist/eval/harness-protection.d.ts.map +1 -0
- package/dist/eval/harness-protection.js +58 -0
- package/dist/eval/harness-protection.js.map +1 -0
- package/dist/eval/harness-verification.d.ts +6 -1
- package/dist/eval/harness-verification.d.ts.map +1 -1
- package/dist/eval/harness-verification.js +19 -2
- package/dist/eval/harness-verification.js.map +1 -1
- package/dist/eval/index.d.ts +1 -0
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/index.js.map +1 -1
- package/dist/manager/resident/activity.d.ts +50 -0
- package/dist/manager/resident/activity.d.ts.map +1 -0
- package/dist/manager/resident/activity.js +125 -0
- package/dist/manager/resident/activity.js.map +1 -0
- package/dist/manager/resident/agenda.d.ts +13 -1
- package/dist/manager/resident/agenda.d.ts.map +1 -1
- package/dist/manager/resident/agenda.js +40 -5
- package/dist/manager/resident/agenda.js.map +1 -1
- package/dist/manager/resident/consumption.d.ts +104 -0
- package/dist/manager/resident/consumption.d.ts.map +1 -0
- package/dist/manager/resident/consumption.js +233 -0
- package/dist/manager/resident/consumption.js.map +1 -0
- package/dist/manager/resident/evidence-recall.d.ts +24 -0
- package/dist/manager/resident/evidence-recall.d.ts.map +1 -0
- package/dist/manager/resident/evidence-recall.js +295 -0
- package/dist/manager/resident/evidence-recall.js.map +1 -0
- package/dist/manager/resident/history-disk.d.ts +10 -0
- package/dist/manager/resident/history-disk.d.ts.map +1 -0
- package/dist/manager/resident/history-disk.js +50 -0
- package/dist/manager/resident/history-disk.js.map +1 -0
- package/dist/manager/resident/history.d.ts +79 -0
- package/dist/manager/resident/history.d.ts.map +1 -0
- package/dist/manager/resident/history.js +203 -0
- package/dist/manager/resident/history.js.map +1 -0
- package/dist/manager/resident/initiative.d.ts.map +1 -1
- package/dist/manager/resident/initiative.js +11 -3
- package/dist/manager/resident/initiative.js.map +1 -1
- package/dist/manager/resident/learning-cycle.d.ts +131 -0
- package/dist/manager/resident/learning-cycle.d.ts.map +1 -0
- package/dist/manager/resident/learning-cycle.js +306 -0
- package/dist/manager/resident/learning-cycle.js.map +1 -0
- package/dist/manager/resident/learning-observation.d.ts +80 -0
- package/dist/manager/resident/learning-observation.d.ts.map +1 -0
- package/dist/manager/resident/learning-observation.js +22 -0
- package/dist/manager/resident/learning-observation.js.map +1 -0
- package/dist/manager/resident/learning-store.d.ts +106 -0
- package/dist/manager/resident/learning-store.d.ts.map +1 -0
- package/dist/manager/resident/learning-store.js +598 -0
- package/dist/manager/resident/learning-store.js.map +1 -0
- package/dist/manager/resident/learning.d.ts +246 -3
- package/dist/manager/resident/learning.d.ts.map +1 -1
- package/dist/manager/resident/learning.js +96 -6
- package/dist/manager/resident/learning.js.map +1 -1
- package/dist/manager/resident/outbox.d.ts +4 -4
- package/dist/manager/resident/store.d.ts +37 -4
- package/dist/manager/resident/store.d.ts.map +1 -1
- package/dist/manager/resident/store.js +27 -3
- package/dist/manager/resident/store.js.map +1 -1
- package/dist/manager/resident/tool-evidence.d.ts +71 -0
- package/dist/manager/resident/tool-evidence.d.ts.map +1 -0
- package/dist/manager/resident/tool-evidence.js +285 -0
- package/dist/manager/resident/tool-evidence.js.map +1 -0
- package/dist/manager/run/persistence.d.ts +8 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +18 -0
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/plugin/loader.d.ts.map +1 -1
- package/dist/plugin/loader.js +5 -3
- package/dist/plugin/loader.js.map +1 -1
- package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
- package/dist/prompt/coding-agent-doctrine.js +2 -0
- package/dist/prompt/coding-agent-doctrine.js.map +1 -1
- package/dist/prompt/index.d.ts +2 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -0
- package/dist/prompt/index.js.map +1 -1
- package/dist/prompt/resident-learning.d.ts +19 -0
- package/dist/prompt/resident-learning.d.ts.map +1 -0
- package/dist/prompt/resident-learning.js +125 -0
- package/dist/prompt/resident-learning.js.map +1 -0
- package/dist/prompt/resident-step.d.ts +8 -1
- package/dist/prompt/resident-step.d.ts.map +1 -1
- package/dist/prompt/resident-step.js +65 -4
- package/dist/prompt/resident-step.js.map +1 -1
- package/dist/provider/collect-chat-completion.d.ts +2 -1
- package/dist/provider/collect-chat-completion.d.ts.map +1 -1
- package/dist/provider/collect-chat-completion.js +7 -6
- package/dist/provider/collect-chat-completion.js.map +1 -1
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +2 -1
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/stream-text.d.ts +16 -0
- package/dist/provider/stream-text.d.ts.map +1 -0
- package/dist/provider/stream-text.js +51 -0
- package/dist/provider/stream-text.js.map +1 -0
- package/dist/public-runtime.d.ts +16 -4
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +17 -4
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +13 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +16 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +15 -3
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +2 -3
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/registry/tool/portable.d.ts +65 -0
- package/dist/registry/tool/portable.d.ts.map +1 -0
- package/dist/registry/tool/portable.js +244 -0
- package/dist/registry/tool/portable.js.map +1 -0
- package/dist/registry/tool/schema.d.ts +32 -5
- package/dist/registry/tool/schema.d.ts.map +1 -1
- package/dist/registry/tool/schema.js +35 -9
- package/dist/registry/tool/schema.js.map +1 -1
- package/dist/registry/toolset/catalog.js +8 -8
- package/dist/registry/toolset/catalog.js.map +1 -1
- package/dist/run/LimitChecker.js +3 -3
- package/dist/run/LimitChecker.js.map +1 -1
- package/dist/run/evidence-query.d.ts +41 -0
- package/dist/run/evidence-query.d.ts.map +1 -0
- package/dist/run/evidence-query.js +270 -0
- package/dist/run/evidence-query.js.map +1 -0
- package/dist/run/evidence-recall.d.ts +99 -0
- package/dist/run/evidence-recall.d.ts.map +1 -0
- package/dist/run/evidence-recall.js +633 -0
- package/dist/run/evidence-recall.js.map +1 -0
- package/dist/run/index.d.ts +2 -0
- package/dist/run/index.d.ts.map +1 -1
- package/dist/run/index.js +1 -0
- package/dist/run/index.js.map +1 -1
- package/dist/run/json-claim-verifier.d.ts +83 -0
- package/dist/run/json-claim-verifier.d.ts.map +1 -0
- package/dist/run/json-claim-verifier.js +200 -0
- package/dist/run/json-claim-verifier.js.map +1 -0
- package/dist/run/preparation-context-error.d.ts +10 -0
- package/dist/run/preparation-context-error.d.ts.map +1 -0
- package/dist/run/preparation-context-error.js +15 -0
- package/dist/run/preparation-context-error.js.map +1 -0
- package/dist/run-query/index.d.ts +3 -1
- package/dist/run-query/index.d.ts.map +1 -1
- package/dist/runtime/jobs/awaited-jobs.d.ts +215 -0
- package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -0
- package/dist/runtime/jobs/awaited-jobs.js +259 -0
- package/dist/runtime/jobs/awaited-jobs.js.map +1 -0
- package/dist/runtime/jobs/registry.d.ts +33 -2
- package/dist/runtime/jobs/registry.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.js +37 -0
- package/dist/runtime/jobs/registry.js.map +1 -1
- package/dist/runtime/query/callback-inference.d.ts +8 -0
- package/dist/runtime/query/callback-inference.d.ts.map +1 -0
- package/dist/runtime/query/callback-inference.js +89 -0
- package/dist/runtime/query/callback-inference.js.map +1 -0
- package/dist/runtime/query/checkpoint.d.ts +4 -0
- package/dist/runtime/query/checkpoint.d.ts.map +1 -1
- package/dist/runtime/query/checkpoint.js +13 -0
- package/dist/runtime/query/checkpoint.js.map +1 -1
- package/dist/runtime/query/events.d.ts +1 -0
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +18 -0
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +35 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +77 -8
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/file-evidence-context.d.ts +5 -0
- package/dist/runtime/query/file-evidence-context.d.ts.map +1 -0
- package/dist/runtime/query/file-evidence-context.js +180 -0
- package/dist/runtime/query/file-evidence-context.js.map +1 -0
- package/dist/runtime/query/file-evidence-replay.d.ts +260 -0
- package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -0
- package/dist/runtime/query/file-evidence-replay.js +647 -0
- package/dist/runtime/query/file-evidence-replay.js.map +1 -0
- package/dist/runtime/query/file-evidence-seed.d.ts +50 -0
- package/dist/runtime/query/file-evidence-seed.d.ts.map +1 -0
- package/dist/runtime/query/file-evidence-seed.js +100 -0
- package/dist/runtime/query/file-evidence-seed.js.map +1 -0
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +4 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/index.d.ts +10 -1
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +133 -26
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +92 -36
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +420 -117
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/advisory.d.ts +2 -1
- package/dist/runtime/query/iteration/phases/advisory.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/advisory.js +2 -1
- package/dist/runtime/query/iteration/phases/advisory.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +12 -1
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +8 -1
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/provider-rejected-image.d.ts +2 -1
- package/dist/runtime/query/iteration/provider-rejected-image.d.ts.map +1 -1
- package/dist/runtime/query/iteration/provider-rejected-image.js +5 -2
- package/dist/runtime/query/iteration/provider-rejected-image.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts +4 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +22 -8
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts +14 -0
- package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
- package/dist/runtime/query/plugin-hooks.js +18 -0
- package/dist/runtime/query/plugin-hooks.js.map +1 -1
- package/dist/runtime/query/repeat-call.d.ts +17 -4
- package/dist/runtime/query/repeat-call.d.ts.map +1 -1
- package/dist/runtime/query/repeat-call.js +26 -19
- package/dist/runtime/query/repeat-call.js.map +1 -1
- package/dist/runtime/query/resume-pending.d.ts +18 -33
- package/dist/runtime/query/resume-pending.d.ts.map +1 -1
- package/dist/runtime/query/resume-pending.js +59 -42
- package/dist/runtime/query/resume-pending.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +4 -4
- package/dist/runtime/query/review-policy.d.ts.map +1 -1
- package/dist/runtime/query/review-policy.js +10 -9
- package/dist/runtime/query/review-policy.js.map +1 -1
- package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -1
- package/dist/runtime/query/sandbox-lifecycle.js +4 -0
- package/dist/runtime/query/sandbox-lifecycle.js.map +1 -1
- package/dist/runtime/query/steering.d.ts +11 -1
- package/dist/runtime/query/steering.d.ts.map +1 -1
- package/dist/runtime/query/steering.js +12 -1
- package/dist/runtime/query/steering.js.map +1 -1
- package/dist/runtime/query/tool-output-budget.d.ts +10 -6
- package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
- package/dist/runtime/query/tool-output-budget.js +54 -12
- package/dist/runtime/query/tool-output-budget.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +5 -1
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +5 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/scheduler/completion-inbox.d.ts +49 -0
- package/dist/scheduler/completion-inbox.d.ts.map +1 -1
- package/dist/scheduler/completion-inbox.js +122 -2
- package/dist/scheduler/completion-inbox.js.map +1 -1
- package/dist/store/evidence/compaction-archive.d.ts +109 -0
- package/dist/store/evidence/compaction-archive.d.ts.map +1 -0
- package/dist/store/evidence/compaction-archive.js +125 -0
- package/dist/store/evidence/compaction-archive.js.map +1 -0
- package/dist/store/evidence/compaction-provenance.d.ts +7 -0
- package/dist/store/evidence/compaction-provenance.d.ts.map +1 -0
- package/dist/store/evidence/compaction-provenance.js +49 -0
- package/dist/store/evidence/compaction-provenance.js.map +1 -0
- package/dist/store/evidence/compaction-text.d.ts +16 -0
- package/dist/store/evidence/compaction-text.d.ts.map +1 -0
- package/dist/store/evidence/compaction-text.js +51 -0
- package/dist/store/evidence/compaction-text.js.map +1 -0
- package/dist/store/evidence/disk.d.ts +11 -0
- package/dist/store/evidence/disk.d.ts.map +1 -0
- package/dist/store/evidence/disk.js +367 -0
- package/dist/store/evidence/disk.js.map +1 -0
- package/dist/store/evidence/format.d.ts +25 -0
- package/dist/store/evidence/format.d.ts.map +1 -0
- package/dist/store/evidence/format.js +115 -0
- package/dist/store/evidence/format.js.map +1 -0
- package/dist/store/evidence/index-page.d.ts +208 -0
- package/dist/store/evidence/index-page.d.ts.map +1 -0
- package/dist/store/evidence/index-page.js +262 -0
- package/dist/store/evidence/index-page.js.map +1 -0
- package/dist/store/evidence/io.d.ts +24 -0
- package/dist/store/evidence/io.d.ts.map +1 -0
- package/dist/store/evidence/io.js +69 -0
- package/dist/store/evidence/io.js.map +1 -0
- package/dist/store/evidence/linked.d.ts +9 -0
- package/dist/store/evidence/linked.d.ts.map +1 -0
- package/dist/store/evidence/linked.js +314 -0
- package/dist/store/evidence/linked.js.map +1 -0
- package/dist/store/evidence/passages.d.ts +15 -0
- package/dist/store/evidence/passages.d.ts.map +1 -0
- package/dist/store/evidence/passages.js +72 -0
- package/dist/store/evidence/passages.js.map +1 -0
- package/dist/store/evidence/record-chain.d.ts +42 -0
- package/dist/store/evidence/record-chain.d.ts.map +1 -0
- package/dist/store/evidence/record-chain.js +111 -0
- package/dist/store/evidence/record-chain.js.map +1 -0
- package/dist/store/evidence/search-input.d.ts +21 -0
- package/dist/store/evidence/search-input.d.ts.map +1 -0
- package/dist/store/evidence/search-input.js +44 -0
- package/dist/store/evidence/search-input.js.map +1 -0
- package/dist/store/evidence/selection.d.ts +9 -0
- package/dist/store/evidence/selection.d.ts.map +1 -0
- package/dist/store/evidence/selection.js +17 -0
- package/dist/store/evidence/selection.js.map +1 -0
- package/dist/store/evidence/source-kind.d.ts +11 -0
- package/dist/store/evidence/source-kind.d.ts.map +1 -0
- package/dist/store/evidence/source-kind.js +26 -0
- package/dist/store/evidence/source-kind.js.map +1 -0
- package/dist/store/evidence/source-text.d.ts +51 -0
- package/dist/store/evidence/source-text.d.ts.map +1 -0
- package/dist/store/evidence/source-text.js +213 -0
- package/dist/store/evidence/source-text.js.map +1 -0
- package/dist/store/evidence/types.d.ts +162 -0
- package/dist/store/evidence/types.d.ts.map +1 -0
- package/dist/store/evidence/types.js +2 -0
- package/dist/store/evidence/types.js.map +1 -0
- package/dist/store/memory/disk.d.ts +2 -0
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +2 -1
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/run/disk.d.ts +10 -0
- package/dist/store/run/disk.d.ts.map +1 -1
- package/dist/store/run/disk.js +87 -7
- package/dist/store/run/disk.js.map +1 -1
- package/dist/store/run/memory.d.ts +1 -0
- package/dist/store/run/memory.d.ts.map +1 -1
- package/dist/store/run/memory.js +10 -0
- package/dist/store/run/memory.js.map +1 -1
- package/dist/store/run/tool-executions.d.ts +13 -0
- package/dist/store/run/tool-executions.d.ts.map +1 -0
- package/dist/store/run/tool-executions.js +99 -0
- package/dist/store/run/tool-executions.js.map +1 -0
- package/dist/store/session/index.d.ts +2 -0
- package/dist/store/session/index.d.ts.map +1 -1
- package/dist/store/session/index.js +1 -0
- package/dist/store/session/index.js.map +1 -1
- package/dist/store/session/sqlite.d.ts +57 -0
- package/dist/store/session/sqlite.d.ts.map +1 -0
- package/dist/store/session/sqlite.js +430 -0
- package/dist/store/session/sqlite.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +4 -10
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/edit-apply.d.ts +126 -0
- package/dist/tools/builtins/edit-apply.d.ts.map +1 -0
- package/dist/tools/builtins/edit-apply.js +360 -0
- package/dist/tools/builtins/edit-apply.js.map +1 -0
- package/dist/tools/builtins/edit.d.ts +143 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +37 -219
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/index.d.ts +1 -0
- package/dist/tools/builtins/index.d.ts.map +1 -1
- package/dist/tools/builtins/index.js +9 -3
- package/dist/tools/builtins/index.js.map +1 -1
- package/dist/tools/builtins/job.d.ts.map +1 -1
- package/dist/tools/builtins/job.js +5 -6
- package/dist/tools/builtins/job.js.map +1 -1
- package/dist/tools/builtins/read-file.d.ts +2 -2
- package/dist/tools/builtins/read-file.d.ts.map +1 -1
- package/dist/tools/builtins/read-file.js +50 -65
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/builtins/read-render.d.ts +56 -0
- package/dist/tools/builtins/read-render.d.ts.map +1 -0
- package/dist/tools/builtins/read-render.js +73 -0
- package/dist/tools/builtins/read-render.js.map +1 -0
- package/dist/tools/builtins/wait-for-job-bounds.d.ts +67 -0
- package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -0
- package/dist/tools/builtins/wait-for-job-bounds.js +108 -0
- package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -0
- package/dist/tools/builtins/wait-for-job.d.ts +6 -0
- package/dist/tools/builtins/wait-for-job.d.ts.map +1 -0
- package/dist/tools/builtins/wait-for-job.js +162 -0
- package/dist/tools/builtins/wait-for-job.js.map +1 -0
- package/dist/tools/builtins/write-file.js +7 -2
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +1 -7
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/defineTool.d.ts +2 -1
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +1 -1
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/tools/file-read-tracker.d.ts.map +1 -1
- package/dist/tools/file-read-tracker.js +90 -3
- package/dist/tools/file-read-tracker.js.map +1 -1
- package/dist/tools/resident-history.d.ts +10 -0
- package/dist/tools/resident-history.d.ts.map +1 -0
- package/dist/tools/resident-history.js +80 -0
- package/dist/tools/resident-history.js.map +1 -0
- package/dist/tools/resident-tool-evidence.d.ts +5 -0
- package/dist/tools/resident-tool-evidence.d.ts.map +1 -0
- package/dist/tools/resident-tool-evidence.js +57 -0
- package/dist/tools/resident-tool-evidence.js.map +1 -0
- package/dist/types/advisory/config.d.ts +7 -0
- package/dist/types/advisory/config.d.ts.map +1 -1
- package/dist/types/agent/reactive.d.ts +1 -0
- package/dist/types/agent/reactive.d.ts.map +1 -1
- package/dist/types/authorization/index.d.ts +9 -9
- package/dist/types/authorization/index.d.ts.map +1 -1
- package/dist/types/authorization/index.js +1 -1
- package/dist/types/authorization/index.js.map +1 -1
- package/dist/types/hitl/index.d.ts +4 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/message/index.d.ts +16 -2
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +10 -1
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/provider/chat.d.ts +2 -0
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/provider/stream.d.ts +4 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/run/answer-review.d.ts +34 -3
- package/dist/types/run/answer-review.d.ts.map +1 -1
- package/dist/types/run/config.d.ts +3 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/entity.d.ts +20 -0
- package/dist/types/run/entity.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +31 -8
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/prepare-step.d.ts +53 -8
- package/dist/types/run/prepare-step.d.ts.map +1 -1
- package/dist/types/run/store.d.ts +29 -4
- package/dist/types/run/store.d.ts.map +1 -1
- package/dist/types/run/store.js +0 -28
- package/dist/types/run/store.js.map +1 -1
- package/dist/types/sandbox/index.d.ts +15 -14
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/tool/index.d.ts +124 -1
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/utils/await-with-abort.d.ts +8 -0
- package/dist/utils/await-with-abort.d.ts.map +1 -0
- package/dist/utils/await-with-abort.js +28 -0
- package/dist/utils/await-with-abort.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +25 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/evidence-time.d.ts +3 -0
- package/dist/utils/evidence-time.d.ts.map +1 -0
- package/dist/utils/evidence-time.js +10 -0
- package/dist/utils/evidence-time.js.map +1 -0
- package/dist/utils/evidence-tokens.d.ts +13 -0
- package/dist/utils/evidence-tokens.d.ts.map +1 -0
- package/dist/utils/evidence-tokens.js +29 -0
- package/dist/utils/evidence-tokens.js.map +1 -0
- package/package.json +1 -1
- package/src/advisory/executor.ts +15 -30
- package/src/advisory/history.ts +126 -0
- package/src/advisory/index.ts +5 -1
- package/src/agents/ReactiveAgent.ts +3 -0
- package/src/agents/runAgent.ts +14 -1
- package/src/compaction/manual.ts +30 -2
- package/src/compaction/summary.ts +4 -1
- package/src/config/runtime.ts +2 -2
- package/src/connector/mcp/adapter.ts +20 -6
- package/src/contracts/schemas.ts +1 -1
- package/src/eval/harness-protection.ts +79 -0
- package/src/eval/harness-verification.ts +31 -1
- package/src/eval/index.ts +1 -0
- package/src/manager/resident/activity.ts +187 -0
- package/src/manager/resident/agenda.ts +59 -5
- package/src/manager/resident/consumption.ts +311 -0
- package/src/manager/resident/evidence-recall.ts +363 -0
- package/src/manager/resident/history-disk.ts +63 -0
- package/src/manager/resident/history.ts +312 -0
- package/src/manager/resident/initiative.ts +13 -3
- package/src/manager/resident/learning-cycle.ts +499 -0
- package/src/manager/resident/learning-observation.ts +39 -0
- package/src/manager/resident/learning-store.ts +813 -0
- package/src/manager/resident/learning.ts +132 -8
- package/src/manager/resident/store.ts +31 -3
- package/src/manager/resident/tool-evidence.ts +412 -0
- package/src/manager/run/persistence.ts +18 -0
- package/src/plugin/loader.ts +8 -3
- package/src/prompt/coding-agent-doctrine.ts +2 -0
- package/src/prompt/index.ts +2 -0
- package/src/prompt/resident-learning.ts +143 -0
- package/src/prompt/resident-step.ts +83 -3
- package/src/provider/collect-chat-completion.ts +7 -6
- package/src/provider/fallback.ts +2 -1
- package/src/provider/stream-text.ts +56 -0
- package/src/public-runtime.ts +39 -1
- package/src/public-tools.ts +21 -0
- package/src/public-types.ts +98 -0
- package/src/registry/tool/execute.ts +2 -4
- package/src/registry/tool/portable.ts +264 -0
- package/src/registry/tool/schema.ts +38 -8
- package/src/registry/toolset/catalog.ts +8 -9
- package/src/run/LimitChecker.ts +3 -3
- package/src/run/evidence-query.ts +333 -0
- package/src/run/evidence-recall.ts +854 -0
- package/src/run/index.ts +11 -0
- package/src/run/json-claim-verifier.ts +298 -0
- package/src/run/preparation-context-error.ts +16 -0
- package/src/run-query/index.ts +1 -1
- package/src/runtime/jobs/awaited-jobs.ts +271 -0
- package/src/runtime/jobs/registry.ts +50 -0
- package/src/runtime/query/callback-inference.ts +94 -0
- package/src/runtime/query/checkpoint.ts +14 -0
- package/src/runtime/query/events.ts +22 -0
- package/src/runtime/query/executor.ts +100 -10
- package/src/runtime/query/file-evidence-context.ts +209 -0
- package/src/runtime/query/file-evidence-replay.ts +776 -0
- package/src/runtime/query/file-evidence-seed.ts +126 -0
- package/src/runtime/query/guard.ts +2 -0
- package/src/runtime/query/index.ts +153 -27
- package/src/runtime/query/iteration/index.ts +467 -110
- package/src/runtime/query/iteration/phases/advisory.ts +3 -0
- package/src/runtime/query/iteration/phases/context.ts +12 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +7 -0
- package/src/runtime/query/iteration/provider-rejected-image.ts +6 -1
- package/src/runtime/query/iteration/stream-turn.ts +35 -8
- package/src/runtime/query/plugin-hooks.ts +20 -0
- package/src/runtime/query/repeat-call.ts +28 -18
- package/src/runtime/query/resume-pending.ts +65 -40
- package/src/runtime/query/review-policy.ts +13 -9
- package/src/runtime/query/sandbox-lifecycle.ts +3 -0
- package/src/runtime/query/steering.ts +11 -0
- package/src/runtime/query/tool-output-budget.ts +65 -13
- package/src/runtime/query/tooling.ts +10 -1
- package/src/scheduler/completion-inbox.ts +124 -2
- package/src/store/evidence/compaction-archive.ts +139 -0
- package/src/store/evidence/compaction-provenance.ts +52 -0
- package/src/store/evidence/compaction-text.ts +61 -0
- package/src/store/evidence/disk.ts +461 -0
- package/src/store/evidence/format.ts +126 -0
- package/src/store/evidence/index-page.ts +292 -0
- package/src/store/evidence/io.ts +95 -0
- package/src/store/evidence/linked.ts +365 -0
- package/src/store/evidence/passages.ts +88 -0
- package/src/store/evidence/record-chain.ts +108 -0
- package/src/store/evidence/search-input.ts +62 -0
- package/src/store/evidence/selection.ts +25 -0
- package/src/store/evidence/source-kind.ts +36 -0
- package/src/store/evidence/source-text.ts +285 -0
- package/src/store/evidence/types.ts +177 -0
- package/src/store/memory/disk.ts +4 -1
- package/src/store/run/disk.ts +110 -8
- package/src/store/run/memory.ts +10 -0
- package/src/store/run/tool-executions.ts +112 -0
- package/src/store/session/index.ts +2 -0
- package/src/store/session/sqlite.ts +584 -0
- package/src/tools/builtins/bash.ts +4 -10
- package/src/tools/builtins/edit-apply.ts +456 -0
- package/src/tools/builtins/edit.ts +39 -270
- package/src/tools/builtins/index.ts +9 -3
- package/src/tools/builtins/job.ts +5 -6
- package/src/tools/builtins/read-file.ts +56 -77
- package/src/tools/builtins/read-render.ts +104 -0
- package/src/tools/builtins/wait-for-job-bounds.ts +179 -0
- package/src/tools/builtins/wait-for-job.ts +184 -0
- package/src/tools/builtins/write-file.ts +7 -2
- package/src/tools/coordinator/index.ts +1 -7
- package/src/tools/defineTool.ts +4 -2
- package/src/tools/file-read-tracker.ts +86 -2
- package/src/tools/resident-history.ts +86 -0
- package/src/tools/resident-tool-evidence.ts +68 -0
- package/src/types/advisory/config.ts +7 -0
- package/src/types/agent/reactive.ts +1 -0
- package/src/types/authorization/index.ts +2 -2
- package/src/types/hitl/index.ts +4 -0
- package/src/types/message/index.ts +22 -0
- package/src/types/provider/chat.ts +2 -0
- package/src/types/provider/stream.ts +4 -0
- package/src/types/run/answer-review.ts +34 -3
- package/src/types/run/config.ts +3 -0
- package/src/types/run/entity.ts +21 -0
- package/src/types/run/events.ts +31 -8
- package/src/types/run/prepare-step.ts +59 -8
- package/src/types/run/store.ts +35 -4
- package/src/types/sandbox/index.ts +15 -14
- package/src/types/tool/index.ts +123 -1
- package/src/utils/await-with-abort.ts +26 -0
- package/src/utils/env.ts +23 -0
- package/src/utils/evidence-time.ts +9 -0
- package/src/utils/evidence-tokens.ts +32 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { lstat } from 'node:fs/promises'
|
|
2
|
+
import type { FileHandle } from 'node:fs/promises'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { evidenceRecordedAt } from '../../utils/evidence-time.js'
|
|
6
|
+
import { compactionArchiveSchema, compactionPartPath } from './compaction-archive.js'
|
|
7
|
+
import {
|
|
8
|
+
EVIDENCE_CHUNK_BYTES,
|
|
9
|
+
SEARCH_OVERLAP_BYTES,
|
|
10
|
+
digest,
|
|
11
|
+
mayContain,
|
|
12
|
+
mayContainToken,
|
|
13
|
+
} from './format.js'
|
|
14
|
+
import { type IndexEntry, entrySchema, eventTexts } from './index-page.js'
|
|
15
|
+
import {
|
|
16
|
+
type EvidenceBudget,
|
|
17
|
+
decode,
|
|
18
|
+
openEvidence,
|
|
19
|
+
readBytes,
|
|
20
|
+
readSmall,
|
|
21
|
+
stamp,
|
|
22
|
+
utf8Page,
|
|
23
|
+
} from './io.js'
|
|
24
|
+
import type { RunEvidenceScope, RunTextEvidenceReadResult } from './types.js'
|
|
25
|
+
|
|
26
|
+
const integer = z.number().int().nonnegative().safe()
|
|
27
|
+
export const textPointerSchema = entrySchema.pick({
|
|
28
|
+
offset: true,
|
|
29
|
+
length: true,
|
|
30
|
+
sha256: true,
|
|
31
|
+
seq: true,
|
|
32
|
+
part: true,
|
|
33
|
+
})
|
|
34
|
+
const manifestSchema = z.object({
|
|
35
|
+
version: z.literal(1),
|
|
36
|
+
bytes: integer,
|
|
37
|
+
chars: integer.optional(),
|
|
38
|
+
chunkBytes: z.literal(EVIDENCE_CHUNK_BYTES),
|
|
39
|
+
chunks: z
|
|
40
|
+
.array(
|
|
41
|
+
z.object({
|
|
42
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
43
|
+
filter: z.string().max(1400),
|
|
44
|
+
tokenFilter: z.string().max(1400).optional(),
|
|
45
|
+
characterOffset: integer.optional(),
|
|
46
|
+
}),
|
|
47
|
+
)
|
|
48
|
+
.max(4096),
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
export interface TextSource {
|
|
52
|
+
entry: IndexEntry
|
|
53
|
+
recordedAt?: number
|
|
54
|
+
bytes: number
|
|
55
|
+
chars?: number
|
|
56
|
+
retained: 'full' | 'preview'
|
|
57
|
+
chunks: number
|
|
58
|
+
mayMatch(
|
|
59
|
+
chunk: number,
|
|
60
|
+
query: string,
|
|
61
|
+
matchMode?: 'literal' | 'token',
|
|
62
|
+
caseSensitive?: boolean,
|
|
63
|
+
): boolean
|
|
64
|
+
window(
|
|
65
|
+
chunk: number,
|
|
66
|
+
preceding?: boolean,
|
|
67
|
+
): Promise<{ bytes: Buffer; offset: number; characterOffset?: number; searchFrom?: number }>
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
interface TextRecord {
|
|
71
|
+
offset: number
|
|
72
|
+
length: number
|
|
73
|
+
sha256: string
|
|
74
|
+
seq: number
|
|
75
|
+
event: Record<string, unknown>
|
|
76
|
+
parts: ReturnType<typeof eventTexts>
|
|
77
|
+
archive?: z.infer<typeof compactionArchiveSchema>
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** One authenticated record per operation, never shared between calls or sources. */
|
|
81
|
+
export function createTextSourceReader(
|
|
82
|
+
handle: FileHandle,
|
|
83
|
+
runDir: string,
|
|
84
|
+
runId: string,
|
|
85
|
+
budget: EvidenceBudget,
|
|
86
|
+
): (pointer: z.infer<typeof textPointerSchema>, verifiedRecord?: Buffer) => Promise<TextSource> {
|
|
87
|
+
let saved: TextRecord | undefined
|
|
88
|
+
return async (pointer, verifiedRecord) => {
|
|
89
|
+
budget.signal?.throwIfAborted()
|
|
90
|
+
if (
|
|
91
|
+
!saved ||
|
|
92
|
+
saved.offset !== pointer.offset ||
|
|
93
|
+
saved.length !== pointer.length ||
|
|
94
|
+
saved.sha256 !== pointer.sha256 ||
|
|
95
|
+
saved.seq !== pointer.seq
|
|
96
|
+
) {
|
|
97
|
+
const raw =
|
|
98
|
+
verifiedRecord ?? (await readBytes(handle, pointer.offset, pointer.length, budget))
|
|
99
|
+
if (raw.length !== pointer.length || digest(raw) !== pointer.sha256)
|
|
100
|
+
throw new Error('Recorded tool evidence changed.')
|
|
101
|
+
const event = JSON.parse(decode(raw)) as Record<string, unknown>
|
|
102
|
+
if (event.runId !== runId || event.seq !== pointer.seq)
|
|
103
|
+
throw new Error('Recorded text identity changed.')
|
|
104
|
+
saved = {
|
|
105
|
+
offset: pointer.offset,
|
|
106
|
+
length: pointer.length,
|
|
107
|
+
sha256: pointer.sha256,
|
|
108
|
+
seq: pointer.seq,
|
|
109
|
+
event,
|
|
110
|
+
parts: eventTexts(event),
|
|
111
|
+
archive:
|
|
112
|
+
event.type === 'compaction_archive' ? compactionArchiveSchema.parse(event) : undefined,
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return sourceText(pointer, runDir, budget, saved)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function sourceText(
|
|
120
|
+
pointer: z.infer<typeof textPointerSchema>,
|
|
121
|
+
runDir: string,
|
|
122
|
+
budget: EvidenceBudget,
|
|
123
|
+
{ event, parts, archive }: TextRecord,
|
|
124
|
+
): Promise<TextSource> {
|
|
125
|
+
const part = parts[pointer.part]
|
|
126
|
+
if (!part) throw new Error('Recorded text part is unavailable.')
|
|
127
|
+
const tool = event.type === 'tool_completed'
|
|
128
|
+
const archivedPart = archive?.archive.parts[pointer.part]
|
|
129
|
+
if (archive && !archivedPart) throw new Error('Missing archived text part.')
|
|
130
|
+
const entry = entrySchema.parse({
|
|
131
|
+
...pointer,
|
|
132
|
+
source: part.source,
|
|
133
|
+
...(tool
|
|
134
|
+
? {
|
|
135
|
+
toolName: z.string().parse(event.toolName),
|
|
136
|
+
toolUseId: z.string().parse(event.toolUseId),
|
|
137
|
+
isError: z.boolean().parse(event.isError),
|
|
138
|
+
spill: event.outputSpillIntegrity,
|
|
139
|
+
}
|
|
140
|
+
: { toolName: part.toolName, isError: part.isError }),
|
|
141
|
+
truncated: tool && event.outputTruncated === true,
|
|
142
|
+
...(archivedPart ? { spill: archivedPart.manifest } : {}),
|
|
143
|
+
filter: '',
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
if (!entry.spill) {
|
|
147
|
+
const bytes = Buffer.from(part.text, 'utf8')
|
|
148
|
+
return {
|
|
149
|
+
entry,
|
|
150
|
+
recordedAt: evidenceRecordedAt(event.timestamp),
|
|
151
|
+
bytes: bytes.length,
|
|
152
|
+
chars: part.text.length,
|
|
153
|
+
retained: entry.truncated ? 'preview' : 'full',
|
|
154
|
+
chunks: 1,
|
|
155
|
+
mayMatch: () => true,
|
|
156
|
+
window: async () => ({ bytes, offset: 0, characterOffset: 0 }),
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Never follow a model/provider-controlled spill path from the event.
|
|
160
|
+
let path: string
|
|
161
|
+
if (archive) path = compactionPartPath(runDir, archive.archive.id, pointer.part)
|
|
162
|
+
else {
|
|
163
|
+
if (!entry.toolUseId) throw new Error('Retained output has no tool identity.')
|
|
164
|
+
path = join(runDir, 'tool-output', `${digest(entry.toolUseId)}.txt`)
|
|
165
|
+
}
|
|
166
|
+
const rawManifest = await readSmall(`${path}.manifest.json`, budget)
|
|
167
|
+
if (digest(rawManifest) !== entry.spill) throw new Error('Retained output manifest changed.')
|
|
168
|
+
const manifest = manifestSchema.parse(JSON.parse(decode(rawManifest)))
|
|
169
|
+
if (manifest.chunks.length !== Math.ceil(manifest.bytes / EVIDENCE_CHUNK_BYTES))
|
|
170
|
+
throw new Error('Incomplete retained output manifest.')
|
|
171
|
+
return {
|
|
172
|
+
entry,
|
|
173
|
+
recordedAt: evidenceRecordedAt(event.timestamp),
|
|
174
|
+
bytes: manifest.bytes,
|
|
175
|
+
chars: manifest.chars,
|
|
176
|
+
retained: 'full',
|
|
177
|
+
chunks: Math.max(1, manifest.chunks.length),
|
|
178
|
+
mayMatch: (chunk, query, matchMode = 'literal', caseSensitive = true) => {
|
|
179
|
+
const part = manifest.chunks[chunk]
|
|
180
|
+
if (!part) return query === ''
|
|
181
|
+
if (matchMode === 'token')
|
|
182
|
+
return (
|
|
183
|
+
mayContainToken(part.tokenFilter, query) &&
|
|
184
|
+
(!caseSensitive || mayContain(part.filter, query))
|
|
185
|
+
)
|
|
186
|
+
return !caseSensitive || mayContain(part.filter, query)
|
|
187
|
+
},
|
|
188
|
+
async window(chunk, preceding = false) {
|
|
189
|
+
const file = await openEvidence(path)
|
|
190
|
+
try {
|
|
191
|
+
const before = await file.stat()
|
|
192
|
+
if (before.size !== manifest.bytes) throw new Error('Retained output size changed.')
|
|
193
|
+
const pieces: Buffer[] = []
|
|
194
|
+
// A token boundary needs the previous code point. Authenticate its
|
|
195
|
+
// entire chunk and charge that read; never trust an unverified byte.
|
|
196
|
+
const first = preceding && chunk > 0 ? chunk - 1 : chunk
|
|
197
|
+
for (let index = first; index < Math.min(chunk + 2, manifest.chunks.length); index++) {
|
|
198
|
+
const bytes = await readBytes(
|
|
199
|
+
file,
|
|
200
|
+
index * EVIDENCE_CHUNK_BYTES,
|
|
201
|
+
Math.min(EVIDENCE_CHUNK_BYTES, manifest.bytes - index * EVIDENCE_CHUNK_BYTES),
|
|
202
|
+
budget,
|
|
203
|
+
)
|
|
204
|
+
if (digest(bytes) !== manifest.chunks[index]?.sha256)
|
|
205
|
+
throw new Error('Retained output bytes changed.')
|
|
206
|
+
pieces.push(bytes)
|
|
207
|
+
}
|
|
208
|
+
if (
|
|
209
|
+
stamp(before) !== stamp(await file.stat()) ||
|
|
210
|
+
stamp(before) !== stamp(await lstat(path))
|
|
211
|
+
)
|
|
212
|
+
throw new Error('Retained output changed during read.')
|
|
213
|
+
const all = Buffer.concat(pieces)
|
|
214
|
+
const ownedStart = (chunk - first) * EVIDENCE_CHUNK_BYTES
|
|
215
|
+
let contentStart = ownedStart
|
|
216
|
+
while (contentStart < all.length && ((all[contentStart] ?? 0) & 0xc0) === 0x80)
|
|
217
|
+
contentStart++
|
|
218
|
+
let start = contentStart
|
|
219
|
+
if (preceding && chunk > 0) {
|
|
220
|
+
start--
|
|
221
|
+
while (start > 0 && ((all[start] ?? 0) & 0xc0) === 0x80) start--
|
|
222
|
+
}
|
|
223
|
+
const prefixChars = decode(all.subarray(start, contentStart)).length
|
|
224
|
+
const characterOffset =
|
|
225
|
+
manifest.chunks[chunk]?.characterOffset ?? (chunk === 0 ? 0 : undefined)
|
|
226
|
+
return {
|
|
227
|
+
bytes: utf8Page(
|
|
228
|
+
all.subarray(start),
|
|
229
|
+
ownedStart + EVIDENCE_CHUNK_BYTES + SEARCH_OVERLAP_BYTES - start,
|
|
230
|
+
),
|
|
231
|
+
offset: first * EVIDENCE_CHUNK_BYTES + start,
|
|
232
|
+
characterOffset:
|
|
233
|
+
characterOffset === undefined ? undefined : characterOffset - prefixChars,
|
|
234
|
+
searchFrom: prefixChars,
|
|
235
|
+
}
|
|
236
|
+
} finally {
|
|
237
|
+
await file.close()
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export async function readTextPage(
|
|
244
|
+
source: TextSource,
|
|
245
|
+
scope: RunEvidenceScope,
|
|
246
|
+
offset: number,
|
|
247
|
+
budget: EvidenceBudget,
|
|
248
|
+
): Promise<RunTextEvidenceReadResult> {
|
|
249
|
+
const entry = source.entry
|
|
250
|
+
if (offset > source.bytes) throw new Error('Offset exceeds retained text.')
|
|
251
|
+
const chunk = entry.spill
|
|
252
|
+
? Math.min(Math.floor(offset / EVIDENCE_CHUNK_BYTES), source.chunks - 1)
|
|
253
|
+
: 0
|
|
254
|
+
const window = await source.window(chunk)
|
|
255
|
+
if (offset < window.offset) throw new Error('Offset splits a UTF-8 character.')
|
|
256
|
+
const bytes = window.bytes.subarray(offset - window.offset)
|
|
257
|
+
let text = decode(utf8Page(bytes, 24_000))
|
|
258
|
+
if (text.length > 6000) {
|
|
259
|
+
let end = 6000
|
|
260
|
+
if (/[\uDC00-\uDFFF]/.test(text[end] ?? '')) end--
|
|
261
|
+
text = text.slice(0, end)
|
|
262
|
+
}
|
|
263
|
+
const next = offset + Buffer.byteLength(text)
|
|
264
|
+
if (next === offset && offset < source.bytes) throw new Error('Text page did not advance.')
|
|
265
|
+
return {
|
|
266
|
+
scope,
|
|
267
|
+
recordedAt: source.recordedAt,
|
|
268
|
+
seq: entry.seq,
|
|
269
|
+
source: entry.source,
|
|
270
|
+
part: entry.part,
|
|
271
|
+
characterOffset:
|
|
272
|
+
window.characterOffset === undefined
|
|
273
|
+
? undefined
|
|
274
|
+
: window.characterOffset + decode(window.bytes.subarray(0, offset - window.offset)).length,
|
|
275
|
+
totalChars: source.chars,
|
|
276
|
+
toolName: entry.toolName,
|
|
277
|
+
isError: entry.isError,
|
|
278
|
+
retained: source.retained,
|
|
279
|
+
text,
|
|
280
|
+
byteOffset: offset,
|
|
281
|
+
nextByteOffset: next < source.bytes ? next : null,
|
|
282
|
+
totalBytes: source.bytes,
|
|
283
|
+
scannedBytes: budget.bytes,
|
|
284
|
+
}
|
|
285
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/** @experimental An explicitly authorized invocation. No directory discovery. */
|
|
2
|
+
export interface RunEvidenceScope {
|
|
3
|
+
readonly tenantId: string
|
|
4
|
+
readonly projectId: string
|
|
5
|
+
readonly sessionId: string
|
|
6
|
+
readonly runId: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** @experimental Cache and run directories must be private and host-owned. */
|
|
10
|
+
export interface DiskRunEvidenceOptions {
|
|
11
|
+
readonly scope: RunEvidenceScope
|
|
12
|
+
readonly runDir: string
|
|
13
|
+
readonly indexDir: string
|
|
14
|
+
/** Optional smaller I/O ceiling per operation, in bytes (1–8 MiB). */
|
|
15
|
+
readonly maxReadBytes?: number
|
|
16
|
+
/**
|
|
17
|
+
* Disk readers default to closed runs. Snapshot mode also reads explicitly
|
|
18
|
+
* scoped nonterminal runs, checking file/metadata stamps before and after
|
|
19
|
+
* every operation. It neither claims a writer is dead nor resumes it.
|
|
20
|
+
* Appends or metadata changes invalidate continuations and addresses.
|
|
21
|
+
* Nonterminal search results remain incomplete even at the snapshot end.
|
|
22
|
+
* An incomplete final JSONL fragment is excluded without changing the file;
|
|
23
|
+
* the backward boundary scan is capped at one record (4 MiB) and billed.
|
|
24
|
+
*/
|
|
25
|
+
readonly consistency?: 'closed' | 'snapshot'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @experimental Literal search; empty query browses tool records. */
|
|
29
|
+
export interface RunEvidenceSearchOptions {
|
|
30
|
+
/** Optional per-call ceiling, 1–8 MiB. Cannot raise the source's own ceiling.
|
|
31
|
+
* Not part of search identity; a continuation may use a different allowance.
|
|
32
|
+
*/
|
|
33
|
+
readonly maxReadBytes?: number
|
|
34
|
+
readonly query?: string
|
|
35
|
+
/**
|
|
36
|
+
* Find passages matching any of 1–16 nonblank literal terms (up to 256 UTF-16
|
|
37
|
+
* units each) in the same bounded scan. Mutually exclusive with query, even
|
|
38
|
+
* an empty query. Exact duplicate terms and their order do not matter.
|
|
39
|
+
* This is candidate discovery, not relevance ranking or natural-language parsing.
|
|
40
|
+
*/
|
|
41
|
+
readonly terms?: readonly string[]
|
|
42
|
+
/** With a cursor and its original token terms, continue at that position using
|
|
43
|
+
* a strict nonempty subset. Requires supportsTermRefinement. The returned
|
|
44
|
+
* cursor is bound to the subset; the original cursor remains usable.
|
|
45
|
+
*/
|
|
46
|
+
readonly refineTerms?: readonly string[]
|
|
47
|
+
/**
|
|
48
|
+
* Defaults to literal substring matching. Token mode accepts only single
|
|
49
|
+
* Unicode letter/number/underscore tokens and matches complete tokens.
|
|
50
|
+
* Case-insensitive tokens use toLowerCase(), as bounded evidence ranking does.
|
|
51
|
+
* Empty-query browsing and phrases require literal mode. Bound into cursors.
|
|
52
|
+
*/
|
|
53
|
+
readonly matchMode?: 'literal' | 'token'
|
|
54
|
+
/** Defaults to true. False uses the selected mode's case rules (see matchMode). */
|
|
55
|
+
readonly caseSensitive?: boolean
|
|
56
|
+
/**
|
|
57
|
+
* Omit successful results from these exact tool names during search. At most
|
|
58
|
+
* 16 names, each 1–256 UTF-16 units. Errors and unknown provenance remain.
|
|
59
|
+
* Bound into cursors; exact reads are unchanged. Default: exclude nothing.
|
|
60
|
+
*/
|
|
61
|
+
readonly excludeSuccessfulTools?: readonly string[]
|
|
62
|
+
readonly cursor?: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** @experimental Opaque addresses remain usable after restart while the source is unchanged. */
|
|
66
|
+
export interface RunEvidenceMatch {
|
|
67
|
+
readonly address: string
|
|
68
|
+
readonly seq: number
|
|
69
|
+
/** Stored event wall-clock Unix milliseconds; absent/invalid/zero stamps remain unknown.
|
|
70
|
+
* This dates archive recording, not the facts in its text. Clocks can differ or move backwards.
|
|
71
|
+
*/
|
|
72
|
+
readonly recordedAt?: number
|
|
73
|
+
readonly toolName: string
|
|
74
|
+
readonly isError: boolean
|
|
75
|
+
readonly retained: 'full' | 'preview'
|
|
76
|
+
readonly excerpt: string
|
|
77
|
+
/** True only when the excerpt contains the whole full-retained text part.
|
|
78
|
+
* False includes partial text and retained previews; absent is unknown.
|
|
79
|
+
* This says nothing about other parts, scan completeness or source truth.
|
|
80
|
+
*/
|
|
81
|
+
readonly excerptComplete?: boolean
|
|
82
|
+
readonly byteOffset: number
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** @experimental An empty bounded page does not imply absence. Follow nextCursor. */
|
|
86
|
+
export interface RunEvidenceSearchResult {
|
|
87
|
+
readonly scope: RunEvidenceScope
|
|
88
|
+
readonly matches: readonly RunEvidenceMatch[]
|
|
89
|
+
readonly nextCursor: string | null
|
|
90
|
+
readonly scannedBytes: number
|
|
91
|
+
readonly indexedRecords: number
|
|
92
|
+
readonly cacheHit: boolean
|
|
93
|
+
readonly incomplete: boolean
|
|
94
|
+
readonly unavailable: readonly string[]
|
|
95
|
+
/** Successful tool-result visits omitted by this page's filter; not unique facts. */
|
|
96
|
+
readonly excludedToolResults?: number
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** @experimental Byte offsets refer to UTF-8 retained text, not the current workspace file. */
|
|
100
|
+
export interface RunEvidenceReadOptions {
|
|
101
|
+
readonly address: string
|
|
102
|
+
readonly byteOffset?: number
|
|
103
|
+
/** Optional per-call ceiling, 1–8 MiB, capped by the source's own ceiling. */
|
|
104
|
+
readonly maxReadBytes?: number
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** @experimental Full means retained text, not binary blocks or proof an action succeeded. */
|
|
108
|
+
export interface RunEvidenceReadResult {
|
|
109
|
+
readonly scope: RunEvidenceScope
|
|
110
|
+
readonly seq: number
|
|
111
|
+
/** Same stored-event wall-clock semantics as RunEvidenceMatch.recordedAt. */
|
|
112
|
+
readonly recordedAt?: number
|
|
113
|
+
readonly toolName: string
|
|
114
|
+
readonly isError: boolean
|
|
115
|
+
readonly retained: 'full' | 'preview'
|
|
116
|
+
readonly text: string
|
|
117
|
+
readonly byteOffset: number
|
|
118
|
+
readonly nextByteOffset: number | null
|
|
119
|
+
readonly totalBytes: number
|
|
120
|
+
readonly scannedBytes: number
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** @experimental Retrieval only: never re-executes a tool or resumes a run. */
|
|
124
|
+
export interface RunEvidenceSource {
|
|
125
|
+
readonly scope: RunEvidenceScope
|
|
126
|
+
readonly supportsTermRefinement?: boolean
|
|
127
|
+
search(options?: RunEvidenceSearchOptions, signal?: AbortSignal): Promise<RunEvidenceSearchResult>
|
|
128
|
+
read(options: RunEvidenceReadOptions, signal?: AbortSignal): Promise<RunEvidenceReadResult>
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** @experimental Textual event parts, including assistant output and shed conversation messages. */
|
|
132
|
+
export interface RunTextEvidenceSearchOptions extends RunEvidenceSearchOptions {
|
|
133
|
+
/** Omit explicitly marked derived summaries. Default false; bound into cursors. Exact reads remain available. */
|
|
134
|
+
readonly excludeDerivedSummaries?: boolean
|
|
135
|
+
readonly seq?: number
|
|
136
|
+
readonly part?: number
|
|
137
|
+
readonly limit?: number
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** @experimental Event identity is durable; byteOffset starts a bounded excerpt in the retained text. */
|
|
141
|
+
export interface RunTextEvidenceMatch extends Omit<RunEvidenceMatch, 'toolName' | 'isError'> {
|
|
142
|
+
readonly source: string
|
|
143
|
+
readonly part: number
|
|
144
|
+
readonly toolName?: string
|
|
145
|
+
readonly isError?: boolean
|
|
146
|
+
/** UTF-16 position, when the authenticated source includes a character index. */
|
|
147
|
+
readonly characterOffset?: number
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** @experimental Search includes messages and tool text, never binary or private reasoning blocks. */
|
|
151
|
+
export interface RunTextEvidenceSearchResult extends Omit<RunEvidenceSearchResult, 'matches'> {
|
|
152
|
+
readonly matches: readonly RunTextEvidenceMatch[]
|
|
153
|
+
/** Derived-summary part visits deliberately skipped, not unique facts or matched passages. */
|
|
154
|
+
readonly excludedSummaries?: number
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** @experimental Character counts are UTF-16 units; absent counts must not be inferred from bytes. */
|
|
158
|
+
export interface RunTextEvidenceReadResult
|
|
159
|
+
extends Omit<RunEvidenceReadResult, 'toolName' | 'isError'> {
|
|
160
|
+
readonly source: string
|
|
161
|
+
readonly part: number
|
|
162
|
+
readonly toolName?: string
|
|
163
|
+
readonly isError?: boolean
|
|
164
|
+
readonly characterOffset?: number
|
|
165
|
+
readonly totalChars?: number
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** @experimental Scope-bound, bounded text retrieval across an invocation's event stream. */
|
|
169
|
+
export interface RunTextEvidenceSource {
|
|
170
|
+
readonly scope: RunEvidenceScope
|
|
171
|
+
readonly supportsTermRefinement?: boolean
|
|
172
|
+
search(
|
|
173
|
+
options?: RunTextEvidenceSearchOptions,
|
|
174
|
+
signal?: AbortSignal,
|
|
175
|
+
): Promise<RunTextEvidenceSearchResult>
|
|
176
|
+
read(options: RunEvidenceReadOptions, signal?: AbortSignal): Promise<RunTextEvidenceReadResult>
|
|
177
|
+
}
|
package/src/store/memory/disk.ts
CHANGED
|
@@ -149,6 +149,8 @@ function assertMemoryContent(value: unknown, expectedId: MemoryId): asserts valu
|
|
|
149
149
|
|
|
150
150
|
export interface DiskMemoryStoreConfig {
|
|
151
151
|
baseDir: string
|
|
152
|
+
/** Exact memory directory; defaults to `baseDir/memory`. Hosts can partition by workspace. */
|
|
153
|
+
directory?: string
|
|
152
154
|
logger?: Logger
|
|
153
155
|
/** Maximum wait for another process's operation; default 10 seconds. Never breaks stale locks. */
|
|
154
156
|
lockTimeoutMs?: number
|
|
@@ -168,7 +170,8 @@ export class DiskMemoryStore implements MemoryStore {
|
|
|
168
170
|
private readonly indexRecords = new DiskRecordStore<unknown>(SCHEMA)
|
|
169
171
|
|
|
170
172
|
constructor(config: DiskMemoryStoreConfig) {
|
|
171
|
-
this.baseDir =
|
|
173
|
+
this.baseDir =
|
|
174
|
+
config.directory === undefined ? join(config.baseDir, 'memory') : resolve(config.directory)
|
|
172
175
|
this.log = resolveLogger(config.logger).child({ [SCOPE_ATTRIBUTE]: 'store/memory/disk' })
|
|
173
176
|
this.lockTimeoutMs = config.lockTimeoutMs ?? DEFAULT_MEMORY_LOCK_TIMEOUT_MS
|
|
174
177
|
validateMemoryLockTimeout(this.lockTimeoutMs)
|
package/src/store/run/disk.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { appendFile, mkdir, readFile, readdir, stat, unlink } from 'node:fs/promises'
|
|
2
3
|
import { join } from 'node:path'
|
|
3
4
|
import type { CheckpointId, IterationCheckpoint } from '../../types/hitl/index.js'
|
|
4
5
|
import type { Message } from '../../types/message/index.js'
|
|
@@ -16,10 +17,22 @@ import type {
|
|
|
16
17
|
RunStore,
|
|
17
18
|
} from '../../types/run/store.js'
|
|
18
19
|
import { atomicWriteFile } from '../../utils/atomic-write.js'
|
|
20
|
+
import { awaitWithAbort } from '../../utils/await-with-abort.js'
|
|
19
21
|
import { asCheckpointId, asRunId } from '../../utils/id.js'
|
|
20
22
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
21
23
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
24
|
+
import { restoreCompactionRecord, retainCompactionRecord } from '../evidence/compaction-archive.js'
|
|
25
|
+
import { digest } from '../evidence/format.js'
|
|
26
|
+
import { createLinkedRunTextEvidenceSource } from '../evidence/linked.js'
|
|
27
|
+
import {
|
|
28
|
+
type RecordPointer,
|
|
29
|
+
hasEvidenceText,
|
|
30
|
+
recordPointerSchema,
|
|
31
|
+
transcriptTail,
|
|
32
|
+
} from '../evidence/record-chain.js'
|
|
33
|
+
import type { RunEvidenceScope, RunTextEvidenceSource } from '../evidence/types.js'
|
|
22
34
|
import { defineSchema, migrate, stamp } from '../schema.js'
|
|
35
|
+
import { readToolExecutionsIn } from './tool-executions.js'
|
|
23
36
|
|
|
24
37
|
/**
|
|
25
38
|
* This store's on-disk format, versioned as a unit — which is how a
|
|
@@ -48,9 +61,22 @@ const CHECKPOINT_SCHEMA = defineSchema({
|
|
|
48
61
|
export type { CompletedToolRecord }
|
|
49
62
|
|
|
50
63
|
export class RunDiskStore implements RunStore {
|
|
64
|
+
async readToolExecutions(ids: readonly string[], signal?: AbortSignal) {
|
|
65
|
+
return readToolExecutionsIn(
|
|
66
|
+
join(this.requireInit(), 'transcript.jsonl'),
|
|
67
|
+
this.boundRunId!,
|
|
68
|
+
ids,
|
|
69
|
+
signal,
|
|
70
|
+
)
|
|
71
|
+
}
|
|
51
72
|
private baseDir: string
|
|
52
73
|
private runDir: string | null = null
|
|
53
74
|
private log: Logger
|
|
75
|
+
private eventLock: Promise<void> = Promise.resolve()
|
|
76
|
+
private evidenceTip: RecordPointer | undefined
|
|
77
|
+
private evidenceTextTip: RecordPointer | null | undefined
|
|
78
|
+
private evidenceEpoch = randomUUID()
|
|
79
|
+
private boundRunId: string | undefined
|
|
54
80
|
private indexLock: Promise<void> = Promise.resolve()
|
|
55
81
|
|
|
56
82
|
constructor(config: RunStoreConfig) {
|
|
@@ -76,19 +102,94 @@ export class RunDiskStore implements RunStore {
|
|
|
76
102
|
await mkdir(this.runDir, { recursive: true })
|
|
77
103
|
await healTornTranscript(this.runDir)
|
|
78
104
|
await healTornAuditTrail(this.runDir)
|
|
105
|
+
this.boundRunId = runId
|
|
106
|
+
this.evidenceEpoch = randomUUID()
|
|
107
|
+
const tail = await transcriptTail(join(this.runDir, 'transcript.jsonl'), runId)
|
|
108
|
+
this.evidenceTip = tail?.tip
|
|
109
|
+
this.evidenceTextTip = tail?.textTip
|
|
79
110
|
this.log.info('Run directory created', { 'namzu.run.dir': this.runDir })
|
|
80
111
|
return this.runDir
|
|
81
112
|
}
|
|
82
113
|
|
|
83
|
-
|
|
84
|
-
const
|
|
114
|
+
private withEventLock<T>(operation: () => Promise<T>): Promise<T> {
|
|
115
|
+
const next = this.eventLock.then(operation)
|
|
116
|
+
this.eventLock = next.then(
|
|
117
|
+
() => {},
|
|
118
|
+
() => {},
|
|
119
|
+
)
|
|
120
|
+
return next
|
|
121
|
+
}
|
|
85
122
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
123
|
+
async appendEvent(event: RunEvent): Promise<void> {
|
|
124
|
+
return this.withEventLock(async () => {
|
|
125
|
+
const storedEvent = await retainCompactionRecord(event, this.requireInit())
|
|
126
|
+
const path = join(this.requireInit(), 'transcript.jsonl')
|
|
127
|
+
const before = await stat(path).catch((error: NodeJS.ErrnoException) => {
|
|
128
|
+
if (error.code === 'ENOENT') return { size: 0 }
|
|
129
|
+
throw error
|
|
130
|
+
})
|
|
131
|
+
const previous = this.evidenceTip
|
|
132
|
+
const linked =
|
|
133
|
+
event.runId === this.boundRunId &&
|
|
134
|
+
previous &&
|
|
135
|
+
previous.offset + previous.length === before.size &&
|
|
136
|
+
previous.seq + 1 === event.seq
|
|
137
|
+
const previousTextRecord = linked
|
|
138
|
+
? this.evidenceTextTip
|
|
139
|
+
: before.size === 0 && event.seq === 1 && event.type === 'run_started'
|
|
140
|
+
? null
|
|
141
|
+
: undefined
|
|
142
|
+
const line = Buffer.from(
|
|
143
|
+
`${JSON.stringify({
|
|
144
|
+
...storedEvent,
|
|
145
|
+
timestamp: Date.now(),
|
|
146
|
+
previousRecord: linked ? previous : null,
|
|
147
|
+
previousTextRecord,
|
|
148
|
+
})}\n`,
|
|
149
|
+
)
|
|
150
|
+
await appendFile(path, line)
|
|
151
|
+
const pointer = recordPointerSchema.safeParse({
|
|
152
|
+
offset: before.size,
|
|
153
|
+
length: line.length,
|
|
154
|
+
sha256: digest(line),
|
|
155
|
+
seq: event.seq,
|
|
156
|
+
})
|
|
157
|
+
this.evidenceTip =
|
|
158
|
+
event.runId === this.boundRunId && pointer.success ? pointer.data : undefined
|
|
159
|
+
// Include chain boundaries as well as text. This prevents a later skip
|
|
160
|
+
// from hiding an incomplete history or a malformed content record.
|
|
161
|
+
this.evidenceTextTip = this.evidenceTip
|
|
162
|
+
? !linked || hasEvidenceText(JSON.parse(line.toString('utf8')))
|
|
163
|
+
? this.evidenceTip
|
|
164
|
+
: previousTextRecord
|
|
165
|
+
: undefined
|
|
166
|
+
})
|
|
167
|
+
}
|
|
90
168
|
|
|
91
|
-
|
|
169
|
+
/** Capture a writer-owned, immutable read boundary between complete appends. */
|
|
170
|
+
async captureTextEvidence(
|
|
171
|
+
scope: RunEvidenceScope,
|
|
172
|
+
maxReadBytes?: number,
|
|
173
|
+
signal?: AbortSignal,
|
|
174
|
+
): Promise<RunTextEvidenceSource | undefined> {
|
|
175
|
+
signal?.throwIfAborted()
|
|
176
|
+
const capture = this.withEventLock(async () => {
|
|
177
|
+
signal?.throwIfAborted()
|
|
178
|
+
if (scope.runId !== this.boundRunId)
|
|
179
|
+
throw new Error('Evidence capture does not own this run.')
|
|
180
|
+
if (!this.evidenceTip) return undefined
|
|
181
|
+
const runDir = this.requireInit()
|
|
182
|
+
const before = await stat(join(runDir, 'transcript.jsonl'))
|
|
183
|
+
signal?.throwIfAborted()
|
|
184
|
+
const tip = { ...this.evidenceTip }
|
|
185
|
+
if (before.size < tip.offset + tip.length)
|
|
186
|
+
throw new Error('Evidence transcript was shortened.')
|
|
187
|
+
return createLinkedRunTextEvidenceSource(
|
|
188
|
+
{ scope, runDir, indexDir: join(runDir, 'evidence-index'), maxReadBytes },
|
|
189
|
+
{ tip, identity: `${before.dev}:${before.ino}`, epoch: this.evidenceEpoch },
|
|
190
|
+
)
|
|
191
|
+
})
|
|
192
|
+
return awaitWithAbort(capture, signal)
|
|
92
193
|
}
|
|
93
194
|
|
|
94
195
|
async readEvents(options?: ReadRunEventsOptions): Promise<readonly PersistedRunEvent[]> {
|
|
@@ -461,6 +562,7 @@ export async function readRunEventsIn(
|
|
|
461
562
|
}
|
|
462
563
|
previousSeq = seq
|
|
463
564
|
if (seq <= sinceSeq) continue
|
|
565
|
+
parsed = await restoreCompactionRecord(parsed, runDir)
|
|
464
566
|
|
|
465
567
|
events.push({
|
|
466
568
|
...parsed,
|
package/src/store/run/memory.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
RunMessageSnapshot,
|
|
8
8
|
RunStore,
|
|
9
9
|
} from '../../types/run/store.js'
|
|
10
|
+
import { ToolExecutionCollector } from './tool-executions.js'
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Process-local {@link RunStore}: a run's evidence with no filesystem.
|
|
@@ -23,6 +24,15 @@ import type {
|
|
|
23
24
|
* environments with no writable filesystem at all.
|
|
24
25
|
*/
|
|
25
26
|
export class InMemoryRunStore implements RunStore {
|
|
27
|
+
async readToolExecutions(ids: readonly string[], signal?: AbortSignal) {
|
|
28
|
+
signal?.throwIfAborted()
|
|
29
|
+
const collector = new ToolExecutionCollector(this.requireInit(), ids)
|
|
30
|
+
for (const event of this.events) {
|
|
31
|
+
signal?.throwIfAborted()
|
|
32
|
+
collector.accept(event)
|
|
33
|
+
}
|
|
34
|
+
return collector.finish()
|
|
35
|
+
}
|
|
26
36
|
private runId: string | null = null
|
|
27
37
|
private parentRunId: string | undefined
|
|
28
38
|
private meta: Run | null = null
|