@namzu/sdk 45.1.0 → 48.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 +436 -8
- package/README.md +7 -8
- package/dist/advisory/history.d.ts.map +1 -1
- package/dist/advisory/history.js +21 -1
- package/dist/advisory/history.js.map +1 -1
- package/dist/advisory/index.d.ts +1 -1
- package/dist/advisory/index.d.ts.map +1 -1
- package/dist/advisory/index.js +1 -1
- package/dist/advisory/index.js.map +1 -1
- package/dist/advisory/registry.d.ts +17 -0
- package/dist/advisory/registry.d.ts.map +1 -1
- package/dist/advisory/registry.js +26 -0
- package/dist/advisory/registry.js.map +1 -1
- package/dist/agents/PipelineAgent.d.ts +2 -46
- package/dist/agents/PipelineAgent.d.ts.map +1 -1
- package/dist/agents/PipelineAgent.js +2 -242
- package/dist/agents/PipelineAgent.js.map +1 -1
- package/dist/agents/QueryAgent.d.ts +21 -0
- package/dist/agents/QueryAgent.d.ts.map +1 -0
- package/dist/agents/QueryAgent.js +214 -0
- package/dist/agents/QueryAgent.js.map +1 -0
- package/dist/agents/ReactiveAgent.d.ts +4 -16
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +4 -183
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts +2 -20
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +2 -266
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts +3 -43
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +3 -418
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/defineAgent.d.ts +2 -1
- package/dist/agents/defineAgent.d.ts.map +1 -1
- package/dist/agents/defineAgent.js +6 -1
- package/dist/agents/defineAgent.js.map +1 -1
- package/dist/agents/examples/PipelineAgent.d.ts +46 -0
- package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
- package/dist/agents/examples/PipelineAgent.js +242 -0
- package/dist/agents/examples/PipelineAgent.js.map +1 -0
- package/dist/agents/examples/RouterAgent.d.ts +22 -0
- package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
- package/dist/agents/examples/RouterAgent.js +268 -0
- package/dist/agents/examples/RouterAgent.js.map +1 -0
- package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
- package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
- package/dist/agents/examples/SupervisorAgent.js +406 -0
- package/dist/agents/examples/SupervisorAgent.js.map +1 -0
- package/dist/agents/explore.d.ts +6 -3
- package/dist/agents/explore.d.ts.map +1 -1
- package/dist/agents/explore.js +6 -3
- package/dist/agents/explore.js.map +1 -1
- package/dist/agents/forward-options.d.ts +11 -0
- package/dist/agents/forward-options.d.ts.map +1 -0
- package/dist/agents/forward-options.js +15 -0
- package/dist/agents/forward-options.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/runAgent.d.ts +19 -8
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +99 -29
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/authorization/command-line.d.ts +2 -0
- package/dist/authorization/command-line.d.ts.map +1 -1
- package/dist/authorization/command-line.js +2 -2
- package/dist/authorization/command-line.js.map +1 -1
- package/dist/authorization/gate.d.ts +13 -2
- package/dist/authorization/gate.d.ts.map +1 -1
- package/dist/authorization/gate.js +37 -5
- package/dist/authorization/gate.js.map +1 -1
- package/dist/authorization/program.d.ts +151 -0
- package/dist/authorization/program.d.ts.map +1 -0
- package/dist/authorization/program.js +713 -0
- package/dist/authorization/program.js.map +1 -0
- package/dist/authorization/reexec-wrapper.d.ts +106 -0
- package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
- package/dist/authorization/reexec-wrapper.js +532 -0
- package/dist/authorization/reexec-wrapper.js.map +1 -0
- package/dist/authorization/rules.d.ts +9 -0
- package/dist/authorization/rules.d.ts.map +1 -1
- package/dist/authorization/rules.js +27 -1
- package/dist/authorization/rules.js.map +1 -1
- package/dist/authorization/shell-lexer.d.ts +39 -0
- package/dist/authorization/shell-lexer.d.ts.map +1 -1
- package/dist/authorization/shell-lexer.js +113 -69
- package/dist/authorization/shell-lexer.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +6 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/capabilities/index.d.ts +54 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +92 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/config/registry.d.ts +2 -1
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +3 -2
- package/dist/config/registry.js.map +1 -1
- package/dist/connector/index.d.ts +4 -4
- package/dist/connector/index.d.ts.map +1 -1
- package/dist/connector/index.js +3 -3
- package/dist/connector/index.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts +16 -1
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +60 -4
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts +13 -4
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +20 -3
- package/dist/connector/mcp/client.js.map +1 -1
- package/dist/connector/mcp/discovery.d.ts +24 -1
- package/dist/connector/mcp/discovery.d.ts.map +1 -1
- package/dist/connector/mcp/discovery.js +44 -0
- package/dist/connector/mcp/discovery.js.map +1 -1
- package/dist/connector/mcp/index.d.ts +2 -0
- package/dist/connector/mcp/index.d.ts.map +1 -1
- package/dist/connector/mcp/index.js +11 -0
- package/dist/connector/mcp/index.js.map +1 -1
- package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
- package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
- package/dist/connector/mcp/mcp-toolset.js +399 -0
- package/dist/connector/mcp/mcp-toolset.js.map +1 -0
- package/dist/connector/tools/index.d.ts +2 -2
- package/dist/connector/tools/index.d.ts.map +1 -1
- package/dist/connector/tools/index.js +1 -1
- package/dist/connector/tools/index.js.map +1 -1
- package/dist/connector/tools/router.d.ts +15 -13
- package/dist/connector/tools/router.d.ts.map +1 -1
- package/dist/connector/tools/router.js +30 -51
- package/dist/connector/tools/router.js.map +1 -1
- package/dist/contracts/a2a.d.ts +2 -2
- package/dist/directory/derive-supervisor.d.ts +2 -2
- package/dist/directory/derive-supervisor.d.ts.map +1 -1
- package/dist/directory/derive-supervisor.js +6 -7
- package/dist/directory/derive-supervisor.js.map +1 -1
- package/dist/directory/derive.d.ts.map +1 -1
- package/dist/directory/derive.js +5 -5
- package/dist/directory/derive.js.map +1 -1
- package/dist/execution/code-runtime/types.d.ts +2 -2
- package/dist/execution/code-runtime/types.js +1 -1
- package/dist/invariants/index.d.ts +2 -1
- package/dist/invariants/index.d.ts.map +1 -1
- package/dist/invariants/index.js +3 -2
- package/dist/invariants/index.js.map +1 -1
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +9 -0
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/connector/environment.d.ts +6 -0
- package/dist/manager/connector/environment.d.ts.map +1 -1
- package/dist/manager/connector/environment.js +11 -4
- package/dist/manager/connector/environment.js.map +1 -1
- package/dist/manager/connector/index.d.ts +2 -2
- package/dist/manager/connector/index.d.ts.map +1 -1
- package/dist/manager/connector/index.js +2 -2
- package/dist/manager/connector/index.js.map +1 -1
- package/dist/manager/connector/tenant.d.ts +6 -0
- package/dist/manager/connector/tenant.d.ts.map +1 -1
- package/dist/manager/connector/tenant.js +11 -4
- package/dist/manager/connector/tenant.js.map +1 -1
- package/dist/manager/index.d.ts +2 -2
- package/dist/manager/index.d.ts.map +1 -1
- package/dist/manager/index.js +2 -2
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/resident/learning-observation.d.ts +4 -4
- package/dist/manager/resident/learning.d.ts +36 -36
- package/dist/manager/session/attribution.d.ts +22 -0
- package/dist/manager/session/attribution.d.ts.map +1 -0
- package/dist/manager/session/attribution.js +64 -0
- package/dist/manager/session/attribution.js.map +1 -0
- package/dist/manager/session/turn-recorder.d.ts +14 -0
- package/dist/manager/session/turn-recorder.d.ts.map +1 -1
- package/dist/manager/session/turn-recorder.js +208 -55
- package/dist/manager/session/turn-recorder.js.map +1 -1
- package/dist/peers/address.d.ts +36 -0
- package/dist/peers/address.d.ts.map +1 -0
- package/dist/peers/address.js +52 -0
- package/dist/peers/address.js.map +1 -0
- package/dist/peers/client.d.ts +47 -0
- package/dist/peers/client.d.ts.map +1 -0
- package/dist/peers/client.js +132 -0
- package/dist/peers/client.js.map +1 -0
- package/dist/peers/dir.d.ts +88 -0
- package/dist/peers/dir.d.ts.map +1 -0
- package/dist/peers/dir.js +139 -0
- package/dist/peers/dir.js.map +1 -0
- package/dist/peers/endpoint.d.ts +144 -0
- package/dist/peers/endpoint.d.ts.map +1 -0
- package/dist/peers/endpoint.js +420 -0
- package/dist/peers/endpoint.js.map +1 -0
- package/dist/peers/envelope.d.ts +42 -0
- package/dist/peers/envelope.d.ts.map +1 -0
- package/dist/peers/envelope.js +110 -0
- package/dist/peers/envelope.js.map +1 -0
- package/dist/peers/index.d.ts +30 -0
- package/dist/peers/index.d.ts.map +1 -0
- package/dist/peers/index.js +22 -0
- package/dist/peers/index.js.map +1 -0
- package/dist/peers/protocol.d.ts +645 -0
- package/dist/peers/protocol.d.ts.map +1 -0
- package/dist/peers/protocol.js +151 -0
- package/dist/peers/protocol.js.map +1 -0
- package/dist/peers/record.d.ts +71 -0
- package/dist/peers/record.d.ts.map +1 -0
- package/dist/peers/record.js +45 -0
- package/dist/peers/record.js.map +1 -0
- package/dist/peers/registry.d.ts +54 -0
- package/dist/peers/registry.d.ts.map +1 -0
- package/dist/peers/registry.js +213 -0
- package/dist/peers/registry.js.map +1 -0
- package/dist/plugin/define.d.ts +24 -0
- package/dist/plugin/define.d.ts.map +1 -0
- package/dist/plugin/define.js +42 -0
- package/dist/plugin/define.js.map +1 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +1 -0
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/lifecycle.d.ts +27 -3
- package/dist/plugin/lifecycle.d.ts.map +1 -1
- package/dist/plugin/lifecycle.js +242 -92
- package/dist/plugin/lifecycle.js.map +1 -1
- package/dist/plugin/resolver.d.ts +2 -2
- package/dist/plugin/resolver.d.ts.map +1 -1
- package/dist/plugin/resolver.js.map +1 -1
- package/dist/plugin/shell-hook.d.ts.map +1 -1
- package/dist/plugin/shell-hook.js +17 -3
- package/dist/plugin/shell-hook.js.map +1 -1
- package/dist/pricing/catalogue.generated.d.ts.map +1 -1
- package/dist/pricing/catalogue.generated.js +28 -4
- package/dist/pricing/catalogue.generated.js.map +1 -1
- package/dist/probe/errors.d.ts +2 -1
- package/dist/probe/errors.d.ts.map +1 -1
- package/dist/probe/errors.js +3 -2
- package/dist/probe/errors.js.map +1 -1
- package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
- package/dist/prompt/coding-agent-doctrine.js +11 -6
- package/dist/prompt/coding-agent-doctrine.js.map +1 -1
- package/dist/prompt/contributions.d.ts +4 -1
- package/dist/prompt/contributions.d.ts.map +1 -1
- package/dist/prompt/contributions.js +7 -2
- package/dist/prompt/contributions.js.map +1 -1
- package/dist/prompt/index.d.ts +1 -1
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -1
- package/dist/prompt/index.js.map +1 -1
- package/dist/provider/collect-chat-completion.d.ts +6 -1
- package/dist/provider/collect-chat-completion.d.ts.map +1 -1
- package/dist/provider/collect-chat-completion.js +88 -10
- package/dist/provider/collect-chat-completion.js.map +1 -1
- package/dist/provider/mock.d.ts.map +1 -1
- package/dist/provider/mock.js +23 -6
- package/dist/provider/mock.js.map +1 -1
- package/dist/provider/registry.d.ts +2 -1
- package/dist/provider/registry.d.ts.map +1 -1
- package/dist/provider/registry.js +3 -2
- package/dist/provider/registry.js.map +1 -1
- package/dist/provider/tool-call-framing.d.ts +164 -0
- package/dist/provider/tool-call-framing.d.ts.map +1 -0
- package/dist/provider/tool-call-framing.js +163 -0
- package/dist/provider/tool-call-framing.js.map +1 -0
- package/dist/public-runtime.d.ts +27 -14
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +49 -11
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +9 -6
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +13 -5
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +16 -5
- package/dist/public-types.d.ts.map +1 -1
- package/dist/read-model/registry.d.ts +2 -1
- package/dist/read-model/registry.d.ts.map +1 -1
- package/dist/read-model/registry.js +3 -2
- package/dist/read-model/registry.js.map +1 -1
- package/dist/registry/ManagedRegistry.d.ts +30 -0
- package/dist/registry/ManagedRegistry.d.ts.map +1 -1
- package/dist/registry/ManagedRegistry.js +45 -6
- package/dist/registry/ManagedRegistry.js.map +1 -1
- package/dist/registry/collision.d.ts +57 -0
- package/dist/registry/collision.d.ts.map +1 -0
- package/dist/registry/collision.js +41 -0
- package/dist/registry/collision.js.map +1 -0
- package/dist/registry/command/index.d.ts +5 -3
- package/dist/registry/command/index.d.ts.map +1 -1
- package/dist/registry/command/index.js +6 -4
- package/dist/registry/command/index.js.map +1 -1
- package/dist/registry/index.d.ts +3 -4
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +2 -2
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/plugin/index.d.ts.map +1 -1
- package/dist/registry/plugin/index.js +14 -1
- package/dist/registry/plugin/index.js.map +1 -1
- package/dist/registry/tool/callable.d.ts +22 -0
- package/dist/registry/tool/callable.d.ts.map +1 -0
- package/dist/registry/tool/callable.js +28 -0
- package/dist/registry/tool/callable.js.map +1 -0
- package/dist/registry/tool/execute.d.ts +14 -77
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +15 -720
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/registry/tool/portable.d.ts +25 -0
- package/dist/registry/tool/portable.d.ts.map +1 -1
- package/dist/registry/tool/portable.js +50 -0
- package/dist/registry/tool/portable.js.map +1 -1
- package/dist/registry/tool/presentation.d.ts +6 -5
- package/dist/registry/tool/presentation.d.ts.map +1 -1
- package/dist/registry/tool/presentation.js +3 -3
- package/dist/registry/tool/presentation.js.map +1 -1
- package/dist/runtime/bidi/session.d.ts +5 -4
- package/dist/runtime/bidi/session.d.ts.map +1 -1
- package/dist/runtime/bidi/session.js +18 -1
- package/dist/runtime/bidi/session.js.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.d.ts +82 -13
- package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.js +227 -17
- package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +37 -5
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +103 -14
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
- package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
- package/dist/runtime/query/file-evidence-replay.js +8 -7
- package/dist/runtime/query/file-evidence-replay.js.map +1 -1
- package/dist/runtime/query/fork/prepare.d.ts +4 -1
- package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
- package/dist/runtime/query/fork/prepare.js +4 -0
- package/dist/runtime/query/fork/prepare.js.map +1 -1
- package/dist/runtime/query/guardrail-presets.d.ts +4 -3
- package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
- package/dist/runtime/query/guardrail-presets.js +4 -3
- package/dist/runtime/query/guardrail-presets.js.map +1 -1
- package/dist/runtime/query/index.d.ts +23 -10
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +149 -70
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +8 -1
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
- package/dist/runtime/query/iteration/phases/context.d.ts.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 +55 -2
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +342 -116
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
- package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
- package/dist/runtime/query/iteration/tool-input.js +291 -0
- package/dist/runtime/query/iteration/tool-input.js.map +1 -0
- package/dist/runtime/query/observation-context.d.ts +2 -2
- package/dist/runtime/query/observation-context.d.ts.map +1 -1
- package/dist/runtime/query/observation-context.js.map +1 -1
- package/dist/runtime/query/prelude-lease.d.ts +18 -0
- package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
- package/dist/runtime/query/prelude-lease.js +121 -0
- package/dist/runtime/query/prelude-lease.js.map +1 -0
- package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
- package/dist/runtime/query/prepare-turn.js +386 -187
- package/dist/runtime/query/prepare-turn.js.map +1 -1
- package/dist/runtime/query/prompt-cache.d.ts +2 -2
- package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
- package/dist/runtime/query/prompt.d.ts +2 -2
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +1 -1
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/resume-session.d.ts.map +1 -1
- package/dist/runtime/query/resume-session.js +37 -2
- package/dist/runtime/query/resume-session.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +65 -3
- package/dist/runtime/query/review-policy.d.ts.map +1 -1
- package/dist/runtime/query/review-policy.js +143 -22
- package/dist/runtime/query/review-policy.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +3 -2
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/runtime/query/turn-state.d.ts.map +1 -1
- package/dist/runtime/query/turn-state.js +5 -0
- package/dist/runtime/query/turn-state.js.map +1 -1
- package/dist/runtime/system-events.d.ts +112 -0
- package/dist/runtime/system-events.d.ts.map +1 -0
- package/dist/runtime/system-events.js +183 -0
- package/dist/runtime/system-events.js.map +1 -0
- package/dist/scheduler/delegating.d.ts +2 -1
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +3 -2
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/registry.d.ts +18 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +20 -0
- package/dist/skills/registry.js.map +1 -1
- package/dist/store/evidence/index-page.d.ts +2 -2
- package/dist/store/session-log/conformance.d.ts +1 -1
- package/dist/store/session-log/conformance.d.ts.map +1 -1
- package/dist/store/session-log/conformance.js +49 -8
- package/dist/store/session-log/conformance.js.map +1 -1
- package/dist/store/session-log/core.d.ts +8 -3
- package/dist/store/session-log/core.d.ts.map +1 -1
- package/dist/store/session-log/core.js +2 -1
- package/dist/store/session-log/core.js.map +1 -1
- package/dist/store/session-log/fold.d.ts +12 -0
- package/dist/store/session-log/fold.d.ts.map +1 -1
- package/dist/store/session-log/fold.js +57 -7
- package/dist/store/session-log/fold.js.map +1 -1
- package/dist/store/session-log/index.d.ts +2 -2
- package/dist/store/session-log/index.d.ts.map +1 -1
- package/dist/store/session-log/index.js +1 -1
- package/dist/store/session-log/index.js.map +1 -1
- package/dist/test-support/toolset.d.ts +19 -0
- package/dist/test-support/toolset.d.ts.map +1 -0
- package/dist/test-support/toolset.js +20 -0
- package/dist/test-support/toolset.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts +29 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +19 -9
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/browser-url.d.ts +1 -1
- package/dist/tools/builtins/browser-url.js +1 -1
- package/dist/tools/builtins/browser.d.ts +6 -6
- package/dist/tools/builtins/computer-use-coordinates.d.ts +65 -0
- package/dist/tools/builtins/computer-use-coordinates.d.ts.map +1 -0
- package/dist/tools/builtins/computer-use-coordinates.js +123 -0
- package/dist/tools/builtins/computer-use-coordinates.js.map +1 -0
- package/dist/tools/builtins/computer-use-image.d.ts +77 -0
- package/dist/tools/builtins/computer-use-image.d.ts.map +1 -0
- package/dist/tools/builtins/computer-use-image.js +223 -0
- package/dist/tools/builtins/computer-use-image.js.map +1 -0
- package/dist/tools/builtins/computer-use.d.ts +519 -14
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +1196 -183
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +9 -1
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/index.d.ts +2 -1
- package/dist/tools/builtins/index.d.ts.map +1 -1
- package/dist/tools/builtins/index.js +1 -1
- package/dist/tools/builtins/index.js.map +1 -1
- package/dist/tools/builtins/json-string-hint.d.ts +15 -0
- package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
- package/dist/tools/builtins/json-string-hint.js +17 -0
- package/dist/tools/builtins/json-string-hint.js.map +1 -0
- package/dist/tools/builtins/search-tools.d.ts.map +1 -1
- package/dist/tools/builtins/search-tools.js +7 -15
- package/dist/tools/builtins/search-tools.js.map +1 -1
- package/dist/tools/builtins/skill.d.ts +74 -0
- package/dist/tools/builtins/skill.d.ts.map +1 -1
- package/dist/tools/builtins/skill.js +214 -174
- package/dist/tools/builtins/skill.js.map +1 -1
- package/dist/tools/builtins/write-file.d.ts.map +1 -1
- package/dist/tools/builtins/write-file.js +11 -0
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/command-shell.d.ts +10 -0
- package/dist/tools/command-shell.d.ts.map +1 -1
- package/dist/tools/command-shell.js +45 -1
- package/dist/tools/command-shell.js.map +1 -1
- package/dist/tools/coordinator/agent.d.ts.map +1 -1
- package/dist/tools/coordinator/agent.js +5 -0
- package/dist/tools/coordinator/agent.js.map +1 -1
- package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
- package/dist/tools/coordinator/ask-user-question.js +26 -13
- package/dist/tools/coordinator/ask-user-question.js.map +1 -1
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +5 -0
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/coordinator/question-options.d.ts +78 -0
- package/dist/tools/coordinator/question-options.d.ts.map +1 -0
- package/dist/tools/coordinator/question-options.js +153 -0
- package/dist/tools/coordinator/question-options.js.map +1 -0
- package/dist/tools/defineTool.d.ts +12 -0
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +24 -0
- package/dist/tools/defineTool.js.map +1 -1
- package/dist/tools/memory/search.d.ts.map +1 -1
- package/dist/tools/memory/search.js +4 -1
- package/dist/tools/memory/search.js.map +1 -1
- package/dist/tools/memory/update.d.ts.map +1 -1
- package/dist/tools/memory/update.js +8 -5
- package/dist/tools/memory/update.js.map +1 -1
- package/dist/tools/render-nonce.d.ts +47 -0
- package/dist/tools/render-nonce.d.ts.map +1 -0
- package/dist/tools/render-nonce.js +63 -0
- package/dist/tools/render-nonce.js.map +1 -0
- package/dist/tools/roster.d.ts +46 -19
- package/dist/tools/roster.d.ts.map +1 -1
- package/dist/tools/roster.js +63 -33
- package/dist/tools/roster.js.map +1 -1
- package/dist/tools/schedules/present.d.ts.map +1 -1
- package/dist/tools/schedules/present.js +2 -0
- package/dist/tools/schedules/present.js.map +1 -1
- package/dist/tools/schedules/schedule-tool.d.ts +6 -5
- package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
- package/dist/tools/schedules/schedule-tool.js +208 -37
- package/dist/tools/schedules/schedule-tool.js.map +1 -1
- package/dist/tools/schedules/types.d.ts +120 -6
- package/dist/tools/schedules/types.d.ts.map +1 -1
- package/dist/tools/trusted-read-only.d.ts +9 -5
- package/dist/tools/trusted-read-only.d.ts.map +1 -1
- package/dist/tools/trusted-read-only.js +14 -10
- package/dist/tools/trusted-read-only.js.map +1 -1
- package/dist/tools/untrusted-envelope.d.ts +67 -28
- package/dist/tools/untrusted-envelope.d.ts.map +1 -1
- package/dist/tools/untrusted-envelope.js +108 -59
- package/dist/tools/untrusted-envelope.js.map +1 -1
- package/dist/toolsets/combine.d.ts +44 -0
- package/dist/toolsets/combine.d.ts.map +1 -0
- package/dist/toolsets/combine.js +153 -0
- package/dist/toolsets/combine.js.map +1 -0
- package/dist/toolsets/manager.d.ts +201 -0
- package/dist/toolsets/manager.d.ts.map +1 -0
- package/dist/toolsets/manager.js +837 -0
- package/dist/toolsets/manager.js.map +1 -0
- package/dist/toolsets/source-glob.d.ts +15 -0
- package/dist/toolsets/source-glob.d.ts.map +1 -0
- package/dist/toolsets/source-glob.js +23 -0
- package/dist/toolsets/source-glob.js.map +1 -0
- package/dist/toolsets/toolset.d.ts +20 -0
- package/dist/toolsets/toolset.d.ts.map +1 -0
- package/dist/toolsets/toolset.js +28 -0
- package/dist/toolsets/toolset.js.map +1 -0
- package/dist/toolsets/types.d.ts +128 -0
- package/dist/toolsets/types.d.ts.map +1 -0
- package/dist/toolsets/types.js +33 -0
- package/dist/toolsets/types.js.map +1 -0
- package/dist/toolsets/wrappers.d.ts +59 -0
- package/dist/toolsets/wrappers.d.ts.map +1 -0
- package/dist/toolsets/wrappers.js +165 -0
- package/dist/toolsets/wrappers.js.map +1 -0
- package/dist/types/agent/base.d.ts +27 -16
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/index.d.ts +1 -0
- package/dist/types/agent/index.d.ts.map +1 -1
- package/dist/types/agent/index.js +1 -0
- package/dist/types/agent/index.js.map +1 -1
- package/dist/types/agent/pipeline.d.ts +2 -0
- package/dist/types/agent/pipeline.d.ts.map +1 -1
- package/dist/types/agent/query.d.ts +117 -0
- package/dist/types/agent/query.d.ts.map +1 -0
- package/dist/types/agent/query.js +2 -0
- package/dist/types/agent/query.js.map +1 -0
- package/dist/types/agent/reactive.d.ts +2 -129
- package/dist/types/agent/reactive.d.ts.map +1 -1
- package/dist/types/agent/router.d.ts +2 -0
- package/dist/types/agent/router.d.ts.map +1 -1
- package/dist/types/agent/supervisor.d.ts +5 -2
- package/dist/types/agent/supervisor.d.ts.map +1 -1
- package/dist/types/authorization/index.d.ts +70 -12
- package/dist/types/authorization/index.d.ts.map +1 -1
- package/dist/types/authorization/index.js +11 -0
- package/dist/types/authorization/index.js.map +1 -1
- package/dist/types/computer-use/index.d.ts +176 -0
- package/dist/types/computer-use/index.d.ts.map +1 -1
- package/dist/types/computer-use/index.js.map +1 -1
- package/dist/types/connector/mcp.d.ts +32 -0
- package/dist/types/connector/mcp.d.ts.map +1 -1
- package/dist/types/errors/index.d.ts +15 -0
- package/dist/types/errors/index.d.ts.map +1 -1
- package/dist/types/errors/index.js.map +1 -1
- package/dist/types/hitl/index.d.ts +57 -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 +130 -9
- package/dist/types/message/index.d.ts.map +1 -1
- package/dist/types/message/index.js +4 -1
- package/dist/types/message/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +22 -4
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +1 -0
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/provider/chat.d.ts +5 -0
- package/dist/types/provider/chat.d.ts.map +1 -1
- package/dist/types/provider/config.d.ts +8 -3
- package/dist/types/provider/config.d.ts.map +1 -1
- package/dist/types/provider/stream.d.ts +39 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/sandbox/index.d.ts +1 -1
- package/dist/types/session/events.d.ts +14 -3
- package/dist/types/session/events.d.ts.map +1 -1
- package/dist/types/session/events.js.map +1 -1
- package/dist/types/tool/index.d.ts +171 -91
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/toolset/index.d.ts +10 -40
- package/dist/types/toolset/index.d.ts.map +1 -1
- package/package.json +3 -1
- package/src/advisory/history.ts +27 -2
- package/src/advisory/index.ts +1 -1
- package/src/advisory/registry.ts +33 -0
- package/src/agents/AGENTS.md +14 -7
- package/src/agents/PipelineAgent.ts +2 -303
- package/src/agents/QueryAgent.ts +269 -0
- package/src/agents/ReactiveAgent.ts +6 -216
- package/src/agents/RouterAgent.ts +2 -337
- package/src/agents/SupervisorAgent.ts +3 -476
- package/src/agents/defineAgent.ts +13 -2
- package/src/agents/examples/PipelineAgent.ts +302 -0
- package/src/agents/examples/RouterAgent.ts +338 -0
- package/src/agents/examples/SupervisorAgent.ts +472 -0
- package/src/agents/explore.ts +6 -3
- package/src/agents/forward-options.ts +37 -0
- package/src/agents/index.ts +2 -0
- package/src/agents/runAgent.ts +144 -37
- package/src/authorization/command-line.ts +2 -2
- package/src/authorization/gate.ts +46 -5
- package/src/authorization/program.ts +773 -0
- package/src/authorization/reexec-wrapper.ts +589 -0
- package/src/authorization/rules.ts +36 -1
- package/src/authorization/shell-lexer.ts +136 -63
- package/src/bridge/sse/mapper.ts +6 -0
- package/src/capabilities/index.ts +157 -0
- package/src/config/registry.ts +4 -1
- package/src/connector/index.ts +9 -2
- package/src/connector/mcp/adapter.ts +58 -3
- package/src/connector/mcp/client.ts +20 -4
- package/src/connector/mcp/discovery.ts +60 -0
- package/src/connector/mcp/index.ts +13 -0
- package/src/connector/mcp/mcp-toolset.ts +515 -0
- package/src/connector/tools/index.ts +2 -2
- package/src/connector/tools/router.ts +35 -58
- package/src/directory/derive-supervisor.ts +12 -8
- package/src/directory/derive.ts +8 -5
- package/src/execution/code-runtime/types.ts +2 -2
- package/src/invariants/index.ts +4 -1
- package/src/manager/agent/lifecycle.ts +9 -0
- package/src/manager/connector/environment.ts +17 -4
- package/src/manager/connector/index.ts +2 -2
- package/src/manager/connector/tenant.ts +17 -4
- package/src/manager/index.ts +2 -2
- package/src/manager/session/attribution.ts +79 -0
- package/src/manager/session/turn-recorder.ts +211 -55
- package/src/peers/address.ts +58 -0
- package/src/peers/client.ts +202 -0
- package/src/peers/dir.ts +176 -0
- package/src/peers/endpoint.ts +564 -0
- package/src/peers/envelope.ts +121 -0
- package/src/peers/index.ts +96 -0
- package/src/peers/protocol.ts +196 -0
- package/src/peers/record.ts +56 -0
- package/src/peers/registry.ts +241 -0
- package/src/plugin/define.ts +68 -0
- package/src/plugin/index.ts +2 -0
- package/src/plugin/lifecycle.ts +286 -106
- package/src/plugin/resolver.ts +6 -3
- package/src/plugin/shell-hook.ts +21 -5
- package/src/pricing/catalogue.generated.ts +28 -4
- package/src/pricing/rates.source.json +27 -6
- package/src/probe/errors.ts +4 -1
- package/src/prompt/coding-agent-doctrine.ts +22 -10
- package/src/prompt/contributions.ts +12 -2
- package/src/prompt/index.ts +1 -0
- package/src/provider/collect-chat-completion.ts +96 -11
- package/src/provider/mock.ts +24 -6
- package/src/provider/registry.ts +4 -1
- package/src/provider/tool-call-framing.ts +226 -0
- package/src/public-runtime.ts +152 -9
- package/src/public-tools.ts +43 -5
- package/src/public-types.ts +65 -6
- package/src/read-model/registry.ts +7 -2
- package/src/registry/ManagedRegistry.ts +57 -6
- package/src/registry/collision.ts +64 -0
- package/src/registry/command/index.ts +7 -3
- package/src/registry/index.ts +3 -9
- package/src/registry/plugin/index.ts +14 -1
- package/src/registry/tool/callable.ts +36 -0
- package/src/registry/tool/execute.ts +16 -839
- package/src/registry/tool/portable.ts +59 -0
- package/src/registry/tool/presentation.ts +6 -5
- package/src/runtime/bidi/session.ts +24 -5
- package/src/runtime/query/executor/tool-call-admission.ts +288 -22
- package/src/runtime/query/executor.ts +129 -16
- package/src/runtime/query/file-evidence-replay.ts +8 -7
- package/src/runtime/query/fork/prepare.ts +6 -1
- package/src/runtime/query/guardrail-presets.ts +4 -3
- package/src/runtime/query/index.ts +199 -101
- package/src/runtime/query/iteration/index.ts +13 -3
- package/src/runtime/query/iteration/phases/compaction.ts +1 -1
- package/src/runtime/query/iteration/phases/context.ts +2 -2
- package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
- package/src/runtime/query/iteration/stream-turn.ts +390 -136
- package/src/runtime/query/iteration/tool-input.ts +284 -0
- package/src/runtime/query/observation-context.ts +2 -2
- package/src/runtime/query/prelude-lease.ts +132 -0
- package/src/runtime/query/prepare-turn.ts +477 -198
- package/src/runtime/query/prompt-cache.ts +2 -2
- package/src/runtime/query/prompt.ts +4 -4
- package/src/runtime/query/resume-session.ts +42 -3
- package/src/runtime/query/review-policy.ts +190 -24
- package/src/runtime/query/tooling.ts +3 -6
- package/src/runtime/query/turn-state.ts +4 -0
- package/src/runtime/system-events.ts +246 -0
- package/src/scheduler/delegating.ts +7 -2
- package/src/skills/index.ts +1 -1
- package/src/skills/registry.ts +33 -0
- package/src/store/session-log/conformance.ts +51 -8
- package/src/store/session-log/core.ts +10 -4
- package/src/store/session-log/fold.ts +33 -7
- package/src/store/session-log/index.ts +2 -0
- package/src/test-support/toolset.ts +23 -0
- package/src/tools/builtins/bash.ts +27 -10
- package/src/tools/builtins/browser-url.ts +1 -1
- package/src/tools/builtins/computer-use-coordinates.ts +144 -0
- package/src/tools/builtins/computer-use-image.ts +278 -0
- package/src/tools/builtins/computer-use.ts +1495 -191
- package/src/tools/builtins/edit.ts +12 -2
- package/src/tools/builtins/index.ts +7 -1
- package/src/tools/builtins/json-string-hint.ts +16 -0
- package/src/tools/builtins/search-tools.ts +7 -20
- package/src/tools/builtins/skill.ts +304 -174
- package/src/tools/builtins/write-file.ts +12 -0
- package/src/tools/command-shell.ts +46 -1
- package/src/tools/coordinator/agent.ts +6 -0
- package/src/tools/coordinator/ask-user-question.ts +29 -15
- package/src/tools/coordinator/index.ts +6 -0
- package/src/tools/coordinator/question-options.ts +195 -0
- package/src/tools/defineTool.ts +38 -0
- package/src/tools/memory/search.ts +4 -1
- package/src/tools/memory/update.ts +8 -5
- package/src/tools/render-nonce.ts +69 -0
- package/src/tools/roster.ts +84 -33
- package/src/tools/schedules/present.ts +2 -0
- package/src/tools/schedules/schedule-tool.ts +238 -39
- package/src/tools/schedules/types.ts +120 -6
- package/src/tools/trusted-read-only.ts +19 -10
- package/src/tools/untrusted-envelope.ts +121 -57
- package/src/toolsets/combine.ts +181 -0
- package/src/toolsets/manager.ts +996 -0
- package/src/toolsets/source-glob.ts +22 -0
- package/src/toolsets/toolset.ts +31 -0
- package/src/toolsets/types.ts +154 -0
- package/src/toolsets/wrappers.ts +191 -0
- package/src/types/agent/base.ts +29 -16
- package/src/types/agent/index.ts +1 -0
- package/src/types/agent/pipeline.ts +2 -0
- package/src/types/agent/query.ts +129 -0
- package/src/types/agent/reactive.ts +5 -142
- package/src/types/agent/router.ts +2 -0
- package/src/types/agent/supervisor.ts +5 -2
- package/src/types/authorization/index.ts +33 -0
- package/src/types/computer-use/index.ts +202 -0
- package/src/types/connector/mcp.ts +32 -0
- package/src/types/errors/index.ts +15 -0
- package/src/types/hitl/index.ts +57 -0
- package/src/types/message/index.ts +135 -7
- package/src/types/plugin/index.ts +44 -21
- package/src/types/provider/chat.ts +5 -0
- package/src/types/provider/config.ts +8 -3
- package/src/types/provider/stream.ts +39 -0
- package/src/types/sandbox/index.ts +1 -1
- package/src/types/session/events.ts +14 -3
- package/src/types/tool/index.ts +173 -105
- package/src/types/toolset/index.ts +10 -47
- package/dist/registry/toolset/catalog.d.ts +0 -42
- package/dist/registry/toolset/catalog.d.ts.map +0 -1
- package/dist/registry/toolset/catalog.js +0 -234
- package/dist/registry/toolset/catalog.js.map +0 -1
- package/src/registry/toolset/catalog.ts +0 -308
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
1
2
|
import { drainQueuedMessages } from '../../agents/handle.js';
|
|
2
3
|
import { repairToolMessageHistory, toolHistoryRepairChanged, } from '../../compaction/dangling.js';
|
|
3
|
-
import {
|
|
4
|
+
import { assertSessionLogAttribution } from '../../manager/session/attribution.js';
|
|
5
|
+
import { readEverRecordedMessages, readFoldedHistory, } from '../../manager/session/turn-recorder.js';
|
|
4
6
|
import { resolveModelPricing } from '../../pricing/index.js';
|
|
5
7
|
import { isCallerAbortError } from '../../provider/errors.js';
|
|
6
8
|
import { withProviderFallback, } from '../../provider/fallback.js';
|
|
@@ -21,7 +23,8 @@ import { TurnContextFactory } from './context.js';
|
|
|
21
23
|
import { EventTranslator } from './events.js';
|
|
22
24
|
import { isCompactionMessage } from './iteration/phases/compaction.js';
|
|
23
25
|
import { isWorkingMemoryMessage } from './iteration/phases/working-memory.js';
|
|
24
|
-
import {
|
|
26
|
+
import { PreludeSessionLease } from './prelude-lease.js';
|
|
27
|
+
import { awaitProjectInstructionCallback, collapseProjectInstructionSnapshots, isProjectInstructionMessage, replaceProjectInstructionSnapshot, } from './project-instructions.js';
|
|
25
28
|
import { resolveMaxRequestRichContentBytes } from './request-rich-content.js';
|
|
26
29
|
import { resolveSandboxTeardownTimeoutMs } from './sandbox-lifecycle.js';
|
|
27
30
|
import { resolveSessionStorage } from './session-storage.js';
|
|
@@ -255,171 +258,186 @@ export async function prepareTurn(params) {
|
|
|
255
258
|
...(params.tokenBudgetStore ? { tokenBudgetStore: params.tokenBudgetStore } : {}),
|
|
256
259
|
...(params.workingDirectory ? { workingDirectory: params.workingDirectory } : {}),
|
|
257
260
|
});
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
//
|
|
279
|
-
// With a chain declared, the same sentence holds two levels out. The idle
|
|
280
|
-
// watchdog is applied to each raw member, retry wraps that, and fallback
|
|
281
|
-
// wraps the members: `fallback(retry(idle(m0)), retry(idle(m1)), …)`. The
|
|
282
|
-
// idle layer cannot sit outside retry, because its timer would then count a
|
|
283
|
-
// legitimate backoff as provider silence. This order is not a
|
|
284
|
-
// preference. Assembled the other way round — which is what a host gets if
|
|
285
|
-
// it wraps its own chain and hands the result in, because this function
|
|
286
|
-
// would then wrap THAT in retry — an exhausted chain gets restarted from
|
|
287
|
-
// the head by the outer loop and a throttle on the last member is counted
|
|
288
|
-
// by two budgets. Building it here is what makes the order unspellable
|
|
289
|
-
// wrong.
|
|
290
|
-
const chain = [
|
|
291
|
-
{ provider: params.provider },
|
|
292
|
-
...(params.fallbackProviders ?? []),
|
|
293
|
-
];
|
|
294
|
-
assertCostIsAttributable(chain, params.pricing);
|
|
295
|
-
assertBudgetIsMeasurable(params);
|
|
296
|
-
const withRecovery = (provider) => {
|
|
297
|
-
const withIdleBound = withStreamIdleTimeout(provider, {
|
|
298
|
-
idleTimeoutMs: streamIdleTimeoutMs,
|
|
299
|
-
log,
|
|
261
|
+
// The preflight refuses an already foreign log before opening a budget or
|
|
262
|
+
// draining queued topic messages. Repeat after claiming the writer lease:
|
|
263
|
+
// another process may have opened a log that was empty at preflight time.
|
|
264
|
+
await assertSessionLogAttribution(storage.log, params);
|
|
265
|
+
const preludeLease = await PreludeSessionLease.acquire(storage.log, params.sessionId, turnId, params.lease);
|
|
266
|
+
let releaseOwnedLease = () => preludeLease.release();
|
|
267
|
+
try {
|
|
268
|
+
await preludeLease.assertCurrent();
|
|
269
|
+
await assertSessionLogAttribution(storage.log, params);
|
|
270
|
+
const savedBudget = await savedBudgetReference(params, turnId, storage, selectedResumeState);
|
|
271
|
+
const budget = await resolveQueryBudget(params, turnId, storage.tokenBudget, savedBudget);
|
|
272
|
+
const log = TurnContextFactory.buildLogger({
|
|
273
|
+
agentName: params.agentName,
|
|
274
|
+
turnConfig,
|
|
275
|
+
turnId,
|
|
276
|
+
...(params.parentSessionId ? { parentSessionId: params.parentSessionId } : {}),
|
|
277
|
+
sessionId: params.sessionId,
|
|
278
|
+
topicId: params.topicId,
|
|
279
|
+
projectId: params.projectId,
|
|
280
|
+
tenantId: params.tenantId,
|
|
300
281
|
});
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
282
|
+
// Every model call in the turn — the loop's turns, the forced-final
|
|
283
|
+
// summary, advisory and compaction side calls — goes through this one
|
|
284
|
+
// wrapped provider, so the retry policy cannot be bypassed by a code
|
|
285
|
+
// path that happens to hold the raw driver.
|
|
286
|
+
// The logger is passed on purpose: `withProviderRetry` guards every one
|
|
287
|
+
// of its warns behind `options.log`, and this is its only production
|
|
288
|
+
// call site — so without it the "failed, retrying" and "failed, giving
|
|
289
|
+
// up" lines were dead code and a backoff left no trace anywhere.
|
|
290
|
+
//
|
|
291
|
+
// With a chain declared, the same sentence holds two levels out. The idle
|
|
292
|
+
// watchdog is applied to each raw member, retry wraps that, and fallback
|
|
293
|
+
// wraps the members: `fallback(retry(idle(m0)), retry(idle(m1)), …)`. The
|
|
294
|
+
// idle layer cannot sit outside retry, because its timer would then count a
|
|
295
|
+
// legitimate backoff as provider silence. This order is not a
|
|
296
|
+
// preference. Assembled the other way round — which is what a host gets if
|
|
297
|
+
// it wraps its own chain and hands the result in, because this function
|
|
298
|
+
// would then wrap THAT in retry — an exhausted chain gets restarted from
|
|
299
|
+
// the head by the outer loop and a throttle on the last member is counted
|
|
300
|
+
// by two budgets. Building it here is what makes the order unspellable
|
|
301
|
+
// wrong.
|
|
302
|
+
const chain = [
|
|
303
|
+
{ provider: params.provider },
|
|
304
|
+
...(params.fallbackProviders ?? []),
|
|
305
|
+
];
|
|
306
|
+
assertCostIsAttributable(chain, params.pricing);
|
|
307
|
+
assertBudgetIsMeasurable(params);
|
|
308
|
+
const withRecovery = (provider) => {
|
|
309
|
+
const withIdleBound = withStreamIdleTimeout(provider, {
|
|
310
|
+
idleTimeoutMs: streamIdleTimeoutMs,
|
|
306
311
|
log,
|
|
307
|
-
canRetry: () => budget.remaining > 0,
|
|
308
312
|
});
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
313
|
+
const metered = withTokenBudget(withIdleBound, budget);
|
|
314
|
+
return params.retry === false
|
|
315
|
+
? metered
|
|
316
|
+
: withProviderRetry(metered, {
|
|
317
|
+
config: params.retry,
|
|
318
|
+
log,
|
|
319
|
+
canRetry: () => budget.remaining > 0,
|
|
320
|
+
});
|
|
321
|
+
};
|
|
322
|
+
// Who is serving right now, for the turn RECORD rather than for the request.
|
|
323
|
+
//
|
|
324
|
+
// It starts at the head and moves only when the chain does, which is the
|
|
325
|
+
// whole of the truth because the cursor never rewinds. The turn cannot read
|
|
326
|
+
// this off `resilientProvider`: that wrapper reports the head's `id` on
|
|
327
|
+
// purpose, so asking it produces the declaration back — the defect this
|
|
328
|
+
// record exists to fix.
|
|
329
|
+
const serving = {
|
|
330
|
+
current: { index: 0, providerId: params.provider.id },
|
|
331
|
+
};
|
|
332
|
+
const resilientProvider = withProviderFallback(chain.map((member) => ({
|
|
333
|
+
...member,
|
|
334
|
+
provider: withRecovery(member.provider),
|
|
335
|
+
})), {
|
|
336
|
+
log,
|
|
337
|
+
canFallback: () => budget.remaining > 0,
|
|
338
|
+
onSwap: (to) => {
|
|
339
|
+
serving.current = to;
|
|
340
|
+
// `ctx` is declared below and is initialized before anything can
|
|
341
|
+
// call the provider: this fires from inside a `chatStream`, and
|
|
342
|
+
// the first one is issued by the loop that `ctx` is built for.
|
|
343
|
+
ctx.recorder.setServingProvider(to.providerId);
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
// Asked ONCE, here, before the loop exists. Both readers are synchronous
|
|
347
|
+
// and hot, so this can never move inside the iteration — and a driver
|
|
348
|
+
// that rejects, or one that hangs until the turn is cancelled, must not
|
|
349
|
+
// take down a run the table could have served perfectly well. That is
|
|
350
|
+
// why the failure path is a swallow with a log rather than a throw: the
|
|
351
|
+
// window is an optimisation over a working default, not a prerequisite.
|
|
352
|
+
const providerContextWindow = await resolveProviderContextWindow(resilientProvider, turnConfig.model, params.signal, turnConfig.timeoutMs, log);
|
|
353
|
+
const modelContextWindows = new Map();
|
|
354
|
+
if (turnConfig.model)
|
|
355
|
+
modelContextWindows.set(turnConfig.model, providerContextWindow);
|
|
356
|
+
// The mode this conversation was left in, when the turn config names none.
|
|
357
|
+
// Read once, before the loop exists, for the same reason the context
|
|
358
|
+
// window is: the executor's resolver is synchronous and hot.
|
|
359
|
+
//
|
|
360
|
+
// A store that throws is not a turn failure — the turn falls back to the
|
|
361
|
+
// config's answer, which is exactly what it did before this existed.
|
|
362
|
+
const topicState = params.topicStateStore
|
|
363
|
+
? await params.topicStateStore
|
|
364
|
+
.getState(params.topicId, params.tenantId)
|
|
365
|
+
.catch((err) => {
|
|
366
|
+
log.debug('Could not read the topic state; using the turn config', {
|
|
367
|
+
'namzu.topic.id': params.topicId,
|
|
368
|
+
'namzu.error.message': toErrorMessage(err),
|
|
369
|
+
});
|
|
370
|
+
return null;
|
|
371
|
+
})
|
|
372
|
+
: null;
|
|
373
|
+
// Whatever a host left for "the next turn", taken and cleared in one
|
|
374
|
+
// compare-and-set write. Prepended to the messages this turn starts from,
|
|
375
|
+
// so it is in the FIRST request rather than arriving a turn late.
|
|
376
|
+
//
|
|
377
|
+
// Cleared as it is read: a queue read and cleared separately re-delivers
|
|
378
|
+
// on a crash between the two, and "start with this" arriving twice is a
|
|
379
|
+
// different instruction from the one that was left.
|
|
380
|
+
await preludeLease.assertCurrent();
|
|
381
|
+
const queuedForThisRun = params.topicStateStore
|
|
382
|
+
? await drainQueuedMessages(params.topicStateStore, params.topicId, params.tenantId).catch((err) => {
|
|
383
|
+
log.debug('Could not drain the topic queue; starting without it', {
|
|
384
|
+
'namzu.topic.id': params.topicId,
|
|
385
|
+
'namzu.error.message': toErrorMessage(err),
|
|
386
|
+
});
|
|
387
|
+
return [];
|
|
388
|
+
})
|
|
389
|
+
: [];
|
|
390
|
+
// One effective list, used everywhere the turn is seeded from. Three
|
|
391
|
+
// branches below push from it, and computing it at each would be three
|
|
392
|
+
// places to forget the queue.
|
|
393
|
+
//
|
|
394
|
+
// Stored attachments are resolved HERE, once, before the messages reach
|
|
395
|
+
// the turn record. Resolving later — at the provider boundary — would put
|
|
396
|
+
// refs in the durable transcript and in every checkpoint, and a turn
|
|
397
|
+
// resumed against a store that had since forgotten a ref would fail
|
|
398
|
+
// replaying its own history rather than at the moment somebody asked for
|
|
399
|
+
// the bytes. Every failure refuses: a message that silently lost its
|
|
400
|
+
// image is a model answering about a picture it never saw.
|
|
401
|
+
const ctx = TurnContextFactory.build({
|
|
402
|
+
budget,
|
|
403
|
+
...(topicState ? { topicPermissionMode: topicState.permissionMode } : {}),
|
|
404
|
+
...(params.permissionModeRef ? { permissionModeRef: params.permissionModeRef } : {}),
|
|
405
|
+
agentId: params.agentId,
|
|
406
|
+
agentName: params.agentName,
|
|
407
|
+
turnConfig,
|
|
408
|
+
provider: resilientProvider,
|
|
409
|
+
workingDirectory: params.workingDirectory,
|
|
410
|
+
pricing: params.pricing,
|
|
411
|
+
enableActivityTracking: params.enableActivityTracking,
|
|
412
|
+
signal: params.signal,
|
|
413
|
+
sessionId: params.sessionId,
|
|
414
|
+
topicId: params.topicId,
|
|
415
|
+
projectId: params.projectId,
|
|
416
|
+
tenantId: params.tenantId,
|
|
417
|
+
storage,
|
|
418
|
+
turnId,
|
|
419
|
+
...(params.parentSessionId ? { parentSessionId: params.parentSessionId } : {}),
|
|
420
|
+
...(params.parentTurnId ? { parentTurnId: params.parentTurnId } : {}),
|
|
421
|
+
...(params.depth !== undefined ? { depth: params.depth } : {}),
|
|
422
|
+
log,
|
|
423
|
+
});
|
|
424
|
+
// The writer lease, and `session_started` on an empty log. Everything
|
|
425
|
+
// from here to the end of the turn holds the lease, so a failure before
|
|
426
|
+
// the turn body owns it releases it.
|
|
427
|
+
await ctx.recorder.open({
|
|
428
|
+
lease: await preludeLease.transfer(),
|
|
429
|
+
ownLease: preludeLease.ownsLease,
|
|
430
|
+
session: {
|
|
431
|
+
cwd: ctx.cwd,
|
|
432
|
+
...(params.origin ? { origin: params.origin } : {}),
|
|
433
|
+
...(params.forkedFrom ? { forkedFrom: params.forkedFrom } : {}),
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
releaseOwnedLease = async () => {
|
|
437
|
+
await preludeLease.stop();
|
|
438
|
+
await ctx.recorder.release();
|
|
439
|
+
};
|
|
440
|
+
await preludeLease.stop();
|
|
423
441
|
await assertTurnMayStart(params, turnId, storage, ctx);
|
|
424
442
|
// The session log is the conversation's source of truth. A new turn starts
|
|
425
443
|
// from its folded history, and `params.messages` is what this turn adds.
|
|
@@ -428,7 +446,9 @@ export async function prepareTurn(params) {
|
|
|
428
446
|
const history = params.resumeFromCheckpoint
|
|
429
447
|
? []
|
|
430
448
|
: await readFoldedHistory(storage.log);
|
|
431
|
-
const input =
|
|
449
|
+
const input = params.resumeFromCheckpoint
|
|
450
|
+
? []
|
|
451
|
+
: await reconcileCallerMessages(params.messages, history, storage.log, params.continuationMode === true);
|
|
432
452
|
const seeded = queuedForThisRun.length > 0 ? [...queuedForThisRun, ...input] : input;
|
|
433
453
|
let resolvedInitialMessages;
|
|
434
454
|
let attachmentResolutionCancelled = false;
|
|
@@ -457,8 +477,16 @@ export async function prepareTurn(params) {
|
|
|
457
477
|
const preparationSignal = params.signal ?? new AbortController().signal;
|
|
458
478
|
let snapshot;
|
|
459
479
|
try {
|
|
480
|
+
// `ProjectInstructionCallbackContext.messages` promises "the
|
|
481
|
+
// messages accepted before this callback starts" — the durable
|
|
482
|
+
// history this turn folds from the log, not only what THIS turn
|
|
483
|
+
// itself is contributing. Without the fold's own project-instruction
|
|
484
|
+
// snapshot (from an earlier turn of the SAME session) in view, a
|
|
485
|
+
// host that discovers a nested scope from a tool call could never
|
|
486
|
+
// re-derive which files to re-read on the next turn, once the
|
|
487
|
+
// message that named them was reconciled away as already durable.
|
|
460
488
|
const prepared = await awaitProjectInstructionCallback(preparationSignal, () => params.projectInstructionContext?.prepareInitialSnapshot?.({
|
|
461
|
-
messages: [...resolvedInitialMessages],
|
|
489
|
+
messages: [...history.map((entry) => entry.message), ...resolvedInitialMessages],
|
|
462
490
|
signal: preparationSignal,
|
|
463
491
|
}));
|
|
464
492
|
// The callback promise can settle, remove its listener, and queue this
|
|
@@ -640,7 +668,11 @@ export async function prepareTurn(params) {
|
|
|
640
668
|
};
|
|
641
669
|
}
|
|
642
670
|
catch (error) {
|
|
643
|
-
|
|
671
|
+
// Once open succeeds, the recorder normally releases this lease at the
|
|
672
|
+
// end of the turn. Preparation failures, including an open refusal,
|
|
673
|
+
// still belong to this prelude. A caller-supplied lease stays theirs.
|
|
674
|
+
if (preludeLease.ownsLease)
|
|
675
|
+
await releaseOwnedLease().catch(() => undefined);
|
|
644
676
|
throw error;
|
|
645
677
|
}
|
|
646
678
|
}
|
|
@@ -650,7 +682,10 @@ export async function prepareTurn(params) {
|
|
|
650
682
|
*/
|
|
651
683
|
async function savedBudgetReference(params, turnId, storage, selected) {
|
|
652
684
|
if (selected?.budgetBinding) {
|
|
653
|
-
return {
|
|
685
|
+
return {
|
|
686
|
+
binding: selected.budgetBinding,
|
|
687
|
+
accountId: selected.budgetBinding.accountId,
|
|
688
|
+
};
|
|
654
689
|
}
|
|
655
690
|
// A selected state carries only a durable binding. An account held in
|
|
656
691
|
// memory is named by the checkpoint document alone, and a resume must
|
|
@@ -699,28 +734,192 @@ function projectRecordedHistory(history, ids) {
|
|
|
699
734
|
return projected;
|
|
700
735
|
}
|
|
701
736
|
/**
|
|
702
|
-
* `
|
|
703
|
-
*
|
|
704
|
-
*
|
|
737
|
+
* Deep-equal ignoring `id` and `timestamp`: two copies of one message may
|
|
738
|
+
* disagree only on which record named it, and `timestamp` is bookkeeping
|
|
739
|
+
* about when it was authored, not part of what it says — `createUserMessage`
|
|
740
|
+
* and its siblings always stamp `Date.now()`, but the field is optional on
|
|
741
|
+
* `BaseMessage`, and a host that reconstructs history itself (the
|
|
742
|
+
* documented stateless `exec --json` stdin contract never requires it) has
|
|
743
|
+
* no way to recover the original value and must not be read as having
|
|
744
|
+
* edited a message merely for omitting one. Each side is round-tripped
|
|
745
|
+
* through JSON first — "canonical" — so an `undefined`-valued own property
|
|
746
|
+
* (a field a driver or the recorder set explicitly, as opposed to one never
|
|
747
|
+
* mentioned) does not read as a difference: `isDeepStrictEqual` alone treats
|
|
748
|
+
* `{ x: undefined }` and `{}` as unequal, and the durable record went
|
|
749
|
+
* through the same round trip when it was written.
|
|
705
750
|
*/
|
|
706
|
-
function
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
751
|
+
function sameMessageContent(a, b) {
|
|
752
|
+
const { id: _a, timestamp: _ta, ...restA } = a;
|
|
753
|
+
const { id: _b, timestamp: _tb, ...restB } = b;
|
|
754
|
+
return isDeepStrictEqual(JSON.parse(JSON.stringify(restA)), JSON.parse(JSON.stringify(restB)));
|
|
755
|
+
}
|
|
756
|
+
/** A `stale_cached_history` refusal: which way "the log disagrees" this is. */
|
|
757
|
+
function staleCachedHistoryError(kind, message) {
|
|
758
|
+
const id = message.id;
|
|
759
|
+
const guidance = 'pass only new messages (with no id), or re-read history from the session instead of reusing a cached copy.';
|
|
760
|
+
const text = kind === 'edited'
|
|
761
|
+
? `A cached message carries id ${id}, but its content no longer matches what this session's log recorded under that id. A message read from history must not be edited before it is sent back: ${guidance}`
|
|
762
|
+
: kind === 'foreign'
|
|
763
|
+
? `A cached message carries id ${id}, which this session's log never recorded. A host must not mint its own id for a message: pass only messages this session's log gave an id (unedited), or new messages with no id.`
|
|
764
|
+
: `A cached message with no id starts the same as this session's log, but the two diverge further in — this looks like an attempted full resend of the conversation, of a fold this log does not actually hold (edited, reordered, or from elsewhere). Nothing here can tell which of the cache's later messages, if any, are genuinely new: ${guidance}`;
|
|
765
|
+
return new NamzuError({
|
|
766
|
+
code: 'stale_cached_history',
|
|
767
|
+
message: text,
|
|
768
|
+
details: {
|
|
769
|
+
kind,
|
|
770
|
+
role: message.role,
|
|
771
|
+
...(id === undefined ? {} : { messageId: id }),
|
|
772
|
+
},
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* A kind `query()` reconstructs itself every turn rather than trusting a
|
|
777
|
+
* caller's cached copy of it: the per-turn static/dynamic system prompt
|
|
778
|
+
* (`pushSystemMessages`, pushed `transient: true` and so never durably
|
|
779
|
+
* recorded at all — see `manager/session/turn-recorder.ts`), and a
|
|
780
|
+
* project-instruction snapshot (durably recorded, but `Turn.messages` keeps
|
|
781
|
+
* only the LATEST one per `collapseProjectInstructionSnapshots`, while the
|
|
782
|
+
* log keeps every turn's own). A compaction summary and a working-memory
|
|
783
|
+
* note are deliberately NOT here: those two are conversation STATE the
|
|
784
|
+
* kernel cannot re-derive, not prompt scaffolding it rebuilds.
|
|
785
|
+
*
|
|
786
|
+
* Comparing either kind positionally is meaningless — the caller's copy and
|
|
787
|
+
* the log's own history disagree on how many of them exist by construction,
|
|
788
|
+
* never because anything is stale — so both are dropped before the no-id
|
|
789
|
+
* alignment below ever sees them, on both the caller's side and the fold's.
|
|
790
|
+
*/
|
|
791
|
+
function isKernelDerivedMessage(message) {
|
|
792
|
+
if (isProjectInstructionMessage(message))
|
|
793
|
+
return true;
|
|
794
|
+
if (message.role !== 'system')
|
|
795
|
+
return false;
|
|
796
|
+
const content = typeof message.content === 'string' ? message.content : null;
|
|
797
|
+
return !isCompactionMessage(content) && !isWorkingMemoryMessage(content);
|
|
798
|
+
}
|
|
799
|
+
function reconcileNoIdAgainstFold(caller, pool,
|
|
800
|
+
// A wholly no-id caller (this call's `messages` carries no id anywhere)
|
|
801
|
+
// gets the strict `>`: its no-id segment IS its entire request, so a
|
|
802
|
+
// length exactly matching the pool is indistinguishable from "one
|
|
803
|
+
// message that happens to repeat the fold's own last value" (an
|
|
804
|
+
// interrupted turn's own trailing prompt, resent as a caller's ONLY
|
|
805
|
+
// next message — round-3's own probe1/probe3) — favoring "new" there
|
|
806
|
+
// is the whole point of this rule. A caller that ALSO sent at least one
|
|
807
|
+
// id-carrying message this same call is not that: its no-id segment is
|
|
808
|
+
// part of a larger, structured resend the id path already anchors, so
|
|
809
|
+
// an EXACT length match is trusted as "everything, nothing new" (`>=`)
|
|
810
|
+
// — the shape a wholesale history replacement (a compaction, or the
|
|
811
|
+
// provider-rejected-image repair, which records this way for the same
|
|
812
|
+
// reason: `TurnRecorder.replaceMessages`) produces on its very next
|
|
813
|
+
// turn, before any new message has been added at all.
|
|
814
|
+
hasId) {
|
|
815
|
+
if (hasId ? caller.length >= pool.length : caller.length > pool.length) {
|
|
816
|
+
let fullPrefix = true;
|
|
817
|
+
for (let i = 0; i < pool.length; i++) {
|
|
818
|
+
if (!sameMessageContent(caller[i], pool[i])) {
|
|
819
|
+
fullPrefix = false;
|
|
820
|
+
break;
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
if (fullPrefix)
|
|
824
|
+
return 'trimmed';
|
|
825
|
+
if (pool.length > 0 && sameMessageContent(caller[0], pool[0])) {
|
|
826
|
+
return 'unaligned';
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
return 'new';
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* `messages` reconciled against this session's log, by id where a message
|
|
833
|
+
* carries one, and otherwise by the anchored, whole-cache rule
|
|
834
|
+
* {@link reconcileNoIdAgainstFold} implements — never by walking the two
|
|
835
|
+
* positionally message by message, and never by searching for some aligned
|
|
836
|
+
* position, either of which reads a genuine echo of old content and a
|
|
837
|
+
* coincidentally-identical new message as the same shape.
|
|
838
|
+
*
|
|
839
|
+
* A message carrying an id already durable under it (matching content) is
|
|
840
|
+
* dropped — the fold supplies it, from wherever compaction has since put
|
|
841
|
+
* it, even from before a compaction summarized it away, since the log
|
|
842
|
+
* remembers every id it ever gave out. One whose id the log never recorded,
|
|
843
|
+
* or whose content no longer matches what the log recorded under it, is
|
|
844
|
+
* refused outright (`stale_cached_history`, `'foreign'` / `'edited'`).
|
|
845
|
+
*
|
|
846
|
+
* A message with no id, once the kernel-derived kinds above are set aside
|
|
847
|
+
* from both sides, joins its OWN sequence of no-id messages (in their
|
|
848
|
+
* original relative order), reconciled against the fold's own remaining
|
|
849
|
+
* pool: every fold entry EXCEPT one whose id an id-carrying caller message
|
|
850
|
+
* already claimed above (so nothing is offered to both mechanisms) and a
|
|
851
|
+
* no-id one (a compaction summary, or a record predating per-message ids).
|
|
852
|
+
* A caller using no ids at all thus reconciles exactly as
|
|
853
|
+
* {@link reconcileNoIdAgainstFold} describes, against the whole fold,
|
|
854
|
+
* nothing claimed. A caller that CAN only ever id some roles — a protocol
|
|
855
|
+
* adapter (AG-UI) that mints an id for an assistant/tool message it
|
|
856
|
+
* produced but never for one its own client authored — still reconciles
|
|
857
|
+
* its no-id messages correctly, against whatever the id path left
|
|
858
|
+
* unclaimed, rather than an empty pool that would read every one of them
|
|
859
|
+
* as new (which is harmless here — "new" is always a safe answer — but
|
|
860
|
+
* would duplicate needlessly).
|
|
861
|
+
*
|
|
862
|
+
* See {@link reconcileNoIdAgainstFold} for exactly which shape is recognized
|
|
863
|
+
* as "my cache, trimmed to a prefix of the fold" (dropped), which is
|
|
864
|
+
* refused as `stale_cached_history` (`'unaligned'`) as an attempted resend
|
|
865
|
+
* of a fold this log does not hold, and — deliberately, the rest — which is
|
|
866
|
+
* never matched by value at all and so always kept as new.
|
|
867
|
+
*/
|
|
868
|
+
async function reconcileCallerMessages(messages, history, log, continuationMode) {
|
|
869
|
+
const hasId = messages.some((message) => message.id !== undefined);
|
|
870
|
+
const recordedById = hasId ? await readEverRecordedMessages(log) : undefined;
|
|
871
|
+
// Ids a caller message already claimed by direct lookup above: a fold
|
|
872
|
+
// entry that gave one of THESE out must not also be offered to the no-id
|
|
873
|
+
// alignment below, or a message that already reconciled by id could be
|
|
874
|
+
// matched a second time by value. A caller need not be all-or-nothing
|
|
875
|
+
// about ids for this to matter — a protocol adapter (AG-UI) that can
|
|
876
|
+
// only ever attach an id to an assistant/tool message it itself minted,
|
|
877
|
+
// never to a message its OWN client authored, sends exactly this mix.
|
|
878
|
+
const claimedIds = new Set();
|
|
879
|
+
const noIdIndices = [];
|
|
880
|
+
const noIdMessages = [];
|
|
881
|
+
for (let index = 0; index < messages.length; index++) {
|
|
882
|
+
const message = messages[index];
|
|
883
|
+
const id = message.id;
|
|
884
|
+
if (id !== undefined) {
|
|
885
|
+
const recorded = recordedById?.get(id);
|
|
886
|
+
if (recorded === undefined)
|
|
887
|
+
throw staleCachedHistoryError('foreign', message);
|
|
888
|
+
if (!sameMessageContent(recorded, message))
|
|
889
|
+
throw staleCachedHistoryError('edited', message);
|
|
890
|
+
claimedIds.add(id);
|
|
891
|
+
continue; // already durable: the fold supplies it
|
|
714
892
|
}
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
893
|
+
// Outside `continuationMode`, the kernel rebuilds the system floor and
|
|
894
|
+
// collapses every project-instruction snapshot but the latest
|
|
895
|
+
// (`pushSystemMessages`, `collapseProjectInstructionSnapshots`
|
|
896
|
+
// downstream of this function) regardless of what a caller sent, so a
|
|
897
|
+
// no-id message of either kind is dropped here rather than offered to
|
|
898
|
+
// the alignment below, where the fold's OWN asymmetric copies of them
|
|
899
|
+
// (one durable record per turn that had one, never collapsed) would
|
|
900
|
+
// corrupt it. `continuationMode` turns that rebuilding OFF — the
|
|
901
|
+
// caller's array IS the request, verbatim — so there is no "the
|
|
902
|
+
// kernel discards this anyway" to lean on; a message of either kind
|
|
903
|
+
// is ordinary content there; unforced-through, it would just report
|
|
904
|
+
// a passthrough-only conversation as no-id forever - a genuinely new
|
|
905
|
+
// no-id system message (a `continuationMode` caller's own) has to
|
|
906
|
+
// reconcile like anything else, not vanish.
|
|
907
|
+
if (!continuationMode && isKernelDerivedMessage(message))
|
|
908
|
+
continue;
|
|
909
|
+
noIdIndices.push(index);
|
|
910
|
+
noIdMessages.push(message);
|
|
911
|
+
}
|
|
912
|
+
const pool = history
|
|
913
|
+
.filter((entry) => entry.messageId === undefined || !claimedIds.has(entry.messageId))
|
|
914
|
+
.map((entry) => entry.message)
|
|
915
|
+
.filter((message) => continuationMode || !isKernelDerivedMessage(message));
|
|
916
|
+
const reconciliation = reconcileNoIdAgainstFold(noIdMessages, pool, hasId);
|
|
917
|
+
if (reconciliation === 'unaligned') {
|
|
918
|
+
throw staleCachedHistoryError('unaligned', noIdMessages[0]);
|
|
720
919
|
}
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
return messages.
|
|
920
|
+
const keptNoIdIndices = reconciliation === 'trimmed' ? noIdIndices.slice(pool.length) : noIdIndices;
|
|
921
|
+
const newIndices = new Set(keptNoIdIndices);
|
|
922
|
+
return messages.filter((_message, index) => newIndices.has(index));
|
|
724
923
|
}
|
|
725
924
|
/**
|
|
726
925
|
* A new turn named by the host must not reuse the id of a turn the session
|