@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
@@ -0,0 +1,319 @@
1
+ /**
2
+ * The request contract for `ablo.<model>` — the option and parameter shapes a
3
+ * caller passes to a read, a write, or a claim.
4
+ *
5
+ * These types describe the *change or the query being requested*, never a local
6
+ * copy of the rows it touches, so they sit in the settlement core and are shared
7
+ * by every transport and every caller (ADR 0013 §4, ADR 0016). The factory that
8
+ * binds them to reactive model instances — `createModelProxy` — stays with the
9
+ * reactive consumer, along with `ModelOperations` and `ModelCollaboration`,
10
+ * which reference the live participant handle.
11
+ */
12
+ import type { ModelScope } from '../types/index.js';
13
+ import type { ResolveClaimMeta } from '../types/global.js';
14
+ import type { AbloClaimedError } from '../errors.js';
15
+ import type { StaleNotification, TrackDependency } from '../coordination/schema.js';
16
+ import type { Duration } from '../utils/duration.js';
17
+ import type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease, TargetRange } from '../types/streams.js';
18
+ import type { MutationOptions } from './mutationOptions.js';
19
+ import type { LoadWhere } from './where.js';
20
+ /**
21
+ * A lifecycle filter, accepted either as the enum or as its bare string. The
22
+ * string arm is a template projection of the enum rather than a second list, so
23
+ * a scope added to {@link ModelScope} is spellable both ways at once.
24
+ */
25
+ export type ModelListScope = ModelScope | `${ModelScope}`;
26
+ /**
27
+ * Options for `track({ id })` — register a durable premise on a row.
28
+ *
29
+ * Derived from the wire's row-form {@link TrackDependency} rather than restated
30
+ * beside it: the caller names the row and, optionally, the watermark it is
31
+ * premised on, while `model` comes from the proxy the call was made on. Adding
32
+ * a field to the dependency therefore reaches this surface automatically, and
33
+ * removing one stops the callers compiling.
34
+ *
35
+ * On `readAt`: omit it to baseline at the current head — "tell me about
36
+ * anything from here on". Pass a known watermark (the one you read the row at)
37
+ * to also catch a change that landed between that read and this call.
38
+ */
39
+ export type ModelTrackParams = Omit<Extract<TrackDependency, {
40
+ model: string;
41
+ }>, 'model'>;
42
+ /** The result of `track({ id })`. */
43
+ export interface ModelTrackResult {
44
+ /**
45
+ * Tracks that had ALREADY fired at registration time — a change matching an
46
+ * open track that landed before this call. Present only when something was
47
+ * already stale; the ongoing signal arrives on the receipts of later commits.
48
+ */
49
+ notifications?: StaleNotification[];
50
+ }
51
+ /** Options for the synchronous local-graph reads `local.list` and `onChange` —
52
+ * a JavaScript `filter`, an equality `where`, and a lifecycle `state`. This is
53
+ * the local, reactive axis; contrast {@link ServerReadOptions}, the
54
+ * asynchronous server axis. */
55
+ export interface LocalReadOptions<T> {
56
+ where?: Partial<T>;
57
+ /** Arbitrary local predicate. Applied after `where`. */
58
+ filter?: (entity: T) => boolean;
59
+ orderBy?: {
60
+ [K in keyof T]?: 'asc' | 'desc';
61
+ };
62
+ limit?: number;
63
+ offset?: number;
64
+ /** Lifecycle filter — `live` (the default), `archived`, or `all`. Named
65
+ * `state` so it does not collide with the sync-group `scope`. */
66
+ state?: ModelListScope;
67
+ }
68
+ export type LocalCountOptions<T> = Pick<LocalReadOptions<T>, 'where' | 'filter' | 'state'>;
69
+ /** Options for the asynchronous server reads `retrieve` and `list` — the
70
+ * operator `where` filter, `type`, and `expand`. This is the server axis;
71
+ * contrast {@link LocalReadOptions}, the local, reactive axis. */
72
+ export interface ServerReadOptions<T> {
73
+ /**
74
+ * Filter for the lookup. Accepts two forms:
75
+ * - object form — `{ name: 'foo' }`: equality, where an array value means `IN`
76
+ * - tuple form — `[['name', 'ILIKE', '%Goldman%']]`: explicit operators
77
+ *
78
+ * See {@link LoadWhere} for the full grammar. The wire protocol matches on AND
79
+ * only; for OR semantics, run two `list()` calls and union the results.
80
+ */
81
+ where?: LoadWhere<T>;
82
+ orderBy?: {
83
+ [K in keyof T]?: 'asc' | 'desc';
84
+ };
85
+ limit?: number;
86
+ /**
87
+ * `complete` waits for the server. `unknown` returns whatever is local
88
+ * immediately and refreshes in the background.
89
+ */
90
+ type?: 'complete' | 'unknown';
91
+ /**
92
+ * Schema-declared relation names to hydrate alongside the primary
93
+ * rows. The server's compiler resolves each name via the schema's
94
+ * relation metadata (`relation.belongsTo` / `relation.hasMany`)
95
+ * and emits the JOIN.
96
+ */
97
+ expand?: readonly string[];
98
+ }
99
+ /** Options for the single-row async server read `retrieve({ id })`. A subset of
100
+ * {@link ServerReadOptions} — `where`/`limit`/`orderBy` are fixed by the id. */
101
+ export type ServerRetrieveOptions = Pick<ServerReadOptions<unknown>, 'type' | 'expand'>;
102
+ export interface ClaimTargetOptions<T = Record<string, unknown>> {
103
+ /** Peer-visible description of the work being performed — the sentence a
104
+ * contending participant reads to decide whether to wait, work elsewhere, or
105
+ * move on. Defaults to `'editing'`. The same field on every claim surface. */
106
+ description?: string;
107
+ /** Field-level target, for fine-grained claimed-state badges. */
108
+ field?: string;
109
+ /**
110
+ * Several named parts of the row at once. Claims conflict where their sets
111
+ * intersect, so two holders on disjoint parts do not wait for each other.
112
+ * Prefer this to packing names into `field`, which compares as one opaque
113
+ * string and lets overlapping sets both be granted.
114
+ */
115
+ fields?: readonly string[];
116
+ /** Optional path for document/file-like targets. */
117
+ path?: string;
118
+ /** Optional range for document/file-like targets. */
119
+ range?: TargetRange;
120
+ /**
121
+ * App-defined structured metadata, carried verbatim to every participant
122
+ * that observes the claim. Declare its shape once, on `Register`'s
123
+ * `ClaimMeta` slot, and what you write here is what every reader is typed to
124
+ * find — the write side and the read side are the same declaration.
125
+ */
126
+ meta?: ResolveClaimMeta;
127
+ /** Crash-cleanup TTL — the claim auto-releases if the holder dies. */
128
+ ttl?: Duration;
129
+ /**
130
+ * Behavior under contention. `true` (the default) queues behind the current
131
+ * holder and resolves once the row is yours. `false` is fail-fast: if another
132
+ * participant already holds the row, it rejects immediately with
133
+ * {@link AbloClaimedError} instead of waiting. Use `false` to deduplicate
134
+ * distributed work ("if someone else has this job, skip it"), where waiting
135
+ * would mean double-processing.
136
+ *
137
+ * The high-level typed claim defaults this on because it serializes writers;
138
+ * the low-level lease and the HTTP client default it off, since they resolve
139
+ * immediately and cannot transparently wait for a grant.
140
+ */
141
+ queue?: boolean;
142
+ /**
143
+ * Backpressure: queue, but not behind too many others. If the server reports a
144
+ * position at or beyond `maxQueueDepth` when the client joins the line, it
145
+ * rejects with {@link AbloClaimedError} (`queue_too_deep`) instead of waiting.
146
+ * Omit to wait however deep the queue is.
147
+ */
148
+ maxQueueDepth?: number;
149
+ /**
150
+ * Keep the lease alive for the duration of real work by beating on a
151
+ * cadence — the pattern for background workers whose task outlives the
152
+ * crash-cleanup TTL. `true` beats every third of the TTL (so two beats can
153
+ * fail before the lease is at risk, and a crashed worker's lease still
154
+ * lapses within one beat window); a duration such as `'2m'` sets the
155
+ * cadence explicitly. The loop stops on release. A beat answered with a
156
+ * definitive loss stops the loop and calls {@link onHeartbeatLost}; you can
157
+ * also beat manually with `held.heartbeat()`.
158
+ */
159
+ heartbeat?: true | Duration;
160
+ /**
161
+ * Called once if the auto-heartbeat learns the lease is no longer yours
162
+ * (expired and possibly granted onward). The loop has already stopped;
163
+ * abandon the work or re-claim. Any write attempted under the old lease is
164
+ * independently rejected by its `readAt` guard.
165
+ */
166
+ onHeartbeatLost?: (error: AbloClaimedError) => void;
167
+ /**
168
+ * Called after every successful beat (manual or auto) with the server's
169
+ * answer — chiefly `queueDepth`, the number of participants waiting in
170
+ * line behind this lease. A worker that can checkpoint may read pressure
171
+ * here and release early when others wait.
172
+ */
173
+ onHeartbeat?(beat: ClaimHeartbeat): void;
174
+ }
175
+ /** Options for `claim({ id, ... })`. */
176
+ export interface ClaimParams<T = Record<string, unknown>> extends ClaimTargetOptions<T> {
177
+ readonly id: string;
178
+ }
179
+ export interface ClaimLookupParams<T = Record<string, unknown>> {
180
+ readonly id: string;
181
+ readonly field?: string;
182
+ }
183
+ export interface ClaimReorderParams<T = Record<string, unknown>> extends ClaimLookupParams<T> {
184
+ readonly order: readonly Claim[];
185
+ }
186
+ /**
187
+ * A claim handle: the held entity data plus an explicit release hook.
188
+ *
189
+ * ```ts
190
+ * const claim = await ablo.weatherReports.claim({
191
+ * id: 'report_stockholm',
192
+ * description: 'Fetching current weather before writing the forecast.',
193
+ * });
194
+ * try {
195
+ * await ablo.weatherReports.update({
196
+ * id: claim.target.id,
197
+ * data: { status: 'ready' },
198
+ * claim,
199
+ * });
200
+ * } finally {
201
+ * await claim.release();
202
+ * }
203
+ * ```
204
+ *
205
+ * `data` is a snapshot taken after the lease is held. Write through the flat
206
+ * `ablo.<model>.update({ id, data, claim })` verb — the handle carries the
207
+ * lease id and snapshot watermark for attribution and stale-write protection.
208
+ */
209
+ export type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease };
210
+ export type ClaimOptions<T = Record<string, unknown>> = ClaimTargetOptions<T>;
211
+ /**
212
+ * The coordination surface for a model, exposed as a callable namespace.
213
+ *
214
+ * Most callers do not need this namespace directly. Put `claim: { ... }` on a
215
+ * write and the SDK acquires/releases around that one mutation:
216
+ *
217
+ * ```ts
218
+ * await ablo.tasks.update({
219
+ * id,
220
+ * data: { title },
221
+ * claim: {
222
+ * field: 'title',
223
+ * description: 'Renaming the task to match the project brief.',
224
+ * },
225
+ * });
226
+ * ```
227
+ *
228
+ * Use `claim({ id, ... })` when a tool spans multiple writes and needs one
229
+ * handle. `state`, `queue`, and `reorder` are coordination reads/scheduler
230
+ * controls for UI and operators.
231
+ */
232
+ /**
233
+ * The coordination reads and scheduler controls on a claim namespace, in their
234
+ * reactive (synchronous) form: `state`, `queue`, and `reorder` resolve against
235
+ * the local pool with no round-trip, which is what lets a reactive selector read
236
+ * coordination state inside a React render.
237
+ *
238
+ * This is the single source of truth for the claim read surface. The stateless
239
+ * HTTP client exposes the awaited projection of exactly these methods (derived
240
+ * via {@link AwaitedClaimMethod}), so the two transports cannot drift — change a
241
+ * signature here and the HTTP surface follows.
242
+ */
243
+ export interface ClaimReadApi<T = Record<string, unknown>> {
244
+ /**
245
+ * Current holder for a row, or `null` when free. Use this for UI badges and
246
+ * preflight checks, not for the normal write path.
247
+ *
248
+ * `target.meta` reads as the shape declared on `Register`'s `ClaimMeta`
249
+ * slot, so no read of it needs a guard. Pass `M` only to override that
250
+ * declaration for one call — `state<OtherMeta>({ id })` — which a program
251
+ * carrying more than one meta shape occasionally needs.
252
+ */
253
+ state<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): Claim<Record<string, unknown>, M> | null;
254
+ /**
255
+ * FIFO wait line behind the current holder. Advanced: useful for operator
256
+ * UIs and schedulers. Takes the same `meta` parameter as
257
+ * {@link ClaimReadApi.state}.
258
+ */
259
+ queue<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): {
260
+ readonly object: 'list';
261
+ readonly data: readonly Claim<Record<string, unknown>, M>[];
262
+ };
263
+ /**
264
+ * Re-rank the wait line. Advanced and permission-gated.
265
+ */
266
+ reorder(params: ClaimReorderParams<T>): void;
267
+ /** Release a manual claim handle early. Single-write claims auto-release. */
268
+ release(params: ClaimLookupParams<T> | Claim<T>): Promise<void>;
269
+ }
270
+ /**
271
+ * The awaited form of a claim method: a synchronous return becomes a `Promise`,
272
+ * an already-async one (`release`) is left untouched. Used to derive the
273
+ * stateless HTTP claim surface from the reactive {@link ClaimReadApi}.
274
+ */
275
+ export type AwaitedClaimMethod<F> = F extends (...args: infer A) => infer R ? R extends Promise<unknown> ? (...args: A) => R : (...args: A) => Promise<R> : F;
276
+ export interface ClaimApi<T> extends ClaimReadApi<T> {
277
+ /**
278
+ * Takes a claim and returns an explicit held-work handle — a {@link HeldClaim}.
279
+ * `data`, `release`, `revoke`, and the async disposer are always present (this
280
+ * call re-reads the row under the lease), so callers can use `handle.data`
281
+ * directly and `await using` works without a guard.
282
+ */
283
+ (params: ClaimParams<T>): Promise<HeldClaim<T>>;
284
+ /**
285
+ * Takes a claim by id alone, for a row that lives only in the customer's own
286
+ * database — Ablo has never seen it, so there is nothing to re-read. Returns a
287
+ * {@link HeldLease}: the same lease controls as {@link HeldClaim}
288
+ * (`release`, `revoke`, `heartbeat`, `await using`) but no `.data`. Locking a
289
+ * key you know by id is exactly this — serialize writers without first
290
+ * syncing the row into Ablo.
291
+ */
292
+ (id: string, opts?: ClaimOptions<T>): Promise<HeldLease>;
293
+ }
294
+ export interface ModelRetrieveParams extends ServerRetrieveOptions {
295
+ readonly id: string;
296
+ }
297
+ export interface ModelCreateParams<T, CreateInput> extends MutationOptions {
298
+ readonly data: CreateInput;
299
+ readonly id?: string | null;
300
+ readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
301
+ }
302
+ export interface ModelUpdateParams<T> extends MutationOptions {
303
+ readonly id: string;
304
+ readonly data: Partial<T>;
305
+ readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
306
+ }
307
+ export interface ModelDeleteParams<T> extends MutationOptions {
308
+ readonly id: string;
309
+ readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
310
+ }
311
+ /** Options for the WebSocket-only `ablo.<model>.join(ids, options?)`. */
312
+ export interface JoinOptions {
313
+ /**
314
+ * Lease TTL for the underlying presence claim — the participant
315
+ * auto-releases after this if the holder dies. Compact duration string
316
+ * (`'5m'`) or ms number, mirroring the claim `ttl`.
317
+ */
318
+ ttl?: Duration;
319
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The request contract for `ablo.<model>` — the option and parameter shapes a
3
+ * caller passes to a read, a write, or a claim.
4
+ *
5
+ * These types describe the *change or the query being requested*, never a local
6
+ * copy of the rows it touches, so they sit in the settlement core and are shared
7
+ * by every transport and every caller (ADR 0013 §4, ADR 0016). The factory that
8
+ * binds them to reactive model instances — `createModelProxy` — stays with the
9
+ * reactive consumer, along with `ModelOperations` and `ModelCollaboration`,
10
+ * which reference the live participant handle.
11
+ */
12
+ export {};
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Per-call options accepted by any mutation.
3
+ *
4
+ * Every field here defines, orders, settles, or authorises *the change itself*
5
+ * — request identity, commit disposition, fencing, and the premise it rests on.
6
+ * None of it touches a local copy of rows, so it belongs with the settlement
7
+ * core rather than the reactive consumer (ADR 0013 §4, ADR 0016).
8
+ */
9
+ import type { CommitWait } from '../wire/commit.js';
10
+ import type { OnStaleMode, ReadDependency, TrackDependency } from '../coordination/schema.js';
11
+ /**
12
+ * Per-call options accepted by any mutation, passed as the last argument.
13
+ * Every field is optional; omitted fields fall back to sensible defaults.
14
+ *
15
+ * - `idempotencyKey` — when set, the server caches the response for 24 hours and
16
+ * returns the cached result on any retry using the same key. When omitted, the
17
+ * SDK generates a fresh UUID per mutation, so every call is retry-safe by
18
+ * default. `null` is retained for source compatibility and is treated like
19
+ * omission; write retries never opt out of request identity.
20
+ * - `label` — a human-readable tag recorded with the mutation for debugging, such
21
+ * as "nightly cleanup" or "user click".
22
+ */
23
+ export interface MutationOptions {
24
+ idempotencyKey?: string | null;
25
+ label?: string;
26
+ wait?: CommitWait;
27
+ readAt?: number | null;
28
+ onStale?: OnStaleMode | null;
29
+ /**
30
+ * The fencing token (Option B) of the held claim this write belongs to. The
31
+ * server validates it against the entity's persisted high-water and rejects a
32
+ * stale token. Sourced from the claim handle, never set by hand.
33
+ */
34
+ fenceToken?: number | null;
35
+ /** The id (or `{ id }`) of the claim this write belongs to. This is the
36
+ * low-level reference the commit carries so the write is attributed to a claim
37
+ * and can pass the holder's own lock. It is distinct from the `claim` handle on
38
+ * the model write parameters, which is the higher-level object you usually pass. */
39
+ claimRef?: string | {
40
+ readonly id: string;
41
+ } | null;
42
+ /**
43
+ * The batch premise — the answer to "did anything I looked at change?" Each
44
+ * entry is a row (`{ model, id, readAt, fields? }`) or a sync group
45
+ * (`{ group, readAt }`) that this write was premised on. The server checks
46
+ * that none of them moved since their `readAt` and applies the entry's
47
+ * `onStale` behavior to the whole batch. This is distinct from the per-operation
48
+ * `readAt`, which guards only the row being written.
49
+ *
50
+ * See `packages/sync-engine/docs/concurrency-convention.md` (§3 the two
51
+ * premises, §4 the batch premise) for the governing convention.
52
+ */
53
+ reads?: ReadDependency[] | null;
54
+ /**
55
+ * Durable premises — what this write (or the record it produces) should
56
+ * keep watching. Unlike `reads`, which is checked once at commit and discarded,
57
+ * each `track` entry is persisted and re-checked against every future delta; a
58
+ * later matching change opens a `StaleNotification` for the tracking participant,
59
+ * delivered at their next commit or live to a held claim. Each entry is a row
60
+ * (`{ model, id }`) or a sync group (`{ group }`), optionally pinned to a `readAt`
61
+ * baseline (defaults to this commit's watermark).
62
+ *
63
+ * See `packages/sync-engine/docs/groups.md` for how `track` drives propagation.
64
+ */
65
+ track?: TrackDependency[] | null;
66
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Per-call options accepted by any mutation.
3
+ *
4
+ * Every field here defines, orders, settles, or authorises *the change itself*
5
+ * — request identity, commit disposition, fencing, and the premise it rests on.
6
+ * None of it touches a local copy of rows, so it belongs with the settlement
7
+ * core rather than the reactive consumer (ADR 0013 §4, ADR 0016).
8
+ */
9
+ export {};
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The where-clause grammar carried by a filtered read.
3
+ *
4
+ * A `where` is a flat list of `[column, operator, value]` conditions combined
5
+ * with AND. The protocol carries no model-specific logic: the server compiles a
6
+ * condition against your schema, so adding a model or relation is a schema
7
+ * change rather than a server change.
8
+ *
9
+ * The `IN` operator lets you batch a read by any column, including a foreign
10
+ * key — for example, fetching every block whose `sectionId` falls in a set of ids.
11
+ *
12
+ * These types describe the *request*, not any local copy of the rows it returns,
13
+ * so they live with the settlement core rather than the reactive consumer.
14
+ */
15
+ import { z } from 'zod';
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 declare const whereOpSchema: z.ZodEnum<{
25
+ "=": "=";
26
+ "!=": "!=";
27
+ "<": "<";
28
+ "<=": "<=";
29
+ ">": ">";
30
+ ">=": ">=";
31
+ IN: "IN";
32
+ "NOT IN": "NOT IN";
33
+ IS: "IS";
34
+ "IS NOT": "IS NOT";
35
+ LIKE: "LIKE";
36
+ "NOT LIKE": "NOT LIKE";
37
+ ILIKE: "ILIKE";
38
+ "NOT ILIKE": "NOT ILIKE";
39
+ }>;
40
+ export type WhereOp = z.infer<typeof whereOpSchema>;
41
+ /**
42
+ * How each operator binds its operand — the classification a compiler needs
43
+ * before it can render or evaluate a condition: a scalar on the right, an array
44
+ * to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
45
+ * whose operand is a pattern and therefore needs pattern validation.
46
+ *
47
+ * These live here, beside the operators, because every consumer of the grammar
48
+ * needs the same split and there is more than one consumer: a where clause is
49
+ * compiled to SQL on a hosted plane and evaluated in memory against the log on
50
+ * a source plane. Two hand-maintained copies of this split meant the same
51
+ * request could be accepted by one plane and rejected by the other — and the
52
+ * pattern-safety set existed on only one of them.
53
+ */
54
+ export declare const WHERE_SCALAR_OPS: ReadonlySet<WhereOp>;
55
+ export declare const WHERE_ARRAY_OPS: ReadonlySet<WhereOp>;
56
+ export declare const WHERE_NULL_OPS: ReadonlySet<WhereOp>;
57
+ export declare const WHERE_LIKE_OPS: ReadonlySet<WhereOp>;
58
+ /**
59
+ * A single condition. Two supported shapes:
60
+ *
61
+ * - `[col, value]` — shortcut for `[col, '=', value]`
62
+ * - `[col, op, value]` — explicit operator
63
+ *
64
+ * The value is a single primitive for scalar operators and an array of
65
+ * primitives for IN/NOT IN.
66
+ */
67
+ export type WhereClause = readonly [col: string, value: WherePrimitive] | readonly [col: string, op: WhereOp, value: WherePrimitive | readonly WherePrimitive[]];
68
+ /**
69
+ * Client-facing where shape for `load({where})` and `deleteMany({where})`.
70
+ *
71
+ * Two shapes accepted, both AND-combined:
72
+ *
73
+ * - Object form: `{ name: 'foo', orgId: '1' }` — each entry is an `=`
74
+ * clause; array values become `IN`. Ergonomic for the common case.
75
+ * - Tuple form: `[['name', 'ILIKE', '%Goldman%'], ['orgId', '1']]` —
76
+ * explicit operators (LIKE/ILIKE/<=/etc.). Matches the wire
77
+ * `WhereClause[]` 1:1, so no translation layer.
78
+ *
79
+ * The two forms compose: pass tuple form when you need an operator,
80
+ * object form otherwise. For OR semantics, run two `load()` calls and
81
+ * union client-side — keeps the protocol AND-only.
82
+ */
83
+ export type LoadWhere<T> = Partial<T> | {
84
+ [K in keyof T]?: T[K] | readonly T[K][];
85
+ } | readonly WhereClause[];
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The where-clause grammar carried by a filtered read.
3
+ *
4
+ * A `where` is a flat list of `[column, operator, value]` conditions combined
5
+ * with AND. The protocol carries no model-specific logic: the server compiles a
6
+ * condition against your schema, so adding a model or relation is a schema
7
+ * change rather than a server change.
8
+ *
9
+ * The `IN` operator lets you batch a read by any column, including a foreign
10
+ * key — for example, fetching every block whose `sectionId` falls in a set of ids.
11
+ *
12
+ * These types describe the *request*, not any local copy of the rows it returns,
13
+ * so they live with the settlement core rather than the reactive consumer.
14
+ */
15
+ import { z } from 'zod';
16
+ /**
17
+ * The comparison operators a {@link WhereClause} may use: equality and
18
+ * inequality, ordering, set membership (`IN` / `NOT IN`), null checks
19
+ * (`IS` / `IS NOT`), and case-sensitive or case-insensitive pattern
20
+ * matching (`LIKE`, `ILIKE`, and their negations).
21
+ */
22
+ export const whereOpSchema = z.enum([
23
+ '=',
24
+ '!=',
25
+ '<',
26
+ '<=',
27
+ '>',
28
+ '>=',
29
+ 'IN',
30
+ 'NOT IN',
31
+ 'IS',
32
+ 'IS NOT',
33
+ 'LIKE',
34
+ 'NOT LIKE',
35
+ 'ILIKE',
36
+ 'NOT ILIKE',
37
+ ]);
38
+ /**
39
+ * How each operator binds its operand — the classification a compiler needs
40
+ * before it can render or evaluate a condition: a scalar on the right, an array
41
+ * to expand, or a null check with no operand at all. `LIKE_OPS` is the subset
42
+ * whose operand is a pattern and therefore needs pattern validation.
43
+ *
44
+ * These live here, beside the operators, because every consumer of the grammar
45
+ * needs the same split and there is more than one consumer: a where clause is
46
+ * compiled to SQL on a hosted plane and evaluated in memory against the log on
47
+ * a source plane. Two hand-maintained copies of this split meant the same
48
+ * request could be accepted by one plane and rejected by the other — and the
49
+ * pattern-safety set existed on only one of them.
50
+ */
51
+ export const WHERE_SCALAR_OPS = new Set([
52
+ '=',
53
+ '!=',
54
+ '<',
55
+ '<=',
56
+ '>',
57
+ '>=',
58
+ 'LIKE',
59
+ 'NOT LIKE',
60
+ 'ILIKE',
61
+ 'NOT ILIKE',
62
+ ]);
63
+ export const WHERE_ARRAY_OPS = new Set(['IN', 'NOT IN']);
64
+ export const WHERE_NULL_OPS = new Set(['IS', 'IS NOT']);
65
+ export const WHERE_LIKE_OPS = new Set([
66
+ 'LIKE',
67
+ 'NOT LIKE',
68
+ 'ILIKE',
69
+ 'NOT ILIKE',
70
+ ]);
@@ -16,11 +16,8 @@
16
16
  * asserts the shape rather than replacing the value with a parsed copy.
17
17
  */
18
18
  import { z } from 'zod';
19
- export declare const onStaleModeSchema: z.ZodEnum<{
20
- reject: "reject";
21
- overwrite: "overwrite";
22
- notify: "notify";
23
- }>;
19
+ import { onStaleModeSchema } from '../coordination/schema.js';
20
+ export { onStaleModeSchema };
24
21
  export declare const writeOptionsSchema: z.ZodObject<{
25
22
  idempotencyKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
26
23
  label: z.ZodOptional<z.ZodString>;
@@ -38,7 +35,6 @@ export declare const writeOptionsSchema: z.ZodObject<{
38
35
  claim: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
39
36
  id: z.ZodString;
40
37
  }, z.core.$loose>]>>>;
41
- causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
38
  }, z.core.$strip>;
43
39
  export type WriteOptionsInput = z.infer<typeof writeOptionsSchema>;
44
40
  /**
@@ -17,8 +17,14 @@
17
17
  */
18
18
  import { z } from 'zod';
19
19
  import { AbloValidationError } from '../errors.js';
20
- import { commitStatusSchema } from '../wire/commit.js';
21
- export const onStaleModeSchema = z.enum(['reject', 'overwrite', 'notify']);
20
+ import { commitWaitSchema } from '../wire/commit.js';
21
+ import { onStaleModeSchema } from '../coordination/schema.js';
22
+ // Re-exported, not redeclared. `coordination/schema.ts` owns this enum — it is
23
+ // what the wire schemas and the server validate against — while the published
24
+ // SDK barrel exports the name from this module. Declaring it twice put a second
25
+ // object behind the public export that agreed with the canonical one only by
26
+ // both happening to list the same three strings.
27
+ export { onStaleModeSchema };
22
28
  export const writeOptionsSchema = z.object({
23
29
  /** Idempotency key the server records in `mutation_log` to make retries
24
30
  * safe; `null` opts out of that protection. */
@@ -26,7 +32,7 @@ export const writeOptionsSchema = z.object({
26
32
  /** Human-readable audit tag, persisted to `mutation_log.label`. */
27
33
  label: z.string().max(255).optional(),
28
34
  /** Resolve when queued locally (default) or once the server confirms. */
29
- wait: commitStatusSchema.optional(),
35
+ wait: commitWaitSchema.optional(),
30
36
  /** Stale guard: the sync watermark the caller's reasoning was based on. */
31
37
  readAt: z.number().int().nonnegative().nullish(),
32
38
  /** What the server does when the target moved past `readAt`. */
@@ -39,8 +45,6 @@ export const writeOptionsSchema = z.object({
39
45
  /** The claim this write belongs to — either a claim id, or a live claim
40
46
  * handle whose `release`/`revoke` functions are preserved untouched. */
41
47
  claim: z.union([z.string(), z.looseObject({ id: z.string() })]).nullish(),
42
- /** Reserved wire-compatibility field; current clients always send `null`. */
43
- causedByTaskId: z.string().nullish(),
44
48
  });
45
49
  /**
46
50
  * Validates a write-options object against {@link writeOptionsSchema}. On
@@ -103,18 +103,18 @@ export declare const field: {
103
103
  *
104
104
  * Example:
105
105
  * ```ts
106
- * const slideDecks = model({
106
+ * const reports = model({
107
107
  * metadata: field.json({
108
- * icon: z.string().default('presentation'),
108
+ * icon: z.string().default('report'),
109
109
  * color: z.string().default('#F59E0B'),
110
110
  * summary: z.string().optional(),
111
111
  * }),
112
112
  * });
113
113
  *
114
114
  * // At runtime:
115
- * deck.metadata // raw JSON string (unchanged)
116
- * deck.metadataJson // { icon: 'presentation', color: '#F59E0B', summary: undefined }
117
- * deck.metadataJson.icon // 'presentation' (typed, with default)
115
+ * report.metadata // raw JSON string (unchanged)
116
+ * report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
117
+ * report.metadataJson.icon // 'report' (typed, with default)
118
118
  * ```
119
119
  */
120
120
  readonly json: <T extends z.ZodType = z.ZodUnknown>(schemaOrShape?: T | z.ZodRawShape) => FieldBuilder<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
@@ -219,18 +219,18 @@ export const field = {
219
219
  *
220
220
  * Example:
221
221
  * ```ts
222
- * const slideDecks = model({
222
+ * const reports = model({
223
223
  * metadata: field.json({
224
- * icon: z.string().default('presentation'),
224
+ * icon: z.string().default('report'),
225
225
  * color: z.string().default('#F59E0B'),
226
226
  * summary: z.string().optional(),
227
227
  * }),
228
228
  * });
229
229
  *
230
230
  * // At runtime:
231
- * deck.metadata // raw JSON string (unchanged)
232
- * deck.metadataJson // { icon: 'presentation', color: '#F59E0B', summary: undefined }
233
- * deck.metadataJson.icon // 'presentation' (typed, with default)
231
+ * report.metadata // raw JSON string (unchanged)
232
+ * report.metadataJson // { icon: 'report', color: '#F59E0B', summary: undefined }
233
+ * report.metadataJson.icon // 'report' (typed, with default)
234
234
  * ```
235
235
  */
236
236
  json(schemaOrShape) {