@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
@@ -1,578 +0,0 @@
1
- import { z } from 'zod';
2
- import { syncGroupInputSchema } from '../schema/roles.js';
3
- /**
4
- * The wire schemas for coordination — the shapes that keep humans and agents
5
- * from overwriting each other on a shared row. Coordination works in three
6
- * layers, from outermost to innermost:
7
- *
8
- * 1. Presence (observation): who is working where. It reports, never blocks.
9
- * 2. Claims (pessimistic leases): `claim_begin` / `claim_abandon` grant one
10
- * participant exclusive intent on a target while others wait.
11
- * 3. Stale-context (optimistic): a `readAt` watermark plus an `onStale` write
12
- * guard that catches a lost update when the row moved after you read it.
13
- *
14
- * These Zod schemas are the single definition of each shape. Both the client
15
- * SDK and the server derive their TypeScript types from them with `z.infer`
16
- * rather than re-declaring the shapes, and the server validates inbound frames
17
- * against them at runtime.
18
- */
19
- // ─────────────────────────────────────────────────────────────────────────
20
- // Shared primitives
21
- // ─────────────────────────────────────────────────────────────────────────
22
- /** A line/column span within a text-bearing field (slide body, doc, cell). */
23
- export const targetRangeSchema = z.object({
24
- startLine: z.number(),
25
- endLine: z.number(),
26
- startColumn: z.number().optional(),
27
- endColumn: z.number().optional(),
28
- });
29
- export const participantKindSchema = z.enum(['user', 'agent', 'system']);
30
- /**
31
- * Parses a participant kind from an inbound frame, tolerating an older wire
32
- * dialect. Some presence and claim frames label a non-agent participant
33
- * `'human'`, while the rest of the surface uses `'user'` for the same
34
- * participant. This normalizes `'human'` to `'user'` on read so every consumer
35
- * switches on one vocabulary. Producers emit the canonical
36
- * {@link participantKindSchema} values, and the output union is never widened.
37
- */
38
- export const wireParticipantKindSchema = z.preprocess((value) => (value === 'human' ? 'user' : value), participantKindSchema);
39
- /**
40
- * Resolves a peer's kind from an inbound presence or claim frame. It prefers
41
- * the server-stamped `participantKind` (normalized through
42
- * {@link wireParticipantKindSchema}). A frame from an older server that omits
43
- * that field falls back to the `isAgent` boolean, which can tell 'agent' from
44
- * 'user' but can never report 'system'.
45
- */
46
- export function participantKindFromWire(wireKind, isAgent) {
47
- const parsed = wireParticipantKindSchema.safeParse(wireKind);
48
- if (parsed.success)
49
- return parsed.data;
50
- return isAgent ? 'agent' : 'user';
51
- }
52
- /**
53
- * Reads the peer-visible description a claim or presence frame carries in its
54
- * opaque `meta.description`. This is the single place that unpacks that field.
55
- * A caller that has an explicit `description` should prefer it
56
- * (`explicit ?? fromMeta`).
57
- */
58
- export function descriptionFromMeta(meta) {
59
- return typeof meta?.description === 'string' ? meta.description : undefined;
60
- }
61
- /**
62
- * What a coordination event points at — the locator shared by all three
63
- * layers. It names an entity, optionally narrowed to a path, range, or field,
64
- * and carries opaque application metadata.
65
- */
66
- export const targetRefSchema = z.object({
67
- entityType: z.string(),
68
- entityId: z.string(),
69
- path: z.string().optional(),
70
- range: targetRangeSchema.optional(),
71
- field: z.string().optional(),
72
- meta: z.record(z.string(), z.unknown()).optional(),
73
- });
74
- // ─────────────────────────────────────────────────────────────────────────
75
- // Layer 3 — optimistic stale-context (the write guard)
76
- // ─────────────────────────────────────────────────────────────────────────
77
- /**
78
- * How the server treats a write whose snapshot watermark (`readAt`) is older
79
- * than the target row's latest change. There are three dispositions:
80
- * • `notify` — hold the write and return a {@link StaleNotification}
81
- * carrying the current value, so the actor (agent or human)
82
- * can resolve it.
83
- * • `reject` — throw `AbloStaleContextError`, the default when `readAt`
84
- * is present.
85
- * • `overwrite` — apply the write blindly, last write wins, with no signal.
86
- */
87
- export const onStaleModeSchema = z.enum(['reject', 'overwrite', 'notify']);
88
- /**
89
- * The optimistic guard carried on a commit operation. `readAt` is the
90
- * snapshot watermark from `context.capture` (null/absent ⇒ unguarded write).
91
- * `bypass` is the explicit, recorded override of a *foreign* pessimistic
92
- * claim — see the claim layer below.
93
- */
94
- export const writeGuardSchema = z.object({
95
- readAt: z.number().nullish(),
96
- onStale: onStaleModeSchema.nullish(),
97
- bypass: z.boolean().optional(),
98
- });
99
- /**
100
- * The advisory returned to a committer whose write hit a stale-context
101
- * conflict under `onStale: 'notify'` — it reports that the value the committer
102
- * reasoned against changed while they were away. Rather than throwing, the
103
- * server hands back the conflicting field's current value as data so the
104
- * actor — an agent or a human — can reconcile and re-commit. A claim is the
105
- * prospective form of the same idea (coordinate before acting); this
106
- * notification is the in-flight form (here is what changed, you resolve). It
107
- * rides on the commit acknowledgement alongside `lastSyncId`; an empty or
108
- * absent array means nothing the committer depended on moved.
109
- *
110
- * Only `onStale: 'notify'` produces this. The conflicting operation was held,
111
- * not written, and the actor reconciles against `currentValues` and
112
- * re-commits. `reject` throws instead, and `overwrite` proceeds silently —
113
- * neither notifies.
114
- */
115
- export const staleNotificationSchema = z.object({
116
- /** Names this object's type; every returned object carries such a tag. */
117
- object: z.literal('stale_notification').optional(),
118
- /** Model name of the conflicting row. */
119
- model: z.string(),
120
- /** Row id. */
121
- id: z.string(),
122
- /** The watermark the committer reasoned against (its `readAt`). */
123
- readAt: z.number(),
124
- /**
125
- * Newest delta id on the row — the committer's new watermark. Re-capture
126
- * context at/after this id to reconcile.
127
- */
128
- observedSyncId: z.number(),
129
- /**
130
- * Fields whose concurrent change collided with this write (intersection of
131
- * the committer's written columns and a newer delta's `changed_fields`).
132
- * Empty ⇒ a whole-entity change (CREATE/DELETE/legacy delta).
133
- */
134
- conflictingFields: z.array(z.string()),
135
- /**
136
- * The live values of `conflictingFields` after the conflict — the piece a
137
- * plain stale error omits. It lets the actor reconcile without a follow-up read.
138
- */
139
- currentValues: z.record(z.string(), z.unknown()),
140
- /** Who wrote the conflicting delta. */
141
- writtenBy: z.object({
142
- kind: participantKindSchema,
143
- id: z.string(),
144
- }),
145
- /**
146
- * Set when this notification is for a GROUP read-dependency (e.g. `deck:abc`,
147
- * `slide:s1`) rather than a single row — "something in the group you read
148
- * changed." For a group notification `conflictingFields`/`currentValues` are
149
- * empty (the change could span many rows); re-read the group at
150
- * `observedSyncId` to reconcile. Absent ⇒ a row-scoped notification.
151
- */
152
- group: z.string().optional(),
153
- });
154
- /**
155
- * A read that a commit declares it depended on, so the server can ask "did
156
- * anything I looked at change?" — broader than the write-target check, which
157
- * only validates the rows being written. The server re-runs stale detection
158
- * against each declared read at its `readAt`; a moved premise fires the entry's
159
- * `onStale` disposition (default `reject`) across the whole batch (`notify`
160
- * holds every write and notifies, `reject` aborts, `overwrite` proceeds
161
- * silently). A dependency comes at one of two granularities:
162
- *
163
- * • Row — `{ model, id, readAt, fields? }`: did this specific row, or these
164
- * specific fields, change?
165
- * • Group — `{ group, readAt }`: did anything in this sync group change?
166
- * `group` is a sync-group key such as `deck:abc` or `slide:s1`, the
167
- * same unit a participant watches and claims.
168
- *
169
- * See `packages/sync-engine/docs/concurrency-convention.md` (§4) for the
170
- * governing convention and the receive → reconcile loop.
171
- */
172
- export const readDependencySchema = z.union([
173
- z.object({
174
- model: z.string(),
175
- id: z.string(),
176
- readAt: z.number(),
177
- fields: z.array(z.string()).optional(),
178
- onStale: onStaleModeSchema.optional(),
179
- }),
180
- z.object({
181
- group: z.string(),
182
- readAt: z.number(),
183
- onStale: onStaleModeSchema.optional(),
184
- }),
185
- ]);
186
- /**
187
- * A durable read-dependency — what a participant is watching so that a later
188
- * change to it opens a {@link StaleNotification}. It is the persisted sibling of
189
- * a {@link ReadDependency}: the same reference shape, minus the disposition (a
190
- * track always notifies — that is what tracking is), with an optional `readAt`
191
- * that defaults to the watermark of the commit that registered it. The row form
192
- * watches one object; the group form watches a whole sync group ("anything in
193
- * `deck:abc`"). Where a `ReadDependency` is checked once at commit and discarded,
194
- * a `TrackDependency` is kept and re-checked against every future delta. See
195
- * `packages/sync-engine/docs/groups.md` for how it drives change propagation.
196
- */
197
- export const trackDependencySchema = z.union([
198
- z.object({
199
- model: z.string(),
200
- id: z.string(),
201
- readAt: z.number().optional(),
202
- }),
203
- z.object({
204
- group: z.string(),
205
- readAt: z.number().optional(),
206
- }),
207
- ]);
208
- // ─────────────────────────────────────────────────────────────────────────
209
- // Layer 2 — pessimistic claims and leases
210
- // ─────────────────────────────────────────────────────────────────────────
211
- /**
212
- * The lifecycle of a claim. When absent on the wire it means `'active'` (an
213
- * additive back-compat default). The server stamps `'active'` on `claim_begin`
214
- * and emits one terminal frame — `committed`, `canceled`, or `expired` — as the
215
- * claim ends, so contenders learn how it resolved, not merely that it vanished.
216
- */
217
- export const claimStatusSchema = z.enum([
218
- 'active',
219
- 'committed',
220
- 'expired',
221
- 'canceled',
222
- ]);
223
- /**
224
- * Server-owned grant stamps — minted once when a claim is first granted and
225
- * preserved verbatim across a re-announce of the same `claimId`, so neither a
226
- * reconnect nor a client-supplied value can move them (unlike `declaredAt`,
227
- * which the client sends afresh each announce). Both optional: a frame without
228
- * them stays valid, and the feature each backs simply does not engage.
229
- */
230
- const grantStampFields = {
231
- /**
232
- * The monotonic fencing token minted for this grant (Option B). Strictly
233
- * increasing per entity across successive grants, so a write that carries it
234
- * is rejected at commit if a later holder already advanced the entity's
235
- * high-water. A token-less write is simply not fence-checked.
236
- */
237
- fenceToken: z.number().optional(),
238
- /**
239
- * Lease origin (epoch ms): when THIS holding was acquired. The cumulative-
240
- * hold ceiling measures a holder's fair share from here — and because it
241
- * survives a re-announce, a reconnect cannot rewind the clock.
242
- */
243
- acquiredAt: z.number().optional(),
244
- };
245
- const wireClaimBaseSchema = targetRefSchema.extend({
246
- claimId: z.string(),
247
- /**
248
- * Peer-visible description of the work being done (`'rewriting the risk
249
- * section to match Q3'`). The server stamps a default when a frame carries
250
- * none.
251
- */
252
- description: z.string().optional(),
253
- /** Server-stamped declaration time (epoch ms). */
254
- declaredAt: z.number(),
255
- /** Server-computed TTL deadline (epoch ms). Readers treat as advisory. */
256
- expiresAt: z.number(),
257
- status: claimStatusSchema.optional(),
258
- ...grantStampFields,
259
- });
260
- export const wireClaimSummarySchema = wireClaimBaseSchema.pick({
261
- claimId: true,
262
- description: true,
263
- declaredAt: true,
264
- expiresAt: true,
265
- entityType: true,
266
- entityId: true,
267
- field: true,
268
- meta: true,
269
- });
270
- /** Why a claim ended in a non-success terminal state. */
271
- export const claimErrorSchema = z.object({
272
- code: z.string(),
273
- message: z.string().optional(),
274
- /** Participant already holding the target (conflict rejections). */
275
- heldBy: z.string().optional(),
276
- heldByClaimId: z.string().optional(),
277
- heldByExpiresAt: z.number().optional(),
278
- /** Rich holder context for conflict rejections. Additive: older frames omit it. */
279
- heldByClaim: wireClaimSummarySchema.optional(),
280
- /** Optional conflict-policy explanation. Additive: older frames omit it. */
281
- policyReason: z.string().optional(),
282
- });
283
- /**
284
- * A declared, pending-mutation claim — the unit broadcast inside a presence
285
- * frame's `activeClaims`. The client supplies the descriptive `targetRef`
286
- * fields, a `description` of the work, and a chosen `claimId`; the server stamps
287
- * `declaredAt` and `expiresAt` and may set `status` and `error`. Those last
288
- * two are optional, so one shape serves both the server, which sets them, and
289
- * the leaner SDK view, which reads a claim without them.
290
- */
291
- export const wireClaimSchema = wireClaimBaseSchema.extend({
292
- error: claimErrorSchema.optional(),
293
- });
294
- export const claimRejectionSchema = z.object({
295
- claimId: z.string(),
296
- reason: z.string(),
297
- target: targetRefSchema.optional(),
298
- heldBy: z.string().optional(),
299
- heldByClaimId: z.string().optional(),
300
- heldByExpiresAt: z.number().optional(),
301
- heldByClaim: wireClaimSummarySchema.optional(),
302
- policyReason: z.string().optional(),
303
- });
304
- /**
305
- * The point-to-point notification sent to a holder whose lease ended without
306
- * a successful commit. This remains a wire-shaped target because it arrives
307
- * directly from the WebSocket; the schema is the single validation boundary
308
- * before the event reaches public `claims.onLost` listeners.
309
- */
310
- export const claimLostSchema = z.object({
311
- claimId: z.string(),
312
- reason: z.enum(['expired', 'preempted']),
313
- target: targetRefSchema,
314
- });
315
- /**
316
- * What a {@link ModelClaim} points at — the target locator as SDK callers see
317
- * it, keyed by `model` and `id` rather than the wire schema's `entityType` and
318
- * `entityId`. This is the public `ModelTarget` shape.
319
- */
320
- export const modelTargetSchema = z
321
- .object({
322
- model: z.string(),
323
- id: z.string(),
324
- path: z.string().optional(),
325
- range: targetRangeSchema.optional(),
326
- field: z.string().optional(),
327
- meta: z.record(z.string(), z.unknown()).optional(),
328
- })
329
- .readonly();
330
- /**
331
- * A claim as SDK callers and the HTTP claim routes see it
332
- * (`ablo.<model>.claim.state`, `/v1/claims`) — the resolved, peer-readable view
333
- * of one active or queued claim. The client's `ModelClaim` type derives from
334
- * this shape.
335
- *
336
- * `expiresAt` is epoch milliseconds (a number), the same encoding as the
337
- * WebSocket {@link WireClaim}, so one timestamp representation spans the wire,
338
- * the SDK, HTTP, and errors — there is no ISO string anywhere.
339
- * `participantKind` is parsed through {@link wireParticipantKindSchema}, so a
340
- * legacy `'human'` frame normalizes to `'user'`.
341
- */
342
- export const modelClaimSchema = z
343
- .object({
344
- id: z.string(),
345
- actor: z.string(),
346
- participantKind: wireParticipantKindSchema,
347
- /** Peer-visible description of the work (`'rewriting the risk section'`).
348
- * Optional: a claim may be declared without one. */
349
- description: z.string().optional(),
350
- field: z.string().optional(),
351
- status: z.enum(['active', 'queued']).optional(),
352
- position: z.number().optional(),
353
- expiresAt: z.number(),
354
- /** The grant's fencing token (Option B), present on a claim you hold. */
355
- fenceToken: z.number().optional(),
356
- target: modelTargetSchema,
357
- })
358
- .readonly();
359
- /**
360
- * The `claim_begin` payload a client sends. It carries the descriptive target
361
- * and a `description` of the work, an optional duration hint, and the opt-in
362
- * fair-queue flag. The server stamps the lifecycle and timestamp fields, so they
363
- * are not part of this inbound shape — this is exactly what the server validates
364
- * on ingest.
365
- */
366
- export const claimBeginPayloadSchema = targetRefSchema.extend({
367
- claimId: z.string(),
368
- /** Peer-visible description of the work. The server stamps `'editing'` when a
369
- * frame carries none. */
370
- description: z.string().optional(),
371
- /** Hint for `expiresAt`; the server caps it. */
372
- estimatedMs: z.number().optional(),
373
- /**
374
- * Opt into the fair wait queue. When the target is already held, the server
375
- * enqueues this claim in FIFO order and replies `claim_queued`, then
376
- * `claim_granted` later, instead of `claim_rejected`. A client that sets this
377
- * must be ready to handle the grant.
378
- */
379
- queue: z.boolean().optional(),
380
- });
381
- /**
382
- * The `claim_abandon` payload a client sends. `entityType` and `entityId` let
383
- * the server dequeue a claim that is still waiting (not yet held) from the FIFO
384
- * line; abandoning a claim that is already held needs only `claimId`.
385
- */
386
- export const claimAbandonPayloadSchema = z.object({
387
- claimId: z.string(),
388
- entityType: z.string().optional(),
389
- entityId: z.string().optional(),
390
- });
391
- /**
392
- * The `claim_reorder` payload a client sends. A privileged participant, such as
393
- * a supervisor over its sub-agents, re-ranks the FIFO wait queue for an entity:
394
- * `order` lists waiters by `heldBy` and `claimId` in the desired priority, and
395
- * any waiter not listed keeps its relative order behind those that are. The
396
- * server gates who may call this and drops an unauthorized sender. Where
397
- * `claim_abandon` acts on the caller's own entry, a reorder acts on other
398
- * participants' queue positions — which is why it is gated.
399
- */
400
- export const claimReorderPayloadSchema = z.object({
401
- entityType: z.string(),
402
- entityId: z.string(),
403
- order: z.array(z.object({ heldBy: z.string(), claimId: z.string() })),
404
- });
405
- // ─────────────────────────────────────────────────────────────────────────
406
- // Heartbeat — the async / long-running-work surface of a claim.
407
- //
408
- // A claim's TTL is crash cleanup, not a work-duration estimate. Work that
409
- // outlives it — an agent run, a background worker's job — keeps its lease by
410
- // BEATING: request `claim_heartbeat`, reply `claim_heartbeat_ack`. One field
411
- // set serves every shape; the single and batched payloads are both derived
412
- // from it, and the WebSocket frame and HTTP routes are two encodings of the
413
- // same messages. Everything long-running-work-related on the wire lives in
414
- // this block.
415
- // ─────────────────────────────────────────────────────────────────────────
416
- /**
417
- * The one field set behind every heartbeat message. The single-claim payload
418
- * refines it; the batched payload picks from it — there is deliberately no
419
- * second shape to keep in sync.
420
- */
421
- const claimHeartbeatFieldsSchema = z.object({
422
- claimId: z.string().optional(),
423
- entityType: z.string().optional(),
424
- entityId: z.string().optional(),
425
- /** Requested extension from now; the server clamps it, and an extension
426
- * never shortens a lease. */
427
- ttlMs: z.number().positive().optional(),
428
- /**
429
- * Lightweight progress the beat carries along ("42/100 pages") — stored
430
- * as the claim's `meta.progress` (last beat wins) and peer-visible via
431
- * `claim.state` while the lease is held. This is presence, not a
432
- * checkpoint: it dies with the lease. Crash-recoverable progress belongs
433
- * in the data itself — write a row, and every subscriber already sees it.
434
- */
435
- details: z.record(z.string(), z.unknown()).optional(),
436
- });
437
- /**
438
- * The `claim_heartbeat` payload a client sends to extend a lease it holds (or
439
- * refresh its slot in the wait queue) past the liveness window — the
440
- * work-duration signal for long-running holders, distinct from the connection
441
- * keepalive.
442
- *
443
- * The claim is identified either way: by `claimId`, or — since a claim is
444
- * singular per (actor, entity) — by the full `entityType`/`entityId` target
445
- * ("my claim on this row"). At least one of the two must be present. The
446
- * target also lets the server resolve without a scan and is required to
447
- * refresh a *queued* claim (a waiter is not in the holder set the server
448
- * would otherwise search).
449
- */
450
- export const claimHeartbeatPayloadSchema = claimHeartbeatFieldsSchema.refine((payload) => payload.claimId !== undefined ||
451
- (payload.entityType !== undefined && payload.entityId !== undefined), {
452
- message: 'a heartbeat must identify its claim — pass claimId, or entityType and entityId together',
453
- });
454
- /**
455
- * The server's reply to a `claim_heartbeat`. For a socketless worker the
456
- * heartbeat reply is the only inbound signal path, so it carries the lease's
457
- * fate rather than a bare ok: `held` (extended to `expiresAt`), `queued`
458
- * (slot refreshed; `position` is the current place in line), or `lost` (the
459
- * lease expired and the queue moved on — the worker should abandon or
460
- * re-queue, and any write it still attempts is caught by its `readAt` guard).
461
- */
462
- export const claimHeartbeatAckPayloadSchema = z.object({
463
- claimId: z.string(),
464
- status: z.enum(['held', 'queued', 'lost']),
465
- expiresAt: z.number().optional(),
466
- position: z.number().optional(),
467
- /**
468
- * How many participants are waiting in line behind a held lease — the
469
- * cooperative-yield pressure signal (present on `held`). A worker that can
470
- * checkpoint may choose to release early when others wait. Hard
471
- * cancellation needs no extra field: a preempted, expired, or revoked
472
- * lease answers the next beat with `lost`.
473
- */
474
- queueDepth: z.number().optional(),
475
- });
476
- /**
477
- * The batched heartbeat — one request extends every lease the caller holds
478
- * on its plane (the socketless twin of the WebSocket keepalive, which renews
479
- * all held leases on every ping). For a worker holding many rows this is one
480
- * round trip per cadence instead of one per claim. Queued slots are not
481
- * batch-refreshed: a waiter knows its target and beats it directly.
482
- */
483
- export const claimHeartbeatBatchPayloadSchema = claimHeartbeatFieldsSchema.pick({ ttlMs: true });
484
- /** Reply to a batched heartbeat: one ack entry per lease that was extended. */
485
- export const claimHeartbeatBatchAckPayloadSchema = z.object({
486
- results: z.array(claimHeartbeatAckPayloadSchema),
487
- });
488
- // ─────────────────────────────────────────────────────────────────────────
489
- // Read interest — area-of-interest navigation (update_subscription)
490
- // ─────────────────────────────────────────────────────────────────────────
491
- /**
492
- * The `update_subscription` payload a client sends. It replaces the
493
- * connection's read interest with the complete set of sync groups — the read
494
- * counterpart to a claim, with no write lock and no TTL. Each entry is a
495
- * {@link syncGroupInputSchema} (`'default'` or a branded `kind:id`), so a
496
- * malformed group is rejected on ingest rather than silently indexed. The
497
- * element type is strict because this is untrusted client input.
498
- */
499
- export const updateSubscriptionPayloadSchema = z.object({
500
- syncGroups: z.array(syncGroupInputSchema),
501
- });
502
- /**
503
- * `subscription_ack` payload (server → client). Echoes the connection's
504
- * effective read set after the update (unchanged on rejection — the update is
505
- * atomic). `error` is present iff `success` is false (e.g. a scoped key
506
- * requesting a group outside its grant). `syncGroups` is lenient
507
- * (`z.string()`) here, not branded: it is the server's own echo for display,
508
- * not untrusted input, and includes base anchors like `org:<id>`.
509
- */
510
- export const subscriptionAckPayloadSchema = z.object({
511
- success: z.boolean(),
512
- syncGroups: z.array(z.string()),
513
- error: z.object({ code: z.string(), message: z.string() }).optional(),
514
- });
515
- // ─────────────────────────────────────────────────────────────────────────
516
- // Commit operation — carries the optimistic write-guard (Layer 3)
517
- // ─────────────────────────────────────────────────────────────────────────
518
- export const commitOperationTypeSchema = z.enum([
519
- 'CREATE',
520
- 'UPDATE',
521
- 'DELETE',
522
- 'ARCHIVE',
523
- 'UNARCHIVE',
524
- ]);
525
- /**
526
- * A single mutation in a commit batch, as it arrives on the wire. Extends the
527
- * optimistic `writeGuard` (`readAt`/`onStale`/`bypass`) — the structural link
528
- * that makes "every write is stale-guarded" legible in the type, not just in
529
- * prose.
530
- */
531
- export const commitOperationSchema = writeGuardSchema.extend({
532
- type: commitOperationTypeSchema,
533
- model: z.string(),
534
- id: z.string().nullish(),
535
- input: z.record(z.string(), z.unknown()).nullish(),
536
- /** Per-op client tx id, echoed on the broadcast delta. */
537
- transactionId: z.string().nullish(),
538
- /**
539
- * The fencing token from the held claim this write belongs to (Option B).
540
- * Present only on a write issued under a claim that was granted one; the
541
- * server checks it against the entity's persisted high-water and rejects a
542
- * stale token. Absent (nullish) on every unclaimed write — those are governed
543
- * by version-CAS and the Option A blind-write guard, unchanged.
544
- */
545
- fenceToken: z.number().nullish(),
546
- });
547
- // ─────────────────────────────────────────────────────────────────────────
548
- // Layer 1 — presence (observation only; it never enforces)
549
- // ─────────────────────────────────────────────────────────────────────────
550
- export const presenceKindSchema = z.enum(['enter', 'update', 'leave']);
551
- /** What a participant is actively working on (agents fill this in). */
552
- export const presenceActivitySchema = targetRefSchema.extend({
553
- action: z.string(),
554
- detail: z.string().optional(),
555
- });
556
- /**
557
- * Full `presence_update` frame as the server broadcasts it. The activity +
558
- * `activeClaims` are the observation surface for the other two layers —
559
- * rendered, never acted on as enforcement.
560
- */
561
- export const presenceUpdateFrameSchema = z.object({
562
- kind: presenceKindSchema,
563
- userId: z.string().optional(),
564
- syncGroups: z.array(z.string()).optional(),
565
- timestamp: z.number().optional(),
566
- status: z.string(),
567
- timezone: z.string().optional(),
568
- customStatus: z.string().optional(),
569
- activity: presenceActivitySchema.optional(),
570
- isAgent: z.boolean().optional(),
571
- /**
572
- * Server-stamped canonical kind. Additive — older servers omit it and
573
- * readers fall back to `isAgent` (see {@link participantKindFromWire}).
574
- */
575
- participantKind: wireParticipantKindSchema.optional(),
576
- activeClaims: z.array(wireClaimSchema).optional(),
577
- delegatedFrom: z.string().nullish(),
578
- });
@@ -1,29 +0,0 @@
1
- /**
2
- * Generates an OpenAPI 3.1 specification from a pushed schema, so the API reference
3
- * describes your own models rather than a fixed set. The API surface is the schema:
4
- * defining a `task` model is what makes `/v1/models/task` exist. This walks each
5
- * model's `fields` (the introspectable {@link FieldMeta}) and emits, per model, the
6
- * CRUD and coordination routes the API serves:
7
- * GET/POST /v1/models/{model}
8
- * GET/PATCH/DELETE /v1/models/{model}/{id}
9
- * POST/DELETE /v1/models/{model}/{id}/claim
10
- * POST /v1/models/{model}/{id}/claim/heartbeat
11
- * POST /v1/models/{model}/{id}/claim/reorder
12
- * plus POST /v1/commits. Authentication is a single Bearer scheme, your API key.
13
- *
14
- * Feed it into codegen (for example `ablo openapi > openapi.json`) or serve it
15
- * directly; the return value is a plain JSON-serializable object.
16
- */
17
- import type { Schema, SchemaRecord } from './schema.js';
18
- /** Options for {@link schemaToOpenApi} — the metadata stamped into the generated spec. */
19
- export interface SchemaToOpenApiOptions {
20
- /** Spec title. Default `"Ablo API"`. */
21
- readonly title?: string;
22
- /** Spec version. Default `"1.0.0"`. */
23
- readonly version?: string;
24
- /** API base URL. Default `"https://api.abloatai.com/api"`. */
25
- readonly serverUrl?: string;
26
- }
27
- type Json = Record<string, unknown>;
28
- export declare function schemaToOpenApi<S extends SchemaRecord>(schema: Schema<S>, options?: SchemaToOpenApiOptions): Json;
29
- export {};