@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,3 +1,4 @@
|
|
|
1
|
+
import type { AdvisoryTurnContext } from '../../../../advisory/executor.js'
|
|
1
2
|
import { serializeState } from '../../../../compaction/serializer.js'
|
|
2
3
|
import { NAMZU } from '../../../../constants/telemetry/index.js'
|
|
3
4
|
import type { AdvisoryRequest, TriggerEvaluationState } from '../../../../types/advisory/index.js'
|
|
@@ -47,6 +48,7 @@ export async function runAdvisoryPhase(
|
|
|
47
48
|
ctx: IterationContext,
|
|
48
49
|
iterationNum: number,
|
|
49
50
|
response: ChatCompletionResponse,
|
|
51
|
+
turn?: AdvisoryTurnContext,
|
|
50
52
|
): Promise<void> {
|
|
51
53
|
const advisoryCtx = ctx.advisoryCtx
|
|
52
54
|
if (!advisoryCtx) return
|
|
@@ -105,6 +107,7 @@ export async function runAdvisoryPhase(
|
|
|
105
107
|
try {
|
|
106
108
|
const executionResult = await advisoryCtx.executor.consult(advisor, request, {
|
|
107
109
|
messages: ctx.runMgr.messages,
|
|
110
|
+
...(turn ? { turn } : {}),
|
|
108
111
|
workingStateSummary,
|
|
109
112
|
toolCatalog: ctx.tools.toLLMTools(ctx.allowedTools),
|
|
110
113
|
iteration: iterationNum,
|
|
@@ -26,6 +26,7 @@ import type {
|
|
|
26
26
|
AgentRunConfig,
|
|
27
27
|
BeforeStep,
|
|
28
28
|
PrepareStepChain,
|
|
29
|
+
PrepareStepContext,
|
|
29
30
|
RunEvent,
|
|
30
31
|
StepResult,
|
|
31
32
|
StopCondition,
|
|
@@ -229,6 +230,7 @@ export interface IterationContext {
|
|
|
229
230
|
|
|
230
231
|
/** Host hook that shapes each step before the model call. */
|
|
231
232
|
readonly prepareStep?: PrepareStepChain
|
|
233
|
+
readonly captureRunEvidence?: PrepareStepContext['captureRunEvidence']
|
|
232
234
|
readonly beforeStep?: BeforeStep
|
|
233
235
|
}
|
|
234
236
|
|
|
@@ -220,6 +220,9 @@ export async function* runToolReview(
|
|
|
220
220
|
toolCall.authorization = {
|
|
221
221
|
decision: gateResult.decision,
|
|
222
222
|
...(gateResult.reason ? { reason: gateResult.reason } : {}),
|
|
223
|
+
...(gateResult.decision === 'review' && gateResult.matchedRule
|
|
224
|
+
? { explicitReview: true as const }
|
|
225
|
+
: {}),
|
|
223
226
|
}
|
|
224
227
|
}
|
|
225
228
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isProviderRequestError } from '../../../provider/errors.js'
|
|
2
|
+
import type { Message } from '../../../types/message/index.js'
|
|
2
3
|
import type {
|
|
3
4
|
ChatCompletionParams,
|
|
4
5
|
LLMProvider,
|
|
@@ -42,7 +43,8 @@ function isAcceptedChunk(chunk: StreamChunk): boolean {
|
|
|
42
43
|
chunk.delta.citation ||
|
|
43
44
|
chunk.finishReason !== undefined ||
|
|
44
45
|
chunk.usage !== undefined ||
|
|
45
|
-
chunk.replayState !== undefined
|
|
46
|
+
chunk.replayState !== undefined ||
|
|
47
|
+
chunk.textParts !== undefined,
|
|
46
48
|
)
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -62,8 +64,10 @@ export async function* streamWithProviderRejectedImageRecovery(
|
|
|
62
64
|
provider: LLMProvider,
|
|
63
65
|
params: ChatCompletionParams,
|
|
64
66
|
onAccepted: (identity: RequestImageIdentity) => Promise<void>,
|
|
67
|
+
onRequest?: (messages: readonly Message[]) => void,
|
|
65
68
|
): AsyncIterable<StreamChunk> {
|
|
66
69
|
const candidate = findSingleRequestImage(params.messages)
|
|
70
|
+
onRequest?.(params.messages)
|
|
67
71
|
if (candidate === null) {
|
|
68
72
|
yield* provider.chatStream(params)
|
|
69
73
|
return
|
|
@@ -90,6 +94,7 @@ export async function* streamWithProviderRejectedImageRecovery(
|
|
|
90
94
|
}
|
|
91
95
|
let accepted = false
|
|
92
96
|
let retryReportedError = false
|
|
97
|
+
onRequest?.(retryParams.messages)
|
|
93
98
|
for await (const chunk of provider.chatStream(retryParams)) {
|
|
94
99
|
if (chunk.error !== undefined) retryReportedError = true
|
|
95
100
|
if (!accepted && isAcceptedChunk(chunk)) {
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
assertNativeStructuredOutputSupported,
|
|
5
5
|
} from '../../../provider/capabilities.js'
|
|
6
6
|
import { isProviderRequestError } from '../../../provider/errors.js'
|
|
7
|
+
import { StreamTextAccumulator } from '../../../provider/stream-text.js'
|
|
7
8
|
import { GENAI, NAMZU, chatSpanName, parentContext } from '../../../telemetry/attributes.js'
|
|
8
9
|
import {
|
|
9
10
|
recordModelDuration,
|
|
@@ -14,7 +15,12 @@ import { getTracer } from '../../../telemetry/runtime-accessors.js'
|
|
|
14
15
|
import { mergeTokenUsage } from '../../../types/common/index.js'
|
|
15
16
|
import { NamzuError } from '../../../types/errors/index.js'
|
|
16
17
|
import type { ToolUseId } from '../../../types/ids/index.js'
|
|
17
|
-
import type {
|
|
18
|
+
import type {
|
|
19
|
+
AssistantTextPart,
|
|
20
|
+
Citation,
|
|
21
|
+
Message,
|
|
22
|
+
ReasoningBlock,
|
|
23
|
+
} from '../../../types/message/index.js'
|
|
18
24
|
import { ProviderError } from '../../../types/provider/errors.js'
|
|
19
25
|
import type {
|
|
20
26
|
ChatCompletionResponse,
|
|
@@ -54,6 +60,8 @@ function synthesizeMessageStopReason(
|
|
|
54
60
|
export interface StreamingTurnResult {
|
|
55
61
|
response: ChatCompletionResponse
|
|
56
62
|
messageId: import('../../../types/ids/index.js').MessageId
|
|
63
|
+
/** Captured only for host review, at the provider-chain dispatch boundary. */
|
|
64
|
+
requestMessages?: readonly Message[]
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
/**
|
|
@@ -100,6 +108,7 @@ async function settleCancelledTurn(args: {
|
|
|
100
108
|
messageId: import('../../../types/ids/index.js').MessageId
|
|
101
109
|
usage: ChatCompletionResponse['usage']
|
|
102
110
|
text: string
|
|
111
|
+
textParts?: readonly AssistantTextPart[]
|
|
103
112
|
model: string
|
|
104
113
|
startedAt: number
|
|
105
114
|
span: Span
|
|
@@ -124,6 +133,7 @@ async function settleCancelledTurn(args: {
|
|
|
124
133
|
stopReason: 'cancelled',
|
|
125
134
|
usage: args.usage,
|
|
126
135
|
content: args.text || undefined,
|
|
136
|
+
...(args.textParts ? { textParts: args.textParts } : {}),
|
|
127
137
|
})
|
|
128
138
|
} catch {
|
|
129
139
|
// Best effort. The cancellation is the news.
|
|
@@ -156,6 +166,7 @@ export async function* streamProviderTurn(
|
|
|
156
166
|
imageRecovery?: {
|
|
157
167
|
readonly onAccepted: (identity: RequestImageIdentity) => Promise<void>
|
|
158
168
|
},
|
|
169
|
+
captureRequest = false,
|
|
159
170
|
): AsyncGenerator<RunEvent, StreamingTurnResult> {
|
|
160
171
|
assertNativeStructuredOutputSupported(provider, params)
|
|
161
172
|
assertHostedWebSearchSupported(provider, params)
|
|
@@ -181,7 +192,7 @@ export async function* streamProviderTurn(
|
|
|
181
192
|
|
|
182
193
|
let id = ''
|
|
183
194
|
const model = ''
|
|
184
|
-
|
|
195
|
+
const text = new StreamTextAccumulator()
|
|
185
196
|
let finishReason: ChatCompletionResponse['finishReason'] = 'stop'
|
|
186
197
|
let usage: ChatCompletionResponse['usage'] = {
|
|
187
198
|
promptTokens: 0,
|
|
@@ -239,9 +250,21 @@ export async function* streamProviderTurn(
|
|
|
239
250
|
...params,
|
|
240
251
|
stream: true,
|
|
241
252
|
} satisfies import('../../../types/provider/index.js').ChatCompletionParams
|
|
253
|
+
let requestMessages: readonly Message[] | undefined
|
|
254
|
+
const observeRequest = captureRequest
|
|
255
|
+
? (messages: readonly Message[]) => {
|
|
256
|
+
requestMessages = structuredClone(messages)
|
|
257
|
+
}
|
|
258
|
+
: undefined
|
|
259
|
+
if (!imageRecovery) observeRequest?.(streamParams.messages)
|
|
242
260
|
const stream = (
|
|
243
261
|
imageRecovery
|
|
244
|
-
? streamWithProviderRejectedImageRecovery(
|
|
262
|
+
? streamWithProviderRejectedImageRecovery(
|
|
263
|
+
provider,
|
|
264
|
+
streamParams,
|
|
265
|
+
imageRecovery.onAccepted,
|
|
266
|
+
observeRequest,
|
|
267
|
+
)
|
|
245
268
|
: provider.chatStream(streamParams)
|
|
246
269
|
) as AsyncIterable<StreamChunk>
|
|
247
270
|
|
|
@@ -328,6 +351,7 @@ export async function* streamProviderTurn(
|
|
|
328
351
|
}
|
|
329
352
|
if (!id && chunk.id) id = chunk.id
|
|
330
353
|
if (chunk.replayState !== undefined) replayState = chunk.replayState
|
|
354
|
+
text.push(chunk)
|
|
331
355
|
|
|
332
356
|
// The first delta of the turn, of ANY kind — text, reasoning or a
|
|
333
357
|
// tool call. namzu streams, so perceived latency is dominated by
|
|
@@ -401,13 +425,13 @@ export async function* streamProviderTurn(
|
|
|
401
425
|
}
|
|
402
426
|
|
|
403
427
|
if (chunk.delta.content) {
|
|
404
|
-
textBuf += chunk.delta.content
|
|
405
428
|
await emitEvent({
|
|
406
429
|
type: 'text_delta',
|
|
407
430
|
runId,
|
|
408
431
|
iteration,
|
|
409
432
|
messageId,
|
|
410
433
|
text: chunk.delta.content,
|
|
434
|
+
...(chunk.delta.textPart ? { textPart: chunk.delta.textPart } : {}),
|
|
411
435
|
})
|
|
412
436
|
yield* drainPending()
|
|
413
437
|
}
|
|
@@ -518,7 +542,8 @@ export async function* streamProviderTurn(
|
|
|
518
542
|
iteration,
|
|
519
543
|
messageId,
|
|
520
544
|
usage,
|
|
521
|
-
text:
|
|
545
|
+
text: text.text,
|
|
546
|
+
textParts: text.textParts,
|
|
522
547
|
model: params.model,
|
|
523
548
|
startedAt: callStartedAt,
|
|
524
549
|
span: chatSpan,
|
|
@@ -661,7 +686,8 @@ export async function* streamProviderTurn(
|
|
|
661
686
|
messageId,
|
|
662
687
|
stopReason,
|
|
663
688
|
usage,
|
|
664
|
-
content:
|
|
689
|
+
content: text.text || undefined,
|
|
690
|
+
...(text.textParts ? { textParts: text.textParts } : {}),
|
|
665
691
|
})
|
|
666
692
|
yield* drainPending()
|
|
667
693
|
|
|
@@ -714,7 +740,8 @@ export async function* streamProviderTurn(
|
|
|
714
740
|
model: model || params.model,
|
|
715
741
|
message: {
|
|
716
742
|
role: 'assistant',
|
|
717
|
-
content:
|
|
743
|
+
content: text.text || null,
|
|
744
|
+
...(text.textParts ? { textParts: text.textParts } : {}),
|
|
718
745
|
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
719
746
|
...(reasoningBlocks.length > 0 ? { reasoning: reasoningBlocks } : {}),
|
|
720
747
|
...(replayState !== undefined ? { replayState } : {}),
|
|
@@ -746,5 +773,5 @@ export async function* streamProviderTurn(
|
|
|
746
773
|
chatSpan.setStatus({ code: SpanStatusCode.OK })
|
|
747
774
|
chatSpan.end()
|
|
748
775
|
|
|
749
|
-
return { response, messageId }
|
|
776
|
+
return { response, messageId, ...(requestMessages ? { requestMessages } : {}) }
|
|
750
777
|
}
|
|
@@ -39,12 +39,6 @@ export class PromptCache {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
getSystemPrompt(input: PromptCacheInput): string {
|
|
42
|
-
const hash = this.computeConfigHash(input)
|
|
43
|
-
|
|
44
|
-
if (this.cachedPrompt && this.cachedConfigHash === hash) {
|
|
45
|
-
return this.cachedPrompt
|
|
46
|
-
}
|
|
47
|
-
|
|
48
42
|
const builder = new PromptBuilder({
|
|
49
43
|
systemPrompt: input.systemPrompt,
|
|
50
44
|
persona: input.persona,
|
|
@@ -56,7 +50,14 @@ export class PromptCache {
|
|
|
56
50
|
...(input.contributions ? { contributions: input.contributions } : {}),
|
|
57
51
|
})
|
|
58
52
|
|
|
59
|
-
|
|
53
|
+
const prompt = builder.build()
|
|
54
|
+
const hash = this.computeConfigHash(input, prompt)
|
|
55
|
+
|
|
56
|
+
if (this.cachedPrompt !== undefined && this.cachedConfigHash === hash) {
|
|
57
|
+
return this.cachedPrompt
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
this.cachedPrompt = prompt
|
|
60
61
|
this.cachedConfigHash = hash
|
|
61
62
|
return this.cachedPrompt
|
|
62
63
|
}
|
|
@@ -67,7 +68,7 @@ export class PromptCache {
|
|
|
67
68
|
|
|
68
69
|
needsRebuild(input: PromptCacheInput): boolean {
|
|
69
70
|
if (!this.cachedConfigHash) return true
|
|
70
|
-
return this.computeConfigHash(input) !== this.cachedConfigHash
|
|
71
|
+
return this.computeConfigHash(input, new PromptBuilder(input).build()) !== this.cachedConfigHash
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
getSystemPromptSegmented(
|
|
@@ -75,8 +76,6 @@ export class PromptCache {
|
|
|
75
76
|
contextLevel: AgentContextLevel = 'full',
|
|
76
77
|
workingDirectory?: string,
|
|
77
78
|
): PromptSegments {
|
|
78
|
-
const staticHash = this.computeStaticHash(input)
|
|
79
|
-
|
|
80
79
|
const builder = new PromptBuilder({
|
|
81
80
|
systemPrompt: input.systemPrompt,
|
|
82
81
|
persona: input.persona,
|
|
@@ -89,6 +88,7 @@ export class PromptCache {
|
|
|
89
88
|
})
|
|
90
89
|
|
|
91
90
|
const segments = builder.buildSegmented(contextLevel, workingDirectory)
|
|
91
|
+
const staticHash = this.computeStaticHash(segments.static)
|
|
92
92
|
|
|
93
93
|
if (this.cachedStaticHash === staticHash && this.cachedStaticSegment !== undefined) {
|
|
94
94
|
return {
|
|
@@ -110,47 +110,24 @@ export class PromptCache {
|
|
|
110
110
|
this.cachedStaticHash = undefined
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
private computeStaticHash(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
...(input.skills?.map((s) => s.metadata.name) ?? []),
|
|
121
|
-
// The STATIC ones only, because this hash guards the static
|
|
122
|
-
// segment. A `dynamic` or `turn` contributor coming or going does
|
|
123
|
-
// not change the cached prefix, and folding it in here would
|
|
124
|
-
// invalidate that prefix for a change it does not describe.
|
|
125
|
-
...(input.contributions
|
|
126
|
-
?.list()
|
|
127
|
-
.filter((c) => c.placement === 'static')
|
|
128
|
-
.map((c) => c.id) ?? []),
|
|
129
|
-
]
|
|
130
|
-
|
|
131
|
-
return createHash('sha256').update(parts.join('\0')).digest('hex').slice(0, 16)
|
|
113
|
+
private computeStaticHash(staticSegment: string): string {
|
|
114
|
+
// Static means stable within a run, but a cache can outlive that run.
|
|
115
|
+
// A fresh registry or a replacement can keep the same ids while its
|
|
116
|
+
// instructions change. Hash the text already built for this request,
|
|
117
|
+
// including persona, skills and context-level choices, without
|
|
118
|
+
// rendering any contribution twice or including dynamic/turn text.
|
|
119
|
+
return createHash('sha256').update(staticSegment).digest('hex').slice(0, 16)
|
|
132
120
|
}
|
|
133
121
|
|
|
134
|
-
private computeConfigHash(input: PromptCacheInput): string {
|
|
135
|
-
const parts
|
|
122
|
+
private computeConfigHash(input: PromptCacheInput, prompt: string): string {
|
|
123
|
+
const parts = [
|
|
136
124
|
this.agentId,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
input.
|
|
141
|
-
...(input.skills?.map((s) => s.metadata.name) ?? []),
|
|
142
|
-
...(input.allowedTools ?? []),
|
|
143
|
-
JSON.stringify(input.runtimeContext ?? {}),
|
|
144
|
-
// Ids and placements, not rendered text. Rendering every
|
|
145
|
-
// contribution to hash it would run them twice per request for a
|
|
146
|
-
// value the cache exists to avoid computing — and a contributor
|
|
147
|
-
// whose OUTPUT changes while its id does not is exactly the one
|
|
148
|
-
// that must declare `dynamic` or `turn` rather than `static`.
|
|
149
|
-
// Hashing the identity is what catches the change this cache can
|
|
150
|
-
// actually be wrong about: a different SET of contributors.
|
|
151
|
-
...(input.contributions?.list().map((c) => `${c.id}:${c.placement}`) ?? []),
|
|
125
|
+
prompt,
|
|
126
|
+
// Keep placement changes visible to needsRebuild even when the
|
|
127
|
+
// unsegmented text happens to be identical.
|
|
128
|
+
input.contributions?.list().map((c) => [c.id, c.placement]) ?? [],
|
|
152
129
|
]
|
|
153
130
|
|
|
154
|
-
return createHash('sha256').update(
|
|
131
|
+
return createHash('sha256').update(JSON.stringify(parts)).digest('hex').slice(0, 16)
|
|
155
132
|
}
|
|
156
133
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isDeepStrictEqual } from 'node:util'
|
|
2
2
|
|
|
3
3
|
import type { RunPersistence } from '../../manager/run/persistence.js'
|
|
4
|
+
import { ToolExecutionCollector } from '../../store/run/tool-executions.js'
|
|
4
5
|
import type {
|
|
5
6
|
CheckpointId,
|
|
6
7
|
HITLResumeDecision,
|
|
@@ -9,6 +10,7 @@ import type {
|
|
|
9
10
|
} from '../../types/hitl/index.js'
|
|
10
11
|
import type { AssistantMessage, Message, ToolCall } from '../../types/message/index.js'
|
|
11
12
|
import type { ChatCompletionResponse } from '../../types/provider/index.js'
|
|
13
|
+
import type { ToolExecutionSnapshot } from '../../types/run/store.js'
|
|
12
14
|
import type { Logger } from '../../utils/logger.js'
|
|
13
15
|
import type { PriorToolResults, ToolCallDenials, ToolExecutor } from './executor.js'
|
|
14
16
|
import { PendingAnswers } from './question-park.js'
|
|
@@ -192,24 +194,11 @@ function planQuestionResume(
|
|
|
192
194
|
}
|
|
193
195
|
|
|
194
196
|
/**
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
* awaiting a decision, so re-deciding costs only a round trip. It is
|
|
201
|
-
* exactly wrong when some of them already ran, because re-deciding means
|
|
202
|
-
* re-executing, and a tool that charged a card does not become idempotent
|
|
203
|
-
* on the second attempt.
|
|
204
|
-
*
|
|
205
|
-
* The discriminator is the transcript: a tool-review park records the
|
|
206
|
-
* checkpoint BEFORE any execution, so it has no completed calls and takes
|
|
207
|
-
* the cheap path unchanged. One or more completions means execution had
|
|
208
|
-
* begun, which is a resume, not a fresh decision.
|
|
209
|
-
*
|
|
210
|
-
* The calls that did NOT complete are executed here for the first time,
|
|
211
|
-
* through the ordinary executor — so every guard, permission check and
|
|
212
|
-
* probe still applies to them.
|
|
197
|
+
* Preserve a restored batch's recorded and explicitly unknown outcomes.
|
|
198
|
+
* `completed` comes from recoverCompletedCalls: missing entries are eligible
|
|
199
|
+
* only after a complete scan establishes that they have no recorded start.
|
|
200
|
+
* A started tool with no trustworthy completion is carried as an unknown
|
|
201
|
+
* outcome, not executed again. An untouched batch uses ordinary history repair.
|
|
213
202
|
*/
|
|
214
203
|
export function planCrashResume(
|
|
215
204
|
checkpoint: IterationCheckpoint,
|
|
@@ -219,13 +208,19 @@ export function planCrashResume(
|
|
|
219
208
|
const assistant = lastUnansweredBatch(checkpoint.messages)?.assistant
|
|
220
209
|
const calls = assistant?.toolCalls
|
|
221
210
|
if (!assistant || !calls || calls.length === 0) return null
|
|
211
|
+
// Only the current tail can be resumed in place. An older incomplete
|
|
212
|
+
// batch belongs to history repair; re-appending it would move its action
|
|
213
|
+
// past a newer operator message and silently reorder the conversation.
|
|
214
|
+
const ownerIndex = checkpoint.messages.lastIndexOf(assistant)
|
|
215
|
+
if (checkpoint.messages.slice(ownerIndex + 1).some((message) => message.role !== 'tool'))
|
|
216
|
+
return null
|
|
222
217
|
|
|
223
218
|
const done = calls.filter((tc) => completed.has(tc.id))
|
|
224
219
|
if (done.length === 0) return null
|
|
225
220
|
|
|
226
221
|
log.warn('Checkpoint holds a tool batch that was part-way through executing', {
|
|
227
222
|
'namzu.checkpoint.id': checkpoint.id,
|
|
228
|
-
'namzu.runtime.
|
|
223
|
+
'namzu.runtime.recovered': done.length,
|
|
229
224
|
'namzu.runtime.total': calls.length,
|
|
230
225
|
'namzu.runtime.remaining': calls
|
|
231
226
|
.filter((tc) => !completed.has(tc.id))
|
|
@@ -336,37 +331,67 @@ function modifiedCallIds(decision: HITLResumeDecision): ReadonlySet<string> {
|
|
|
336
331
|
}
|
|
337
332
|
|
|
338
333
|
/**
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* being resumed so an id from an earlier turn can never answer this one.
|
|
344
|
-
*
|
|
345
|
-
* A failure to read is not fatal: the worst case is the behaviour that
|
|
346
|
-
* existed before this recovery, and refusing to resume because a log could
|
|
347
|
-
* not be read would be a strictly worse trade.
|
|
334
|
+
* Recover completed results and close interrupted calls with unknown outcomes.
|
|
335
|
+
* Only a complete execution scan can authorize the absence of a start record.
|
|
336
|
+
* Unreadable, partial or contradictory evidence never becomes permission to
|
|
337
|
+
* replay; an explicitly answered durable question may re-enter its own tool.
|
|
348
338
|
*/
|
|
349
339
|
export async function recoverCompletedCalls(
|
|
350
340
|
runMgr: RunPersistence,
|
|
351
341
|
toolCalls: readonly ToolCall[],
|
|
352
342
|
log: Logger,
|
|
343
|
+
options: { answers?: PendingAnswers; signal?: AbortSignal } = {},
|
|
353
344
|
): Promise<Map<string, { result: string; isError: boolean }>> {
|
|
354
345
|
const recovered = new Map<string, { result: string; isError: boolean }>()
|
|
346
|
+
let snapshot: ToolExecutionSnapshot | undefined
|
|
355
347
|
try {
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
348
|
+
const store = runMgr.getRunStore()
|
|
349
|
+
if (store.readToolExecutions) {
|
|
350
|
+
snapshot = await store.readToolExecutions(
|
|
351
|
+
toolCalls.map((call) => call.id),
|
|
352
|
+
options.signal,
|
|
353
|
+
)
|
|
354
|
+
} else {
|
|
355
|
+
const collector = new ToolExecutionCollector(
|
|
356
|
+
runMgr.id,
|
|
357
|
+
toolCalls.map((call) => call.id),
|
|
358
|
+
)
|
|
359
|
+
for (const event of await store.readEvents({ integrity: 'strict' })) {
|
|
360
|
+
options.signal?.throwIfAborted()
|
|
361
|
+
collector.accept(event)
|
|
362
|
+
}
|
|
363
|
+
snapshot = collector.finish()
|
|
360
364
|
}
|
|
361
365
|
} catch (error) {
|
|
366
|
+
if (options.signal?.aborted) throw error
|
|
362
367
|
log.warn('Could not read the transcript to recover completed tool calls', {
|
|
363
368
|
'exception.message': error instanceof Error ? error.message : String(error),
|
|
364
369
|
})
|
|
365
|
-
|
|
370
|
+
}
|
|
371
|
+
for (const call of toolCalls) {
|
|
372
|
+
const record = snapshot?.records.get(call.id)
|
|
373
|
+
if (
|
|
374
|
+
snapshot?.complete &&
|
|
375
|
+
(!record || (record.toolName === call.function.name && record.toolUseId === call.id))
|
|
376
|
+
) {
|
|
377
|
+
if (!record) continue // Complete evidence proves this call has no recorded start.
|
|
378
|
+
if (record.status === 'completed') {
|
|
379
|
+
recovered.set(call.id, { result: record.result, isError: record.isError })
|
|
380
|
+
continue
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// The validated checkpoint and explicit answer own this re-entry even
|
|
384
|
+
// when the prior event store is unavailable. No sibling inherits it.
|
|
385
|
+
if ([...(options.answers?.entries() ?? [])].some(([id]) => isPauseForCall(id, call.id)))
|
|
386
|
+
continue
|
|
387
|
+
recovered.set(call.id, {
|
|
388
|
+
result: `Tool execution was interrupted and no trustworthy completion is available for \`${call.function.name}\`. Its outcome is unknown. This resume did not execute it again. Verify external state before deciding whether another call is needed; do not replay a state-changing action to recover its output.`,
|
|
389
|
+
isError: true,
|
|
390
|
+
})
|
|
366
391
|
}
|
|
367
392
|
|
|
368
393
|
if (recovered.size > 0) {
|
|
369
|
-
log.info('
|
|
394
|
+
log.info('Restored recorded or unknown tool outcomes without re-executing', {
|
|
370
395
|
'namzu.runtime.recovered': recovered.size,
|
|
371
396
|
'namzu.runtime.of_calls': toolCalls.length,
|
|
372
397
|
})
|
|
@@ -452,13 +477,13 @@ function synthesizeResponse(assistant: AssistantMessage): ChatCompletionResponse
|
|
|
452
477
|
}
|
|
453
478
|
|
|
454
479
|
/**
|
|
455
|
-
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
* result
|
|
480
|
+
* All calls owned by the last incomplete batch. Applying a resume plan
|
|
481
|
+
* reconstructs that entire batch, including any partial results already in
|
|
482
|
+
* the checkpoint. Those answered siblings must also be recovered, or their
|
|
483
|
+
* missing prior-result entries would let the executor repeat them.
|
|
459
484
|
*/
|
|
460
|
-
export function
|
|
461
|
-
return lastUnansweredBatch(messages)?.
|
|
485
|
+
export function interruptedToolCalls(messages: readonly Message[]): ToolCall[] {
|
|
486
|
+
return lastUnansweredBatch(messages)?.assistant.toolCalls ?? []
|
|
462
487
|
}
|
|
463
488
|
|
|
464
489
|
function lastUnansweredBatch(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* How a run resolves
|
|
2
|
+
* How a run resolves calls routed to review.
|
|
3
3
|
*
|
|
4
4
|
* An authorization rule says what a tool may do. A review policy says what
|
|
5
|
-
* happens to
|
|
6
|
-
*
|
|
5
|
+
* happens to calls the rules did not cover or explicitly routed to REVIEW.
|
|
6
|
+
* The two axes are separate on purpose — a rule is a durable
|
|
7
7
|
* statement an operator reviewed, and a mode is a property of ONE run, the
|
|
8
8
|
* difference between "we never force-push" and "this run is unattended".
|
|
9
9
|
*
|
|
@@ -132,12 +132,14 @@ export function isReviewExempt(
|
|
|
132
132
|
|
|
133
133
|
export type ReviewExemption = (name: string, input: unknown) => boolean
|
|
134
134
|
|
|
135
|
-
/**
|
|
135
|
+
/** Review explicit requests and calls that are destructive or not exempt. */
|
|
136
136
|
export function batchNeedsReview(
|
|
137
137
|
toolCalls: readonly ToolCallSummary[],
|
|
138
138
|
exempt: ReviewExemption,
|
|
139
139
|
): boolean {
|
|
140
|
-
return toolCalls.some(
|
|
140
|
+
return toolCalls.some(
|
|
141
|
+
(tc) => tc.authorization?.explicitReview || tc.isDestructive || !exempt(tc.name, tc.input),
|
|
142
|
+
)
|
|
141
143
|
}
|
|
142
144
|
|
|
143
145
|
/** The batch a person is asked about. */
|
|
@@ -194,14 +196,16 @@ export function createReviewHandler(options: ReviewPolicyOptions = {}): ResumeHa
|
|
|
194
196
|
if (
|
|
195
197
|
mode === 'accept-edits' &&
|
|
196
198
|
request.toolCalls.every(
|
|
197
|
-
(tc) =>
|
|
199
|
+
(tc) =>
|
|
200
|
+
!tc.authorization?.explicitReview &&
|
|
201
|
+
!tc.isDestructive &&
|
|
202
|
+
(ACCEPT_EDITS_TOOLS.has(tc.name) || exempt(tc.name, tc.input)),
|
|
198
203
|
)
|
|
199
204
|
) {
|
|
200
205
|
return { action: 'approve_tools' }
|
|
201
206
|
}
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
// tell the user what you would do.
|
|
207
|
+
// Ordinary reads were approved above. Remaining calls either change
|
|
208
|
+
// state or carry explicit review; plan mode does not grant that authority.
|
|
205
209
|
if (mode === 'plan') return { action: 'reject_tools', feedback: PLAN_MODE_REFUSAL }
|
|
206
210
|
if (mode === 'strict') return { action: 'reject_tools', feedback: STRICT_MODE_REFUSAL }
|
|
207
211
|
if (mode === 'auto' || !prompt || remembered.all) {
|
|
@@ -138,6 +138,9 @@ export async function acquireSandbox(options: {
|
|
|
138
138
|
runSignal.addEventListener('abort', onAbort, { once: true })
|
|
139
139
|
})
|
|
140
140
|
const timedOut = new Promise<{ readonly kind: 'timed_out'; readonly error: Error }>((resolve) => {
|
|
141
|
+
// An unlimited run still observes cancellation; Infinity must never reach
|
|
142
|
+
// setTimeout, where Node would coerce it to a one-millisecond deadline.
|
|
143
|
+
if (options.timeoutMs === Number.POSITIVE_INFINITY) return
|
|
141
144
|
timer = setTimeout(() => {
|
|
142
145
|
timeoutError = acquisitionTimeoutError(options.timeoutMs)
|
|
143
146
|
operationController.abort(timeoutError)
|