@cleocode/core 2026.10.8 → 2026.10.9

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.
Files changed (266) hide show
  1. package/dist/build-provenance.json +2 -2
  2. package/dist/cloud/auto-sync-command-entry.d.ts +13 -0
  3. package/dist/cloud/auto-sync-command-entry.d.ts.map +1 -0
  4. package/dist/cloud/auto-sync-command-entry.js +18 -0
  5. package/dist/cloud/auto-sync-command-entry.js.map +1 -0
  6. package/dist/cloud/auto-sync-command.d.ts +64 -0
  7. package/dist/cloud/auto-sync-command.d.ts.map +1 -0
  8. package/dist/cloud/auto-sync-command.js +109 -0
  9. package/dist/cloud/auto-sync-command.js.map +1 -0
  10. package/dist/cloud/auto-sync.d.ts +111 -0
  11. package/dist/cloud/auto-sync.d.ts.map +1 -0
  12. package/dist/cloud/auto-sync.js +275 -0
  13. package/dist/cloud/auto-sync.js.map +1 -0
  14. package/dist/cloud/nexus-cloud-device-overview.d.ts +52 -0
  15. package/dist/cloud/nexus-cloud-device-overview.d.ts.map +1 -0
  16. package/dist/cloud/nexus-cloud-device-overview.js +105 -0
  17. package/dist/cloud/nexus-cloud-device-overview.js.map +1 -0
  18. package/dist/cloud/nexus-cloud-journal-activity.d.ts +56 -0
  19. package/dist/cloud/nexus-cloud-journal-activity.d.ts.map +1 -0
  20. package/dist/cloud/nexus-cloud-journal-activity.js +98 -0
  21. package/dist/cloud/nexus-cloud-journal-activity.js.map +1 -0
  22. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
  23. package/dist/cloud/nexus-cloud-status.js +88 -5
  24. package/dist/cloud/nexus-cloud-status.js.map +1 -1
  25. package/dist/cloud/nexus-vault.d.ts +19 -5
  26. package/dist/cloud/nexus-vault.d.ts.map +1 -1
  27. package/dist/cloud/nexus-vault.js +376 -71
  28. package/dist/cloud/nexus-vault.js.map +1 -1
  29. package/dist/cloud/replica-rebind.d.ts +14 -0
  30. package/dist/cloud/replica-rebind.d.ts.map +1 -1
  31. package/dist/cloud/replica-rebind.js +20 -1
  32. package/dist/cloud/replica-rebind.js.map +1 -1
  33. package/dist/config.d.ts +10 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +19 -0
  36. package/dist/config.js.map +1 -1
  37. package/dist/docs/docs-ops.d.ts +4 -2
  38. package/dist/docs/docs-ops.d.ts.map +1 -1
  39. package/dist/docs/docs-ops.js +107 -15
  40. package/dist/docs/docs-ops.js.map +1 -1
  41. package/dist/doctor/system-health.d.ts +76 -2
  42. package/dist/doctor/system-health.d.ts.map +1 -1
  43. package/dist/doctor/system-health.js +264 -41
  44. package/dist/doctor/system-health.js.map +1 -1
  45. package/dist/hooks/project-runner.d.ts +10 -0
  46. package/dist/hooks/project-runner.d.ts.map +1 -0
  47. package/dist/hooks/project-runner.js +328 -0
  48. package/dist/hooks/project-runner.js.map +1 -0
  49. package/dist/hooks/project-state.d.ts +41 -0
  50. package/dist/hooks/project-state.d.ts.map +1 -0
  51. package/dist/hooks/project-state.js +331 -0
  52. package/dist/hooks/project-state.js.map +1 -0
  53. package/dist/hooks/release-gate.d.ts +61 -0
  54. package/dist/hooks/release-gate.d.ts.map +1 -0
  55. package/dist/hooks/release-gate.js +70 -0
  56. package/dist/hooks/release-gate.js.map +1 -0
  57. package/dist/nexus/analyze-orchestrator.d.ts +2 -0
  58. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  59. package/dist/nexus/analyze-orchestrator.js +1 -0
  60. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  61. package/dist/nexus/freshness.d.ts +67 -3
  62. package/dist/nexus/freshness.d.ts.map +1 -1
  63. package/dist/nexus/freshness.js +130 -9
  64. package/dist/nexus/freshness.js.map +1 -1
  65. package/dist/nexus/refresh-child.d.ts +14 -0
  66. package/dist/nexus/refresh-child.d.ts.map +1 -0
  67. package/dist/nexus/refresh-child.js +24 -0
  68. package/dist/nexus/refresh-child.js.map +1 -0
  69. package/dist/orchestrate/spawn-ops.d.ts +8 -1
  70. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  71. package/dist/orchestrate/spawn-ops.js +42 -12
  72. package/dist/orchestrate/spawn-ops.js.map +1 -1
  73. package/dist/orchestration/spawn.d.ts +5 -0
  74. package/dist/orchestration/spawn.d.ts.map +1 -1
  75. package/dist/orchestration/spawn.js +4 -1
  76. package/dist/orchestration/spawn.js.map +1 -1
  77. package/dist/release/channel.d.ts.map +1 -1
  78. package/dist/release/channel.js +10 -0
  79. package/dist/release/channel.js.map +1 -1
  80. package/dist/release/github-pr.d.ts.map +1 -1
  81. package/dist/release/github-pr.js +1 -0
  82. package/dist/release/github-pr.js.map +1 -1
  83. package/dist/release/plan.d.ts +8 -3
  84. package/dist/release/plan.d.ts.map +1 -1
  85. package/dist/release/plan.js +72 -15
  86. package/dist/release/plan.js.map +1 -1
  87. package/dist/release/reconcile.d.ts.map +1 -1
  88. package/dist/release/reconcile.js +6 -15
  89. package/dist/release/reconcile.js.map +1 -1
  90. package/dist/sentient/daemon-entry.d.ts +6 -0
  91. package/dist/sentient/daemon-entry.d.ts.map +1 -1
  92. package/dist/sentient/daemon-entry.js +12 -0
  93. package/dist/sentient/daemon-entry.js.map +1 -1
  94. package/dist/sentient/worktree-dispatch.d.ts +7 -0
  95. package/dist/sentient/worktree-dispatch.d.ts.map +1 -1
  96. package/dist/sentient/worktree-dispatch.js +37 -1
  97. package/dist/sentient/worktree-dispatch.js.map +1 -1
  98. package/dist/sessions/session-end-snapshot-entry.d.ts +4 -1
  99. package/dist/sessions/session-end-snapshot-entry.d.ts.map +1 -1
  100. package/dist/sessions/session-end-snapshot-entry.js +9 -1
  101. package/dist/sessions/session-end-snapshot-entry.js.map +1 -1
  102. package/dist/spawn/agent-identity.d.ts.map +1 -1
  103. package/dist/spawn/agent-identity.js +96 -1
  104. package/dist/spawn/agent-identity.js.map +1 -1
  105. package/dist/spawn/branch-lock.d.ts +27 -8
  106. package/dist/spawn/branch-lock.d.ts.map +1 -1
  107. package/dist/spawn/branch-lock.js +57 -73
  108. package/dist/spawn/branch-lock.js.map +1 -1
  109. package/dist/store/agent-resolver.d.ts +6 -0
  110. package/dist/store/agent-resolver.d.ts.map +1 -1
  111. package/dist/store/agent-resolver.js +2 -0
  112. package/dist/store/agent-resolver.js.map +1 -1
  113. package/dist/store/dual-scope-db.d.ts +20 -0
  114. package/dist/store/dual-scope-db.d.ts.map +1 -1
  115. package/dist/store/dual-scope-db.js +81 -8
  116. package/dist/store/dual-scope-db.js.map +1 -1
  117. package/dist/store/exodus/bare-family.d.ts.map +1 -1
  118. package/dist/store/exodus/bare-family.js +4 -1
  119. package/dist/store/exodus/bare-family.js.map +1 -1
  120. package/dist/store/exodus/migrate.d.ts.map +1 -1
  121. package/dist/store/exodus/migrate.js +2 -0
  122. package/dist/store/exodus/migrate.js.map +1 -1
  123. package/dist/store/exodus/on-open.d.ts.map +1 -1
  124. package/dist/store/exodus/on-open.js +16 -4
  125. package/dist/store/exodus/on-open.js.map +1 -1
  126. package/dist/store/exodus/reconcile.d.ts.map +1 -1
  127. package/dist/store/exodus/reconcile.js +2 -0
  128. package/dist/store/exodus/reconcile.js.map +1 -1
  129. package/dist/store/portable-bundle-import.d.ts +17 -0
  130. package/dist/store/portable-bundle-import.d.ts.map +1 -1
  131. package/dist/store/portable-bundle-import.js +46 -31
  132. package/dist/store/portable-bundle-import.js.map +1 -1
  133. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  134. package/dist/store/portable-bundle-scan.js +5 -0
  135. package/dist/store/portable-bundle-scan.js.map +1 -1
  136. package/dist/store/row-identity-registry.d.ts +4 -3
  137. package/dist/store/row-identity-registry.d.ts.map +1 -1
  138. package/dist/store/row-identity-registry.js +37 -35
  139. package/dist/store/row-identity-registry.js.map +1 -1
  140. package/dist/store/row-identity.d.ts.map +1 -1
  141. package/dist/store/row-identity.js +6 -1
  142. package/dist/store/row-identity.js.map +1 -1
  143. package/dist/store/schema/cleo-global/agent-registry.d.ts +16 -0
  144. package/dist/store/schema/cleo-global/agent-registry.d.ts.map +1 -1
  145. package/dist/store/schema/cleo-global/agent-registry.js +4 -1
  146. package/dist/store/schema/cleo-global/agent-registry.js.map +1 -1
  147. package/dist/store/schema/cleo-project/provenance-orphans.d.ts +126 -1
  148. package/dist/store/schema/cleo-project/provenance-orphans.d.ts.map +1 -1
  149. package/dist/store/schema/cleo-project/provenance-orphans.js +41 -1
  150. package/dist/store/schema/cleo-project/provenance-orphans.js.map +1 -1
  151. package/dist/store/sqlite-data-accessor.d.ts +40 -0
  152. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  153. package/dist/store/sqlite-data-accessor.js +122 -0
  154. package/dist/store/sqlite-data-accessor.js.map +1 -1
  155. package/dist/store/sync/activity.d.ts +64 -0
  156. package/dist/store/sync/activity.d.ts.map +1 -0
  157. package/dist/store/sync/activity.js +220 -0
  158. package/dist/store/sync/activity.js.map +1 -0
  159. package/dist/store/sync/apply/applier.d.ts.map +1 -1
  160. package/dist/store/sync/apply/applier.js +58 -2
  161. package/dist/store/sync/apply/applier.js.map +1 -1
  162. package/dist/store/sync/apply/write-api.d.ts.map +1 -1
  163. package/dist/store/sync/apply/write-api.js +45 -3
  164. package/dist/store/sync/apply/write-api.js.map +1 -1
  165. package/dist/store/sync/capture.d.ts +6 -4
  166. package/dist/store/sync/capture.d.ts.map +1 -1
  167. package/dist/store/sync/capture.js +16 -4
  168. package/dist/store/sync/capture.js.map +1 -1
  169. package/dist/store/sync/collision-settle.d.ts +120 -0
  170. package/dist/store/sync/collision-settle.d.ts.map +1 -1
  171. package/dist/store/sync/collision-settle.js +342 -5
  172. package/dist/store/sync/collision-settle.js.map +1 -1
  173. package/dist/store/sync/flags.d.ts +34 -0
  174. package/dist/store/sync/flags.d.ts.map +1 -1
  175. package/dist/store/sync/flags.js +46 -0
  176. package/dist/store/sync/flags.js.map +1 -1
  177. package/dist/store/sync/genesis.d.ts +8 -0
  178. package/dist/store/sync/genesis.d.ts.map +1 -1
  179. package/dist/store/sync/genesis.js +18 -5
  180. package/dist/store/sync/genesis.js.map +1 -1
  181. package/dist/store/sync/push.d.ts +4 -2
  182. package/dist/store/sync/push.d.ts.map +1 -1
  183. package/dist/store/sync/push.js +10 -1
  184. package/dist/store/sync/push.js.map +1 -1
  185. package/dist/store/sync/rebind.d.ts +20 -0
  186. package/dist/store/sync/rebind.d.ts.map +1 -1
  187. package/dist/store/sync/rebind.js +86 -4
  188. package/dist/store/sync/rebind.js.map +1 -1
  189. package/dist/store/sync/reconcile-copy.d.ts +152 -0
  190. package/dist/store/sync/reconcile-copy.d.ts.map +1 -0
  191. package/dist/store/sync/reconcile-copy.js +428 -0
  192. package/dist/store/sync/reconcile-copy.js.map +1 -0
  193. package/dist/store/sync/reconcile.d.ts +80 -0
  194. package/dist/store/sync/reconcile.d.ts.map +1 -1
  195. package/dist/store/sync/reconcile.js +97 -5
  196. package/dist/store/sync/reconcile.js.map +1 -1
  197. package/dist/store/sync/repair.d.ts +11 -0
  198. package/dist/store/sync/repair.d.ts.map +1 -1
  199. package/dist/store/sync/repair.js +14 -3
  200. package/dist/store/sync/repair.js.map +1 -1
  201. package/dist/store/sync/replica.d.ts +74 -1
  202. package/dist/store/sync/replica.d.ts.map +1 -1
  203. package/dist/store/sync/replica.js +104 -6
  204. package/dist/store/sync/replica.js.map +1 -1
  205. package/dist/store/sync/row-meta.d.ts +4 -2
  206. package/dist/store/sync/row-meta.d.ts.map +1 -1
  207. package/dist/store/sync/row-meta.js +6 -4
  208. package/dist/store/sync/row-meta.js.map +1 -1
  209. package/dist/store/sync/sealer.d.ts +2 -0
  210. package/dist/store/sync/sealer.d.ts.map +1 -1
  211. package/dist/store/sync/sealer.js +33 -4
  212. package/dist/store/sync/sealer.js.map +1 -1
  213. package/dist/store/sync/structural.d.ts.map +1 -1
  214. package/dist/store/sync/structural.js +3 -1
  215. package/dist/store/sync/structural.js.map +1 -1
  216. package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
  217. package/dist/store/sync/timestamp-canon.js +2 -0
  218. package/dist/store/sync/timestamp-canon.js.map +1 -1
  219. package/dist/store/table-classification.d.ts +29 -0
  220. package/dist/store/table-classification.d.ts.map +1 -1
  221. package/dist/store/table-classification.js +85 -19
  222. package/dist/store/table-classification.js.map +1 -1
  223. package/dist/store/twin-collapse.d.ts.map +1 -1
  224. package/dist/store/twin-collapse.js +28 -10
  225. package/dist/store/twin-collapse.js.map +1 -1
  226. package/dist/store/vault-manifest.d.ts +5 -0
  227. package/dist/store/vault-manifest.d.ts.map +1 -1
  228. package/dist/store/vault-manifest.js +14 -1
  229. package/dist/store/vault-manifest.js.map +1 -1
  230. package/dist/tasks/affected-packages.d.ts +15 -5
  231. package/dist/tasks/affected-packages.d.ts.map +1 -1
  232. package/dist/tasks/affected-packages.js +20 -8
  233. package/dist/tasks/affected-packages.js.map +1 -1
  234. package/dist/tasks/done-record.d.ts +14 -4
  235. package/dist/tasks/done-record.d.ts.map +1 -1
  236. package/dist/tasks/done-record.js +21 -9
  237. package/dist/tasks/done-record.js.map +1 -1
  238. package/dist/tasks/evidence.d.ts.map +1 -1
  239. package/dist/tasks/evidence.js +45 -4
  240. package/dist/tasks/evidence.js.map +1 -1
  241. package/dist/tasks/gate-runner.d.ts +5 -4
  242. package/dist/tasks/gate-runner.d.ts.map +1 -1
  243. package/dist/tasks/gate-runner.js +18 -11
  244. package/dist/tasks/gate-runner.js.map +1 -1
  245. package/dist/tasks/tool-cache.d.ts +27 -1
  246. package/dist/tasks/tool-cache.d.ts.map +1 -1
  247. package/dist/tasks/tool-cache.js +110 -6
  248. package/dist/tasks/tool-cache.js.map +1 -1
  249. package/dist/tools/fs.d.ts +3 -1
  250. package/dist/tools/fs.d.ts.map +1 -1
  251. package/dist/tools/fs.js +35 -2
  252. package/dist/tools/fs.js.map +1 -1
  253. package/dist/validation/engine-ops.d.ts +10 -3
  254. package/dist/validation/engine-ops.d.ts.map +1 -1
  255. package/dist/validation/engine-ops.js +17 -8
  256. package/dist/validation/engine-ops.js.map +1 -1
  257. package/migrations/drizzle-cleo-global/20261010180000_t12915-agent-registry-uids/migration.sql +18 -0
  258. package/migrations/drizzle-cleo-project/20261010170000_t12896b-brain-task-observations/migration.sql +37 -0
  259. package/migrations/sync-journal/20261009150000_t13335-capture-pin/migration.sql +13 -0
  260. package/package.json +18 -13
  261. package/schemas/config.schema.json +12 -0
  262. package/schemas/project-context.schema.json +5 -0
  263. package/templates/CLEO-INJECTION.md +2 -2
  264. package/templates/CLEO-REFERENCE.md +6 -4
  265. package/templates/git-hooks/pre-push +29 -1
  266. package/templates/workflows/release-prepare.yml.tmpl +1 -0
