@abloatai/ablo 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/CHANGELOG.md +42 -2
  2. package/README.md +102 -86
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +134 -151
  5. package/dist/Database.d.ts +68 -69
  6. package/dist/Database.js +316 -135
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +54 -52
  12. package/dist/Model.js +78 -62
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +122 -118
  18. package/dist/SyncClient.js +541 -245
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +10 -9
  22. package/dist/adapters/inMemoryStorage.js +21 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +173 -121
  50. package/dist/client/Ablo.d.ts +97 -74
  51. package/dist/client/Ablo.js +129 -163
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +442 -81
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +16 -17
  61. package/dist/client/createInternalComponents.js +26 -31
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +59 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +78 -87
  76. package/dist/client/options.d.ts +157 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +16 -20
  91. package/dist/client/wsMutationExecutor.js +18 -23
  92. package/dist/commit/contract.d.ts +493 -0
  93. package/dist/commit/contract.js +187 -0
  94. package/dist/commit/index.d.ts +6 -0
  95. package/dist/commit/index.js +5 -0
  96. package/dist/context.d.ts +6 -4
  97. package/dist/context.js +6 -4
  98. package/dist/coordination/index.d.ts +10 -8
  99. package/dist/coordination/index.js +14 -12
  100. package/dist/coordination/schema.d.ts +176 -128
  101. package/dist/coordination/schema.js +197 -133
  102. package/dist/coordination/trace.d.ts +9 -10
  103. package/dist/coordination/trace.js +13 -14
  104. package/dist/core/DatabaseManager.d.ts +5 -7
  105. package/dist/core/DatabaseManager.js +15 -19
  106. package/dist/core/QueryProcessor.d.ts +7 -9
  107. package/dist/core/QueryProcessor.js +22 -28
  108. package/dist/core/QueryView.d.ts +8 -8
  109. package/dist/core/QueryView.js +2 -2
  110. package/dist/core/StoreManager.d.ts +14 -14
  111. package/dist/core/StoreManager.js +33 -24
  112. package/dist/core/ViewRegistry.d.ts +5 -5
  113. package/dist/core/ViewRegistry.js +4 -4
  114. package/dist/core/index.d.ts +17 -12
  115. package/dist/core/index.js +32 -26
  116. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  117. package/dist/core/openIDBWithTimeout.js +42 -43
  118. package/dist/core/queryUtils.d.ts +45 -0
  119. package/dist/core/queryUtils.js +69 -0
  120. package/dist/core/storeContract.d.ts +63 -61
  121. package/dist/core/storeContract.js +8 -12
  122. package/dist/environment.d.ts +28 -0
  123. package/dist/environment.js +21 -0
  124. package/dist/errorCodes.d.ts +107 -99
  125. package/dist/errorCodes.js +137 -134
  126. package/dist/errors.d.ts +160 -166
  127. package/dist/errors.js +155 -158
  128. package/dist/index.d.ts +36 -27
  129. package/dist/index.js +91 -86
  130. package/dist/interfaces/index.d.ts +102 -113
  131. package/dist/interfaces/index.js +5 -4
  132. package/dist/keys/index.d.ts +27 -29
  133. package/dist/keys/index.js +41 -40
  134. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  135. package/dist/mutators/RecordingTransaction.js +31 -37
  136. package/dist/mutators/Transaction.d.ts +18 -26
  137. package/dist/mutators/Transaction.js +14 -20
  138. package/dist/mutators/UndoManager.d.ts +124 -131
  139. package/dist/mutators/UndoManager.js +177 -156
  140. package/dist/mutators/defineMutators.d.ts +23 -34
  141. package/dist/mutators/defineMutators.js +14 -20
  142. package/dist/mutators/inverseOp.d.ts +12 -15
  143. package/dist/mutators/inverseOp.js +12 -15
  144. package/dist/mutators/mutateActions.d.ts +10 -9
  145. package/dist/mutators/mutateActions.js +1 -1
  146. package/dist/mutators/readerActions.d.ts +9 -8
  147. package/dist/mutators/readerActions.js +2 -2
  148. package/dist/mutators/undoApply.d.ts +31 -27
  149. package/dist/mutators/undoApply.js +26 -24
  150. package/dist/policy/index.d.ts +5 -3
  151. package/dist/policy/index.js +5 -3
  152. package/dist/policy/types.d.ts +104 -100
  153. package/dist/policy/types.js +67 -66
  154. package/dist/query/client.d.ts +28 -23
  155. package/dist/query/client.js +45 -43
  156. package/dist/query/types.d.ts +37 -60
  157. package/dist/query/types.js +13 -33
  158. package/dist/react/AbloProvider.d.ts +1 -1
  159. package/dist/react/AbloProvider.js +2 -2
  160. package/dist/react/context.d.ts +25 -28
  161. package/dist/react/context.js +9 -10
  162. package/dist/react/index.d.ts +41 -42
  163. package/dist/react/index.js +37 -38
  164. package/dist/react/internalContext.d.ts +17 -19
  165. package/dist/react/useAblo.d.ts +28 -25
  166. package/dist/react/useAblo.js +41 -17
  167. package/dist/react/useCurrentUserId.d.ts +8 -7
  168. package/dist/react/useCurrentUserId.js +8 -7
  169. package/dist/react/useErrorListener.d.ts +7 -7
  170. package/dist/react/useErrorListener.js +10 -11
  171. package/dist/react/useMutationFailureListener.d.ts +8 -8
  172. package/dist/react/useMutationFailureListener.js +8 -8
  173. package/dist/react/useMutators.d.ts +11 -11
  174. package/dist/react/useMutators.js +3 -3
  175. package/dist/react/useReactive.js +2 -2
  176. package/dist/react/useSyncStatus.d.ts +4 -6
  177. package/dist/react/useUndoScope.d.ts +7 -9
  178. package/dist/react/useUndoScope.js +1 -1
  179. package/dist/schema/coordination.d.ts +21 -25
  180. package/dist/schema/coordination.js +21 -25
  181. package/dist/schema/ddl.d.ts +43 -39
  182. package/dist/schema/ddl.js +75 -68
  183. package/dist/schema/ddlLock.d.ts +20 -24
  184. package/dist/schema/ddlLock.js +18 -23
  185. package/dist/schema/diff.d.ts +99 -61
  186. package/dist/schema/diff.js +43 -34
  187. package/dist/schema/field.d.ts +37 -42
  188. package/dist/schema/field.js +35 -48
  189. package/dist/schema/generate.d.ts +12 -12
  190. package/dist/schema/generate.js +12 -12
  191. package/dist/schema/index.d.ts +3 -3
  192. package/dist/schema/index.js +21 -23
  193. package/dist/schema/model.d.ts +118 -143
  194. package/dist/schema/model.js +22 -33
  195. package/dist/schema/openapi.d.ts +10 -9
  196. package/dist/schema/openapi.js +5 -3
  197. package/dist/schema/queries.d.ts +29 -31
  198. package/dist/schema/queries.js +23 -25
  199. package/dist/schema/relation.d.ts +89 -99
  200. package/dist/schema/relation.js +13 -13
  201. package/dist/schema/residency.d.ts +16 -13
  202. package/dist/schema/residency.js +16 -13
  203. package/dist/schema/roles.d.ts +36 -43
  204. package/dist/schema/roles.js +31 -37
  205. package/dist/schema/schema.d.ts +64 -43
  206. package/dist/schema/schema.js +31 -32
  207. package/dist/schema/select.d.ts +13 -13
  208. package/dist/schema/select.js +13 -13
  209. package/dist/schema/serialize.d.ts +28 -31
  210. package/dist/schema/serialize.js +27 -31
  211. package/dist/schema/sugar.d.ts +17 -32
  212. package/dist/schema/sugar.js +14 -29
  213. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  214. package/dist/schema/syncDeltaRow.js +89 -0
  215. package/dist/schema/tenancy.d.ts +44 -46
  216. package/dist/schema/tenancy.js +46 -48
  217. package/dist/server/adapter.d.ts +58 -58
  218. package/dist/server/adapter.js +13 -14
  219. package/dist/server/commit.d.ts +60 -64
  220. package/dist/server/index.d.ts +9 -10
  221. package/dist/server/index.js +1 -1
  222. package/dist/server/readConfig.d.ts +70 -0
  223. package/dist/server/readConfig.js +8 -0
  224. package/dist/server/storageMode.d.ts +23 -0
  225. package/dist/server/storageMode.js +17 -0
  226. package/dist/source/adapter.d.ts +30 -25
  227. package/dist/source/adapter.js +10 -10
  228. package/dist/source/adapters/drizzle.d.ts +28 -23
  229. package/dist/source/adapters/drizzle.js +30 -25
  230. package/dist/source/adapters/kysely.d.ts +27 -25
  231. package/dist/source/adapters/kysely.js +24 -23
  232. package/dist/source/adapters/memory.d.ts +8 -7
  233. package/dist/source/adapters/memory.js +9 -8
  234. package/dist/source/adapters/prisma.d.ts +13 -12
  235. package/dist/source/adapters/prisma.js +22 -25
  236. package/dist/source/conformance.d.ts +18 -11
  237. package/dist/source/conformance.js +17 -11
  238. package/dist/source/connector.d.ts +31 -32
  239. package/dist/source/connector.js +28 -28
  240. package/dist/source/connectorProtocol.d.ts +160 -0
  241. package/dist/source/connectorProtocol.js +162 -0
  242. package/dist/source/contract.d.ts +26 -27
  243. package/dist/source/contract.js +28 -29
  244. package/dist/source/factory.d.ts +46 -58
  245. package/dist/source/factory.js +22 -27
  246. package/dist/source/index.d.ts +7 -9
  247. package/dist/source/index.js +12 -14
  248. package/dist/source/migrations.d.ts +9 -9
  249. package/dist/source/migrations.js +9 -9
  250. package/dist/source/next.d.ts +9 -10
  251. package/dist/source/next.js +6 -7
  252. package/dist/source/pushQueue.d.ts +69 -47
  253. package/dist/source/pushQueue.js +32 -28
  254. package/dist/source/signing.d.ts +46 -17
  255. package/dist/source/signing.js +28 -11
  256. package/dist/source/types.d.ts +121 -104
  257. package/dist/source/types.js +13 -14
  258. package/dist/stores/ObjectStore.d.ts +24 -12
  259. package/dist/stores/ObjectStore.js +38 -16
  260. package/dist/stores/ObjectStoreContract.d.ts +14 -15
  261. package/dist/stores/SyncActionStore.d.ts +7 -11
  262. package/dist/stores/SyncActionStore.js +13 -17
  263. package/dist/surface.d.ts +28 -21
  264. package/dist/surface.js +29 -20
  265. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  266. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  267. package/dist/sync/ConnectionManager.d.ts +39 -50
  268. package/dist/sync/ConnectionManager.js +55 -66
  269. package/dist/sync/NetworkProbe.d.ts +24 -29
  270. package/dist/sync/NetworkProbe.js +63 -69
  271. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  272. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  273. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  274. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  275. package/dist/sync/SyncWebSocket.d.ts +141 -166
  276. package/dist/sync/SyncWebSocket.js +191 -223
  277. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  278. package/dist/sync/awaitClaimGrant.js +11 -11
  279. package/dist/sync/bootstrapApply.d.ts +34 -24
  280. package/dist/sync/bootstrapApply.js +27 -19
  281. package/dist/sync/commitFrames.d.ts +21 -20
  282. package/dist/sync/commitFrames.js +18 -18
  283. package/dist/sync/createClaimStream.d.ts +23 -22
  284. package/dist/sync/createClaimStream.js +105 -23
  285. package/dist/sync/createPresenceStream.d.ts +19 -18
  286. package/dist/sync/createPresenceStream.js +25 -26
  287. package/dist/sync/createSnapshot.d.ts +12 -14
  288. package/dist/sync/createSnapshot.js +20 -26
  289. package/dist/sync/credentialLifecycle.d.ts +104 -104
  290. package/dist/sync/credentialLifecycle.js +140 -147
  291. package/dist/sync/deltaPipeline.d.ts +36 -34
  292. package/dist/sync/deltaPipeline.js +64 -65
  293. package/dist/sync/groupChange.d.ts +63 -61
  294. package/dist/sync/groupChange.js +74 -78
  295. package/dist/sync/heartbeat.d.ts +34 -33
  296. package/dist/sync/heartbeat.js +31 -31
  297. package/dist/sync/participants.d.ts +19 -19
  298. package/dist/sync/persistedPrefix.d.ts +12 -0
  299. package/dist/sync/persistedPrefix.js +22 -0
  300. package/dist/sync/schemas.d.ts +3 -2
  301. package/dist/sync/schemas.js +14 -10
  302. package/dist/sync/syncCursor.d.ts +17 -21
  303. package/dist/sync/syncCursor.js +17 -21
  304. package/dist/sync/syncPlan.d.ts +28 -36
  305. package/dist/sync/syncPlan.js +18 -19
  306. package/dist/sync/syncPosition.d.ts +54 -49
  307. package/dist/sync/syncPosition.js +57 -52
  308. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  309. package/dist/sync/wsFrameHandlers.js +63 -67
  310. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  311. package/dist/testing/fixtures/bootstrap.js +12 -6
  312. package/dist/testing/fixtures/deltas.d.ts +30 -33
  313. package/dist/testing/fixtures/deltas.js +30 -33
  314. package/dist/testing/fixtures/models.d.ts +11 -10
  315. package/dist/testing/fixtures/models.js +11 -10
  316. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  317. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  318. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  319. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  320. package/dist/testing/helpers/wait.d.ts +13 -8
  321. package/dist/testing/helpers/wait.js +13 -8
  322. package/dist/testing/index.d.ts +5 -3
  323. package/dist/testing/index.js +3 -2
  324. package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
  325. package/dist/testing/mocks/FakeDatabase.js +10 -0
  326. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  327. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  328. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  329. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  330. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  331. package/dist/testing/mocks/MockSyncContext.js +15 -13
  332. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  333. package/dist/testing/mocks/MockSyncStore.js +11 -11
  334. package/dist/testing/mocks/MockWebSocket.d.ts +28 -23
  335. package/dist/testing/mocks/MockWebSocket.js +22 -21
  336. package/dist/transactions/TransactionQueue.d.ts +244 -181
  337. package/dist/transactions/TransactionQueue.js +929 -423
  338. package/dist/transactions/TransactionStore.d.ts +6 -4
  339. package/dist/transactions/TransactionStore.js +6 -4
  340. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  341. package/dist/transactions/UnconfirmedWrites.js +104 -0
  342. package/dist/transactions/coalesceRules.d.ts +41 -17
  343. package/dist/transactions/coalesceRules.js +40 -17
  344. package/dist/transactions/commitEnvelope.d.ts +132 -0
  345. package/dist/transactions/commitEnvelope.js +139 -0
  346. package/dist/transactions/commitOutboxStore.d.ts +32 -0
  347. package/dist/transactions/commitOutboxStore.js +26 -0
  348. package/dist/transactions/commitPayload.d.ts +63 -52
  349. package/dist/transactions/commitPayload.js +54 -57
  350. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  351. package/dist/transactions/deltaConfirmation.js +37 -45
  352. package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
  353. package/dist/transactions/httpCommitEnvelope.js +179 -0
  354. package/dist/transactions/optimisticApply.d.ts +49 -0
  355. package/dist/transactions/optimisticApply.js +65 -0
  356. package/dist/transactions/replayValidation.d.ts +182 -0
  357. package/dist/transactions/replayValidation.js +156 -0
  358. package/dist/types/global.d.ts +46 -41
  359. package/dist/types/global.js +20 -19
  360. package/dist/types/index.d.ts +71 -77
  361. package/dist/types/index.js +22 -22
  362. package/dist/types/modelData.d.ts +6 -8
  363. package/dist/types/modelData.js +5 -7
  364. package/dist/types/participant.d.ts +10 -11
  365. package/dist/types/participant.js +6 -8
  366. package/dist/types/streams.d.ts +208 -195
  367. package/dist/types/streams.js +7 -7
  368. package/dist/utils/asyncIterator.d.ts +25 -32
  369. package/dist/utils/asyncIterator.js +25 -32
  370. package/dist/utils/duration.d.ts +12 -15
  371. package/dist/utils/duration.js +12 -15
  372. package/dist/utils/mobxSetup.d.ts +53 -0
  373. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  374. package/dist/webhooks/events.d.ts +21 -16
  375. package/dist/webhooks/events.js +10 -8
  376. package/dist/webhooks/index.d.ts +5 -7
  377. package/dist/webhooks/index.js +5 -7
  378. package/dist/wire/bootstrapReason.d.ts +9 -0
  379. package/dist/wire/bootstrapReason.js +8 -0
  380. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  381. package/dist/wire/delta.js +114 -0
  382. package/dist/wire/errorEnvelope.d.ts +30 -31
  383. package/dist/wire/errorEnvelope.js +34 -40
  384. package/dist/wire/frames.d.ts +315 -86
  385. package/dist/wire/frames.js +47 -33
  386. package/dist/wire/index.d.ts +18 -14
  387. package/dist/wire/index.js +32 -27
  388. package/dist/wire/listEnvelope.d.ts +16 -23
  389. package/dist/wire/listEnvelope.js +7 -6
  390. package/dist/wire/protocol.d.ts +25 -32
  391. package/dist/wire/protocol.js +25 -32
  392. package/dist/wire/protocolVersion.d.ts +44 -40
  393. package/dist/wire/protocolVersion.js +44 -40
  394. package/docs/api.md +10 -10
  395. package/docs/coordination.md +59 -0
  396. package/docs/mcp.md +1 -1
  397. package/package.json +17 -11
  398. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  399. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  400. package/dist/core/query-utils.d.ts +0 -34
  401. package/dist/core/query-utils.js +0 -59
  402. package/dist/schema/sync-delta-row.js +0 -103
  403. package/dist/schema/sync-delta-wire.js +0 -102
  404. package/dist/server/read-config.d.ts +0 -67
  405. package/dist/server/read-config.js +0 -8
  406. package/dist/server/storage-mode.d.ts +0 -8
  407. package/dist/server/storage-mode.js +0 -28
  408. package/dist/source/connector-protocol.d.ts +0 -159
  409. package/dist/source/connector-protocol.js +0 -161
  410. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  411. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  412. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  413. package/dist/transactions/mutation-error-handler.js +0 -39
  414. package/dist/transactions/optimistic.d.ts +0 -24
  415. package/dist/transactions/optimistic.js +0 -45
  416. package/dist/transactions/persistedReplay.d.ts +0 -93
  417. package/dist/transactions/persistedReplay.js +0 -105
  418. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,20 +1,19 @@
