@abloatai/ablo 0.35.0 → 0.37.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 (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
package/NOTICE CHANGED
@@ -1,4 +1,4 @@
1
- @abloatai/ablo
1
+ @ablo/ablo
2
2
  Copyright 2025-2026 Fablo Innovation AB
3
3
 
4
4
  This product includes software developed by Fablo Innovation AB
@@ -7,6 +7,6 @@ This product includes software developed by Fablo Innovation AB
7
7
  "Ablo" is a trademark of Fablo Innovation AB. This license does not grant
8
8
  permission to use the Ablo name, logo, or trademarks. Third parties
9
9
  may describe their use of or compatibility with Ablo factually (e.g.,
10
- "built with @abloatai/ablo") but may not use the Ablo name in a way
10
+ "built with @ablo/ablo") but may not use the Ablo name in a way
11
11
  that suggests endorsement, affiliation, or origin without written
12
12
  permission.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <strong>The coordination infrastructure for fleets of AI agents.</strong>
6
+ <strong>Transaction and coordination infrastructure for humans, agents, and backend systems.</strong>
7
7
  </p>
8
8
 
9
9
  <p align="center">
@@ -15,7 +15,6 @@
15
15
 
16
16
  <p align="center">
17
17
  <a href="https://www.npmjs.com/package/@abloatai/ablo"><img src="https://img.shields.io/npm/v/@abloatai/ablo?style=flat-square&color=2563eb" alt="npm" /></a>
18
- <a href="https://docs.abloatai.com"><img src="https://img.shields.io/badge/docs-docs.abloatai.com-2563eb?style=flat-square" alt="docs" /></a>
19
18
  <a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-2563eb?style=flat-square" alt="license" /></a>
20
19
  <img src="https://img.shields.io/badge/node-%E2%89%A524-22c55e?style=flat-square" alt="node >=24" />
21
20
  <img src="https://img.shields.io/badge/types-included-2563eb?style=flat-square" alt="types included" />
@@ -23,553 +22,45 @@
23
22
 
24
23
  ---
25
24
 
26
- Development stopped being the bottleneck; coordination is. The moment a *fleet*
27
- of agents — not one, and not just people — edits the same rows, work gets lost:
28
- one agent clobbers another, or acts on data that already moved. Ablo is the
29
- infrastructure that lets the fleet work as one — the load-bearing coordination
30
- layer the way operational-transform and presence sit invisibly under a shared
31
- document. You build the agents; Ablo is the substrate that lets them run together
32
- on shared state without stepping on each other, with the people and server
33
- actions alongside them on the exact same path.
25
+ Install the public SDK:
34
26
 
