@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,562 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capture: persistent pure-SQL triggers that record every change to a
|
|
3
|
+
* sync-set row into `_sync_capture`, in the writing statement (journal spec
|
|
4
|
+
* §2.3; S2, `sync.capture`; T12343 AC1 / R4).
|
|
5
|
+
*
|
|
6
|
+
* Per sync-set table the generator emits up to five AFTER triggers, all
|
|
7
|
+
* carrying the `capture` suspension clause (§3.5 Rule 4):
|
|
8
|
+
*
|
|
9
|
+
* | Trigger | Fires on | Records |
|
|
10
|
+
* |---|---|---|
|
|
11
|
+
* | `_sync_cap_<t>_i` | INSERT | full image; identity read from the LIVE row (N4) |
|
|
12
|
+
* | `_sync_cap_<t>_u` | UPDATE OF captured columns, when one changed | changed columns `[old, new]` |
|
|
13
|
+
* | `_sync_cap_<t>_d` | DELETE | full before-image |
|
|
14
|
+
* | `_sync_cap_<t>_k` | UPDATE OF uid / birth_fp of a keyed row | the re-key (H5) |
|
|
15
|
+
* | `_sync_cap_<t>_f` | UPDATE OF uid / birth_fp from NULL | patches the latest live I capture (N4, N11) |
|
|
16
|
+
*
|
|
17
|
+
* - Values are `enc()`-encoded before any JSON function sees them (`quote()`,
|
|
18
|
+
* and `'r' || printf('%!.17g')` for REAL: `-0.0` becomes `0.0`, ±Inf is
|
|
19
|
+
* `Inf` / `-Inf`, L4).
|
|
20
|
+
* - A reference column records `[enc(local key), target uid]`, the uid read at
|
|
21
|
+
* write time (H5). JSON-array references are translated at seal time.
|
|
22
|
+
* - A secret column records only the `<changed>` marker, never its value
|
|
23
|
+
* (§2.7); before-images never hold secret values. `strip` columns are
|
|
24
|
+
* captured whole and stripped at seal. Local-only columns (claim leases)
|
|
25
|
+
* and identity columns never fire an update capture.
|
|
26
|
+
* - Full images are chunked `json_patch(json_object(≤60 pairs), …)` (L3); the
|
|
27
|
+
* update image uses a `UNION ALL` of per-column terms (no argument limit).
|
|
28
|
+
* - Each trigger also writes `_sync_undo` for the same seq, but only while
|
|
29
|
+
* `_sync_meta.undo_enabled` exists (push on, §3.5 Rule 2); S2 runs with it
|
|
30
|
+
* off (shadow mode). Append-only tables keep only `rk` and `uid` there.
|
|
31
|
+
* An update's undo holds only the changed columns, old and new (D5
|
|
32
|
+
* amendment); a delete's holds the full row.
|
|
33
|
+
* - I and D images omit NULL columns: the sender's column set is pinned by
|
|
34
|
+
* its trigger set, so an absent column is NULL.
|
|
35
|
+
*
|
|
36
|
+
* The open pass installs the triggers only to match the persisted
|
|
37
|
+
* `sync.capture` flag ({@link syncCaptureOpenPass}); the kill switch
|
|
38
|
+
* `CLEO_SYNC_CAPTURE=0` never touches them (M3). `accessor.transaction()`
|
|
39
|
+
* opens a frame ({@link openCaptureFrame}); finishing it labels the frame's
|
|
40
|
+
* captures with the connection, frame and kind in one UPDATE
|
|
41
|
+
* ({@link finishCaptureFrame}).
|
|
42
|
+
*
|
|
43
|
+
* @task T12343
|
|
44
|
+
* @module store/sync/capture
|
|
45
|
+
*/
|
|
46
|
+
import { randomUUID } from 'node:crypto';
|
|
47
|
+
import { BIRTH_FP_COLUMN, ROW_IDENTITY, rowIdentityColumns, rowIdentitySpec, UID_COLUMN, } from '../row-identity-registry.js';
|
|
48
|
+
import { classifyTable, isPortableTableClass } from '../table-classification.js';
|
|
49
|
+
import { readSyncFlags, setSyncFlag } from './flags.js';
|
|
50
|
+
import { ensureSyncSchema, hasTable, healSyncSchema } from './schema.js';
|
|
51
|
+
import { canonicalizeStoreTimestamps } from './timestamps.js';
|
|
52
|
+
import { atomicDdl, CAPTURE_TRIGGER_PREFIX, normalizeSql, suspendClause, } from './trigger-classes.js';
|
|
53
|
+
import { raiseMinWriterVersion } from './writer-version.js';
|
|
54
|
+
/** Largest number of key/value pairs per `json_object` call (L3). */
|
|
55
|
+
export const JSON_OBJECT_CHUNK = 60;
|
|
56
|
+
/** The marker a secret column records instead of its value (§2.7). */
|
|
57
|
+
export const SECRET_MARKER = '<changed>';
|
|
58
|
+
const q = (id) => `"${id.replaceAll('"', '""')}"`;
|
|
59
|
+
const lit = (s) => `'${s.replaceAll("'", "''")}'`;
|
|
60
|
+
/** `enc(v)`: lossless text for any SQLite value (§2.3). */
|
|
61
|
+
export function enc(expr) {
|
|
62
|
+
return `CASE typeof(${expr}) WHEN 'real' THEN 'r' || printf('%!.17g', ${expr}) ELSE quote(${expr}) END`;
|
|
63
|
+
}
|
|
64
|
+
/** Wall milliseconds from SQLite's clock, valid on every shipped SQLite (§1.2). */
|
|
65
|
+
export const AT_MS_SQL = "CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)";
|
|
66
|
+
const CAPTURE_WHEN = suspendClause('capture');
|
|
67
|
+
const UNDO_ON = "EXISTS (SELECT 1 FROM _sync_meta WHERE key = 'undo_enabled')";
|
|
68
|
+
/** The sync set: portable, not frozen-legacy, declared in ROW_IDENTITY (§2.1). */
|
|
69
|
+
export function syncSetTables(scope) {
|
|
70
|
+
return ROW_IDENTITY[scope]
|
|
71
|
+
.map((spec) => spec.table)
|
|
72
|
+
.filter((t) => {
|
|
73
|
+
const c = classifyTable(scope, t);
|
|
74
|
+
return (c.kind === 'entry' && isPortableTableClass(c.class) && c.entry.status !== 'frozen-legacy');
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The capture definition of a sync-set table in this store, or `undefined`
|
|
79
|
+
* when the table is absent or not in the sync set.
|
|
80
|
+
*/
|
|
81
|
+
export function captureTableDef(db, scope, table) {
|
|
82
|
+
const spec = rowIdentitySpec(scope, table);
|
|
83
|
+
const cls = classifyTable(scope, table);
|
|
84
|
+
if (!spec || cls.kind !== 'entry' || !hasTable(db, table))
|
|
85
|
+
return undefined;
|
|
86
|
+
const info = db.prepare(`PRAGMA main.table_info(${q(table)})`).all();
|
|
87
|
+
const overrides = cls.entry.columns ?? [];
|
|
88
|
+
const localOnly = new Set(overrides.filter((o) => o.class === 'local-only').map((o) => o.column));
|
|
89
|
+
const wholeSecret = cls.class === 'portable-secret';
|
|
90
|
+
const secret = new Set(wholeSecret
|
|
91
|
+
? info.map((c) => c.name).filter((c) => !spec.key.includes(c))
|
|
92
|
+
: overrides.filter((o) => o.class === 'portable-secret').map((o) => o.column));
|
|
93
|
+
const identity = rowIdentityColumns(scope, table).filter((c) => info.some((i) => i.name === c));
|
|
94
|
+
const refs = new Map();
|
|
95
|
+
const allRefs = [
|
|
96
|
+
...(spec.refs ?? []),
|
|
97
|
+
...(spec.keyRefs ?? []),
|
|
98
|
+
...(spec.owners ?? []),
|
|
99
|
+
];
|
|
100
|
+
for (const r of allRefs) {
|
|
101
|
+
const target = rowIdentitySpec(scope, r.table);
|
|
102
|
+
refs.set(r.column, { table: r.table, key: target?.key[0] ?? 'id' });
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
table,
|
|
106
|
+
key: spec.key,
|
|
107
|
+
columns: info.map((c) => c.name).filter((c) => !localOnly.has(c)),
|
|
108
|
+
identity,
|
|
109
|
+
secret,
|
|
110
|
+
refs,
|
|
111
|
+
appendOnly: (spec.content?.length ?? 0) > 0,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* `enc(v)`, except that SQL NULL stays NULL (a JSON null in `json_object`,
|
|
116
|
+
* which the full-image merge patch then removes).
|
|
117
|
+
*/
|
|
118
|
+
function encOrNull(expr) {
|
|
119
|
+
return `CASE typeof(${expr}) WHEN 'null' THEN NULL WHEN 'real' THEN 'r' || printf('%!.17g', ${expr}) ELSE quote(${expr}) END`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* A column's value in an image, from row alias `row` (`NEW` or `OLD`). With
|
|
123
|
+
* `omitNull`, a NULL value is SQL NULL (the full images drop the key); else
|
|
124
|
+
* it is the text `NULL`.
|
|
125
|
+
*/
|
|
126
|
+
function valueExpr(def, col, row, liveIdentity, omitNull = false) {
|
|
127
|
+
const e = omitNull ? encOrNull : enc;
|
|
128
|
+
const nullText = omitNull ? 'NULL' : "'NULL'";
|
|
129
|
+
if (def.secret.has(col)) {
|
|
130
|
+
return `CASE WHEN ${row}.${q(col)} IS NULL THEN ${nullText} ELSE ${lit(SECRET_MARKER)} END`;
|
|
131
|
+
}
|
|
132
|
+
if (liveIdentity && def.identity.includes(col)) {
|
|
133
|
+
return `(SELECT ${e(`x.${q(col)}`)} FROM ${q(def.table)} x WHERE ${keyMatch(def, 'x', row)})`;
|
|
134
|
+
}
|
|
135
|
+
const ref = def.refs.get(col);
|
|
136
|
+
if (ref) {
|
|
137
|
+
const pair = `json_array(${enc(`${row}.${q(col)}`)}, (SELECT r.${q(UID_COLUMN)} FROM ${q(ref.table)} r WHERE r.${q(ref.key)} = ${row}.${q(col)}))`;
|
|
138
|
+
return omitNull ? `CASE WHEN ${row}.${q(col)} IS NULL THEN NULL ELSE ${pair} END` : pair;
|
|
139
|
+
}
|
|
140
|
+
return e(`${row}.${q(col)}`);
|
|
141
|
+
}
|
|
142
|
+
function keyMatch(def, alias, row) {
|
|
143
|
+
return def.key.map((k) => `${alias}.${q(k)} = ${row}.${q(k)}`).join(' AND ');
|
|
144
|
+
}
|
|
145
|
+
function rkExpr(def, row) {
|
|
146
|
+
return `json_array(${def.key.map((k) => enc(`${row}.${q(k)}`)).join(', ')})`;
|
|
147
|
+
}
|
|
148
|
+
/** `json_patch(json_object(≤60 pairs), …)` over `pairs` (L3). */
|
|
149
|
+
export function chunkedObject(pairs) {
|
|
150
|
+
if (pairs.length === 0)
|
|
151
|
+
return 'json_object()';
|
|
152
|
+
const chunks = [];
|
|
153
|
+
for (let i = 0; i < pairs.length; i += JSON_OBJECT_CHUNK) {
|
|
154
|
+
const part = pairs.slice(i, i + JSON_OBJECT_CHUNK);
|
|
155
|
+
chunks.push(`json_object(${part.map(([k, v]) => `${lit(k)}, ${v}`).join(', ')})`);
|
|
156
|
+
}
|
|
157
|
+
return chunks.reduce((acc, c) => `json_patch(${acc}, ${c})`);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The I and D image: every captured column that is not NULL (S2 ruling (a),
|
|
161
|
+
* cheaper images). A column absent from the image is NULL; the column set a
|
|
162
|
+
* sender had is pinned by its trigger set (replayPin), so absence is never
|
|
163
|
+
* "unknown column". The JSON merge patch drops the null members.
|
|
164
|
+
*/
|
|
165
|
+
function fullImage(def, row, liveIdentity) {
|
|
166
|
+
return `json_patch('{}', ${chunkedObject(def.columns.map((c) => [c, valueExpr(def, c, row, liveIdentity, true)]))})`;
|
|
167
|
+
}
|
|
168
|
+
/** The undo image: every captured column, secret ciphertext and strip included (Rule 2). */
|
|
169
|
+
function undoImage(def, row, liveIdentity) {
|
|
170
|
+
return chunkedObject(def.columns.map((c) => {
|
|
171
|
+
if (liveIdentity && def.identity.includes(c)) {
|
|
172
|
+
return [
|
|
173
|
+
c,
|
|
174
|
+
`(SELECT ${enc(`x.${q(c)}`)} FROM ${q(def.table)} x WHERE ${keyMatch(def, 'x', row)})`,
|
|
175
|
+
];
|
|
176
|
+
}
|
|
177
|
+
return [c, enc(`${row}.${q(c)}`)];
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
function hasUid(def) {
|
|
181
|
+
return def.identity.includes(UID_COLUMN);
|
|
182
|
+
}
|
|
183
|
+
function hasBirthFp(def) {
|
|
184
|
+
return def.identity.includes(BIRTH_FP_COLUMN);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* The undo image of an update (D5 amendment, S2 ruling (b)): exactly the
|
|
188
|
+
* changed columns, from `row`, secret ciphertext included (Rule 2). A D keeps
|
|
189
|
+
* the full row ({@link undoImage}).
|
|
190
|
+
*/
|
|
191
|
+
function changedUndoImage(updatable, row) {
|
|
192
|
+
const terms = updatable
|
|
193
|
+
.map((c) => `SELECT ${lit(c)} AS k, ${enc(`${row}.${q(c)}`)} AS v WHERE OLD.${q(c)} IS NOT NEW.${q(c)}`)
|
|
194
|
+
.join(' UNION ALL ');
|
|
195
|
+
return `(SELECT json_group_object(k, v) FROM (${terms}))`;
|
|
196
|
+
}
|
|
197
|
+
function undoInsert(def, op, row, uidExpr, before, after) {
|
|
198
|
+
const images = def.appendOnly ? 'NULL, NULL' : `${before}, ${after}`;
|
|
199
|
+
return (`INSERT INTO _sync_undo (seq, tbl, rk, uid, op, before_full, after_full) ` +
|
|
200
|
+
`SELECT last_insert_rowid(), ${lit(def.table)}, ${rkExpr(def, row)}, ${uidExpr}, '${op}', ${images} WHERE ${UNDO_ON};`);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate every capture trigger for one table. Pure: the same definition
|
|
204
|
+
* always yields the same text, so the open pass can compare live text.
|
|
205
|
+
*/
|
|
206
|
+
export function captureTriggers(def) {
|
|
207
|
+
const t = q(def.table);
|
|
208
|
+
const name = (s) => `${CAPTURE_TRIGGER_PREFIX}${def.table}_${s}`;
|
|
209
|
+
const refs = [
|
|
210
|
+
...new Set([def.table, ...[...def.refs.values()].map((r) => r.table)]),
|
|
211
|
+
'_sync_capture',
|
|
212
|
+
'_sync_undo',
|
|
213
|
+
'_sync_meta',
|
|
214
|
+
'cleo_trigger_suspend',
|
|
215
|
+
];
|
|
216
|
+
const liveUid = hasUid(def)
|
|
217
|
+
? `(SELECT x.${q(UID_COLUMN)} FROM ${t} x WHERE ${keyMatch(def, 'x', 'NEW')})`
|
|
218
|
+
: 'NULL';
|
|
219
|
+
const oldUid = hasUid(def) ? `OLD.${q(UID_COLUMN)}` : 'NULL';
|
|
220
|
+
const ins = (op, row, uid, img) => `INSERT INTO _sync_capture (tbl, op, rk, uid, img, at_ms) VALUES (${lit(def.table)}, '${op}', ${rkExpr(def, row)}, ${uid}, ${img}, ${AT_MS_SQL});`;
|
|
221
|
+
const out = [];
|
|
222
|
+
out.push({
|
|
223
|
+
name: name('i'),
|
|
224
|
+
table: def.table,
|
|
225
|
+
refs,
|
|
226
|
+
sql: `CREATE TRIGGER ${q(name('i'))} AFTER INSERT ON ${t} WHEN ${CAPTURE_WHEN} BEGIN ` +
|
|
227
|
+
`${ins('I', 'NEW', liveUid, fullImage(def, 'NEW', true))} ` +
|
|
228
|
+
`${undoInsert(def, 'I', 'NEW', liveUid, 'NULL', undoImage(def, 'NEW', true))} END`,
|
|
229
|
+
});
|
|
230
|
+
const updatable = def.columns.filter((c) => !def.identity.includes(c));
|
|
231
|
+
if (updatable.length > 0) {
|
|
232
|
+
const changed = updatable.map((c) => `OLD.${q(c)} IS NOT NEW.${q(c)}`).join(' OR ');
|
|
233
|
+
const terms = updatable
|
|
234
|
+
.map((c) => {
|
|
235
|
+
const v = def.secret.has(c)
|
|
236
|
+
? `json_array(${lit(SECRET_MARKER)}, ${lit(SECRET_MARKER)})`
|
|
237
|
+
: `json_array(${valueExpr(def, c, 'OLD', false)}, ${valueExpr(def, c, 'NEW', false)})`;
|
|
238
|
+
return `SELECT ${lit(c)} AS k, ${v} AS v WHERE OLD.${q(c)} IS NOT NEW.${q(c)}`;
|
|
239
|
+
})
|
|
240
|
+
.join(' UNION ALL ');
|
|
241
|
+
const img = `(SELECT json_group_object(k, json(v)) FROM (${terms}))`;
|
|
242
|
+
out.push({
|
|
243
|
+
name: name('u'),
|
|
244
|
+
table: def.table,
|
|
245
|
+
refs,
|
|
246
|
+
sql: `CREATE TRIGGER ${q(name('u'))} AFTER UPDATE OF ${updatable.map(q).join(', ')} ON ${t} ` +
|
|
247
|
+
`WHEN (${changed}) AND ${CAPTURE_WHEN} BEGIN ` +
|
|
248
|
+
`${ins('U', 'NEW', oldUid, img)} ` +
|
|
249
|
+
`${undoInsert(def, 'U', 'NEW', oldUid, changedUndoImage(updatable, 'OLD'), changedUndoImage(updatable, 'NEW'))} END`,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
out.push({
|
|
253
|
+
name: name('d'),
|
|
254
|
+
table: def.table,
|
|
255
|
+
refs,
|
|
256
|
+
sql: `CREATE TRIGGER ${q(name('d'))} AFTER DELETE ON ${t} WHEN ${CAPTURE_WHEN} BEGIN ` +
|
|
257
|
+
`${ins('D', 'OLD', oldUid, fullImage(def, 'OLD', false))} ` +
|
|
258
|
+
`${undoInsert(def, 'D', 'OLD', oldUid, undoImage(def, 'OLD', false), 'NULL')} END`,
|
|
259
|
+
});
|
|
260
|
+
if (hasUid(def)) {
|
|
261
|
+
const idCols = [UID_COLUMN, ...(hasBirthFp(def) ? [BIRTH_FP_COLUMN] : [])];
|
|
262
|
+
const kImg = chunkedObject(idCols.map((c) => [c, `json_array(${enc(`OLD.${q(c)}`)}, ${enc(`NEW.${q(c)}`)})`]));
|
|
263
|
+
const rekeyed = idCols.map((c) => `OLD.${q(c)} IS NOT NEW.${q(c)}`).join(' OR ');
|
|
264
|
+
out.push({
|
|
265
|
+
name: name('k'),
|
|
266
|
+
table: def.table,
|
|
267
|
+
refs,
|
|
268
|
+
sql: `CREATE TRIGGER ${q(name('k'))} AFTER UPDATE OF ${idCols.map(q).join(', ')} ON ${t} ` +
|
|
269
|
+
`WHEN OLD.${q(UID_COLUMN)} IS NOT NULL AND (${rekeyed}) AND ${CAPTURE_WHEN} BEGIN ` +
|
|
270
|
+
`${ins('K', 'NEW', 'OLD.' + q(UID_COLUMN), kImg)} ` +
|
|
271
|
+
`${undoInsert(def, 'K', 'NEW', 'OLD.' + q(UID_COLUMN), kImg, kImg)} END`,
|
|
272
|
+
});
|
|
273
|
+
const filled = idCols
|
|
274
|
+
.map((c) => `(OLD.${q(c)} IS NULL AND NEW.${q(c)} IS NOT NULL)`)
|
|
275
|
+
.join(' OR ');
|
|
276
|
+
const patch = idCols
|
|
277
|
+
.map((c) => `'$.${c}', CASE WHEN coalesce(json_extract(img, '$.${c}'), 'NULL') = 'NULL' THEN ${enc(`NEW.${q(c)}`)} ELSE json_extract(img, '$.${c}') END`)
|
|
278
|
+
.join(', ');
|
|
279
|
+
out.push({
|
|
280
|
+
name: name('f'),
|
|
281
|
+
table: def.table,
|
|
282
|
+
refs,
|
|
283
|
+
sql: `CREATE TRIGGER ${q(name('f'))} AFTER UPDATE OF ${idCols.map(q).join(', ')} ON ${t} ` +
|
|
284
|
+
`WHEN (${filled}) AND ${CAPTURE_WHEN} BEGIN ` +
|
|
285
|
+
`UPDATE _sync_capture SET uid = coalesce(uid, NEW.${q(UID_COLUMN)}), img = json_set(img, ${patch}) ` +
|
|
286
|
+
`WHERE seq = (SELECT max(seq) FROM _sync_capture WHERE tbl = ${lit(def.table)} AND rk = ${rkExpr(def, 'NEW')} AND op = 'I' AND state = 'live'); END`,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
return out;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Re-mint captures (T12806 × S2): a captured write that CLEARED a row's
|
|
293
|
+
* identity (a snapshot-overwrite import: K old → NULL) is followed by a fill
|
|
294
|
+
* that mints the new uid outside capture (the open-time fill runs with the
|
|
295
|
+
* capture triggers dropped). For every such row, write the K that journals
|
|
296
|
+
* the new identity (NULL → new uid, and birth_fp), so the pair nets to
|
|
297
|
+
* old → new. Call inside the fill's bracket, after the fill.
|
|
298
|
+
*
|
|
299
|
+
* A row qualifies when its latest live K capture set the uid to NULL and the
|
|
300
|
+
* row now has a uid. Undo is written only while `undo_enabled` (Rule 2).
|
|
301
|
+
*
|
|
302
|
+
* @returns K captures written, per table.
|
|
303
|
+
*/
|
|
304
|
+
export function captureRemints(db, scope) {
|
|
305
|
+
const out = {};
|
|
306
|
+
if (!hasTable(db, '_sync_capture'))
|
|
307
|
+
return out;
|
|
308
|
+
const undoOn = hasTable(db, '_sync_meta') &&
|
|
309
|
+
db.prepare(`SELECT ${UNDO_ON} AS v`).get().v === 1;
|
|
310
|
+
for (const table of syncSetTables(scope)) {
|
|
311
|
+
const def = captureTableDef(db, scope, table);
|
|
312
|
+
if (!def || !hasUid(def))
|
|
313
|
+
continue;
|
|
314
|
+
const idCols = [UID_COLUMN, ...(hasBirthFp(def) ? [BIRTH_FP_COLUMN] : [])];
|
|
315
|
+
const img = chunkedObject(idCols.map((c) => [c, `json_array('NULL', ${enc(`x.${q(c)}`)})`]));
|
|
316
|
+
const rows = db
|
|
317
|
+
.prepare(`SELECT c.rk AS rk, x.rowid AS rid FROM _sync_capture c JOIN ${q(table)} x ON ${rkExpr(def, 'x')} = c.rk ` +
|
|
318
|
+
`WHERE c.tbl = ${lit(table)} AND c.op = 'K' AND c.state = 'live' ` +
|
|
319
|
+
`AND c.seq = (SELECT max(m.seq) FROM _sync_capture m WHERE m.tbl = c.tbl AND m.rk = c.rk AND m.op = 'K' AND m.state = 'live') ` +
|
|
320
|
+
`AND json_extract(c.img, '$.${UID_COLUMN}[1]') = 'NULL' AND x.${q(UID_COLUMN)} IS NOT NULL`)
|
|
321
|
+
.all();
|
|
322
|
+
if (rows.length === 0)
|
|
323
|
+
continue;
|
|
324
|
+
const ins = db.prepare(`INSERT INTO _sync_capture (tbl, op, rk, uid, img, at_ms) SELECT ${lit(table)}, 'K', ?, NULL, ${img}, ${AT_MS_SQL} FROM ${q(table)} x WHERE x.rowid = ?`);
|
|
325
|
+
const undo = db.prepare(`INSERT INTO _sync_undo (seq, tbl, rk, uid, op, before_full, after_full) SELECT last_insert_rowid(), ${lit(table)}, ?, NULL, 'K', ${img}, ${img} FROM ${q(table)} x WHERE x.rowid = ?`);
|
|
326
|
+
for (const r of rows) {
|
|
327
|
+
ins.run(r.rk, r.rid);
|
|
328
|
+
if (undoOn)
|
|
329
|
+
undo.run(r.rk, r.rid);
|
|
330
|
+
}
|
|
331
|
+
out[table] = rows.length;
|
|
332
|
+
}
|
|
333
|
+
return out;
|
|
334
|
+
}
|
|
335
|
+
/** Every capture trigger for the store's sync set. */
|
|
336
|
+
export function generateCaptureTriggers(db, scope) {
|
|
337
|
+
const out = [];
|
|
338
|
+
for (const table of syncSetTables(scope)) {
|
|
339
|
+
const def = captureTableDef(db, scope, table);
|
|
340
|
+
if (def)
|
|
341
|
+
out.push(...captureTriggers(def));
|
|
342
|
+
}
|
|
343
|
+
return out;
|
|
344
|
+
}
|
|
345
|
+
/** SYNC_TRIGGER_REFS: trigger → every table its text references (N3). */
|
|
346
|
+
export function syncTriggerRefs(db, scope) {
|
|
347
|
+
return new Map(generateCaptureTriggers(db, scope).map((t) => [t.name, t.refs]));
|
|
348
|
+
}
|
|
349
|
+
function liveCaptureTriggers(db) {
|
|
350
|
+
return new Map(db
|
|
351
|
+
.prepare("SELECT name, sql FROM main.sqlite_master WHERE type = 'trigger' AND substr(name, 1, length(?)) = ?")
|
|
352
|
+
.all(CAPTURE_TRIGGER_PREFIX, CAPTURE_TRIGGER_PREFIX).map((r) => [r.name, r.sql]));
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Make the live capture triggers exactly the generated set: create the
|
|
356
|
+
* missing, replace the differing, drop the orphaned. Writes nothing when
|
|
357
|
+
* they already match. Requires the sync schema.
|
|
358
|
+
*/
|
|
359
|
+
export function installCaptureTriggers(db, scope) {
|
|
360
|
+
const want = generateCaptureTriggers(db, scope);
|
|
361
|
+
const live = liveCaptureTriggers(db);
|
|
362
|
+
const report = { installed: [], replaced: [], dropped: [] };
|
|
363
|
+
const wanted = new Set(want.map((t) => t.name));
|
|
364
|
+
for (const [name] of live)
|
|
365
|
+
if (!wanted.has(name))
|
|
366
|
+
report.dropped.push(name);
|
|
367
|
+
const changes = want.filter((t) => {
|
|
368
|
+
const have = live.get(t.name);
|
|
369
|
+
if (have !== undefined && normalizeSql(have) === normalizeSql(t.sql))
|
|
370
|
+
return false;
|
|
371
|
+
(have === undefined ? report.installed : report.replaced).push(t.name);
|
|
372
|
+
return true;
|
|
373
|
+
});
|
|
374
|
+
if (report.dropped.length + changes.length === 0)
|
|
375
|
+
return report;
|
|
376
|
+
// One unit (T13024 MED-2): a failed CREATE never leaves a dropped trigger committed.
|
|
377
|
+
atomicDdl(db, () => {
|
|
378
|
+
for (const name of report.dropped)
|
|
379
|
+
db.exec(`DROP TRIGGER IF EXISTS ${q(name)}`);
|
|
380
|
+
for (const t of changes) {
|
|
381
|
+
if (live.has(t.name))
|
|
382
|
+
db.exec(`DROP TRIGGER IF EXISTS ${q(t.name)}`);
|
|
383
|
+
db.exec(t.sql);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
return report;
|
|
387
|
+
}
|
|
388
|
+
/** Drop every capture trigger. Returns their names. */
|
|
389
|
+
export function dropCaptureTriggers(db) {
|
|
390
|
+
const names = [...liveCaptureTriggers(db).keys()];
|
|
391
|
+
for (const n of names)
|
|
392
|
+
db.exec(`DROP TRIGGER IF EXISTS ${q(n)}`);
|
|
393
|
+
return names;
|
|
394
|
+
}
|
|
395
|
+
// ── per-connection provenance stamp and frames ─────────────────────────────
|
|
396
|
+
const stamped = new WeakMap();
|
|
397
|
+
/**
|
|
398
|
+
* Install the provenance stamp on a chokepoint connection (§2.3). A
|
|
399
|
+
* persistent trigger cannot read a TEMP table, so the capture triggers write
|
|
400
|
+
* rows unlabelled; the labels (connection, frame, kind) are written ONCE per
|
|
401
|
+
* frame by {@link finishCaptureFrame}, over the frame's seq range. Writes are
|
|
402
|
+
* serialized by the write lock, so every capture from the frame's
|
|
403
|
+
* `first_seq` on belongs to it. This replaces a TEMP trigger that ran one
|
|
404
|
+
* UPDATE per capture (S2 insert-path ruling (a)). Also turns
|
|
405
|
+
* `recursive_triggers` on for this connection (M1; the REPLACE audit is
|
|
406
|
+
* T12787's zero-tolerance ban plus `recursive-triggers-audit.test.ts`).
|
|
407
|
+
*
|
|
408
|
+
* @returns This connection's id.
|
|
409
|
+
*/
|
|
410
|
+
export function installCaptureStamp(db) {
|
|
411
|
+
const existing = stamped.get(db);
|
|
412
|
+
if (existing)
|
|
413
|
+
return existing;
|
|
414
|
+
const conn = randomUUID();
|
|
415
|
+
db.exec('PRAGMA recursive_triggers = ON');
|
|
416
|
+
stamped.set(db, conn);
|
|
417
|
+
return conn;
|
|
418
|
+
}
|
|
419
|
+
/** Remove the stamp (capture turned off, or the sync tables dropped). */
|
|
420
|
+
export function removeCaptureStamp(db) {
|
|
421
|
+
stamped.delete(db);
|
|
422
|
+
frameStatements.delete(db);
|
|
423
|
+
}
|
|
424
|
+
/** Whether this connection carries the capture stamp. */
|
|
425
|
+
export function hasCaptureStamp(db) {
|
|
426
|
+
return stamped.has(db);
|
|
427
|
+
}
|
|
428
|
+
/** Frames whose undo is dropped at once (D1). */
|
|
429
|
+
const NO_UNDO_KINDS = new Set(['apply', 'rebase']);
|
|
430
|
+
const frameStatements = new WeakMap();
|
|
431
|
+
function statementsFor(db) {
|
|
432
|
+
let s = frameStatements.get(db);
|
|
433
|
+
if (!s) {
|
|
434
|
+
s = {
|
|
435
|
+
next: db.prepare('SELECT coalesce(max(seq), 0) + 1 AS n FROM main._sync_capture'),
|
|
436
|
+
open: db.prepare('INSERT INTO _sync_frame (frame, kind, actor, first_seq) VALUES (?, ?, ?, ?)'),
|
|
437
|
+
frameOf: db.prepare('SELECT kind, first_seq FROM _sync_frame WHERE frame = ?'),
|
|
438
|
+
labelCaptures: db.prepare('UPDATE _sync_capture SET conn = ?, frame = ?, kind = ? WHERE seq >= ? AND frame IS NULL'),
|
|
439
|
+
labelUndo: db.prepare('UPDATE _sync_undo SET txn_local = ?, kind = ? WHERE seq >= ? AND txn_local IS NULL'),
|
|
440
|
+
dropUndo: db.prepare('DELETE FROM _sync_undo WHERE seq >= ? AND txn_local IS NULL'),
|
|
441
|
+
dropEmpty: db.prepare('DELETE FROM _sync_frame WHERE frame = ? AND NOT EXISTS (SELECT 1 FROM main._sync_capture WHERE frame = ?)'),
|
|
442
|
+
};
|
|
443
|
+
frameStatements.set(db, s);
|
|
444
|
+
}
|
|
445
|
+
return s;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Open a frame for the caller's transaction, right after its
|
|
449
|
+
* `BEGIN IMMEDIATE`: insert the `_sync_frame` row with the first seq its
|
|
450
|
+
* captures can take. A connection without the stamp (capture off) gets
|
|
451
|
+
* `null` and nothing is written.
|
|
452
|
+
*/
|
|
453
|
+
export function openCaptureFrame(db, kind = 'write', actor = null) {
|
|
454
|
+
if (!stamped.has(db))
|
|
455
|
+
return null;
|
|
456
|
+
const st = statementsFor(db);
|
|
457
|
+
const frame = randomUUID();
|
|
458
|
+
const next = st.next.get().n;
|
|
459
|
+
st.open.run(frame, kind, actor, next);
|
|
460
|
+
return frame;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Before COMMIT: label the frame's captures and undo rows (one UPDATE each
|
|
464
|
+
* over its seq range), drop the undo of an `apply` / `rebase` frame (D1), and
|
|
465
|
+
* delete the frame's row when no capture carries it, so a read-only
|
|
466
|
+
* transaction leaves nothing (N10). A transaction that commits without this
|
|
467
|
+
* call leaves its captures unframed, never mislabelled.
|
|
468
|
+
*/
|
|
469
|
+
export function finishCaptureFrame(db, frame) {
|
|
470
|
+
if (!frame)
|
|
471
|
+
return;
|
|
472
|
+
const st = statementsFor(db);
|
|
473
|
+
const row = st.frameOf.get(frame);
|
|
474
|
+
if (row) {
|
|
475
|
+
st.labelCaptures.run(stamped.get(db) ?? null, frame, row.kind, row.first_seq);
|
|
476
|
+
if (NO_UNDO_KINDS.has(row.kind))
|
|
477
|
+
st.dropUndo.run(row.first_seq);
|
|
478
|
+
else
|
|
479
|
+
st.labelUndo.run(frame, row.kind, row.first_seq);
|
|
480
|
+
}
|
|
481
|
+
st.dropEmpty.run(frame, frame);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* In `finally`: nothing is left to clear (the labels are written by
|
|
485
|
+
* {@link finishCaptureFrame}); kept so callers need not change.
|
|
486
|
+
*/
|
|
487
|
+
export function clearCaptureFrame(_db, _frame) { }
|
|
488
|
+
// ── flag and open pass ─────────────────────────────────────────────────────
|
|
489
|
+
/**
|
|
490
|
+
* `cleo sync capture on|off` (the storage primitive): persist the flag and
|
|
491
|
+
* install or drop the triggers, in one transaction.
|
|
492
|
+
*/
|
|
493
|
+
export function setCaptureEnabled(db, scope, on, options = {}) {
|
|
494
|
+
if (on)
|
|
495
|
+
ensureSyncSchema(db, { root: options.schemaRoot });
|
|
496
|
+
db.exec('BEGIN IMMEDIATE');
|
|
497
|
+
try {
|
|
498
|
+
setSyncFlag(db, 'sync.capture', on, { schemaRoot: options.schemaRoot });
|
|
499
|
+
// Ruling (c): a store with capture on requires a framing writer.
|
|
500
|
+
if (on)
|
|
501
|
+
raiseMinWriterVersion(db);
|
|
502
|
+
// §1.8: the one-time timestamp rewrite runs before the triggers go in.
|
|
503
|
+
if (on)
|
|
504
|
+
canonicalizeStoreTimestamps(db, scope);
|
|
505
|
+
const report = on ? installCaptureTriggers(db, scope) : { dropped: dropCaptureTriggers(db) };
|
|
506
|
+
db.exec('COMMIT');
|
|
507
|
+
if (on)
|
|
508
|
+
installCaptureStamp(db);
|
|
509
|
+
else
|
|
510
|
+
removeCaptureStamp(db);
|
|
511
|
+
return report;
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
if (db.isTransaction)
|
|
515
|
+
db.exec('ROLLBACK');
|
|
516
|
+
throw err;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* The capture step of the open pass, after migrations: triggers match the
|
|
521
|
+
* persisted flag. With the flag off and no trigger present it only reads.
|
|
522
|
+
*/
|
|
523
|
+
export function syncCaptureOpenPass(db, scope, options = {}) {
|
|
524
|
+
const on = readSyncFlags(db)['sync.capture'];
|
|
525
|
+
if (!on) {
|
|
526
|
+
removeCaptureStamp(db);
|
|
527
|
+
const live = liveCaptureTriggers(db);
|
|
528
|
+
if (live.size === 0)
|
|
529
|
+
return { capture: 'off', dropped: [] };
|
|
530
|
+
return { capture: 'off', dropped: dropCaptureTriggers(db) };
|
|
531
|
+
}
|
|
532
|
+
ensureSyncSchema(db, { root: options.schemaRoot });
|
|
533
|
+
// §2.3a rule 9: a missing outbox table with triggers present breaks every
|
|
534
|
+
// captured write; re-create it before anything else writes.
|
|
535
|
+
healSyncSchema(db, ['_sync_capture', '_sync_frame', '_sync_undo', '_sync_meta'], {
|
|
536
|
+
root: options.schemaRoot,
|
|
537
|
+
});
|
|
538
|
+
// §1.8: a store whose capture went on before S3c gets its one-time
|
|
539
|
+
// timestamp rewrite here, with capture suspended, before the reinstall.
|
|
540
|
+
canonicalizeStoreTimestamps(db, scope);
|
|
541
|
+
const report = installCaptureTriggers(db, scope);
|
|
542
|
+
return { capture: 'on', report, conn: installCaptureStamp(db) };
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Migration-runner hooks (§2.3a rules 1 and 5): drop every capture trigger
|
|
546
|
+
* inside the bracket before a migration's statements, and regenerate them for
|
|
547
|
+
* the new schema before its COMMIT. Only when capture is on.
|
|
548
|
+
*/
|
|
549
|
+
export function captureBracketHooks(db, scope) {
|
|
550
|
+
if (!readSyncFlags(db)['sync.capture'])
|
|
551
|
+
return {};
|
|
552
|
+
return {
|
|
553
|
+
suspendCapture: (d) => {
|
|
554
|
+
dropCaptureTriggers(d);
|
|
555
|
+
},
|
|
556
|
+
reinstallCapture: (d) => {
|
|
557
|
+
if (hasTable(d, '_sync_capture'))
|
|
558
|
+
installCaptureTriggers(d, scope);
|
|
559
|
+
},
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/store/sync/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock-store.d.ts","sourceRoot":"","sources":["../../../src/store/sync/clock-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAGL,KAAK,GAAG,EAOT,MAAM,UAAU,CAAC;AAGlB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAG/E,CAAC;
|
|
1
|
+
{"version":3,"file":"clock-store.d.ts","sourceRoot":"","sources":["../../../src/store/sync/clock-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAGL,KAAK,GAAG,EAOT,MAAM,UAAU,CAAC;AAGlB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAG/E,CAAC;AAYF;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAKhE;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,GAAG,IAAI,CAMzD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKnF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAqB,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAOjD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAsB,GAC7E,GAAG,CAiBL;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAU5E"}
|
|
@@ -25,6 +25,7 @@ export const CLOCK_HEAL_SOURCES = [
|
|
|
25
25
|
const REPLICA_OFFSET = 21;
|
|
26
26
|
function assertInTransaction(db, what) {
|
|
27
27
|
if (!db.isTransaction) {
|
|
28
|
+
// @sync-invariant none:local-only a caller bug (clock bookkeeping outside its transaction); the clock is per-store state, not a synced row
|
|
28
29
|
throw new Error(`${what} must run inside the caller's BEGIN IMMEDIATE transaction`);
|
|
29
30
|
}
|
|
30
31
|
}
|
|
@@ -82,6 +83,7 @@ export function healClock(db, replica, sources = CLOCK_HEAL_SOURCES) {
|
|
|
82
83
|
let best = loadClock(db, replica);
|
|
83
84
|
for (const { table, column } of sources) {
|
|
84
85
|
if (!/^[a-z_][a-z0-9_]*$/.test(table) || !/^[a-z_][a-z0-9_]*$/.test(column)) {
|
|
86
|
+
// @sync-invariant none:local-only a heal source is a compiled-in identifier, not row data; the clock is per-store state
|
|
85
87
|
throw new Error(`invalid clock heal source ${table}.${column}`);
|
|
86
88
|
}
|
|
87
89
|
if (!hasTable(db, table))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock-store.js","sourceRoot":"","sources":["../../../src/store/sync/clock-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clock-store.js","sourceRoot":"","sources":["../../../src/store/sync/clock-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,SAAS,EACT,UAAU,EAEV,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,GACL,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAqD;IAClF,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;IACpC,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE;CAC3C,CAAC;AAEF,uEAAuE;AACvE,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,SAAS,mBAAmB,CAAC,EAAgB,EAAE,IAAY;IACzD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QACtB,2IAA2I;QAC3I,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,2DAA2D,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,OAAe;IACzD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,OAAO,CAE/E,CAAC;IACd,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,EAAgB,EAAE,CAAM;IACjD,mBAAmB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACtC,EAAE,CAAC,OAAO,CACR,mEAAmE;QACjE,gFAAgF,CACnF,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,EAAgB,EAAE,OAAe,EAAE,MAAc;IACzE,mBAAmB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAClD,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACrB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,EAAgB,EAChB,OAAe,EACf,MAAc,EACd,KAAa,EACb,aAAqB,YAAY;IAEjC,mBAAmB,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,EAAgB,EAChB,OAAe,EACf,UAA4D,kBAAkB;IAE9E,mBAAmB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5E,wHAAwH;YACxH,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,cAAc,MAAM,eAAe,KAAK,iBAAiB,MAAM,UAAU,CAAC;aAClF,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,OAAO,CAAqC,CAAC;QACxE,IAAI,GAAG,EAAE,CAAC;YAAE,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAI,EAAgB,EAAE,EAAW;IACvE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC;QACjB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,EAAE,CAAC,aAAa;YAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|