@@ -0,0 +1,428 @@
1
+ /**
2
+ * The copy reconcile (journal spec §1.5 N7, H3; T13335).
3
+ *
4
+ * Every rebind the open pass makes (a copy, a move, a rollback, another
5
+ * device's store) discards the inherited pull cursor, pauses push and records
6
+ * `sync.reconcile_due` (`replica.ts`). The new replica then reconciles its
7
+ * own state against the stream's MERGED state: the latest verified
8
+ * checkpoint restored into a scratch store (`sync: 'off'`) and pulled to head
9
+ * there with the merge engine (`cloud/nexus-vault.ts` builds it). Here, in
10
+ * one apply frame on the store:
11
+ *
12
+ * - **Rule 1** (`reconcile.ts`): a field an inherited capture or an
13
+ * inherited sealed-but-unpushed op changed is re-emitted from the live row
14
+ * at `tick(at_ms)` of that change.
15
+ * - Every other field is compared per (table, uid, column) with the merged
16
+ * state; a differing field is decided by {@link decideReconcileField}:
17
+ * - **rule 2**, the local field HLC is below the merged one (a row with
18
+ * no row meta, as a never-synced store merging in holds, is dated by its
19
+ * genesis HLC, §1.2; a local value it loses is reported in `overwritten`):
20
+ * the merged value is written locally in the apply frame, its intents
21
+ * recorded so the sealer never sends it, and the merged field HLC stored
22
+ * in the row meta. Nothing is emitted;
23
+ * - **rule 3**, the local HLC is at or above the merged one (a value the
24
+ * original replica sealed but the stream never saw): it is emitted in
25
+ * the `rebind` frame with that HLC pinned (op `fh`, or `h` for a delete).
26
+ * - The store takes the merged state's pull position, and the due record is
27
+ * cleared, which lets push resume.
28
+ *
29
+ * Rows: a row only the merged state has is adopted (inserted) unless the
30
+ * store holds a newer tombstone for it (rule 3: a pinned delete); a row the
31
+ * merged state deleted is adopted (deleted) unless the store's row is newer
32
+ * (rule 3: the whole live row re-inserted as an I whose op HLC is above the
33
+ * tombstone, its field HLCs pinned; the merge engine voids a U on a
34
+ * tombstoned row but re-creates the row from a newer I, T13392). A live row the merged state never knew, with
35
+ * no inherited change, is emitted: with its row meta's HLCs pinned when it
36
+ * has meta, else as a plain insert (nothing local is ever deleted that the
37
+ * stream cannot account for).
38
+ *
39
+ * Reference columns are compared by the uid of the row they point at, and an
40
+ * adopted reference is resolved to this store's local key ({@link resolveRef}).
41
+ * A merged row whose reference does not resolve here, or whose insert hits a
42
+ * local constraint, is left out and counted in `unresolved`. In a merge join
43
+ * (T13466) a local constraint refuses the whole reconcile instead
44
+ * ({@link MergeKeyCollisionError}, T13504).
45
+ *
46
+ * @task T13335
47
+ * @module store/sync/reconcile-copy
48
+ */
49
+ import { UID_COLUMN } from '../row-identity-registry.js';
50
+ import { withApplyFrame } from './apply/frame.js';
51
+ import { resolveRef, uidOfKey } from './apply/refs.js';
52
+ import { createApplyWriteApi } from './apply/write-api.js';
53
+ import { captureTableDef, hasCaptureStamp } from './capture.js';
54
+ import { readSyncFlags, syncSetTables } from './flags.js';
55
+ import { encodeHlc } from './hlc.js';
56
+ import { writeStreamCursor } from './pull.js';
57
+ import { decideReconcileField, emitRebindFrame, gatherInherited, touchedRowKey, } from './reconcile.js';
58
+ import { genesisColumn, genesisPhys } from './repair.js';
59
+ import { activeReplica, RECONCILE_DUE_KEY, reconcileDue } from './replica.js';
60
+ import { fieldHlcsOf, readRowMetaFull } from './row-meta.js';
61
+ import { hasTable } from './schema.js';
62
+ import { canonicalJson } from './sealer-values.js';
63
+ const UNKNOWN_HLC = '';
64
+ /**
65
+ * A merge join refused: a merged row's local key is held by this store's own
66
+ * row, and nothing yet settles such a collision across devices, so emitting
67
+ * this store's row would leave it held on every peer (T13504). The apply
68
+ * frame rolls back: nothing is adopted or emitted, and the reconcile stays due.
69
+ */
70
+ export class MergeKeyCollisionError extends Error {
71
+ collisions;
72
+ constructor(collisions) {
73
+ super(`a merge join cannot place ${collisions.length} stream row(s) whose key this store's own row holds: ${collisions
74
+ .map((c) => `${c.table} ${c.key.map((v) => String(v)).join('/')}`)
75
+ .join(', ')}`);
76
+ this.collisions = collisions;
77
+ this.name = 'MergeKeyCollisionError';
78
+ }
79
+ }
80
+ /** The row-level HLC of a row meta: a tombstone's, or the newest field's. */
81
+ const rowHlc = (meta) => meta?.hlc ?? null;
82
+ /**
83
+ * Reconcile a rebound store against the merged state (module docs). Must
84
+ * run outside a transaction. Does nothing, and returns null, when no
85
+ * reconcile is due.
86
+ *
87
+ * @param db - The rebound store (the canonical store).
88
+ * @param merged - The scratch store: the latest verified checkpoint pulled to head. Read-only here.
89
+ * @param o - Scope, stream, the merged pull position and the clock.
90
+ * @returns What was adopted and emitted, or null when nothing was due.
91
+ */
92
+ export function reconcileCopy(db, merged, o) {
93
+ const due = reconcileDue(db);
94
+ if (due === null)
95
+ return null;
96
+ // A merge join (T13466) records a due with no rebind: the same replica on both sides.
97
+ const merge = due.from === due.to;
98
+ if (readSyncFlags(db)['sync.capture'] && !hasCaptureStamp(db)) {
99
+ // @sync-invariant none:local-only programming-error guard: without the stamp the apply frame's writes would seal as local writes
100
+ throw new Error('reconcileCopy needs the canonical store handle (capture is on, this connection has no capture stamp)');
101
+ }
102
+ const now = o.now ?? Date.now;
103
+ const mergedApi = createApplyWriteApi(merged, o.scope, null, () => undefined);
104
+ return withApplyFrame(db, o.scope, null, (api) => {
105
+ // Raced by another reconcile while the frame waited for the lock.
106
+ if (reconcileDue(db) === null)
107
+ return null;
108
+ const gathered = gatherInherited(db, o.scope, null);
109
+ const touchedOf = (tbl, uid) => gathered.rows.get(touchedRowKey(tbl, uid));
110
+ const pinned = [];
111
+ const atMs = now();
112
+ const replica = activeReplica(db, o.scope)?.replicaId;
113
+ let adoptedFields = 0;
114
+ let adoptedInserts = 0;
115
+ let adoptedDeletes = 0;
116
+ let unresolved = 0;
117
+ const overwritten = [];
118
+ const replaced = [];
119
+ const deleted = [];
120
+ const collisions = [];
121
+ const tables = syncSetTables(o.scope)
122
+ .map((t) => captureTableDef(db, o.scope, t))
123
+ .filter((d) => d?.identity.includes(UID_COLUMN) === true && hasTable(merged, d.table));
124
+ const deletes = [];
125
+ for (const def of tables) {
126
+ const fields = def.columns.filter((c) => !def.identity.includes(c) && !def.secret.has(c));
127
+ const sameValue = (col, a, b) => {
128
+ const ref = def.refs.get(col);
129
+ if (ref === undefined || a === null || b === null)
130
+ return canonicalJson(a) === canonicalJson(b);
131
+ return uidOfKey(db, ref, a) === uidOfKey(merged, ref, b);
132
+ };
133
+ /** A merged value as this store must hold it, or undefined when its reference does not resolve here. */
134
+ const localValue = (col, v) => {
135
+ const ref = def.refs.get(col);
136
+ if (ref === undefined || v === null)
137
+ return v;
138
+ const target = uidOfKey(merged, ref, v);
139
+ if (target === null)
140
+ return undefined;
141
+ const here = resolveRef(db, ref, target);
142
+ return here.kind === 'row' ? here.key : undefined;
143
+ };
144
+ /** A never-synced row's genesis HLC (§1.2): its modification column, counter 0, this replica. */
145
+ const genesisOf = (lMeta, local) => {
146
+ if (lMeta !== undefined || replica === undefined)
147
+ return null;
148
+ const gcol = genesisColumn(o.scope, def.table);
149
+ return encodeHlc({ phys: genesisPhys(gcol ? local[gcol] : null, atMs), ctr: 0, replica });
150
+ };
151
+ for (const uid of uidsOf(db, merged, def.table)) {
152
+ const touched = touchedOf(def.table, uid);
153
+ // Rule 1 owns a row an inherited change inserted or deleted.
154
+ if (touched?.inserted || touched?.deleted)
155
+ continue;
156
+ const local = api.readRow(def.table, uid);
157
+ const theirs = mergedApi.readRow(def.table, uid);
158
+ const lMeta = api.rowMeta(def.table, uid);
159
+ const mMeta = readRowMetaFull(merged, def.table, uid);
160
+ if (local !== null && theirs !== null) {
161
+ const lH = lMeta && !lMeta.deleted ? fieldHlcsOf(def, lMeta) : {};
162
+ // A row with no meta (a never-synced store merging in, T13503) is
163
+ // dated as genesis dates an existing row (§1.2): its modification
164
+ // column, counter 0, this replica. Never adopted blindly.
165
+ const genesis = genesisOf(lMeta, local);
166
+ const mH = mMeta && !mMeta.deleted ? fieldHlcsOf(def, mMeta) : {};
167
+ // The checkpoint's own field HLCs (T13507): a merged field past them was written after the cut.
168
+ const bMeta = genesis !== null && o.baseline
169
+ ? readRowMetaFull(o.baseline, def.table, uid)
170
+ : undefined;
171
+ const bH = bMeta && !bMeta.deleted ? fieldHlcsOf(def, bMeta) : {};
172
+ const adopt = {};
173
+ const adoptH = {};
174
+ const pinCols = new Set();
175
+ const pinH = {};
176
+ for (const col of fields) {
177
+ if (touched?.cols.has(col))
178
+ continue;
179
+ const a = local[col] ?? null;
180
+ const b = theirs[col] ?? null;
181
+ if (sameValue(col, a, b))
182
+ continue;
183
+ const mergedHlc = mH[col] ?? UNKNOWN_HLC;
184
+ // One HLC names one write (it carries the replica): the values
185
+ // differ only in how each store holds them (a timestamp's form).
186
+ if (lH[col] !== undefined && lH[col] === mergedHlc)
187
+ continue;
188
+ const localHlc = lH[col] ?? genesis;
189
+ const writtenSinceCut = genesis !== null &&
190
+ o.baseline !== undefined &&
191
+ mH[col] !== undefined &&
192
+ bH[col] !== mH[col];
193
+ const rule = writtenSinceCut
194
+ ? 'adopt-merged'
195
+ : decideReconcileField({ touchedByInherited: false, localHlc, mergedHlc });
196
+ if (rule === 'adopt-merged') {
197
+ const v = localValue(col, b);
198
+ if (v === undefined) {
199
+ unresolved += 1;
200
+ continue;
201
+ }
202
+ adopt[col] = v;
203
+ adoptH[col] = mergedHlc;
204
+ if (lMeta === undefined)
205
+ overwritten.push({ table: def.table, uid, column: col });
206
+ }
207
+ else {
208
+ pinCols.add(col);
209
+ pinH[col] = localHlc;
210
+ if (lMeta === undefined)
211
+ replaced.push({ table: def.table, uid, column: col });
212
+ }
213
+ }
214
+ // A row with no local meta (a never-synced store merging in, T13466)
215
+ // takes the merged meta even when its values already match.
216
+ if (Object.keys(adopt).length > 0 || (lMeta === undefined && mMeta && !mMeta.deleted)) {
217
+ if (Object.keys(adopt).length > 0)
218
+ api.writeFields(def.table, uid, adopt);
219
+ if (mMeta) {
220
+ api.setMergedRowMeta(def.table, uid, {
221
+ fieldHlc: lMeta && !lMeta.deleted ? adoptH : { ...mH, ...adoptH, ...pinH },
222
+ tombstone: null,
223
+ origin: mMeta.origin,
224
+ actor: mMeta.actor,
225
+ // Values already equal the merged row's: so does its content hash.
226
+ ...(Object.keys(adopt).length === 0 && pinCols.size === 0
227
+ ? { chash: mMeta.chash }
228
+ : {}),
229
+ });
230
+ }
231
+ adoptedFields += Object.keys(adopt).length;
232
+ }
233
+ if (pinCols.size > 0) {
234
+ pinned.push({ tbl: def.table, uid, op: 'U', cols: pinCols, pin: { fh: pinH }, atMs });
235
+ }
236
+ continue;
237
+ }
238
+ if (local !== null) {
239
+ // The merged state has no live row.
240
+ if (mMeta?.deleted) {
241
+ // A never-synced row is dated at genesis too (T13508): a newer local edit survives the delete.
242
+ const genesis = genesisOf(lMeta, local);
243
+ const localH = rowHlc(lMeta) ?? genesis;
244
+ // The re-insert's op HLC must be above the tombstone: a clock
245
+ // that merged it issues one. A tombstone beyond the skew bound
246
+ // cannot be passed, so the delete is adopted.
247
+ const above = localH === null || localH < mMeta.hlc || replica === undefined
248
+ ? null
249
+ : api.clockReceive(replica, mMeta.hlc, atMs);
250
+ if (above === null || above.held) {
251
+ deletes.push({ def, uid, tombstone: mMeta.hlc, meta: mMeta });
252
+ if (lMeta === undefined)
253
+ deleted.push({ table: def.table, uid });
254
+ }
255
+ else {
256
+ const fh = lMeta !== undefined
257
+ ? fieldHlcsOf(def, lMeta)
258
+ : Object.fromEntries(fields.map((c) => [c, genesis]));
259
+ pinned.push({ tbl: def.table, uid, op: 'I', pin: { h: above.clock, fh }, atMs });
260
+ if (lMeta === undefined)
261
+ replaced.push({ table: def.table, uid, column: '*' });
262
+ }
263
+ continue;
264
+ }
265
+ // The stream never knew the row and no inherited change explains it.
266
+ pinned.push({
267
+ tbl: def.table,
268
+ uid,
269
+ op: 'I',
270
+ pin: lMeta && !lMeta.deleted ? { fh: fieldHlcsOf(def, lMeta) } : {},
271
+ atMs,
272
+ });
273
+ continue;
274
+ }
275
+ if (theirs !== null) {
276
+ // Only the merged state has the row.
277
+ if (lMeta?.deleted && mMeta && lMeta.hlc >= mMeta.hlc) {
278
+ pinned.push({ tbl: def.table, uid, op: 'D', pin: { h: lMeta.hlc }, atMs });
279
+ continue;
280
+ }
281
+ const values = {};
282
+ let resolvable = true;
283
+ for (const col of def.columns) {
284
+ if (col === UID_COLUMN || def.secret.has(col))
285
+ continue;
286
+ const v = localValue(col, theirs[col] ?? null);
287
+ if (v === undefined) {
288
+ resolvable = false;
289
+ break;
290
+ }
291
+ values[col] = v;
292
+ }
293
+ if (!resolvable) {
294
+ unresolved += 1;
295
+ continue;
296
+ }
297
+ if (!insertAdopted(api, def, uid, values, mMeta)) {
298
+ if (merge)
299
+ collisions.push({
300
+ table: def.table,
301
+ uid,
302
+ key: def.key.map((k) => theirs[k] ?? null),
303
+ });
304
+ unresolved += 1;
305
+ continue;
306
+ }
307
+ adoptedInserts += 1;
308
+ }
309
+ }
310
+ }
311
+ if (collisions.length > 0) {
312
+ // @sync-invariant none:local-only a merge join is refused locally before anything is adopted or emitted; the frame rolls back
313
+ throw new MergeKeyCollisionError(collisions);
314
+ }
315
+ // Deletes after every insert and update, children first.
316
+ for (const d of deletes.reverse()) {
317
+ if (!api.deleteRow(d.def.table, d.uid))
318
+ continue;
319
+ api.setMergedRowMeta(d.def.table, d.uid, {
320
+ fieldHlc: {},
321
+ tombstone: d.tombstone,
322
+ origin: d.meta.origin,
323
+ actor: d.meta.actor,
324
+ });
325
+ adoptedDeletes += 1;
326
+ }
327
+ const frame = emitRebindFrame(db, o.scope, gathered, pinned);
328
+ writeStreamCursor(db, o.stream, o.mergedCursor, new Date(atMs).toISOString());
329
+ db.prepare('DELETE FROM _sync_meta WHERE key = ?').run(RECONCILE_DUE_KEY);
330
+ return {
331
+ adoptedFields,
332
+ adoptedInserts,
333
+ adoptedDeletes,
334
+ pinned: pinned.length,
335
+ unresolved,
336
+ overwritten,
337
+ replaced,
338
+ deleted,
339
+ frame,
340
+ };
341
+ });
342
+ }
343
+ const qid = (id) => `"${id.replaceAll('"', '""')}"`;
344
+ /**
345
+ * The merged rows a merge join (T13466) could not place: a live merged row
346
+ * this store has no row for, whose local key a different row here already
347
+ * holds. Read-only; run it before the join so a refusal changes nothing
348
+ * (T13504). Tables whose key holds a reference are left to the reconcile's
349
+ * own check, which refuses the same way.
350
+ *
351
+ * @param db - The store about to merge in.
352
+ * @param merged - The merged state (checkpoint pulled to head).
353
+ * @param scope - The store's scope.
354
+ * @returns The colliding merged rows, in table order.
355
+ */
356
+ export function mergeKeyCollisions(db, merged, scope) {
357
+ const out = [];
358
+ for (const table of syncSetTables(scope)) {
359
+ const def = captureTableDef(db, scope, table);
360
+ if (!def?.identity.includes(UID_COLUMN) || !hasTable(merged, table))
361
+ continue;
362
+ if (def.key.length === 0 || def.key.some((k) => def.refs.has(k)))
363
+ continue;
364
+ const cols = [UID_COLUMN, ...def.key].map(qid).join(', ');
365
+ const where = def.key.map((k) => `${qid(k)} IS ?`).join(' AND ');
366
+ const holder = db.prepare(`SELECT ${qid(UID_COLUMN)} AS uid FROM ${qid(table)} WHERE ${where}`);
367
+ for (const row of merged
368
+ .prepare(`SELECT ${cols} FROM ${qid(table)} WHERE ${qid(UID_COLUMN)} IS NOT NULL`)
369
+ .all()) {
370
+ const key = def.key.map((k) => row[k] ?? null);
371
+ const here = holder.get(...key);
372
+ if (here !== undefined && here.uid !== row[UID_COLUMN]) {
373
+ out.push({ table, uid: String(row[UID_COLUMN]), key });
374
+ }
375
+ }
376
+ }
377
+ return out;
378
+ }
379
+ /**
380
+ * Every uid of `table` either store knows: its live rows and its row meta
381
+ * (tombstones included), in a stable order.
382
+ */
383
+ function uidsOf(db, merged, table) {
384
+ const out = new Set();
385
+ const q = `"${table.replaceAll('"', '""')}"`;
386
+ for (const store of [db, merged]) {
387
+ for (const r of store
388
+ .prepare(`SELECT ${UID_COLUMN} AS uid FROM ${q} WHERE ${UID_COLUMN} IS NOT NULL`)
389
+ .all()) {
390
+ out.add(r.uid);
391
+ }
392
+ if (hasTable(store, '_sync_row_meta')) {
393
+ for (const r of store
394
+ .prepare('SELECT uid FROM _sync_row_meta WHERE tbl = ?')
395
+ .all(table)) {
396
+ out.add(r.uid);
397
+ }
398
+ }
399
+ }
400
+ return [...out].sort();
401
+ }
402
+ /**
403
+ * Insert a merged row in the apply frame, with the merged row meta. A local
404
+ * constraint (a key another local row holds) leaves it out: the statement
405
+ * is undone and nothing is recorded.
406
+ *
407
+ * @returns Whether the row was inserted.
408
+ */
409
+ function insertAdopted(api, def, uid, values, mMeta) {
410
+ try {
411
+ api.insertRow(def.table, uid, values);
412
+ }
413
+ catch (err) {
414
+ if (err instanceof Error && /constraint/i.test(err.message))
415
+ return false;
416
+ throw err;
417
+ }
418
+ if (mMeta && !mMeta.deleted) {
419
+ api.setMergedRowMeta(def.table, uid, {
420
+ fieldHlc: fieldHlcsOf(def, mMeta),
421
+ tombstone: null,
422
+ origin: mMeta.origin,
423
+ actor: mMeta.actor,
424
+ });
425
+ }
426
+ return true;
427
+ }
428
+ //# sourceMappingURL=reconcile-copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-copy.js","sourceRoot":"","sources":["../../../src/store/sync/reconcile-copy.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,27 @@ export interface ReconcileField {
56
56
  * @returns `emit-tick` (rule 1), `adopt-merged` (rule 2) or `emit-pinned` (rule 3).
