@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,15 +1,15 @@
1
1
  /**
2
- * HTTP client for the generic /sync/query endpoint.
2
+ * The HTTP client for the sync query endpoint.
3
3
  *
4
- * Thin wrapper over fetch() that:
5
- * - POSTs a QueryBatch as JSON
6
- * - Sends the bearer credential via withAuthHeaders (Authorization header)
7
- * - Throws on non-2xx responses
8
- * - Parses the response into a typed QueryBatchResult
4
+ * {@link postQuery} is a small wrapper over `fetch` that POSTs a
5
+ * {@link QueryBatch} as JSON to `/sync/query`, attaches the bearer credential
6
+ * as an `Authorization` header, and parses the response into a typed
7
+ * {@link QueryBatchResult}. An HTTP failure is not thrown: it is logged, and
8
+ * every query in the batch comes back with an empty result, so a
9
+ * fire-and-forget caller cannot crash on an unhandled rejection.
9
10
  *
10
- * The higher-level BootstrapHelper methods (fetchDeckSlideLayers,
11
- * fetchChatMessages, etc.) use this to issue structured queries
12
- * without duplicating the fetch boilerplate.
11
+ * Higher-level query helpers build on this to issue structured queries without
12
+ * repeating the fetch and error-handling boilerplate.
13
13
  */
14
14
  import { z } from 'zod';
15
15
  import { translateHttpError } from '../errors.js';
@@ -18,12 +18,11 @@ import { withAuthHeaders } from '../auth/credentialSource.js';
18
18
  import { getContext } from '../context.js';
19
19
  // ── Response validation ─────────────────────────────────────────────────
20
20
  //
21
- // Each result slot is an array of rows (or an object for bundled
22
- // responses). Server-side per-query failures surface here as `[]`, but
23
- // the server logs them via `console.error('[query.error] ...')` alert
24
- // on that prefix, not on emptiness. Parsing through Zod normalizes
25
- // `null` slots into empty arrays so downstream callers never see raw
26
- // null.
21
+ // Each result slot is an array of rows, or an object for a bundled response.
22
+ // A per-query failure on the server surfaces here as an empty array rather
23
+ // than an error, so emptiness alone does not distinguish "no rows" from
24
+ // "the query failed." Parsing through Zod normalizes a `null` slot into an
25
+ // empty array, so callers never receive a raw null.
27
26
  const QueryResultSchema = z
28
27
  .union([z.array(z.unknown()), z.record(z.string(), z.unknown()), z.null()])
29
28
  .transform((val) => {
@@ -37,20 +36,24 @@ const QueryBatchResultSchema = z
37
36
  })
38
37
  .passthrough();
39
38
  /**
40
- * POST a batch of queries to /sync/query. Returns the parsed
41
- * QueryBatchResult. Throws a descriptive error on HTTP failure.
39
+ * Sends a batch of queries to `/sync/query` and returns the parsed
40
+ * {@link QueryBatchResult}. An HTTP failure is not thrown: it is logged, and
41
+ * every query in the batch comes back with an empty result, which keeps a
42
+ * fire-and-forget caller from crashing on an unhandled rejection. A 401 may
43
+ * first be handed to {@link PostQueryOptions.recoverCredential} for a single
44
+ * retry.
42
45
  *
43
- * The server guarantees results[i] corresponds to queries[i] in the
44
- * request callers can rely on index alignment to extract typed
45
- * results from a multi-query batch.
46
+ * The response preserves order: `results[i]` corresponds to the query at
47
+ * `queries[i]`, so callers can rely on index alignment to pull typed results
48
+ * out of a multi-query batch.
46
49
  */
