@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
package/docs/index.md CHANGED
@@ -1,103 +1,189 @@
1
1
  # Ablo Docs
2
2
 
3
- You have a database, and you want an AI agent to edit the same rows your
4
- users are editing — without the two clobbering each other's work. Ablo gives
5
- the agent a narrow, audited write path: you declare your models, then everyone
6
- (React components, server actions, and agents) calls the same
7
- `ablo.deck.update(...)`. Ablo streams confirmed changes to everyone live and
8
- rejects any write based on stale data.
3
+ > Collaboration infrastructure for AI agents: one API for agents, apps, and services to claim, change, and confirm the same rows.
9
4
 
10
- The flow is four steps: declare your models, read the current rows, claim the
11
- row you're about to change, then write — and the write is rejected if someone
12
- changed the row first.
5
+ Two agents reach for the same row. One claims it, does slow work an LLM call,
6
+ a fetch, a chain of tools — and commits. The second is neither rejected nor
7
+ allowed to clobber: it waits in line, is handed the row as it now stands, and
8
+ proceeds. Contention becomes an ordering problem instead of a retry loop.
13
9
 
14
10
  ```ts
15
- // The same call, whether a person, a server action, or an agent makes it.
16
- await ablo.deck.update({ id: deckId, data: { title: "Q3 Strategy" } });
11
+ // Take the row. Anyone else who wants it waits, then reads it fresh.
12
+ await using claim = await ablo.reports.claim({ id: reportId });
13
+
14
+ await ablo.reports.update({
15
+ id: claim.data.id,
16
+ data: { forecast: await generateForecast(claim.data) },
17
+ wait: 'confirmed',
18
+ });
17
19
  ```
18
20
 
19
- Claims don't lock. If another writer holds the row, `claim` waits for them,
20
- re-reads the fresh row, then hands it to you so two writers serialize
21
- instead of clobbering.
22
-
23
- ## What you get
24
-
25
- Three things stay true no matter how you use Ablo:
26
-
27
- - **One model API for every actor.** `ablo.<model>.update(...)` is the
28
- call from React components, server actions, background workers, and
29
- AI agents alike. No separate "agent SDK," no parallel mutation path.
30
- Attribution comes from the credential, not the call site.
31
- - **You declare tenancy scopes once.** Tenancy / per-entity scope
32
- prefixes (`org:`, `deck:`, or your own `region:` / `customer:`) are
33
- declared once on the schema's `identityRoles`, so application code
34
- never builds an `org:123` string by hand — which keeps tenant
35
- boundaries from leaking.
36
- - **Stale writes are rejected.** If the row changed after you read it,
37
- your write is turned away instead of silently overwriting the change
38
- you didn't see.
39
-
40
- ## Start here
41
-
42
- - [Quickstart](./quickstart.md) — Make your first schema-backed write.
43
- - [Schema Contract](./schema-contract.md) — One schema becomes typed model clients, React reads, agent writes, Data Source shape, and schema push.
44
- - [CLI & Migrations](./cli.md) — `init` / `migrate` / `push` / `generate`, the shared Zod→Postgres type map, and structured migration errors.
45
- - [Identity & Sync Groups](./identity.md) — Use your own authentication; tell Ablo who's connecting and how org / team / user map to sync-group scope.
46
- - [Integration Guide](./integration-guide.md) — Connect your database via Data Source, plus React, multiplayer, and agent patterns.
47
- - [Guarantees](./guarantees.md) — What confirmed writes, stale checks, and claims guarantee.
48
- - [Interaction Model](./interaction-model.md) — The schema, claim, update, confirmation loop.
49
- - [API Reference](./api.md) — Model-by-model method shape.
50
- - [Client Behavior](./client-behavior.md) — Options, errors, retries, timeouts, and imports.
51
- - [Debugging & Logs](./debugging.md) — Turn on the `[Ablo]` coordination trace (`debug` / `logLevel`) to watch claims, queueing, and grants while you build — or read the same activity in code via `ClaimLog` to render an activity feed.
52
- - [Connect Your Database](./data-sources.md) — Keep canonical rows in your app database without giving Ablo database credentials.
53
- - [Operating on Your Database](./operating-on-your-database.md) — Which actions run freely, which to verify first, and which belong to a human — and how to tell.
54
- - [React](./react.md) — Provider, hooks, and reactive reads for React apps.
55
- - [API Keys](./api-keys.md) — Bearer tokens for the public API.
56
-
57
- ## API shape
58
-
59
- | Plane | Primitives | Purpose |
60
- |---|---|---|
61
- | State | `Schema`, `Model`, `Claim`, `Receipt` | The product path. Load, coordinate, write, confirm. |
62
- | Storage | `Data Source` | Your rows live in your own database behind a signed Data Source endpoint. |
63
-
64
- ## Use cases
65
-
66
- - **Let agents write to shared state** — Give an AI agent scoped, revocable write access to your typed data.
67
- - **Coordinate multiple actors** — Use claims to show pre-write work across humans and agents.
68
- - **Audit every agent action** — Trace any write back to a human in one query.
69
- - **Build collaborative editors** — Humans and agents on the same record, with realtime updates and stale-read protection.
70
- - **Meter and gate API usage** — Per-key, per-team usage reports and quota enforcement.
71
- - **Integrate with A2A and MCP** — Speak the same protocols as Claude, Cursor, Gemini.
21
+ Claims do not lock. A lock is held against a caller who may never come back; a
22
+ claim is a durable lease with a wait-line behind it, so you can always ask who
23
+ holds a row and who is queued for it. The write returns a receipt, and a write
24
+ based on a row that has since changed is turned away rather than applied.
72
25
 
