@cleocode/core 2026.9.20 → 2026.9.22
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/dist/adapters/discovery.d.ts.map +1 -1
- package/dist/adapters/discovery.js +3 -10
- package/dist/adapters/discovery.js.map +1 -1
- package/dist/adrs/link-pipeline.js +2 -2
- package/dist/adrs/link-pipeline.js.map +1 -1
- package/dist/adrs/parse.js +3 -3
- package/dist/adrs/parse.js.map +1 -1
- package/dist/agents/invoke-meta-agent.d.ts.map +1 -1
- package/dist/agents/invoke-meta-agent.js +8 -4
- package/dist/agents/invoke-meta-agent.js.map +1 -1
- package/dist/agents/scaffold.d.ts.map +1 -1
- package/dist/agents/scaffold.js +0 -1
- package/dist/agents/scaffold.js.map +1 -1
- package/dist/bootstrap.d.ts +5 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +45 -21
- package/dist/bootstrap.js.map +1 -1
- package/dist/cloud/crypto.d.ts +47 -0
- package/dist/cloud/crypto.d.ts.map +1 -0
- package/dist/cloud/crypto.js +223 -0
- package/dist/cloud/crypto.js.map +1 -0
- package/dist/cloud/http.d.ts +52 -0
- package/dist/cloud/http.d.ts.map +1 -0
- package/dist/cloud/http.js +98 -0
- package/dist/cloud/http.js.map +1 -0
- package/dist/cloud/index.d.ts +19 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +19 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/journal.d.ts +169 -0
- package/dist/cloud/journal.d.ts.map +1 -0
- package/dist/cloud/journal.js +428 -0
- package/dist/cloud/journal.js.map +1 -0
- package/dist/cloud/keys.d.ts +213 -0
- package/dist/cloud/keys.d.ts.map +1 -0
- package/dist/cloud/keys.js +362 -0
- package/dist/cloud/keys.js.map +1 -0
- package/dist/cloud/manifest-check.d.ts +36 -0
- package/dist/cloud/manifest-check.d.ts.map +1 -0
- package/dist/cloud/manifest-check.js +70 -0
- package/dist/cloud/manifest-check.js.map +1 -0
- package/dist/cloud/projects.d.ts +13 -0
- package/dist/cloud/projects.d.ts.map +1 -0
- package/dist/cloud/projects.js +11 -0
- package/dist/cloud/projects.js.map +1 -0
- package/dist/cloud/signing.d.ts +105 -0
- package/dist/cloud/signing.d.ts.map +1 -0
- package/dist/cloud/signing.js +117 -0
- package/dist/cloud/signing.js.map +1 -0
- package/dist/cloud/streams.d.ts +6 -0
- package/dist/cloud/streams.d.ts.map +1 -0
- package/dist/cloud/streams.js +5 -0
- package/dist/cloud/streams.js.map +1 -0
- package/dist/decide/audit.d.ts +131 -0
- package/dist/decide/audit.d.ts.map +1 -0
- package/dist/decide/audit.js +98 -0
- package/dist/decide/audit.js.map +1 -0
- package/dist/decide/budget.d.ts +91 -0
- package/dist/decide/budget.d.ts.map +1 -0
- package/dist/decide/budget.js +194 -0
- package/dist/decide/budget.js.map +1 -0
- package/dist/decide/cache.d.ts +49 -0
- package/dist/decide/cache.d.ts.map +1 -0
- package/dist/decide/cache.js +87 -0
- package/dist/decide/cache.js.map +1 -0
- package/dist/decide/client.d.ts +103 -0
- package/dist/decide/client.d.ts.map +1 -0
- package/dist/decide/client.js +262 -0
- package/dist/decide/client.js.map +1 -0
- package/dist/decide/credentials.d.ts +159 -0
- package/dist/decide/credentials.d.ts.map +1 -0
- package/dist/decide/credentials.js +383 -0
- package/dist/decide/credentials.js.map +1 -0
- package/dist/decide/index.d.ts +18 -0
- package/dist/decide/index.d.ts.map +1 -0
- package/dist/decide/index.js +18 -0
- package/dist/decide/index.js.map +1 -0
- package/dist/decide/jev-wire.d.ts +155 -0
- package/dist/decide/jev-wire.d.ts.map +1 -0
- package/dist/decide/jev-wire.js +420 -0
- package/dist/decide/jev-wire.js.map +1 -0
- package/dist/decide/operations.d.ts +152 -0
- package/dist/decide/operations.d.ts.map +1 -0
- package/dist/decide/operations.js +199 -0
- package/dist/decide/operations.js.map +1 -0
- package/dist/decide/provider.d.ts +90 -0
- package/dist/decide/provider.d.ts.map +1 -0
- package/dist/decide/provider.js +43 -0
- package/dist/decide/provider.js.map +1 -0
- package/dist/decide/site.d.ts +148 -0
- package/dist/decide/site.d.ts.map +1 -0
- package/dist/decide/site.js +181 -0
- package/dist/decide/site.js.map +1 -0
- package/dist/decide/transport.d.ts +67 -0
- package/dist/decide/transport.d.ts.map +1 -0
- package/dist/decide/transport.js +350 -0
- package/dist/decide/transport.js.map +1 -0
- package/dist/dispatch/mutate-projection.d.ts.map +1 -1
- package/dist/dispatch/mutate-projection.js +5 -0
- package/dist/dispatch/mutate-projection.js.map +1 -1
- package/dist/docs/docs-update.d.ts.map +1 -1
- package/dist/docs/docs-update.js +25 -9
- package/dist/docs/docs-update.js.map +1 -1
- package/dist/docs/export-document.js +5963 -2406
- package/dist/docs/export-document.js.map +3 -3
- package/dist/docs/index.d.ts +2 -2
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +1 -1
- package/dist/docs/index.js.map +1 -1
- package/dist/docs/projection.d.ts.map +1 -1
- package/dist/docs/projection.js +2 -3
- package/dist/docs/projection.js.map +1 -1
- package/dist/docs/publish-pr.d.ts +69 -1
- package/dist/docs/publish-pr.d.ts.map +1 -1
- package/dist/docs/publish-pr.js +112 -10
- package/dist/docs/publish-pr.js.map +1 -1
- package/dist/doctor/db-substrate.d.ts +13 -8
- package/dist/doctor/db-substrate.d.ts.map +1 -1
- package/dist/doctor/db-substrate.js +39 -26
- package/dist/doctor/db-substrate.js.map +1 -1
- package/dist/doctor/index.d.ts +2 -0
- package/dist/doctor/index.d.ts.map +1 -1
- package/dist/doctor/index.js +1 -0
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/knowledge.d.ts +16 -1
- package/dist/doctor/knowledge.d.ts.map +1 -1
- package/dist/doctor/knowledge.js +58 -32
- package/dist/doctor/knowledge.js.map +1 -1
- package/dist/doctor/nexus-schema-residency.d.ts +1 -1
- package/dist/doctor/nexus-schema-residency.d.ts.map +1 -1
- package/dist/doctor/nexus-schema-residency.js +3 -0
- package/dist/doctor/nexus-schema-residency.js.map +1 -1
- package/dist/doctor/project-identity.d.ts +44 -1
- package/dist/doctor/project-identity.d.ts.map +1 -1
- package/dist/doctor/project-identity.js +237 -10
- package/dist/doctor/project-identity.js.map +1 -1
- package/dist/doctor/projects.d.ts +170 -0
- package/dist/doctor/projects.d.ts.map +1 -0
- package/dist/doctor/projects.js +1075 -0
- package/dist/doctor/projects.js.map +1 -0
- package/dist/doctor/twin-collapse.d.ts +97 -0
- package/dist/doctor/twin-collapse.d.ts.map +1 -0
- package/dist/doctor/twin-collapse.js +168 -0
- package/dist/doctor/twin-collapse.js.map +1 -0
- package/dist/doctor/worktree-orphans.d.ts.map +1 -1
- package/dist/doctor/worktree-orphans.js +13 -29
- package/dist/doctor/worktree-orphans.js.map +1 -1
- package/dist/doctor/worktree-stores.d.ts +128 -0
- package/dist/doctor/worktree-stores.d.ts.map +1 -0
- package/dist/doctor/worktree-stores.js +374 -0
- package/dist/doctor/worktree-stores.js.map +1 -0
- package/dist/engine/engine-ops.d.ts +36 -6
- package/dist/engine/engine-ops.d.ts.map +1 -1
- package/dist/engine/engine-ops.js +115 -14
- package/dist/engine/engine-ops.js.map +1 -1
- package/dist/error-catalog.d.ts.map +1 -1
- package/dist/error-catalog.js +21 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/error-registry.d.ts.map +1 -1
- package/dist/error-registry.js +40 -0
- package/dist/error-registry.js.map +1 -1
- package/dist/gateway-client/generated/types.gen.d.ts +1 -1
- package/dist/gc/cleanup.d.ts.map +1 -1
- package/dist/gc/cleanup.js +32 -19
- package/dist/gc/cleanup.js.map +1 -1
- package/dist/git/bounded-git.d.ts +170 -0
- package/dist/git/bounded-git.d.ts.map +1 -0
- package/dist/git/bounded-git.js +371 -0
- package/dist/git/bounded-git.js.map +1 -0
- package/dist/git/work-tree.d.ts +20 -0
- package/dist/git/work-tree.d.ts.map +1 -1
- package/dist/git/work-tree.js +20 -2
- package/dist/git/work-tree.js.map +1 -1
- package/dist/hooks/handlers/session-hooks.d.ts +11 -26
- package/dist/hooks/handlers/session-hooks.d.ts.map +1 -1
- package/dist/hooks/handlers/session-hooks.js +18 -47
- package/dist/hooks/handlers/session-hooks.js.map +1 -1
- package/dist/hooks/payload-schemas.d.ts +2 -2
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/init/engine-ops.d.ts.map +1 -1
- package/dist/init/engine-ops.js +23 -1
- package/dist/init/engine-ops.js.map +1 -1
- package/dist/init.d.ts +158 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +578 -53
- package/dist/init.js.map +1 -1
- package/dist/inject/index.d.ts.map +1 -1
- package/dist/inject/index.js +8 -3
- package/dist/inject/index.js.map +1 -1
- package/dist/injection.d.ts +55 -0
- package/dist/injection.d.ts.map +1 -1
- package/dist/injection.js +102 -6
- package/dist/injection.js.map +1 -1
- package/dist/internal.d.ts +11 -7
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +9 -5
- package/dist/internal.js.map +1 -1
- package/dist/issue/diagnostics.d.ts.map +1 -1
- package/dist/issue/diagnostics.js +2 -1
- package/dist/issue/diagnostics.js.map +1 -1
- package/dist/lib/concurrency.d.ts +25 -0
- package/dist/lib/concurrency.d.ts.map +1 -0
- package/dist/lib/concurrency.js +43 -0
- package/dist/lib/concurrency.js.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lifecycle/engine-ops.d.ts.map +1 -1
- package/dist/lifecycle/engine-ops.js +4 -2
- package/dist/lifecycle/engine-ops.js.map +1 -1
- package/dist/lifecycle/stage-guidance.d.ts +5 -0
- package/dist/lifecycle/stage-guidance.d.ts.map +1 -1
- package/dist/lifecycle/stage-guidance.js +14 -4
- package/dist/lifecycle/stage-guidance.js.map +1 -1
- package/dist/llm/catalog-cache.d.ts +3 -2
- package/dist/llm/catalog-cache.d.ts.map +1 -1
- package/dist/llm/catalog-cache.js +5 -5
- package/dist/llm/catalog-cache.js.map +1 -1
- package/dist/llm/credentials.d.ts +4 -4
- package/dist/llm/credentials.js +6 -6
- package/dist/llm/credentials.js.map +1 -1
- package/dist/llm/plugin-facade.js +4400 -1801
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/llm/stable-device-id.d.ts.map +1 -1
- package/dist/llm/stable-device-id.js +3 -5
- package/dist/llm/stable-device-id.js.map +1 -1
- package/dist/memory/attention.js +31 -31
- package/dist/memory/attention.js.map +1 -1
- package/dist/memory/decision-contradiction.d.ts +152 -0
- package/dist/memory/decision-contradiction.d.ts.map +1 -0
- package/dist/memory/decision-contradiction.js +273 -0
- package/dist/memory/decision-contradiction.js.map +1 -0
- package/dist/memory/decisions.d.ts +42 -11
- package/dist/memory/decisions.d.ts.map +1 -1
- package/dist/memory/decisions.js +153 -56
- package/dist/memory/decisions.js.map +1 -1
- package/dist/memory/dialectic-evaluator.d.ts +7 -0
- package/dist/memory/dialectic-evaluator.d.ts.map +1 -1
- package/dist/memory/dialectic-evaluator.js +23 -8
- package/dist/memory/dialectic-evaluator.js.map +1 -1
- package/dist/memory/dispatch-trace-format.d.ts +39 -0
- package/dist/memory/dispatch-trace-format.d.ts.map +1 -0
- package/dist/memory/dispatch-trace-format.js +54 -0
- package/dist/memory/dispatch-trace-format.js.map +1 -0
- package/dist/memory/dispatch-trace.d.ts.map +1 -1
- package/dist/memory/dispatch-trace.js +1 -27
- package/dist/memory/dispatch-trace.js.map +1 -1
- package/dist/memory/engine-compat.d.ts +2 -0
- package/dist/memory/engine-compat.d.ts.map +1 -1
- package/dist/memory/engine-compat.js +1 -0
- package/dist/memory/engine-compat.js.map +1 -1
- package/dist/memory/import-from-provider.js +3 -3
- package/dist/memory/import-from-provider.js.map +1 -1
- package/dist/memory/learnings.d.ts +2 -2
- package/dist/memory/observation-type-decision.d.ts +96 -0
- package/dist/memory/observation-type-decision.d.ts.map +1 -0
- package/dist/memory/observation-type-decision.js +218 -0
- package/dist/memory/observation-type-decision.js.map +1 -0
- package/dist/memory/redaction.js +2 -0
- package/dist/memory/redaction.js.map +1 -1
- package/dist/memory/retrieval/build-retrieval-bundle.d.ts +9 -2
- package/dist/memory/retrieval/build-retrieval-bundle.d.ts.map +1 -1
- package/dist/memory/retrieval/build-retrieval-bundle.js +42 -11
- package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
- package/dist/memory/retrieval/get-current-session-id.d.ts +5 -0
- package/dist/memory/retrieval/get-current-session-id.d.ts.map +1 -1
- package/dist/memory/retrieval/get-current-session-id.js +7 -2
- package/dist/memory/retrieval/get-current-session-id.js.map +1 -1
- package/dist/memory/retrieval/observe.d.ts.map +1 -1
- package/dist/memory/retrieval/observe.js +30 -29
- package/dist/memory/retrieval/observe.js.map +1 -1
- package/dist/nexus/analyze-orchestrator.d.ts +38 -0
- package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
- package/dist/nexus/analyze-orchestrator.js +136 -48
- package/dist/nexus/analyze-orchestrator.js.map +1 -1
- package/dist/nexus/assessment-projection.d.ts +76 -0
- package/dist/nexus/assessment-projection.d.ts.map +1 -0
- package/dist/nexus/assessment-projection.js +143 -0
- package/dist/nexus/assessment-projection.js.map +1 -0
- package/dist/nexus/assessment-store.d.ts +14 -2
- package/dist/nexus/assessment-store.d.ts.map +1 -1
- package/dist/nexus/assessment-store.js +21 -3
- package/dist/nexus/assessment-store.js.map +1 -1
- package/dist/nexus/checkout-nonce.d.ts +48 -0
- package/dist/nexus/checkout-nonce.d.ts.map +1 -0
- package/dist/nexus/checkout-nonce.js +84 -0
- package/dist/nexus/checkout-nonce.js.map +1 -0
- package/dist/nexus/devices.d.ts +93 -0
- package/dist/nexus/devices.d.ts.map +1 -0
- package/dist/nexus/devices.js +141 -0
- package/dist/nexus/devices.js.map +1 -0
- package/dist/nexus/freshness.d.ts.map +1 -1
- package/dist/nexus/freshness.js +25 -6
- package/dist/nexus/freshness.js.map +1 -1
- package/dist/nexus/git-state.d.ts +225 -0
- package/dist/nexus/git-state.d.ts.map +1 -0
- package/dist/nexus/git-state.js +677 -0
- package/dist/nexus/git-state.js.map +1 -0
- package/dist/nexus/graph-manifest.d.ts +20 -4
- package/dist/nexus/graph-manifest.d.ts.map +1 -1
- package/dist/nexus/graph-manifest.js +40 -5
- package/dist/nexus/graph-manifest.js.map +1 -1
- package/dist/nexus/identity.d.ts +68 -23
- package/dist/nexus/identity.d.ts.map +1 -1
- package/dist/nexus/identity.js +99 -22
- package/dist/nexus/identity.js.map +1 -1
- package/dist/nexus/index.d.ts +5 -2
- package/dist/nexus/index.d.ts.map +1 -1
- package/dist/nexus/index.js +10 -4
- package/dist/nexus/index.js.map +1 -1
- package/dist/nexus/knowledge.d.ts +5 -0
- package/dist/nexus/knowledge.d.ts.map +1 -1
- package/dist/nexus/knowledge.js +40 -5
- package/dist/nexus/knowledge.js.map +1 -1
- package/dist/nexus/legacy-alias.d.ts +60 -0
- package/dist/nexus/legacy-alias.d.ts.map +1 -0
- package/dist/nexus/legacy-alias.js +68 -0
- package/dist/nexus/legacy-alias.js.map +1 -0
- package/dist/nexus/migrate-json-to-sqlite.js +2 -2
- package/dist/nexus/migrate-json-to-sqlite.js.map +1 -1
- package/dist/nexus/ops.d.ts +1 -0
- package/dist/nexus/ops.d.ts.map +1 -1
- package/dist/nexus/path-map.d.ts +264 -20
- package/dist/nexus/path-map.d.ts.map +1 -1
- package/dist/nexus/path-map.js +580 -44
- package/dist/nexus/path-map.js.map +1 -1
- package/dist/nexus/projects-clean.d.ts +9 -1
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +126 -14
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/projects-scan.d.ts +56 -1
- package/dist/nexus/projects-scan.d.ts.map +1 -1
- package/dist/nexus/projects-scan.js +144 -3
- package/dist/nexus/projects-scan.js.map +1 -1
- package/dist/nexus/registry-hygiene.d.ts +18 -2
- package/dist/nexus/registry-hygiene.d.ts.map +1 -1
- package/dist/nexus/registry-hygiene.js +37 -11
- package/dist/nexus/registry-hygiene.js.map +1 -1
- package/dist/nexus/registry-roots.d.ts +47 -0
- package/dist/nexus/registry-roots.d.ts.map +1 -0
- package/dist/nexus/registry-roots.js +79 -0
- package/dist/nexus/registry-roots.js.map +1 -0
- package/dist/nexus/registry.d.ts +50 -9
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +311 -156
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/stored-roots.d.ts +171 -0
- package/dist/nexus/stored-roots.d.ts.map +1 -0
- package/dist/nexus/stored-roots.js +253 -0
- package/dist/nexus/stored-roots.js.map +1 -0
- package/dist/nexus/transfer.d.ts.map +1 -1
- package/dist/nexus/transfer.js +3 -0
- package/dist/nexus/transfer.js.map +1 -1
- package/dist/nexus/user-profile-hygiene.d.ts +168 -0
- package/dist/nexus/user-profile-hygiene.d.ts.map +1 -0
- package/dist/nexus/user-profile-hygiene.js +305 -0
- package/dist/nexus/user-profile-hygiene.js.map +1 -0
- package/dist/nexus/user-profile.d.ts +53 -2
- package/dist/nexus/user-profile.d.ts.map +1 -1
- package/dist/nexus/user-profile.js +106 -4
- package/dist/nexus/user-profile.js.map +1 -1
- package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
- package/dist/orchestrate/lifecycle-ops.js +4 -1
- package/dist/orchestrate/lifecycle-ops.js.map +1 -1
- package/dist/orchestrate/pivot.d.ts.map +1 -1
- package/dist/orchestrate/pivot.js +5 -1
- package/dist/orchestrate/pivot.js.map +1 -1
- package/dist/orchestrate/plan.d.ts.map +1 -1
- package/dist/orchestrate/plan.js +5 -2
- package/dist/orchestrate/plan.js.map +1 -1
- package/dist/orchestrate/query-ops.d.ts +7 -2
- package/dist/orchestrate/query-ops.d.ts.map +1 -1
- package/dist/orchestrate/query-ops.js +17 -6
- package/dist/orchestrate/query-ops.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts +12 -0
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +157 -71
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestration/bootstrap.d.ts.map +1 -1
- package/dist/orchestration/bootstrap.js +4 -2
- package/dist/orchestration/bootstrap.js.map +1 -1
- package/dist/orchestration/classify-readiness.d.ts +37 -1
- package/dist/orchestration/classify-readiness.d.ts.map +1 -1
- package/dist/orchestration/classify-readiness.js +48 -19
- package/dist/orchestration/classify-readiness.js.map +1 -1
- package/dist/orchestration/index.d.ts +4 -2
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +6 -4
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/lead-rollup.d.ts +8 -5
- package/dist/orchestration/lead-rollup.d.ts.map +1 -1
- package/dist/orchestration/lead-rollup.js +32 -15
- package/dist/orchestration/lead-rollup.js.map +1 -1
- package/dist/orchestration/owner-decision-readiness.d.ts +88 -0
- package/dist/orchestration/owner-decision-readiness.d.ts.map +1 -0
- package/dist/orchestration/owner-decision-readiness.js +152 -0
- package/dist/orchestration/owner-decision-readiness.js.map +1 -0
- package/dist/orchestration/parallel.d.ts.map +1 -1
- package/dist/orchestration/parallel.js +10 -17
- package/dist/orchestration/parallel.js.map +1 -1
- package/dist/orchestration/psyche-memory-budget.d.ts +105 -0
- package/dist/orchestration/psyche-memory-budget.d.ts.map +1 -0
- package/dist/orchestration/psyche-memory-budget.js +383 -0
- package/dist/orchestration/psyche-memory-budget.js.map +1 -0
- package/dist/orchestration/spawn-prompt.d.ts +16 -2
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +144 -181
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/orchestration/spawn.d.ts +7 -0
- package/dist/orchestration/spawn.d.ts.map +1 -1
- package/dist/orchestration/spawn.js +1 -0
- package/dist/orchestration/spawn.js.map +1 -1
- package/dist/orchestration/status.d.ts +8 -3
- package/dist/orchestration/status.d.ts.map +1 -1
- package/dist/orchestration/status.js +9 -6
- package/dist/orchestration/status.js.map +1 -1
- package/dist/orchestration/wave-topic.d.ts +54 -0
- package/dist/orchestration/wave-topic.d.ts.map +1 -0
- package/dist/orchestration/wave-topic.js +68 -0
- package/dist/orchestration/wave-topic.js.map +1 -0
- package/dist/orchestration/waves.d.ts +47 -8
- package/dist/orchestration/waves.d.ts.map +1 -1
- package/dist/orchestration/waves.js +152 -43
- package/dist/orchestration/waves.js.map +1 -1
- package/dist/paths.d.ts +24 -8
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +135 -71
- package/dist/paths.js.map +1 -1
- package/dist/phases/index.d.ts.map +1 -1
- package/dist/phases/index.js +6 -2
- package/dist/phases/index.js.map +1 -1
- package/dist/platform.d.ts +6 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +8 -19
- package/dist/platform.js.map +1 -1
- package/dist/project-info.d.ts +18 -0
- package/dist/project-info.d.ts.map +1 -1
- package/dist/project-info.js +29 -1
- package/dist/project-info.js.map +1 -1
- package/dist/project-lifecycle.d.ts +91 -32
- package/dist/project-lifecycle.d.ts.map +1 -1
- package/dist/project-lifecycle.js +639 -75
- package/dist/project-lifecycle.js.map +1 -1
- package/dist/project-scope.d.ts +104 -4
- package/dist/project-scope.d.ts.map +1 -1
- package/dist/project-scope.js +263 -13
- package/dist/project-scope.js.map +1 -1
- package/dist/project-tombstone.d.ts +111 -0
- package/dist/project-tombstone.d.ts.map +1 -0
- package/dist/project-tombstone.js +220 -0
- package/dist/project-tombstone.js.map +1 -0
- package/dist/release/artifacts.d.ts.map +1 -1
- package/dist/release/artifacts.js +14 -9
- package/dist/release/artifacts.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +233 -0
- package/dist/release/ci-evidence.d.ts.map +1 -0
- package/dist/release/ci-evidence.js +668 -0
- package/dist/release/ci-evidence.js.map +1 -0
- package/dist/release/engine-ops.d.ts.map +1 -1
- package/dist/release/engine-ops.js +3 -3
- package/dist/release/engine-ops.js.map +1 -1
- package/dist/release/github-pr.d.ts +30 -0
- package/dist/release/github-pr.d.ts.map +1 -1
- package/dist/release/github-pr.js +40 -0
- package/dist/release/github-pr.js.map +1 -1
- package/dist/release/plan.d.ts.map +1 -1
- package/dist/release/plan.js +11 -7
- package/dist/release/plan.js.map +1 -1
- package/dist/release/pr-evidence.d.ts +38 -0
- package/dist/release/pr-evidence.d.ts.map +1 -1
- package/dist/release/pr-evidence.js +79 -15
- package/dist/release/pr-evidence.js.map +1 -1
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +3 -2
- package/dist/release/reconcile.js.map +1 -1
- package/dist/release/release-manifest.d.ts +2 -1
- package/dist/release/release-manifest.d.ts.map +1 -1
- package/dist/release/release-manifest.js +6 -5
- package/dist/release/release-manifest.js.map +1 -1
- package/dist/render/nexus/graph/index.d.ts +4 -0
- package/dist/render/nexus/graph/index.d.ts.map +1 -1
- package/dist/render/nexus/graph/index.js +57 -0
- package/dist/render/nexus/graph/index.js.map +1 -1
- package/dist/resources/spawn-wrapper.d.ts +8 -1
- package/dist/resources/spawn-wrapper.d.ts.map +1 -1
- package/dist/resources/spawn-wrapper.js +42 -5
- package/dist/resources/spawn-wrapper.js.map +1 -1
- package/dist/routing/build-command-groups.d.ts.map +1 -1
- package/dist/routing/build-command-groups.js +1 -0
- package/dist/routing/build-command-groups.js.map +1 -1
- package/dist/sagas/index.d.ts +1 -1
- package/dist/sagas/index.d.ts.map +1 -1
- package/dist/sagas/index.js +1 -1
- package/dist/sagas/index.js.map +1 -1
- package/dist/sagas/reconcile.d.ts +24 -4
- package/dist/sagas/reconcile.d.ts.map +1 -1
- package/dist/sagas/reconcile.js +226 -100
- package/dist/sagas/reconcile.js.map +1 -1
- package/dist/scaffold/ensure-config.d.ts.map +1 -1
- package/dist/scaffold/ensure-config.js +31 -1
- package/dist/scaffold/ensure-config.js.map +1 -1
- package/dist/scaffold/project-identity.d.ts +2 -8
- package/dist/scaffold/project-identity.d.ts.map +1 -1
- package/dist/scaffold/project-identity.js +5 -21
- package/dist/scaffold/project-identity.js.map +1 -1
- package/dist/security/input-sanitization.d.ts +9 -1
- package/dist/security/input-sanitization.d.ts.map +1 -1
- package/dist/security/input-sanitization.js +20 -3
- package/dist/security/input-sanitization.js.map +1 -1
- package/dist/selfimprove/fix-gen.js +4409 -1810
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/sentient/propose-tick.d.ts.map +1 -1
- package/dist/sentient/propose-tick.js +4 -2
- package/dist/sentient/propose-tick.js.map +1 -1
- package/dist/sequence/index.d.ts.map +1 -1
- package/dist/sequence/index.js +6 -23
- package/dist/sequence/index.js.map +1 -1
- package/dist/session/engine-ops.d.ts +15 -0
- package/dist/session/engine-ops.d.ts.map +1 -1
- package/dist/session/engine-ops.js +146 -22
- package/dist/session/engine-ops.js.map +1 -1
- package/dist/sessions/assumptions.d.ts.map +1 -1
- package/dist/sessions/assumptions.js +7 -4
- package/dist/sessions/assumptions.js.map +1 -1
- package/dist/sessions/briefing.d.ts +23 -0
- package/dist/sessions/briefing.d.ts.map +1 -1
- package/dist/sessions/briefing.js +59 -9
- package/dist/sessions/briefing.js.map +1 -1
- package/dist/sessions/decisions.d.ts +38 -3
- package/dist/sessions/decisions.d.ts.map +1 -1
- package/dist/sessions/decisions.js +235 -21
- package/dist/sessions/decisions.js.map +1 -1
- package/dist/sessions/drift-watchdog.d.ts.map +1 -1
- package/dist/sessions/drift-watchdog.js +8 -5
- package/dist/sessions/drift-watchdog.js.map +1 -1
- package/dist/sessions/focus-state-store.d.ts +89 -1
- package/dist/sessions/focus-state-store.d.ts.map +1 -1
- package/dist/sessions/focus-state-store.js +97 -1
- package/dist/sessions/focus-state-store.js.map +1 -1
- package/dist/sessions/index.d.ts +2 -2
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +34 -5
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/session-drift.d.ts.map +1 -1
- package/dist/sessions/session-drift.js +4 -3
- package/dist/sessions/session-drift.js.map +1 -1
- package/dist/sessions/session-end-snapshot-entry.d.ts +26 -0
- package/dist/sessions/session-end-snapshot-entry.d.ts.map +1 -0
- package/dist/sessions/session-end-snapshot-entry.js +59 -0
- package/dist/sessions/session-end-snapshot-entry.js.map +1 -0
- package/dist/sessions/session-end-snapshot.d.ts +114 -0
- package/dist/sessions/session-end-snapshot.d.ts.map +1 -0
- package/dist/sessions/session-end-snapshot.js +446 -0
- package/dist/sessions/session-end-snapshot.js.map +1 -0
- package/dist/sessions/session-manifest-mirror.d.ts.map +1 -1
- package/dist/sessions/session-manifest-mirror.js +10 -17
- package/dist/sessions/session-manifest-mirror.js.map +1 -1
- package/dist/sessions/session-switch.d.ts.map +1 -1
- package/dist/sessions/session-switch.js +5 -3
- package/dist/sessions/session-switch.js.map +1 -1
- package/dist/sessions/snapshot.d.ts.map +1 -1
- package/dist/sessions/snapshot.js +5 -4
- package/dist/sessions/snapshot.js.map +1 -1
- package/dist/sessions/terminal-identity.d.ts +169 -0
- package/dist/sessions/terminal-identity.d.ts.map +1 -0
- package/dist/sessions/terminal-identity.js +273 -0
- package/dist/sessions/terminal-identity.js.map +1 -0
- package/dist/setup/sections/verification.d.ts +1 -1
- package/dist/setup/sections/verification.d.ts.map +1 -1
- package/dist/setup/sections/verification.js +11 -15
- package/dist/setup/sections/verification.js.map +1 -1
- package/dist/skills/discovery.d.ts +20 -3
- package/dist/skills/discovery.d.ts.map +1 -1
- package/dist/skills/discovery.js +41 -4
- package/dist/skills/discovery.js.map +1 -1
- package/dist/skills/dispatch.d.ts +5 -2
- package/dist/skills/dispatch.d.ts.map +1 -1
- package/dist/skills/dispatch.js +5 -2
- package/dist/skills/dispatch.js.map +1 -1
- package/dist/skills/doctor.d.ts.map +1 -1
- package/dist/skills/doctor.js +5 -1
- package/dist/skills/doctor.js.map +1 -1
- package/dist/skills/federated-search.js +2 -2
- package/dist/skills/federated-search.js.map +1 -1
- package/dist/skills/index.d.ts +3 -3
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/migration.d.ts +5 -5
- package/dist/skills/migration.d.ts.map +1 -1
- package/dist/skills/migration.js +7 -9
- package/dist/skills/migration.js.map +1 -1
- package/dist/skills/orchestrator/startup.d.ts.map +1 -1
- package/dist/skills/orchestrator/startup.js +14 -7
- package/dist/skills/orchestrator/startup.js.map +1 -1
- package/dist/skills/prune-bundled.d.ts +267 -0
- package/dist/skills/prune-bundled.d.ts.map +1 -0
- package/dist/skills/prune-bundled.js +536 -0
- package/dist/skills/prune-bundled.js.map +1 -0
- package/dist/skills/skill-paths.d.ts +30 -3
- package/dist/skills/skill-paths.d.ts.map +1 -1
- package/dist/skills/skill-paths.js +28 -9
- package/dist/skills/skill-paths.js.map +1 -1
- package/dist/skills/skill-root.d.ts +60 -11
- package/dist/skills/skill-root.d.ts.map +1 -1
- package/dist/skills/skill-root.js +100 -14
- package/dist/skills/skill-root.js.map +1 -1
- package/dist/skills/skills-guard.js +5 -5
- package/dist/skills/skills-guard.js.map +1 -1
- package/dist/skills/types.d.ts +32 -1
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/types.js +17 -34
- package/dist/skills/types.js.map +1 -1
- package/dist/spawn/agent-identity.d.ts +51 -2
- package/dist/spawn/agent-identity.d.ts.map +1 -1
- package/dist/spawn/agent-identity.js +89 -26
- package/dist/spawn/agent-identity.js.map +1 -1
- package/dist/spawn/branch-lock.d.ts.map +1 -1
- package/dist/spawn/branch-lock.js +80 -79
- package/dist/spawn/branch-lock.js.map +1 -1
- package/dist/spawn/index.d.ts +2 -2
- package/dist/spawn/index.d.ts.map +1 -1
- package/dist/spawn/index.js +1 -1
- package/dist/spawn/index.js.map +1 -1
- package/dist/spawn/worktree-lock-holder.d.ts +37 -0
- package/dist/spawn/worktree-lock-holder.d.ts.map +1 -0
- package/dist/spawn/worktree-lock-holder.js +41 -0
- package/dist/spawn/worktree-lock-holder.js.map +1 -0
- package/dist/stats/index.d.ts.map +1 -1
- package/dist/stats/index.js +4 -2
- package/dist/stats/index.js.map +1 -1
- package/dist/sticky/convert.d.ts.map +1 -1
- package/dist/sticky/convert.js +16 -4
- package/dist/sticky/convert.js.map +1 -1
- package/dist/store/attachment-store.d.ts +14 -0
- package/dist/store/attachment-store.d.ts.map +1 -1
- package/dist/store/attachment-store.js +11 -1
- package/dist/store/attachment-store.js.map +1 -1
- package/dist/store/backup-inspect.d.ts +7 -3
- package/dist/store/backup-inspect.d.ts.map +1 -1
- package/dist/store/backup-inspect.js +18 -7
- package/dist/store/backup-inspect.js.map +1 -1
- package/dist/store/backup-sidecar.d.ts +60 -0
- package/dist/store/backup-sidecar.d.ts.map +1 -0
- package/dist/store/backup-sidecar.js +96 -0
- package/dist/store/backup-sidecar.js.map +1 -0
- package/dist/store/data-accessor.d.ts +1 -1
- package/dist/store/data-accessor.d.ts.map +1 -1
- package/dist/store/data-accessor.js +6 -6
- package/dist/store/data-accessor.js.map +1 -1
- package/dist/store/data-safety-central.d.ts +13 -4
- package/dist/store/data-safety-central.d.ts.map +1 -1
- package/dist/store/data-safety-central.js +31 -4
- package/dist/store/data-safety-central.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +10 -0
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/exodus/__fixtures__/representative-fixture.d.ts.map +1 -1
- package/dist/store/exodus/__fixtures__/representative-fixture.js +4 -0
- package/dist/store/exodus/__fixtures__/representative-fixture.js.map +1 -1
- package/dist/store/exodus/migrate.js +1 -1
- package/dist/store/exodus/migrate.js.map +1 -1
- package/dist/store/exodus/reconcile.js +1 -1
- package/dist/store/exodus/reconcile.js.map +1 -1
- package/dist/store/exodus/runtime-targets.d.ts +4 -3
- package/dist/store/exodus/runtime-targets.d.ts.map +1 -1
- package/dist/store/exodus/runtime-targets.js +4 -3
- package/dist/store/exodus/runtime-targets.js.map +1 -1
- package/dist/store/import-logging.d.ts.map +1 -1
- package/dist/store/import-logging.js +5 -4
- package/dist/store/import-logging.js.map +1 -1
- package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
- package/dist/store/legacy-tasks-lineage.js +2 -7
- package/dist/store/legacy-tasks-lineage.js.map +1 -1
- package/dist/store/lock.d.ts +1 -0
- package/dist/store/lock.d.ts.map +1 -1
- package/dist/store/lock.js +1 -0
- package/dist/store/lock.js.map +1 -1
- package/dist/store/memory-accessor.d.ts +8 -3
- package/dist/store/memory-accessor.d.ts.map +1 -1
- package/dist/store/memory-accessor.js +29 -13
- package/dist/store/memory-accessor.js.map +1 -1
- package/dist/store/memory-sqlite.d.ts.map +1 -1
- package/dist/store/memory-sqlite.js +5 -0
- package/dist/store/memory-sqlite.js.map +1 -1
- package/dist/store/open-cleo-db.d.ts.map +1 -1
- package/dist/store/open-cleo-db.js +11 -6
- package/dist/store/open-cleo-db.js.map +1 -1
- package/dist/store/portable-bundle-relocate.d.ts +13 -8
- package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
- package/dist/store/portable-bundle-relocate.js +75 -31
- package/dist/store/portable-bundle-relocate.js.map +1 -1
- package/dist/store/portable-bundle-scan.d.ts.map +1 -1
- package/dist/store/portable-bundle-scan.js +2 -1
- package/dist/store/portable-bundle-scan.js.map +1 -1
- package/dist/store/portable-bundle.d.ts.map +1 -1
- package/dist/store/portable-bundle.js +7 -3
- package/dist/store/portable-bundle.js.map +1 -1
- package/dist/store/pre-repair-snapshot.d.ts +77 -0
- package/dist/store/pre-repair-snapshot.d.ts.map +1 -0
- package/dist/store/pre-repair-snapshot.js +122 -0
- package/dist/store/pre-repair-snapshot.js.map +1 -0
- package/dist/store/regenerators.d.ts +2 -1
- package/dist/store/regenerators.d.ts.map +1 -1
- package/dist/store/regenerators.js +17 -3
- package/dist/store/regenerators.js.map +1 -1
- package/dist/store/relocated-store-guard.d.ts +71 -0
- package/dist/store/relocated-store-guard.d.ts.map +1 -0
- package/dist/store/relocated-store-guard.js +138 -0
- package/dist/store/relocated-store-guard.js.map +1 -0
- package/dist/store/safety-data-accessor.d.ts +2 -2
- package/dist/store/safety-data-accessor.d.ts.map +1 -1
- package/dist/store/safety-data-accessor.js +2 -2
- package/dist/store/safety-data-accessor.js.map +1 -1
- package/dist/store/schema/attachments.d.ts +2 -2
- package/dist/store/schema/audit.d.ts +5 -5
- package/dist/store/schema/background-jobs.d.ts +1 -1
- package/dist/store/schema/cleo-global/models-catalog.d.ts +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +686 -0
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +175 -7
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-global/skills.d.ts +2 -2
- package/dist/store/schema/cleo-project/audit.d.ts +5 -5
- package/dist/store/schema/cleo-project/docs.d.ts +3 -3
- package/dist/store/schema/cleo-project/lifecycle.d.ts +3 -3
- package/dist/store/schema/cleo-project/provenance-commits.d.ts +2 -2
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +3 -3
- package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +6 -6
- package/dist/store/schema/cleo-shared/brain.d.ts +26 -26
- package/dist/store/schema/lifecycle.d.ts +3 -3
- package/dist/store/schema/manifest.d.ts +1 -1
- package/dist/store/schema/memory-schema.d.ts +26 -26
- package/dist/store/schema/nexus-schema.d.ts +696 -2
- package/dist/store/schema/nexus-schema.d.ts.map +1 -1
- package/dist/store/schema/nexus-schema.js +175 -19
- package/dist/store/schema/nexus-schema.js.map +1 -1
- package/dist/store/schema/provenance/releases.d.ts +1 -1
- package/dist/store/schema/skills-schema.d.ts +2 -2
- package/dist/store/schema/tasks.d.ts +5 -5
- package/dist/store/session-binding-schema.d.ts +132 -0
- package/dist/store/session-binding-schema.d.ts.map +1 -0
- package/dist/store/session-binding-schema.js +53 -0
- package/dist/store/session-binding-schema.js.map +1 -0
- package/dist/store/session-store.d.ts +262 -4
- package/dist/store/session-store.d.ts.map +1 -1
- package/dist/store/session-store.js +486 -26
- package/dist/store/session-store.js.map +1 -1
- package/dist/store/skills-db.d.ts +17 -0
- package/dist/store/skills-db.d.ts.map +1 -1
- package/dist/store/skills-db.js +30 -0
- package/dist/store/skills-db.js.map +1 -1
- package/dist/store/snapshot-gate.d.ts +239 -0
- package/dist/store/snapshot-gate.d.ts.map +1 -0
- package/dist/store/snapshot-gate.js +401 -0
- package/dist/store/snapshot-gate.js.map +1 -0
- package/dist/store/split-brain-import.js +2 -2
- package/dist/store/split-brain-import.js.map +1 -1
- package/dist/store/sqlite-backup.d.ts +55 -13
- package/dist/store/sqlite-backup.d.ts.map +1 -1
- package/dist/store/sqlite-backup.js +414 -106
- package/dist/store/sqlite-backup.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts +15 -0
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +73 -4
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/sqlite.d.ts +15 -1
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +75 -5
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/store-write-guard.d.ts +28 -0
- package/dist/store/store-write-guard.d.ts.map +1 -0
- package/dist/store/store-write-guard.js +50 -0
- package/dist/store/store-write-guard.js.map +1 -0
- package/dist/store/table-classification.d.ts +143 -0
- package/dist/store/table-classification.d.ts.map +1 -0
- package/dist/store/table-classification.js +1866 -0
- package/dist/store/table-classification.js.map +1 -0
- package/dist/store/task-version.d.ts +72 -0
- package/dist/store/task-version.d.ts.map +1 -0
- package/dist/store/task-version.js +93 -0
- package/dist/store/task-version.js.map +1 -0
- package/dist/store/tasks-schema.d.ts +1 -0
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +13 -0
- package/dist/store/tasks-schema.js.map +1 -1
- package/dist/store/tasks-sqlite.d.ts +10 -3
- package/dist/store/tasks-sqlite.d.ts.map +1 -1
- package/dist/store/tasks-sqlite.js +12 -3
- package/dist/store/tasks-sqlite.js.map +1 -1
- package/dist/store/twin-collapse.d.ts +320 -0
- package/dist/store/twin-collapse.d.ts.map +1 -0
- package/dist/store/twin-collapse.js +931 -0
- package/dist/store/twin-collapse.js.map +1 -0
- package/dist/store/umbrella-data-accessor.d.ts +2 -2
- package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
- package/dist/store/umbrella-data-accessor.js +2 -2
- package/dist/store/umbrella-data-accessor.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +63 -63
- package/dist/store/worktree-isolation-guard.d.ts +46 -24
- package/dist/store/worktree-isolation-guard.d.ts.map +1 -1
- package/dist/store/worktree-isolation-guard.js +71 -50
- package/dist/store/worktree-isolation-guard.js.map +1 -1
- package/dist/system/backup.d.ts.map +1 -1
- package/dist/system/backup.js +3 -67
- package/dist/system/backup.js.map +1 -1
- package/dist/system/cleo-link.d.ts +163 -0
- package/dist/system/cleo-link.d.ts.map +1 -0
- package/dist/system/cleo-link.js +246 -0
- package/dist/system/cleo-link.js.map +1 -0
- package/dist/system/dependencies.d.ts.map +1 -1
- package/dist/system/dependencies.js +3 -6
- package/dist/system/dependencies.js.map +1 -1
- package/dist/system/global-delivery.d.ts +205 -0
- package/dist/system/global-delivery.d.ts.map +1 -0
- package/dist/system/global-delivery.js +320 -0
- package/dist/system/global-delivery.js.map +1 -0
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +29 -6
- package/dist/system/health.js.map +1 -1
- package/dist/system/inject-generate.d.ts.map +1 -1
- package/dist/system/inject-generate.js +4 -4
- package/dist/system/inject-generate.js.map +1 -1
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +1 -20
- package/dist/system/project-health.js.map +1 -1
- package/dist/system/runtime.d.ts.map +1 -1
- package/dist/system/runtime.js +2 -12
- package/dist/system/runtime.js.map +1 -1
- package/dist/system/safestop.d.ts.map +1 -1
- package/dist/system/safestop.js +5 -2
- package/dist/system/safestop.js.map +1 -1
- package/dist/system/skill-fixtures.d.ts +200 -0
- package/dist/system/skill-fixtures.d.ts.map +1 -0
- package/dist/system/skill-fixtures.js +331 -0
- package/dist/system/skill-fixtures.js.map +1 -0
- package/dist/task-work/index.d.ts +6 -0
- package/dist/task-work/index.d.ts.map +1 -1
- package/dist/task-work/index.js +6 -3
- package/dist/task-work/index.js.map +1 -1
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +4 -2
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +218 -0
- package/dist/tasks/affected-packages.d.ts.map +1 -0
- package/dist/tasks/affected-packages.js +496 -0
- package/dist/tasks/affected-packages.js.map +1 -0
- package/dist/tasks/affected-scope.d.ts +59 -0
- package/dist/tasks/affected-scope.d.ts.map +1 -0
- package/dist/tasks/affected-scope.js +81 -0
- package/dist/tasks/affected-scope.js.map +1 -0
- package/dist/tasks/analyze.d.ts.map +1 -1
- package/dist/tasks/analyze.js +7 -2
- package/dist/tasks/analyze.js.map +1 -1
- package/dist/tasks/change-set.d.ts +175 -0
- package/dist/tasks/change-set.d.ts.map +1 -0
- package/dist/tasks/change-set.js +753 -0
- package/dist/tasks/change-set.js.map +1 -0
- package/dist/tasks/complete.d.ts +10 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +59 -5
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/component-pr.d.ts +106 -0
- package/dist/tasks/component-pr.d.ts.map +1 -0
- package/dist/tasks/component-pr.js +190 -0
- package/dist/tasks/component-pr.js.map +1 -0
- package/dist/tasks/done-plan.d.ts +123 -0
- package/dist/tasks/done-plan.d.ts.map +1 -0
- package/dist/tasks/done-plan.js +696 -0
- package/dist/tasks/done-plan.js.map +1 -0
- package/dist/tasks/done-record.d.ts +127 -0
- package/dist/tasks/done-record.d.ts.map +1 -0
- package/dist/tasks/done-record.js +302 -0
- package/dist/tasks/done-record.js.map +1 -0
- package/dist/tasks/duplicate-detector.d.ts +68 -11
- package/dist/tasks/duplicate-detector.d.ts.map +1 -1
- package/dist/tasks/duplicate-detector.js +314 -58
- package/dist/tasks/duplicate-detector.js.map +1 -1
- package/dist/tasks/evidence-paths.d.ts +78 -0
- package/dist/tasks/evidence-paths.d.ts.map +1 -0
- package/dist/tasks/evidence-paths.js +150 -0
- package/dist/tasks/evidence-paths.js.map +1 -0
- package/dist/tasks/evidence.d.ts +101 -1
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +278 -31
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-preview.d.ts +5 -0
- package/dist/tasks/gate-preview.d.ts.map +1 -1
- package/dist/tasks/gate-preview.js +25 -21
- package/dist/tasks/gate-preview.js.map +1 -1
- package/dist/tasks/gate-result-cache.d.ts +205 -0
- package/dist/tasks/gate-result-cache.d.ts.map +1 -0
- package/dist/tasks/gate-result-cache.js +285 -0
- package/dist/tasks/gate-result-cache.js.map +1 -0
- package/dist/tasks/gate-runner.d.ts +126 -3
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +483 -28
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/session-scope.d.ts +3 -1
- package/dist/tasks/session-scope.d.ts.map +1 -1
- package/dist/tasks/session-scope.js +18 -3
- package/dist/tasks/session-scope.js.map +1 -1
- package/dist/tasks/task-next.d.ts +4 -0
- package/dist/tasks/task-next.d.ts.map +1 -1
- package/dist/tasks/task-next.js +32 -28
- package/dist/tasks/task-next.js.map +1 -1
- package/dist/tasks/tool-resolver.d.ts +23 -6
- package/dist/tasks/tool-resolver.d.ts.map +1 -1
- package/dist/tasks/tool-resolver.js +146 -8
- package/dist/tasks/tool-resolver.js.map +1 -1
- package/dist/tasks/tool-vacuity.d.ts +71 -0
- package/dist/tasks/tool-vacuity.d.ts.map +1 -0
- package/dist/tasks/tool-vacuity.js +334 -0
- package/dist/tasks/tool-vacuity.js.map +1 -0
- package/dist/tasks/update.d.ts +8 -0
- package/dist/tasks/update.d.ts.map +1 -1
- package/dist/tasks/update.js +159 -78
- package/dist/tasks/update.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +18 -2
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/doctor/checks.d.ts +20 -2
- package/dist/validation/doctor/checks.d.ts.map +1 -1
- package/dist/validation/doctor/checks.js +64 -4
- package/dist/validation/doctor/checks.js.map +1 -1
- package/dist/validation/doctor/index.d.ts +1 -1
- package/dist/validation/doctor/index.d.ts.map +1 -1
- package/dist/validation/doctor/index.js +1 -1
- package/dist/validation/doctor/index.js.map +1 -1
- package/dist/validation/doctor/utils.d.ts.map +1 -1
- package/dist/validation/doctor/utils.js +7 -2
- package/dist/validation/doctor/utils.js.map +1 -1
- package/dist/validation/engine-ops.d.ts +24 -1
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +272 -98
- package/dist/validation/engine-ops.js.map +1 -1
- package/dist/validation/validate-ops.d.ts.map +1 -1
- package/dist/validation/validate-ops.js +9 -3
- package/dist/validation/validate-ops.js.map +1 -1
- package/dist/worktree/worktree-adopt.d.ts.map +1 -1
- package/dist/worktree/worktree-adopt.js +5 -2
- package/dist/worktree/worktree-adopt.js.map +1 -1
- package/migrations/drizzle-cleo-global/20260927000000_t12469-project-locations/migration.sql +121 -0
- package/migrations/drizzle-cleo-global/20260927010000_t12543-user-profile-project-scope/migration.sql +23 -0
- package/migrations/drizzle-cleo-global/20260928010000_t12470-location-candidates/migration.sql +72 -0
- package/migrations/drizzle-cleo-global/20260928020000_t12510-nexus-devices/migration.sql +34 -0
- package/migrations/drizzle-cleo-global/20260928030000_t12511-project-git-state/migration.sql +62 -0
- package/migrations/drizzle-cleo-project/20260927000000_t12499-session-terminal-bindings/migration.sql +34 -0
- package/migrations/drizzle-cleo-project/20260928000000_t12500-binding-provider-flag/migration.sql +15 -0
- package/package.json +23 -13
- package/schemas/config.schema.json +54 -0
- package/schemas/project-context.schema.json +51 -3
- package/schemas/project-info.schema.json +28 -1
- package/templates/CLEO-INJECTION.md +40 -332
- package/templates/CLEO-REFERENCE.md +303 -0
- package/templates/workflows/README.md +36 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-backup.d.ts","sourceRoot":"","sources":["../../src/store/sqlite-backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;
|
|
1
|
+
{"version":3,"file":"sqlite-backup.d.ts","sourceRoot":"","sources":["../../src/store/sqlite-backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
* (Saga T10281 / Epic T10284 / E3)
|
|
41
41
|
* @epic T4867
|
|
42
42
|
*/
|
|
43
|
-
import { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, statSync, unlinkSync, } from 'node:fs';
|
|
44
|
-
import { join } from 'node:path';
|
|
43
|
+
import { chmodSync, closeSync, copyFileSync, existsSync, fsyncSync, linkSync, mkdirSync, openSync, readdirSync, realpathSync, renameSync, rmSync, statSync, unlinkSync, } from 'node:fs';
|
|
44
|
+
import { dirname, join, sep } from 'node:path';
|
|
45
45
|
import { DB_INVENTORY } from '@cleocode/contracts';
|
|
46
46
|
import { getCleoDir, getCleoHome, resolveOrCwd } from '../paths.js';
|
|
47
47
|
import { getTelemetryDb, getTelemetryNativeDb } from '../telemetry/sqlite.js';
|
|
@@ -51,16 +51,14 @@ import { getGlobalSaltPath } from './global-salt.js';
|
|
|
51
51
|
import { getBrainDb, getBrainNativeDb } from './memory-sqlite.js';
|
|
52
52
|
import { getNexusDb, getNexusNativeDb } from './nexus-sqlite.js';
|
|
53
53
|
import { getSkillsNativeDb, openSkillsDb } from './skills-db.js';
|
|
54
|
+
import { readSnapshotGeneration, runGatedSnapshot, selectSnapshotsToKeep, } from './snapshot-gate.js';
|
|
54
55
|
import { getDb, getNativeDb } from './sqlite.js';
|
|
55
|
-
/** Maximum number of snapshots retained per database (oldest rotated out). */
|
|
56
|
-
const MAX_SNAPSHOTS = 10;
|
|
57
|
-
/** Debounce window (ms) during which duplicate snapshot requests are suppressed. */
|
|
58
|
-
const DEBOUNCE_MS = 30_000; // 30 seconds
|
|
59
56
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
57
|
+
* Maximum number of snapshots retained per global-tier database and for the
|
|
58
|
+
* global-salt backups (oldest rotated out). Project-tier snapshots use the
|
|
59
|
+
* time-spread policy in `snapshot-gate.ts` instead (T12508).
|
|
62
60
|
*/
|
|
63
|
-
const
|
|
61
|
+
const MAX_SNAPSHOTS = 10;
|
|
64
62
|
/**
|
|
65
63
|
* Resolve the path on disk for a given `DB_INVENTORY` row.
|
|
66
64
|
*
|
|
@@ -126,8 +124,9 @@ async function openTasksDbForSnapshot(cwd) {
|
|
|
126
124
|
async function openConduitDbForSnapshot(cwd) {
|
|
127
125
|
// ensureConduitDb requires an absolute project root. E6-L3 (T11523): it is now
|
|
128
126
|
// async (routes through the dual-scope cleo.db chokepoint).
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
const projectRoot = resolveOrCwd(cwd);
|
|
128
|
+
await ensureConduitDb(projectRoot);
|
|
129
|
+
return getConduitNativeDb(projectRoot);
|
|
131
130
|
}
|
|
132
131
|
// ---------------------------------------------------------------------------
|
|
133
132
|
// Global-tier openers (chokepoint-opener strategy)
|
|
@@ -227,24 +226,28 @@ function buildRawFileVacuumOpener(entry) {
|
|
|
227
226
|
const path = resolveInventoryPath(entry, cwd);
|
|
228
227
|
if (!path)
|
|
229
228
|
return null;
|
|
230
|
-
|
|
231
|
-
|
|
229
|
+
// T12508: `existsSync` answers false for EACCES too, which would class an
|
|
230
|
+
// unreadable database as absent. Only ENOENT means absent; any other stat
|
|
231
|
+
// error is a failure and propagates.
|
|
232
232
|
try {
|
|
233
|
-
|
|
234
|
-
// sqlite.ts (which statically imports sqlite-backup.ts for
|
|
235
|
-
// `listSqliteBackups`) MUST NOT pull node:sqlite into module-load
|
|
236
|
-
// time. Only the raw-file-vacuum-readonly path needs the
|
|
237
|
-
// constructor, and it is exercised at snapshot-time, not load-time.
|
|
238
|
-
const { DatabaseSync } = await import('node:sqlite');
|
|
239
|
-
return new DatabaseSync(path, { readOnly: true });
|
|
233
|
+
statSync(path);
|
|
240
234
|
}
|
|
241
|
-
catch {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
// saga exists).
|
|
246
|
-
return null;
|
|
235
|
+
catch (err) {
|
|
236
|
+
if (err instanceof Error && 'code' in err && err.code === 'ENOENT')
|
|
237
|
+
return null;
|
|
238
|
+
throw err;
|
|
247
239
|
}
|
|
240
|
+
// Dynamic import preserves the T1331 lazy-init contract: importing
|
|
241
|
+
// sqlite.ts (which statically imports sqlite-backup.ts for
|
|
242
|
+
// `listSqliteBackups`) MUST NOT pull node:sqlite into module-load
|
|
243
|
+
// time. Only the raw-file-vacuum-readonly path needs the
|
|
244
|
+
// constructor, and it is exercised at snapshot-time, not load-time.
|
|
245
|
+
//
|
|
246
|
+
// T12508: an existing file that cannot be opened (locked, corrupt) THROWS
|
|
247
|
+
// here. That is a failure, not an absent database; the gate reports it
|
|
248
|
+
// and every caller stays non-fatal.
|
|
249
|
+
const { DatabaseSync } = await import('node:sqlite');
|
|
250
|
+
return new DatabaseSync(path, { readOnly: true });
|
|
248
251
|
};
|
|
249
252
|
}
|
|
250
253
|
/**
|
|
@@ -430,31 +433,282 @@ function snapshotPattern(prefix) {
|
|
|
430
433
|
return new RegExp(`^${safe}-\\d{8}-\\d{6}\\.db$`);
|
|
431
434
|
}
|
|
432
435
|
/**
|
|
433
|
-
*
|
|
434
|
-
*
|
|
436
|
+
* Apply time-spread retention to a single prefix: delete every snapshot not
|
|
437
|
+
* selected by {@link selectSnapshotsToKeep} (latest, quarter-hourly, hourly
|
|
438
|
+
* and daily slots). Runs AFTER the new snapshot is written, so a failed
|
|
439
|
+
* `VACUUM INTO` never costs an existing recovery point, and the file just
|
|
440
|
+
* written is pinned. Non-fatal on any filesystem error.
|
|
441
|
+
*
|
|
442
|
+
* @param backupDir - Snapshot directory.
|
|
443
|
+
* @param prefix - Snapshot prefix to prune.
|
|
444
|
+
* @param justWritten - Basename of the snapshot just written; never deleted.
|
|
445
|
+
* @task T12508 — replaces the newest-10 rotation that a burst could flush
|
|
435
446
|
*/
|
|
436
|
-
function rotateSnapshots(backupDir, prefix) {
|
|
447
|
+
function rotateSnapshots(backupDir, prefix, justWritten) {
|
|
437
448
|
try {
|
|
438
449
|
const pattern = snapshotPattern(prefix);
|
|
439
|
-
const
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
450
|
+
const names = readdirSync(backupDir).filter((f) => pattern.test(f));
|
|
451
|
+
const keep = selectSnapshotsToKeep(names, {
|
|
452
|
+
pinned: justWritten,
|
|
453
|
+
nowStamp: formatTimestamp(new Date()),
|
|
454
|
+
});
|
|
455
|
+
for (const name of names) {
|
|
456
|
+
if (keep.has(name))
|
|
457
|
+
continue;
|
|
458
|
+
try {
|
|
459
|
+
unlinkSync(join(backupDir, name));
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
// non-fatal — try the rest
|
|
463
|
+
}
|
|
452
464
|
}
|
|
453
465
|
}
|
|
454
466
|
catch {
|
|
455
467
|
// non-fatal
|
|
456
468
|
}
|
|
457
469
|
}
|
|
470
|
+
/**
|
|
471
|
+
* Resolve the project `cleo.db` handle that stores the snapshot gate state
|
|
472
|
+
* (see `snapshot-gate.ts`). Returns `null` when it cannot be opened, in which
|
|
473
|
+
* case the gate admits no snapshot.
|
|
474
|
+
*
|
|
475
|
+
* @task T12508
|
|
476
|
+
*/
|
|
477
|
+
async function resolveGateStateDb(cwd) {
|
|
478
|
+
try {
|
|
479
|
+
const bound = getNativeDb(cwd);
|
|
480
|
+
if (bound)
|
|
481
|
+
return bound;
|
|
482
|
+
await getDb(cwd);
|
|
483
|
+
return getNativeDb(cwd);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Read the project's current snapshot generation — what a `required` request
|
|
491
|
+
* should record as `seenGeneration` at the moment it is made (after the
|
|
492
|
+
* caller's last write), when the snapshot itself runs later or elsewhere.
|
|
493
|
+
*
|
|
494
|
+
* @param cwd - Project directory.
|
|
495
|
+
* @returns The generation, or `null` when the gate state cannot be read.
|
|
496
|
+
* @task T12508
|
|
497
|
+
*/
|
|
498
|
+
export async function readProjectSnapshotGeneration(cwd) {
|
|
499
|
+
return readSnapshotGeneration(await resolveGateStateDb(cwd));
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Snapshot the given project-tier targets through the project-wide gate:
|
|
503
|
+
* one snapshot in flight per project across processes, and a per-prefix
|
|
504
|
+
* debounce persisted in `cleo.db`. Non-fatal.
|
|
505
|
+
*
|
|
506
|
+
* @returns The gate outcome, or `null` when the backup directory cannot be
|
|
507
|
+
* resolved or no target is snapshottable.
|
|
508
|
+
* @task T12508
|
|
509
|
+
*/
|
|
510
|
+
async function snapshotProjectTargetsGated(targets, opts) {
|
|
511
|
+
const cwd = opts.cwd;
|
|
512
|
+
let backupDir;
|
|
513
|
+
try {
|
|
514
|
+
const cleoDir = getCleoDir(cwd);
|
|
515
|
+
backupDir = join(cleoDir, 'backups', 'sqlite');
|
|
516
|
+
mkdirSync(backupDir, { recursive: true });
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
return null; // cannot resolve backup dir — abort silently
|
|
520
|
+
}
|
|
521
|
+
const byPrefix = new Map(targets.filter((t) => t.strategy !== 'skip-derived').map((t) => [t.prefix, t]));
|
|
522
|
+
if (byPrefix.size === 0)
|
|
523
|
+
return null;
|
|
524
|
+
// One VACUUM per physical database file per run (T12508): tasks, brain and
|
|
525
|
+
// conduit share the project cleo.db handle. Maps source realpath → the
|
|
526
|
+
// snapshot file written for it in this run.
|
|
527
|
+
const writtenBySource = new Map();
|
|
528
|
+
return runGatedSnapshot({
|
|
529
|
+
backupDir,
|
|
530
|
+
stateDb: await resolveGateStateDb(cwd),
|
|
531
|
+
prefixes: [...byPrefix.keys()],
|
|
532
|
+
mode: opts.mode ?? 'routine',
|
|
533
|
+
...(opts.seenGeneration !== undefined && { seenGeneration: opts.seenGeneration }),
|
|
534
|
+
...(opts.alwaysSnapshot !== undefined && { alwaysSnapshot: opts.alwaysSnapshot }),
|
|
535
|
+
...(opts.lockWaitRetries !== undefined && { lockWaitRetries: opts.lockWaitRetries }),
|
|
536
|
+
...(opts.onLockAcquired !== undefined && { onLockAcquired: opts.onLockAcquired }),
|
|
537
|
+
}, async (prefix) => {
|
|
538
|
+
const target = byPrefix.get(prefix);
|
|
539
|
+
return target ? snapshotOne(target, backupDir, writtenBySource, cwd) : 'absent';
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Real path of the database file behind a native handle, or `null` when it is
|
|
544
|
+
* unknown (an in-memory database, or a handle without `location()`).
|
|
545
|
+
*
|
|
546
|
+
* @task T12508
|
|
547
|
+
*/
|
|
548
|
+
function sourceFileOf(db) {
|
|
549
|
+
if (!hasLocation(db))
|
|
550
|
+
return null;
|
|
551
|
+
const location = db.location();
|
|
552
|
+
if (!location)
|
|
553
|
+
return null;
|
|
554
|
+
try {
|
|
555
|
+
return realpathSync(location);
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
return location;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
/** Whether a handle exposes `DatabaseSync.location()` (Node 24+). */
|
|
562
|
+
function hasLocation(db) {
|
|
563
|
+
return 'location' in db && typeof db.location === 'function';
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Refuse to snapshot a project-tier handle whose file lies outside this
|
|
567
|
+
* project's `.cleo/` directory. A handle resolved for the wrong project (the
|
|
568
|
+
* ambient one in a multi-project process) would otherwise put project B's
|
|
569
|
+
* database into project A's backups.
|
|
570
|
+
*
|
|
571
|
+
* @task T12508
|
|
572
|
+
*/
|
|
573
|
+
function assertOwnedByProject(source, prefix, cwd) {
|
|
574
|
+
let cleoDir = getCleoDir(cwd);
|
|
575
|
+
try {
|
|
576
|
+
cleoDir = realpathSync(cleoDir);
|
|
577
|
+
}
|
|
578
|
+
catch {
|
|
579
|
+
// Compare against the unresolved path.
|
|
580
|
+
}
|
|
581
|
+
if (!source.startsWith(cleoDir + sep)) {
|
|
582
|
+
throw new Error(`refusing to snapshot ${prefix}: its database ${source} is not inside ${cleoDir}`);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* `link()` error codes that mean "this filesystem cannot hard-link these
|
|
587
|
+
* files" rather than a real failure: permission-less link (EPERM), no link
|
|
588
|
+
* support (ENOTSUP, e.g. exFAT), different devices (EXDEV), link-count cap
|
|
589
|
+
* (EMLINK). The caller copies instead.
|
|
590
|
+
*/
|
|
591
|
+
const LINK_FALLBACK_CODES = new Set(['EPERM', 'ENOTSUP', 'EXDEV', 'EMLINK']);
|
|
592
|
+
/**
|
|
593
|
+
* Hard-link `existing` to `dest`. Returns `false` when the filesystem cannot
|
|
594
|
+
* hard-link (see {@link LINK_FALLBACK_CODES}); any other error throws.
|
|
595
|
+
*
|
|
596
|
+
* @task T12508
|
|
597
|
+
*/
|
|
598
|
+
function tryHardLink(existing, dest) {
|
|
599
|
+
try {
|
|
600
|
+
linkSync(existing, dest);
|
|
601
|
+
return true;
|
|
602
|
+
}
|
|
603
|
+
catch (err) {
|
|
604
|
+
if (err instanceof Error && 'code' in err && typeof err.code === 'string') {
|
|
605
|
+
if (LINK_FALLBACK_CODES.has(err.code))
|
|
606
|
+
return false;
|
|
607
|
+
}
|
|
608
|
+
throw err;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* An in-progress snapshot file `<name>.tmp-<pid>`, or a SQLite sidecar
|
|
613
|
+
* (`-journal`, `-wal`, `-shm`) that `VACUUM INTO` may leave beside it.
|
|
614
|
+
*/
|
|
615
|
+
const TEMP_SNAPSHOT_RE = /\.db\.tmp-(\d+)(?:-journal|-wal|-shm)?$/;
|
|
616
|
+
/** Age after which any temp snapshot is a leftover, even if its pid was reused. */
|
|
617
|
+
const TEMP_SNAPSHOT_MAX_AGE_MS = 60 * 60_000;
|
|
618
|
+
/**
|
|
619
|
+
* Temp path a snapshot is written to before it is committed. It does not end
|
|
620
|
+
* in `.db`, so every snapshot reader (listing, retention, restore, doctor)
|
|
621
|
+
* ignores it.
|
|
622
|
+
*/
|
|
623
|
+
function tempSnapshotPath(dest) {
|
|
624
|
+
return `${dest}.tmp-${process.pid}`;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Make a finished temp snapshot durable and give it its real name: fsync the
|
|
628
|
+
* file, rename it (atomic within a directory), then fsync the directory
|
|
629
|
+
* (best-effort) so the rename itself survives a crash.
|
|
630
|
+
*
|
|
631
|
+
* @task T12508
|
|
632
|
+
*/
|
|
633
|
+
function commitSnapshotFile(tmp, dest) {
|
|
634
|
+
const fd = openSync(tmp, 'r');
|
|
635
|
+
try {
|
|
636
|
+
fsyncSync(fd);
|
|
637
|
+
}
|
|
638
|
+
finally {
|
|
639
|
+
closeSync(fd);
|
|
640
|
+
}
|
|
641
|
+
renameSync(tmp, dest);
|
|
642
|
+
try {
|
|
643
|
+
const dirFd = openSync(dirname(dest), 'r');
|
|
644
|
+
try {
|
|
645
|
+
fsyncSync(dirFd);
|
|
646
|
+
}
|
|
647
|
+
finally {
|
|
648
|
+
closeSync(dirFd);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
catch {
|
|
652
|
+
// Not every platform can fsync a directory; the rename is still atomic.
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
/** Whether a process with this pid exists (EPERM means it exists but is not ours). */
|
|
656
|
+
function isPidAlive(pid) {
|
|
657
|
+
try {
|
|
658
|
+
process.kill(pid, 0);
|
|
659
|
+
return true;
|
|
660
|
+
}
|
|
661
|
+
catch (err) {
|
|
662
|
+
return err instanceof Error && 'code' in err && err.code === 'EPERM';
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
/**
|
|
666
|
+
* Remove temp snapshots left by a process killed mid-write: those whose pid
|
|
667
|
+
* is dead, or that are older than {@link TEMP_SNAPSHOT_MAX_AGE_MS}. Never
|
|
668
|
+
* throws.
|
|
669
|
+
*
|
|
670
|
+
* @task T12508
|
|
671
|
+
*/
|
|
672
|
+
function removeDeadTempSnapshots(backupDir) {
|
|
673
|
+
try {
|
|
674
|
+
for (const name of readdirSync(backupDir)) {
|
|
675
|
+
const m = TEMP_SNAPSHOT_RE.exec(name);
|
|
676
|
+
if (!m)
|
|
677
|
+
continue;
|
|
678
|
+
const pid = Number(m[1]);
|
|
679
|
+
const path = join(backupDir, name);
|
|
680
|
+
const stale = pid !== process.pid &&
|
|
681
|
+
(!isPidAlive(pid) || Date.now() - statSync(path).mtimeMs > TEMP_SNAPSHOT_MAX_AGE_MS);
|
|
682
|
+
if (stale)
|
|
683
|
+
rmSync(path, { force: true });
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
catch {
|
|
687
|
+
// Cleanup is best-effort.
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
/** Attempts at finding a free snapshot filename before giving up. */
|
|
691
|
+
const SNAPSHOT_NAME_ATTEMPTS = 3;
|
|
692
|
+
/**
|
|
693
|
+
* Choose a snapshot filename `<prefix>-YYYYMMDD-HHmmss.db` that does not yet
|
|
694
|
+
* exist. `VACUUM INTO` refuses an existing destination, and two snapshots of
|
|
695
|
+
* one prefix can fall in the same second (a routine checkpoint followed by a
|
|
696
|
+
* pre-destructive one). On a collision this waits for the next second rather
|
|
697
|
+
* than adding a suffix, so every reader of the documented filename format
|
|
698
|
+
* (listing, restore, verify, doctor) keeps working. Called under the gate
|
|
699
|
+
* lock, so no other gated writer can take the name in between.
|
|
700
|
+
*
|
|
701
|
+
* @task T12508
|
|
702
|
+
*/
|
|
703
|
+
async function freeSnapshotName(backupDir, prefix) {
|
|
704
|
+
for (let attempt = 0; attempt < SNAPSHOT_NAME_ATTEMPTS; attempt++) {
|
|
705
|
+
const name = `${prefix}-${formatTimestamp(new Date())}.db`;
|
|
706
|
+
if (!existsSync(join(backupDir, name)))
|
|
707
|
+
return name;
|
|
708
|
+
await new Promise((r) => setTimeout(r, 1000 - (Date.now() % 1000) + 5));
|
|
709
|
+
}
|
|
710
|
+
throw new Error(`no free snapshot filename for ${prefix} in ${backupDir}`);
|
|
711
|
+
}
|
|
458
712
|
/**
|
|
459
713
|
* Create a VACUUM INTO snapshot of a single SQLite database.
|
|
460
714
|
*
|
|
@@ -478,21 +732,31 @@ function rotateSnapshots(backupDir, prefix) {
|
|
|
478
732
|
* {@link vacuumIntoBackupAll}; failures here must never block normal
|
|
479
733
|
* operation.
|
|
480
734
|
*
|
|
735
|
+
* The filename is stamped HERE, under the gate lock, not when the request
|
|
736
|
+
* was made — see {@link freeSnapshotName}.
|
|
737
|
+
*
|
|
481
738
|
* @param target — snapshot target descriptor (role + prefix + native DB getter)
|
|
482
739
|
* @param backupDir — absolute path to the snapshot directory
|
|
483
|
-
* @param now — reference timestamp for the filename
|
|
484
740
|
* @param cwd — optional working directory propagated to `target.openDb`
|
|
741
|
+
* @param writtenBySource — snapshot files already written in this run, keyed
|
|
742
|
+
* by source realpath; a second target on the same file is hard-linked.
|
|
743
|
+
* @returns `'written'` when a snapshot file was written; `'linked'` when the
|
|
744
|
+
* same physical database was already snapshotted in this run and the
|
|
745
|
+
* file was hard-linked under this prefix; `'absent'` when the
|
|
746
|
+
* database does not exist in this project (or is a derived row).
|
|
747
|
+
* Opener, ownership and `VACUUM INTO` errors throw.
|
|
485
748
|
*
|
|
486
749
|
* @task T10316 — eager-open via openCleoDb chokepoint (Saga T10281 / E3)
|
|
487
750
|
* @task T10317 — raw-file-vacuum-readonly strategy for opener-less roles
|
|
751
|
+
* @task T12508 — reports whether it wrote, so the gate never records a skip as a snapshot
|
|
488
752
|
*/
|
|
489
|
-
async function snapshotOne(target, backupDir,
|
|
753
|
+
async function snapshotOne(target, backupDir, writtenBySource, cwd) {
|
|
490
754
|
if (target.strategy === 'skip-derived') {
|
|
491
755
|
// Derived row — file is rebuildable from the blob CAS. Inventory row
|
|
492
756
|
// documents `backupPath === 'rebuildable-from-blob-store'`. Nothing to do.
|
|
493
|
-
return;
|
|
757
|
+
return 'absent';
|
|
494
758
|
}
|
|
495
|
-
let db = target.getDb();
|
|
759
|
+
let db = target.getDb(cwd);
|
|
496
760
|
let opened = null;
|
|
497
761
|
if (!db) {
|
|
498
762
|
// T10316 / T10317: eager-open via the canonical per-DB chokepoint (for
|
|
@@ -500,19 +764,59 @@ async function snapshotOne(target, backupDir, now, cwd) {
|
|
|
500
764
|
// raw-file-vacuum-readonly roles). Either way, the snapshot pipeline
|
|
501
765
|
// never silently skips a registered target just because the in-process
|
|
502
766
|
// handle cache is empty.
|
|
767
|
+
// An opener that THROWS (locked file, malformed orphan) propagates: the
|
|
768
|
+
// gate reports it as failed. `null` means there is no such database here.
|
|
769
|
+
db = await target.openDb(cwd);
|
|
770
|
+
if (!db)
|
|
771
|
+
return 'absent';
|
|
772
|
+
opened = db;
|
|
773
|
+
}
|
|
774
|
+
let destName;
|
|
775
|
+
let source;
|
|
776
|
+
try {
|
|
777
|
+
source = sourceFileOf(db);
|
|
778
|
+
if (source !== null && (target.tier === 'project' || target.tier === 'derived')) {
|
|
779
|
+
assertOwnedByProject(source, target.prefix, cwd);
|
|
780
|
+
}
|
|
781
|
+
destName = await freeSnapshotName(backupDir, target.prefix);
|
|
782
|
+
}
|
|
783
|
+
catch (err) {
|
|
784
|
+
if (opened && target.closeDb)
|
|
785
|
+
target.closeDb(opened);
|
|
786
|
+
throw err;
|
|
787
|
+
}
|
|
788
|
+
const dest = join(backupDir, destName);
|
|
789
|
+
// Leftovers of a snapshot killed mid-write (see commitSnapshotFile).
|
|
790
|
+
removeDeadTempSnapshots(backupDir);
|
|
791
|
+
// Already snapshotted this physical file in this run: hard-link the same
|
|
792
|
+
// snapshot under this prefix. One VACUUM, no extra disk, and every reader
|
|
793
|
+
// that looks for `<prefix>-*.db` (restore, recover-brain-db, listing)
|
|
794
|
+
// still finds a file. A filesystem without hard links (exFAT, FAT, some
|
|
795
|
+
// network mounts) gets a copy instead.
|
|
796
|
+
const existing = source !== null ? writtenBySource.get(source) : undefined;
|
|
797
|
+
if (existing !== undefined) {
|
|
503
798
|
try {
|
|
504
|
-
|
|
799
|
+
if (tryHardLink(existing, dest)) {
|
|
800
|
+
rotateSnapshots(backupDir, target.prefix, destName);
|
|
801
|
+
return 'linked';
|
|
802
|
+
}
|
|
803
|
+
const tmp = tempSnapshotPath(dest);
|
|
804
|
+
try {
|
|
805
|
+
copyFileSync(existing, tmp);
|
|
806
|
+
commitSnapshotFile(tmp, dest);
|
|
807
|
+
}
|
|
808
|
+
catch (err) {
|
|
809
|
+
rmSync(tmp, { force: true });
|
|
810
|
+
throw err;
|
|
811
|
+
}
|
|
812
|
+
rotateSnapshots(backupDir, target.prefix, destName);
|
|
813
|
+
return 'written';
|
|
505
814
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
return;
|
|
815
|
+
finally {
|
|
816
|
+
if (opened && target.closeDb)
|
|
817
|
+
target.closeDb(opened);
|
|
510
818
|
}
|
|
511
|
-
if (!db)
|
|
512
|
-
return;
|
|
513
|
-
opened = db;
|
|
514
819
|
}
|
|
515
|
-
const dest = join(backupDir, `${target.prefix}-${formatTimestamp(now)}.db`);
|
|
516
820
|
try {
|
|
517
821
|
// TRUNCATE checkpoint: flushes all WAL frames to the main DB and truncates
|
|
518
822
|
// the WAL file to zero bytes, ensuring a consistent DB state before the
|
|
@@ -520,10 +824,23 @@ async function snapshotOne(target, backupDir, now, cwd) {
|
|
|
520
824
|
// of orphan files there is no WAL to truncate, but the pragma is a no-op
|
|
521
825
|
// in that case so we keep the call uniform.
|
|
522
826
|
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
523
|
-
|
|
524
|
-
//
|
|
525
|
-
|
|
526
|
-
|
|
827
|
+
// VACUUM INTO a temp name, fsync, then rename: a process killed
|
|
828
|
+
// mid-VACUUM leaves only `<name>.tmp-<pid>`, which no reader lists,
|
|
829
|
+
// never an empty file under a valid snapshot name (T12508).
|
|
830
|
+
const tmp = tempSnapshotPath(dest);
|
|
831
|
+
try {
|
|
832
|
+
// Escape single quotes in path (path is programmatic, but be safe).
|
|
833
|
+
db.exec(`VACUUM INTO '${tmp.replace(/'/g, "''")}'`);
|
|
834
|
+
commitSnapshotFile(tmp, dest);
|
|
835
|
+
}
|
|
836
|
+
catch (err) {
|
|
837
|
+
rmSync(tmp, { force: true });
|
|
838
|
+
throw err;
|
|
839
|
+
}
|
|
840
|
+
if (source !== null)
|
|
841
|
+
writtenBySource.set(source, dest);
|
|
842
|
+
rotateSnapshots(backupDir, target.prefix, destName);
|
|
843
|
+
return 'written';
|
|
527
844
|
}
|
|
528
845
|
finally {
|
|
529
846
|
// Release the ephemeral handle for raw-file-vacuum-readonly targets.
|
|
@@ -537,42 +854,40 @@ async function snapshotOne(target, backupDir, now, cwd) {
|
|
|
537
854
|
/**
|
|
538
855
|
* Create a VACUUM INTO snapshot of the primary SQLite database (tasks.db).
|
|
539
856
|
*
|
|
540
|
-
*
|
|
541
|
-
*
|
|
542
|
-
*
|
|
543
|
-
*
|
|
544
|
-
*
|
|
545
|
-
*
|
|
546
|
-
* guarantees.
|
|
857
|
+
* Retained for backward compatibility with call sites in
|
|
858
|
+
* `data-safety-central.ts` that only snapshot tasks.db. It passes through the
|
|
859
|
+
* same project-wide gate as {@link vacuumIntoBackupAll}: at most one snapshot
|
|
860
|
+
* in flight per project. Per-write checkpoints use the debounced `routine`
|
|
861
|
+
* mode; pre-destructive checkpoints pass `mode: 'required'` and AWAIT the
|
|
862
|
+
* result, so the snapshot is on disk before the destructive step begins.
|
|
547
863
|
*
|
|
548
864
|
* Non-fatal: all errors are swallowed — backup failure must never
|
|
549
865
|
* interrupt normal operation.
|
|
866
|
+
*
|
|
867
|
+
* @returns The gate outcome (which prefixes were snapshotted, or why none
|
|
868
|
+
* were), or `null` when nothing could be attempted.
|
|
869
|
+
* @task T12508 — gated; the `force` bypass was removed
|
|
550
870
|
*/
|
|
551
871
|
export async function vacuumIntoBackup(opts = {}) {
|
|
552
|
-
const now = Date.now();
|
|
553
|
-
const prefix = 'tasks';
|
|
554
|
-
const last = _lastBackupEpoch[prefix] ?? 0;
|
|
555
|
-
if (!opts.force && now - last < DEBOUNCE_MS) {
|
|
556
|
-
return; // debounced
|
|
557
|
-
}
|
|
558
872
|
try {
|
|
559
|
-
const
|
|
560
|
-
const backupDir = join(cleoDir, 'backups', 'sqlite');
|
|
561
|
-
mkdirSync(backupDir, { recursive: true });
|
|
562
|
-
const target = SNAPSHOT_TARGETS.find((t) => t.prefix === prefix);
|
|
873
|
+
const target = SNAPSHOT_TARGETS.find((t) => t.prefix === 'tasks');
|
|
563
874
|
if (!target)
|
|
564
|
-
return;
|
|
565
|
-
await
|
|
566
|
-
_lastBackupEpoch[prefix] = Date.now();
|
|
875
|
+
return null;
|
|
876
|
+
return await snapshotProjectTargetsGated([target], opts);
|
|
567
877
|
}
|
|
568
878
|
catch {
|
|
569
879
|
// non-fatal — backup failure must never interrupt normal operation
|
|
880
|
+
return null;
|
|
570
881
|
}
|
|
571
882
|
}
|
|
572
883
|
/**
|
|
573
884
|
* Create VACUUM INTO snapshots of every project-tier (and opt-in `derived`)
|
|
574
|
-
* SQLite database registered in `DB_INVENTORY
|
|
575
|
-
*
|
|
885
|
+
* SQLite database registered in `DB_INVENTORY`, through the project-wide
|
|
886
|
+
* cross-process gate (see `snapshot-gate.ts`). The session-end hook passes
|
|
887
|
+
* `mode: 'required'`: the snapshot is not debounced by earlier per-write
|
|
888
|
+
* checkpoints, so it captures the session's final writes, and requests that
|
|
889
|
+
* queue behind one running snapshot are all covered by the next one — a burst
|
|
890
|
+
* of session ends produces one snapshot.
|
|
576
891
|
*
|
|
577
892
|
* This is the preferred entry point for session-lifecycle hooks and
|
|
578
893
|
* pre-destructive-operation snapshots — it guarantees that BRAIN memory is
|
|
@@ -587,33 +902,17 @@ export async function vacuumIntoBackup(opts = {}) {
|
|
|
587
902
|
*
|
|
588
903
|
* @task T5158
|
|
589
904
|
* @task T10317 — extended to every `DB_INVENTORY` project + derived row
|
|
905
|
+
* @returns The gate outcome (which prefixes were snapshotted, or why none
|
|
906
|
+
* were), or `null` when nothing could be attempted.
|
|
907
|
+
* @task T12508 — cross-process gate + persisted debounce; `force` removed
|
|
590
908
|
*/
|
|
591
909
|
export async function vacuumIntoBackupAll(opts = {}) {
|
|
592
|
-
const nowMs = Date.now();
|
|
593
|
-
const now = new Date();
|
|
594
|
-
let backupDir;
|
|
595
910
|
try {
|
|
596
|
-
|
|
597
|
-
backupDir = join(cleoDir, 'backups', 'sqlite');
|
|
598
|
-
mkdirSync(backupDir, { recursive: true });
|
|
911
|
+
return await snapshotProjectTargetsGated(SNAPSHOT_TARGETS, opts);
|
|
599
912
|
}
|
|
600
913
|
catch {
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
for (const target of SNAPSHOT_TARGETS) {
|
|
604
|
-
if (target.strategy === 'skip-derived')
|
|
605
|
-
continue;
|
|
606
|
-
const last = _lastBackupEpoch[target.prefix] ?? 0;
|
|
607
|
-
if (!opts.force && nowMs - last < DEBOUNCE_MS) {
|
|
608
|
-
continue; // debounced — skip this target only
|
|
609
|
-
}
|
|
610
|
-
try {
|
|
611
|
-
await snapshotOne(target, backupDir, now, opts.cwd);
|
|
612
|
-
_lastBackupEpoch[target.prefix] = Date.now();
|
|
613
|
-
}
|
|
614
|
-
catch {
|
|
615
|
-
// non-fatal — continue with remaining targets
|
|
616
|
-
}
|
|
914
|
+
// non-fatal — backup failure must never interrupt normal operation
|
|
915
|
+
return null;
|
|
617
916
|
}
|
|
618
917
|
}
|
|
619
918
|
/**
|
|
@@ -774,11 +1073,20 @@ export async function vacuumIntoGlobalBackup(dbName, opts) {
|
|
|
774
1073
|
catch {
|
|
775
1074
|
// non-fatal — continue even if rotation enumeration fails
|
|
776
1075
|
}
|
|
1076
|
+
removeDeadTempSnapshots(backupDir);
|
|
777
1077
|
try {
|
|
778
|
-
// Checkpoint then VACUUM INTO
|
|
1078
|
+
// Checkpoint then VACUUM INTO a temp name, fsync, rename (T12508): a
|
|
1079
|
+
// kill mid-VACUUM never leaves an empty file under a snapshot name.
|
|
779
1080
|
db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
780
|
-
const
|
|
781
|
-
|
|
1081
|
+
const tmp = tempSnapshotPath(snapshotPath);
|
|
1082
|
+
try {
|
|
1083
|
+
db.exec(`VACUUM INTO '${tmp.replace(/'/g, "''")}'`);
|
|
1084
|
+
commitSnapshotFile(tmp, snapshotPath);
|
|
1085
|
+
}
|
|
1086
|
+
catch (err) {
|
|
1087
|
+
rmSync(tmp, { force: true });
|
|
1088
|
+
throw err;
|
|
1089
|
+
}
|
|
782
1090
|
}
|
|
783
1091
|
finally {
|
|
784
1092
|
// Release ephemeral handle for raw-file-vacuum-readonly targets.
|