@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
|
@@ -1,468 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Boot-time filesystem re-layout — `.namzu/threads/{thd_X}/` →
|
|
3
|
-
* `.namzu/projects/{prj_legacy_<X>}/sessions/ses_legacy_default/runs/...`.
|
|
4
|
-
*
|
|
5
|
-
* The `thd_X` this module reads off the filesystem is D2 meaning (a), the
|
|
6
|
-
* pre-0.2.0 top-level container — unrelated to and untouched by
|
|
7
|
-
* NZ-TOPIC-04's narrowing of the live Topic layer's id to `top_*`. As of
|
|
8
|
-
* that task `thd_*` means only what this module has always used it to
|
|
9
|
-
* mean; see `session/migration/id-prefix.ts` for the disambiguation.
|
|
10
|
-
*
|
|
11
|
-
* Trigger: first {@link RunContextFactory.build} call per process. The
|
|
12
|
-
* factory invokes {@link DefaultFilesystemMigrator.migrate} before resolving
|
|
13
|
-
* any path so legacy runs are never orphaned by the new layout.
|
|
14
|
-
*
|
|
15
|
-
* See session-hierarchy.md §13.4.1 for the detection / trigger / atomicity
|
|
16
|
-
* contract. Concurrency model:
|
|
17
|
-
*
|
|
18
|
-
* 1. Main marker present → short-circuit `already_migrated`. Idempotent.
|
|
19
|
-
* 2. Legacy `.namzu/threads/` absent → write the main marker and return
|
|
20
|
-
* `noop_no_legacy`. This plants the marker on fresh installs so the
|
|
21
|
-
* `threads/` detection branch is only ever entered once.
|
|
22
|
-
* 3. Legacy layout detected → acquire the `.tmp` lock via `wx`; on
|
|
23
|
-
* EEXIST another boot is mid-migration. The loser waits 100ms and
|
|
24
|
-
* re-checks the main marker — cooperating, not competing. Roadmap
|
|
25
|
-
* Risk #4 mitigation.
|
|
26
|
-
* 4. Per-legacy-thread: rename the whole `runs/` subtree in a single
|
|
27
|
-
* `fs.rename` call (cross-OS atomic on the same filesystem; different
|
|
28
|
-
* filesystems fall back to copy-then-unlink via Node's default — a
|
|
29
|
-
* known limitation documented below).
|
|
30
|
-
* 5. Synthesize `project.json` + `session.json` via write-tmp-rename
|
|
31
|
-
* (Convention #8) so partial crashes leave no half-serialised state.
|
|
32
|
-
* 6. Write main marker last — presence of the marker is the canonical
|
|
33
|
-
* "migration done" signal.
|
|
34
|
-
*
|
|
35
|
-
* Known limitations:
|
|
36
|
-
* - Cross-filesystem moves: Node's `fs.rename` rejects with `EXDEV` when
|
|
37
|
-
* source and target live on different filesystems. This migrator does
|
|
38
|
-
* NOT fall back to copy-then-unlink; the error surfaces as
|
|
39
|
-
* {@link FilesystemMigrationError} with op `'rename_runs'`. Consumers
|
|
40
|
-
* running `.namzu/threads` and `.namzu/projects` on different mounts
|
|
41
|
-
* must migrate manually (documented INTERP flag).
|
|
42
|
-
* - `UNKNOWN_TENANT_ID`: legacy threads have no tenant denormalisation on
|
|
43
|
-
* disk. The synthesised project.json carries the sentinel so consumers
|
|
44
|
-
* know these are legacy-rehomed and can either tag-then-retain or
|
|
45
|
-
* reject until a real tenant is assigned (policy is consumer-owned).
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
import { mkdir, readdir, rename, stat } from 'node:fs/promises'
|
|
49
|
-
import { join } from 'node:path'
|
|
50
|
-
import { BOOT_EVENT_NAMES } from '../../constants/telemetry/index.js'
|
|
51
|
-
import type { TenantId } from '../../types/ids/index.js'
|
|
52
|
-
import { UNKNOWN_TENANT_ID } from '../../types/ids/index.js'
|
|
53
|
-
import type { ProjectId, SessionId } from '../../types/session/ids.js'
|
|
54
|
-
import { atomicWriteFile } from '../../utils/atomic-write.js'
|
|
55
|
-
import { asProjectId, asSessionId } from '../../utils/id.js'
|
|
56
|
-
import { EVENT_NAME_ATTRIBUTE } from '../../utils/log/types.js'
|
|
57
|
-
import type { Logger } from '../../utils/logger.js'
|
|
58
|
-
import { FilesystemMigrationError } from './errors.js'
|
|
59
|
-
import { acquireMigrationLock, readMarker, releaseMigrationLock, writeMarker } from './marker.js'
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Sentinel SessionId used for legacy pre-0.2.0 runs that pre-date the
|
|
63
|
-
* Session entity. Every migrated thread collapses into this single session
|
|
64
|
-
* so consumers can still address the runs through the new layout.
|
|
65
|
-
*/
|
|
66
|
-
export const LEGACY_DEFAULT_SESSION_ID = asSessionId('ses_legacy_default')
|
|
67
|
-
|
|
68
|
-
/** Prefix for projects synthesised from legacy `thd_*` folders. */
|
|
69
|
-
export const LEGACY_DEFAULT_PROJECT_PREFIX = 'prj_legacy_'
|
|
70
|
-
|
|
71
|
-
/** Marker version string persisted at `.migration/v0.2.0`. */
|
|
72
|
-
export const MIGRATION_VERSION = '0.2.0'
|
|
73
|
-
|
|
74
|
-
/** Marker file path relative to rootDir. */
|
|
75
|
-
export const MARKER_REL_PATH = join('.migration', 'v0.2.0')
|
|
76
|
-
|
|
77
|
-
/** In-flight lock file path relative to rootDir. */
|
|
78
|
-
export const LOCK_REL_PATH = join('.migration', 'v0.2.0.tmp')
|
|
79
|
-
|
|
80
|
-
/** Delay before the loser re-checks the main marker on lock contention. */
|
|
81
|
-
const LOCK_WAIT_MS = 100
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Result of a migration attempt. `kind` discriminates the three outcomes;
|
|
85
|
-
* `migratedThreads` is only non-empty for `kind: 'migrated'`. Sinks and
|
|
86
|
-
* callers can switch on `kind` without string parsing.
|
|
87
|
-
*/
|
|
88
|
-
export interface FilesystemMigrationResult {
|
|
89
|
-
kind: 'migrated' | 'already_migrated' | 'noop_no_legacy'
|
|
90
|
-
migratedThreads: readonly { legacyThreadId: string; newProjectId: ProjectId }[]
|
|
91
|
-
markerPath: string
|
|
92
|
-
at: Date
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/** Event emitted on successful migration (`kind === 'migrated'` only). */
|
|
96
|
-
export interface FilesystemMigrationEvent {
|
|
97
|
-
type: 'filesystem.migrated'
|
|
98
|
-
result: FilesystemMigrationResult
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** Sink contract — one `emit` method. */
|
|
102
|
-
export interface FilesystemMigrationSink {
|
|
103
|
-
emit(event: FilesystemMigrationEvent): void
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export const NOOP_FILESYSTEM_MIGRATION_SINK: FilesystemMigrationSink = {
|
|
107
|
-
emit() {},
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Wires the migration facts `DefaultFilesystemMigrator` already computes —
|
|
112
|
-
* `kind`, `migratedThreads`, `markerPath`, `at` — to a `Logger`, instead of
|
|
113
|
-
* the sink they are thrown at on every real boot today
|
|
114
|
-
* (`NOOP_FILESYSTEM_MIGRATION_SINK`, still `ensureMigrated`'s default — see
|
|
115
|
-
* `runtime/query/context.ts`). A caller opts into this by constructing its
|
|
116
|
-
* own `DefaultFilesystemMigrator(loggingMigrationSink(log))` and passing it
|
|
117
|
-
* to `ensureMigrated`, the way `runtime/query/index.ts` does; nothing here
|
|
118
|
-
* changes what the default migrator does.
|
|
119
|
-
*
|
|
120
|
-
* `FilesystemMigrationSink.emit` is only ever called with
|
|
121
|
-
* `type: 'filesystem.migrated'` (Step 6 in the module doc above) —
|
|
122
|
-
* `already_migrated` and `noop_no_legacy` never reach a sink at all, by the
|
|
123
|
-
* shape of `FilesystemMigrationEvent`. A caller that wants those two logged
|
|
124
|
-
* as well reads them straight off `ensureMigrated`'s resolved
|
|
125
|
-
* `FilesystemMigrationResult`, the way `runtime/query/index.ts` does,
|
|
126
|
-
* rather than this function growing a case the type it wraps cannot
|
|
127
|
-
* produce — widening `FilesystemMigrationEvent` to carry them would be a
|
|
128
|
-
* breaking change to every exhaustive switch already written over it.
|
|
129
|
-
*/
|
|
130
|
-
export function loggingMigrationSink(log: Logger): FilesystemMigrationSink {
|
|
131
|
-
return {
|
|
132
|
-
emit(event) {
|
|
133
|
-
const { result } = event
|
|
134
|
-
log.info('filesystem migration completed', {
|
|
135
|
-
[EVENT_NAME_ATTRIBUTE]: BOOT_EVENT_NAMES.MIGRATION_COMPLETED,
|
|
136
|
-
'namzu.migration.kind': result.kind,
|
|
137
|
-
'namzu.migration.marker_path': result.markerPath,
|
|
138
|
-
'namzu.migration.migrated_thread_count': result.migratedThreads.length,
|
|
139
|
-
})
|
|
140
|
-
},
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/** Interface so consumers can inject a stub migrator in tests. */
|
|
145
|
-
export interface FilesystemMigrator {
|
|
146
|
-
migrate(rootDir: string): Promise<FilesystemMigrationResult>
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Persisted synthetic `project.json` shape. Matches
|
|
151
|
-
* `store/session/disk.ts:PersistedProject` plus a `_legacy: true` flag so
|
|
152
|
-
* readers can distinguish auto-synthesised records from real ones.
|
|
153
|
-
*/
|
|
154
|
-
interface SyntheticProject {
|
|
155
|
-
id: ProjectId
|
|
156
|
-
tenantId: TenantId
|
|
157
|
-
name: string
|
|
158
|
-
config: {
|
|
159
|
-
maxDelegationDepth: number
|
|
160
|
-
maxDelegationWidth: number
|
|
161
|
-
maxInterventionDepth: number
|
|
162
|
-
}
|
|
163
|
-
createdAt: string
|
|
164
|
-
updatedAt: string
|
|
165
|
-
_legacy: true
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Persisted synthetic `session.json` shape. Matches
|
|
170
|
-
* `store/session/disk.ts:PersistedSession` minimally. Status is `idle` so
|
|
171
|
-
* any read path that drills into these sessions does not mistake them for
|
|
172
|
-
* active work. `_legacy: true` flags them as auto-synthesised.
|
|
173
|
-
*/
|
|
174
|
-
interface SyntheticSession {
|
|
175
|
-
id: SessionId
|
|
176
|
-
projectId: ProjectId
|
|
177
|
-
tenantId: TenantId
|
|
178
|
-
status: 'idle'
|
|
179
|
-
currentActor: null
|
|
180
|
-
previousActors: readonly []
|
|
181
|
-
workspaceId: null
|
|
182
|
-
ownerVersion: 0
|
|
183
|
-
createdAt: string
|
|
184
|
-
updatedAt: string
|
|
185
|
-
_legacy: true
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Default implementation. Migration is driven by the contract documented in
|
|
190
|
-
* the module header — readers should trace concerns to this comment rather
|
|
191
|
-
* than re-deriving from code.
|
|
192
|
-
*/
|
|
193
|
-
export class DefaultFilesystemMigrator implements FilesystemMigrator {
|
|
194
|
-
constructor(private readonly sink: FilesystemMigrationSink = NOOP_FILESYSTEM_MIGRATION_SINK) {}
|
|
195
|
-
|
|
196
|
-
async migrate(rootDir: string): Promise<FilesystemMigrationResult> {
|
|
197
|
-
const markerPath = join(rootDir, MARKER_REL_PATH)
|
|
198
|
-
const lockPath = join(rootDir, LOCK_REL_PATH)
|
|
199
|
-
const threadsDir = join(rootDir, 'threads')
|
|
200
|
-
const projectsDir = join(rootDir, 'projects')
|
|
201
|
-
|
|
202
|
-
// Step 1: completed-marker short-circuit (cheapest idempotency check).
|
|
203
|
-
const existing = await readMarker(markerPath)
|
|
204
|
-
if (existing) {
|
|
205
|
-
return {
|
|
206
|
-
kind: 'already_migrated',
|
|
207
|
-
migratedThreads: [],
|
|
208
|
-
markerPath,
|
|
209
|
-
at: existing.at,
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Step 2: legacy absent → no-op. Plant the marker so subsequent boots
|
|
214
|
-
// do not re-enter this branch. Fresh installs fall through here.
|
|
215
|
-
const threadsExists = await directoryExists(threadsDir)
|
|
216
|
-
if (!threadsExists) {
|
|
217
|
-
const at = new Date()
|
|
218
|
-
try {
|
|
219
|
-
await writeMarker(markerPath, {
|
|
220
|
-
version: MIGRATION_VERSION,
|
|
221
|
-
at,
|
|
222
|
-
migratedThreads: [],
|
|
223
|
-
})
|
|
224
|
-
} catch (cause) {
|
|
225
|
-
throw new FilesystemMigrationError({
|
|
226
|
-
op: 'write_marker',
|
|
227
|
-
path: markerPath,
|
|
228
|
-
cause,
|
|
229
|
-
})
|
|
230
|
-
}
|
|
231
|
-
return {
|
|
232
|
-
kind: 'noop_no_legacy',
|
|
233
|
-
migratedThreads: [],
|
|
234
|
-
markerPath,
|
|
235
|
-
at,
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// Step 3: cooperate on the tmp lock.
|
|
240
|
-
try {
|
|
241
|
-
await acquireMigrationLock(lockPath)
|
|
242
|
-
} catch (err) {
|
|
243
|
-
const code = (err as NodeJS.ErrnoException).code
|
|
244
|
-
if (code === 'EEXIST') {
|
|
245
|
-
// Another boot is mid-migration — wait and re-read the main marker.
|
|
246
|
-
await sleep(LOCK_WAIT_MS)
|
|
247
|
-
const follow = await readMarker(markerPath)
|
|
248
|
-
if (follow) {
|
|
249
|
-
return {
|
|
250
|
-
kind: 'already_migrated',
|
|
251
|
-
migratedThreads: [],
|
|
252
|
-
markerPath,
|
|
253
|
-
at: follow.at,
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// Main marker still absent — the winning boot is still going OR
|
|
257
|
-
// crashed. We re-throw so the caller sees a contention surface
|
|
258
|
-
// rather than silently assuming success.
|
|
259
|
-
throw new FilesystemMigrationError({
|
|
260
|
-
op: 'acquire_lock',
|
|
261
|
-
path: lockPath,
|
|
262
|
-
cause: err,
|
|
263
|
-
})
|
|
264
|
-
}
|
|
265
|
-
throw new FilesystemMigrationError({
|
|
266
|
-
op: 'acquire_lock',
|
|
267
|
-
path: lockPath,
|
|
268
|
-
cause: err,
|
|
269
|
-
})
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
try {
|
|
273
|
-
// Step 4a: enumerate legacy thread dirs.
|
|
274
|
-
let entries: string[]
|
|
275
|
-
try {
|
|
276
|
-
entries = await readdir(threadsDir)
|
|
277
|
-
} catch (cause) {
|
|
278
|
-
throw new FilesystemMigrationError({
|
|
279
|
-
op: 'enumerate_threads',
|
|
280
|
-
path: threadsDir,
|
|
281
|
-
cause,
|
|
282
|
-
})
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const migrated: { legacyThreadId: string; newProjectId: ProjectId }[] = []
|
|
286
|
-
const now = new Date()
|
|
287
|
-
|
|
288
|
-
for (const entry of entries) {
|
|
289
|
-
// Accept only `thd_*` (and tolerate `prj_*` legacy in case of
|
|
290
|
-
// rerun after a partial-crash-with-renamed-but-no-marker).
|
|
291
|
-
if (!entry.startsWith('thd_')) continue
|
|
292
|
-
|
|
293
|
-
const legacyThreadId = entry
|
|
294
|
-
const suffix = legacyThreadId.slice('thd_'.length)
|
|
295
|
-
|
|
296
|
-
// The suffix comes off the filesystem, and `startsWith('thd_')`
|
|
297
|
-
// is the only thing it has passed. A folder named `thd_Not An
|
|
298
|
-
// Id` mints `prj_legacy_Not An Id`: structurally a `ProjectId`,
|
|
299
|
-
// accepted by no validator, and now a directory name in the new
|
|
300
|
-
// layout. The migration is the one place a project id is built
|
|
301
|
-
// from data rather than generated, so it is the one place the
|
|
302
|
-
// id contract has to be checked.
|
|
303
|
-
//
|
|
304
|
-
// (Not a containment check — it cannot be one. `readdir` yields
|
|
305
|
-
// path components, which hold no separator, and `..` is never
|
|
306
|
-
// among them; `prj_legacy_..` is a literal name, not a parent
|
|
307
|
-
// reference. Nothing here can leave the root.)
|
|
308
|
-
//
|
|
309
|
-
// It refuses rather than skipping. A skipped folder is a legacy
|
|
310
|
-
// thread whose runs are still on disk and no longer addressable,
|
|
311
|
-
// with nothing in the result saying so — and the marker would be
|
|
312
|
-
// written as if the migration were complete.
|
|
313
|
-
if (!/^[a-z0-9]+$/.test(suffix)) {
|
|
314
|
-
throw new FilesystemMigrationError({
|
|
315
|
-
op: 'validate_thread_id',
|
|
316
|
-
path: join(threadsDir, legacyThreadId),
|
|
317
|
-
cause: new Error(
|
|
318
|
-
`Legacy thread folder '${legacyThreadId}' is not a thread id: expected 'thd_' followed by lowercase alphanumerics. It is refused rather than migrated because the name is used as a directory name.`,
|
|
319
|
-
),
|
|
320
|
-
})
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
const newProjectId = asProjectId(`${LEGACY_DEFAULT_PROJECT_PREFIX}${suffix}`)
|
|
324
|
-
|
|
325
|
-
const legacyRunsDir = join(threadsDir, legacyThreadId, 'runs')
|
|
326
|
-
const newProjectDir = join(projectsDir, newProjectId)
|
|
327
|
-
const newSessionDir = join(newProjectDir, 'sessions', LEGACY_DEFAULT_SESSION_ID)
|
|
328
|
-
const newRunsDir = join(newSessionDir, 'runs')
|
|
329
|
-
|
|
330
|
-
// Ensure parent path exists for the atomic rename of `runs/`.
|
|
331
|
-
try {
|
|
332
|
-
await mkdir(newSessionDir, { recursive: true })
|
|
333
|
-
} catch (cause) {
|
|
334
|
-
throw new FilesystemMigrationError({
|
|
335
|
-
op: 'mkdir_session',
|
|
336
|
-
path: newSessionDir,
|
|
337
|
-
cause,
|
|
338
|
-
})
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// Move the whole `runs/` subtree in a single rename — atomic on
|
|
342
|
-
// same-filesystem, EXDEV on cross-mount (documented limitation).
|
|
343
|
-
const legacyRunsExists = await directoryExists(legacyRunsDir)
|
|
344
|
-
if (legacyRunsExists) {
|
|
345
|
-
try {
|
|
346
|
-
await rename(legacyRunsDir, newRunsDir)
|
|
347
|
-
} catch (cause) {
|
|
348
|
-
throw new FilesystemMigrationError({
|
|
349
|
-
op: 'rename_runs',
|
|
350
|
-
path: legacyRunsDir,
|
|
351
|
-
cause,
|
|
352
|
-
})
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
// Step 4b: synthesize project.json via write-tmp-rename.
|
|
357
|
-
const projectJson: SyntheticProject = {
|
|
358
|
-
id: newProjectId,
|
|
359
|
-
tenantId: UNKNOWN_TENANT_ID,
|
|
360
|
-
name: `legacy ${legacyThreadId}`,
|
|
361
|
-
config: {
|
|
362
|
-
maxDelegationDepth: 4,
|
|
363
|
-
maxDelegationWidth: 8,
|
|
364
|
-
maxInterventionDepth: 10,
|
|
365
|
-
},
|
|
366
|
-
createdAt: now.toISOString(),
|
|
367
|
-
updatedAt: now.toISOString(),
|
|
368
|
-
_legacy: true,
|
|
369
|
-
}
|
|
370
|
-
const projectJsonPath = join(newProjectDir, 'project.json')
|
|
371
|
-
try {
|
|
372
|
-
await atomicWriteJson(projectJsonPath, projectJson)
|
|
373
|
-
} catch (cause) {
|
|
374
|
-
throw new FilesystemMigrationError({
|
|
375
|
-
op: 'write_project_json',
|
|
376
|
-
path: projectJsonPath,
|
|
377
|
-
cause,
|
|
378
|
-
})
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Step 4c: synthesize session.json for the legacy-default session.
|
|
382
|
-
const sessionJson: SyntheticSession = {
|
|
383
|
-
id: LEGACY_DEFAULT_SESSION_ID,
|
|
384
|
-
projectId: newProjectId,
|
|
385
|
-
tenantId: UNKNOWN_TENANT_ID,
|
|
386
|
-
status: 'idle',
|
|
387
|
-
currentActor: null,
|
|
388
|
-
previousActors: [],
|
|
389
|
-
workspaceId: null,
|
|
390
|
-
ownerVersion: 0,
|
|
391
|
-
createdAt: now.toISOString(),
|
|
392
|
-
updatedAt: now.toISOString(),
|
|
393
|
-
_legacy: true,
|
|
394
|
-
}
|
|
395
|
-
const sessionJsonPath = join(newSessionDir, 'session.json')
|
|
396
|
-
try {
|
|
397
|
-
await atomicWriteJson(sessionJsonPath, sessionJson)
|
|
398
|
-
} catch (cause) {
|
|
399
|
-
throw new FilesystemMigrationError({
|
|
400
|
-
op: 'write_session_json',
|
|
401
|
-
path: sessionJsonPath,
|
|
402
|
-
cause,
|
|
403
|
-
})
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
migrated.push({ legacyThreadId, newProjectId })
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Step 5: write the completion marker last. Presence = done.
|
|
410
|
-
try {
|
|
411
|
-
await writeMarker(markerPath, {
|
|
412
|
-
version: MIGRATION_VERSION,
|
|
413
|
-
at: now,
|
|
414
|
-
migratedThreads: migrated,
|
|
415
|
-
})
|
|
416
|
-
} catch (cause) {
|
|
417
|
-
throw new FilesystemMigrationError({
|
|
418
|
-
op: 'write_marker',
|
|
419
|
-
path: markerPath,
|
|
420
|
-
cause,
|
|
421
|
-
})
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
const result: FilesystemMigrationResult = {
|
|
425
|
-
kind: 'migrated',
|
|
426
|
-
migratedThreads: migrated,
|
|
427
|
-
markerPath,
|
|
428
|
-
at: now,
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// Step 6: emit event.
|
|
432
|
-
this.sink.emit({ type: 'filesystem.migrated', result })
|
|
433
|
-
|
|
434
|
-
return result
|
|
435
|
-
} finally {
|
|
436
|
-
// Always release the lock — even on failure, a crashed run with the
|
|
437
|
-
// main marker absent will retry on the next boot; the stale `.tmp`
|
|
438
|
-
// would otherwise wedge that retry.
|
|
439
|
-
await releaseMigrationLock(lockPath).catch(() => undefined)
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* The duplication this replaced existed to keep `session/migration/` free
|
|
446
|
-
* of an inbound dependency on the store layer, which was the right
|
|
447
|
-
* instinct — and it also meant this copy kept the fixed sidecar name after
|
|
448
|
-
* the stores were fixed. Living in `utils/` satisfies both: everything may
|
|
449
|
-
* depend on it, so there is nothing left to duplicate.
|
|
450
|
-
*/
|
|
451
|
-
async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {
|
|
452
|
-
await atomicWriteFile(filePath, JSON.stringify(value, null, 2))
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
async function directoryExists(path: string): Promise<boolean> {
|
|
456
|
-
try {
|
|
457
|
-
const s = await stat(path)
|
|
458
|
-
return s.isDirectory()
|
|
459
|
-
} catch (err) {
|
|
460
|
-
const code = (err as NodeJS.ErrnoException).code
|
|
461
|
-
if (code === 'ENOENT') return false
|
|
462
|
-
throw err
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
function sleep(ms: number): Promise<void> {
|
|
467
|
-
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
468
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ID-prefix migration window — read-side compat for the pre-0.2.0 top-level
|
|
3
|
-
* `thd_*` container id (D2 meaning (a), ses_020). NZ-TOPIC-04 narrowed the
|
|
4
|
-
* Topic layer's own id (D2 meaning (b)) to `top_*`, so as of this release
|
|
5
|
-
* `thd_*` means ONLY the legacy container everywhere in this codebase — see
|
|
6
|
-
* `types/ids/index.ts` for where the two meanings used to collide.
|
|
7
|
-
*
|
|
8
|
-
* Consumers that touch raw legacy container IDs (the filesystem migrator,
|
|
9
|
-
* wire decoders, CLI imports) route through {@link acceptLegacyContainerId}
|
|
10
|
-
* so the warning signal is structured rather than ad-hoc console output
|
|
11
|
-
* (Convention #18).
|
|
12
|
-
*
|
|
13
|
-
* | Window state | Reader accepts | Writer emits | Legacy read behaviour |
|
|
14
|
-
* |--------------|---------------------|--------------|-------------------------------|
|
|
15
|
-
* | OPEN (now) | `thd_*` AND `prj_*` | `prj_*` only | emits `MigrationWarning` once |
|
|
16
|
-
* | CLOSED | `prj_*` only | `prj_*` only | rejects `StalePrefixError` |
|
|
17
|
-
*
|
|
18
|
-
* The {@link WINDOW_OPEN} constant is the module-level default for
|
|
19
|
-
* {@link acceptLegacyContainerId}'s `windowOpen` parameter — the single
|
|
20
|
-
* knob that flips this module from soft-accept to hard-reject in
|
|
21
|
-
* production. The writer guard {@link rejectLegacyContainerPrefix} has no
|
|
22
|
-
* such fork: a writer must never emit `thd_*` in EITHER window state (see
|
|
23
|
-
* the table's Writer column, unchanged across both rows), so it takes no
|
|
24
|
-
* `windowOpen` parameter at all — one would be unused, which is its own
|
|
25
|
-
* failure mode (a-check-that-cannot-fail, applied to an argument no less
|
|
26
|
-
* than to a branch). Convention #0: no silent long-lived compat — the
|
|
27
|
-
* window is explicit and fails closed when closed.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
import type { ProjectId } from '../../types/session/ids.js'
|
|
31
|
-
import { asProjectId } from '../../utils/id.js'
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Structured event emitted when the reader accepts a legacy `thd_*` ID.
|
|
35
|
-
*
|
|
36
|
-
* Shape is stable across the 0.2.x window — platform consumers can wire
|
|
37
|
-
* this into their observability pipeline (metrics, audit log) without
|
|
38
|
-
* string parsing (Convention #18).
|
|
39
|
-
*/
|
|
40
|
-
export interface MigrationWarning {
|
|
41
|
-
kind: 'id_prefix_legacy_read'
|
|
42
|
-
legacyId: string
|
|
43
|
-
normalizedId: ProjectId
|
|
44
|
-
at: Date
|
|
45
|
-
emittedOncePerProcess: true
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** Sink contract — one `emit` method so callers can swap implementations. */
|
|
49
|
-
export interface MigrationWarningSink {
|
|
50
|
-
emit(warning: MigrationWarning): void
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Default sink used when consumers do not inject one. Drops warnings on the
|
|
55
|
-
* floor — migration still runs; observers just lose the signal. Convention
|
|
56
|
-
* #5 deny-by-default applies to behaviour, not telemetry; missing a warning
|
|
57
|
-
* sink is not a failure mode.
|
|
58
|
-
*/
|
|
59
|
-
export const NOOP_MIGRATION_WARNING_SINK: MigrationWarningSink = {
|
|
60
|
-
emit() {},
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Raised when the reader encounters a string that is neither a valid
|
|
65
|
-
* `prj_*` nor `thd_*` prefix. In the 0.3.x window the legacy branch will
|
|
66
|
-
* also throw this error — flip {@link WINDOW_OPEN} to `false` to cut over.
|
|
67
|
-
*/
|
|
68
|
-
export class StalePrefixError extends Error {
|
|
69
|
-
readonly details: { rawId: string; kind: 'thd_rejected' | 'unknown_prefix' }
|
|
70
|
-
|
|
71
|
-
constructor(details: { rawId: string; kind: 'thd_rejected' | 'unknown_prefix' }) {
|
|
72
|
-
const reason =
|
|
73
|
-
details.kind === 'thd_rejected'
|
|
74
|
-
? `Stale legacy container id prefix '${details.rawId.slice(0, 4)}…' — run 'namzu sdk migrate-ids' before 0.3.0`
|
|
75
|
-
: `Unknown ID prefix '${details.rawId.slice(0, 4)}…' — expected 'prj_' or 'thd_'`
|
|
76
|
-
super(reason)
|
|
77
|
-
this.name = 'StalePrefixError'
|
|
78
|
-
this.details = details
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* 0.2.x: compat window OPEN — `thd_*` coerces to `prj_*` with a warning.
|
|
84
|
-
* 0.3.x: flip to `false` — legacy branch becomes throw-only.
|
|
85
|
-
*/
|
|
86
|
-
export const WINDOW_OPEN = true
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Process-lifetime dedup map. Keyed by raw legacy ID so each distinct legacy
|
|
90
|
-
* string emits exactly one warning — spamming observability on a hot loop
|
|
91
|
-
* of reads is the anti-goal.
|
|
92
|
-
*/
|
|
93
|
-
const seenLegacy = new Set<string>()
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Accept-on-read for legacy container `thd_*` IDs during the 0.2.x window.
|
|
97
|
-
*
|
|
98
|
-
* Contract:
|
|
99
|
-
* - `prj_*` inputs return as-is; no warning emitted.
|
|
100
|
-
* - `thd_*` inputs normalize to `prj_<suffix>` and emit a single
|
|
101
|
-
* {@link MigrationWarning} per distinct input string per process.
|
|
102
|
-
* - Everything else (including a live `top_*` Topic id — NZ-TOPIC-04)
|
|
103
|
-
* throws {@link StalePrefixError} with `kind: 'unknown_prefix'}`.
|
|
104
|
-
* - `windowOpen` (default {@link WINDOW_OPEN}) is an explicit parameter
|
|
105
|
-
* rather than a read of the module constant so the CLOSED branch below
|
|
106
|
-
* is reachable from a test without mutating shared module state
|
|
107
|
-
* (a-check-that-cannot-fail). When `false`, the `thd_*` branch throws
|
|
108
|
-
* too — single knob, single commit, now also a single argument a test
|
|
109
|
-
* can flip per-call.
|
|
110
|
-
*
|
|
111
|
-
* Testing hook: {@link __resetSeenLegacyForTests} clears the dedup Set so
|
|
112
|
-
* each test starts with a clean emission history.
|
|
113
|
-
*/
|
|
114
|
-
export function acceptLegacyContainerId(
|
|
115
|
-
raw: string,
|
|
116
|
-
sink: MigrationWarningSink,
|
|
117
|
-
windowOpen: boolean = WINDOW_OPEN,
|
|
118
|
-
): ProjectId {
|
|
119
|
-
if (raw.startsWith('prj_')) {
|
|
120
|
-
return raw as ProjectId
|
|
121
|
-
}
|
|
122
|
-
if (raw.startsWith('thd_')) {
|
|
123
|
-
if (!windowOpen) {
|
|
124
|
-
throw new StalePrefixError({ rawId: raw, kind: 'thd_rejected' })
|
|
125
|
-
}
|
|
126
|
-
const normalized = asProjectId(`prj_${raw.slice('thd_'.length)}`)
|
|
127
|
-
if (!seenLegacy.has(raw)) {
|
|
128
|
-
seenLegacy.add(raw)
|
|
129
|
-
sink.emit({
|
|
130
|
-
kind: 'id_prefix_legacy_read',
|
|
131
|
-
legacyId: raw,
|
|
132
|
-
normalizedId: normalized,
|
|
133
|
-
at: new Date(),
|
|
134
|
-
emittedOncePerProcess: true,
|
|
135
|
-
})
|
|
136
|
-
}
|
|
137
|
-
return normalized
|
|
138
|
-
}
|
|
139
|
-
throw new StalePrefixError({ rawId: raw, kind: 'unknown_prefix' })
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Writer guard: reject emission of a legacy container `thd_*` id at encode
|
|
144
|
-
* time. Phase 1's {@link generateProjectId} already emits `prj_*` only;
|
|
145
|
-
* this helper exists so write paths that handle raw strings (e.g.
|
|
146
|
-
* synthesis during filesystem migration) can fail fast on accidental
|
|
147
|
-
* legacy re-emission. No `windowOpen` parameter — unlike the reader above,
|
|
148
|
-
* this guard's outcome does not fork on migration-window state; a writer
|
|
149
|
-
* must never emit `thd_*` in either window (see the module header's
|
|
150
|
-
* Writer column). Convention #0: no silent back-sliding to the old prefix.
|
|
151
|
-
*/
|
|
152
|
-
export function rejectLegacyContainerPrefix(id: string): void {
|
|
153
|
-
if (id.startsWith('thd_')) {
|
|
154
|
-
throw new StalePrefixError({ rawId: id, kind: 'thd_rejected' })
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Test-only: clear the process-level dedup Set so subsequent
|
|
160
|
-
* {@link acceptLegacyContainerId} calls emit warnings again. Production code
|
|
161
|
-
* must never call this — the whole point is one warning per distinct
|
|
162
|
-
* legacy id per process.
|
|
163
|
-
*/
|
|
164
|
-
export function __resetSeenLegacyForTests(): void {
|
|
165
|
-
seenLegacy.clear()
|
|
166
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// Sub-barrel for the migration module (Convention #4).
|
|
2
|
-
// Public surface for boot-time FS re-layout + ID-prefix read-accept.
|
|
3
|
-
// See session-hierarchy.md §13.3.1 (ID prefix) + §13.4.1 (filesystem).
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
acceptLegacyContainerId,
|
|
7
|
-
/** @deprecated Use `acceptLegacyContainerId`. */
|
|
8
|
-
rejectLegacyContainerPrefix,
|
|
9
|
-
/** @deprecated Use `rejectLegacyContainerPrefix`. */
|
|
10
|
-
NOOP_MIGRATION_WARNING_SINK,
|
|
11
|
-
StalePrefixError,
|
|
12
|
-
WINDOW_OPEN,
|
|
13
|
-
} from './id-prefix.js'
|
|
14
|
-
export type { MigrationWarning, MigrationWarningSink } from './id-prefix.js'
|
|
15
|
-
|
|
16
|
-
export {
|
|
17
|
-
DefaultFilesystemMigrator,
|
|
18
|
-
loggingMigrationSink,
|
|
19
|
-
NOOP_FILESYSTEM_MIGRATION_SINK,
|
|
20
|
-
LEGACY_DEFAULT_SESSION_ID,
|
|
21
|
-
LEGACY_DEFAULT_PROJECT_PREFIX,
|
|
22
|
-
MIGRATION_VERSION,
|
|
23
|
-
MARKER_REL_PATH,
|
|
24
|
-
LOCK_REL_PATH,
|
|
25
|
-
} from './filesystem.js'
|
|
26
|
-
export type {
|
|
27
|
-
FilesystemMigrator,
|
|
28
|
-
FilesystemMigrationResult,
|
|
29
|
-
FilesystemMigrationEvent,
|
|
30
|
-
FilesystemMigrationSink,
|
|
31
|
-
} from './filesystem.js'
|
|
32
|
-
|
|
33
|
-
export {
|
|
34
|
-
readMarker,
|
|
35
|
-
writeMarker,
|
|
36
|
-
acquireMigrationLock,
|
|
37
|
-
releaseMigrationLock,
|
|
38
|
-
} from './marker.js'
|
|
39
|
-
export type { MigrationMarker } from './marker.js'
|
|
40
|
-
|
|
41
|
-
export { FilesystemMigrationError } from './errors.js'
|