@abloatai/ablo 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +758 -5
  3. package/README.md +56 -502
  4. package/bin/ablo.cjs +39 -0
  5. package/dist/BaseSyncedStore.d.ts +176 -48
  6. package/dist/BaseSyncedStore.js +346 -214
  7. package/dist/Database.d.ts +17 -44
  8. package/dist/Database.js +96 -79
  9. package/dist/InstanceCache.d.ts +31 -6
  10. package/dist/InstanceCache.js +65 -30
  11. package/dist/LazyReferenceCollection.d.ts +3 -3
  12. package/dist/LazyReferenceCollection.js +4 -4
  13. package/dist/Model.d.ts +23 -13
  14. package/dist/Model.js +27 -17
  15. package/dist/ModelRegistry.d.ts +8 -4
  16. package/dist/ModelRegistry.js +20 -18
  17. package/dist/NetworkMonitor.d.ts +3 -1
  18. package/dist/NetworkMonitor.js +7 -5
  19. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  20. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  21. package/dist/SyncClient.d.ts +47 -47
  22. package/dist/SyncClient.js +215 -156
  23. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  24. package/dist/ai-sdk/coordinatedTool.js +1 -1
  25. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  26. package/dist/ai-sdk/coordinationContext.js +1 -1
  27. package/dist/ai-sdk/wrap.d.ts +3 -3
  28. package/dist/ai-sdk/wrap.js +2 -2
  29. package/dist/auth/index.d.ts +1 -156
  30. package/dist/auth/index.js +8 -301
  31. package/dist/client/Ablo.d.ts +42 -287
  32. package/dist/client/Ablo.js +129 -963
  33. package/dist/client/abloClient.d.ts +309 -0
  34. package/dist/client/abloClient.js +13 -0
  35. package/dist/client/clientPrelude.d.ts +52 -0
  36. package/dist/client/clientPrelude.js +60 -0
  37. package/dist/client/consoleLogger.d.ts +2 -2
  38. package/dist/client/coreClient.d.ts +60 -0
  39. package/dist/client/coreClient.js +118 -0
  40. package/dist/client/createInternalComponents.d.ts +8 -4
  41. package/dist/client/createInternalComponents.js +17 -10
  42. package/dist/client/createModelProxy.d.ts +98 -373
  43. package/dist/client/createModelProxy.js +233 -139
  44. package/dist/client/humans.d.ts +69 -0
  45. package/dist/client/humans.js +78 -0
  46. package/dist/client/modelRegistration.d.ts +1 -1
  47. package/dist/client/modelRegistration.js +9 -9
  48. package/dist/client/options.d.ts +73 -17
  49. package/dist/client/reactiveEngine.d.ts +53 -0
  50. package/dist/client/reactiveEngine.js +688 -0
  51. package/dist/client/resourceTypes.d.ts +9 -250
  52. package/dist/client/resourceTypes.js +8 -5
  53. package/dist/client/schemaConfig.d.ts +4 -4
  54. package/dist/client/schemaConfig.js +6 -2
  55. package/dist/client/storeCluster.d.ts +47 -0
  56. package/dist/client/storeCluster.js +118 -0
  57. package/dist/client/storeLifecycle.d.ts +61 -0
  58. package/dist/client/storeLifecycle.js +231 -0
  59. package/dist/client/validateAbloOptions.d.ts +3 -2
  60. package/dist/client/validateAbloOptions.js +1 -1
  61. package/dist/client/wsMutationExecutor.d.ts +3 -3
  62. package/dist/client/wsMutationExecutor.js +3 -3
  63. package/dist/context.d.ts +22 -9
  64. package/dist/context.js +33 -9
  65. package/dist/coordination/ClaimLog.d.ts +26 -0
  66. package/dist/coordination/ClaimLog.js +32 -0
  67. package/dist/coordination/index.d.ts +1 -15
  68. package/dist/coordination/index.js +8 -31
  69. package/dist/core/index.d.ts +3 -3
  70. package/dist/core/index.js +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +230 -0
  73. package/dist/docs/index.d.ts +10 -0
  74. package/dist/docs/index.js +10 -0
  75. package/dist/environment.d.ts +1 -40
  76. package/dist/environment.js +8 -37
  77. package/dist/index.d.ts +44 -36
  78. package/dist/index.js +30 -22
  79. package/dist/interfaces/index.d.ts +44 -134
  80. package/dist/keys/index.d.ts +1 -77
  81. package/dist/keys/index.js +8 -190
  82. package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
  83. package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
  84. package/dist/mutators/Transaction.d.ts +1 -1
  85. package/dist/mutators/Transaction.js +1 -1
  86. package/dist/mutators/UndoManager.d.ts +6 -6
  87. package/dist/mutators/UndoManager.js +5 -5
  88. package/dist/mutators/defineMutators.d.ts +3 -3
  89. package/dist/mutators/defineMutators.js +1 -1
  90. package/dist/mutators/inverseOp.js +2 -2
  91. package/dist/mutators/mutateActions.d.ts +3 -3
  92. package/dist/mutators/mutateActions.js +1 -1
  93. package/dist/mutators/readerActions.d.ts +1 -1
  94. package/dist/mutators/undoApply.d.ts +1 -1
  95. package/dist/mutators/undoApply.js +1 -1
  96. package/dist/policy/index.d.ts +2 -2
  97. package/dist/policy/index.js +1 -1
  98. package/dist/query/client.d.ts +5 -2
  99. package/dist/query/client.js +10 -9
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +18 -8
  103. package/dist/react/AbloProvider.js +10 -9
  104. package/dist/react/context.d.ts +3 -3
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/createAbloReact.d.ts +56 -0
  107. package/dist/react/createAbloReact.js +51 -0
  108. package/dist/react/index.d.ts +6 -5
  109. package/dist/react/index.js +6 -3
  110. package/dist/react/internalContext.d.ts +1 -1
  111. package/dist/react/useAblo.d.ts +12 -5
  112. package/dist/react/useAblo.js +26 -8
  113. package/dist/react/useCurrentUserId.js +1 -1
  114. package/dist/react/useErrorListener.js +1 -1
  115. package/dist/react/useMutationFailureListener.d.ts +2 -2
  116. package/dist/react/useMutationFailureListener.js +1 -1
  117. package/dist/react/useMutators.d.ts +3 -3
  118. package/dist/react/useMutators.js +3 -3
  119. package/dist/react/useUndoScope.d.ts +5 -5
  120. package/dist/react/useUndoScope.js +1 -1
  121. package/dist/schema/coordination.d.ts +69 -10
  122. package/dist/schema/coordination.js +90 -9
  123. package/dist/schema/ddl.js +2 -2
  124. package/dist/schema/diff.d.ts +1 -1
  125. package/dist/schema/generate.js +1 -1
  126. package/dist/schema/index.d.ts +11 -10
  127. package/dist/schema/index.js +22 -18
  128. package/dist/schema/queries.d.ts +27 -27
  129. package/dist/schema/queries.js +23 -23
  130. package/dist/schema/select.d.ts +3 -3
  131. package/dist/schema/select.js +6 -3
  132. package/dist/schema/serialize.d.ts +15 -6
  133. package/dist/schema/serialize.js +20 -3
  134. package/dist/schema/sugar.d.ts +6 -7
  135. package/dist/schema/sugar.js +9 -12
  136. package/dist/schema/syncDeltaRow.d.ts +4 -152
  137. package/dist/schema/syncDeltaRow.js +4 -105
  138. package/dist/server/adapter.d.ts +18 -1
  139. package/dist/server/commit.d.ts +10 -16
  140. package/dist/server/index.d.ts +1 -1
  141. package/dist/server/index.js +1 -1
  142. package/dist/server/readConfig.d.ts +1 -1
  143. package/dist/source/adapter.d.ts +7 -5
  144. package/dist/source/adapter.js +7 -5
  145. package/dist/source/adapters/drizzle.d.ts +1 -1
  146. package/dist/source/adapters/drizzle.js +2 -2
  147. package/dist/source/adapters/kysely.d.ts +1 -1
  148. package/dist/source/adapters/kysely.js +1 -1
  149. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  150. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  151. package/dist/source/adapters/memory.js +1 -1
  152. package/dist/source/adapters/prisma.d.ts +8 -3
  153. package/dist/source/adapters/prisma.js +1 -1
  154. package/dist/source/connector.js +1 -1
  155. package/dist/source/connectorProtocol.d.ts +2 -8
  156. package/dist/source/connectorProtocol.js +3 -2
  157. package/dist/source/contract.d.ts +29 -17
  158. package/dist/source/contract.js +27 -22
  159. package/dist/source/factory.d.ts +1 -1
  160. package/dist/source/idempotency.js +2 -2
  161. package/dist/source/index.d.ts +1 -0
  162. package/dist/source/index.js +3 -0
  163. package/dist/source/next.d.ts +1 -1
  164. package/dist/source/signing.d.ts +9 -2
  165. package/dist/source/signing.js +4 -1
  166. package/dist/source/types.d.ts +6 -4
  167. package/dist/source/types.js +1 -1
  168. package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
  169. package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
  170. package/dist/{core → stores}/DatabaseManager.js +14 -13
  171. package/dist/stores/ObjectStore.d.ts +1 -1
  172. package/dist/{core → stores}/StoreManager.d.ts +9 -26
  173. package/dist/{core → stores}/StoreManager.js +29 -77
  174. package/dist/stores/SyncActionStore.d.ts +4 -2
  175. package/dist/stores/SyncActionStore.js +11 -17
  176. package/dist/stores/syncAction.d.ts +26 -0
  177. package/dist/stores/syncAction.js +16 -0
  178. package/dist/surface.d.ts +3 -3
  179. package/dist/surface.js +6 -4
  180. package/dist/sync/BootstrapFetcher.d.ts +127 -6
  181. package/dist/sync/BootstrapFetcher.js +511 -83
  182. package/dist/sync/ConnectionManager.d.ts +6 -198
  183. package/dist/sync/ConnectionManager.js +6 -677
  184. package/dist/sync/OnDemandLoader.d.ts +5 -2
  185. package/dist/sync/OnDemandLoader.js +61 -21
  186. package/dist/sync/SubscriptionManager.d.ts +13 -2
  187. package/dist/sync/SubscriptionManager.js +23 -5
  188. package/dist/sync/SyncWebSocket.d.ts +27 -510
  189. package/dist/sync/SyncWebSocket.js +76 -954
  190. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  191. package/dist/sync/awaitClaimGrant.js +4 -109
  192. package/dist/sync/bootstrapApply.d.ts +3 -0
  193. package/dist/sync/bootstrapApply.js +2 -2
  194. package/dist/sync/commitFrames.d.ts +6 -40
  195. package/dist/sync/commitFrames.js +6 -97
  196. package/dist/sync/contextPorts.d.ts +18 -0
  197. package/dist/sync/contextPorts.js +31 -0
  198. package/dist/sync/createClaimStream.d.ts +5 -49
  199. package/dist/sync/createClaimStream.js +5 -469
  200. package/dist/sync/createPresenceStream.d.ts +26 -4
  201. package/dist/sync/createPresenceStream.js +28 -20
  202. package/dist/sync/createSnapshot.d.ts +2 -2
  203. package/dist/sync/createSnapshot.js +1 -1
  204. package/dist/sync/credentialLifecycle.d.ts +5 -173
  205. package/dist/sync/credentialLifecycle.js +5 -320
  206. package/dist/sync/deltaPipeline.d.ts +13 -12
  207. package/dist/sync/deltaPipeline.js +21 -4
  208. package/dist/sync/groupChange.d.ts +3 -0
  209. package/dist/sync/groupChange.js +16 -14
  210. package/dist/sync/participants.d.ts +24 -6
  211. package/dist/sync/participants.js +32 -23
  212. package/dist/sync/schemaDrift.d.ts +55 -0
  213. package/dist/sync/schemaDrift.js +53 -0
  214. package/dist/sync/schemas.d.ts +23 -33
  215. package/dist/sync/schemas.js +29 -20
  216. package/dist/sync/syncPlan.d.ts +3 -3
  217. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  218. package/dist/sync/wsFrameHandlers.js +6 -392
  219. package/dist/syncLog/contract.d.ts +20 -0
  220. package/dist/syncLog/contract.js +19 -0
  221. package/dist/syncLog/index.d.ts +1 -0
  222. package/dist/syncLog/index.js +1 -0
  223. package/dist/transaction/ablo.d.ts +88 -0
  224. package/dist/transaction/ablo.js +33 -0
  225. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  226. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  227. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  228. package/dist/transaction/auth/bootstrapScope.js +1 -0
  229. package/dist/transaction/auth/capability.d.ts +212 -0
  230. package/dist/transaction/auth/capability.js +224 -0
  231. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  232. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  233. package/dist/{client → transaction/auth}/identity.js +1 -1
  234. package/dist/transaction/auth/index.d.ts +162 -0
  235. package/dist/transaction/auth/index.js +304 -0
  236. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  237. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  238. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  239. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  240. package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
  241. package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
  242. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
  243. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
  244. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  245. package/dist/transaction/coordination/claimMeta.js +52 -0
  246. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  247. package/dist/transaction/coordination/createClaimStream.js +475 -0
  248. package/dist/transaction/coordination/events.d.ts +74 -0
  249. package/dist/transaction/coordination/events.js +7 -0
  250. package/dist/transaction/coordination/index.d.ts +19 -0
  251. package/dist/transaction/coordination/index.js +45 -0
  252. package/dist/transaction/coordination/locator.d.ts +104 -0
  253. package/dist/transaction/coordination/locator.js +102 -0
  254. package/dist/transaction/coordination/schema.d.ts +1536 -0
  255. package/dist/transaction/coordination/schema.js +1177 -0
  256. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  257. package/dist/transaction/coordination/targetConflict.js +107 -0
  258. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  259. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  260. package/dist/transaction/durableWrites.d.ts +62 -0
  261. package/dist/{client → transaction}/durableWrites.js +28 -3
  262. package/dist/transaction/environment.d.ts +105 -0
  263. package/dist/transaction/environment.js +108 -0
  264. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
  265. package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
  266. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  267. package/dist/{errors.js → transaction/errors.js} +85 -16
  268. package/dist/transaction/footprint.d.ts +111 -0
  269. package/dist/transaction/footprint.js +0 -0
  270. package/dist/transaction/index.d.ts +20 -0
  271. package/dist/transaction/index.js +20 -0
  272. package/dist/transaction/keys/index.d.ts +87 -0
  273. package/dist/transaction/keys/index.js +207 -0
  274. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  275. package/dist/transaction/log/syncDeltaRow.js +95 -0
  276. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  277. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  278. package/dist/transaction/logger.d.ts +16 -0
  279. package/dist/transaction/logger.js +7 -0
  280. package/dist/transaction/observability.d.ts +53 -0
  281. package/dist/transaction/observability.js +19 -0
  282. package/dist/transaction/plugin.d.ts +285 -0
  283. package/dist/transaction/plugin.js +106 -0
  284. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  285. package/dist/{policy → transaction/policy}/types.js +2 -0
  286. package/dist/transaction/resources/httpResources.d.ts +321 -0
  287. package/dist/transaction/resources/httpResources.js +7 -0
  288. package/dist/transaction/resources/modelOperations.d.ts +427 -0
  289. package/dist/transaction/resources/modelOperations.js +12 -0
  290. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  291. package/dist/transaction/resources/mutationOptions.js +9 -0
  292. package/dist/transaction/resources/where.d.ts +101 -0
  293. package/dist/transaction/resources/where.js +115 -0
  294. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  295. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  296. package/dist/{schema → transaction/schema}/field.d.ts +17 -23
  297. package/dist/{schema → transaction/schema}/field.js +5 -5
  298. package/dist/transaction/schema/fieldRef.d.ts +38 -0
  299. package/dist/transaction/schema/fieldRef.js +11 -0
  300. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  301. package/dist/transaction/schema/loadStrategy.js +46 -0
  302. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  303. package/dist/{schema → transaction/schema}/model.js +30 -20
  304. package/dist/transaction/schema/openapi.d.ts +58 -0
  305. package/dist/transaction/schema/openapi.js +501 -0
  306. package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
  307. package/dist/{schema → transaction/schema}/relation.js +7 -7
  308. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  309. package/dist/{schema → transaction/schema}/residency.js +0 -5
  310. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  311. package/dist/{schema → transaction/schema}/roles.js +5 -5
  312. package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
  313. package/dist/{schema → transaction/schema}/schema.js +24 -3
  314. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  315. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  316. package/dist/transaction/transactionLayer.d.ts +82 -0
  317. package/dist/transaction/transactionLayer.js +24 -0
  318. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
  319. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  320. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  321. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  322. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
  323. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  324. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  325. package/dist/transaction/transport/commitFrames.js +134 -0
  326. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  327. package/dist/transaction/transport/connectionManager.js +673 -0
  328. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  329. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  330. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  331. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  332. package/dist/transaction/transport/httpClient.d.ts +131 -0
  333. package/dist/{client → transaction/transport}/httpClient.js +6 -5
  334. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  335. package/dist/transaction/transport/httpOptions.js +12 -0
  336. package/dist/{client → transaction/transport}/httpTransport.js +295 -97
  337. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  338. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  339. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  340. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  341. package/dist/transaction/transport/wsTransport.d.ts +574 -0
  342. package/dist/transaction/transport/wsTransport.js +1023 -0
  343. package/dist/transaction/types/assertExact.d.ts +17 -0
  344. package/dist/transaction/types/assertExact.js +1 -0
  345. package/dist/{types → transaction/types}/global.d.ts +17 -2
  346. package/dist/{types → transaction/types}/global.js +2 -1
  347. package/dist/{types → transaction/types}/index.d.ts +14 -46
  348. package/dist/{types → transaction/types}/index.js +7 -16
  349. package/dist/{types → transaction/types}/streams.d.ts +73 -45
  350. package/dist/transaction/utils/duration.d.ts +50 -0
  351. package/dist/{utils → transaction/utils}/duration.js +32 -0
  352. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  353. package/dist/transaction/utils/json.js +276 -0
  354. package/dist/transaction/wire/accountResponses.d.ts +420 -0
  355. package/dist/transaction/wire/accountResponses.js +290 -0
  356. package/dist/transaction/wire/auth.d.ts +56 -0
  357. package/dist/transaction/wire/auth.js +63 -0
  358. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  359. package/dist/transaction/wire/claimEvent.js +73 -0
  360. package/dist/transaction/wire/claims.d.ts +530 -0
  361. package/dist/transaction/wire/claims.js +327 -0
  362. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  363. package/dist/{wire → transaction/wire}/commit.js +68 -47
  364. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  365. package/dist/{wire → transaction/wire}/delta.js +37 -13
  366. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  367. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  368. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  369. package/dist/transaction/wire/feedCursor.js +82 -0
  370. package/dist/transaction/wire/feedEvent.d.ts +204 -0
  371. package/dist/transaction/wire/feedEvent.js +65 -0
  372. package/dist/transaction/wire/frames.d.ts +194 -0
  373. package/dist/transaction/wire/frames.js +50 -0
  374. package/dist/transaction/wire/inboundFrames.d.ts +562 -0
  375. package/dist/transaction/wire/inboundFrames.js +116 -0
  376. package/dist/transaction/wire/index.d.ts +54 -0
  377. package/dist/transaction/wire/index.js +83 -0
  378. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  379. package/dist/transaction/wire/listEnvelope.js +42 -0
  380. package/dist/transaction/wire/modelMutations.d.ts +31 -0
  381. package/dist/transaction/wire/modelMutations.js +52 -0
  382. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  383. package/dist/transaction/wire/modelResponses.js +43 -0
  384. package/dist/transaction/wire/modelShape.d.ts +78 -0
  385. package/dist/transaction/wire/modelShape.js +74 -0
  386. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
  387. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
  388. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  389. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  390. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  391. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  392. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  393. package/dist/transactions/mutations/commitLatency.js +130 -0
  394. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  395. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  396. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
  397. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
  398. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
  399. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
  400. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  401. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  402. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  403. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
  404. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
  405. package/dist/utils/mobxSetup.d.ts +1 -1
  406. package/dist/utils/mobxSetup.js +5 -2
  407. package/dist/{core → views}/QueryView.d.ts +2 -2
  408. package/dist/{core → views}/QueryView.js +2 -2
  409. package/dist/{core → views}/ViewRegistry.d.ts +1 -1
  410. package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
  411. package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
  412. package/dist/webhooks/events.d.ts +2 -2
  413. package/dist/wire/index.d.ts +1 -34
  414. package/dist/wire/index.js +8 -49
  415. package/docs/agent-messaging.md +3 -3
  416. package/docs/agents.md +20 -13
  417. package/docs/api-keys.md +14 -10
  418. package/docs/api.md +27 -61
  419. package/docs/audit.md +6 -3
  420. package/docs/cli.md +41 -13
  421. package/docs/client-behavior.md +11 -9
  422. package/docs/concurrency-convention.md +49 -57
  423. package/docs/coordination.md +283 -121
  424. package/docs/data-sources.md +7 -5
  425. package/docs/debugging.md +39 -15
  426. package/docs/deployment.md +267 -0
  427. package/docs/examples/agent-human.md +49 -42
  428. package/docs/examples/ai-sdk-tool.md +69 -44
  429. package/docs/examples/existing-python-backend.md +8 -6
  430. package/docs/examples/nextjs.md +129 -47
  431. package/docs/examples/scoped-agent.md +46 -45
  432. package/docs/examples/server-agent.md +46 -26
  433. package/docs/groups.md +87 -30
  434. package/docs/guarantees.md +41 -12
  435. package/docs/how-it-works.md +38 -12
  436. package/docs/idempotency.md +126 -0
  437. package/docs/identity.md +77 -74
  438. package/docs/index.md +172 -86
  439. package/docs/integration-guide.md +31 -19
  440. package/docs/mcp.md +46 -21
  441. package/docs/migration.md +95 -18
  442. package/docs/operating-on-your-database.md +3 -1
  443. package/docs/projects.md +3 -1
  444. package/docs/quickstart.md +22 -5
  445. package/docs/react.md +31 -18
  446. package/docs/schema-contract.md +5 -3
  447. package/docs/session-settings.md +108 -0
  448. package/docs/sessions.md +4 -2
  449. package/docs/webhooks.md +12 -10
  450. package/llms.txt +48 -18
  451. package/package.json +21 -26
  452. package/dist/agent/Agent.d.ts +0 -366
  453. package/dist/agent/Agent.js +0 -514
  454. package/dist/agent/index.d.ts +0 -115
  455. package/dist/agent/index.js +0 -128
  456. package/dist/agent/session.d.ts +0 -93
  457. package/dist/agent/session.js +0 -149
  458. package/dist/agent/types.d.ts +0 -68
  459. package/dist/agent/types.js +0 -9
  460. package/dist/cli.cjs +0 -286329
  461. package/dist/client/durableWrites.d.ts +0 -21
  462. package/dist/client/httpClient.d.ts +0 -80
  463. package/dist/coordination/schema.d.ts +0 -722
  464. package/dist/coordination/schema.js +0 -578
  465. package/dist/schema/openapi.d.ts +0 -29
  466. package/dist/schema/openapi.js +0 -124
  467. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  468. package/dist/testing/fixtures/bootstrap.js +0 -59
  469. package/dist/testing/fixtures/deltas.d.ts +0 -83
  470. package/dist/testing/fixtures/deltas.js +0 -136
  471. package/dist/testing/fixtures/models.d.ts +0 -83
  472. package/dist/testing/fixtures/models.js +0 -272
  473. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  474. package/dist/testing/helpers/reactWrapper.js +0 -67
  475. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  476. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  477. package/dist/testing/helpers/wait.d.ts +0 -30
  478. package/dist/testing/helpers/wait.js +0 -49
  479. package/dist/testing/index.d.ts +0 -23
  480. package/dist/testing/index.js +0 -33
  481. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  482. package/dist/testing/mocks/FakeDatabase.js +0 -10
  483. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  484. package/dist/testing/mocks/MockMutationExecutor.js +0 -192
  485. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  486. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  487. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  488. package/dist/testing/mocks/MockSyncContext.js +0 -71
  489. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  490. package/dist/testing/mocks/MockSyncStore.js +0 -171
  491. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  492. package/dist/testing/mocks/MockWebSocket.js +0 -118
  493. package/dist/transactions/durableWriteStore.js +0 -30
  494. package/dist/utils/duration.d.ts +0 -25
  495. package/dist/utils/json.js +0 -88
  496. package/dist/wire/errorEnvelope.d.ts +0 -55
  497. package/dist/wire/frames.d.ts +0 -197
  498. package/dist/wire/frames.js +0 -49
  499. package/dist/wire/listEnvelope.js +0 -18
  500. package/docs/interaction-model.md +0 -97
  501. /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
  502. /package/dist/{core → query}/QueryProcessor.js +0 -0
  503. /package/dist/{core/storeContract.js → storeContract.js} +0 -0
  504. /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
  505. /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
  506. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  507. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  508. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  509. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  510. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  511. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  512. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  513. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  514. /package/dist/{client → transaction}/persistence.js +0 -0
  515. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  516. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  517. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  518. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  519. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  520. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  521. /package/dist/{types → transaction/types}/modelData.js +0 -0
  522. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  523. /package/dist/{types → transaction/types}/participant.js +0 -0
  524. /package/dist/{types → transaction/types}/streams.js +0 -0
  525. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  526. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  527. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  528. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  529. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  530. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  531. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  532. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  533. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  534. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  535. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
  536. /package/dist/{core → views}/ViewRegistry.js +0 -0
