@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
@@ -0,0 +1,69 @@
1
+ /**
2
+ * `humans()` — the reactive materialiser, declared as a capability (ADR 0016).
3
+ *
4
+ * The bare client is the coordination layer: commit, read, observe, claim.
5
+ * Add `humans()` when people are watching — it declares the local, watchable
6
+ * copy: the offline store, live queries, presence, and the framework
7
+ * bindings. There is no `agents()` counterpart, and the absence is the
8
+ * message: agents are the default caller, not a special one.
9
+ *
10
+ * Transitional shape: the contract fields do real configuration work
11
+ * (`requires.duplex` rejects it on a request-response client at construction
12
+ * time; `materialises` is the five-second membership test as a checkable
13
+ * property), and `init` constructs what the widened context carries enough
14
+ * to build — the presence stream, attached to the connection the context
15
+ * carries, and the store cluster (this client's runtime, the component
16
+ * graph, the registered models, and the `BaseSyncedStore`), now that the
17
+ * context carries the resolved url and the credential source. What still
18
+ * lives in the composition root — the credential lifecycle, `ready()`, the
19
+ * model proxies, the resources, the framework bindings — migrates here as
20
+ * the context grows to carry what it needs.
21
+ */
22
+ import type { PluginContext, AppliedChange } from '../transaction/plugin.js';
23
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
24
+ import { type AttachablePresenceStream } from '../sync/createPresenceStream.js';
25
+ import { kStoreCluster, type StoreCluster } from './storeCluster.js';
26
+ import type { InternalAbloOptions } from './options.js';
27
+ /**
28
+ * What `humans()` contributes to the client — exactly the members that merge
29
+ * onto it, nothing else. Whether a plugin materialises is declared on the
30
+ * plugin itself, never restated on its surface.
31
+ *
32
+ * The one exception is deliberate and invisible to merging:
33
+ * {@link kStoreCluster} is symbol-keyed, and surface members merge onto the
34
+ * client by string key alone — so the cluster reaches the host without ever
35
+ * becoming client API.
36
+ */
37
+ export interface HumansSurface {
38
+ /**
39
+ * Who is here and what they are doing. Attached to the connection at
40
+ * construction; calls before the socket opens mutate local state and skip
41
+ * the wire send, and the stream re-announces on every connect.
42
+ */
43
+ readonly presence: AttachablePresenceStream;
44
+ /**
45
+ * The constructed store cluster, when the context carried enough to build
46
+ * it (the connection, the resolved url, the credential source, and a
47
+ * schema). Absent on a thinner context — the presence stream's own
48
+ * tolerance, applied to the store.
49
+ */
50
+ readonly [kStoreCluster]?: StoreCluster;
51
+ }
52
+ /**
53
+ * The reactive materialiser. Installed by default when `Ablo({ ... })` is
54
+ * constructed over the socket with no `plugins` list; listed explicitly, it
55
+ * reads as what it is — this client renders for people.
56
+ */
57
+ export declare function humans(): {
58
+ readonly id: "humans";
59
+ readonly requires: {
60
+ readonly duplex: true;
61
+ };
62
+ readonly materialises: true;
63
+ readonly stages: {
64
+ readonly apply: ({ changes }: {
65
+ readonly changes: readonly AppliedChange[];
66
+ }) => void;
67
+ };
68
+ readonly init: (context: PluginContext<InternalAbloOptions<SchemaRecord>>) => HumansSurface;
69
+ };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * `humans()` — the reactive materialiser, declared as a capability (ADR 0016).
3
+ *
4
+ * The bare client is the coordination layer: commit, read, observe, claim.
5
+ * Add `humans()` when people are watching — it declares the local, watchable
6
+ * copy: the offline store, live queries, presence, and the framework
7
+ * bindings. There is no `agents()` counterpart, and the absence is the
8
+ * message: agents are the default caller, not a special one.
9
+ *
10
+ * Transitional shape: the contract fields do real configuration work
11
+ * (`requires.duplex` rejects it on a request-response client at construction
12
+ * time; `materialises` is the five-second membership test as a checkable
13
+ * property), and `init` constructs what the widened context carries enough
14
+ * to build — the presence stream, attached to the connection the context
15
+ * carries, and the store cluster (this client's runtime, the component
16
+ * graph, the registered models, and the `BaseSyncedStore`), now that the
17
+ * context carries the resolved url and the credential source. What still
18
+ * lives in the composition root — the credential lifecycle, `ready()`, the
19
+ * model proxies, the resources, the framework bindings — migrates here as
20
+ * the context grows to carry what it needs.
21
+ */
22
+ import { AbloValidationError } from '../transaction/errors.js';
23
+ import { createPresenceStream, } from '../sync/createPresenceStream.js';
24
+ import { buildStoreCluster, kStoreCluster, } from './storeCluster.js';
25
+ /**
26
+ * The reactive materialiser. Installed by default when `Ablo({ ... })` is
27
+ * constructed over the socket with no `plugins` list; listed explicitly, it
28
+ * reads as what it is — this client renders for people.
29
+ */
30
+ export function humans() {
31
+ // The apply handler's target. `init` binds it to the store it constructs;
32
+ // until then the handler is a no-op, and nothing dispatches before then —
33
+ // the store itself is the pipeline that dispatches.
34
+ let applyChanges = null;
35
+ return {
36
+ id: 'humans',
37
+ // Live queries, presence, and claim push are server-initiated frames, so
38
+ // a request-response client rejects this plugin while it is being
39
+ // configured — a typed error, not a subscription that never delivers.
40
+ requires: { duplex: true },
41
+ // The point of the plugin: it keeps a local copy of rows. A stateless
42
+ // caller can assert its own list is uniformly false.
43
+ materialises: true,
44
+ stages: {
45
+ // Deltas land in the materialised in-memory graph at `apply` — the
46
+ // declaration and the handler are one field, so this cannot name a
47
+ // stage and forget the work.
48
+ apply: ({ changes }) => { applyChanges?.(changes); },
49
+ },
50
+ init: (context) => {
51
+ const cluster = buildStoreCluster(context);
52
+ if (cluster) {
53
+ // One client per humans() instance: the apply handler routes into
54
+ // the store this init built, so a shared instance would silently
55
+ // apply one client's deltas into another client's store.
56
+ if (applyChanges) {
57
+ throw new AbloValidationError('This humans() instance is already installed on a client. ' +
58
+ 'Construct a fresh humans() for each Ablo({ ... }) call.', { code: 'invalid_options', param: 'plugins' });
59
+ }
60
+ applyChanges = (changes) => { cluster.store.applyChangesToPool(changes); };
61
+ }
62
+ return {
63
+ presence: createPresenceStream({
64
+ participantId: context.participant?.id ?? '',
65
+ syncGroups: [...(context.syncGroups ?? [])],
66
+ // Peers' kinds are server-stamped; only the local `self` entry is ours.
67
+ isAgent: context.participant?.kind === 'agent',
68
+ },
69
+ // The host built the connection before resolving the plugin list, so
70
+ // the stream attaches now and starts the moment the feed opens.
71
+ context.transport ?? null),
72
+ ...(cluster ? { [kStoreCluster]: cluster } : {}),
73
+ };
74
+ },
75
+ // `satisfies` rather than a return annotation, so `id` keeps its literal
76
+ // type and a plugin list's surface can be keyed by id at the type level.
77
+ };
78
+ }
@@ -5,6 +5,6 @@
5
5
  * and opt-in field-level reactivity) and registers the model's properties,
