@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
|
@@ -25,18 +25,20 @@ 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,
|
|
41
43
|
} from '../../types/sandbox/index.js'
|
|
42
44
|
import { subscribeToAbort } from '../../utils/abort.js'
|
|
@@ -208,6 +210,8 @@ export interface LimitedSpawnRequest {
|
|
|
208
210
|
readonly command: string
|
|
209
211
|
readonly args: readonly string[]
|
|
210
212
|
readonly rootDir: string
|
|
213
|
+
/** Bound read-write beside the root; see `SandboxCreateConfig.additionalDirectories`. */
|
|
214
|
+
readonly additionalDirectories?: readonly string[]
|
|
211
215
|
readonly memoryLimitMb?: number
|
|
212
216
|
readonly maxProcesses?: number
|
|
213
217
|
}
|
|
@@ -265,7 +269,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
|
|
|
265
269
|
case 'linux-bwrap':
|
|
266
270
|
return {
|
|
267
271
|
spawnCommand: requiredWrapper(request),
|
|
268
|
-
spawnArgs: [...buildBwrapArgs(rootDir), '--', ...inner],
|
|
272
|
+
spawnArgs: [...buildBwrapArgs(rootDir, request.additionalDirectories), '--', ...inner],
|
|
269
273
|
}
|
|
270
274
|
|
|
271
275
|
case 'linux-namespace':
|
|
@@ -277,7 +281,7 @@ export function buildLimitedSpawn(request: LimitedSpawnRequest): {
|
|
|
277
281
|
case 'macos-seatbelt':
|
|
278
282
|
return {
|
|
279
283
|
spawnCommand: requiredWrapper(request),
|
|
280
|
-
spawnArgs: [...buildSeatbeltArgs(rootDir), '--', ...inner],
|
|
284
|
+
spawnArgs: [...buildSeatbeltArgs(rootDir, request.additionalDirectories), '--', ...inner],
|
|
281
285
|
}
|
|
282
286
|
|
|
283
287
|
case 'basic': {
|
|
@@ -375,7 +379,10 @@ function canonicalizePath(p: string): string {
|
|
|
375
379
|
* process table through them — a bound `/proc` would hand back the process
|
|
376
380
|
* isolation the same flag just removed.
|
|
377
381
|
*/
|
|
378
|
-
export function buildBwrapArgs(
|
|
382
|
+
export function buildBwrapArgs(
|
|
383
|
+
sandboxRoot: string,
|
|
384
|
+
additionalDirectories: readonly string[] = [],
|
|
385
|
+
): string[] {
|
|
379
386
|
const root = canonicalizePath(sandboxRoot)
|
|
380
387
|
|
|
381
388
|
const args = [
|
|
@@ -426,9 +433,15 @@ export function buildBwrapArgs(sandboxRoot: string): string[] {
|
|
|
426
433
|
'--bind',
|
|
427
434
|
root,
|
|
428
435
|
root,
|
|
429
|
-
'--chdir',
|
|
430
|
-
root,
|
|
431
436
|
)
|
|
437
|
+
// The host's added directories, read-write at their own paths, so a
|
|
438
|
+
// path the model was given on the host means the same thing inside.
|
|
439
|
+
for (const dir of additionalDirectories) {
|
|
440
|
+
const canonical = canonicalizePath(dir)
|
|
441
|
+
if (canonical === root) continue
|
|
442
|
+
args.push('--bind', canonical, canonical)
|
|
443
|
+
}
|
|
444
|
+
args.push('--chdir', root)
|
|
432
445
|
|
|
433
446
|
return args
|
|
434
447
|
}
|
|
@@ -450,10 +463,21 @@ const BWRAP_SYSTEM_PATHS: readonly string[] = [
|
|
|
450
463
|
'/opt',
|
|
451
464
|
]
|
|
452
465
|
|
|
453
|
-
function
|
|
466
|
+
function seatbeltString(value: string): string {
|
|
467
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function buildSeatbeltProfile(additionalDirectories: readonly string[] = []): string {
|
|
454
471
|
return [
|
|
455
472
|
'(version 1)',
|
|
456
473
|
'(deny default)',
|
|
474
|
+
// The host's added directories, read-write, by the same contract as
|
|
475
|
+
// the root. Literal paths rather than params: sandbox-exec takes one
|
|
476
|
+
// -D per name and the count here is the operator's.
|
|
477
|
+
...additionalDirectories.flatMap((dir) => [
|
|
478
|
+
`(allow file-read* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
|
|
479
|
+
`(allow file-write* (subpath ${seatbeltString(canonicalizePath(dir))}))`,
|
|
480
|
+
]),
|
|
457
481
|
|
|
458
482
|
// --- Process lifecycle ---
|
|
459
483
|
'(allow process-exec)',
|
|
@@ -538,8 +562,15 @@ function buildSeatbeltProfile(): string {
|
|
|
538
562
|
* remain path bytes instead of becoming policy syntax. This is the same
|
|
539
563
|
* parameter boundary used by Codex's seatbelt builder.
|
|
540
564
|
*/
|
|
541
|
-
function buildSeatbeltArgs(
|
|
542
|
-
|
|
565
|
+
function buildSeatbeltArgs(
|
|
566
|
+
sandboxRoot: string,
|
|
567
|
+
additionalDirectories: readonly string[] = [],
|
|
568
|
+
): string[] {
|
|
569
|
+
return [
|
|
570
|
+
'-p',
|
|
571
|
+
buildSeatbeltProfile(additionalDirectories),
|
|
572
|
+
`-DNAMZU_SANDBOX_ROOT=${canonicalizePath(sandboxRoot)}`,
|
|
573
|
+
]
|
|
543
574
|
}
|
|
544
575
|
|
|
545
576
|
// ---------------------------------------------------------------------------
|
|
@@ -595,6 +626,12 @@ class LocalSandbox implements Sandbox {
|
|
|
595
626
|
private _status: SandboxStatus
|
|
596
627
|
private readonly config: SandboxCreateConfig
|
|
597
628
|
private readonly log: Logger
|
|
629
|
+
/** The host's added directories, canonical; bound beside the root. */
|
|
630
|
+
private readonly additionalDirectories: readonly string[]
|
|
631
|
+
/** Where this sandbox's own file API may reach: the root, then the added directories. */
|
|
632
|
+
private get roots(): readonly string[] {
|
|
633
|
+
return [this.rootDir, ...this.additionalDirectories]
|
|
634
|
+
}
|
|
598
635
|
|
|
599
636
|
get status(): SandboxStatus {
|
|
600
637
|
return this._status
|
|
@@ -613,6 +650,9 @@ class LocalSandbox implements Sandbox {
|
|
|
613
650
|
this.rootDir = rootDir
|
|
614
651
|
this.environment = environment
|
|
615
652
|
this.config = config
|
|
653
|
+
this.additionalDirectories = (config.additionalDirectories ?? [])
|
|
654
|
+
.map((dir) => canonicalizePath(resolve(dir)))
|
|
655
|
+
.filter((dir) => dir !== rootDir)
|
|
616
656
|
this._status = 'ready'
|
|
617
657
|
this.log = log.child({
|
|
618
658
|
[SCOPE_ATTRIBUTE]: 'sandbox/provider/local',
|
|
@@ -640,7 +680,7 @@ class LocalSandbox implements Sandbox {
|
|
|
640
680
|
const env = buildSafeEnv(this.config.env, opts?.env)
|
|
641
681
|
const timeout = opts?.timeout ?? this.config.timeoutMs ?? SANDBOX_DEFAULT_TIMEOUT_MS
|
|
642
682
|
|
|
643
|
-
const cwd = opts?.cwd ? await
|
|
683
|
+
const cwd = opts?.cwd ? await resolveWithinAnyReal(this.roots, opts.cwd) : this.rootDir
|
|
644
684
|
|
|
645
685
|
const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(
|
|
646
686
|
command,
|
|
@@ -689,7 +729,7 @@ class LocalSandbox implements Sandbox {
|
|
|
689
729
|
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
690
730
|
}
|
|
691
731
|
|
|
692
|
-
const resolved = await
|
|
732
|
+
const resolved = await resolveWithinAnyReal(this.roots, path)
|
|
693
733
|
await mkdir(dirname(resolved), { recursive: true })
|
|
694
734
|
|
|
695
735
|
// Convention 8: Atomic write (write-tmp-rename)
|
|
@@ -705,7 +745,7 @@ class LocalSandbox implements Sandbox {
|
|
|
705
745
|
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
706
746
|
}
|
|
707
747
|
|
|
708
|
-
const resolved = await
|
|
748
|
+
const resolved = await resolveWithinAnyReal(this.roots, path)
|
|
709
749
|
return fsReadFile(resolved)
|
|
710
750
|
}
|
|
711
751
|
|
|
@@ -714,7 +754,7 @@ class LocalSandbox implements Sandbox {
|
|
|
714
754
|
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
715
755
|
}
|
|
716
756
|
|
|
717
|
-
const resolved = await
|
|
757
|
+
const resolved = await resolveWithinAnyReal(this.roots, rootPath)
|
|
718
758
|
const root = await stat(resolved).catch(() => null)
|
|
719
759
|
if (!root || !root.isDirectory()) return []
|
|
720
760
|
|
|
@@ -759,6 +799,67 @@ class LocalSandbox implements Sandbox {
|
|
|
759
799
|
// Private helpers
|
|
760
800
|
// -----------------------------------------------------------------------
|
|
761
801
|
|
|
802
|
+
spawnDetached(
|
|
803
|
+
command: string,
|
|
804
|
+
args: readonly string[] = [],
|
|
805
|
+
opts?: SandboxSpawnOptions,
|
|
806
|
+
): SandboxDetachedProcess {
|
|
807
|
+
if (this._status === 'destroyed') {
|
|
808
|
+
throw new Error(`Sandbox ${this.id} is destroyed`)
|
|
809
|
+
}
|
|
810
|
+
// Lexical containment for the cwd: the caller does not wait, so
|
|
811
|
+
// neither does this. The mounts are the same ones `exec` uses.
|
|
812
|
+
const cwd = opts?.cwd ? resolveWithinAny(this.roots, opts.cwd) : this.rootDir
|
|
813
|
+
const { spawnCommand, spawnArgs, bwrapInfoFd, bwrapBlockFd } = this.buildSpawnArgs(command, [
|
|
814
|
+
...args,
|
|
815
|
+
])
|
|
816
|
+
const env = buildSafeEnv(this.config.env, opts?.env)
|
|
817
|
+
const child = spawn(spawnCommand, spawnArgs, {
|
|
818
|
+
cwd,
|
|
819
|
+
env,
|
|
820
|
+
stdio:
|
|
821
|
+
bwrapInfoFd === undefined
|
|
822
|
+
? ['ignore', 'pipe', 'pipe']
|
|
823
|
+
: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'],
|
|
824
|
+
detached: process.platform !== 'win32',
|
|
825
|
+
})
|
|
826
|
+
let bwrapChildPid: number | undefined
|
|
827
|
+
let requested: NodeJS.Signals | undefined
|
|
828
|
+
// Same dance as `exec`: bwrap's inner reaper is in its own session, so
|
|
829
|
+
// a kill has to reach it by the pid the info fd reports, and a kill
|
|
830
|
+
// asked for before that pid is known is delivered when it arrives.
|
|
831
|
+
const bwrapInfo = bwrapInfoFd === undefined ? undefined : child.stdio[bwrapInfoFd]
|
|
832
|
+
const bwrapBlock = bwrapBlockFd === undefined ? undefined : child.stdio[bwrapBlockFd]
|
|
833
|
+
let bwrapInfoBuffer = ''
|
|
834
|
+
bwrapInfo?.on('data', (chunk: Buffer) => {
|
|
835
|
+
if (bwrapChildPid !== undefined) return
|
|
836
|
+
bwrapInfoBuffer += chunk.toString('utf8')
|
|
837
|
+
const observed = readBwrapChildPid(bwrapInfoBuffer)
|
|
838
|
+
if (observed === undefined) return
|
|
839
|
+
bwrapChildPid = observed
|
|
840
|
+
if (requested !== undefined) {
|
|
841
|
+
killTree(child, 'SIGKILL')
|
|
842
|
+
killBwrapChild(bwrapChildPid, 'SIGKILL')
|
|
843
|
+
} else if (bwrapBlock !== undefined && bwrapBlock !== null && 'end' in bwrapBlock) {
|
|
844
|
+
bwrapBlock.end(Buffer.from([1]))
|
|
845
|
+
}
|
|
846
|
+
})
|
|
847
|
+
this.log.debug('Detached process started', {
|
|
848
|
+
'namzu.sandbox.command': command,
|
|
849
|
+
'namzu.sandbox.args': args,
|
|
850
|
+
'namzu.execution.environment': this.environment,
|
|
851
|
+
})
|
|
852
|
+
return {
|
|
853
|
+
child,
|
|
854
|
+
kill: (signal) => {
|
|
855
|
+
requested = signal
|
|
856
|
+
if (bwrapBlockFd !== undefined && bwrapChildPid === undefined) return
|
|
857
|
+
killTree(child, signal)
|
|
858
|
+
killBwrapChild(bwrapChildPid, signal)
|
|
859
|
+
},
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
762
863
|
private buildSpawnArgs(
|
|
763
864
|
command: string,
|
|
764
865
|
args: string[],
|
|
@@ -774,6 +875,9 @@ class LocalSandbox implements Sandbox {
|
|
|
774
875
|
command,
|
|
775
876
|
args,
|
|
776
877
|
rootDir: this.rootDir,
|
|
878
|
+
...(this.additionalDirectories.length > 0
|
|
879
|
+
? { additionalDirectories: this.additionalDirectories }
|
|
880
|
+
: {}),
|
|
777
881
|
...(this.config.memoryLimitMb !== undefined
|
|
778
882
|
? { memoryLimitMb: this.config.memoryLimitMb }
|
|
779
883
|
: {}),
|
|
@@ -1051,6 +1155,12 @@ export class LocalSandboxProvider implements SandboxProvider {
|
|
|
1051
1155
|
)
|
|
1052
1156
|
}
|
|
1053
1157
|
removeRootOnDestroy = false
|
|
1158
|
+
for (const dir of config.additionalDirectories ?? []) {
|
|
1159
|
+
const entry = await stat(resolve(dir)).catch(() => null)
|
|
1160
|
+
if (!entry?.isDirectory()) {
|
|
1161
|
+
throw new Error(`Sandbox additional directory is not a directory: ${resolve(dir)}`)
|
|
1162
|
+
}
|
|
1163
|
+
}
|
|
1054
1164
|
} else {
|
|
1055
1165
|
// No workspace was named: this allocation owns a fresh temporary root.
|
|
1056
1166
|
const { mkdtemp } = await import('node:fs/promises')
|
|
@@ -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
|
|
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
} from '../../types/run/checkpoint-store.js'
|
|
17
17
|
import type { RunStoreConfig } from '../../types/run/index.js'
|
|
18
18
|
import type { ProjectId } from '../../types/session/ids.js'
|
|
19
|
+
import { asRunId, isEntityId } from '../../utils/id.js'
|
|
19
20
|
import { acquireClaim, currentFence, readClaim, releaseClaim } from './claim-disk.js'
|
|
20
21
|
import { RunDiskStore, readCheckpointsIn } from './disk.js'
|
|
21
22
|
import {
|
|
@@ -56,14 +57,14 @@ export interface DiskCheckpointStoreAttribution {
|
|
|
56
57
|
* participate in directory resolution — `tenantId`/`projectId`/`sessionId`
|
|
57
58
|
* exist for backends that key by attribution instead of path.
|
|
58
59
|
*
|
|
59
|
-
* One `RunDiskStore` is bound
|
|
60
|
-
*
|
|
61
|
-
*
|
|
60
|
+
* One `RunDiskStore` is bound per resolved run directory, then cached, so
|
|
61
|
+
* repeated checkpoint operations against the same run don't re-run `initRun`.
|
|
62
|
+
* Parent attribution remains part of the address even when a cache is warm.
|
|
62
63
|
*/
|
|
63
64
|
export class DiskCheckpointStore implements CheckpointStore {
|
|
64
65
|
private readonly config: RunStoreConfig
|
|
65
66
|
private readonly attribution?: DiskCheckpointStoreAttribution
|
|
66
|
-
private readonly bound = new Map<
|
|
67
|
+
private readonly bound = new Map<string, Promise<RunDiskStore>>()
|
|
67
68
|
|
|
68
69
|
/**
|
|
69
70
|
* @param config the run-store config; `baseDir` is one session's `runs/`
|
|
@@ -79,17 +80,18 @@ export class DiskCheckpointStore implements CheckpointStore {
|
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
private bind(scope: CheckpointRunScope): Promise<RunDiskStore> {
|
|
82
|
-
const
|
|
83
|
+
const path = this.runDir(scope)
|
|
84
|
+
const cached = this.bound.get(path)
|
|
83
85
|
if (cached) return cached
|
|
84
86
|
const promise = (async () => {
|
|
85
87
|
const store = new RunDiskStore(this.config)
|
|
86
88
|
await store.initRun(scope.runId, scope.parentRunId)
|
|
87
89
|
return store
|
|
88
90
|
})()
|
|
89
|
-
this.bound.set(
|
|
91
|
+
this.bound.set(path, promise)
|
|
90
92
|
// A failed bind must not poison the cache — the next call retries.
|
|
91
93
|
promise.catch(() => {
|
|
92
|
-
this.bound.delete(
|
|
94
|
+
this.bound.delete(path)
|
|
93
95
|
})
|
|
94
96
|
return promise
|
|
95
97
|
}
|
|
@@ -130,6 +132,8 @@ export class DiskCheckpointStore implements CheckpointStore {
|
|
|
130
132
|
* the two stay together if the layout ever moves.
|
|
131
133
|
*/
|
|
132
134
|
private runDir(scope: CheckpointRunScope): string {
|
|
135
|
+
asRunId(scope.runId)
|
|
136
|
+
if (scope.parentRunId !== undefined) asRunId(scope.parentRunId)
|
|
133
137
|
return scope.parentRunId
|
|
134
138
|
? join(this.config.baseDir, scope.parentRunId, 'children', scope.runId)
|
|
135
139
|
: join(this.config.baseDir, scope.runId)
|
|
@@ -247,27 +251,10 @@ export class DiskCheckpointStore implements CheckpointStore {
|
|
|
247
251
|
private async readRunDirs(dir: string): Promise<RunId[]> {
|
|
248
252
|
try {
|
|
249
253
|
const found = await readdir(dir, { withFileTypes: true })
|
|
250
|
-
//
|
|
251
|
-
//
|
|
252
|
-
// a `tmp-` left by a crashed write is not a run, and the assertion
|
|
253
|
-
// below is what let it be returned as one.
|
|
254
|
-
//
|
|
255
|
-
// **Unobservable through `listDurableRuns` today, and kept
|
|
256
|
-
// deliberately.** Measured, not assumed: removing this filter, and
|
|
257
|
-
// separately weakening it to `startsWith('r')`, leaves every test in
|
|
258
|
-
// this package green. `toDurableRunEntry` returns undefined for a
|
|
259
|
-
// directory with no checkpoints in it, so a junk name is already
|
|
260
|
-
// dropped one layer down — the filter saves the `readdir` and the
|
|
261
|
-
// parse, not a wrong answer. It is here because `readRunDirs` is a
|
|
262
|
-
// private helper with two callers and a declared element type, and
|
|
263
|
-
// the next caller inherits the type rather than the accident that
|
|
264
|
-
// currently covers for it.
|
|
265
|
-
//
|
|
266
|
-
// Filtered rather than refused, whatever the reach: a scan that
|
|
267
|
-
// threw on one piece of junk could not list the runs that are fine,
|
|
268
|
-
// during exactly the incident this listing exists for.
|
|
254
|
+
// The directory supplies the entity kind. Admit current and legacy
|
|
255
|
+
// run IDs; ignore scratch entries without hiding durable UUID runs.
|
|
269
256
|
return found
|
|
270
|
-
.filter((e) => e.isDirectory() && e.name
|
|
257
|
+
.filter((e) => e.isDirectory() && isEntityId(e.name, 'run'))
|
|
271
258
|
.map((e) => e.name as RunId)
|
|
272
259
|
} catch (err) {
|
|
273
260
|
if ((err as NodeJS.ErrnoException).code === 'ENOENT') return []
|
|
@@ -275,7 +275,7 @@ const NO_LINK = new Set(['EPERM', 'ENOTSUP', 'EOPNOTSUPP', 'ENOSYS', 'EXDEV', 'E
|
|
|
275
275
|
*
|
|
276
276
|
* Some filesystems — a few network and removable volumes — support no hard
|
|
277
277
|
* link at all. **This refuses rather than falling back**, per
|
|
278
|
-
* [refuse-do-not-degrade](../../../../../
|
|
278
|
+
* [refuse-do-not-degrade](../../../../../"refuse do not degrade").
|
|
279
279
|
* The only available fallback is the `wx` publish this replaced, and that one
|
|
280
280
|
* carries the defect described in the module header: two workers restore and
|
|
281
281
|
* run the same run. A claim that silently becomes non-exclusive is worse than
|