@cleocode/core 2026.10.1 → 2026.10.2
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/build-provenance.json +2 -2
- package/dist/cloud/journal.d.ts +9 -5
- package/dist/cloud/journal.d.ts.map +1 -1
- package/dist/cloud/journal.js +29 -8
- package/dist/cloud/journal.js.map +1 -1
- package/dist/cloud/manifest-check.d.ts +140 -4
- package/dist/cloud/manifest-check.d.ts.map +1 -1
- package/dist/cloud/manifest-check.js +309 -10
- package/dist/cloud/manifest-check.js.map +1 -1
- package/dist/cloud/nexus-attach.d.ts +25 -0
- package/dist/cloud/nexus-attach.d.ts.map +1 -1
- package/dist/cloud/nexus-attach.js +81 -6
- package/dist/cloud/nexus-attach.js.map +1 -1
- package/dist/cloud/nexus-cloud-activity.d.ts +37 -0
- package/dist/cloud/nexus-cloud-activity.d.ts.map +1 -0
- package/dist/cloud/nexus-cloud-activity.js +79 -0
- package/dist/cloud/nexus-cloud-activity.js.map +1 -0
- package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
- package/dist/cloud/nexus-cloud-status.js +36 -0
- package/dist/cloud/nexus-cloud-status.js.map +1 -1
- package/dist/cloud/nexus-device.d.ts +1 -1
- package/dist/cloud/nexus-enrol.d.ts.map +1 -1
- package/dist/cloud/nexus-enrol.js +5 -0
- package/dist/cloud/nexus-enrol.js.map +1 -1
- package/dist/cloud/nexus-home.d.ts +74 -0
- package/dist/cloud/nexus-home.d.ts.map +1 -0
- package/dist/cloud/nexus-home.js +97 -0
- package/dist/cloud/nexus-home.js.map +1 -0
- package/dist/cloud/nexus-vault-keys.d.ts +129 -0
- package/dist/cloud/nexus-vault-keys.d.ts.map +1 -0
- package/dist/cloud/nexus-vault-keys.js +277 -0
- package/dist/cloud/nexus-vault-keys.js.map +1 -0
- package/dist/cloud/nexus-vault-state.d.ts +121 -0
- package/dist/cloud/nexus-vault-state.d.ts.map +1 -0
- package/dist/cloud/nexus-vault-state.js +274 -0
- package/dist/cloud/nexus-vault-state.js.map +1 -0
- package/dist/cloud/nexus-vault.d.ts +160 -0
- package/dist/cloud/nexus-vault.d.ts.map +1 -0
- package/dist/cloud/nexus-vault.js +1733 -0
- package/dist/cloud/nexus-vault.js.map +1 -0
- package/dist/cloud/signing.d.ts +24 -8
- package/dist/cloud/signing.d.ts.map +1 -1
- package/dist/cloud/signing.js +61 -15
- package/dist/cloud/signing.js.map +1 -1
- package/dist/docs/export-document.js +8137 -3318
- package/dist/docs/export-document.js.map +3 -3
- package/dist/doctor/migrations.d.ts +75 -0
- package/dist/doctor/migrations.d.ts.map +1 -0
- package/dist/doctor/migrations.js +136 -0
- package/dist/doctor/migrations.js.map +1 -0
- package/dist/doctor/sync-sealer.d.ts +48 -0
- package/dist/doctor/sync-sealer.d.ts.map +1 -0
- package/dist/doctor/sync-sealer.js +109 -0
- package/dist/doctor/sync-sealer.js.map +1 -0
- package/dist/doctor/sync-triggers.d.ts +53 -0
- package/dist/doctor/sync-triggers.d.ts.map +1 -0
- package/dist/doctor/sync-triggers.js +157 -0
- package/dist/doctor/sync-triggers.js.map +1 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +5 -1
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/llm/plugin-facade.js +8442 -3623
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/nexus/projects-clean.d.ts +3 -0
- package/dist/nexus/projects-clean.d.ts.map +1 -1
- package/dist/nexus/projects-clean.js +9 -3
- package/dist/nexus/projects-clean.js.map +1 -1
- package/dist/nexus/registry-roots.d.ts +3 -1
- package/dist/nexus/registry-roots.d.ts.map +1 -1
- package/dist/nexus/registry-roots.js +5 -2
- package/dist/nexus/registry-roots.js.map +1 -1
- package/dist/nexus/registry.d.ts +8 -1
- package/dist/nexus/registry.d.ts.map +1 -1
- package/dist/nexus/registry.js +24 -10
- package/dist/nexus/registry.js.map +1 -1
- package/dist/nexus/workspace.d.ts +4 -1
- package/dist/nexus/workspace.d.ts.map +1 -1
- package/dist/nexus/workspace.js +10 -4
- package/dist/nexus/workspace.js.map +1 -1
- package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
- package/dist/orchestrate/spawn-ops.js +7 -2
- package/dist/orchestrate/spawn-ops.js.map +1 -1
- package/dist/orchestrate/worker-verify.d.ts +121 -12
- package/dist/orchestrate/worker-verify.d.ts.map +1 -1
- package/dist/orchestrate/worker-verify.js +172 -21
- package/dist/orchestrate/worker-verify.js.map +1 -1
- package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
- package/dist/orchestration/spawn-prompt.js +15 -9
- package/dist/orchestration/spawn-prompt.js.map +1 -1
- package/dist/release/ci-evidence.d.ts +9 -0
- package/dist/release/ci-evidence.d.ts.map +1 -1
- package/dist/release/ci-evidence.js +9 -2
- package/dist/release/ci-evidence.js.map +1 -1
- package/dist/resources/backend.d.ts +15 -3
- package/dist/resources/backend.d.ts.map +1 -1
- package/dist/resources/backend.js +7 -3
- package/dist/resources/backend.js.map +1 -1
- package/dist/resources/darwin-backend.d.ts +142 -0
- package/dist/resources/darwin-backend.d.ts.map +1 -0
- package/dist/resources/darwin-backend.js +288 -0
- package/dist/resources/darwin-backend.js.map +1 -0
- package/dist/resources/governor.d.ts +44 -1
- package/dist/resources/governor.d.ts.map +1 -1
- package/dist/resources/governor.js +100 -36
- package/dist/resources/governor.js.map +1 -1
- package/dist/resources/heavy-command.d.ts +132 -0
- package/dist/resources/heavy-command.d.ts.map +1 -0
- package/dist/resources/heavy-command.js +768 -0
- package/dist/resources/heavy-command.js.map +1 -0
- package/dist/resources/monitor.d.ts +50 -1
- package/dist/resources/monitor.d.ts.map +1 -1
- package/dist/resources/monitor.js +83 -1
- package/dist/resources/monitor.js.map +1 -1
- package/dist/resources/run-admission.d.ts +303 -0
- package/dist/resources/run-admission.d.ts.map +1 -0
- package/dist/resources/run-admission.js +648 -0
- package/dist/resources/run-admission.js.map +1 -0
- package/dist/resources/run-class.d.ts +111 -0
- package/dist/resources/run-class.d.ts.map +1 -0
- package/dist/resources/run-class.js +658 -0
- package/dist/resources/run-class.js.map +1 -0
- package/dist/resources/run-governed.d.ts +158 -0
- package/dist/resources/run-governed.d.ts.map +1 -0
- package/dist/resources/run-governed.js +406 -0
- package/dist/resources/run-governed.js.map +1 -0
- package/dist/resources/slot-holder.d.ts +267 -0
- package/dist/resources/slot-holder.d.ts.map +1 -0
- package/dist/resources/slot-holder.js +505 -0
- package/dist/resources/slot-holder.js.map +1 -0
- package/dist/resources/tool-groups.d.ts +74 -0
- package/dist/resources/tool-groups.d.ts.map +1 -0
- package/dist/resources/tool-groups.js +118 -0
- package/dist/resources/tool-groups.js.map +1 -0
- 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/selfimprove/fix-gen.js +8446 -3627
- package/dist/selfimprove/fix-gen.js.map +3 -3
- package/dist/sentient/cross-project-hygiene.d.ts +3 -2
- package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
- package/dist/sentient/cross-project-hygiene.js +5 -2
- package/dist/sentient/cross-project-hygiene.js.map +1 -1
- package/dist/sentient/state.d.ts +7 -0
- package/dist/sentient/state.d.ts.map +1 -1
- package/dist/sentient/state.js.map +1 -1
- package/dist/sentient/tick.d.ts +14 -2
- package/dist/sentient/tick.d.ts.map +1 -1
- package/dist/sentient/tick.js +63 -4
- package/dist/sentient/tick.js.map +1 -1
- package/dist/store/backup-recover.d.ts.map +1 -1
- package/dist/store/backup-recover.js +5 -0
- package/dist/store/backup-recover.js.map +1 -1
- package/dist/store/data-accessor.d.ts +1 -0
- package/dist/store/data-accessor.d.ts.map +1 -1
- package/dist/store/data-accessor.js +7 -0
- package/dist/store/data-accessor.js.map +1 -1
- package/dist/store/dual-scope-db.d.ts +23 -1
- package/dist/store/dual-scope-db.d.ts.map +1 -1
- package/dist/store/dual-scope-db.js +126 -36
- package/dist/store/dual-scope-db.js.map +1 -1
- package/dist/store/exodus/recovery.d.ts.map +1 -1
- package/dist/store/exodus/recovery.js +15 -0
- package/dist/store/exodus/recovery.js.map +1 -1
- package/dist/store/legacy-tasks-lineage.d.ts.map +1 -1
- package/dist/store/legacy-tasks-lineage.js +5 -0
- package/dist/store/legacy-tasks-lineage.js.map +1 -1
- package/dist/store/lock.d.ts +8 -1
- package/dist/store/lock.d.ts.map +1 -1
- package/dist/store/lock.js +10 -2
- package/dist/store/lock.js.map +1 -1
- package/dist/store/migration-manager.d.ts +5 -0
- package/dist/store/migration-manager.d.ts.map +1 -1
- package/dist/store/migration-manager.js +11 -0
- package/dist/store/migration-manager.js.map +1 -1
- package/dist/store/migration-runner.d.ts +158 -0
- package/dist/store/migration-runner.d.ts.map +1 -0
- package/dist/store/migration-runner.js +493 -0
- package/dist/store/migration-runner.js.map +1 -0
- package/dist/store/portable-bundle-import.d.ts +15 -1
- package/dist/store/portable-bundle-import.d.ts.map +1 -1
- package/dist/store/portable-bundle-import.js +24 -4
- package/dist/store/portable-bundle-import.js.map +1 -1
- package/dist/store/portable-bundle-relocate.d.ts +43 -0
- package/dist/store/portable-bundle-relocate.d.ts.map +1 -1
- package/dist/store/portable-bundle-relocate.js +79 -5
- package/dist/store/portable-bundle-relocate.js.map +1 -1
- package/dist/store/portable-bundle-scan.d.ts +20 -0
- package/dist/store/portable-bundle-scan.d.ts.map +1 -1
- package/dist/store/portable-bundle-scan.js +38 -3
- package/dist/store/portable-bundle-scan.js.map +1 -1
- package/dist/store/portable-bundle.d.ts +33 -0
- package/dist/store/portable-bundle.d.ts.map +1 -1
- package/dist/store/portable-bundle.js +34 -7
- package/dist/store/portable-bundle.js.map +1 -1
- package/dist/store/row-identity-registry.d.ts +137 -7
- package/dist/store/row-identity-registry.d.ts.map +1 -1
- package/dist/store/row-identity-registry.js +364 -9
- package/dist/store/row-identity-registry.js.map +1 -1
- package/dist/store/row-identity.d.ts.map +1 -1
- package/dist/store/row-identity.js +9 -10
- package/dist/store/row-identity.js.map +1 -1
- package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
- package/dist/store/sqlite-data-accessor.js +10 -0
- package/dist/store/sqlite-data-accessor.js.map +1 -1
- package/dist/store/sqlite.d.ts +31 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +5 -1
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/sync/capture.d.ts +203 -0
- package/dist/store/sync/capture.d.ts.map +1 -0
- package/dist/store/sync/capture.js +562 -0
- package/dist/store/sync/capture.js.map +1 -0
- package/dist/store/sync/clock-store.d.ts.map +1 -1
- package/dist/store/sync/clock-store.js +2 -0
- package/dist/store/sync/clock-store.js.map +1 -1
- package/dist/store/sync/fk-orphans.d.ts +133 -0
- package/dist/store/sync/fk-orphans.d.ts.map +1 -0
- package/dist/store/sync/fk-orphans.js +265 -0
- package/dist/store/sync/fk-orphans.js.map +1 -0
- package/dist/store/sync/flags.d.ts +7 -0
- package/dist/store/sync/flags.d.ts.map +1 -1
- package/dist/store/sync/flags.js +16 -0
- package/dist/store/sync/flags.js.map +1 -1
- package/dist/store/sync/hlc.d.ts.map +1 -1
- package/dist/store/sync/hlc.js +4 -0
- package/dist/store/sync/hlc.js.map +1 -1
- package/dist/store/sync/identity-fill.d.ts +45 -0
- package/dist/store/sync/identity-fill.d.ts.map +1 -0
- package/dist/store/sync/identity-fill.js +85 -0
- package/dist/store/sync/identity-fill.js.map +1 -0
- package/dist/store/sync/machinery.d.ts +27 -0
- package/dist/store/sync/machinery.d.ts.map +1 -0
- package/dist/store/sync/machinery.js +44 -0
- package/dist/store/sync/machinery.js.map +1 -0
- package/dist/store/sync/netting.d.ts +120 -0
- package/dist/store/sync/netting.d.ts.map +1 -0
- package/dist/store/sync/netting.js +336 -0
- package/dist/store/sync/netting.js.map +1 -0
- package/dist/store/sync/replica.d.ts +27 -2
- package/dist/store/sync/replica.d.ts.map +1 -1
- package/dist/store/sync/replica.js +47 -3
- package/dist/store/sync/replica.js.map +1 -1
- package/dist/store/sync/schema.d.ts +12 -0
- package/dist/store/sync/schema.d.ts.map +1 -1
- package/dist/store/sync/schema.js +21 -0
- package/dist/store/sync/schema.js.map +1 -1
- package/dist/store/sync/seal-backlog.d.ts +21 -0
- package/dist/store/sync/seal-backlog.d.ts.map +1 -0
- package/dist/store/sync/seal-backlog.js +24 -0
- package/dist/store/sync/seal-backlog.js.map +1 -0
- package/dist/store/sync/sealer-values.d.ts +34 -0
- package/dist/store/sync/sealer-values.d.ts.map +1 -0
- package/dist/store/sync/sealer-values.js +53 -0
- package/dist/store/sync/sealer-values.js.map +1 -0
- package/dist/store/sync/sealer.d.ts +145 -0
- package/dist/store/sync/sealer.d.ts.map +1 -0
- package/dist/store/sync/sealer.js +906 -0
- package/dist/store/sync/sealer.js.map +1 -0
- package/dist/store/sync/structural.d.ts +63 -0
- package/dist/store/sync/structural.d.ts.map +1 -0
- package/dist/store/sync/structural.js +180 -0
- package/dist/store/sync/structural.js.map +1 -0
- package/dist/store/sync/timestamps.d.ts +92 -0
- package/dist/store/sync/timestamps.d.ts.map +1 -0
- package/dist/store/sync/timestamps.js +228 -0
- package/dist/store/sync/timestamps.js.map +1 -0
- package/dist/store/sync/tombstones.d.ts +75 -0
- package/dist/store/sync/tombstones.d.ts.map +1 -0
- package/dist/store/sync/tombstones.js +103 -0
- package/dist/store/sync/tombstones.js.map +1 -0
- package/dist/store/sync/trigger-classes.d.ts +221 -0
- package/dist/store/sync/trigger-classes.d.ts.map +1 -0
- package/dist/store/sync/trigger-classes.js +441 -0
- package/dist/store/sync/trigger-classes.js.map +1 -0
- package/dist/store/sync/trigger-suspend-at-path.d.ts +23 -0
- package/dist/store/sync/trigger-suspend-at-path.d.ts.map +1 -0
- package/dist/store/sync/trigger-suspend-at-path.js +44 -0
- package/dist/store/sync/trigger-suspend-at-path.js.map +1 -0
- package/dist/store/sync/writer-version.d.ts +43 -0
- package/dist/store/sync/writer-version.d.ts.map +1 -0
- package/dist/store/sync/writer-version.js +90 -0
- package/dist/store/sync/writer-version.js.map +1 -0
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +102 -0
- package/dist/store/table-classification.js.map +1 -1
- package/dist/store/trigger-suspend-schema.d.ts +44 -0
- package/dist/store/trigger-suspend-schema.d.ts.map +1 -0
- package/dist/store/trigger-suspend-schema.js +25 -0
- package/dist/store/trigger-suspend-schema.js.map +1 -0
- package/dist/store/vault-manifest.d.ts +365 -0
- package/dist/store/vault-manifest.d.ts.map +1 -0
- package/dist/store/vault-manifest.js +812 -0
- package/dist/store/vault-manifest.js.map +1 -0
- package/dist/store/writer-lease.d.ts +31 -0
- package/dist/store/writer-lease.d.ts.map +1 -1
- package/dist/store/writer-lease.js +65 -2
- package/dist/store/writer-lease.js.map +1 -1
- package/dist/system/health.d.ts.map +1 -1
- package/dist/system/health.js +21 -0
- package/dist/system/health.js.map +1 -1
- package/dist/system/project-health.d.ts.map +1 -1
- package/dist/system/project-health.js +3 -1
- package/dist/system/project-health.js.map +1 -1
- package/dist/tasks/affected-packages.d.ts +58 -0
- package/dist/tasks/affected-packages.d.ts.map +1 -1
- package/dist/tasks/affected-packages.js +75 -6
- package/dist/tasks/affected-packages.js.map +1 -1
- package/dist/tasks/affected-scope.d.ts +150 -23
- package/dist/tasks/affected-scope.d.ts.map +1 -1
- package/dist/tasks/affected-scope.js +320 -32
- package/dist/tasks/affected-scope.js.map +1 -1
- package/dist/tasks/change-set.d.ts +96 -0
- package/dist/tasks/change-set.d.ts.map +1 -1
- package/dist/tasks/change-set.js +169 -4
- package/dist/tasks/change-set.js.map +1 -1
- package/dist/tasks/complete-ci.d.ts +115 -0
- package/dist/tasks/complete-ci.d.ts.map +1 -0
- package/dist/tasks/complete-ci.js +171 -0
- package/dist/tasks/complete-ci.js.map +1 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +50 -17
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/compute-task-view.d.ts.map +1 -1
- package/dist/tasks/compute-task-view.js +7 -0
- package/dist/tasks/compute-task-view.js.map +1 -1
- package/dist/tasks/done-plan.d.ts.map +1 -1
- package/dist/tasks/done-plan.js +51 -30
- package/dist/tasks/done-plan.js.map +1 -1
- package/dist/tasks/done-record.d.ts +6 -0
- package/dist/tasks/done-record.d.ts.map +1 -1
- package/dist/tasks/done-record.js +9 -3
- package/dist/tasks/done-record.js.map +1 -1
- package/dist/tasks/evidence.d.ts +3 -2
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +143 -12
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/gate-notes.d.ts +22 -0
- package/dist/tasks/gate-notes.d.ts.map +1 -0
- package/dist/tasks/gate-notes.js +33 -0
- package/dist/tasks/gate-notes.js.map +1 -0
- package/dist/tasks/index.d.ts +2 -1
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +2 -1
- package/dist/tasks/index.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +117 -0
- package/dist/tasks/test-run-binding.d.ts.map +1 -0
- package/dist/tasks/test-run-binding.js +365 -0
- package/dist/tasks/test-run-binding.js.map +1 -0
- package/dist/tasks/tool-cache-env.d.ts +123 -0
- package/dist/tasks/tool-cache-env.d.ts.map +1 -0
- package/dist/tasks/tool-cache-env.js +287 -0
- package/dist/tasks/tool-cache-env.js.map +1 -0
- package/dist/tasks/tool-cache-failed-first.d.ts +155 -0
- package/dist/tasks/tool-cache-failed-first.d.ts.map +1 -0
- package/dist/tasks/tool-cache-failed-first.js +285 -0
- package/dist/tasks/tool-cache-failed-first.js.map +1 -0
- package/dist/tasks/tool-cache.d.ts +375 -55
- package/dist/tasks/tool-cache.d.ts.map +1 -1
- package/dist/tasks/tool-cache.js +912 -303
- package/dist/tasks/tool-cache.js.map +1 -1
- package/dist/tasks/tool-resolver.d.ts +4 -3
- package/dist/tasks/tool-resolver.d.ts.map +1 -1
- package/dist/tasks/tool-resolver.js +15 -4
- package/dist/tasks/tool-resolver.js.map +1 -1
- package/dist/tasks/tool-semaphore.d.ts +67 -7
- package/dist/tasks/tool-semaphore.d.ts.map +1 -1
- package/dist/tasks/tool-semaphore.js +134 -56
- package/dist/tasks/tool-semaphore.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +4 -0
- package/dist/upgrade.js.map +1 -1
- package/dist/validation/engine-ops.d.ts +6 -0
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +8 -0
- package/dist/validation/engine-ops.js.map +1 -1
- package/migrations/drizzle-cleo-project/20260930170000_t12819-trigger-suspend-clause/migration.sql +367 -0
- package/migrations/sync-journal/20260930120000_t12343-capture/migration.sql +47 -0
- package/migrations/sync-journal/20261001170000_t12984-sealer/migration.sql +101 -0
- package/package.json +13 -13
- package/templates/CLEO-INJECTION.md +5 -5
- package/templates/CLEO-REFERENCE.md +8 -4
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bounded `fk_orphans` repair (journal spec §3.5 Rule 4 (a)(3), §2.3a
|
|
3
|
+
* rule 2; C3 T12821, D3 T12826; T12986, S3c).
|
|
4
|
+
*
|
|
5
|
+
* An orphan is a sync-set row whose foreign key names a parent row this store
|
|
6
|
+
* does not have. The repair never deletes user data (C3), and it first asks
|
|
7
|
+
* whether the orphan is only LOCAL damage, by looking the missing parent up
|
|
8
|
+
* in the merged stream state (D3):
|
|
9
|
+
*
|
|
10
|
+
* - **live elsewhere**: the parent is restored locally (checkpoint bundle or
|
|
11
|
+
* its latest ops), with capture suspended, so nothing is emitted: every
|
|
12
|
+
* other replica already agrees. No conflict.
|
|
13
|
+
* - **tombstoned**: a `delete-with-live-children` conflict naming the
|
|
14
|
+
* children; nothing changes.
|
|
15
|
+
* - **unknown** (never seen): re-parent to the deterministic sentinel where
|
|
16
|
+
* the column defines one, else NULL where the column is nullable, else
|
|
17
|
+
* report. A conflict record is written in every case. The writes are an
|
|
18
|
+
* ordinary `repair` frame: captured, sealed, sent, so every replica
|
|
19
|
+
* converges.
|
|
20
|
+
*
|
|
21
|
+
* Before `row_identity_synced` exists there is no merged state: the repair is
|
|
22
|
+
* report-only and writes nothing (D3(d)).
|
|
23
|
+
*
|
|
24
|
+
* The merged-state lookup, the restore and the conflict store belong to S4/S5
|
|
25
|
+
* and T12344, so they are injected ({@link FkOrphanRepairSeams}).
|
|
26
|
+
*
|
|
27
|
+
* The sentinel (D3(a)(b)): the parent-type matrix has no single task type
|
|
28
|
+
* that may parent every other (saga→epic, epic→task|subtask, task→subtask),
|
|
29
|
+
* so the sentinel is a root-level `epic` and parents orphaned tasks and
|
|
30
|
+
* subtasks; an orphaned epic, saga or other type becomes a root (NULL), which
|
|
31
|
+
* the matrix allows. Its uid is the natural uid over
|
|
32
|
+
* `(project, tasks_tasks, 'fk-orphan-sentinel')`, its display id and every
|
|
33
|
+
* column are constants, so replicas that create it independently write the
|
|
34
|
+
* same row.
|
|
35
|
+
*
|
|
36
|
+
* @module store/sync/fk-orphans
|
|
37
|
+
* @task T12986
|
|
38
|
+
* @epic T12323
|
|
39
|
+
*/
|
|
40
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
41
|
+
import type { TableScope } from '@cleocode/contracts';
|
|
42
|
+
/** A local key value (SQLite TEXT or INTEGER). */
|
|
43
|
+
export type KeyValue = string | number;
|
|
44
|
+
/** One orphaned row: a foreign key naming a parent this store lacks. */
|
|
45
|
+
export interface FkOrphan {
|
|
46
|
+
/** The child table. */
|
|
47
|
+
readonly table: string;
|
|
48
|
+
readonly rowid: number | null;
|
|
49
|
+
/** The child's uid, when its table has one. */
|
|
50
|
+
readonly uid: string | null;
|
|
51
|
+
/** The child's foreign-key column. */
|
|
52
|
+
readonly column: string;
|
|
53
|
+
readonly parentTable: string;
|
|
54
|
+
readonly parentColumn: string;
|
|
55
|
+
/** The missing parent's local key. */
|
|
56
|
+
readonly parentKey: KeyValue;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Every single-column foreign-key violation in the store, read-only: the
|
|
60
|
+
* doctor's `fk_orphans` finding. Composite keys and WITHOUT ROWID children
|
|
61
|
+
* are listed with `rowid: null` where SQLite gives none.
|
|
62
|
+
*/
|
|
63
|
+
export declare function findFkOrphans(db: DatabaseSync): FkOrphan[];
|
|
64
|
+
/** Display id of the tasks sentinel (matches `T\d{3,}`; allocation never reaches 0). */
|
|
65
|
+
export declare const FK_ORPHAN_SENTINEL_ID = "T000";
|
|
66
|
+
/** The tasks sentinel's uid: the natural uid over (project, tasks_tasks, 'fk-orphan-sentinel'). */
|
|
67
|
+
export declare const FK_ORPHAN_SENTINEL_UID: string;
|
|
68
|
+
/** The missing parent in the merged stream state. */
|
|
69
|
+
export type ParentState = {
|
|
70
|
+
readonly state: 'live';
|
|
71
|
+
readonly uid: string;
|
|
72
|
+
} | {
|
|
73
|
+
readonly state: 'tombstoned';
|
|
74
|
+
readonly uid: string;
|
|
75
|
+
} | {
|
|
76
|
+
readonly state: 'unknown';
|
|
77
|
+
};
|
|
78
|
+
/** A conflict record for the owner (T12344's store backs it). */
|
|
79
|
+
export interface FkOrphanConflict {
|
|
80
|
+
readonly kind: 'fk-orphan' | 'delete-with-live-children';
|
|
81
|
+
readonly parent: {
|
|
82
|
+
readonly table: string;
|
|
83
|
+
readonly column: string;
|
|
84
|
+
readonly key: KeyValue;
|
|
85
|
+
readonly uid: string | null;
|
|
86
|
+
};
|
|
87
|
+
readonly children: ReadonlyArray<{
|
|
88
|
+
readonly table: string;
|
|
89
|
+
readonly column: string;
|
|
90
|
+
readonly uid: string | null;
|
|
91
|
+
}>;
|
|
92
|
+
/** What the repair did: re-parented to the sentinel, NULLed, reported, or nothing. */
|
|
93
|
+
readonly resolution: 'sentinel' | 'null' | 'report' | 'none';
|
|
94
|
+
}
|
|
95
|
+
/** The stream-side services the repair needs (S4/S5, T12344). */
|
|
96
|
+
export interface FkOrphanRepairSeams {
|
|
97
|
+
/** The parent in the merged state: row meta, tombstones, folds, latest verified checkpoint. */
|
|
98
|
+
readonly parentState: (table: string, column: string, key: KeyValue) => ParentState;
|
|
99
|
+
/**
|
|
100
|
+
* Restore a parent that is live elsewhere, from the checkpoint bundle or a
|
|
101
|
+
* pull of its latest ops. Called inside a transaction with capture
|
|
102
|
+
* suspended, so the restore emits nothing.
|
|
103
|
+
*/
|
|
104
|
+
readonly restoreParent: (db: DatabaseSync, table: string, uid: string) => void;
|
|
105
|
+
/**
|
|
106
|
+
* Persist a conflict record. For a repair that writes (sentinel, NULL),
|
|
107
|
+
* it is called inside the repair's transaction, before the commit: a throw
|
|
108
|
+
* rolls the repair back, so no repair lands without its record (D3,
|
|
109
|
+
* T13044). It must not open its own transaction.
|
|
110
|
+
*/
|
|
111
|
+
readonly recordConflict: (conflict: FkOrphanConflict) => void;
|
|
112
|
+
}
|
|
113
|
+
/** What happened to one orphan. */
|
|
114
|
+
export type FkOrphanOutcome = 'restored' | 'conflict' | 'sentinel' | 'nulled' | 'reported';
|
|
115
|
+
/** What {@link repairFkOrphans} did. */
|
|
116
|
+
export interface FkOrphanRepairReport {
|
|
117
|
+
/** `report-only` before `row_identity_synced` exists (nothing written). */
|
|
118
|
+
readonly mode: 'report-only' | 'repair';
|
|
119
|
+
readonly orphans: ReadonlyArray<FkOrphan & {
|
|
120
|
+
readonly outcome: FkOrphanOutcome;
|
|
121
|
+
}>;
|
|
122
|
+
readonly sentinelCreated: boolean;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Repair up to `budget` sync-set orphans (C3, D3). Never deletes a row.
|
|
126
|
+
*
|
|
127
|
+
* Orphans of tables outside the sync set, or whose parent is outside it, are
|
|
128
|
+
* reported only: no stream state describes them.
|
|
129
|
+
*/
|
|
130
|
+
export declare function repairFkOrphans(db: DatabaseSync, scope: TableScope, seams: FkOrphanRepairSeams, opts?: {
|
|
131
|
+
readonly budget?: number;
|
|
132
|
+
}): FkOrphanRepairReport;
|
|
133
|
+
//# sourceMappingURL=fk-orphans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fk-orphans.d.ts","sourceRoot":"","sources":["../../../src/store/sync/fk-orphans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bounded `fk_orphans` repair (journal spec §3.5 Rule 4 (a)(3), §2.3a
|
|
3
|
+
* rule 2; C3 T12821, D3 T12826; T12986, S3c).
|
|
4
|
+
*
|
|
5
|
+
* An orphan is a sync-set row whose foreign key names a parent row this store
|
|
6
|
+
* does not have. The repair never deletes user data (C3), and it first asks
|
|
7
|
+
* whether the orphan is only LOCAL damage, by looking the missing parent up
|
|
8
|
+
* in the merged stream state (D3):
|
|
9
|
+
*
|
|
10
|
+
* - **live elsewhere**: the parent is restored locally (checkpoint bundle or
|
|
11
|
+
* its latest ops), with capture suspended, so nothing is emitted: every
|
|
12
|
+
* other replica already agrees. No conflict.
|
|
13
|
+
* - **tombstoned**: a `delete-with-live-children` conflict naming the
|
|
14
|
+
* children; nothing changes.
|
|
15
|
+
* - **unknown** (never seen): re-parent to the deterministic sentinel where
|
|
16
|
+
* the column defines one, else NULL where the column is nullable, else
|
|
17
|
+
* report. A conflict record is written in every case. The writes are an
|
|
18
|
+
* ordinary `repair` frame: captured, sealed, sent, so every replica
|
|
19
|
+
* converges.
|
|
20
|
+
*
|
|
21
|
+
* Before `row_identity_synced` exists there is no merged state: the repair is
|
|
22
|
+
* report-only and writes nothing (D3(d)).
|
|
23
|
+
*
|
|
24
|
+
* The merged-state lookup, the restore and the conflict store belong to S4/S5
|
|
25
|
+
* and T12344, so they are injected ({@link FkOrphanRepairSeams}).
|
|
26
|
+
*
|
|
27
|
+
* The sentinel (D3(a)(b)): the parent-type matrix has no single task type
|
|
28
|
+
* that may parent every other (saga→epic, epic→task|subtask, task→subtask),
|
|
29
|
+
* so the sentinel is a root-level `epic` and parents orphaned tasks and
|
|
30
|
+
* subtasks; an orphaned epic, saga or other type becomes a root (NULL), which
|
|
31
|
+
* the matrix allows. Its uid is the natural uid over
|
|
32
|
+
* `(project, tasks_tasks, 'fk-orphan-sentinel')`, its display id and every
|
|
33
|
+
* column are constants, so replicas that create it independently write the
|
|
34
|
+
* same row.
|
|
35
|
+
*
|
|
36
|
+
* @module store/sync/fk-orphans
|
|
37
|
+
* @task T12986
|
|
38
|
+
* @epic T12323
|
|
39
|
+
*/
|
|
40
|
+
import { naturalRowUid, ROW_IDENTITY_META_TABLE, ROW_IDENTITY_SYNCED_KEY, } from '../row-identity.js';
|
|
41
|
+
import { finishCaptureFrame, openCaptureFrame, syncSetTables } from './capture.js';
|
|
42
|
+
import { withImmediateTransaction } from './clock-store.js';
|
|
43
|
+
import { hasTable } from './schema.js';
|
|
44
|
+
import { withTriggersSuspended } from './trigger-classes.js';
|
|
45
|
+
const q = (id) => `"${id.replaceAll('"', '""')}"`;
|
|
46
|
+
/**
|
|
47
|
+
* Every single-column foreign-key violation in the store, read-only: the
|
|
48
|
+
* doctor's `fk_orphans` finding. Composite keys and WITHOUT ROWID children
|
|
49
|
+
* are listed with `rowid: null` where SQLite gives none.
|
|
50
|
+
*/
|
|
51
|
+
export function findFkOrphans(db) {
|
|
52
|
+
const rows = db.prepare('PRAGMA main.foreign_key_check').all();
|
|
53
|
+
const out = [];
|
|
54
|
+
const fks = new Map();
|
|
55
|
+
for (const r of rows) {
|
|
56
|
+
let list = fks.get(r.table);
|
|
57
|
+
if (!list) {
|
|
58
|
+
list = db.prepare(`PRAGMA main.foreign_key_list(${q(r.table)})`).all();
|
|
59
|
+
fks.set(r.table, list);
|
|
60
|
+
}
|
|
61
|
+
const cols = list.filter((f) => f.id === r.fkid);
|
|
62
|
+
if (cols.length !== 1 || r.rowid === null)
|
|
63
|
+
continue; // composite or no rowid: report via doctor only
|
|
64
|
+
const fk = cols[0];
|
|
65
|
+
const parentColumn = fk.to ?? primaryKey(db, fk.table);
|
|
66
|
+
if (parentColumn === null)
|
|
67
|
+
continue;
|
|
68
|
+
const child = db
|
|
69
|
+
.prepare(`SELECT ${q(fk.from)} AS k${hasColumn(db, r.table, 'uid') ? ', uid' : ''} FROM ${q(r.table)} WHERE rowid = ?`)
|
|
70
|
+
.get(r.rowid);
|
|
71
|
+
if (!child || child.k === null)
|
|
72
|
+
continue;
|
|
73
|
+
out.push({
|
|
74
|
+
table: r.table,
|
|
75
|
+
rowid: r.rowid,
|
|
76
|
+
uid: child.uid ?? null,
|
|
77
|
+
column: fk.from,
|
|
78
|
+
parentTable: fk.table,
|
|
79
|
+
parentColumn,
|
|
80
|
+
parentKey: child.k,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
function primaryKey(db, table) {
|
|
86
|
+
const pk = db.prepare(`PRAGMA main.table_info(${q(table)})`).all().filter((c) => c.pk > 0);
|
|
87
|
+
return pk.length === 1 ? pk[0].name : null;
|
|
88
|
+
}
|
|
89
|
+
function hasColumn(db, table, column) {
|
|
90
|
+
return db.prepare(`PRAGMA main.table_info(${q(table)})`).all().some((c) => c.name === column);
|
|
91
|
+
}
|
|
92
|
+
function nullable(db, table, column) {
|
|
93
|
+
const c = db.prepare(`PRAGMA main.table_info(${q(table)})`).all().find((x) => x.name === column);
|
|
94
|
+
return c !== undefined && c.notnull === 0;
|
|
95
|
+
}
|
|
96
|
+
/** Display id of the tasks sentinel (matches `T\d{3,}`; allocation never reaches 0). */
|
|
97
|
+
export const FK_ORPHAN_SENTINEL_ID = 'T000';
|
|
98
|
+
/** The tasks sentinel's uid: the natural uid over (project, tasks_tasks, 'fk-orphan-sentinel'). */
|
|
99
|
+
export const FK_ORPHAN_SENTINEL_UID = naturalRowUid('project', 'tasks_tasks', [
|
|
100
|
+
'fk-orphan-sentinel',
|
|
101
|
+
]);
|
|
102
|
+
const SENTINEL = {
|
|
103
|
+
project: {
|
|
104
|
+
table: 'tasks_tasks',
|
|
105
|
+
children: {
|
|
106
|
+
// The matrix lets an epic parent tasks and subtasks only.
|
|
107
|
+
'tasks_tasks.parent_id': (db, rowid) => {
|
|
108
|
+
const row = db.prepare('SELECT type FROM tasks_tasks WHERE rowid = ?').get(rowid);
|
|
109
|
+
return row?.type === 'task' || row?.type === 'subtask';
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
global: null,
|
|
114
|
+
};
|
|
115
|
+
/** Constant column values of the sentinel row: every replica writes the same row. */
|
|
116
|
+
const SENTINEL_ROW = {
|
|
117
|
+
id: FK_ORPHAN_SENTINEL_ID,
|
|
118
|
+
title: 'Orphaned work (fk_orphans repair)',
|
|
119
|
+
description: 'Created by the fk_orphans repair: tasks and subtasks whose parent was never seen on any replica were moved here. Re-parent them and delete this epic when it is empty.',
|
|
120
|
+
type: 'epic',
|
|
121
|
+
status: 'pending',
|
|
122
|
+
priority: 'low',
|
|
123
|
+
uid: FK_ORPHAN_SENTINEL_UID,
|
|
124
|
+
birth_fp: FK_ORPHAN_SENTINEL_UID,
|
|
125
|
+
created_at: '1970-01-01T00:00:00.000Z',
|
|
126
|
+
updated_at: '1970-01-01T00:00:00.000Z',
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Create the sentinel when absent, inside the caller's transaction and
|
|
130
|
+
* capture frame (an ordinary op). Returns false when a different row holds
|
|
131
|
+
* its display id, so the caller falls back to NULL or report.
|
|
132
|
+
*/
|
|
133
|
+
function ensureSentinel(db, policy) {
|
|
134
|
+
const t = policy.table;
|
|
135
|
+
const held = db.prepare(`SELECT uid FROM ${q(t)} WHERE id = ?`).get(FK_ORPHAN_SENTINEL_ID);
|
|
136
|
+
if (held)
|
|
137
|
+
return held.uid === FK_ORPHAN_SENTINEL_UID;
|
|
138
|
+
const cols = Object.keys(SENTINEL_ROW).filter((c) => hasColumn(db, t, c));
|
|
139
|
+
db.prepare(`INSERT INTO ${q(t)} (${cols.map(q).join(', ')}) VALUES (${cols.map(() => '?').join(', ')})`).run(...cols.map((c) => SENTINEL_ROW[c]));
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
function synced(db) {
|
|
143
|
+
if (!hasTable(db, ROW_IDENTITY_META_TABLE))
|
|
144
|
+
return false;
|
|
145
|
+
return (db
|
|
146
|
+
.prepare(`SELECT 1 FROM ${q(ROW_IDENTITY_META_TABLE)} WHERE key = ?`)
|
|
147
|
+
.get(ROW_IDENTITY_SYNCED_KEY) !== undefined);
|
|
148
|
+
}
|
|
149
|
+
function parentExists(db, o) {
|
|
150
|
+
return (db
|
|
151
|
+
.prepare(`SELECT 1 FROM ${q(o.parentTable)} WHERE ${q(o.parentColumn)} = ?`)
|
|
152
|
+
.get(o.parentKey) !== undefined);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Repair up to `budget` sync-set orphans (C3, D3). Never deletes a row.
|
|
156
|
+
*
|
|
157
|
+
* Orphans of tables outside the sync set, or whose parent is outside it, are
|
|
158
|
+
* reported only: no stream state describes them.
|
|
159
|
+
*/
|
|
160
|
+
export function repairFkOrphans(db, scope, seams, opts = {}) {
|
|
161
|
+
const budget = Math.max(1, opts.budget ?? 100);
|
|
162
|
+
const all = findFkOrphans(db).slice(0, budget);
|
|
163
|
+
if (!synced(db)) {
|
|
164
|
+
return {
|
|
165
|
+
mode: 'report-only',
|
|
166
|
+
orphans: all.map((o) => ({ ...o, outcome: 'reported' })),
|
|
167
|
+
sentinelCreated: false,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const syncSet = new Set(syncSetTables(scope));
|
|
171
|
+
const policy = SENTINEL[scope];
|
|
172
|
+
const out = [];
|
|
173
|
+
let sentinelCreated = false;
|
|
174
|
+
// One lookup per missing parent.
|
|
175
|
+
const groups = new Map();
|
|
176
|
+
for (const o of all) {
|
|
177
|
+
if (!syncSet.has(o.table) || !syncSet.has(o.parentTable)) {
|
|
178
|
+
out.push({ ...o, outcome: 'reported' });
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const k = JSON.stringify([o.parentTable, o.parentColumn, o.parentKey]);
|
|
182
|
+
const g = groups.get(k);
|
|
183
|
+
if (g)
|
|
184
|
+
g.push(o);
|
|
185
|
+
else
|
|
186
|
+
groups.set(k, [o]);
|
|
187
|
+
}
|
|
188
|
+
for (const children of groups.values()) {
|
|
189
|
+
const first = children[0];
|
|
190
|
+
const parent = seams.parentState(first.parentTable, first.parentColumn, first.parentKey);
|
|
191
|
+
const conflictOf = (kind, resolution, kids) => ({
|
|
192
|
+
kind,
|
|
193
|
+
parent: {
|
|
194
|
+
table: first.parentTable,
|
|
195
|
+
column: first.parentColumn,
|
|
196
|
+
key: first.parentKey,
|
|
197
|
+
uid: parent.state === 'unknown' ? null : parent.uid,
|
|
198
|
+
},
|
|
199
|
+
children: kids.map((c) => ({ table: c.table, column: c.column, uid: c.uid })),
|
|
200
|
+
resolution,
|
|
201
|
+
});
|
|
202
|
+
if (parent.state === 'live') {
|
|
203
|
+
// Local damage: every other replica has the parent. Restore, emit nothing.
|
|
204
|
+
withImmediateTransaction(db, () => withTriggersSuspended(db, ['capture'], 'forward', () => seams.restoreParent(db, first.parentTable, parent.uid)));
|
|
205
|
+
if (parentExists(db, first)) {
|
|
206
|
+
for (const c of children)
|
|
207
|
+
out.push({ ...c, outcome: 'restored' });
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
seams.recordConflict(conflictOf('fk-orphan', 'report', children));
|
|
211
|
+
for (const c of children)
|
|
212
|
+
out.push({ ...c, outcome: 'reported' });
|
|
213
|
+
}
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (parent.state === 'tombstoned') {
|
|
217
|
+
seams.recordConflict(conflictOf('delete-with-live-children', 'none', children));
|
|
218
|
+
for (const c of children)
|
|
219
|
+
out.push({ ...c, outcome: 'conflict' });
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// Never seen anywhere: sentinel, else NULL, else report; always a conflict.
|
|
223
|
+
const done = [];
|
|
224
|
+
withImmediateTransaction(db, () => {
|
|
225
|
+
const frame = openCaptureFrame(db, 'repair', 'fk_orphans');
|
|
226
|
+
for (const c of children) {
|
|
227
|
+
const may = policy?.children[`${c.table}.${c.column}`];
|
|
228
|
+
if (policy &&
|
|
229
|
+
c.parentTable === policy.table &&
|
|
230
|
+
c.rowid !== null &&
|
|
231
|
+
may?.(db, c.rowid) === true) {
|
|
232
|
+
const existed = db
|
|
233
|
+
.prepare(`SELECT 1 FROM ${q(policy.table)} WHERE id = ?`)
|
|
234
|
+
.get(FK_ORPHAN_SENTINEL_ID) !== undefined;
|
|
235
|
+
if (ensureSentinel(db, policy)) {
|
|
236
|
+
if (!existed)
|
|
237
|
+
sentinelCreated = true;
|
|
238
|
+
db.prepare(`UPDATE ${q(c.table)} SET ${q(c.column)} = ? WHERE rowid = ?`).run(FK_ORPHAN_SENTINEL_ID, c.rowid);
|
|
239
|
+
done.push({ ...c, outcome: 'sentinel' });
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (c.rowid !== null && nullable(db, c.table, c.column)) {
|
|
244
|
+
db.prepare(`UPDATE ${q(c.table)} SET ${q(c.column)} = NULL WHERE rowid = ?`).run(c.rowid);
|
|
245
|
+
done.push({ ...c, outcome: 'nulled' });
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
done.push({ ...c, outcome: 'reported' });
|
|
249
|
+
}
|
|
250
|
+
// D3: every case writes its conflict record, in the same transaction as
|
|
251
|
+
// the repair, so a failed record (or a crash) never leaves a repair
|
|
252
|
+
// without one (T13044).
|
|
253
|
+
for (const resolution of ['sentinel', 'null', 'report']) {
|
|
254
|
+
const outcome = resolution === 'null' ? 'nulled' : resolution === 'report' ? 'reported' : 'sentinel';
|
|
255
|
+
const kids = done.filter((d) => d.outcome === outcome);
|
|
256
|
+
if (kids.length > 0)
|
|
257
|
+
seams.recordConflict(conflictOf('fk-orphan', resolution, kids));
|
|
258
|
+
}
|
|
259
|
+
finishCaptureFrame(db, frame);
|
|
260
|
+
});
|
|
261
|
+
out.push(...done);
|
|
262
|
+
}
|
|
263
|
+
return { mode: 'repair', orphans: out, sentinelCreated };
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=fk-orphans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fk-orphans.js","sourceRoot":"","sources":["../../../src/store/sync/fk-orphans.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,12 @@ export declare const SYNC_FLAGS: readonly ["sync.capture", "sync.seal", "sync.pu
|
|
|
19
19
|
export type SyncFlag = (typeof SYNC_FLAGS)[number];
|
|
20
20
|
/** Every flag's persisted state. */
|
|
21
21
|
export type SyncFlagState = Readonly<Record<SyncFlag, boolean>>;
|
|
22
|
+
/**
|
|
23
|
+
* Flags whose slices are not finished: turning one on is refused unless a
|
|
24
|
+
* test opts in (`allowUnreleased`). `sync.seal` stays here until S3b–S3d land
|
|
25
|
+
* (T13032); remove a flag when its slice ships.
|
|
26
|
+
*/
|
|
27
|
+
export declare const UNRELEASED_FLAGS: ReadonlySet<SyncFlag>;
|
|
22
28
|
/** The environment kill switch for a flag: `sync.push` → `CLEO_SYNC_PUSH`. */
|
|
23
29
|
export declare function killSwitchVar(flag: SyncFlag): string;
|
|
24
30
|
/**
|
|
@@ -47,5 +53,6 @@ export declare function isSyncFlagOn(db: DatabaseSync, flag: SyncFlag, env?: Nod
|
|
|
47
53
|
export declare function setSyncFlag(db: DatabaseSync, flag: SyncFlag, on: boolean, options?: {
|
|
48
54
|
now?: Date;
|
|
49
55
|
schemaRoot?: string;
|
|
56
|
+
allowUnreleased?: boolean;
|
|
50
57
|
}): boolean;
|
|
51
58
|
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../../src/store/sync/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,2CAA2C;AAC3C,eAAO,MAAM,UAAU,iFAMb,CAAC;AAEX,wBAAwB;AACxB,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAMhE,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,aAAa,CAU7D;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,QAAQ,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAGT;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,OAAO,EACX,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../../src/store/sync/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,2CAA2C;AAC3C,eAAO,MAAM,UAAU,iFAMb,CAAC;AAEX,wBAAwB;AACxB,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAMhE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,QAAQ,CAKjD,CAAC;AAEH,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,aAAa,CAU7D;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,QAAQ,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAGT;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,QAAQ,EACd,EAAE,EAAE,OAAO,EACX,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3E,OAAO,CAqBT"}
|
package/dist/store/sync/flags.js
CHANGED
|
@@ -22,6 +22,17 @@ export const SYNC_FLAGS = [
|
|
|
22
22
|
'sync.strict',
|
|
23
23
|
];
|
|
24
24
|
const ALL_OFF = Object.freeze(Object.fromEntries(SYNC_FLAGS.map((f) => [f, false])));
|
|
25
|
+
/**
|
|
26
|
+
* Flags whose slices are not finished: turning one on is refused unless a
|
|
27
|
+
* test opts in (`allowUnreleased`). `sync.seal` stays here until S3b–S3d land
|
|
28
|
+
* (T13032); remove a flag when its slice ships.
|
|
29
|
+
*/
|
|
30
|
+
export const UNRELEASED_FLAGS = new Set([
|
|
31
|
+
'sync.seal',
|
|
32
|
+
'sync.push',
|
|
33
|
+
'sync.pull',
|
|
34
|
+
'sync.strict',
|
|
35
|
+
]);
|
|
25
36
|
/** The environment kill switch for a flag: `sync.push` → `CLEO_SYNC_PUSH`. */
|
|
26
37
|
export function killSwitchVar(flag) {
|
|
27
38
|
return `CLEO_SYNC_${flag.slice('sync.'.length).toUpperCase()}`;
|
|
@@ -66,8 +77,13 @@ export function isSyncFlagOn(db, flag, env = process.env) {
|
|
|
66
77
|
* @returns Whether the stored value changed.
|
|
67
78
|
*/
|
|
68
79
|
export function setSyncFlag(db, flag, on, options = {}) {
|
|
80
|
+
// @sync-invariant none:local-only unknown flag name from a local caller; sync flags are per-store settings, not synced rows
|
|
69
81
|
if (!SYNC_FLAGS.includes(flag))
|
|
70
82
|
throw new Error(`unknown sync flag: ${flag}`);
|
|
83
|
+
if (on && UNRELEASED_FLAGS.has(flag) && options.allowUnreleased !== true) {
|
|
84
|
+
// @sync-invariant none:local-only a local operator cannot turn on an unfinished journal slice; a per-store setting, not synced rows
|
|
85
|
+
throw Object.assign(new Error(`E_SYNC_FLAG_UNRELEASED: ${flag} cannot be enabled until its slices land (T12343: S3b–S3d for sync.seal)`), { code: 'E_SYNC_FLAG_UNRELEASED' });
|
|
86
|
+
}
|
|
71
87
|
if (!on && !hasTable(db, '_sync_meta'))
|
|
72
88
|
return false;
|
|
73
89
|
if (readSyncFlags(db)[flag] === on)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../../src/store/sync/flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,cAAc;IACd,WAAW;IACX,WAAW;IACX,WAAW;IACX,aAAa;CACL,CAAC;AAQX,MAAM,OAAO,GAAkB,MAAM,CAAC,MAAM,CAC1C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAA8B,CACnF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,OAAO,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAgB;IAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,mDAAmD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC3F;SACA,GAAG,CAAC,GAAG,UAAU,CAA4C,CAAC;IACjE,MAAM,GAAG,GAA8B,EAAE,GAAG,OAAO,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,EAAgB;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,EAAgB,EAChB,IAAc,EACd,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,EAAgB,EAChB,IAAc,EACd,EAAW,EACX,
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../../src/store/sync/flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hlc.d.ts","sourceRoot":"","sources":["../../../src/store/sync/hlc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qBAAqB;AACrB,MAAM,WAAW,GAAG;IAClB,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,sDAAsD;AACtD,eAAO,MAAM,WAAW,SAAU,CAAC;AAEnC,yEAAyE;AACzE,eAAO,MAAM,QAAQ,gBAAoB,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAgB,CAAC;AAK1C,+DAA+D;AAC/D,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAI5B;
|
|
1
|
+
{"version":3,"file":"hlc.d.ts","sourceRoot":"","sources":["../../../src/store/sync/hlc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qBAAqB;AACrB,MAAM,WAAW,GAAG;IAClB,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,sDAAsD;AACtD,eAAO,MAAM,WAAW,SAAU,CAAC;AAEnC,yEAAyE;AACzE,eAAO,MAAM,QAAQ,gBAAoB,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAgB,CAAC;AAK1C,+DAA+D;AAC/D,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAI5B;AAiBD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAGxC;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAOvC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAKjD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAG/C;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAMnD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CASlE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,SAAe,GAAG,OAAO,CAE3F;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,CAE1C"}
|
package/dist/store/sync/hlc.js
CHANGED
|
@@ -38,12 +38,15 @@ export class HlcError extends Error {
|
|
|
38
38
|
}
|
|
39
39
|
function assertParts(phys, ctr, replica) {
|
|
40
40
|
if (!Number.isSafeInteger(phys) || phys < 0 || phys > MAX_PHYS) {
|
|
41
|
+
// @sync-invariant none:input-shape an HLC is a fixed-format value; a malformed one is refused wherever it arrives
|
|
41
42
|
throw new HlcError(`HLC physical time out of range: ${phys}`);
|
|
42
43
|
}
|
|
43
44
|
if (!Number.isSafeInteger(ctr) || ctr < 0 || ctr > MAX_COUNTER) {
|
|
45
|
+
// @sync-invariant none:input-shape an HLC is a fixed-format value; a malformed one is refused wherever it arrives
|
|
44
46
|
throw new HlcError(`HLC counter out of range: ${ctr}`);
|
|
45
47
|
}
|
|
46
48
|
if (!REPLICA_RE.test(replica)) {
|
|
49
|
+
// @sync-invariant none:input-shape an HLC is a fixed-format value; a malformed one is refused wherever it arrives
|
|
47
50
|
throw new HlcError(`HLC replica id is not a lowercase UUID: ${replica}`);
|
|
48
51
|
}
|
|
49
52
|
}
|
|
@@ -67,6 +70,7 @@ export function encodeHlc(h) {
|
|
|
67
70
|
*/
|
|
68
71
|
export function parseHlc(s) {
|
|
69
72
|
const m = HLC_RE.exec(s);
|
|
73
|
+
// @sync-invariant none:input-shape an HLC is a fixed-format value; a malformed one is refused wherever it arrives
|
|
70
74
|
if (!m)
|
|
71
75
|
throw new HlcError(`not an encoded HLC: ${s}`);
|
|
72
76
|
const h = { phys: Number(m[1]), ctr: Number(m[2]), replica: m[3] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hlc.js","sourceRoot":"","sources":["../../../src/store/sync/hlc.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hlc.js","sourceRoot":"","sources":["../../../src/store/sync/hlc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The open-time row-identity fill under capture (journal spec §2.3a rule 1;
|
|
3
|
+
* the S2 capture interactions of T12806 and T12801).
|
|
4
|
+
*
|
|
5
|
+
* The fill, the refill of pre-release fingerprints and the graveyard re-link
|
|
6
|
+
* are DERIVED rewrites: every value they write is a deterministic function of
|
|
7
|
+
* the store (spec §12.1), and a refill runs only before any uid has synced.
|
|
8
|
+
* Capturing them would journal one K and one F per filled row under shadow
|
|
9
|
+
* capture. So on a store with the sync schema they run inside
|
|
10
|
+
* {@link withSyncTriggersSuspended}, and the tables they wrote are marked
|
|
11
|
+
* suspect, for the sealer's repair diff (S3).
|
|
12
|
+
*
|
|
13
|
+
* One exception is journaled: a row whose identity a CAPTURED write cleared
|
|
14
|
+
* (a snapshot-overwrite import, K old → NULL) gets the K that records its
|
|
15
|
+
* new uid ({@link captureRemints}), in a `remint` frame, so the pair nets to
|
|
16
|
+
* old → new instead of leaving the new identity unjournaled.
|
|
17
|
+
*
|
|
18
|
+
* @task T12343
|
|
19
|
+
* @module store/sync/identity-fill
|
|
20
|
+
*/
|
|
21
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
22
|
+
import type { TableScope } from '@cleocode/contracts';
|
|
23
|
+
import { prepareRowIdentity, type RowUidFillReport } from '../row-identity.js';
|
|
24
|
+
/** What the open-time fill did under capture. */
|
|
25
|
+
export interface IdentityFillUnderCapture {
|
|
26
|
+
readonly report: RowUidFillReport | null;
|
|
27
|
+
/** Tables marked suspect (the fill wrote them uncaptured). */
|
|
28
|
+
readonly suspect: string[];
|
|
29
|
+
/** Re-mint K captures written, per table. */
|
|
30
|
+
readonly remints: Record<string, number>;
|
|
31
|
+
}
|
|
32
|
+
/** The tables a fill report says were written. */
|
|
33
|
+
export declare function filledTables(scope: TableScope, report: RowUidFillReport): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Run the open-time identity fill ({@link prepareRowIdentity}). With
|
|
36
|
+
* `sync.capture` on: with the capture triggers dropped, the written tables
|
|
37
|
+
* marked suspect, and re-mint K captures for identities a captured write
|
|
38
|
+
* cleared. With it off: exactly {@link prepareRowIdentity}, even when the
|
|
39
|
+
* sync tables exist (`cleo project link` creates them, T13025).
|
|
40
|
+
*
|
|
41
|
+
* Never throws, like {@link prepareRowIdentity}: a failed bracket (busy,
|
|
42
|
+
* a broken sync schema) is logged and reported as no fill.
|
|
43
|
+
*/
|
|
44
|
+
export declare function prepareRowIdentityUnderCapture(db: DatabaseSync, scope: TableScope, options?: Parameters<typeof prepareRowIdentity>[2]): IdentityFillUnderCapture;
|
|
45
|
+
//# sourceMappingURL=identity-fill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-fill.d.ts","sourceRoot":"","sources":["../../../src/store/sync/identity-fill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAgB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAW7F,iDAAiD;AACjD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAelF;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAM,GACrD,wBAAwB,CAc1B"}
|