35
- The core idea is a **claim**. An agent's work is rarely one instant write; it
36
- reads something, thinks, calls an LLM or a tool, then writes back — and in that
37
- gap the row can move under it. So before the slow work starts, the agent claims
38
- the row. If another agent is already on it, `claim` waits its turn in a fair
39
- line, re-reads the fresh row, then hands it over. No stale overwrite, no separate
40
- agent mutation path. People are exempt by policy: a human edit is never made to
41
- queue behind an agent, and by declared conflict rules always wins.
42
-
43
- When the row moves anyway — say a record an agent generated against gets bumped
44
- the moment before it commits — the commit is rejected and the agent is handed
45
- back exactly the records that changed, so it re-reads only those, not the world.
46
- The pattern we kept measuring: with real agents contending on shared state, the
47
- win comes from the coordination layer, not a bigger model. Org beats intelligence.
48
-
49
- Under the hood, you define your data once with a Zod schema and get the same
50
- typed model client for every actor — people, server actions, and agents:
51
-
52
- ```ts
53
- await ablo.weatherReports.create({ data }) // create
54
- await ablo.weatherReports.retrieve({ id }) // read
55
- await ablo.weatherReports.update({ id, data }) // update
56
- await using claim = await ablo.weatherReports.claim({ id }) // hold for slow agent work
57
- ```
58
-
59
- The schema is the public contract. It gives you typed model methods, realtime
60
- fanout, React selectors, agent writes, and the HTTP/Data Source shape for
61
- non-JavaScript services. Every confirmed change shows up everywhere, and active
62
- claims are visible while the work is still in progress.
63
-
64
- **[Get started](#set-up)** &nbsp;·&nbsp; point your coding agent at the shipped
65
- `llms.txt` &nbsp;·&nbsp; **upgrading?** see the
66
- [Version History &amp; Migration Guide](./docs/migration.md)
67
-
68
- It works with the auth and database you already have. **In production, your
69
- database is the system of record.** You write through Ablo, and Ablo writes to
70
- your Postgres: the call enters Ablo's commit chokepoint — where claims, ordering,
71
- and idempotency are enforced — and lands in your own tables through a scoped
72
- writer role. The commit is accepted (`queued`) the moment Ablo takes it; when the
73
- row surfaces in your write-ahead log, the receipt is promoted to `confirmed`.
74
- **The WAL echo is how Ablo confirms, not how it writes** — your database, not
75
- Ablo, is the source of truth for row state, and that same stream is what keeps
76
- every connected client current, scoped to *sync groups* from your own identity.
77
-
78
- The writer role is non-superuser and cannot bypass RLS. Before each write Ablo
79
- sets your tenant context on the connection, so your own row-level security
80
- policies enforce against Ablo exactly as they do against your app. Ablo runs no
81
- DDL and owns no schema — your migration tool stays in charge of the shape of your
82
- database, and Ablo holds only the ordered transaction log and the coordination
83
- state, never your rows. (Trying Ablo with no database
84
- yet? A **sandbox** `sk_test` key holds throwaway **test data** — like Stripe test
85
- mode — so you can explore before pointing it at your Postgres. Test-mode only; in
86
- production every row lives in your database.)
87
-
88
- **Built for** fleets of agents working a shared backlog, AI agent workflows on
89
- your own infrastructure, collaborative editors where agents and people co-edit,
90
- and internal tools — anywhere agents (and the people alongside them) change
91
- shared state and everyone has to see it live.
92
-
93
- ## Set up
94
-
95
- The CLI takes you from nothing to a synced schema — it handles the account,
96
- the key, and the env file. You bring one thing: a Postgres you already have —
97
- the same `DATABASE_URL` (local, Neon, RDS — any will do) that backs your auth,
98
- audit, and log tables. Ablo syncs a *subset* of models against it; **in
99
- production, your database is the system of record**.
100
-
101
- ```bash
27
+ ```sh
102
28
  npm install @abloatai/ablo
103
- npx ablo login # opens the browser: sign in (or sign up) → a sk_test_ key is saved locally
104
- npx ablo init # scaffolds ablo/schema.ts (offers to log in if you skipped it)
105
- npx ablo push # pushes your schema (sandbox), writes ABLO_API_KEY to .env.local
106
- npx ablo dev # the same push, watching ablo/schema.ts and re-pushing on save
107
29
  ```
108
30
 
109
- Then point Ablo at the tables for your synced models. Most teams **already
110
- have those tables** (often Prisma- or Drizzle-managed) — adopt them with
111
- `npx ablo pull` / `npx ablo check`, the common case. Let Ablo own its own
112
- tables instead? `npx ablo migrate` provisions them in your Postgres (reads
113
- `DATABASE_URL`). Either way your other tables are left untouched.
114
-
115
- After `ablo push`, the [Quick Start](#quick-start) below runs as-is —
116
- `ABLO_API_KEY` is already in `.env.local` (frameworks load it automatically;
117
- plain Node: `node --env-file=.env.local app.ts`). `npx ablo status` shows
118
- what's configured at any time.
119
-
120
- **Keys & runtime.** Ablo needs Node 24+ and TypeScript 5+. Keys come in two of
121
- *your* environments — `sk_test_` and `sk_live_`, like Stripe — and `ablo login`
122
- mints both. Keep the key in trusted server runtimes only. In the browser,
123
- `<AbloProvider>` authenticates with the signed-in user's session — never the raw
124
- key. Your database is connected once, out of band, via `npx ablo connect`
125
- (logical replication); if it can't grant a replication role, expose a signed
126
- [Data Source endpoint](./docs/data-sources.md) instead.
127
-
128
- For production (React, an existing backend, Data Source, agents), the
129
- [Integration Guide](./docs/integration-guide.md) is the deeper map.
130
-
131
- **Prefer to let an agent wire it?** The package ships an `llms.txt` — a precise
132
- map of the API — so Claude Code or Cursor integrates from the real surface
133
- instead of guessing:
134
-
135
- > Read `node_modules/@abloatai/ablo/llms.txt`, then add an Ablo schema, a `<AbloProvider>`, and my first create / retrieve / update.
136
-
137
- ## Quick Start
138
-
139
- One schema, one client, one write path for agents, servers, and people — this runs as-is
140
- after `ablo push`:
31
+ Use the root package for headless agents, services, jobs, and backend code:
141
32
 
142
33
  ```ts
143
- import Ablo from '@abloatai/ablo';
144
- import { defineSchema, model, z } from '@abloatai/ablo/schema';
145
-
146
- const schema = defineSchema({
147
- // id, createdAt, updatedAt, organizationId, createdBy come free on every model
148
- weatherReports: model({
149
- location: z.string(),
150
- status: z.enum(['pending', 'ready']),
151
- forecast: z.string().optional(),
152
- }),
153
- });
34
+ import { Ablo } from '@abloatai/ablo';
154
35
 
155
36
  const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY });
