@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,205 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import type { ResidentAgendaState } from './agenda.js'
|
|
3
|
+
|
|
4
|
+
const boundedText = z.string().trim().min(1).max(256)
|
|
5
|
+
const cost = z.number().finite().nonnegative()
|
|
6
|
+
export const residentObservationSchema = z.object({
|
|
7
|
+
evidenceKey: boundedText,
|
|
8
|
+
source: boundedText,
|
|
9
|
+
progress: z.number().finite().min(0).max(1),
|
|
10
|
+
/** All observations and policy costs use the same host-defined resource unit. */
|
|
11
|
+
costUnits: cost.nullable(),
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
/** @experimental Host-validated outcome and measured resource use, never model self-confidence. */
|
|
15
|
+
export type ResidentObservation = Readonly<z.infer<typeof residentObservationSchema>>
|
|
16
|
+
|
|
17
|
+
export const residentFeedbackSchema = z.object({
|
|
18
|
+
bestProgress: z.number().finite().min(0).max(1),
|
|
19
|
+
hasUnobservedSteps: z.boolean().default(false),
|
|
20
|
+
stagnantSteps: z.number().int().nonnegative().safe(),
|
|
21
|
+
observations: z
|
|
22
|
+
.array(
|
|
23
|
+
residentObservationSchema.extend({
|
|
24
|
+
gain: z.number().finite().min(0).max(1),
|
|
25
|
+
step: z.number().int().positive().safe(),
|
|
26
|
+
}),
|
|
27
|
+
)
|
|
28
|
+
.min(1)
|
|
29
|
+
.max(8),
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
/** @experimental Last eight observations; best progress and stagnation survive eviction. */
|
|
33
|
+
export type ResidentFeedback = Readonly<
|
|
34
|
+
Omit<z.infer<typeof residentFeedbackSchema>, 'observations'>
|
|
35
|
+
> & {
|
|
36
|
+
readonly observations: readonly Readonly<
|
|
37
|
+
z.infer<typeof residentFeedbackSchema>['observations'][number]
|
|
38
|
+
>[]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function observeResidentStep(
|
|
42
|
+
previous: ResidentFeedback | undefined,
|
|
43
|
+
input: ResidentObservation,
|
|
44
|
+
step: number,
|
|
45
|
+
): ResidentFeedback {
|
|
46
|
+
const observation = residentObservationSchema.parse(input)
|
|
47
|
+
const best = previous?.bestProgress ?? 0
|
|
48
|
+
const duplicate = previous?.observations.some(
|
|
49
|
+
(item) => item.evidenceKey === observation.evidenceKey,
|
|
50
|
+
)
|
|
51
|
+
// Rewording evidence, regression and recovery to an old best earn no credit.
|
|
52
|
+
const gain = duplicate ? 0 : Math.max(0, observation.progress - best)
|
|
53
|
+
return freezeResidentFeedback(
|
|
54
|
+
residentFeedbackSchema.parse({
|
|
55
|
+
bestProgress: best + gain,
|
|
56
|
+
hasUnobservedSteps:
|
|
57
|
+
(previous?.hasUnobservedSteps ?? false) ||
|
|
58
|
+
step !== (previous?.observations.at(-1)?.step ?? 0) + 1,
|
|
59
|
+
stagnantSteps: gain > 0 ? 0 : (previous?.stagnantSteps ?? 0) + 1,
|
|
60
|
+
observations: [...(previous?.observations ?? []), { ...observation, gain, step }].slice(-8),
|
|
61
|
+
}),
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function freezeResidentFeedback(value: ResidentFeedback): ResidentFeedback {
|
|
66
|
+
return Object.freeze({
|
|
67
|
+
...value,
|
|
68
|
+
observations: Object.freeze(value.observations.map((item) => Object.freeze({ ...item }))),
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** @experimental Policy units are chosen by the host; scores are heuristics, not probabilities. */
|
|
73
|
+
export interface ResidentSelectionConfig {
|
|
74
|
+
readonly progressValue: number
|
|
75
|
+
readonly initialExpectedProgress: number
|
|
76
|
+
readonly initialExpectedCost: number
|
|
77
|
+
readonly maxStagnantSteps?: number
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** @experimental Explainable inputs for a single selection; unknown cost is not zero. */
|
|
81
|
+
export interface ResidentCandidate {
|
|
82
|
+
readonly pursuitId: string
|
|
83
|
+
readonly reason:
|
|
84
|
+
| 'eligible'
|
|
85
|
+
| 'not-due'
|
|
86
|
+
| 'missing-observation'
|
|
87
|
+
| 'stalled'
|
|
88
|
+
| 'unknown-cost'
|
|
89
|
+
| 'nonpositive-value'
|
|
90
|
+
readonly expectedGain: number | null
|
|
91
|
+
readonly expectedCost: number | null
|
|
92
|
+
readonly score: number | null
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** @experimental Choice is bound to the whole agenda revision used to compute it. */
|
|
96
|
+
export interface ResidentSelection {
|
|
97
|
+
readonly agendaRevision: number
|
|
98
|
+
readonly pursuitId: string | null
|
|
99
|
+
readonly reason: 'selected' | 'paused' | 'unresolved' | 'no-useful-work'
|
|
100
|
+
readonly candidates: readonly ResidentCandidate[]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** @experimental Pure local selection; perform inference inside budgeted steps, not here. */
|
|
104
|
+
export type ResidentSelector = (agenda: ResidentAgendaState, now: number) => ResidentSelection
|
|
105
|
+
|
|
106
|
+
function meanObservedCost(observations: readonly ResidentObservation[]): number {
|
|
107
|
+
// Null costs are rejected before this function. Scale by the largest finite
|
|
108
|
+
// observation: the intermediate sum is at most eight, even near MAX_VALUE.
|
|
109
|
+
const scale = Math.max(...observations.map((item) => item.costUnits ?? 0))
|
|
110
|
+
if (scale === 0) return 0
|
|
111
|
+
return (
|
|
112
|
+
(observations.reduce((total, item) => total + (item.costUnits ?? 0) / scale, 0) /
|
|
113
|
+
observations.length) *
|
|
114
|
+
scale
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @experimental Cost-aware continuation with an explicit abstention choice.
|
|
120
|
+
* This is a measured-progress heuristic, not Bayesian value of computation.
|
|
121
|
+
* A finite bootstrap allowance permits delayed payoffs but may stop too early.
|
|
122
|
+
*/
|
|
123
|
+
export function createResidentSelector(config: ResidentSelectionConfig): ResidentSelector {
|
|
124
|
+
const policy = z
|
|
125
|
+
.object({
|
|
126
|
+
progressValue: z.number().finite().positive(),
|
|
127
|
+
initialExpectedProgress: z.number().finite().positive().max(1),
|
|
128
|
+
initialExpectedCost: cost,
|
|
129
|
+
maxStagnantSteps: z.number().int().min(1).max(32).default(2),
|
|
130
|
+
})
|
|
131
|
+
.parse(config)
|
|
132
|
+
return (agenda, now) => {
|
|
133
|
+
z.number().int().nonnegative().safe().parse(now)
|
|
134
|
+
const finish = (
|
|
135
|
+
pursuitId: string | null,
|
|
136
|
+
reason: ResidentSelection['reason'],
|
|
137
|
+
candidates: ResidentCandidate[],
|
|
138
|
+
): ResidentSelection =>
|
|
139
|
+
Object.freeze({
|
|
140
|
+
agendaRevision: agenda.revision,
|
|
141
|
+
pursuitId,
|
|
142
|
+
reason,
|
|
143
|
+
candidates: Object.freeze(candidates.map((candidate) => Object.freeze(candidate))),
|
|
144
|
+
})
|
|
145
|
+
if (agenda.paused) return finish(null, 'paused', [])
|
|
146
|
+
if (agenda.pursuits.some((p) => p.state.phase === 'running'))
|
|
147
|
+
return finish(null, 'unresolved', [])
|
|
148
|
+
const candidates = agenda.pursuits.map((p): ResidentCandidate => {
|
|
149
|
+
const reject = (reason: ResidentCandidate['reason']): ResidentCandidate => ({
|
|
150
|
+
pursuitId: p.id,
|
|
151
|
+
reason,
|
|
152
|
+
expectedGain: null,
|
|
153
|
+
expectedCost: null,
|
|
154
|
+
score: null,
|
|
155
|
+
})
|
|
156
|
+
if (p.state.phase !== 'waiting' || p.state.wakeAt === null || p.state.wakeAt > now)
|
|
157
|
+
return reject('not-due')
|
|
158
|
+
if (
|
|
159
|
+
p.state.stepsAdmitted > 0 &&
|
|
160
|
+
(!p.feedback ||
|
|
161
|
+
p.feedback.hasUnobservedSteps ||
|
|
162
|
+
p.feedback.observations.at(-1)?.step !== p.state.stepsAdmitted)
|
|
163
|
+
)
|
|
164
|
+
return reject('missing-observation')
|
|
165
|
+
const feedback = p.feedback
|
|
166
|
+
if (feedback && feedback.stagnantSteps >= policy.maxStagnantSteps) return reject('stalled')
|
|
167
|
+
if (feedback?.observations.some((item) => item.costUnits === null))
|
|
168
|
+
return reject('unknown-cost')
|
|
169
|
+
const recent = feedback?.observations ?? []
|
|
170
|
+
const totalGain = recent.reduce((total, item) => total + item.gain, 0)
|
|
171
|
+
const bootstrap = p.state.stepsAdmitted < policy.maxStagnantSteps && totalGain === 0
|
|
172
|
+
const expectedGain =
|
|
173
|
+
recent.length === 0 || bootstrap
|
|
174
|
+
? policy.initialExpectedProgress
|
|
175
|
+
: (totalGain + policy.initialExpectedProgress) / (recent.length + 1)
|
|
176
|
+
const expectedCost =
|
|
177
|
+
recent.length === 0 ? policy.initialExpectedCost : meanObservedCost(recent)
|
|
178
|
+
const score = policy.progressValue * expectedGain - expectedCost
|
|
179
|
+
return {
|
|
180
|
+
pursuitId: p.id,
|
|
181
|
+
reason: score > 0 ? 'eligible' : 'nonpositive-value',
|
|
182
|
+
expectedGain,
|
|
183
|
+
expectedCost,
|
|
184
|
+
score,
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
const eligible = candidates.filter((candidate) => candidate.reason === 'eligible')
|
|
188
|
+
eligible.sort((a, b) => {
|
|
189
|
+
const left = agenda.pursuits.find((p) => p.id === a.pursuitId)
|
|
190
|
+
const right = agenda.pursuits.find((p) => p.id === b.pursuitId)
|
|
191
|
+
if (!left || !right) throw new Error('Resident candidate is missing.')
|
|
192
|
+
return (
|
|
193
|
+
(b.score ?? 0) - (a.score ?? 0) ||
|
|
194
|
+
left.state.stepsAdmitted - right.state.stepsAdmitted ||
|
|
195
|
+
(left.state.wakeAt ?? 0) - (right.state.wakeAt ?? 0) ||
|
|
196
|
+
a.pursuitId.localeCompare(b.pursuitId)
|
|
197
|
+
)
|
|
198
|
+
})
|
|
199
|
+
return finish(
|
|
200
|
+
eligible[0]?.pursuitId ?? null,
|
|
201
|
+
eligible.length ? 'selected' : 'no-useful-work',
|
|
202
|
+
candidates,
|
|
203
|
+
)
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { createHash, randomUUID } 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 HarnessReview,
|
|
9
|
+
type HarnessVerificationBatch,
|
|
10
|
+
reviewHarnessCandidate,
|
|
11
|
+
} from '../../eval/harness-verification.js'
|
|
12
|
+
import type { DiskResidentAgenda } from './agenda.js'
|
|
13
|
+
import {
|
|
14
|
+
type ResidentLearningEvidence,
|
|
15
|
+
type ResidentSkillCandidate,
|
|
16
|
+
hashResidentSkill,
|
|
17
|
+
normalizeResidentSkill,
|
|
18
|
+
promoteResidentSkill,
|
|
19
|
+
residentLearningEvidenceSchema,
|
|
20
|
+
} from './learning.js'
|
|
21
|
+
import { ResidentConflictError } from './store.js'
|
|
22
|
+
|
|
23
|
+
/** @experimental One explicitly requested experiment; callbacks own inference and evaluation. */
|
|
24
|
+
export type ResidentLearningStage = 'explore' | 'generate' | 'verification' | 'confirmation'
|
|
25
|
+
|
|
26
|
+
const receiptSchema = z.object({
|
|
27
|
+
runId: z.string().uuid(),
|
|
28
|
+
tokens: z.number().int().nonnegative().safe().nullable(),
|
|
29
|
+
costUsd: z.number().nonnegative().finite().nullable(),
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
/** @experimental One non-overlapping execution's usage, including its retries. Null is unknown. */
|
|
33
|
+
export type ResidentLearningReceipt = Readonly<z.infer<typeof receiptSchema>>
|
|
34
|
+
|
|
35
|
+
/** @experimental Recorded values are lower bounds when a receipt or stage is incomplete. */
|
|
36
|
+
export interface ResidentLearningConsumption {
|
|
37
|
+
readonly tokens: number
|
|
38
|
+
readonly costUsd: number
|
|
39
|
+
readonly receipts: number
|
|
40
|
+
readonly unknownTokens: number
|
|
41
|
+
readonly unknownCosts: number
|
|
42
|
+
readonly unfinishedStages: number
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** @experimental Append in sequence to host-owned durable storage before acknowledging. */
|
|
46
|
+
export interface ResidentLearningCycleEvent {
|
|
47
|
+
readonly cycleId: string
|
|
48
|
+
readonly sequence: number
|
|
49
|
+
readonly kind:
|
|
50
|
+
| 'started'
|
|
51
|
+
| 'stage-started'
|
|
52
|
+
| 'stage-finished'
|
|
53
|
+
| 'usage'
|
|
54
|
+
| 'exploration'
|
|
55
|
+
| 'candidate'
|
|
56
|
+
| 'evaluation'
|
|
57
|
+
| 'activation-requested'
|
|
58
|
+
| 'finished'
|
|
59
|
+
readonly stage?: ResidentLearningStage
|
|
60
|
+
readonly data: Readonly<Record<string, unknown>>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** @experimental Use this stage's signal for every owned run; await every usage append. */
|
|
64
|
+
export interface ResidentLearningCycleContext {
|
|
65
|
+
readonly cycleId: string
|
|
66
|
+
readonly stage: ResidentLearningStage
|
|
67
|
+
readonly signal: AbortSignal
|
|
68
|
+
/** Planning allowance, not a reservation or a cap on a callback's in-flight work. */
|
|
69
|
+
readonly remainingUnits: number
|
|
70
|
+
recordUsage(receipt: ResidentLearningReceipt): Promise<void>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** @experimental Original failure and active baseline; never contains confirmation tasks. */
|
|
74
|
+
export interface ResidentLearningExplorationContext extends ResidentLearningCycleContext {
|
|
75
|
+
readonly skillName: string
|
|
76
|
+
/** Admitted by the host before generation; cannot be changed by a candidate. */
|
|
77
|
+
readonly purpose?: 'task' | 'exploration'
|
|
78
|
+
readonly failure: Readonly<{ evidence: ResidentLearningEvidence; trace: string }>
|
|
79
|
+
readonly baseline: ResidentSkillCandidate | null
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** @experimental Host-retained environment observations, not a model's claim of success. */
|
|
83
|
+
export interface ResidentLearningExploration {
|
|
84
|
+
readonly evidence: ResidentLearningEvidence
|
|
85
|
+
readonly trace: string
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** @experimental Generation sees completed exploration, never held-out evaluation cases. */
|
|
89
|
+
export interface ResidentLearningGenerationContext extends ResidentLearningExplorationContext {
|
|
90
|
+
readonly exploration?: Readonly<ResidentLearningExploration>
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** @experimental The host supplies independently scored, retained traces for these exact revisions. */
|
|
94
|
+
export interface ResidentLearningEvaluationContext extends ResidentLearningCycleContext {
|
|
95
|
+
readonly baseline: ResidentSkillCandidate | null
|
|
96
|
+
readonly candidate: ResidentSkillCandidate
|
|
97
|
+
readonly baselineRevision: string
|
|
98
|
+
readonly candidateRevision: string
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** @experimental No provider, default background loop or executable-code activation is installed. */
|
|
102
|
+
export interface ResidentLearningCycleOptions {
|
|
103
|
+
/** Omitted means task guidance. Explicitly select exploration to improve an explorer policy. */
|
|
104
|
+
readonly purpose?: 'task' | 'exploration'
|
|
105
|
+
/** Fixed before generation; both rounds must preserve every named task. */
|
|
106
|
+
readonly protection: HarnessProtectionPlan
|
|
107
|
+
readonly agenda: Pick<DiskResidentAgenda, 'read' | 'promoteSkill'>
|
|
108
|
+
readonly skillName: string
|
|
109
|
+
readonly failure: { readonly evidence: ResidentLearningEvidence; readonly trace: string }
|
|
110
|
+
readonly parentCycleId?: string
|
|
111
|
+
readonly signal: AbortSignal
|
|
112
|
+
/** Stops subsequent stages/activation after observed excess; callbacks enforce in-flight limits. */
|
|
113
|
+
readonly resources: { readonly unit: 'tokens' | 'usd'; readonly maxUnits: number }
|
|
114
|
+
readonly record: (event: ResidentLearningCycleEvent) => Promise<void>
|
|
115
|
+
/** Optional active tool exploration before synthesis; the host retains actual observations. */
|
|
116
|
+
readonly explore?: (context: ResidentLearningExplorationContext) => Promise<{
|
|
117
|
+
readonly observations: ResidentLearningExploration
|
|
118
|
+
readonly usageComplete: boolean
|
|
119
|
+
}>
|
|
120
|
+
readonly generate: (context: ResidentLearningGenerationContext) => Promise<{
|
|
121
|
+
readonly candidate: ResidentSkillCandidate
|
|
122
|
+
/** All executions, including failures and side calls, have supplied receipts. */
|
|
123
|
+
readonly usageComplete: boolean
|
|
124
|
+
}>
|
|
125
|
+
readonly evaluate: (context: ResidentLearningEvaluationContext) => Promise<{
|
|
126
|
+
readonly batch: HarnessVerificationBatch
|
|
127
|
+
readonly usageComplete: boolean
|
|
128
|
+
}>
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** @experimental An ambiguous activation must be inspected, never automatically replayed. */
|
|
132
|
+
export interface ResidentLearningCycleResult {
|
|
133
|
+
readonly cycleId: string
|
|
134
|
+
readonly status:
|
|
135
|
+
| 'activated'
|
|
136
|
+
| 'rejected'
|
|
137
|
+
| 'inconclusive'
|
|
138
|
+
| 'conflict'
|
|
139
|
+
| 'cancelled'
|
|
140
|
+
| 'failed'
|
|
141
|
+
| 'activation-unknown'
|
|
142
|
+
readonly reason: string
|
|
143
|
+
readonly candidate?: ResidentSkillCandidate
|
|
144
|
+
readonly candidateRevision?: string
|
|
145
|
+
readonly baselineRevision?: string
|
|
146
|
+
readonly agendaRevision?: number
|
|
147
|
+
readonly review?: HarnessReview
|
|
148
|
+
readonly consumption: ResidentLearningConsumption
|
|
149
|
+
readonly auditComplete: boolean
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @experimental Generate one candidate, independently verify and confirm it, then
|
|
154
|
+
* activate through the existing exact-revision transaction. No internal inference
|
|
155
|
+
* loop, retry or model-generated success claim replaces the host's evaluator.
|
|
156
|
+
*/
|
|
157
|
+
export async function runResidentLearningCycle(
|
|
158
|
+
options: ResidentLearningCycleOptions,
|
|
159
|
+
): Promise<ResidentLearningCycleResult> {
|
|
160
|
+
const protection = normalizeHarnessProtection(options.protection)
|
|
161
|
+
const purpose = z.enum(['task', 'exploration']).parse(options.purpose ?? 'task')
|
|
162
|
+
const purposeContext = options.purpose === undefined ? {} : { purpose }
|
|
163
|
+
const skillName = z
|
|
164
|
+
.string()
|
|
165
|
+
.regex(/^[a-z0-9][a-z0-9_-]{0,63}$/)
|
|
166
|
+
.parse(options.skillName)
|
|
167
|
+
const failure = Object.freeze({
|
|
168
|
+
evidence: Object.freeze(residentLearningEvidenceSchema.parse(options.failure.evidence)),
|
|
169
|
+
trace: z.string().trim().min(1).max(32_000).parse(options.failure.trace),
|
|
170
|
+
})
|
|
171
|
+
const resources = z
|
|
172
|
+
.object({ unit: z.enum(['tokens', 'usd']), maxUnits: z.number().positive().finite() })
|
|
173
|
+
.parse(options.resources)
|
|
174
|
+
const parentCycleId =
|
|
175
|
+
options.parentCycleId === undefined ? undefined : z.string().uuid().parse(options.parentCycleId)
|
|
176
|
+
const cycleId = randomUUID()
|
|
177
|
+
const receipts = new Map<string, ResidentLearningReceipt>()
|
|
178
|
+
let sequence = 0
|
|
179
|
+
let pending = Promise.resolve()
|
|
180
|
+
let auditComplete = true
|
|
181
|
+
let unfinishedStages = 0
|
|
182
|
+
let candidate: ResidentSkillCandidate | undefined
|
|
183
|
+
let candidateRevision: string | undefined
|
|
184
|
+
let baselineRevision: string | undefined
|
|
185
|
+
let review: HarnessReview | undefined
|
|
186
|
+
let activatedRevision: number | undefined
|
|
187
|
+
let activationRequested = false
|
|
188
|
+
const usage = (): ResidentLearningConsumption => ({
|
|
189
|
+
tokens: [...receipts.values()].reduce((n, r) => n + (r.tokens ?? 0), 0),
|
|
190
|
+
costUsd: [...receipts.values()].reduce((n, r) => n + (r.costUsd ?? 0), 0),
|
|
191
|
+
receipts: receipts.size,
|
|
192
|
+
unknownTokens: [...receipts.values()].filter((r) => r.tokens === null).length,
|
|
193
|
+
unknownCosts: [...receipts.values()].filter((r) => r.costUsd === null).length,
|
|
194
|
+
unfinishedStages,
|
|
195
|
+
})
|
|
196
|
+
const append = (
|
|
197
|
+
kind: ResidentLearningCycleEvent['kind'],
|
|
198
|
+
data: Record<string, unknown>,
|
|
199
|
+
stage?: ResidentLearningStage,
|
|
200
|
+
) => {
|
|
201
|
+
const event = Object.freeze({
|
|
202
|
+
cycleId,
|
|
203
|
+
sequence: ++sequence,
|
|
204
|
+
kind,
|
|
205
|
+
...(stage ? { stage } : {}),
|
|
206
|
+
data: structuredClone(data),
|
|
207
|
+
})
|
|
208
|
+
pending = pending
|
|
209
|
+
.then(() => options.record(event))
|
|
210
|
+
.catch((error) => {
|
|
211
|
+
auditComplete = false
|
|
212
|
+
throw error
|
|
213
|
+
})
|
|
214
|
+
return pending
|
|
215
|
+
}
|
|
216
|
+
const result = (
|
|
217
|
+
status: ResidentLearningCycleResult['status'],
|
|
218
|
+
reason: string,
|
|
219
|
+
): ResidentLearningCycleResult => ({
|
|
220
|
+
cycleId,
|
|
221
|
+
status,
|
|
222
|
+
reason,
|
|
223
|
+
...(candidate ? { candidate, candidateRevision } : {}),
|
|
224
|
+
...(baselineRevision ? { baselineRevision } : {}),
|
|
225
|
+
...(review ? { review } : {}),
|
|
226
|
+
...(activatedRevision !== undefined ? { agendaRevision: activatedRevision } : {}),
|
|
227
|
+
consumption: usage(),
|
|
228
|
+
auditComplete,
|
|
229
|
+
})
|
|
230
|
+
const resourceProblem = (needsWork = false): string | null => {
|
|
231
|
+
const measured = usage()
|
|
232
|
+
if (
|
|
233
|
+
unfinishedStages ||
|
|
234
|
+
(resources.unit === 'tokens' ? measured.unknownTokens : measured.unknownCosts)
|
|
235
|
+
)
|
|
236
|
+
return `Incomplete ${resources.unit} evidence prevents further learning stages or activation.`
|
|
237
|
+
if ((resources.unit === 'tokens' ? measured.tokens : measured.costUsd) > resources.maxUnits)
|
|
238
|
+
return 'Recorded experiment consumption exceeds the declared resource allowance.'
|
|
239
|
+
if (
|
|
240
|
+
needsWork &&
|
|
241
|
+
(resources.unit === 'tokens' ? measured.tokens : measured.costUsd) === resources.maxUnits
|
|
242
|
+
)
|
|
243
|
+
return 'The recorded resource allowance is exhausted before the next stage.'
|
|
244
|
+
return null
|
|
245
|
+
}
|
|
246
|
+
const execute = async (): Promise<ResidentLearningCycleResult> => {
|
|
247
|
+
options.signal.throwIfAborted()
|
|
248
|
+
const snapshot = structuredClone(await options.agenda.read())
|
|
249
|
+
if (!snapshot) throw new Error('No resident agenda exists for this learning cycle.')
|
|
250
|
+
if (snapshot.paused || snapshot.pursuits.some((p) => p.state.phase === 'running'))
|
|
251
|
+
throw new Error('Resident learning requires an unpaused agenda without running pursuits.')
|
|
252
|
+
const current = snapshot.learning?.skills.find((s) => s.name === skillName)
|
|
253
|
+
if (current && (current.purpose ?? 'task') !== purpose)
|
|
254
|
+
throw new Error(
|
|
255
|
+
'The active skill has a different learning purpose; use a distinct skill name.',
|
|
256
|
+
)
|
|
257
|
+
const baseline = current ? normalizeResidentSkill(current) : null
|
|
258
|
+
baselineRevision = baseline ? hashResidentSkill(baseline) : 'none'
|
|
259
|
+
await append('started', {
|
|
260
|
+
tenantId: snapshot.tenantId,
|
|
261
|
+
agentKey: snapshot.agentKey,
|
|
262
|
+
agendaRevision: snapshot.revision,
|
|
263
|
+
baselineRevision,
|
|
264
|
+
skillName,
|
|
265
|
+
...purposeContext,
|
|
266
|
+
failure,
|
|
267
|
+
resources,
|
|
268
|
+
protection,
|
|
269
|
+
...(options.explore ? { explorationEnabled: true } : {}),
|
|
270
|
+
...(parentCycleId ? { parentCycleId } : {}),
|
|
271
|
+
})
|
|
272
|
+
const check = async () => {
|
|
273
|
+
options.signal.throwIfAborted()
|
|
274
|
+
const latest = await options.agenda.read()
|
|
275
|
+
options.signal.throwIfAborted()
|
|
276
|
+
if (
|
|
277
|
+
!latest ||
|
|
278
|
+
latest.tenantId !== snapshot.tenantId ||
|
|
279
|
+
latest.agentKey !== snapshot.agentKey ||
|
|
280
|
+
latest.revision !== snapshot.revision
|
|
281
|
+
)
|
|
282
|
+
throw new ResidentConflictError()
|
|
283
|
+
}
|
|
284
|
+
const stage = async <T extends { usageComplete: boolean }>(
|
|
285
|
+
name: ResidentLearningStage,
|
|
286
|
+
callback: (context: ResidentLearningCycleContext) => Promise<T>,
|
|
287
|
+
): Promise<T> => {
|
|
288
|
+
await check()
|
|
289
|
+
await append('stage-started', {}, name)
|
|
290
|
+
await check()
|
|
291
|
+
unfinishedStages++
|
|
292
|
+
let open = true
|
|
293
|
+
let receiptFailure: unknown
|
|
294
|
+
const before = receipts.size
|
|
295
|
+
try {
|
|
296
|
+
const measured = usage()
|
|
297
|
+
const context: ResidentLearningCycleContext = Object.freeze({
|
|
298
|
+
cycleId,
|
|
299
|
+
stage: name,
|
|
300
|
+
signal: options.signal,
|
|
301
|
+
remainingUnits: Math.max(
|
|
302
|
+
0,
|
|
303
|
+
resources.maxUnits - (resources.unit === 'tokens' ? measured.tokens : measured.costUsd),
|
|
304
|
+
),
|
|
305
|
+
recordUsage: async (input: ResidentLearningReceipt) => {
|
|
306
|
+
try {
|
|
307
|
+
if (!open) throw new Error('A closed learning stage cannot record new usage.')
|
|
308
|
+
const receipt = Object.freeze(receiptSchema.parse(input))
|
|
309
|
+
const id = receipt.runId.toLowerCase()
|
|
310
|
+
if (receipts.has(id)) throw new Error('Duplicate learning execution receipt.')
|
|
311
|
+
if (receipts.size >= 1024) throw new Error('Learning cycle receipt bound exceeded.')
|
|
312
|
+
const totals = usage()
|
|
313
|
+
if (
|
|
314
|
+
!Number.isSafeInteger(totals.tokens + (receipt.tokens ?? 0)) ||
|
|
315
|
+
!Number.isFinite(totals.costUsd + (receipt.costUsd ?? 0))
|
|
316
|
+
)
|
|
317
|
+
throw new Error('Learning cycle consumption overflow.')
|
|
318
|
+
receipts.set(id, receipt)
|
|
319
|
+
await append('usage', { receipt }, name)
|
|
320
|
+
} catch (error) {
|
|
321
|
+
receiptFailure = error
|
|
322
|
+
throw error
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
})
|
|
326
|
+
const value = await callback(context)
|
|
327
|
+
open = false
|
|
328
|
+
await pending
|
|
329
|
+
if (receiptFailure) throw receiptFailure
|
|
330
|
+
options.signal.throwIfAborted()
|
|
331
|
+
if (value.usageComplete === true && receipts.size > before) unfinishedStages--
|
|
332
|
+
await append(
|
|
333
|
+
'stage-finished',
|
|
334
|
+
{
|
|
335
|
+
usageComplete: value.usageComplete === true && receipts.size > before,
|
|
336
|
+
consumption: usage(),
|
|
337
|
+
},
|
|
338
|
+
name,
|
|
339
|
+
)
|
|
340
|
+
return value
|
|
341
|
+
} finally {
|
|
342
|
+
open = false
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
let exploration: Readonly<ResidentLearningExploration> | undefined
|
|
346
|
+
if (options.explore) {
|
|
347
|
+
const explore = options.explore
|
|
348
|
+
const observed = await stage('explore', (context) =>
|
|
349
|
+
explore(Object.freeze({ ...context, skillName, ...purposeContext, failure, baseline })),
|
|
350
|
+
)
|
|
351
|
+
exploration = Object.freeze({
|
|
352
|
+
evidence: Object.freeze(
|
|
353
|
+
residentLearningEvidenceSchema.parse(observed.observations.evidence),
|
|
354
|
+
),
|
|
355
|
+
trace: z.string().trim().min(1).max(32_000).parse(observed.observations.trace),
|
|
356
|
+
})
|
|
357
|
+
await append(
|
|
358
|
+
'exploration',
|
|
359
|
+
{
|
|
360
|
+
observations: exploration,
|
|
361
|
+
digest: createHash('sha256').update(JSON.stringify(exploration)).digest('hex'),
|
|
362
|
+
},
|
|
363
|
+
'explore',
|
|
364
|
+
)
|
|
365
|
+
const problem = resourceProblem(true)
|
|
366
|
+
if (problem) return result('inconclusive', problem)
|
|
367
|
+
}
|
|
368
|
+
const generated = await stage('generate', (context) =>
|
|
369
|
+
options.generate(
|
|
370
|
+
Object.freeze({
|
|
371
|
+
...context,
|
|
372
|
+
skillName,
|
|
373
|
+
...purposeContext,
|
|
374
|
+
failure,
|
|
375
|
+
baseline,
|
|
376
|
+
...(exploration ? { exploration } : {}),
|
|
377
|
+
}),
|
|
378
|
+
),
|
|
379
|
+
)
|
|
380
|
+
candidateRevision = hashResidentSkill(generated.candidate)
|
|
381
|
+
candidate = normalizeResidentSkill(generated.candidate)
|
|
382
|
+
if ((candidate.purpose ?? 'task') !== purpose)
|
|
383
|
+
throw new Error('Generated skill purpose does not match the host-admitted learning purpose.')
|
|
384
|
+
if (candidate.name !== skillName)
|
|
385
|
+
throw new Error('Generated guidance must retain the requested skill name.')
|
|
386
|
+
await append('candidate', { candidate, candidateRevision, baselineRevision })
|
|
387
|
+
if (candidateRevision === baselineRevision)
|
|
388
|
+
return result('rejected', 'Generated guidance is identical to the active baseline.')
|
|
389
|
+
let problem = resourceProblem(true)
|
|
390
|
+
if (problem) return result('inconclusive', problem)
|
|
391
|
+
const evaluate = async (name: 'verification' | 'confirmation') => {
|
|
392
|
+
const measured = await stage(name, (context) =>
|
|
393
|
+
options.evaluate(
|
|
394
|
+
Object.freeze({
|
|
395
|
+
...context,
|
|
396
|
+
baseline,
|
|
397
|
+
candidate: candidate as ResidentSkillCandidate,
|
|
398
|
+
baselineRevision: baselineRevision as string,
|
|
399
|
+
candidateRevision: candidateRevision as string,
|
|
400
|
+
}),
|
|
401
|
+
),
|
|
402
|
+
)
|
|
403
|
+
const batch = structuredClone(measured.batch)
|
|
404
|
+
if (
|
|
405
|
+
batch.baselineRevision !== baselineRevision ||
|
|
406
|
+
batch.candidateRevision !== candidateRevision
|
|
407
|
+
)
|
|
408
|
+
throw new Error('Evaluation does not identify the admitted baseline and candidate.')
|
|
409
|
+
if (
|
|
410
|
+
batch.baseline.length > 128 ||
|
|
411
|
+
batch.candidate.length > 128 ||
|
|
412
|
+
batch.attributions.length > 128
|
|
413
|
+
)
|
|
414
|
+
throw new Error('A learning evaluation is bounded to 64 paired tasks.')
|
|
415
|
+
await append(
|
|
416
|
+
'evaluation',
|
|
417
|
+
{
|
|
418
|
+
baselineRevision,
|
|
419
|
+
candidateRevision,
|
|
420
|
+
digest: createHash('sha256').update(JSON.stringify(batch)).digest('hex'),
|
|
421
|
+
baselineTrajectories: batch.baseline.map((t) => t.trajectoryId),
|
|
422
|
+
candidateTrajectories: batch.candidate.map((t) => t.trajectoryId),
|
|
423
|
+
},
|
|
424
|
+
name,
|
|
425
|
+
)
|
|
426
|
+
return batch
|
|
427
|
+
}
|
|
428
|
+
const verification = await evaluate('verification')
|
|
429
|
+
review = reviewHarnessCandidate(verification, undefined, protection)
|
|
430
|
+
problem = resourceProblem(true)
|
|
431
|
+
if (problem) return result('inconclusive', problem)
|
|
432
|
+
if (review.decision === 'reject') return result('rejected', review.reason)
|
|
433
|
+
if (
|
|
434
|
+
review.protection?.verification.status !== 'passed' ||
|
|
435
|
+
review.verification.unresolved.length ||
|
|
436
|
+
review.verification.tasks.length < 5 ||
|
|
437
|
+
review.verification.tasks.some((t) => t.trials !== 2)
|
|
438
|
+
)
|
|
439
|
+
return result('inconclusive', review.reason)
|
|
440
|
+
const confirmation = await evaluate('confirmation')
|
|
441
|
+
review = reviewHarnessCandidate(verification, confirmation, protection)
|
|
442
|
+
problem = resourceProblem()
|
|
443
|
+
if (problem) return result('inconclusive', problem)
|
|
444
|
+
if (review.decision !== 'accept')
|
|
445
|
+
return result(review.decision === 'reject' ? 'rejected' : 'inconclusive', review.reason)
|
|
446
|
+
await check()
|
|
447
|
+
const evidence: ResidentLearningEvidence = {
|
|
448
|
+
key: cycleId,
|
|
449
|
+
source: `resident-learning-cycle:${cycleId}`,
|
|
450
|
+
reason: `Paired verification and fresh confirmation of guidance derived from evidence ${failure.evidence.key}.`,
|
|
451
|
+
}
|
|
452
|
+
// Validate all existing activation contracts before entering the ambiguous
|
|
453
|
+
// commit interval. The store repeats this against its atomic snapshot.
|
|
454
|
+
promoteResidentSkill(
|
|
455
|
+
snapshot.learning,
|
|
456
|
+
candidate,
|
|
457
|
+
{ verification, confirmation, protection },
|
|
458
|
+
evidence,
|
|
459
|
+
)
|
|
460
|
+
await append('activation-requested', {
|
|
461
|
+
baselineRevision,
|
|
462
|
+
candidateRevision,
|
|
463
|
+
agendaRevision: snapshot.revision,
|
|
464
|
+
})
|
|
465
|
+
options.signal.throwIfAborted()
|
|
466
|
+
activationRequested = true
|
|
467
|
+
const updated = await options.agenda.promoteSkill(
|
|
468
|
+
snapshot,
|
|
469
|
+
candidate,
|
|
470
|
+
{ verification, confirmation, protection },
|
|
471
|
+
evidence,
|
|
472
|
+
)
|
|
473
|
+
activatedRevision = updated.revision
|
|
474
|
+
return result('activated', 'Evaluated guidance was committed for subsequent admissions.')
|
|
475
|
+
}
|
|
476
|
+
let outcome: ResidentLearningCycleResult
|
|
477
|
+
try {
|
|
478
|
+
outcome = await execute()
|
|
479
|
+
} catch (error) {
|
|
480
|
+
outcome = result(
|
|
481
|
+
error instanceof ResidentConflictError
|
|
482
|
+
? 'conflict'
|
|
483
|
+
: activationRequested
|
|
484
|
+
? 'activation-unknown'
|
|
485
|
+
: options.signal.aborted
|
|
486
|
+
? 'cancelled'
|
|
487
|
+
: 'failed',
|
|
488
|
+
error instanceof Error ? error.message : String(error),
|
|
489
|
+
)
|
|
490
|
+
}
|
|
491
|
+
if (auditComplete) {
|
|
492
|
+
try {
|
|
493
|
+
await append('finished', { result: outcome })
|
|
494
|
+
} catch {
|
|
495
|
+
/* A committed activation is not undone by a journal failure. */
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
return { ...outcome, auditComplete }
|
|
499
|
+
}
|