@abloatai/ablo 0.25.0 → 0.27.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 (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,174 +1,55 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { Model } from '../Model.js';
3
- import type { ModelScope } from '../types/index.js';
4
- import type { QueryView, QueryViewOptions } from '../core/QueryView.js';
5
- import type { ViewRegistry } from '../core/ViewRegistry.js';
6
2
  import type { Schema } from '../schema/schema.js';
7
- import type { SyncStatus } from '../BaseSyncedStore.js';
8
- import type { ParticipantScope } from '../sync/participants.js';
9
- /**
10
- * A single LOCAL mutation as observed off the commit stream — the substrate
11
- * the undo system records from. One is emitted per local create/update/
12
- * delete/archive (remote/collaborator deltas never appear here: they apply
13
- * through a separate pool path that doesn't queue mutations). `previousData`
14
- * holds the pre-edit field values (captured from the model's
15
- * `modifiedProperties` first-old-wins baseline), so an inverse op is fully
16
- * derivable from the event alone — no separate snapshot pass.
17
- *
18
- * This mirrors how Yjs's `UndoManager` derives reverse-ops by observing the
19
- * doc and Liveblocks' `room.history` records room ops: undo listens to the
20
- * one place all local writes converge, rather than wrapping the write call.
21
- */
22
- export interface LocalMutation {
23
- type: 'create' | 'update' | 'delete' | 'archive' | 'unarchive';
24
- /** Registered model name (e.g. `'SlideLayer'`); resolved to a schema key by the recorder. */
25
- modelName: string;
26
- modelId: string;
27
- /** New field values (create/update). */
28
- data?: Record<string, unknown> | null;
29
- /** Pre-edit field values (update → inverse patch; delete → full re-create row). */
30
- previousData?: Record<string, unknown> | null;
31
- }
32
- /**
33
- * Minimal store interface that the SDK hooks need.
34
- * Consumers provide their concrete store (e.g., SyncedStore) that implements this.
35
- */
36
- export interface SyncStoreContract {
37
- /**
38
- * Subscribe to the LOCAL mutation stream (optimistic, pre-ack) for undo
39
- * recording. Optional so minimal test doubles can omit it — when absent,
40
- * undo scopes simply record nothing. The concrete store
41
- * (`BaseSyncedStore`) wires this to the TransactionQueue's
42
- * `transaction:created` event. Returns an unsubscribe function.
43
- */
44
- subscribeLocalMutations?(handler: (mutation: LocalMutation) => void): () => void;
45
- retrieve(modelClass: abstract new (...args: never[]) => Model, id: string): Model | undefined;
46
- queryByClass(modelClass: abstract new (...args: never[]) => Model, options?: {
47
- predicate?: (model: Model) => boolean;
48
- scope?: ModelScope;
49
- orderBy?: keyof Model;
50
- order?: 'asc' | 'desc';
51
- limit?: number;
52
- offset?: number;
53
- }): {
54
- data: Model[];
55
- };
56
- /**
57
- * Save (create or update) one entity. Calling `save` in a tight loop
58
- * produces a single wire commit with one `batchIndex`: the SyncClient
59
- * debounces IDB persistence and the server push to one microtask, and
60
- * TransactionQueue coalesces every transaction staged in the tick into
61
- * one batch. There is intentionally no `saveMany` — Zero, Replicache,
62
- * and the rest of the local-first lineage all expose one-row writes
63
- * and rely on the implicit tick boundary.
64
- *
65
- * `skipValidation` exists for trusted bulk paths (AI sandbox layer
66
- * generation, PPTX import, hydration) where the producer has already
67
- * type-checked and per-row Zod is a measurable cost.
68
- */
69
- save(model: Model, options?: {
70
- skipValidation?: boolean;
71
- }): Promise<void>;
72
- delete(model: Model): Promise<void>;
73
- archive(model: Model): Promise<void>;
74
- unarchive(model: Model): Promise<void>;
75
- /** The ObjectPool — for entity/collection lookups by ID or typename. */
76
- pool: {
77
- get(id: string): Model | undefined;
78
- getByTypeName(typename: string, scope?: ModelScope): Model[];
79
- getByForeignKey(modelName: string, fieldName: string, fieldValue: string): Model[];
80
- createFromData(data: Record<string, unknown>): Model | null;
81
- hasForeignKeyIndex(typename: string, fieldName: string): boolean;
82
- createView<T extends Record<string, unknown>>(typename: string, options?: QueryViewOptions<T>): QueryView<T>;
83
- viewRegistry: ViewRegistry;
84
- };
85
- /**
86
- * Reactive sync-status getters. Powered by MobX `computed` inside
87
- * `BaseSyncedStore`, so they're safe to read in `observer` components
88
- * and inside `reaction(() => store.isReady, ...)`. Consumers that
89
- * don't want to touch MobX should prefer the `useSyncStatus()` hook.
90
- */
91
- readonly isReady: boolean;
92
- readonly isSyncing: boolean;
93
- readonly isOffline: boolean;
94
- readonly isReconnecting: boolean;
95
- readonly isError: boolean;
96
- readonly hasUnsyncedChanges: boolean;
97
- /**
98
- * Area-of-interest (dynamic read subscription). `enterScope`/`leaveScope`
99
- * move the connection's read interest as the user navigates (open/close a
100
- * deck, sheet, doc); `pinScope`/`unpinScope` express prominence (an active
101
- * claim keeps a group subscribed). Each resolves the scope through the same
102
- * resolver the claim path uses, so read interest and write claims agree on
103
- * the sync-group string. Optional so minimal test doubles can omit them;
104
- * no-ops before the socket exists. The concrete store (`BaseSyncedStore`)
105
- * forwards to its `AreaOfInterestManager`.
106
- */
107
- enterScope?(scope: ParticipantScope, opts?: {
108
- hydrate?: boolean;
109
- }): Promise<void>;
110
- leaveScope?(scope: ParticipantScope): Promise<void>;
111
- pinScope?(scope: ParticipantScope): Promise<void>;
112
- unpinScope?(scope: ParticipantScope): Promise<void>;
113
- /**
114
- * Raw MobX-observable `SyncStatus` record. `useSyncStatus()` reads
115
- * `state`, `progress`, `pendingChanges`, `isSessionError`, `error`
116
- * from this to build its tagged union. Exposed on the contract so
117
- * consumer-facing hooks and test doubles can manipulate it directly.
118
- */
119
- readonly syncStatus: SyncStatus;
120
- }
3
+ import type { SyncStoreContract } from '../core/storeContract.js';
4
+ export type { SyncStoreContract, LocalMutation } from '../core/storeContract.js';
121
5
  export interface SyncReactContext {
122
6
  store: SyncStoreContract;
123
- /** Current organization ID for default entity context */
7
+ /** The organization id used as the default scope for reads and writes. */
124
8
  organizationId: string;
125
9
  /**
126
- * Optional schema reference. When set, compatibility hook overloads
127
- * (`useQuery('tasks')`, `useOne('tasks', id)`, etc.) resolve their
128
- * model metadata from this schema consumers don't pass `schema` at
129
- * every call site. When absent, hooks fall back to the legacy
130
- * `(schema, modelKey, …)` signatures so non-opting consumers keep
131
- * 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.
132
14
  *
133
- * The stored reference is untyped here (`Schema` with default
134
- * parameters) because the React context is a single runtime value
135
- * shared by every hook. The compile-time types flow from the
136
- * consumer's `declare module '@abloatai/ablo' { interface Register { Schema: ... } }`
137
- * 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.
138
20
  */
139
21
  schema?: Schema;
140
22
  }
141
23
  export declare const SyncContext: import("react").Context<SyncReactContext | null>;
142
24
  /**
143
- * Access the sync store from React components. The context is provided by
144
- * `<AbloProvider>` (which renders the internal {@link SyncProvider}); public
145
- * 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.
146
29
  */
147
30
  export declare function useSyncContext(): SyncReactContext;
148
31
  /**
149
32
  * Props for SyncProvider.
150
33
  */
151
34
  export interface SyncProviderProps {
152
- /** The sync store (must implement SyncStoreContract). */
35
+ /** The sync store, which must implement {@link SyncStoreContract}. */
153
36
  store: SyncStoreContract;
154
- /** Current organization ID for default entity context. */
37
+ /** The organization id used as the default scope for reads and writes. */
155
38
  organizationId: string;
156
39
  /**
157
- * Optional schema. Wire this when you want compatibility string-keyed hooks
158
- * (`useQuery('tasks')`) the schema type also narrows via the
159
- * consumer's `Register` registration. Omit to keep hooks on
160
- * 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.
161
44
  */
162
45
  schema?: Schema;
163
46
  children?: ReactNode;
164
47
  }
165
48
  /**
166
- * SyncProvider — the INTERNAL low-level provider that wires a built sync store
167
- * into React so SDK hooks (useModel, useModels, useMutations) can reach it.
168
- *
169
- * Public consumers do NOT use this directly (it is not exported from
170
- * `@abloatai/ablo/react`). `<AbloProvider client={ablo}>` constructs the
171
- * store from your `Ablo({ schema, apiKey })` client and renders this provider
172
- * 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.
173
54
  */
174
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';
@@ -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
10
  *
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
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
26
37
  *
27
- * Status + errors:
28
- * useSyncStatus() — tagged-union lifecycle snapshot
29
- * useErrorListener(cb) — imperative error callback (Sentry/Datadog)
30
- * useCurrentUserId() — the provider's userId prop
38
+ * # Multiplayer
31
39
  *
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
40
+ * Multiplayer is always available, because `<AbloProvider>` always constructs a
41
+ * client:
35
42
  *
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.
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
  // ── Umbrella provider + lifecycle hooks ────────────────────────────
48
47
  export { AbloProvider, useWatch, usePeers, useSync, useSyncStore, } from './AbloProvider.js';
@@ -1,34 +1,32 @@
1
1
  import type { Ablo } from '../client/Ablo.js';
2
2
  import type { SchemaRecord } from '../schema/schema.js';
3
3
  /**
4
- * Internal context populated by `<AbloProvider>`. Separate from
5
- * `SyncContext` (which carries the store + schema for the data
6
- * hooks) because these fields are owned by the umbrella provider
7
- * and don't belong on the raw `SyncStoreContract`.
8
- *
9
- * Consumers should NOT use this directly — access the fields via
10
- * the typed hooks (`useCurrentUserId`, `useErrorListener`, etc.).
4
+ * The context that `<AbloProvider>` populates for its own hooks. It is kept
5
+ * separate from the data-hook context, which carries the store and schema,
6
+ * because these fields belong to the provider rather than to the store. Read
7
+ * them through the typed hooks such as `useCurrentUserId` and
8
+ * `useErrorListener` rather than reaching into this context directly.
11
9
  */
12
10
  export interface AbloInternalContextValue {
13
11
  /**
14
- * Optional app user id when the application passed one. Hosted Ablo
15
- * identity is server-derived, so this may be null.
12
+ * The application user id, when your app passed one to `<AbloProvider>`. Sync
13
+ * identity is derived on the server from the API key, so this is `null`
14
+ * unless you set it, and it is not required for sync to work.
16
15
  */
17
16
  currentUserId: string | null;
18
- /** Subscribe to provider-level errors (engine errors, bootstrap failures, session issues). */
17
+ /** Subscribe to provider-level errors: engine errors, bootstrap failures, and session issues. */
19
18
  subscribeError: (listener: (error: Error) => void) => () => void;
20
- /** Fire an error to all subscribed listeners. Called internally by the provider. */
19
+ /** Emit an error to every subscribed listener. The provider calls this for you. */
21
20
  emitError: (error: Error) => void;
22
21
  /**
23
- * The SyncEngine proxy for this provider. `null` before bootstrap
24
- * resolves. Exposed through the internal context so `useSync()`
25
- * can return it without having to reach into the store the two
26
- * are sibling objects constructed together by `createSyncEngine`
27
- * and shouldn't be coerced through each other.
22
+ * The typed `Ablo` client for this provider, or `null` until the first sync
23
+ * bootstrap resolves. It is held here so `useSync()` can return it without
24
+ * reaching into the store; the client and the store are sibling objects, and
25
+ * neither is derived from the other.
28
26
  *
29
- * Typed as `Ablo<SchemaRecord>` on the context because
30
- * generics don't flow through React context. `useSync<R>()` widens
31
- * via its own generic runtime value is the concrete engine.
27
+ * It is typed loosely as `Ablo<SchemaRecord>` because generics do not flow
28
+ * through React context. `useSync<R>()` restores the precise type through its
29
+ * own generic; the runtime value is the fully typed client.
32
30
  */
33
31
  engine: Ablo<SchemaRecord> | null;
34
32
  }
@@ -3,11 +3,10 @@ import type { ModelOperations } from '../client/createModelProxy.js';
3
3
  import type { SchemaRecord } from '../schema/schema.js';
4
4
  import type { ResolveSchema } from '../types/global.js';
5
5
  /**
6
- * Resolved schema-record type for the consumer's app. Reads the
7
- * `Register` module augmentation if declared, falls back to the
8
- * loose `SchemaRecord` if not. This lets `useAblo()` produce a
9
- * fully typed engine handle without the consumer having to pass
10
- * `<(typeof schema)['models']>` at every call site.
6
+ * The app's resolved schema-record type. It reads your `Register` module
7
+ * augmentation when you declare one and falls back to the loose
8
+ * {@link SchemaRecord} otherwise, so `useAblo()` returns a fully typed client
9
+ * without you passing `<(typeof schema)['models']>` at every call site.
11
10
  */
12
11
  type DefaultModels = ResolveSchema extends {
13
12
  models: infer M;
@@ -16,48 +15,50 @@ type ModelClientSelector<R extends SchemaRecord, T, C> = (ablo: Ablo<R>) => Mode
16
15
  type AbloSelector<R extends SchemaRecord, T> = (ablo: Ablo<R>) => T;
17
16
  export interface UseAbloModelOptions<T> {
18
17
  /**
19
- * Initial row, usually from a Server Component or loader. The hook returns it
20
- * until the model client has a newer row in the local pool.
18
+ * An initial row, usually from a server component or a route loader. The hook
19
+ * returns it until sync delivers a newer row for the same id.
21
20
  */
22
21
  readonly initial?: T;
23
22
  }
24
23
  export interface UseAbloModelResult<T> {
25
- /** Current row for the id, or `initial` until the row has hydrated. */
24
+ /** The current row for the id, or `initial` until the row has synced. */
26
25
  readonly data: T | undefined;
27
- /** Active work claims on this model row. */
26
+ /** The work claims currently held on this row by any participant. */
28
27
  readonly claims: readonly ModelClaim[];
29
- /** Convenience flag for disabling UI while another participant is active. */
28
+ /** True while another participant holds a claim handy for disabling UI. */
30
29
  readonly claimed: boolean;
31
30
  }
32
31
  export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'> & {
33
32
  readonly data: T;
34
33
  };
35
34
  /**
36
- * useAblo access the typed engine instance, or subscribe to a specific
37
- * `ablo.<model>` row from inside an `<AbloProvider>` subtree.
35
+ * Reads Ablo from inside an `<AbloProvider>` subtree. Called with no arguments
36
+ * it returns the typed client for use in callbacks and effects; called with a
37
+ * selector it subscribes the component to a reactive read — such as one
38
+ * `ablo.<model>` row — and re-renders when that read changes.
38
39
  *
39
- * Zero-arg when the consumer declares the `Register` global
40
- * augmentation (`declare module '@abloatai/ablo' { interface Register { Schema:
41
- * typeof schema } }`). The default generic resolves through
42
- * `ResolveSchema['models']` so call sites stay clean:
40
+ * You can call it with no type arguments once you declare the `Register` module
41
+ * augmentation (`declare module '@abloatai/ablo' { interface Register {
42
+ * Schema: typeof schema } }`); the default type then resolves through your
43
+ * schema's models, so call sites stay clean:
43
44
  *
44
45
  * ```ts
45
- * // With Register augmentation (recommended):
46
+ * // With the Register augmentation (recommended):
46
47
  * const ablo = useAblo();
47
48
  * if (!ablo) return <Loading />;
48
49
  * const doc = await ablo.documents.retrieve({ id }); // async server read
49
50
  *
50
- * // Reactive selector (sync local-graph snapshot):
51
+ * // Reactive selector (a synchronous local snapshot):
51
52
  * const doc = useAblo((ablo) => ablo.documents.get(id)) ?? serverDoc;
52
53
  * const active = useAblo((ablo) => ablo.documents.claim.state({ id }));
53
54
  *
54
- * // Without augmentation, pass the schema generic:
55
+ * // Without the augmentation, pass the schema as a type argument:
55
56
  * const ablo = useAblo<(typeof schema)['models']>();
56
57
  * ```
57
58
  *
58
- * Returns `null` while the engine is bootstrapping. Branch on null
59
- * and render a loading state (or use `useSyncStatus()` to gate on
60
- * `'connected'`) before reaching for model methods.
59
+ * The no-argument form returns `null` while the engine is still bootstrapping.
60
+ * Branch on `null` and render a loading state or gate on `useSyncStatus()`
61
+ * reaching `'connected'` before calling model methods.
61
62
  */
62
63
  export declare function useAblo<R extends SchemaRecord = DefaultModels>(): Ablo<R> | null;
63
64
  export declare function useAblo<R extends SchemaRecord = DefaultModels, T = unknown>(select: AbloSelector<R, T>): T | undefined;
@@ -17,14 +17,15 @@ function readModelResult(engine, modelClient, id, initial) {
17
17
  return { data, claims, claimed: claims.length > 0 };
18
18
  }
19
19
  /**
20
- * Project a reactive read into the value `useReactive` caches and returns.
20
+ * Projects a reactive read into the value that `useReactive` caches and
21
+ * returns.
21
22
  *
22
- * For a `Model`, this MUST read the row's fields (via `toReactiveSnapshot`),
23
- * not return the bare instance: MobX tracks property access, so reading the
24
- * fields inside this tracked function is what subscribes the reaction to them
25
- * and the fresh object identity lets `useReactive`'s equality detect an
26
- * in-place delta update. Returning `modelAsRow(value)` (the live instance, no
27
- * field read) is why `useAblo(a => a.x.get(id))` used to ignore remote edits.
23
+ * For a `Model`, this reads the row's fields through `toReactiveSnapshot`
24
+ * rather than returning the instance itself. Property access is what subscribes
25
+ * the reaction to those fields, so the read has to happen inside this tracked
26
+ * function; returning the live instance without reading its fields would leave
27
+ * the component blind to later edits. The fresh object it produces also lets
28
+ * `useReactive`'s equality check detect an in-place update.
28
29
  */
29
30
  function snapshotValue(value) {
30
31
  if (value instanceof Model) {
@@ -47,18 +48,19 @@ export function useAblo(modelOrSelect, id, options) {
47
48
  : typeof modelOrSelect === 'function'
48
49
  ? undefined
49
50
  : modelOrSelect;
50
- // Claims live on a non-MobX event emitter (engine.claims), so the useReactive
51
- // reactions below cannot track them we bridge changes through a setState bump.
52
- // ONLY the model-row form (`id !== undefined`) actually reads claims, so gate the
53
- // subscription on `id`. The selector-only form (`useAblo((a) => a.x.get/getAll)`)
54
- // never reads claims; subscribing it to the workspace-global claim stream would
55
- // re-render + double-compute it on every claim/presence delta anywhere (a real
56
- // storm during AI editing / live collaboration) for a value that can't change.
51
+ // Claims arrive through an event emitter (engine.claims), not through MobX, so
52
+ // the useReactive reactions below cannot track them; we bridge changes with a
53
+ // setState bump instead. Only the model-row form (`id !== undefined`) reads
54
+ // claims, so we subscribe only when `id` is set. The selector-only form never
55
+ // reads claims, and subscribing it to the workspace-wide claim stream would
56
+ // re-render and recompute it on every claim or presence change anywhere a
57
+ // real storm during AI editing or live collaboration for a value that cannot
58
+ // change.
57
59
  const [claimVersion, setClaimVersion] = useState(0);
58
60
  useEffect(() => {
59
61
  if (!engine || id === undefined)
60
62
  return;
61
- return engine.claims.onChange(() => setClaimVersion((version) => version + 1));
63
+ return engine.claims.onChange(() => { setClaimVersion((version) => version + 1); });
62
64
  }, [engine, id]);
63
65
  const selected = useReactive(() => {
64
66
  if (!engine || !isSelectorOnly || typeof modelOrSelect !== 'function') {