1
1
  /**
2
- * BaseSyncedStore Generic sync store base class for the SDK.
2
+ * The base class that application-specific sync stores extend. It supplies the
3
+ * shared orchestration for reads, writes, delta processing, and bootstrap, and
4
+ * exports the core types those stores build on.
3
5
  *
4
- * Exports the core types, interfaces, and a base class that app-specific
5
- * stores extend. The base class provides query/mutation/delta/bootstrap
6
- * orchestration. Subclasses add domain-specific lazy-loading, collaboration
7
- * events, and model enrichment.
8
- *
9
- * Design: The app's SyncedStore extends this and adds its own methods.
10
- * This file only contains types and the abstract contract — the actual
11
- * implementation stays in the app's SyncedStore.ts until we incrementally
12
- * pull generic methods into this base class.
6
+ * A subclass adds its own domain behavior lazy-loaded relations,
7
+ * collaboration events, and model enrichment by overriding the protected
8
+ * extension points defined here. The heavy lifting is delegated to injected
9
+ * collaborators: {@link SyncClient} owns pool writes and the transaction
10
+ * queue, {@link Database} owns local persistence, {@link InstanceCache} holds the
11
+ * in-memory models, and {@link ModelRegistry} holds their metadata.
13
12
  */
14
13
  import { makeObservable, observable, action, computed, runInAction } from 'mobx';