@@ -0,0 +1,427 @@
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 { ClaimPart, StaleNotification, TrackDependency } from '../coordination/schema.js';
15
+ import type { ClaimHeartbeatPlan } from '../coordination/claimHeartbeatLoop.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
+ /**
103
+ * A claimable part of a row: one of the model's own fields, an app-defined name
104
+ * marked with {@link part}, or any other string.
105
+ *
106
+ * The third arm is the one that matters, and it is not a TypeScript
107
+ * limitation. Function parameters are contravariant, so a claim accepting
108
+ * `'title' | 'status'` is not assignable to one accepting `string` — and the
109
+ * legacy `useAblo<R>()` path erases a concrete schema to `SchemaRecord`
110
+ * (`AbloProvider.tsx`: `engine as Ablo<SchemaRecord>`) and restores it, which
111
+ * is exactly that assignment. While that path exists this union must stay open,
112
+ * and `fields: ['titel']` therefore compiles, is granted, excludes nobody, and
113
+ * leaves the write of `title` unguarded — the conflict rule compares names as
114
+ * opaque strings, so an invented one matches no other claim and nothing reports
115
+ * it.
116
+ *
117
+ * The replacement already exists: `createAbloReact(schema)` creates its context
118
+ * after the schema is known, so nothing is erased and nothing is restored — the
119
+ * same shape as `createTRPCReact<AppRouter>()`. What remains is retiring the
120
+ * generic provider in favour of it; the callers are enumerated in
121
+ * docs/plans/typed-react-binding.md. When they have moved, this arm goes, and
122
+ * `fields: ['titel']` stops compiling with no change at any call site.
123
+ */
124
+ export type ClaimField<T> = Extract<keyof T, string> | ClaimPart | (string & {});
125
+ /**
126
+ * The options on a claim, in four axes — each answers one question, and no
127
+ * member sits in two:
128
+ *
129
+ * - **what you claim** — `field` / `fields` / `path` / `range`, the target
130
+ * narrowed below the row;
131
+ * - **what others see** — `description` / `meta`, the presence half;
132
+ * - **how you wait** — `queue` / `maxQueueDepth` / `waitTimeoutMs` /
133
+ * `signal`, admission to the line;
134
+ * - **how long you hold** — `ttl` / `heartbeat`, the lease.
135
+ */
136
+ export interface ClaimTargetOptions<T = Record<string, unknown>> {
137
+ /**
138
+ * @deprecated Say it as a set: `fields: ['title']`. Removed in 0.37.0.
139
+ *
140
+ * One member for a set of one, beside another for a set of any size, is two
141
+ * ways to say one thing — and the singular is the one that misleads. A caller
142
+ * needing two parts reached for the member named `field` and packed
143
+ * `'b_3,b_7'` into it, which compares as a single unrelated name, so both
144
+ * writers were granted the same part and one update was lost. That spelling
145
+ * is refused now, and this member is going with it.
146
+ *
147
+ * The wire keeps reading `field` — it is frozen, and an older client emits it
148
+ * — so this is a change of what you write, not of what is understood.
149
+ */
150
+ field?: ClaimField<T>;
151
+ /**
152
+ * Narrow the claim to named parts of the row — one or several.
153
+ *
154
+ * Exclusion follows the target: claims on the same row conflict only where
155
+ * their sets intersect, so a holder on `['title']` and a holder on
156
+ * `['status']` proceed concurrently, while a whole-row claim (no target)
157
+ * conflicts with both. The per-field claimed-state badge is a consequence of
158
+ * the narrower lease, not its purpose.
159
+ */
160
+ fields?: readonly ClaimField<T>[];
161
+ /**
162
+ * @deprecated Claim the field the position lives in — `fields: ['content']`.
163
+ * Removed in 0.37.0.
164
+ *
165
+ * A claim may not be finer than the smallest thing the write path can
166
+ * address, and today that is a field: nothing writes part of a value. Two
167
+ * holders of `/content/3` and `/content/7` therefore contend, because either
168
+ * one committing takes the whole `content` field — so naming the position
169
+ * bought exclusion it could not deliver, and this member read as a peer of
170
+ * `fields` while being nothing of the kind.
171
+ *
172
+ * For a UI that draws a rail per block, put the block id in `meta`: that is
173
+ * the open bag for describing your work to peers, it renders exactly as well,
174
+ * and it promises nothing about exclusion. The wire keeps parsing `path`, so
175
+ * an older client is unaffected.
176
+ */
177
+ path?: string;
178
+ /**
179
+ * @deprecated Claim the field the span lives in — `fields: ['content']`.
180
+ * Removed in 0.37.0.
181
+ *
182
+ * Same rule as {@link path}: a span of a value is not separately writable, so
183
+ * two disjoint spans of one field contend. Unlike `path` this one has a
184
+ * future — a mergeable field makes an operation the write unit, at which
185
+ * point a span inside it is addressable and this becomes enforceable. It
186
+ * returns then, for code rather than prose, and it returns working.
187
+ */
188
+ range?: TargetRange;
189
+ /** Peer-visible description of the work being performed — the sentence a
190
+ * contending participant reads to decide whether to wait, work elsewhere, or
191
+ * move on. Defaults to `'editing'`. The same field on every claim surface. */
192
+ description?: string;
193
+ /**
194
+ * App-defined structured metadata, carried verbatim to every participant
195
+ * that observes the claim. Declare its shape once, on `Register`'s
196
+ * `ClaimMeta` slot, and what you write here is what every reader is typed to
197
+ * find — the write side and the read side are the same declaration.
198
+ */
199
+ meta?: ResolveClaimMeta;
200
+ /**
201
+ * Behavior under contention. `true` (the default) queues behind the current
202
+ * holder and resolves once the row is yours. `false` is fail-fast: if another
203
+ * participant already holds the row, it rejects immediately with
204
+ * {@link AbloClaimedError} instead of waiting. Use `false` to deduplicate
205
+ * distributed work ("if someone else has this job, skip it"), where waiting
206
+ * would mean double-processing.
207
+ */
208
+ queue?: boolean;
209
+ /**
210
+ * Backpressure: queue, but not behind too many others. If the server reports a
211
+ * position at or beyond `maxQueueDepth` when the client joins the line, it
212
+ * rejects with {@link AbloClaimedError} (`queue_too_deep`) instead of waiting.
213
+ * Omit to wait however deep the queue is.
214
+ */
215
+ maxQueueDepth?: number;
216
+ /**
217
+ * Cap on how long a queued claim waits for its grant before rejecting with
218
+ * {@link AbloClaimedError} (`grant_timeout`). Omit to wait as long as the
219
+ * line takes. Same meaning on both transports; on the stateless HTTP client
220
+ * a timed-out wait also leaves the line, so the slot is not left to expire.
221
+ */
222
+ waitTimeoutMs?: number;
223
+ /**
224
+ * Abort a pending wait from outside — the same signal that cancels
225
+ * everything else in the program, so a cancelled agent task or an unmounted
226
+ * component takes its queued claim with it. Rejects with
227
+ * {@link AbloClaimedError} (`claim_wait_aborted`); over HTTP the abort also
228
+ * leaves the line. Ignored once the grant has arrived — a held lease is
229
+ * never torn down by a late abort; release it instead.
230
+ */
231
+ signal?: AbortSignal;
232
+ /** Crash-cleanup TTL — the claim auto-releases if the holder dies. */
233
+ ttl?: Duration;
234
+ /**
235
+ * Keep the lease alive for the duration of real work by beating on a
236
+ * cadence — the pattern for background workers whose task outlives the
237
+ * crash-cleanup TTL. `true` beats every third of the TTL (so two beats can
238
+ * fail before the lease is at risk, and a crashed worker's lease still
239
+ * lapses within one beat window); a duration such as `'2m'` sets the
240
+ * cadence explicitly; the structured {@link ClaimHeartbeatPlan} carries the
241
+ * cadence and both callbacks in one place —
242
+ * `heartbeat: { every: '2m', onBeat, onLost }`. The loop stops on release.
243
+ * You can also beat manually with `held.heartbeat()`.
244
+ */
245
+ heartbeat?: true | Duration | ClaimHeartbeatPlan;
246
+ }
247
+ /** Options for `claim({ id, ... })`. */
248
+ export interface ClaimParams<T = Record<string, unknown>> extends ClaimTargetOptions<T> {
249
+ readonly id: string;
250
+ }
251
+ export interface ClaimLookupParams<T = Record<string, unknown>> {
252
+ readonly id: string;
253
+ /** @deprecated Say it as a set: `fields: ['title']`. Removed in 0.37.0. */
254
+ readonly field?: ClaimField<T>;
255
+ /** Read the claim state of named parts of the row rather than the row. */
256
+ readonly fields?: readonly ClaimField<T>[];
257
+ }
258
+ export interface ClaimReorderParams<T = Record<string, unknown>> extends ClaimLookupParams<T> {
259
+ readonly order: readonly Claim[];
260
+ }
261
+ /**
262
+ * A claim handle: the held entity data plus an explicit release hook.
263
+ *
264
+ * ```ts
265
+ * const claim = await ablo.weatherReports.claim({
266
+ * id: 'report_stockholm',
267
+ * description: 'Fetching current weather before writing the forecast.',
268
+ * });
269
+ * try {
270
+ * await ablo.weatherReports.update({
271
+ * id: claim.target.id,
272
+ * data: { status: 'ready' },
273
+ * claim,
274
+ * });
275
+ * } finally {
276
+ * await claim.release();
277
+ * }
278
+ * ```
279
+ *
280
+ * `data` is a snapshot taken after the lease is held. Write through the flat
281
+ * `ablo.<model>.update({ id, data, claim })` verb — the handle carries the
282
+ * lease id and snapshot watermark for attribution and stale-write protection.
283
+ */
284
+ export type { Claim, ClaimHeartbeat, ClaimHeartbeatOptions, HeldClaim, HeldLease };
285
+ export type ClaimOptions<T = Record<string, unknown>> = ClaimTargetOptions<T>;
286
+ /**
287
+ * The coordination surface for a model, exposed as a callable namespace.
288
+ *
289
+ * Most callers do not need this namespace directly. Put `claim: { ... }` on a
290
+ * write and the SDK acquires/releases around that one mutation:
291
+ *
292
+ * ```ts
293
+ * await ablo.tasks.update({
294
+ * id,
295
+ * data: { title },
296
+ * claim: {
297
+ * field: 'title',
298
+ * description: 'Renaming the task to match the project brief.',
299
+ * },
300
+ * });
301
+ * ```
302
+ *
303
+ * Use `claim({ id, ... })` when a tool spans multiple writes and needs one
304
+ * handle. `state`, `queue`, and `reorder` are coordination reads/scheduler
305
+ * controls for UI and operators.
306
+ */
307
+ /**
308
+ * The coordination reads and scheduler controls on a claim namespace, in their
309
+ * reactive (synchronous) form: `state`, `queue`, and `reorder` resolve against
310
+ * the local pool with no round-trip, which is what lets a reactive selector read
311
+ * coordination state inside a React render.
312
+ *
313
+ * This is the single source of truth for the claim read surface. The stateless
314
+ * HTTP client exposes the awaited projection of exactly these methods (derived
315
+ * via {@link AwaitedClaimMethod}), so the two transports cannot drift — change a
316
+ * signature here and the HTTP surface follows.
317
+ */
318
+ export interface ClaimReadApi<T = Record<string, unknown>> {
319
+ /**
320
+ * Current holder for a row, or `null` when free. Use this for UI badges and
321
+ * preflight checks, not for the normal write path.
322
+ *
323
+ * `target.meta` reads as the shape declared on `Register`'s `ClaimMeta`
324
+ * slot, so no read of it needs a guard. Pass `M` only to override that
325
+ * declaration for one call — `state<OtherMeta>({ id })` — which a program
326
+ * carrying more than one meta shape occasionally needs.
327
+ */
328
+ state<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): Claim<Record<string, unknown>, M> | null;
329
+ /**
330
+ * Every holder of a row, not just one.
331
+ *
332
+ * A claim that names a narrower target — a `path`, a `range`, a `field` or
333
+ * `fields` — excludes only what it overlaps, so several participants hold
334
+ * disjoint parts of one row at the same time and
335
+ * {@link ClaimReadApi.state} answers with one of them. This is the read
336
+ * behind a per-region UI: a rail for each claimed block, a chip for each
337
+ * participant. Synchronous and reactive off the same snapshot as `state`,
338
+ * so a render reads it inline.
339
+ *
340
+ * Own claim first when this client holds one, then peers. Takes the same
341
+ * `meta` parameter as {@link ClaimReadApi.state}.
342
+ */
343
+ list<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): {
344
+ readonly object: 'list';
345
+ readonly data: readonly Claim<Record<string, unknown>, M>[];
346
+ };
347
+ /**
348
+ * FIFO wait line behind the current holder. Advanced: useful for operator
349
+ * UIs and schedulers. Takes the same `meta` parameter as
350
+ * {@link ClaimReadApi.state}.
351
+ */
352
+ queue<M = ResolveClaimMeta>(params: ClaimLookupParams<T>): {
353
+ readonly object: 'list';
354
+ readonly data: readonly Claim<Record<string, unknown>, M>[];
355
+ };
356
+ /**
357
+ * Re-rank the wait line. Advanced and permission-gated.
358
+ */
359
+ reorder(params: ClaimReorderParams<T>): void;
360
+ /** Release a manual claim handle early. Single-write claims auto-release. */
361
+ release(params: ClaimLookupParams<T> | Claim<T>): Promise<void>;
362
+ }
363
+ /**
364
+ * The awaited form of a claim method: a synchronous return becomes a `Promise`,
365
+ * an already-async one (`release`) is left untouched. Used to derive the
366
+ * stateless HTTP claim surface from the reactive {@link ClaimReadApi}.
367
+ */
368
+ export type AwaitedClaimMethod<F> = F extends (...args: infer A) => infer R ? R extends Promise<unknown> ? (...args: A) => R : (...args: A) => Promise<R> : F;
369
+ export interface ClaimApi<T> extends ClaimReadApi<T> {
370
+ /**
371
+ * The try-claim: `queue: false` treats a held target as an expected outcome,
372
+ * not an error — it resolves `null`, so claim-or-skip dedup reads
373
+ * `if (!claim) return` with no try/catch. Who holds it, and why, stays
374
+ * readable through `claim.state({ id })`. (A write to a row someone else
375
+ * holds still rejects with `entity_claimed` — a failed write is an error;
376
+ * a declined try is not.)
377
+ */
378
+ (params: ClaimParams<T> & {
379
+ queue: false;
380
+ }): Promise<HeldClaim<T> | null>;
381
+ /**
382
+ * Takes a claim and returns an explicit held-work handle — a {@link HeldClaim}.
383
+ * `data`, `release`, `revoke`, and the async disposer are always present (this
384
+ * call re-reads the row under the lease), so callers can use `handle.data`
385
+ * directly and `await using` works without a guard.
386
+ */
387
+ (params: ClaimParams<T>): Promise<HeldClaim<T>>;
388
+ /** The row-free try-claim — `null` when the key is already held. */
389
+ (id: string, opts: ClaimOptions<T> & {
390
+ queue: false;
391
+ }): Promise<HeldLease | null>;
392
+ /**
393
+ * Takes a claim by id alone, for a row that lives only in the customer's own
394
+ * database — Ablo has never seen it, so there is nothing to re-read. Returns a
395
+ * {@link HeldLease}: the same lease controls as {@link HeldClaim}
396
+ * (`release`, `revoke`, `heartbeat`, `await using`) but no `.data`. Locking a
397
+ * key you know by id is exactly this — serialize writers without first
398
+ * syncing the row into Ablo.
399
+ */
400
+ (id: string, opts?: ClaimOptions<T>): Promise<HeldLease>;
401
+ }
402
+ export interface ModelRetrieveParams extends ServerRetrieveOptions {
403
+ readonly id: string;
404
+ }
405
+ export interface ModelCreateParams<T, CreateInput> extends MutationOptions {
406
+ readonly data: CreateInput;
407
+ readonly id?: string | null;
408
+ readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
409
+ }
410
+ export interface ModelUpdateParams<T> extends MutationOptions {
411
+ readonly id: string;
412
+ readonly data: Partial<T>;
413
+ readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
414
+ }
415
+ export interface ModelDeleteParams<T> extends MutationOptions {
416
+ readonly id: string;
417
+ readonly claim?: Claim<T> | ClaimTargetOptions<T> | null;
418
+ }
419
+ /** Options for the WebSocket-only `ablo.<model>.join(ids, options?)`. */
420
+ export interface JoinOptions {
421
+ /**
422
+ * Lease TTL for the underlying presence claim — the participant
423
+ * auto-releases after this if the holder dies. Compact duration string
424
+ * (`'5m'`) or ms number, mirroring the claim `ttl`.
425
+ */
426
+ ttl?: Duration;
427
+ }
@@ -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,101 @@
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
+ * Does this operator accept this operand? The rule the sets above imply, stated
60
+ * once and thrown once.
61
+ *
62
+ * The sets were collapsed here because two copies of the split let one plane
63
+ * accept a request the other refused. The check that consumes them stayed
64
+ * duplicated — the SQL compiler and the log-plane evaluator each carried their
65
+ * own arity tests and their own wording — which leaves the same gap one step
66
+ * further along: relax `IN` in one evaluator and a request succeeds against a
67
+ * hosted plane and fails against a connected one, with no test in a position to
68
+ * notice.
69
+ *
70
+ * Returns the classification the caller needs next, so the check and the branch
71
+ * are the same statement rather than two that can disagree.
72
+ */
73
+ export declare function classifyWhereOperand(op: WhereOp, value: unknown): 'null' | 'array' | 'scalar';
74
+ /**
75
+ * A single condition. Two supported shapes:
76
+ *
77
+ * - `[col, value]` — shortcut for `[col, '=', value]`
78
+ * - `[col, op, value]` — explicit operator
79
+ *
80
+ * The value is a single primitive for scalar operators and an array of
81
+ * primitives for IN/NOT IN.
82
+ */
83
+ export type WhereClause = readonly [col: string, value: WherePrimitive] | readonly [col: string, op: WhereOp, value: WherePrimitive | readonly WherePrimitive[]];
84
+ /**
85
+ * Client-facing where shape for `load({where})` and `deleteMany({where})`.
86
+ *
87
+ * Two shapes accepted, both AND-combined:
88
+ *
89
+ * - Object form: `{ name: 'foo', orgId: '1' }` — each entry is an `=`
90
+ * clause; array values become `IN`. Ergonomic for the common case.
91
+ * - Tuple form: `[['name', 'ILIKE', '%Goldman%'], ['orgId', '1']]` —
92
+ * explicit operators (LIKE/ILIKE/<=/etc.). Matches the wire
93
+ * `WhereClause[]` 1:1, so no translation layer.
94
+ *
95
+ * The two forms compose: pass tuple form when you need an operator,
96
+ * object form otherwise. For OR semantics, run two `load()` calls and
97
+ * union client-side — keeps the protocol AND-only.
98
+ */
99
+ export type LoadWhere<T> = Partial<T> | {
100
+ [K in keyof T]?: T[K] | readonly T[K][];
101
+ } | readonly WhereClause[];