156
- await ablo.ready();
157
-
158
- const created = await ablo.weatherReports.create({
159
- data: { location: 'Stockholm', status: 'pending' },
160
- });
161
-
162
- // Claim the row before slow work — anyone else waits in line, then re-reads.
163
- await using claim = await ablo.weatherReports.claim({ id: created.id });
164
- const forecast = await fetchForecast(claim.data.location); // slow: API or LLM call
165
- await ablo.weatherReports.update({
166
- id: created.id,
167
- data: { status: 'ready', forecast },
168
- claim, // the write completes the claimed work and releases the lease
169
- });
170
-
171
- const ready = ablo.weatherReports.local.retrieve(created.id);
172
- console.log({ id: ready?.id, status: ready?.status });
173
-
174
- await ablo.dispose();
175
- ```
176
-
177
- Expected output:
178
-
179
- ```txt
180
- { id: '...', status: 'ready' }
181
- ```
182
-
183
- ### TypeScript setup (once, scaffolded for you)
184
-
185
- `npx ablo init` writes `ablo/register.ts` next to your schema. It binds your
186
- schema to the SDK's types once — the same declaration-merging shape
187
- [TanStack Router uses](https://tanstack.com/router/latest/docs/framework/react/guide/type-safety) —
188
- so every hook and client infers from it:
189
-
190
- ```ts
191
- // ablo/register.ts — scaffolded by `npx ablo init`
192
- import type { schema } from './schema';
193
- declare module '@abloatai/ablo' {
194
- interface Register { Schema: typeof schema }
195
- }
196
- export {};
197
- ```
198
-
199
- ```ts
200
- import type { Model } from '@abloatai/ablo/schema';
201
-
202
- type WeatherReport = Model<'weatherReports'>; // fully typed from your schema
203
- ```
204
-
205
- To pass the client around, take the type from the value — the tRPC /
206
- Drizzle idiom:
207
-
208
- ```ts
209
- export const sync = Ablo({ schema, apiKey: process.env.ABLO_API_KEY });
210
- export type Sync = typeof sync;
211
-
212
- function persist(client: Sync) { /* ... */ }
213
- ```
214
-
215
- ## Reading
216
-
217
- Two ways to read, depending on whether you can wait. `retrieve({ id })` /
218
- `list({ where })` answer from what's local and go ask the server when they have
219
- to, so they return a `Promise`. Put `local.` in front and the read is restricted
220
- to what's already here — instant, reactive in render, and what your UI uses.
221
-
222
- ```ts
223
- ablo.weatherReports.local.retrieve('report_stockholm');
224
-
225
- const pending = ablo.weatherReports.local.list({
226
- where: { status: 'pending' },
227
- orderBy: { location: 'asc' },
228
- limit: 20,
229
- });
230
-
231
- const ready = await ablo.weatherReports.list({
232
- where: { status: 'ready' },
233
- type: 'complete',
234
- });
235
- ```
236
-
237
- An array value in `where` means `IN`. On `list`, `type: 'complete'` waits for
238
- the server; `'unknown'` returns what's local now and refreshes in the background.
239
-
240
- ## Writing
241
-
242
- `create` / `update` apply optimistically and resolve to the row. Two options
243
- matter day to day:
244
-
245
- | Option | Values | What it does |
246
- | --- | --- | --- |
247
- | `wait` | `'queued'` \| `'confirmed'` | `'confirmed'` resolves only after the server acks the write; `'queued'` resolves as soon as it's locally queued (fire-and-forget). |
248
- | `idempotencyKey` | `string` | Auto-generated per call. Override only when you own the retry boundary (e.g. a job id) so a re-run dedupes server-side. |
249
-
250
- ```ts
251
- await ablo.weatherReports.update({ id, data: { status: 'ready' }, wait: 'confirmed' });
252
- ```
253
-
254
- To guard a write against a row that changed under you, pass `readAt` + `onStale`
255
- — see [Coordinating long agent work](#coordinating-long-agent-work).
256
-
257
- ## Coordinating long agent work
258
-
259
- An agent reads a row, thinks for 30s, writes back — and clobbers whatever changed
260
- meanwhile, or worse, acts on stale state. `claim` holds the row across that gap:
261
-
262
- ```ts
263
- await using claim = await ablo.weatherReports.claim({ id: 'report_stockholm' });
264
- const report = claim.data;
265
- const forecast = await weatherAgent.getWeather(report.location);
266
- await ablo.weatherReports.update({
267
- id: report.id,
268
- data: { forecast, status: 'ready' },
269
- claim, // attribute the write to the held claim
37
+ await ablo.orders.update({
38
+ id: orderId,
39
+ data: { status: 'approved' },
270
40
  });
271
41
  ```
272
42
 
273
- If someone else holds the row, `claim()` waits in a fair queue, then re-reads —
274
- so `report` is the current row, never a stale snapshot. Reads stay open by
275
- default; only acting on the row serializes. The claim releases when the `await
276
- using` scope exits — on return, and on a throw. That "on throw" is why `await
277
- using` earns its keep: if the agent call fails before the write, the row frees
278
- for the next in line and stays exactly as it was, with no cleanup of your own.
279
-
280
- See who's mid-edit before you act — decide to wait, or skip:
281
-
282
- ```ts
283
- ablo.weatherReports.claim.state({ id: 'report_stockholm' });
284
- ablo.weatherReports.claim.queue({ id: 'report_stockholm' });
285
-
286
- {
287
- await using claim = await ablo.weatherReports.claim({ id, queue: false });
288
- /* do the held work */
289
- }
290
-
291
- {
292
- await using claim = await ablo.weatherReports.claim({ id, maxQueueDepth: 2 });
293
- /* do the held work */
294
- }
295
- ```
296
-
297
- `claim.state` returns the holder (or `null`); `claim.queue` returns the line waiting
298
- behind it. `queue: false` skips rather than waiting when the row is held;
299
- `maxQueueDepth: 2` bails when two or more are already ahead.
300
-
301
- Default reads keep working while a row is claimed. Server reads that need claimed
302
- semantics can opt in with `ifClaimed: 'return' | 'fail'`.
303
-
304
- Even an unclaimed write can't land on stale reasoning — the commit is guarded:
305
-
306
- ```ts
307
- try {
308
- await ablo.weatherReports.update({ id, data: { status: 'ready' }, readAt, onStale: 'reject' });
309
- } catch (e) {
310
- if (e instanceof AbloStaleContextError) { /* row moved under you — re-read, retry */ }
311
- }
312
- ```
313
-
314
- > Use `await using` for ordinary held work — the claim releases when the scope
315
- > exits. Call `claim.release({ id })` only to give a manually held claim back
316
- > early.
317
-
318
- See [Coordination](./docs/coordination.md) for the full `claim` / `claim.state` /
319
- `claim.queue` / `claim.release` reference.
320
-
321
- ## Background workers — jobs that run for minutes, not seconds
322
-
323
- Your API route enqueues a job on your own queue (SQS, EventBridge, anything);
324
- a worker on your own infrastructure does the slow part. **Keep that queue —
325
- Ablo is the worker's data layer.** It covers the two things every queue leaves
326
- to you: keeping the row safe, and showing progress live.
327
-
328
- Long work holds its claim by **heartbeating** — the same pattern as an SQS
329
- visibility heartbeat or a Temporal activity heartbeat:
43
+ Use the client entrypoint for a WebSocket-backed reactive application:
330
44
 
331
45
  ```ts
332
- // on your worker stateless HTTP, no socket to hold
333
- await using claim = await ablo.weatherReports.claim({
334
- id: msg.reportId,
335
- ttl: '10m',
336
- heartbeat: true, // beats automatically until release
337
- onHeartbeatLost: () => abort(), // the lease is gone → stop working
338
- });
339
-
340
- for (const step of steps) {
341
- await runStep(step);
342
- // write progress to the row — every subscribed UI updates live
343
- await ablo.weatherReports.update({ id: msg.reportId, data: { progress: step.pct }, claim });
344
- }
345
- ```
346
-
347
- - A worker that **crashes** stops beating; the row frees within one beat and
348
- the next worker takes over.
349
- - A worker that **wakes up late** learns it on its next beat
350
- (`AbloClaimedError`), and the write path rejects its stale writes anyway.
351
- - **Retries stay on your queue** — the redelivered job claims the now-free
352
- row, reads its current state, and resumes.
353
- - A worker holding **many rows** extends them all in one call:
354
- `ablo.claims.heartbeatAll({ ttl: '5m' })`.
355
-
356
- SQS's heartbeat protects the *message* from redelivery; Ablo's protects the
357
- *row* from concurrent and stale writes. SQS is at-least-once, so two workers
358
- will eventually get the same job — the claim is what keeps that from
359
- corrupting data.
360
-
361
- ## React
362
-
363
- In a React app it's the **same `ablo.<model>` API** — just mounted through a
364
- provider and read with hooks, from `@abloatai/ablo/react`. Wrap your tree once;
365
- everything inside is live.
366
-
367
- ```tsx
368
- import Ablo from '@abloatai/ablo';
369
- import { AbloProvider, useAblo } from '@abloatai/ablo/react';
370
- import { schema } from './ablo/schema';
371
-
372
- // Build the client once — authEndpoint is your session route; no key in the browser.
373
- const ablo = Ablo({
374
- schema,
375
- authEndpoint: '/api/ablo-session',
376
- });
377
-
378
- function App() {
379
- return (
380
- <AbloProvider client={ablo}>
381
- <Report id="report_stockholm" />
382
- </AbloProvider>
383
- );
384
- }
385
-
386
- function Report({ id }: { id: string }) {
387
- const report = useAblo((ablo) => ablo.weatherReports.local.retrieve(id));
388
- const ablo = useAblo();
389
-
390
- if (!report) return null;
391
-
392
- return (
393
- <button onClick={() => ablo?.weatherReports.update({ id, data: { status: 'ready' } })}>
394
- {report.status}
395
- </button>
396
- );
397
- }
398
- ```
399
-
400
- The `useAblo(selector)` read re-renders whenever the row changes — whether you,
401
- a teammate, or an agent changed it. The write is the same optimistic, fan-out
402
- method as the server example above.
403
-
404
- `<AbloProvider>` owns the connection — no API key in the browser. That's the
405
- whole loop: read with `useAblo(selector)`, write with `ablo.<model>`, and every
406
- other client (agent or human) on that row sees it in real time. See
407
- [React](./docs/react.md) for the `<AbloProvider>` prop surface (`client`,
408
- `userId`, `fallback`, `onError`) — schema, scope, and team membership live on the
409
- `Ablo({ … })` client you pass it — plus status hooks.
46
+ import { Ablo } from '@abloatai/ablo/client';
410
47
 
411
- ## Identity & Sync Groups
412
-
413
- Ablo is **not** an auth provider — you keep your own (Clerk, Auth0, NextAuth,
414
- whatever). Ablo's job starts after you've authenticated a request: you tell it
415
- *who* is connecting, and it scopes their realtime data to the right **sync
416
- groups** (named channels like `org:acme` or `workspace:abc123` that are both the unit
417
- of fan-out and the unit of access).
418
-
419
- The model is a proxy: your `ABLO_API_KEY` stays on your trusted server, your
420
- server resolves the signed-in user (org / team / user) from your own auth, and
421
- the browser connects as an already-scoped participant — it never holds the key
422
- and can't widen its own scope. Your schema's `identityRoles` map that identity
423
- to sync-group strings.
424
-
425
- `userId` / `teamIds` come from your auth, resolved server-side:
426
-
427
- ```tsx
428
- // team membership is asserted server-side when the session route mints the token.
429
- const ablo = Ablo({
430
- schema,
431
- authEndpoint: '/api/ablo-session',
432
- });
433
-
434
- <AbloProvider client={ablo} userId={user.id}>
435
- <App />
436
- </AbloProvider>
437
- ```
438
-
439
- If it isn't obvious where org / team / user come from in the Quick Start above,
440
- that's because they come from *your* app — see
441
- [Identity & Sync Groups](./docs/identity.md) for the full picture: what a sync
442
- group is, the two halves of scoping (`identityRoles` + per-model `orgScoped` /
443
- `syncGroupFormat`), and how identity reaches Ablo without an API key in the
444
- browser.
445
-
446
- ## Multiplayer
447
-
448
- There is no separate multiplayer mode. When agent workers, server actions, and
449
- human UI share the same schema and write through `ablo.<model>`, they all see
450
- each other's changes in real time — that's the default, not a feature you turn on.
451
-
452
- - `ablo.<model>.create/update/delete` fan out confirmed deltas to subscribers.
453
- - `useAblo(...)` gives React clients the live row, kept current automatically.
454
- - `ablo.<model>.claim({ id })` / `claim.state({ id })` / `claim.queue({ id })` let agents and people coordinate (and observe) active work on a row — and the line waiting behind it — before a write lands.
455
-
456
- The bare client is the coordination layer: commit, read, observe, claim. The live
457
- plane people watch — presence, live queries, the local copy — is the `humans()`
458
- plugin on top of it, installed by default on a socket client. There is no
459
- `agents()` plugin, and the absence is the point: an agent is the default caller
460
- here, not a special one.
461
-
462
- Writes go through Ablo. `ablo.<model>.create/update/delete` and the HTTP write
463
- endpoint enter Ablo's commit chokepoint — where claims, ordering, and idempotency
464
- are enforced — and Ablo lands the change in your database. It then tails the WAL to
465
- confirm the row landed and fans the confirmed change out to every connected client.
466
- One surface for agents, servers, and people; one place coordination happens.
467
-
468
- ## HTTP Writes
469
-
470
- Use the SDK when you are in JavaScript and want typed models or realtime. Use the
471
- HTTP endpoint when a server-to-server caller needs to write without opening a
472
- WebSocket:
473
-
474
- ```bash
475
- curl https://api.abloatai.com/api/v1/commits \
476
- -H "Authorization: Bearer sk_test_..." \
477
- -H "Content-Type: application/json" \
478
- -d '{ "operations": [
479
- { "action": "update", "model": "weatherReports", "id": "report_stockholm", "data": { "status": "ready" } }
480
- ] }'
481
- ```
482
-
483
- ```json
484
- { "object": "commit_receipt", "status": "confirmed", "serverTxId": "tx_…", "lastSyncId": 1042, "ops": 1 }
48
+ const ablo = Ablo({ schema, authEndpoint: '/api/ablo-session' });
49
+ await ablo.ready();
485
50
  ```
486
51
 
487
- ## Your Database
488
-
489
- In production, every schema model is backed by **your own database**, and that's
490
- where your rows live. You write through Ablo; it lands each change in your Postgres
491
- through a scoped role, then tails the WAL to confirm it and fan it out. Ablo holds
492
- the ordered transaction log and coordination — never your rows. Two ways it
493
- connects:
494
-
495
- | | How Ablo connects to your Postgres | Use when |
496
- | --- | --- | --- |
497
- | **`ablo connect`** (primary) | Sets up logical replication and a scoped writer role (`npx ablo connect apply` does it end to end). Ablo writes your rows through the writer role and reads them back over the WAL to confirm — it writes rows but runs no DDL and owns no schema. The role is non-superuser and cannot bypass RLS, so your own policies govern Ablo's writes. | Your database can grant a `REPLICATION` role (most can). |
498
- | **Signed endpoint** (fallback) | Your app exposes one route built from an ORM adapter (`prismaDataSource` / `drizzleDataSource`); Ablo writes and confirms through it. Needs no replication setup. | Your database **can't** grant a replication role (a locked-down managed DB). |
499
-
500
- Your database is the system of record. See
501
- [Connect Your Database](./docs/data-sources.md).
502
-
503
- ## Configuration
504
-
505
- `Ablo({ ... })` takes your schema and your key. Your database is connected
506
- **out of band** — once, via `npx ablo connect` (logical replication) or a signed
507
- [Data Source endpoint](./docs/data-sources.md) — not through the constructor.
508
- Every other option has correct defaults:
509
-
510
- | Option | Type | Default | Purpose |
511
- | --- | --- | --- | --- |
512
- | `schema` | `Schema` | — (required) | Typed model proxies (`ablo.<model>.*`) |
513
- | `apiKey` | `string \| ApiKeySetter \| null` | `process.env.ABLO_API_KEY` | Server key — a string, or an async function for rotation |
514
-
515
- Keep `apiKey` in trusted server runtimes. In the browser, `<AbloProvider>`
516
- authenticates with the signed-in user's session; the raw-key path is gated
517
- behind `dangerouslyAllowBrowser` for server-proxy setups only. Advanced hooks
518
- (custom `fetch`, logging, observability, transport overrides) live in
519
- [Client Behavior](./docs/client-behavior.md).
52
+ React bindings are available from `@abloatai/ablo/react`.
520
53
 
521
- ## Errors
54
+ The repository keeps implementation ownership explicit:
522
55
 
523
- Every SDK error extends `AbloError` and carries a `requestId` for support.
524
- Discriminate with `instanceof` or the `type` string — the string form also
525
- survives worker / `postMessage` boundaries, where `instanceof` does not:
526
-
527
- ```ts
528
- try {
529
- await ablo.weatherReports.update({ id, data: { status: 'ready' }, readAt, onStale: 'reject' });
530
- } catch (e) {
531
- if (e instanceof AbloStaleContextError) { /* row moved under you — re-read, retry */ }
532
- if ((e as AbloError).type === 'AbloClaimedError') { /* another participant holds it */ }
533
- }
56
+ ```text
57
+ packages/ablo branded SDK users install
58
+ packages/transaction HTTP, contracts, commits, claims, settlement, observation
59
+ packages/humans WebSocket, local materialization, presence, MobX, React
60
+ packages/agent agent behavior and perception
61
+ packages/cli project and operational tooling
534
62
  ```