15
14
  import { AbloConnectionError, AbloValidationError, toAbloError } from './errors.js';
16
15
  import { ConnectionManager } from './sync/ConnectionManager.js';
17
- import { AreaOfInterestManager } from './sync/AreaOfInterestManager.js';
16
+ import { SubscriptionManager } from './sync/SubscriptionManager.js';
18
17
  import { resolveParticipantSyncGroups, } from './sync/participants.js';
19
18
  import { ModelRegistry } from './ModelRegistry.js';
20
19
  import { PropertyType } from './types/index.js';
@@ -23,7 +22,7 @@ import { QueryProcessor } from './core/QueryProcessor.js';
23
22
  import { Model, rowAsModel } from './Model.js';
24
23
  import { getContext } from './context.js';
25
24
  import { SyncSessionError, isAccessCredentialExpiryCloseReason } from './errors.js';
26
- import { ModelScope } from './ObjectPool.js';
25
+ import { ModelScope } from './InstanceCache.js';
27
26
  import { LazyReferenceCollection } from './LazyReferenceCollection.js';
28
27
  import { deriveSyncPlanFromSchema } from './sync/syncPlan.js';
29
28
  import { CredentialLifecycle } from './sync/credentialLifecycle.js';
@@ -38,21 +37,20 @@ export const BOOTSTRAP_CONFIG = {
38
37
  };
