@namzu/sdk 34.2.0 → 36.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +171 -0
- package/README.md +2 -6
- package/dist/agents/PipelineAgent.d.ts.map +1 -1
- package/dist/agents/PipelineAgent.js +118 -100
- package/dist/agents/PipelineAgent.js.map +1 -1
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +2 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/RouterAgent.d.ts.map +1 -1
- package/dist/agents/RouterAgent.js +105 -61
- package/dist/agents/RouterAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +8 -4
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/budget.d.ts +6 -0
- package/dist/agents/budget.d.ts.map +1 -0
- package/dist/agents/budget.js +33 -0
- package/dist/agents/budget.js.map +1 -0
- package/dist/agents/explore.d.ts +20 -0
- package/dist/agents/explore.d.ts.map +1 -0
- package/dist/agents/explore.js +26 -0
- package/dist/agents/explore.js.map +1 -0
- package/dist/agents/file-definitions.d.ts +80 -0
- package/dist/agents/file-definitions.d.ts.map +1 -0
- package/dist/agents/file-definitions.js +179 -0
- package/dist/agents/file-definitions.js.map +1 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +6 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +22 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/bus/lock.d.ts.map +1 -1
- package/dist/bus/lock.js +1 -10
- package/dist/bus/lock.js.map +1 -1
- package/dist/compaction/consolidation.d.ts +31 -0
- package/dist/compaction/consolidation.d.ts.map +1 -0
- package/dist/compaction/consolidation.js +63 -0
- package/dist/compaction/consolidation.js.map +1 -0
- package/dist/compaction/factory.d.ts.map +1 -1
- package/dist/compaction/factory.js +3 -0
- package/dist/compaction/factory.js.map +1 -1
- package/dist/compaction/index.d.ts +6 -1
- package/dist/compaction/index.d.ts.map +1 -1
- package/dist/compaction/index.js +6 -0
- package/dist/compaction/index.js.map +1 -1
- package/dist/compaction/manager.d.ts +7 -0
- package/dist/compaction/manager.d.ts.map +1 -1
- package/dist/compaction/manager.js +31 -0
- package/dist/compaction/manager.js.map +1 -1
- package/dist/compaction/plan.d.ts +23 -0
- package/dist/compaction/plan.d.ts.map +1 -1
- package/dist/compaction/plan.js +41 -24
- package/dist/compaction/plan.js.map +1 -1
- package/dist/compaction/salience/bm25.d.ts +26 -0
- package/dist/compaction/salience/bm25.d.ts.map +1 -0
- package/dist/compaction/salience/bm25.js +56 -0
- package/dist/compaction/salience/bm25.js.map +1 -0
- package/dist/compaction/salience/goal.d.ts +21 -0
- package/dist/compaction/salience/goal.d.ts.map +1 -0
- package/dist/compaction/salience/goal.js +32 -0
- package/dist/compaction/salience/goal.js.map +1 -0
- package/dist/compaction/salience/index.d.ts +4 -0
- package/dist/compaction/salience/index.d.ts.map +1 -0
- package/dist/compaction/salience/index.js +4 -0
- package/dist/compaction/salience/index.js.map +1 -0
- package/dist/compaction/salience/minhash.d.ts +17 -0
- package/dist/compaction/salience/minhash.d.ts.map +1 -0
- package/dist/compaction/salience/minhash.js +54 -0
- package/dist/compaction/salience/minhash.js.map +1 -0
- package/dist/compaction/salience/score.d.ts +64 -0
- package/dist/compaction/salience/score.d.ts.map +1 -0
- package/dist/compaction/salience/score.js +256 -0
- package/dist/compaction/salience/score.js.map +1 -0
- package/dist/compaction/salience/tokenize.d.ts +20 -0
- package/dist/compaction/salience/tokenize.d.ts.map +1 -0
- package/dist/compaction/salience/tokenize.js +92 -0
- package/dist/compaction/salience/tokenize.js.map +1 -0
- package/dist/compaction/salience/working-set.d.ts +59 -0
- package/dist/compaction/salience/working-set.d.ts.map +1 -0
- package/dist/compaction/salience/working-set.js +137 -0
- package/dist/compaction/salience/working-set.js.map +1 -0
- package/dist/compaction/serializer.d.ts +2 -0
- package/dist/compaction/serializer.d.ts.map +1 -1
- package/dist/compaction/serializer.js +15 -0
- package/dist/compaction/serializer.js.map +1 -1
- package/dist/compaction/token-estimate.d.ts +13 -0
- package/dist/compaction/token-estimate.d.ts.map +1 -0
- package/dist/compaction/token-estimate.js +58 -0
- package/dist/compaction/token-estimate.js.map +1 -0
- package/dist/compaction/tool-result-editing.d.ts +10 -2
- package/dist/compaction/tool-result-editing.d.ts.map +1 -1
- package/dist/compaction/tool-result-editing.js +22 -24
- package/dist/compaction/tool-result-editing.js.map +1 -1
- package/dist/compaction/types.d.ts +22 -1
- package/dist/compaction/types.d.ts.map +1 -1
- package/dist/compaction/wire.d.ts +3 -1
- package/dist/compaction/wire.d.ts.map +1 -1
- package/dist/compaction/wire.js +2 -0
- package/dist/compaction/wire.js.map +1 -1
- package/dist/config/runtime.d.ts +58 -28
- package/dist/config/runtime.d.ts.map +1 -1
- package/dist/config/runtime.js +13 -1
- package/dist/config/runtime.js.map +1 -1
- package/dist/connector/builtins/http.d.ts.map +1 -1
- package/dist/connector/builtins/http.js +2 -8
- package/dist/connector/builtins/http.js.map +1 -1
- package/dist/connector/builtins/webhook.js +2 -2
- package/dist/connector/builtins/webhook.js.map +1 -1
- package/dist/connector/mcp/adapter.d.ts +2 -0
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +30 -0
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/connector/tools/adapter.js +2 -2
- package/dist/connector/tools/adapter.js.map +1 -1
- package/dist/connector/tools/definitions.js +2 -2
- package/dist/connector/tools/definitions.js.map +1 -1
- package/dist/constants/compaction/index.d.ts +1 -0
- package/dist/constants/compaction/index.d.ts.map +1 -1
- package/dist/constants/compaction/index.js +1 -0
- package/dist/constants/compaction/index.js.map +1 -1
- package/dist/constants/telemetry/index.d.ts +0 -1
- package/dist/constants/telemetry/index.d.ts.map +1 -1
- package/dist/constants/telemetry/index.js +0 -1
- package/dist/constants/telemetry/index.js.map +1 -1
- package/dist/contracts/a2a.d.ts +5 -5
- package/dist/contracts/api.d.ts +4 -2
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/contracts/schemas.d.ts +1 -15
- package/dist/contracts/schemas.d.ts.map +1 -1
- package/dist/contracts/schemas.js +5 -20
- package/dist/contracts/schemas.js.map +1 -1
- package/dist/invariants/index.d.ts +1 -1
- package/dist/manager/agent/lifecycle.d.ts +2 -18
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +373 -340
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +3 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +35 -5
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +1 -0
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/shell-hook.d.ts +128 -0
- package/dist/plugin/shell-hook.d.ts.map +1 -0
- package/dist/plugin/shell-hook.js +299 -0
- package/dist/plugin/shell-hook.js.map +1 -0
- package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
- package/dist/prompt/coding-agent-doctrine.js +100 -0
- package/dist/prompt/coding-agent-doctrine.js.map +1 -0
- package/dist/prompt/index.d.ts +2 -0
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -0
- package/dist/prompt/index.js.map +1 -1
- package/dist/provider/errors.d.ts +1 -1
- package/dist/provider/errors.js +1 -1
- package/dist/provider/fallback.d.ts +2 -0
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +3 -1
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/retry.d.ts +2 -0
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +3 -1
- package/dist/provider/retry.js.map +1 -1
- package/dist/provider/token-budget.d.ts +13 -0
- package/dist/provider/token-budget.d.ts.map +1 -0
- package/dist/provider/token-budget.js +150 -0
- package/dist/provider/token-budget.js.map +1 -0
- package/dist/public-runtime.d.ts +14 -14
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +15 -10
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-tools.d.ts +2 -0
- package/dist/public-tools.d.ts.map +1 -1
- package/dist/public-tools.js +2 -0
- package/dist/public-tools.js.map +1 -1
- package/dist/public-types.d.ts +12 -2
- package/dist/public-types.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.d.ts.map +1 -1
- package/dist/registry/command/kernel-commands.js +18 -6
- package/dist/registry/command/kernel-commands.js.map +1 -1
- package/dist/registry/tool/execute.d.ts.map +1 -1
- package/dist/registry/tool/execute.js +4 -1
- package/dist/registry/tool/execute.js.map +1 -1
- package/dist/run/LimitChecker.js +1 -1
- package/dist/run/LimitChecker.js.map +1 -1
- package/dist/run/drain.js +1 -1
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +15 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/run/token-budget.d.ts +108 -0
- package/dist/run/token-budget.d.ts.map +1 -0
- package/dist/run/token-budget.js +591 -0
- package/dist/run/token-budget.js.map +1 -0
- package/dist/runtime/jobs/registry.d.ts +29 -0
- package/dist/runtime/jobs/registry.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.js +98 -18
- package/dist/runtime/jobs/registry.js.map +1 -1
- package/dist/runtime/query/checkpoint.d.ts.map +1 -1
- package/dist/runtime/query/checkpoint.js +10 -3
- package/dist/runtime/query/checkpoint.js.map +1 -1
- package/dist/runtime/query/context.d.ts +2 -26
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +1 -29
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +13 -9
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +144 -55
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +8 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/index.d.ts +42 -4
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +153 -52
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/index.d.ts +3 -3
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +47 -11
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +98 -30
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
- package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
- package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
- package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +10 -5
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts +1 -1
- package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
- package/dist/runtime/query/plugin-hooks.js +20 -1
- package/dist/runtime/query/plugin-hooks.js.map +1 -1
- package/dist/runtime/query/prompt.d.ts.map +1 -1
- package/dist/runtime/query/prompt.js +14 -4
- package/dist/runtime/query/prompt.js.map +1 -1
- package/dist/runtime/query/repeat-call.d.ts +20 -2
- package/dist/runtime/query/repeat-call.d.ts.map +1 -1
- package/dist/runtime/query/repeat-call.js +35 -7
- package/dist/runtime/query/repeat-call.js.map +1 -1
- package/dist/runtime/query/result.d.ts.map +1 -1
- package/dist/runtime/query/result.js +9 -0
- package/dist/runtime/query/result.js.map +1 -1
- package/dist/runtime/query/review-policy.d.ts +142 -0
- package/dist/runtime/query/review-policy.d.ts.map +1 -0
- package/dist/runtime/query/review-policy.js +144 -0
- package/dist/runtime/query/review-policy.js.map +1 -0
- package/dist/runtime/query/run-state.d.ts.map +1 -1
- package/dist/runtime/query/run-state.js +4 -0
- package/dist/runtime/query/run-state.js.map +1 -1
- package/dist/runtime/query/steering.d.ts +4 -0
- package/dist/runtime/query/steering.d.ts.map +1 -1
- package/dist/runtime/query/steering.js +29 -0
- package/dist/runtime/query/steering.js.map +1 -1
- package/dist/runtime/query/token-budget.d.ts +7 -0
- package/dist/runtime/query/token-budget.d.ts.map +1 -0
- package/dist/runtime/query/token-budget.js +101 -0
- package/dist/runtime/query/token-budget.js.map +1 -0
- package/dist/runtime/query/tool-output-budget.d.ts +2 -0
- package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
- package/dist/runtime/query/tool-output-budget.js +29 -11
- package/dist/runtime/query/tool-output-budget.js.map +1 -1
- package/dist/runtime/query/tool-pause.d.ts.map +1 -1
- package/dist/runtime/query/tool-pause.js +4 -2
- package/dist/runtime/query/tool-pause.js.map +1 -1
- package/dist/runtime/query/tooling.d.ts +4 -0
- package/dist/runtime/query/tooling.d.ts.map +1 -1
- package/dist/runtime/query/tooling.js +4 -0
- package/dist/runtime/query/tooling.js.map +1 -1
- package/dist/sandbox/file-walk-program.d.ts +3 -0
- package/dist/sandbox/file-walk-program.d.ts.map +1 -0
- package/dist/sandbox/file-walk-program.js +94 -0
- package/dist/sandbox/file-walk-program.js.map +1 -0
- package/dist/sandbox/file-walk.d.ts +12 -0
- package/dist/sandbox/file-walk.d.ts.map +1 -0
- package/dist/sandbox/file-walk.js +429 -0
- package/dist/sandbox/file-walk.js.map +1 -0
- package/dist/sandbox/index.d.ts +2 -0
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +1 -0
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/provider/local.d.ts +3 -1
- package/dist/sandbox/provider/local.d.ts.map +1 -1
- package/dist/sandbox/provider/local.js +121 -12
- package/dist/sandbox/provider/local.js.map +1 -1
- package/dist/scheduler/completion-inbox.d.ts +3 -2
- package/dist/scheduler/completion-inbox.d.ts.map +1 -1
- package/dist/scheduler/completion-inbox.js +29 -15
- package/dist/scheduler/completion-inbox.js.map +1 -1
- package/dist/scheduler/delegating.d.ts +1 -0
- package/dist/scheduler/delegating.d.ts.map +1 -1
- package/dist/scheduler/delegating.js +29 -12
- package/dist/scheduler/delegating.js.map +1 -1
- package/dist/scheduler/local.d.ts +1 -0
- package/dist/scheduler/local.d.ts.map +1 -1
- package/dist/scheduler/local.js +4 -7
- package/dist/scheduler/local.js.map +1 -1
- package/dist/session/index.d.ts +0 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +0 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/workspace/path-builder.d.ts.map +1 -1
- package/dist/session/workspace/path-builder.js +5 -4
- package/dist/session/workspace/path-builder.js.map +1 -1
- package/dist/store/feedback/disk.d.ts.map +1 -1
- package/dist/store/feedback/disk.js +4 -6
- package/dist/store/feedback/disk.js.map +1 -1
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/memory/disk.d.ts.map +1 -1
- package/dist/store/memory/disk.js +3 -12
- package/dist/store/memory/disk.js.map +1 -1
- package/dist/store/run/checkpoint-disk.d.ts +3 -3
- package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
- package/dist/store/run/checkpoint-disk.js +14 -26
- package/dist/store/run/checkpoint-disk.js.map +1 -1
- package/dist/store/run/claim-disk.js +1 -1
- package/dist/store/run/conformance.d.ts +1 -1
- package/dist/store/run/conformance.d.ts.map +1 -1
- package/dist/store/run/conformance.js +41 -33
- package/dist/store/run/conformance.js.map +1 -1
- package/dist/store/run/disk.d.ts.map +1 -1
- package/dist/store/run/disk.js +20 -4
- package/dist/store/run/disk.js.map +1 -1
- package/dist/store/run/token-budget-disk.d.ts +37 -0
- package/dist/store/run/token-budget-disk.d.ts.map +1 -0
- package/dist/store/run/token-budget-disk.js +208 -0
- package/dist/store/run/token-budget-disk.js.map +1 -0
- package/dist/store/session/disk.d.ts +4 -13
- package/dist/store/session/disk.d.ts.map +1 -1
- package/dist/store/session/disk.js +34 -31
- package/dist/store/session/disk.js.map +1 -1
- package/dist/store/session/memory.d.ts +2 -0
- package/dist/store/session/memory.d.ts.map +1 -1
- package/dist/store/session/memory.js +41 -2
- package/dist/store/session/memory.js.map +1 -1
- package/dist/store/task/disk.d.ts.map +1 -1
- package/dist/store/task/disk.js +7 -8
- package/dist/store/task/disk.js.map +1 -1
- package/dist/store/topic/memory.d.ts +2 -0
- package/dist/store/topic/memory.d.ts.map +1 -1
- package/dist/store/topic/memory.js +13 -1
- package/dist/store/topic/memory.js.map +1 -1
- package/dist/test-support/ids.d.ts +4 -19
- package/dist/test-support/ids.d.ts.map +1 -1
- package/dist/test-support/ids.js +51 -59
- package/dist/test-support/ids.js.map +1 -1
- package/dist/tools/advisory/index.d.ts.map +1 -1
- package/dist/tools/advisory/index.js +3 -1
- package/dist/tools/advisory/index.js.map +1 -1
- package/dist/tools/builtins/bash.d.ts +2 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +224 -70
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/computer-use.d.ts +2 -2
- package/dist/tools/builtins/computer-use.d.ts.map +1 -1
- package/dist/tools/builtins/computer-use.js +4 -2
- package/dist/tools/builtins/computer-use.js.map +1 -1
- package/dist/tools/builtins/edit.js +2 -2
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/glob.d.ts +2 -1
- package/dist/tools/builtins/glob.d.ts.map +1 -1
- package/dist/tools/builtins/glob.js +95 -103
- package/dist/tools/builtins/glob.js.map +1 -1
- package/dist/tools/builtins/grep.d.ts.map +1 -1
- package/dist/tools/builtins/grep.js +155 -111
- package/dist/tools/builtins/grep.js.map +1 -1
- package/dist/tools/builtins/ls.js +4 -4
- package/dist/tools/builtins/ls.js.map +1 -1
- package/dist/tools/builtins/lsp.js +2 -2
- package/dist/tools/builtins/lsp.js.map +1 -1
- package/dist/tools/builtins/read-file.js +2 -2
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/builtins/write-file.js +2 -2
- package/dist/tools/builtins/write-file.js.map +1 -1
- package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
- package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
- package/dist/tools/coordinator/ask-user-question.js +237 -0
- package/dist/tools/coordinator/ask-user-question.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +1 -2
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +4 -220
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/memory/read.d.ts.map +1 -1
- package/dist/tools/memory/read.js +2 -4
- package/dist/tools/memory/read.js.map +1 -1
- package/dist/tools/paths.d.ts +13 -0
- package/dist/tools/paths.d.ts.map +1 -1
- package/dist/tools/paths.js +53 -0
- package/dist/tools/paths.js.map +1 -1
- package/dist/tools/roster.d.ts +27 -0
- package/dist/tools/roster.d.ts.map +1 -0
- package/dist/tools/roster.js +42 -0
- package/dist/tools/roster.js.map +1 -0
- package/dist/types/agent/base.d.ts +5 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/pipeline.d.ts +3 -0
- package/dist/types/agent/pipeline.d.ts.map +1 -1
- package/dist/types/agent/router.d.ts +2 -3
- package/dist/types/agent/router.d.ts.map +1 -1
- package/dist/types/agent/scheduler.d.ts +3 -0
- package/dist/types/agent/scheduler.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +5 -16
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/agent/task.js.map +1 -1
- package/dist/types/common/index.d.ts.map +1 -1
- package/dist/types/common/index.js +3 -0
- package/dist/types/common/index.js.map +1 -1
- package/dist/types/computer-use/index.d.ts +8 -0
- package/dist/types/computer-use/index.d.ts.map +1 -1
- package/dist/types/computer-use/index.js.map +1 -1
- package/dist/types/hitl/index.d.ts +5 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/ids/brand.d.ts +5 -47
- package/dist/types/ids/brand.d.ts.map +1 -1
- package/dist/types/ids/brand.js +2 -39
- package/dist/types/ids/brand.js.map +1 -1
- package/dist/types/ids/index.d.ts +59 -69
- package/dist/types/ids/index.d.ts.map +1 -1
- package/dist/types/ids/index.js +12 -10
- package/dist/types/ids/index.js.map +1 -1
- package/dist/types/permission/index.d.ts +9 -0
- package/dist/types/permission/index.d.ts.map +1 -1
- package/dist/types/permission/index.js +9 -1
- package/dist/types/permission/index.js.map +1 -1
- package/dist/types/plugin/index.d.ts +45 -4
- package/dist/types/plugin/index.d.ts.map +1 -1
- package/dist/types/plugin/index.js +7 -0
- package/dist/types/plugin/index.js.map +1 -1
- package/dist/types/run/config.d.ts +3 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/emergency.d.ts +5 -0
- package/dist/types/run/emergency.d.ts.map +1 -1
- package/dist/types/run/emergency.js.map +1 -1
- package/dist/types/run/entity.d.ts +6 -2
- package/dist/types/run/entity.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +35 -0
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/index.d.ts +1 -0
- package/dist/types/run/index.d.ts.map +1 -1
- package/dist/types/run/index.js +1 -0
- package/dist/types/run/index.js.map +1 -1
- package/dist/types/run/state.d.ts +16 -15
- package/dist/types/run/state.d.ts.map +1 -1
- package/dist/types/run/state.js +41 -22
- package/dist/types/run/state.js.map +1 -1
- package/dist/types/run/stop-reason.d.ts +3 -14
- package/dist/types/run/stop-reason.d.ts.map +1 -1
- package/dist/types/run/token-budget-store.d.ts +29 -0
- package/dist/types/run/token-budget-store.d.ts.map +1 -0
- package/dist/types/run/token-budget-store.js +25 -0
- package/dist/types/run/token-budget-store.js.map +1 -0
- package/dist/types/sandbox/index.d.ts +47 -2
- package/dist/types/sandbox/index.d.ts.map +1 -1
- package/dist/types/sandbox/index.js.map +1 -1
- package/dist/types/session/store.d.ts +8 -0
- package/dist/types/session/store.d.ts.map +1 -1
- package/dist/types/tool/index.d.ts +15 -0
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +1 -1
- package/dist/utils/frontmatter.js +1 -1
- package/dist/utils/id-format.d.ts +3 -0
- package/dist/utils/id-format.d.ts.map +1 -0
- package/dist/utils/id-format.js +9 -0
- package/dist/utils/id-format.js.map +1 -0
- package/dist/utils/id.d.ts +65 -32
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +168 -148
- package/dist/utils/id.js.map +1 -1
- package/dist/utils/log/exception.js +1 -1
- package/dist/utils/log/exception.js.map +1 -1
- package/dist/utils/log/index.d.ts.map +1 -1
- package/dist/utils/log/index.js +1 -2
- package/dist/utils/log/index.js.map +1 -1
- package/dist/utils/log/templates.d.ts.map +1 -1
- package/dist/utils/log/templates.js +0 -1
- package/dist/utils/log/templates.js.map +1 -1
- package/package.json +6 -1
- package/src/agents/AGENTS.md +1 -1
- package/src/agents/PipelineAgent.ts +129 -109
- package/src/agents/ReactiveAgent.ts +2 -0
- package/src/agents/RouterAgent.ts +120 -73
- package/src/agents/SupervisorAgent.ts +12 -4
- package/src/agents/budget.ts +42 -0
- package/src/agents/explore.ts +29 -0
- package/src/agents/file-definitions.ts +237 -0
- package/src/agents/index.ts +15 -0
- package/src/bridge/a2a/mapper.ts +6 -0
- package/src/bridge/sse/mapper.ts +22 -0
- package/src/bus/lock.ts +1 -10
- package/src/compaction/consolidation.ts +79 -0
- package/src/compaction/factory.ts +3 -0
- package/src/compaction/index.ts +34 -4
- package/src/compaction/manager.ts +39 -1
- package/src/compaction/plan.ts +52 -21
- package/src/compaction/salience/bm25.ts +72 -0
- package/src/compaction/salience/goal.ts +44 -0
- package/src/compaction/salience/index.ts +19 -0
- package/src/compaction/salience/minhash.ts +53 -0
- package/src/compaction/salience/score.ts +305 -0
- package/src/compaction/salience/tokenize.ts +89 -0
- package/src/compaction/salience/working-set.ts +187 -0
- package/src/compaction/serializer.ts +16 -0
- package/src/compaction/token-estimate.ts +57 -0
- package/src/compaction/tool-result-editing.ts +28 -26
- package/src/compaction/types.ts +24 -1
- package/src/compaction/wire.ts +5 -1
- package/src/config/runtime.ts +13 -1
- package/src/connector/builtins/http.ts +2 -8
- package/src/connector/builtins/webhook.ts +2 -2
- package/src/connector/mcp/adapter.ts +32 -0
- package/src/connector/tools/adapter.ts +2 -2
- package/src/connector/tools/definitions.ts +2 -2
- package/src/constants/compaction/index.ts +1 -0
- package/src/constants/telemetry/index.ts +0 -1
- package/src/contracts/api.ts +5 -1
- package/src/contracts/schemas.ts +6 -20
- package/src/invariants/index.ts +1 -1
- package/src/manager/agent/lifecycle.ts +380 -352
- package/src/manager/run/persistence.ts +35 -5
- package/src/plugin/index.ts +19 -0
- package/src/plugin/shell-hook.ts +403 -0
- package/src/prompt/coding-agent-doctrine.ts +118 -0
- package/src/prompt/index.ts +8 -0
- package/src/provider/errors.ts +1 -1
- package/src/provider/fallback.ts +4 -1
- package/src/provider/retry.ts +4 -1
- package/src/provider/token-budget.ts +158 -0
- package/src/public-runtime.ts +56 -28
- package/src/public-tools.ts +5 -0
- package/src/public-types.ts +65 -0
- package/src/registry/command/kernel-commands.ts +16 -6
- package/src/registry/tool/execute.ts +4 -1
- package/src/run/LimitChecker.ts +1 -1
- package/src/run/drain.ts +1 -1
- package/src/run/reporter.ts +15 -0
- package/src/run/token-budget.ts +692 -0
- package/src/runtime/jobs/registry.ts +123 -17
- package/src/runtime/query/checkpoint.ts +10 -3
- package/src/runtime/query/context.ts +3 -57
- package/src/runtime/query/executor.ts +181 -71
- package/src/runtime/query/guard.ts +8 -0
- package/src/runtime/query/index.ts +209 -62
- package/src/runtime/query/iteration/index.ts +53 -15
- package/src/runtime/query/iteration/phases/compaction.ts +130 -31
- package/src/runtime/query/iteration/phases/context.ts +4 -0
- package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
- package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
- package/src/runtime/query/iteration/stream-turn.ts +9 -5
- package/src/runtime/query/plugin-hooks.ts +24 -2
- package/src/runtime/query/prompt.ts +21 -4
- package/src/runtime/query/repeat-call.ts +42 -7
- package/src/runtime/query/result.ts +9 -0
- package/src/runtime/query/review-policy.ts +231 -0
- package/src/runtime/query/run-state.ts +4 -0
- package/src/runtime/query/steering.ts +32 -0
- package/src/runtime/query/token-budget.ts +127 -0
- package/src/runtime/query/tool-output-budget.ts +33 -10
- package/src/runtime/query/tool-pause.ts +4 -2
- package/src/runtime/query/tooling.ts +8 -0
- package/src/sandbox/file-walk-program.ts +93 -0
- package/src/sandbox/file-walk.ts +463 -0
- package/src/sandbox/index.ts +2 -0
- package/src/sandbox/provider/local.ts +136 -13
- package/src/scheduler/completion-inbox.ts +29 -19
- package/src/scheduler/delegating.ts +35 -13
- package/src/scheduler/local.ts +5 -7
- package/src/session/index.ts +0 -1
- package/src/session/workspace/path-builder.ts +5 -4
- package/src/store/feedback/disk.ts +4 -6
- package/src/store/index.ts +2 -0
- package/src/store/memory/disk.ts +3 -11
- package/src/store/run/checkpoint-disk.ts +14 -27
- package/src/store/run/claim-disk.ts +1 -1
- package/src/store/run/conformance.ts +55 -39
- package/src/store/run/disk.ts +19 -4
- package/src/store/run/token-budget-disk.ts +247 -0
- package/src/store/session/disk.ts +36 -29
- package/src/store/session/memory.ts +38 -1
- package/src/store/task/disk.ts +7 -8
- package/src/store/topic/memory.ts +13 -1
- package/src/test-support/ids.ts +62 -59
- package/src/tools/advisory/index.ts +3 -1
- package/src/tools/builtins/bash.ts +241 -70
- package/src/tools/builtins/computer-use.ts +6 -2
- package/src/tools/builtins/edit.ts +2 -2
- package/src/tools/builtins/glob.ts +104 -122
- package/src/tools/builtins/grep.ts +166 -132
- package/src/tools/builtins/ls.ts +4 -4
- package/src/tools/builtins/lsp.ts +2 -2
- package/src/tools/builtins/read-file.ts +2 -2
- package/src/tools/builtins/write-file.ts +2 -2
- package/src/tools/coordinator/ask-user-question.ts +284 -0
- package/src/tools/coordinator/index.ts +5 -248
- package/src/tools/memory/read.ts +2 -4
- package/src/tools/paths.ts +64 -0
- package/src/tools/roster.ts +46 -0
- package/src/types/agent/base.ts +6 -0
- package/src/types/agent/pipeline.ts +3 -0
- package/src/types/agent/router.ts +2 -3
- package/src/types/agent/scheduler.ts +4 -0
- package/src/types/agent/task.ts +5 -18
- package/src/types/common/index.ts +3 -0
- package/src/types/computer-use/index.ts +8 -0
- package/src/types/hitl/index.ts +5 -0
- package/src/types/ids/brand.ts +5 -48
- package/src/types/ids/index.ts +66 -75
- package/src/types/permission/index.ts +11 -0
- package/src/types/plugin/index.ts +49 -1
- package/src/types/run/config.ts +3 -0
- package/src/types/run/emergency.ts +5 -0
- package/src/types/run/entity.ts +6 -2
- package/src/types/run/events.ts +37 -0
- package/src/types/run/index.ts +1 -0
- package/src/types/run/state.ts +58 -30
- package/src/types/run/stop-reason.ts +3 -14
- package/src/types/run/token-budget-store.ts +54 -0
- package/src/types/sandbox/index.ts +53 -0
- package/src/types/session/store.ts +8 -0
- package/src/types/tool/index.ts +15 -0
- package/src/utils/frontmatter.ts +1 -1
- package/src/utils/id-format.ts +9 -0
- package/src/utils/id.ts +222 -181
- package/src/utils/log/exception.ts +1 -1
- package/src/utils/log/index.ts +1 -2
- package/src/utils/log/templates.ts +0 -1
- package/dist/session/migration/errors.d.ts +0 -26
- package/dist/session/migration/errors.d.ts.map +0 -1
- package/dist/session/migration/errors.js +0 -22
- package/dist/session/migration/errors.js.map +0 -1
- package/dist/session/migration/filesystem.d.ts +0 -122
- package/dist/session/migration/filesystem.d.ts.map +0 -1
- package/dist/session/migration/filesystem.js +0 -379
- package/dist/session/migration/filesystem.js.map +0 -1
- package/dist/session/migration/id-prefix.d.ts +0 -113
- package/dist/session/migration/id-prefix.d.ts.map +0 -1
- package/dist/session/migration/id-prefix.js +0 -132
- package/dist/session/migration/id-prefix.js.map +0 -1
- package/dist/session/migration/index.d.ts +0 -12
- package/dist/session/migration/index.d.ts.map +0 -1
- package/dist/session/migration/index.js +0 -12
- package/dist/session/migration/index.js.map +0 -1
- package/dist/session/migration/marker.d.ts +0 -57
- package/dist/session/migration/marker.d.ts.map +0 -1
- package/dist/session/migration/marker.js +0 -123
- package/dist/session/migration/marker.js.map +0 -1
- package/src/session/migration/errors.ts +0 -23
- package/src/session/migration/filesystem.ts +0 -468
- package/src/session/migration/id-prefix.ts +0 -166
- package/src/session/migration/index.ts +0 -41
- package/src/session/migration/marker.ts +0 -142
|
@@ -25,19 +25,22 @@ import {
|
|
|
25
25
|
// registry needs the same one, and a near-copy would reproduce in the copy
|
|
26
26
|
// every bug the original's comment was written to record.
|
|
27
27
|
import { killTree } from '../../process/kill-tree.js'
|
|
28
|
-
import {
|
|
28
|
+
import { resolveWithinAny, resolveWithinAnyReal } from '../../tools/paths.js'
|
|
29
29
|
import type { SandboxId } from '../../types/ids/index.js'
|
|
30
30
|
import type {
|
|
31
31
|
Sandbox,
|
|
32
32
|
SandboxCreateConfig,
|
|
33
33
|
SandboxDestroyOptions,
|
|
34
|
+
SandboxDetachedProcess,
|
|
34
35
|
SandboxEnvironment,
|
|
35
36
|
SandboxExecOptions,
|
|
36
37
|
SandboxExecResult,
|
|
37
38
|
SandboxFileEntry,
|
|
38
39
|
SandboxIsolationControl,
|
|
39
40
|
SandboxProvider,
|
|
41
|
+
SandboxSpawnOptions,
|
|
40
42
|
SandboxStatus,
|
|
43
|
+
SandboxWalkFilesOptions,
|
|
41
44
|
} from '../../types/sandbox/index.js'
|
|
42
45
|
import { subscribeToAbort } from '../../utils/abort.js'
|
|
43
46
|
import { generateSandboxId } from '../../utils/id.js'
|
|
@@ -47,6 +50,7 @@ import {
|
|
|
47
50
|
applyEnvironmentOverrides,
|
|
48
51
|
pickEnvironmentEntries,
|
|
49
52
|
} from '../../utils/process-environment.js'
|
|
53
|
+
import { walkFilesLocally } from '../file-walk.js'
|
|
50
54
|
import { assertIsolation, describeIsolation } from '../isolation.js'
|
|
51
55
|
import type { PtyLoader } from '../terminal.js'
|
|
52
56
|
|
|
@@ -208,6 +212,8 @@ export interface LimitedSpawnRequest {
|
|
|
208
212
|
readonly command: string
|
|
209
213
|
readonly args: readonly string[]
|
|
210
214
|
readonly rootDir: string
|
|
215
|
+
/** Bound read-write beside the root; see `SandboxCreateConfig.additionalDirectories`. */
|
|
216
|
+
readonly additionalDirectories?: readonly string[]
|
|
211
217
|
readonly memoryLimitMb?: number
|
|
212
218
|
readonly maxProcesses?: number
|
|
213
219
|
}
|
|
@@ -265,7 +271,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
|
|
|
265
271
|
case 'linux-bwrap':
|
|
266
272
|
return {
|
|
267
273
|
spawnCommand: requiredWrapper(request),
|
|
268
|
-
spawnArgs: [...buildBwrapArgs(rootDir), '--', ...inner],
|
|
274
|
+
spawnArgs: [...buildBwrapArgs(rootDir, request.additionalDirectories), '--', ...inner],
|
|
269
275
|
}
|
|
270
276
|
|
|
271
277
|
case 'linux-namespace':
|
|
@@ -277,7 +283,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
|
|
|
277
283
|
case 'macos-seatbelt':
|
|
278
284
|
return {
|
|
279
285
|
spawnCommand: requiredWrapper(request),
|
|
280
|
-
spawnArgs: [...buildSeatbeltArgs(rootDir), '--', ...inner],
|
|
286
|
+
spawnArgs: [...buildSeatbeltArgs(rootDir, request.additionalDirectories), '--', ...inner],
|
|
281
287
|
}
|
|
282
288
|
|
|
283
289
|
case 'basic': {
|
|
@@ -375,7 +381,10 @@ function canonicalizePath(p: string): string {
|
|
|
375
381
|
* process table through them — a bound `/proc` would hand back the process
|
|
376
382
|
* isolation the same flag just removed.
|
|
377
383
|
*/
|
|
378
|
-
export function buildBwrapArgs(
|
|
384
|
+
export function buildBwrapArgs(
|
|
385
|
+
sandboxRoot: string,
|
|
386
|
+
additionalDirectories: readonly string[] = [],
|
|
387
|
+
): string[] {
|
|
379
388
|
const root = canonicalizePath(sandboxRoot)
|
|
380
389
|
|
|
381
390
|
const args = [
|
|
@@ -426,9 +435,15 @@ export function buildBwrapArgs(sandboxRoot: string): string[] {
|
|
|
426
435
|
'--bind',
|
|
427
436
|
root,
|
|
428
437
|
root,
|
|
429
|
-
'--chdir',
|
|
430
|
-
root,
|
|
431
438
|
)
|
|
439
|
+
// The host's added directories, read-write at their own paths, so a
|
|
440
|
+
// path the model was given on the host means the same thing inside.
|
|
441
|
+
for (const dir of additionalDirectories) {
|
|
442
|
+
const canonical = canonicalizePath(dir)
|
|
443
|
+
if (canonical === root) continue
|
|
444
|
+
args.push('--bind', canonical, canonical)
|
|
445
|
+
}
|
|
446
|
+
args.push('--chdir', root)
|
|
432
447
|
|
|
433
448
|
return args
|
|
434
449
|
}
|
|
@@ -450,10 +465,21 @@ const BWRAP_SYSTEM_PATHS: readonly string[] = [
|
|
|
450
465
|
'/opt',
|
|
451
466
|
]
|
|
452
467
|
|
|
453
|
-
function
|
|
468
|
+
function seatbeltString(value: string): string {
|
|
469
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
function buildSeatbeltProfile(additionalDirectories: readonly string[] = []): string {
|
|
454
473
|
return [
|
|
455
474
|
'(version 1)',
|
|
456
475
|
'(deny default)',
|
|
476
|
+
// The host's added directories, read-write, by the same contract as
|
|
477
|
+
// the root. Literal paths rather than params: sandbox-exec takes one
|
|
478
|
+
// -D per name and the count here is the operator's.
|
|
479
|
+
...additionalDirectories.flatMap((dir) => [
|
|
480
|
+
`(allow file-read* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
|
|
481
|
+
`(allow file-write* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
|
|
482
|
+
]),
|
|
457
483
|
|
|
458
484
|
// --- Process lifecycle ---
|
|
459
485
|
'(allow process-exec)',
|
|
@@ -538,8 +564,15 @@ function buildSeatbeltProfile(): string {
|
|
|
538
564
|
* remain path bytes instead of becoming policy syntax. This is the same
|
|
539
565
|
* parameter boundary used by Codex's seatbelt builder.
|
|
540
566
|
*/
|
|
541
|
-
function buildSeatbeltArgs(
|
|
542
|
-
|
|
567
|
+
function buildSeatbeltArgs(
|
|
568
|
+
sandboxRoot: string,
|
|
569
|
+
additionalDirectories: readonly string[] = [],
|
|
570
|
+
): string[] {
|
|
571
|
+
return [
|
|
572
|
+
'-p',
|
|
573
|
+
buildSeatbeltProfile(additionalDirectories),
|
|
574
|
+
`-DNAMZU_SANDBOX_ROOT=${canonicalizePath(sandboxRoot)}`,
|
|
575
|
+
]
|
|
543
576
|
}
|
|
544
577
|
|
|
545
578
|
// ---------------------------------------------------------------------------
|
|
@@ -595,6 +628,12 @@ class LocalSandbox implements Sandbox {
|
|
|
595
628
|
private _status: SandboxStatus
|
|
596
629
|
private readonly config: SandboxCreateConfig
|
|
597
630
|
private readonly log: Logger
|
|
631
|
+
/** The host's added directories, canonical; bound beside the root. */
|
|
632
|
+
private readonly additionalDirectories: readonly string[]
|
|
633
|
+
/** Where this sandbox's own file API may reach: the root, then the added directories. */
|
|
634
|
+
private get roots(): readonly string[] {
|
|
635
|
+
return [this.rootDir, ...this.additionalDirectories]
|
|
636
|
+
}
|
|
598
637
|
|
|
599
638
|
get status(): SandboxStatus {
|
|
600
639
|
return this._status
|
|
@@ -613,6 +652,9 @@ class LocalSandbox implements Sandbox {
|
|
|
613
652
|
this.rootDir = rootDir
|
|
614
653
|
this.environment = environment
|
|
615
654
|
this.config = config
|
|
655
|
+
this.additionalDirectories = (config.additionalDirectories ?? [])
|
|
656
|
+
.map((dir) => canonicalizePath(resolve(dir)))
|
|
657
|
+
.filter((dir) => dir !== rootDir)
|
|
616
658
|
this._status = 'ready'
|
|
617
659
|
this.log = log.child({
|
|
618
660
|
[SCOPE_ATTRIBUTE]: 'sandbox/provider/local',
|
|
@@ -640,7 +682,7 @@ class LocalSandbox implements Sandbox {
|
|
|
640
682
|
const env = buildSafeEnv(this.config.env, opts?.env)
|
|
641
683
|
const timeout = opts?.timeout ?? this.config.timeoutMs ?? SANDBOX_DEFAULT_TIMEOUT_MS
|
|
642
684
|
|
|
643
|
-
const cwd = opts?.cwd ? await
|
|
685
|
+
const cwd = opts?.cwd ? await resolveWithinAnyReal(this.roots, opts.cwd) : this.rootDir
|
|
644
686
|
|
|
645
687
|
const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(
|
|
646
688
|
command,
|
|
@@ -689,7 +731,7 @@ class LocalSandbox implements Sandbox {
|
|
|
689
731
|
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
690
732
|
}
|
|
691
733
|
|
|
692
|
-
const resolved = await
|
|
734
|
+
const resolved = await resolveWithinAnyReal(this.roots, path)
|
|
693
735
|
await mkdir(dirname(resolved), { recursive: true })
|
|
694
736
|
|
|
695
737
|
// Convention 8: Atomic write (write-tmp-rename)
|
|
@@ -705,7 +747,7 @@ class LocalSandbox implements Sandbox {
|
|
|
705
747
|
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
706
748
|
}
|
|
707
749
|
|
|
708
|
-
const resolved = await
|
|
750
|
+
const resolved = await resolveWithinAnyReal(this.roots, path)
|
|
709
751
|
return fsReadFile(resolved)
|
|
710
752
|
}
|
|
711
753
|
|
|
@@ -714,7 +756,7 @@ class LocalSandbox implements Sandbox {
|
|
|
714
756
|
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
715
757
|
}
|
|
716
758
|
|
|
717
|
-
const resolved = await
|
|
759
|
+
const resolved = await resolveWithinAnyReal(this.roots, rootPath)
|
|
718
760
|
const root = await stat(resolved).catch(() => null)
|
|
719
761
|
if (!root || !root.isDirectory()) return []
|
|
720
762
|
|
|
@@ -739,6 +781,17 @@ class LocalSandbox implements Sandbox {
|
|
|
739
781
|
return entries
|
|
740
782
|
}
|
|
741
783
|
|
|
784
|
+
async *walkFiles(
|
|
785
|
+
rootPath: string,
|
|
786
|
+
options: SandboxWalkFilesOptions,
|
|
787
|
+
): AsyncGenerator<SandboxFileEntry> {
|
|
788
|
+
if (this._status === 'destroyed') throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
789
|
+
options.signal?.throwIfAborted()
|
|
790
|
+
const resolved = await resolveWithinAnyReal(this.roots, rootPath)
|
|
791
|
+
options.signal?.throwIfAborted()
|
|
792
|
+
yield* walkFilesLocally(resolved, options)
|
|
793
|
+
}
|
|
794
|
+
|
|
742
795
|
async destroy(_options?: SandboxDestroyOptions): Promise<void> {
|
|
743
796
|
if (this._status === 'destroyed') {
|
|
744
797
|
return
|
|
@@ -759,6 +812,67 @@ class LocalSandbox implements Sandbox {
|
|
|
759
812
|
// Private helpers
|
|
760
813
|
// -----------------------------------------------------------------------
|
|
761
814
|
|
|
815
|
+
spawnDetached(
|
|
816
|
+
command: string,
|
|
817
|
+
args: readonly string[] = [],
|
|
818
|
+
opts?: SandboxSpawnOptions,
|
|
819
|
+
): SandboxDetachedProcess {
|
|
820
|
+
if (this._status === 'destroyed') {
|
|
821
|
+
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
822
|
+
}
|
|
823
|
+
// Lexical containment for the cwd: the caller does not wait, so
|
|
824
|
+
// neither does this. The mounts are the same ones `exec` uses.
|
|
825
|
+
const cwd = opts?.cwd ? resolveWithinAny(this.roots, opts.cwd) : this.rootDir
|
|
826
|
+
const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(command, [
|
|
827
|
+
...args,
|
|
828
|
+
])
|
|
829
|
+
const env = buildSafeEnv(this.config.env, opts?.env)
|
|
830
|
+
const child = spawn(spawnCommand, spawnArgs, {
|
|
831
|
+
cwd,
|
|
832
|
+
env,
|
|
833
|
+
stdio:
|
|
834
|
+
bwrapInfoFd === undefined
|
|
835
|
+
? ['ignore', 'pipe', 'pipe']
|
|
836
|
+
: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'],
|
|
837
|
+
detached: process.platform !== 'win32',
|
|
838
|
+
})
|
|
839
|
+
let bwrapChildPid: number | undefined
|
|
840
|
+
let requested: NodeJS.Signals | undefined
|
|
841
|
+
// Same dance as `exec`: bwrap's inner reaper is in its own session, so
|
|
842
|
+
// a kill has to reach it by the pid the info fd reports, and a kill
|
|
843
|
+
// asked for before that pid is known is delivered when it arrives.
|
|
844
|
+
const bwrapInfo = bwrapInfoFd === undefined ? undefined : child.stdio[bwrapInfoFd]
|
|
845
|
+
const bwrapBlock = bwrapBlockFd === undefined ? undefined : child.stdio[bwrapBlockFd]
|
|
846
|
+
let bwrapInfoBuffer = ''
|
|
847
|
+
bwrapInfo?.on('data', (chunk: Buffer) => {
|
|
848
|
+
if (bwrapChildPid !== undefined) return
|
|
849
|
+
bwrapInfoBuffer += chunk.toString('utf8')
|
|
850
|
+
const observed = readBwrapChildPid(bwrapInfoBuffer)
|
|
851
|
+
if (observed === undefined) return
|
|
852
|
+
bwrapChildPid = observed
|
|
853
|
+
if (requested !== undefined) {
|
|
854
|
+
killTree(child, 'SIGKILL')
|
|
855
|
+
killBwrapChild(bwrapChildPid, 'SIGKILL')
|
|
856
|
+
} else if (bwrapBlock !== undefined && bwrapBlock !== null && 'end' in bwrapBlock) {
|
|
857
|
+
bwrapBlock.end(Buffer.from([1]))
|
|
858
|
+
}
|
|
859
|
+
})
|
|
860
|
+
this.log.debug('Detached process started', {
|
|
861
|
+
'namzu.sandbox.command': command,
|
|
862
|
+
'namzu.sandbox.args': args,
|
|
863
|
+
'namzu.execution.environment': this.environment,
|
|
864
|
+
})
|
|
865
|
+
return {
|
|
866
|
+
child,
|
|
867
|
+
kill: (signal) => {
|
|
868
|
+
requested = signal
|
|
869
|
+
if (bwrapBlockFd !== undefined && bwrapChildPid === undefined) return
|
|
870
|
+
killTree(child, signal)
|
|
871
|
+
killBwrapChild(bwrapChildPid, signal)
|
|
872
|
+
},
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
762
876
|
private buildSpawnArgs(
|
|
763
877
|
command: string,
|
|
764
878
|
args: string[],
|
|
@@ -774,6 +888,9 @@ class LocalSandbox implements Sandbox {
|
|
|
774
888
|
command,
|
|
775
889
|
args,
|
|
776
890
|
rootDir: this.rootDir,
|
|
891
|
+
...(this.additionalDirectories.length > 0
|
|
892
|
+
? { additionalDirectories: this.additionalDirectories }
|
|
893
|
+
: {}),
|
|
777
894
|
...(this.config.memoryLimitMb !== undefined
|
|
778
895
|
? { memoryLimitMb: this.config.memoryLimitMb }
|
|
779
896
|
: {}),
|
|
@@ -1051,6 +1168,12 @@ export class LocalSandboxProvider implements SandboxProvider {
|
|
|
1051
1168
|
)
|
|
1052
1169
|
}
|
|
1053
1170
|
removeRootOnDestroy = false
|
|
1171
|
+
for (const dir of config.additionalDirectories ?? []) {
|
|
1172
|
+
const entry = await stat(resolve(dir)).catch(() => null)
|
|
1173
|
+
if (!entry?.isDirectory()) {
|
|
1174
|
+
throw new Error(`Sandbox additional directory is not a directory: ${resolve(dir)}`)
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1054
1177
|
} else {
|
|
1055
1178
|
// No workspace was named: this allocation owns a fresh temporary root.
|
|
1056
1179
|
const { mkdtemp } = await import('node:fs/promises')
|
|
@@ -231,38 +231,33 @@ export class CompletionInbox {
|
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
/**
|
|
234
|
-
* Wait for the next completion, or
|
|
234
|
+
* Wait for the next completion, deadline or abort, whichever comes first.
|
|
235
|
+
* Aborting releases only this waiter; work and undelivered results remain owned.
|
|
235
236
|
*
|
|
236
237
|
* Bounded on purpose. A worker that never finishes must not hold a run
|
|
237
238
|
* open forever, and the caller decides how long "long enough" is — the
|
|
238
239
|
* run's own budget is the only thing that knows.
|
|
239
240
|
*/
|
|
240
|
-
waitForArrival(timeoutMs: number): Promise<void> {
|
|
241
|
+
waitForArrival(timeoutMs: number, signal?: AbortSignal): Promise<void> {
|
|
242
|
+
if (signal?.aborted) return Promise.resolve()
|
|
241
243
|
if (this.unheard.size > 0) return Promise.resolve()
|
|
242
244
|
if (this.outstanding.size === 0) return Promise.resolve()
|
|
243
245
|
|
|
244
246
|
return new Promise((resolve) => {
|
|
247
|
+
const finish = (): void => {
|
|
248
|
+
clearTimeout(timer)
|
|
249
|
+
this.arrivals.delete(finish)
|
|
250
|
+
signal?.removeEventListener('abort', finish)
|
|
251
|
+
resolve()
|
|
252
|
+
}
|
|
245
253
|
const timer = setTimeout(finish, timeoutMs)
|
|
246
254
|
// `unref` where the runtime has it, so a pending wait never keeps
|
|
247
255
|
// a process alive past the work it was waiting for.
|
|
248
256
|
;(timer as { unref?: () => void }).unref?.()
|
|
249
257
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
resolve()
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const wake = Object.assign(
|
|
257
|
-
() => {
|
|
258
|
-
if (!wake.done) {
|
|
259
|
-
this.arrivals.delete(wake)
|
|
260
|
-
finish()
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
{ done: false },
|
|
264
|
-
)
|
|
265
|
-
this.arrivals.add(wake)
|
|
258
|
+
this.arrivals.add(finish)
|
|
259
|
+
signal?.addEventListener('abort', finish, { once: true })
|
|
260
|
+
if (signal?.aborted) finish()
|
|
266
261
|
})
|
|
267
262
|
}
|
|
268
263
|
|
|
@@ -423,7 +418,21 @@ function neutralizeNotificationDelimiter(content: string): string {
|
|
|
423
418
|
export function formatCompletionNotification(handles: readonly TaskHandle[]): string {
|
|
424
419
|
const blocks = handles.map((handle) => {
|
|
425
420
|
const durationMs = handle.completedAt ? handle.completedAt - handle.createdAt : undefined
|
|
426
|
-
const
|
|
421
|
+
const run = handle.result
|
|
422
|
+
let output = run?.result || run?.lastError || ''
|
|
423
|
+
// A hard guard can stop immediately after a tool round, before the result
|
|
424
|
+
// assembler has a final answer. Preserve visible partial prose, never reasoning.
|
|
425
|
+
if (!output && run?.stopReason && run.stopReason !== 'end_turn') {
|
|
426
|
+
const partial = [...(run.messages ?? [])]
|
|
427
|
+
.reverse()
|
|
428
|
+
.find(
|
|
429
|
+
(message) =>
|
|
430
|
+
message.role === 'assistant' &&
|
|
431
|
+
typeof message.content === 'string' &&
|
|
432
|
+
message.content.length > 0,
|
|
433
|
+
)
|
|
434
|
+
if (partial) output = `Partial output before ${run.stopReason}:\n${partial.content}`
|
|
435
|
+
}
|
|
427
436
|
const overLimit = output.length > NOTIFICATION_OUTPUT_LIMIT
|
|
428
437
|
const shown = overLimit ? output.slice(0, NOTIFICATION_OUTPUT_LIMIT) : output
|
|
429
438
|
|
|
@@ -455,6 +464,7 @@ export function formatCompletionNotification(handles: readonly TaskHandle[]): st
|
|
|
455
464
|
`task_id: ${handle.taskId}`,
|
|
456
465
|
`agent: ${handle.agentId}`,
|
|
457
466
|
`state: ${handle.state}`,
|
|
467
|
+
...(handle.result?.stopReason ? [`stop_reason: ${handle.result.stopReason}`] : []),
|
|
458
468
|
...(durationMs !== undefined ? [`duration_ms: ${durationMs}`] : []),
|
|
459
469
|
'',
|
|
460
470
|
body,
|
|
@@ -3,9 +3,9 @@ import type { Delegate, DelegateRequest, DelegateResult } from '../types/agent/d
|
|
|
3
3
|
import type { CreateTaskOptions, TaskHandle, TaskScheduler } from '../types/agent/scheduler.js'
|
|
4
4
|
import type { AgentTaskState } from '../types/agent/task.js'
|
|
5
5
|
import type { RunExecutionStatus } from '../types/common/index.js'
|
|
6
|
-
import type { TaskId } from '../types/ids/index.js'
|
|
6
|
+
import type { RunId, TaskId } from '../types/ids/index.js'
|
|
7
7
|
import { type CancelCause, RunCancelled } from '../types/run/cancel-cause.js'
|
|
8
|
-
import {
|
|
8
|
+
import { generateRunId, generateTaskId } from '../utils/id.js'
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Presents a set of foreign delegates as a `TaskScheduler`.
|
|
@@ -113,6 +113,7 @@ const OUTCOME: Record<
|
|
|
113
113
|
|
|
114
114
|
interface Entry {
|
|
115
115
|
handle: TaskHandle
|
|
116
|
+
runId: RunId
|
|
116
117
|
delegate: Delegate
|
|
117
118
|
controller: AbortController
|
|
118
119
|
settled: Promise<void>
|
|
@@ -135,7 +136,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
135
136
|
// Checked at registration, not at the call. A capability that
|
|
136
137
|
// claims a method the object does not have is a lie the caller
|
|
137
138
|
// would otherwise find mid-delegation, with a worker running.
|
|
138
|
-
throw new DelegateCapabilityMismatchError({
|
|
139
|
+
throw new DelegateCapabilityMismatchError({
|
|
140
|
+
id: delegate.id,
|
|
141
|
+
capability: 'continue',
|
|
142
|
+
})
|
|
139
143
|
}
|
|
140
144
|
this.byId.set(delegate.id, delegate)
|
|
141
145
|
}
|
|
@@ -146,6 +150,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
146
150
|
return this.byId.get(agentId)
|
|
147
151
|
}
|
|
148
152
|
|
|
153
|
+
get budget() {
|
|
154
|
+
return this.config.local?.budget
|
|
155
|
+
}
|
|
156
|
+
|
|
149
157
|
async createTask(options: CreateTaskOptions): Promise<TaskHandle> {
|
|
150
158
|
const delegate = this.byId.get(options.agentId)
|
|
151
159
|
if (!delegate) {
|
|
@@ -153,6 +161,12 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
153
161
|
return await this.config.local.createTask(options)
|
|
154
162
|
}
|
|
155
163
|
|
|
164
|
+
if (this.budget) {
|
|
165
|
+
throw new Error(
|
|
166
|
+
'Foreign delegates cannot run under a shared token budget without a metering contract',
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
|
|
156
170
|
const taskId = generateTaskId()
|
|
157
171
|
const controller = new AbortController()
|
|
158
172
|
const request: DelegateRequest = {
|
|
@@ -163,6 +177,7 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
163
177
|
}
|
|
164
178
|
|
|
165
179
|
const entry: Entry = {
|
|
180
|
+
runId: generateRunId(),
|
|
166
181
|
handle: {
|
|
167
182
|
taskId,
|
|
168
183
|
agentId: options.agentId,
|
|
@@ -178,7 +193,9 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
178
193
|
entry.settled = (async () => {
|
|
179
194
|
let result: DelegateResult
|
|
180
195
|
try {
|
|
181
|
-
result = await delegate.dispatch(request, {
|
|
196
|
+
result = await delegate.dispatch(request, {
|
|
197
|
+
signal: controller.signal,
|
|
198
|
+
})
|
|
182
199
|
} catch (err) {
|
|
183
200
|
// A delegate that threw failed; it did not vanish. Leaving the
|
|
184
201
|
// handle `running` would have `waitForTask` hang forever on a
|
|
@@ -188,25 +205,24 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
188
205
|
error: err instanceof Error ? err.message : String(err),
|
|
189
206
|
}
|
|
190
207
|
}
|
|
191
|
-
entry.handle = this.settle(entry.handle, result)
|
|
208
|
+
entry.handle = this.settle(entry.handle, entry.runId, result)
|
|
192
209
|
for (const listener of this.listeners) listener(entry.handle)
|
|
193
210
|
})()
|
|
194
211
|
|
|
195
212
|
return entry.handle
|
|
196
213
|
}
|
|
197
214
|
|
|
198
|
-
private settle(handle: TaskHandle, result: DelegateResult): TaskHandle {
|
|
215
|
+
private settle(handle: TaskHandle, runId: RunId, result: DelegateResult): TaskHandle {
|
|
199
216
|
const outcome = OUTCOME[result.status]
|
|
200
217
|
return {
|
|
201
218
|
...handle,
|
|
202
219
|
state: outcome.state,
|
|
203
220
|
completedAt: Date.now(),
|
|
204
221
|
result: {
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
runId: asRunId(`run_delegate_${handle.taskId}`),
|
|
222
|
+
// Identity of this dispatch, allocated once with its task. The
|
|
223
|
+
// scheduler owns the correlation; the ID's spelling carries none.
|
|
224
|
+
// A foreign dispatch does not imply a local resumable checkpoint.
|
|
225
|
+
runId,
|
|
210
226
|
status: outcome.status,
|
|
211
227
|
// Zero, and honestly so: this kernel did not spend these tokens
|
|
212
228
|
// and has no way to learn what the delegate spent. `ZERO_COST`
|
|
@@ -244,7 +260,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
244
260
|
// Refused, not silently dropped. A no-op here has the parent
|
|
245
261
|
// believe it steered a worker that never heard it — and it would
|
|
246
262
|
// go on believing that until the answer came back unchanged.
|
|
247
|
-
throw new DelegateCapabilityError({
|
|
263
|
+
throw new DelegateCapabilityError({
|
|
264
|
+
id: entry.delegate.id,
|
|
265
|
+
capability: 'continue',
|
|
266
|
+
})
|
|
248
267
|
}
|
|
249
268
|
await entry.delegate.continue(message)
|
|
250
269
|
}
|
|
@@ -256,7 +275,10 @@ export class DelegatingTaskScheduler implements TaskScheduler {
|
|
|
256
275
|
return
|
|
257
276
|
}
|
|
258
277
|
if (!entry.delegate.capabilities.cancel) {
|
|
259
|
-
throw new DelegateCapabilityError({
|
|
278
|
+
throw new DelegateCapabilityError({
|
|
279
|
+
id: entry.delegate.id,
|
|
280
|
+
capability: 'cancel',
|
|
281
|
+
})
|
|
260
282
|
}
|
|
261
283
|
controllerAbort(entry, cause)
|
|
262
284
|
}
|
package/src/scheduler/local.ts
CHANGED
|
@@ -97,6 +97,10 @@ export class LocalTaskScheduler implements TaskScheduler {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
get budget() {
|
|
101
|
+
return this.taskContext.budget
|
|
102
|
+
}
|
|
103
|
+
|
|
100
104
|
async createTask(options: CreateTaskOptions): Promise<TaskHandle> {
|
|
101
105
|
// Filled once the spawn resolves. A box rather than a bare binding
|
|
102
106
|
// because the assignment happens AFTER the `await` that the reader is
|
|
@@ -140,13 +144,7 @@ export class LocalTaskScheduler implements TaskScheduler {
|
|
|
140
144
|
}
|
|
141
145
|
: {}),
|
|
142
146
|
},
|
|
143
|
-
//
|
|
144
|
-
// `AgentManager.spawn` debits it (`remaining -= allocatedTokens`)
|
|
145
|
-
// so siblings divide one pool; handing each spawn a fresh copy
|
|
146
|
-
// made the debit land on a throwaway object, so every child saw
|
|
147
|
-
// the parent's untouched `remaining` and N children were each
|
|
148
|
-
// allocated `maxBudgetFraction` of the SAME number — N x 50% of a
|
|
149
|
-
// budget that only had 100% in it.
|
|
147
|
+
// Every sibling reserves from this same authority before provisioning.
|
|
150
148
|
this.taskContext,
|
|
151
149
|
// The host's listener still sees everything it always did; this
|
|
152
150
|
// only tees off the fact that SOMETHING happened, which is what an
|
package/src/session/index.ts
CHANGED
|
@@ -11,6 +11,5 @@ export * from './workspace/index.js'
|
|
|
11
11
|
export * from './handoff/index.js'
|
|
12
12
|
export * from './summary/index.js'
|
|
13
13
|
export * from './intervention/index.js'
|
|
14
|
-
export * from './migration/index.js'
|
|
15
14
|
export * from './retention/index.js'
|
|
16
15
|
export { TenantIsolationError, WorkspaceBackendError, AncestryCycleError } from './errors.js'
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
import { join } from 'node:path'
|
|
25
25
|
import type { ProjectId, RunId, SessionId } from '../../types/ids/index.js'
|
|
26
26
|
import type { SubSessionId } from '../../types/session/ids.js'
|
|
27
|
+
import { asProjectId, asRunId, asSessionId, asSubSessionId } from '../../utils/id.js'
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Canonical filesystem layout contract. All paths returned are absolute
|
|
@@ -54,18 +55,18 @@ export class DefaultPathBuilder implements PathBuilder {
|
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
projectDir(projectId: ProjectId): string {
|
|
57
|
-
return join(this.root, 'projects', projectId)
|
|
58
|
+
return join(this.root, 'projects', asProjectId(projectId))
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
sessionDir(projectId: ProjectId, sessionId: SessionId): string {
|
|
61
|
-
return join(this.projectDir(projectId), 'sessions', sessionId)
|
|
62
|
+
return join(this.projectDir(projectId), 'sessions', asSessionId(sessionId))
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
subSessionDir(projectId: ProjectId, sessionId: SessionId, subSessionId: SubSessionId): string {
|
|
65
|
-
return join(this.sessionDir(projectId, sessionId), 'subsessions', subSessionId)
|
|
66
|
+
return join(this.sessionDir(projectId, sessionId), 'subsessions', asSubSessionId(subSessionId))
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
runDir(projectId: ProjectId, sessionId: SessionId, runId: RunId): string {
|
|
69
|
-
return join(this.sessionDir(projectId, sessionId), 'runs', runId)
|
|
70
|
+
return join(this.sessionDir(projectId, sessionId), 'runs', asRunId(runId))
|
|
70
71
|
}
|
|
71
72
|
}
|
|
@@ -58,9 +58,8 @@ export interface DiskMessageFeedbackStoreConfig {
|
|
|
58
58
|
|
|
59
59
|
/** Filesystem-safe file name for one rated message. */
|
|
60
60
|
function fileName(messageId: MessageId): string {
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
// a `/` is the day this silently starts writing outside its directory.
|
|
61
|
+
// Retain the historical projection spelling. Callers validate the id
|
|
62
|
+
// first, so suffixes this replacement once flattened are now rejected.
|
|
64
63
|
return `${messageId.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`
|
|
65
64
|
}
|
|
66
65
|
|
|
@@ -119,9 +118,8 @@ export class DiskMessageFeedbackStore implements MessageFeedbackStore {
|
|
|
119
118
|
return {
|
|
120
119
|
legacyPath: join(this.runDir(runId), legacyName),
|
|
121
120
|
revisionsDir: join(this.revisionsDir(runId), revisionFileSegment(checkedMessageId)),
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
// publish a new projection that could overwrite another message's file.
|
|
121
|
+
// Preserve the projection guard from the previous layout. Checked ids
|
|
122
|
+
// now retain their spelling; unsafe custom suffixes are rejected above.
|
|
125
123
|
publishLegacyProjection: legacyName === `${checkedMessageId}.json`,
|
|
126
124
|
}
|
|
127
125
|
}
|
package/src/store/index.ts
CHANGED
|
@@ -6,6 +6,8 @@ export { InMemoryRunStore } from './run/memory.js'
|
|
|
6
6
|
export { DiskCheckpointStore } from './run/checkpoint-disk.js'
|
|
7
7
|
export type { DiskCheckpointStoreAttribution } from './run/checkpoint-disk.js'
|
|
8
8
|
export { InMemoryCheckpointStore } from './run/checkpoint-memory.js'
|
|
9
|
+
export { DiskTokenBudgetStore, openTokenBudget } from './run/token-budget-disk.js'
|
|
10
|
+
export type { DiskTokenBudgetStoreConfig, OpenTokenBudgetOptions } from './run/token-budget-disk.js'
|
|
9
11
|
// The refusing entry point to the optional listing capability, plus the two
|
|
10
12
|
// projections a host implementing its own backend actually calls: one turns
|
|
11
13
|
// a run's checkpoints into a row, the other applies the contract's filter,
|
package/src/store/memory/disk.ts
CHANGED
|
@@ -10,7 +10,7 @@ import type {
|
|
|
10
10
|
MemorySearchResult,
|
|
11
11
|
MemoryStore,
|
|
12
12
|
} from '../../types/memory/index.js'
|
|
13
|
-
import {
|
|
13
|
+
import { generateMemoryId, isEntityId } from '../../utils/id.js'
|
|
14
14
|
import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
|
|
15
15
|
import { type Logger, resolveLogger } from '../../utils/logger.js'
|
|
16
16
|
import { DiskRecordStore } from '../kv/record-store.js'
|
|
@@ -27,8 +27,6 @@ import { InMemoryMemoryIndex } from './index.js'
|
|
|
27
27
|
*/
|
|
28
28
|
const SCHEMA = defineSchema({ kind: 'memory-store', current: 1, migrations: {} })
|
|
29
29
|
|
|
30
|
-
const SAFE_STORAGE_ID = /^mem_[A-Za-z0-9_-]+$/
|
|
31
|
-
|
|
32
30
|
interface StorageLocation {
|
|
33
31
|
readonly indexPath: string
|
|
34
32
|
readonly contentDir: string
|
|
@@ -83,14 +81,8 @@ function assertStorageMemoryId(
|
|
|
83
81
|
value: unknown,
|
|
84
82
|
refuse: (reason: string) => never,
|
|
85
83
|
): asserts value is MemoryId {
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
asMemoryId(value)
|
|
89
|
-
} catch {
|
|
90
|
-
refuse('id must use the recognized mem_ prefix')
|
|
91
|
-
}
|
|
92
|
-
if (!SAFE_STORAGE_ID.test(value)) {
|
|
93
|
-
refuse('id must be one cross-platform safe filename segment')
|
|
84
|
+
if (!isEntityId(value, 'memory')) {
|
|
85
|
+
refuse('id must be a UUID; prefixed memory IDs are not supported')
|
|
94
86
|
}
|
|
95
87
|
}
|
|
96
88
|
|