47
50
  export async function postQuery(options, batch) {
48
51
  const url = `${options.baseUrl}/sync/query`;
49
52
  const timeout = options.fetchTimeout ?? 30_000;
50
- // At most TWO attempts: the original request, plus ONE replay after a
51
- // successful credential recovery (see `recoverCredential`). Bounded by
52
- // construction — a second auth rejection falls through to the log+empty
53
- // path, so a wedged credential can never retry-loop.
53
+ // At most two attempts: the original request, plus one replay after a
54
+ // successful credential recovery (see `recoverCredential`). A second auth
55
+ // rejection falls through to the log-and-empty path, so a wedged credential
56
+ // can never retry-loop.
54
57
  for (let attempt = 0;; attempt++) {
55
58
  // Race the fetch against a timeout so hung requests don't block
56
59
  // the calling helper indefinitely. Fresh controller per attempt.
@@ -67,13 +70,13 @@ export async function postQuery(options, batch) {
67
70
  signal: controller.signal,
68
71
  });
69
72
  if (!response.ok) {
70
- // Build the typed AbloError for this HTTP failure (same code→class
71
- // map the throwing paths use) so the log is tagged + carries a
72
- // registry `code` (e.g. AbloAuthenticationError/session_expired on a
73
- // 401) instead of a bare status. We deliberately DON'T throw —
74
- // fire-and-forget callers would kill the Next.js router on an
75
- // unhandled rejection and still return empty slots, but the failure
76
- // is now legible as an Ablo error.
73
+ // Build the typed AbloError for this HTTP failure (the same
74
+ // code-to-class map the throwing paths use) so the log carries a
75
+ // registry `code` for example an authentication error with
76
+ // `session_expired` on a 401 rather than a bare status. This path
77
+ // deliberately does not throw, since a fire-and-forget caller could
78
+ // crash on an unhandled rejection. It returns empty slots while still
79
+ // logging a legible Ablo error.
77
80
  let body = null;
78
81
  try {
79
82
  body = await response.clone().json();
@@ -82,13 +85,12 @@ export async function postQuery(options, batch) {
82
85
  // non-JSON error page — translateHttpError falls back to status text
83
86
  }
84
87
  const err = translateHttpError(response.status, body);
85
- // 401 hand the failure to the auth-recovery backbone, ONCE. The
86
- // class routes the decision: `access_credential_expiry` re-mints
87
- // silently and replays; `session_expiry` reports terminal session
88
- // loss (sign-out is the FSM's call, not ours); everything else stops.
89
- // A bare 401 with no readable code is classified as an expired access
90
- // key the NetworkProbe precedent: the only terminal path is the
91
- // re-mint itself resolving null, never an ambiguous status.
88
+ // On a 401, hand the failure to the recovery hook once. The recovery
89
+ // class routes the outcome: an expired access credential is re-minted
90
+ // and the request replays; a lost session is terminal and stops here;
91
+ // anything else stops. A bare 401 with no readable code is treated as
92
+ // an expired access credential, so the only terminal path is the
93
+ // re-mint itself coming back empty, never an ambiguous status.
92
94
  if (attempt === 0 && response.status === 401 && options.recoverCredential) {
93
95
  const recovery = typeof err.code === 'string'
94
96
  ? classifyRecovery(err.code)
@@ -101,11 +103,11 @@ export async function postQuery(options, batch) {
101
103
  continue;
102
104
  }
103
105
  }
104
- // Routed through the gated logger so it obeys ABLO_LOG_LEVEL like
105
- // everything else: a consumer-register `warn` (their models + the
106
- // typed message + a wire `code`) with the forensics on a `debug`
107
- // companion. Actionable and not self-healing the read returns
108
- // empty until the underlying cause (auth, network) is resolved.
106
+ // Logged through the level-gated logger, so it honors ABLO_LOG_LEVEL:
107
+ // a `warn` line the app developer can read (the models, the typed
108
+ // message, and a wire `code`), with the forensic detail on a companion
109
+ // `debug` line. The read stays empty until the underlying cause, such
110
+ // as auth or network, is resolved.
109
111
  const models = batch.queries.map((q) => q.model).join(', ');
110
112
  getContext().logger.warn(`Could not load ${models} — ${err.message} (code: ${err.code ?? response.status}). No results were returned.`);
111
113
  getContext().logger.debug('[postQuery.error] query http failure', {
@@ -1,44 +1,25 @@
1
1
  /**
2
- * Structured query types for the generic /sync/query endpoint.
2
+ * Structured query types for the `/sync/query` endpoint.
3
3
  *
4
- * Zero-shaped ZQL-ish wire format: `where` is a flat list of `[col, op, val]`
5
- * tuples (AND'd together), and `related` is a list of schema-declared
6
- * relation names to traverse. The server compiler reads the schema's
7
- * relation metadata to turn `related: ['layers']` into the right JOIN.
4
+ * A query describes a filtered read in a compact wire format. `where` is a flat
5
+ * list of `[column, operator, value]` conditions combined with AND, and
6
+ * `related` names the schema relations to fetch alongside each row. The server
7
+ * compiles a query against your schema: it reads the model's relation metadata
8
+ * to turn `related: ['layers']` into the right join, and turns each condition
9
+ * into a WHERE fragment. The protocol carries no model-specific logic, so
10
+ * adding a model or relation is a schema change rather than a server change.
8
11
  *
9
- * # Why this shape
10
- *
11
- * An earlier revision used equality-only `where: Record<string, unknown>`
12
- * plus a PK-only `ids: string[]` batch field. That worked for simple cases
13
- * but collapsed on two real workloads:
14
- *
15
- * 1. "Fetch all layers for these slide IDs" — the IDs are foreign keys
16
- * (`SlideLayer.slideId`), not primary keys. The old `ids` field
17
- * filtered on `id`, silently returning empty.
18
- *
19
- * 2. "Fetch all layers for this deck" — needs a JOIN through
20
- * `slides.deck_id → slide_layers.slide_id`. Equality-only `where` had
21
- * no way to express it, so the Go server hardcoded a dispatch case.
22
- *
23
- * Both are generic patterns ("batch by FK column", "filter via relation")
24
- * that should be first-class in the protocol, not model-specific escape
25
- * hatches on the server. This shape matches Zero's ZQL:
26
- *
27
- * - `where('slideId', 'IN', ids)` → `['slideId', 'IN', ids]`
28
- * - `.related('layers')` → `related: ['layers']`
29
- *
30
- * The server's compiler stays schema-driven: given a model name, it reads
31
- * the schema's declared relations to emit JOIN SQL, and given a `[col, op,
32
- * val]` tuple it emits a WHERE fragment — never a switch on specific model
33
- * names. Adding a new model or relation is a schema change, not a server
34
- * change.
12
+ * The `IN` operator lets you batch a read by any column, including a foreign
13
+ * key — for example, fetching every layer whose `slideId` falls in a set of
14
+ * ids.
35
15
  */
36
16
  /** Primitive operand types allowed in a where clause. */
37
17
  export type WherePrimitive = string | number | boolean | null;
38
18
  /**
39
- * Comparison operators. Mirrors Zero's ZQL set so client authors can
40
- * lean on familiar semantics and server compilers that already target
41
- * ZQL stay portable.
19
+ * The comparison operators a {@link WhereClause} may use: equality and
20
+ * inequality, ordering, set membership (`IN` / `NOT IN`), null checks
21
+ * (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
22
+ * matching (`LIKE`, `ILIKE`, and their negations).
42
23
  */
43
24
  export type WhereOp = '=' | '!=' | '<' | '<=' | '>' | '>=' | 'IN' | 'NOT IN' | 'IS' | 'IS NOT' | 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';
44
25
  /**
@@ -77,20 +58,17 @@ export interface Query {
77
58
  */
78
59
  model: string;
79
60
  /**
80
- * List of where clauses AND'd together. Empty or omitted means "no
81
- * filter" (still subject to server-side org scoping).
82
- *
83
- * Use `['col', 'IN', values]` to batch by any column — the old
84
- * primary-key-only `ids` field is subsumed by this form.
61
+ * The conditions to filter by, combined with AND. Empty or omitted returns
62
+ * every row the caller may see; reads are still scoped to the caller's
63
+ * organization on the server. Use `['col', 'IN', values]` to batch a read by
64
+ * any column.
85
65
  */
86
66
  where?: readonly WhereClause[];
87
67
  /**
88
- * Relation names declared in the schema for this model. The server's
89
- * compiler resolves each name via the schema's relation metadata
90
- * (`relation.hasMany` / `relation.belongsTo`) and emits the JOIN
91
- * SQL no model-specific dispatch on the server.
92
- *
93
- * Results come back as nested objects under the relation key:
68
+ * The relations to fetch with each row, named as they are declared on this
69
+ * model in the schema. The server resolves each name from the schema's
70
+ * relation metadata and joins the related rows in. They come back nested
71
+ * under the relation key:
94
72
  *
95
73
  * { __typename: 'Slide', id: '…', layers: [{ __typename: 'SlideLayer', … }] }
96
74
  */
@@ -119,25 +97,24 @@ export interface QueryBatch {
119
97
  /** Response body from POST /sync/query. */
120
98
  export interface QueryBatchResult {
121
99
  /**
122
- * Per-query results in request order. `results[i]` corresponds to
123
- * `queries[i]`. Each element is an array of rows for array-shaped
124
- * queries, or a bundled object for providers that return multiple
125
- * collections under named keys.
126
- *
127
- * Each row carries `__typename` for client-side model dispatch, plus
128
- * any `related` keys nested under the row.
100
+ * The result of each query, in request order: `results[i]` corresponds to
101
+ * `queries[i]`. Each element is an array of rows, or an object bundling
102
+ * several named row collections when the source returns more than one. Every
103
+ * row carries a `__typename` field naming its model, so callers can dispatch
104
+ * on it, along with any requested `related` rows nested under their relation
105
+ * key.
129
106
  *
130
- * Failed queries surface as empty arrays. The server logs them via
131
- * `console.error('[query.error] ...')` alert on that prefix rather
132
- * than trying to infer failure from empty results. A tagged-union
133
- * wire shape that forces caller acknowledgement is the right next
134
- * step once every `postQuery` consumer is updated at once.
107
+ * A query that fails on the server comes back as an empty array, which is
108
+ * indistinguishable from a query that simply matched nothing treat an empty
109
+ * result as "no rows", not as proof the query succeeded. The element type is
110
+ * `unknown` because one batch can mix row shapes, so narrow each result
111
+ * before use.
135
112
  */
136
113
  results: unknown[];
137
114
  /**
138
- * Server watermark observed after the batch ran. Public model reads
139
- * expose this as `stamp` and callers thread it into `commits.create({
140
- * readAt })` to reject stale writes.
115
+ * The server watermark observed after the batch ran. Model reads expose this
116
+ * as `stamp`, and callers thread it into `commits.create({ readAt })` so the
117
+ * server can reject a write built on stale data.
141
118
  */
142
119
  lastSyncId?: number;
143
120
  }
@@ -1,36 +1,16 @@
1
1
  /**
2
- * Structured query types for the generic /sync/query endpoint.
3
- *
4
- * Zero-shaped ZQL-ish wire format: `where` is a flat list of `[col, op, val]`
5
- * tuples (AND'd together), and `related` is a list of schema-declared
6
- * relation names to traverse. The server compiler reads the schema's
7
- * relation metadata to turn `related: ['layers']` into the right JOIN.
8
- *
9
- * # Why this shape
10
- *
11
- * An earlier revision used equality-only `where: Record<string, unknown>`
12
- * plus a PK-only `ids: string[]` batch field. That worked for simple cases
13
- * but collapsed on two real workloads:
14
- *
15
- * 1. "Fetch all layers for these slide IDs" — the IDs are foreign keys
16
- * (`SlideLayer.slideId`), not primary keys. The old `ids` field
17
- * filtered on `id`, silently returning empty.
18
- *
19
- * 2. "Fetch all layers for this deck" — needs a JOIN through
20
- * `slides.deck_id → slide_layers.slide_id`. Equality-only `where` had
21
- * no way to express it, so the Go server hardcoded a dispatch case.
22
- *
23
- * Both are generic patterns ("batch by FK column", "filter via relation")
24
- * that should be first-class in the protocol, not model-specific escape
25
- * hatches on the server. This shape matches Zero's ZQL:
26
- *
27
- * - `where('slideId', 'IN', ids)` → `['slideId', 'IN', ids]`
28
- * - `.related('layers')` → `related: ['layers']`
29
- *
30
- * The server's compiler stays schema-driven: given a model name, it reads
31
- * the schema's declared relations to emit JOIN SQL, and given a `[col, op,
32
- * val]` tuple it emits a WHERE fragment — never a switch on specific model
33
- * names. Adding a new model or relation is a schema change, not a server
34
- * change.
2
+ * Structured query types for the `/sync/query` endpoint.
3
+ *
4
+ * A query describes a filtered read in a compact wire format. `where` is a flat
5
+ * list of `[column, operator, value]` conditions combined with AND, and
6
+ * `related` names the schema relations to fetch alongside each row. The server
7
+ * compiles a query against your schema: it reads the model's relation metadata
8
+ * to turn `related: ['layers']` into the right join, and turns each condition
9
+ * into a WHERE fragment. The protocol carries no model-specific logic, so
10
+ * adding a model or relation is a schema change rather than a server change.
11
+ *
12
+ * The `IN` operator lets you batch a read by any column, including a foreign
13
+ * key for example, fetching every layer whose `slideId` falls in a set of
14
+ * ids.
35
15
  */
36
16
  export {};
@@ -213,7 +213,7 @@ export declare function useSync<R extends SchemaRecord = SchemaRecord>(): Ablo<R
213
213
  /**
214
214
  * Returns the underlying `SyncStoreContract` (the BaseSyncedStore).
215
215
  * Most consumers should prefer the typed hooks (`useQuery` etc.); this
216
- * is for advanced cases like direct ObjectPool access or custom
216
+ * is for advanced cases like direct InstanceCache access or custom
217
217
  * reactive bridges. Throws if the provider hasn't mounted the store
218
218
  * yet — wrap consumers in `<ClientSideSuspense>` to gate correctly.
219
219
  *
@@ -266,7 +266,7 @@ export function useWatch(opts) {
266
266
  // Subscribe the connection to the scope's sync groups while mounted +
267
267
  // connected — the area-of-interest navigation primitive. No claim, no
268
268
  // TTL: a viewer just receives the scope's deltas. Hysteresis (warm TTL)
269
- // lives in the store's AreaOfInterestManager, so a quick unmount/remount
269
+ // lives in the store's SubscriptionManager, so a quick unmount/remount
270
270
  // (tab flip) doesn't re-bootstrap.
271
271
  useEffect(() => {
272
272
  const scope = opts.scope;
@@ -431,7 +431,7 @@ export function useSync() {
431
431
  /**
432
432
  * Returns the underlying `SyncStoreContract` (the BaseSyncedStore).
433
433
  * Most consumers should prefer the typed hooks (`useQuery` etc.); this
434
- * is for advanced cases like direct ObjectPool access or custom
434
+ * is for advanced cases like direct InstanceCache access or custom
435
435
  * reactive bridges. Throws if the provider hasn't mounted the store
436
436
  * yet — wrap consumers in `<ClientSideSuspense>` to gate correctly.
437
437
  *
@@ -4,55 +4,52 @@ import type { SyncStoreContract } from '../core/storeContract.js';
4
4
  export type { SyncStoreContract, LocalMutation } from '../core/storeContract.js';
5
5
  export interface SyncReactContext {
6
6
  store: SyncStoreContract;
7
- /** Current organization ID for default entity context */
7
+ /** The organization id used as the default scope for reads and writes. */
8
8
  organizationId: string;
9
9
  /**
10
- * Optional schema reference. When set, compatibility hook overloads
11
- * (`useQuery('tasks')`, `useOne('tasks', id)`, etc.) resolve their
12
- * model metadata from this schema consumers don't pass `schema` at
13
- * every call site. When absent, hooks fall back to the legacy
14
- * `(schema, modelKey, …)` signatures so non-opting consumers keep
15
- * working unchanged.
10
+ * An optional schema. When provided, hooks that take a model by name (such as
11
+ * `useQuery('tasks')`) read that model's metadata from this schema, so
12
+ * callers don't pass a schema at every call site. When omitted, those hooks
13
+ * require the schema as an argument instead.
16
14
  *
17
- * The stored reference is untyped here (`Schema` with default
18
- * parameters) because the React context is a single runtime value
19
- * shared by every hook. The compile-time types flow from the
20
- * consumer's `declare module '@abloatai/ablo' { interface Register { Schema: ... } }`
21
- * augmentation see `src/types/global.ts`.
15
+ * The field is loosely typed here because a single runtime context value is
16
+ * shared by every hook. Precise per-model types come from your `Register`
17
+ * module augmentation
18
+ * (`declare module '@abloatai/ablo' { interface Register { Schema: typeof schema } }`),
19
+ * not from this reference.
22
20
  */
23
21
  schema?: Schema;
24
22
  }
25
23
  export declare const SyncContext: import("react").Context<SyncReactContext | null>;
26
24
  /**
27
- * Access the sync store from React components. The context is provided by
28
- * `<AbloProvider>` (which renders the internal {@link SyncProvider}); public
29
- * consumers wire `<AbloProvider client={ablo}>`, never this directly.
25
+ * Reads the sync store context from inside a provider subtree, throwing a clear
26
+ * error when no provider is mounted above. `<AbloProvider>` supplies this
27
+ * context by rendering the internal {@link SyncProvider}; you wire
28
+ * `<AbloProvider client={ablo}>` rather than touching this directly.
30
29
  */
31
30
  export declare function useSyncContext(): SyncReactContext;
32
31
  /**
33
32
  * Props for SyncProvider.
34
33
  */
35
34
  export interface SyncProviderProps {
36
- /** The sync store (must implement SyncStoreContract). */
35
+ /** The sync store, which must implement {@link SyncStoreContract}. */
37
36
  store: SyncStoreContract;
38
- /** Current organization ID for default entity context. */
37
+ /** The organization id used as the default scope for reads and writes. */
39
38
  organizationId: string;
40
39
  /**
41
- * Optional schema. Wire this when you want compatibility string-keyed hooks
42
- * (`useQuery('tasks')`) the schema type also narrows via the
43
- * consumer's `Register` registration. Omit to keep hooks on
44
- * their legacy `(schema, modelKey, …)` signatures.
40
+ * An optional schema. Provide it to enable hooks that take a model by name
41
+ * (such as `useQuery('tasks')`); the model types also narrow through your
42
+ * `Register` augmentation. Omit it to pass the schema to those hooks directly
43
+ * instead.
45
44
  */
46
45
  schema?: Schema;
47
46
  children?: ReactNode;
48
47
  }
49
48
  /**
50
- * SyncProvider — the INTERNAL low-level provider that wires a built sync store
51
- * into React so SDK hooks (useModel, useModels, useMutations) can reach it.
52
- *
53
- * Public consumers do NOT use this directly (it is not exported from
54
- * `@abloatai/ablo/react`). `<AbloProvider client={ablo}>` constructs the
55
- * store from your `Ablo({ schema, apiKey })` client and renders this provider
56
- * underneath — reach for `<AbloProvider>`.
49
+ * A low-level provider that places a built sync store on React context so the
50
+ * data hooks can reach it. This is an internal building block: it is not part
51
+ * of the package's public entry point. Reach for `<AbloProvider>` instead,
52
+ * which builds the store from your `Ablo({ schema, apiKey })` client and
53
+ * renders this provider underneath.
57
54
  */
58
55
  export declare function SyncProvider({ store, organizationId, schema, children, }: SyncProviderProps): import("react").FunctionComponentElement<import("react").ProviderProps<SyncReactContext | null>>;
@@ -3,9 +3,10 @@ import { createContext, createElement, useContext } from 'react';
3
3
  import { AbloValidationError } from '../errors.js';
4
4
  export const SyncContext = createContext(null);
5
5
  /**
6
- * Access the sync store from React components. The context is provided by
7
- * `<AbloProvider>` (which renders the internal {@link SyncProvider}); public
8
- * consumers wire `<AbloProvider client={ablo}>`, never this directly.
6
+ * Reads the sync store context from inside a provider subtree, throwing a clear
7
+ * error when no provider is mounted above. `<AbloProvider>` supplies this
8
+ * context by rendering the internal {@link SyncProvider}; you wire
9
+ * `<AbloProvider client={ablo}>` rather than touching this directly.
9
10
  */
10
11
  export function useSyncContext() {
11
12
  const ctx = useContext(SyncContext);
@@ -17,13 +18,11 @@ export function useSyncContext() {
17
18
  return ctx;
18
19
  }
19
20
  /**
20
- * SyncProvider — the INTERNAL low-level provider that wires a built sync store
21
- * into React so SDK hooks (useModel, useModels, useMutations) can reach it.
22
- *
23
- * Public consumers do NOT use this directly (it is not exported from
24
- * `@abloatai/ablo/react`). `<AbloProvider client={ablo}>` constructs the
25
- * store from your `Ablo({ schema, apiKey })` client and renders this provider
26
- * underneath — reach for `<AbloProvider>`.
21
+ * A low-level provider that places a built sync store on React context so the
22
+ * data hooks can reach it. This is an internal building block: it is not part
23
+ * of the package's public entry point. Reach for `<AbloProvider>` instead,
24
+ * which builds the store from your `Ablo({ schema, apiKey })` client and
25
+ * renders this provider underneath.
27
26
  */
28
27
  export function SyncProvider({ store, organizationId, schema, children, }) {
29
28
  return createElement(SyncContext.Provider, { value: { store, organizationId, schema } }, children);
@@ -1,48 +1,47 @@
1
1
  /**
2
- * @abloatai/ablo/react — React bindings (v0.3.0)
2
+ * React bindings for `@abloatai/ablo`.
3
3
  *
4
- * Umbrella provider:
5
- * const ablo = Ablo({ schema, apiKey }) // build once — module scope or useMemo
4
+ * # Provider
5
+ *
6
+ * Build a client once — at module scope or with `useMemo` — and wrap your tree:
7
+ *
8
+ * const ablo = Ablo({ schema, apiKey })
6
9
  * <AbloProvider client={ablo} fallback={<Skeleton/>}>
7
- * — `client` is the only required prop (construct it yourself; the provider
8
- * is the thin reactive binding, like `<Elements stripe={...}>`). `userId`
9
- * is optional + informational. Owns sync engine + multiplayer lifecycle;
10
- * the `fallback` prop
11
- * gates children on first bootstrap. Pass `fallback="passthrough"`
12
- * to disable the gate.
13
- * <ClientSideSuspense fallback={<Skeleton/>}> — NESTED gate inside an
14
- * already-ready provider. Use only when you need a separate gate
15
- * for a heavy subtree (e.g. a canvas) while app chrome renders
16
- * immediately. The provider-level `fallback` is the default path.
17
- *
18
- * Data hooks:
19
- * useAblo((ablo) => ablo.tasks.get(id)) — primary React read API (sync local snapshot)
20
- * useAblo() — typed client for callbacks/effects
21
- * (sync local reads: ablo.<model>.get/getAll;
22
- * async server reads: ablo.<model>.retrieve/list;
23
- * writes: ablo.<model>.create/update/delete)
24
- * useMutators(defs, opts?) — Zero-style custom mutators
25
- * useUndoScope(name) — per-surface undo/redo
26
- *
27
- * Status + errors:
28
- * useSyncStatus() — tagged-union lifecycle snapshot
29
- * useErrorListener(cb) — imperative error callback (Sentry/Datadog)
30
- * useCurrentUserId() — the provider's userId prop
31
- *
32
- * Multiplayer (always available `<AbloProvider>` always constructs a client):
33
- * useAblo((ablo) => ablo.<model>.claim.state(...)) reactive coordination reads
34
- * useWatch({ scope }) — join multiplayer for a scope, get peers/claims
35
- *
36
- * ── Breaking changes from v0.2.x ───────────────────────────────────
37
- * Removed: <SyncProvider>, SyncContext, useSyncContext folded into
38
- * <AbloProvider>. Access the raw engine with `useSync()`.
39
- * Removed: createAbloContext() factory + its returned AbloProvider —
40
- * multiplayer is now always-on inside <AbloProvider>. Schema-typed
41
- * participant hooks ship in a follow-up release.
42
- * Removed: withSync (no-op alias of observer). Import observer
43
- * from mobx-react-lite directly if you still need it.
44
- * Changed: useSyncStatus() now returns a discriminated union. See the
45
- * migration notes in CHANGELOG.md.
10
+ *
11
+ * `client` is the only required prop; you construct it, and the provider is the
12
+ * thin reactive binding around it. The provider owns the sync-engine and
13
+ * multiplayer lifecycle. Its `fallback` gates children until the first sync
14
+ * bootstrap completes pass `fallback="passthrough"` to render children
15
+ * immediately. `userId` is optional and informational.
16
+ *
17
+ * {@link ClientSideSuspense} adds a nested gate inside an already-ready
18
+ * provider. Reach for it only when a heavy subtree, such as a canvas, needs its
19
+ * own gate while the rest of the app renders right away; the provider-level
20
+ * `fallback` is the usual path.
21
+ *
22
+ * # Data hooks
23
+ *
24
+ * useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
25
+ * useAblo() — the typed client, for callbacks and effects:
26
+ * synchronous local reads (`ablo.<model>.get`/`getAll`),
27
+ * async server reads (`retrieve`/`list`),
28
+ * and writes (`create`/`update`/`delete`)
29
+ * useMutators(defs, opts?) — define custom mutators
30
+ * useUndoScope(name) — per-surface undo and redo
31
+ *
32
+ * # Status and errors
33
+ *
34
+ * useSyncStatus() — a discriminated-union snapshot of the sync lifecycle
35
+ * useErrorListener(cb) — an imperative error callback, for telemetry or toasts
36
+ * useCurrentUserId() the provider's `userId` prop
37
+ *
38
+ * # Multiplayer
39
+ *
40
+ * Multiplayer is always available, because `<AbloProvider>` always constructs a
41
+ * client:
42
+ *
43
+ * useAblo((ablo) => ablo.<model>.claim.state(...)) — reactive coordination reads
44
+ * useWatch({ scope }) — join a scope to get its peers and claims
46
45
  */
47
46
  export type { DefaultSyncShape, ResolveSchema, ResolvePresence, ResolveClaims, ResolveUserMeta, ResolveModelKey, } from '../types/global.js';
48
47
  export { AbloProvider, useWatch, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseWatchOptions, type UseWatchReturn, type MeshParticipantStatus, } from './AbloProvider.js';