@cleocode/core 2026.5.133 → 2026.6.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/binaries/README.md +49 -27
- package/dist/agents/{agent-registry.d.ts → agent-capacity-tracker.d.ts} +2 -2
- package/dist/agents/agent-capacity-tracker.d.ts.map +1 -0
- package/dist/agents/{agent-registry.js → agent-capacity-tracker.js} +2 -2
- package/dist/agents/agent-capacity-tracker.js.map +1 -0
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -2
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/seed-install.d.ts +1 -1
- package/dist/agents/seed-install.d.ts.map +1 -1
- package/dist/agents/seed-install.js +42 -36
- package/dist/agents/seed-install.js.map +1 -1
- package/dist/caamp-export.d.ts +18 -0
- package/dist/caamp-export.d.ts.map +1 -0
- package/dist/caamp-export.js +18 -0
- package/dist/caamp-export.js.map +1 -0
- package/dist/conduit/local-transport.d.ts +1 -1
- package/dist/conduit/local-transport.d.ts.map +1 -1
- package/dist/conduit/local-transport.js +69 -43
- package/dist/conduit/local-transport.js.map +1 -1
- package/dist/dispatch/mutate-projection.d.ts.map +1 -1
- package/dist/dispatch/mutate-projection.js +11 -0
- package/dist/dispatch/mutate-projection.js.map +1 -1
- package/dist/docs/docs-read-model.d.ts +7 -0
- package/dist/docs/docs-read-model.d.ts.map +1 -1
- package/dist/docs/docs-read-model.js +5 -0
- package/dist/docs/docs-read-model.js.map +1 -1
- package/dist/docs/supersede.d.ts.map +1 -1
- package/dist/docs/supersede.js +12 -7
- package/dist/docs/supersede.js.map +1 -1
- package/dist/doctor/db-substrate.d.ts.map +1 -1
- package/dist/doctor/db-substrate.js +10 -9
- package/dist/doctor/db-substrate.js.map +1 -1
- package/dist/git-shim-export.d.ts +18 -0
- package/dist/git-shim-export.d.ts.map +1 -0
- package/dist/git-shim-export.js +18 -0
- package/dist/git-shim-export.js.map +1 -0
- package/dist/hooks/payload-schemas.d.ts +2 -2
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +39 -32
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +11 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +14 -5
- package/dist/internal.js.map +1 -1
- package/dist/lafs-export.d.ts +18 -0
- package/dist/lafs-export.d.ts.map +1 -0
- package/dist/lafs-export.js +18 -0
- package/dist/lafs-export.js.map +1 -0
- package/dist/lifecycle/effective-stage.js +1 -1
- package/dist/lifecycle/index.js +1 -1
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/rollup.js +1 -1
- package/dist/llm/credential-pool.d.ts +17 -0
- package/dist/llm/credential-pool.d.ts.map +1 -1
- package/dist/llm/credential-pool.js +40 -1
- package/dist/llm/credential-pool.js.map +1 -1
- package/dist/llm/plugin-facade.d.ts.map +1 -1
- package/dist/llm/plugin-facade.js +11 -19
- package/dist/llm/plugin-facade.js.map +1 -1
- package/dist/llm/role-executor.d.ts +8 -0
- package/dist/llm/role-executor.d.ts.map +1 -1
- package/dist/llm/role-executor.js +96 -4
- package/dist/llm/role-executor.js.map +1 -1
- package/dist/llm/role-resolver.d.ts.map +1 -1
- package/dist/llm/role-resolver.js +56 -1
- package/dist/llm/role-resolver.js.map +1 -1
- package/dist/llm/transports/codex-oauth-headers.d.ts +51 -0
- package/dist/llm/transports/codex-oauth-headers.d.ts.map +1 -0
- package/dist/llm/transports/codex-oauth-headers.js +89 -0
- package/dist/llm/transports/codex-oauth-headers.js.map +1 -0
- package/dist/memory/claude-mem-migration.d.ts.map +1 -1
- package/dist/memory/claude-mem-migration.js +1 -3
- package/dist/memory/claude-mem-migration.js.map +1 -1
- package/dist/memory/decisions.d.ts.map +1 -1
- package/dist/memory/decisions.js +77 -23
- package/dist/memory/decisions.js.map +1 -1
- package/dist/memory/graph-memory-bridge.d.ts.map +1 -1
- package/dist/memory/graph-memory-bridge.js +12 -6
- package/dist/memory/graph-memory-bridge.js.map +1 -1
- package/dist/memory/learnings.d.ts +2 -2
- package/dist/memory/nexus-plasticity.d.ts +21 -9
- package/dist/memory/nexus-plasticity.d.ts.map +1 -1
- package/dist/memory/nexus-plasticity.js +44 -22
- package/dist/memory/nexus-plasticity.js.map +1 -1
- package/dist/memory/patterns.d.ts +2 -2
- package/dist/memory/redaction.d.ts +19 -3
- package/dist/memory/redaction.d.ts.map +1 -1
- package/dist/memory/redaction.js +22 -94
- package/dist/memory/redaction.js.map +1 -1
- package/dist/metrics/token-service.d.ts +8 -2
- package/dist/metrics/token-service.d.ts.map +1 -1
- package/dist/metrics/token-service.js +1 -1
- package/dist/metrics/token-service.js.map +1 -1
- package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
- package/dist/nexus/analyze-orchestrator.js +6 -8
- package/dist/nexus/analyze-orchestrator.js.map +1 -1
- package/dist/nexus/api-extractors/http-extractor.d.ts.map +1 -1
- package/dist/nexus/api-extractors/http-extractor.js +3 -3
- package/dist/nexus/api-extractors/http-extractor.js.map +1 -1
- package/dist/nexus/clusters.d.ts.map +1 -1
- package/dist/nexus/clusters.js +3 -2
- package/dist/nexus/clusters.js.map +1 -1
- package/dist/nexus/context.d.ts.map +1 -1
- package/dist/nexus/context.js +10 -16
- package/dist/nexus/context.js.map +1 -1
- package/dist/nexus/diff.d.ts.map +1 -1
- package/dist/nexus/diff.js +6 -4
- package/dist/nexus/diff.js.map +1 -1
- package/dist/nexus/export.d.ts.map +1 -1
- package/dist/nexus/export.js +7 -4
- package/dist/nexus/export.js.map +1 -1
- package/dist/nexus/flows.d.ts.map +1 -1
- package/dist/nexus/flows.js +3 -1
- package/dist/nexus/flows.js.map +1 -1
- package/dist/nexus/impact.d.ts +1 -1
- package/dist/nexus/impact.d.ts.map +1 -1
- package/dist/nexus/impact.js +31 -17
- package/dist/nexus/impact.js.map +1 -1
- package/dist/nexus/living-brain.d.ts.map +1 -1
- package/dist/nexus/living-brain.js +27 -15
- package/dist/nexus/living-brain.js.map +1 -1
- package/dist/nexus/nexus-bridge.d.ts.map +1 -1
- package/dist/nexus/nexus-bridge.js +28 -29
- package/dist/nexus/nexus-bridge.js.map +1 -1
- package/dist/nexus/plasticity-queries.d.ts +4 -2
- package/dist/nexus/plasticity-queries.d.ts.map +1 -1
- package/dist/nexus/plasticity-queries.js +27 -15
- package/dist/nexus/plasticity-queries.js.map +1 -1
- package/dist/nexus/query.d.ts.map +1 -1
- package/dist/nexus/query.js +6 -2
- package/dist/nexus/query.js.map +1 -1
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +65 -30
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/route-analysis.d.ts +3 -2
- package/dist/nexus/route-analysis.d.ts.map +1 -1
- package/dist/nexus/route-analysis.js +11 -10
- package/dist/nexus/route-analysis.js.map +1 -1
- package/dist/nexus/sigil.d.ts.map +1 -1
- package/dist/nexus/sigil.js +60 -13
- package/dist/nexus/sigil.js.map +1 -1
- package/dist/nexus/user-profile.d.ts +2 -1
- package/dist/nexus/user-profile.d.ts.map +1 -1
- package/dist/nexus/user-profile.js +8 -4
- package/dist/nexus/user-profile.js.map +1 -1
- package/dist/orchestrate/index.d.ts +1 -1
- package/dist/orchestrate/index.d.ts.map +1 -1
- package/dist/orchestrate/index.js +1 -1
- package/dist/orchestrate/index.js.map +1 -1
- package/dist/orchestrate/plan.d.ts +3 -3
- package/dist/orchestrate/plan.d.ts.map +1 -1
- package/dist/orchestrate/plan.js +7 -7
- package/dist/orchestrate/plan.js.map +1 -1
- package/dist/orchestrate/spawn-ops.js +2 -2
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestration/classify.d.ts +2 -2
- package/dist/orchestration/classify.js +3 -3
- package/dist/orchestration/classify.js.map +1 -1
- package/dist/orchestration/validate-spawn.d.ts.map +1 -1
- package/dist/orchestration/validate-spawn.js +5 -5
- package/dist/orchestration/validate-spawn.js.map +1 -1
- package/dist/paths-export.d.ts +18 -0
- package/dist/paths-export.d.ts.map +1 -0
- package/dist/paths-export.js +18 -0
- package/dist/paths-export.js.map +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +24 -11
- package/dist/paths.js.map +1 -1
- package/dist/playbooks/index.d.ts +1 -0
- package/dist/playbooks/index.d.ts.map +1 -1
- package/dist/playbooks/index.js +4 -0
- package/dist/playbooks/index.js.map +1 -1
- package/dist/playbooks/skill-node-executor.d.ts +155 -0
- package/dist/playbooks/skill-node-executor.d.ts.map +1 -0
- package/dist/playbooks/skill-node-executor.js +156 -0
- package/dist/playbooks/skill-node-executor.js.map +1 -0
- package/dist/repair.d.ts +3 -7
- package/dist/repair.d.ts.map +1 -1
- package/dist/repair.js +5 -43
- package/dist/repair.js.map +1 -1
- package/dist/sagas/migrate-containment.js +7 -7
- package/dist/sagas/migrate-containment.js.map +1 -1
- package/dist/scaffold/ensure-dirs.d.ts +8 -2
- package/dist/scaffold/ensure-dirs.d.ts.map +1 -1
- package/dist/scaffold/ensure-dirs.js +24 -11
- package/dist/scaffold/ensure-dirs.js.map +1 -1
- package/dist/scaffold/project-detection.d.ts +5 -1
- package/dist/scaffold/project-detection.d.ts.map +1 -1
- package/dist/scaffold/project-detection.js +9 -5
- package/dist/scaffold/project-detection.js.map +1 -1
- package/dist/sentient/hygiene-scan.js +6 -6
- package/dist/sentient/hygiene-scan.js.map +1 -1
- package/dist/sentient/proposal-dedup.js +2 -2
- package/dist/sentient/proposal-rate-limiter.js +1 -1
- package/dist/sentient/propose-tick.js +5 -5
- package/dist/sentient/propose-tick.js.map +1 -1
- package/dist/sentient/stage-drift-tick.js +3 -3
- package/dist/sentient/stage-drift-tick.js.map +1 -1
- package/dist/sequence/index.d.ts.map +1 -1
- package/dist/sequence/index.js +6 -2
- package/dist/sequence/index.js.map +1 -1
- package/dist/setup/sections/verification.js +2 -2
- package/dist/setup/sections/verification.js.map +1 -1
- package/dist/shutdown.d.ts +81 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +105 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-executor-adapter.d.ts +136 -0
- package/dist/skills/skill-executor-adapter.d.ts.map +1 -0
- package/dist/skills/skill-executor-adapter.js +137 -0
- package/dist/skills/skill-executor-adapter.js.map +1 -0
- package/dist/skills/usage-recorder.d.ts.map +1 -1
- package/dist/skills/usage-recorder.js +30 -0
- package/dist/skills/usage-recorder.js.map +1 -1
- package/dist/skills-export.d.ts +23 -0
- package/dist/skills-export.d.ts.map +1 -0
- package/dist/skills-export.js +23 -0
- package/dist/skills-export.js.map +1 -0
- package/dist/stats/index.d.ts.map +1 -1
- package/dist/stats/index.js +8 -3
- package/dist/stats/index.js.map +1 -1
- package/dist/store/agent-doctor.d.ts +3 -3
- package/dist/store/agent-doctor.d.ts.map +1 -1
- package/dist/store/agent-doctor.js +18 -13
- package/dist/store/agent-doctor.js.map +1 -1
- package/dist/store/agent-install.d.ts +6 -5
- package/dist/store/agent-install.d.ts.map +1 -1
- package/dist/store/agent-install.js +20 -16
- package/dist/store/agent-install.js.map +1 -1
- package/dist/store/agent-registry-accessor.d.ts +66 -28
- package/dist/store/agent-registry-accessor.d.ts.map +1 -1
- package/dist/store/agent-registry-accessor.js +248 -167
- package/dist/store/agent-registry-accessor.js.map +1 -1
- package/dist/store/agent-registry-store.d.ts +242 -0
- package/dist/store/agent-registry-store.d.ts.map +1 -0
- package/dist/store/agent-registry-store.js +501 -0
- package/dist/store/agent-registry-store.js.map +1 -0
- package/dist/store/agent-resolver.d.ts +8 -8
- package/dist/store/agent-resolver.d.ts.map +1 -1
- package/dist/store/agent-resolver.js +19 -17
- package/dist/store/agent-resolver.js.map +1 -1
- package/dist/store/backup-pack.d.ts.map +1 -1
- package/dist/store/backup-pack.js +24 -8
- package/dist/store/backup-pack.js.map +1 -1
- package/dist/store/conduit-sqlite.d.ts +181 -74
- package/dist/store/conduit-sqlite.d.ts.map +1 -1
- package/dist/store/conduit-sqlite.js +307 -528
- package/dist/store/conduit-sqlite.js.map +1 -1
- package/dist/store/cross-db-cleanup.d.ts +5 -5
- package/dist/store/cross-db-cleanup.d.ts.map +1 -1
- package/dist/store/cross-db-cleanup.js +12 -10
- package/dist/store/cross-db-cleanup.js.map +1 -1
- package/dist/store/data-accessor.d.ts +4 -4
- package/dist/store/data-accessor.js +5 -5
- package/dist/store/data-accessor.js.map +1 -1
- package/dist/store/data-safety-central.d.ts +83 -1
- package/dist/store/data-safety-central.d.ts.map +1 -1
- package/dist/store/data-safety-central.js +257 -0
- package/dist/store/data-safety-central.js.map +1 -1
- package/dist/store/db-helpers.d.ts +8 -2
- package/dist/store/db-helpers.d.ts.map +1 -1
- package/dist/store/db-helpers.js +6 -2
- package/dist/store/db-helpers.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts +46 -4
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +103 -9
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/exodus/__fixtures__/representative-fixture.d.ts +116 -0
- package/dist/store/exodus/__fixtures__/representative-fixture.d.ts.map +1 -0
- package/dist/store/exodus/__fixtures__/representative-fixture.js +274 -0
- package/dist/store/exodus/__fixtures__/representative-fixture.js.map +1 -0
- package/dist/store/exodus/index.d.ts +18 -0
- package/dist/store/exodus/index.d.ts.map +1 -0
- package/dist/store/exodus/index.js +18 -0
- package/dist/store/exodus/index.js.map +1 -0
- package/dist/store/exodus/migrate.d.ts +160 -0
- package/dist/store/exodus/migrate.d.ts.map +1 -0
- package/dist/store/exodus/migrate.js +1220 -0
- package/dist/store/exodus/migrate.js.map +1 -0
- package/dist/store/exodus/on-open.d.ts +189 -0
- package/dist/store/exodus/on-open.d.ts.map +1 -0
- package/dist/store/exodus/on-open.js +464 -0
- package/dist/store/exodus/on-open.js.map +1 -0
- package/dist/store/exodus/plan.d.ts +44 -0
- package/dist/store/exodus/plan.d.ts.map +1 -0
- package/dist/store/exodus/plan.js +178 -0
- package/dist/store/exodus/plan.js.map +1 -0
- package/dist/store/exodus/status.d.ts +22 -0
- package/dist/store/exodus/status.d.ts.map +1 -0
- package/dist/store/exodus/status.js +88 -0
- package/dist/store/exodus/status.js.map +1 -0
- package/dist/store/exodus/table-name-map.d.ts +173 -0
- package/dist/store/exodus/table-name-map.d.ts.map +1 -0
- package/dist/store/exodus/table-name-map.js +660 -0
- package/dist/store/exodus/table-name-map.js.map +1 -0
- package/dist/store/exodus/types.d.ts +169 -0
- package/dist/store/exodus/types.d.ts.map +1 -0
- package/dist/store/exodus/types.js +21 -0
- package/dist/store/exodus/types.js.map +1 -0
- package/dist/store/exodus/verify-migration.d.ts +72 -0
- package/dist/store/exodus/verify-migration.d.ts.map +1 -0
- package/dist/store/exodus/verify-migration.js +678 -0
- package/dist/store/exodus/verify-migration.js.map +1 -0
- package/dist/store/exodus/verify.d.ts +58 -0
- package/dist/store/exodus/verify.d.ts.map +1 -0
- package/dist/store/exodus/verify.js +74 -0
- package/dist/store/exodus/verify.js.map +1 -0
- package/dist/store/index.d.ts +2 -3
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +2 -3
- package/dist/store/index.js.map +1 -1
- package/dist/store/memory-accessor.d.ts +31 -0
- package/dist/store/memory-accessor.d.ts.map +1 -1
- package/dist/store/memory-accessor.js +38 -0
- package/dist/store/memory-accessor.js.map +1 -1
- package/dist/store/memory-sqlite.d.ts +86 -13
- package/dist/store/memory-sqlite.d.ts.map +1 -1
- package/dist/store/memory-sqlite.js +326 -528
- package/dist/store/memory-sqlite.js.map +1 -1
- package/dist/store/migrate-signaldock-to-conduit.d.ts +1 -1
- package/dist/store/migrate-signaldock-to-conduit.d.ts.map +1 -1
- package/dist/store/migrate-signaldock-to-conduit.js +126 -35
- package/dist/store/migrate-signaldock-to-conduit.js.map +1 -1
- package/dist/store/migration-manager.d.ts +49 -0
- package/dist/store/migration-manager.d.ts.map +1 -1
- package/dist/store/migration-manager.js +167 -67
- package/dist/store/migration-manager.js.map +1 -1
- package/dist/store/migration-sqlite.d.ts +1 -1
- package/dist/store/migration-sqlite.d.ts.map +1 -1
- package/dist/store/migration-sqlite.js +32 -3
- package/dist/store/migration-sqlite.js.map +1 -1
- package/dist/store/nexus-sqlite.d.ts +152 -29
- package/dist/store/nexus-sqlite.d.ts.map +1 -1
- package/dist/store/nexus-sqlite.js +496 -177
- package/dist/store/nexus-sqlite.js.map +1 -1
- package/dist/store/nexus-validation-schemas.d.ts +32 -32
- package/dist/store/open-cleo-db.d.ts +37 -40
- package/dist/store/open-cleo-db.d.ts.map +1 -1
- package/dist/store/open-cleo-db.js +76 -153
- package/dist/store/open-cleo-db.js.map +1 -1
- package/dist/store/role-accessors-impl.d.ts +4 -4
- package/dist/store/role-accessors-impl.d.ts.map +1 -1
- package/dist/store/role-accessors-impl.js +18 -15
- package/dist/store/role-accessors-impl.js.map +1 -1
- package/dist/store/schema/{signaldock-schema.d.ts → agent-registry-schema.d.ts} +15 -5
- package/dist/store/schema/agent-registry-schema.d.ts.map +1 -0
- package/dist/store/schema/{signaldock-schema.js → agent-registry-schema.js} +15 -5
- package/dist/store/schema/agent-registry-schema.js.map +1 -0
- package/dist/store/schema/agent-schema.d.ts +1 -1
- package/dist/store/schema/agent-schema.js +4 -4
- package/dist/store/schema/agent-schema.js.map +1 -1
- package/dist/store/schema/attachments.d.ts +1 -1
- package/dist/store/schema/audit.d.ts +15 -5
- package/dist/store/schema/audit.d.ts.map +1 -1
- package/dist/store/schema/audit.js +12 -2
- package/dist/store/schema/audit.js.map +1 -1
- package/dist/store/schema/background-jobs.d.ts +1 -1
- package/dist/store/schema/cleo-global/{signaldock.d.ts → agent-registry.d.ts} +277 -271
- package/dist/store/schema/cleo-global/agent-registry.d.ts.map +1 -0
- package/dist/store/schema/cleo-global/{signaldock.js → agent-registry.js} +136 -125
- package/dist/store/schema/cleo-global/agent-registry.js.map +1 -0
- package/dist/store/schema/cleo-global/index.d.ts +29 -22
- package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/index.js +29 -22
- package/dist/store/schema/cleo-global/index.js.map +1 -1
- package/dist/store/schema/cleo-global/nexus.d.ts +36 -1034
- package/dist/store/schema/cleo-global/nexus.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/nexus.js +32 -337
- package/dist/store/schema/cleo-global/nexus.js.map +1 -1
- package/dist/store/schema/cleo-global/skills.d.ts +16 -0
- package/dist/store/schema/cleo-global/skills.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/skills.js +11 -0
- package/dist/store/schema/cleo-global/skills.js.map +1 -1
- package/dist/store/schema/{cleo-project → cleo-global}/telemetry.d.ts +33 -17
- package/dist/store/schema/cleo-global/telemetry.d.ts.map +1 -0
- package/dist/store/schema/{cleo-project → cleo-global}/telemetry.js +30 -18
- package/dist/store/schema/cleo-global/telemetry.js.map +1 -0
- package/dist/store/schema/cleo-project/audit.d.ts +8 -8
- package/dist/store/schema/cleo-project/audit.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/audit.js +2 -6
- package/dist/store/schema/cleo-project/audit.js.map +1 -1
- package/dist/store/schema/cleo-project/docs.d.ts +1 -1
- package/dist/store/schema/cleo-project/index.d.ts +29 -12
- package/dist/store/schema/cleo-project/index.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/index.js +29 -12
- package/dist/store/schema/cleo-project/index.js.map +1 -1
- package/dist/store/schema/cleo-project/lifecycle.d.ts +2 -2
- package/dist/store/schema/cleo-project/nexus-graph.d.ts +1067 -0
- package/dist/store/schema/cleo-project/nexus-graph.d.ts.map +1 -0
- package/dist/store/schema/cleo-project/nexus-graph.js +407 -0
- package/dist/store/schema/cleo-project/nexus-graph.js.map +1 -0
- package/dist/store/schema/cleo-project/provenance-orphans.d.ts +385 -0
- package/dist/store/schema/cleo-project/provenance-orphans.d.ts.map +1 -0
- package/dist/store/schema/cleo-project/provenance-orphans.js +142 -0
- package/dist/store/schema/cleo-project/provenance-orphans.js.map +1 -0
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +1 -1
- package/dist/store/schema/cleo-project/runtime.d.ts +1 -1
- package/dist/store/schema/cleo-project/tasks-core-batch2.d.ts +1 -1
- package/dist/store/schema/cleo-project/tasks-core.d.ts +3 -3
- package/dist/store/schema/cleo-shared/brain.d.ts +711 -494
- package/dist/store/schema/cleo-shared/brain.d.ts.map +1 -1
- package/dist/store/schema/cleo-shared/brain.js +215 -134
- package/dist/store/schema/cleo-shared/brain.js.map +1 -1
- package/dist/store/schema/conduit-schema.d.ts +63 -51
- package/dist/store/schema/conduit-schema.d.ts.map +1 -1
- package/dist/store/schema/conduit-schema.js +23 -11
- package/dist/store/schema/conduit-schema.js.map +1 -1
- package/dist/store/schema/goal.d.ts +3 -2
- package/dist/store/schema/goal.d.ts.map +1 -1
- package/dist/store/schema/goal.js +3 -2
- package/dist/store/schema/goal.js.map +1 -1
- package/dist/store/schema/index.d.ts +1 -0
- package/dist/store/schema/index.d.ts.map +1 -1
- package/dist/store/schema/index.js +1 -0
- package/dist/store/schema/index.js.map +1 -1
- package/dist/store/schema/lifecycle.d.ts +2 -2
- package/dist/store/schema/memory-schema.d.ts +2 -2
- package/dist/store/schema/nexus-schema.d.ts +174 -115
- package/dist/store/schema/nexus-schema.d.ts.map +1 -1
- package/dist/store/schema/nexus-schema.js +175 -55
- package/dist/store/schema/nexus-schema.js.map +1 -1
- package/dist/store/schema/provenance/releases.d.ts +1 -1
- package/dist/store/schema/schema-utils.d.ts +78 -0
- package/dist/store/schema/schema-utils.d.ts.map +1 -0
- package/dist/store/schema/schema-utils.js +49 -0
- package/dist/store/schema/schema-utils.js.map +1 -0
- package/dist/store/schema/skills-schema.d.ts +81 -44
- package/dist/store/schema/skills-schema.d.ts.map +1 -1
- package/dist/store/schema/skills-schema.js +49 -16
- package/dist/store/schema/skills-schema.js.map +1 -1
- package/dist/store/schema/tasks.d.ts +3 -3
- package/dist/store/skills-db.d.ts +90 -50
- package/dist/store/skills-db.d.ts.map +1 -1
- package/dist/store/skills-db.js +132 -146
- package/dist/store/skills-db.js.map +1 -1
- package/dist/store/sqlite-backup.d.ts +2 -2
- package/dist/store/sqlite-backup.d.ts.map +1 -1
- package/dist/store/sqlite-backup.js +11 -10
- package/dist/store/sqlite-backup.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +25 -18
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/sqlite.d.ts +72 -12
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +153 -89
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/tasks-schema.d.ts +4 -0
- package/dist/store/tasks-schema.d.ts.map +1 -1
- package/dist/store/tasks-schema.js +60 -0
- package/dist/store/tasks-schema.js.map +1 -1
- package/dist/store/tasks-sqlite.d.ts +2 -2
- package/dist/store/tasks-sqlite.d.ts.map +1 -1
- package/dist/store/tasks-sqlite.js +10 -5
- package/dist/store/tasks-sqlite.js.map +1 -1
- package/dist/store/umbrella-data-accessor.d.ts +17 -6
- package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
- package/dist/store/umbrella-data-accessor.js +8 -8
- package/dist/store/umbrella-data-accessor.js.map +1 -1
- package/dist/store/validation-schemas.d.ts +241 -208
- package/dist/store/validation-schemas.d.ts.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +11 -6
- package/dist/system/health.js.map +1 -1
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +58 -12
- package/dist/system/project-health.js.map +1 -1
- package/dist/tasks/add.d.ts +8 -0
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/add.js +101 -0
- package/dist/tasks/add.js.map +1 -1
- package/dist/tasks/cancelled-child-waiver-audit.d.ts +47 -0
- package/dist/tasks/cancelled-child-waiver-audit.d.ts.map +1 -0
- package/dist/tasks/cancelled-child-waiver-audit.js +34 -0
- package/dist/tasks/cancelled-child-waiver-audit.js.map +1 -0
- package/dist/tasks/complete.d.ts +22 -2
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +71 -6
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/compute-task-view.js +1 -1
- package/dist/tasks/session-scope.d.ts +5 -0
- package/dist/tasks/session-scope.d.ts.map +1 -1
- package/dist/tasks/session-scope.js +4 -0
- package/dist/tasks/session-scope.js.map +1 -1
- package/dist/tools/guard.d.ts +71 -1
- package/dist/tools/guard.d.ts.map +1 -1
- package/dist/tools/guard.js +73 -1
- package/dist/tools/guard.js.map +1 -1
- package/dist/tools/index.d.ts +21 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +25 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +22 -13
- package/dist/upgrade.js.map +1 -1
- package/dist/workgraph/containment.js +18 -18
- package/dist/workgraph/relations.js +2 -2
- package/dist/worktree/list.d.ts +1 -1
- package/dist/worktree/list.d.ts.map +1 -1
- package/dist/worktree/list.js +19 -21
- package/dist/worktree/list.js.map +1 -1
- package/dist/worktree-export.d.ts +18 -0
- package/dist/worktree-export.d.ts.map +1 -0
- package/dist/worktree-export.js +18 -0
- package/dist/worktree-export.js.map +1 -0
- package/migrations/drizzle-agent-registry/20260412000000_initial-global-agent-registry/migration.sql +29 -0
- package/migrations/drizzle-brain/20260601000001_t11522-brain-task-observations/migration.sql +28 -0
- package/migrations/drizzle-brain/20260601000002_t11522-inline-only-brain-tables/migration.sql +75 -0
- package/migrations/drizzle-cleo-global/20260531000001_t11363-consolidation-cleo-global/migration.sql +49 -144
- package/migrations/drizzle-cleo-global/20260531000001_t11363-consolidation-cleo-global/snapshot.json +8 -8
- package/migrations/drizzle-cleo-global/20260531000002_t11546-brain-usage-log/migration.sql +16 -0
- package/migrations/drizzle-cleo-global/20260601000001_t11544-skills-usage-project-id/migration.sql +12 -0
- package/migrations/drizzle-cleo-global/20260602000001_t11622-agent-registry-rename/migration.sql +80 -0
- package/migrations/drizzle-cleo-project/20260531000001_t11363-consolidation-cleo-project/migration.sql +26 -167
- package/migrations/drizzle-cleo-project/20260531000001_t11363-consolidation-cleo-project/snapshot.json +8 -8
- package/migrations/drizzle-cleo-project/20260531000002_t11546-brain-usage-log/migration.sql +21 -0
- package/migrations/drizzle-cleo-project/20260601000001_t11549-agent-credentials-brain-release-links/migration.sql +49 -0
- package/migrations/drizzle-cleo-project/20260601000002_t11538-project-nexus-graph/migration.sql +140 -0
- package/migrations/drizzle-cleo-project/20260602000002_t11649-token-usage-transport-mcp/migration.sql +146 -0
- package/migrations/drizzle-conduit/20260601000003_t11523-conduit-inline-schema/migration.sql +82 -0
- package/migrations/drizzle-nexus/20260421200001_t1165-baseline-reset/migration.sql +26 -8
- package/migrations/drizzle-nexus/20260601000001_t11545-nexus-relation-weights-partition/migration.sql +97 -0
- package/package.json +43 -11
- package/scripts/install-supervisor-binary.mjs +50 -201
- package/scripts/napi-binary-picker.mjs +267 -0
- package/dist/agents/agent-registry.d.ts.map +0 -1
- package/dist/agents/agent-registry.js.map +0 -1
- package/dist/store/data-safety.d.ts +0 -92
- package/dist/store/data-safety.d.ts.map +0 -1
- package/dist/store/data-safety.js +0 -274
- package/dist/store/data-safety.js.map +0 -1
- package/dist/store/schema/cleo-global/signaldock.d.ts.map +0 -1
- package/dist/store/schema/cleo-global/signaldock.js.map +0 -1
- package/dist/store/schema/cleo-project/telemetry.d.ts.map +0 -1
- package/dist/store/schema/cleo-project/telemetry.js.map +0 -1
- package/dist/store/schema/signaldock-schema.d.ts.map +0 -1
- package/dist/store/schema/signaldock-schema.js.map +0 -1
- package/dist/store/signaldock-sqlite.d.ts +0 -173
- package/dist/store/signaldock-sqlite.d.ts.map +0 -1
- package/dist/store/signaldock-sqlite.js +0 -445
- package/dist/store/signaldock-sqlite.js.map +0 -1
- package/migrations/drizzle-nexus/20260318205558_initial/migration.sql +0 -46
- package/migrations/drizzle-nexus/20260412000001_t529-nexus-graph-tables/migration.sql +0 -49
- package/migrations/drizzle-nexus/20260415000001_t622-project-registry-paths/migration.sql +0 -12
- package/migrations/drizzle-nexus/20260419000001_t998-nexus-plasticity/migration.sql +0 -13
- package/migrations/drizzle-nexus/20260423052640_t1077-add-user-profile-table/migration.sql +0 -16
- package/migrations/drizzle-nexus/20260423052640_t1077-add-user-profile-table/snapshot.json +0 -1531
- package/migrations/drizzle-nexus/20260424140538_t1148-add-sigils-table/migration.sql +0 -13
- package/migrations/drizzle-nexus/20260424140538_t1148-add-sigils-table/snapshot.json +0 -1652
- package/migrations/drizzle-nexus/20260504000001_t1839-fts5-nexus-symbols/migration.sql +0 -68
- package/migrations/drizzle-nexus/20260507135519_t9163-nexus-is-external/migration.sql +0 -20
- package/migrations/drizzle-nexus/20260507135519_t9163-nexus-is-external/snapshot.json +0 -1652
- package/migrations/drizzle-nexus/20260526222449_t11025-project-id-aliases/migration.sql +0 -16
- package/migrations/drizzle-signaldock/20260412000000_initial-global-signaldock/migration.sql +0 -209
- package/migrations/drizzle-signaldock/20260412000000_initial-global-signaldock/snapshot.json +0 -2060
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exodus-on-open — lazy, idempotent, parity-gated auto-migration of the legacy
|
|
3
|
+
* multi-DB fleet into the consolidated dual-scope `cleo.db` on first open.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists (data-continuity safety net · T11553)
|
|
6
|
+
*
|
|
7
|
+
* E6 routes every `getDb`/`getBrainDb`/etc read at the consolidated `cleo.db`.
|
|
8
|
+
* On an *existing* install the consolidated DB is freshly migrated but **empty**
|
|
9
|
+
* (0 base-table rows), while the user's real data still lives in the legacy
|
|
10
|
+
* `tasks.db` / `brain.db` / `conduit.db` / `signaldock.db` fleet (e.g. 4465
|
|
11
|
+
* tasks). Without an auto-migration the E8/T11251 cutover would make every
|
|
12
|
+
* user's data **invisible**. This module wires the existing `runExodusMigrate`
|
|
13
|
+
* engine to run **once, automatically, on first open** — gated by the
|
|
14
|
+
* `verifyMigration` (T11551) parity check so a partial or lossy migration NEVER
|
|
15
|
+
* becomes the live source of truth.
|
|
16
|
+
*
|
|
17
|
+
* ## Trigger condition (AC1)
|
|
18
|
+
*
|
|
19
|
+
* On first `openDualScopeDb(scope)` the hook runs iff **both**:
|
|
20
|
+
* 1. the consolidated `cleo.db` for that scope is EMPTY (the canonical first
|
|
21
|
+
* base table has zero rows), AND
|
|
22
|
+
* 2. at least one legacy source DB for that scope has rows.
|
|
23
|
+
*
|
|
24
|
+
* ## Idempotency (AC1)
|
|
25
|
+
*
|
|
26
|
+
* After a successful migration the consolidated DB is non-empty, so the
|
|
27
|
+
* emptiness check short-circuits on every subsequent open — a second open is a
|
|
28
|
+
* no-op. The check is also re-evaluated *inside* the single-flight lock
|
|
29
|
+
* (double-checked locking) so the process that loses a concurrency race never
|
|
30
|
+
* re-migrates.
|
|
31
|
+
*
|
|
32
|
+
* ## Parity gate + clean abort (AC2)
|
|
33
|
+
*
|
|
34
|
+
* After the copy, `verifyMigration` (T11551) compares row counts + canonical
|
|
35
|
+
* digests + FK integrity + enum drift legacy↔consolidated. The data-continuity
|
|
36
|
+
* gate is **row-count parity + zero migration-INTRODUCED FK orphans** (hash/enum
|
|
37
|
+
* drift are the expected normalisation diagnostics, and pre-existing SOURCE FK
|
|
38
|
+
* orphans are tolerated as zero-loss — see {@link isDataContinuityOk}). If a
|
|
39
|
+
* genuine deficit/introduced-orphan is detected the hook **aborts the cutover**:
|
|
40
|
+
* it rolls the half-migrated consolidated tables back to EMPTY (`DELETE FROM`
|
|
41
|
+
* every user table — see {@link rollbackConsolidatedToEmpty}) so the legacy DBs
|
|
42
|
+
* remain the source of truth, no half-migrated `cleo.db` is exposed, and there
|
|
43
|
+
* are no silent `INSERT OR IGNORE` row drops. The file is never unlinked; the
|
|
44
|
+
* chokepoint re-opens a fresh handle afterwards (the migrate engine closes the
|
|
45
|
+
* handles it opened, so the rollback re-opens the scope before truncating it).
|
|
46
|
+
*
|
|
47
|
+
* ## Retry correctness — journal invalidation on abort (T11572)
|
|
48
|
+
*
|
|
49
|
+
* `runExodusMigrate` is resumable: it journals each table `done` and SKIPS
|
|
50
|
+
* already-`done` tables on a re-run. On abort we truncate the consolidated rows
|
|
51
|
+
* back to empty, so a stale `done` journal would make the next open re-trigger
|
|
52
|
+
* (target empty), copy NOTHING (journal says done), re-verify the still-empty
|
|
53
|
+
* target, and re-abort — a permanent loop. The abort path therefore also calls
|
|
54
|
+
* `clearExodusJournal(plan.stagingDir)` so a post-abort retry RE-COPIES from
|
|
55
|
+
* scratch.
|
|
56
|
+
*
|
|
57
|
+
* ## Concurrency safety (AC6 · reconcile with T11554 / R13-T11278)
|
|
58
|
+
*
|
|
59
|
+
* Two processes opening a brand-new empty `cleo.db` simultaneously must not both
|
|
60
|
+
* migrate. A `proper-lockfile` single-flight lock on
|
|
61
|
+
* `<cleo.db>.exodus-on-open.lock` serialises the attempt; the loser re-checks
|
|
62
|
+
* emptiness under the lock and bails. This is the same first-run-race concern
|
|
63
|
+
* T11554 raises for schema bootstrap — both are solved by serialising the
|
|
64
|
+
* first-open mutation.
|
|
65
|
+
*
|
|
66
|
+
* @module
|
|
67
|
+
* @task T11553 (E6 · exodus-on-open)
|
|
68
|
+
* @epic T11249 (E6)
|
|
69
|
+
* @saga T11242 (SG-DB-SUBSTRATE-V2)
|
|
70
|
+
* @see packages/core/src/store/exodus/migrate.ts — runExodusMigrate engine
|
|
71
|
+
* @see packages/core/src/store/exodus/verify-migration.ts — verifyMigration parity gate (T11551)
|
|
72
|
+
* @see packages/core/src/store/dual-scope-db.ts — the open chokepoint that calls this
|
|
73
|
+
*/
|
|
74
|
+
import { existsSync } from 'node:fs';
|
|
75
|
+
import { getLogger } from '../../logger.js';
|
|
76
|
+
import { withLock } from '../lock.js';
|
|
77
|
+
const log = getLogger('exodus-on-open');
|
|
78
|
+
/**
|
|
79
|
+
* Re-entrancy guard. `runExodusMigrate` itself calls `openDualScopeDb` for both
|
|
80
|
+
* scopes to create + populate the consolidated schema. Those nested opens MUST
|
|
81
|
+
* NOT recursively trigger another exodus-on-open. This flag is set for the
|
|
82
|
+
* duration of an auto-migration so the chokepoint skips the hook while a
|
|
83
|
+
* migration is already in flight.
|
|
84
|
+
*/
|
|
85
|
+
let _exodusInProgress = false;
|
|
86
|
+
/**
|
|
87
|
+
* Opt-out env flag. Set `CLEO_DISABLE_EXODUS_ON_OPEN=1` to skip the lazy
|
|
88
|
+
* auto-migration entirely (e.g. for tooling that intentionally inspects an
|
|
89
|
+
* empty consolidated DB). The manual `cleo exodus migrate` path is unaffected.
|
|
90
|
+
*/
|
|
91
|
+
function isDisabledByEnv() {
|
|
92
|
+
const v = process.env.CLEO_DISABLE_EXODUS_ON_OPEN;
|
|
93
|
+
return v === '1' || v === 'true';
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The canonical "first base table" for each scope — the same existence anchor
|
|
97
|
+
* used by the migration journal reconciliation. If this table has zero rows the
|
|
98
|
+
* consolidated DB is considered empty for the purposes of the trigger.
|
|
99
|
+
*
|
|
100
|
+
* - project → `tasks_tasks`
|
|
101
|
+
* - global → `nexus_project_registry`
|
|
102
|
+
*/
|
|
103
|
+
function baseTableForScope(scope) {
|
|
104
|
+
return scope === 'project' ? 'tasks_tasks' : 'nexus_project_registry';
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Count rows in `table` on `nativeDb`, returning `0` if the table does not yet
|
|
108
|
+
* exist or the query fails. Used to decide whether the consolidated DB is empty.
|
|
109
|
+
*/
|
|
110
|
+
function safeRowCount(nativeDb, table) {
|
|
111
|
+
try {
|
|
112
|
+
const row = nativeDb.prepare(`SELECT COUNT(*) AS n FROM "${table}"`).get();
|
|
113
|
+
return row?.n ?? 0;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Table missing (pre-migration) or other read error → treat as empty.
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Return `true` if the consolidated `cleo.db` for `scope` is empty — i.e. the
|
|
122
|
+
* canonical base table for that scope has zero rows.
|
|
123
|
+
*/
|
|
124
|
+
function consolidatedIsEmpty(nativeDb, scope) {
|
|
125
|
+
return safeRowCount(nativeDb, baseTableForScope(scope)) === 0;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Roll a half-migrated consolidated `cleo.db` back to EMPTY **in place**, on the
|
|
129
|
+
* caller's live handle — without closing the handle or deleting the file.
|
|
130
|
+
*
|
|
131
|
+
* Called on a parity-failure abort. `runExodusMigrate` writes into the SAME
|
|
132
|
+
* cached native handle the chokepoint caller is using (the cache is keyed by
|
|
133
|
+
* path), so we must NOT close it or unlink the file out from under the caller
|
|
134
|
+
* (`getBrainDb`/`ensureConduitDb` would then hit "database is not open"). Instead
|
|
135
|
+
* we `DELETE FROM` every user table inside a single transaction with foreign
|
|
136
|
+
* keys OFF, restoring the post-migration *empty* schema. The caller then
|
|
137
|
+
* proceeds with an empty `cleo.db` and the legacy DBs remain the source of
|
|
138
|
+
* truth — exactly the AC2 "no half-migrated cleo.db" contract, achieved without
|
|
139
|
+
* destroying the open handle.
|
|
140
|
+
*
|
|
141
|
+
* The schema (tables, indexes, drizzle journal) is preserved; only data rows are
|
|
142
|
+
* removed. Idempotent and best-effort: a failure to clear one table is logged
|
|
143
|
+
* but does not throw (the next open's emptiness check still sees a populated
|
|
144
|
+
* base table and could re-attempt, which is acceptable — it will re-abort).
|
|
145
|
+
*
|
|
146
|
+
* @param nativeDb - The live consolidated handle to truncate.
|
|
147
|
+
* @param scope - Scope label for logging.
|
|
148
|
+
*/
|
|
149
|
+
function rollbackConsolidatedToEmpty(nativeDb, scope) {
|
|
150
|
+
let userTables = [];
|
|
151
|
+
try {
|
|
152
|
+
userTables = nativeDb
|
|
153
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '__drizzle_%'")
|
|
154
|
+
.all().map((r) => r.name);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
log.error({ err, scope }, 'exodus-on-open: failed to enumerate tables for rollback');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
nativeDb.exec('PRAGMA foreign_keys = OFF');
|
|
162
|
+
nativeDb.exec('BEGIN');
|
|
163
|
+
for (const table of userTables) {
|
|
164
|
+
try {
|
|
165
|
+
nativeDb.exec(`DELETE FROM "${table}"`);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
log.warn({ err, table, scope }, 'exodus-on-open: failed to clear table during rollback');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
nativeDb.exec('COMMIT');
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
try {
|
|
175
|
+
nativeDb.exec('ROLLBACK');
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// ignore — nothing to roll back
|
|
179
|
+
}
|
|
180
|
+
log.error({ err, scope }, 'exodus-on-open: rollback transaction failed');
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
try {
|
|
184
|
+
nativeDb.exec('PRAGMA foreign_keys = ON');
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// ignore
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Roll BOTH consolidated scopes back to empty after a failed auto-migration.
|
|
193
|
+
*
|
|
194
|
+
* IMPORTANT: `runExodusMigrate` closes the dual-scope handles it opened (and
|
|
195
|
+
* evicts them from the chokepoint cache) when it finishes — including on
|
|
196
|
+
* failure. Any `nativeDb` reference captured before the migrate ran is therefore
|
|
197
|
+
* already CLOSED, so we must NOT operate on it. Instead we re-open each scope
|
|
198
|
+
* fresh from the chokepoint (a cache-miss → a new live handle on the same
|
|
199
|
+
* on-disk file, which still holds the half-migrated rows) and truncate THAT.
|
|
200
|
+
* `_exodusInProgress` is still `true`, so the re-opens do not recurse into the
|
|
201
|
+
* hook.
|
|
202
|
+
*
|
|
203
|
+
* @param scope - The scope being opened (logging context only; both scopes are
|
|
204
|
+
* cleared because `runExodusMigrate` populates both).
|
|
205
|
+
*/
|
|
206
|
+
async function rollbackBothScopes(scope) {
|
|
207
|
+
const { openDualScopeDb } = await import('../dual-scope-db.js');
|
|
208
|
+
for (const s of ['project', 'global']) {
|
|
209
|
+
try {
|
|
210
|
+
const handle = s === 'project' ? await openDualScopeDb('project') : await openDualScopeDb('global');
|
|
211
|
+
const native = handle.db.$client;
|
|
212
|
+
if (native) {
|
|
213
|
+
rollbackConsolidatedToEmpty(native, s);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
log.warn({ err, scope: s, openingScope: scope }, 'exodus-on-open: could not roll back scope (best-effort)');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Decide whether a {@link verifyMigration} result clears the **data-continuity**
|
|
223
|
+
* gate — the campaign-aligned zero-loss invariant (DHQ-045 · T11551).
|
|
224
|
+
*
|
|
225
|
+
* `verifyMigration().ok` is intentionally STRICTER than data-continuity: it also
|
|
226
|
+
* requires `hashMatch` and zero enum-drift findings. After a CORRECT migration
|
|
227
|
+
* those two will legitimately be `false`, because the migration NORMALISES the
|
|
228
|
+
* data (legacy enum aliases like `'ACCEPTED'`→`'accepted'`, epoch→ISO
|
|
229
|
+
* timestamps) — so the consolidated content digest differs from the un-normalised
|
|
230
|
+
* source, and the source still reports its raw drift as a diagnostic. Treating
|
|
231
|
+
* that as a parity failure would abort EVERY real migration.
|
|
232
|
+
*
|
|
233
|
+
* The zero-loss invariant the exodus campaign actually proves (and the one the
|
|
234
|
+
* representative real-data parity test asserts) is:
|
|
235
|
+
*
|
|
236
|
+
* 1. every data-bearing base table copied with NO ROW DEFICIT
|
|
237
|
+
* (`targetCount >= sourceCount` — you cannot LOSE a row you have MORE of),
|
|
238
|
+
* AND
|
|
239
|
+
* 2. NO referential orphans the migration INTRODUCED on the consolidated
|
|
240
|
+
* target (`introducedForeignKeyViolations` empty).
|
|
241
|
+
*
|
|
242
|
+
* ## A row SURPLUS is NOT data loss (T11577)
|
|
243
|
+
*
|
|
244
|
+
* Data loss means rows are MISSING: `targetCount < sourceCount` (a DEFICIT).
|
|
245
|
+
* A SURPLUS (`targetCount > sourceCount`) cannot be loss — every source row is
|
|
246
|
+
* still present, plus extra. The canonical benign surplus is the migration's
|
|
247
|
+
* OWN audit trail: `runExodusMigrate` opens the nexus registry, whose
|
|
248
|
+
* `writeNexusAudit` (`nexus/registry.ts`) appends rows to `nexus_audit_log`
|
|
249
|
+
* DURING the migrating open, so the consolidated `nexus_audit_log` legitimately
|
|
250
|
+
* has a few MORE rows than the legacy source (e.g. 161923 → 161926). Gating on
|
|
251
|
+
* exact `countMatch` (`source === target`) wrongly aborts the cutover on that
|
|
252
|
+
* append. The gate therefore fails ONLY on a genuine DEFICIT; a surplus is
|
|
253
|
+
* tolerated and logged as a WARN (with the table + delta) so it stays visible
|
|
254
|
+
* and a double-copy on a non-append table could still be spotted by an operator.
|
|
255
|
+
* Deficits are NEVER tolerated — that is the real data-loss class.
|
|
256
|
+
*
|
|
257
|
+
* ## Pre-existing source orphans are tolerated (T11572)
|
|
258
|
+
*
|
|
259
|
+
* A legacy source DB can already contain referential orphans (e.g. a
|
|
260
|
+
* `tasks_task_relations` row pointing at a task that was deleted long before the
|
|
261
|
+
* migration). Those rows copy through faithfully — that is ZERO loss, not a
|
|
262
|
+
* migration defect — so they appear on BOTH sides and `verifyMigration`
|
|
263
|
+
* classifies them as `preExistingForeignKeyViolations`. Gating on the *total*
|
|
264
|
+
* orphan set (`foreignKeyViolations`) would permanently abort every real cutover
|
|
265
|
+
* over a defect the data already had. The gate therefore fails ONLY on
|
|
266
|
+
* `introducedForeignKeyViolations` — orphans present on the target that the
|
|
267
|
+
* source did not have (i.e. the migration dropped a parent row). Pre-existing
|
|
268
|
+
* orphans are logged as a WARN for a data-hygiene follow-up.
|
|
269
|
+
*
|
|
270
|
+
* Hash mismatch + source enum-drift are surfaced as WARN diagnostics (a true
|
|
271
|
+
* content corruption would normally also show up as an introduced FK orphan or a
|
|
272
|
+
* count deficit), but they do NOT, on their own, indicate data loss.
|
|
273
|
+
*
|
|
274
|
+
* @param result - The {@link VerifyMigrationResult} from `verifyMigration`.
|
|
275
|
+
* @returns `true` when NO base table has a row DEFICIT (`targetCount <
|
|
276
|
+
* sourceCount`) and the migration introduced no new FK orphans — i.e. the
|
|
277
|
+
* cutover is safe. A surplus (`targetCount > sourceCount`) is tolerated.
|
|
278
|
+
*
|
|
279
|
+
* @task T11577 (deficit-only gate — tolerate benign migration-time surplus)
|
|
280
|
+
*/
|
|
281
|
+
export function isDataContinuityOk(result) {
|
|
282
|
+
// A DEFICIT (target has FEWER rows than source) is the genuine data-loss
|
|
283
|
+
// class — abort. A SURPLUS (target has MORE, e.g. nexus_audit_log gaining the
|
|
284
|
+
// migration's own audit writes) is NOT loss; tolerate it but log a WARN so the
|
|
285
|
+
// table + delta stay visible (a surplus on a non-append table could hint at a
|
|
286
|
+
// double-copy worth an operator's attention).
|
|
287
|
+
const deficits = result.tables.filter((t) => t.targetCount < t.sourceCount);
|
|
288
|
+
const surpluses = result.tables.filter((t) => t.targetCount > t.sourceCount);
|
|
289
|
+
if (surpluses.length > 0) {
|
|
290
|
+
log.warn({
|
|
291
|
+
surpluses: surpluses.map((t) => ({
|
|
292
|
+
table: t.targetTable,
|
|
293
|
+
scope: t.scope,
|
|
294
|
+
source: t.sourceCount,
|
|
295
|
+
target: t.targetCount,
|
|
296
|
+
delta: t.targetCount - t.sourceCount,
|
|
297
|
+
})),
|
|
298
|
+
}, `exodus-on-open: ${surpluses.length} table(s) have MORE rows in target than source ` +
|
|
299
|
+
`(row surplus — NOT data loss, tolerated; e.g. migration-time nexus_audit_log writes). ` +
|
|
300
|
+
`Verify none is an unexpected double-copy on a non-append table.`);
|
|
301
|
+
}
|
|
302
|
+
return deficits.length === 0 && result.introducedForeignKeyViolations.length === 0;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Lazily migrate the legacy fleet into the consolidated `cleo.db` on first open.
|
|
306
|
+
*
|
|
307
|
+
* This is the thin guard wired into {@link openDualScopeDb}. It is invoked AFTER
|
|
308
|
+
* the consolidated schema migrations have run (so the base tables exist) but
|
|
309
|
+
* BEFORE the handle is returned to the caller. It is a no-op unless the trigger
|
|
310
|
+
* condition (AC1) holds.
|
|
311
|
+
*
|
|
312
|
+
* Re-entrancy, concurrency, parity gating, and clean abort are all handled here
|
|
313
|
+
* — see the module docs. The heavy lifting (copy, journal, backup, attach-leak
|
|
314
|
+
* safety) is delegated to the existing {@link runExodusMigrate} engine; this
|
|
315
|
+
* function adds only the *when* (lazy trigger) and the *safety envelope*
|
|
316
|
+
* (single-flight + verify-or-rollback).
|
|
317
|
+
*
|
|
318
|
+
* On a parity-failure abort the migration's writes are rolled back IN PLACE on
|
|
319
|
+
* the caller's live handle (see {@link rollbackConsolidatedToEmpty}) — the
|
|
320
|
+
* handle is never closed and the file is never deleted, so the chokepoint caller
|
|
321
|
+
* (`getBrainDb`/`ensureConduitDb`/…) keeps a valid, empty `cleo.db` and the
|
|
322
|
+
* legacy DBs remain the source of truth.
|
|
323
|
+
*
|
|
324
|
+
* @param scope - The scope being opened (`'project'` | `'global'`).
|
|
325
|
+
* @param dbPath - Absolute path to the consolidated `cleo.db` for `scope`.
|
|
326
|
+
* @param nativeDb - The freshly-opened native handle (post-migration). This is
|
|
327
|
+
* the SAME cached handle `runExodusMigrate` writes through,
|
|
328
|
+
* so the rollback truncates it in place rather than deleting.
|
|
329
|
+
* @param cwd - Working directory used to resolve the project root.
|
|
330
|
+
* @returns The {@link ExodusOnOpenResult} describing what happened.
|
|
331
|
+
*
|
|
332
|
+
* @task T11553 (AC1, AC2, AC6)
|
|
333
|
+
* @epic T11249 (E6)
|
|
334
|
+
* @saga T11242
|
|
335
|
+
*/
|
|
336
|
+
export async function maybeRunExodusOnOpen(scope, dbPath, nativeDb, cwd) {
|
|
337
|
+
// Re-entrancy: the nested opens from runExodusMigrate must never recurse.
|
|
338
|
+
if (_exodusInProgress) {
|
|
339
|
+
return { outcome: 'skipped', reason: 're-entrant open during active migration' };
|
|
340
|
+
}
|
|
341
|
+
if (isDisabledByEnv()) {
|
|
342
|
+
return { outcome: 'skipped', reason: 'CLEO_DISABLE_EXODUS_ON_OPEN set' };
|
|
343
|
+
}
|
|
344
|
+
// Fast path (unlocked): if the consolidated DB already has data, nothing to do.
|
|
345
|
+
// This makes the second-open case a cheap COUNT(*) with no lock acquisition.
|
|
346
|
+
if (!consolidatedIsEmpty(nativeDb, scope)) {
|
|
347
|
+
return { outcome: 'skipped', reason: 'consolidated cleo.db already populated' };
|
|
348
|
+
}
|
|
349
|
+
// Lazy-load the exodus engine via dynamic import to break the import cycle
|
|
350
|
+
// (exodus/migrate.ts imports openDualScopeDb from dual-scope-db.ts).
|
|
351
|
+
const { buildExodusPlan, runExodusMigrate, verifyMigration, clearExodusJournal } = await import('./index.js');
|
|
352
|
+
const plan = buildExodusPlan(cwd);
|
|
353
|
+
// Trigger ONLY on sources that belong to the SCOPE being opened. A
|
|
354
|
+
// project-scope open must not fire because a GLOBAL legacy DB (e.g.
|
|
355
|
+
// signaldock.db) happens to exist — that would (a) wrongly migrate global
|
|
356
|
+
// data on a project read and (b) collide with the legacy signaldock→conduit
|
|
357
|
+
// migration, which legitimately opens an empty project `cleo.db` while a
|
|
358
|
+
// global signaldock.db is present. The migration engine still consolidates
|
|
359
|
+
// BOTH scopes once triggered; this gate only decides WHEN to fire.
|
|
360
|
+
const scopeSources = plan.sources.filter((s) => s.targetScope === scope);
|
|
361
|
+
if (!scopeSources.some((s) => existsSync(s.path))) {
|
|
362
|
+
return {
|
|
363
|
+
outcome: 'skipped',
|
|
364
|
+
reason: `no legacy ${scope}-scope source DBs present (fresh install or cross-scope-only)`,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
// Single-flight: serialise the first-open migration across processes so two
|
|
368
|
+
// concurrent opens never both migrate (AC6 · T11554 first-run race).
|
|
369
|
+
const lockPath = `${dbPath}.exodus-on-open.lock`;
|
|
370
|
+
return withLock(lockPath, async () => {
|
|
371
|
+
// Double-checked locking: a process that lost the race will find the DB
|
|
372
|
+
// already populated (by the winner) and bail without re-migrating.
|
|
373
|
+
if (!consolidatedIsEmpty(nativeDb, scope)) {
|
|
374
|
+
return { outcome: 'skipped', reason: 'migrated by a concurrent process (lock winner)' };
|
|
375
|
+
}
|
|
376
|
+
log.info({
|
|
377
|
+
scope,
|
|
378
|
+
dbPath,
|
|
379
|
+
sources: plan.sources.filter((s) => existsSync(s.path)).map((s) => s.name),
|
|
380
|
+
}, 'exodus-on-open: consolidated cleo.db is empty and legacy data present — auto-migrating');
|
|
381
|
+
_exodusInProgress = true;
|
|
382
|
+
try {
|
|
383
|
+
// 1. Run the migration engine (copies BOTH scopes; idempotent + journaled).
|
|
384
|
+
const migrateResult = await runExodusMigrate(plan, false, (msg) => log.debug({ scope }, `exodus-on-open: ${msg}`));
|
|
385
|
+
if (!migrateResult.ok) {
|
|
386
|
+
// Migration itself failed mid-copy — abort the cutover cleanly by
|
|
387
|
+
// rolling the consolidated tables back to empty IN PLACE (handle stays
|
|
388
|
+
// open; legacy DBs remain the source of truth).
|
|
389
|
+
await rollbackBothScopes(scope);
|
|
390
|
+
// T11572: invalidate the journal so the NEXT open re-copies instead of
|
|
391
|
+
// resuming a half-done journal against the now-empty target (abort loop).
|
|
392
|
+
clearExodusJournal(migrateResult.stagingDir);
|
|
393
|
+
const reason = `migration failed: ${migrateResult.error ?? 'unknown error'} — legacy DBs kept as source`;
|
|
394
|
+
log.error({ scope, error: migrateResult.error }, `exodus-on-open: ${reason}`);
|
|
395
|
+
return { outcome: 'aborted', reason };
|
|
396
|
+
}
|
|
397
|
+
// 2. PARITY GATE (AC2): verifyMigration (T11551) — row-count + content
|
|
398
|
+
// digest + FK integrity + enum-drift equivalence legacy↔consolidated.
|
|
399
|
+
const verifyResult = verifyMigration(plan.sources, plan.projectDbPath, plan.globalDbPath, (msg) => log.debug({ scope }, `exodus-on-open verify: ${msg}`));
|
|
400
|
+
// Surface diagnostics (hash mismatch / source enum-drift) but do NOT
|
|
401
|
+
// abort on them — see isDataContinuityOk(). A correct normalising
|
|
402
|
+
// migration legitimately produces both; only a row-count deficit or an
|
|
403
|
+
// FK orphan means actual data loss.
|
|
404
|
+
if (!verifyResult.ok) {
|
|
405
|
+
log.warn({
|
|
406
|
+
scope,
|
|
407
|
+
enumDrift: verifyResult.enumDrift.length,
|
|
408
|
+
hashMismatches: verifyResult.tables.filter((t) => !t.hashMatch).length,
|
|
409
|
+
}, 'exodus-on-open: verifyMigration reported non-fatal drift (normalisation expected); checking data-continuity gate');
|
|
410
|
+
}
|
|
411
|
+
if (!isDataContinuityOk(verifyResult)) {
|
|
412
|
+
// DATA LOSS (count deficit or FK orphan) → abort. Roll the half-migrated
|
|
413
|
+
// consolidated tables back to EMPTY in place so legacy remains the
|
|
414
|
+
// source of truth. Never expose a lossy consolidated DB; never close the
|
|
415
|
+
// caller's handle.
|
|
416
|
+
await rollbackBothScopes(scope);
|
|
417
|
+
// T11572: invalidate the journal so a retry re-copies (see above).
|
|
418
|
+
clearExodusJournal(plan.stagingDir);
|
|
419
|
+
// T11577: report only genuine DEFICITS (target < source) — a surplus
|
|
420
|
+
// is tolerated by isDataContinuityOk() and must not appear as a cause.
|
|
421
|
+
const deficits = verifyResult.tables
|
|
422
|
+
.filter((t) => t.targetCount < t.sourceCount)
|
|
423
|
+
.map((t) => `${t.targetTable}(${t.sourceCount}→${t.targetCount})`);
|
|
424
|
+
const reason = `parity verification failed — cutover aborted, legacy DBs kept as source. ` +
|
|
425
|
+
`count deficits: [${deficits.join(', ')}]; ` +
|
|
426
|
+
`INTRODUCED fk orphans: ${verifyResult.introducedForeignKeyViolations.length} ` +
|
|
427
|
+
`(pre-existing source orphans tolerated: ${verifyResult.preExistingForeignKeyViolations.length}). ` +
|
|
428
|
+
`${verifyResult.error ?? ''}`.trim();
|
|
429
|
+
log.error({
|
|
430
|
+
scope,
|
|
431
|
+
countDeficits: deficits,
|
|
432
|
+
introducedFkViolations: verifyResult.introducedForeignKeyViolations.length,
|
|
433
|
+
preExistingFkViolations: verifyResult.preExistingForeignKeyViolations.length,
|
|
434
|
+
}, 'exodus-on-open: data-continuity FAILED — consolidated cleo.db rolled back to empty, legacy kept');
|
|
435
|
+
return { outcome: 'aborted', reason };
|
|
436
|
+
}
|
|
437
|
+
const rowsCopied = migrateResult.tables
|
|
438
|
+
.filter((t) => !t.skipped)
|
|
439
|
+
.reduce((n, t) => n + t.rowsCopied, 0);
|
|
440
|
+
log.info({ scope, rowsCopied, tables: migrateResult.tables.length }, 'exodus-on-open: parity verified — legacy data migrated into consolidated cleo.db');
|
|
441
|
+
return {
|
|
442
|
+
outcome: 'migrated',
|
|
443
|
+
reason: `migrated ${rowsCopied} rows across ${migrateResult.tables.length} tables; parity verified`,
|
|
444
|
+
rowsCopied,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
finally {
|
|
448
|
+
_exodusInProgress = false;
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
// Tolerate a slow migration: a large fleet copy can take a while, so allow a
|
|
452
|
+
// generous stale window and a few retries while the winner holds the lock.
|
|
453
|
+
{ stale: 600_000, retries: 30 });
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Test-only accessor: whether an exodus migration is currently in flight. Used
|
|
457
|
+
* to assert the re-entrancy guard does not recurse.
|
|
458
|
+
*
|
|
459
|
+
* @internal
|
|
460
|
+
*/
|
|
461
|
+
export function _isExodusInProgress() {
|
|
462
|
+
return _exodusInProgress;
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=on-open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-open.js","sourceRoot":"","sources":["../../../src/store/exodus/on-open.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exodus pre-flight plan builder.
|
|
3
|
+
*
|
|
4
|
+
* `buildExodusPlan()` computes the full migration plan — source DB paths,
|
|
5
|
+
* combined size, free-disk availability, staging directory — BEFORE any
|
|
6
|
+
* writes occur. A `--dry-run` caller can print the plan and exit early.
|
|
7
|
+
*
|
|
8
|
+
* ## Disk pre-flight (AC8)
|
|
9
|
+
*
|
|
10
|
+
* `availableBytes >= 3 * totalSourceBytes` must hold before migration begins.
|
|
11
|
+
* The check uses `statvfs` via `node:fs.statfsSync()` (Node 18+).
|
|
12
|
+
*
|
|
13
|
+
* @task T11248 (E5 · SG-DB-SUBSTRATE-V2)
|
|
14
|
+
* @saga T11242
|
|
15
|
+
*/
|
|
16
|
+
import type { ExodusPlan, LegacyDbDescriptor } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Derive the staging directory name from the current ISO-8601 timestamp.
|
|
19
|
+
*
|
|
20
|
+
* Pattern: `.cleo/exodus-staging-<YYYYMMDDTHHMMSSZ>`.
|
|
21
|
+
* Colons are replaced with empty string (NTFS + shell-safe).
|
|
22
|
+
*/
|
|
23
|
+
export declare function deriveStagingDirName(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Build the complete exodus plan.
|
|
26
|
+
*
|
|
27
|
+
* This is a pure read operation — no files are created or modified.
|
|
28
|
+
* Pass the result to `runExodusMigrate()` to execute the migration.
|
|
29
|
+
*
|
|
30
|
+
* @param cwd - Working directory used to resolve the project root. Defaults to
|
|
31
|
+
* `process.cwd()`.
|
|
32
|
+
* @returns {@link ExodusPlan} describing sources, disk availability, and paths.
|
|
33
|
+
*
|
|
34
|
+
* @task T11248 (AC8 — 3× disk pre-flight)
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildExodusPlan(cwd?: string): ExodusPlan;
|
|
37
|
+
/**
|
|
38
|
+
* Check whether all required source DBs exist.
|
|
39
|
+
*
|
|
40
|
+
* Returns `true` if at least one source file is present (partial sets are
|
|
41
|
+
* acceptable — empty tables simply copy zero rows).
|
|
42
|
+
*/
|
|
43
|
+
export declare function sourcesPresent(sources: LegacyDbDescriptor[]): boolean;
|
|
44
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/store/exodus/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8EjE;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CA+BxD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAErE"}
|