@namzu/sdk 34.2.0 → 36.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 +171 -0
- package/README.md +2 -6
- package/dist/agents/PipelineAgent.d.ts.map +1 -1
- package/dist/agents/PipelineAgent.js +118 -100
- package/dist/agents/PipelineAgent.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +2 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +105 -61
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +8 -4
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/budget.d.ts +6 -0
- package/dist/agents/budget.d.ts.map +1 -0
- package/dist/agents/budget.js +33 -0
- package/dist/agents/budget.js.map +1 -0
- package/dist/agents/explore.d.ts +20 -0
- package/dist/agents/explore.d.ts.map +1 -0
- package/dist/agents/explore.js +26 -0
- package/dist/agents/explore.js.map +1 -0
- package/dist/agents/file-definitions.d.ts +80 -0
- package/dist/agents/file-definitions.d.ts.map +1 -0
- package/dist/agents/file-definitions.js +179 -0
- package/dist/agents/file-definitions.js.map +1 -0
- package/dist/agents/index.d.ts +3 -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/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +6 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +22 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/bus/lock.d.ts.map +1 -1
- package/dist/bus/lock.js +1 -10
- package/dist/bus/lock.js.map +1 -1
- package/dist/compaction/consolidation.d.ts +31 -0
- package/dist/compaction/consolidation.d.ts.map +1 -0
- package/dist/compaction/consolidation.js +63 -0
- package/dist/compaction/consolidation.js.map +1 -0
- package/dist/compaction/factory.d.ts.map +1 -1
- package/dist/compaction/factory.js +3 -0
- package/dist/compaction/factory.js.map +1 -1
- package/dist/compaction/index.d.ts +6 -1
- package/dist/compaction/index.d.ts.map +1 -1
- package/dist/compaction/index.js +6 -0
- package/dist/compaction/index.js.map +1 -1
- package/dist/compaction/manager.d.ts +7 -0
- package/dist/compaction/manager.d.ts.map +1 -1
- package/dist/compaction/manager.js +31 -0
- package/dist/compaction/manager.js.map +1 -1
- package/dist/compaction/plan.d.ts +23 -0
- package/dist/compaction/plan.d.ts.map +1 -1
- package/dist/compaction/plan.js +41 -24
- package/dist/compaction/plan.js.map +1 -1
- package/dist/compaction/salience/bm25.d.ts +26 -0
- package/dist/compaction/salience/bm25.d.ts.map +1 -0
- package/dist/compaction/salience/bm25.js +56 -0
- package/dist/compaction/salience/bm25.js.map +1 -0
- package/dist/compaction/salience/goal.d.ts +21 -0
- package/dist/compaction/salience/goal.d.ts.map +1 -0
- package/dist/compaction/salience/goal.js +32 -0
- package/dist/compaction/salience/goal.js.map +1 -0
- package/dist/compaction/salience/index.d.ts +4 -0
- package/dist/compaction/salience/index.d.ts.map +1 -0
- package/dist/compaction/salience/index.js +4 -0
- package/dist/compaction/salience/index.js.map +1 -0
- package/dist/compaction/salience/minhash.d.ts +17 -0
- package/dist/compaction/salience/minhash.d.ts.map +1 -0
- package/dist/compaction/salience/minhash.js +54 -0
- package/dist/compaction/salience/minhash.js.map +1 -0
- package/dist/compaction/salience/score.d.ts +64 -0
- package/dist/compaction/salience/score.d.ts.map +1 -0
- package/dist/compaction/salience/score.js +256 -0
- package/dist/compaction/salience/score.js.map +1 -0
- package/dist/compaction/salience/tokenize.d.ts +20 -0
- package/dist/compaction/salience/tokenize.d.ts.map +1 -0
- package/dist/compaction/salience/tokenize.js +92 -0
- package/dist/compaction/salience/tokenize.js.map +1 -0
- package/dist/compaction/salience/working-set.d.ts +59 -0
- package/dist/compaction/salience/working-set.d.ts.map +1 -0
- package/dist/compaction/salience/working-set.js +137 -0
- package/dist/compaction/salience/working-set.js.map +1 -0
- package/dist/compaction/serializer.d.ts +2 -0
- package/dist/compaction/serializer.d.ts.map +1 -1
- package/dist/compaction/serializer.js +15 -0
- package/dist/compaction/serializer.js.map +1 -1
- package/dist/compaction/token-estimate.d.ts +13 -0
- package/dist/compaction/token-estimate.d.ts.map +1 -0
- package/dist/compaction/token-estimate.js +58 -0
- package/dist/compaction/token-estimate.js.map +1 -0
- package/dist/compaction/tool-result-editing.d.ts +10 -2
- package/dist/compaction/tool-result-editing.d.ts.map +1 -1
- package/dist/compaction/tool-result-editing.js +22 -24
- package/dist/compaction/tool-result-editing.js.map +1 -1
- package/dist/compaction/types.d.ts +22 -1
- package/dist/compaction/types.d.ts.map +1 -1
- package/dist/compaction/wire.d.ts +3 -1
- package/dist/compaction/wire.d.ts.map +1 -1
- package/dist/compaction/wire.js +2 -0
- package/dist/compaction/wire.js.map +1 -1
- package/dist/config/runtime.d.ts +58 -28
- package/dist/config/runtime.d.ts.map +1 -1
- package/dist/config/runtime.js +13 -1
- package/dist/config/runtime.js.map +1 -1
- package/dist/connector/builtins/http.d.ts.map +1 -1
- package/dist/connector/builtins/http.js +2 -8
- package/dist/connector/builtins/http.js.map +1 -1
- package/dist/connector/builtins/webhook.js +2 -2
- package/dist/connector/builtins/webhook.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts +2 -0
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +30 -0
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/tools/adapter.js +2 -2
- package/dist/connector/tools/adapter.js.map +1 -1
- package/dist/connector/tools/definitions.js +2 -2
- package/dist/connector/tools/definitions.js.map +1 -1
- package/dist/constants/compaction/index.d.ts +1 -0
- package/dist/constants/compaction/index.d.ts.map +1 -1
- package/dist/constants/compaction/index.js +1 -0
- package/dist/constants/compaction/index.js.map +1 -1
- package/dist/constants/telemetry/index.d.ts +0 -1
- package/dist/constants/telemetry/index.d.ts.map +1 -1
- package/dist/constants/telemetry/index.js +0 -1
- package/dist/constants/telemetry/index.js.map +1 -1
- package/dist/contracts/a2a.d.ts +5 -5
- package/dist/contracts/api.d.ts +4 -2
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/schemas.d.ts +1 -15
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +5 -20
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/invariants/index.d.ts +1 -1
- package/dist/manager/agent/lifecycle.d.ts +2 -18
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +373 -340
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +3 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +35 -5
- package/dist/manager/run/persistence.js.map +1 -1
- 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/shell-hook.d.ts +128 -0
- package/dist/plugin/shell-hook.d.ts.map +1 -0
- package/dist/plugin/shell-hook.js +299 -0
- package/dist/plugin/shell-hook.js.map +1 -0
- package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
- package/dist/prompt/coding-agent-doctrine.js +100 -0
- package/dist/prompt/coding-agent-doctrine.js.map +1 -0
- package/dist/prompt/index.d.ts +2 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -0
- package/dist/prompt/index.js.map +1 -1
- package/dist/provider/errors.d.ts +1 -1
- package/dist/provider/errors.js +1 -1
- package/dist/provider/fallback.d.ts +2 -0
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +3 -1
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/retry.d.ts +2 -0
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +3 -1
- package/dist/provider/retry.js.map +1 -1
- package/dist/provider/token-budget.d.ts +13 -0
- package/dist/provider/token-budget.d.ts.map +1 -0
- package/dist/provider/token-budget.js +150 -0
- package/dist/provider/token-budget.js.map +1 -0
- package/dist/public-runtime.d.ts +14 -14
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +15 -10
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +2 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +2 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +12 -2
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.js +18 -6
- package/dist/registry/command/kernel-commands.js.map +1 -1
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +4 -1
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/run/LimitChecker.js +1 -1
- package/dist/run/LimitChecker.js.map +1 -1
- package/dist/run/drain.js +1 -1
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +15 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/run/token-budget.d.ts +108 -0
- package/dist/run/token-budget.d.ts.map +1 -0
- package/dist/run/token-budget.js +591 -0
- package/dist/run/token-budget.js.map +1 -0
- package/dist/runtime/jobs/registry.d.ts +29 -0
- package/dist/runtime/jobs/registry.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.js +98 -18
- package/dist/runtime/jobs/registry.js.map +1 -1
- package/dist/runtime/query/checkpoint.d.ts.map +1 -1
- package/dist/runtime/query/checkpoint.js +10 -3
- package/dist/runtime/query/checkpoint.js.map +1 -1
- package/dist/runtime/query/context.d.ts +2 -26
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +1 -29
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +13 -9
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +144 -55
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +8 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/index.d.ts +42 -4
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +153 -52
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +3 -3
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +47 -11
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +98 -30
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
- package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +10 -5
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
- package/dist/runtime/query/plugin-hooks.js +20 -1
- package/dist/runtime/query/plugin-hooks.js.map +1 -1
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +14 -4
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/repeat-call.d.ts +20 -2
- package/dist/runtime/query/repeat-call.d.ts.map +1 -1
- package/dist/runtime/query/repeat-call.js +35 -7
- package/dist/runtime/query/repeat-call.js.map +1 -1
- package/dist/runtime/query/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +9 -0
- package/dist/runtime/query/result.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +142 -0
- package/dist/runtime/query/review-policy.d.ts.map +1 -0
- package/dist/runtime/query/review-policy.js +144 -0
- package/dist/runtime/query/review-policy.js.map +1 -0
- package/dist/runtime/query/run-state.d.ts.map +1 -1
- package/dist/runtime/query/run-state.js +4 -0
- package/dist/runtime/query/run-state.js.map +1 -1
- package/dist/runtime/query/steering.d.ts +4 -0
- package/dist/runtime/query/steering.d.ts.map +1 -1
- package/dist/runtime/query/steering.js +29 -0
- package/dist/runtime/query/steering.js.map +1 -1
- package/dist/runtime/query/token-budget.d.ts +7 -0
- package/dist/runtime/query/token-budget.d.ts.map +1 -0
- package/dist/runtime/query/token-budget.js +101 -0
- package/dist/runtime/query/token-budget.js.map +1 -0
- package/dist/runtime/query/tool-output-budget.d.ts +2 -0
- package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
- package/dist/runtime/query/tool-output-budget.js +29 -11
- package/dist/runtime/query/tool-output-budget.js.map +1 -1
- package/dist/runtime/query/tool-pause.d.ts.map +1 -1
- package/dist/runtime/query/tool-pause.js +4 -2
- package/dist/runtime/query/tool-pause.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +4 -0
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +4 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/sandbox/file-walk-program.d.ts +3 -0
- package/dist/sandbox/file-walk-program.d.ts.map +1 -0
- package/dist/sandbox/file-walk-program.js +94 -0
- package/dist/sandbox/file-walk-program.js.map +1 -0
- package/dist/sandbox/file-walk.d.ts +12 -0
- package/dist/sandbox/file-walk.d.ts.map +1 -0
- package/dist/sandbox/file-walk.js +429 -0
- package/dist/sandbox/file-walk.js.map +1 -0
- package/dist/sandbox/index.d.ts +2 -0
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +1 -0
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts +3 -1
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +121 -12
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/scheduler/completion-inbox.d.ts +3 -2
- package/dist/scheduler/completion-inbox.d.ts.map +1 -1
- package/dist/scheduler/completion-inbox.js +29 -15
- package/dist/scheduler/completion-inbox.js.map +1 -1
- package/dist/scheduler/delegating.d.ts +1 -0
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +29 -12
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/scheduler/local.d.ts +1 -0
- package/dist/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +4 -7
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/index.d.ts +0 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +0 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/workspace/path-builder.d.ts.map +1 -1
- package/dist/session/workspace/path-builder.js +5 -4
- package/dist/session/workspace/path-builder.js.map +1 -1
- package/dist/store/feedback/disk.d.ts.map +1 -1
- package/dist/store/feedback/disk.js +4 -6
- package/dist/store/feedback/disk.js.map +1 -1
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +3 -12
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/run/checkpoint-disk.d.ts +3 -3
- package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
- package/dist/store/run/checkpoint-disk.js +14 -26
- package/dist/store/run/checkpoint-disk.js.map +1 -1
- package/dist/store/run/claim-disk.js +1 -1
- package/dist/store/run/conformance.d.ts +1 -1
- package/dist/store/run/conformance.d.ts.map +1 -1
- package/dist/store/run/conformance.js +41 -33
- package/dist/store/run/conformance.js.map +1 -1
- package/dist/store/run/disk.d.ts.map +1 -1
- package/dist/store/run/disk.js +20 -4
- package/dist/store/run/disk.js.map +1 -1
- package/dist/store/run/token-budget-disk.d.ts +37 -0
- package/dist/store/run/token-budget-disk.d.ts.map +1 -0
- package/dist/store/run/token-budget-disk.js +208 -0
- package/dist/store/run/token-budget-disk.js.map +1 -0
- package/dist/store/session/disk.d.ts +4 -13
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +34 -31
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/memory.d.ts +2 -0
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +41 -2
- package/dist/store/session/memory.js.map +1 -1
- package/dist/store/task/disk.d.ts.map +1 -1
- package/dist/store/task/disk.js +7 -8
- package/dist/store/task/disk.js.map +1 -1
- package/dist/store/topic/memory.d.ts +2 -0
- package/dist/store/topic/memory.d.ts.map +1 -1
- package/dist/store/topic/memory.js +13 -1
- package/dist/store/topic/memory.js.map +1 -1
- package/dist/test-support/ids.d.ts +4 -19
- package/dist/test-support/ids.d.ts.map +1 -1
- package/dist/test-support/ids.js +51 -59
- package/dist/test-support/ids.js.map +1 -1
- package/dist/tools/advisory/index.d.ts.map +1 -1
- package/dist/tools/advisory/index.js +3 -1
- package/dist/tools/advisory/index.js.map +1 -1
- package/dist/tools/builtins/bash.d.ts +2 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +224 -70
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts +2 -2
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +4 -2
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/edit.js +2 -2
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/glob.d.ts +2 -1
- package/dist/tools/builtins/glob.d.ts.map +1 -1
- package/dist/tools/builtins/glob.js +95 -103
- package/dist/tools/builtins/glob.js.map +1 -1
- package/dist/tools/builtins/grep.d.ts.map +1 -1
- package/dist/tools/builtins/grep.js +155 -111
- package/dist/tools/builtins/grep.js.map +1 -1
- package/dist/tools/builtins/ls.js +4 -4
- package/dist/tools/builtins/ls.js.map +1 -1
- package/dist/tools/builtins/lsp.js +2 -2
- package/dist/tools/builtins/lsp.js.map +1 -1
- package/dist/tools/builtins/read-file.js +2 -2
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/builtins/write-file.js +2 -2
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
- package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
- package/dist/tools/coordinator/ask-user-question.js +237 -0
- package/dist/tools/coordinator/ask-user-question.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +1 -2
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +4 -220
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/memory/read.d.ts.map +1 -1
- package/dist/tools/memory/read.js +2 -4
- package/dist/tools/memory/read.js.map +1 -1
- package/dist/tools/paths.d.ts +13 -0
- package/dist/tools/paths.d.ts.map +1 -1
- package/dist/tools/paths.js +53 -0
- package/dist/tools/paths.js.map +1 -1
- package/dist/tools/roster.d.ts +27 -0
- package/dist/tools/roster.d.ts.map +1 -0
- package/dist/tools/roster.js +42 -0
- package/dist/tools/roster.js.map +1 -0
- package/dist/types/agent/base.d.ts +5 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/pipeline.d.ts +3 -0
- package/dist/types/agent/pipeline.d.ts.map +1 -1
- package/dist/types/agent/router.d.ts +2 -3
- package/dist/types/agent/router.d.ts.map +1 -1
- package/dist/types/agent/scheduler.d.ts +3 -0
- package/dist/types/agent/scheduler.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +5 -16
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/common/index.d.ts.map +1 -1
- package/dist/types/common/index.js +3 -0
- package/dist/types/common/index.js.map +1 -1
- package/dist/types/computer-use/index.d.ts +8 -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/hitl/index.d.ts +5 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/ids/brand.d.ts +5 -47
- package/dist/types/ids/brand.d.ts.map +1 -1
- package/dist/types/ids/brand.js +2 -39
- package/dist/types/ids/brand.js.map +1 -1
- package/dist/types/ids/index.d.ts +59 -69
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js +12 -10
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/permission/index.d.ts +9 -0
- package/dist/types/permission/index.d.ts.map +1 -1
- package/dist/types/permission/index.js +9 -1
- package/dist/types/permission/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +45 -4
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +7 -0
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/run/config.d.ts +3 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/emergency.d.ts +5 -0
- package/dist/types/run/emergency.d.ts.map +1 -1
- package/dist/types/run/emergency.js.map +1 -1
- package/dist/types/run/entity.d.ts +6 -2
- package/dist/types/run/entity.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +35 -0
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/index.d.ts +1 -0
- package/dist/types/run/index.d.ts.map +1 -1
- package/dist/types/run/index.js +1 -0
- package/dist/types/run/index.js.map +1 -1
- package/dist/types/run/state.d.ts +16 -15
- package/dist/types/run/state.d.ts.map +1 -1
- package/dist/types/run/state.js +41 -22
- package/dist/types/run/state.js.map +1 -1
- package/dist/types/run/stop-reason.d.ts +3 -14
- package/dist/types/run/stop-reason.d.ts.map +1 -1
- package/dist/types/run/token-budget-store.d.ts +29 -0
- package/dist/types/run/token-budget-store.d.ts.map +1 -0
- package/dist/types/run/token-budget-store.js +25 -0
- package/dist/types/run/token-budget-store.js.map +1 -0
- package/dist/types/sandbox/index.d.ts +47 -2
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/session/store.d.ts +8 -0
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +15 -0
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +1 -1
- package/dist/utils/frontmatter.js +1 -1
- package/dist/utils/id-format.d.ts +3 -0
- package/dist/utils/id-format.d.ts.map +1 -0
- package/dist/utils/id-format.js +9 -0
- package/dist/utils/id-format.js.map +1 -0
- package/dist/utils/id.d.ts +65 -32
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +168 -148
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/log/exception.js +1 -1
- package/dist/utils/log/exception.js.map +1 -1
- package/dist/utils/log/index.d.ts.map +1 -1
- package/dist/utils/log/index.js +1 -2
- package/dist/utils/log/index.js.map +1 -1
- package/dist/utils/log/templates.d.ts.map +1 -1
- package/dist/utils/log/templates.js +0 -1
- package/dist/utils/log/templates.js.map +1 -1
- package/package.json +6 -1
- package/src/agents/AGENTS.md +1 -1
- package/src/agents/PipelineAgent.ts +129 -109
- package/src/agents/ReactiveAgent.ts +2 -0
- package/src/agents/RouterAgent.ts +120 -73
- package/src/agents/SupervisorAgent.ts +12 -4
- package/src/agents/budget.ts +42 -0
- package/src/agents/explore.ts +29 -0
- package/src/agents/file-definitions.ts +237 -0
- package/src/agents/index.ts +15 -0
- package/src/bridge/a2a/mapper.ts +6 -0
- package/src/bridge/sse/mapper.ts +22 -0
- package/src/bus/lock.ts +1 -10
- package/src/compaction/consolidation.ts +79 -0
- package/src/compaction/factory.ts +3 -0
- package/src/compaction/index.ts +34 -4
- package/src/compaction/manager.ts +39 -1
- package/src/compaction/plan.ts +52 -21
- package/src/compaction/salience/bm25.ts +72 -0
- package/src/compaction/salience/goal.ts +44 -0
- package/src/compaction/salience/index.ts +19 -0
- package/src/compaction/salience/minhash.ts +53 -0
- package/src/compaction/salience/score.ts +305 -0
- package/src/compaction/salience/tokenize.ts +89 -0
- package/src/compaction/salience/working-set.ts +187 -0
- package/src/compaction/serializer.ts +16 -0
- package/src/compaction/token-estimate.ts +57 -0
- package/src/compaction/tool-result-editing.ts +28 -26
- package/src/compaction/types.ts +24 -1
- package/src/compaction/wire.ts +5 -1
- package/src/config/runtime.ts +13 -1
- package/src/connector/builtins/http.ts +2 -8
- package/src/connector/builtins/webhook.ts +2 -2
- package/src/connector/mcp/adapter.ts +32 -0
- package/src/connector/tools/adapter.ts +2 -2
- package/src/connector/tools/definitions.ts +2 -2
- package/src/constants/compaction/index.ts +1 -0
- package/src/constants/telemetry/index.ts +0 -1
- package/src/contracts/api.ts +5 -1
- package/src/contracts/schemas.ts +6 -20
- package/src/invariants/index.ts +1 -1
- package/src/manager/agent/lifecycle.ts +380 -352
- package/src/manager/run/persistence.ts +35 -5
- package/src/plugin/index.ts +19 -0
- package/src/plugin/shell-hook.ts +403 -0
- package/src/prompt/coding-agent-doctrine.ts +118 -0
- package/src/prompt/index.ts +8 -0
- package/src/provider/errors.ts +1 -1
- package/src/provider/fallback.ts +4 -1
- package/src/provider/retry.ts +4 -1
- package/src/provider/token-budget.ts +158 -0
- package/src/public-runtime.ts +56 -28
- package/src/public-tools.ts +5 -0
- package/src/public-types.ts +65 -0
- package/src/registry/command/kernel-commands.ts +16 -6
- package/src/registry/tool/execute.ts +4 -1
- package/src/run/LimitChecker.ts +1 -1
- package/src/run/drain.ts +1 -1
- package/src/run/reporter.ts +15 -0
- package/src/run/token-budget.ts +692 -0
- package/src/runtime/jobs/registry.ts +123 -17
- package/src/runtime/query/checkpoint.ts +10 -3
- package/src/runtime/query/context.ts +3 -57
- package/src/runtime/query/executor.ts +181 -71
- package/src/runtime/query/guard.ts +8 -0
- package/src/runtime/query/index.ts +209 -62
- package/src/runtime/query/iteration/index.ts +53 -15
- package/src/runtime/query/iteration/phases/compaction.ts +130 -31
- package/src/runtime/query/iteration/phases/context.ts +4 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
- package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
- package/src/runtime/query/iteration/stream-turn.ts +9 -5
- package/src/runtime/query/plugin-hooks.ts +24 -2
- package/src/runtime/query/prompt.ts +21 -4
- package/src/runtime/query/repeat-call.ts +42 -7
- package/src/runtime/query/result.ts +9 -0
- package/src/runtime/query/review-policy.ts +231 -0
- package/src/runtime/query/run-state.ts +4 -0
- package/src/runtime/query/steering.ts +32 -0
- package/src/runtime/query/token-budget.ts +127 -0
- package/src/runtime/query/tool-output-budget.ts +33 -10
- package/src/runtime/query/tool-pause.ts +4 -2
- package/src/runtime/query/tooling.ts +8 -0
- package/src/sandbox/file-walk-program.ts +93 -0
- package/src/sandbox/file-walk.ts +463 -0
- package/src/sandbox/index.ts +2 -0
- package/src/sandbox/provider/local.ts +136 -13
- package/src/scheduler/completion-inbox.ts +29 -19
- package/src/scheduler/delegating.ts +35 -13
- package/src/scheduler/local.ts +5 -7
- package/src/session/index.ts +0 -1
- package/src/session/workspace/path-builder.ts +5 -4
- package/src/store/feedback/disk.ts +4 -6
- package/src/store/index.ts +2 -0
- package/src/store/memory/disk.ts +3 -11
- package/src/store/run/checkpoint-disk.ts +14 -27
- package/src/store/run/claim-disk.ts +1 -1
- package/src/store/run/conformance.ts +55 -39
- package/src/store/run/disk.ts +19 -4
- package/src/store/run/token-budget-disk.ts +247 -0
- package/src/store/session/disk.ts +36 -29
- package/src/store/session/memory.ts +38 -1
- package/src/store/task/disk.ts +7 -8
- package/src/store/topic/memory.ts +13 -1
- package/src/test-support/ids.ts +62 -59
- package/src/tools/advisory/index.ts +3 -1
- package/src/tools/builtins/bash.ts +241 -70
- package/src/tools/builtins/computer-use.ts +6 -2
- package/src/tools/builtins/edit.ts +2 -2
- package/src/tools/builtins/glob.ts +104 -122
- package/src/tools/builtins/grep.ts +166 -132
- package/src/tools/builtins/ls.ts +4 -4
- package/src/tools/builtins/lsp.ts +2 -2
- package/src/tools/builtins/read-file.ts +2 -2
- package/src/tools/builtins/write-file.ts +2 -2
- package/src/tools/coordinator/ask-user-question.ts +284 -0
- package/src/tools/coordinator/index.ts +5 -248
- package/src/tools/memory/read.ts +2 -4
- package/src/tools/paths.ts +64 -0
- package/src/tools/roster.ts +46 -0
- package/src/types/agent/base.ts +6 -0
- package/src/types/agent/pipeline.ts +3 -0
- package/src/types/agent/router.ts +2 -3
- package/src/types/agent/scheduler.ts +4 -0
- package/src/types/agent/task.ts +5 -18
- package/src/types/common/index.ts +3 -0
- package/src/types/computer-use/index.ts +8 -0
- package/src/types/hitl/index.ts +5 -0
- package/src/types/ids/brand.ts +5 -48
- package/src/types/ids/index.ts +66 -75
- package/src/types/permission/index.ts +11 -0
- package/src/types/plugin/index.ts +49 -1
- package/src/types/run/config.ts +3 -0
- package/src/types/run/emergency.ts +5 -0
- package/src/types/run/entity.ts +6 -2
- package/src/types/run/events.ts +37 -0
- package/src/types/run/index.ts +1 -0
- package/src/types/run/state.ts +58 -30
- package/src/types/run/stop-reason.ts +3 -14
- package/src/types/run/token-budget-store.ts +54 -0
- package/src/types/sandbox/index.ts +53 -0
- package/src/types/session/store.ts +8 -0
- package/src/types/tool/index.ts +15 -0
- package/src/utils/frontmatter.ts +1 -1
- package/src/utils/id-format.ts +9 -0
- package/src/utils/id.ts +222 -181
- package/src/utils/log/exception.ts +1 -1
- package/src/utils/log/index.ts +1 -2
- package/src/utils/log/templates.ts +0 -1
- package/dist/session/migration/errors.d.ts +0 -26
- package/dist/session/migration/errors.d.ts.map +0 -1
- package/dist/session/migration/errors.js +0 -22
- package/dist/session/migration/errors.js.map +0 -1
- package/dist/session/migration/filesystem.d.ts +0 -122
- package/dist/session/migration/filesystem.d.ts.map +0 -1
- package/dist/session/migration/filesystem.js +0 -379
- package/dist/session/migration/filesystem.js.map +0 -1
- package/dist/session/migration/id-prefix.d.ts +0 -113
- package/dist/session/migration/id-prefix.d.ts.map +0 -1
- package/dist/session/migration/id-prefix.js +0 -132
- package/dist/session/migration/id-prefix.js.map +0 -1
- package/dist/session/migration/index.d.ts +0 -12
- package/dist/session/migration/index.d.ts.map +0 -1
- package/dist/session/migration/index.js +0 -12
- package/dist/session/migration/index.js.map +0 -1
- package/dist/session/migration/marker.d.ts +0 -57
- package/dist/session/migration/marker.d.ts.map +0 -1
- package/dist/session/migration/marker.js +0 -123
- package/dist/session/migration/marker.js.map +0 -1
- package/src/session/migration/errors.ts +0 -23
- package/src/session/migration/filesystem.ts +0 -468
- package/src/session/migration/id-prefix.ts +0 -166
- package/src/session/migration/index.ts +0 -41
- package/src/session/migration/marker.ts +0 -142
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one tool that turns a run around to face the human.
|
|
3
|
+
*
|
|
4
|
+
* It used to be built inside `buildCoordinatorTools`, which needs a gateway,
|
|
5
|
+
* a scheduler and a roster the question has no use for — so a host that
|
|
6
|
+
* wanted only this tool (an interactive terminal with no delegation) had to
|
|
7
|
+
* assemble the whole coordinator set and fish the question out of it, and
|
|
8
|
+
* had to invent a run id at build time because the builder demanded one.
|
|
9
|
+
* This builder needs the park handler and nothing else; the run id is read
|
|
10
|
+
* from the calling `ToolContext` unless the host pins one.
|
|
11
|
+
*/
|
|
12
|
+
import type { PendingAnswers, QuestionParkRecorder } from '../../runtime/query/question-park.js';
|
|
13
|
+
import type { ResumeHandler } from '../../types/hitl/index.js';
|
|
14
|
+
import type { RunId } from '../../types/ids/index.js';
|
|
15
|
+
import type { ToolDefinition } from '../../types/tool/index.js';
|
|
16
|
+
/** Internal identity shared by the builder and the agent authority boundary. */
|
|
17
|
+
export declare const ASK_USER_QUESTION_TOOL_NAME: "ask_user_question";
|
|
18
|
+
export interface AskUserQuestionToolOptions {
|
|
19
|
+
/** Where the question goes; the run parks on it until an answer comes back. */
|
|
20
|
+
resumeHandler: ResumeHandler;
|
|
21
|
+
/**
|
|
22
|
+
* The run the park is recorded against. Omit it and the tool uses the
|
|
23
|
+
* `runId` of the call that asked, which is the right run in every case
|
|
24
|
+
* but a host that answers questions for a run other than the one it drives.
|
|
25
|
+
*/
|
|
26
|
+
runId?: RunId;
|
|
27
|
+
/** See the same field on `CoordinatorToolsOptions`. */
|
|
28
|
+
questionParks?: QuestionParkRecorder;
|
|
29
|
+
/** See the same field on `CoordinatorToolsOptions`. */
|
|
30
|
+
pendingAnswers?: PendingAnswers;
|
|
31
|
+
}
|
|
32
|
+
export declare function buildAskUserQuestionTool(config: AskUserQuestionToolOptions): ToolDefinition;
|
|
33
|
+
//# sourceMappingURL=ask-user-question.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../../src/tools/coordinator/ask-user-question.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAChG,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI/D,gFAAgF;AAChF,eAAO,MAAM,2BAA2B,EAAG,mBAA4B,CAAA;AAuDvE,MAAM,WAAW,0BAA0B;IAC1C,+EAA+E;IAC/E,aAAa,EAAE,aAAa,CAAA;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,uDAAuD;IACvD,aAAa,CAAC,EAAE,oBAAoB,CAAA;IACpC,uDAAuD;IACvD,cAAc,CAAC,EAAE,cAAc,CAAA;CAC/B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,0BAA0B,GAAG,cAAc,CAgM3F"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one tool that turns a run around to face the human.
|
|
3
|
+
*
|
|
4
|
+
* It used to be built inside `buildCoordinatorTools`, which needs a gateway,
|
|
5
|
+
* a scheduler and a roster the question has no use for — so a host that
|
|
6
|
+
* wanted only this tool (an interactive terminal with no delegation) had to
|
|
7
|
+
* assemble the whole coordinator set and fish the question out of it, and
|
|
8
|
+
* had to invent a run id at build time because the builder demanded one.
|
|
9
|
+
* This builder needs the park handler and nothing else; the run id is read
|
|
10
|
+
* from the calling `ToolContext` unless the host pins one.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import { generateCheckpointId } from '../../utils/id.js';
|
|
14
|
+
import { defineTool } from '../defineTool.js';
|
|
15
|
+
/** Internal identity shared by the builder and the agent authority boundary. */
|
|
16
|
+
export const ASK_USER_QUESTION_TOOL_NAME = 'ask_user_question';
|
|
17
|
+
/**
|
|
18
|
+
* The single closed shape a capable provider constrains this call to.
|
|
19
|
+
*
|
|
20
|
+
* `options` arriving as a STRING is the failure this exists for: a model that
|
|
21
|
+
* serializes the array once tends to keep doing it, and the parse error it
|
|
22
|
+
* gets back never says the array was the problem.
|
|
23
|
+
* `additionalProperties: false` turns that into a refusal at generation time
|
|
24
|
+
* rather than a rejection after the fact.
|
|
25
|
+
*/
|
|
26
|
+
const askUserQuestionModelInputSchema = {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
question: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Full question text — clear, specific, and ending with a question mark.',
|
|
32
|
+
},
|
|
33
|
+
header: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'Optional very short topic label, no more than 24 characters.',
|
|
36
|
+
},
|
|
37
|
+
options: {
|
|
38
|
+
type: 'array',
|
|
39
|
+
description: 'A JSON array of 2-4 genuinely distinct, context-derived option objects.',
|
|
40
|
+
items: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
label: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Concise option label. Put the recommended option first and append " (Recommended)".',
|
|
46
|
+
},
|
|
47
|
+
description: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Optional one-line explanation of what changes if selected.',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ['label'],
|
|
53
|
+
additionalProperties: false,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
multiSelect: {
|
|
57
|
+
type: 'boolean',
|
|
58
|
+
description: 'True only when several options can apply at once.',
|
|
59
|
+
},
|
|
60
|
+
allowFreeText: {
|
|
61
|
+
type: 'boolean',
|
|
62
|
+
description: 'Whether the user may answer in their own words.',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
required: ['question', 'options'],
|
|
66
|
+
additionalProperties: false,
|
|
67
|
+
};
|
|
68
|
+
export function buildAskUserQuestionTool(config) {
|
|
69
|
+
const parkHandler = config.resumeHandler;
|
|
70
|
+
const { questionParks, pendingAnswers } = config;
|
|
71
|
+
return defineTool({
|
|
72
|
+
name: ASK_USER_QUESTION_TOOL_NAME,
|
|
73
|
+
description: 'Ask the user ONE question ONLY when you are blocked on a decision that is genuinely theirs to make — one you cannot resolve from their request, your tools, the files you can read, or sensible defaults. The question must be the genuinely undecidable thing in THIS task. Never ask for information a tool can discover (do not ask what you can read, list, or search), never re-ask what the conversation already answers, and never ask meta-questions like "Shall I proceed?" — plan ratification goes through approve_plan. Provide 2-4 genuinely distinct options derived from the actual context — concrete paths, never generic placeholders (for example, asked to prepare a presentation, ask "Who is the audience?" with options like Board / Engineering team / Customer); keep labels short (1-5 words) and give each option a one-line description of what practically changes if it is chosen. Put your recommended option FIRST and append " (Recommended)" to its label. Set multiSelect: true only when several options can apply at once. A free-text "Something else" escape hatch is always shown automatically — do not add your own "Other" option. Ask ONE question per call and prefer at most one question per assistant turn; if several decisions block you, ask only the ones that materially change your next actions, in sequence — most work needs at most 2-3 questions, so prefer proceeding on stated defaults over interrogating the user. Never invent answers or synthetic content on the user\'s behalf unless they explicitly asked for a random/test scenario. The answer arrives as this tool\'s result; if the result says the user did not answer, do not ask this or any other question again — proceed on your best judgment without assuming consent.',
|
|
74
|
+
inputSchema: z
|
|
75
|
+
.object({
|
|
76
|
+
question: z
|
|
77
|
+
.string()
|
|
78
|
+
.min(1)
|
|
79
|
+
.describe('Full question text — clear, specific, ends with a question mark.'),
|
|
80
|
+
header: z
|
|
81
|
+
.string()
|
|
82
|
+
.max(24)
|
|
83
|
+
.optional()
|
|
84
|
+
.describe('Very short topic label for the question (e.g. "Audience", "Auth method").'),
|
|
85
|
+
options: z
|
|
86
|
+
.array(z
|
|
87
|
+
.object({
|
|
88
|
+
label: z
|
|
89
|
+
.string()
|
|
90
|
+
.min(1)
|
|
91
|
+
.max(80)
|
|
92
|
+
.describe('Concise option label (1-5 words). Recommended option goes first with " (Recommended)" appended.'),
|
|
93
|
+
description: z
|
|
94
|
+
.string()
|
|
95
|
+
.max(300)
|
|
96
|
+
.optional()
|
|
97
|
+
.describe('One line on what practically changes if this option is chosen.'),
|
|
98
|
+
})
|
|
99
|
+
.strict())
|
|
100
|
+
.min(2)
|
|
101
|
+
.max(4)
|
|
102
|
+
.describe('2-4 genuinely distinct, context-derived options.'),
|
|
103
|
+
multiSelect: z
|
|
104
|
+
.boolean()
|
|
105
|
+
.optional()
|
|
106
|
+
.default(false)
|
|
107
|
+
.describe('True only when several options can apply at once.'),
|
|
108
|
+
allowFreeText: z
|
|
109
|
+
.boolean()
|
|
110
|
+
.optional()
|
|
111
|
+
.default(true)
|
|
112
|
+
.describe('Whether the user may answer in their own words.'),
|
|
113
|
+
})
|
|
114
|
+
.strict(),
|
|
115
|
+
modelInputSchema: structuredClone(askUserQuestionModelInputSchema),
|
|
116
|
+
enforceModelInput: true,
|
|
117
|
+
validationErrorHint: 'Required shape: {"question":"...?","options":[{"label":"First (Recommended)","description":"What changes"},{"label":"Second","description":"What changes"}]}. "options" must be a JSON array of 2-4 objects, never a string.',
|
|
118
|
+
category: 'custom',
|
|
119
|
+
permissions: [],
|
|
120
|
+
readOnly: true,
|
|
121
|
+
destructive: false,
|
|
122
|
+
// MUST stay false: the executor serializes non-concurrency-safe
|
|
123
|
+
// tools in a single chain, so N question blocks in one assistant
|
|
124
|
+
// turn park strictly one-at-a-time. Hosts key their park/resolve
|
|
125
|
+
// registries by runId — concurrent parks on one run clobber each
|
|
126
|
+
// other and the first promise never resolves (run hangs to TTL).
|
|
127
|
+
concurrencySafe: false,
|
|
128
|
+
async execute({ question, header, options, multiSelect, allowFreeText }, context) {
|
|
129
|
+
const toolUseId = context.toolUseId;
|
|
130
|
+
if (!toolUseId) {
|
|
131
|
+
// Without the executing tool_use_id the question has no
|
|
132
|
+
// stable identity: the host could never merge the awaiting
|
|
133
|
+
// card with its resolution, and answers could not be matched
|
|
134
|
+
// back. Hard-fail instead of parking an unmergeable id.
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
output: '',
|
|
138
|
+
error: 'ask_user_question requires an executor that threads ToolContext.toolUseId; the question cannot be tracked without it.',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const questionOptions = options.map((opt, i) => ({
|
|
142
|
+
id: `opt_${i + 1}`,
|
|
143
|
+
label: opt.label,
|
|
144
|
+
...(opt.description !== undefined ? { description: opt.description } : {}),
|
|
145
|
+
}));
|
|
146
|
+
const questionData = {
|
|
147
|
+
questionId: toolUseId,
|
|
148
|
+
question,
|
|
149
|
+
...(header !== undefined ? { header } : {}),
|
|
150
|
+
options: questionOptions,
|
|
151
|
+
multiSelect,
|
|
152
|
+
allowFreeText,
|
|
153
|
+
};
|
|
154
|
+
// An answer carried in from a resumed run. Checked before the
|
|
155
|
+
// park, because re-entering this tool is HOW the answer gets
|
|
156
|
+
// delivered: the batch is re-executed, and without this the
|
|
157
|
+
// re-execution would ask the user something they already
|
|
158
|
+
// answered — or, headless, auto-answer with the no-consent
|
|
159
|
+
// sentinel and throw the real answer away.
|
|
160
|
+
const carried = pendingAnswers?.take(toolUseId);
|
|
161
|
+
// A real checkpoint, not a synthetic id nothing ever wrote.
|
|
162
|
+
// Skipped when an answer is already in hand: parking a
|
|
163
|
+
// question that is answered would leave an outstanding record
|
|
164
|
+
// for a decision that has been made.
|
|
165
|
+
const parkedAt = carried === undefined && questionParks ? await questionParks.record(questionData) : null;
|
|
166
|
+
const decision = carried ??
|
|
167
|
+
(await parkHandler({
|
|
168
|
+
type: 'user_question',
|
|
169
|
+
runId: config.runId ?? context.runId,
|
|
170
|
+
// Provider correlation ids remain verbatim in questionData;
|
|
171
|
+
// an unpersisted park gets its own safe checkpoint identifier.
|
|
172
|
+
checkpointId: parkedAt ?? generateCheckpointId(),
|
|
173
|
+
question: questionData,
|
|
174
|
+
}));
|
|
175
|
+
// Clear the park once the answer is in, so an approval queue
|
|
176
|
+
// stops serving a question that has been answered.
|
|
177
|
+
if (parkedAt !== null && questionParks) {
|
|
178
|
+
await questionParks.resolve(parkedAt, decision);
|
|
179
|
+
}
|
|
180
|
+
// The no-answer sentinel (explicitly NOT consent — fixes the
|
|
181
|
+
// "empty answer reads as approval" ambiguity): used for empty
|
|
182
|
+
// answers, misdirected legacy decisions (e.g. a stale replica
|
|
183
|
+
// resolving with approve/continue verbs), and answers that
|
|
184
|
+
// carry a different question's id.
|
|
185
|
+
const noAnswer = {
|
|
186
|
+
success: true,
|
|
187
|
+
output: 'The user did not answer this question. Do not assume a choice or consent; proceed on your best judgment or continue without this information.',
|
|
188
|
+
data: { question, answered: false },
|
|
189
|
+
};
|
|
190
|
+
if (decision.action === 'abort') {
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
output: 'The user declined to answer and asked to stop. Acknowledge briefly and end your turn.',
|
|
194
|
+
data: { question, answered: false, declined: true },
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (decision.action !== 'answer_question')
|
|
198
|
+
return noAnswer;
|
|
199
|
+
if (decision.questionId !== undefined && decision.questionId !== toolUseId) {
|
|
200
|
+
// Misdirection guard: this answer was meant for a different
|
|
201
|
+
// question parked under the same run (stale client). Never
|
|
202
|
+
// fabricate a selection against the wrong question.
|
|
203
|
+
return noAnswer;
|
|
204
|
+
}
|
|
205
|
+
const stripRecommended = (label) => label.replace(/\s*\(recommended\)\s*$/i, '').trim();
|
|
206
|
+
const selected = decision.selectedOptionIds
|
|
207
|
+
.map((id) => questionOptions.find((opt) => opt.id === id))
|
|
208
|
+
.filter((opt) => opt !== undefined)
|
|
209
|
+
.map((opt) => ({ id: opt.id, label: stripRecommended(opt.label) }));
|
|
210
|
+
const freeText = decision.freeText?.trim() ?? '';
|
|
211
|
+
if (selected.length === 0 && !freeText)
|
|
212
|
+
return noAnswer;
|
|
213
|
+
let output;
|
|
214
|
+
if (selected.length > 0) {
|
|
215
|
+
const joined = selected.map((s) => `"${s.label}"`).join(', ');
|
|
216
|
+
output = `User answered "${question}": ${joined}`;
|
|
217
|
+
if (freeText) {
|
|
218
|
+
output += `\nAdditional note from the user: "${freeText}"`;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
output = `User answered "${question}" in their own words: "${freeText}"`;
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
success: true,
|
|
226
|
+
output,
|
|
227
|
+
data: {
|
|
228
|
+
question,
|
|
229
|
+
selected,
|
|
230
|
+
...(freeText ? { freeText } : {}),
|
|
231
|
+
answered: true,
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=ask-user-question.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../../src/tools/coordinator/ask-user-question.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import type { ResumeHandler } from '../../types/hitl/index.js';
|
|
|
7
7
|
import type { RunId, TaskId } from '../../types/ids/index.js';
|
|
8
8
|
import type { TaskStore } from '../../types/task/index.js';
|
|
9
9
|
import type { ToolDefinition } from '../../types/tool/index.js';
|
|
10
|
+
export { ASK_USER_QUESTION_TOOL_NAME } from './ask-user-question.js';
|
|
10
11
|
export type TaskLaunchedCallback = (agentTaskId: TaskId, meta: {
|
|
11
12
|
agentId: string;
|
|
12
13
|
description: string;
|
|
@@ -83,8 +84,6 @@ export interface CoordinatorToolsOptions {
|
|
|
83
84
|
*/
|
|
84
85
|
pendingAnswers?: PendingAnswers;
|
|
85
86
|
}
|
|
86
|
-
/** Internal identity shared by the builder and the agent authority boundary. */
|
|
87
|
-
export declare const ASK_USER_QUESTION_TOOL_NAME: "ask_user_question";
|
|
88
87
|
/**
|
|
89
88
|
* How long a coordinator tool may wait on a delegated agent.
|
|
90
89
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/coordinator/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/coordinator/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAO/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AAIpE,MAAM,MAAM,oBAAoB,GAAG,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACL,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B,KACG,IAAI,CAAA;AAET,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,aAAa,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,MAAM,EAAE,CAAA;IAEzB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAE3C,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb,cAAc,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAE9C,cAAc,CAAC,EAAE,oBAAoB,CAAA;IAErC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,eAAe,CAAA;IAEjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,oBAAoB,CAAA;IAEpC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;CAC/B;AA8ND;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,qBAAqB,QAAiB,CAAA;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,QAAgE,CAAA;AA6B/F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,EAAE,CA6/BrF"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { toErrorMessage } from '../../utils/error.js';
|
|
3
|
-
import {
|
|
3
|
+
import { asTaskId } from '../../utils/id.js';
|
|
4
4
|
import { defineTool } from '../defineTool.js';
|
|
5
5
|
import { wrapUntrusted } from '../untrusted-envelope.js';
|
|
6
|
+
import { buildAskUserQuestionTool } from './ask-user-question.js';
|
|
6
7
|
import { failureLabel, taskSucceeded } from './outcome.js';
|
|
8
|
+
export { ASK_USER_QUESTION_TOOL_NAME } from './ask-user-question.js';
|
|
7
9
|
import { resolvePlanDependencies } from './plan-dependencies.js';
|
|
8
10
|
import { describeWaitTimeout, waitForTaskWithBounds } from './wait-with-idle-bound.js';
|
|
9
|
-
/** Internal identity shared by the builder and the agent authority boundary. */
|
|
10
|
-
export const ASK_USER_QUESTION_TOOL_NAME = 'ask_user_question';
|
|
11
11
|
const approvePlanStepSchema = z.object({
|
|
12
12
|
description: z.string().describe('What this step does'),
|
|
13
13
|
agent_id: z
|
|
@@ -16,57 +16,6 @@ const approvePlanStepSchema = z.object({
|
|
|
16
16
|
.describe('Which agent handles this (omit for orchestrator-owned steps)'),
|
|
17
17
|
depends_on: z.array(z.string()).optional().describe('Step descriptions this depends on'),
|
|
18
18
|
});
|
|
19
|
-
/**
|
|
20
|
-
* The single closed shape a capable provider constrains this call to.
|
|
21
|
-
*
|
|
22
|
-
* `options` arriving as a STRING is the failure this exists for: a model that
|
|
23
|
-
* serializes the array once tends to keep doing it, and the parse error it
|
|
24
|
-
* gets back never says the array was the problem.
|
|
25
|
-
* `additionalProperties: false` turns that into a refusal at generation time
|
|
26
|
-
* rather than a rejection after the fact.
|
|
27
|
-
*/
|
|
28
|
-
const askUserQuestionModelInputSchema = {
|
|
29
|
-
type: 'object',
|
|
30
|
-
properties: {
|
|
31
|
-
question: {
|
|
32
|
-
type: 'string',
|
|
33
|
-
description: 'Full question text — clear, specific, and ending with a question mark.',
|
|
34
|
-
},
|
|
35
|
-
header: {
|
|
36
|
-
type: 'string',
|
|
37
|
-
description: 'Optional very short topic label, no more than 24 characters.',
|
|
38
|
-
},
|
|
39
|
-
options: {
|
|
40
|
-
type: 'array',
|
|
41
|
-
description: 'A JSON array of 2-4 genuinely distinct, context-derived option objects.',
|
|
42
|
-
items: {
|
|
43
|
-
type: 'object',
|
|
44
|
-
properties: {
|
|
45
|
-
label: {
|
|
46
|
-
type: 'string',
|
|
47
|
-
description: 'Concise option label. Put the recommended option first and append " (Recommended)".',
|
|
48
|
-
},
|
|
49
|
-
description: {
|
|
50
|
-
type: 'string',
|
|
51
|
-
description: 'Optional one-line explanation of what changes if selected.',
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
required: ['label'],
|
|
55
|
-
additionalProperties: false,
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
multiSelect: {
|
|
59
|
-
type: 'boolean',
|
|
60
|
-
description: 'True only when several options can apply at once.',
|
|
61
|
-
},
|
|
62
|
-
allowFreeText: {
|
|
63
|
-
type: 'boolean',
|
|
64
|
-
description: 'Whether the user may answer in their own words.',
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
required: ['question', 'options'],
|
|
68
|
-
additionalProperties: false,
|
|
69
|
-
};
|
|
70
19
|
/** One well-formed tag token: `<step>`, `</step>`, `<a href="…">`, `<br/>`. */
|
|
71
20
|
const TAG_TOKEN = /<\/?[A-Za-z][\w-]*(?:\s[^<>]*)?\/?>/g;
|
|
72
21
|
const DESCRIPTION_BLOCK = /<description>([\s\S]*?)<\/description>/gi;
|
|
@@ -1259,172 +1208,7 @@ export function buildCoordinatorTools(opts) {
|
|
|
1259
1208
|
tools.push(updatePlanStep);
|
|
1260
1209
|
}
|
|
1261
1210
|
if (resumeHandler && runId) {
|
|
1262
|
-
|
|
1263
|
-
const parkHandler = resumeHandler;
|
|
1264
|
-
const askUserQuestion = defineTool({
|
|
1265
|
-
name: ASK_USER_QUESTION_TOOL_NAME,
|
|
1266
|
-
description: 'Ask the user ONE question ONLY when you are blocked on a decision that is genuinely theirs to make — one you cannot resolve from their request, your tools, the files you can read, or sensible defaults. The question must be the genuinely undecidable thing in THIS task. Never ask for information a tool can discover (do not ask what you can read, list, or search), never re-ask what the conversation already answers, and never ask meta-questions like "Shall I proceed?" — plan ratification goes through approve_plan. Provide 2-4 genuinely distinct options derived from the actual context — concrete paths, never generic placeholders (for example, asked to prepare a presentation, ask "Who is the audience?" with options like Board / Engineering team / Customer); keep labels short (1-5 words) and give each option a one-line description of what practically changes if it is chosen. Put your recommended option FIRST and append " (Recommended)" to its label. Set multiSelect: true only when several options can apply at once. A free-text "Something else" escape hatch is always shown automatically — do not add your own "Other" option. Ask ONE question per call and prefer at most one question per assistant turn; if several decisions block you, ask only the ones that materially change your next actions, in sequence — most work needs at most 2-3 questions, so prefer proceeding on stated defaults over interrogating the user. Never invent answers or synthetic content on the user\'s behalf unless they explicitly asked for a random/test scenario. The answer arrives as this tool\'s result; if the result says the user did not answer, do not ask this or any other question again — proceed on your best judgment without assuming consent.',
|
|
1267
|
-
inputSchema: z
|
|
1268
|
-
.object({
|
|
1269
|
-
question: z
|
|
1270
|
-
.string()
|
|
1271
|
-
.min(1)
|
|
1272
|
-
.describe('Full question text — clear, specific, ends with a question mark.'),
|
|
1273
|
-
header: z
|
|
1274
|
-
.string()
|
|
1275
|
-
.max(24)
|
|
1276
|
-
.optional()
|
|
1277
|
-
.describe('Very short topic label for the question (e.g. "Audience", "Auth method").'),
|
|
1278
|
-
options: z
|
|
1279
|
-
.array(z
|
|
1280
|
-
.object({
|
|
1281
|
-
label: z
|
|
1282
|
-
.string()
|
|
1283
|
-
.min(1)
|
|
1284
|
-
.max(80)
|
|
1285
|
-
.describe('Concise option label (1-5 words). Recommended option goes first with " (Recommended)" appended.'),
|
|
1286
|
-
description: z
|
|
1287
|
-
.string()
|
|
1288
|
-
.max(300)
|
|
1289
|
-
.optional()
|
|
1290
|
-
.describe('One line on what practically changes if this option is chosen.'),
|
|
1291
|
-
})
|
|
1292
|
-
.strict())
|
|
1293
|
-
.min(2)
|
|
1294
|
-
.max(4)
|
|
1295
|
-
.describe('2-4 genuinely distinct, context-derived options.'),
|
|
1296
|
-
multiSelect: z
|
|
1297
|
-
.boolean()
|
|
1298
|
-
.optional()
|
|
1299
|
-
.default(false)
|
|
1300
|
-
.describe('True only when several options can apply at once.'),
|
|
1301
|
-
allowFreeText: z
|
|
1302
|
-
.boolean()
|
|
1303
|
-
.optional()
|
|
1304
|
-
.default(true)
|
|
1305
|
-
.describe('Whether the user may answer in their own words.'),
|
|
1306
|
-
})
|
|
1307
|
-
.strict(),
|
|
1308
|
-
modelInputSchema: structuredClone(askUserQuestionModelInputSchema),
|
|
1309
|
-
enforceModelInput: true,
|
|
1310
|
-
validationErrorHint: 'Required shape: {"question":"...?","options":[{"label":"First (Recommended)","description":"What changes"},{"label":"Second","description":"What changes"}]}. "options" must be a JSON array of 2-4 objects, never a string.',
|
|
1311
|
-
category: 'custom',
|
|
1312
|
-
permissions: [],
|
|
1313
|
-
readOnly: true,
|
|
1314
|
-
destructive: false,
|
|
1315
|
-
// MUST stay false: the executor serializes non-concurrency-safe
|
|
1316
|
-
// tools in a single chain, so N question blocks in one assistant
|
|
1317
|
-
// turn park strictly one-at-a-time. Hosts key their park/resolve
|
|
1318
|
-
// registries by runId — concurrent parks on one run clobber each
|
|
1319
|
-
// other and the first promise never resolves (run hangs to TTL).
|
|
1320
|
-
concurrencySafe: false,
|
|
1321
|
-
async execute({ question, header, options, multiSelect, allowFreeText }, context) {
|
|
1322
|
-
const toolUseId = context.toolUseId;
|
|
1323
|
-
if (!toolUseId) {
|
|
1324
|
-
// Without the executing tool_use_id the question has no
|
|
1325
|
-
// stable identity: the host could never merge the awaiting
|
|
1326
|
-
// card with its resolution, and answers could not be matched
|
|
1327
|
-
// back. Hard-fail instead of parking an unmergeable id.
|
|
1328
|
-
return {
|
|
1329
|
-
success: false,
|
|
1330
|
-
output: '',
|
|
1331
|
-
error: 'ask_user_question requires an executor that threads ToolContext.toolUseId; the question cannot be tracked without it.',
|
|
1332
|
-
};
|
|
1333
|
-
}
|
|
1334
|
-
const questionOptions = options.map((opt, i) => ({
|
|
1335
|
-
id: `opt_${i + 1}`,
|
|
1336
|
-
label: opt.label,
|
|
1337
|
-
...(opt.description !== undefined ? { description: opt.description } : {}),
|
|
1338
|
-
}));
|
|
1339
|
-
const questionData = {
|
|
1340
|
-
questionId: toolUseId,
|
|
1341
|
-
question,
|
|
1342
|
-
...(header !== undefined ? { header } : {}),
|
|
1343
|
-
options: questionOptions,
|
|
1344
|
-
multiSelect,
|
|
1345
|
-
allowFreeText,
|
|
1346
|
-
};
|
|
1347
|
-
// An answer carried in from a resumed run. Checked before the
|
|
1348
|
-
// park, because re-entering this tool is HOW the answer gets
|
|
1349
|
-
// delivered: the batch is re-executed, and without this the
|
|
1350
|
-
// re-execution would ask the user something they already
|
|
1351
|
-
// answered — or, headless, auto-answer with the no-consent
|
|
1352
|
-
// sentinel and throw the real answer away.
|
|
1353
|
-
const carried = pendingAnswers?.take(toolUseId);
|
|
1354
|
-
// A real checkpoint, not a synthetic id nothing ever wrote.
|
|
1355
|
-
// Skipped when an answer is already in hand: parking a
|
|
1356
|
-
// question that is answered would leave an outstanding record
|
|
1357
|
-
// for a decision that has been made.
|
|
1358
|
-
const parkedAt = carried === undefined && questionParks ? await questionParks.record(questionData) : null;
|
|
1359
|
-
const decision = carried ??
|
|
1360
|
-
(await parkHandler({
|
|
1361
|
-
type: 'user_question',
|
|
1362
|
-
runId: parkRunId,
|
|
1363
|
-
checkpointId: parkedAt ?? asCheckpointId(`cp_question_${toolUseId}`),
|
|
1364
|
-
question: questionData,
|
|
1365
|
-
}));
|
|
1366
|
-
// Clear the park once the answer is in, so an approval queue
|
|
1367
|
-
// stops serving a question that has been answered.
|
|
1368
|
-
if (parkedAt !== null && questionParks) {
|
|
1369
|
-
await questionParks.resolve(parkedAt, decision);
|
|
1370
|
-
}
|
|
1371
|
-
// The no-answer sentinel (explicitly NOT consent — fixes the
|
|
1372
|
-
// "empty answer reads as approval" ambiguity): used for empty
|
|
1373
|
-
// answers, misdirected legacy decisions (e.g. a stale replica
|
|
1374
|
-
// resolving with approve/continue verbs), and answers that
|
|
1375
|
-
// carry a different question's id.
|
|
1376
|
-
const noAnswer = {
|
|
1377
|
-
success: true,
|
|
1378
|
-
output: 'The user did not answer this question. Do not assume a choice or consent; proceed on your best judgment or continue without this information.',
|
|
1379
|
-
data: { question, answered: false },
|
|
1380
|
-
};
|
|
1381
|
-
if (decision.action === 'abort') {
|
|
1382
|
-
return {
|
|
1383
|
-
success: false,
|
|
1384
|
-
output: 'The user declined to answer and asked to stop. Acknowledge briefly and end your turn.',
|
|
1385
|
-
data: { question, answered: false, declined: true },
|
|
1386
|
-
};
|
|
1387
|
-
}
|
|
1388
|
-
if (decision.action !== 'answer_question')
|
|
1389
|
-
return noAnswer;
|
|
1390
|
-
if (decision.questionId !== undefined && decision.questionId !== toolUseId) {
|
|
1391
|
-
// Misdirection guard: this answer was meant for a different
|
|
1392
|
-
// question parked under the same run (stale client). Never
|
|
1393
|
-
// fabricate a selection against the wrong question.
|
|
1394
|
-
return noAnswer;
|
|
1395
|
-
}
|
|
1396
|
-
const stripRecommended = (label) => label.replace(/\s*\(recommended\)\s*$/i, '').trim();
|
|
1397
|
-
const selected = decision.selectedOptionIds
|
|
1398
|
-
.map((id) => questionOptions.find((opt) => opt.id === id))
|
|
1399
|
-
.filter((opt) => opt !== undefined)
|
|
1400
|
-
.map((opt) => ({ id: opt.id, label: stripRecommended(opt.label) }));
|
|
1401
|
-
const freeText = decision.freeText?.trim() ?? '';
|
|
1402
|
-
if (selected.length === 0 && !freeText)
|
|
1403
|
-
return noAnswer;
|
|
1404
|
-
let output;
|
|
1405
|
-
if (selected.length > 0) {
|
|
1406
|
-
const joined = selected.map((s) => `"${s.label}"`).join(', ');
|
|
1407
|
-
output = `User answered "${question}": ${joined}`;
|
|
1408
|
-
if (freeText) {
|
|
1409
|
-
output += `\nAdditional note from the user: "${freeText}"`;
|
|
1410
|
-
}
|
|
1411
|
-
}
|
|
1412
|
-
else {
|
|
1413
|
-
output = `User answered "${question}" in their own words: "${freeText}"`;
|
|
1414
|
-
}
|
|
1415
|
-
return {
|
|
1416
|
-
success: true,
|
|
1417
|
-
output,
|
|
1418
|
-
data: {
|
|
1419
|
-
question,
|
|
1420
|
-
selected,
|
|
1421
|
-
...(freeText ? { freeText } : {}),
|
|
1422
|
-
answered: true,
|
|
1423
|
-
},
|
|
1424
|
-
};
|
|
1425
|
-
},
|
|
1426
|
-
});
|
|
1427
|
-
tools.push(askUserQuestion);
|
|
1211
|
+
tools.push(buildAskUserQuestionTool({ resumeHandler, runId, questionParks, pendingAnswers }));
|
|
1428
1212
|
}
|
|
1429
1213
|
return tools;
|
|
1430
1214
|
}
|