@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
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import {
|
|
4
|
+
type HarnessProtectionPlan,
|
|
5
|
+
normalizeHarnessProtection,
|
|
6
|
+
} from '../../eval/harness-protection.js'
|
|
7
|
+
import {
|
|
8
|
+
type HarnessVerificationBatch,
|
|
9
|
+
reviewHarnessCandidate,
|
|
10
|
+
} from '../../eval/harness-verification.js'
|
|
11
|
+
|
|
12
|
+
const label = z.string().trim().min(1).max(256)
|
|
13
|
+
const name = z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/)
|
|
14
|
+
const digest = z.string().regex(/^[a-f0-9]{64}$/)
|
|
15
|
+
export const residentLearningEvidenceSchema = z.object({
|
|
16
|
+
key: label,
|
|
17
|
+
source: label,
|
|
18
|
+
reason: z.string().trim().min(1).max(1_000),
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
/** @experimental Host provenance for a correction, evaluated activation or rollback. */
|
|
22
|
+
export type ResidentLearningEvidence = Readonly<z.infer<typeof residentLearningEvidenceSchema>>
|
|
23
|
+
|
|
24
|
+
const sourceSchema = z.object({ key: label, revision: label })
|
|
25
|
+
/** @experimental Host-owned source identity and revision; neither is a model assertion. */
|
|
26
|
+
export type ResidentLearningSource = Readonly<z.infer<typeof sourceSchema>>
|
|
27
|
+
|
|
28
|
+
const sourcesSchema = z
|
|
29
|
+
.array(sourceSchema)
|
|
30
|
+
.min(1)
|
|
31
|
+
.max(8)
|
|
32
|
+
.superRefine((sources, context) => {
|
|
33
|
+
if (new Set(sources.map((source) => source.key)).size !== sources.length)
|
|
34
|
+
context.addIssue({ code: z.ZodIssueCode.custom, message: 'Duplicate learning source keys.' })
|
|
35
|
+
})
|
|
36
|
+
.transform((sources) => sources.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)))
|
|
37
|
+
|
|
38
|
+
const candidateSchema = z.object({
|
|
39
|
+
name,
|
|
40
|
+
/** Omitted means ordinary task guidance; exploration policies require explicit projection. */
|
|
41
|
+
purpose: z.enum(['task', 'exploration']).optional(),
|
|
42
|
+
description: z.string().trim().min(1).max(1_000),
|
|
43
|
+
body: z.string().trim().min(1).max(4_000),
|
|
44
|
+
/** Optional dependencies whose revisions must still match before projection. */
|
|
45
|
+
sources: sourcesSchema.optional(),
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
/** @experimental Instructional guidance only; never executable assets or tool permissions. */
|
|
49
|
+
export type ResidentSkillCandidate = Readonly<Omit<z.infer<typeof candidateSchema>, 'sources'>> & {
|
|
50
|
+
readonly sources?: readonly ResidentLearningSource[]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Internal canonical snapshot, including immutable source bindings. */
|
|
54
|
+
export function normalizeResidentSkill(input: ResidentSkillCandidate): ResidentSkillCandidate {
|
|
55
|
+
const candidate = candidateSchema.parse(input)
|
|
56
|
+
return Object.freeze({
|
|
57
|
+
...candidate,
|
|
58
|
+
...(candidate.sources
|
|
59
|
+
? { sources: Object.freeze(candidate.sources.map((source) => Object.freeze(source))) }
|
|
60
|
+
: {}),
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const learnedSkillSchema = candidateSchema.extend({
|
|
65
|
+
hash: digest,
|
|
66
|
+
evidence: residentLearningEvidenceSchema,
|
|
67
|
+
verification: z.object({
|
|
68
|
+
baselineHash: z.union([digest, z.literal('none')]),
|
|
69
|
+
candidateHash: digest,
|
|
70
|
+
evidenceDigest: digest,
|
|
71
|
+
verificationTasks: z.number().int().min(5).max(64),
|
|
72
|
+
confirmationTasks: z.number().int().min(5).max(64),
|
|
73
|
+
/** Absent only on historical activations made before protection was required. */
|
|
74
|
+
protection: z
|
|
75
|
+
.object({
|
|
76
|
+
verificationTasks: z.number().int().min(1).max(63),
|
|
77
|
+
confirmationTasks: z.number().int().min(1).max(63),
|
|
78
|
+
planDigest: digest,
|
|
79
|
+
})
|
|
80
|
+
.optional(),
|
|
81
|
+
}),
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
/** @experimental Immutable evaluated content and evidence identity. */
|
|
85
|
+
export type ResidentLearnedSkill = Readonly<Omit<z.infer<typeof learnedSkillSchema>, 'sources'>> & {
|
|
86
|
+
readonly sources?: readonly ResidentLearningSource[]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const residentLearningSchema = z
|
|
90
|
+
.object({
|
|
91
|
+
revision: z.number().int().positive().safe(),
|
|
92
|
+
identity: z
|
|
93
|
+
.object({
|
|
94
|
+
text: z.string().trim().min(1).max(4_000),
|
|
95
|
+
evidence: residentLearningEvidenceSchema,
|
|
96
|
+
})
|
|
97
|
+
.optional(),
|
|
98
|
+
preferences: z
|
|
99
|
+
.array(
|
|
100
|
+
z.object({
|
|
101
|
+
key: name,
|
|
102
|
+
value: z.string().trim().min(1).max(1_000),
|
|
103
|
+
evidence: residentLearningEvidenceSchema,
|
|
104
|
+
}),
|
|
105
|
+
)
|
|
106
|
+
.max(32),
|
|
107
|
+
skills: z.array(learnedSkillSchema).max(16),
|
|
108
|
+
lastChange: residentLearningEvidenceSchema,
|
|
109
|
+
})
|
|
110
|
+
.superRefine((state, context) => {
|
|
111
|
+
if (
|
|
112
|
+
new Set(state.preferences.map((p) => p.key)).size !== state.preferences.length ||
|
|
113
|
+
new Set(state.skills.map((s) => s.name)).size !== state.skills.length ||
|
|
114
|
+
state.skills.some(
|
|
115
|
+
(skill) =>
|
|
116
|
+
skill.hash !== hashResidentSkill(skill) ||
|
|
117
|
+
skill.verification.candidateHash !== skill.hash,
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
context.addIssue({
|
|
121
|
+
code: z.ZodIssueCode.custom,
|
|
122
|
+
message: 'Invalid resident learning identity or content digest.',
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
/** @experimental Versioned behavioral overlay; the original resident mandate remains unchanged. */
|
|
127
|
+
export interface ResidentLearningState {
|
|
128
|
+
readonly revision: number
|
|
129
|
+
readonly identity?: { readonly text: string; readonly evidence: ResidentLearningEvidence }
|
|
130
|
+
readonly preferences: readonly {
|
|
131
|
+
readonly key: string
|
|
132
|
+
readonly value: string
|
|
133
|
+
readonly evidence: ResidentLearningEvidence
|
|
134
|
+
}[]
|
|
135
|
+
readonly skills: readonly ResidentLearnedSkill[]
|
|
136
|
+
readonly lastChange: ResidentLearningEvidence
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** @experimental Corrections name the current preference evidence they supersede. */
|
|
140
|
+
export interface ResidentProfileUpdate {
|
|
141
|
+
readonly identity?: string
|
|
142
|
+
readonly preferences?: readonly {
|
|
143
|
+
readonly key: string
|
|
144
|
+
readonly value: string
|
|
145
|
+
readonly supersedes: string | null
|
|
146
|
+
}[]
|
|
147
|
+
readonly evidence: ResidentLearningEvidence
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** @experimental Recorded paired runs; hosts own execution, scoring and independent attribution. */
|
|
151
|
+
export interface ResidentSkillEvaluation {
|
|
152
|
+
/** Host-owned task selection fixed before generating the candidate. */
|
|
153
|
+
readonly protection: HarnessProtectionPlan
|
|
154
|
+
readonly verification: HarnessVerificationBatch
|
|
155
|
+
readonly confirmation?: HarnessVerificationBatch
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Internal immutable snapshot used by storage and admitted context. */
|
|
159
|
+
export function freezeResidentLearning(input: ResidentLearningState): ResidentLearningState {
|
|
160
|
+
const state = residentLearningSchema.parse(input)
|
|
161
|
+
return Object.freeze({
|
|
162
|
+
...state,
|
|
163
|
+
...(state.identity
|
|
164
|
+
? {
|
|
165
|
+
identity: Object.freeze({
|
|
166
|
+
...state.identity,
|
|
167
|
+
evidence: Object.freeze(state.identity.evidence),
|
|
168
|
+
}),
|
|
169
|
+
}
|
|
170
|
+
: {}),
|
|
171
|
+
preferences: Object.freeze(
|
|
172
|
+
state.preferences.map((p) => Object.freeze({ ...p, evidence: Object.freeze(p.evidence) })),
|
|
173
|
+
),
|
|
174
|
+
skills: Object.freeze(
|
|
175
|
+
state.skills.map((skill) =>
|
|
176
|
+
Object.freeze({
|
|
177
|
+
...skill,
|
|
178
|
+
...(skill.sources
|
|
179
|
+
? { sources: Object.freeze(skill.sources.map((source) => Object.freeze(source))) }
|
|
180
|
+
: {}),
|
|
181
|
+
evidence: Object.freeze(skill.evidence),
|
|
182
|
+
verification: Object.freeze({
|
|
183
|
+
...skill.verification,
|
|
184
|
+
...(skill.verification.protection
|
|
185
|
+
? { protection: Object.freeze(skill.verification.protection) }
|
|
186
|
+
: {}),
|
|
187
|
+
}),
|
|
188
|
+
}),
|
|
189
|
+
),
|
|
190
|
+
),
|
|
191
|
+
lastChange: Object.freeze(state.lastChange),
|
|
192
|
+
})
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function evidenceFor(
|
|
196
|
+
current: ResidentLearningState | undefined,
|
|
197
|
+
input: ResidentLearningEvidence,
|
|
198
|
+
): ResidentLearningEvidence {
|
|
199
|
+
const evidence = residentLearningEvidenceSchema.parse(input)
|
|
200
|
+
const used = [
|
|
201
|
+
current?.lastChange,
|
|
202
|
+
current?.identity?.evidence,
|
|
203
|
+
...(current?.preferences.map((p) => p.evidence) ?? []),
|
|
204
|
+
...(current?.skills.map((s) => s.evidence) ?? []),
|
|
205
|
+
]
|
|
206
|
+
if (used.some((old) => old?.key === evidence.key))
|
|
207
|
+
throw new Error('A learning change requires a fresh evidence key.')
|
|
208
|
+
return evidence
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function base(
|
|
212
|
+
current: ResidentLearningState | undefined,
|
|
213
|
+
evidence: ResidentLearningEvidence,
|
|
214
|
+
): ResidentLearningState {
|
|
215
|
+
const checked = current ? freezeResidentLearning(current) : undefined
|
|
216
|
+
return {
|
|
217
|
+
...checked,
|
|
218
|
+
revision: (checked?.revision ?? 0) + 1,
|
|
219
|
+
preferences: checked?.preferences ?? [],
|
|
220
|
+
skills: checked?.skills ?? [],
|
|
221
|
+
lastChange: evidence,
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Internal pure profile transition; storage owns exact agenda CAS and idle admission. */
|
|
226
|
+
export function reviseResidentProfile(
|
|
227
|
+
current: ResidentLearningState | undefined,
|
|
228
|
+
input: ResidentProfileUpdate,
|
|
229
|
+
): ResidentLearningState {
|
|
230
|
+
const checked = z
|
|
231
|
+
.object({
|
|
232
|
+
identity: z.string().trim().min(1).max(4_000).optional(),
|
|
233
|
+
preferences: z
|
|
234
|
+
.array(
|
|
235
|
+
z.object({
|
|
236
|
+
key: name,
|
|
237
|
+
value: z.string().trim().min(1).max(1_000),
|
|
238
|
+
supersedes: label.nullable(),
|
|
239
|
+
}),
|
|
240
|
+
)
|
|
241
|
+
.max(32)
|
|
242
|
+
.optional(),
|
|
243
|
+
evidence: residentLearningEvidenceSchema,
|
|
244
|
+
})
|
|
245
|
+
.parse(input)
|
|
246
|
+
if (checked.identity === undefined && !checked.preferences?.length)
|
|
247
|
+
throw new Error('A profile change must change identity or preferences.')
|
|
248
|
+
if (
|
|
249
|
+
new Set(checked.preferences?.map((p) => p.key)).size !== checked.preferences?.length &&
|
|
250
|
+
checked.preferences !== undefined
|
|
251
|
+
)
|
|
252
|
+
throw new Error('Duplicate preference corrections are not allowed.')
|
|
253
|
+
const evidence = evidenceFor(current, checked.evidence)
|
|
254
|
+
const next = base(current, evidence)
|
|
255
|
+
const preferences = [...next.preferences]
|
|
256
|
+
for (const change of checked.preferences ?? []) {
|
|
257
|
+
const index = preferences.findIndex((p) => p.key === change.key)
|
|
258
|
+
const previous = index >= 0 ? preferences[index] : undefined
|
|
259
|
+
if (change.supersedes !== (previous?.evidence.key ?? null))
|
|
260
|
+
throw new Error('Preference correction does not supersede its current evidence.')
|
|
261
|
+
const updated = { key: change.key, value: change.value, evidence }
|
|
262
|
+
if (index < 0) preferences.push(updated)
|
|
263
|
+
else preferences[index] = updated
|
|
264
|
+
}
|
|
265
|
+
return freezeResidentLearning({
|
|
266
|
+
...next,
|
|
267
|
+
preferences,
|
|
268
|
+
...(checked.identity !== undefined ? { identity: { text: checked.identity, evidence } } : {}),
|
|
269
|
+
})
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** @experimental Bind evaluation to normalized content and any declared source dependencies. */
|
|
273
|
+
export function hashResidentSkill(input: ResidentSkillCandidate): string {
|
|
274
|
+
const candidate = candidateSchema.parse(input)
|
|
275
|
+
return createHash('sha256')
|
|
276
|
+
.update(
|
|
277
|
+
JSON.stringify([
|
|
278
|
+
candidate.name,
|
|
279
|
+
candidate.description,
|
|
280
|
+
candidate.body,
|
|
281
|
+
...(candidate.sources ? [candidate.sources] : []),
|
|
282
|
+
...(candidate.purpose === 'exploration' ? [{ purpose: candidate.purpose }] : []),
|
|
283
|
+
]),
|
|
284
|
+
)
|
|
285
|
+
.digest('hex')
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/** Internal pure activation; reuse the kernel's conservative two-round verification gate. */
|
|
289
|
+
export function promoteResidentSkill(
|
|
290
|
+
current: ResidentLearningState | undefined,
|
|
291
|
+
input: ResidentSkillCandidate,
|
|
292
|
+
evaluation: ResidentSkillEvaluation,
|
|
293
|
+
inputEvidence: ResidentLearningEvidence,
|
|
294
|
+
): ResidentLearningState {
|
|
295
|
+
const protection = normalizeHarnessProtection(evaluation.protection)
|
|
296
|
+
const candidate = candidateSchema.parse(input)
|
|
297
|
+
const hash = hashResidentSkill(candidate)
|
|
298
|
+
const baseline = current?.skills.find((s) => s.name === candidate.name)
|
|
299
|
+
if (baseline && (baseline.purpose ?? 'task') !== (candidate.purpose ?? 'task'))
|
|
300
|
+
throw new Error('A skill cannot change learning purpose; use a distinct skill name.')
|
|
301
|
+
const baselineHash = baseline?.hash ?? 'none'
|
|
302
|
+
const evidence = evidenceFor(current, inputEvidence)
|
|
303
|
+
for (const batch of [evaluation.verification, evaluation.confirmation]) {
|
|
304
|
+
if (!batch) continue
|
|
305
|
+
if (batch.baselineRevision !== baselineHash || batch.candidateRevision !== hash)
|
|
306
|
+
throw new Error('Skill evaluation does not match the active baseline and candidate digests.')
|
|
307
|
+
if (
|
|
308
|
+
batch.baseline.length > 128 ||
|
|
309
|
+
batch.candidate.length > 128 ||
|
|
310
|
+
batch.attributions.length > 128
|
|
311
|
+
)
|
|
312
|
+
throw new Error('Resident skill evaluation is bounded to 64 tasks per round.')
|
|
313
|
+
// Recorded evidence must consistently identify success and complete measurements.
|
|
314
|
+
for (const trial of [...batch.baseline, ...batch.candidate]) {
|
|
315
|
+
if (
|
|
316
|
+
trial.result.passed !== (trial.result.status === 'passed') ||
|
|
317
|
+
(trial.result.status === 'passed' && trial.result.failedGates?.length)
|
|
318
|
+
)
|
|
319
|
+
throw new Error('Inconsistent recorded skill evaluation outcome.')
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const review = reviewHarnessCandidate(
|
|
323
|
+
evaluation.verification,
|
|
324
|
+
evaluation.confirmation,
|
|
325
|
+
protection,
|
|
326
|
+
)
|
|
327
|
+
if (review.decision !== 'accept')
|
|
328
|
+
throw new Error(`Resident skill promotion ${review.decision}: ${review.reason}`)
|
|
329
|
+
const skill: ResidentLearnedSkill = {
|
|
330
|
+
...candidate,
|
|
331
|
+
hash,
|
|
332
|
+
evidence,
|
|
333
|
+
verification: {
|
|
334
|
+
baselineHash,
|
|
335
|
+
candidateHash: hash,
|
|
336
|
+
evidenceDigest: createHash('sha256')
|
|
337
|
+
.update(JSON.stringify({ ...evaluation, protection }))
|
|
338
|
+
.digest('hex'),
|
|
339
|
+
verificationTasks: review.verification.tasks.length,
|
|
340
|
+
confirmationTasks: review.confirmation?.tasks.length ?? 0,
|
|
341
|
+
protection: {
|
|
342
|
+
verificationTasks: protection.verification.length,
|
|
343
|
+
confirmationTasks: protection.confirmation.length,
|
|
344
|
+
planDigest: createHash('sha256').update(JSON.stringify(protection)).digest('hex'),
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
}
|
|
348
|
+
const next = base(current, evidence)
|
|
349
|
+
return freezeResidentLearning({
|
|
350
|
+
...next,
|
|
351
|
+
skills: [...next.skills.filter((s) => s.name !== candidate.name), skill],
|
|
352
|
+
})
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/** Internal rollback appends a new learning version while preserving current profile values. */
|
|
356
|
+
export function restoreResidentSkill(
|
|
357
|
+
current: ResidentLearningState | undefined,
|
|
358
|
+
historical: ResidentLearningState | undefined,
|
|
359
|
+
skillName: string,
|
|
360
|
+
inputEvidence: ResidentLearningEvidence,
|
|
361
|
+
): ResidentLearningState {
|
|
362
|
+
name.parse(skillName)
|
|
363
|
+
if (!current?.skills.some((s) => s.name === skillName))
|
|
364
|
+
throw new Error('No active resident skill to roll back.')
|
|
365
|
+
const next = base(current, evidenceFor(current, inputEvidence))
|
|
366
|
+
const previous = historical
|
|
367
|
+
? freezeResidentLearning(historical).skills.find((s) => s.name === skillName)
|
|
368
|
+
: undefined
|
|
369
|
+
return freezeResidentLearning({
|
|
370
|
+
...next,
|
|
371
|
+
skills: [...next.skills.filter((s) => s.name !== skillName), ...(previous ? [previous] : [])],
|
|
372
|
+
})
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/** @experimental Exact skill selection and a character cap, independent of provider token budgets. */
|
|
376
|
+
export interface ResidentLearningProjectionOptions {
|
|
377
|
+
readonly maxChars: number
|
|
378
|
+
readonly skillNames: readonly string[]
|
|
379
|
+
/** Defaults to task guidance. Exploration policies never enter ordinary task context. */
|
|
380
|
+
readonly purpose?: 'task' | 'exploration'
|
|
381
|
+
/** Fresh host observations for this projection; absent/mismatched dependencies withhold guidance. */
|
|
382
|
+
readonly sources?: readonly ResidentLearningSource[]
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/** @experimental Omitted entries are counted; no partial skill instruction is emitted. */
|
|
386
|
+
export interface ResidentLearningProjection {
|
|
387
|
+
readonly text: string
|
|
388
|
+
readonly revision: number | null
|
|
389
|
+
readonly includedSkills: readonly string[]
|
|
390
|
+
readonly omitted: number
|
|
391
|
+
readonly withheldSkills: readonly {
|
|
392
|
+
readonly name: string
|
|
393
|
+
readonly reason: 'changed-source' | 'unverified-source' | 'different-purpose'
|
|
394
|
+
readonly sourceKeys: readonly string[]
|
|
395
|
+
}[]
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** @experimental Bounded context data; never registers tools, loads files or executes a skill. */
|
|
399
|
+
export function projectResidentLearning(
|
|
400
|
+
current: ResidentLearningState | undefined,
|
|
401
|
+
options: ResidentLearningProjectionOptions,
|
|
402
|
+
): ResidentLearningProjection {
|
|
403
|
+
if (!Number.isSafeInteger(options.maxChars) || options.maxChars < 0 || options.maxChars > 64_000)
|
|
404
|
+
throw new TypeError('Resident learning context requires maxChars between 0 and 64000.')
|
|
405
|
+
const selected = z.array(name).max(16).parse(options.skillNames)
|
|
406
|
+
const purpose = z.enum(['task', 'exploration']).parse(options.purpose ?? 'task')
|
|
407
|
+
if (new Set(selected).size !== selected.length) throw new Error('Duplicate selected skill names.')
|
|
408
|
+
const sources = z
|
|
409
|
+
.array(sourceSchema)
|
|
410
|
+
.max(128)
|
|
411
|
+
.parse(options.sources ?? [])
|
|
412
|
+
if (new Set(sources.map((source) => source.key)).size !== sources.length)
|
|
413
|
+
throw new Error('Duplicate observed learning source keys.')
|
|
414
|
+
const observed = new Map(sources.map((source) => [source.key, source.revision]))
|
|
415
|
+
if (!current)
|
|
416
|
+
return Object.freeze({
|
|
417
|
+
text: '',
|
|
418
|
+
revision: null,
|
|
419
|
+
includedSkills: Object.freeze([]),
|
|
420
|
+
omitted: selected.length,
|
|
421
|
+
withheldSkills: Object.freeze([]),
|
|
422
|
+
})
|
|
423
|
+
const state = freezeResidentLearning(current)
|
|
424
|
+
const pieces: string[] = []
|
|
425
|
+
const includedSkills: string[] = []
|
|
426
|
+
const withheldSkills: ResidentLearningProjection['withheldSkills'][number][] = []
|
|
427
|
+
let omitted = 0
|
|
428
|
+
let length = 0
|
|
429
|
+
const add = (value: unknown): boolean => {
|
|
430
|
+
const part = JSON.stringify(value)
|
|
431
|
+
const size = part.length + (pieces.length ? 1 : 0)
|
|
432
|
+
if (length + size > options.maxChars) {
|
|
433
|
+
omitted++
|
|
434
|
+
return false
|
|
435
|
+
}
|
|
436
|
+
pieces.push(part)
|
|
437
|
+
length += size
|
|
438
|
+
return true
|
|
439
|
+
}
|
|
440
|
+
if (state.identity) add({ kind: 'self-description', ...state.identity })
|
|
441
|
+
for (const preference of state.preferences) add({ kind: 'preference', ...preference })
|
|
442
|
+
for (const skillName of selected) {
|
|
443
|
+
const skill = state.skills.find((s) => s.name === skillName)
|
|
444
|
+
if (!skill) {
|
|
445
|
+
omitted++
|
|
446
|
+
continue
|
|
447
|
+
}
|
|
448
|
+
if ((skill.purpose ?? 'task') !== purpose) {
|
|
449
|
+
omitted++
|
|
450
|
+
withheldSkills.push(
|
|
451
|
+
Object.freeze({
|
|
452
|
+
name: skill.name,
|
|
453
|
+
reason: 'different-purpose',
|
|
454
|
+
sourceKeys: Object.freeze([]),
|
|
455
|
+
}),
|
|
456
|
+
)
|
|
457
|
+
continue
|
|
458
|
+
}
|
|
459
|
+
const mismatched =
|
|
460
|
+
skill.sources?.filter((source) => observed.get(source.key) !== source.revision) ?? []
|
|
461
|
+
if (mismatched.length) {
|
|
462
|
+
omitted++
|
|
463
|
+
withheldSkills.push(
|
|
464
|
+
Object.freeze({
|
|
465
|
+
name: skill.name,
|
|
466
|
+
reason: mismatched.some((source) => observed.has(source.key))
|
|
467
|
+
? 'changed-source'
|
|
468
|
+
: 'unverified-source',
|
|
469
|
+
sourceKeys: Object.freeze(mismatched.map((source) => source.key)),
|
|
470
|
+
}),
|
|
471
|
+
)
|
|
472
|
+
continue
|
|
473
|
+
}
|
|
474
|
+
if (
|
|
475
|
+
add({
|
|
476
|
+
kind: 'evaluated-guidance',
|
|
477
|
+
name: skill.name,
|
|
478
|
+
description: skill.description,
|
|
479
|
+
body: skill.body,
|
|
480
|
+
hash: skill.hash,
|
|
481
|
+
evidence: skill.evidence,
|
|
482
|
+
})
|
|
483
|
+
)
|
|
484
|
+
includedSkills.push(skill.name)
|
|
485
|
+
}
|
|
486
|
+
return Object.freeze({
|
|
487
|
+
text: pieces.join('\n'),
|
|
488
|
+
revision: state.revision,
|
|
489
|
+
includedSkills: Object.freeze(includedSkills),
|
|
490
|
+
omitted,
|
|
491
|
+
withheldSkills: Object.freeze(withheldSkills),
|
|
492
|
+
})
|
|
493
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
2
|
+
import {
|
|
3
|
+
ResidentConflictError,
|
|
4
|
+
type ResidentDecision,
|
|
5
|
+
type ResidentExecutionStore,
|
|
6
|
+
type ResidentState,
|
|
7
|
+
} from './store.js'
|
|
8
|
+
|
|
9
|
+
/** @experimental Developer-owned step; bind providers, tools and budgets in the host. */
|
|
10
|
+
export type ResidentStep = (state: ResidentState, signal: AbortSignal) => Promise<ResidentDecision>
|
|
11
|
+
|
|
12
|
+
/** @experimental No model is invoked for an idle, terminal or unresolved resident. */
|
|
13
|
+
export type ResidentStepResult =
|
|
14
|
+
| { status: 'settled'; state: ResidentState }
|
|
15
|
+
| {
|
|
16
|
+
status: 'idle'
|
|
17
|
+
reason: 'not-due' | 'terminal' | 'unresolved' | 'contended'
|
|
18
|
+
state: ResidentState
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** @experimental A failed/aborted callback leaves its durable claim unresolved. */
|
|
22
|
+
export async function stepResident(
|
|
23
|
+
store: ResidentExecutionStore,
|
|
24
|
+
step: ResidentStep,
|
|
25
|
+
signal: AbortSignal,
|
|
26
|
+
now: () => number = Date.now,
|
|
27
|
+
): Promise<ResidentStepResult> {
|
|
28
|
+
signal.throwIfAborted()
|
|
29
|
+
const state = await store.read()
|
|
30
|
+
signal.throwIfAborted()
|
|
31
|
+
if (!state) throw new Error('Create the resident before running it.')
|
|
32
|
+
if (state.phase === 'running') return { status: 'idle', reason: 'unresolved', state }
|
|
33
|
+
if (state.phase !== 'waiting') return { status: 'idle', reason: 'terminal', state }
|
|
34
|
+
if (state.wakeAt === null || state.wakeAt > now())
|
|
35
|
+
return { status: 'idle', reason: 'not-due', state }
|
|
36
|
+
let claim: ResidentState
|
|
37
|
+
try {
|
|
38
|
+
claim = await store.claim(state, now())
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (!(error instanceof ResidentConflictError)) throw error
|
|
41
|
+
return {
|
|
42
|
+
status: 'idle',
|
|
43
|
+
reason: 'contended',
|
|
44
|
+
state: (await store.read()) ?? state,
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
signal.throwIfAborted()
|
|
48
|
+
const decision = await step(claim, signal)
|
|
49
|
+
signal.throwIfAborted()
|
|
50
|
+
return {
|
|
51
|
+
status: 'settled',
|
|
52
|
+
state: await store.settle(claim, decision, now()),
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** @experimental Bounded local driver; not a daemon, process recovery service or notification transport. */
|
|
57
|
+
export interface ResidentLoopOptions {
|
|
58
|
+
readonly store: ResidentExecutionStore
|
|
59
|
+
readonly step: ResidentStep
|
|
60
|
+
readonly signal: AbortSignal
|
|
61
|
+
/** Required finite admission cap for this invocation, independent of provider token limits. */
|
|
62
|
+
readonly maxSteps: number
|
|
63
|
+
/** Maximum single idle wait, default 60 seconds. Longer waits return control to the host. */
|
|
64
|
+
readonly maxIdleMs?: number
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @experimental Continue a pursuit without a new user message. Null wake times
|
|
69
|
+
* and terminal states stop immediately; cancellation also interrupts idle waits.
|
|
70
|
+
* An abort cannot undo callback effects or forcibly stop a callback ignoring its signal.
|
|
71
|
+
*/
|
|
72
|
+
export async function runResident(options: ResidentLoopOptions): Promise<ResidentStepResult> {
|
|
73
|
+
const maxIdleMs = options.maxIdleMs ?? 60_000
|
|
74
|
+
if (
|
|
75
|
+
!Number.isSafeInteger(options.maxSteps) ||
|
|
76
|
+
options.maxSteps < 1 ||
|
|
77
|
+
!Number.isSafeInteger(maxIdleMs) ||
|
|
78
|
+
maxIdleMs < 0 ||
|
|
79
|
+
maxIdleMs > 2_147_483_647
|
|
80
|
+
) {
|
|
81
|
+
throw new TypeError(
|
|
82
|
+
'Resident loop requires positive finite maxSteps and bounded nonnegative maxIdleMs.',
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
let admitted = 0
|
|
86
|
+
while (true) {
|
|
87
|
+
const result = await stepResident(options.store, options.step, options.signal)
|
|
88
|
+
if (result.status === 'settled') admitted++
|
|
89
|
+
if (admitted >= options.maxSteps) return result
|
|
90
|
+
const { state } = result
|
|
91
|
+
if (
|
|
92
|
+
state.phase !== 'waiting' ||
|
|
93
|
+
state.wakeAt === null ||
|
|
94
|
+
(result.status === 'idle' && result.reason !== 'not-due')
|
|
95
|
+
)
|
|
96
|
+
return result
|
|
97
|
+
const delay = Math.max(0, state.wakeAt - Date.now())
|
|
98
|
+
if (delay > maxIdleMs) return result
|
|
99
|
+
await sleep(Math.max(1, delay), undefined, { signal: options.signal })
|
|
100
|
+
}
|
|
101
|
+
}
|