39
38
  // Re-export for clean API
40
39
  export { ModelScope };
41
- // deriveSyncPlanFromSchema (pure schema sync-plan derivation) moved to
42
- // sync/syncPlan.ts; re-exported so importers are unchanged.
40
+ // deriveSyncPlanFromSchema derives a sync plan from a schema and is
41
+ // re-exported here.
43
42
  export { deriveSyncPlanFromSchema } from './sync/syncPlan.js';
44
43
  // ── Base class ──────────────────────────────────────────────────────────────
45
44
  /**
46
- * BaseSyncedStore abstract base for app-specific sync stores.
47
- *
48
- * Provides the dependency structure, observable status, and protected
49
- * accessors that subclasses use. The actual sync orchestration (initialize,
50
- * delta processing, bootstrap, query, save, delete, etc.) lives in the
51
- * app's concrete subclass for now — methods will be pulled up into this
52
- * base class incrementally as they are genericized.
45
+ * The abstract base class that application-specific sync stores extend. It
46
+ * carries the injected collaborators, the observable sync status, and the
47
+ * orchestration for initialization, delta processing, bootstrap, and the
48
+ * read and write API. A subclass supplies its own domain behavior by
49
+ * overriding the protected extension points defined here and by typing its
50
+ * collaboration events through the generic parameter.
53
51
  *
54
- * Subclasses MUST call `super(dependencies, config)` and then set up
55
- * their own MobX observables.
52
+ * A subclass must call `super(dependencies, config)` and then set up its own
53
+ * MobX observables.
56
54
  *
57
55
  * Generic over `TCollaboration` — an app-defined event map for real-time
58
56
  * collaboration events (cursors, selections, presence beyond the core set).
@@ -120,23 +118,23 @@ export class BaseSyncedStore {
120
118
  // ── Area-of-interest (dynamic read subscription) ─────────────────
121
119
  //
122
120
  // `enterScope`/`leaveScope` move the connection's read interest as the
123
- // user navigates (open/close a deck, sheet, doc); `pinScope`/`unpinScope`
121
+ // user navigates (open or close a deck, sheet, or doc); `pinScope`/`unpinScope`
124
122
  // express prominence (an active claim keeps a group subscribed). All four
125
- // resolve the scope to sync-group strings through the SAME resolver the
123
+ // resolve the scope to sync-group strings through the same resolver the
126
124
  // claim path uses (`resolveParticipantSyncGroups`), so read interest and
127
- // write claims always agree on the string for a given entity. No-ops
128
- // before the socket exists. Soft state — they never reject for an offline
129
- // transport (see `AreaOfInterestManager.reconcile`).
125
+ // write claims always agree on the string for a given entity. They are
126
+ // no-ops before the socket exists, and they never reject when the transport
127
+ // is offline (see {@link SubscriptionManager.reconcile}).
130
128
  scopeToGroups(scope) {
131
129
  return resolveParticipantSyncGroups(scope, this.schema);
132
130
  }
133
131
  /**
134
- * Bring a scope into view subscribe to its groups. With
135
- * `{ hydrate: true }`, ALSO backfill the groups' current state into the pool
136
- * after the subscription is active (the game "spawn snapshot + delta stream"
137
- * pattern): subscribe-first so no live delta is missed in the gap, then
138
- * snapshot. Hydration is soft — a failed backfill never rejects `enterScope`
139
- * and the live tail still flows.
132
+ * Bring a scope into view and subscribe to its sync groups. With
133
+ * `{ hydrate: true }`, also backfill the groups' current state into the pool
134
+ * once the subscription is active. The order matters: subscribing first
135
+ * guarantees no live delta is missed in the gap before the snapshot lands.
136
+ * Hydration is best-effort — a failed backfill never rejects `enterScope`,
137
+ * and the live delta stream keeps flowing regardless.
140
138
  */
