@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
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
*
|
|
34
34
|
* ## Consuming it
|
|
35
35
|
*
|
|
36
|
-
*
|
|
36
|
+
* In short:
|
|
37
37
|
*
|
|
38
38
|
* ```typescript
|
|
39
39
|
* import { describe, expect, it } from 'your-runner'
|
|
@@ -62,7 +62,13 @@ import type { CostInfo } from '../../types/common/index.js'
|
|
|
62
62
|
import type { IterationCheckpoint } from '../../types/hitl/index.js'
|
|
63
63
|
import type { ProjectId, SessionId, TenantId } from '../../types/ids/index.js'
|
|
64
64
|
import type { CheckpointStore } from '../../types/run/checkpoint-store.js'
|
|
65
|
-
import {
|
|
65
|
+
import {
|
|
66
|
+
asProjectId,
|
|
67
|
+
asRunId,
|
|
68
|
+
asSessionId,
|
|
69
|
+
asTenantId,
|
|
70
|
+
generateCheckpointId,
|
|
71
|
+
} from '../../utils/id.js'
|
|
66
72
|
import { claimRun, listDurableRuns, releaseRun } from './listing.js'
|
|
67
73
|
|
|
68
74
|
/**
|
|
@@ -167,13 +173,13 @@ export interface CheckpointStoreConformanceOptions {
|
|
|
167
173
|
|
|
168
174
|
/** The tenant/project/session every case addresses unless it needs a second. */
|
|
169
175
|
const BINDING: CheckpointStoreBinding = {
|
|
170
|
-
tenantId: asTenantId('
|
|
171
|
-
projectId: asProjectId('
|
|
172
|
-
sessionId: asSessionId('
|
|
176
|
+
tenantId: asTenantId('528cd907-2b3e-4524-b67d-bcf63bfd4b60'),
|
|
177
|
+
projectId: asProjectId('e74a687e-883b-43e9-a1e4-0c254b9d9eb1'),
|
|
178
|
+
sessionId: asSessionId('5abc3e06-d1a0-4036-84f4-903b11b1d781'),
|
|
173
179
|
}
|
|
174
180
|
|
|
175
181
|
/** A tenant no backend under test holds runs for. */
|
|
176
|
-
const FOREIGN_TENANT = asTenantId('
|
|
182
|
+
const FOREIGN_TENANT = asTenantId('4ddf9f0b-a8c3-4f53-853b-1c604fc1ba52')
|
|
177
183
|
|
|
178
184
|
/** Fixed instant, so every expiry in a case is judged against one clock. */
|
|
179
185
|
const NOW = 5_000_000
|
|
@@ -191,12 +197,9 @@ const NO_COST: CostInfo = {
|
|
|
191
197
|
unpricedTokens: 0,
|
|
192
198
|
}
|
|
193
199
|
|
|
194
|
-
let checkpointSeq = 0
|
|
195
|
-
|
|
196
200
|
function checkpoint(runId: string): IterationCheckpoint {
|
|
197
|
-
checkpointSeq += 1
|
|
198
201
|
return {
|
|
199
|
-
id:
|
|
202
|
+
id: generateCheckpointId(),
|
|
200
203
|
runId: asRunId(runId),
|
|
201
204
|
iteration: 1,
|
|
202
205
|
messages: [],
|
|
@@ -213,7 +216,7 @@ function checkpoint(runId: string): IterationCheckpoint {
|
|
|
213
216
|
}
|
|
214
217
|
}
|
|
215
218
|
|
|
216
|
-
function runScope(binding: CheckpointStoreBinding, runId = '
|
|
219
|
+
function runScope(binding: CheckpointStoreBinding, runId = '5c84eacc-d287-4155-ac3b-336deb7b2d63') {
|
|
217
220
|
return { ...binding, runId: asRunId(runId) }
|
|
218
221
|
}
|
|
219
222
|
|
|
@@ -427,7 +430,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
427
430
|
})
|
|
428
431
|
await store.writeCheckpoint(
|
|
429
432
|
runScope(BINDING),
|
|
430
|
-
checkpoint('
|
|
433
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
431
434
|
claim?.fence,
|
|
432
435
|
)
|
|
433
436
|
const written = await store.listCheckpoints(runScope(BINDING))
|
|
@@ -446,7 +449,10 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
446
449
|
// A host that adopts claims on one worker must not break the
|
|
447
450
|
// workers that have not adopted them yet. Refusing here would
|
|
448
451
|
// make the capability impossible to roll out incrementally.
|
|
449
|
-
await store.writeCheckpoint(
|
|
452
|
+
await store.writeCheckpoint(
|
|
453
|
+
runScope(BINDING),
|
|
454
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
455
|
+
)
|
|
450
456
|
const written = await store.listCheckpoints(runScope(BINDING))
|
|
451
457
|
expect(written.length).toBe(1)
|
|
452
458
|
}),
|
|
@@ -476,7 +482,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
476
482
|
() =>
|
|
477
483
|
store.writeCheckpoint(
|
|
478
484
|
runScope(BINDING),
|
|
479
|
-
checkpoint('
|
|
485
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
480
486
|
first?.fence,
|
|
481
487
|
),
|
|
482
488
|
/no longer holds it/,
|
|
@@ -515,7 +521,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
515
521
|
() =>
|
|
516
522
|
store.writeCheckpoint(
|
|
517
523
|
runScope(BINDING),
|
|
518
|
-
checkpoint('
|
|
524
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
519
525
|
stale?.fence,
|
|
520
526
|
),
|
|
521
527
|
/no longer holds it/,
|
|
@@ -543,7 +549,7 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
543
549
|
() =>
|
|
544
550
|
store.writeCheckpoint(
|
|
545
551
|
runScope(BINDING),
|
|
546
|
-
checkpoint('
|
|
552
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
547
553
|
claim?.fence,
|
|
548
554
|
),
|
|
549
555
|
/no longer holds it/,
|
|
@@ -559,8 +565,8 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
559
565
|
'answers nothing for a tenant it does not hold',
|
|
560
566
|
withStore(async (store) => {
|
|
561
567
|
await store.writeCheckpoint(
|
|
562
|
-
runScope(BINDING, '
|
|
563
|
-
checkpoint('
|
|
568
|
+
runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
569
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
564
570
|
)
|
|
565
571
|
|
|
566
572
|
const foreign = await listDurableRuns(store, { tenantId: FOREIGN_TENANT })
|
|
@@ -575,13 +581,13 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
575
581
|
'answers nothing for a project it does not hold',
|
|
576
582
|
withStore(async (store) => {
|
|
577
583
|
await store.writeCheckpoint(
|
|
578
|
-
runScope(BINDING, '
|
|
579
|
-
checkpoint('
|
|
584
|
+
runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
585
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
580
586
|
)
|
|
581
587
|
|
|
582
588
|
const foreign = await listDurableRuns(store, {
|
|
583
589
|
tenantId: BINDING.tenantId,
|
|
584
|
-
projectId: asProjectId('
|
|
590
|
+
projectId: asProjectId('f89abf78-869a-40b1-8463-9a3051be514f'),
|
|
585
591
|
})
|
|
586
592
|
expect(foreign.entries.map((e) => e.runId)).toEqual([])
|
|
587
593
|
}),
|
|
@@ -610,18 +616,18 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
610
616
|
'rebuilds an addressable row for every run it holds',
|
|
611
617
|
withStore(async (store) => {
|
|
612
618
|
await store.writeCheckpoint(
|
|
613
|
-
runScope(BINDING, '
|
|
614
|
-
checkpoint('
|
|
619
|
+
runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
620
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
615
621
|
)
|
|
616
622
|
await store.writeCheckpoint(
|
|
617
|
-
runScope(BINDING, '
|
|
618
|
-
checkpoint('
|
|
623
|
+
runScope(BINDING, '31e7abcd-79c7-4720-ad81-f57f89d1ec63'),
|
|
624
|
+
checkpoint('31e7abcd-79c7-4720-ad81-f57f89d1ec63'),
|
|
619
625
|
)
|
|
620
626
|
|
|
621
627
|
const page = await listDurableRuns(store, { tenantId: BINDING.tenantId })
|
|
622
628
|
expect(page.entries.map((e) => e.runId)).toEqual([
|
|
623
|
-
'
|
|
624
|
-
'
|
|
629
|
+
'31e7abcd-79c7-4720-ad81-f57f89d1ec63',
|
|
630
|
+
'5c84eacc-d287-4155-ac3b-336deb7b2d63',
|
|
625
631
|
])
|
|
626
632
|
// A row that cannot be turned back into a scope is a report,
|
|
627
633
|
// not a work queue.
|
|
@@ -641,24 +647,28 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
641
647
|
'keeps one tenant’s runs out of another tenant’s listing',
|
|
642
648
|
withStore(async (store) => {
|
|
643
649
|
await store.writeCheckpoint(
|
|
644
|
-
runScope(BINDING, '
|
|
645
|
-
checkpoint('
|
|
650
|
+
runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
651
|
+
checkpoint('5c84eacc-d287-4155-ac3b-336deb7b2d63'),
|
|
646
652
|
)
|
|
647
653
|
await store.writeCheckpoint(
|
|
648
654
|
{
|
|
649
655
|
tenantId: FOREIGN_TENANT,
|
|
650
656
|
projectId: BINDING.projectId,
|
|
651
657
|
sessionId: BINDING.sessionId,
|
|
652
|
-
runId: asRunId('
|
|
658
|
+
runId: asRunId('a8085004-143d-49b4-9beb-8c396f723803'),
|
|
653
659
|
},
|
|
654
|
-
checkpoint('
|
|
660
|
+
checkpoint('a8085004-143d-49b4-9beb-8c396f723803'),
|
|
655
661
|
)
|
|
656
662
|
|
|
657
663
|
const mine = await listDurableRuns(store, { tenantId: BINDING.tenantId })
|
|
658
|
-
expect(mine.entries.map((e) => e.runId)).toEqual([
|
|
664
|
+
expect(mine.entries.map((e) => e.runId)).toEqual([
|
|
665
|
+
'5c84eacc-d287-4155-ac3b-336deb7b2d63',
|
|
666
|
+
])
|
|
659
667
|
|
|
660
668
|
const theirs = await listDurableRuns(store, { tenantId: FOREIGN_TENANT })
|
|
661
|
-
expect(theirs.entries.map((e) => e.runId)).toEqual([
|
|
669
|
+
expect(theirs.entries.map((e) => e.runId)).toEqual([
|
|
670
|
+
'a8085004-143d-49b4-9beb-8c396f723803',
|
|
671
|
+
])
|
|
662
672
|
}),
|
|
663
673
|
)
|
|
664
674
|
}
|
|
@@ -667,15 +677,19 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
667
677
|
it(
|
|
668
678
|
'shows the queue reader which runs nobody holds',
|
|
669
679
|
withStore(async (store) => {
|
|
670
|
-
for (const id of [
|
|
680
|
+
for (const id of [
|
|
681
|
+
'5c84eacc-d287-4155-ac3b-336deb7b2d63',
|
|
682
|
+
'31e7abcd-79c7-4720-ad81-f57f89d1ec63',
|
|
683
|
+
'727c095d-acad-4264-89f6-66cadc0bb644',
|
|
684
|
+
])
|
|
671
685
|
await store.writeCheckpoint(runScope(BINDING, id), checkpoint(id))
|
|
672
686
|
|
|
673
|
-
await claimRun(store, runScope(BINDING, '
|
|
687
|
+
await claimRun(store, runScope(BINDING, '5c84eacc-d287-4155-ac3b-336deb7b2d63'), {
|
|
674
688
|
holder: 'w1',
|
|
675
689
|
ttlMs: 60_000,
|
|
676
690
|
now: NOW,
|
|
677
691
|
})
|
|
678
|
-
await claimRun(store, runScope(BINDING, '
|
|
692
|
+
await claimRun(store, runScope(BINDING, '31e7abcd-79c7-4720-ad81-f57f89d1ec63'), {
|
|
679
693
|
holder: 'w1',
|
|
680
694
|
ttlMs: 1_000,
|
|
681
695
|
now: NOW,
|
|
@@ -691,8 +705,8 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
691
705
|
// forever — the failure the lease exists to prevent,
|
|
692
706
|
// reintroduced by the filter that reads it.
|
|
693
707
|
expect(free.entries.map((e) => e.runId)).toEqual([
|
|
694
|
-
'
|
|
695
|
-
'
|
|
708
|
+
'31e7abcd-79c7-4720-ad81-f57f89d1ec63',
|
|
709
|
+
'727c095d-acad-4264-89f6-66cadc0bb644',
|
|
696
710
|
])
|
|
697
711
|
|
|
698
712
|
const taken = await listDurableRuns(
|
|
@@ -700,7 +714,9 @@ export function defineCheckpointStoreConformance(options: CheckpointStoreConform
|
|
|
700
714
|
{ tenantId: BINDING.tenantId },
|
|
701
715
|
{ claimed: true, now: NOW + 2_000 },
|
|
702
716
|
)
|
|
703
|
-
expect(taken.entries.map((e) => e.runId)).toEqual([
|
|
717
|
+
expect(taken.entries.map((e) => e.runId)).toEqual([
|
|
718
|
+
'5c84eacc-d287-4155-ac3b-336deb7b2d63',
|
|
719
|
+
])
|
|
704
720
|
expect(taken.entries[0]?.claim?.holder).toBe('w1')
|
|
705
721
|
expect(taken.entries[0]?.claim?.expired).toBe(false)
|
|
706
722
|
}),
|
package/src/store/run/disk.ts
CHANGED
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
RunStore,
|
|
17
17
|
} from '../../types/run/store.js'
|
|
18
18
|
import { atomicWriteFile } from '../../utils/atomic-write.js'
|
|
19
|
+
import { asCheckpointId, asRunId } from '../../utils/id.js'
|
|
19
20
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
20
21
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
21
22
|
import { defineSchema, migrate, stamp } from '../schema.js'
|
|
@@ -29,6 +30,13 @@ import { defineSchema, migrate, stamp } from '../schema.js'
|
|
|
29
30
|
* the shape changes.
|
|
30
31
|
*/
|
|
31
32
|
const SCHEMA = defineSchema({ kind: 'run-store', current: 1, migrations: {} })
|
|
33
|
+
// Older readers must refuse ledger-bound checkpoints instead of dropping their
|
|
34
|
+
// budget authority. Other run-store records retain their existing schema.
|
|
35
|
+
const CHECKPOINT_SCHEMA = defineSchema({
|
|
36
|
+
kind: 'run-checkpoint',
|
|
37
|
+
current: 2,
|
|
38
|
+
migrations: { 1: (record) => record },
|
|
39
|
+
})
|
|
32
40
|
|
|
33
41
|
/**
|
|
34
42
|
* One finished tool call, recovered from the transcript.
|
|
@@ -58,6 +66,8 @@ export class RunDiskStore implements RunStore {
|
|
|
58
66
|
}
|
|
59
67
|
|
|
60
68
|
async initRun(runId: string, parentRunId?: string): Promise<string> {
|
|
69
|
+
asRunId(runId)
|
|
70
|
+
if (parentRunId !== undefined) asRunId(parentRunId)
|
|
61
71
|
if (parentRunId) {
|
|
62
72
|
this.runDir = join(this.baseDir, parentRunId, 'children', runId)
|
|
63
73
|
} else {
|
|
@@ -195,6 +205,8 @@ export class RunDiskStore implements RunStore {
|
|
|
195
205
|
status: run.status,
|
|
196
206
|
metadata: run.metadata,
|
|
197
207
|
tokenUsage: run.tokenUsage,
|
|
208
|
+
budget: run.budget,
|
|
209
|
+
budgetBinding: run.budgetBinding,
|
|
198
210
|
currentIteration: run.currentIteration,
|
|
199
211
|
startedAt: run.startedAt,
|
|
200
212
|
endedAt: run.endedAt,
|
|
@@ -237,6 +249,7 @@ export class RunDiskStore implements RunStore {
|
|
|
237
249
|
}
|
|
238
250
|
|
|
239
251
|
async writeCheckpoint(checkpoint: IterationCheckpoint): Promise<void> {
|
|
252
|
+
asCheckpointId(checkpoint.id)
|
|
240
253
|
const dir = this.requireInit()
|
|
241
254
|
const cpDir = join(dir, 'checkpoints')
|
|
242
255
|
await mkdir(cpDir, { recursive: true })
|
|
@@ -247,10 +260,11 @@ export class RunDiskStore implements RunStore {
|
|
|
247
260
|
// as if it were the older shape, and the refusal that exists to
|
|
248
261
|
// prevent exactly that never fires. The stamp is what gives the
|
|
249
262
|
// migration chain something to hang on.
|
|
250
|
-
await atomicWriteJson(join(cpDir, `${checkpoint.id}.json`),
|
|
263
|
+
await atomicWriteJson(join(cpDir, `${checkpoint.id}.json`), checkpoint, CHECKPOINT_SCHEMA)
|
|
251
264
|
}
|
|
252
265
|
|
|
253
266
|
async readCheckpoint(checkpointId: CheckpointId): Promise<IterationCheckpoint | null> {
|
|
267
|
+
asCheckpointId(checkpointId)
|
|
254
268
|
const dir = this.requireInit()
|
|
255
269
|
try {
|
|
256
270
|
const content = await readFile(join(dir, 'checkpoints', `${checkpointId}.json`), 'utf-8')
|
|
@@ -266,6 +280,7 @@ export class RunDiskStore implements RunStore {
|
|
|
266
280
|
}
|
|
267
281
|
|
|
268
282
|
async deleteCheckpoint(checkpointId: CheckpointId): Promise<void> {
|
|
283
|
+
asCheckpointId(checkpointId)
|
|
269
284
|
const dir = this.requireInit()
|
|
270
285
|
try {
|
|
271
286
|
await unlink(join(dir, 'checkpoints', `${checkpointId}.json`))
|
|
@@ -611,8 +626,8 @@ export async function readCheckpointsIn(runDir: string): Promise<IterationCheckp
|
|
|
611
626
|
return checkpoints.sort((a, b) => a.createdAt - b.createdAt)
|
|
612
627
|
}
|
|
613
628
|
|
|
614
|
-
async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {
|
|
615
|
-
await atomicWriteFile(filePath, JSON.stringify(stamp(
|
|
629
|
+
async function atomicWriteJson(filePath: string, value: unknown, schema = SCHEMA): Promise<void> {
|
|
630
|
+
await atomicWriteFile(filePath, JSON.stringify(stamp(schema, value), null, 2))
|
|
616
631
|
}
|
|
617
632
|
|
|
618
633
|
/**
|
|
@@ -656,7 +671,7 @@ function hasUsableBudgets(record: Partial<IterationCheckpoint>): boolean {
|
|
|
656
671
|
}
|
|
657
672
|
|
|
658
673
|
function parseCheckpoint(content: string, file: string): IterationCheckpoint {
|
|
659
|
-
const parsed = migrate<unknown>(
|
|
674
|
+
const parsed = migrate<unknown>(CHECKPOINT_SCHEMA, JSON.parse(content))
|
|
660
675
|
const record = parsed as Partial<IterationCheckpoint> | null
|
|
661
676
|
|
|
662
677
|
if (
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises'
|
|
2
|
+
import { dirname, join } from 'node:path'
|
|
3
|
+
import {
|
|
4
|
+
TokenBudget,
|
|
5
|
+
type TokenBudgetSnapshot,
|
|
6
|
+
validateTokenBudgetSnapshot,
|
|
7
|
+
} from '../../run/token-budget.js'
|
|
8
|
+
import { DefaultPathBuilder, type PathBuilder } from '../../session/workspace/path-builder.js'
|
|
9
|
+
import type { TokenUsage } from '../../types/common/index.js'
|
|
10
|
+
import type { TokenBudgetScope, TokenBudgetStore } from '../../types/run/token-budget-store.js'
|
|
11
|
+
import { temporaryPathFor } from '../../utils/atomic-write.js'
|
|
12
|
+
import { asProjectId, asRunId, asSessionId, asTenantId } from '../../utils/id.js'
|
|
13
|
+
|
|
14
|
+
interface BudgetRecord {
|
|
15
|
+
readonly version: 1
|
|
16
|
+
readonly scope: TokenBudgetScope
|
|
17
|
+
readonly snapshot: TokenBudgetSnapshot
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface DiskTokenBudgetStoreConfig {
|
|
21
|
+
/** Root session's runs directory, shared by every account in a tree. */
|
|
22
|
+
readonly baseDir: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Canonical ledger beside the root run, independent of checkpoint pruning.
|
|
27
|
+
*
|
|
28
|
+
* Writes from this instance are serialized and use private atomic sidecars.
|
|
29
|
+
* New directories are mode 0700 and files are mode 0600. This is a single
|
|
30
|
+
* writer store; atomic replacement does not provide a distributed lease.
|
|
31
|
+
*/
|
|
32
|
+
export class DiskTokenBudgetStore implements TokenBudgetStore {
|
|
33
|
+
private readonly writes = new Map<string, Promise<void>>()
|
|
34
|
+
|
|
35
|
+
constructor(private readonly config: DiskTokenBudgetStoreConfig) {}
|
|
36
|
+
|
|
37
|
+
private path(scope: TokenBudgetScope): string {
|
|
38
|
+
validateScope(scope)
|
|
39
|
+
return join(this.config.baseDir, scope.runId, 'token-budget.json')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async load(scope: TokenBudgetScope): Promise<TokenBudgetSnapshot | null> {
|
|
43
|
+
const path = this.path(scope)
|
|
44
|
+
await this.writes.get(path)
|
|
45
|
+
return this.read(path, scope)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async save(scope: TokenBudgetScope, snapshot: TokenBudgetSnapshot): Promise<void> {
|
|
49
|
+
const path = this.path(scope)
|
|
50
|
+
const checkedScope = validateScope(scope)
|
|
51
|
+
const checkedSnapshot = validateSnapshotScope(snapshot, checkedScope)
|
|
52
|
+
const previous = this.writes.get(path) ?? Promise.resolve()
|
|
53
|
+
const writing = previous
|
|
54
|
+
.catch(() => undefined)
|
|
55
|
+
.then(async () => {
|
|
56
|
+
const existing = await this.read(path, checkedScope)
|
|
57
|
+
if (existing) assertSameRoot(existing, checkedSnapshot)
|
|
58
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 })
|
|
59
|
+
const temporary = temporaryPathFor(path)
|
|
60
|
+
const record: BudgetRecord = {
|
|
61
|
+
version: 1,
|
|
62
|
+
scope: checkedScope,
|
|
63
|
+
snapshot: checkedSnapshot,
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
await writeFile(temporary, `${JSON.stringify(record)}\n`, {
|
|
67
|
+
encoding: 'utf8',
|
|
68
|
+
flag: 'wx',
|
|
69
|
+
mode: 0o600,
|
|
70
|
+
})
|
|
71
|
+
await rename(temporary, path)
|
|
72
|
+
} catch (error) {
|
|
73
|
+
await unlink(temporary).catch(() => undefined)
|
|
74
|
+
throw error
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
this.writes.set(path, writing)
|
|
78
|
+
try {
|
|
79
|
+
await writing
|
|
80
|
+
} finally {
|
|
81
|
+
if (this.writes.get(path) === writing) this.writes.delete(path)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private async read(path: string, scope: TokenBudgetScope): Promise<TokenBudgetSnapshot | null> {
|
|
86
|
+
let text: string
|
|
87
|
+
try {
|
|
88
|
+
text = await readFile(path, 'utf8')
|
|
89
|
+
} catch (error) {
|
|
90
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null
|
|
91
|
+
throw error
|
|
92
|
+
}
|
|
93
|
+
const raw: unknown = JSON.parse(text)
|
|
94
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
95
|
+
throw new Error('Invalid token budget record')
|
|
96
|
+
}
|
|
97
|
+
const record = raw as Partial<BudgetRecord>
|
|
98
|
+
if (record.version !== 1) throw new Error('Unsupported token budget record version')
|
|
99
|
+
if (!record.scope) throw new Error('Token budget record is missing its root scope')
|
|
100
|
+
const storedScope = validateScope(record.scope)
|
|
101
|
+
if (!sameScope(scope, storedScope)) throw new Error('Token budget root scope mismatch')
|
|
102
|
+
return validateSnapshotScope(record.snapshot, scope)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface OpenTokenBudgetOptions {
|
|
107
|
+
readonly store?: TokenBudgetStore
|
|
108
|
+
readonly scope: TokenBudgetScope
|
|
109
|
+
/** Required for a new root. Existing roots can reopen without changing their cap. */
|
|
110
|
+
readonly limit?: number
|
|
111
|
+
readonly pathBuilder?: PathBuilder
|
|
112
|
+
readonly workingDirectory?: string
|
|
113
|
+
readonly accountId?: string
|
|
114
|
+
/** A checkpoint binding must never create a fresh ledger if its record is gone. */
|
|
115
|
+
readonly requireExisting?: boolean
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Open the latest authority; a checkpoint only selects an existing account. */
|
|
119
|
+
export async function openTokenBudget(options: OpenTokenBudgetOptions): Promise<TokenBudget> {
|
|
120
|
+
const scope = validateScope(options.scope)
|
|
121
|
+
const pathBuilder =
|
|
122
|
+
options.pathBuilder ??
|
|
123
|
+
new DefaultPathBuilder(join(options.workingDirectory ?? process.cwd(), '.namzu'))
|
|
124
|
+
const store =
|
|
125
|
+
options.store ??
|
|
126
|
+
new DiskTokenBudgetStore({
|
|
127
|
+
baseDir: join(pathBuilder.sessionDir(scope.projectId, scope.sessionId), 'runs'),
|
|
128
|
+
})
|
|
129
|
+
const persistence = {
|
|
130
|
+
scope,
|
|
131
|
+
save: (snapshot: TokenBudgetSnapshot) => store.save(scope, snapshot),
|
|
132
|
+
}
|
|
133
|
+
const saved = await store.load(scope)
|
|
134
|
+
let budget: TokenBudget
|
|
135
|
+
if (saved === null) {
|
|
136
|
+
if (options.requireExisting || options.accountId !== undefined) {
|
|
137
|
+
throw new Error('The token budget ledger required by this run is missing')
|
|
138
|
+
}
|
|
139
|
+
if (options.limit === undefined)
|
|
140
|
+
throw new Error('A new token budget requires an explicit limit')
|
|
141
|
+
budget = TokenBudget.create(options.limit, scope.runId, persistence)
|
|
142
|
+
} else {
|
|
143
|
+
const snapshot = validateSnapshotScope(saved, scope)
|
|
144
|
+
if (options.limit !== undefined && rootLimit(snapshot) !== options.limit) {
|
|
145
|
+
throw new Error('Token budget root limit mismatch')
|
|
146
|
+
}
|
|
147
|
+
budget = TokenBudget.restore(snapshot, persistence)
|
|
148
|
+
}
|
|
149
|
+
const account = options.accountId === undefined ? budget : budget.account(options.accountId)
|
|
150
|
+
await budget.flush()
|
|
151
|
+
return account
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function validateScope(scope: TokenBudgetScope): TokenBudgetScope {
|
|
155
|
+
return {
|
|
156
|
+
tenantId: asTenantId(scope.tenantId),
|
|
157
|
+
projectId: asProjectId(scope.projectId),
|
|
158
|
+
sessionId: asSessionId(scope.sessionId),
|
|
159
|
+
runId: asRunId(scope.runId),
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function sameScope(left: TokenBudgetScope, right: TokenBudgetScope): boolean {
|
|
164
|
+
return (
|
|
165
|
+
left.tenantId === right.tenantId &&
|
|
166
|
+
left.projectId === right.projectId &&
|
|
167
|
+
left.sessionId === right.sessionId &&
|
|
168
|
+
left.runId === right.runId
|
|
169
|
+
)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function validateSnapshotScope(snapshot: unknown, scope: TokenBudgetScope): TokenBudgetSnapshot {
|
|
173
|
+
const checked = validateTokenBudgetSnapshot(snapshot)
|
|
174
|
+
if (checked.rootRunId !== scope.runId) throw new Error('Token budget root run mismatch')
|
|
175
|
+
return checked
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function rootLimit(snapshot: TokenBudgetSnapshot): number {
|
|
179
|
+
const account = snapshot.accounts.find((account) => account.id === snapshot.rootAccountId)
|
|
180
|
+
if (!account) throw new Error('Token budget root account is missing')
|
|
181
|
+
return account.limit
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function assertSameRoot(before: TokenBudgetSnapshot, after: TokenBudgetSnapshot): void {
|
|
185
|
+
if (before.rootAccountId !== after.rootAccountId) {
|
|
186
|
+
throw new Error('Cannot replace an existing token budget with a different root')
|
|
187
|
+
}
|
|
188
|
+
const reconciled = before.poisoned && !after.poisoned
|
|
189
|
+
if (reconciled && after.requests.length > 0) {
|
|
190
|
+
throw new Error('Cannot reopen a token budget with unresolved requests')
|
|
191
|
+
}
|
|
192
|
+
const accounts = new Map(after.accounts.map((account) => [account.id, account]))
|
|
193
|
+
for (const previous of before.accounts) {
|
|
194
|
+
const current = accounts.get(previous.id)
|
|
195
|
+
if (
|
|
196
|
+
!current ||
|
|
197
|
+
(previous.limit > 0 && (current.limit === 0 || current.limit > previous.limit)) ||
|
|
198
|
+
current.parentId !== previous.parentId ||
|
|
199
|
+
(previous.runId !== undefined && current.runId !== previous.runId) ||
|
|
200
|
+
(previous.settled && !current.settled)
|
|
201
|
+
) {
|
|
202
|
+
throw new Error('Cannot replace or remove an existing token budget account')
|
|
203
|
+
}
|
|
204
|
+
for (const [runId, spent] of Object.entries(previous.usage)) {
|
|
205
|
+
const recorded = current.usage[runId]
|
|
206
|
+
if (!usageAtLeast(recorded, spent)) {
|
|
207
|
+
throw new Error('Cannot reduce recorded token budget usage')
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const receipts = new Map(after.completedRequests.map((request) => [request.id, request]))
|
|
212
|
+
for (const previous of before.completedRequests) {
|
|
213
|
+
const current = receipts.get(previous.id)
|
|
214
|
+
if (
|
|
215
|
+
!current ||
|
|
216
|
+
current.accountId !== previous.accountId ||
|
|
217
|
+
current.runId !== previous.runId ||
|
|
218
|
+
!usageAtLeast(current.usage, previous.usage)
|
|
219
|
+
) {
|
|
220
|
+
throw new Error('Cannot remove or replace a token budget completion receipt')
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const active = new Map(after.requests.map((request) => [request.id, request]))
|
|
224
|
+
for (const previous of before.requests) {
|
|
225
|
+
const current = active.get(previous.id) ?? receipts.get(previous.id)
|
|
226
|
+
if (
|
|
227
|
+
!current ||
|
|
228
|
+
current.accountId !== previous.accountId ||
|
|
229
|
+
current.runId !== previous.runId ||
|
|
230
|
+
(reconciled && current.usage === undefined) ||
|
|
231
|
+
!usageAtLeast(current.usage, previous.usage)
|
|
232
|
+
) {
|
|
233
|
+
throw new Error(
|
|
234
|
+
'Cannot forget an unresolved token budget request without a completion receipt',
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function usageAtLeast(current: TokenUsage | undefined, previous: TokenUsage | undefined): boolean {
|
|
241
|
+
if (previous === undefined) return true
|
|
242
|
+
if (current === undefined) return false
|
|
243
|
+
return Object.entries(previous).every(
|
|
244
|
+
([field, amount]) =>
|
|
245
|
+
typeof amount !== 'number' || (current[field as keyof TokenUsage] ?? 0) >= amount,
|
|
246
|
+
)
|
|
247
|
+
}
|