73
- ## Concepts
26
+ ## What people build
74
27
 
75
- - [Schema Contract](./schema-contract.md) — What the schema drives across SDK, React, agents, Data Source, and migrations.
76
- - [Model Methods](./api.md#model-methods) Load and write typed state.
77
- - [Integration Guide](./integration-guide.md) The normal app path and optional pieces.
78
- - [Guarantees](./guarantees.md) — Confirmed writes, optimistic state, stale-write protection, and agent lifecycle.
79
- - [Coordination](./coordination.md) — `claim`, `claim.state`, and `claim.queue` for active work.
80
- - [Connect Your Database](./data-sources.md) Where data lands when your app database is canonical.
81
- - [Operating on Your Database](./operating-on-your-database.md) The safety model for working on a live database: reversible model writes vs. human-gated DDL, and the read-only checks that resolve the doubt.
82
- - [Receipt](./api.md#receipt) — Confirm what landed.
83
- - [Usage](./api.md#usage) — Metering and audit dimensions.
84
- - [Audit Log](./audit.md) — Trace any confirmed write back to the human behind it.
85
- - [MCP](./mcp.md) — Expose Ablo models to MCP clients (Claude, Cursor).
28
+ <Columns>
29
+ <Card title="Run agents in parallel" icon="users" href="/coordination">
30
+ Many agents over one dataset. Claims put them in a line instead of a race.
31
+ </Card>
32
+
33
+ <Card title="Hand work between agents" icon="arrow-left-right" href="/agent-messaging">
34
+ One agent claims, works, releases. The next picks up with the fresh row and a durable note about why.
35
+ </Card>
86
36
 
87
- ## Examples
37
+ <Card title="Scope what an agent may write" icon="key-round" href="/api-keys">
38
+ A revocable key bound to one project's models. Attribution comes from the credential, not the call site.
39
+ </Card>
40
+
41
+ <Card title="Confirm what landed" icon="receipt" href="/guarantees">
42
+ Every write returns a receipt. Nothing is fire-and-forget, and stale writes are rejected.
43
+ </Card>
44
+
45
+ <Card title="Audit every agent action" icon="scroll-text" href="/audit">
46
+ Trace any committed change back to the key that made it, and to the person who authorized that key.
47
+ </Card>
48
+
49
+ <Card title="Keep a person in the loop" icon="hand" href="/react">
50
+ Add the `humans()` plugin and people get presence and live queries. A person's claim is just another holder the agent waits behind.
51
+ </Card>
52
+ </Columns>
53
+
54
+ ## Using Ablo
55
+
56
+ <Steps>
57
+ <Step title="Declare the models agents share">
58
+ `npx ablo init` scaffolds `ablo/schema.ts`, the typed client, and the type registration.
59
+ Declare only the models agents coordinate over — your auth, billing, and everything else
60
+ stay in your own migrations.
61
+
62
+ ```bash
63
+ npx ablo init && npx ablo push
64
+ ```
65
+
66
+ `push` is the step everything depends on: the server keeps its own copy of the schema, and
67
+ until it has yours, a write to a new model fails with `server_execute_unknown_model`.
68
+ </Step>
69
+
70
+ <Step title="Connect the database the rows live in">
71
+ Ablo writes through a scoped role and confirms by tailing your write-ahead log. It runs no
72
+ DDL and owns no schema — your migration tool stays in charge of the shape of your database.
73
+
74
+ ```bash
75
+ npx ablo connect
76
+ ```
77
+
78
+ No database yet? Pass an `apiKey` only and Ablo keeps the rows in its own log, so you can
79
+ build the whole system today and point it at Postgres when you are ready.
80
+ </Step>
81
+
82
+ <Step title="Build with Ablo">
83
+ You are writing the agent yourself — a worker, a job handler, a tool inside a model loop.
84
+ Agents hold no socket; the credential is the identity.
85
+
86
+ ```ts
87
+ const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY, transport: 'http' });
88
+ ```
89
+
90
+ Read with `list` / `retrieve`, coordinate with `claim`, write with `create` / `update` /
91
+ `delete`. See [Agents](./agents.md) for the loop and [API Reference](./api.md) for the shape.
92
+ </Step>
88
93
 
89
- - [AI SDK Tool](./examples/ai-sdk-tool.md) — Put Ablo inside an AI SDK tool call.
90
- - [Existing Python Backend](./examples/existing-python-backend.md) Add multiplayer and future agent writes without replacing a Python API server.
91
- - [Agent + Human](./examples/agent-human.md) Yield when a human is editing the same report.
92
- - [Server Agent](./examples/server-agent.md) — Schema-backed worker.
93
- - [Next.js](./examples/nextjs.md) — App-router setup with React bindings.
94
+ <Step title="Or point an MCP host at it">
95
+ The agent is Claude, Cursor, or another MCP host, and you want it operating your data
96
+ directly. The coordination server exposes the same claim-and-commit loop as tools.
94
97
 
95
- ## Runtime builds
98
+ ```bash
99
+ claude mcp add ablo -- npx -y @abloatai/mcp
100
+ ```
96
101
 
97
- - `@abloatai/ablo`schema-powered sync client for typed model operations, realtime claims, and receipts.
102
+ See [Model Context Protocol](./mcp.md) and read the surface table below before you pick,
103
+ because Ablo publishes two MCP servers and only one of them is a data plane.
104
+ </Step>
105
+ </Steps>
106
+
107
+ ## Surfaces
108
+
109
+ Every surface reaches the same coordinated state. Pick by who is calling.
110
+
111
+ | Surface | Use it for |
112
+ |---|---|
113
+ | **SDK**: `@abloatai/ablo`, `transport: 'http'` | The agents themselves. Stateless, request/response, nothing held open. The main path. |
114
+ | **Coordination MCP**: `@abloatai/mcp` | An agent living inside an MCP host that needs claim and commit as tools. A data plane. |
115
+ | **`humans()`**: with `@abloatai/ablo/react` | The interfaces a person watches agent work arrive in: presence, live queries, a local copy. |
116
+ | **CLI**: `ablo` | Scaffolding, schema push, connecting a database. Terminals and CI. |
117
+ | **REST**: `/api/v1` | Runtimes with no SDK. |
118
+ | **Integration-helper MCP**: hosted `/api/mcp` | Teaching a coding assistant the SDK while you build. Docs, lint, and scaffolds only. |
119
+
120
+ The two MCP servers are not interchangeable. The coordination server changes
121
+ your data; the integration-helper server serves documentation and has no
122
+ per-model data tools at all. An agent that edits rows uses the SDK or the
123
+ coordination server — never the helper.
124
+
125
+ ### Where people fit
126
+
127
+ The bare client is the coordination layer: commit, read, observe, claim. People
128
+ are something you add to it. `humans()` is the plugin that declares the local,
129
+ watchable copy — the offline store, live queries, presence, and the framework
130
+ bindings — and it needs a duplex connection, so a stateless agent cannot install
131
+ it and is told so at construction rather than left with a subscription that never
132
+ delivers.
133
+
134
+ There is no `agents()` plugin, and the absence is the point: agents are the
135
+ default caller, not a special one.
136
+
137
+ ## Concepts
138
+
139
+ - [How Ablo Works](./how-it-works.md) — the mental model in one page: you write through Ablo, it lands in your Postgres, the write-ahead log confirms it. **Read this first.**
140
+ - [Coordination](./coordination.md) — `claim`, `claim.state`, and `claim.queue`: who holds a row, and who is waiting.
141
+ - [Concurrency Convention](./concurrency-convention.md) — the governing rule for how concurrent writes resolve.
142
+ - [Guarantees](./guarantees.md) — what a confirmed write, a stale-write rejection, and a claim each promise.
143
+ - [Idempotency](./idempotency.md) — make a retried write safe; what replays, what re-runs, and for how long.
144
+ - [Schema Contract](./schema-contract.md) — one schema becomes typed clients, agent writes, React reads, and the push.
145
+ - [Agents](./agents.md) — the stateless participant: wake, read, claim, commit, idle.
146
+ - [Agent Messaging](./agent-messaging.md) — durable handoffs between agents, linked to the claim they discuss.
147
+ - [Identity & Sync Groups](./identity.md) — who is connecting, and which slice of state they see.
148
+ - [Change Propagation](./groups.md) — how one row's change reaches the actors that depend on it.
149
+ - [Client Behavior](./client-behavior.md) — options, errors, retries, timeouts, and imports.
150
+
151
+ ## Authority
152
+
153
+ - [Projects](./projects.md) — one organization, many apps; each with its own schema, planes, and keys.
154
+ - [API Keys](./api-keys.md) — the credential that carries an agent's identity and its scopes.
155
+ - [Sessions](./sessions.md) — short-lived scoped credentials your backend mints.
156
+ - [Audit Log](./audit.md) — trace any confirmed write back to the person behind it.
157
+ - [Operating on Your Database](./operating-on-your-database.md) — which actions run freely, which to verify first, and which belong to a human.
158
+ - [Session Settings](./session-settings.md) — point your row-level-security policies at Ablo's writes, by naming the settings they already read.
159
+
160
+ ## Build
161
+
162
+ - [Quickstart](./quickstart.md) — make your first coordinated write.
163
+ - [Integration Guide](./integration-guide.md) — the canonical end-to-end integration.
164
+ - [CLI & Migrations](./cli.md) — `init` / `connect` / `push` / `migrate` / `generate`.
165
+ - [Connect Your Database](./data-sources.md) — where rows land when your own database is canonical.
166
+ - [Deployment](./deployment.md) — the database, the keys, and the schema push that take an integration to production.
167
+ - [React](./react.md) — provider, hooks, and reactive reads.
168
+ - [Webhooks](./webhooks.md) — react to confirmed change from outside the SDK.
169
+ - [Debugging & Logs](./debugging.md) — watch claims, queueing, and grants while you build.
170
+
171
+ ## Reference
172
+
173
+ - [API Reference](./api.md) — model-by-model method shape.
174
+ - [Errors](./errors.md) — the code registry, its categories, and what to do about each.
175
+ - [Version History & Migration](./migration.md) — every breaking change and its migration.
176
+ - [Changelog](../CHANGELOG.md) — what shipped recently.
177
+
178
+ ## Examples
179
+
180
+ - [AI SDK Tool](./examples/ai-sdk-tool.md) — put Ablo inside a model's tool call.
181
+ - [Agent + Human](./examples/agent-human.md) — yield when a person is holding the same report.
182
+ - [Server Agent](./examples/server-agent.md) — a schema-backed worker.
183
+ - [Existing Python Backend](./examples/existing-python-backend.md) — add coordination without replacing your API server.
184
+ - [Next.js](./examples/nextjs.md) — app-router setup with React bindings.
98
185
 
99
186
  ## More
100
187
 
101
188
  - [README](../README.md) — product overview and first example.
102
- - [AGENTS.md](../AGENTS.md) — short installation guidance for coding assistants.
103
- - [Changelog](../CHANGELOG.md) — what shipped recently.
189
+ - [AGENTS.md](../AGENTS.md) — installation guidance for coding assistants.
@@ -1,15 +1,17 @@
1
1
  # Integration Guide
2
2
 
3
- If humans and AI agents both edit the same records in your app, they overwrite
4
- each other and there's no good place to coordinate. Ablo gives them one shared,
5
- typed write path the same `ablo.<model>.update(...)` call for a React
6
- component, a server action, a background worker, or an agent and reconciles the
7
- edits. This guide adds it to a product that already has a backend and database,
8
- one model at a time.
3
+ > The canonical end-to-end integration, added to an existing product one model at a time.
4
+
5
+ When several AI agents edit the same records in your app — alongside any people
6
+ watching them work they overwrite each other, and there is no good place to
7
+ coordinate. Ablo gives them one shared, typed write path: the same
8
+ `ablo.<model>.update(...)` call from an agent, a background worker, a server
9
+ action, or a React component. This guide adds it to a product that already has a
10
+ backend and a database, one model at a time.
9
11
 
10
12
  Three things hold no matter which actor is writing:
11
13
 
12
- - **One model API for every actor.** `ablo.<model>.update(...)` is what
14
+ - **One model API for every actor:** `ablo.<model>.update(...)` is what
13
15
  React components, server actions, background workers, and AI agents
14
16
  all call. No separate "agent SDK," no parallel mutation path. The
15
17
  attribution comes from the credential, not the call site.
@@ -79,7 +81,7 @@ and write path are ready for production.
79
81
  When handing this to a coding agent, give it a concrete target:
80
82
 
81
83
  ```txt
82
- Add Ablo to this app for one model that humans and agents both edit.
84
+ Add Ablo to this app for one model your agents edit.
83
85
  Use the org sandbox sk_test_* key. Declare schema, add the Ablo client, replace
84
86
  one write with ablo.<model>.update(..., { readAt, onStale: 'reject',
85
87
  wait: 'confirmed' }), and add a smoke test for two concurrent writers.
@@ -139,7 +141,6 @@ model(
139
141
  {
140
142
  /* fields */
141
143
  },
142
- /* relations */ {},
143
144
  {
144
145
  // Axis 1 — `policy`: who may READ a row (tenant isolation / RLS). A
145
146
  // row-local `organization_id` column is the default, so you omit this for
@@ -256,7 +257,7 @@ refreshes before expiry.
256
257
  Reads come in two flavors, and you pick based on whether you can wait.
257
258
  `retrieve({ id })` and `list({ where })` hit the server (and hydrate the local
258
259
  store) — they're async, so you `await` them. `get(id)` (positional),
259
- `getAll({ where })`, and `getCount({ where })` read the already-synced local
260
+ `local.list({ where })`, and `local.count({ where })` read the already-synced local
260
261
  graph synchronously, so they're the ones you call in render — and the ones you
261
262
  use inside a `useAblo` selector, never the async `retrieve`/`list`.
262
263
 
@@ -270,12 +271,12 @@ const report = await ablo.weatherReports.retrieve({ id: 'report_stockholm' });
270
271
  if (!report) throw new Error('report not found');
271
272
  ```
272
273
 
273
- Use `get`, `getAll`, and `getCount` for synchronous local-graph reads after
274
+ Use `local.retrieve`, `local.list`, and `local.count` for synchronous local-graph reads after
274
275
  data has synced.
275
276
 
276
277
  ```ts
277
- const report = ablo.weatherReports.get('report_stockholm');
278
- const activeReports = ablo.weatherReports.getAll({
278
+ const report = ablo.weatherReports.local.retrieve('report_stockholm');
279
+ const activeReports = ablo.weatherReports.local.list({
279
280
  where: { projectId: 'proj_123' },
280
281
  filter: (report) => report.status !== 'ready',
281
282
  orderBy: { updatedAt: 'desc' },
@@ -295,7 +296,7 @@ export function ReportRow({
295
296
  }: {
296
297
  report: { id: string; location: string; status: string };
297
298
  }) {
298
- const report = useAblo((ablo) => ablo.weatherReports.get(serverReport.id)) ?? serverReport;
299
+ const report = useAblo((ablo) => ablo.weatherReports.local.retrieve(serverReport.id)) ?? serverReport;
299
300
  const active = useAblo((ablo) => ablo.weatherReports.claim.state({ id: serverReport.id }));
300
301
 
301
302
  return <button disabled={Boolean(active) || report.status === 'ready'}>{report.location}</button>;
@@ -350,8 +351,19 @@ server -> ablo.weatherReports.update(...)
350
351
  Ablo coordinates those writes, fans out confirmed deltas, exposes active claims,
351
352
  and lets callers reject stale writes with `readAt`.
352
353
 
353
- Direct writes to your own database bypass that stream until your app reports the
354
- change through Data Source events.
354
+ A write that reaches your database some other way still reaches connected
355
+ clients. A `psql` session, a cron job, an admin tool, a legacy endpoint: Ablo
356
+ tails your write-ahead log, so a change it did not make is picked up and fanned
357
+ out like any other, attributed to the data source rather than to an agent.
358
+
359
+ What such a write does not get is the coordination. It never entered the commit
360
+ chokepoint, so no claim was checked, no `readAt` was compared, and no idempotency
361
+ key was honoured. It can land on top of a row an agent is holding. Route anything
362
+ that must respect a claim through `ablo.<model>`.
363
+
364
+ On the [Data Source endpoint fallback](./data-sources.md) there is no replication
365
+ stream to tail, and there the original caveat holds: a direct write stays
366
+ invisible until your app reports it through Data Source events.
355
367
 
356
368
  ## 6. Existing API Backend
357
369
 
@@ -375,7 +387,7 @@ The migration can be gradual:
375
387
 
376
388
  1. Declare schema for one model, such as `reports`.
377
389
  2. Keep existing server loads for first paint.
378
- 3. Add `useAblo((ablo) => ablo.weatherReports.get(id)) ?? serverReport` for live rows.
390
+ 3. Add `useAblo((ablo) => ablo.weatherReports.local.retrieve(id)) ?? serverReport` for live rows.
379
391
  4. Add one Data Source endpoint that calls the existing service layer.
380
392
  5. Move one mutation button from `fetch('/api/reports/...')` to `ablo.weatherReports.update(...)`.
381
393
  6. Add an outbox/events path for writes that still happen outside Ablo.
@@ -507,8 +519,8 @@ them.
507
519
  | `retrieve({ id })` | Async read of one row from the server (await it). |
508
520
  | `list({ where })` | Async read of many rows from the server (await it). |
509
521
  | `get(id)` | Synchronous local read of one synced row (positional id; use in render). |
510
- | `getAll({ where })` | Synchronous local read of many synced rows. |
511
- | `getCount({ where })` | Synchronous local count of synced rows. |
522
+ | `local.list({ where })` | Synchronous local read of many synced rows. |
523
+ | `local.count({ where })` | Synchronous local count of synced rows. |
512
524
  | `create({ data, id? })` | Create through the model client. |
513
525
  | `update({ id, data, ...opts })` | Update through the model client. |
514
526
  | `delete({ id, ...opts })` | Delete through the model client. |
package/docs/mcp.md CHANGED
@@ -1,48 +1,73 @@
1
1
  # Model Context Protocol
2
2
 
3
+ > Two MCP servers for two different jobs — one of them is a data plane, one is not.
4
+
3
5
  Ablo publishes **two** MCP servers for two different jobs. Don't confuse them:
4
6
 
5
7
  | Server | Purpose | Auth | Tools |
6
8
  |---|---|---|---|
7
- | **Coordination** (`@ablo/mcp`) | Let an agent safely read & mutate your application data | API key (`sk_…` / `rk_…`) | per-model `get` / `list` / `create` / `update` / `delete` / `claim` / `release` |
9
+ | **Coordination** (`@abloatai/mcp`) | Manage your Ablo the way the CLI does, and let an agent safely read & mutate application data | API key (`sk_…` / `rk_…`) | projects, schema, logs, usage: plus `get` / `list` / `create` / `update` / `delete` / `claim` / `release` over your rows |
8
10
  | **Integration-helper** (hosted `/api/mcp`) | Help an AI coding assistant write SDK integration code that compiles | none (public docs) | doc search, export surface, schema lint, scaffold |
9
11
 
10
- The coordination server **is the data plane** — it is how an agent changes
11
- state. The integration-helper server only serves docs, schema lint, and
12
- scaffolds; it does **not** read or write application data (there are no
12
+ The coordination server manages your account **and is the data plane** — it is
13
+ how an agent changes state. The integration-helper server only serves docs,
14
+ schema lint, and scaffolds; it does **not** read or write application data (there are no
13
15
  per-model data tools on it). Pick by what you're doing: shipping an agent that
14
16
  edits rows → coordination; teaching your IDE assistant the SDK → helper.
15
17
 
16
- ## Coordination server (`@ablo/mcp`)
18
+ ## Coordination server (`@abloatai/mcp`)
17
19
 
18
- The coordination server is the MCP projection of the model-scoped API
19
- (`/api/v1/models/...`) — the same surface as `ablo.<model>.create/update/claim` and
20
- the REST routes, rendered as tools. An agent connects with your API key and
21
- gets one safe loop: **claim → read → commit → release.**
20
+ The coordination server does two jobs: it manages your Ablo the way the `ablo`
21
+ CLI does, and it renders the model-scoped API (`/api/v1/models/...`) as tools
22
+ the same surface as `ablo.<model>.create/update/claim`. An agent connects with
23
+ your API key and gets one safe loop: **claim → read → commit → release.**
22
24
 
23
25
  Install over stdio; set your key in the host's MCP env:
24
26
 
25
27
  ```bash
26
- claude mcp add ablo -- npx -y @ablo/mcp
28
+ claude mcp add ablo -- npx -y @abloatai/mcp
27
29
  # env: ABLO_API_KEY=sk_… (ABLO_API_URL optional; defaults to the hosted API)
28
30
  ```
29
31
 
30
- Each tool mirrors an SDK verb, scoped to a model + id:
32
+ ### Managing your Ablo
33
+
34
+ | Tool | Mirrors | Does |
35
+ |---|---|---|
36
+ | `get_schema` | `ablo status` | the models this key can address, and its environment + project |
37
+ | `list_projects` | `ablo projects list` | the org's projects (needs `sk_`) |
38
+ | `create_project` | `ablo projects create` | create one (needs `sk_`) |
39
+ | `tail_logs` | `ablo logs` | recent commits and the actor behind each |
40
+ | `get_usage` |: | usage in daily buckets |
41
+
42
+ There are no key-management tools. A mint returns the plaintext once — only a
43
+ hash is kept — so no tool can hand it back later, and returning it at mint time
44
+ would write a live secret into the agent's context and the conversation
45
+ transcript, where it outlives any revocation. Listing and revoking will arrive
46
+ once a grant identifies the caller as a person rather than a key. Manage keys
47
+ with `ablo login` or the dashboard.
48
+
49
+ `ablo init`, `push`, `pull`, and `generate` have no tools: they read and write
50
+ files in your repo, which the server cannot see. Run those in a shell — then
51
+ call `get_schema` to see the result.
52
+
53
+ ### Reading and changing rows
54
+
55
+ Each tool mirrors an SDK verb, scoped to a model + id. Model names come from
56
+ `get_schema`:
31
57
 
32
58
  | Tool | Mirrors | Does |
33
59
  |---|---|---|
34
- | `get_model` | `ablo.<model>.get(id)` | read latest state + active claims |
35
- | `list_models` | `ablo.<model>.list({…})` | cursor-paginated list with filters |
60
+ | `get_model` | `ablo.<model>.local.retrieve(id)` | read latest state + active claims |
61
+ | `list_records` | `ablo.<model>.list({…})` | cursor-paginated list with filters |
36
62
  | `create_model` | `ablo.<model>.create({ data })` | guarded create |
37
63
  | `update_model` | `ablo.<model>.update({ id, … })` | guarded update |
38
64
  | `delete_model` | `ablo.<model>.delete({ id })` | guarded delete |
39
65
  | `claim_model` | `ablo.<model>.claim({ id })` | acquire / queue a coordination lease |
40
- | `release_claim` | | release the lease so others proceed |
66
+ | `release_claim` |: | release the lease so others proceed |
41
67
 
42
68
  The agent-facing contract — the safe loop, the "derive idempotency keys from
43
69
  the business event" rule, and the error-code playbook — ships as a loadable
44
- skill at `@ablo/mcp/skill.md`. Lives in `packages/mcp/`
45
- (`createCoordinationMcpServer`, `src/tools.ts`).
70
+ skill at `@abloatai/mcp/skill.md`.
46
71
 
47
72
  ## Integration-helper server
48
73
 
@@ -57,7 +82,7 @@ server above, never here.
57
82
  > The `@abloatai/ablo` npm package itself bundles neither server — it has
58
83
  > no `@modelcontextprotocol/sdk` dependency. The helper is a feature of Ablo's
59
84
  > hosted app, mounted at `/api/mcp`; the coordination server is the separate
60
- > `@ablo/mcp` package.
85
+ > `@abloatai/mcp` package.
61
86
 
62
87
  ### Install
63
88
 
@@ -69,9 +94,9 @@ claude mcp add --transport http ablo https://<your-app>/api/mcp
69
94
 
70
95
  The endpoint is identical for every client — only the config surface differs:
71
96
 
72
- - **Claude Code** run the `claude mcp add` command above; verify with `/mcp list`, remove with `claude mcp remove ablo`.
73
- - **Cursor** add the server to `~/.cursor/mcp.json` (macOS / Linux), then restart.
74
- - **Windsurf** add the same JSON via Settings → Cascade → MCP, then restart.
97
+ - **Claude Code:** run the `claude mcp add` command above; verify with `/mcp list`, remove with `claude mcp remove ablo`.
98
+ - **Cursor:** add the server to `~/.cursor/mcp.json` (macOS / Linux), then restart.
99
+ - **Windsurf:** add the same JSON via Settings → Cascade → MCP, then restart.
75
100
 
76
101
  Cursor and Windsurf use the same config shape:
77
102
 
@@ -95,7 +120,7 @@ Each client then lists the Ablo tools (`search_ablo_docs`, `get_recipe`, `get_ap
95
120
  | `get_recipe` | Returns the full markdown of one doc by name (e.g. `readme`, `quickstart`, `schema-contract`, `integration-guide`, `api`, `guarantees`). |
96
121
  | `get_api_surface` | Returns the structured export list for an SDK subpath (`@abloatai/ablo`, `./react`, `./schema`, `./testing`, …). Call with no argument to list every subpath. |
97
122
  | `validate_schema` | Lints `defineSchema` source against the DSL rules (camelCase fields, lowercase model keys, `scope`/`grants` sync groups, valid `load` strategies, no legacy builders) and returns a structured issue list. Runs no code. |
98
- | `scaffold_app` | Emits a starter file tree for a schema-first integration `next`, `node-agent`, or `plain`, with a `data-source` (your own database) endpoint. |
123
+ | `scaffold_app` | Emits a starter file tree for a schema-first integration: `next`, `node-agent`, or `plain`, with a `data-source` (your own database) endpoint. |
99
124
 
100
125
  #### Resources
101
126