535
63
 
536
- | Error | When |
537
- | --- | --- |
538
- | `AbloAuthenticationError` | Invalid / missing / expired credentials |
539
- | `AbloPermissionError` / `CapabilityError` | Action forbidden by scope |
540
- | `AbloRateLimitError` | Rate limited (carries `retryAfterSeconds`) |
541
- | `AbloIdempotencyError` | Same `idempotencyKey` reused with a different body |
542
- | `AbloValidationError` | Invalid request payload |
543
- | `AbloStaleContextError` | Write carried `readAt`, but the row has newer changes (`conflicts`) |
544
- | `AbloClaimedError` | Target is claimed by another participant (`claims`) |
545
- | `AbloConnectionError` / `AbloServerError` | Transport failure / server 5xx |
546
- | `SyncSessionError` | Session expired (prompts re-auth) |
547
-
548
- ## Reconnect & retries
549
-
550
- The client owns reconnection so your code doesn't have to. A dropped WebSocket
551
- reconnects automatically with exponential backoff (1s → 30s, ±15% jitter, up to
552
- ~7.5 minutes); session errors (401/403) suppress it so you re-authenticate
553
- instead of looping. Commits are idempotent by client transaction id, and a
554
- commit that times out is never silently rolled back — the client reconciles
555
- against authoritative server state on reconnect. These defaults are the
556
- contract; there are no retry or timeout knobs to tune.
557
-
558
- ## Production Reference
559
-
560
- - [Version History & Migration Guide](./docs/migration.md) — every breaking change, what to change, and which version introduced it. Read before bumping a minor.
561
- - [Identity & Sync Groups](./docs/identity.md) — use your own authentication; tell Ablo who's connecting and how org / team / user map to sync-group scope.
562
- - [Schema Contract](./docs/schema-contract.md) — one schema becomes typed model clients, React reads, agent writes, Data Source shape, and schema push.
563
- - [Guarantees](./docs/guarantees.md) — confirmed writes, stale-write protection, claim coordination, and agent lifecycle.
564
- - [Integration Guide](./docs/integration-guide.md) — integrate React, your database, multiplayer, and agents.
565
- - [React](./docs/react.md) — `<AbloProvider>`, `useAblo`, presence, status, and bootstrap gating.
566
- - [Coordination](./docs/coordination.md) — `claim` / `claim.state` / `claim.queue` / `claim.release` / `heartbeat` reference: hold a row across slow agent work — minutes or hours, via heartbeats — and observe the line waiting behind it.
567
- - [Client Behavior](./docs/client-behavior.md) — options, errors, retries, timeouts, and public imports.
568
- - [Connect Your Database](./docs/data-sources.md) — connect your Postgres by logical replication (`npx ablo connect`) or, as a fallback, a signed endpoint; your database is the system of record either way.
569
- - [Existing Python Backend](./docs/examples/existing-python-backend.md) — migrate existing Python endpoints to multiplayer and agent-safe writes gradually.
570
- - [AI SDK Tool](./docs/examples/ai-sdk-tool.md) — use Ablo inside an AI SDK tool call.
571
- - [Server Agent](./docs/examples/server-agent.md) — schema-backed worker.
572
-
573
- ## License
574
-
575
- Apache License 2.0. See [LICENSE](./LICENSE) and [NOTICE](./NOTICE).
64
+ Realtime synchronization is a consumer of the transaction layer, not a second
65
+ authority path. Humans, agents, and backend services use the same commit,
66
+ idempotency, claim, fencing, settlement, and ordered-observation contracts.
Binary file
package/dist/auth.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from '@abloatai/transaction/auth';
2
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
package/dist/auth.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from '@abloatai/transaction/auth';
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from '@abloatai/humans';
2
+ export { Ablo as default } from '@abloatai/humans';
3
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from '@abloatai/humans';
2
+ export { Ablo as default } from '@abloatai/humans';
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from '@abloatai/transaction/coordination';
2
+ //# sourceMappingURL=coordination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordination.d.ts","sourceRoot":"","sources":["../src/coordination.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from '@abloatai/transaction/coordination';
2
+ //# sourceMappingURL=coordination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordination.js","sourceRoot":"","sources":["../src/coordination.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC"}