141
139
  enterScope(scope, opts) {
142
140
  const mgr = this.areaOfInterest;
@@ -149,11 +147,11 @@ export class BaseSyncedStore {
149
147
  return subscribed.then(() => this.hydrateGroups(groups));
150
148
  }
151
149
  /**
152
- * Backfill the current state of `syncGroups` into the pool via a PURE scoped
153
- * snapshot fetch + the version-guarded, ghost-free scoped apply. Idempotent
154
- * (skips groups already hydrated) and single-flight (concurrent enters of the
155
- * same group share one fetch). Soft-fails: on error the groups are NOT marked
156
- * hydrated, so a later re-enter retries.
150
+ * Backfill the current state of `syncGroups` into the pool with a side-effect-free
151
+ * scoped snapshot fetch followed by the version-guarded scoped apply. The call
152
+ * is idempotent (it skips groups already hydrated) and single-flight (concurrent
153
+ * enters of the same group share one fetch). On error the groups are left
154
+ * unmarked, so a later re-enter retries.
157
155
  */
158
156
  async hydrateGroups(syncGroups) {
159
157
  const need = syncGroups.filter((g) => !this.hydratedGroups.has(g) && !this.hydratingGroups.has(g));
@@ -222,15 +220,9 @@ export class BaseSyncedStore {
222
220
  initialized = false;
223
221
  dataReady = false;
224
222
  // ── User context ──
225
- // Identity context the consumer wired in at construction. The shape
226
- // (`{userId, organizationId, teamIds}`) is currently a fixed contract
227
- // because the Go-era bootstrap protocol embedded those keys in scope
228
- // tokens; the SDK should eventually expose this as an opaque
229
- // `principal` blob so consumers with different identity models
230
- // aren't forced into user/org. See the architectural note in the
231
- // README — "currentUserId" is a domain concept, not an SDK
232
- // primitive, and the host (apps/web/SyncEngineProvider) is the
233
- // right place to surface it.
223
+ // The identity the consumer supplied to `initialize()`: user id,
224
+ // organization id, and optional team ids. Reads are scoped to this
225
+ // identity, and the sync-group subscription is derived from it.
234
226
  userContext = null;
235
227
  // ── Smart sync ──
236
228
  /**
@@ -272,18 +264,16 @@ export class BaseSyncedStore {
272
264
  this._syncServerUrl = dependencies.url;
273
265
  // Set this store as the global Model store
274
266
  Model.setStore(this);
275
- // ── Schema-derived sync plan (Phase 2) ─────────────────────────────
267
+ // ── Schema-derived sync plan ───────────────────────────────────────
276
268
  //
277
- // When a schema is provided, derive FK indexes and the enrichment
278
- // plan from declarative annotations on the schema's `belongsTo`
279
- // relations. Explicit config fields layer on top, so subclasses
280
- // (like Ablo's SyncedStore) can pass hardcoded arrays without
281
- // needing a full schema.generated.ts.
269
+ // When a schema is provided, derive foreign-key indexes and the
270
+ // enrichment plan from the declarative annotations on its `belongsTo`
271
+ // relations. Explicit config fields layer on top, so a subclass can
272
+ // pass hardcoded arrays without supplying a full schema.
282
273
  //
283
- // Order matters: schema-derived first, config second, so that in a
284
- // future where Ablo passes both (schema AND explicit config), the
285
- // explicit config entries are registered last and can't be
286
- // accidentally shadowed by schema derivation.
274
+ // Order matters: schema-derived entries are registered first and
275
+ // config entries second, so that when a caller supplies both, the
276
+ // explicit config entries win and are never shadowed by derivation.
287
277
  const derived = dependencies.schema
288
278
  ? deriveSyncPlanFromSchema(dependencies.schema)
289
279
  : { enrichmentPlan: [], foreignKeyIndexes: [] };
@@ -294,9 +284,8 @@ export class BaseSyncedStore {
294
284
  for (const { modelName, fieldName } of mergedForeignKeyIndexes) {
295
285
  this.objectPool.registerForeignKey(modelName, fieldName);
296
286
  }
297
- // Legacy override hook — still called AFTER schema-driven registration
298
- // so subclasses can add more FKs on top of the declarative set.
299
- // Kept for backwards compat; subclasses migrate to config at leisure.
287
+ // Override hook — called after schema-driven registration so a subclass
288
+ // can add more foreign keys on top of the declarative set.
300
289
  this.registerForeignKeys();
301
290
  this.enrichmentPlan = [
302
291
  ...derived.enrichmentPlan,
@@ -328,15 +317,13 @@ export class BaseSyncedStore {
328
317
  this.queryProcessor.invalidateCache(`.*${name}.*`);
329
318
  }
330
319
  });
331
- // Make sync status fields observable so consumer code can do
320
+ // Make the sync-status fields observable so consumer code can do
332
321
  // reaction(() => store.isReady, ...)
333
322
  // observer(() => store.isOffline)
334
323
  // and actually receive notifications. Without these annotations,
335
- // `syncStatus` / `dataReady` are plain properties and the derived
336
- // getters (isReady, isSyncing, isOffline, ...) never emit change
337
- // signals — a trap that has burned multiple downstream apps
338
- // (one stuck forever on the loading skeleton because `reaction`
339
- // to `store.isReady` never fired). Explicit > accidental.
324
+ // `syncStatus` and `dataReady` are plain properties, and the derived
325
+ // getters (isReady, isSyncing, isOffline, and the rest) never emit
326
+ // change signals — so a `reaction` on `store.isReady` would never fire.
340
327
  makeObservable(this, {
341
328
  syncStatus: observable,
342
329
  dataReady: observable,
@@ -350,17 +337,17 @@ export class BaseSyncedStore {
350
337
  }
351
338
  // ── Protected extension points ────────────────────────────────────────────
352
339
  /**
353
- * Register foreign key indexes for O(1) lookups.
340
+ * Register foreign-key indexes for constant-time lookups.
354
341
  *
355
- * Legacy override hook in Phase 2 the preferred way to declare FK
356
- * indexes is via `config.foreignKeyIndexes` at construction time, or
357
- * by marking the `belongsTo` relation with `{ index: true }` in the
358
- * schema. This hook still fires AFTER the schema-derived + config
359
- * registrations, so subclasses can layer additional FKs on top.
342
+ * This is an override hook. The preferred way to declare a foreign-key
343
+ * index is `config.foreignKeyIndexes` at construction time, or marking the
344
+ * `belongsTo` relation with `{ index: true }` in the schema. The hook fires
345
+ * after the schema-derived and config registrations, so a subclass can
346
+ * layer additional indexes on top.
360
347
  */
361
348
  registerForeignKeys() { }
362
349
  /**
363
- * Enrich delta data with related models from the ObjectPool.
350
+ * Enrich delta data with related models from the InstanceCache.
364
351
  *
365
352
  * Base implementation walks `this.enrichmentPlan` — entries populated
366
353
  * from the schema's `{ enrich: true }` relations and from
@@ -615,7 +602,7 @@ export class BaseSyncedStore {
615
602
  this.syncWebSocket?.disconnect();
616
603
  this.updateSyncStatus({ state: 'error', error: error });
617
604
  // SECURITY: Clear locally cached data when session is invalid
618
- this.database.clear().catch(() => { });
605
+ this.database.clear({ includeWriteJournal: true }).catch(() => { });
619
606
  this.objectPool.clear();
620
607
  return 'session_error';
621
608
  }
@@ -656,11 +643,12 @@ export class BaseSyncedStore {
656
643
  return this.credentialLifecycle.refresh();
657
644
  }
658
645
  /**
659
- * THE auth-recovery backbone for HTTP transports (lazy query lane etc.):
660
- * classify-driven single-flight re-mint with the same FSM outcome routing
661
- * the WS probe and proactive pre-roll use. `'retry'` ⇒ a fresh credential
662
- * is in the credential source, replay the request ONCE. Full contract on
663
- * {@link CredentialLifecycle.recoverFromAuthRejection}.
646
+ * The authentication-recovery path for HTTP transports, such as the lazy
647
+ * query lane. It runs a single-flight credential re-mint driven by the
648
+ * rejection's recovery class, routing outcomes through the same state
649
+ * machine the WebSocket probe uses. `'retry'` means a fresh credential is
650
+ * now in the credential source and the request should be replayed once.
651
+ * Full contract on {@link CredentialLifecycle.recoverFromAuthRejection}.
664
652
  */
665
653
  async recoverFromAuthRejection(recovery) {
666
654
  return this.credentialLifecycle.recoverFromAuthRejection(recovery);
@@ -676,11 +664,11 @@ export class BaseSyncedStore {
676
664
  this.connectionManager?.send({ type: 'CREDENTIAL_REFRESHED' });
677
665
  }
678
666
  /**
679
- * Install the access-credential lifecycle the CLIENT owns: register
680
- * `getToken` as the reactive re-mint hook AND arm the browser-only
681
- * proactive pre-roll (refresh timer + OS-wake re-mint). Idempotent
682
- * (a second call replaces the first); torn down on {@link disconnect}.
683
- * Full rationale on {@link CredentialLifecycle.start}.
667
+ * Install the client-owned access-credential lifecycle: register `getToken`
668
+ * as the reactive re-mint hook and arm the browser-only proactive refresh
669
+ * (a refresh timer plus an OS-wake re-mint). Idempotent — a second call
670
+ * replaces the first — and torn down on {@link disconnect}. Full rationale
671
+ * on {@link CredentialLifecycle.start}.
684
672
  */
685
673
  startCredentialLifecycle(getToken, opts) {
686
674
  this.credentialLifecycle.start(getToken, opts);
@@ -689,12 +677,12 @@ export class BaseSyncedStore {
689
677
  stopCredentialLifecycle() {
690
678
  this.credentialLifecycle.stop();
691
679
  }
692
- // ── Sync Group Management ────────────────────────────────────────────────
680
+ // ── Sync group management ────────────────────────────────────────────────
693
681
  //
694
- // Implementation extracted to sync/groupChange.ts. The methods below stay
695
- // as thin protected delegates with unchanged signatures — subclass
696
- // override points remain overridable, and the leaf routes cross-handler
697
- // calls back through `groupChangeContext()` so dynamic dispatch holds.
682
+ // The implementation lives in the sync/groupChange module. The methods
683
+ // below are thin protected delegates that keep their signatures, so
684
+ // subclass override points still work; the module routes cross-handler
685
+ // calls back through `groupChangeContext()` to preserve dynamic dispatch.
698
686
  /** Narrow context the group-change leaf talks back through. */
699
687
  groupChangeContext() {
700
688
  return {
@@ -726,8 +714,9 @@ export class BaseSyncedStore {
726
714
  return groupChange.handleGroupAdded(this.groupChangeContext(), payload, syncId);
727
715
  }
728
716
  /**
729
- * Handle an actionType 'S' (GroupRemoved) delta SECURITY clear of local
730
- * state + full re-bootstrap. See {@link groupChange.handleGroupRemoved}.
717
+ * Handle an actionType 'S' (GroupRemoved) delta: for safety, clear the
718
+ * revoked local state and trigger a full re-bootstrap. See
719
+ * {@link groupChange.handleGroupRemoved}.
731
720
  */
732
721
  async handleGroupRemoved(delta) {
733
722
  return groupChange.handleGroupRemoved(this.groupChangeContext(), delta);
@@ -758,10 +747,10 @@ export class BaseSyncedStore {
758
747
  }
759
748
  // ── Bootstrap apply ──────────────────────────────────────────────────────
760
749
  //
761
- // Implementation extracted to sync/bootstrapApply.ts. Thin protected
762
- // delegates below keep the signatures (and subclass overridability)
763
- // unchanged; the leaf talks back through `poolContext()` enrichment
764
- // stays pre-bound to `this.enrichRelations` so that override point holds.
750
+ // The implementation lives in the sync/bootstrapApply module. The protected
751
+ // delegates below keep their signatures and subclass overridability; the
752
+ // module talks back through `poolContext()`, with enrichment pre-bound to
753
+ // `this.enrichRelations` so that override point still applies.
765
754
  /** Narrow context the bootstrap-apply leaf talks back through. */
766
755
  poolContext() {
767
756
  const store = this;
@@ -777,8 +766,7 @@ export class BaseSyncedStore {
777
766
  applyDeltaFrame: (deltas) => { this.applyDeltaFrame(deltas); },
778
767
  };
779
768
  }
780
- /** Apply bootstrap data to the ObjectPool with ghost removal */
781
- /** Apply bootstrap data to the ObjectPool. Delegates pool writes to SyncClient. */
769
+ /** Apply bootstrap data to the {@link InstanceCache}, removing entities that are no longer present (ghost removal). Pool writes are delegated to {@link SyncClient}. */
782
770
  applyBootstrapToPool(bootstrapResult, protectedIds) {
783
771
  return bootstrapApply.applyBootstrapToPool(this.poolContext(), bootstrapResult, protectedIds);
784
772
  }
@@ -791,19 +779,15 @@ export class BaseSyncedStore {
791
779
  if (this.initialized)
792
780
  return { success: true };
793
781
  this.userContext = context;
794
- // Propagate identity to SyncClient. Without this, every mutation
795
- // silently drops in `processPendingMutations` / `stageMutation` with
796
- // `userId=null, organizationId=null`. Previously the SDK assumed
797
- // callers would call `syncClient.initialize()` themselves as a
798
- // separate step — that never happened from createSyncEngine, and
799
- // the drop was invisible because both guard sites just early-return
800
- // rather than throw. The right fix is to do it here where the store
801
- // receives the context, so identity is one source of truth.
802
- yield this.syncClient.initialize(context.userId, context.organizationId);
803
782
  try {
804
783
  this.updateSyncStatus({ state: 'syncing', progress: 0 });
805
- // Open database
784
+ // The commit outbox and offline mutation journal live in IndexedDB.
785
+ // Open it before SyncClient restores either one; reading first used to
786
+ // make persistence silently look empty on every cold start.
806
787
  yield this.database.open(context.userId, context.organizationId);
788
+ // Propagate identity only after storage is ready, then restore sealed
789
+ // requests before accepting fresh mutations.
790
+ yield this.syncClient.initialize(context.userId, context.organizationId);
807
791
  // Hydrate from IndexedDB (fast, cached data)
808
792
  let hasLocalData = false;
809
793
  try {
@@ -1146,7 +1130,7 @@ export class BaseSyncedStore {
1146
1130
  // connection. baseGroups (the org/user scopes) are always subscribed;
1147
1131
  // enterScope/leaveScope move per-entity interest. Recreated with the
1148
1132
  // socket; torn down via the disposer pushed below.
1149
- this.areaOfInterest = new AreaOfInterestManager({
1133
+ this.areaOfInterest = new SubscriptionManager({
1150
1134
  transport: this.syncWebSocket,
1151
1135
  baseGroups: this.resolveSyncGroups(context),
1152
1136
  });
@@ -1217,7 +1201,7 @@ export class BaseSyncedStore {
1217
1201
  this.updateSyncStatus({ state: 'error', error, isSessionError: true });
1218
1202
  // SECURITY: Clear IndexedDB data on session expiry.
1219
1203
  // When auth is revoked, locally cached data must not persist on disk.
1220
- this.database.clear().catch((clearErr) => {
1204
+ this.database.clear({ includeWriteJournal: true }).catch((clearErr) => {
1221
1205
  // consumer register: session ended, but cached data may remain on disk
1222
1206
  getContext().logger.error('Your session ended, but some locally cached data could not be cleared from this device.');
1223
1207
  getContext().logger.debug('[BaseSyncedStore] Failed to clear database on session error', clearErr);
@@ -1394,14 +1378,14 @@ export class BaseSyncedStore {
1394
1378
  this.disposers.push(unsubCreated, unsubCompleted, unsubFailed);
1395
1379
  this.syncWebSocket.connect();
1396
1380
  }
1397
- // ── Delta Processing Pipeline ─────────────────────────────────────────────
1381
+ // ── Delta processing pipeline ─────────────────────────────────────────────
1398
1382
  //
1399
- // Implementation extracted to sync/deltaPipeline.ts (dedup, enqueue
1400
- // bookkeeping, debounce, flush). The methods below stay as thin protected
1401
- // delegates with unchanged signatures, and the leaf routes every call to
1402
- // a protected override point back through `deltaPipelineContext` so
1403
- // subclass dynamic dispatch is preserved. `applyDeltaFrame` the
1404
- // authoritative-apply correctness seam deliberately stays here.
1383
+ // The implementation lives in the sync/deltaPipeline module (deduplication,
1384
+ // enqueue bookkeeping, debounce, flush). The methods below are thin protected
1385
+ // delegates with unchanged signatures, and the module routes every call to a
1386
+ // protected override point back through `deltaPipelineContext`, so subclass
1387
+ // dynamic dispatch is preserved. `applyDeltaFrame`, the authoritative-apply
1388
+ // correctness point, deliberately stays here.
1405
1389
  /** Memoized pipeline context — `enqueueDelta` runs once per delta, so the
1406
1390
  * accessor object is built once and reused (the get/set accessors always
1407
1391
  * read the live host fields). */
@@ -1464,35 +1448,36 @@ export class BaseSyncedStore {
1464
1448
  /**
1465
1449
  * Apply a complete, server-delivered delta frame atomically.
1466
1450
  *
1467
- * A `delta_batch` WS event (reconnect/catch-up replay) already carries
1468
- * the FULL set of missed deltas. Routing it through the per-delta
1469
- * `processDeltaWithBatching` path re-chunks it via the live-traffic
1470
- * debounce timer + `maxBatchSize` force-flush, so a 300-delta catch-up
1471
- * fans out into ~6 separate `flushPendingDeltas` cycles — each its own
1472
- * IDB write, pool mutation, `models:changed` emit, and React re-render.
1473
- * The decks gallery visibly re-sorts and "pops in" once per chunk.
1451
+ * A `delta_batch` WebSocket event (a reconnect or catch-up replay) already
1452
+ * carries the full set of missed deltas. Routing it through the per-delta
1453
+ * `processDeltaWithBatching` path would re-chunk it via the live-traffic
1454
+ * debounce timer and `maxBatchSize` force-flush, so a 300-delta catch-up
1455
+ * would fan out into several separate `flushPendingDeltas` cycles — each its
1456
+ * own local write, pool mutation, `models:changed` emit, and re-render, so
1457
+ * the UI visibly repaints once per chunk.
1474
1458
  *
1475
- * Here we run the per-delta bookkeeping (dedup, ack, version vector,
1476
- * watermark, G/S routing, D cascade) for every delta WITHOUT scheduling
1477
- * a flush, then flush ONCE — collapsing the whole frame into a single
1478
- * IDB write + pool mutation + `models:changed` + re-render. Same code
1479
- * for the post-bootstrap replay of deltas queued during bootstrap.
1459
+ * Instead, this runs the per-delta bookkeeping (deduplication, ack, version
1460
+ * vector, watermark, group-change routing, delete cascade) for every delta
1461
+ * without scheduling a flush, then flushes once — collapsing the whole frame
1462
+ * into a single local write, pool mutation, `models:changed` emit, and
1463
+ * re-render. The post-bootstrap replay of deltas queued during bootstrap
1464
+ * uses the same path.
1480
1465
  *
1481
- * (Named `applyDeltaFrame`, not `processDeltaBatch`, to avoid confusion
1482
- * with `Database.processDeltaBatch` — the lower-level IDB write this
1483
- * eventually drives through `flushPendingDeltas`.)
1466
+ * It is named `applyDeltaFrame`, not `processDeltaBatch`, to avoid confusion
1467
+ * with {@link Database.processDeltaBatch} — the lower-level local write this
1468
+ * eventually drives through `flushPendingDeltas`.
1484
1469
  */
1485
1470
  applyDeltaFrame(deltas) {
1486
1471
  let enqueuedAny = false;
1487
1472
  for (const delta of deltas) {
1488
- // A delta_batch frame is the server's AUTHORITATIVE, ordered answer to
1473
+ // A delta_batch frame is the server's authoritative, ordered answer to
1489
1474
  // "everything in my stream after cursor C" (reconnect/catch-up replay or
1490
- // post-bootstrap drain). Apply every delta it carries do NOT subject it
1475
+ // post-bootstrap drain). Apply every delta it carries; do not subject it
1491
1476
  // to the live-traffic watermark dedup (`id <= applied`).
1492
1477
  //
1493
1478
  // That watermark is only valid under in-order delivery, and reconnect
1494
- // breaks the assumption: an in-flight LIVE broadcast for a gap delta can
1495
- // land out of order BEFORE the catch-up fills the ids below it (e.g. the
1479
+ // breaks the assumption: an in-flight live broadcast for a gap delta can
1480
+ // land out of order before the catch-up fills the ids below it (e.g. the
1496
1481
  // server acks a write, then the test/client reconnects, then that write's
1497
1482
  // pending broadcast arrives on the fresh socket — id 4 live before the
1498
1483
  // catch-up's [2,3,4]). Applying id 4 advances `applied` to 4, and the
@@ -1565,16 +1550,15 @@ export class BaseSyncedStore {
1565
1550
  });
1566
1551
  }
1567
1552
  }
1568
- /** Flush pending deltas with deduplication and batched ObjectPool mutations */
1569
- /** Flush pending deltas with deduplication. Delegates pool writes to SyncClient. */
1553
+ /** Flush pending deltas with deduplication. Pool writes are delegated to {@link SyncClient}. */
1570
1554
  async flushPendingDeltas() {
1571
1555
  return deltaPipeline.flushPendingDeltas(this.deltaPipelineContext);
1572
1556
  }
1573
- // ── Core Mutations (thin delegation to SyncClient) ────────────────────────
1557
+ // ── Core mutations (thin delegation to SyncClient) ────────────────────────
1574
1558
  //
1575
- // BaseSyncedStore is an orchestrator, not an implementor.
1576
- // SyncClient owns: ObjectPool operations, TransactionQueue, IDB writes.
1577
- // BaseSyncedStore owns: validation, hooks, pending delete tracking.
1559
+ // This class orchestrates; it does not implement the writes. {@link SyncClient}
1560
+ // owns the object-pool operations, the transaction queue, and local writes.
1561
+ // This class owns validation, lifecycle hooks, and pending-delete tracking.
1578
1562
  /** Check if a model type is local-only (no sync). Override for domain-specific models. */
1579
1563
  isLocalOnlyModel(_modelName) {
1580
1564
  return false;
@@ -1646,9 +1630,9 @@ export class BaseSyncedStore {
1646
1630
  this.syncClient.update(model);
1647
1631
  }
1648
1632
  // ── Query API ────────────────────────────────────────────────────────────
1649
- // `store.query.<model>.*` was DELETED — `ablo.<model>.get/getAll` is the
1650
- // one read surface. Custom mutators still read transactionally through
1651
- // `tx.<model>` (mutators/Transaction.ts), which owns `createReaderActions`.
1633
+ // `ablo.<model>.get` / `ablo.<model>.getAll` is the read surface for
1634
+ // application code. Custom mutators read transactionally through
1635
+ // `tx.<model>`, backed by `createReaderActions`.
1652
1636
  /** Retrieve a single entity by id. Synchronous pool read. */
1653
1637
  retrieve(_modelClass, id) {
1654
1638
  return this.objectPool.get(id);
@@ -1692,10 +1676,10 @@ export class BaseSyncedStore {
1692
1676
  return this.objectPool.create(wireTypename, data);
1693
1677
  }
1694
1678
  /**
1695
- * Legacy class-based query entry point — kept for callers that still pass
1696
- * a Model constructor + options object. New code should use the typed
1697
- * `store.query.<modelKey>` namespace instead, which returns properly
1698
- * inferred schema types without needing a class value or cast.
1679
+ * Query entry point for callers that hold a {@link Model} constructor and an
1680
+ * options object. It filters, orders, and paginates the matching models from
1681
+ * the pool. Prefer the schema-typed read surface (`ablo.<model>.list`) where
1682
+ * you can, since it infers concrete row types without a class value or cast.
1699
1683
  */
1700
1684
  queryByClass(modelClass, options) {
1701
1685
  const modelName = this.objectPool.registry.getModelNameFromConstructor(modelClass);
@@ -1804,8 +1788,7 @@ export class BaseSyncedStore {
1804
1788
  return this.lastAckedId;
1805
1789
  }
1806
1790
  // ── Status convenience getters ──────────────────────────────────────────
1807
- // Thin wrappers over syncStatus for consumer ergonomics. Previously on
1808
- // SyncedStore; moved here so createSyncEngine consumers get them too.
1791
+ // Thin wrappers over `syncStatus` for consumer ergonomics.
1809
1792
  get isReady() {
1810
1793
  // Ready if: fully synced (idle + 100%) OR local data loaded (dataReady + syncing in background)
1811
1794
  return (this.syncStatus.state === 'idle' && this.syncStatus.progress >= 100)