@namzu/sdk 38.1.0 → 39.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 +758 -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/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 +137 -0
- package/dist/manager/resident/agenda.d.ts.map +1 -0
- package/dist/manager/resident/agenda.js +586 -0
- package/dist/manager/resident/agenda.js.map +1 -0
- 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/delivery-window.d.ts +22 -0
- package/dist/manager/resident/delivery-window.d.ts.map +1 -0
- package/dist/manager/resident/delivery-window.js +78 -0
- package/dist/manager/resident/delivery-window.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/host.d.ts +78 -0
- package/dist/manager/resident/host.d.ts.map +1 -0
- package/dist/manager/resident/host.js +252 -0
- package/dist/manager/resident/host.js.map +1 -0
- package/dist/manager/resident/initiative.d.ts +111 -0
- package/dist/manager/resident/initiative.d.ts.map +1 -0
- package/dist/manager/resident/initiative.js +129 -0
- package/dist/manager/resident/initiative.js.map +1 -0
- 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 +726 -0
- package/dist/manager/resident/learning.d.ts.map +1 -0
- package/dist/manager/resident/learning.js +353 -0
- package/dist/manager/resident/learning.js.map +1 -0
- package/dist/manager/resident/loop.d.ts +31 -0
- package/dist/manager/resident/loop.d.ts.map +1 -0
- package/dist/manager/resident/loop.js +69 -0
- package/dist/manager/resident/loop.js.map +1 -0
- package/dist/manager/resident/outbox.d.ts +180 -0
- package/dist/manager/resident/outbox.d.ts.map +1 -0
- package/dist/manager/resident/outbox.js +214 -0
- package/dist/manager/resident/outbox.js.map +1 -0
- package/dist/manager/resident/proposal.d.ts +91 -0
- package/dist/manager/resident/proposal.d.ts.map +1 -0
- package/dist/manager/resident/proposal.js +75 -0
- package/dist/manager/resident/proposal.js.map +1 -0
- package/dist/manager/resident/store.d.ts +182 -0
- package/dist/manager/resident/store.d.ts.map +1 -0
- package/dist/manager/resident/store.js +199 -0
- package/dist/manager/resident/store.js.map +1 -0
- 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.map +1 -1
- package/dist/manager/run/persistence.js +6 -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/contributions.d.ts +5 -2
- package/dist/prompt/contributions.d.ts.map +1 -1
- package/dist/prompt/contributions.js.map +1 -1
- package/dist/prompt/index.d.ts +4 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +2 -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 +36 -0
- package/dist/prompt/resident-step.d.ts.map +1 -0
- package/dist/prompt/resident-step.js +135 -0
- package/dist/prompt/resident-step.js.map +1 -0
- 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 +22 -3
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +21 -3
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +2 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +2 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +29 -3
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/index.d.ts +1 -1
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/tool/execute.d.ts +18 -0
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +43 -6
- package/dist/registry/tool/execute.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/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 +7 -1
- package/dist/runtime/query/events.d.ts.map +1 -1
- package/dist/runtime/query/events.js +39 -12
- package/dist/runtime/query/events.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +7 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +38 -7
- 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 +64 -0
- package/dist/runtime/query/file-evidence-context.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 +40 -25
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +9 -31
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +231 -93
- 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 +2 -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 +3 -0
- 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/prompt-cache.d.ts.map +1 -1
- package/dist/runtime/query/prompt-cache.js +21 -42
- package/dist/runtime/query/prompt-cache.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/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 +3 -1
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +4 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/scheduler/completion-inbox.d.ts +3 -0
- package/dist/scheduler/completion-inbox.d.ts.map +1 -1
- package/dist/scheduler/completion-inbox.js +28 -0
- 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/job.d.ts.map +1 -1
- package/dist/tools/builtins/job.js +4 -5
- package/dist/tools/builtins/job.js.map +1 -1
- package/dist/tools/builtins/write-file.js +2 -2
- package/dist/tools/builtins/write-file.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 +12 -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 +8 -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 +7 -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/tool/index.d.ts +15 -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/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/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 +907 -0
- package/src/manager/resident/consumption.ts +311 -0
- package/src/manager/resident/delivery-window.ts +93 -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/host.ts +356 -0
- package/src/manager/resident/initiative.ts +205 -0
- 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 +493 -0
- package/src/manager/resident/loop.ts +101 -0
- package/src/manager/resident/outbox.ts +307 -0
- package/src/manager/resident/proposal.ts +105 -0
- package/src/manager/resident/store.ts +257 -0
- package/src/manager/resident/tool-evidence.ts +412 -0
- package/src/manager/run/persistence.ts +6 -0
- package/src/plugin/loader.ts +8 -3
- package/src/prompt/coding-agent-doctrine.ts +2 -0
- package/src/prompt/contributions.ts +5 -2
- package/src/prompt/index.ts +4 -0
- package/src/prompt/resident-learning.ts +143 -0
- package/src/prompt/resident-step.ts +176 -0
- 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 +44 -0
- package/src/public-tools.ts +3 -0
- package/src/public-types.ts +165 -0
- package/src/registry/index.ts +1 -1
- package/src/registry/tool/execute.ts +56 -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/query/callback-inference.ts +94 -0
- package/src/runtime/query/checkpoint.ts +14 -0
- package/src/runtime/query/events.ts +46 -14
- package/src/runtime/query/executor.ts +51 -9
- package/src/runtime/query/file-evidence-context.ts +65 -0
- package/src/runtime/query/guard.ts +2 -0
- package/src/runtime/query/index.ts +50 -27
- package/src/runtime/query/iteration/index.ts +269 -86
- package/src/runtime/query/iteration/phases/advisory.ts +3 -0
- package/src/runtime/query/iteration/phases/context.ts +2 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +3 -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/prompt-cache.ts +24 -47
- 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/tool-output-budget.ts +65 -13
- package/src/runtime/query/tooling.ts +7 -1
- package/src/scheduler/completion-inbox.ts +26 -0
- 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/job.ts +4 -5
- package/src/tools/builtins/write-file.ts +2 -2
- package/src/tools/defineTool.ts +4 -2
- package/src/tools/file-read-tracker.ts +8 -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 +20 -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 +7 -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/tool/index.ts +19 -1
- package/src/utils/await-with-abort.ts +26 -0
- package/src/utils/evidence-time.ts +9 -0
- package/src/utils/evidence-tokens.ts +32 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto'
|
|
2
2
|
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
|
+
import { digest, spillManifest } from '../../store/evidence/format.js'
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Model-visible size cap for a single tool result.
|
|
@@ -104,6 +105,8 @@ export interface ToolOutputBudgetResult {
|
|
|
104
105
|
readonly truncated: boolean
|
|
105
106
|
/** Where the full output was written, when it was. */
|
|
106
107
|
readonly spillPath?: string
|
|
108
|
+
/** Digest of the bounded chunk manifest, recorded at retention time. */
|
|
109
|
+
readonly spillIntegrity?: string
|
|
107
110
|
}
|
|
108
111
|
|
|
109
112
|
/**
|
|
@@ -155,6 +158,10 @@ export interface ApplyToolOutputBudgetOptions {
|
|
|
155
158
|
readonly toolUseId: string
|
|
156
159
|
readonly output: string
|
|
157
160
|
readonly maxChars: number
|
|
161
|
+
/** Optional condensed presentation; used only after authenticated retention of output. */
|
|
162
|
+
readonly preview?: string
|
|
163
|
+
/** Smaller preview only after the full output and its integrity manifest are saved. */
|
|
164
|
+
readonly retainedPreviewChars?: number
|
|
158
165
|
/** An omission notice that shares the text budget, never extends it. */
|
|
159
166
|
readonly notice?: string
|
|
160
167
|
/**
|
|
@@ -168,12 +175,10 @@ export interface ApplyToolOutputBudgetOptions {
|
|
|
168
175
|
/**
|
|
169
176
|
* Bound a tool result to the model-visible budget.
|
|
170
177
|
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* characters. Middle-elision is the fallback for a run with no directory
|
|
176
|
-
* to write to.
|
|
178
|
+
* Retention keeps the original while bounding its model-visible preview.
|
|
179
|
+
* The host owns the recovery route and its permissions; a spill path is not
|
|
180
|
+
* proof that workspace read/grep tools can access it. Middle-elision is the
|
|
181
|
+
* fallback for a run with no directory to write to.
|
|
177
182
|
*
|
|
178
183
|
* The preview keeps head AND tail because the two ends carry different
|
|
179
184
|
* information: the head has the schema/opening of a document, the tail has
|
|
@@ -194,26 +199,65 @@ export function applyToolOutputBudget(opts: ApplyToolOutputBudgetOptions): ToolO
|
|
|
194
199
|
: Math.max(0, limit - notice.length - (notice && output ? 2 : 0))
|
|
195
200
|
const withNotice = (text: string) => [text, notice].filter(Boolean).join('\n\n')
|
|
196
201
|
|
|
197
|
-
|
|
202
|
+
const preview =
|
|
203
|
+
opts.preview !== undefined && opts.preview.length < originalLength ? opts.preview : undefined
|
|
204
|
+
if (preview === undefined && (textBudget === undefined || originalLength <= textBudget)) {
|
|
198
205
|
return { output: withNotice(output), originalLength, truncated: false }
|
|
199
206
|
}
|
|
200
207
|
|
|
201
|
-
const
|
|
208
|
+
const retained = opts.spillDir
|
|
202
209
|
? spill(opts.spillDir, opts.toolUseId, output, opts.onError)
|
|
203
210
|
: undefined
|
|
204
211
|
|
|
212
|
+
const spillPath = retained?.path
|
|
205
213
|
const recovery = spillPath
|
|
206
214
|
? [
|
|
207
215
|
`${SPILL_MARKER} ${spillPath}`,
|
|
208
|
-
'
|
|
216
|
+
'This path identifies retained output, not the original input. Use the host-authorized retained-output recovery tools when available; the path does not grant filesystem access. A fresh observation of the original input cannot recover its earlier contents. If recovery is unavailable, report the missing detail; do not replay the original action.',
|
|
209
217
|
].join('\n')
|
|
210
218
|
: 'The full output was not retained. Use a saved artifact or a read-only observation; do not repeat a state-changing action to recover its output.'
|
|
219
|
+
const requestedPreview = opts.retainedPreviewChars
|
|
220
|
+
// Separate the spill threshold from the cost of carrying its preview on every
|
|
221
|
+
// later request. Failed retention must not silently discard additional text.
|
|
222
|
+
// A small configured preview still needs room for the durable recovery path.
|
|
223
|
+
const previewLimit =
|
|
224
|
+
retained?.integrity &&
|
|
225
|
+
requestedPreview !== undefined &&
|
|
226
|
+
Number.isFinite(requestedPreview) &&
|
|
227
|
+
requestedPreview > 0
|
|
228
|
+
? Math.min(limit as number, Math.floor(requestedPreview))
|
|
229
|
+
: (limit as number)
|
|
230
|
+
const previewTextBudget = Math.max(0, previewLimit - notice.length - (notice && output ? 2 : 0))
|
|
231
|
+
const minimumRecoveryChars = `\n[... omitted ...]\n${SPILL_MARKER} ${spillPath}\n`.length
|
|
232
|
+
const effectiveTextBudget =
|
|
233
|
+
previewTextBudget > minimumRecoveryChars ? previewTextBudget : textBudget
|
|
234
|
+
// Condensation is a display choice, not permission to discard evidence. The
|
|
235
|
+
// original can be under the ordinary cap while still losing distinct rows.
|
|
236
|
+
// Failed retention falls back to the original, bounded by the usual cap.
|
|
237
|
+
if (preview !== undefined && retained?.integrity) {
|
|
238
|
+
const condensed = [preview, recovery].filter(Boolean).join('\n\n')
|
|
239
|
+
if (effectiveTextBudget === undefined || condensed.length <= effectiveTextBudget) {
|
|
240
|
+
return {
|
|
241
|
+
output: withNotice(condensed),
|
|
242
|
+
originalLength,
|
|
243
|
+
truncated: true,
|
|
244
|
+
spillPath,
|
|
245
|
+
spillIntegrity: retained.integrity,
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (textBudget === undefined || originalLength <= textBudget) {
|
|
250
|
+
return { output: withNotice(output), originalLength, truncated: false }
|
|
251
|
+
}
|
|
211
252
|
|
|
212
253
|
return {
|
|
213
|
-
output: withNotice(
|
|
254
|
+
output: withNotice(
|
|
255
|
+
boundedPreview(output, effectiveTextBudget ?? textBudget, opts.toolName, recovery),
|
|
256
|
+
),
|
|
214
257
|
originalLength,
|
|
215
258
|
truncated: true,
|
|
216
259
|
...(spillPath ? { spillPath } : {}),
|
|
260
|
+
...(retained?.integrity ? { spillIntegrity: retained.integrity } : {}),
|
|
217
261
|
}
|
|
218
262
|
}
|
|
219
263
|
|
|
@@ -222,7 +266,7 @@ function spill(
|
|
|
222
266
|
toolUseId: string,
|
|
223
267
|
content: string,
|
|
224
268
|
onError?: (message: string) => void,
|
|
225
|
-
): string | undefined {
|
|
269
|
+
): { path: string; integrity?: string } | undefined {
|
|
226
270
|
try {
|
|
227
271
|
// `0o700` on the directory and `0o600` on the file: a spilled output is
|
|
228
272
|
// routinely the largest and most sensitive thing a run produces — whole
|
|
@@ -250,8 +294,16 @@ function spill(
|
|
|
250
294
|
// so randomising the filename would add nothing this does not already
|
|
251
295
|
// have. Do not "improve" it back to a random name and a plain `w` —
|
|
252
296
|
// that trades a guarantee for a guess.
|
|
253
|
-
|
|
254
|
-
|
|
297
|
+
const bytes = Buffer.from(content, 'utf8')
|
|
298
|
+
writeFileSync(path, bytes, { flag: 'wx', mode: 0o600 })
|
|
299
|
+
try {
|
|
300
|
+
const manifest = spillManifest(bytes)
|
|
301
|
+
writeFileSync(`${path}.manifest.json`, manifest, { flag: 'wx', mode: 0o600 })
|
|
302
|
+
return { path, integrity: digest(manifest) }
|
|
303
|
+
} catch {
|
|
304
|
+
onError?.('The full output was retained, but its integrity manifest could not be written.')
|
|
305
|
+
return { path }
|
|
306
|
+
}
|
|
255
307
|
} catch (err) {
|
|
256
308
|
// A spill failure must never fail the tool call — the model still
|
|
257
309
|
// gets the preview, just without a path to recover the rest.
|
|
@@ -47,8 +47,10 @@ export interface ToolingBootstrapConfig {
|
|
|
47
47
|
maxToolCalls?: number
|
|
48
48
|
readToolCallBudgetEvents?: () => Promise<readonly RunEvent[]>
|
|
49
49
|
maxToolOutputChars?: number
|
|
50
|
+
retainedToolPreviewChars?: number
|
|
50
51
|
maxToolContentBytes?: number
|
|
51
|
-
|
|
52
|
+
captureRunEvidence?: import('../../types/tool/index.js').ToolContext['captureRunEvidence']
|
|
53
|
+
toolOutputDir?: string | (() => string | undefined)
|
|
52
54
|
repairToolCall?: RepairToolCall
|
|
53
55
|
/** Operator authorization shared with the direct-call review path. */
|
|
54
56
|
authorizationGate?: AuthorizationGate
|
|
@@ -79,6 +81,7 @@ export class ToolingBootstrap {
|
|
|
79
81
|
abortSignal: config.abortSignal,
|
|
80
82
|
allowedTools: config.allowedTools,
|
|
81
83
|
invocationState: config.invocationState,
|
|
84
|
+
captureRunEvidence: config.captureRunEvidence,
|
|
82
85
|
pluginManager: config.pluginManager,
|
|
83
86
|
...(config.backgroundJobs ? { backgroundJobs: config.backgroundJobs } : {}),
|
|
84
87
|
...(config.backgroundJobOwner ? { backgroundJobOwner: config.backgroundJobOwner } : {}),
|
|
@@ -98,6 +101,9 @@ export class ToolingBootstrap {
|
|
|
98
101
|
...(config.maxToolOutputChars !== undefined
|
|
99
102
|
? { maxToolOutputChars: config.maxToolOutputChars }
|
|
100
103
|
: {}),
|
|
104
|
+
...(config.retainedToolPreviewChars !== undefined
|
|
105
|
+
? { retainedToolPreviewChars: config.retainedToolPreviewChars }
|
|
106
|
+
: {}),
|
|
101
107
|
...(config.maxToolContentBytes !== undefined
|
|
102
108
|
? { maxToolContentBytes: config.maxToolContentBytes }
|
|
103
109
|
: {}),
|
|
@@ -77,6 +77,7 @@ export class CompletionInbox {
|
|
|
77
77
|
* takes one, and a host that owns a gateway naturally reuses it.
|
|
78
78
|
*/
|
|
79
79
|
private readonly ours = new Set<TaskId>()
|
|
80
|
+
private readonly recentOwned: TaskId[] = []
|
|
80
81
|
/**
|
|
81
82
|
* Announcements that arrived before anyone said whose task it was.
|
|
82
83
|
*
|
|
@@ -192,6 +193,8 @@ export class CompletionInbox {
|
|
|
192
193
|
launched(taskId: TaskId): void {
|
|
193
194
|
if (this.ours.has(taskId)) return
|
|
194
195
|
this.ours.add(taskId)
|
|
196
|
+
this.recentOwned.push(taskId)
|
|
197
|
+
if (this.recentOwned.length > 16) this.recentOwned.shift()
|
|
195
198
|
|
|
196
199
|
if (this.claimed.has(taskId) || this.unheard.has(taskId)) return
|
|
197
200
|
|
|
@@ -278,6 +281,28 @@ export class CompletionInbox {
|
|
|
278
281
|
return this.unheard.size > 0
|
|
279
282
|
}
|
|
280
283
|
|
|
284
|
+
/** Bounded, non-consuming scheduler observations. Delivery never establishes user-facing completion. */
|
|
285
|
+
describeOwnedWork(): string | undefined {
|
|
286
|
+
if (this.ours.size === 0) return
|
|
287
|
+
const ids = this.recentOwned
|
|
288
|
+
const tasks = ids.map((taskId) => {
|
|
289
|
+
let handle = this.unheard.get(taskId)
|
|
290
|
+
try {
|
|
291
|
+
handle = this.gateway?.getTask(taskId) ?? handle
|
|
292
|
+
} catch {
|
|
293
|
+
// A broken observation must not block execution or invent a task state.
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
taskId,
|
|
297
|
+
state: handle?.state ?? 'unknown',
|
|
298
|
+
...(handle?.result?.status ? { runStatus: handle.result.status } : {}),
|
|
299
|
+
...(handle?.result?.stopReason ? { stopReason: handle.result.stopReason } : {}),
|
|
300
|
+
resultDelivery: this.claimed.has(taskId) ? 'delivered-to-history' : 'not-delivered',
|
|
301
|
+
}
|
|
302
|
+
})
|
|
303
|
+
return `Owned delegated work (current scheduler observations). Result delivery is not proof that you answered the original request. Answer the latest operator message and complete the requested synthesis of available results unless the operator cancelled or changed that request. Reuse delivered results when sufficient; do not relaunch completed work. If a delivered result is no longer visible, retrieve it by task ID. A terminal state with a non-end_turn stop reason is not successful task completion. Do not repeat a synthesis already given.\n${JSON.stringify({ tasks, omitted: this.ours.size - ids.length })}`
|
|
304
|
+
}
|
|
305
|
+
|
|
281
306
|
/**
|
|
282
307
|
* Tasks this run launched that are still running.
|
|
283
308
|
*
|
|
@@ -366,6 +391,7 @@ export class CompletionInbox {
|
|
|
366
391
|
this.unheard.clear()
|
|
367
392
|
this.outstanding.clear()
|
|
368
393
|
this.ours.clear()
|
|
394
|
+
this.recentOwned.length = 0
|
|
369
395
|
this.claimed.clear()
|
|
370
396
|
this.unowned.clear()
|
|
371
397
|
// Release anyone still waiting. A closed inbox would otherwise hold
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { lstat, mkdir, writeFile } from 'node:fs/promises'
|
|
3
|
+
import { join } from 'node:path'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import type { RunEvent } from '../../types/run/events.js'
|
|
6
|
+
import type { CompactedToolMetadata } from './compaction-provenance.js'
|
|
7
|
+
import { compactedTexts } from './compaction-text.js'
|
|
8
|
+
import { digest, spillManifest } from './format.js'
|
|
9
|
+
import { RECORD_BYTES, decode, noLinks, openEvidence, stamp } from './io.js'
|
|
10
|
+
|
|
11
|
+
const integer = z.number().int().nonnegative().safe()
|
|
12
|
+
const hash = z.string().regex(/^[a-f0-9]{64}$/)
|
|
13
|
+
const role = z.enum(['system', 'user', 'assistant', 'tool'])
|
|
14
|
+
export const compactionArchiveSchema = z.object({
|
|
15
|
+
type: z.literal('compaction_archive'),
|
|
16
|
+
runId: z.string().uuid(),
|
|
17
|
+
seq: integer.positive().optional(),
|
|
18
|
+
iteration: integer,
|
|
19
|
+
reason: z.enum(['threshold', 'overflow', 'manual']),
|
|
20
|
+
archive: z.object({
|
|
21
|
+
version: z.literal(1),
|
|
22
|
+
id: z.string().uuid(),
|
|
23
|
+
bytes: integer,
|
|
24
|
+
sha256: hash,
|
|
25
|
+
messageCount: integer,
|
|
26
|
+
parts: z
|
|
27
|
+
.array(
|
|
28
|
+
z.object({
|
|
29
|
+
role,
|
|
30
|
+
summary: z.literal(true).optional(),
|
|
31
|
+
manifest: hash,
|
|
32
|
+
toolName: z.string().min(1).max(1024).optional(),
|
|
33
|
+
isError: z.boolean().optional(),
|
|
34
|
+
}),
|
|
35
|
+
)
|
|
36
|
+
.max(8192),
|
|
37
|
+
}),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
/** Internal storage encoding only; RunStore readers restore compaction_shed. */
|
|
41
|
+
export function compactionArchiveDirectory(runDir: string, id: string): string {
|
|
42
|
+
return join(runDir, 'compaction-output', z.string().uuid().parse(id))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function compactionPartPath(runDir: string, id: string, part: number): string {
|
|
46
|
+
return join(compactionArchiveDirectory(runDir, id), `${integer.parse(part)}.txt`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Keep JSONL index records bounded while preserving whole original messages. */
|
|
50
|
+
export async function retainCompactionRecord(
|
|
51
|
+
event: RunEvent,
|
|
52
|
+
runDir: string,
|
|
53
|
+
): Promise<RunEvent | z.infer<typeof compactionArchiveSchema>> {
|
|
54
|
+
if (event.type !== 'compaction_shed') return event
|
|
55
|
+
const { messages: removed, type: _type, ...envelope } = event
|
|
56
|
+
const messageCount = removed.length
|
|
57
|
+
const original = Buffer.from(JSON.stringify(event.messages), 'utf8')
|
|
58
|
+
if (original.length <= 3 * 1024 * 1024) return event
|
|
59
|
+
const texts = compactedTexts(event.messages)
|
|
60
|
+
if (texts.length > 8192) throw new Error('Compaction archive exceeds 8192 textual parts.')
|
|
61
|
+
// The same 4096-chunk ceiling the reader enforces for retained tool text.
|
|
62
|
+
if (texts.some((part) => Buffer.byteLength(part.text, 'utf8') > 256 * 1024 * 1024))
|
|
63
|
+
throw new Error('Compaction archive text exceeds 256 MiB per part.')
|
|
64
|
+
const id = randomUUID()
|
|
65
|
+
const dir = compactionArchiveDirectory(runDir, id)
|
|
66
|
+
await noLinks(runDir)
|
|
67
|
+
await mkdir(join(runDir, 'compaction-output'), { recursive: true, mode: 0o700 })
|
|
68
|
+
await noLinks(join(runDir, 'compaction-output'))
|
|
69
|
+
await mkdir(dir, { mode: 0o700 })
|
|
70
|
+
await writeFile(join(dir, 'messages.json'), original, { flag: 'wx', mode: 0o600 })
|
|
71
|
+
const parts: ({
|
|
72
|
+
role: z.infer<typeof role>
|
|
73
|
+
manifest: string
|
|
74
|
+
summary?: true
|
|
75
|
+
} & CompactedToolMetadata)[] = []
|
|
76
|
+
for (const [part, value] of texts.entries()) {
|
|
77
|
+
const bytes = Buffer.from(value.text, 'utf8')
|
|
78
|
+
const manifest = spillManifest(bytes)
|
|
79
|
+
if (Buffer.byteLength(manifest, 'utf8') > RECORD_BYTES)
|
|
80
|
+
throw new Error('Compaction text manifest exceeds its 4 MiB read limit.')
|
|
81
|
+
const path = compactionPartPath(runDir, id, part)
|
|
82
|
+
await writeFile(path, bytes, { flag: 'wx', mode: 0o600 })
|
|
83
|
+
await writeFile(`${path}.manifest.json`, manifest, { flag: 'wx', mode: 0o600 })
|
|
84
|
+
parts.push({
|
|
85
|
+
role: value.role,
|
|
86
|
+
summary: value.summary,
|
|
87
|
+
manifest: digest(manifest),
|
|
88
|
+
toolName: value.toolName,
|
|
89
|
+
isError: value.isError,
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
...envelope,
|
|
94
|
+
...compactionArchiveSchema.parse({
|
|
95
|
+
type: 'compaction_archive',
|
|
96
|
+
runId: event.runId,
|
|
97
|
+
seq: event.seq,
|
|
98
|
+
iteration: event.iteration,
|
|
99
|
+
reason: event.reason,
|
|
100
|
+
archive: {
|
|
101
|
+
version: 1,
|
|
102
|
+
id,
|
|
103
|
+
bytes: original.length,
|
|
104
|
+
sha256: digest(original),
|
|
105
|
+
messageCount,
|
|
106
|
+
parts,
|
|
107
|
+
},
|
|
108
|
+
}),
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Full event readback is explicit and may load large bodies; search never calls this. */
|
|
113
|
+
export async function restoreCompactionRecord(
|
|
114
|
+
record: Record<string, unknown>,
|
|
115
|
+
runDir: string,
|
|
116
|
+
): Promise<Record<string, unknown>> {
|
|
117
|
+
if (record.type !== 'compaction_archive') return record
|
|
118
|
+
const saved = compactionArchiveSchema.parse(record)
|
|
119
|
+
const path = join(compactionArchiveDirectory(runDir, saved.archive.id), 'messages.json')
|
|
120
|
+
const file = await openEvidence(path)
|
|
121
|
+
try {
|
|
122
|
+
const before = await file.stat()
|
|
123
|
+
if (before.size !== saved.archive.bytes) throw new Error('Compaction archive size changed.')
|
|
124
|
+
const bytes = await file.readFile()
|
|
125
|
+
if (
|
|
126
|
+
stamp(before) !== stamp(await file.stat()) ||
|
|
127
|
+
stamp(before) !== stamp(await lstat(path)) ||
|
|
128
|
+
digest(bytes) !== saved.archive.sha256
|
|
129
|
+
)
|
|
130
|
+
throw new Error('Compaction archive bytes changed.')
|
|
131
|
+
const messages: unknown = JSON.parse(decode(bytes))
|
|
132
|
+
if (!Array.isArray(messages) || messages.length !== saved.archive.messageCount)
|
|
133
|
+
throw new Error('Compaction archive message count changed.')
|
|
134
|
+
const { archive: _archive, ...rest } = record
|
|
135
|
+
return { ...rest, type: 'compaction_shed', messages }
|
|
136
|
+
} finally {
|
|
137
|
+
await file.close()
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface CompactedToolMetadata {
|
|
2
|
+
toolName?: string
|
|
3
|
+
isError?: boolean
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
function record(value: unknown): Record<string, unknown> | undefined {
|
|
7
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
8
|
+
? (value as Record<string, unknown>)
|
|
9
|
+
: undefined
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** A copy keeps its own source/time; this only identifies an unambiguous local tool pair. */
|
|
13
|
+
export function compactedToolMetadata(messages: readonly unknown[]): CompactedToolMetadata[] {
|
|
14
|
+
const calls = new Map<string, { index: number; name?: string; count: number }>()
|
|
15
|
+
const results = new Map<string, number>()
|
|
16
|
+
for (const [index, value] of messages.entries()) {
|
|
17
|
+
const message = record(value)
|
|
18
|
+
if (message?.role === 'tool' && typeof message.toolCallId === 'string')
|
|
19
|
+
results.set(message.toolCallId, (results.get(message.toolCallId) ?? 0) + 1)
|
|
20
|
+
if (message?.role !== 'assistant' || !Array.isArray(message.toolCalls)) continue
|
|
21
|
+
for (const value of message.toolCalls) {
|
|
22
|
+
const call = record(value)
|
|
23
|
+
if (typeof call?.id !== 'string' || !call.id || call.id.length > 1024) continue
|
|
24
|
+
const name = call.type === 'function' ? record(call.function)?.name : undefined
|
|
25
|
+
calls.set(call.id, {
|
|
26
|
+
index,
|
|
27
|
+
name: typeof name === 'string' && name.length > 0 && name.length <= 1024 ? name : undefined,
|
|
28
|
+
count: (calls.get(call.id)?.count ?? 0) + 1,
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
let ownerIndex = -1
|
|
33
|
+
return messages.map((value, index) => {
|
|
34
|
+
const message = record(value)
|
|
35
|
+
if (message?.role !== 'tool') {
|
|
36
|
+
ownerIndex = index
|
|
37
|
+
return {}
|
|
38
|
+
}
|
|
39
|
+
const id = typeof message.toolCallId === 'string' ? message.toolCallId : undefined
|
|
40
|
+
const call = id === undefined ? undefined : calls.get(id)
|
|
41
|
+
return {
|
|
42
|
+
...(id !== undefined &&
|
|
43
|
+
call?.count === 1 &&
|
|
44
|
+
call.index === ownerIndex &&
|
|
45
|
+
results.get(id) === 1 &&
|
|
46
|
+
call.name
|
|
47
|
+
? { toolName: call.name }
|
|
48
|
+
: {}),
|
|
49
|
+
...(typeof message.isError === 'boolean' ? { isError: message.isError } : {}),
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { MessageRole } from '../../types/message/index.js'
|
|
2
|
+
import { type CompactedToolMetadata, compactedToolMetadata } from './compaction-provenance.js'
|
|
3
|
+
|
|
4
|
+
interface CompactedText extends CompactedToolMetadata {
|
|
5
|
+
role: MessageRole
|
|
6
|
+
text: string
|
|
7
|
+
summary?: true
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function record(value: unknown): Record<string, unknown> | undefined {
|
|
11
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
12
|
+
? (value as Record<string, unknown>)
|
|
13
|
+
: undefined
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Exact text only: do not stringify binary blocks or invent separators.
|
|
18
|
+
* Plain-string parts keep their historical ordinals. Block text is appended
|
|
19
|
+
* after that prefix, in message/block order, so durable seq/part addresses
|
|
20
|
+
* from before block indexing still resolve to the same original text.
|
|
21
|
+
*/
|
|
22
|
+
export function compactedTexts(messages: unknown): CompactedText[] {
|
|
23
|
+
if (!Array.isArray(messages)) throw new Error('Invalid shed messages.')
|
|
24
|
+
const strings: CompactedText[] = []
|
|
25
|
+
const blocks: CompactedText[] = []
|
|
26
|
+
const metadata = compactedToolMetadata(messages)
|
|
27
|
+
for (const [index, value] of messages.entries()) {
|
|
28
|
+
const message = record(value)
|
|
29
|
+
if (
|
|
30
|
+
!message ||
|
|
31
|
+
typeof message.role !== 'string' ||
|
|
32
|
+
!['system', 'user', 'assistant', 'tool'].includes(message.role)
|
|
33
|
+
)
|
|
34
|
+
throw new Error('Invalid shed message.')
|
|
35
|
+
const role = message.role as MessageRole
|
|
36
|
+
if (typeof message.content === 'string') {
|
|
37
|
+
strings.push({
|
|
38
|
+
role,
|
|
39
|
+
text: message.content,
|
|
40
|
+
...metadata[index],
|
|
41
|
+
...(role === 'system' && record(message.source)?.type === 'compaction-summary'
|
|
42
|
+
? { summary: true as const }
|
|
43
|
+
: {}),
|
|
44
|
+
})
|
|
45
|
+
} else if (role === 'tool' && Array.isArray(message.content)) {
|
|
46
|
+
for (const value of message.content) {
|
|
47
|
+
const block = record(value)
|
|
48
|
+
if (block?.type === 'text' && typeof block.text === 'string')
|
|
49
|
+
blocks.push({ role, text: block.text, ...metadata[index] })
|
|
50
|
+
else if (
|
|
51
|
+
!block ||
|
|
52
|
+
(block.type !== 'image' && block.type !== 'document') ||
|
|
53
|
+
typeof block.data !== 'string' ||
|
|
54
|
+
typeof block.mediaType !== 'string'
|
|
55
|
+
)
|
|
56
|
+
throw new Error('Invalid shed tool content block.')
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return strings.concat(blocks)
|
|
61
|
+
}
|