@abloatai/ablo 0.34.1 → 0.36.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 (536) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +758 -5
  3. package/README.md +56 -502
  4. package/bin/ablo.cjs +39 -0
  5. package/dist/BaseSyncedStore.d.ts +176 -48
  6. package/dist/BaseSyncedStore.js +346 -214
  7. package/dist/Database.d.ts +17 -44
  8. package/dist/Database.js +96 -79
  9. package/dist/InstanceCache.d.ts +31 -6
  10. package/dist/InstanceCache.js +65 -30
  11. package/dist/LazyReferenceCollection.d.ts +3 -3
  12. package/dist/LazyReferenceCollection.js +4 -4
  13. package/dist/Model.d.ts +23 -13
  14. package/dist/Model.js +27 -17
  15. package/dist/ModelRegistry.d.ts +8 -4
  16. package/dist/ModelRegistry.js +20 -18
  17. package/dist/NetworkMonitor.d.ts +3 -1
  18. package/dist/NetworkMonitor.js +7 -5
  19. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  20. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  21. package/dist/SyncClient.d.ts +47 -47
  22. package/dist/SyncClient.js +215 -156
  23. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  24. package/dist/ai-sdk/coordinatedTool.js +1 -1
  25. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  26. package/dist/ai-sdk/coordinationContext.js +1 -1
  27. package/dist/ai-sdk/wrap.d.ts +3 -3
  28. package/dist/ai-sdk/wrap.js +2 -2
  29. package/dist/auth/index.d.ts +1 -156
  30. package/dist/auth/index.js +8 -301
  31. package/dist/client/Ablo.d.ts +42 -287
  32. package/dist/client/Ablo.js +129 -963
  33. package/dist/client/abloClient.d.ts +309 -0
  34. package/dist/client/abloClient.js +13 -0
  35. package/dist/client/clientPrelude.d.ts +52 -0
  36. package/dist/client/clientPrelude.js +60 -0
  37. package/dist/client/consoleLogger.d.ts +2 -2
  38. package/dist/client/coreClient.d.ts +60 -0
  39. package/dist/client/coreClient.js +118 -0
  40. package/dist/client/createInternalComponents.d.ts +8 -4
  41. package/dist/client/createInternalComponents.js +17 -10
  42. package/dist/client/createModelProxy.d.ts +98 -373
  43. package/dist/client/createModelProxy.js +233 -139
  44. package/dist/client/humans.d.ts +69 -0
  45. package/dist/client/humans.js +78 -0
  46. package/dist/client/modelRegistration.d.ts +1 -1
  47. package/dist/client/modelRegistration.js +9 -9
  48. package/dist/client/options.d.ts +73 -17
  49. package/dist/client/reactiveEngine.d.ts +53 -0
  50. package/dist/client/reactiveEngine.js +688 -0
  51. package/dist/client/resourceTypes.d.ts +9 -250
  52. package/dist/client/resourceTypes.js +8 -5
  53. package/dist/client/schemaConfig.d.ts +4 -4
  54. package/dist/client/schemaConfig.js +6 -2
  55. package/dist/client/storeCluster.d.ts +47 -0
  56. package/dist/client/storeCluster.js +118 -0
  57. package/dist/client/storeLifecycle.d.ts +61 -0
  58. package/dist/client/storeLifecycle.js +231 -0
  59. package/dist/client/validateAbloOptions.d.ts +3 -2
  60. package/dist/client/validateAbloOptions.js +1 -1
  61. package/dist/client/wsMutationExecutor.d.ts +3 -3
  62. package/dist/client/wsMutationExecutor.js +3 -3
  63. package/dist/context.d.ts +22 -9
  64. package/dist/context.js +33 -9
  65. package/dist/coordination/ClaimLog.d.ts +26 -0
  66. package/dist/coordination/ClaimLog.js +32 -0
  67. package/dist/coordination/index.d.ts +1 -15
  68. package/dist/coordination/index.js +8 -31
  69. package/dist/core/index.d.ts +3 -3
  70. package/dist/core/index.js +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +230 -0
  73. package/dist/docs/index.d.ts +10 -0
  74. package/dist/docs/index.js +10 -0
  75. package/dist/environment.d.ts +1 -40
  76. package/dist/environment.js +8 -37
  77. package/dist/index.d.ts +44 -36
  78. package/dist/index.js +30 -22
  79. package/dist/interfaces/index.d.ts +44 -134
  80. package/dist/keys/index.d.ts +1 -77
  81. package/dist/keys/index.js +8 -190
  82. package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
  83. package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
  84. package/dist/mutators/Transaction.d.ts +1 -1
  85. package/dist/mutators/Transaction.js +1 -1
  86. package/dist/mutators/UndoManager.d.ts +6 -6
  87. package/dist/mutators/UndoManager.js +5 -5
  88. package/dist/mutators/defineMutators.d.ts +3 -3
  89. package/dist/mutators/defineMutators.js +1 -1
  90. package/dist/mutators/inverseOp.js +2 -2
  91. package/dist/mutators/mutateActions.d.ts +3 -3
  92. package/dist/mutators/mutateActions.js +1 -1
  93. package/dist/mutators/readerActions.d.ts +1 -1
  94. package/dist/mutators/undoApply.d.ts +1 -1
  95. package/dist/mutators/undoApply.js +1 -1
  96. package/dist/policy/index.d.ts +2 -2
  97. package/dist/policy/index.js +1 -1
  98. package/dist/query/client.d.ts +5 -2
  99. package/dist/query/client.js +10 -9
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +18 -8
  103. package/dist/react/AbloProvider.js +10 -9
  104. package/dist/react/context.d.ts +3 -3
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/createAbloReact.d.ts +56 -0
  107. package/dist/react/createAbloReact.js +51 -0
  108. package/dist/react/index.d.ts +6 -5
  109. package/dist/react/index.js +6 -3
  110. package/dist/react/internalContext.d.ts +1 -1
  111. package/dist/react/useAblo.d.ts +12 -5
  112. package/dist/react/useAblo.js +26 -8
  113. package/dist/react/useCurrentUserId.js +1 -1
  114. package/dist/react/useErrorListener.js +1 -1
  115. package/dist/react/useMutationFailureListener.d.ts +2 -2
  116. package/dist/react/useMutationFailureListener.js +1 -1
  117. package/dist/react/useMutators.d.ts +3 -3
  118. package/dist/react/useMutators.js +3 -3
  119. package/dist/react/useUndoScope.d.ts +5 -5
  120. package/dist/react/useUndoScope.js +1 -1
  121. package/dist/schema/coordination.d.ts +69 -10
  122. package/dist/schema/coordination.js +90 -9
  123. package/dist/schema/ddl.js +2 -2
  124. package/dist/schema/diff.d.ts +1 -1
  125. package/dist/schema/generate.js +1 -1
  126. package/dist/schema/index.d.ts +11 -10
  127. package/dist/schema/index.js +22 -18
  128. package/dist/schema/queries.d.ts +27 -27
  129. package/dist/schema/queries.js +23 -23
  130. package/dist/schema/select.d.ts +3 -3
  131. package/dist/schema/select.js +6 -3
  132. package/dist/schema/serialize.d.ts +15 -6
  133. package/dist/schema/serialize.js +20 -3
  134. package/dist/schema/sugar.d.ts +6 -7
  135. package/dist/schema/sugar.js +9 -12
  136. package/dist/schema/syncDeltaRow.d.ts +4 -152
  137. package/dist/schema/syncDeltaRow.js +4 -105
  138. package/dist/server/adapter.d.ts +18 -1
  139. package/dist/server/commit.d.ts +10 -16
  140. package/dist/server/index.d.ts +1 -1
  141. package/dist/server/index.js +1 -1
  142. package/dist/server/readConfig.d.ts +1 -1
  143. package/dist/source/adapter.d.ts +7 -5
  144. package/dist/source/adapter.js +7 -5
  145. package/dist/source/adapters/drizzle.d.ts +1 -1
  146. package/dist/source/adapters/drizzle.js +2 -2
  147. package/dist/source/adapters/kysely.d.ts +1 -1
  148. package/dist/source/adapters/kysely.js +1 -1
  149. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  150. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  151. package/dist/source/adapters/memory.js +1 -1
  152. package/dist/source/adapters/prisma.d.ts +8 -3
  153. package/dist/source/adapters/prisma.js +1 -1
  154. package/dist/source/connector.js +1 -1
  155. package/dist/source/connectorProtocol.d.ts +2 -8
  156. package/dist/source/connectorProtocol.js +3 -2
  157. package/dist/source/contract.d.ts +29 -17
  158. package/dist/source/contract.js +27 -22
  159. package/dist/source/factory.d.ts +1 -1
  160. package/dist/source/idempotency.js +2 -2
  161. package/dist/source/index.d.ts +1 -0
  162. package/dist/source/index.js +3 -0
  163. package/dist/source/next.d.ts +1 -1
  164. package/dist/source/signing.d.ts +9 -2
  165. package/dist/source/signing.js +4 -1
  166. package/dist/source/types.d.ts +6 -4
  167. package/dist/source/types.js +1 -1
  168. package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
  169. package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
  170. package/dist/{core → stores}/DatabaseManager.js +14 -13
  171. package/dist/stores/ObjectStore.d.ts +1 -1
  172. package/dist/{core → stores}/StoreManager.d.ts +9 -26
  173. package/dist/{core → stores}/StoreManager.js +29 -77
  174. package/dist/stores/SyncActionStore.d.ts +4 -2
  175. package/dist/stores/SyncActionStore.js +11 -17
  176. package/dist/stores/syncAction.d.ts +26 -0
  177. package/dist/stores/syncAction.js +16 -0
  178. package/dist/surface.d.ts +3 -3
  179. package/dist/surface.js +6 -4
  180. package/dist/sync/BootstrapFetcher.d.ts +127 -6
  181. package/dist/sync/BootstrapFetcher.js +511 -83
  182. package/dist/sync/ConnectionManager.d.ts +6 -198
  183. package/dist/sync/ConnectionManager.js +6 -677
  184. package/dist/sync/OnDemandLoader.d.ts +5 -2
  185. package/dist/sync/OnDemandLoader.js +61 -21
  186. package/dist/sync/SubscriptionManager.d.ts +13 -2
  187. package/dist/sync/SubscriptionManager.js +23 -5
  188. package/dist/sync/SyncWebSocket.d.ts +27 -510
  189. package/dist/sync/SyncWebSocket.js +76 -954
  190. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  191. package/dist/sync/awaitClaimGrant.js +4 -109
  192. package/dist/sync/bootstrapApply.d.ts +3 -0
  193. package/dist/sync/bootstrapApply.js +2 -2
  194. package/dist/sync/commitFrames.d.ts +6 -40
  195. package/dist/sync/commitFrames.js +6 -97
  196. package/dist/sync/contextPorts.d.ts +18 -0
  197. package/dist/sync/contextPorts.js +31 -0
  198. package/dist/sync/createClaimStream.d.ts +5 -49
  199. package/dist/sync/createClaimStream.js +5 -469
  200. package/dist/sync/createPresenceStream.d.ts +26 -4
  201. package/dist/sync/createPresenceStream.js +28 -20
  202. package/dist/sync/createSnapshot.d.ts +2 -2
  203. package/dist/sync/createSnapshot.js +1 -1
  204. package/dist/sync/credentialLifecycle.d.ts +5 -173
  205. package/dist/sync/credentialLifecycle.js +5 -320
  206. package/dist/sync/deltaPipeline.d.ts +13 -12
  207. package/dist/sync/deltaPipeline.js +21 -4
  208. package/dist/sync/groupChange.d.ts +3 -0
  209. package/dist/sync/groupChange.js +16 -14
  210. package/dist/sync/participants.d.ts +24 -6
  211. package/dist/sync/participants.js +32 -23
  212. package/dist/sync/schemaDrift.d.ts +55 -0
  213. package/dist/sync/schemaDrift.js +53 -0
  214. package/dist/sync/schemas.d.ts +23 -33
  215. package/dist/sync/schemas.js +29 -20
  216. package/dist/sync/syncPlan.d.ts +3 -3
  217. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  218. package/dist/sync/wsFrameHandlers.js +6 -392
  219. package/dist/syncLog/contract.d.ts +20 -0
  220. package/dist/syncLog/contract.js +19 -0
  221. package/dist/syncLog/index.d.ts +1 -0
  222. package/dist/syncLog/index.js +1 -0
  223. package/dist/transaction/ablo.d.ts +88 -0
  224. package/dist/transaction/ablo.js +33 -0
  225. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  226. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  227. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  228. package/dist/transaction/auth/bootstrapScope.js +1 -0
  229. package/dist/transaction/auth/capability.d.ts +212 -0
  230. package/dist/transaction/auth/capability.js +224 -0
  231. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  232. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  233. package/dist/{client → transaction/auth}/identity.js +1 -1
  234. package/dist/transaction/auth/index.d.ts +162 -0
  235. package/dist/transaction/auth/index.js +304 -0
  236. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  237. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  238. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  239. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  240. package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
  241. package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
  242. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
  243. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
  244. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  245. package/dist/transaction/coordination/claimMeta.js +52 -0
  246. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  247. package/dist/transaction/coordination/createClaimStream.js +475 -0
  248. package/dist/transaction/coordination/events.d.ts +74 -0
  249. package/dist/transaction/coordination/events.js +7 -0
  250. package/dist/transaction/coordination/index.d.ts +19 -0
  251. package/dist/transaction/coordination/index.js +45 -0
  252. package/dist/transaction/coordination/locator.d.ts +104 -0
  253. package/dist/transaction/coordination/locator.js +102 -0
  254. package/dist/transaction/coordination/schema.d.ts +1536 -0
  255. package/dist/transaction/coordination/schema.js +1177 -0
  256. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  257. package/dist/transaction/coordination/targetConflict.js +107 -0
  258. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  259. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  260. package/dist/transaction/durableWrites.d.ts +62 -0
  261. package/dist/{client → transaction}/durableWrites.js +28 -3
  262. package/dist/transaction/environment.d.ts +105 -0
  263. package/dist/transaction/environment.js +108 -0
  264. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
  265. package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
  266. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  267. package/dist/{errors.js → transaction/errors.js} +85 -16
  268. package/dist/transaction/footprint.d.ts +111 -0
  269. package/dist/transaction/footprint.js +0 -0
  270. package/dist/transaction/index.d.ts +20 -0
  271. package/dist/transaction/index.js +20 -0
  272. package/dist/transaction/keys/index.d.ts +87 -0
  273. package/dist/transaction/keys/index.js +207 -0
  274. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  275. package/dist/transaction/log/syncDeltaRow.js +95 -0
  276. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  277. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  278. package/dist/transaction/logger.d.ts +16 -0
  279. package/dist/transaction/logger.js +7 -0
  280. package/dist/transaction/observability.d.ts +53 -0
  281. package/dist/transaction/observability.js +19 -0
  282. package/dist/transaction/plugin.d.ts +285 -0
  283. package/dist/transaction/plugin.js +106 -0
  284. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  285. package/dist/{policy → transaction/policy}/types.js +2 -0
  286. package/dist/transaction/resources/httpResources.d.ts +321 -0
  287. package/dist/transaction/resources/httpResources.js +7 -0
  288. package/dist/transaction/resources/modelOperations.d.ts +427 -0
  289. package/dist/transaction/resources/modelOperations.js +12 -0
  290. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  291. package/dist/transaction/resources/mutationOptions.js +9 -0
  292. package/dist/transaction/resources/where.d.ts +101 -0
  293. package/dist/transaction/resources/where.js +115 -0
  294. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  295. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  296. package/dist/{schema → transaction/schema}/field.d.ts +17 -23
  297. package/dist/{schema → transaction/schema}/field.js +5 -5
  298. package/dist/transaction/schema/fieldRef.d.ts +38 -0
  299. package/dist/transaction/schema/fieldRef.js +11 -0
  300. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  301. package/dist/transaction/schema/loadStrategy.js +46 -0
  302. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  303. package/dist/{schema → transaction/schema}/model.js +30 -20
  304. package/dist/transaction/schema/openapi.d.ts +58 -0
  305. package/dist/transaction/schema/openapi.js +501 -0
  306. package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
  307. package/dist/{schema → transaction/schema}/relation.js +7 -7
  308. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  309. package/dist/{schema → transaction/schema}/residency.js +0 -5
  310. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  311. package/dist/{schema → transaction/schema}/roles.js +5 -5
  312. package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
  313. package/dist/{schema → transaction/schema}/schema.js +24 -3
  314. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  315. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  316. package/dist/transaction/transactionLayer.d.ts +82 -0
  317. package/dist/transaction/transactionLayer.js +24 -0
  318. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
  319. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  320. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  321. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  322. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
  323. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  324. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  325. package/dist/transaction/transport/commitFrames.js +134 -0
  326. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  327. package/dist/transaction/transport/connectionManager.js +673 -0
  328. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  329. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  330. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  331. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  332. package/dist/transaction/transport/httpClient.d.ts +131 -0
  333. package/dist/{client → transaction/transport}/httpClient.js +6 -5
  334. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  335. package/dist/transaction/transport/httpOptions.js +12 -0
  336. package/dist/{client → transaction/transport}/httpTransport.js +295 -97
  337. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  338. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  339. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  340. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  341. package/dist/transaction/transport/wsTransport.d.ts +574 -0
  342. package/dist/transaction/transport/wsTransport.js +1023 -0
  343. package/dist/transaction/types/assertExact.d.ts +17 -0
  344. package/dist/transaction/types/assertExact.js +1 -0
  345. package/dist/{types → transaction/types}/global.d.ts +17 -2
  346. package/dist/{types → transaction/types}/global.js +2 -1
  347. package/dist/{types → transaction/types}/index.d.ts +14 -46
  348. package/dist/{types → transaction/types}/index.js +7 -16
  349. package/dist/{types → transaction/types}/streams.d.ts +73 -45
  350. package/dist/transaction/utils/duration.d.ts +50 -0
  351. package/dist/{utils → transaction/utils}/duration.js +32 -0
  352. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  353. package/dist/transaction/utils/json.js +276 -0
  354. package/dist/transaction/wire/accountResponses.d.ts +420 -0
  355. package/dist/transaction/wire/accountResponses.js +290 -0
  356. package/dist/transaction/wire/auth.d.ts +56 -0
  357. package/dist/transaction/wire/auth.js +63 -0
  358. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  359. package/dist/transaction/wire/claimEvent.js +73 -0
  360. package/dist/transaction/wire/claims.d.ts +530 -0
  361. package/dist/transaction/wire/claims.js +327 -0
  362. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  363. package/dist/{wire → transaction/wire}/commit.js +68 -47
  364. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  365. package/dist/{wire → transaction/wire}/delta.js +37 -13
  366. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  367. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  368. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  369. package/dist/transaction/wire/feedCursor.js +82 -0
  370. package/dist/transaction/wire/feedEvent.d.ts +204 -0
  371. package/dist/transaction/wire/feedEvent.js +65 -0
  372. package/dist/transaction/wire/frames.d.ts +194 -0
  373. package/dist/transaction/wire/frames.js +50 -0
  374. package/dist/transaction/wire/inboundFrames.d.ts +562 -0
  375. package/dist/transaction/wire/inboundFrames.js +116 -0
  376. package/dist/transaction/wire/index.d.ts +54 -0
  377. package/dist/transaction/wire/index.js +83 -0
  378. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  379. package/dist/transaction/wire/listEnvelope.js +42 -0
  380. package/dist/transaction/wire/modelMutations.d.ts +31 -0
  381. package/dist/transaction/wire/modelMutations.js +52 -0
  382. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  383. package/dist/transaction/wire/modelResponses.js +43 -0
  384. package/dist/transaction/wire/modelShape.d.ts +78 -0
  385. package/dist/transaction/wire/modelShape.js +74 -0
  386. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
  387. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
  388. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  389. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  390. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  391. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  392. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  393. package/dist/transactions/mutations/commitLatency.js +130 -0
  394. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  395. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  396. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
  397. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
  398. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
  399. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
  400. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  401. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  402. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  403. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
  404. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
  405. package/dist/utils/mobxSetup.d.ts +1 -1
  406. package/dist/utils/mobxSetup.js +5 -2
  407. package/dist/{core → views}/QueryView.d.ts +2 -2
  408. package/dist/{core → views}/QueryView.js +2 -2
  409. package/dist/{core → views}/ViewRegistry.d.ts +1 -1
  410. package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
  411. package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
  412. package/dist/webhooks/events.d.ts +2 -2
  413. package/dist/wire/index.d.ts +1 -34
  414. package/dist/wire/index.js +8 -49
  415. package/docs/agent-messaging.md +3 -3
  416. package/docs/agents.md +20 -13
  417. package/docs/api-keys.md +14 -10
  418. package/docs/api.md +27 -61
  419. package/docs/audit.md +6 -3
  420. package/docs/cli.md +41 -13
  421. package/docs/client-behavior.md +11 -9
  422. package/docs/concurrency-convention.md +49 -57
  423. package/docs/coordination.md +283 -121
  424. package/docs/data-sources.md +7 -5
  425. package/docs/debugging.md +39 -15
  426. package/docs/deployment.md +267 -0
  427. package/docs/examples/agent-human.md +49 -42
  428. package/docs/examples/ai-sdk-tool.md +69 -44
  429. package/docs/examples/existing-python-backend.md +8 -6
  430. package/docs/examples/nextjs.md +129 -47
  431. package/docs/examples/scoped-agent.md +46 -45
  432. package/docs/examples/server-agent.md +46 -26
  433. package/docs/groups.md +87 -30
  434. package/docs/guarantees.md +41 -12
  435. package/docs/how-it-works.md +38 -12
  436. package/docs/idempotency.md +126 -0
  437. package/docs/identity.md +77 -74
  438. package/docs/index.md +172 -86
  439. package/docs/integration-guide.md +31 -19
  440. package/docs/mcp.md +46 -21
  441. package/docs/migration.md +95 -18
  442. package/docs/operating-on-your-database.md +3 -1
  443. package/docs/projects.md +3 -1
  444. package/docs/quickstart.md +22 -5
  445. package/docs/react.md +31 -18
  446. package/docs/schema-contract.md +5 -3
  447. package/docs/session-settings.md +108 -0
  448. package/docs/sessions.md +4 -2
  449. package/docs/webhooks.md +12 -10
  450. package/llms.txt +48 -18
  451. package/package.json +21 -26
  452. package/dist/agent/Agent.d.ts +0 -366
  453. package/dist/agent/Agent.js +0 -514
  454. package/dist/agent/index.d.ts +0 -115
  455. package/dist/agent/index.js +0 -128
  456. package/dist/agent/session.d.ts +0 -93
  457. package/dist/agent/session.js +0 -149
  458. package/dist/agent/types.d.ts +0 -68
  459. package/dist/agent/types.js +0 -9
  460. package/dist/cli.cjs +0 -286329
  461. package/dist/client/durableWrites.d.ts +0 -21
  462. package/dist/client/httpClient.d.ts +0 -80
  463. package/dist/coordination/schema.d.ts +0 -722
  464. package/dist/coordination/schema.js +0 -578
  465. package/dist/schema/openapi.d.ts +0 -29
  466. package/dist/schema/openapi.js +0 -124
  467. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  468. package/dist/testing/fixtures/bootstrap.js +0 -59
  469. package/dist/testing/fixtures/deltas.d.ts +0 -83
  470. package/dist/testing/fixtures/deltas.js +0 -136
  471. package/dist/testing/fixtures/models.d.ts +0 -83
  472. package/dist/testing/fixtures/models.js +0 -272
  473. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  474. package/dist/testing/helpers/reactWrapper.js +0 -67
  475. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  476. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  477. package/dist/testing/helpers/wait.d.ts +0 -30
  478. package/dist/testing/helpers/wait.js +0 -49
  479. package/dist/testing/index.d.ts +0 -23
  480. package/dist/testing/index.js +0 -33
  481. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  482. package/dist/testing/mocks/FakeDatabase.js +0 -10
  483. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  484. package/dist/testing/mocks/MockMutationExecutor.js +0 -192
  485. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  486. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  487. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  488. package/dist/testing/mocks/MockSyncContext.js +0 -71
  489. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  490. package/dist/testing/mocks/MockSyncStore.js +0 -171
  491. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  492. package/dist/testing/mocks/MockWebSocket.js +0 -118
  493. package/dist/transactions/durableWriteStore.js +0 -30
  494. package/dist/utils/duration.d.ts +0 -25
  495. package/dist/utils/json.js +0 -88
  496. package/dist/wire/errorEnvelope.d.ts +0 -55
  497. package/dist/wire/frames.d.ts +0 -197
  498. package/dist/wire/frames.js +0 -49
  499. package/dist/wire/listEnvelope.js +0 -18
  500. package/docs/interaction-model.md +0 -97
  501. /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
  502. /package/dist/{core → query}/QueryProcessor.js +0 -0
  503. /package/dist/{core/storeContract.js → storeContract.js} +0 -0
  504. /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
  505. /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
  506. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  507. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  508. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  509. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  510. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  511. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  512. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  513. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  514. /package/dist/{client → transaction}/persistence.js +0 -0
  515. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  516. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  517. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  518. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  519. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  520. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  521. /package/dist/{types → transaction/types}/modelData.js +0 -0
  522. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  523. /package/dist/{types → transaction/types}/participant.js +0 -0
  524. /package/dist/{types → transaction/types}/streams.js +0 -0
  525. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  526. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  527. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  528. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  529. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  530. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  531. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  532. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  533. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  534. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  535. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
  536. /package/dist/{core → views}/ViewRegistry.js +0 -0
