@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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { AGENT_MANAGER_DEFAULTS } from '../../constants/agent/index.js'
|
|
2
|
-
import { EMPTY_TOKEN_USAGE } from '../../constants/limits.js'
|
|
3
2
|
import { GENAI } from '../../constants/telemetry/index.js'
|
|
4
3
|
import type { AgentRegistry } from '../../registry/agent/definitions.js'
|
|
5
4
|
import {
|
|
@@ -196,288 +195,389 @@ export class AgentManager {
|
|
|
196
195
|
const sharedAgent = definitionForSpawn.typedAgent
|
|
197
196
|
const agent = definitionForSpawn.createAgent?.() ?? sharedAgent.forRun?.() ?? sharedAgent
|
|
198
197
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
198
|
+
context.parentAbortController.signal.throwIfAborted()
|
|
199
|
+
|
|
200
|
+
// Reserve synchronously before provisioning yields. The authority is shared
|
|
201
|
+
// across managers and nested sessions, while the session lock below only
|
|
202
|
+
// serializes filesystem capacity checks.
|
|
203
|
+
const remaining = context.budget.remaining
|
|
204
|
+
const maxAllocation = Number.isFinite(remaining)
|
|
205
|
+
? Math.floor(remaining * this.config.maxBudgetFraction)
|
|
206
|
+
: (options.budgetAllocation?.tokenBudget ??
|
|
207
|
+
(options.configOverrides?.tokenBudget === 0
|
|
208
|
+
? 200_000
|
|
209
|
+
: (options.configOverrides?.tokenBudget ?? 200_000)))
|
|
210
|
+
const allocatedTokens = Math.min(
|
|
211
|
+
options.budgetAllocation?.tokenBudget ?? maxAllocation,
|
|
212
|
+
maxAllocation,
|
|
213
|
+
)
|
|
214
|
+
if (!Number.isSafeInteger(allocatedTokens) || allocatedTokens <= 0) {
|
|
215
|
+
throw new NamzuError({
|
|
216
|
+
code: 'invalid_config',
|
|
217
|
+
message: `Cannot spawn "${options.agentId}": the parent has ${remaining} tokens remaining; a child allocation must be a finite positive integer.`,
|
|
218
|
+
})
|
|
219
|
+
}
|
|
220
|
+
const childBudget = context.budget.reserve(allocatedTokens)
|
|
221
|
+
let spawnRecord: ChildSpawnRecord
|
|
222
|
+
try {
|
|
223
|
+
await childBudget.flush()
|
|
224
|
+
spawnRecord = await this.provisionSpawn(options, context)
|
|
225
|
+
} catch (error) {
|
|
226
|
+
childBudget.settle(0)
|
|
227
|
+
await childBudget.flush()
|
|
228
|
+
throw error
|
|
229
|
+
}
|
|
230
|
+
let childAbortController: AbortController | undefined
|
|
231
|
+
let agentTask: AgentTask | undefined
|
|
232
|
+
try {
|
|
233
|
+
childAbortController = createChildAbortController(context.parentAbortController)
|
|
224
234
|
|
|
225
|
-
|
|
235
|
+
const taskId = generateTaskId()
|
|
226
236
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
237
|
+
const childParentActor: ActorRef = {
|
|
238
|
+
kind: 'agent',
|
|
239
|
+
agentId: context.parentAgentId,
|
|
240
|
+
tenantId: context.tenantId,
|
|
241
|
+
parentActor: context.parentActor,
|
|
242
|
+
}
|
|
233
243
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
const childContext: AgentTaskContext = {
|
|
258
|
-
parentRunId: context.parentRunId,
|
|
259
|
-
parentAgentId: context.parentAgentId,
|
|
260
|
-
parentAbortController: context.parentAbortController,
|
|
261
|
-
depth: context.depth + 1,
|
|
262
|
-
budgetTracker: context.budgetTracker,
|
|
263
|
-
factoryOptions: context.factoryOptions,
|
|
264
|
-
tenantId: context.tenantId,
|
|
265
|
-
topicId: context.topicId,
|
|
266
|
-
sessionId: spawnRecord.childSessionId,
|
|
267
|
-
projectId: context.projectId,
|
|
268
|
-
parentActor: childParentActor,
|
|
269
|
-
...(resolvedDenies.length > 0 ? { toolDenies: resolvedDenies } : {}),
|
|
270
|
-
}
|
|
244
|
+
// The union of every deny along the chain, plus this spawn's own.
|
|
245
|
+
//
|
|
246
|
+
// Without it, NZ-GATE-09's scope stopped at one level: a child denied
|
|
247
|
+
// `bash` could spawn a grandchild naming no scope, and the grandchild
|
|
248
|
+
// got bash back. A restriction that a descendant can shed by
|
|
249
|
+
// delegating is not a restriction.
|
|
250
|
+
//
|
|
251
|
+
// No containment CHECK here, deliberately. The obvious shape is to
|
|
252
|
+
// confirm with `isDescendantOfActor` that the child really sits under
|
|
253
|
+
// the actor whose scope is being inherited — but `childParentActor`
|
|
254
|
+
// is built two statements up FROM `context.parentActor`, so the
|
|
255
|
+
// answer is yes by construction and the branch could never be taken.
|
|
256
|
+
// A check that cannot fail reads as a safeguard and is not one. The
|
|
257
|
+
// predicate is exported for the callers that do face an actor they
|
|
258
|
+
// did not construct: an audit walking a subtree, a host asking
|
|
259
|
+
// whether one run's actor is contained by another's.
|
|
260
|
+
//
|
|
261
|
+
// Union, not replace, and not "innermost wins": a descendant may
|
|
262
|
+
// narrow further and may never widen.
|
|
263
|
+
const inheritedDenies = context.toolDenies ?? []
|
|
264
|
+
const ownDenies = options.toolScope?.deny ?? []
|
|
265
|
+
const resolvedDenies = [...new Set([...inheritedDenies, ...ownDenies])]
|
|
271
266
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
267
|
+
const childContext: AgentTaskContext = {
|
|
268
|
+
parentRunId: context.parentRunId,
|
|
269
|
+
parentAgentId: context.parentAgentId,
|
|
270
|
+
parentAbortController: context.parentAbortController,
|
|
271
|
+
depth: context.depth + 1,
|
|
272
|
+
budget: childBudget,
|
|
273
|
+
factoryOptions: context.factoryOptions,
|
|
274
|
+
tenantId: context.tenantId,
|
|
275
|
+
topicId: context.topicId,
|
|
276
|
+
sessionId: spawnRecord.childSessionId,
|
|
277
|
+
projectId: context.projectId,
|
|
278
|
+
parentActor: childParentActor,
|
|
279
|
+
...(resolvedDenies.length > 0 ? { toolDenies: resolvedDenies } : {}),
|
|
280
|
+
}
|
|
284
281
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
282
|
+
agentTask = {
|
|
283
|
+
taskId,
|
|
284
|
+
agentId: options.agentId,
|
|
285
|
+
agent,
|
|
286
|
+
childAbortController,
|
|
287
|
+
context: childContext,
|
|
288
|
+
state: 'pending',
|
|
289
|
+
pendingMessages: [],
|
|
290
|
+
createdAt: Date.now(),
|
|
291
|
+
runEventListener: listener,
|
|
292
|
+
}
|
|
295
293
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
294
|
+
childAbortController.signal.throwIfAborted()
|
|
295
|
+
this.instances.set(taskId, agentTask)
|
|
296
|
+
if (resolvedDenies.length > 0) spawnRecord.resolvedToolDenies = resolvedDenies
|
|
297
|
+
this.spawnRecords.set(taskId, spawnRecord)
|
|
298
|
+
this.emit({
|
|
299
|
+
type: 'pending',
|
|
300
300
|
taskId,
|
|
301
|
+
agentId: options.agentId,
|
|
301
302
|
parentAgentId: context.parentAgentId,
|
|
302
|
-
childAgentId: options.agentId,
|
|
303
303
|
depth: context.depth,
|
|
304
304
|
})
|
|
305
305
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
306
|
+
if (listener) {
|
|
307
|
+
await listener({
|
|
308
|
+
type: 'agent_pending',
|
|
309
|
+
runId: context.parentRunId,
|
|
310
|
+
taskId,
|
|
311
|
+
parentAgentId: context.parentAgentId,
|
|
312
|
+
childAgentId: options.agentId,
|
|
313
|
+
depth: context.depth,
|
|
314
|
+
})
|
|
315
|
+
|
|
316
|
+
const lineage: Lineage = {
|
|
317
|
+
parentSessionId: spawnRecord.parentSessionId,
|
|
318
|
+
rootSessionId: spawnRecord.rootSessionId,
|
|
319
|
+
depth: spawnRecord.childDepth,
|
|
320
|
+
}
|
|
321
|
+
await listener({
|
|
322
|
+
type: 'subsession_spawned',
|
|
323
|
+
runId: context.parentRunId,
|
|
324
|
+
subSessionId: spawnRecord.subSessionId,
|
|
325
|
+
parentSessionId: spawnRecord.parentSessionId,
|
|
326
|
+
spawnedBy: context.parentActor,
|
|
327
|
+
lineage,
|
|
328
|
+
schemaVersion: RUN_EVENT_SCHEMA_VERSION,
|
|
329
|
+
at: new Date(),
|
|
330
|
+
})
|
|
310
331
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
parentSessionId: spawnRecord.parentSessionId,
|
|
316
|
-
spawnedBy: context.parentActor,
|
|
317
|
-
lineage,
|
|
318
|
-
schemaVersion: RUN_EVENT_SCHEMA_VERSION,
|
|
319
|
-
at: new Date(),
|
|
332
|
+
this.log.info('Agent task pending', {
|
|
333
|
+
'namzu.agent.task_id': taskId,
|
|
334
|
+
'namzu.agent.definition_id': options.agentId,
|
|
335
|
+
'namzu.agent.depth': context.depth,
|
|
320
336
|
})
|
|
321
|
-
}
|
|
322
|
-
this.log.info('Agent task pending', {
|
|
323
|
-
'namzu.agent.task_id': taskId,
|
|
324
|
-
'namzu.agent.definition_id': options.agentId,
|
|
325
|
-
'namzu.agent.depth': context.depth,
|
|
326
|
-
})
|
|
327
337
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
338
|
+
const definition = this.registry.getOrThrow(options.agentId)
|
|
339
|
+
let childConfig: BaseAgentConfig
|
|
340
|
+
if (definition.configBuilder) {
|
|
341
|
+
// Call the configBuilder regardless of whether factoryOptions were
|
|
342
|
+
// supplied. BYO-provider flows (ambient cloud credentials, a custom registry)
|
|
343
|
+
// commonly omit factoryOptions because the provider resolves its own
|
|
344
|
+
// credentials; the builder still needs to run to wire provider+tools.
|
|
345
|
+
// Defaults: empty factoryOptions when omitted; configOverrides win.
|
|
346
|
+
childConfig = {
|
|
347
|
+
...(await definition.configBuilder({
|
|
348
|
+
...(context.factoryOptions ?? {}),
|
|
349
|
+
tokenBudget: allocatedTokens,
|
|
350
|
+
timeoutMs: options.budgetAllocation?.timeoutMs ?? this.config.childTimeoutMs,
|
|
351
|
+
parentRunId: context.parentRunId as string | undefined,
|
|
352
|
+
depth: context.depth + 1,
|
|
353
|
+
...options.configOverrides,
|
|
354
|
+
})),
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (!childConfig.contextLevel && definition.contextLevel) {
|
|
358
|
+
childConfig.contextLevel = definition.contextLevel
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Propagate session-hierarchy scoping onto the child config. The
|
|
362
|
+
// configBuilder may not have been updated to emit these yet; we
|
|
363
|
+
// stamp them here so query() sees them regardless.
|
|
364
|
+
childConfig.sessionId = spawnRecord?.childSessionId ?? context.sessionId
|
|
365
|
+
childConfig.topicId = context.topicId
|
|
366
|
+
childConfig.projectId = context.projectId
|
|
367
|
+
childConfig.tenantId = context.tenantId
|
|
368
|
+
// Stamp the trace parent the same way, rather than trusting every
|
|
369
|
+
// configBuilder to forward an option it may not know about.
|
|
370
|
+
if (options.configOverrides?.parentSpan) {
|
|
371
|
+
childConfig.parentSpan = options.configOverrides.parentSpan
|
|
372
|
+
}
|
|
373
|
+
// Stamped for the same reason as the trace parent above: a
|
|
374
|
+
// `configBuilder` is written by whoever registered the agent and
|
|
375
|
+
// cannot be trusted to forward something it was never told about.
|
|
376
|
+
// An explicit override still wins, so a host can hand one child a
|
|
377
|
+
// different channel — or none.
|
|
378
|
+
//
|
|
379
|
+
// Without this every delegated child fell through to
|
|
380
|
+
// `autoApproveHandler`, so a host's "ask before acting" gate
|
|
381
|
+
// covered the top-level run and nothing it delegated.
|
|
382
|
+
const inheritedHandler = options.configOverrides?.resumeHandler ?? context.resumeHandler
|
|
383
|
+
if (inheritedHandler) childConfig.resumeHandler = inheritedHandler
|
|
344
384
|
|
|
345
|
-
|
|
346
|
-
|
|
385
|
+
// And the environment, for the third time and the same reason.
|
|
386
|
+
//
|
|
387
|
+
// The bare-config branch below has always carried `env`; this one
|
|
388
|
+
// never did, so a delegate registered WITH a `configBuilder` — the
|
|
389
|
+
// normal way, and what every host in this repo does — silently ran
|
|
390
|
+
// with none of the environment its parent had been given. The
|
|
391
|
+
// builder is written by whoever registered the agent and cannot be
|
|
392
|
+
// expected to forward a field it was never told about, which is
|
|
393
|
+
// exactly why `parentSpan` and `resumeHandler` are stamped here too.
|
|
394
|
+
//
|
|
395
|
+
// Merged per key rather than replaced. `configOverrides` is a
|
|
396
|
+
// `Partial`, so assigning the whole map would drop every key the
|
|
397
|
+
// builder set and the caller did not restate — the override wins per
|
|
398
|
+
// key, the same direction it already wins for `model` and `effort`.
|
|
399
|
+
const inheritedEnv = mergeEnv(childConfig.env, options.configOverrides?.env)
|
|
400
|
+
if (inheritedEnv) childConfig.env = inheritedEnv
|
|
401
|
+
// A builder may ignore a newly-added factory option. The requested root
|
|
402
|
+
// policy is an execution boundary, so stamp an explicit child override
|
|
403
|
+
// after the builder rather than silently falling back to ephemeral.
|
|
404
|
+
if (options.configOverrides?.sandbox) {
|
|
405
|
+
childConfig.sandbox = options.configOverrides.sandbox
|
|
406
|
+
}
|
|
407
|
+
} else {
|
|
408
|
+
this.log.warn('No configBuilder, using bare config', {
|
|
409
|
+
[GENAI.AGENT_ID]: options.agentId,
|
|
410
|
+
})
|
|
411
|
+
childConfig = {
|
|
412
|
+
model: options.configOverrides?.model ?? 'default',
|
|
413
|
+
tokenBudget: allocatedTokens,
|
|
414
|
+
timeoutMs: options.budgetAllocation?.timeoutMs ?? this.config.childTimeoutMs,
|
|
415
|
+
streamIdleTimeoutMs: options.configOverrides?.streamIdleTimeoutMs,
|
|
416
|
+
maxRequestRichContentBytes: options.configOverrides?.maxRequestRichContentBytes,
|
|
417
|
+
attachmentResolveTimeoutMs: options.configOverrides?.attachmentResolveTimeoutMs,
|
|
418
|
+
temperature: options.configOverrides?.temperature,
|
|
419
|
+
parentSpan: options.configOverrides?.parentSpan,
|
|
420
|
+
maxIterations: options.configOverrides?.maxIterations,
|
|
421
|
+
maxResponseTokens: options.configOverrides?.maxResponseTokens,
|
|
422
|
+
// A delegate spawned without a configBuilder lands here, and this
|
|
423
|
+
// list is the only thing it inherits. Omitting these meant a child
|
|
424
|
+
// silently ran at the default depth and effort its parent had
|
|
425
|
+
// deliberately moved off.
|
|
426
|
+
thinking: options.configOverrides?.thinking,
|
|
427
|
+
effort: options.configOverrides?.effort,
|
|
428
|
+
env: options.configOverrides?.env,
|
|
429
|
+
sandbox: options.configOverrides?.sandbox,
|
|
430
|
+
sessionId: spawnRecord.childSessionId,
|
|
431
|
+
topicId: context.topicId,
|
|
432
|
+
projectId: context.projectId,
|
|
433
|
+
tenantId: context.tenantId,
|
|
434
|
+
parentRunId: context.parentRunId,
|
|
435
|
+
depth: context.depth + 1,
|
|
436
|
+
resumeHandler: options.configOverrides?.resumeHandler ?? context.resumeHandler,
|
|
437
|
+
}
|
|
347
438
|
}
|
|
348
439
|
|
|
349
|
-
//
|
|
350
|
-
//
|
|
351
|
-
//
|
|
352
|
-
|
|
353
|
-
childConfig.
|
|
354
|
-
childConfig.
|
|
355
|
-
childConfig.
|
|
356
|
-
//
|
|
357
|
-
//
|
|
358
|
-
|
|
359
|
-
|
|
440
|
+
// Lineage is assigned by the spawning manager, not proposed by the
|
|
441
|
+
// child definition. A fixed configBuilder can ignore its inputs and
|
|
442
|
+
// configOverrides is caller-authored; neither may turn a child back
|
|
443
|
+
// into depth zero or attach it to a different parent run.
|
|
444
|
+
childConfig.parentRunId = context.parentRunId
|
|
445
|
+
childConfig.depth = context.depth + 1
|
|
446
|
+
childConfig.budget = childBudget
|
|
447
|
+
// The reservation is the execution ceiling, regardless of a builder's
|
|
448
|
+
// defaults or configOverrides. Zero means unlimited to query(), so it
|
|
449
|
+
// must inherit the finite allocation rather than erase that ceiling.
|
|
450
|
+
if (!Number.isFinite(childConfig.tokenBudget) || childConfig.tokenBudget < 0) {
|
|
451
|
+
throw new NamzuError({
|
|
452
|
+
code: 'invalid_config',
|
|
453
|
+
message: `Invalid child token budget for "${options.agentId}": ${childConfig.tokenBudget}`,
|
|
454
|
+
})
|
|
360
455
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
456
|
+
childConfig.tokenBudget =
|
|
457
|
+
childConfig.tokenBudget === 0
|
|
458
|
+
? allocatedTokens
|
|
459
|
+
: Math.min(childConfig.tokenBudget, allocatedTokens)
|
|
460
|
+
childBudget.narrow(childConfig.tokenBudget)
|
|
461
|
+
|
|
462
|
+
// Stamped AFTER the builder, for the fourth time and the same reason:
|
|
463
|
+
// a `configBuilder` is written by whoever registered the agent and
|
|
464
|
+
// cannot forward a field it was never told about. A scope applied
|
|
465
|
+
// before it would be silently discarded by every builder that returns
|
|
466
|
+
// a fixed config — which is most of them.
|
|
467
|
+
//
|
|
468
|
+
// OUTSIDE the branch, unlike the four stamps above, and that is the
|
|
469
|
+
// point. Written inside the `configBuilder` arm it read correctly and
|
|
470
|
+
// left the bare-config arm below ignoring `toolScope` entirely — a
|
|
471
|
+
// caller that asked for a narrower child got a wider one, silently,
|
|
472
|
+
// and in the only direction that matters. Every other field here is
|
|
473
|
+
// an inheritance, where missing it costs the child something; this
|
|
474
|
+
// one is a restriction, where missing it costs the CALLER something.
|
|
366
475
|
//
|
|
367
|
-
//
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
|
|
371
|
-
|
|
476
|
+
// Narrowing only: the deny list is SUBTRACTED from whatever the child
|
|
477
|
+
// would otherwise have. `allowedTools` absent means "every registered
|
|
478
|
+
// tool", so a deny with no existing allow-list has to be resolved
|
|
479
|
+
// against the registry at the run rather than here — which `query()`
|
|
480
|
+
// does, and which is why this appends to `deniedTools` rather than
|
|
481
|
+
// synthesising an allow-list.
|
|
482
|
+
if (resolvedDenies.length > 0) {
|
|
483
|
+
childConfig.deniedTools = [
|
|
484
|
+
...new Set([...(childConfig.deniedTools ?? []), ...resolvedDenies]),
|
|
485
|
+
]
|
|
486
|
+
}
|
|
487
|
+
if (options.personaOverride) childConfig.persona = options.personaOverride
|
|
372
488
|
|
|
373
|
-
//
|
|
489
|
+
// Outside the branch, like the scope above it and for the same reason:
|
|
490
|
+
// a `configBuilder` cannot forward a field it was never told about.
|
|
374
491
|
//
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
// with none of the environment its parent had been given. The
|
|
379
|
-
// builder is written by whoever registered the agent and cannot be
|
|
380
|
-
// expected to forward a field it was never told about, which is
|
|
381
|
-
// exactly why `parentSpan` and `resumeHandler` are stamped here too.
|
|
492
|
+
// Bound to the taskId rather than to the task object, so a drain after
|
|
493
|
+
// the task is gone throws where the caller is instead of returning an
|
|
494
|
+
// empty array from a closure over a corpse.
|
|
382
495
|
//
|
|
383
|
-
//
|
|
384
|
-
// `
|
|
385
|
-
//
|
|
386
|
-
//
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
496
|
+
// This is the delivery point `pendingMessages` never had.
|
|
497
|
+
// `continueTask` and `queueMessage` pushed onto it and nothing in the
|
|
498
|
+
// kernel drained it — the manager interface's own docblock said "the
|
|
499
|
+
// runtime does not deliver it", and `continue_task` was unmounted from
|
|
500
|
+
// the coordinator tools because of that.
|
|
501
|
+
childConfig.inboundMessages = () => this.drainMessages(taskId)
|
|
502
|
+
childAbortController.signal.throwIfAborted()
|
|
503
|
+
|
|
504
|
+
await childBudget.flush()
|
|
505
|
+
childAbortController.signal.throwIfAborted()
|
|
506
|
+
this.runChild(agentTask, options, childConfig, listener).catch(async (err) => {
|
|
507
|
+
// A thrown invocation supplied no final usage receipt. Keep its
|
|
508
|
+
// reservation, including when its task handle was canceled or evicted.
|
|
509
|
+
let failure = err
|
|
510
|
+
try {
|
|
511
|
+
await childBudget.flush()
|
|
512
|
+
} catch (writeError) {
|
|
513
|
+
failure = writeError
|
|
514
|
+
}
|
|
515
|
+
this.markFailed(taskId, toErrorMessage(failure))
|
|
398
516
|
})
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
// silently ran at the default depth and effort its parent had
|
|
413
|
-
// deliberately moved off.
|
|
414
|
-
thinking: options.configOverrides?.thinking,
|
|
415
|
-
effort: options.configOverrides?.effort,
|
|
416
|
-
env: options.configOverrides?.env,
|
|
417
|
-
sandbox: options.configOverrides?.sandbox,
|
|
418
|
-
sessionId: spawnRecord.childSessionId,
|
|
419
|
-
topicId: context.topicId,
|
|
420
|
-
projectId: context.projectId,
|
|
421
|
-
tenantId: context.tenantId,
|
|
422
|
-
parentRunId: context.parentRunId,
|
|
423
|
-
depth: context.depth + 1,
|
|
424
|
-
resumeHandler: options.configOverrides?.resumeHandler ?? context.resumeHandler,
|
|
517
|
+
|
|
518
|
+
return agentTask
|
|
519
|
+
} catch (err) {
|
|
520
|
+
// No child invocation has been admitted: all reserved tokens and all
|
|
521
|
+
// provisioned resources are still ours to return. A builder/listener
|
|
522
|
+
// failure must not strand a pending task the caller never received.
|
|
523
|
+
if (agentTask) {
|
|
524
|
+
await this.rollbackUnstartedSpawn(agentTask, spawnRecord, err)
|
|
525
|
+
} else {
|
|
526
|
+
childAbortController?.abort()
|
|
527
|
+
childBudget.settle(0)
|
|
528
|
+
await childBudget.flush()
|
|
529
|
+
await this.rollbackSpawnResources(spawnRecord)
|
|
425
530
|
}
|
|
531
|
+
throw err
|
|
426
532
|
}
|
|
533
|
+
}
|
|
427
534
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
// does, and which is why this appends to `deniedTools` rather than
|
|
454
|
-
// synthesising an allow-list.
|
|
455
|
-
if (resolvedDenies.length > 0) {
|
|
456
|
-
childConfig.deniedTools = [
|
|
457
|
-
...new Set([...(childConfig.deniedTools ?? []), ...resolvedDenies]),
|
|
458
|
-
]
|
|
535
|
+
private async rollbackUnstartedSpawn(
|
|
536
|
+
agentTask: AgentTask,
|
|
537
|
+
spawnRecord: ChildSpawnRecord,
|
|
538
|
+
reason: unknown,
|
|
539
|
+
): Promise<void> {
|
|
540
|
+
agentTask.childAbortController.abort()
|
|
541
|
+
agentTask.context.budget.settle(0)
|
|
542
|
+
await agentTask.context.budget.flush()
|
|
543
|
+
if (!isTerminalAgentTaskState(agentTask.state)) {
|
|
544
|
+
agentTask.state = 'failed'
|
|
545
|
+
const error = toErrorMessage(reason)
|
|
546
|
+
this.emit({ type: 'failed', taskId: agentTask.taskId, error })
|
|
547
|
+
try {
|
|
548
|
+
await agentTask.runEventListener?.({
|
|
549
|
+
type: 'agent_failed',
|
|
550
|
+
runId: agentTask.context.parentRunId,
|
|
551
|
+
taskId: agentTask.taskId,
|
|
552
|
+
error,
|
|
553
|
+
})
|
|
554
|
+
} catch (err) {
|
|
555
|
+
this.log.warn('Unstarted child failure notification failed', {
|
|
556
|
+
'namzu.task.id': agentTask.taskId,
|
|
557
|
+
'exception.message': toErrorMessage(err),
|
|
558
|
+
})
|
|
559
|
+
}
|
|
459
560
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
// the task is gone throws where the caller is instead of returning an
|
|
467
|
-
// empty array from a closure over a corpse.
|
|
468
|
-
//
|
|
469
|
-
// This is the delivery point `pendingMessages` never had.
|
|
470
|
-
// `continueTask` and `queueMessage` pushed onto it and nothing in the
|
|
471
|
-
// kernel drained it — the manager interface's own docblock said "the
|
|
472
|
-
// runtime does not deliver it", and `continue_task` was unmounted from
|
|
473
|
-
// the coordinator tools because of that.
|
|
474
|
-
childConfig.inboundMessages = () => this.drainMessages(taskId)
|
|
475
|
-
|
|
476
|
-
this.runChild(agentTask, options, childConfig, listener).catch((err) => {
|
|
477
|
-
this.markFailed(taskId, toErrorMessage(err))
|
|
478
|
-
})
|
|
561
|
+
this.clearEvictionTimer(agentTask.taskId)
|
|
562
|
+
this.instances.delete(agentTask.taskId)
|
|
563
|
+
this.spawnRecords.delete(agentTask.taskId)
|
|
564
|
+
this.resolveCompletionCallbacks(agentTask.taskId)
|
|
565
|
+
await this.rollbackSpawnResources(spawnRecord)
|
|
566
|
+
}
|
|
479
567
|
|
|
480
|
-
|
|
568
|
+
private async rollbackSpawnResources(spawnRecord: ChildSpawnRecord): Promise<void> {
|
|
569
|
+
await this.disposeChildWorkspace(spawnRecord)
|
|
570
|
+
try {
|
|
571
|
+
// The edge must be removed before its child: stores reject deletion
|
|
572
|
+
// of a session that still has a subsession reference.
|
|
573
|
+
await this.deps.sessionStore.deleteSubSession(spawnRecord.subSessionId, spawnRecord.tenantId)
|
|
574
|
+
await this.deps.sessionStore.deleteSession(spawnRecord.childSessionId, spawnRecord.tenantId)
|
|
575
|
+
} catch (err) {
|
|
576
|
+
this.log.warn('Unstarted child rollback failed', {
|
|
577
|
+
'namzu.sub_session.id': spawnRecord.subSessionId,
|
|
578
|
+
'exception.message': toErrorMessage(err),
|
|
579
|
+
})
|
|
580
|
+
}
|
|
481
581
|
}
|
|
482
582
|
|
|
483
583
|
cancel(taskId: TaskId, cause?: CancelCause): void {
|
|
@@ -625,7 +725,7 @@ export class AgentManager {
|
|
|
625
725
|
private async provisionSpawn(
|
|
626
726
|
options: SendMessageOptions,
|
|
627
727
|
context: AgentTaskContext,
|
|
628
|
-
): Promise<
|
|
728
|
+
): Promise<ChildSpawnRecord> {
|
|
629
729
|
const key = options.parentSessionId
|
|
630
730
|
const queued = (this.spawnLocks.get(key) ?? Promise.resolve()).then(
|
|
631
731
|
() => this.provisionSpawnUnlocked(options, context),
|
|
@@ -651,42 +751,7 @@ export class AgentManager {
|
|
|
651
751
|
private async provisionSpawnUnlocked(
|
|
652
752
|
options: SendMessageOptions,
|
|
653
753
|
context: AgentTaskContext,
|
|
654
|
-
): Promise<
|
|
655
|
-
// Read the parent's remaining budget HERE, inside the lock, so that
|
|
656
|
-
// concurrent siblings queue behind one another rather than all reading
|
|
657
|
-
// the same untouched number. The debit at the end of this method closes
|
|
658
|
-
// the pair: read and write are now on the same side of every await.
|
|
659
|
-
const maxAllocation = Math.floor(
|
|
660
|
-
context.budgetTracker.remaining * this.config.maxBudgetFraction,
|
|
661
|
-
)
|
|
662
|
-
const allocatedTokens = Math.min(
|
|
663
|
-
options.budgetAllocation?.tokenBudget ?? maxAllocation,
|
|
664
|
-
maxAllocation,
|
|
665
|
-
)
|
|
666
|
-
|
|
667
|
-
// Budget exhaustion must not INVERT into no budget at all. Downstream,
|
|
668
|
-
// `tokenBudget: 0` means "uncapped" (`LimitChecker`: `tokenBudget > 0
|
|
669
|
-
// && total >= tokenBudget`), and `maxAllocation` floors to 0 as soon as
|
|
670
|
-
// the parent's remaining drops below `1 / maxBudgetFraction`. So the
|
|
671
|
-
// most depleted parent in the tree was the one that spawned an
|
|
672
|
-
// unlimited child. Refuse instead: a caller that wants an uncapped
|
|
673
|
-
// child can say so explicitly with its own `budgetAllocation`.
|
|
674
|
-
//
|
|
675
|
-
// Refusing before any provisioning work also preserves the property the
|
|
676
|
-
// debit's placement was chosen for: a spawn this call rejects makes no
|
|
677
|
-
// state change at all, and burns no allocation.
|
|
678
|
-
if (allocatedTokens <= 0) {
|
|
679
|
-
throw new NamzuError({
|
|
680
|
-
code: 'invalid_config',
|
|
681
|
-
message: `Cannot spawn "${options.agentId}": the parent has ${context.budgetTracker.remaining} tokens remaining, which allocates 0 to the child — and a token budget of 0 means UNLIMITED downstream.`,
|
|
682
|
-
details: {
|
|
683
|
-
agentId: options.agentId,
|
|
684
|
-
parentRemaining: context.budgetTracker.remaining,
|
|
685
|
-
maxBudgetFraction: this.config.maxBudgetFraction,
|
|
686
|
-
},
|
|
687
|
-
})
|
|
688
|
-
}
|
|
689
|
-
|
|
754
|
+
): Promise<ChildSpawnRecord> {
|
|
690
755
|
// Phase 9: deps are unconditional required. Every spawn produces a
|
|
691
756
|
// SubSession + Session + WorkspaceRef triple (Convention #0: no
|
|
692
757
|
// partial/legacy path).
|
|
@@ -831,6 +896,12 @@ export class AgentManager {
|
|
|
831
896
|
await store.updateSubSession(subSession, context.tenantId)
|
|
832
897
|
}
|
|
833
898
|
} catch (err) {
|
|
899
|
+
if (workspaceRef && subSession) {
|
|
900
|
+
await this.disposeChildWorkspace({
|
|
901
|
+
workspaceRef,
|
|
902
|
+
subSessionId: subSession.id,
|
|
903
|
+
})
|
|
904
|
+
}
|
|
834
905
|
// Compensating rollback order is mandated by the store's
|
|
835
906
|
// deny-by-default cascade policy (Convention #5): `deleteSession`
|
|
836
907
|
// throws when any subsession still references it, so the subsession
|
|
@@ -848,24 +919,14 @@ export class AgentManager {
|
|
|
848
919
|
throw err
|
|
849
920
|
}
|
|
850
921
|
|
|
851
|
-
// Debited only now, with the provisioning committed. Every path that
|
|
852
|
-
// could still have thrown is behind us, so a rejected spawn leaves the
|
|
853
|
-
// parent's budget untouched — the property the debit's original
|
|
854
|
-
// placement was chosen for, kept while closing the race that placement
|
|
855
|
-
// opened.
|
|
856
|
-
context.budgetTracker.remaining -= allocatedTokens
|
|
857
|
-
|
|
858
922
|
return {
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
workspaceRef,
|
|
867
|
-
},
|
|
868
|
-
allocatedTokens,
|
|
923
|
+
subSessionId: subSession.id,
|
|
924
|
+
childSessionId: childSession.id,
|
|
925
|
+
tenantId: context.tenantId,
|
|
926
|
+
parentSessionId: options.parentSessionId,
|
|
927
|
+
rootSessionId,
|
|
928
|
+
childDepth,
|
|
929
|
+
workspaceRef,
|
|
869
930
|
}
|
|
870
931
|
}
|
|
871
932
|
|
|
@@ -887,6 +948,9 @@ export class AgentManager {
|
|
|
887
948
|
const childListener = this.wrapChildListener(listener, spawnRecord)
|
|
888
949
|
|
|
889
950
|
const result = await agentTask.agent.run(input, childConfig, childListener)
|
|
951
|
+
agentTask.context.budget.bindRun(result.runId)
|
|
952
|
+
agentTask.context.budget.settle(result.usage?.totalTokens)
|
|
953
|
+
await agentTask.context.budget.flush()
|
|
890
954
|
await this.finalizeChild(agentTask, result)
|
|
891
955
|
}
|
|
892
956
|
|
|
@@ -1019,44 +1083,10 @@ export class AgentManager {
|
|
|
1019
1083
|
this.markCompleted(agentTask.taskId, result)
|
|
1020
1084
|
}
|
|
1021
1085
|
|
|
1022
|
-
/**
|
|
1023
|
-
* Return the unspent part of a settled child's reservation.
|
|
1024
|
-
*
|
|
1025
|
-
* The debit at spawn reserves headroom so siblings cannot each be
|
|
1026
|
-
* promised the same tokens. Nothing returned it, so a pool shrank by
|
|
1027
|
-
* the full allocation on every spawn no matter what the child used: at
|
|
1028
|
-
* a half-pool fraction, ten delegations left a parent with a
|
|
1029
|
-
* thousandth of its budget and the next spawn was refused for a budget
|
|
1030
|
-
* that had barely been spent.
|
|
1031
|
-
*
|
|
1032
|
-
* Idempotent — the reservation is cleared as it is returned, so a
|
|
1033
|
-
* second terminal transition for the same task cannot credit twice.
|
|
1034
|
-
* Spend above the reservation returns nothing rather than going
|
|
1035
|
-
* negative; the child was capped at its allocation, so that case means
|
|
1036
|
-
* the accounting was already wrong and inventing headroom would hide
|
|
1037
|
-
* it.
|
|
1038
|
-
*/
|
|
1039
|
-
private releaseBudget(agentTask: AgentTask, spent: number): void {
|
|
1040
|
-
const reserved = agentTask.budgetReservation
|
|
1041
|
-
if (reserved === undefined) return
|
|
1042
|
-
agentTask.budgetReservation = undefined
|
|
1043
|
-
|
|
1044
|
-
const unused = Math.max(0, reserved - Math.max(0, spent))
|
|
1045
|
-
if (unused === 0) return
|
|
1046
|
-
agentTask.context.budgetTracker.remaining += unused
|
|
1047
|
-
this.log.debug('Returned unspent child budget', {
|
|
1048
|
-
'namzu.task.id': agentTask.taskId,
|
|
1049
|
-
'namzu.manager.reserved': reserved,
|
|
1050
|
-
'namzu.manager.spent': spent,
|
|
1051
|
-
'namzu.manager.returned': unused,
|
|
1052
|
-
})
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
1086
|
private markCompleted(taskId: TaskId, result: BaseAgentResult): void {
|
|
1056
1087
|
const agentTask = this.instances.get(taskId)
|
|
1057
1088
|
if (!agentTask || isTerminalAgentTaskState(agentTask.state)) return
|
|
1058
1089
|
|
|
1059
|
-
this.releaseBudget(agentTask, result.usage?.totalTokens ?? 0)
|
|
1060
1090
|
agentTask.result = result
|
|
1061
1091
|
agentTask.completedAt = Date.now()
|
|
1062
1092
|
this.updateState(taskId, 'completed')
|
|
@@ -1076,16 +1106,12 @@ export class AgentManager {
|
|
|
1076
1106
|
const agentTask = this.instances.get(taskId)
|
|
1077
1107
|
if (!agentTask || isTerminalAgentTaskState(agentTask.state)) return
|
|
1078
1108
|
|
|
1079
|
-
// A child that failed still spent whatever it spent, and holding the
|
|
1080
|
-
// rest of its reservation would punish the parent twice for one
|
|
1081
|
-
// failure.
|
|
1082
|
-
this.releaseBudget(agentTask, agentTask.result?.usage?.totalTokens ?? 0)
|
|
1083
|
-
|
|
1084
1109
|
agentTask.result = {
|
|
1085
|
-
runId: agentTask.context.parentRunId,
|
|
1110
|
+
runId: agentTask.context.budget.runId ?? agentTask.context.parentRunId,
|
|
1086
1111
|
status: 'failed',
|
|
1087
|
-
usage:
|
|
1088
|
-
|
|
1112
|
+
usage: agentTask.context.budget.ownUsage,
|
|
1113
|
+
budget: agentTask.context.budget.summary(),
|
|
1114
|
+
cost: { ...ZERO_COST, unpricedTokens: agentTask.context.budget.ownTokens },
|
|
1089
1115
|
iterations: 0,
|
|
1090
1116
|
durationMs: Date.now() - agentTask.createdAt,
|
|
1091
1117
|
messages: [],
|
|
@@ -1149,7 +1175,9 @@ export class AgentManager {
|
|
|
1149
1175
|
* The failure is logged instead, because a worktree that could not be
|
|
1150
1176
|
* removed is an operator's problem and silence is how it stays one.
|
|
1151
1177
|
*/
|
|
1152
|
-
private async disposeChildWorkspace(
|
|
1178
|
+
private async disposeChildWorkspace(
|
|
1179
|
+
spawnRecord: Pick<ChildSpawnRecord, 'workspaceRef' | 'subSessionId'>,
|
|
1180
|
+
): Promise<void> {
|
|
1153
1181
|
if (!spawnRecord.workspaceRef) return
|
|
1154
1182
|
const backend = spawnRecord.workspaceRef.meta.backend
|
|
1155
1183
|
if (!this.deps.workspaceRegistry.has(backend)) return
|