6
6
  * relations, and any local-database indexes.
7
7
  */
8
- import type { Schema } from '../schema/schema.js';
8
+ import type { Schema } from '../transaction/schema/schema.js';
9
9
  import type { ModelRegistry } from '../ModelRegistry.js';
10
10
  export declare function registerModelsFromSchema(schema: Schema, registry: ModelRegistry): void;
@@ -6,9 +6,9 @@
6
6
  * relations, and any local-database indexes.
7
7
  */
8
8
  import { z } from 'zod';
9
- import { baseFieldsSchema } from '../schema/schema.js';
9
+ import { baseFieldsSchema } from '../transaction/schema/schema.js';
10
10
  import { Model } from '../Model.js';
11
- import { LoadStrategy, PropertyType } from '../types/index.js';
11
+ import { PropertyType } from '../transaction/types/index.js';
12
12
  // ── Auto model registration from schema ───────────────────────────────────
13
13
  export function registerModelsFromSchema(schema, registry) {
14
14
  registry.startBatch();
@@ -50,10 +50,10 @@ export function registerModelsFromSchema(schema, registry) {
50
50
  ];
51
51
  const computed = modelDef.computed;
52
52
  const DynamicModel = createDynamicModelClass(modelName, jsonSubFields, fieldNames, computed, isLazy);
53
- // Respect the schema's load strategy so lazy models skip IDB hydration + bootstrap
54
- const loadStrategy = modelDef.load === 'lazy' || modelDef.load === 'manual'
55
- ? LoadStrategy.lazy
56
- : LoadStrategy.instant;
53
+ // The schema's strategy carries straight through authoring and runtime
54
+ // name the same set, so there is nothing here to translate and nothing to
55
+ // fall out of step. Lazy models skip IDB hydration and bootstrap.
56
+ const loadStrategy = modelDef.load;
57
57
  registry.registerModel(modelName, DynamicModel, {
58
58
  loadStrategy,
59
59
  fields: modelDef.fields,
@@ -70,14 +70,14 @@ export function registerModelsFromSchema(schema, registry) {
70
70
  // id, and indexing every scalar is worse still.
71
71
  const indexedFields = new Set();
72
72
  for (const relDef of Object.values(modelDef.relations)) {
73
- if (relDef.type === 'belongsTo' && relDef.foreignKey && relDef.options?.index === true) {
73
+ if (relDef.type === 'belongsTo' && relDef.foreignKey && relDef.options.index === true) {
74
74
  indexedFields.add(relDef.foreignKey);
75
75
  }
76
76
  }
77
77
  // Register fields as properties (from Zod shape).
78
78
  for (const [fieldName, rawZodType] of Object.entries(modelDef.shape)) {
79
79
  const zodType = rawZodType;
80
- const isOptional = zodType.isOptional?.() ?? false;
80
+ const isOptional = zodType.isOptional();
81
81
  // A field is indexed if it is the foreign key of a
82
82
  // `belongsTo({ index: true })` relation. A `description === 'indexed'` tag
83
83
  // also works, for consumers using the `field.*().indexed()` builder.
@@ -87,7 +87,7 @@ export function registerModelsFromSchema(schema, registry) {
87
87
  // would walk every nested property and create an atom per leaf, producing a
88
88
  // storm of updates on each commit or streaming change. Reference tracking
89
89
  // watches only reassignment, which is how blob consumers actually use them.
90
- const wireType = modelDef.fields?.[fieldName]?.type;
90
+ const wireType = modelDef.fields[fieldName]?.type;
91
91
  const observability = wireType === 'json' ? 'ref' : undefined;
92
92
  registry.registerProperty(modelName, fieldName, {
93
93
  type: PropertyType.property,
@@ -4,19 +4,21 @@
4
4
  * construction surface exposed through `@abloatai/ablo/core`.
5
5
  * This module holds only types and has no runtime imports.
6
6
  */
7
- import type { Schema, SchemaRecord } from '../schema/schema.js';
8
- import type { SyncEngineConfig, SyncLogger, MutationExecutor, SyncObservabilityProvider, SyncAnalytics, SessionErrorDetector, OnlineStatusProvider } from '../interfaces/index.js';
9
- import type { AbloPersistence } from './persistence.js';
10
- import type { DurableWriteStore, DurableWritesConfig } from '../transactions/durableWriteStore.js';
11
- import type { CommitOutboxScope } from '../transactions/commitEnvelope.js';
7
+ import type { Schema, SchemaRecord } from '../transaction/schema/schema.js';
8
+ import type { RuntimeConfig, Logger, MutationExecutor, ObservabilityProvider, Analytics, SessionErrorDetector, OnlineStatusProvider } from '../interfaces/index.js';
9
+ import type { AbloPersistence } from '../transaction/persistence.js';
10
+ import type { DurableWriteStore, DurableWritesConfig } from '../transaction/durableWrites.js';
11
+ import type { CommitOutboxScope } from '../transaction/transactions/settlement/commitEnvelope.js';
12
12
  /**
13
13
  * An async function that resolves an apiKey at request time. Use it for credential
14
14
  * rotation — read from a vault, refresh from session storage, or pull from an
15
15
  * existing auth session. The canonical definition lives in `./auth`; it is
16
16
  * re-exported here for convenience.
17
17
  */
18
- export type { ApiKeySetter } from './auth.js';
19
- import type { ApiKeySetter } from './auth.js';
18
+ export type { ApiKeySetter } from '../transaction/auth/apiKey.js';
19
+ import type { ApiKeySetter } from '../transaction/auth/apiKey.js';
20
+ import type { AbloPlugin } from '../transaction/plugin.js';
21
+ import type { ParticipantKind } from '../transaction/types/participant.js';
20
22
  /**
21
23
  * Options for the {@link Ablo} client.
22
24
  *
@@ -39,6 +41,13 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
39
41
  * pass; start here.
40
42
  */
41
43
  schema: Schema<S>;
44
+ /**
45
+ * The capabilities installed on this client. Each plugin appears once in
46
+ * the list; a duplicate, or a plugin the chosen transport cannot carry,
47
+ * fails while the client is being constructed with an error naming the
48
+ * plugin. Omitted, the client installs `humans()` — today's default.
49
+ */
50
+ plugins?: readonly AbloPlugin[];
42
51
  /**
43
52
  * The API key — the auth field most apps set. It accepts three shapes:
44
53
  *
@@ -117,6 +126,15 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
117
126
  * })
118
127
  * ```
119
128
  */
129
+ /**
130
+ * Wire message types to surface as collaboration events, e.g.
131
+ * `['document:selection', 'document:cursor']`.
132
+ *
133
+ * These name your application's own concepts, so the SDK ships no default —
134
+ * a schema with no documents should never receive document events. Declare
135
+ * the ones you broadcast.
136
+ */
137
+ collaborationEvents?: readonly string[];
120
138
  durableWrites?: DurableWritesConfig;
121
139
  /**
122
140
  * @deprecated Use `durableWrites: { store, namespace }`.
@@ -142,8 +160,8 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
142
160
  * serverless handlers. It offers the same `ablo.<model>` surface and coordination
143
161
  * plane, but every call is a single HTTP round-trip, identity rides the bearer
144
162
  * credential, and no socket is opened. With `'http'` the return type narrows to
145
- * {@link AbloHttpClient}, so stateful-only capabilities such as `get`, `getAll`,
146
- * and `onChange` become compile errors instead of runtime gaps.
163
+ * {@link AbloHttpClient}, so stateful-only capabilities such as the `local`
164
+ * reads and `onChange` become compile errors instead of runtime gaps.
147
165
  *
148
166
  * Session minting through `sessions.create` is available on both transports.
149
167
  *
@@ -154,12 +172,18 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
154
172
  * Turns Ablo's diagnostic logging on or off. `true` surfaces the `[Ablo]`
155
173
  * coordination trace — claims requested, queued, granted, and released, agent
156
174
  * handovers, and connection state — so you can watch the coordination between
157
- * humans and agents while debugging. Omitting it, or `false`, keeps the quiet
175
+ * agents and people while debugging. Omitting it, or `false`, keeps the quiet
158
176
  * default of warnings and errors only. For a middle ground use {@link logLevel}.
159
177
  * The `ABLO_LOG_LEVEL` environment variable overrides it, and a custom logger
160
178
  * takes precedence.
161
179
  */
162
180
  debug?: boolean | undefined;
181
+ /**
182
+ * Route Ablo's log lines through your own logger (pino, winston, a test spy)
183
+ * instead of the default console `[Ablo]` logger. Supplying one bypasses
184
+ * {@link debug}/{@link logLevel} — your logger owns the thresholds.
185
+ */
186
+ logger?: Logger;
163
187
  /**
164
188
  * The log threshold for the default `[Ablo]` logger; takes precedence over
165
189
  * {@link debug}. `'info'` shows coordination and connection events without the
@@ -189,6 +213,33 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
189
213
  * session token (`ek_`/`rk_`) or you route through a controlled server proxy.
190
214
  */
191
215
  dangerouslyAllowBrowser?: boolean | undefined;
216
+ /**
217
+ * How far a write goes before its promise settles, for every model write on
218
+ * this client. The same word each write already takes per call
219
+ * (`create({ …, wait: 'confirmed' })`); setting it here makes it the default
220
+ * instead of repeating it.
221
+ *
222
+ * A write resolves as soon as it is applied locally and queued. That is what
223
+ * makes the UI immediate, and it is right for most writes — but it means a
224
+ * write the server later REFUSES has no caller left to tell. The rejection
225
+ * reverts the local row and reaches `ablo.onMutationFailure(…)`, and an
226
+ * application that subscribes to neither shows the change, then loses it,
227
+ * with nothing thrown anywhere.
228
+ *
229
+ * ```ts
230
+ * const ablo = new Ablo({ schema, apiKey, wait: 'confirmed' });
231
+ * try {
232
+ * await ablo.documents.update({ id, data }); // throws if refused
233
+ * } catch (err) {
234
+ * if (err instanceof AbloError) show(err.message);
235
+ * }
236
+ * ```
237
+ *
238
+ * The cost is real: each write now waits for the server's answer, so it is a
239
+ * choice between immediacy and certainty rather than a strict improvement.
240
+ * A per-call `wait` still wins over this.
241
+ */
242
+ wait?: 'queued' | 'confirmed' | undefined;
192
243
  }
193
244
  export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
194
245
  /**
@@ -257,7 +308,7 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
257
308
  * @deprecated The server derives the participant kind from the apiKey's scope.
258
309
  * Pass `apiKey` only.
259
310
  */
260
- kind?: 'user' | 'agent' | 'system';
311
+ kind?: ParticipantKind;
261
312
  /**
262
313
  * @deprecated The server derives user identity from the apiKey's scope, or from
263
314
  * the `Ablo-Acting-User` request header for multi-tenant setups. Pass `apiKey`
@@ -277,12 +328,12 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
277
328
  */
278
329
  capabilityToken?: string;
279
330
  /** Custom logger (default: console). Supplying one bypasses {@link debug}/{@link logLevel}. */
280
- logger?: SyncLogger;
331
+ logger?: Logger;
281
332
  /**
282
333
  * Turns Ablo's diagnostic logging on or off. `true` surfaces the `[Ablo]`
283
334
  * coordination trace — claims acquired, queued, granted, and released, agent
284
335
  * handovers, and connection state — along with internal lifecycle events, so you
285
- * can watch the coordination between humans and agents. Omitting it, or `false`,
336
+ * can watch the coordination between agents and people. Omitting it, or `false`,
286
337
  * keeps the quiet default of warnings and errors only. For a middle ground use
287
338
  * {@link logLevel}. The `ABLO_LOG_LEVEL` environment variable overrides it, and a
288
339
  * custom {@link logger} takes precedence.
@@ -307,6 +358,8 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
307
358
  */
308
359
  persistence?: AbloPersistence;
309
360
  /** Internal mirror of {@link AbloOptions.durableWrites}. */
361
+ /** Wire message types to surface as collaboration events. Empty unless declared. */
362
+ collaborationEvents?: readonly string[];
310
363
  durableWrites?: DurableWritesConfig;
311
364
  /** @deprecated Internal mirror of {@link AbloOptions.commitOutbox}. */
312
365
  commitOutbox?: DurableWriteStore;
@@ -344,12 +397,12 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
344
397
  * Custom observability provider (Sentry, Honeycomb, OTel, etc.).
345
398
  * Default: a noop implementation that drops all breadcrumbs and spans.
346
399
  */
347
- observability?: SyncObservabilityProvider;
400
+ observability?: ObservabilityProvider;
348
401
  /**
349
402
  * Custom analytics provider (PostHog, Amplitude, Segment, etc.).
350
403
  * Default: a noop implementation that drops all events.
351
404
  */
352
- analytics?: SyncAnalytics;
405
+ analytics?: Analytics;
353
406
  /**
354
407
  * Detect whether an error from a mutation/bootstrap response means the
355
408
  * user's session has expired. Used to surface re-auth prompts. Default:
@@ -371,12 +424,12 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
371
424
  */
372
425
  mutationExecutor?: MutationExecutor;
373
426
  /**
374
- * Partial overrides for the auto-derived `SyncEngineConfig`. Merged on
427
+ * Partial overrides for the auto-derived `RuntimeConfig`. Merged on
375
428
  * top of `deriveConfigFromSchema(schema)`. Use this when you need
376
429
  * specific `modelCreatePriority`, `batchableModels`, or
377
430
  * `essentialFields` settings that the schema cannot express.
378
431
  */
379
- configOverrides?: Partial<SyncEngineConfig>;
432
+ configOverrides?: Partial<RuntimeConfig>;
380
433
  /**
381
434
  * The sync groups (entity scopes) this client subscribes to. Normally the server
382
435
  * derives these from the apiKey's scope; pass them explicitly when the key does
@@ -402,4 +455,7 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
402
455
  * identity from the token through the identity endpoint instead.
403
456
  */
404
457
  organizationId?: string;
458
+ /** The client-wide write default — see {@link AbloOptions.wait}. Projected
459
+ * from the public option rather than restated, so the two cannot diverge. */
460
+ wait?: AbloOptions['wait'];
405
461
  }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * The reactive engine assembly (ADR 0016). `Ablo({ ... })` resolves auth and
3
+ * capabilities; `humans().init` constructs the store cluster; the lifecycle
4
+ * — first mint, identity, ready() — lives in `./storeLifecycle.ts`. What
5
+ * remains here is assembly around those parts: the claim stream and
6
+ * participant manager, options validation, the typed model proxies, and the
7
+ * commit/claim/session resources — composed into the reactive client.
8
+ *
9
+ * Extracted from the factory so the composition root stays a root: resolve,
10
+ * dispatch, return. The remaining assembly converts to decoration of a
11
+ * host-built core client with the per-model surface split — the cut's own
12
+ * design step (docs/plans/package-split.md).
13
+ */
14
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
15
+ import type { StoreCluster } from './storeCluster.js';
16
+ import type { SyncWebSocket } from '../sync/SyncWebSocket.js';
17
+ import type { AttachablePresenceStream } from '../sync/createPresenceStream.js';
18
+ import type { AbloOptions } from './options.js';
19
+ import type { ClientPrelude } from './clientPrelude.js';
20
+ import type { Ablo } from './Ablo.js';
21
+ /**
22
+ * What the reactive build is fed: the factory's pass over the options bag
23
+ * ({@link ClientPrelude} — auth, url, logging, identity, shared with the other
24
+ * client shapes), plus the four things that must exist before the store does.
25
+ *
26
+ * The prelude half is extended, never restated. A second copy of those fields
27
+ * would drift the moment one side gained a resolver the other did not.
28
+ */
29
+ export interface ReactiveEngineInputs<S extends SchemaRecord> extends ClientPrelude<S> {
30
+ options: AbloOptions<S>;
31
+ /**
32
+ * The connection, constructed by the factory before the plugin list
33
+ * resolved — the same instance `PluginContext.transport` carries. The
34
+ * store takes it as a dependency and owns the lifecycle.
35
+ */
36
+ transport: SyncWebSocket;
37
+ /** The humans() plugin's contribution — built by its `init`, already
38
+ * attached to the connection the context carried. */
39
+ presence: AttachablePresenceStream;
40
+ /**
41
+ * The store cluster `humans().init` constructed from the widened context:
42
+ * this client's runtime, the component graph, and the store. The engine
43
+ * assembles around it and constructs none of it.
44
+ */
45
+ cluster: StoreCluster;
46
+ /**
47
+ * Constructs a sibling client (`ablo.agents.create(...)` mints a scoped key
48
+ * and builds a second engine with it). Injected by the factory — a direct
49
+ * import back into it would close a runtime cycle.
50
+ */
51
+ createSibling: (options: AbloOptions<S>) => Ablo<S>;
52
+ }
53
+ export declare function buildReactiveEngine<const S extends SchemaRecord>(inputs: ReactiveEngineInputs<S>): Ablo<S>;