@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
@@ -5,7 +5,7 @@ import { Ablo } from '../client/Ablo.js';
5
5
  import { createParticipantClaimId, parseParticipantTtlSeconds, resolveParticipantSyncGroups, } from '../sync/participants.js';
6
6
  import { SyncContext } from './context.js';
7
7
  import { AbloInternalContext } from './internalContext.js';
8
- import { AbloValidationError } from '../errors.js';
8
+ import { AbloValidationError } from '../transaction/errors.js';
9
9
  import { useSyncStatus } from './useSyncStatus.js';
10
10
  import { DefaultFallback } from './DefaultFallback.js';
11
11
  // ── Implementation ───────────────────────────────────────────────────
@@ -224,8 +224,8 @@ export function useJoin(opts) {
224
224
  const ctx = useContext(AbloInternalContext);
225
225
  const engine = ctx?.engine ?? null;
226
226
  const { paused = false } = opts;
227
- // Resolve the model-form scope ({ decks: id } / refs) THROUGH the schema, so a
228
- // model's declared `scope` kind is honored (typename `SlideDeck` → `deck:<id>`,
227
+ // Resolve the model-form scope ({ reports: id } / refs) THROUGH the schema, so a
228
+ // model's declared `scope` kind is honored (typename `Report` → `report:<id>`,
229
229
  // not the `type:id` string fallback). Schema appears once the engine is ready;
230
230
  // until then refs resolve by convention, then re-resolve when it arrives.
231
231
  const scopeKey = JSON.stringify(resolveParticipantSyncGroups(opts.scope, engine?.schema).sort());
@@ -298,8 +298,6 @@ export function useJoin(opts) {
298
298
  if (syncStatus.name !== 'connected')
299
299
  return;
300
300
  const ws = engine._ws;
301
- if (!ws)
302
- return;
303
301
  const store = engine._store;
304
302
  let cancelled = false;
305
303
  const claimId = createParticipantClaimId();
@@ -370,7 +368,7 @@ export function useJoin(opts) {
370
368
  * subscription on unmount).
371
369
  *
372
370
  * ```ts
373
- * const peers = usePeers({ slideDecks: deckId });
371
+ * const peers = usePeers({ reports: reportId });
374
372
  * const alone = !peers.some((p) => p.participantKind === 'user');
375
373
  * ```
376
374
  */
@@ -408,7 +406,7 @@ export function usePeers(scope) {
408
406
  *
409
407
  * The generic parameter narrows the return type to your schema's
410
408
  * model record so call sites get typed `sync.tasks.findMany()` /
411
- * `sync.slides.create(...)` without a cast at the call site:
409
+ * `sync.sections.create(...)` without a cast at the call site:
412
410
  *
413
411
  * ```ts
414
412
  * const sync = useSync<(typeof schema)['models']>();
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
- import type { Schema } from '../schema/schema.js';
2
+ import type { Schema } from '../transaction/schema/schema.js';
3
3
  import type { SyncStoreContract } from '../core/storeContract.js';
4
4
  export type { SyncStoreContract, LocalMutation } from '../core/storeContract.js';
5
5
  export interface SyncReactContext {
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { createContext, createElement, useContext } from 'react';
3
- import { AbloValidationError } from '../errors.js';
3
+ import { AbloValidationError } from '../transaction/errors.js';
4
4
  export const SyncContext = createContext(null);
5
5
  /**
6
6
  * Reads the sync store context from inside a provider subtree, throwing a clear
@@ -21,9 +21,9 @@
21
21
  *
22
22
  * # Data hooks
23
23
  *
24
- * useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
24
+ * useAblo((ablo) => ablo.tasks.local.retrieve(id)) — subscribe to a local snapshot (the main read API)
25
25
  * useAblo() — the typed client, for callbacks and effects:
26
- * synchronous local reads (`ablo.<model>.get`/`getAll`),
26
+ * synchronous local reads (`ablo.<model>.local.retrieve`/`local.list`),
27
27
  * async server reads (`retrieve`/`list`),
28
28
  * and writes (`create`/`update`/`delete`)
29
29
  * useMutators(defs, opts?) — define custom mutators
@@ -43,8 +43,8 @@
43
43
  * useAblo((ablo) => ablo.<model>.claim.state(...)) — reactive coordination reads
44
44
  * useJoin({ scope }) — join a scope to get its peers and claims
45
45
  */
46
- export type { DefaultSyncShape, ResolveSchema, ResolveUserMeta, ResolveModelKey, } from '../types/global.js';
47
- export { AbloProvider, useJoin, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseJoinOptions, type UseJoinReturn, type MeshParticipantStatus, } from './AbloProvider.js';
46
+ export type { DefaultSyncShape, ResolveSchema, ResolveUserMeta, ResolveClaimMeta, ResolveModelKey, } from '../transaction/types/global.js';
47
+ export { AbloProvider, useJoin, usePeers, useSync, useSyncStore, type AbloProviderProps, type ParticipantScope, type ParticipantStatus, type UseJoinOptions, type UseJoinReturn, } from './AbloProvider.js';
48
48
  export { ClientSideSuspense, type ClientSideSuspenseProps, } from './ClientSideSuspense.js';
49
49
  export { DefaultFallback } from './DefaultFallback.js';
50
50
  export type { SyncStoreContract } from './context.js';
@@ -58,4 +58,4 @@ export type { ReaderActions, ReaderFindOptions } from '../mutators/readerActions
58
58
  export { useMutators, type MutatorInvokers, type InvokerFor, type UseMutatorsOptions, } from './useMutators.js';
59
59
  export { useUndoScope, type UseUndoScopeResult } from './useUndoScope.js';
60
60
  export { useAblo, type UseAbloHydratedModelResult, type UseAbloModelOptions, type UseAbloModelResult, } from './useAblo.js';
61
- export { ModelScope } from '../types/index.js';
61
+ export { ModelScope } from '../transaction/types/index.js';
@@ -21,9 +21,9 @@
21
21
  *
22
22
  * # Data hooks
23
23
  *
24
- * useAblo((ablo) => ablo.tasks.get(id)) — subscribe to a local snapshot (the main read API)
24
+ * useAblo((ablo) => ablo.tasks.local.retrieve(id)) — subscribe to a local snapshot (the main read API)
25
25
  * useAblo() — the typed client, for callbacks and effects:
26
- * synchronous local reads (`ablo.<model>.get`/`getAll`),
26
+ * synchronous local reads (`ablo.<model>.local.retrieve`/`local.list`),
27
27
  * async server reads (`retrieve`/`list`),
28
28
  * and writes (`create`/`update`/`delete`)
29
29
  * useMutators(defs, opts?) — define custom mutators
@@ -63,4 +63,4 @@ export { useMutators, } from './useMutators.js';
63
63
  export { useUndoScope } from './useUndoScope.js';
64
64
  export { useAblo, } from './useAblo.js';
65
65
  // ── ModelScope re-export ───────────────────────────────────────────
66
- export { ModelScope } from '../types/index.js';
66
+ export { ModelScope } from '../transaction/types/index.js';
@@ -1,5 +1,5 @@
1
1
  import type { Ablo } from '../client/Ablo.js';
2
- import type { SchemaRecord } from '../schema/schema.js';
2
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
3
3
  /**
4
4
  * The context that `<AbloProvider>` populates for its own hooks. It is kept
5
5
  * separate from the data-hook context, which carries the store and schema,
@@ -1,7 +1,7 @@
1
1
  import type { Ablo, AbloReads, ModelClaim } from '../client/Ablo.js';
2
2
  import type { ModelOperations } from '../client/createModelProxy.js';
3
- import type { SchemaRecord } from '../schema/schema.js';
4
- import type { ResolveSchema } from '../types/global.js';
3
+ import type { SchemaRecord } from '../transaction/schema/schema.js';
4
+ import type { ResolveSchema } from '../transaction/types/global.js';
5
5
  /**
6
6
  * The app's resolved schema-record type. It reads your `Register` module
7
7
  * augmentation when you declare one and falls back to the loose
@@ -51,7 +51,7 @@ export type UseAbloHydratedModelResult<T> = Omit<UseAbloModelResult<T>, 'data'>
51
51
  * // Reactive selector (a synchronous local snapshot). The selector's reads
52
52
  * // are typed as snapshot rows — data fields + computeds, no relation
53
53
  * // accessors — matching what the hook actually returns:
54
- * const doc = useAblo((ablo) => ablo.documents.get(id)) ?? serverDoc;
54
+ * const doc = useAblo((ablo) => ablo.documents.local.retrieve(id)) ?? serverDoc;
55
55
  * const active = useAblo((ablo) => ablo.documents.claim.state({ id }));
56
56
  *
57
57
  * // Without the augmentation, pass the schema as a type argument:
@@ -27,7 +27,7 @@ function readModelResult(engine, modelClient, id, initial) {
27
27
  if (!modelClient || id === undefined) {
28
28
  return { data: initial, claims: EMPTY_CLAIMS, claimed: false };
29
29
  }
30
- const data = snapshotValue(modelClient.get(id) ?? initial);
30
+ const data = snapshotValue(modelClient.local.retrieve(id) ?? initial);
31
31
  const meta = getModelClientMeta(modelClient);
32
32
  const claims = meta && engine
33
33
  ? engine.claims.list({ model: meta.key, id })
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { useContext } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
- import { AbloValidationError } from '../errors.js';
4
+ import { AbloValidationError } from '../transaction/errors.js';
5
5
  /**
6
6
  * Returns the application user id passed to the nearest `<AbloProvider>`, or
7
7
  * `null` when your app did not provide one.
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { useContext, useEffect, useRef } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
- import { AbloValidationError } from '../errors.js';
4
+ import { AbloValidationError } from '../transaction/errors.js';
5
5
  /**
6
6
  * Registers a callback that runs whenever the provider surfaces an error. This
7
7
  * covers engine errors such as bootstrap failures and mutation rejections,
@@ -1,6 +1,6 @@
1
- import type { Transaction } from '../transactions/TransactionQueue.js';
1
+ import type { QueuedMutation } from '../transactions/mutations/MutationQueue.js';
2
2
  export interface MutationFailurePayload {
3
- transaction: Transaction;
3
+ transaction: QueuedMutation;
4
4
  error: Error;
5
5
  permanent?: boolean;
6
6
  }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { useContext, useEffect, useRef } from 'react';
3
3
  import { AbloInternalContext } from './internalContext.js';
4
- import { AbloValidationError } from '../errors.js';
4
+ import { AbloValidationError } from '../transaction/errors.js';
5
5
  /**
6
6
  * Subscribes a listener to mutation failures. The callback fires whenever the
7
7
  * transaction queue rolls back an optimistic write — both permanent rejections
@@ -1,7 +1,7 @@
1
- import type { Schema } from '../schema/schema.js';
1
+ import type { Schema } from '../transaction/schema/schema.js';
2
2
  import type { MutatorDefs } from '../mutators/defineMutators.js';
3
3
  import type { UndoScope } from '../mutators/UndoManager.js';
4
- import type { ResolveSchema } from '../types/global.js';
4
+ import type { ResolveSchema } from '../transaction/types/global.js';
5
5
  /**
6
6
  * Turns a mutator tree built with `defineMutators` into callable invokers. The
7
7
  * returned object mirrors that tree one-to-one, but each leaf becomes an
@@ -41,7 +41,7 @@ export type MutatorInvokers<M> = {
41
41
  };
42
42
  /**
43
43
  * Options passed to `useMutators`. When `undoScope` is set, every mutator
44
- * invocation is wrapped in a `RecordingTransaction` and its inverses are
44
+ * invocation is wrapped in a `RecordingMutation` and its inverses are
45
45
  * pushed to the scope as one undo entry.
46
46
  */
47
47
  export interface UseMutatorsOptions<S extends Schema> {
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { useMemo } from 'react';
3
3
  import { createTransaction } from '../mutators/Transaction.js';
4
- import { createRecordingTransaction } from '../mutators/RecordingTransaction.js';
4
+ import { createRecordingMutation } from '../mutators/RecordingMutation.js';
5
5
  import { useSyncContext } from './context.js';
6
- import { AbloValidationError } from '../errors.js';
6
+ import { AbloValidationError } from '../transaction/errors.js';
7
7
  import { getContext } from '../context.js';
8
8
  export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
9
9
  const { store, organizationId, schema: ctxSchema } = useSyncContext();
@@ -48,7 +48,7 @@ export function useMutators(schemaOrMutators, mutatorsOrOptions, maybeOptions) {
48
48
  // interleave their shared-model snapshots. See UndoScope.runRecorded.
49
49
  if (undoScope) {
50
50
  return undoScope.runRecorded(async () => {
51
- const recording = createRecordingTransaction(schema, store, organizationId);
51
+ const recording = createRecordingMutation(schema, store, organizationId);
52
52
  try {
53
53
  const result = await fn({ tx: recording.tx, args });
54
54
  const entry = recording.getEntry(label);
@@ -1,9 +1,9 @@
1
- import type { Schema } from '../schema/schema.js';
1
+ import type { Schema } from '../transaction/schema/schema.js';
2
2
  import type { UndoScope, UndoScopeOptions } from '../mutators/UndoManager.js';
3
- import type { ResolveSchema } from '../types/global.js';
3
+ import type { ResolveSchema } from '../transaction/types/global.js';
4
4
  /**
5
5
  * Provides per-surface undo and redo for mutator invocations. Each named scope
6
- * owns an independent undo/redo stack, so different parts of your app — a deck
6
+ * owns an independent undo/redo stack, so different parts of your app — a main
7
7
  * editor, a sidebar form — can undo separately without stepping on each other.
8
8
  *
9
9
  * Wire the returned `scope` into `useMutators(schema, mutators, { undoScope:
@@ -12,8 +12,8 @@ import type { ResolveSchema } from '../types/global.js';
12
12
  * themselves; the manager moves the entry between the two stacks explicitly.
13
13
  *
14
14
  * @example
15
- * const { undo, redo, canUndo, canRedo, scope } = useUndoScope('deck-editor');
16
- * const mutate = useMutators(schema, deckMutators, { undoScope: scope });
15
+ * const { undo, redo, canUndo, canRedo, scope } = useUndoScope('report-editor');
16
+ * const mutate = useMutators(schema, reportMutators, { undoScope: scope });
17
17
  *
18
18
  * // Cmd+Z handler
19
19
  * useHotkey('mod+z', () => { if (canUndo) void undo(); });
@@ -2,7 +2,7 @@
2
2
  import { useEffect, useMemo, useState } from 'react';
3
3
  import { UndoManager } from '../mutators/UndoManager.js';
4
4
  import { useSyncContext } from './context.js';
5
- import { AbloValidationError } from '../errors.js';
5
+ import { AbloValidationError } from '../transaction/errors.js';
6
6
  // Module-level weak registry: `SyncStoreContract` → `UndoManager`.
7
7
  // A single app wiring through one SyncProvider shares one manager across
8
8
  // every useUndoScope call, so scopes with the same name are identity-equal.
@@ -1,23 +1,33 @@
1
1
  /**
2
2
  * Authoring helpers for a model's `conflict` axis — the setting that decides
3
3
  * what happens when two writers touch the same row. Instead of writing a raw
4
- * disposition map, you compose small, named functions the way the rest of the
5
- * schema DSL reads (`relation.belongsTo()`, `field.string()`):
4
+ * disposition map, you name the rules the way the rest of the schema DSL reads
5
+ * (`relation.belongsTo()`, `field.string()`), and chain them the way a field
6
+ * chains its own modifiers:
6
7
  *
7
8
  * ```ts
8
- * import { coordination, humansOverwrite, agentsReject } from '@abloatai/ablo/schema';
9
+ * import { coordination } from '@abloatai/ablo/schema';
9
10
  *
10
- * conflict: coordination(humansOverwrite(), agentsReject())
11
+ * conflict: coordination.humansOverwrite().agentsReject()
11
12
  * // → { user: 'overwrite', agent: 'reject' } (a human's write wins, an agent's yields)
12
13
  * ```
13
14
  *
14
- * Each helper is named for the disposition it applies — drawn from the same
15
+ * Each rule is named for the disposition it applies — drawn from the same
15
16
  * `overwrite | reject | notify` vocabulary the write guards use (`onStale`) —
16
- * and returns a partial {@link ConflictAxis}. {@link coordination} merges the
17
- * pieces, with later rules winning on key collisions. The result is plain,
18
- * serializable data that the engine reads at commit time.
17
+ * and every one of them is also available as a standalone function, which
18
+ * {@link coordination} merges when the rules are assembled dynamically rather
19
+ * than written out:
20
+ *
21
+ * ```ts
22
+ * conflict: coordination(humansOverwrite(), agentsReject())
23
+ * ```
24
+ *
25
+ * Either way the result is plain, serializable data that the engine reads at
26
+ * commit time. The `humans`/`agents` wording belongs to the author; the `user`/
27
+ * `agent`/`system` keys belong to the wire, and this module is the one place
28
+ * the two are mapped to each other.
19
29
  */
20
- import type { ConflictAxis } from '../policy/types.js';
30
+ import type { ConflictAxis } from '../transaction/policy/types.js';
21
31
  /**
22
32
  * One coordination rule: a partial {@link ConflictAxis} produced by a
23
33
  * disposition helper below. Compose with {@link coordination}.
@@ -41,6 +51,34 @@ export declare const systemOverwrite: () => ConflictRule;
41
51
  export declare const systemReject: () => ConflictRule;
42
52
  /** A system or automation stale write triggers a notification: it re-reads and re-applies. */
43
53
  export declare const systemNotify: () => ConflictRule;
54
+ /**
55
+ * A conflict axis that is still open to more rules. Every method applies one
56
+ * disposition and hands back a new axis, so a model's whole stance reads as a
57
+ * single sentence and the reader never has to hold a merge in their head.
58
+ *
59
+ * Each method delegates to the standalone rule of the same name, so a
60
+ * disposition map like `{ user: 'overwrite' }` is written in exactly one place
61
+ * no matter which authoring style a schema uses. Dispositions are own
62
+ * enumerable properties and the methods live on the prototype, so an axis
63
+ * serializes to the same plain object the server has always received.
64
+ */
65
+ declare class CoordinationAxis implements ConflictAxis {
66
+ readonly user?: ConflictAxis['user'];
67
+ readonly agent?: ConflictAxis['agent'];
68
+ readonly system?: ConflictAxis['system'];
69
+ constructor(axis: ConflictAxis);
70
+ /** Apply one more rule, later winning on a repeated kind. */
71
+ private and;
72
+ humansOverwrite(): CoordinationAxis;
73
+ humansReject(): CoordinationAxis;
74
+ humansNotify(): CoordinationAxis;
75
+ agentsOverwrite(): CoordinationAxis;
76
+ agentsReject(): CoordinationAxis;
77
+ agentsNotify(): CoordinationAxis;
78
+ systemOverwrite(): CoordinationAxis;
79
+ systemReject(): CoordinationAxis;
80
+ systemNotify(): CoordinationAxis;
81
+ }
44
82
  /**
45
83
  * Merges coordination rules into a single {@link ConflictAxis}. Later rules win
46
84
  * on key collisions, and a committer kind you leave out falls through to the
@@ -50,4 +88,25 @@ export declare const systemNotify: () => ConflictRule;
50
88
  * coordination(humansOverwrite(), agentsReject()) // → { user: 'overwrite', agent: 'reject' }
51
89
  * ```
52
90
  */
53
- export declare function coordination(...rules: readonly ConflictRule[]): ConflictAxis;
91
+ declare function mergeRules(...rules: readonly ConflictRule[]): ConflictAxis;
92
+ /**
93
+ * The coordination vocabulary, reachable through one name. Call it to merge
94
+ * rules you have assembled; reach through it to start a chain.
95
+ *
96
+ * ```ts
97
+ * conflict: coordination.humansOverwrite().agentsReject()
98
+ * conflict: coordination(humansOverwrite(), agentsReject())
99
+ * ```
100
+ */
101
+ export declare const coordination: typeof mergeRules & {
102
+ humansOverwrite: () => CoordinationAxis;
103
+ humansReject: () => CoordinationAxis;
104
+ humansNotify: () => CoordinationAxis;
105
+ agentsOverwrite: () => CoordinationAxis;
106
+ agentsReject: () => CoordinationAxis;
107
+ agentsNotify: () => CoordinationAxis;
108
+ systemOverwrite: () => CoordinationAxis;
109
+ systemReject: () => CoordinationAxis;
110
+ systemNotify: () => CoordinationAxis;
111
+ };
112
+ export {};
@@ -1,21 +1,31 @@
1
1
  /**
2
2
  * Authoring helpers for a model's `conflict` axis — the setting that decides
3
3
  * what happens when two writers touch the same row. Instead of writing a raw
4
- * disposition map, you compose small, named functions the way the rest of the
5
- * schema DSL reads (`relation.belongsTo()`, `field.string()`):
4
+ * disposition map, you name the rules the way the rest of the schema DSL reads
5
+ * (`relation.belongsTo()`, `field.string()`), and chain them the way a field
6
+ * chains its own modifiers:
6
7
  *
7
8
  * ```ts
8
- * import { coordination, humansOverwrite, agentsReject } from '@abloatai/ablo/schema';
9
+ * import { coordination } from '@abloatai/ablo/schema';
9
10
  *
10
- * conflict: coordination(humansOverwrite(), agentsReject())
11
+ * conflict: coordination.humansOverwrite().agentsReject()
11
12
  * // → { user: 'overwrite', agent: 'reject' } (a human's write wins, an agent's yields)
12
13
  * ```
13
14
  *
14
- * Each helper is named for the disposition it applies — drawn from the same
15
+ * Each rule is named for the disposition it applies — drawn from the same
15
16
  * `overwrite | reject | notify` vocabulary the write guards use (`onStale`) —
16
- * and returns a partial {@link ConflictAxis}. {@link coordination} merges the
17
- * pieces, with later rules winning on key collisions. The result is plain,
18
- * serializable data that the engine reads at commit time.
17
+ * and every one of them is also available as a standalone function, which
18
+ * {@link coordination} merges when the rules are assembled dynamically rather
19
+ * than written out:
20
+ *
21
+ * ```ts
22
+ * conflict: coordination(humansOverwrite(), agentsReject())
23
+ * ```
24
+ *
25
+ * Either way the result is plain, serializable data that the engine reads at
26
+ * commit time. The `humans`/`agents` wording belongs to the author; the `user`/
27
+ * `agent`/`system` keys belong to the wire, and this module is the one place
28
+ * the two are mapped to each other.
19
29
  */
20
30
  // ── Humans (user sessions) ──────────────────────────────────────────────
21
31
  /** A human's conflicting write wins and overwrites the other; it is never blocked. Among humans this gives last-write-wins. */
@@ -38,6 +48,53 @@ export const systemOverwrite = () => ({ system: 'overwrite' });
38
48
  export const systemReject = () => ({ system: 'reject' });
39
49
  /** A system or automation stale write triggers a notification: it re-reads and re-applies. */
40
50
  export const systemNotify = () => ({ system: 'notify' });
51
+ /**
52
+ * A conflict axis that is still open to more rules. Every method applies one
53
+ * disposition and hands back a new axis, so a model's whole stance reads as a
54
+ * single sentence and the reader never has to hold a merge in their head.
55
+ *
56
+ * Each method delegates to the standalone rule of the same name, so a
57
+ * disposition map like `{ user: 'overwrite' }` is written in exactly one place
58
+ * no matter which authoring style a schema uses. Dispositions are own
59
+ * enumerable properties and the methods live on the prototype, so an axis
60
+ * serializes to the same plain object the server has always received.
61
+ */
62
+ class CoordinationAxis {
63
+ constructor(axis) {
64
+ Object.assign(this, Object.fromEntries(Object.entries(axis).filter(([, mode]) => mode !== undefined)));
65
+ }
66
+ /** Apply one more rule, later winning on a repeated kind. */
67
+ and(rule) {
68
+ return new CoordinationAxis({ ...this, ...rule });
69
+ }
70
+ humansOverwrite() {
71
+ return this.and(humansOverwrite());
72
+ }
73
+ humansReject() {
74
+ return this.and(humansReject());
75
+ }
76
+ humansNotify() {
77
+ return this.and(humansNotify());
78
+ }
79
+ agentsOverwrite() {
80
+ return this.and(agentsOverwrite());
81
+ }
82
+ agentsReject() {
83
+ return this.and(agentsReject());
84
+ }
85
+ agentsNotify() {
86
+ return this.and(agentsNotify());
87
+ }
88
+ systemOverwrite() {
89
+ return this.and(systemOverwrite());
90
+ }
91
+ systemReject() {
92
+ return this.and(systemReject());
93
+ }
94
+ systemNotify() {
95
+ return this.and(systemNotify());
96
+ }
97
+ }
41
98
  /**
42
99
  * Merges coordination rules into a single {@link ConflictAxis}. Later rules win
43
100
  * on key collisions, and a committer kind you leave out falls through to the
@@ -47,6 +104,26 @@ export const systemNotify = () => ({ system: 'notify' });
47
104
  * coordination(humansOverwrite(), agentsReject()) // → { user: 'overwrite', agent: 'reject' }
48
105
  * ```
49
106
  */
50
- export function coordination(...rules) {
107
+ function mergeRules(...rules) {
51
108
  return Object.assign({}, ...rules);
52
109
  }
110
+ /**
111
+ * The coordination vocabulary, reachable through one name. Call it to merge
112
+ * rules you have assembled; reach through it to start a chain.
113
+ *
114
+ * ```ts
115
+ * conflict: coordination.humansOverwrite().agentsReject()
116
+ * conflict: coordination(humansOverwrite(), agentsReject())
117
+ * ```
118
+ */
119
+ export const coordination = Object.assign(mergeRules, {
120
+ humansOverwrite: () => new CoordinationAxis(humansOverwrite()),
121
+ humansReject: () => new CoordinationAxis(humansReject()),
122
+ humansNotify: () => new CoordinationAxis(humansNotify()),
123
+ agentsOverwrite: () => new CoordinationAxis(agentsOverwrite()),
124
+ agentsReject: () => new CoordinationAxis(agentsReject()),
125
+ agentsNotify: () => new CoordinationAxis(agentsNotify()),
126
+ systemOverwrite: () => new CoordinationAxis(systemOverwrite()),
127
+ systemReject: () => new CoordinationAxis(systemReject()),
128
+ systemNotify: () => new CoordinationAxis(systemNotify()),
129
+ });
@@ -21,8 +21,8 @@
21
21
  * by a {@link diffSchema} step list: drops, renames, type casts, and
22
22
  * backfills.
23
23
  */
24
- import { AbloValidationError } from '../errors.js';
25
- import { resolveTenancy, tenancyColumn } from './tenancy.js';
24
+ import { AbloValidationError } from '../transaction/errors.js';
25
+ import { resolveTenancy, tenancyColumn } from '../transaction/schema/tenancy.js';
26
26
  // ── Identifier safety ────────────────────────────────────────────────────────
27
27
  /** Postgres unquoted-identifier-safe slug: lowercase `[a-z0-9_]`, ≤50 chars. */
28
28
  function slug(raw) {
@@ -28,7 +28,7 @@
28
28
  * drop models. A newly added column is never created `NOT NULL`; making a column
29
29
  * required is a separate nullability change that a backfill must run before.
30
30
  */
31
- import type { FieldMeta } from './field.js';
31
+ import type { FieldMeta } from '../transaction/schema/field.js';
32
32
  import type { SchemaJSON } from './serialize.js';
33
33
  export type FieldType = FieldMeta['type'];
34
34
  /** Whether a Postgres `ALTER COLUMN … TYPE` can preserve the existing data. */
@@ -14,7 +14,7 @@
14
14
  * enums emitted as string-literal unions. Relations are not expanded here — the
15
15
  * runtime SDK resolves those through its typed accessors.
16
16
  */
17
- import { BASE_FIELDS } from './schema.js';
17
+ import { BASE_FIELDS } from '../transaction/schema/schema.js';
18
18
  function tsType(meta) {
19
19
  switch (meta.type) {
20
20
  case 'string':
@@ -21,21 +21,21 @@
21
21
  * ```
22
22
  */
23
23
  export { z } from 'zod';
24
- export { field, indexed, getFieldMeta, type FieldBuilder, type FieldMeta } from './field.js';
25
- export { relation, type RelationDef, type RelationType } from './relation.js';
26
- export { tenancySchema, scopedViaRefSchema, policyInputSchema, resolvePolicy, resolveTenancy, tenancyColumn, DEFAULT_ORG_COLUMN, type Tenancy, type ScopedViaRef, type PolicyInput, } from './tenancy.js';
27
- export { residencySchema, DEFAULT_RESIDENCY, type ModelResidency, planeSchema, DEFAULT_PLANE, type SchemaPlane, } from './residency.js';
28
- export { syncDeltaCoreSchema, deltaAttributionSchema, deltaProvenanceSchema, syncDeltaRowSchema, participantKindSchema, confirmationStateSchema, backfillProvenanceSchema, DELTA_DATA_CLASSIFICATION, DELTA_PHYSICAL_STORAGE, DELTA_RESIDENCY, type SyncDeltaCore, type DeltaAttribution, type DeltaProvenance, type SyncDeltaRow, type ParticipantKind, type ConfirmationState, type BackfillProvenance, } from './syncDeltaRow.js';
29
- export { syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, type SyncDeltaAction, type WireDeltaData, type ParticipantRef, type SyncDeltaWireCore, type ClientSyncDelta, type ServerSyncDelta, } from '../wire/delta.js';
30
- export { model, scopeKindOf, type ModelDef, type ModelOptions, type LoadStrategy, type PersistOptions, type RelationRecord, type GrantsRef, type ConflictAxis, } from './model.js';
24
+ export { field, indexed, getFieldMeta, type FieldBuilder, type FieldMeta } from '../transaction/schema/field.js';
25
+ export { relation, type RelationDef, type RelationType } from '../transaction/schema/relation.js';
26
+ export { tenancySchema, scopedViaRefSchema, policyInputSchema, resolvePolicy, resolveTenancy, tenancyColumn, DEFAULT_ORG_COLUMN, type Tenancy, type ScopedViaRef, type PolicyInput, } from '../transaction/schema/tenancy.js';
27
+ export { residencySchema, DEFAULT_RESIDENCY, type ModelResidency, } from '../transaction/schema/residency.js';
28
+ export { syncDeltaCoreSchema, deltaAttributionSchema, syncDeltaRowSchema, participantKindSchema, confirmationStateSchema, backfillProvenanceSchema, DELTA_DATA_CLASSIFICATION, DELTA_PHYSICAL_STORAGE, type SyncDeltaCore, type DeltaAttribution, type SyncDeltaRow, type ParticipantKind, type ConfirmationState, type BackfillProvenance, } from './syncDeltaRow.js';
29
+ export { syncDeltaActionSchema, wireDeltaDataSchema, participantRefSchema, syncDeltaWireCoreSchema, clientSyncDeltaSchema, serverSyncDeltaSchema, type SyncDeltaAction, type WireDeltaData, type ParticipantRef, type SyncDeltaWireCore, type ClientSyncDelta, type ServerSyncDelta, } from '../transaction/wire/delta.js';
30
+ export { model, scopeKindOf, LoadStrategy, DEFAULT_LOAD_STRATEGY, loadsAtBootstrap, type ModelDef, type ModelOptions, type PersistOptions, type RelationRecord, type GrantsRef, type ConflictAxis, } from '../transaction/schema/model.js';
31
31
  export { coordination, humansOverwrite, humansReject, humansNotify, agentsOverwrite, agentsReject, agentsNotify, systemOverwrite, systemReject, systemNotify, type ConflictRule, } from './coordination.js';
32
32
  export { mutable, readOnly, type SugarOptions } from './sugar.js';
33
- export { defineSchema, composeIdentitySyncGroups, type Schema, type SchemaRecord, type Model, type Row, type InferModel, type InferCreate, type InferRow, type InferModelNames, type BaseModelFields, type InsertValue, type UpsertValue, type UpdateValue, type DeleteId, type DefineSchemaOptions, type Casing, type CasingConvention, type CasingFn, composeEntitySyncGroups, intersectRequestedWithAllowed, type IdentityRole, type IdentityContext, type IdentityRoleSource, type EntityRole, type EntityContext, type EntityRoleSource, type RoleSource, type RoleContext, type SyncGroup, type SyncGroupInput, identityRole, entityRole, extractIdentityIds, extractEntityIds, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, type GroupsInput, type SessionSettings, type SessionSettingSource, RESERVED_SESSION_SETTINGS, } from './schema.js';
34
- export { serializeSchema, parseSchema, toSchemaJSON, fromSchemaJSON, schemaHash, type SchemaJSON, type ModelJSON, type RelationJSON, } from './serialize.js';
33
+ export { defineSchema, composeIdentitySyncGroups, type Schema, type SchemaRecord, type Model, type Row, type InferCreate, type InferRow, type InferModelNames, type BaseModelFields, type InsertValue, type UpsertValue, type UpdateValue, type DeleteId, type DefineSchemaOptions, type Casing, type CasingConvention, type CasingFn, composeEntitySyncGroups, intersectRequestedWithAllowed, type IdentityRole, type IdentityContext, type IdentityRoleSource, type EntityRole, type EntityContext, type EntityRoleSource, type RoleSource, type RoleContext, type SyncGroup, type SyncGroupInput, identityRole, entityRole, extractIdentityIds, extractEntityIds, syncGroup, syncGroupSchema, syncGroupInputSchema, isSyncGroupInput, identityRoleSchema, entityRoleSchema, roleSchema, roleSourceSchema, scopeSchema, grantsRefSchema, groupsInputSchema, type GroupsInput, type SessionSettings, type SessionSettingSource, RESERVED_SESSION_SETTINGS, } from '../transaction/schema/schema.js';
34
+ export { serializeSchema, parseSchema, toSchemaJSON, fromSchemaJSON, schemaHash, modelHash, type SchemaJSON, type ModelJSON, type RelationJSON, } from './serialize.js';
35
35
  export { selectModels, omitModels } from './select.js';
36
36
  export { generateProvisionPlan, generateMigrationPlan, appSchemaName, camelToSnake, snakeToCamel, q, sqlType, type ProvisionPlan, type MigrationPlan, } from './ddl.js';
37
37
  export { PG_LOCK_NOT_AVAILABLE, resolveDdlLockTimeout, resolveDdlMaxLockAttempts, ddlLockRetryBackoffMs, type DdlLockEnv, } from './ddlLock.js';
38
38
  export { diffSchema, classifyMigration, classifyCast, isAutoApplicable, isBlockerResolved, unresolvedBlockers, type BackfillValue, type MigrationStep, type FieldChanges, type FieldColumnChange, type FieldTypeChange, type NullabilityChange, type EnumValuesChange, type IndexChange, type CastSafety, type FieldType, type RenameHints, type MigrationSignal, type MigrationClassification, type WarningCode, type BlockerCode, } from './diff.js';
39
39
  export { generateTypes } from './generate.js';
40
40
  export { query, defineQueries, type QueryDef, type QueryRecord, type Queries, type InferQueryInput, type InferQueryResult, } from './queries.js';
41
- export { schemaToOpenApi, type SchemaToOpenApiOptions } from './openapi.js';
41
+ export { abloOpenApi, schemaToOpenApi, type SchemaToOpenApiOptions } from '../transaction/schema/openapi.js';