@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,190 +1,8 @@
1
- /**
2
- * The Ablo API-key format: how keys are minted, hashed, and validated, in one
3
- * place so every component that issues or checks a key agrees on the format.
4
- *
5
- * This module uses `node:crypto` and is therefore Node-only. It is published on
6
- * the `@abloatai/ablo/keys` subpath and kept off the main browser-facing entry
7
- * so a browser bundle never pulls in `node:crypto`.
8
- *
9
- * A key looks like `<sk|rk|ek|pk>_<live|test>_<30 base62 chars><6-char base62
10
- * CRC32 checksum>`. The middle segment is the stable environment prefix, mapped
11
- * on parse to `production` or `sandbox`. The recognizable prefix lets secret
12
- * scanners spot a leaked key, and the trailing checksum lets the format reject a
13
- * mistyped or forged key locally, without a database round-trip. Older keys
14
- * (roughly a 43-character base64url body with no checksum) still validate by hash
15
- * and parse here with `checksummed: false`.
16
- */
17
- import { createHash, randomBytes } from 'node:crypto';
18
- import { z } from 'zod';
19
- import { ENVIRONMENTS, environmentFromKeyPrefix, environmentToKeyPrefix, } from '../environment.js';
20
- // ── Vocabulary ──────────────────────────────────────────────────────────
21
- // The four key kinds:
22
- // secret (sk_) — backend and server-to-server use, including agents. Full
23
- // authority; never expose one in a browser.
24
- // restricted (rk_) — a scoped server key, such as an agent session token or a
25
- // narrowed capability.
26
- // ephemeral (ek_) — a short-lived, backend-minted session credential scoped to
27
- // one user, safe to hand to that user's browser. Carries
28
- // `participantKind: 'user'` and its baked-in sync groups.
29
- // publishable (pk_) — a long-lived, browser-safe, organization-scoped read-only
30
- // key. It is used directly as the bearer token — never
31
- // exchanged, never expires, nothing to refresh. It grants
32
- // read access to the organization's data and cannot write or
33
- // reach any control-plane operation.
34
- export const API_KEY_KINDS = ['secret', 'restricted', 'ephemeral', 'publishable'];
35
- export const API_KEY_ENVS = ENVIRONMENTS;
36
- const PREFIX_BY_KIND = {
37
- secret: 'sk',
38
- restricted: 'rk',
39
- ephemeral: 'ek',
40
- publishable: 'pk',
41
- };
42
- const KIND_BY_PREFIX = {
43
- sk: 'secret',
44
- rk: 'restricted',
45
- ek: 'ephemeral',
46
- pk: 'publishable',
47
- };
48
- const BASE62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
49
- /** Random base62 chars before the checksum. */
50
- const KEY_BODY_LEN = 30;
51
- /** base62(CRC32): 62^6 (~5.7e10) > 2^32, so a CRC32 always fits in 6 chars. */
52
- const CHECKSUM_LEN = 6;
53
- /** A new checksummed body is exactly this long and pure base62. */
54
- const CHECKSUMMED_BODY_LEN = KEY_BODY_LEN + CHECKSUM_LEN;
55
- /** `<sk|rk|ek|pk>_<live|test>_<body>`; the body charset covers base62 as well as the legacy base64url form. */
56
- const KEY_RE = /^(sk|rk|ek|pk)_(live|test)_([0-9A-Za-z\-_]+)$/;
57
- const BASE62_RE = /^[0-9A-Za-z]+$/;
58
- // ── Checksum (standard CRC-32, GitHub-compatible) ───────────────────────
59
- const CRC32_TABLE = (() => {
60
- const t = new Uint32Array(256);
61
- for (let n = 0; n < 256; n++) {
62
- let c = n;
63
- for (let k = 0; k < 8; k++)
64
- c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
65
- t[n] = c >>> 0;
66
- }
67
- return t;
68
- })();
69
- function crc32(s) {
70
- let c = 0xffffffff;
71
- for (let i = 0; i < s.length; i++) {
72
- // `& 0xff` bounds the index to the 256-entry table — the ?? 0 is unreachable.
73
- c = ((CRC32_TABLE[(c ^ s.charCodeAt(i)) & 0xff] ?? 0) ^ (c >>> 8)) >>> 0;
74
- }
75
- return (c ^ 0xffffffff) >>> 0;
76
- }
77
- /** 6-char base62 encoding of the CRC32 of `payload`. */
78
- function checksum6(payload) {
79
- let n = crc32(payload);
80
- let out = '';
81
- for (let i = 0; i < CHECKSUM_LEN; i++) {
82
- out = BASE62.charAt(n % 62) + out;
83
- n = Math.floor(n / 62);
84
- }
85
- return out;
86
- }
87
- /** `len` cryptographically-random base62 chars (rejection-sampled, no bias). */
88
- function randomBase62(len) {
89
- let out = '';
90
- while (out.length < len) {
91
- for (const b of randomBytes(len * 2)) {
92
- if (b < 248) {
93
- out += BASE62.charAt(b % 62);
94
- if (out.length === len)
95
- break;
96
- }
97
- }
98
- }
99
- return out;
100
- }
101
- function bodyIsChecksummed(body) {
102
- return body.length === CHECKSUMMED_BODY_LEN && BASE62_RE.test(body);
103
- }
104
- /**
105
- * The Zod schema for an Ablo API key. `parse` and `safeParse` return a typed
106
- * {@link ParsedApiKey}. A checksummed-format key whose checksum does not match is
107
- * rejected without any network call; an older key with no checksum parses with
108
- * `checksummed: false` and is left for the server to validate by hash.
109
- */
110
- export const apiKeySchema = z.string().transform((raw, ctx) => {
111
- const m = KEY_RE.exec(raw);
112
- if (!m) {
113
- ctx.addIssue({ code: 'custom', message: 'not a valid Ablo API key format' });
114
- return z.NEVER;
115
- }
116
- const [, prefix, env, body] = m;
117
- const kind = prefix === undefined ? undefined : KIND_BY_PREFIX[prefix];
118
- // Unreachable on a KEY_RE match (all three groups are non-optional and the
119
- // prefix alternation is exactly the KIND_BY_PREFIX key set) — narrows the
120
- // regex-group lookups for the checks below.
121
- if (kind === undefined || env === undefined || body === undefined) {
122
- ctx.addIssue({ code: 'custom', message: 'not a valid Ablo API key format' });
123
- return z.NEVER;
124
- }
125
- const checksummed = bodyIsChecksummed(body);
126
- if (checksummed && checksum6(raw.slice(0, -CHECKSUM_LEN)) !== body.slice(KEY_BODY_LEN)) {
127
- ctx.addIssue({ code: 'custom', message: 'API key checksum mismatch' });
128
- return z.NEVER;
129
- }
130
- return {
131
- raw,
132
- kind,
133
- env: environmentFromKeyPrefix(env),
134
- body,
135
- checksummed,
136
- };
137
- });
138
- // ── Derived validators (thin wrappers over the same spec) ───────────────
139
- /** Parse + fully validate (incl. checksum). Returns null when invalid. */
140
- export function parseApiKey(raw) {
141
- const r = apiKeySchema.safeParse(raw);
142
- return r.success ? r.data : null;
143
- }
144
- /** True when the key uses the new checksummed format (regardless of validity). */
145
- export function isChecksummedKey(raw) {
146
- const body = KEY_RE.exec(raw)?.[3];
147
- return body !== undefined && bodyIsChecksummed(body);
148
- }
149
- /** Verify the embedded checksum. Meaningful only for checksummed-format keys. */
150
- export function keyChecksumMatches(raw) {
151
- const body = KEY_RE.exec(raw)?.[3];
152
- if (body === undefined || !bodyIsChecksummed(body))
153
- return false;
154
- return checksum6(raw.slice(0, -CHECKSUM_LEN)) === body.slice(KEY_BODY_LEN);
155
- }
156
- // ── Mint + hash (node:crypto) ───────────────────────────────────────────
157
- /**
158
- * Mint a key: `<prefix>_<env>_<body><checksum>`. Returns the plaintext (shown
159
- * once), its SHA-256 hash (persisted), and the 12-char display prefix.
160
- */
161
- export function generateApiKey(env = 'production', kind = 'secret') {
162
- const body = randomBase62(KEY_BODY_LEN);
163
- const payload = `${PREFIX_BY_KIND[kind]}_${environmentToKeyPrefix(env)}_${body}`;
164
- const plaintext = `${payload}${checksum6(payload)}`;
165
- return { plaintext, hash: hashApiKey(plaintext), prefix: plaintext.slice(0, 12) };
166
- }
167
- /**
168
- * The stable SHA-256 hex digest of a plaintext key, computed both when a key is
169
- * minted and when one is looked up. A fast hash is the right choice here rather
170
- * than a password hash like bcrypt: API keys are long random strings, so there is
171
- * no dictionary of guesses to slow down.
172
- */
173
- export function hashApiKey(plaintext) {
174
- return createHash('sha256').update(plaintext).digest('hex');
175
- }
176
- /** `whsec_` label prefix per the Standard Webhooks spec (not part of the key material). */
177
- export const WEBHOOK_SECRET_PREFIX = 'whsec_';
178
- /**
179
- * Mints a webhook signing secret following the Standard Webhooks specification
180
- * (https://www.standardwebhooks.com): a base64-encoded random key of 24–64 bytes,
181
- * labelled with the `whsec_` prefix. This uses 32 bytes (256 bits), comfortably
182
- * inside that range. Unlike an API key, a signing secret is not hashed at rest,
183
- * because signing a request with {@link signAbloSourceRequest} needs the live
184
- * value. It is therefore kept in a secret store, returned to the customer once at
185
- * creation, and never shown again.
186
- */
187
- export function generateWebhookSecret() {
188
- const plaintext = `${WEBHOOK_SECRET_PREFIX}${randomBytes(32).toString('base64')}`;
189
- return { plaintext, last4: plaintext.slice(-4) };
190
- }
1
+ // Moved to @ablo/transaction (ADR 0013 — the settlement core extraction).
2
+ // This shim re-exports it at the original path so in-package importers of
3
+ // `keys/index.js` keep working; rewire to `@ablo/transaction/keys`
4
+ // and delete this shim once the core package is fully wired.
5
+ //
6
+ // Line comments on purpose: tsc copies a leading JSDoc block into the
7
+ // published `.d.ts`, and this note names a package npm has never heard of.
8
+ export * from '../transaction/keys/index.js';
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * The mutator sees an ordinary `Transaction<S>` and is unaware it is being
7
7
  * recorded. When the mutator returns, the caller reads