57
57
  */
58
58
  export declare function decideReconcileField(f: ReconcileField): ReconcileRule;
59
+ /** One row an inherited change touched, under its current uid. */
60
+ export interface TouchedRow {
61
+ readonly tbl: string;
62
+ uid: string;
63
+ /** The stream never saw the row: an inherited change inserted it. */
64
+ inserted: boolean;
65
+ /** An inherited change deleted it. */
66
+ deleted: boolean;
67
+ /** Columns an inherited U changed. */
68
+ readonly cols: Set<string>;
69
+ /** The time of its last inherited change (ms). */
70
+ atMs: number;
71
+ }
72
+ /** A re-key the stream never saw, re-emitted ahead of the row changes. */
73
+ export interface Rekey {
74
+ readonly tbl: string;
75
+ readonly rk: string;
76
+ readonly oldUid: string;
77
+ readonly img: string;
78
+ readonly atMs: number;
79
+ }
59
80
  /** What {@link reconcileInPlace} did. */
60
81
  export interface ReconcileReport {
61
82
  /** The `rebind` frame the re-emitted rows were captured in, or null when nothing was touched. */
@@ -90,4 +111,63 @@ export declare function reconcileInPlace(db: DatabaseSync, o: {
90
111
  readonly scope: TableScope;
91
112
  readonly previousReplica: string;
92
113
  }): ReconcileReport;
114
+ /** What the previous replica changed and the stream never saw ({@link gatherInherited}). */
115
+ export interface InheritedChanges {
116
+ /** Touched rows, keyed by {@link touchedRowKey}. */
117
+ readonly rows: ReadonlyMap<string, TouchedRow>;
118
+ readonly rekeys: readonly Rekey[];
119
+ /** Row-count effect of the inherited sealed transactions, per table. */
120
+ readonly ledger: ReadonlyMap<string, number>;
121
+ /** Inherited captures read. */
122
+ readonly captures: number;
123
+ /** Inherited transactions whose ops were read. */
124
+ readonly txns: number;
125
+ }
126
+ /** The key of a touched row in {@link InheritedChanges.rows}. */
127
+ export declare const touchedRowKey: (tbl: string, uid: string) => string;
128
+ /**
129
+ * Read what the previous replica changed and the stream never saw (rule 1
130
+ * of §1.5 N7): its inherited sealed transactions, in commit order, then the
131
+ * inherited captures, in capture order. Read-only.
132
+ *
133
+ * @param db - The store.
134
+ * @param scope - The store's scope.
135
+ * @param previousReplica - The retired replica whose inherited transactions
136
+ * count, or null for every replica's (a store rebound more than once
137
+ * before it reconciled).
138
+ * @returns The touched rows, the re-keys and the inherited row counts.
139
+ */
140
+ export declare function gatherInherited(db: DatabaseSync, scope: TableScope, previousReplica: string | null): InheritedChanges;
141
+ /**
142
+ * A field the copy reconcile publishes with the HLC the original replica
143
+ * issued (rule 3 of §1.5 N7): the capture carries `pin_json` and the sealer
144
+ * uses `h` as the op's HLC and `fh` as its field HLCs instead of ticking.
145
+ */
146
+ export interface PinnedEmit {
147
+ readonly tbl: string;
148
+ readonly uid: string;
149
+ /** `I` the whole live row, `U` the `cols` of the live row, `D` a row gone here. */
150
+ readonly op: 'I' | 'U' | 'D';
151
+ readonly cols?: ReadonlySet<string>;
152
+ readonly pin: {
153
+ readonly h?: string;
154
+ readonly fh?: Readonly<Record<string, string>>;
155
+ };
156
+ /** The capture time (ms). */
157
+ readonly atMs: number;
158
+ }
159
+ /**
160
+ * Write one `rebind` frame (module docs): the inherited re-keys, every
161
+ * touched row from its live state (rule 1), then the `pinned` emits (rule 3,
162
+ * the copy reconcile), and consume what was gathered: the inherited
163
+ * captures are deleted and the ledger forgets the inherited sealed row
164
+ * counts. In the caller's transaction.
165
+ *
166
+ * @param db - The store, inside a transaction.
167
+ * @param scope - The store's scope.
168
+ * @param gathered - {@link gatherInherited}'s result.
169
+ * @param pinned - Rule-3 emits; empty for the rebind at head.
170
+ * @returns What was re-emitted.
171
+ */
172
+ export declare function emitRebindFrame(db: DatabaseSync, scope: TableScope, gathered: InheritedChanges, pinned: readonly PinnedEmit[]): ReconcileReport;
93
173
  //# sourceMappingURL=reconcile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../../src/store/sync/reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAStD,uEAAuE;AACvE,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC;AAEzE,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,uFAAuF;IACvF,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,GAAG,aAAa,CAIrE;AAyBD,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAkBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,YAAY,EAChB,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GAClE,eAAe,CA+NjB"}
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../../src/store/sync/reconcile.ts"],"names":[],"mappings":"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"}