@namzu/sdk 34.2.0 → 35.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 +133 -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 +102 -0
- package/dist/provider/token-budget.js.map +1 -0
- package/dist/public-runtime.d.ts +12 -12
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +14 -9
- 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 +12 -9
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +95 -46
- 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 +35 -4
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +152 -52
- 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 +16 -5
- 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 +2 -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/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/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/provider/local.d.ts +3 -1
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +112 -12
- package/dist/sandbox/provider/local.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 +9 -11
- 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.js +3 -3
- package/dist/tools/builtins/glob.js.map +1 -1
- package/dist/tools/builtins/grep.js +2 -2
- package/dist/tools/builtins/grep.js.map +1 -1
- package/dist/tools/builtins/ls.js +2 -2
- 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 +27 -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 +1 -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 +114 -0
- package/src/public-runtime.ts +54 -27
- 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 +128 -58
- package/src/runtime/query/guard.ts +8 -0
- package/src/runtime/query/index.ts +201 -62
- package/src/runtime/query/iteration/index.ts +24 -6
- package/src/runtime/query/iteration/phases/compaction.ts +130 -31
- package/src/runtime/query/iteration/phases/context.ts +2 -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/plugin-hooks.ts +24 -2
- 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/provider/local.ts +123 -13
- 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 +11 -12
- package/src/tools/builtins/computer-use.ts +6 -2
- package/src/tools/builtins/edit.ts +2 -2
- package/src/tools/builtins/glob.ts +3 -3
- package/src/tools/builtins/grep.ts +2 -2
- package/src/tools/builtins/ls.ts +2 -2
- 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 +32 -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,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a run resolves the calls no rule decided.
|
|
3
|
+
*
|
|
4
|
+
* An authorization rule says what a tool may do. A review policy says what
|
|
5
|
+
* happens to everything the rules did not cover: the batch the gate routed
|
|
6
|
+
* to REVIEW. The two axes are separate on purpose — a rule is a durable
|
|
7
|
+
* statement an operator reviewed, and a mode is a property of ONE run, the
|
|
8
|
+
* difference between "we never force-push" and "this run is unattended".
|
|
9
|
+
*
|
|
10
|
+
* Only calls the gate routed to review arrive here. A rule that denied one
|
|
11
|
+
* already stopped it, and a rule that allowed one never asked. So a mode
|
|
12
|
+
* decides the undecided and can never reopen what a rule closed; a host's
|
|
13
|
+
* `--permission-mode` flag cannot widen a `deny`. That is the whole
|
|
14
|
+
* precedence story between a flag and a config file, in one sentence.
|
|
15
|
+
*
|
|
16
|
+
* This lived in the operator application as one closure. It moved here
|
|
17
|
+
* because none of it is about a terminal: the modes name kernel tools, the
|
|
18
|
+
* exemptions reason about kernel tools' blast radius, and a second host
|
|
19
|
+
* would otherwise write the same five branches and drift on the sixth.
|
|
20
|
+
* What a host supplies is the one thing the kernel cannot: how to ask a
|
|
21
|
+
* person (`prompt`).
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { ToolRegistry } from '../../registry/tool/execute.js'
|
|
25
|
+
import { isTrustedReadOnly } from '../../tools/trusted-read-only.js'
|
|
26
|
+
import type { HITLResumeDecision, ResumeHandler, ToolCallSummary } from '../../types/hitl/index.js'
|
|
27
|
+
import type { ApprovalPolicy } from '../../types/hitl/policy.js'
|
|
28
|
+
import { PLAN_MODE_REFUSAL } from '../../types/permission/index.js'
|
|
29
|
+
|
|
30
|
+
export type ReviewMode =
|
|
31
|
+
/** Ask a person. The default when a `prompt` is supplied. */
|
|
32
|
+
| 'prompt'
|
|
33
|
+
/** Approve it. The default without a `prompt`, and what every headless run has always done. */
|
|
34
|
+
| 'auto'
|
|
35
|
+
/**
|
|
36
|
+
* Approve a file edit, ask about everything else.
|
|
37
|
+
*
|
|
38
|
+
* The mode an operator watching the agent write code actually wants: an
|
|
39
|
+
* `edit` or `write` inside the working directory is what they asked for
|
|
40
|
+
* and is undoable with `git`, so a prompt on each one is a prompt they
|
|
41
|
+
* answer `y` to forty times an hour — and a prompt that is always
|
|
42
|
+
* answered the same way trains the hand to answer the next one, which is
|
|
43
|
+
* the shell prompt, the same way. Shell commands, delegation and anything
|
|
44
|
+
* a tool declares destructive still ask.
|
|
45
|
+
*/
|
|
46
|
+
| 'accept-edits'
|
|
47
|
+
/**
|
|
48
|
+
* Read and think, do not act. A call that only reads is approved; a call
|
|
49
|
+
* that would change anything is refused with feedback telling the model
|
|
50
|
+
* to present its plan instead. The operator reads the plan and switches
|
|
51
|
+
* mode to have it carried out — the switch IS the approval. The kernel's
|
|
52
|
+
* `permissionMode: 'plan'` is the floor under this: it blocks a mutating
|
|
53
|
+
* call at execution with no feedback, where this refuses it at review
|
|
54
|
+
* with the words that make the model plan.
|
|
55
|
+
*/
|
|
56
|
+
| 'plan'
|
|
57
|
+
/**
|
|
58
|
+
* Refuse it. Nothing runs unless a rule allowed it by name or pattern —
|
|
59
|
+
* the allowlist is the whole permission surface, which is the only form
|
|
60
|
+
* an unattended run can actually be reasoned about.
|
|
61
|
+
*/
|
|
62
|
+
| 'strict'
|
|
63
|
+
|
|
64
|
+
export const REVIEW_MODES: readonly ReviewMode[] = [
|
|
65
|
+
'prompt',
|
|
66
|
+
'accept-edits',
|
|
67
|
+
'auto',
|
|
68
|
+
'strict',
|
|
69
|
+
'plan',
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
export function isReviewMode(value: unknown): value is ReviewMode {
|
|
73
|
+
return typeof value === 'string' && (REVIEW_MODES as readonly string[]).includes(value)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export { PLAN_MODE_REFUSAL }
|
|
77
|
+
|
|
78
|
+
/** What the model is told when a call is refused under `strict`. */
|
|
79
|
+
export const STRICT_MODE_REFUSAL =
|
|
80
|
+
'Refused: this run only permits tools an explicit rule allows, and no rule covers this call. Asking again will not change it — either the operator adds a rule, or this has to be done another way.'
|
|
81
|
+
|
|
82
|
+
/** The tools `accept-edits` approves without asking. Everything else prompts. */
|
|
83
|
+
export const ACCEPT_EDITS_TOOLS: ReadonlySet<string> = new Set(['edit', 'write'])
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Writes that skip review anyway, in spite of declaring `readOnly: false`.
|
|
87
|
+
*
|
|
88
|
+
* This is an OVERRIDE of the tool's own declaration, and it is named as one.
|
|
89
|
+
* The bar for an entry is that prompting would be unusable AND a bad write
|
|
90
|
+
* cannot reach beyond the agent's own bookkeeping:
|
|
91
|
+
*
|
|
92
|
+
* - `task_create` / `task_update` / `update_goal` — the model's own plan for
|
|
93
|
+
* the current request, written several times per planning turn; asking
|
|
94
|
+
* each time would put a consent dialog between the agent and its todo
|
|
95
|
+
* list. What a bad write costs is a polluted task list, visible in the
|
|
96
|
+
* transcript, and it grants nothing.
|
|
97
|
+
*
|
|
98
|
+
* `save_memory` is deliberately NOT here. Content saved now is retrievable
|
|
99
|
+
* by `search_memory` in a later session, so a tool result that talks the
|
|
100
|
+
* model into saving something reaches a future run's reasoning. A write
|
|
101
|
+
* that survives the process is not read-only under any reading.
|
|
102
|
+
*/
|
|
103
|
+
export const REVIEW_EXEMPT_WRITES: ReadonlySet<string> = new Set([
|
|
104
|
+
'task_create',
|
|
105
|
+
'task_update',
|
|
106
|
+
'update_goal',
|
|
107
|
+
])
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Whether a call runs without review: it declares itself read-only and is
|
|
111
|
+
* trusted to say so, or it is a named exemption above.
|
|
112
|
+
*
|
|
113
|
+
* The read-only half comes from the tool's own declaration through
|
|
114
|
+
* `isTrustedReadOnly`, the predicate the authorization gate uses, never from
|
|
115
|
+
* a list of names kept here: a renamed tool would otherwise change posture
|
|
116
|
+
* with nothing to notice. A fetch declares itself read-only and is still a
|
|
117
|
+
* request leaving the machine to an address the model chose, so `network`
|
|
118
|
+
* tools are reviewed like a shell command. A tool the registry does not
|
|
119
|
+
* know, or one that declares nothing, is reviewed.
|
|
120
|
+
*/
|
|
121
|
+
export function isReviewExempt(
|
|
122
|
+
registry: Pick<ToolRegistry, 'get'>,
|
|
123
|
+
name: string,
|
|
124
|
+
input: unknown,
|
|
125
|
+
): boolean {
|
|
126
|
+
if (REVIEW_EXEMPT_WRITES.has(name.toLowerCase())) return true
|
|
127
|
+
const tool = registry.get(name) ?? registry.get(name.toLowerCase())
|
|
128
|
+
if (tool?.category === 'network') return false
|
|
129
|
+
return isTrustedReadOnly(tool, input)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export type ReviewExemption = (name: string, input: unknown) => boolean
|
|
133
|
+
|
|
134
|
+
/** A batch needs review when any call mutates state: flagged destructive, or not exempt. */
|
|
135
|
+
export function batchNeedsReview(
|
|
136
|
+
toolCalls: readonly ToolCallSummary[],
|
|
137
|
+
exempt: ReviewExemption,
|
|
138
|
+
): boolean {
|
|
139
|
+
return toolCalls.some((tc) => tc.isDestructive || !exempt(tc.name, tc.input))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** The batch a person is asked about. */
|
|
143
|
+
export interface ToolReviewRequest {
|
|
144
|
+
readonly toolCalls: readonly ToolCallSummary[]
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export type ToolReviewAnswer =
|
|
148
|
+
| { readonly kind: 'approve' }
|
|
149
|
+
/** Approve, and stop asking for the rest of the run. */
|
|
150
|
+
| { readonly kind: 'approve-all' }
|
|
151
|
+
| { readonly kind: 'reject'; readonly feedback?: string }
|
|
152
|
+
|
|
153
|
+
/** How a host asks a person. The one thing the kernel cannot supply. */
|
|
154
|
+
export type ToolReviewPrompt = (request: ToolReviewRequest) => Promise<ToolReviewAnswer>
|
|
155
|
+
|
|
156
|
+
export interface ReviewPolicyOptions {
|
|
157
|
+
/** Default `prompt` when a `prompt` is supplied, `auto` otherwise. */
|
|
158
|
+
readonly mode?: ReviewMode
|
|
159
|
+
readonly prompt?: ToolReviewPrompt
|
|
160
|
+
/** Which calls skip review; default `isReviewExempt` over `registry`, or nothing without one. */
|
|
161
|
+
readonly exempt?: ReviewExemption
|
|
162
|
+
readonly registry?: Pick<ToolRegistry, 'get'>
|
|
163
|
+
/**
|
|
164
|
+
* Where "approve all" is remembered. A host that shows the state (a
|
|
165
|
+
* badge saying the session is unattended) passes its own box so both
|
|
166
|
+
* read the same fact; omitted, the policy keeps one privately.
|
|
167
|
+
*/
|
|
168
|
+
readonly remembered?: { all: boolean }
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** The handler behind `createReviewPolicy`, for a host that wants only the function. */
|
|
172
|
+
export function createReviewHandler(options: ReviewPolicyOptions = {}): ResumeHandler {
|
|
173
|
+
const { prompt, registry } = options
|
|
174
|
+
const mode: ReviewMode = options.mode ?? (prompt ? 'prompt' : 'auto')
|
|
175
|
+
const exempt: ReviewExemption =
|
|
176
|
+
options.exempt ??
|
|
177
|
+
(registry ? (name, input) => isReviewExempt(registry, name, input) : () => false)
|
|
178
|
+
const remembered = options.remembered ?? { all: false }
|
|
179
|
+
return async (request): Promise<HITLResumeDecision> => {
|
|
180
|
+
if (request.type !== 'tool_review') {
|
|
181
|
+
return request.type === 'plan_approval' ? { action: 'approve_plan' } : { action: 'continue' }
|
|
182
|
+
}
|
|
183
|
+
if (!batchNeedsReview(request.toolCalls, exempt)) {
|
|
184
|
+
return { action: 'approve_tools' }
|
|
185
|
+
}
|
|
186
|
+
// A batch of nothing but non-destructive file edits is the case
|
|
187
|
+
// `accept-edits` exists for. One shell call in the same batch and the
|
|
188
|
+
// whole batch asks — the operator reviews the batch as a unit, and a
|
|
189
|
+
// prompt that showed only the shell command while the edits went
|
|
190
|
+
// through beside it would be approving something it did not show.
|
|
191
|
+
if (
|
|
192
|
+
mode === 'accept-edits' &&
|
|
193
|
+
request.toolCalls.every(
|
|
194
|
+
(tc) => !tc.isDestructive && (ACCEPT_EDITS_TOOLS.has(tc.name) || exempt(tc.name, tc.input)),
|
|
195
|
+
)
|
|
196
|
+
) {
|
|
197
|
+
return { action: 'approve_tools' }
|
|
198
|
+
}
|
|
199
|
+
// Reads were approved above. Anything that reached here would change
|
|
200
|
+
// something, and plan mode's answer is the same every time: not now,
|
|
201
|
+
// tell the user what you would do.
|
|
202
|
+
if (mode === 'plan') return { action: 'reject_tools', feedback: PLAN_MODE_REFUSAL }
|
|
203
|
+
if (mode === 'strict') return { action: 'reject_tools', feedback: STRICT_MODE_REFUSAL }
|
|
204
|
+
if (mode === 'auto' || !prompt || remembered.all) {
|
|
205
|
+
return { action: 'approve_tools' }
|
|
206
|
+
}
|
|
207
|
+
const answer = await prompt({ toolCalls: request.toolCalls })
|
|
208
|
+
switch (answer.kind) {
|
|
209
|
+
case 'approve':
|
|
210
|
+
return { action: 'approve_tools' }
|
|
211
|
+
case 'approve-all':
|
|
212
|
+
remembered.all = true
|
|
213
|
+
return { action: 'approve_tools' }
|
|
214
|
+
case 'reject':
|
|
215
|
+
return {
|
|
216
|
+
action: 'reject_tools',
|
|
217
|
+
feedback: answer.feedback ?? 'User declined to run the proposed tool(s).',
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* The mode as an `ApprovalPolicy`, named after itself so a durable log can
|
|
225
|
+
* say which one approved a call. Swap it on a run's `RunApprovalPolicy`
|
|
226
|
+
* to change mode without ending the run.
|
|
227
|
+
*/
|
|
228
|
+
export function createReviewPolicy(options: ReviewPolicyOptions = {}): ApprovalPolicy {
|
|
229
|
+
const mode: ReviewMode = options.mode ?? (options.prompt ? 'prompt' : 'auto')
|
|
230
|
+
return { name: mode, handler: createReviewHandler({ ...options, mode }) }
|
|
231
|
+
}
|
|
@@ -53,6 +53,8 @@ export function captureRunState(
|
|
|
53
53
|
...(session.lastError ? { lastError: session.lastError } : {}),
|
|
54
54
|
messages: structuredClone(runMgr.messages),
|
|
55
55
|
tokenUsage: { ...runMgr.tokenUsage },
|
|
56
|
+
budgetBinding: runMgr.budget?.binding,
|
|
57
|
+
budgetAccountId: runMgr.budget?.accountId,
|
|
56
58
|
costInfo: { ...runMgr.costInfo },
|
|
57
59
|
currentIteration: runMgr.currentIteration,
|
|
58
60
|
startedAt,
|
|
@@ -114,6 +116,8 @@ export async function loadSelectedRunState(
|
|
|
114
116
|
status: 'running',
|
|
115
117
|
messages: checkpoint.messages,
|
|
116
118
|
tokenUsage: checkpoint.tokenUsage,
|
|
119
|
+
budgetBinding: checkpoint.budgetBinding,
|
|
120
|
+
budgetAccountId: checkpoint.budgetAccountId,
|
|
117
121
|
costInfo: checkpoint.costInfo,
|
|
118
122
|
currentIteration: checkpoint.guardState.iterationCount,
|
|
119
123
|
startedAt: checkpoint.createdAt - checkpoint.guardState.elapsedMs,
|
|
@@ -84,6 +84,38 @@ export class SteeringBinding implements SteeringChannel {
|
|
|
84
84
|
* to be worked with rather than followed would inverting the very thing the
|
|
85
85
|
* host is trying to do. Different party, different frame, on purpose.
|
|
86
86
|
*/
|
|
87
|
+
/** The same slot as steering, for notices the kernel itself has to deliver. */
|
|
88
|
+
export function attachNotice(
|
|
89
|
+
messages: readonly Message[],
|
|
90
|
+
channel: SteeringChannel | undefined,
|
|
91
|
+
format: (text: string) => string,
|
|
92
|
+
): readonly Message[] {
|
|
93
|
+
if (!channel?.pending) return messages
|
|
94
|
+
let lastToolIndex = -1
|
|
95
|
+
for (let index = messages.length - 1; index >= 0; index--) {
|
|
96
|
+
if (messages[index]?.role === 'tool') {
|
|
97
|
+
lastToolIndex = index
|
|
98
|
+
break
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (lastToolIndex === -1) return messages
|
|
102
|
+
const text = channel.drain()
|
|
103
|
+
if (text === undefined) return messages
|
|
104
|
+
const target = messages[lastToolIndex] as Message
|
|
105
|
+
if (typeof target.content !== 'string') {
|
|
106
|
+
channel.steer(text)
|
|
107
|
+
return messages
|
|
108
|
+
}
|
|
109
|
+
const next = [...messages]
|
|
110
|
+
next[lastToolIndex] = { ...target, content: target.content + format(text) }
|
|
111
|
+
return next
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** What the model reads when a background job it started has ended. */
|
|
115
|
+
export function formatJobNote(text: string): string {
|
|
116
|
+
return `\n\n[Background job update]\n${text}`
|
|
117
|
+
}
|
|
118
|
+
|
|
87
119
|
export function formatSteeringNote(text: string): string {
|
|
88
120
|
return `\n\n[Message from the operator, received while this tool was running]\n${text}`
|
|
89
121
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { join } from 'node:path'
|
|
2
|
+
import type { TokenBudget } from '../../run/token-budget.js'
|
|
3
|
+
import { DefaultPathBuilder } from '../../session/workspace/path-builder.js'
|
|
4
|
+
import { DiskCheckpointStore } from '../../store/run/checkpoint-disk.js'
|
|
5
|
+
import { openTokenBudget } from '../../store/run/token-budget-disk.js'
|
|
6
|
+
import type { IterationCheckpoint } from '../../types/hitl/index.js'
|
|
7
|
+
import type { RunId } from '../../types/ids/index.js'
|
|
8
|
+
import type { RunState } from '../../types/run/state.js'
|
|
9
|
+
import { validateTokenBudgetBinding } from '../../types/run/token-budget-store.js'
|
|
10
|
+
import type { QueryParams } from './index.js'
|
|
11
|
+
|
|
12
|
+
/** Resolve one authority before any model request or recovered tool dispatch. */
|
|
13
|
+
export async function resolveQueryBudget(
|
|
14
|
+
params: QueryParams,
|
|
15
|
+
runId: RunId,
|
|
16
|
+
selected?: RunState,
|
|
17
|
+
): Promise<TokenBudget> {
|
|
18
|
+
let saved: Pick<IterationCheckpoint, 'budgetBinding' | 'budgetAccountId'> | undefined = selected
|
|
19
|
+
if (params.resumeFromCheckpoint && !saved) {
|
|
20
|
+
const paths =
|
|
21
|
+
params.pathBuilder ??
|
|
22
|
+
new DefaultPathBuilder(join(params.workingDirectory ?? process.cwd(), '.namzu'))
|
|
23
|
+
const scope = {
|
|
24
|
+
tenantId: params.tenantId,
|
|
25
|
+
projectId: params.projectId,
|
|
26
|
+
sessionId: params.sessionId,
|
|
27
|
+
runId,
|
|
28
|
+
parentRunId: params.parentRunId,
|
|
29
|
+
}
|
|
30
|
+
const store =
|
|
31
|
+
params.checkpointStore ??
|
|
32
|
+
new DiskCheckpointStore(
|
|
33
|
+
{
|
|
34
|
+
baseDir: join(paths.sessionDir(params.projectId, params.sessionId), 'runs'),
|
|
35
|
+
},
|
|
36
|
+
scope,
|
|
37
|
+
)
|
|
38
|
+
saved = (await store.readCheckpoint(scope, params.resumeFromCheckpoint)) ?? undefined
|
|
39
|
+
if (!saved) throw new Error('Cannot restore a token budget from a missing checkpoint.')
|
|
40
|
+
}
|
|
41
|
+
const schedulerBudget = params.taskScheduler?.budget
|
|
42
|
+
if (params.taskScheduler && !schedulerBudget) {
|
|
43
|
+
throw new Error('A task scheduler must expose its shared token budget account.')
|
|
44
|
+
}
|
|
45
|
+
if (params.budget && schedulerBudget && params.budget !== schedulerBudget) {
|
|
46
|
+
throw new Error('Query and task scheduler must share the same token budget account.')
|
|
47
|
+
}
|
|
48
|
+
const provided = params.budget ?? schedulerBudget
|
|
49
|
+
const binding =
|
|
50
|
+
saved?.budgetBinding === undefined ? undefined : validateTokenBudgetBinding(saved.budgetBinding)
|
|
51
|
+
if (
|
|
52
|
+
binding &&
|
|
53
|
+
saved?.budgetAccountId !== undefined &&
|
|
54
|
+
saved.budgetAccountId !== binding.accountId
|
|
55
|
+
) {
|
|
56
|
+
throw new Error('Checkpoint token budget account references disagree.')
|
|
57
|
+
}
|
|
58
|
+
if (
|
|
59
|
+
binding &&
|
|
60
|
+
(binding.scope.tenantId !== params.tenantId || binding.scope.projectId !== params.projectId)
|
|
61
|
+
) {
|
|
62
|
+
throw new Error('Checkpoint token budget belongs to a different tenant or project.')
|
|
63
|
+
}
|
|
64
|
+
if (binding && binding.scope.runId === runId && binding.scope.sessionId !== params.sessionId) {
|
|
65
|
+
throw new Error('Checkpoint token budget belongs to a different root session.')
|
|
66
|
+
}
|
|
67
|
+
if (provided) {
|
|
68
|
+
const providedBinding = provided.binding
|
|
69
|
+
if (
|
|
70
|
+
providedBinding &&
|
|
71
|
+
(providedBinding.scope.tenantId !== params.tenantId ||
|
|
72
|
+
providedBinding.scope.projectId !== params.projectId ||
|
|
73
|
+
(providedBinding.scope.runId === runId &&
|
|
74
|
+
providedBinding.scope.sessionId !== params.sessionId))
|
|
75
|
+
) {
|
|
76
|
+
throw new Error('Supplied token budget belongs to a different root scope.')
|
|
77
|
+
}
|
|
78
|
+
if (saved?.budgetAccountId && saved.budgetAccountId !== provided.accountId) {
|
|
79
|
+
throw new Error('Resume requires the original token budget account.')
|
|
80
|
+
}
|
|
81
|
+
if (
|
|
82
|
+
binding &&
|
|
83
|
+
(binding.accountId !== provided.accountId || binding.scope.runId !== provided.rootRunId)
|
|
84
|
+
) {
|
|
85
|
+
throw new Error('Checkpoint and supplied token budget authority disagree.')
|
|
86
|
+
}
|
|
87
|
+
if (
|
|
88
|
+
binding &&
|
|
89
|
+
(!providedBinding ||
|
|
90
|
+
binding.scope.tenantId !== providedBinding.scope.tenantId ||
|
|
91
|
+
binding.scope.projectId !== providedBinding.scope.projectId ||
|
|
92
|
+
binding.scope.sessionId !== providedBinding.scope.sessionId ||
|
|
93
|
+
binding.scope.runId !== providedBinding.scope.runId)
|
|
94
|
+
) {
|
|
95
|
+
throw new Error('Checkpoint and supplied token budget root scopes disagree.')
|
|
96
|
+
}
|
|
97
|
+
provided.bindRun(runId)
|
|
98
|
+
narrowToRunLimit(provided, params.runConfig.tokenBudget)
|
|
99
|
+
return provided
|
|
100
|
+
}
|
|
101
|
+
if (saved?.budgetAccountId && !binding) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
'This checkpoint used an in-memory token budget. Supply its current authoritative budget to resume.',
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
const budget = await openTokenBudget({
|
|
107
|
+
store: params.tokenBudgetStore,
|
|
108
|
+
pathBuilder: params.pathBuilder,
|
|
109
|
+
workingDirectory: params.workingDirectory,
|
|
110
|
+
scope: binding?.scope ?? {
|
|
111
|
+
tenantId: params.tenantId,
|
|
112
|
+
projectId: params.projectId,
|
|
113
|
+
sessionId: params.sessionId,
|
|
114
|
+
runId,
|
|
115
|
+
},
|
|
116
|
+
limit: binding && binding.scope.runId !== runId ? undefined : params.runConfig.tokenBudget,
|
|
117
|
+
accountId: binding?.accountId,
|
|
118
|
+
requireExisting: binding !== undefined,
|
|
119
|
+
})
|
|
120
|
+
budget.bindRun(runId)
|
|
121
|
+
narrowToRunLimit(budget, params.runConfig.tokenBudget)
|
|
122
|
+
return budget
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function narrowToRunLimit(budget: TokenBudget, limit: number): void {
|
|
126
|
+
if (limit > 0 && (budget.limit === 0 || limit < budget.limit)) budget.narrow(limit)
|
|
127
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
1
2
|
import { mkdirSync, writeFileSync } from 'node:fs'
|
|
2
3
|
import { join } from 'node:path'
|
|
3
4
|
|
|
@@ -76,7 +77,14 @@ function boundedPreview(
|
|
|
76
77
|
'',
|
|
77
78
|
].join('\n')
|
|
78
79
|
const compactMiddle = '\n[... omitted ...]\n'
|
|
79
|
-
const
|
|
80
|
+
const spillLine = recovery.split('\n').find((line) => line.startsWith(SPILL_MARKER))
|
|
81
|
+
const compactRecovery = spillLine ? `${compactMiddle}${spillLine}\n` : compactMiddle
|
|
82
|
+
const middle =
|
|
83
|
+
detailedMiddle.length < maxChars
|
|
84
|
+
? detailedMiddle
|
|
85
|
+
: compactRecovery.length < maxChars
|
|
86
|
+
? compactRecovery
|
|
87
|
+
: compactMiddle
|
|
80
88
|
|
|
81
89
|
// A host may deliberately set a tiny positive cap. At that point no
|
|
82
90
|
// truthful recovery sentence fits; the hard bound still wins.
|
|
@@ -123,7 +131,7 @@ export function describeDroppedContent(
|
|
|
123
131
|
if (counts.size === 0) return undefined
|
|
124
132
|
|
|
125
133
|
const parts = [...counts].map(([kind, n]) => (n === 1 ? `1 ${kind}` : `${n} ${kind} blocks`))
|
|
126
|
-
return `[${parts.join(', ')} omitted
|
|
134
|
+
return `[${parts.join(', ')} omitted from this model request.]`
|
|
127
135
|
}
|
|
128
136
|
|
|
129
137
|
/**
|
|
@@ -137,8 +145,7 @@ export function measureContentBytes(content: readonly unknown[] | unknown): numb
|
|
|
137
145
|
if (!Array.isArray(content)) return 0
|
|
138
146
|
let total = 0
|
|
139
147
|
for (const block of content as readonly Record<string, unknown>[]) {
|
|
140
|
-
if (typeof block?.data === 'string') total += block.data.length
|
|
141
|
-
else if (typeof block?.text === 'string') total += block.text.length
|
|
148
|
+
if (block?.type !== 'text' && typeof block?.data === 'string') total += block.data.length
|
|
142
149
|
}
|
|
143
150
|
return total
|
|
144
151
|
}
|
|
@@ -148,6 +155,8 @@ export interface ApplyToolOutputBudgetOptions {
|
|
|
148
155
|
readonly toolUseId: string
|
|
149
156
|
readonly output: string
|
|
150
157
|
readonly maxChars: number
|
|
158
|
+
/** An omission notice that shares the text budget, never extends it. */
|
|
159
|
+
readonly notice?: string
|
|
151
160
|
/**
|
|
152
161
|
* Directory to spill overflow into. When absent the output is
|
|
153
162
|
* middle-elided instead — degraded, but never unbounded.
|
|
@@ -173,9 +182,20 @@ export interface ApplyToolOutputBudgetOptions {
|
|
|
173
182
|
export function applyToolOutputBudget(opts: ApplyToolOutputBudgetOptions): ToolOutputBudgetResult {
|
|
174
183
|
const { output, maxChars } = opts
|
|
175
184
|
const originalLength = output.length
|
|
185
|
+
const limit = Number.isFinite(maxChars) && maxChars > 0 ? Math.floor(maxChars) : undefined
|
|
186
|
+
const notice = opts.notice
|
|
187
|
+
? limit === undefined
|
|
188
|
+
? opts.notice
|
|
189
|
+
: safeHead(opts.notice, limit)
|
|
190
|
+
: ''
|
|
191
|
+
const textBudget =
|
|
192
|
+
limit === undefined
|
|
193
|
+
? undefined
|
|
194
|
+
: Math.max(0, limit - notice.length - (notice && output ? 2 : 0))
|
|
195
|
+
const withNotice = (text: string) => [text, notice].filter(Boolean).join('\n\n')
|
|
176
196
|
|
|
177
|
-
if (
|
|
178
|
-
return { output, originalLength, truncated: false }
|
|
197
|
+
if (textBudget === undefined || originalLength <= textBudget) {
|
|
198
|
+
return { output: withNotice(output), originalLength, truncated: false }
|
|
179
199
|
}
|
|
180
200
|
|
|
181
201
|
const spillPath = opts.spillDir
|
|
@@ -187,10 +207,10 @@ export function applyToolOutputBudget(opts: ApplyToolOutputBudgetOptions): ToolO
|
|
|
187
207
|
`${SPILL_MARKER} ${spillPath}`,
|
|
188
208
|
'Read a specific window with `read` (offset/limit) or search it with `grep`. Do NOT read it whole — that is what exceeded the budget.',
|
|
189
209
|
].join('\n')
|
|
190
|
-
: 'The full output was not retained.
|
|
210
|
+
: 'The full output was not retained. Use a saved artifact or a read-only observation; do not repeat a state-changing action to recover its output.'
|
|
191
211
|
|
|
192
212
|
return {
|
|
193
|
-
output: boundedPreview(output,
|
|
213
|
+
output: withNotice(boundedPreview(output, textBudget, opts.toolName, recovery)),
|
|
194
214
|
originalLength,
|
|
195
215
|
truncated: true,
|
|
196
216
|
...(spillPath ? { spillPath } : {}),
|
|
@@ -214,8 +234,11 @@ function spill(
|
|
|
214
234
|
// which is the host's decision to make and not this function's to
|
|
215
235
|
// override.
|
|
216
236
|
mkdirSync(dir, { recursive: true, mode: 0o700 })
|
|
217
|
-
//
|
|
218
|
-
|
|
237
|
+
// Provider correlation IDs are opaque strings, not filesystem names.
|
|
238
|
+
// A digest preserves deterministic lookup without interpreting slashes,
|
|
239
|
+
// traversal segments or platform-specific path syntax from the provider.
|
|
240
|
+
const name = createHash('sha256').update(toolUseId).digest('hex')
|
|
241
|
+
const path = join(dir, `${name}.txt`)
|
|
219
242
|
// `wx`, not the default `w`. `w` creates-or-truncates and FOLLOWS a
|
|
220
243
|
// symlink, at a path anything that can write to this directory could
|
|
221
244
|
// predict and pre-plant — so the kernel would overwrite the symlink's
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { HITLResumeDecision, ResumeHandler, UserQuestionData } from '../../types/hitl/index.js'
|
|
2
2
|
import type { RunId } from '../../types/ids/index.js'
|
|
3
3
|
import type { RequestToolPause, ToolPauseRequest } from '../../types/tool/index.js'
|
|
4
|
-
import {
|
|
4
|
+
import { generateCheckpointId } from '../../utils/id.js'
|
|
5
5
|
import type { PendingAnswers, QuestionParkRecorder } from './question-park.js'
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -121,7 +121,9 @@ export function createToolPause(deps: ToolPauseDeps): RequestToolPause {
|
|
|
121
121
|
(await deps.parkHandler({
|
|
122
122
|
type: 'user_question',
|
|
123
123
|
runId: deps.runId,
|
|
124
|
-
|
|
124
|
+
// The question retains its correlation id; provider ids and pause
|
|
125
|
+
// names need not be safe components of a checkpoint storage key.
|
|
126
|
+
checkpointId: parkedAt ?? generateCheckpointId(),
|
|
125
127
|
question,
|
|
126
128
|
}))
|
|
127
129
|
|
|
@@ -23,6 +23,8 @@ export interface ToolingBootstrapConfig {
|
|
|
23
23
|
tools: ToolRegistryContract
|
|
24
24
|
runId: RunId
|
|
25
25
|
workingDirectory: string
|
|
26
|
+
/** See `QueryParams.additionalDirectories`. */
|
|
27
|
+
additionalDirectories?: readonly string[]
|
|
26
28
|
/** A resolver, so an approval inside a run can change it. See the executor. */
|
|
27
29
|
permissionMode: PermissionMode | (() => PermissionMode)
|
|
28
30
|
env: Record<string, string>
|
|
@@ -33,6 +35,8 @@ export interface ToolingBootstrapConfig {
|
|
|
33
35
|
toolTimeoutMs?: number
|
|
34
36
|
/** Host-owned and shared; the executor binds it to this run. */
|
|
35
37
|
backgroundJobs?: BackgroundJobRegistry
|
|
38
|
+
/** See `QueryParams.backgroundJobOwner`. */
|
|
39
|
+
backgroundJobOwner?: string
|
|
36
40
|
/** Where the `skill` tool reads from. */
|
|
37
41
|
skills?: SkillRegistryRef
|
|
38
42
|
/** How this run reaches the web. */
|
|
@@ -63,6 +67,9 @@ export class ToolingBootstrap {
|
|
|
63
67
|
tools: config.tools,
|
|
64
68
|
runId: config.runId,
|
|
65
69
|
workingDirectory: config.workingDirectory,
|
|
70
|
+
...(config.additionalDirectories?.length
|
|
71
|
+
? { additionalDirectories: config.additionalDirectories }
|
|
72
|
+
: {}),
|
|
66
73
|
permissionMode: config.permissionMode,
|
|
67
74
|
env: config.env,
|
|
68
75
|
abortSignal: config.abortSignal,
|
|
@@ -70,6 +77,7 @@ export class ToolingBootstrap {
|
|
|
70
77
|
invocationState: config.invocationState,
|
|
71
78
|
pluginManager: config.pluginManager,
|
|
72
79
|
...(config.backgroundJobs ? { backgroundJobs: config.backgroundJobs } : {}),
|
|
80
|
+
...(config.backgroundJobOwner ? { backgroundJobOwner: config.backgroundJobOwner } : {}),
|
|
73
81
|
...(config.skills ? { skills: config.skills } : {}),
|
|
74
82
|
...(config.web ? { web: config.web } : {}),
|
|
75
83
|
...(config.toolTimeoutMs !== undefined ? { toolTimeoutMs: config.toolTimeoutMs } : {}),
|