@namzu/sdk 46.0.0 → 48.1.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 +351 -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 +8 -0
- package/dist/authorization/gate.d.ts.map +1 -1
- package/dist/authorization/gate.js +12 -1
- 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 +8 -1
- package/dist/authorization/rules.js.map +1 -1
- package/dist/authorization/shell-lexer.d.ts +19 -4
- package/dist/authorization/shell-lexer.d.ts.map +1 -1
- package/dist/authorization/shell-lexer.js +91 -65
- 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 +71 -4
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/mcp/client.d.ts +32 -4
- package/dist/connector/mcp/client.d.ts.map +1 -1
- package/dist/connector/mcp/client.js +383 -5
- 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/era.d.ts.map +1 -1
- package/dist/connector/mcp/era.js +7 -0
- package/dist/connector/mcp/era.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/mcp/streamable-http.d.ts +15 -0
- package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
- package/dist/connector/mcp/streamable-http.js +281 -6
- package/dist/connector/mcp/streamable-http.js.map +1 -1
- 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 +1 -0
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +146 -18
- 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/initiative.d.ts +6 -6
- package/dist/manager/resident/learning-observation.d.ts +4 -4
- package/dist/manager/resident/learning.d.ts +36 -36
- package/dist/manager/resident/outbox.d.ts +4 -4
- 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/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 +24 -11
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +45 -9
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +6 -4
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +8 -3
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +13 -2
- 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 +7 -7
- package/dist/registry/tool/callable.d.ts.map +1 -1
- package/dist/registry/tool/callable.js +6 -7
- package/dist/registry/tool/callable.js.map +1 -1
- 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 -727
- 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 +45 -2
- package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.js +189 -5
- package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +33 -3
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +86 -10
- 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 +22 -3
- package/dist/runtime/query/review-policy.d.ts.map +1 -1
- package/dist/runtime/query/review-policy.js +84 -6
- 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/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +2 -0
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/retention/archive.js +1 -1
- package/dist/session/retention/archive.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 +12 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +19 -0
- package/dist/skills/registry.js.map +1 -1
- package/dist/store/evidence/index-page.d.ts +2 -2
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +2 -0
- package/dist/store/session/disk.js.map +1 -1
- 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/browser.js +2 -2
- package/dist/tools/builtins/browser.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +19 -11
- 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/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/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 +10 -0
- package/dist/tools/defineTool.d.ts.map +1 -1
- package/dist/tools/defineTool.js +17 -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/schedule-tool.d.ts.map +1 -1
- package/dist/tools/schedules/schedule-tool.js +94 -14
- package/dist/tools/schedules/schedule-tool.js.map +1 -1
- package/dist/tools/schedules/types.d.ts +52 -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/scheduler.d.ts +6 -1
- package/dist/types/agent/scheduler.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/agent/task.d.ts +19 -1
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/authorization/index.d.ts +49 -12
- package/dist/types/authorization/index.d.ts.map +1 -1
- package/dist/types/authorization/index.js +6 -0
- package/dist/types/authorization/index.js.map +1 -1
- package/dist/types/connector/mcp.d.ts +45 -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/session/sub-session.d.ts +2 -0
- package/dist/types/session/sub-session.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +152 -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 +1 -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 +21 -1
- package/src/authorization/program.ts +773 -0
- package/src/authorization/reexec-wrapper.ts +589 -0
- package/src/authorization/rules.ts +18 -1
- package/src/authorization/shell-lexer.ts +104 -59
- 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 +73 -3
- package/src/connector/mcp/client.ts +425 -6
- package/src/connector/mcp/discovery.ts +60 -0
- package/src/connector/mcp/era.ts +7 -0
- package/src/connector/mcp/index.ts +13 -0
- package/src/connector/mcp/mcp-toolset.ts +515 -0
- package/src/connector/mcp/streamable-http.ts +302 -5
- 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 +167 -19
- 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/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 +136 -7
- package/src/public-tools.ts +24 -4
- package/src/public-types.ts +60 -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 +8 -9
- package/src/registry/tool/execute.ts +16 -846
- 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 +228 -6
- package/src/runtime/query/executor.ts +110 -12
- 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 +87 -9
- 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/scheduler/local.ts +2 -0
- package/src/session/retention/archive.ts +1 -1
- package/src/skills/index.ts +1 -1
- package/src/skills/registry.ts +25 -0
- package/src/store/session/disk.ts +3 -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/browser.ts +2 -2
- package/src/tools/builtins/computer-use.ts +21 -11
- package/src/tools/builtins/edit.ts +12 -2
- package/src/tools/builtins/json-string-hint.ts +16 -0
- package/src/tools/builtins/search-tools.ts +7 -20
- 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 +28 -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/schedule-tool.ts +107 -14
- package/src/tools/schedules/types.ts +52 -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/scheduler.ts +6 -1
- package/src/types/agent/supervisor.ts +5 -2
- package/src/types/agent/task.ts +21 -1
- package/src/types/authorization/index.ts +12 -0
- package/src/types/connector/mcp.ts +46 -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/session/sub-session.ts +2 -0
- package/src/types/tool/index.ts +154 -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,15 +1,17 @@
|
|
|
1
1
|
import { SpanStatusCode } from '@opentelemetry/api';
|
|
2
2
|
import { assertHostedWebSearchSupported, assertNativeStructuredOutputSupported, } from '../../../provider/capabilities.js';
|
|
3
|
-
import { isProviderRequestError } from '../../../provider/errors.js';
|
|
3
|
+
import { ProviderRequestError, isProviderRequestError } from '../../../provider/errors.js';
|
|
4
4
|
import { StreamTextAccumulator } from '../../../provider/stream-text.js';
|
|
5
|
+
import { INTERLEAVED_TOOL_INPUT_PARSE_ERROR, ToolCallIndexer, describeToolCallFramingViolation, describeToolCallInterleaving, isUnindexedFragment, toolCallFramingViolation, } from '../../../provider/tool-call-framing.js';
|
|
5
6
|
import { GENAI, NAMZU, chatSpanName, parentContext } from '../../../telemetry/attributes.js';
|
|
6
7
|
import { recordModelDuration, recordTimeToFirstToken, recordTokenUsage, } from '../../../telemetry/metrics.js';
|
|
7
8
|
import { getTracer } from '../../../telemetry/runtime-accessors.js';
|
|
8
9
|
import { mergeTokenUsage } from '../../../types/common/index.js';
|
|
9
10
|
import { NamzuError } from '../../../types/errors/index.js';
|
|
10
11
|
import { ProviderError } from '../../../types/provider/errors.js';
|
|
11
|
-
import { generateMessageId } from '../../../utils/id.js';
|
|
12
|
+
import { generateMessageId, generateToolCallId } from '../../../utils/id.js';
|
|
12
13
|
import { streamWithProviderRejectedImageRecovery } from './provider-rejected-image.js';
|
|
14
|
+
import { capPartialArguments, classifyUnreadableToolInput, parseToolArguments, } from './tool-input.js';
|
|
13
15
|
/**
|
|
14
16
|
* Map a provider's coarse `finishReason` plus the orchestrator's
|
|
15
17
|
* `forceFinalize` flag onto the per-message {@link MessageStopReason}
|
|
@@ -46,8 +48,26 @@ function synthesizeMessageStopReason(finishReason, forceFinalize) {
|
|
|
46
48
|
* - Stream ends without `finishReason` (a known vendor-SDK failure mode
|
|
47
49
|
* dropped message_stop): we still emit `message_completed` from a
|
|
48
50
|
* finally-style fall-through path with `stopReason: 'refusal'`.
|
|
49
|
-
* -
|
|
50
|
-
*
|
|
51
|
+
* - A tool-call fragment before its call's id or name: kept in the call's
|
|
52
|
+
* buffer, keyed by index, and announced in one `tool_input_delta` right
|
|
53
|
+
* after `tool_input_started`, once both are known. It used to be dropped
|
|
54
|
+
* with a warning, and the call then failed to parse and was reported as
|
|
55
|
+
* cut off.
|
|
56
|
+
* - A call whose id never arrives, on a fragment or on `toolCallEnd`: given
|
|
57
|
+
* one when the stream ends, and announced then. It used to reach the
|
|
58
|
+
* executor with an empty id and none of its arguments. Every call's
|
|
59
|
+
* `tool_input_completed` follows its `tool_input_started`, under the same
|
|
60
|
+
* id, whatever id `toolCallEnd` carries.
|
|
61
|
+
* - A new id on an index another call holds: the stream is refused with a
|
|
62
|
+
* classified `ProviderRequestError` naming the violation. The second
|
|
63
|
+
* call's arguments used to be appended to the first's, and the model was
|
|
64
|
+
* told its call had been cut off.
|
|
65
|
+
* - Arguments that do not parse: classified once the stream has ended, as
|
|
66
|
+
* `truncated` or `malformed` (`ToolInputError`). Only the call the model's
|
|
67
|
+
* last output went to can be `truncated`, and only when the stream reported
|
|
68
|
+
* an output limit, a content filter or nothing at all. A failed parse at
|
|
69
|
+
* `toolCallEnd` defers its `tool_input_completed` to then, because what
|
|
70
|
+
* follows the call and the finish reason arrive after the block closes.
|
|
51
71
|
* - `chunk.error`: when no tool input is recoverable, we surface as
|
|
52
72
|
* a thrown error after emitting the message_completed terminator so
|
|
53
73
|
* consumer cards still close. If a tool-use block was already open,
|
|
@@ -135,6 +155,12 @@ sessionId) {
|
|
|
135
155
|
const model = '';
|
|
136
156
|
const text = new StreamTextAccumulator();
|
|
137
157
|
let finishReason = 'stop';
|
|
158
|
+
// What the stream itself reported, if anything. `finishReason` above
|
|
159
|
+
// defaults to 'stop' for the response; classifying unreadable tool input
|
|
160
|
+
// needs to know a stream that reported nothing from one that finished.
|
|
161
|
+
let reportedFinishReason;
|
|
162
|
+
// Which limit a 'length' finish reached, when it was the context window.
|
|
163
|
+
let finishDetail;
|
|
138
164
|
let usage = {
|
|
139
165
|
promptTokens: 0,
|
|
140
166
|
completionTokens: 0,
|
|
@@ -142,7 +168,45 @@ sessionId) {
|
|
|
142
168
|
cachedTokens: 0,
|
|
143
169
|
cacheWriteTokens: 0,
|
|
144
170
|
};
|
|
171
|
+
// Characters the model streamed so far: text, reasoning and every tool
|
|
172
|
+
// call's arguments. Each call records it as it begins, so a cut-off call's
|
|
173
|
+
// share of the response says whether the call itself or what came before
|
|
174
|
+
// it filled the response.
|
|
175
|
+
let streamedLength = 0;
|
|
145
176
|
const toolBuckets = new Map();
|
|
177
|
+
// Places a fragment that came without an index; see `ToolCallIndexer`.
|
|
178
|
+
const toolIndexer = new ToolCallIndexer();
|
|
179
|
+
// The call the model's latest output went to, or `undefined` once text,
|
|
180
|
+
// reasoning or a hosted tool followed it. An output limit, a content
|
|
181
|
+
// filter or a dropped stream stops the response wherever it is, so this
|
|
182
|
+
// is the only call one of them can have cut off. Every other call was
|
|
183
|
+
// complete when the model moved on from it.
|
|
184
|
+
let lastOutputCall;
|
|
185
|
+
// Announce a call once its id and name are both known: `tool_input_started`,
|
|
186
|
+
// then, as one delta, whatever arguments arrived before that.
|
|
187
|
+
async function* announceToolCall(bucket) {
|
|
188
|
+
if (bucket.started || !bucket.id || !bucket.name)
|
|
189
|
+
return;
|
|
190
|
+
bucket.started = true;
|
|
191
|
+
await emitEvent({
|
|
192
|
+
type: 'tool_input_started',
|
|
193
|
+
turnId,
|
|
194
|
+
iteration,
|
|
195
|
+
messageId,
|
|
196
|
+
toolUseId: bucket.id,
|
|
197
|
+
toolName: bucket.name,
|
|
198
|
+
});
|
|
199
|
+
yield* drainPending();
|
|
200
|
+
if (bucket.argsBuf) {
|
|
201
|
+
await emitEvent({
|
|
202
|
+
type: 'tool_input_delta',
|
|
203
|
+
turnId,
|
|
204
|
+
toolUseId: bucket.id,
|
|
205
|
+
partialJson: bucket.argsBuf,
|
|
206
|
+
});
|
|
207
|
+
yield* drainPending();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
146
210
|
// Reasoning blocks, bucketed by stream index exactly like tool calls.
|
|
147
211
|
// Order matters on replay — a provider wants the assistant turn echoed
|
|
148
212
|
// verbatim — so the map is drained in index order at the end.
|
|
@@ -154,6 +218,8 @@ sessionId) {
|
|
|
154
218
|
let replayState;
|
|
155
219
|
let streamError;
|
|
156
220
|
let streamCause;
|
|
221
|
+
/** The stream broke tool-call framing; nothing it sent becomes a tool call. */
|
|
222
|
+
let framingViolated = false;
|
|
157
223
|
const streamParams = {
|
|
158
224
|
...params,
|
|
159
225
|
stream: true,
|
|
@@ -266,6 +332,11 @@ sessionId) {
|
|
|
266
332
|
recordTimeToFirstToken(params.model, Date.now() - callStartedAt);
|
|
267
333
|
}
|
|
268
334
|
if (chunk.delta.hostedTool) {
|
|
335
|
+
// A hosted tool starting is the model moving on. Its later status
|
|
336
|
+
// changes are not new output: a driver may report the completion
|
|
337
|
+
// only once the response is over.
|
|
338
|
+
if (chunk.delta.hostedTool.status === 'running')
|
|
339
|
+
lastOutputCall = undefined;
|
|
269
340
|
await emitEvent({
|
|
270
341
|
type: 'hosted_tool',
|
|
271
342
|
turnId,
|
|
@@ -279,6 +350,10 @@ sessionId) {
|
|
|
279
350
|
const reasoning = chunk.delta.reasoning;
|
|
280
351
|
if (reasoning) {
|
|
281
352
|
let bucket = reasoningBuckets.get(reasoning.index);
|
|
353
|
+
// A new reasoning block, or more of its text, is the model moving
|
|
354
|
+
// on. A signature or a close is not: it ends a block already begun.
|
|
355
|
+
if (!bucket || reasoning.text)
|
|
356
|
+
lastOutputCall = undefined;
|
|
282
357
|
if (!bucket) {
|
|
283
358
|
bucket = { type: reasoning.type ?? 'thinking', text: '' };
|
|
284
359
|
reasoningBuckets.set(reasoning.index, bucket);
|
|
@@ -300,6 +375,7 @@ sessionId) {
|
|
|
300
375
|
bucket.encrypted = reasoning.encrypted;
|
|
301
376
|
if (reasoning.text) {
|
|
302
377
|
bucket.text += reasoning.text;
|
|
378
|
+
streamedLength += reasoning.text.length;
|
|
303
379
|
await emitEvent({
|
|
304
380
|
type: 'reasoning_delta',
|
|
305
381
|
turnId,
|
|
@@ -324,6 +400,13 @@ sessionId) {
|
|
|
324
400
|
}
|
|
325
401
|
}
|
|
326
402
|
if (chunk.delta.content) {
|
|
403
|
+
// Text a driver adds of its own, such as a list of sources, comes
|
|
404
|
+
// after the model stopped. It is not the model moving on from a
|
|
405
|
+
// call, and not part of what came before one.
|
|
406
|
+
if (chunk.delta.contentOrigin !== 'driver') {
|
|
407
|
+
streamedLength += chunk.delta.content.length;
|
|
408
|
+
lastOutputCall = undefined;
|
|
409
|
+
}
|
|
327
410
|
await emitEvent({
|
|
328
411
|
type: 'text_delta',
|
|
329
412
|
turnId,
|
|
@@ -335,7 +418,92 @@ sessionId) {
|
|
|
335
418
|
yield* drainPending();
|
|
336
419
|
}
|
|
337
420
|
for (const tc of chunk.delta.toolCalls ?? []) {
|
|
338
|
-
|
|
421
|
+
if (isUnindexedFragment(tc)) {
|
|
422
|
+
// Neither an id nor an index: never a guess. Evaluated fresh
|
|
423
|
+
// for THIS fragment, not decided once when some call opened —
|
|
424
|
+
// a call's buffer stops accepting text the moment it becomes
|
|
425
|
+
// one complete JSON value, and only the state right now says
|
|
426
|
+
// which open calls still could be this fragment's target.
|
|
427
|
+
const placement = toolIndexer.placeUnindexedFragment((i) => {
|
|
428
|
+
const b = toolBuckets.get(i);
|
|
429
|
+
if (!b || b.completed)
|
|
430
|
+
return false;
|
|
431
|
+
return b.argsBuf === '' || !parseToolArguments(b.argsBuf).ok;
|
|
432
|
+
});
|
|
433
|
+
if (typeof placement === 'number') {
|
|
434
|
+
let bucket = toolBuckets.get(placement);
|
|
435
|
+
if (!bucket) {
|
|
436
|
+
bucket = {
|
|
437
|
+
id: '',
|
|
438
|
+
name: '',
|
|
439
|
+
argsBuf: '',
|
|
440
|
+
started: false,
|
|
441
|
+
completed: false,
|
|
442
|
+
parsed: null,
|
|
443
|
+
precedingLength: streamedLength,
|
|
444
|
+
};
|
|
445
|
+
toolBuckets.set(placement, bucket);
|
|
446
|
+
lastOutputCall = bucket;
|
|
447
|
+
}
|
|
448
|
+
if (tc.function?.name && !bucket.name)
|
|
449
|
+
bucket.name = tc.function.name;
|
|
450
|
+
const fragment = tc.function?.arguments;
|
|
451
|
+
if (fragment) {
|
|
452
|
+
bucket.argsBuf += fragment;
|
|
453
|
+
streamedLength += fragment.length;
|
|
454
|
+
lastOutputCall = bucket;
|
|
455
|
+
}
|
|
456
|
+
if (!bucket.started) {
|
|
457
|
+
yield* announceToolCall(bucket);
|
|
458
|
+
}
|
|
459
|
+
else if (fragment) {
|
|
460
|
+
await emitEvent({
|
|
461
|
+
type: 'tool_input_delta',
|
|
462
|
+
turnId,
|
|
463
|
+
toolUseId: bucket.id,
|
|
464
|
+
partialJson: fragment,
|
|
465
|
+
});
|
|
466
|
+
yield* drainPending();
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
// More than one open call could still have taken this
|
|
471
|
+
// fragment, or none could: every candidate is
|
|
472
|
+
// unreadable, and the fragment itself is attributed to
|
|
473
|
+
// none of them — appending it to a guess is exactly the
|
|
474
|
+
// splice this exists to refuse.
|
|
475
|
+
for (const candidate of placement.candidates) {
|
|
476
|
+
const stuck = toolBuckets.get(candidate.index);
|
|
477
|
+
if (stuck)
|
|
478
|
+
stuck.interleaved = true;
|
|
479
|
+
}
|
|
480
|
+
log.warn('tool-call fragments arrived interleaved with no index', {
|
|
481
|
+
[NAMZU.TURN_ID]: turnId,
|
|
482
|
+
[NAMZU.ITERATION]: iteration,
|
|
483
|
+
'exception.message': describeToolCallInterleaving({
|
|
484
|
+
kind: 'interleaved_without_index',
|
|
485
|
+
candidates: placement.candidates,
|
|
486
|
+
}),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
const index = toolIndexer.indexOf(tc);
|
|
492
|
+
let bucket = toolBuckets.get(index);
|
|
493
|
+
const violation = toolCallFramingViolation(bucket, tc, index);
|
|
494
|
+
if (violation) {
|
|
495
|
+
// Refused, not repaired: after either violation no buffer can be
|
|
496
|
+
// trusted to hold one call's arguments, and guessing is what
|
|
497
|
+
// told a model its intact call had been cut off. Thrown so the
|
|
498
|
+
// stream is torn down like any other stream failure; the flag
|
|
499
|
+
// keeps the recovery below from turning it into tool calls.
|
|
500
|
+
framingViolated = true;
|
|
501
|
+
throw new ProviderRequestError({
|
|
502
|
+
kind: 'server',
|
|
503
|
+
providerId: provider.id,
|
|
504
|
+
detail: describeToolCallFramingViolation(violation),
|
|
505
|
+
});
|
|
506
|
+
}
|
|
339
507
|
if (!bucket) {
|
|
340
508
|
bucket = {
|
|
341
509
|
id: tc.id ?? '',
|
|
@@ -344,77 +512,89 @@ sessionId) {
|
|
|
344
512
|
started: false,
|
|
345
513
|
completed: false,
|
|
346
514
|
parsed: null,
|
|
347
|
-
|
|
515
|
+
precedingLength: streamedLength,
|
|
348
516
|
};
|
|
349
|
-
toolBuckets.set(
|
|
517
|
+
toolBuckets.set(index, bucket);
|
|
518
|
+
lastOutputCall = bucket;
|
|
350
519
|
}
|
|
351
520
|
if (tc.id && !bucket.id)
|
|
352
521
|
bucket.id = tc.id;
|
|
353
522
|
if (tc.function?.name && !bucket.name)
|
|
354
523
|
bucket.name = tc.function.name;
|
|
355
|
-
|
|
356
|
-
|
|
524
|
+
// Arguments belong to the call at their index whether or not its
|
|
525
|
+
// id has arrived yet: the index is what groups a call's fragments.
|
|
526
|
+
// Until the call can be announced they are only buffered, and the
|
|
527
|
+
// announcement carries them.
|
|
528
|
+
const fragment = tc.function?.arguments;
|
|
529
|
+
if (fragment) {
|
|
530
|
+
bucket.argsBuf += fragment;
|
|
531
|
+
streamedLength += fragment.length;
|
|
532
|
+
lastOutputCall = bucket;
|
|
533
|
+
}
|
|
534
|
+
if (!bucket.started) {
|
|
535
|
+
yield* announceToolCall(bucket);
|
|
536
|
+
}
|
|
537
|
+
else if (fragment) {
|
|
357
538
|
await emitEvent({
|
|
358
|
-
type: '
|
|
539
|
+
type: 'tool_input_delta',
|
|
359
540
|
turnId,
|
|
360
|
-
iteration,
|
|
361
|
-
messageId,
|
|
362
541
|
toolUseId: bucket.id,
|
|
363
|
-
|
|
542
|
+
partialJson: fragment,
|
|
364
543
|
});
|
|
365
544
|
yield* drainPending();
|
|
366
545
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
546
|
+
}
|
|
547
|
+
if (chunk.delta.toolCallEnd) {
|
|
548
|
+
const { id: endId } = chunk.delta.toolCallEnd;
|
|
549
|
+
const index = toolIndexer.closedIndex(chunk.delta.toolCallEnd);
|
|
550
|
+
const bucket = index === undefined ? undefined : toolBuckets.get(index);
|
|
551
|
+
if (bucket && !bucket.completed) {
|
|
552
|
+
// The block close names the call too; a call whose id no
|
|
553
|
+
// fragment carried is announced by it.
|
|
554
|
+
if (!bucket.id && endId)
|
|
555
|
+
bucket.id = endId;
|
|
556
|
+
yield* announceToolCall(bucket);
|
|
557
|
+
}
|
|
558
|
+
// Settled here only once announced, and always under the id it
|
|
559
|
+
// was announced with, which is the id it runs under. A close
|
|
560
|
+
// with an empty id, or for a call whose name never came, leaves
|
|
561
|
+
// the call to the loop after the stream, which gives it an id
|
|
562
|
+
// and announces it first. The close's own id was used here
|
|
563
|
+
// before: an empty one completed a call that was not yet
|
|
564
|
+
// announced, under an id no other event of the call carried.
|
|
565
|
+
if (bucket?.started && !bucket.completed) {
|
|
566
|
+
bucket.completed = true;
|
|
567
|
+
// An interleaved call is never taken at its buffer's word: it
|
|
568
|
+
// may hold another call's spliced-in fragments, or be missing
|
|
569
|
+
// whatever an id-less fragment carried elsewhere instead.
|
|
570
|
+
const parsed = bucket.interleaved
|
|
571
|
+
? { ok: false, parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR }
|
|
572
|
+
: parseToolArguments(bucket.argsBuf);
|
|
573
|
+
if (parsed.ok) {
|
|
574
|
+
bucket.parsed = parsed.value;
|
|
378
575
|
await emitEvent({
|
|
379
|
-
type: '
|
|
576
|
+
type: 'tool_input_completed',
|
|
380
577
|
turnId,
|
|
381
578
|
toolUseId: bucket.id,
|
|
382
|
-
|
|
579
|
+
input: parsed.value,
|
|
383
580
|
});
|
|
384
581
|
yield* drainPending();
|
|
385
582
|
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
let parsed = {};
|
|
394
|
-
try {
|
|
395
|
-
parsed = bucket.argsBuf ? JSON.parse(bucket.argsBuf) : {};
|
|
396
|
-
}
|
|
397
|
-
catch (err) {
|
|
398
|
-
bucket.inputTruncated = true;
|
|
399
|
-
log.warn('tool input JSON parse failed at content_block_stop', {
|
|
400
|
-
[NAMZU.TURN_ID]: turnId,
|
|
401
|
-
'namzu.runtime.tool_use_id': endId,
|
|
402
|
-
'exception.message': err instanceof Error ? err.message : String(err),
|
|
403
|
-
});
|
|
583
|
+
else {
|
|
584
|
+
// Whether this call was cut off or malformed is decided by
|
|
585
|
+
// what follows it and how the response ends, and both
|
|
586
|
+
// arrive after the block closes. Its completion is emitted
|
|
587
|
+
// once the stream is over.
|
|
588
|
+
bucket.parsed = {};
|
|
589
|
+
bucket.pendingFailure = parsed;
|
|
404
590
|
}
|
|
405
|
-
bucket.parsed = parsed;
|
|
406
|
-
await emitEvent({
|
|
407
|
-
type: 'tool_input_completed',
|
|
408
|
-
turnId,
|
|
409
|
-
toolUseId: endId,
|
|
410
|
-
input: parsed,
|
|
411
|
-
...(bucket.inputTruncated ? { inputTruncated: true } : {}),
|
|
412
|
-
});
|
|
413
|
-
yield* drainPending();
|
|
414
591
|
}
|
|
415
592
|
}
|
|
416
|
-
if (chunk.finishReason)
|
|
593
|
+
if (chunk.finishReason) {
|
|
417
594
|
finishReason = chunk.finishReason;
|
|
595
|
+
reportedFinishReason = chunk.finishReason;
|
|
596
|
+
finishDetail = chunk.finishReason === 'length' ? chunk.finishDetail : undefined;
|
|
597
|
+
}
|
|
418
598
|
// Merge (per-field max), not last-write-wins: a late usage frame that
|
|
419
599
|
// omits input/cache tokens must not zero the counts seen earlier in the
|
|
420
600
|
// stream, which would under-report this turn's accumulated usage.
|
|
@@ -472,76 +652,111 @@ sessionId) {
|
|
|
472
652
|
// Cleanup cannot replace the original stream outcome.
|
|
473
653
|
}
|
|
474
654
|
}
|
|
475
|
-
//
|
|
476
|
-
//
|
|
477
|
-
//
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
655
|
+
// A call whose id never arrived is still one call: its index grouped its
|
|
656
|
+
// fragments. Only the name its result is filed under is missing, so it is
|
|
657
|
+
// given one, as a driver does for a wire that sends none, and announced.
|
|
658
|
+
for (const bucket of toolBuckets.values()) {
|
|
659
|
+
if (bucket.id || !bucket.name)
|
|
660
|
+
continue;
|
|
661
|
+
bucket.id = generateToolCallId();
|
|
662
|
+
log.warn('tool call arrived without an id; one was assigned', {
|
|
663
|
+
[NAMZU.TURN_ID]: turnId,
|
|
664
|
+
'namzu.runtime.tool_use_id': bucket.id,
|
|
665
|
+
[GENAI.TOOL_NAME]: bucket.name,
|
|
666
|
+
});
|
|
667
|
+
yield* announceToolCall(bucket);
|
|
668
|
+
}
|
|
669
|
+
// Settle every tool call the stream left open or unreadable. Two paths
|
|
670
|
+
// arrive here:
|
|
671
|
+
//
|
|
672
|
+
// 1. No `toolCallEnd` came for the call — a driver that never emits one
|
|
673
|
+
// (every call then settles here), or a stream that stopped before
|
|
674
|
+
// the block closed. A buffer that parses is kept.
|
|
675
|
+
// 2. `toolCallEnd` came and the buffer did not parse. Its completion was
|
|
676
|
+
// held back until now, because what it is depends on how the
|
|
677
|
+
// response ended.
|
|
484
678
|
//
|
|
485
|
-
//
|
|
486
|
-
//
|
|
487
|
-
//
|
|
488
|
-
//
|
|
489
|
-
//
|
|
490
|
-
//
|
|
491
|
-
//
|
|
492
|
-
//
|
|
493
|
-
//
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
//
|
|
497
|
-
//
|
|
498
|
-
// shorter input or split into smaller calls" message that the
|
|
499
|
-
// model can act on.
|
|
679
|
+
// An unreadable buffer becomes `parsed = {}` — the safe fallback, so the
|
|
680
|
+
// executor's `JSON.parse(arguments)` succeeds and nothing downstream
|
|
681
|
+
// crashes — plus `inputError`. It is `truncated` only for the call the
|
|
682
|
+
// model's last output went to, when the output limit or a content filter
|
|
683
|
+
// stopped the response or it reported nothing at all: whatever stopped
|
|
684
|
+
// the response could cut no other call. Every other unreadable call is
|
|
685
|
+
// `malformed`: the response finished normally, or the model moved on to
|
|
686
|
+
// more output, so it had finished writing the call. The executor turns
|
|
687
|
+
// that into a message the model can act on. Without it the model got a
|
|
688
|
+
// generic "<field> is required" error for a call it did not know was
|
|
689
|
+
// broken, and a cut-off call came back with the same long input, into
|
|
690
|
+
// the same cutoff, in a loop. Calling a malformed call cut off tells the
|
|
691
|
+
// model to send less, which does not fix its JSON.
|
|
500
692
|
for (const bucket of toolBuckets.values()) {
|
|
501
|
-
|
|
693
|
+
let failure = bucket.pendingFailure;
|
|
694
|
+
if (!failure) {
|
|
695
|
+
if (!bucket.started || bucket.completed)
|
|
696
|
+
continue;
|
|
502
697
|
bucket.completed = true;
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
// readable hint instead of a generic Zod error.
|
|
514
|
-
truncated = true;
|
|
515
|
-
parsed = {};
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
bucket.parsed = parsed;
|
|
519
|
-
bucket.inputTruncated = truncated;
|
|
520
|
-
if (truncated) {
|
|
521
|
-
log.warn('tool input truncated by upstream cutoff (no toolCallEnd, argsBuf unparsable)', {
|
|
522
|
-
[NAMZU.TURN_ID]: turnId,
|
|
523
|
-
'namzu.runtime.tool_use_id': bucket.id,
|
|
524
|
-
[GENAI.TOOL_NAME]: bucket.name,
|
|
525
|
-
'namzu.runtime.buffer_length': bucket.argsBuf.length,
|
|
698
|
+
const parsed = bucket.interleaved
|
|
699
|
+
? { ok: false, parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR }
|
|
700
|
+
: parseToolArguments(bucket.argsBuf);
|
|
701
|
+
if (parsed.ok) {
|
|
702
|
+
bucket.parsed = parsed.value;
|
|
703
|
+
await emitEvent({
|
|
704
|
+
type: 'tool_input_completed',
|
|
705
|
+
turnId,
|
|
706
|
+
toolUseId: bucket.id,
|
|
707
|
+
input: parsed.value,
|
|
526
708
|
});
|
|
709
|
+
yield* drainPending();
|
|
710
|
+
continue;
|
|
527
711
|
}
|
|
528
|
-
|
|
529
|
-
type: 'tool_input_completed',
|
|
530
|
-
turnId,
|
|
531
|
-
toolUseId: bucket.id,
|
|
532
|
-
input: parsed,
|
|
533
|
-
...(truncated ? { inputTruncated: true } : {}),
|
|
534
|
-
});
|
|
535
|
-
yield* drainPending();
|
|
712
|
+
failure = parsed;
|
|
536
713
|
}
|
|
714
|
+
bucket.pendingFailure = undefined;
|
|
715
|
+
bucket.parsed = {};
|
|
716
|
+
// An interleaved call is always `malformed`, never `classifyUnreadableToolInput`'s
|
|
717
|
+
// call: whether it happens to be this response's last output and
|
|
718
|
+
// whether the response was cut off are both beside the point here —
|
|
719
|
+
// the buffer it would be judged by cannot be trusted either way.
|
|
720
|
+
const inputError = bucket.interleaved
|
|
721
|
+
? {
|
|
722
|
+
reason: 'malformed',
|
|
723
|
+
parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR,
|
|
724
|
+
length: bucket.argsBuf.length,
|
|
725
|
+
precedingLength: bucket.precedingLength,
|
|
726
|
+
}
|
|
727
|
+
: classifyUnreadableToolInput(failure, {
|
|
728
|
+
length: bucket.argsBuf.length,
|
|
729
|
+
precedingLength: bucket.precedingLength,
|
|
730
|
+
last: bucket === lastOutputCall,
|
|
731
|
+
}, reportedFinishReason, usage, finishDetail);
|
|
732
|
+
bucket.inputError = inputError;
|
|
733
|
+
log.warn('tool input could not be read', {
|
|
734
|
+
[NAMZU.TURN_ID]: turnId,
|
|
735
|
+
'namzu.runtime.tool_use_id': bucket.id,
|
|
736
|
+
[GENAI.TOOL_NAME]: bucket.name,
|
|
737
|
+
'namzu.runtime.reason': inputError.reason,
|
|
738
|
+
'namzu.runtime.finish_reason': reportedFinishReason ?? 'none',
|
|
739
|
+
'namzu.runtime.buffer_length': bucket.argsBuf.length,
|
|
740
|
+
'exception.message': inputError.parseError,
|
|
741
|
+
});
|
|
742
|
+
await emitEvent({
|
|
743
|
+
type: 'tool_input_completed',
|
|
744
|
+
turnId,
|
|
745
|
+
toolUseId: bucket.id,
|
|
746
|
+
input: {},
|
|
747
|
+
inputTruncated: true,
|
|
748
|
+
inputError,
|
|
749
|
+
partialArguments: capPartialArguments(bucket.argsBuf),
|
|
750
|
+
});
|
|
751
|
+
yield* drainPending();
|
|
537
752
|
}
|
|
538
753
|
// `arguments` MUST be valid JSON for the executor's `JSON.parse`
|
|
539
754
|
// (`runtime/query/executor.ts:executeSingle`) to succeed. We
|
|
540
755
|
// always serialise from the bucket's `parsed` object (filled by
|
|
541
756
|
// either the `toolCallEnd` branch above or the post-stream flush
|
|
542
|
-
// loop) instead of re-emitting `argsBuf`. When the
|
|
543
|
-
//
|
|
544
|
-
// state; the executor parses cleanly and returns a specific
|
|
757
|
+
// loop) instead of re-emitting `argsBuf`. When the arguments could not
|
|
758
|
+
// be read, `metadata.inputTruncated` and `metadata.inputError` carry
|
|
759
|
+
// that state; the executor parses cleanly and returns a specific
|
|
545
760
|
// model-readable retry hint instead of the generic "Invalid JSON in
|
|
546
761
|
// tool arguments" intercept.
|
|
547
762
|
const toolCalls = [...toolBuckets.entries()]
|
|
@@ -557,11 +772,21 @@ sessionId) {
|
|
|
557
772
|
// normalized to `{}` above, so without this the only record of
|
|
558
773
|
// what the model was actually saying is gone — and a
|
|
559
774
|
// `repairToolCall` hook has nothing to repair.
|
|
560
|
-
...(b.
|
|
561
|
-
? {
|
|
775
|
+
...(b.inputError
|
|
776
|
+
? {
|
|
777
|
+
metadata: {
|
|
778
|
+
inputTruncated: true,
|
|
779
|
+
partialArguments: b.argsBuf,
|
|
780
|
+
inputError: b.inputError,
|
|
781
|
+
},
|
|
782
|
+
}
|
|
562
783
|
: {}),
|
|
563
784
|
}));
|
|
564
|
-
|
|
785
|
+
// Not after a framing violation: the calls it would recover are the ones
|
|
786
|
+
// the stream was just refused for garbling.
|
|
787
|
+
const recoveredToolInputFromStreamError = streamError !== undefined &&
|
|
788
|
+
!framingViolated &&
|
|
789
|
+
toolCalls.some((tc) => tc.id && tc.function.name);
|
|
565
790
|
const effectiveFinishReason = recoveredToolInputFromStreamError ? 'tool_calls' : finishReason;
|
|
566
791
|
if (recoveredToolInputFromStreamError) {
|
|
567
792
|
log.warn('provider stream failed after tool input; surfacing tool call to executor', {
|
|
@@ -642,6 +867,7 @@ sessionId) {
|
|
|
642
867
|
...(citations.length > 0 ? { citations } : {}),
|
|
643
868
|
},
|
|
644
869
|
finishReason: effectiveFinishReason,
|
|
870
|
+
...(effectiveFinishReason === 'length' && finishDetail ? { finishDetail } : {}),
|
|
645
871
|
usage,
|
|
646
872
|
};
|
|
647
873
|
// The same numbers as a MEASUREMENT, not only as a span attribute.
|