@abloatai/ablo 0.34.1 → 0.35.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 (483) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +674 -5
  3. package/README.md +39 -22
  4. package/dist/BaseSyncedStore.d.ts +152 -44
  5. package/dist/BaseSyncedStore.js +300 -184
  6. package/dist/Database.d.ts +9 -24
  7. package/dist/Database.js +37 -22
  8. package/dist/InstanceCache.d.ts +25 -4
  9. package/dist/InstanceCache.js +48 -15
  10. package/dist/LazyReferenceCollection.d.ts +3 -3
  11. package/dist/LazyReferenceCollection.js +4 -4
  12. package/dist/Model.d.ts +6 -6
  13. package/dist/Model.js +10 -10
  14. package/dist/ModelRegistry.d.ts +4 -4
  15. package/dist/ModelRegistry.js +3 -3
  16. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  17. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  18. package/dist/SyncClient.d.ts +42 -32
  19. package/dist/SyncClient.js +166 -110
  20. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  21. package/dist/ai-sdk/coordinatedTool.js +1 -1
  22. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  23. package/dist/ai-sdk/coordinationContext.js +1 -1
  24. package/dist/ai-sdk/wrap.d.ts +3 -3
  25. package/dist/ai-sdk/wrap.js +2 -2
  26. package/dist/auth/index.d.ts +1 -156
  27. package/dist/auth/index.js +8 -301
  28. package/dist/cli.cjs +3344 -1073
  29. package/dist/client/Ablo.d.ts +42 -287
  30. package/dist/client/Ablo.js +118 -963
  31. package/dist/client/abloClient.d.ts +309 -0
  32. package/dist/client/abloClient.js +13 -0
  33. package/dist/client/clientPrelude.d.ts +52 -0
  34. package/dist/client/clientPrelude.js +60 -0
  35. package/dist/client/consoleLogger.d.ts +2 -2
  36. package/dist/client/coreClient.d.ts +60 -0
  37. package/dist/client/coreClient.js +118 -0
  38. package/dist/client/createInternalComponents.d.ts +4 -4
  39. package/dist/client/createInternalComponents.js +9 -8
  40. package/dist/client/createModelProxy.d.ts +78 -373
  41. package/dist/client/createModelProxy.js +114 -86
  42. package/dist/client/humans.d.ts +48 -0
  43. package/dist/client/humans.js +52 -0
  44. package/dist/client/modelRegistration.d.ts +1 -1
  45. package/dist/client/modelRegistration.js +9 -9
  46. package/dist/client/options.d.ts +73 -17
  47. package/dist/client/reactiveEngine.d.ts +48 -0
  48. package/dist/client/reactiveEngine.js +910 -0
  49. package/dist/client/resourceTypes.d.ts +9 -250
  50. package/dist/client/resourceTypes.js +8 -5
  51. package/dist/client/schemaConfig.d.ts +4 -4
  52. package/dist/client/schemaConfig.js +6 -2
  53. package/dist/client/validateAbloOptions.d.ts +3 -2
  54. package/dist/client/validateAbloOptions.js +1 -1
  55. package/dist/client/wsMutationExecutor.d.ts +3 -3
  56. package/dist/client/wsMutationExecutor.js +3 -3
  57. package/dist/context.d.ts +9 -9
  58. package/dist/context.js +10 -9
  59. package/dist/coordination/ClaimLog.d.ts +26 -0
  60. package/dist/coordination/ClaimLog.js +32 -0
  61. package/dist/coordination/index.d.ts +1 -15
  62. package/dist/coordination/index.js +8 -31
  63. package/dist/core/DatabaseManager.js +1 -1
  64. package/dist/core/QueryView.d.ts +1 -1
  65. package/dist/core/QueryView.js +1 -1
  66. package/dist/core/StoreManager.d.ts +4 -23
  67. package/dist/core/StoreManager.js +5 -55
  68. package/dist/core/index.d.ts +2 -2
  69. package/dist/core/index.js +2 -2
  70. package/dist/core/storeContract.d.ts +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +227 -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 +40 -34
  78. package/dist/index.js +26 -20
  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 +2 -2
  99. package/dist/query/client.js +4 -4
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +6 -8
  103. package/dist/react/AbloProvider.js +5 -7
  104. package/dist/react/context.d.ts +1 -1
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/index.d.ts +5 -5
  107. package/dist/react/index.js +3 -3
  108. package/dist/react/internalContext.d.ts +1 -1
  109. package/dist/react/useAblo.d.ts +3 -3
  110. package/dist/react/useAblo.js +1 -1
  111. package/dist/react/useCurrentUserId.js +1 -1
  112. package/dist/react/useErrorListener.js +1 -1
  113. package/dist/react/useMutationFailureListener.d.ts +2 -2
  114. package/dist/react/useMutationFailureListener.js +1 -1
  115. package/dist/react/useMutators.d.ts +3 -3
  116. package/dist/react/useMutators.js +3 -3
  117. package/dist/react/useUndoScope.d.ts +5 -5
  118. package/dist/react/useUndoScope.js +1 -1
  119. package/dist/schema/coordination.d.ts +69 -10
  120. package/dist/schema/coordination.js +86 -9
  121. package/dist/schema/ddl.js +2 -2
  122. package/dist/schema/diff.d.ts +1 -1
  123. package/dist/schema/generate.js +1 -1
  124. package/dist/schema/index.d.ts +10 -10
  125. package/dist/schema/index.js +18 -18
  126. package/dist/schema/queries.d.ts +27 -27
  127. package/dist/schema/queries.js +23 -23
  128. package/dist/schema/select.d.ts +3 -3
  129. package/dist/schema/select.js +3 -3
  130. package/dist/schema/serialize.d.ts +15 -6
  131. package/dist/schema/serialize.js +17 -3
  132. package/dist/schema/sugar.d.ts +6 -7
  133. package/dist/schema/sugar.js +9 -12
  134. package/dist/schema/syncDeltaRow.d.ts +4 -152
  135. package/dist/schema/syncDeltaRow.js +4 -105
  136. package/dist/server/adapter.d.ts +18 -1
  137. package/dist/server/commit.d.ts +10 -16
  138. package/dist/server/index.d.ts +1 -1
  139. package/dist/server/index.js +1 -1
  140. package/dist/server/readConfig.d.ts +1 -1
  141. package/dist/source/adapters/drizzle.d.ts +1 -1
  142. package/dist/source/adapters/drizzle.js +2 -2
  143. package/dist/source/adapters/kysely.d.ts +1 -1
  144. package/dist/source/adapters/kysely.js +1 -1
  145. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  146. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  147. package/dist/source/adapters/memory.js +1 -1
  148. package/dist/source/adapters/prisma.d.ts +8 -3
  149. package/dist/source/adapters/prisma.js +1 -1
  150. package/dist/source/connector.js +1 -1
  151. package/dist/source/connectorProtocol.d.ts +2 -8
  152. package/dist/source/connectorProtocol.js +3 -2
  153. package/dist/source/contract.d.ts +29 -17
  154. package/dist/source/contract.js +27 -22
  155. package/dist/source/factory.d.ts +1 -1
  156. package/dist/source/footprint.d.ts +111 -0
  157. package/dist/source/footprint.js +0 -0
  158. package/dist/source/idempotency.js +2 -2
  159. package/dist/source/index.d.ts +1 -0
  160. package/dist/source/index.js +3 -0
  161. package/dist/source/next.d.ts +1 -1
  162. package/dist/source/signing.d.ts +9 -2
  163. package/dist/source/signing.js +4 -1
  164. package/dist/source/types.d.ts +6 -4
  165. package/dist/source/types.js +1 -1
  166. package/dist/stores/ObjectStore.d.ts +1 -1
  167. package/dist/stores/SyncActionStore.d.ts +1 -1
  168. package/dist/stores/SyncActionStore.js +2 -10
  169. package/dist/stores/syncAction.d.ts +26 -0
  170. package/dist/stores/syncAction.js +16 -0
  171. package/dist/surface.d.ts +3 -3
  172. package/dist/surface.js +6 -4
  173. package/dist/sync/BootstrapFetcher.d.ts +123 -6
  174. package/dist/sync/BootstrapFetcher.js +492 -66
  175. package/dist/sync/ConnectionManager.d.ts +6 -198
  176. package/dist/sync/ConnectionManager.js +6 -677
  177. package/dist/sync/OnDemandLoader.d.ts +2 -2
  178. package/dist/sync/OnDemandLoader.js +60 -21
  179. package/dist/sync/SubscriptionManager.d.ts +13 -2
  180. package/dist/sync/SubscriptionManager.js +23 -5
  181. package/dist/sync/SyncWebSocket.d.ts +27 -510
  182. package/dist/sync/SyncWebSocket.js +76 -954
  183. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  184. package/dist/sync/awaitClaimGrant.js +4 -109
  185. package/dist/sync/commitFrames.d.ts +6 -40
  186. package/dist/sync/commitFrames.js +6 -97
  187. package/dist/sync/contextPorts.d.ts +18 -0
  188. package/dist/sync/contextPorts.js +31 -0
  189. package/dist/sync/createClaimStream.d.ts +5 -49
  190. package/dist/sync/createClaimStream.js +5 -469
  191. package/dist/sync/createPresenceStream.d.ts +26 -4
  192. package/dist/sync/createPresenceStream.js +28 -20
  193. package/dist/sync/createSnapshot.d.ts +2 -2
  194. package/dist/sync/createSnapshot.js +1 -1
  195. package/dist/sync/credentialLifecycle.d.ts +5 -173
  196. package/dist/sync/credentialLifecycle.js +5 -320
  197. package/dist/sync/deltaPipeline.d.ts +1 -1
  198. package/dist/sync/participants.d.ts +5 -4
  199. package/dist/sync/participants.js +29 -22
  200. package/dist/sync/schemaDrift.d.ts +55 -0
  201. package/dist/sync/schemaDrift.js +53 -0
  202. package/dist/sync/schemas.d.ts +21 -32
  203. package/dist/sync/schemas.js +26 -17
  204. package/dist/sync/syncPlan.d.ts +3 -3
  205. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  206. package/dist/sync/wsFrameHandlers.js +6 -392
  207. package/dist/testing/fixtures/bootstrap.d.ts +1 -1
  208. package/dist/testing/fixtures/deltas.d.ts +1 -1
  209. package/dist/testing/fixtures/httpResponses.d.ts +70 -0
  210. package/dist/testing/fixtures/httpResponses.js +90 -0
  211. package/dist/testing/fixtures/models.js +1 -1
  212. package/dist/testing/helpers/wait.js +1 -1
  213. package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
  214. package/dist/testing/mocks/MockMutationExecutor.js +8 -14
  215. package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
  216. package/dist/testing/mocks/MockSyncContext.js +10 -9
  217. package/dist/testing/mocks/MockSyncStore.js +1 -1
  218. package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
  219. package/dist/transaction/ablo.d.ts +88 -0
  220. package/dist/transaction/ablo.js +33 -0
  221. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  222. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  223. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  224. package/dist/transaction/auth/bootstrapScope.js +1 -0
  225. package/dist/transaction/auth/capability.d.ts +177 -0
  226. package/dist/transaction/auth/capability.js +199 -0
  227. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  228. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  229. package/dist/{client → transaction/auth}/identity.js +1 -1
  230. package/dist/transaction/auth/index.d.ts +162 -0
  231. package/dist/transaction/auth/index.js +304 -0
  232. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  233. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  234. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  235. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  236. package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
  237. package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
  238. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  239. package/dist/transaction/coordination/claimMeta.js +52 -0
  240. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  241. package/dist/transaction/coordination/createClaimStream.js +475 -0
  242. package/dist/transaction/coordination/events.d.ts +74 -0
  243. package/dist/transaction/coordination/events.js +7 -0
  244. package/dist/transaction/coordination/index.d.ts +19 -0
  245. package/dist/transaction/coordination/index.js +44 -0
  246. package/dist/transaction/coordination/locator.d.ts +83 -0
  247. package/dist/transaction/coordination/locator.js +82 -0
  248. package/dist/transaction/coordination/schema.d.ts +1473 -0
  249. package/dist/{coordination → transaction/coordination}/schema.js +490 -55
  250. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  251. package/dist/transaction/coordination/targetConflict.js +103 -0
  252. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  253. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  254. package/dist/transaction/durableWrites.d.ts +62 -0
  255. package/dist/{client → transaction}/durableWrites.js +28 -3
  256. package/dist/transaction/environment.d.ts +105 -0
  257. package/dist/transaction/environment.js +108 -0
  258. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
  259. package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
  260. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  261. package/dist/{errors.js → transaction/errors.js} +85 -16
  262. package/dist/transaction/index.d.ts +20 -0
  263. package/dist/transaction/index.js +20 -0
  264. package/dist/transaction/keys/index.d.ts +87 -0
  265. package/dist/transaction/keys/index.js +207 -0
  266. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  267. package/dist/transaction/log/syncDeltaRow.js +95 -0
  268. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  269. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  270. package/dist/transaction/logger.d.ts +16 -0
  271. package/dist/transaction/logger.js +7 -0
  272. package/dist/transaction/observability.d.ts +53 -0
  273. package/dist/transaction/observability.js +19 -0
  274. package/dist/transaction/plugin.d.ts +192 -0
  275. package/dist/transaction/plugin.js +87 -0
  276. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  277. package/dist/{policy → transaction/policy}/types.js +2 -0
  278. package/dist/transaction/resources/httpResources.d.ts +266 -0
  279. package/dist/transaction/resources/httpResources.js +7 -0
  280. package/dist/transaction/resources/modelOperations.d.ts +319 -0
  281. package/dist/transaction/resources/modelOperations.js +12 -0
  282. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  283. package/dist/transaction/resources/mutationOptions.js +9 -0
  284. package/dist/transaction/resources/where.d.ts +85 -0
  285. package/dist/transaction/resources/where.js +70 -0
  286. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  287. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  288. package/dist/{schema → transaction/schema}/field.d.ts +5 -5
  289. package/dist/{schema → transaction/schema}/field.js +5 -5
  290. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  291. package/dist/transaction/schema/loadStrategy.js +46 -0
  292. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  293. package/dist/{schema → transaction/schema}/model.js +30 -20
  294. package/dist/transaction/schema/openapi.d.ts +57 -0
  295. package/dist/transaction/schema/openapi.js +340 -0
  296. package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
  297. package/dist/{schema → transaction/schema}/relation.js +7 -7
  298. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  299. package/dist/{schema → transaction/schema}/residency.js +0 -5
  300. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  301. package/dist/{schema → transaction/schema}/roles.js +5 -5
  302. package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
  303. package/dist/{schema → transaction/schema}/schema.js +4 -3
  304. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  305. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  306. package/dist/transaction/transactionLayer.d.ts +82 -0
  307. package/dist/transaction/transactionLayer.js +24 -0
  308. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
  309. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  310. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  311. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  312. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
  313. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  314. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  315. package/dist/transaction/transport/commitFrames.js +134 -0
  316. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  317. package/dist/transaction/transport/connectionManager.js +673 -0
  318. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  319. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  320. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  321. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  322. package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
  323. package/dist/{client → transaction/transport}/httpClient.js +5 -5
  324. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  325. package/dist/transaction/transport/httpOptions.js +12 -0
  326. package/dist/{client → transaction/transport}/httpTransport.js +171 -85
  327. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  328. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  329. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  330. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  331. package/dist/transaction/transport/wsTransport.d.ts +576 -0
  332. package/dist/transaction/transport/wsTransport.js +1017 -0
  333. package/dist/transaction/types/assertExact.d.ts +17 -0
  334. package/dist/transaction/types/assertExact.js +1 -0
  335. package/dist/{types → transaction/types}/global.d.ts +17 -2
  336. package/dist/{types → transaction/types}/global.js +2 -1
  337. package/dist/{types → transaction/types}/index.d.ts +14 -46
  338. package/dist/{types → transaction/types}/index.js +7 -16
  339. package/dist/{types → transaction/types}/streams.d.ts +63 -45
  340. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  341. package/dist/transaction/utils/json.js +276 -0
  342. package/dist/transaction/wire/accountResponses.d.ts +351 -0
  343. package/dist/transaction/wire/accountResponses.js +255 -0
  344. package/dist/transaction/wire/auth.d.ts +49 -0
  345. package/dist/transaction/wire/auth.js +57 -0
  346. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  347. package/dist/transaction/wire/claimEvent.js +73 -0
  348. package/dist/transaction/wire/claims.d.ts +463 -0
  349. package/dist/transaction/wire/claims.js +229 -0
  350. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  351. package/dist/{wire → transaction/wire}/commit.js +68 -47
  352. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  353. package/dist/{wire → transaction/wire}/delta.js +37 -13
  354. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  355. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  356. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  357. package/dist/transaction/wire/feedCursor.js +82 -0
  358. package/dist/transaction/wire/feedEvent.d.ts +177 -0
  359. package/dist/transaction/wire/feedEvent.js +39 -0
  360. package/dist/transaction/wire/frames.d.ts +194 -0
  361. package/dist/transaction/wire/frames.js +50 -0
  362. package/dist/transaction/wire/inboundFrames.d.ts +552 -0
  363. package/dist/transaction/wire/inboundFrames.js +116 -0
  364. package/dist/transaction/wire/index.d.ts +50 -0
  365. package/dist/transaction/wire/index.js +74 -0
  366. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  367. package/dist/transaction/wire/listEnvelope.js +42 -0
  368. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  369. package/dist/transaction/wire/modelResponses.js +43 -0
  370. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
  371. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
  372. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  373. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  374. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  375. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  376. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  377. package/dist/transactions/mutations/commitLatency.js +130 -0
  378. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  379. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  380. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
  381. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
  382. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
  383. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
  384. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  385. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  386. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  387. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
  388. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
  389. package/dist/utils/mobxSetup.d.ts +1 -1
  390. package/dist/utils/mobxSetup.js +5 -2
  391. package/dist/webhooks/events.d.ts +2 -2
  392. package/dist/wire/index.d.ts +1 -34
  393. package/dist/wire/index.js +8 -49
  394. package/docs/agent-messaging.md +3 -3
  395. package/docs/agents.md +19 -12
  396. package/docs/api-keys.md +8 -4
  397. package/docs/api.md +22 -18
  398. package/docs/audit.md +2 -0
  399. package/docs/cli.md +31 -3
  400. package/docs/client-behavior.md +8 -6
  401. package/docs/concurrency-convention.md +30 -24
  402. package/docs/coordination.md +48 -38
  403. package/docs/data-sources.md +3 -1
  404. package/docs/debugging.md +5 -3
  405. package/docs/deployment.md +267 -0
  406. package/docs/examples/agent-human.md +49 -42
  407. package/docs/examples/ai-sdk-tool.md +69 -44
  408. package/docs/examples/existing-python-backend.md +8 -6
  409. package/docs/examples/nextjs.md +129 -47
  410. package/docs/examples/scoped-agent.md +45 -44
  411. package/docs/examples/server-agent.md +46 -26
  412. package/docs/groups.md +32 -29
  413. package/docs/guarantees.md +4 -2
  414. package/docs/how-it-works.md +9 -7
  415. package/docs/idempotency.md +126 -0
  416. package/docs/identity.md +58 -54
  417. package/docs/index.md +172 -86
  418. package/docs/integration-guide.md +17 -16
  419. package/docs/interaction-model.md +6 -4
  420. package/docs/mcp.md +41 -16
  421. package/docs/migration.md +63 -5
  422. package/docs/operating-on-your-database.md +3 -1
  423. package/docs/projects.md +2 -0
  424. package/docs/quickstart.md +22 -5
  425. package/docs/react.md +12 -10
  426. package/docs/schema-contract.md +5 -3
  427. package/docs/session-settings.md +108 -0
  428. package/docs/sessions.md +3 -1
  429. package/docs/webhooks.md +3 -1
  430. package/llms.txt +47 -17
  431. package/package.json +10 -8
  432. package/dist/agent/Agent.d.ts +0 -366
  433. package/dist/agent/Agent.js +0 -514
  434. package/dist/agent/index.d.ts +0 -115
  435. package/dist/agent/index.js +0 -128
  436. package/dist/agent/session.d.ts +0 -93
  437. package/dist/agent/session.js +0 -149
  438. package/dist/agent/types.d.ts +0 -68
  439. package/dist/agent/types.js +0 -9
  440. package/dist/client/durableWrites.d.ts +0 -21
  441. package/dist/coordination/schema.d.ts +0 -722
  442. package/dist/schema/openapi.d.ts +0 -29
  443. package/dist/schema/openapi.js +0 -124
  444. package/dist/transactions/durableWriteStore.js +0 -30
  445. package/dist/utils/json.js +0 -88
  446. package/dist/wire/errorEnvelope.d.ts +0 -55
  447. package/dist/wire/frames.d.ts +0 -197
  448. package/dist/wire/frames.js +0 -49
  449. package/dist/wire/listEnvelope.js +0 -18
  450. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  451. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  452. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  453. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  454. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  455. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  456. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  457. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
  458. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
  459. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  460. /package/dist/{client → transaction}/persistence.js +0 -0
  461. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  462. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  463. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  464. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  465. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  466. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  467. /package/dist/{types → transaction/types}/modelData.js +0 -0
  468. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  469. /package/dist/{types → transaction/types}/participant.js +0 -0
  470. /package/dist/{types → transaction/types}/streams.js +0 -0
  471. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  472. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  473. /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
  474. /package/dist/{utils → transaction/utils}/duration.js +0 -0
  475. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  476. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  477. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  478. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  479. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  480. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  481. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  482. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  483. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.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,8 @@
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
17
  export interface PostQueryOptions {
18
18
  /**
19
19
  * Full base URL of the sync server including the `/api` prefix.
@@ -12,9 +12,9 @@
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';
15
+ import { translateHttpError } from '../transaction/errors.js';
16
+ import { classifyRecovery } from '../transaction/errorCodes.js';
17
+ import { withAuthHeaders } from '../transaction/auth/credentialSource.js';
18
18
  import { getContext } from '../context.js';
19
19
  // ── Response validation ─────────────────────────────────────────────────
20
20
  //
@@ -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
@@ -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 {};
@@ -1,7 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { SchemaRecord } from '../schema/schema.js';
2
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
3
3
  import { Ablo } from '../client/Ablo.js';
4
- import type { Claim, Peer } from '../types/streams.js';
4
+ import type { Claim, Peer } from '../transaction/types/streams.js';
5
5
  import type { EngineParticipant, ParticipantScope, ParticipantStatus } from '../sync/participants.js';
6
6
  import { type SyncStoreContract } from './context.js';
7
7
  /**
@@ -125,7 +125,7 @@ export interface UseJoinOptions {
125
125
  * Default `false`: opening a scope subscribes the connection to its deltas
126
126
  * (read interest, via `update_subscription`) but does NOT claim it — a
127
127
  * viewer is not a claimant. Set `true` when the participant intends to
128
- * WRITE (editing a deck, an agent staking work): the claim is sent so peers
128
+ * WRITE (editing a report, an agent staking work): the claim is sent so peers
129
129
  * observe it, and the scope is pinned so it stays subscribed (never warms)
130
130
  * for as long as the claim is held.
131
131
  */
@@ -137,14 +137,12 @@ export interface UseJoinOptions {
137
137
  * Default `false`: entering a scope subscribes to its FUTURE deltas only — if
138
138
  * the scope's rows aren't already loaded, the view is empty until something
139
139
  * changes. Set `true` when opening an entity that may not be loaded yet (a
140
- * deep-linked deck, a never-opened sheet) so its current rows are fetched and
140
+ * deep-linked report, a never-opened ledger) so its current rows are fetched and
141
141
  * injected once, then kept fresh by the live tail. The fetch is single-flight
142
142
  * and runs once per group; a failure soft-fails (the live tail still flows).
143
143
  */
144
144
  readonly hydrate?: boolean;
145
145
  }
146
- /** @deprecated Use `ParticipantStatus`. */
147
- export type MeshParticipantStatus = ParticipantStatus;
148
146
  export interface UseJoinReturn {
149
147
  readonly participant: EngineParticipant | null;
150
148
  /** Everyone else on the engine's sync groups (`participant.presence.others`), bridged to React. */
@@ -188,7 +186,7 @@ export declare function useJoin(opts: UseJoinOptions): UseJoinReturn;
188
186
  * subscription on unmount).
189
187
  *
190
188
  * ```ts
191
- * const peers = usePeers({ slideDecks: deckId });
189
+ * const peers = usePeers({ reports: reportId });
192
190
  * const alone = !peers.some((p) => p.participantKind === 'user');
193
191
  * ```
194
192
  */
@@ -200,7 +198,7 @@ export declare function usePeers(scope?: ParticipantScope): readonly Peer[];
200
198
  *
201
199
  * The generic parameter narrows the return type to your schema's
202
200
  * model record so call sites get typed `sync.tasks.findMany()` /
203
- * `sync.slides.create(...)` without a cast at the call site:
201
+ * `sync.sections.create(...)` without a cast at the call site:
204
202
  *
205
203
  * ```ts
206
204
  * const sync = useSync<(typeof schema)['models']>();