8
- * {@link RecordingTransaction.getEntry} and pushes the result onto the active
8
+ * {@link RecordingMutation.getEntry} and pushes the result onto the active
9
9
  * {@link UndoScope}.
10
10
  *
11
11
  * The snapshots are taken here rather than in the undo scope because they must
@@ -14,11 +14,11 @@
14
14
  * of a create is just a delete by id, but that id is known only after creation,
15
15
  * since the schema generates one when the caller omits it.
16
16
  */
17
- import type { Schema } from '../schema/schema.js';
17
+ import type { Schema } from '../transaction/schema/schema.js';
18
18
  import type { SyncStoreContract } from '../react/context.js';
19
19
  import type { Transaction } from './Transaction.js';
20
20
  import type { UndoEntry } from './UndoManager.js';
21
- export interface RecordingTransaction<S extends Schema> {
21
+ export interface RecordingMutation<S extends Schema> {
22
22
  /** The wrapped transaction — pass this into the mutator. */
23
23
  tx: Transaction<S>;
24
24
  /**
@@ -33,4 +33,4 @@ export interface RecordingTransaction<S extends Schema> {
33
33
  * side-effect-only mutator should call {@link createTransaction} directly to skip
34
34
  * the bookkeeping.
35
35
  */
36
- export declare function createRecordingTransaction<S extends Schema>(schema: S, store: SyncStoreContract, organizationId: string): RecordingTransaction<S>;
36
+ export declare function createRecordingMutation<S extends Schema>(schema: S, store: SyncStoreContract, organizationId: string): RecordingMutation<S>;
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * The mutator sees an ordinary `Transaction<S>` and is unaware it is being
7
7
  * recorded. When the mutator returns, the caller reads
8
- * {@link RecordingTransaction.getEntry} and pushes the result onto the active
8
+ * {@link RecordingMutation.getEntry} and pushes the result onto the active
9
9
  * {@link UndoScope}.
10
10
  *
11
11
  * The snapshots are taken here rather than in the undo scope because they must
@@ -21,7 +21,7 @@ import { createTransaction } from './Transaction.js';
21
21
  * side-effect-only mutator should call {@link createTransaction} directly to skip
22
22
  * the bookkeeping.
23
23
  */
24
- export function createRecordingTransaction(schema, store, organizationId) {
24
+ export function createRecordingMutation(schema, store, organizationId) {
25
25
  const inverses = [];
26
26
  const forwards = [];
27
27
  const inner = createTransaction(schema, store, organizationId);
@@ -13,7 +13,7 @@
13
13
  * coalesces them into a single commit on the wire, so there is no separate
14
14
  * bulk-insert method to learn.
15
15
  */
16
- import type { Schema } from '../schema/schema.js';
16
+ import type { Schema } from '../transaction/schema/schema.js';
17
17
  import type { SyncStoreContract } from '../react/context.js';
18
18
  import { type MutateActions } from './mutateActions.js';
19
19
  import { type ReaderActions, type ReaderFindOptions } from './readerActions.js';
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { createMutateActions } from './mutateActions.js';
17
17
  import { createReaderActions } from './readerActions.js';
18
- import { AbloValidationError } from '../errors.js';
18
+ import { AbloValidationError } from '../transaction/errors.js';
19
19
  /**
20
20
  * Builds a {@link Transaction} for a single mutator invocation. The returned
21
21
  * object creates each model's actions lazily on first access, so a mutator pays
@@ -4,8 +4,8 @@
4
4
  * operations; `undo()` pops the most recent group and replays those inverses
5
5
  * without recording them, then moves the entry onto the redo stack.
6
6
  *
7
- * History is divided into named scopes, one per surface — a deck editor, a
8
- * spreadsheet, and so on — reached through {@link UndoManager.getScope}. Undo in
7
+ * History is divided into named scopes, one per surface — a report editor, a
8
+ * ledger grid, and so on — reached through {@link UndoManager.getScope}. Undo in
9
9
  * one surface never affects another.
10
10
  *
11
11
  * Two things to know about its reach. History lives in memory and does not
@@ -13,7 +13,7 @@
13
13
  * applied optimistically, the undo stack is not invalidated automatically; call
14
14
  * {@link UndoScope.clear} on a sync error if you need strict correctness.
15
15
  */
16
- import type { Schema } from '../schema/schema.js';
16
+ import type { Schema } from '../transaction/schema/schema.js';
17
17
  import type { SyncStoreContract } from '../react/context.js';
18
18
  import { type InverseOp, type UndoEntry } from './inverseOp.js';
19
19
  import { type UndoConflictPolicy } from './undoApply.js';
@@ -33,8 +33,8 @@ export interface UndoScopeOptions {
33
33
  conflictPolicy?: UndoConflictPolicy;
34
34
  /**
35
35
  * A predicate selecting which models this surface owns. The scope records only
36
- * mutations whose resolved schema key passes it, so, for example, a spreadsheet
37
- * edit never lands on a deck editor's undo stack. Omit it to track every model,
36
+ * mutations whose resolved schema key passes it, so, for example, a ledger
37
+ * edit never lands on a report editor's undo stack. Omit it to track every model,
38
38
  * which is fine for a single-surface app but wrong when two surfaces with
39
39
  * independent undo share one store.
40
40
  */
@@ -157,7 +157,7 @@ export declare class UndoScope<S extends Schema> {
157
157
  * The stream listener, and the only place stream-recorded entries originate. It
158
158
  * skips replay echoes and out-of-scope models, derives the forward and inverse
159
159
  * operations from the mutation's `data` and `previousData`, and defers the stack
160
- * push to a per-tick flush, so a burst of writes — aligning five layers at once,
160
+ * push to a per-tick flush, so a burst of writes — aligning five blocks at once,
161
161
  * say — becomes a single undo step.
162
162
  */
163
163
  private onLocalMutation;
@@ -4,8 +4,8 @@
4
4
  * operations; `undo()` pops the most recent group and replays those inverses
5
5
  * without recording them, then moves the entry onto the redo stack.
6
6
  *
7
- * History is divided into named scopes, one per surface — a deck editor, a
8
- * spreadsheet, and so on — reached through {@link UndoManager.getScope}. Undo in
7
+ * History is divided into named scopes, one per surface — a report editor, a
8
+ * ledger grid, and so on — reached through {@link UndoManager.getScope}. Undo in
9
9
  * one surface never affects another.
10
10
  *
11
11
  * Two things to know about its reach. History lives in memory and does not
@@ -120,9 +120,9 @@ export class UndoScope {
120
120
  this.conflictPolicy = options.conflictPolicy ?? DEFAULT_UNDO_CONFLICT_POLICY;
121
121
  this.tracksModel = options.tracksModel;
122
122
  // Build the map from registered name to schema key. The mutation stream
123
- // reports a model's registered name (for example `'SlideLayer'`), but inverse
123
+ // reports a model's registered name (for example `'Block'`), but inverse
124
124
  // operations and the replay transaction are keyed by the schema key (for
125
- // example `'slideLayers'`), so map every reasonable spelling to the schema key.
125
+ // example `'blocks'`), so map every reasonable spelling to the schema key.
126
126
  for (const schemaKey of Object.keys(this.schema.models)) {
127
127
  const def = this.schema.models[schemaKey];
128
128
  const typename = def?.typename ?? schemaKey;
@@ -252,7 +252,7 @@ export class UndoScope {
252
252
  * The stream listener, and the only place stream-recorded entries originate. It
253
253
  * skips replay echoes and out-of-scope models, derives the forward and inverse
254
254
  * operations from the mutation's `data` and `previousData`, and defers the stack
255
- * push to a per-tick flush, so a burst of writes — aligning five layers at once,
255
+ * push to a per-tick flush, so a burst of writes — aligning five blocks at once,
256
256
  * say — becomes a single undo step.
257
257
  */
258
258
  onLocalMutation(m) {
@@ -2,7 +2,7 @@
2
2
  * Declares a tree of named custom mutators grouped by model key. Each mutator is
3
3
  * a plain async function that receives `{ tx, args }` and composes any number of
4
4
  * `tx.mutations.*` and `tx.read.*` calls to carry out a named operation, such as
5
- * `slides.createWithLayers`.
5
+ * `sections.createWithBlocks`.
6
6
  *
7
7
  * The function is purely a place for types to anchor and returns its input
8
8
  * unchanged; the runtime that dispatches a mutator lives elsewhere — the
@@ -11,9 +11,9 @@
11
11
  * `typeof mutators` carries every mutator's precise `args` and result types
12
12
  * through to wherever they are invoked.
13
13
  */
14
- import type { Schema } from '../schema/schema.js';
14
+ import type { Schema } from '../transaction/schema/schema.js';
15
15
  import type { Transaction } from './Transaction.js';
16
- import type { ResolveSchema } from '../types/global.js';
16
+ import type { ResolveSchema } from '../transaction/types/global.js';
17
17
  /**
18
18
  * `ResolveSchema` narrowed to satisfy the `Schema` bound — mirrors
19
19
  * {@link Ablo.RegisteredSchema}. When nothing is registered, `ResolveSchema`
@@ -2,7 +2,7 @@
2
2
  * Declares a tree of named custom mutators grouped by model key. Each mutator is
3
3
  * a plain async function that receives `{ tx, args }` and composes any number of
4
4
  * `tx.mutations.*` and `tx.read.*` calls to carry out a named operation, such as
5
- * `slides.createWithLayers`.
5
+ * `sections.createWithBlocks`.
6
6
  *
7
7
  * The function is purely a place for types to anchor and returns its input
8
8
  * unchanged; the runtime that dispatches a mutator lives elsewhere — the
@@ -15,7 +15,7 @@
15
15
  * `deleteMany`) — so a recorded entry mirrors the call that produced it.
16
16
  */
17
17
  import { z } from 'zod';
18
- import { AbloValidationError } from '../errors.js';
18
+ import { AbloValidationError } from '../transaction/errors.js';
19
19
  /** A row payload — JSON-shaped record used by create/createMany inverses. */
20
20
  const rowDataSchema = z.record(z.string(), z.unknown());
21
21
  /**
@@ -41,7 +41,7 @@ export const inverseOpSchema = z.discriminatedUnion('kind', [
41
41
  ]);
42
42
  /** One undo entry = one mutator invocation's inverses + paired forwards. */
43
43
  export const undoEntrySchema = z.object({
44
- /** Optional label for diagnostics / UI ("Move layer", "Delete slide", etc). */
44
+ /** Optional label for diagnostics / UI ("Move block", "Delete section", etc). */
45
45
  label: z.string().optional(),
46
46
  /** Applied (in array order) to reverse the invocation. */
47
47
  inverses: z.array(inverseOpSchema),
@@ -1,14 +1,14 @@
1
- import type { Schema, InferModel, InferCreate } from '../schema/schema.js';
1
+ import type { Schema, InferModel, InferCreate } from '../transaction/schema/schema.js';
2
2
  import type { SyncStoreContract } from '../react/context.js';
3
3
  /**
4
4
  * The create, update, and delete actions for one model. Each action is
5
5
  * overloaded: pass a single row to act on one entity, or an array to act on
6
6
  * many within the same synchronous tick. An array call stages every entry
7
7
  * together through `Promise.all`, so the microtask coalescer in
8
- * `TransactionQueue` collapses the whole batch into one commit on the wire.
8
+ * `MutationQueue` collapses the whole batch into one commit on the wire.
9
9
  *
10
10
  * These are plain imperative actions with no React dependency. The transaction
11
- * system (`Transaction` and `RecordingTransaction`) and `BaseSyncedStore` build
11
+ * system (`Transaction` and `RecordingMutation`) and `BaseSyncedStore` build
12
12
  * on them, and application code reaches them through `ablo.<model>.create`,
13
13
  * `ablo.<model>.update`, and `ablo.<model>.delete`.
14
14
  */
@@ -1,5 +1,5 @@
1
1
  import { Model, modelAsRow } from '../Model.js';
2
- import { AbloValidationError } from '../errors.js';
2
+ import { AbloValidationError } from '../transaction/errors.js';
3
3
  /** Builds the create, update, and delete actions for one model over a store. */
4
4
  export function createMutateActions(schema, modelKey, store, organizationId) {
5
5
  const modelDef = schema.models[modelKey];
@@ -1,4 +1,4 @@
1
- import type { Schema, InferModel } from '../schema/schema.js';
1
+ import type { Schema, InferModel } from '../transaction/schema/schema.js';
2
2
  import type { SyncStoreContract } from '../react/context.js';
3
3
  /**
4
4
  * Imperative, non-reactive reads over a store for one model. The `retrieve`,
@@ -25,7 +25,7 @@
25
25
  */
26
26
  import type { SyncStoreContract } from '../react/context.js';
27
27
  import type { InverseOp } from './inverseOp.js';
28
- import { deepEqual } from '../utils/json.js';
28
+ import { deepEqual } from '../transaction/utils/json.js';
29
29
  /**
30
30
  * How undo and redo treat a field that a collaborator changed after your
31
31
  * operation.
@@ -23,7 +23,7 @@
23
23
  * When no collaborator is involved, the live value always equals what you set,
24
24
  * so nothing is dropped and single-user undo behaves exactly as before.
25
25
  */
26
- import { deepEqual } from '../utils/json.js';
26
+ import { deepEqual } from '../transaction/utils/json.js';
27
27
  export const DEFAULT_UNDO_CONFLICT_POLICY = 'skip-stale';
28
28
  /**
29
29
  * Structural equality for JSON-shaped values — scalars, arrays, and plain
@@ -17,5 +17,5 @@
17
17
  * };
18
18
  * ```
19
19
  */
20
- export type { Conflict, ConflictAxis, ConflictDecision, ConflictKind, ConflictOperation, ConflictPolicy, StaleContextConflict, ClaimHeldConflict, } from './types.js';
21
- export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from './types.js';
20
+ export type { Conflict, ConflictAxis, ConflictDecision, ConflictKind, ConflictOperation, ConflictPolicy, StaleContextConflict, ClaimHeldConflict, } from '../transaction/policy/types.js';
21
+ export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from '../transaction/policy/types.js';
@@ -17,4 +17,4 @@
17
17
  * };
18
18
  * ```
19
19
  */
20
- export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from './types.js';
20
+ export { defaultPolicy, capabilityPreemptPolicy, interpretConflictAxis } from '../transaction/policy/types.js';
@@ -12,8 +12,9 @@
12
12
  * repeating the fetch and error-handling boilerplate.
13
13
  */
14
14
  import type { QueryBatch, QueryBatchResult } from './types.js';
15
- import { type RecoveryClass } from '../errorCodes.js';
16
- import { type AuthTokenGetter } from '../auth/credentialSource.js';
15
+ import { type RecoveryClass } from '../transaction/errorCodes.js';
16
+ import { type AuthTokenGetter } from '../transaction/auth/credentialSource.js';
17
+ import type { RuntimeContext } from '../RuntimeContext.js';
17
18
  export interface PostQueryOptions {
18
19
  /**
19
20
  * Full base URL of the sync server including the `/api` prefix.
@@ -23,6 +24,8 @@ export interface PostQueryOptions {
23
24
  baseUrl: string;
24
25
  /** Timeout in ms for the fetch request. Default: 30000. */
25
26
  fetchTimeout?: number;
27
+ /** The owning client's runtime. Defaults to the module-global bridge. */
28
+ runtime?: RuntimeContext;
26
29
  /**
27
30
  * Live bearer credential getter. Preferred over `capabilityToken` because it
28
31
  * is read per request, so token refreshes propagate without reconstructing
@@ -12,10 +12,10 @@
12
12
  * repeating the fetch and error-handling boilerplate.
13
13
  */
14
14
  import { z } from 'zod';
15
- import { translateHttpError } from '../errors.js';
16
- import { classifyRecovery } from '../errorCodes.js';
17
- import { withAuthHeaders } from '../auth/credentialSource.js';
18
- import { getContext } from '../context.js';
15
+ import { translateHttpError } from '../transaction/errors.js';
16
+ import { classifyRecovery } from '../transaction/errorCodes.js';
17
+ import { withAuthHeaders } from '../transaction/auth/credentialSource.js';
18
+ import { globalRuntime } from '../context.js';
19
19
  // ── Response validation ─────────────────────────────────────────────────
20
20
  //
21
21
  // Each result slot is an array of rows, or an object for a bundled response.
@@ -34,7 +34,7 @@ const QueryBatchResultSchema = z
34
34
  .object({
35
35
  results: z.array(QueryResultSchema),
36
36
  })
37
- .passthrough();
37
+ .loose();
38
38
  /**
39
39
  * Sends a batch of queries to `/sync/query` and returns the parsed
40
40
  * {@link QueryBatchResult}. An HTTP failure is not thrown: it is logged, and
@@ -50,6 +50,7 @@ const QueryBatchResultSchema = z
50
50
  export async function postQuery(options, batch) {
51
51
  const url = `${options.baseUrl}/sync/query`;
52
52
  const timeout = options.fetchTimeout ?? 30_000;
53
+ const runtime = options.runtime ?? globalRuntime;
53
54
  // At most two attempts: the original request, plus one replay after a
54
55
  // successful credential recovery (see `recoverCredential`). A second auth
55
56
  // rejection falls through to the log-and-empty path, so a wedged credential
@@ -97,7 +98,7 @@ export async function postQuery(options, batch) {
97
98
  : 'access_credential_expiry';
98
99
  const outcome = await options.recoverCredential(recovery);
99
100
  if (outcome === 'retry') {
100
- getContext().logger.debug('[postQuery] credential recovered — replaying query once', {
101
+ runtime.logger.debug('[postQuery] credential recovered — replaying query once', {
101
102
  code: err.code ?? response.status,
102
103
  });
103
104
  continue;
@@ -109,8 +110,8 @@ export async function postQuery(options, batch) {
109
110
  // `debug` line. The read stays empty until the underlying cause, such
110
111
  // as auth or network, is resolved.
111
112
  const models = batch.queries.map((q) => q.model).join(', ');
112
- getContext().logger.warn(`Could not load ${models} — ${err.message} (code: ${err.code ?? response.status}). No results were returned.`);
113
- getContext().logger.debug('[postQuery.error] query http failure', {
113
+ runtime.logger.warn(`Could not load ${models} — ${err.message} (code: ${err.code ?? response.status}). No results were returned.`);
114
+ runtime.logger.debug('[postQuery.error] query http failure', {
114
115
  type: err.type,
115
116
  code: err.code ?? response.status,
116
117
  models,
@@ -123,7 +124,7 @@ export async function postQuery(options, batch) {
123
124
  if (!parsed.success) {
124
125
  // A malformed server response isn't something the consumer can act on
125
126
  // (server/protocol issue) → debug, gated like everything else.
126
- getContext().logger.debug('[postQuery.error] malformed response', {
127
+ runtime.logger.debug('[postQuery.error] malformed response', {
127
128
  issues: parsed.error.issues,
128
129
  });
129
130
  return { results: batch.queries.map(() => []) };
@@ -5,55 +5,20 @@
5
5
  * list of `[column, operator, value]` conditions combined with AND, and
6
6
  * `related` names the schema relations to fetch alongside each row. The server
7
7
  * compiles a query against your schema: it reads the model's relation metadata
8
- * to turn `related: ['layers']` into the right join, and turns each condition
8
+ * to turn `related: ['blocks']` into the right join, and turns each condition
9
9
  * into a WHERE fragment. The protocol carries no model-specific logic, so
10
10
  * adding a model or relation is a schema change rather than a server change.
11
11
  *
12
12
  * The `IN` operator lets you batch a read by any column, including a foreign
13
- * key — for example, fetching every layer whose `slideId` falls in a set of
13
+ * key — for example, fetching every block whose `sectionId` falls in a set of
14
14
  * ids.
15
15
  */
16
- /** Primitive operand types allowed in a where clause. */
17
- export type WherePrimitive = string | number | boolean | null;
18
- /**
19
- * The comparison operators a {@link WhereClause} may use: equality and
20
- * inequality, ordering, set membership (`IN` / `NOT IN`), null checks
21
- * (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
22
- * matching (`LIKE`, `ILIKE`, and their negations).
23
- */
24
- export type WhereOp = '=' | '!=' | '<' | '<=' | '>' | '>=' | 'IN' | 'NOT IN' | 'IS' | 'IS NOT' | 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE';
25
- /**
26
- * A single condition. Two supported shapes:
27
- *
28
- * - `[col, value]` — shortcut for `[col, '=', value]`
29
- * - `[col, op, value]` — explicit operator
30
- *
31
- * The value is a single primitive for scalar operators and an array of
32
- * primitives for IN/NOT IN.
33
- */
34
- export type WhereClause = readonly [col: string, value: WherePrimitive] | readonly [col: string, op: WhereOp, value: WherePrimitive | readonly WherePrimitive[]];
35
- /**
36
- * Client-facing where shape for `load({where})` and `deleteMany({where})`.
37
- *
38
- * Two shapes accepted, both AND-combined:
39
- *
40
- * - Object form: `{ name: 'foo', orgId: '1' }` — each entry is an `=`
41
- * clause; array values become `IN`. Ergonomic for the common case.
42
- * - Tuple form: `[['name', 'ILIKE', '%Goldman%'], ['orgId', '1']]` —
43
- * explicit operators (LIKE/ILIKE/<=/etc.). Matches the wire
44
- * `WhereClause[]` 1:1, so no translation layer.
45
- *
46
- * The two forms compose: pass tuple form when you need an operator,
47
- * object form otherwise. For OR semantics, run two `load()` calls and
48
- * union client-side — keeps the protocol AND-only.
49
- */
50
- export type LoadWhere<T> = Partial<T> | {
51
- [K in keyof T]?: T[K] | readonly T[K][];
52
- } | readonly WhereClause[];
16
+ export type { WherePrimitive, WhereOp, WhereClause, LoadWhere, } from '../transaction/resources/where.js';
17
+ import type { WhereClause } from '../transaction/resources/where.js';
53
18
  /** A single structured fetch request. */
54
19
  export interface Query {
55
20
  /**
56
- * Client-facing model name (e.g. "File", "SlideLayer", "Message").
21
+ * Client-facing model name (e.g. "File", "Block", "Message").
57
22
  * The server's adapter maps this to the actual database table.
58
23
  */
59
24
  model: string;
@@ -70,7 +35,7 @@ export interface Query {
70
35
  * relation metadata and joins the related rows in. They come back nested
71
36
  * under the relation key:
72
37
  *
73
- * { __typename: 'Slide', id: '…', layers: [{ __typename: 'SlideLayer', … }] }
38
+ * { __typename: 'Section', id: '…', blocks: [{ __typename: 'Block', … }] }
74
39
  */
75
40
  related?: readonly string[];
76
41
  /**
@@ -5,12 +5,12 @@
5
5
  * list of `[column, operator, value]` conditions combined with AND, and
6
6
  * `related` names the schema relations to fetch alongside each row. The server
7
7
  * compiles a query against your schema: it reads the model's relation metadata
8
- * to turn `related: ['layers']` into the right join, and turns each condition
8
+ * to turn `related: ['blocks']` into the right join, and turns each condition
9
9
  * into a WHERE fragment. The protocol carries no model-specific logic, so
10
10
  * adding a model or relation is a schema change rather than a server change.
11
11
  *
12
12
  * The `IN` operator lets you batch a read by any column, including a foreign
13
- * key — for example, fetching every layer whose `slideId` falls in a set of
13
+ * key — for example, fetching every block whose `sectionId` falls in a set of
14
14
  * ids.
15
15
  */
16
16
  export {};