@@ -1,7 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { SchemaRecord } from '../schema/schema.js';
2
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
3
3
  import { Ablo } from '../client/Ablo.js';
4
- import type { Claim, Peer } from '../types/streams.js';
4
+ import type { Claim, Duration, Peer } from '../transaction/types/streams.js';
5
5
  import type { EngineParticipant, ParticipantScope, ParticipantStatus } from '../sync/participants.js';
6
6
  import { type SyncStoreContract } from './context.js';
7
7
  /**
@@ -116,6 +116,18 @@ export type { EngineParticipant, ParticipantScope, ParticipantStatus };
116
116
  */
117
117
  export interface UseJoinOptions {
118
118
  readonly scope?: ParticipantScope;
119
+ /**
120
+ * Lease TTL for the participant claim, as a compact duration (`'5m'`) or a
121
+ * number of seconds. The same dial and the same spelling as
122
+ * `ablo.<model>.join(ids, { ttl })` and every other lease in the SDK.
123
+ */
124
+ readonly ttl?: Duration;
125
+ /**
126
+ * @deprecated Use `ttl`. Removed in 0.37.0.
127
+ *
128
+ * The same rename as on `ParticipantJoinOptions`: one lease, and the seconds
129
+ * spelling was the one that misled, because it accepted duration strings too.
130
+ */
119
131
  readonly ttlSeconds?: number | string | null;
120
132
  /** Tear down + don't re-join while true. */
121
133
  readonly paused?: boolean;
@@ -125,7 +137,7 @@ export interface UseJoinOptions {
125
137
  * Default `false`: opening a scope subscribes the connection to its deltas
126
138
  * (read interest, via `update_subscription`) but does NOT claim it — a
127
139
  * viewer is not a claimant. Set `true` when the participant intends to
128
- * WRITE (editing a deck, an agent staking work): the claim is sent so peers
140
+ * WRITE (editing a report, an agent staking work): the claim is sent so peers
129
141
  * observe it, and the scope is pinned so it stays subscribed (never warms)
130
142
  * for as long as the claim is held.
131
143
  */
@@ -137,14 +149,12 @@ export interface UseJoinOptions {
137
149
  * Default `false`: entering a scope subscribes to its FUTURE deltas only — if
138
150
  * the scope's rows aren't already loaded, the view is empty until something
139
151
  * changes. Set `true` when opening an entity that may not be loaded yet (a
140
- * deep-linked deck, a never-opened sheet) so its current rows are fetched and
152
+ * deep-linked report, a never-opened ledger) so its current rows are fetched and
141
153
  * injected once, then kept fresh by the live tail. The fetch is single-flight
142
154
  * and runs once per group; a failure soft-fails (the live tail still flows).
143
155
  */
144
156
  readonly hydrate?: boolean;
145
157
  }
146
- /** @deprecated Use `ParticipantStatus`. */
147
- export type MeshParticipantStatus = ParticipantStatus;
148
158
  export interface UseJoinReturn {
149
159
  readonly participant: EngineParticipant | null;
150
160
  /** Everyone else on the engine's sync groups (`participant.presence.others`), bridged to React. */
@@ -188,7 +198,7 @@ export declare function useJoin(opts: UseJoinOptions): UseJoinReturn;
188
198
  * subscription on unmount).
189
199
  *
190
200
  * ```ts
191
- * const peers = usePeers({ slideDecks: deckId });
201
+ * const peers = usePeers({ reports: reportId });
192
202
  * const alone = !peers.some((p) => p.participantKind === 'user');
193
203
  * ```
194
204
  */
@@ -200,7 +210,7 @@ export declare function usePeers(scope?: ParticipantScope): readonly Peer[];
200
210
  *
201
211
  * The generic parameter narrows the return type to your schema's
202
212
  * model record so call sites get typed `sync.tasks.findMany()` /
203
- * `sync.slides.create(...)` without a cast at the call site:
213
+ * `sync.sections.create(...)` without a cast at the call site:
204
214
  *
205
215
  * ```ts
206
216
  * const sync = useSync<(typeof schema)['models']>();
@@ -5,7 +5,7 @@ import { Ablo } from '../client/Ablo.js';
5
5
  import { createParticipantClaimId, parseParticipantTtlSeconds, resolveParticipantSyncGroups, } from '../sync/participants.js';
6
6
  import { SyncContext } from './context.js';
7
7
  import { AbloInternalContext } from './internalContext.js';
8
- import { AbloValidationError } from '../errors.js';
8
+ import { AbloValidationError } from '../transaction/errors.js';
9
9
  import { useSyncStatus } from './useSyncStatus.js';
10
10
  import { DefaultFallback } from './DefaultFallback.js';
11
11
  // ── Implementation ───────────────────────────────────────────────────
@@ -224,8 +224,8 @@ export function useJoin(opts) {
224
224
  const ctx = useContext(AbloInternalContext);
225
225
  const engine = ctx?.engine ?? null;
226
226
  const { paused = false } = opts;
227
- // Resolve the model-form scope ({ decks: id } / refs) THROUGH the schema, so a
228
- // model's declared `scope` kind is honored (typename `SlideDeck` → `deck:<id>`,
227
+ // Resolve the model-form scope ({ reports: id } / refs) THROUGH the schema, so a
228
+ // model's declared `scope` kind is honored (typename `Report` → `report:<id>`,
229
229
  // not the `type:id` string fallback). Schema appears once the engine is ready;
230
230
  // until then refs resolve by convention, then re-resolve when it arrives.
231
231
  const scopeKey = JSON.stringify(resolveParticipantSyncGroups(opts.scope, engine?.schema).sort());
@@ -298,13 +298,13 @@ export function useJoin(opts) {
298
298
  if (syncStatus.name !== 'connected')
299
299
  return;
300
300
  const ws = engine._ws;
301
- if (!ws)
302
- return;
303
301
  const store = engine._store;
304
302
  let cancelled = false;
305
303
  const claimId = createParticipantClaimId();
306
304
  ws.sendClaim(claimId, scopedSyncGroups, {
307
- ttlSeconds: parseParticipantTtlSeconds(opts.ttlSeconds),
305
+ // Reading the retired spelling IS the compatibility path; it goes at 0.37.0.
306
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
307
+ ttlSeconds: parseParticipantTtlSeconds(opts.ttl ?? opts.ttlSeconds),
308
308
  })
309
309
  .then(() => {
310
310
  if (!cancelled)
@@ -322,7 +322,8 @@ export function useJoin(opts) {
322
322
  ws.sendRelease(claimId);
323
323
  void store.unpinScope?.(scope);
324
324
  };
325
- }, [engine, paused, scopeKey, syncStatus.name, opts.ttlSeconds, opts.claim]);
325
+ // eslint-disable-next-line @typescript-eslint/no-deprecated -- same compatibility read as above.
326
+ }, [engine, paused, scopeKey, syncStatus.name, opts.ttl, opts.ttlSeconds, opts.claim]);
326
327
  // Bridge the engine's presence + claims streams into React state.
327
328
  // Plain useState + useEffect is sufficient — mid-frame tearing on a
328
329
  // peer list is harmless (users won't notice one frame of stale
@@ -370,7 +371,7 @@ export function useJoin(opts) {
370
371
  * subscription on unmount).
371
372
  *
372
373
  * ```ts
373
- * const peers = usePeers({ slideDecks: deckId });
374
+ * const peers = usePeers({ reports: reportId });
374
375
  * const alone = !peers.some((p) => p.participantKind === 'user');
375
376
  * ```
376
377
  */
@@ -408,7 +409,7 @@ export function usePeers(scope) {
408
409
  *
409
410
  * The generic parameter narrows the return type to your schema's
410
411
  * model record so call sites get typed `sync.tasks.findMany()` /
411
- * `sync.slides.create(...)` without a cast at the call site:
412
+ * `sync.sections.create(...)` without a cast at the call site:
412
413
  *
413
414
  * ```ts
414
415
  * const sync = useSync<(typeof schema)['models']>();
@@ -1,7 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { Schema } from '../schema/schema.js';
3
- import type { SyncStoreContract } from '../core/storeContract.js';
4
- export type { SyncStoreContract, LocalMutation } from '../core/storeContract.js';
2
+ import type { Schema } from '../transaction/schema/schema.js';
3
+ import type { SyncStoreContract } from '../storeContract.js';
4
+ export type { SyncStoreContract, LocalMutation } from '../storeContract.js';
5
5
  export interface SyncReactContext {
6
6
  store: SyncStoreContract;
7
7
  /** The organization id used as the default scope for reads and writes. */
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { createContext, createElement, useContext } from 'react';
3
- import { AbloValidationError } from '../errors.js';
3
+ import { AbloValidationError } from '../transaction/errors.js';
4
4
  export const SyncContext = createContext(null);
5
5
  /**
6
6
  * Reads the sync store context from inside a provider subtree, throwing a clear
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The typed react binding — the schema generic is captured ONCE, at a factory
3
+ * call in app code, and every hook the factory returns is born typed. This is
4
+ * the shape the reference libraries converged on independently (tRPC's
5
+ * `createTRPCReact`, XState's `createActorContext`, react-redux's
6
+ * `withTypes`): no module augmentation, no generic parameters at call sites,
7
+ * and — once the legacy generic erasure retires — no casts anywhere on the
8
+ * path from context to component.
9
+ *
10
+ * The app's one binding file, by convention:
11
+ *
12
+ * ```ts
13
+ * // lib/ablo.ts
14
+ * import { createAbloReact } from '@abloatai/ablo/react';
15
+ * import { schema } from './schema';
16
+ *
17
+ * export const { AbloProvider, useAblo } = createAbloReact(schema);
18
+ * ```
19
+ *
20
+ * Components then import `useAblo` from `lib/ablo` and never spell a type
21
+ * argument; `useAblo()` is `Ablo<S> | null`, and a selector's `ablo`
22
+ * parameter is the reactive-read view of the same `S`.
23
+ */
24
+ import { type ReactElement } from 'react';
25
+ import { type AbloProviderProps } from './AbloProvider.js';
26
+ import { type AbloSelector, type ModelClientSelector, type UseAbloHydratedModelResult, type UseAbloModelOptions, type UseAbloModelResult } from './useAblo.js';
27
+ import type { Ablo } from '../client/Ablo.js';
28
+ import type { ModelOperations } from '../client/createModelProxy.js';
29
+ import type { Schema, SchemaRecord } from '../transaction/schema/schema.js';
30
+ /** What a binding returns: the provider and the hook, with `S` fixed. */
31
+ export interface AbloReactBinding<S extends SchemaRecord> {
32
+ /** `AbloProvider` with its `client` prop typed `Ablo<S>` — same component,
33
+ * no per-app generics. */
34
+ AbloProvider: (props: AbloProviderProps<S>) => ReactElement;
35
+ /** `useAblo` with the schema bound — the same overloads as the global
36
+ * hook, minus the type arguments. */
37
+ useAblo: {
38
+ (): Ablo<S> | null;
39
+ <T>(select: AbloSelector<S, T>): T | undefined;
40
+ <T, C>(modelClient: ModelOperations<T, C>, id: string, options: UseAbloModelOptions<T> & {
41
+ readonly initial: T;
42
+ }): UseAbloHydratedModelResult<T>;
43
+ <T, C>(select: ModelClientSelector<S, T, C>, id: string, options: UseAbloModelOptions<T> & {
44
+ readonly initial: T;
45
+ }): UseAbloHydratedModelResult<T>;
46
+ <T, C>(modelClient: ModelOperations<T, C>, id: string, options?: UseAbloModelOptions<T>): UseAbloModelResult<T>;
47
+ <T, C>(select: ModelClientSelector<S, T, C>, id: string, options?: UseAbloModelOptions<T>): UseAbloModelResult<T>;
48
+ };
49
+ }
50
+ /**
51
+ * Bind the react surface to one schema. The schema value is taken for
52
+ * inference — write `createAbloReact(schema)`, never a hand-spelled type
53
+ * argument — and it is the seam where the binding's own typed context arrives
54
+ * when the legacy erasure retires (docs/plans/typed-react-binding.md, step 3).
55
+ */
56
+ export declare function createAbloReact<S extends SchemaRecord>(schema: Schema<S>): AbloReactBinding<S>;
@@ -0,0 +1,51 @@
1
+ 'use client';
2
+ /**
3
+ * The typed react binding — the schema generic is captured ONCE, at a factory
4
+ * call in app code, and every hook the factory returns is born typed. This is
5
+ * the shape the reference libraries converged on independently (tRPC's
6
+ * `createTRPCReact`, XState's `createActorContext`, react-redux's
7
+ * `withTypes`): no module augmentation, no generic parameters at call sites,
8
+ * and — once the legacy generic erasure retires — no casts anywhere on the
9
+ * path from context to component.
10
+ *
11
+ * The app's one binding file, by convention:
12
+ *
13
+ * ```ts
14
+ * // lib/ablo.ts
15
+ * import { createAbloReact } from '@abloatai/ablo/react';
16
+ * import { schema } from './schema';
17
+ *
18
+ * export const { AbloProvider, useAblo } = createAbloReact(schema);
19
+ * ```
20
+ *
21
+ * Components then import `useAblo` from `lib/ablo` and never spell a type
22
+ * argument; `useAblo()` is `Ablo<S> | null`, and a selector's `ablo`
23
+ * parameter is the reactive-read view of the same `S`.
24
+ */
25
+ import { createContext, createElement, useContext } from 'react';
26
+ import { AbloProvider } from './AbloProvider.js';
27
+ import { useAbloImpl, } from './useAblo.js';
28
+ /**
29
+ * Bind the react surface to one schema. The schema value is taken for
30
+ * inference — write `createAbloReact(schema)`, never a hand-spelled type
31
+ * argument — and it is the seam where the binding's own typed context arrives
32
+ * when the legacy erasure retires (docs/plans/typed-react-binding.md, step 3).
33
+ */
34
+ export function createAbloReact(schema) {
35
+ void schema;
36
+ // The binding's own context — created here, AFTER the schema generic is
37
+ // known, so it is typed `Ablo<S>` from birth (the XState
38
+ // `createActorContext` shape). A hook that reads it never rebinds and
39
+ // never casts; a binding hook mounted under a legacy provider (no bound
40
+ // provider in the tree) reads `null` here and falls through to the shared
41
+ // implementation's internal-context fallback.
42
+ const BoundClientContext = createContext(null);
43
+ function BoundAbloProvider(props) {
44
+ return createElement(BoundClientContext.Provider, { value: props.client }, createElement((AbloProvider), props));
45
+ }
46
+ function useBoundAblo(modelOrSelect, id, options) {
47
+ const bound = useContext(BoundClientContext);
48
+ return useAbloImpl(bound, modelOrSelect, id, options);
49
+ }
50
+ return { AbloProvider: BoundAbloProvider, useAblo: useBoundAblo };
51
+ }
@@ -21,9 +21,9 @@
21
21
  *
22
22
  * # Data hooks
23
23
  *
24
- * useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
24
+ * useAblo((ablo) => ablo.tasks.local.retrieve(id)) — subscribe to a local snapshot (the main read API)
25
25
  * useAblo() — the typed client, for callbacks and effects:
26
- * synchronous local reads (`ablo.<model>.get`/`getAll`),
26
+ * synchronous local reads (`ablo.<model>.local.retrieve`/`local.list`),
27
27
  * async server reads (`retrieve`/`list`),
28
28
  * and writes (`create`/`update`/`delete`)
29
29
  * useMutators(defs, opts?) — define custom mutators
@@ -43,8 +43,8 @@
43
43
  * useAblo((ablo) => ablo.<model>.claim.state(...)) — reactive coordination reads
44
44
  * useJoin({ scope }) — join a scope to get its peers and claims
45
45
  */
46
- export type { DefaultSyncShape, ResolveSchema, ResolveUserMeta, ResolveModelKey, } from '../types/global.js';
47
- export { AbloProvider, useJoin, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseJoinOptions, type UseJoinReturn, type MeshParticipantStatus, } from './AbloProvider.js';
46
+ export type { DefaultSyncShape, ResolveSchema, ResolveUserMeta, ResolveClaimMeta, ResolveModelKey, } from '../transaction/types/global.js';
47
+ export { AbloProvider, useJoin, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseJoinOptions, type UseJoinReturn, } from './AbloProvider.js';
48
48
  export { ClientSideSuspense, type ClientSideSuspenseProps, } from './ClientSideSuspense.js';
49
49
  export { DefaultFallback } from './DefaultFallback.js';
50
50
  export type { SyncStoreContract } from './context.js';
@@ -52,10 +52,11 @@ export { useSyncStatus, type SyncStatusSnapshot, } from './useSyncStatus.js';
52
52
  export { useErrorListener } from './useErrorListener.js';
53
53
  export { useMutationFailureListener, type MutationFailurePayload, } from './useMutationFailureListener.js';
54
54
  export { useCurrentUserId } from './useCurrentUserId.js';
55
+ export { createAbloReact, type AbloReactBinding } from './createAbloReact.js';
55
56
  export { useReactive } from './useReactive.js';
56
57
  export type { MutateActions } from '../mutators/mutateActions.js';
57
58
  export type { ReaderActions, ReaderFindOptions } from '../mutators/readerActions.js';
58
59
  export { useMutators, type MutatorInvokers, type InvokerFor, type UseMutatorsOptions, } from './useMutators.js';
59
60
  export { useUndoScope, type UseUndoScopeResult } from './useUndoScope.js';
60
61
  export { useAblo, type UseAbloHydratedModelResult, type UseAbloModelOptions, type UseAbloModelResult, } from './useAblo.js';
61
- export { ModelScope } from '../types/index.js';
62
+ export { ModelScope } from '../transaction/types/index.js';
@@ -21,9 +21,9 @@
21
21
  *
22
22
  * # Data hooks
23
23
  *
24
- * useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
24
+ * useAblo((ablo) => ablo.tasks.local.retrieve(id)) — subscribe to a local snapshot (the main read API)
25
25
  * useAblo() — the typed client, for callbacks and effects:
26
- * synchronous local reads (`ablo.<model>.get`/`getAll`),
26
+ * synchronous local reads (`ablo.<model>.local.retrieve`/`local.list`),
27
27
  * async server reads (`retrieve`/`list`),
28
28
  * and writes (`create`/`update`/`delete`)
29
29
  * useMutators(defs, opts?) — define custom mutators
@@ -52,6 +52,9 @@ export { useSyncStatus, } from './useSyncStatus.js';
52
52
  export { useErrorListener } from './useErrorListener.js';
53
53
  export { useMutationFailureListener, } from './useMutationFailureListener.js';
54
54
  export { useCurrentUserId } from './useCurrentUserId.js';
55
+ // The typed binding — capture the schema generic once, in the app's one
56
+ // binding file, and import born-typed hooks everywhere (the tRPC shape).
57
+ export { createAbloReact } from './createAbloReact.js';
55
58
  // ── Primitive for building custom reactive hooks ──────────────────
56
59
  //
57
60
  // Consumers building bespoke hooks on top of the SDK should call
@@ -63,4 +66,4 @@ export { useMutators, } from './useMutators.js';
63
66
  export { useUndoScope } from './useUndoScope.js';
64
67
  export { useAblo, } from './useAblo.js';
65
68
  // ── ModelScope re-export ───────────────────────────────────────────
66
- export { ModelScope } from '../types/index.js';
69
+ export { ModelScope } from '../transaction/types/index.js';
@@ -1,5 +1,5 @@
1
1
  import type { Ablo } from '../client/Ablo.js';
2
- import type { SchemaRecord } from '../schema/schema.js';
2
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
3
3
  /**
4
4
  * The context that `<AbloProvider>` populates for its own hooks. It is kept
5
5
  * separate from the data-hook context, which carries the store and schema,
@@ -1,7 +1,7 @@
1
1
  import type { Ablo, AbloReads, ModelClaim } from '../client/Ablo.js';
2
2
  import type { ModelOperations } from '../client/createModelProxy.js';
3
- import type { SchemaRecord } from '../schema/schema.js';
4
- import type { ResolveSchema } from '../types/global.js';
3
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
4
+ import type { ResolveSchema } from '../transaction/types/global.js';
5
5
  /**
6
6
  * The app's resolved schema-record type. It reads your `Register` module
7
7
  * augmentation when you declare one and falls back to the loose
@@ -11,8 +11,8 @@ import type { ResolveSchema } from '../types/global.js';
11
11
  type DefaultModels = ResolveSchema extends {
12
12
  models: infer M;
13
13
  } ? M extends SchemaRecord ? M : SchemaRecord : SchemaRecord;
14
- type ModelClientSelector<R extends SchemaRecord, T, C> = (ablo: AbloReads<R>) => ModelOperations<T, C>;
15
- type AbloSelector<R extends SchemaRecord, T> = (ablo: AbloReads<R>) => T;
14
+ export type ModelClientSelector<R extends SchemaRecord, T, C> = (ablo: AbloReads<R>) => ModelOperations<T, C>;
15
+ export type AbloSelector<R extends SchemaRecord, T> = (ablo: AbloReads<R>) => T;
16
16
  export interface UseAbloModelOptions<T> {
17
17
  /**
18
18
  * An initial row, usually from a server component or a route loader. The hook
@@ -42,6 +42,13 @@ export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'>
42
42
  * Schema: typeof schema } }`); the default type then resolves through your
43
43
  * schema's models, so call sites stay clean:
44
44
  *
45
+ * **Prefer the binding.** `createAbloReact(schema)` captures the schema once
46
+ * in your app's binding file and returns a `useAblo` that needs none of the
47
+ * typing arrangements below — no type argument, no `Register` declaration
48
+ * (see `react.md`). Passing an explicit schema type argument to THIS hook is
49
+ * deprecated in favor of that binding; it keeps working for shared packages
50
+ * that cannot bind a concrete schema.
51
+ *
45
52
  * ```ts
46
53
  * // With the Register augmentation (recommended):
47
54
  * const ablo = useAblo();
@@ -51,7 +58,7 @@ export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'>
51
58
  * // Reactive selector (a synchronous local snapshot). The selector's reads
52
59
  * // are typed as snapshot rows — data fields + computeds, no relation
53
60
  * // accessors — matching what the hook actually returns:
54
- * const doc = useAblo((ablo) => ablo.documents.get(id)) ?? serverDoc;
61
+ * const doc = useAblo((ablo) => ablo.documents.local.retrieve(id)) ?? serverDoc;
55
62
  * const active = useAblo((ablo) => ablo.documents.claim.state({ id }));
56
63
  *
57
64
  * // Without the augmentation, pass the schema as a type argument:
@@ -15,19 +15,19 @@ function rebindEngine(engine) {
15
15
  return engine;
16
16
  }
17
17
  /**
18
- * The same rebind viewed through the reactive-read surface — the identical
19
- * runtime object, with model reads typed as snapshot rows, because everything
20
- * a selector returns is converted through `snapshotValue` before the hook
21
- * hands it back.
18
+ * The reactive-read view of a client — the identical runtime object, with
19
+ * model reads typed as snapshot rows, because everything a selector returns
20
+ * is converted through `snapshotValue` before the hook hands it back. Same
21
+ * generic in and out, so this compiles with no schema rebinding.
22
22
  */
23
23
  function reactiveReads(engine) {
24
- return rebindEngine(engine);
24
+ return engine;
25
25
  }
26
26
  function readModelResult(engine, modelClient, id, initial) {
27
27
  if (!modelClient || id === undefined) {
28
28
  return { data: initial, claims: EMPTY_CLAIMS, claimed: false };
29
29
  }
30
- const data = snapshotValue(modelClient.get(id) ?? initial);
30
+ const data = snapshotValue(modelClient.local.retrieve(id) ?? initial);
31
31
  const meta = getModelClientMeta(modelClient);
32
32
  const claims = meta && engine
33
33
  ? engine.claims.list({ model: meta.key, id })
@@ -55,8 +55,26 @@ function snapshotValue(value) {
55
55
  return value;
56
56
  }
57
57
  export function useAblo(modelOrSelect, id, options) {
58
+ return useAbloImpl(null, modelOrSelect, id, options);
59
+ }
60
+ /**
61
+ * @internal The one implementation behind `useAblo` and the bound hooks a
62
+ * `createAbloReact` binding returns — written once so the reactive read path
63
+ * cannot fork between the global hook and a factory's.
64
+ *
65
+ * `boundClient` is a binding's own context value — typed `Ablo<S>` at the
66
+ * factory, so that path never rebinds and never casts. `null` means "no
67
+ * binding provider in this tree": the global hook always passes it, and a
68
+ * binding hook mounted under a legacy provider falls through to the erased
69
+ * internal context, which is what keeps both mounts working while the last
70
+ * legacy mount migrates.
71
+ */
72
+ export function useAbloImpl(boundClient, modelOrSelect, id, options) {
58
73
  const ctx = useContext(AbloInternalContext);
59
- const engine = ctx?.engine ?? null;
74
+ // The bound client wins — it is already `Ablo<R>`, no rebinding. The
75
+ // fallback is the ONE remaining schema rebind in the SDK; it retires with
76
+ // the last legacy provider mount (docs/plans/typed-react-binding.md).
77
+ const engine = boundClient ?? (ctx?.engine ? rebindEngine(ctx.engine) : null);
60
78
  const initial = options?.initial;
61
79
  const isSelectorOnly = typeof modelOrSelect === 'function' && id === undefined;
62
80
  const modelClient = typeof modelOrSelect === 'function' && id !== undefined
@@ -98,5 +116,5 @@ export function useAblo(modelOrSelect, id, options) {
98
116
  return selected;
99
117
  if (modelOrSelect)
100
118
  return modelResult;
101
- return engine === null ? null : rebindEngine(engine);
119
+ return engine;
102
120
  }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { useContext } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
- import { AbloValidationError } from '../errors.js';
4
+ import { AbloValidationError } from '../transaction/errors.js';
5
5
  /**
6
6
  * Returns the application user id passed to the nearest `<AbloProvider>`, or
7
7
  * `null` when your app did not provide one.
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { useContext, useEffect, useRef } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
- import { AbloValidationError } from '../errors.js';
4
+ import { AbloValidationError } from '../transaction/errors.js';
5
5
  /**
6
6
  * Registers a callback that runs whenever the provider surfaces an error. This
7
7
  * covers engine errors such as bootstrap failures and mutation rejections,
@@ -1,6 +1,6 @@
1
- import type { Transaction } from '../transactions/TransactionQueue.js';
1
+ import type { QueuedMutation } from '../transactions/mutations/MutationQueue.js';
2
2
  export interface MutationFailurePayload {
3
- transaction: Transaction;
3
+ transaction: QueuedMutation;
4
4
  error: Error;
5
5
  permanent?: boolean;
6
6
  }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { useContext, useEffect, useRef } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
- import { AbloValidationError } from '../errors.js';
4
+ import { AbloValidationError } from '../transaction/errors.js';
5
5
  /**
6
6
  * Subscribes a listener to mutation failures. The callback fires whenever the
7
7
  * transaction queue rolls back an optimistic write — both permanent rejections
@@ -1,7 +1,7 @@
1
- import type { Schema } from '../schema/schema.js';
1
+ import type { Schema } from '../transaction/schema/schema.js';
2
2
  import type { MutatorDefs } from '../mutators/defineMutators.js';
3
3
  import type { UndoScope } from '../mutators/UndoManager.js';
4
- import type { ResolveSchema } from '../types/global.js';
4
+ import type { ResolveSchema } from '../transaction/types/global.js';
5
5
  /**
6
6
  * Turns a mutator tree built with `defineMutators` into callable invokers. The
7
7
  * returned object mirrors that tree one-to-one, but each leaf becomes an
@@ -41,7 +41,7 @@ export type MutatorInvokers<M> = {
41
41
  };
42
42
  /**
43
43
  * Options passed to `useMutators`. When `undoScope` is set, every mutator
44
- * invocation is wrapped in a `RecordingTransaction` and its inverses are
44
+ * invocation is wrapped in a `RecordingMutation` and its inverses are
45
45
  * pushed to the scope as one undo entry.
46
46
  */
47
47
  export interface UseMutatorsOptions<S extends Schema> {
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { useMemo } from 'react';
3
3
  import { createTransaction } from '../mutators/Transaction.js';
4
- import { createRecordingTransaction } from '../mutators/RecordingTransaction.js';
4
+ import { createRecordingMutation } from '../mutators/RecordingMutation.js';
5
5
  import { useSyncContext } from './context.js';
6
- import { AbloValidationError } from '../errors.js';
6
+ import { AbloValidationError } from '../transaction/errors.js';
7
7
  import { getContext } from '../context.js';
8
8
  export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
9
9
  const { store, organizationId, schema: ctxSchema } = useSyncContext();
@@ -48,7 +48,7 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
48
48
  // interleave their shared-model snapshots. See UndoScope.runRecorded.
49
49
  if (undoScope) {
50
50
  return undoScope.runRecorded(async () => {
51
- const recording = createRecordingTransaction(schema, store, organizationId);
51
+ const recording = createRecordingMutation(schema, store, organizationId);
52
52
  try {
53
53
  const result = await fn({ tx: recording.tx, args });
54
54
  const entry = recording.getEntry(label);
@@ -1,9 +1,9 @@
1
- import type { Schema } from '../schema/schema.js';
1
+ import type { Schema } from '../transaction/schema/schema.js';
2
2
  import type { UndoScope, UndoScopeOptions } from '../mutators/UndoManager.js';
3
- import type { ResolveSchema } from '../types/global.js';
3
+ import type { ResolveSchema } from '../transaction/types/global.js';
4
4
  /**
5
5
  * Provides per-surface undo and redo for mutator invocations. Each named scope
6
- * owns an independent undo/redo stack, so different parts of your app — a deck
6
+ * owns an independent undo/redo stack, so different parts of your app — a main
7
7
  * editor, a sidebar form — can undo separately without stepping on each other.
8
8
  *
9
9
  * Wire the returned `scope` into `useMutators(schema, mutators, { undoScope:
@@ -12,8 +12,8 @@ import type { ResolveSchema } from '../types/global.js';
12
12
  * themselves; the manager moves the entry between the two stacks explicitly.
13
13
  *
14
14
  * @example
15
- * const { undo, redo, canUndo, canRedo, scope } = useUndoScope('deck-editor');
16
- * const mutate = useMutators(schema, deckMutators, { undoScope: scope });
15
+ * const { undo, redo, canUndo, canRedo, scope } = useUndoScope('report-editor');
16
+ * const mutate = useMutators(schema, reportMutators, { undoScope: scope });
17
17
  *
18
18
  * // Cmd+Z handler
19
19
  * useHotkey('mod+z', () => { if (canUndo) void undo(); });
@@ -2,7 +2,7 @@
2
2
  import { useEffect, useMemo, useState } from 'react';
3
3
  import { UndoManager } from '../mutators/UndoManager.js';
4
4
  import { useSyncContext } from './context.js';
5
- import { AbloValidationError } from '../errors.js';
5
+ import { AbloValidationError } from '../transaction/errors.js';
6
6
  // Module-level weak registry: `SyncStoreContract` → `UndoManager`.
7
7
  // A single app wiring through one SyncProvider shares one manager across
8
8
  // every useUndoScope call, so scopes with the same name are identity-equal.