@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,17 +1,24 @@
|
|
|
1
1
|
import { resolveContextWindow } from '../../../../compaction/context-window.js'
|
|
2
2
|
import { findDanglingMessages } from '../../../../compaction/dangling.js'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
type CompactionPlan,
|
|
5
|
+
DEFAULT_SOFT_TARGET,
|
|
6
|
+
planCompaction,
|
|
7
|
+
planSalienceWorkingSet,
|
|
8
|
+
} from '../../../../compaction/plan.js'
|
|
4
9
|
import type { ContextReducer, ContextReduction } from '../../../../compaction/reducer.js'
|
|
5
10
|
import { createSlidingWindowReducer } from '../../../../compaction/reducer.js'
|
|
6
11
|
import { findRetainedIndices } from '../../../../compaction/retention.js'
|
|
7
12
|
import { serializeState } from '../../../../compaction/serializer.js'
|
|
8
13
|
import { buildCompactionMessage, isCompactionMessage } from '../../../../compaction/summary.js'
|
|
14
|
+
import { estimateMessagesTokens } from '../../../../compaction/token-estimate.js'
|
|
9
15
|
import { buildVerifiedSummaryWithBoundedProvider } from '../../../../compaction/verifier.js'
|
|
10
16
|
import { CHARS_PER_TOKEN } from '../../../../constants/limits.js'
|
|
11
17
|
import { NAMZU } from '../../../../constants/telemetry/index.js'
|
|
12
18
|
import { invariants } from '../../../../invariants/index.js'
|
|
13
19
|
import { resolveTaskModel } from '../../../../model-router/task-router.js'
|
|
14
20
|
import type { Message } from '../../../../types/message/index.js'
|
|
21
|
+
import { applyLifecycleHookResults } from '../../plugin-hooks.js'
|
|
15
22
|
import type { IterationContext } from './context.js'
|
|
16
23
|
import { isWorkingMemoryMessage } from './working-memory.js'
|
|
17
24
|
|
|
@@ -31,16 +38,11 @@ export { isCompactionMessage } from '../../../../compaction/summary.js'
|
|
|
31
38
|
* fraction of itself.
|
|
32
39
|
*/
|
|
33
40
|
const MIN_RELIEF_FRACTION = 0.02
|
|
34
|
-
const
|
|
41
|
+
const MIN_RELIEF_TOKENS = 500
|
|
35
42
|
|
|
36
43
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* An image block is measured by its base64 payload because that is what
|
|
40
|
-
* actually occupies the request. It is NOT what the model is billed for —
|
|
41
|
-
* an image costs far fewer tokens than its base64 length divided by four —
|
|
42
|
-
* but under-counting it to zero is the worse error: it let a run full of
|
|
43
|
-
* screenshots read as an empty context.
|
|
44
|
+
* Serialized content size, only for byte-volume telemetry. This is never
|
|
45
|
+
* converted to prompt tokens: compressed image bytes are not model text.
|
|
44
46
|
*/
|
|
45
47
|
function measureContentChars(content: unknown): number {
|
|
46
48
|
if (typeof content === 'string') return content.length
|
|
@@ -53,23 +55,6 @@ function measureContentChars(content: unknown): number {
|
|
|
53
55
|
return total
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
function estimateMessageTokens(messages: readonly Message[]): number {
|
|
57
|
-
let chars = 0
|
|
58
|
-
for (const msg of messages) {
|
|
59
|
-
// `content` is `string | ToolResultBlock[]`. On an array, `.length` is
|
|
60
|
-
// the BLOCK COUNT, so a tool result carrying a 400 KB screenshot
|
|
61
|
-
// contributed 1 — and the estimate that decides when to compact read
|
|
62
|
-
// near zero for exactly the runs that need compacting most.
|
|
63
|
-
chars += measureContentChars(msg.content)
|
|
64
|
-
if (msg.role === 'assistant' && msg.toolCalls) {
|
|
65
|
-
for (const tc of msg.toolCalls) {
|
|
66
|
-
chars += tc.function.name.length + tc.function.arguments.length
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return Math.ceil(chars / CHARS_PER_TOKEN)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
58
|
/**
|
|
74
59
|
* Tokens the tool catalogue occupies in every request.
|
|
75
60
|
*
|
|
@@ -94,7 +79,7 @@ function estimateToolCatalogTokens(ctx: IterationContext): number {
|
|
|
94
79
|
}
|
|
95
80
|
|
|
96
81
|
function estimateTokens(ctx: IterationContext): number {
|
|
97
|
-
return
|
|
82
|
+
return estimateMessagesTokens(ctx.runMgr.messages) + estimateToolCatalogTokens(ctx)
|
|
98
83
|
}
|
|
99
84
|
|
|
100
85
|
type ToolResultClearPlan = Extract<CompactionPlan, { kind: 'cleared' }>
|
|
@@ -124,6 +109,7 @@ async function emitContextUsageSnapshot(
|
|
|
124
109
|
type: 'token_usage_updated',
|
|
125
110
|
runId: ctx.runMgr.id,
|
|
126
111
|
usage: { ...ctx.runMgr.tokenUsage },
|
|
112
|
+
budget: ctx.runMgr.budget?.summary(),
|
|
127
113
|
cost: { ...ctx.runMgr.costInfo },
|
|
128
114
|
contextTokens,
|
|
129
115
|
contextMeasuredBy: 'estimate',
|
|
@@ -148,6 +134,7 @@ async function emitToolResultClear(
|
|
|
148
134
|
runId: ctx.runMgr.id,
|
|
149
135
|
iteration: ctx.runMgr.currentIteration,
|
|
150
136
|
clearedCount: plan.clearedCount,
|
|
137
|
+
...(plan.stubbedCount !== undefined ? { stubbedCount: plan.stubbedCount } : {}),
|
|
151
138
|
charsReclaimed: plan.charsReclaimed,
|
|
152
139
|
reclaimedTokens: plan.reclaimedTokens,
|
|
153
140
|
reliefWasEnough: plan.reliefWasEnough,
|
|
@@ -207,7 +194,7 @@ export function measureContext(ctx: IterationContext): {
|
|
|
207
194
|
if (reported !== undefined && reported > 0) {
|
|
208
195
|
const measuredThrough = ctx.runMgr.lastPromptMessageCount ?? ctx.runMgr.messages.length
|
|
209
196
|
const appended = ctx.runMgr.messages.slice(measuredThrough)
|
|
210
|
-
return { tokens: reported +
|
|
197
|
+
return { tokens: reported + estimateMessagesTokens(appended), source: 'provider' }
|
|
211
198
|
}
|
|
212
199
|
return { tokens: estimateTokens(ctx), source: 'estimate' }
|
|
213
200
|
}
|
|
@@ -233,22 +220,25 @@ export function measureContext(ctx: IterationContext): {
|
|
|
233
220
|
export async function relieveOverflow(ctx: IterationContext): Promise<boolean> {
|
|
234
221
|
const before = ctx.runMgr.messages.length
|
|
235
222
|
const beforeChars = totalChars(ctx.runMgr.messages)
|
|
223
|
+
const beforeTokens = estimateMessagesTokens(ctx.runMgr.messages)
|
|
236
224
|
|
|
237
225
|
await runCompactionCheck(ctx, { force: true })
|
|
238
226
|
|
|
239
227
|
const shed = beforeChars - totalChars(ctx.runMgr.messages)
|
|
228
|
+
const tokensShed = beforeTokens - estimateMessagesTokens(ctx.runMgr.messages)
|
|
240
229
|
// A shed has to be big enough to plausibly change the provider's verdict.
|
|
241
230
|
// Any positive number used to count, so clearing a single short tool
|
|
242
231
|
// result reported success, the turn was retried against a prompt that was
|
|
243
232
|
// still over the window, and the retry burned a call to learn nothing.
|
|
244
233
|
// The floor is a fraction of what was there rather than a constant: what
|
|
245
234
|
// counts as meaningful scales with the prompt.
|
|
246
|
-
const meaningful = Math.max(
|
|
247
|
-
if (
|
|
235
|
+
const meaningful = Math.max(MIN_RELIEF_TOKENS, beforeTokens * MIN_RELIEF_FRACTION)
|
|
236
|
+
if (tokensShed < meaningful) {
|
|
248
237
|
ctx.log.warn('Context overflow with too little left to shed — the prompt is irreducible', {
|
|
249
238
|
[NAMZU.RUN_ID]: ctx.runMgr.id,
|
|
250
239
|
'namzu.runtime.messages': before,
|
|
251
240
|
'namzu.runtime.chars_shed': shed,
|
|
241
|
+
'namzu.runtime.tokens_shed': tokensShed,
|
|
252
242
|
'namzu.runtime.needed_at_least': Math.ceil(meaningful),
|
|
253
243
|
})
|
|
254
244
|
return false
|
|
@@ -259,6 +249,7 @@ export async function relieveOverflow(ctx: IterationContext): Promise<boolean> {
|
|
|
259
249
|
'namzu.runtime.messages_before': before,
|
|
260
250
|
'namzu.runtime.messages_after': ctx.runMgr.messages.length,
|
|
261
251
|
'namzu.runtime.chars_shed': shed,
|
|
252
|
+
'namzu.runtime.tokens_shed': tokensShed,
|
|
262
253
|
})
|
|
263
254
|
return true
|
|
264
255
|
}
|
|
@@ -490,9 +481,57 @@ async function recordShed(
|
|
|
490
481
|
})
|
|
491
482
|
}
|
|
492
483
|
|
|
484
|
+
/**
|
|
485
|
+
* A pass, once the check decided to run one, is bracketed by the
|
|
486
|
+
* `pre_compact` and `post_compact` hooks. Observational: a hook sees the
|
|
487
|
+
* numbers and cannot stop the pass, because a context the provider will
|
|
488
|
+
* reject is not a thing a hook may insist on.
|
|
489
|
+
*/
|
|
490
|
+
interface CompactionPass {
|
|
491
|
+
attempted: boolean
|
|
492
|
+
reason: 'threshold' | 'overflow'
|
|
493
|
+
tokensBefore: number
|
|
494
|
+
contextWindowTokens: number
|
|
495
|
+
}
|
|
496
|
+
|
|
493
497
|
export async function runCompactionCheck(
|
|
494
498
|
ctx: IterationContext,
|
|
495
499
|
options?: { force?: boolean },
|
|
500
|
+
): Promise<void> {
|
|
501
|
+
const pass: CompactionPass = {
|
|
502
|
+
attempted: false,
|
|
503
|
+
reason: options?.force ? 'overflow' : 'threshold',
|
|
504
|
+
tokensBefore: 0,
|
|
505
|
+
contextWindowTokens: 0,
|
|
506
|
+
}
|
|
507
|
+
try {
|
|
508
|
+
await runCompactionCheckInner(ctx, pass, options)
|
|
509
|
+
} finally {
|
|
510
|
+
if (pass.attempted && ctx.pluginManager) {
|
|
511
|
+
const results = await ctx.pluginManager.executeHooks(
|
|
512
|
+
'post_compact',
|
|
513
|
+
{
|
|
514
|
+
runId: ctx.runMgr.id,
|
|
515
|
+
iteration: ctx.runMgr.currentIteration,
|
|
516
|
+
compaction: {
|
|
517
|
+
reason: pass.reason,
|
|
518
|
+
tokensBefore: pass.tokensBefore,
|
|
519
|
+
tokensAfter: estimateTokens(ctx),
|
|
520
|
+
contextWindowTokens: pass.contextWindowTokens,
|
|
521
|
+
},
|
|
522
|
+
signal: ctx.abortController.signal,
|
|
523
|
+
},
|
|
524
|
+
ctx.emitEvent,
|
|
525
|
+
)
|
|
526
|
+
applyLifecycleHookResults('post_compact', results)
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
async function runCompactionCheckInner(
|
|
532
|
+
ctx: IterationContext,
|
|
533
|
+
pass: CompactionPass,
|
|
534
|
+
options?: { force?: boolean },
|
|
496
535
|
): Promise<void> {
|
|
497
536
|
const config = ctx.compactionConfig
|
|
498
537
|
if (!config) return
|
|
@@ -519,7 +558,34 @@ export async function runCompactionCheck(
|
|
|
519
558
|
|
|
520
559
|
// A forced pass skips the threshold: it runs because the provider
|
|
521
560
|
// rejected the prompt, which is stronger evidence than any estimate.
|
|
522
|
-
|
|
561
|
+
// The salience strategy starts holding the context at `softTarget`,
|
|
562
|
+
// well before the summary trigger; every other strategy waits for it.
|
|
563
|
+
const salience = config.strategy === 'salience'
|
|
564
|
+
const startAt = salience
|
|
565
|
+
? Math.min(config.softTarget ?? DEFAULT_SOFT_TARGET, config.triggerThreshold)
|
|
566
|
+
: config.triggerThreshold
|
|
567
|
+
if (!options?.force && usage < startAt) return
|
|
568
|
+
|
|
569
|
+
pass.attempted = true
|
|
570
|
+
pass.tokensBefore = estimatedTokens
|
|
571
|
+
pass.contextWindowTokens = budget
|
|
572
|
+
if (ctx.pluginManager) {
|
|
573
|
+
const results = await ctx.pluginManager.executeHooks(
|
|
574
|
+
'pre_compact',
|
|
575
|
+
{
|
|
576
|
+
runId: ctx.runMgr.id,
|
|
577
|
+
iteration: ctx.runMgr.currentIteration,
|
|
578
|
+
compaction: {
|
|
579
|
+
reason: pass.reason,
|
|
580
|
+
tokensBefore: estimatedTokens,
|
|
581
|
+
contextWindowTokens: budget,
|
|
582
|
+
},
|
|
583
|
+
signal: ctx.abortController.signal,
|
|
584
|
+
},
|
|
585
|
+
ctx.emitEvent,
|
|
586
|
+
)
|
|
587
|
+
applyLifecycleHookResults('pre_compact', results)
|
|
588
|
+
}
|
|
523
589
|
|
|
524
590
|
// A reducer, when the run has one, OWNS reduction — the structured pass
|
|
525
591
|
// below does not also run. `strategy: 'sliding-window'` resolves to the
|
|
@@ -571,6 +637,39 @@ export async function runCompactionCheck(
|
|
|
571
637
|
// The decision is `planCompaction`'s; installing it is this file's. The
|
|
572
638
|
// planner touches no `ctx` at all, which is what lets the boundary
|
|
573
639
|
// arithmetic be tested without a run.
|
|
640
|
+
if (salience) {
|
|
641
|
+
let openTasks: string[] | undefined
|
|
642
|
+
if (ctx.taskStore) {
|
|
643
|
+
try {
|
|
644
|
+
const tasks = await ctx.taskStore.list({ runId: ctx.runMgr.id })
|
|
645
|
+
openTasks = tasks
|
|
646
|
+
.filter((t) => t.status !== 'completed')
|
|
647
|
+
.map((t) => t.description)
|
|
648
|
+
.filter((d): d is string => typeof d === 'string' && d.length > 0)
|
|
649
|
+
} catch {
|
|
650
|
+
// The goal is measured without the plan items; a task store
|
|
651
|
+
// that cannot answer must not stop the pass.
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
const working = planSalienceWorkingSet({
|
|
655
|
+
messages: ctx.runMgr.messages,
|
|
656
|
+
config,
|
|
657
|
+
contextWindowTokens: budget,
|
|
658
|
+
estimatedTokens,
|
|
659
|
+
...(openTasks ? { openTasks } : {}),
|
|
660
|
+
})
|
|
661
|
+
if (working.reclaimedTokens > 0) {
|
|
662
|
+
await commitToolResultClear(ctx, working, budget, window.source)
|
|
663
|
+
}
|
|
664
|
+
// Under the trigger, the working set was the whole pass: the summary
|
|
665
|
+
// path is for the trigger, not for the soft target.
|
|
666
|
+
if (
|
|
667
|
+
!options?.force &&
|
|
668
|
+
(estimatedTokens - working.reclaimedTokens) / budget < config.triggerThreshold
|
|
669
|
+
) {
|
|
670
|
+
return
|
|
671
|
+
}
|
|
672
|
+
}
|
|
574
673
|
const clearPlan = planCompaction({
|
|
575
674
|
messages: ctx.runMgr.messages,
|
|
576
675
|
config,
|
|
@@ -131,6 +131,8 @@ export interface IterationContext {
|
|
|
131
131
|
* drained and no tool result is extended.
|
|
132
132
|
*/
|
|
133
133
|
readonly steering?: SteeringChannel
|
|
134
|
+
/** Exit notices for the run's background jobs, drained into the next tool result. */
|
|
135
|
+
readonly jobNotices?: SteeringChannel
|
|
134
136
|
readonly checkpointMgr: CheckpointManager
|
|
135
137
|
readonly planManager: PlanManager
|
|
136
138
|
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
replaceProjectInstructionSnapshot,
|
|
9
9
|
} from '../../project-instructions.js'
|
|
10
10
|
import { attachRepeatNotice } from '../../repeat-call.js'
|
|
11
|
-
import { attachSteering } from '../../steering.js'
|
|
11
|
+
import { attachNotice, attachSteering, formatJobNote } from '../../steering.js'
|
|
12
12
|
import { type IterationContext, awaitDecisionDurably } from './context.js'
|
|
13
13
|
|
|
14
14
|
interface VerificationAwareContext extends IterationContext {
|
|
@@ -97,18 +97,47 @@ export async function* runToolReview(
|
|
|
97
97
|
}
|
|
98
98
|
let toolCallSummaries = summariesFor(preparedBatch)
|
|
99
99
|
|
|
100
|
+
/**
|
|
101
|
+
* A call that has failed identically too many times in a row is answered
|
|
102
|
+
* with the tracker's refusal instead of being run — the one denial the
|
|
103
|
+
* tracker makes, on top of whatever the caller already denied.
|
|
104
|
+
*/
|
|
105
|
+
const withRepeatRefusals = (denials?: ToolCallDenials): ToolCallDenials | undefined => {
|
|
106
|
+
const tracker = ctx.repeatCalls
|
|
107
|
+
if (!tracker) return denials
|
|
108
|
+
let merged: Map<string, string> | undefined
|
|
109
|
+
for (const summary of toolCallSummaries) {
|
|
110
|
+
if (denials?.has(summary.id)) continue
|
|
111
|
+
const refusal = tracker.refusal(summary.name, summary.input)
|
|
112
|
+
if (!refusal) continue
|
|
113
|
+
merged ??= new Map(denials ?? [])
|
|
114
|
+
merged.set(summary.id, refusal)
|
|
115
|
+
}
|
|
116
|
+
return merged ?? denials
|
|
117
|
+
}
|
|
118
|
+
|
|
100
119
|
/** Executes the batch, answering every call, and appends the results. */
|
|
101
120
|
const settle = async (denials?: ToolCallDenials): Promise<void> => {
|
|
102
121
|
const startedAt = Date.now()
|
|
103
|
-
const batch = await ctx.toolExecutor.executeBatch(
|
|
122
|
+
const batch = await ctx.toolExecutor.executeBatch(
|
|
123
|
+
response,
|
|
124
|
+
withRepeatRefusals(denials),
|
|
125
|
+
undefined,
|
|
126
|
+
preparedBatch,
|
|
127
|
+
)
|
|
104
128
|
toolMs += Date.now() - startedAt
|
|
105
129
|
executed = batch.results
|
|
106
|
-
// Recorded AFTER execution
|
|
107
|
-
//
|
|
108
|
-
//
|
|
130
|
+
// Recorded AFTER execution, with the real result: the notice advises
|
|
131
|
+
// on the call that already ran, and the failure count is what the
|
|
132
|
+
// refusal above reads on the NEXT identical call.
|
|
109
133
|
const notices = []
|
|
110
134
|
for (const summary of toolCallSummaries) {
|
|
111
|
-
const
|
|
135
|
+
const outcome = batch.results.find((result) => result.toolCallId === summary.id)
|
|
136
|
+
const notice = ctx.repeatCalls?.record(
|
|
137
|
+
summary.name,
|
|
138
|
+
summary.input,
|
|
139
|
+
outcome ? { failed: outcome.isError === true } : undefined,
|
|
140
|
+
)
|
|
112
141
|
if (notice) notices.push(notice)
|
|
113
142
|
}
|
|
114
143
|
// Guidance the host queued while this batch was running rides out on
|
|
@@ -116,7 +145,10 @@ export async function* runToolReview(
|
|
|
116
145
|
// block must be answered by a `tool_result` with the same id, so a
|
|
117
146
|
// user message wedged between them is rejected by the provider. Same
|
|
118
147
|
// delivery a denial already uses, without the refusal.
|
|
119
|
-
for (const msg of attachRepeatNotice(
|
|
148
|
+
for (const msg of attachRepeatNotice(
|
|
149
|
+
attachNotice(attachSteering(batch.messages, ctx.steering), ctx.jobNotices, formatJobNote),
|
|
150
|
+
notices,
|
|
151
|
+
)) {
|
|
120
152
|
ctx.runMgr.pushMessage(msg)
|
|
121
153
|
}
|
|
122
154
|
// The complete tool-result batch is already in history before host policy
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { renderPins } from '../../../../compaction/serializer.js'
|
|
1
2
|
import { NAMZU } from '../../../../constants/telemetry/index.js'
|
|
2
3
|
import { createSystemMessage } from '../../../../types/message/index.js'
|
|
3
4
|
import type { IterationContext } from './context.js'
|
|
@@ -37,22 +38,30 @@ export function isWorkingMemoryMessage(content: string | null | undefined): bool
|
|
|
37
38
|
*/
|
|
38
39
|
export async function refreshWorkingMemory(ctx: IterationContext): Promise<void> {
|
|
39
40
|
const provider = ctx.workingMemoryProvider
|
|
40
|
-
|
|
41
|
+
// What the tools pinned joins the slot beside what the host provides: a
|
|
42
|
+
// pin exists to be in front of the model every iteration, and until this
|
|
43
|
+
// the working state reached the history only through a compaction
|
|
44
|
+
// summary. No provider and no pins leaves the history untouched.
|
|
45
|
+
const pinned = ctx.workingStateManager ? renderPins(ctx.workingStateManager.getState()) : null
|
|
46
|
+
if (!provider && !pinned) return
|
|
41
47
|
|
|
42
|
-
let block
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
let block = ''
|
|
49
|
+
if (provider) {
|
|
50
|
+
try {
|
|
51
|
+
block =
|
|
52
|
+
(await provider({
|
|
53
|
+
runId: ctx.runMgr.id,
|
|
54
|
+
iteration: ctx.runMgr.currentIteration,
|
|
55
|
+
})) ?? ''
|
|
56
|
+
} catch (err) {
|
|
57
|
+
ctx.log.warn('workingMemoryProvider failed; keeping prior slot', {
|
|
58
|
+
[NAMZU.RUN_ID]: ctx.runMgr.id,
|
|
59
|
+
'exception.message': err instanceof Error ? err.message : String(err),
|
|
60
|
+
})
|
|
61
|
+
return
|
|
62
|
+
}
|
|
55
63
|
}
|
|
64
|
+
if (pinned) block = block.trim() ? `${block.trim()}\n\n${pinned}` : pinned
|
|
56
65
|
|
|
57
66
|
const msgs = ctx.runMgr.messages
|
|
58
67
|
|
|
@@ -12,18 +12,39 @@ import type { PluginHookEvent, PluginHookResult } from '../../types/plugin/index
|
|
|
12
12
|
export function applyLifecycleHookResults(
|
|
13
13
|
event: PluginHookEvent,
|
|
14
14
|
results: readonly PluginHookResult[],
|
|
15
|
-
):
|
|
15
|
+
): string[] {
|
|
16
|
+
const annotations: string[] = []
|
|
16
17
|
for (const result of results) {
|
|
17
18
|
switch (result.action) {
|
|
18
19
|
case 'continue':
|
|
19
20
|
continue
|
|
21
|
+
case 'annotate':
|
|
22
|
+
if (event !== 'user_prompt_submit') {
|
|
23
|
+
throw new Error(
|
|
24
|
+
`Plugin hook ${event} returned 'annotate', which only user_prompt_submit accepts`,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
if (result.text.trim().length > 0) annotations.push(result.text.trim())
|
|
28
|
+
continue
|
|
29
|
+
case 'skip':
|
|
30
|
+
// The one lifecycle event with a verdict: a hook may refuse the
|
|
31
|
+
// prompt before the model sees it, and the run ends there.
|
|
32
|
+
if (event === 'user_prompt_submit') {
|
|
33
|
+
throw new NamzuError({
|
|
34
|
+
code: 'plugin_error',
|
|
35
|
+
message: `Prompt blocked by hook: ${result.reason}`,
|
|
36
|
+
details: { event, blocked: true, reason: result.reason },
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
throw new Error(
|
|
40
|
+
`Plugin hook ${event} returned unsupported action 'skip' for a lifecycle event`,
|
|
41
|
+
)
|
|
20
42
|
case 'error':
|
|
21
43
|
throw new NamzuError({
|
|
22
44
|
code: 'plugin_error',
|
|
23
45
|
message: `Plugin hook ${event} reported error: ${result.message}`,
|
|
24
46
|
details: { event },
|
|
25
47
|
})
|
|
26
|
-
case 'skip':
|
|
27
48
|
case 'modify':
|
|
28
49
|
case 'retry':
|
|
29
50
|
case 'replace':
|
|
@@ -36,4 +57,5 @@ export function applyLifecycleHookResults(
|
|
|
36
57
|
}
|
|
37
58
|
}
|
|
38
59
|
}
|
|
60
|
+
return annotations
|
|
39
61
|
}
|
|
@@ -12,11 +12,18 @@ import { stableStringify } from './tool-grants.js'
|
|
|
12
12
|
* regardless of whether anything is repeating and needs a human at the
|
|
13
13
|
* other end.
|
|
14
14
|
*
|
|
15
|
-
* It advises
|
|
16
|
-
* for a build to finish is the same call by
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* It advises, and it refuses exactly one thing. A repeat is not
|
|
16
|
+
* necessarily wrong — polling for a build to finish is the same call by
|
|
17
|
+
* design — so a repeat that keeps SUCCEEDING is only ever noticed. A repeat
|
|
18
|
+
* that keeps FAILING the same way is different: an operator watched a
|
|
19
|
+
* model ask a desktop it could not reach for a screenshot, read the same
|
|
20
|
+
* error, and ask again, for as long as the run was allowed to go on. After
|
|
21
|
+
* `refuseFailedAfter` consecutive identical failures the next identical
|
|
22
|
+
* call is answered with a refusal instead of being run, and the refusal
|
|
23
|
+
* says why. A success resets the count, so a poll that fails a few times
|
|
24
|
+
* before it succeeds is never touched. What the model lacks is not
|
|
25
|
+
* permission but the observation, which it cannot make about itself: each
|
|
26
|
+
* turn it sees a history, not a count.
|
|
20
27
|
*/
|
|
21
28
|
|
|
22
29
|
/** Same key `ToolGrantSet` uses, so "the same call" means one thing here. */
|
|
@@ -29,11 +36,17 @@ export interface RepeatCallThresholds {
|
|
|
29
36
|
readonly notifyAfter: number
|
|
30
37
|
/** Repeats at which the wording escalates. */
|
|
31
38
|
readonly escalateAfter: number
|
|
39
|
+
/**
|
|
40
|
+
* Consecutive identical FAILURES after which the next identical call is
|
|
41
|
+
* refused rather than run. A success in between resets the count.
|
|
42
|
+
*/
|
|
43
|
+
readonly refuseFailedAfter: number
|
|
32
44
|
}
|
|
33
45
|
|
|
34
46
|
export const DEFAULT_REPEAT_THRESHOLDS: RepeatCallThresholds = {
|
|
35
47
|
notifyAfter: 3,
|
|
36
48
|
escalateAfter: 5,
|
|
49
|
+
refuseFailedAfter: 4,
|
|
37
50
|
}
|
|
38
51
|
|
|
39
52
|
export interface RepeatCallNotice {
|
|
@@ -52,17 +65,27 @@ export class RepeatCallTracker {
|
|
|
52
65
|
/** Which keys have already been reported at which level, so one repeat
|
|
53
66
|
* does not produce the same sentence on every subsequent turn. */
|
|
54
67
|
private readonly announced = new Map<string, 'notice' | 'escalated'>()
|
|
68
|
+
/** Consecutive failures per key; a success deletes the entry. */
|
|
69
|
+
private readonly failures = new Map<string, number>()
|
|
55
70
|
|
|
56
71
|
constructor(private readonly thresholds: RepeatCallThresholds = DEFAULT_REPEAT_THRESHOLDS) {}
|
|
57
72
|
|
|
58
73
|
/**
|
|
59
74
|
* Records one call and returns a notice when this is the repeat that
|
|
60
|
-
* crosses a threshold, `undefined` otherwise.
|
|
75
|
+
* crosses a threshold, `undefined` otherwise. `outcome.failed` is what
|
|
76
|
+
* the refusal counts; a call recorded without an outcome counts as a
|
|
77
|
+
* repeat but never towards a refusal.
|
|
61
78
|
*/
|
|
62
|
-
record(
|
|
79
|
+
record(
|
|
80
|
+
toolName: string,
|
|
81
|
+
input: unknown,
|
|
82
|
+
outcome?: { readonly failed: boolean },
|
|
83
|
+
): RepeatCallNotice | undefined {
|
|
63
84
|
const key = keyFor(toolName, input)
|
|
64
85
|
const count = (this.counts.get(key) ?? 0) + 1
|
|
65
86
|
this.counts.set(key, count)
|
|
87
|
+
if (outcome?.failed === true) this.failures.set(key, (this.failures.get(key) ?? 0) + 1)
|
|
88
|
+
else if (outcome?.failed === false) this.failures.delete(key)
|
|
66
89
|
|
|
67
90
|
const already = this.announced.get(key)
|
|
68
91
|
if (count >= this.thresholds.escalateAfter && already !== 'escalated') {
|
|
@@ -90,6 +113,18 @@ export class RepeatCallTracker {
|
|
|
90
113
|
countOf(toolName: string, input: unknown): number {
|
|
91
114
|
return this.counts.get(keyFor(toolName, input)) ?? 0
|
|
92
115
|
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The refusal for a call that has failed identically too many times in
|
|
119
|
+
* a row, or `undefined` when the call may run. Asked BEFORE execution;
|
|
120
|
+
* the refused call is still recorded afterwards, as a failure, so the
|
|
121
|
+
* refusal holds until the model changes something.
|
|
122
|
+
*/
|
|
123
|
+
refusal(toolName: string, input: unknown): string | undefined {
|
|
124
|
+
const failed = this.failures.get(keyFor(toolName, input)) ?? 0
|
|
125
|
+
if (failed < this.thresholds.refuseFailedAfter) return undefined
|
|
126
|
+
return `Refused: \`${toolName}\` with these exact arguments has failed ${failed} times in a row in this run, with the same result each time. It will not be run again with these arguments. Change the arguments, use a different tool, or tell the user what is blocking you and stop.`
|
|
127
|
+
}
|
|
93
128
|
}
|
|
94
129
|
|
|
95
130
|
/**
|
|
@@ -2,6 +2,7 @@ import { type Span, SpanStatusCode } from '@opentelemetry/api'
|
|
|
2
2
|
import type { PlanManager } from '../../manager/plan/lifecycle.js'
|
|
3
3
|
import type { RunPersistence } from '../../manager/run/persistence.js'
|
|
4
4
|
import { isCallerAbortError, isProviderRequestError } from '../../provider/errors.js'
|
|
5
|
+
import { TokenBudgetAdmissionError } from '../../provider/token-budget.js'
|
|
5
6
|
import type { ActivityStore } from '../../store/activity/memory.js'
|
|
6
7
|
import { GENAI, NAMZU } from '../../telemetry/attributes.js'
|
|
7
8
|
import { explainError } from '../../types/errors/catalog.js'
|
|
@@ -85,6 +86,7 @@ export class ResultAssembler {
|
|
|
85
86
|
|
|
86
87
|
await emitEvent({
|
|
87
88
|
type: 'run_completed',
|
|
89
|
+
budget: runMgr.budget?.summary(),
|
|
88
90
|
runId: runMgr.id,
|
|
89
91
|
result: runMgr.getRun().result ?? '',
|
|
90
92
|
// Read AFTER `markCompleted`, which is where a run that was stopped
|
|
@@ -133,6 +135,11 @@ export class ResultAssembler {
|
|
|
133
135
|
yield* this.completeRun(rootSpan)
|
|
134
136
|
return
|
|
135
137
|
}
|
|
138
|
+
if (err instanceof TokenBudgetAdmissionError) {
|
|
139
|
+
runMgr.setStopReason('token_budget')
|
|
140
|
+
yield* this.completeRun(rootSpan)
|
|
141
|
+
return
|
|
142
|
+
}
|
|
136
143
|
const errorMessage = toErrorMessage(err)
|
|
137
144
|
// The classifier at the provider boundary already walked the cause
|
|
138
145
|
// chain over status, errno and `Retry-After`, so a fully-populated
|
|
@@ -176,6 +183,7 @@ export class ResultAssembler {
|
|
|
176
183
|
|
|
177
184
|
await emitEvent({
|
|
178
185
|
type: 'run_paused',
|
|
186
|
+
budget: runMgr.budget?.summary(),
|
|
179
187
|
runId: runMgr.id,
|
|
180
188
|
checkpointId: resumeFrom,
|
|
181
189
|
reason: errorMessage,
|
|
@@ -219,6 +227,7 @@ export class ResultAssembler {
|
|
|
219
227
|
|
|
220
228
|
await emitEvent({
|
|
221
229
|
type: 'run_failed',
|
|
230
|
+
budget: runMgr.budget?.summary(),
|
|
222
231
|
runId: runMgr.id,
|
|
223
232
|
error: errorMessage,
|
|
224
233
|
failure,
|