@abloatai/ablo 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/AGENTS.md +4 -1
  2. package/CHANGELOG.md +684 -5
  3. package/README.md +39 -22
  4. package/dist/BaseSyncedStore.d.ts +152 -44
  5. package/dist/BaseSyncedStore.js +300 -184
  6. package/dist/Database.d.ts +9 -24
  7. package/dist/Database.js +37 -22
  8. package/dist/InstanceCache.d.ts +25 -4
  9. package/dist/InstanceCache.js +48 -15
  10. package/dist/LazyReferenceCollection.d.ts +3 -3
  11. package/dist/LazyReferenceCollection.js +4 -4
  12. package/dist/Model.d.ts +6 -6
  13. package/dist/Model.js +10 -10
  14. package/dist/ModelRegistry.d.ts +4 -4
  15. package/dist/ModelRegistry.js +3 -3
  16. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  17. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  18. package/dist/SyncClient.d.ts +42 -32
  19. package/dist/SyncClient.js +166 -110
  20. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  21. package/dist/ai-sdk/coordinatedTool.js +1 -1
  22. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  23. package/dist/ai-sdk/coordinationContext.js +1 -1
  24. package/dist/ai-sdk/wrap.d.ts +3 -3
  25. package/dist/ai-sdk/wrap.js +2 -2
  26. package/dist/auth/index.d.ts +1 -156
  27. package/dist/auth/index.js +8 -301
  28. package/dist/cli.cjs +3459 -1126
  29. package/dist/client/Ablo.d.ts +42 -287
  30. package/dist/client/Ablo.js +118 -963
  31. package/dist/client/abloClient.d.ts +309 -0
  32. package/dist/client/abloClient.js +13 -0
  33. package/dist/client/clientPrelude.d.ts +52 -0
  34. package/dist/client/clientPrelude.js +60 -0
  35. package/dist/client/consoleLogger.d.ts +2 -2
  36. package/dist/client/coreClient.d.ts +60 -0
  37. package/dist/client/coreClient.js +118 -0
  38. package/dist/client/createInternalComponents.d.ts +4 -4
  39. package/dist/client/createInternalComponents.js +9 -8
  40. package/dist/client/createModelProxy.d.ts +78 -373
  41. package/dist/client/createModelProxy.js +114 -86
  42. package/dist/client/humans.d.ts +48 -0
  43. package/dist/client/humans.js +52 -0
  44. package/dist/client/modelRegistration.d.ts +1 -1
  45. package/dist/client/modelRegistration.js +9 -9
  46. package/dist/client/options.d.ts +73 -17
  47. package/dist/client/reactiveEngine.d.ts +48 -0
  48. package/dist/client/reactiveEngine.js +910 -0
  49. package/dist/client/resourceTypes.d.ts +9 -250
  50. package/dist/client/resourceTypes.js +8 -5
  51. package/dist/client/schemaConfig.d.ts +4 -4
  52. package/dist/client/schemaConfig.js +6 -2
  53. package/dist/client/validateAbloOptions.d.ts +3 -2
  54. package/dist/client/validateAbloOptions.js +1 -1
  55. package/dist/client/wsMutationExecutor.d.ts +3 -3
  56. package/dist/client/wsMutationExecutor.js +3 -3
  57. package/dist/context.d.ts +9 -9
  58. package/dist/context.js +10 -9
  59. package/dist/coordination/ClaimLog.d.ts +26 -0
  60. package/dist/coordination/ClaimLog.js +32 -0
  61. package/dist/coordination/index.d.ts +1 -15
  62. package/dist/coordination/index.js +8 -31
  63. package/dist/core/DatabaseManager.js +1 -1
  64. package/dist/core/QueryView.d.ts +1 -1
  65. package/dist/core/QueryView.js +1 -1
  66. package/dist/core/StoreManager.d.ts +4 -23
  67. package/dist/core/StoreManager.js +5 -55
  68. package/dist/core/index.d.ts +2 -2
  69. package/dist/core/index.js +2 -2
  70. package/dist/core/storeContract.d.ts +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +227 -0
  73. package/dist/docs/index.d.ts +10 -0
  74. package/dist/docs/index.js +10 -0
  75. package/dist/environment.d.ts +1 -40
  76. package/dist/environment.js +8 -37
  77. package/dist/index.d.ts +40 -34
  78. package/dist/index.js +26 -20
  79. package/dist/interfaces/index.d.ts +44 -134
  80. package/dist/keys/index.d.ts +1 -77
  81. package/dist/keys/index.js +8 -190
  82. package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
  83. package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
  84. package/dist/mutators/Transaction.d.ts +1 -1
  85. package/dist/mutators/Transaction.js +1 -1
  86. package/dist/mutators/UndoManager.d.ts +6 -6
  87. package/dist/mutators/UndoManager.js +5 -5
  88. package/dist/mutators/defineMutators.d.ts +3 -3
  89. package/dist/mutators/defineMutators.js +1 -1
  90. package/dist/mutators/inverseOp.js +2 -2
  91. package/dist/mutators/mutateActions.d.ts +3 -3
  92. package/dist/mutators/mutateActions.js +1 -1
  93. package/dist/mutators/readerActions.d.ts +1 -1
  94. package/dist/mutators/undoApply.d.ts +1 -1
  95. package/dist/mutators/undoApply.js +1 -1
  96. package/dist/policy/index.d.ts +2 -2
  97. package/dist/policy/index.js +1 -1
  98. package/dist/query/client.d.ts +2 -2
  99. package/dist/query/client.js +4 -4
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +6 -8
  103. package/dist/react/AbloProvider.js +5 -7
  104. package/dist/react/context.d.ts +1 -1
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/index.d.ts +5 -5
  107. package/dist/react/index.js +3 -3
  108. package/dist/react/internalContext.d.ts +1 -1
  109. package/dist/react/useAblo.d.ts +3 -3
  110. package/dist/react/useAblo.js +1 -1
  111. package/dist/react/useCurrentUserId.js +1 -1
  112. package/dist/react/useErrorListener.js +1 -1
  113. package/dist/react/useMutationFailureListener.d.ts +2 -2
  114. package/dist/react/useMutationFailureListener.js +1 -1
  115. package/dist/react/useMutators.d.ts +3 -3
  116. package/dist/react/useMutators.js +3 -3
  117. package/dist/react/useUndoScope.d.ts +5 -5
  118. package/dist/react/useUndoScope.js +1 -1
  119. package/dist/schema/coordination.d.ts +69 -10
  120. package/dist/schema/coordination.js +86 -9
  121. package/dist/schema/ddl.js +2 -2
  122. package/dist/schema/diff.d.ts +1 -1
  123. package/dist/schema/generate.js +1 -1
  124. package/dist/schema/index.d.ts +10 -10
  125. package/dist/schema/index.js +18 -18
  126. package/dist/schema/queries.d.ts +27 -27
  127. package/dist/schema/queries.js +23 -23
  128. package/dist/schema/select.d.ts +3 -3
  129. package/dist/schema/select.js +3 -3
  130. package/dist/schema/serialize.d.ts +15 -6
  131. package/dist/schema/serialize.js +17 -3
  132. package/dist/schema/sugar.d.ts +6 -7
  133. package/dist/schema/sugar.js +9 -12
  134. package/dist/schema/syncDeltaRow.d.ts +4 -152
  135. package/dist/schema/syncDeltaRow.js +4 -105
  136. package/dist/server/adapter.d.ts +18 -1
  137. package/dist/server/commit.d.ts +10 -16
  138. package/dist/server/index.d.ts +1 -1
  139. package/dist/server/index.js +1 -1
  140. package/dist/server/readConfig.d.ts +1 -1
  141. package/dist/source/adapters/drizzle.d.ts +1 -1
  142. package/dist/source/adapters/drizzle.js +2 -2
  143. package/dist/source/adapters/kysely.d.ts +1 -1
  144. package/dist/source/adapters/kysely.js +1 -1
  145. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  146. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  147. package/dist/source/adapters/memory.js +1 -1
  148. package/dist/source/adapters/prisma.d.ts +8 -3
  149. package/dist/source/adapters/prisma.js +1 -1
  150. package/dist/source/connector.js +1 -1
  151. package/dist/source/connectorProtocol.d.ts +2 -8
  152. package/dist/source/connectorProtocol.js +3 -2
  153. package/dist/source/contract.d.ts +29 -17
  154. package/dist/source/contract.js +27 -22
  155. package/dist/source/factory.d.ts +1 -1
  156. package/dist/source/footprint.d.ts +111 -0
  157. package/dist/source/footprint.js +0 -0
  158. package/dist/source/idempotency.js +2 -2
  159. package/dist/source/index.d.ts +1 -0
  160. package/dist/source/index.js +3 -0
  161. package/dist/source/next.d.ts +1 -1
  162. package/dist/source/signing.d.ts +9 -2
  163. package/dist/source/signing.js +4 -1
  164. package/dist/source/types.d.ts +6 -4
  165. package/dist/source/types.js +1 -1
  166. package/dist/stores/ObjectStore.d.ts +1 -1
  167. package/dist/stores/SyncActionStore.d.ts +1 -1
  168. package/dist/stores/SyncActionStore.js +2 -10
  169. package/dist/stores/syncAction.d.ts +26 -0
  170. package/dist/stores/syncAction.js +16 -0
  171. package/dist/surface.d.ts +3 -3
  172. package/dist/surface.js +6 -4
  173. package/dist/sync/BootstrapFetcher.d.ts +123 -6
  174. package/dist/sync/BootstrapFetcher.js +492 -66
  175. package/dist/sync/ConnectionManager.d.ts +6 -198
  176. package/dist/sync/ConnectionManager.js +6 -677
  177. package/dist/sync/OnDemandLoader.d.ts +2 -2
  178. package/dist/sync/OnDemandLoader.js +60 -21
  179. package/dist/sync/SubscriptionManager.d.ts +13 -2
  180. package/dist/sync/SubscriptionManager.js +23 -5
  181. package/dist/sync/SyncWebSocket.d.ts +27 -510
  182. package/dist/sync/SyncWebSocket.js +76 -954
  183. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  184. package/dist/sync/awaitClaimGrant.js +4 -109
  185. package/dist/sync/commitFrames.d.ts +6 -40
  186. package/dist/sync/commitFrames.js +6 -97
  187. package/dist/sync/contextPorts.d.ts +18 -0
  188. package/dist/sync/contextPorts.js +31 -0
  189. package/dist/sync/createClaimStream.d.ts +5 -49
  190. package/dist/sync/createClaimStream.js +5 -469
  191. package/dist/sync/createPresenceStream.d.ts +26 -4
  192. package/dist/sync/createPresenceStream.js +28 -20
  193. package/dist/sync/createSnapshot.d.ts +2 -2
  194. package/dist/sync/createSnapshot.js +1 -1
  195. package/dist/sync/credentialLifecycle.d.ts +5 -173
  196. package/dist/sync/credentialLifecycle.js +5 -320
  197. package/dist/sync/deltaPipeline.d.ts +1 -1
  198. package/dist/sync/participants.d.ts +5 -4
  199. package/dist/sync/participants.js +29 -22
  200. package/dist/sync/schemaDrift.d.ts +55 -0
  201. package/dist/sync/schemaDrift.js +53 -0
  202. package/dist/sync/schemas.d.ts +21 -32
  203. package/dist/sync/schemas.js +26 -17
  204. package/dist/sync/syncPlan.d.ts +3 -3
  205. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  206. package/dist/sync/wsFrameHandlers.js +6 -392
  207. package/dist/testing/fixtures/bootstrap.d.ts +1 -1
  208. package/dist/testing/fixtures/deltas.d.ts +1 -1
  209. package/dist/testing/fixtures/httpResponses.d.ts +70 -0
  210. package/dist/testing/fixtures/httpResponses.js +90 -0
  211. package/dist/testing/fixtures/models.js +1 -1
  212. package/dist/testing/helpers/wait.js +1 -1
  213. package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
  214. package/dist/testing/mocks/MockMutationExecutor.js +8 -14
  215. package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
  216. package/dist/testing/mocks/MockSyncContext.js +10 -9
  217. package/dist/testing/mocks/MockSyncStore.js +1 -1
  218. package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
  219. package/dist/transaction/ablo.d.ts +88 -0
  220. package/dist/transaction/ablo.js +33 -0
  221. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  222. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  223. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  224. package/dist/transaction/auth/bootstrapScope.js +1 -0
  225. package/dist/transaction/auth/capability.d.ts +177 -0
  226. package/dist/transaction/auth/capability.js +199 -0
  227. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  228. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  229. package/dist/{client → transaction/auth}/identity.js +1 -1
  230. package/dist/transaction/auth/index.d.ts +162 -0
  231. package/dist/transaction/auth/index.js +304 -0
  232. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  233. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  234. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  235. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  236. package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
  237. package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
  238. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  239. package/dist/transaction/coordination/claimMeta.js +52 -0
  240. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  241. package/dist/transaction/coordination/createClaimStream.js +475 -0
  242. package/dist/transaction/coordination/events.d.ts +74 -0
  243. package/dist/transaction/coordination/events.js +7 -0
  244. package/dist/transaction/coordination/index.d.ts +19 -0
  245. package/dist/transaction/coordination/index.js +44 -0
  246. package/dist/transaction/coordination/locator.d.ts +83 -0
  247. package/dist/transaction/coordination/locator.js +82 -0
  248. package/dist/transaction/coordination/schema.d.ts +1473 -0
  249. package/dist/{coordination → transaction/coordination}/schema.js +490 -55
  250. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  251. package/dist/transaction/coordination/targetConflict.js +103 -0
  252. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  253. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  254. package/dist/transaction/durableWrites.d.ts +62 -0
  255. package/dist/{client → transaction}/durableWrites.js +28 -3
  256. package/dist/transaction/environment.d.ts +105 -0
  257. package/dist/transaction/environment.js +108 -0
  258. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
  259. package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
  260. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  261. package/dist/{errors.js → transaction/errors.js} +85 -16
  262. package/dist/transaction/index.d.ts +20 -0
  263. package/dist/transaction/index.js +20 -0
  264. package/dist/transaction/keys/index.d.ts +87 -0
  265. package/dist/transaction/keys/index.js +207 -0
  266. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  267. package/dist/transaction/log/syncDeltaRow.js +95 -0
  268. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  269. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  270. package/dist/transaction/logger.d.ts +16 -0
  271. package/dist/transaction/logger.js +7 -0
  272. package/dist/transaction/observability.d.ts +53 -0
  273. package/dist/transaction/observability.js +19 -0
  274. package/dist/transaction/plugin.d.ts +192 -0
  275. package/dist/transaction/plugin.js +87 -0
  276. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  277. package/dist/{policy → transaction/policy}/types.js +2 -0
  278. package/dist/transaction/resources/httpResources.d.ts +266 -0
  279. package/dist/transaction/resources/httpResources.js +7 -0
  280. package/dist/transaction/resources/modelOperations.d.ts +319 -0
  281. package/dist/transaction/resources/modelOperations.js +12 -0
  282. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  283. package/dist/transaction/resources/mutationOptions.js +9 -0
  284. package/dist/transaction/resources/where.d.ts +85 -0
  285. package/dist/transaction/resources/where.js +70 -0
  286. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  287. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  288. package/dist/{schema → transaction/schema}/field.d.ts +5 -5
  289. package/dist/{schema → transaction/schema}/field.js +5 -5
  290. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  291. package/dist/transaction/schema/loadStrategy.js +46 -0
  292. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  293. package/dist/{schema → transaction/schema}/model.js +30 -20
  294. package/dist/transaction/schema/openapi.d.ts +57 -0
  295. package/dist/transaction/schema/openapi.js +340 -0
  296. package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
  297. package/dist/{schema → transaction/schema}/relation.js +7 -7
  298. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  299. package/dist/{schema → transaction/schema}/residency.js +0 -5
  300. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  301. package/dist/{schema → transaction/schema}/roles.js +5 -5
  302. package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
  303. package/dist/{schema → transaction/schema}/schema.js +4 -3
  304. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  305. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  306. package/dist/transaction/transactionLayer.d.ts +82 -0
  307. package/dist/transaction/transactionLayer.js +24 -0
  308. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
  309. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  310. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  311. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  312. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
  313. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  314. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  315. package/dist/transaction/transport/commitFrames.js +134 -0
  316. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  317. package/dist/transaction/transport/connectionManager.js +673 -0
  318. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  319. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  320. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  321. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  322. package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
  323. package/dist/{client → transaction/transport}/httpClient.js +5 -5
  324. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  325. package/dist/transaction/transport/httpOptions.js +12 -0
  326. package/dist/{client → transaction/transport}/httpTransport.js +171 -85
  327. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  328. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  329. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  330. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  331. package/dist/transaction/transport/wsTransport.d.ts +576 -0
  332. package/dist/transaction/transport/wsTransport.js +1017 -0
  333. package/dist/transaction/types/assertExact.d.ts +17 -0
  334. package/dist/transaction/types/assertExact.js +1 -0
  335. package/dist/{types → transaction/types}/global.d.ts +17 -2
  336. package/dist/{types → transaction/types}/global.js +2 -1
  337. package/dist/{types → transaction/types}/index.d.ts +14 -46
  338. package/dist/{types → transaction/types}/index.js +7 -16
  339. package/dist/{types → transaction/types}/streams.d.ts +63 -45
  340. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  341. package/dist/transaction/utils/json.js +276 -0
  342. package/dist/transaction/wire/accountResponses.d.ts +351 -0
  343. package/dist/transaction/wire/accountResponses.js +255 -0
  344. package/dist/transaction/wire/auth.d.ts +49 -0
  345. package/dist/transaction/wire/auth.js +57 -0
  346. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  347. package/dist/transaction/wire/claimEvent.js +73 -0
  348. package/dist/transaction/wire/claims.d.ts +463 -0
  349. package/dist/transaction/wire/claims.js +229 -0
  350. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  351. package/dist/{wire → transaction/wire}/commit.js +68 -47
  352. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  353. package/dist/{wire → transaction/wire}/delta.js +37 -13
  354. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  355. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  356. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  357. package/dist/transaction/wire/feedCursor.js +82 -0
  358. package/dist/transaction/wire/feedEvent.d.ts +177 -0
  359. package/dist/transaction/wire/feedEvent.js +39 -0
  360. package/dist/transaction/wire/frames.d.ts +194 -0
  361. package/dist/transaction/wire/frames.js +50 -0
  362. package/dist/transaction/wire/inboundFrames.d.ts +552 -0
  363. package/dist/transaction/wire/inboundFrames.js +116 -0
  364. package/dist/transaction/wire/index.d.ts +50 -0
  365. package/dist/transaction/wire/index.js +74 -0
  366. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  367. package/dist/transaction/wire/listEnvelope.js +42 -0
  368. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  369. package/dist/transaction/wire/modelResponses.js +43 -0
  370. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
  371. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
  372. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  373. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  374. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  375. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  376. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  377. package/dist/transactions/mutations/commitLatency.js +130 -0
  378. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  379. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  380. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
  381. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
  382. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
  383. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
  384. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  385. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  386. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  387. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
  388. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
  389. package/dist/utils/mobxSetup.d.ts +1 -1
  390. package/dist/utils/mobxSetup.js +5 -2
  391. package/dist/webhooks/events.d.ts +2 -2
  392. package/dist/wire/index.d.ts +1 -34
  393. package/dist/wire/index.js +8 -49
  394. package/docs/agent-messaging.md +3 -3
  395. package/docs/agents.md +19 -12
  396. package/docs/api-keys.md +8 -4
  397. package/docs/api.md +22 -18
  398. package/docs/audit.md +2 -0
  399. package/docs/cli.md +31 -3
  400. package/docs/client-behavior.md +8 -6
  401. package/docs/concurrency-convention.md +30 -24
  402. package/docs/coordination.md +48 -38
  403. package/docs/data-sources.md +3 -1
  404. package/docs/debugging.md +5 -3
  405. package/docs/deployment.md +267 -0
  406. package/docs/examples/agent-human.md +49 -42
  407. package/docs/examples/ai-sdk-tool.md +69 -44
  408. package/docs/examples/existing-python-backend.md +8 -6
  409. package/docs/examples/nextjs.md +129 -47
  410. package/docs/examples/scoped-agent.md +45 -44
  411. package/docs/examples/server-agent.md +46 -26
  412. package/docs/groups.md +32 -29
  413. package/docs/guarantees.md +4 -2
  414. package/docs/how-it-works.md +9 -7
  415. package/docs/idempotency.md +126 -0
  416. package/docs/identity.md +58 -54
  417. package/docs/index.md +172 -84
  418. package/docs/integration-guide.md +17 -16
  419. package/docs/interaction-model.md +6 -4
  420. package/docs/mcp.md +41 -16
  421. package/docs/migration.md +63 -5
  422. package/docs/operating-on-your-database.md +111 -0
  423. package/docs/projects.md +2 -0
  424. package/docs/quickstart.md +22 -5
  425. package/docs/react.md +12 -10
  426. package/docs/schema-contract.md +5 -3
  427. package/docs/session-settings.md +108 -0
  428. package/docs/sessions.md +3 -1
  429. package/docs/webhooks.md +3 -1
  430. package/llms.txt +47 -17
  431. package/package.json +10 -8
  432. package/dist/agent/Agent.d.ts +0 -366
  433. package/dist/agent/Agent.js +0 -514
  434. package/dist/agent/index.d.ts +0 -115
  435. package/dist/agent/index.js +0 -128
  436. package/dist/agent/session.d.ts +0 -93
  437. package/dist/agent/session.js +0 -149
  438. package/dist/agent/types.d.ts +0 -68
  439. package/dist/agent/types.js +0 -9
  440. package/dist/client/durableWrites.d.ts +0 -21
  441. package/dist/coordination/schema.d.ts +0 -722
  442. package/dist/schema/openapi.d.ts +0 -29
  443. package/dist/schema/openapi.js +0 -124
  444. package/dist/transactions/durableWriteStore.js +0 -30
  445. package/dist/utils/json.js +0 -88
  446. package/dist/wire/errorEnvelope.d.ts +0 -55
  447. package/dist/wire/frames.d.ts +0 -197
  448. package/dist/wire/frames.js +0 -49
  449. package/dist/wire/listEnvelope.js +0 -18
  450. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  451. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  452. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  453. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  454. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  455. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  456. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  457. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
  458. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
  459. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  460. /package/dist/{client → transaction}/persistence.js +0 -0
  461. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  462. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  463. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  464. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  465. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  466. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  467. /package/dist/{types → transaction/types}/modelData.js +0 -0
  468. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  469. /package/dist/{types → transaction/types}/participant.js +0 -0
  470. /package/dist/{types → transaction/types}/streams.js +0 -0
  471. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  472. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  473. /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
  474. /package/dist/{utils → transaction/utils}/duration.js +0 -0
  475. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  476. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  477. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  478. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  479. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  480. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  481. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  482. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  483. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
@@ -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 {};
@@ -1,124 +0,0 @@
1
- // Pulled from the endpoints module to keep this schema file free of the client's
2
- // error-handling and credential dependencies.
3
- import { ABLO_HOSTED_HTTP_BASE_URL } from '../client/hostedEndpoints.js';
4
- function fieldSchema(f) {
5
- switch (f.type) {
6
- case 'number':
7
- return { type: 'number' };
8
- case 'boolean':
9
- return { type: 'boolean' };
10
- case 'date':
11
- return { type: 'string', format: 'date-time' };
12
- case 'enum':
13
- return f.enumValues ? { type: 'string', enum: [...f.enumValues] } : { type: 'string' };
14
- case 'json':
15
- return { type: 'object', additionalProperties: true };
16
- case 'string':
17
- default:
18
- return { type: 'string' };
19
- }
20
- }
21
- const pascal = (s) => s.charAt(0).toUpperCase() + s.slice(1);
22
- const idParam = () => ({ name: 'id', in: 'path', required: true, schema: { type: 'string' } });
23
- const jsonBody = (schema) => ({
24
- required: true,
25
- content: { 'application/json': { schema } },
26
- });
27
- const jsonResp = (description, schema) => ({
28
- description,
29
- content: { 'application/json': { schema } },
30
- });
31
- const commitReceipt = () => jsonResp('Commit receipt', {
32
- type: 'object',
33
- properties: {
34
- object: { type: 'string', enum: ['commit_receipt'] },
35
- clientTxId: { type: 'string' },
36
- serverTxId: { type: 'string' },
37
- success: { type: 'boolean' },
38
- lastSyncId: { type: 'integer' },
39
- },
40
- });
41
- export function schemaToOpenApi(schema, options = {}) {
42
- const models = schema.models;
43
- const paths = {};
44
- const schemas = {};
45
- for (const [key, def] of Object.entries(models)) {
46
- const ref = { $ref: `#/components/schemas/${pascal(key)}` };
47
- const properties = { id: { type: 'string' } };
48
- const required = ['id'];
49
- const createProps = {};
50
- for (const [fname, fmeta] of Object.entries(def.fields)) {
51
- const fs = fieldSchema(fmeta);
52
- properties[fname] = fs;
53
- createProps[fname] = fs;
54
- if (!fmeta.isOptional)
55
- required.push(fname);
56
- }
57
- schemas[pascal(key)] = { type: 'object', properties, required };
58
- const createBody = jsonBody({ type: 'object', properties: createProps });
59
- paths[`/v1/models/${key}`] = {
60
- get: {
61
- tags: [key],
62
- summary: `List ${key}`,
63
- parameters: [
64
- { name: 'limit', in: 'query', schema: { type: 'integer' } },
65
- { name: 'order_by', in: 'query', schema: { type: 'string' } },
66
- { name: 'order', in: 'query', schema: { type: 'string', enum: ['asc', 'desc'] } },
67
- ],
68
- responses: {
69
- '200': jsonResp('List of rows', {
70
- type: 'object',
71
- properties: { object: { type: 'string', enum: ['list'] }, data: { type: 'array', items: ref } },
72
- }),
73
- },
74
- },
75
- post: { tags: [key], summary: `Create a ${key}`, requestBody: createBody, responses: { '200': commitReceipt() } },
76
- };
77
- paths[`/v1/models/${key}/{id}`] = {
78
- get: {
79
- tags: [key],
80
- summary: `Retrieve a ${key}`,
81
- parameters: [idParam()],
82
- responses: {
83
- '200': jsonResp('The row', {
84
- type: 'object',
85
- properties: { data: ref, stamp: { type: 'integer' } },
86
- }),
87
- },
88
- },
89
- patch: { tags: [key], summary: `Update a ${key}`, parameters: [idParam()], requestBody: createBody, responses: { '200': commitReceipt() } },
90
- delete: { tags: [key], summary: `Delete a ${key}`, parameters: [idParam()], responses: { '200': commitReceipt() } },
91
- };
92
- paths[`/v1/models/${key}/{id}/claim`] = {
93
- post: { tags: [key], summary: `Claim a ${key} (acquire lease)`, parameters: [idParam()], responses: { '200': jsonResp('Claim acquired', { type: 'object' }) } },
94
- delete: { tags: [key], summary: `Release a ${key} claim`, parameters: [idParam()], responses: { '200': jsonResp('Released', { type: 'object' }) } },
95
- };
96
- paths[`/v1/models/${key}/{id}/claim/heartbeat`] = {
97
- post: { tags: [key], summary: `Heartbeat a held ${key} claim (extend the lease for long-running work)`, parameters: [idParam()], responses: { '200': jsonResp('Lease extended (or queued slot refreshed)', { type: 'object', properties: { object: { type: 'string', enum: ['claim_heartbeat'] }, claimId: { type: 'string' }, status: { type: 'string', enum: ['held', 'queued'] }, expiresAt: { type: 'integer' }, position: { type: 'integer' } } }) } },
98
- };
99
- paths[`/v1/models/${key}/{id}/claim/reorder`] = {
100
- post: { tags: [key], summary: `Reorder the ${key} wait-line (privileged)`, parameters: [idParam()], responses: { '200': jsonResp('Reordered', { type: 'object' }) } },
101
- };
102
- }
103
- paths['/v1/commits'] = {
104
- post: { tags: ['commits'], summary: 'Commit a batch of operations atomically', responses: { '200': commitReceipt() } },
105
- };
106
- return {
107
- openapi: '3.1.0',
108
- info: {
109
- title: options.title ?? 'Ablo API',
110
- version: options.version ?? '1.0.0',
111
- description: 'Generated from your pushed Ablo schema — these routes are your models. ' +
112
- 'Authenticate every request with your API key as a Bearer token.',
113
- },
114
- servers: [{ url: options.serverUrl ?? `${ABLO_HOSTED_HTTP_BASE_URL}/api` }],
115
- security: [{ bearerAuth: [] }],
116
- components: {
117
- securitySchemes: {
118
- bearerAuth: { type: 'http', scheme: 'bearer', description: 'Your Ablo API key (sk_… / rk_…).' },
119
- },
120
- schemas,
121
- },
122
- paths,
123
- };
124
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * Product-facing persistence contract for writes that must survive a process
3
- * restart or an ambiguous network response.
4
- *
5
- * The engine implements this contract with a transactional outbox internally,
6
- * but callers should only need to think in terms of pending durable writes.
7
- */
8
- import { z } from 'zod';
9
- import { durableCommitEnvelopeSchema } from './commitEnvelope.js';
10
- import { durableHttpCommitEnvelopeSchema } from './httpCommitEnvelope.js';
11
- /** Every write shape that Ablo may ask an injected store to persist. */
12
- export const pendingWriteSchema = z.union([
13
- durableCommitEnvelopeSchema,
14
- durableHttpCommitEnvelopeSchema,
15
- ]);
16
- /** Runtime validation for injected adapters, including JavaScript consumers. */
17
- export const durableWriteStoreSchema = z.custom((value) => {
18
- if (typeof value !== 'object' || value === null)
19
- return false;
20
- const candidate = value;
21
- return (typeof candidate.seal === 'function' &&
22
- typeof candidate.list === 'function' &&
23
- typeof candidate.remove === 'function');
24
- }, { message: 'store must implement seal(), list(), and remove()' });
25
- /** Options for crash-durable `create`, `update`, and `delete` calls. */
26
- export const durableWritesConfigSchema = z.strictObject({
27
- store: durableWriteStoreSchema,
28
- /** Separates deployments or workflow lanes that share an authenticated actor. */
29
- namespace: z.string().trim().min(1).optional(),
30
- });
@@ -1,88 +0,0 @@
1
- /**
2
- * json.ts — key-order-insensitive comparison helpers for JSON-shaped values.
3
- *
4
- * Why this exists as a first-class, exported util:
5
- *
6
- * A `field.json()` value may be backed by a Postgres `jsonb` column, and **jsonb
7
- * does not preserve object key order** (it reorders keys by length, then
8
- * bytewise, and drops insignificant whitespace — see
9
- * https://www.postgresql.org/docs/current/datatype-json.html). So a document an
10
- * app wrote as `{type,text}` streams back in a delta as `{text,type}`: the same
11
- * value, a different serialization.
12
- *
13
- * That bites any app that reconciles an Ablo row against an *external* state
14
- * container it doesn't control — a rich-text editor (Tiptap/ProseMirror/Slate),
15
- * a `useState`, a form buffer. The natural guard, `JSON.stringify(remote) ===
16
- * JSON.stringify(local)`, is silently wrong because the two sides serialize keys
17
- * in different orders, so it never matches — and the app re-applies the remote
18
- * value on every render, clobbering in-flight edits and fighting the cursor.
19
- *
20
- * The fix is to compare order-insensitively. `deepEqual` does structural
21
- * equality directly; `stableStringify` produces a canonical string (recursively
22
- * sorted keys) for when you need a stable cache key / dependency value. The SDK
23
- * already uses `deepEqual` internally for store-level echo detection; this
24
- * module makes the same guarantee available to app authors so they don't each
25
- * reinvent it.
26
- *
27
- * (If you need byte-exact key order preserved end-to-end, store the field in a
28
- * `text` column instead of `jsonb` — Ablo's adaptive codec serializes verbatim
29
- * there, matching Postgres's `json` type behavior.)
30
- */
31
- /** Structural equality for JSON-shaped values (scalars, arrays, plain objects); key order is ignored. */
32
- export function deepEqual(a, b) {
33
- if (a === b)
34
- return true;
35
- if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {
36
- return false;
37
- }
38
- const aArr = Array.isArray(a);
39
- if (aArr !== Array.isArray(b))
40
- return false;
41
- if (aArr) {
42
- const av = a;
43
- const bv = b;
44
- if (av.length !== bv.length)
45
- return false;
46
- for (let i = 0; i < av.length; i++) {
47
- if (!deepEqual(av[i], bv[i]))
48
- return false;
49
- }
50
- return true;
51
- }
52
- const ao = a;
53
- const bo = b;
54
- const ak = Object.keys(ao);
55
- const bk = Object.keys(bo);
56
- if (ak.length !== bk.length)
57
- return false;
58
- for (const k of ak) {
59
- if (!Object.prototype.hasOwnProperty.call(bo, k))
60
- return false;
61
- if (!deepEqual(ao[k], bo[k]))
62
- return false;
63
- }
64
- return true;
65
- }
66
- /**
67
- * Canonical JSON serialization: recursively sorts object keys so two values that
68
- * differ only in key order (e.g. a jsonb round-trip) produce the same string.
69
- * Use this when you need a comparable/cacheable string rather than a boolean —
70
- * e.g. an echo guard or a `useEffect`/`useMemo` dependency.
71
- */
72
- export function stableStringify(value) {
73
- return JSON.stringify(sortKeysDeep(value));
74
- }
75
- function sortKeysDeep(value) {
76
- if (Array.isArray(value))
77
- return value.map(sortKeysDeep);
78
- if (value && typeof value === 'object') {
79
- const source = value;
80
- return Object.keys(source)
81
- .sort()
82
- .reduce((acc, key) => {
83
- acc[key] = sortKeysDeep(source[key]);
84
- return acc;
85
- }, {});
86
- }
87
- return value;
88
- }
@@ -1,55 +0,0 @@
1
- /**
2
- * The fixed, public-facing message returned for an unclassified 500. A raw
3
- * `err.message` can carry driver text, connection strings, or stack fragments,
4
- * so it is never placed on the wire; a caller that needs those details logs the
5
- * original error server-side before formatting the response.
6
- */
7
- export declare const INTERNAL_ERROR_PUBLIC_MESSAGE = "An internal error occurred.";
8
- /** The canonical error envelope. Every HTTP error response and every structured
9
- * frame error carries this exact set of keys, regardless of which route or
10
- * transport produced it. */
11
- export interface ErrorEnvelope {
12
- readonly type: string;
13
- readonly code?: string;
14
- readonly param?: string;
15
- readonly message: string;
16
- readonly doc_url?: string;
17
- readonly request_id?: string;
18
- /** Field-level failures collected together, so a single 4xx can report every
19
- * invalid input at once — for example a schema push, a batch commit, or CLI
20
- * argument validation — instead of failing on the first. Use `param` for the
21
- * single-field case. */
22
- readonly errors?: readonly {
23
- readonly code?: string;
24
- readonly message: string;
25
- readonly param?: string;
26
- }[];
27
- /** Additional typed details. {@link AbloError} serialization spreads its
28
- * `details` — such as `missingIds`, `conflicts`, or `retryAfterSeconds` — as
29
- * top-level members here. Ignore any member you do not recognize, so new ones
30
- * can be added without breaking you. */
31
- readonly [key: string]: unknown;
32
- }
33
- /** Maps an {@link AbloError} subclass name to its default HTTP status. Each
34
- * subclass is chosen to match the status — a validation error is a 400, a
35
- * permission error a 403 — so a throw site picks the right class and code and
36
- * the status follows. An explicit `httpStatus` is supplied only when it
37
- * diverges, such as a 404 on the base class or a 503 on a server error. */
38
- export declare function statusForType(type: string): number;
39
- /**
40
- * Converts any thrown value into the canonical {@link ErrorEnvelope} and an HTTP
41
- * status. A typed {@link AbloError} is serialized through its own `toJSON`, so
42
- * its code, param, doc_url, and structured details survive, and its status comes
43
- * from an explicit `httpStatus` or, failing that, {@link statusForType}.
44
- * Anything else becomes a 500 `internal_error` envelope — never a bare framework
45
- * "Internal Server Error" body, and never a raw error string leaked onto the
46
- * wire as an unregistered code.
47
- *
48
- * When `requestId` is supplied and the error does not already carry one, it is
49
- * stamped into the body so the response and the `x-request-id` header agree for
50
- * support correlation.
51
- */
52
- export declare function errorEnvelope(err: unknown, requestId?: string): {
53
- body: ErrorEnvelope;
54
- status: number;
55
- };
@@ -1,197 +0,0 @@
1
- /**
2
- * The write-path message shapes for the sync protocol. These cover the frames
3
- * a client sends to commit work — {@link CommitMessage}, a batch of raw
4
- * operations — and the server's {@link MutationResultMessage}
5
- * acknowledgement. The same frames flow over a WebSocket connection and over
6
- * the HTTP commit endpoint.
7
- *
8
- * Both the client and the server import these definitions from here, so the two
9
- * sides cannot drift. Each interface is paired with a Zod validator
10
- * ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
11
- * compile time, so the runtime check and the type stay in lockstep. Changing
12
- * any shape in this file changes the wire contract and requires the client and
13
- * server to update together.
14
- */
15
- import { z } from 'zod';
16
- import type { OnStaleMode, ReadDependency, TrackDependency } from '../coordination/index.js';
17
- import type { MutationResultMessageWire } from './commit.js';
18
- /**
19
- * A single operation within a {@link CommitMessage} batch. Each operation is
20
- * the smallest unit the server applies atomically — one create, update,
21
- * delete, archive, or unarchive against one model row.
22
- */
23
- export interface CommitOperation {
24
- type: 'CREATE' | 'UPDATE' | 'DELETE' | 'ARCHIVE' | 'UNARCHIVE';
25
- model: string;
26
- id?: string | null;
27
- input?: Record<string, unknown> | null;
28
- /**
29
- * A client-generated transaction id for this one operation. The server
30
- * stamps it onto the `sync_deltas.transaction_id` column so the originating
31
- * client can recognize the resulting broadcast as an echo of its own
32
- * optimistic write. This is distinct from the batch-level `clientTxId` on
33
- * {@link CommitMessage}, which the server uses to deduplicate retried batches.
34
- */
35
- transactionId?: string | null;
36
- /**
37
- * A read watermark captured when the client last read this row. The server
38
- * checks whether the target has changed since this point; if it has, the
39
- * operation's {@link CommitOperation.onStale} mode decides what happens.
40
- */
41
- readAt?: number | null;
42
- /**
43
- * What to do when the server detects the row changed since
44
- * {@link CommitOperation.readAt}. `'reject'` (the default) fails the
45
- * operation with a stale-context error; `'overwrite'` applies the write
46
- * regardless; `'notify'` holds the write and returns a
47
- * {@link StaleNotification} for the caller to resolve.
48
- */
49
- onStale?: OnStaleMode | null;
50
- /**
51
- * Write even when another participant holds a claim on this row. The default
52
- * (`false`) rejects the operation with a claimed-entity error while a claim
53
- * is held. Setting `bypass` overrides that, and the override is recorded. It
54
- * is honored only for participants the claim guard trusts, such as human and
55
- * framework identities; a bypass requested by an agent is ignored.
56
- */
57
- bypass?: boolean | null;
58
- /**
59
- * The monotonic fencing token of the held claim this write was issued under
60
- * ({@link https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html Kleppmann fencing}).
61
- * The server rejects the write if a later holder already advanced this
62
- * entity's persisted high-water past the token — closing the "lapsed holder
63
- * resumes after its successor came and went" residual that the live-lease
64
- * claim guard cannot see. Absent on every unclaimed write.
65
- */
66
- fenceToken?: number | null;
67
- }
68
- /**
69
- * Runtime validator for {@link CommitOperation}. Both commit transports — the
70
- * WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
71
- * on every operation before it is applied, so a malformed operation is rejected
72
- * at the edge. It builds on the shared coordination schema, widening `bypass`
73
- * to also accept `null` so the validator and the interface match exactly. Note
74
- * that `readAt` must be a number: it feeds the server's stale-check comparison,
75
- * so a non-numeric watermark is refused here.
76
- */
77
- export declare const commitOperationSchema: z.ZodObject<{
78
- readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
79
- onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
80
- reject: "reject";
81
- overwrite: "overwrite";
82
- notify: "notify";
83
- }>>>;
84
- type: z.ZodEnum<{
85
- CREATE: "CREATE";
86
- UPDATE: "UPDATE";
87
- DELETE: "DELETE";
88
- ARCHIVE: "ARCHIVE";
89
- UNARCHIVE: "UNARCHIVE";
90
- }>;
91
- model: z.ZodString;
92
- id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
93
- input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
94
- transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
95
- fenceToken: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
96
- bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
97
- }, z.core.$strip>;
98
- /**
99
- * A client-to-server frame that asks the server to commit a batch of operations
100
- * atomically. It carries a list of {@link CommitOperation} entries plus the
101
- * batch metadata below.
102
- */
103
- export interface CommitMessage {
104
- type: 'commit';
105
- payload: {
106
- operations: CommitOperation[];
107
- clientTxId: string;
108
- /**
109
- * Optional lineage id linking this batch to the task that caused it. When
110
- * present, the server validates it and records it on the delta's
111
- * `caused_by_task_id` column for audit trails; when omitted or `null`, the
112
- * batch simply carries no task attribution.
113
- */
114
- causedByTaskId?: string | null;
115
- /**
116
- * The reads this batch's writes were premised on. Each entry names either a
117
- * specific row (`{ model, id, readAt, fields? }`) or a sync group
118
- * (`{ group, readAt }`) that must not have changed since its `readAt`
119
- * watermark. The server checks every entry and applies its `onStale`
120
- * disposition to the whole batch if one moved. When omitted, only the rows
121
- * being written are checked for staleness.
122
- */
123
- reads?: ReadDependency[] | null;
124
- /**
125
- * Durable read-dependencies to register for this batch's participant. Each
126
- * entry — a row (`{ model, id }`) or a sync group (`{ group }`) — is persisted
127
- * and re-checked against every future delta; a later match surfaces a
128
- * `StaleNotification` on the participant's next commit. Distinct from `reads`,
129
- * which is checked once here and discarded.
130
- */
131
- track?: TrackDependency[] | null;
132
- };
133
- }
134
- /**
135
- * Runtime validator for the payload of {@link CommitMessage}. It checks every
136
- * field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
137
- * `reads` — validating each operation with {@link commitOperationSchema} and
138
- * each read dependency with the shared read-dependency schema.
139
- */
140
- export declare const commitPayloadSchema: z.ZodObject<{
141
- operations: z.ZodArray<z.ZodObject<{
142
- readAt: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
143
- onStale: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
144
- reject: "reject";
145
- overwrite: "overwrite";
146
- notify: "notify";
147
- }>>>;
148
- type: z.ZodEnum<{
149
- CREATE: "CREATE";
150
- UPDATE: "UPDATE";
151
- DELETE: "DELETE";
152
- ARCHIVE: "ARCHIVE";
153
- UNARCHIVE: "UNARCHIVE";
154
- }>;
155
- model: z.ZodString;
156
- id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
157
- input: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
158
- transactionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
159
- fenceToken: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
160
- bypass: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
161
- }, z.core.$strip>>;
162
- clientTxId: z.ZodString;
163
- causedByTaskId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
164
- reads: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
165
- model: z.ZodString;
166
- id: z.ZodString;
167
- readAt: z.ZodNumber;
168
- fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
169
- onStale: z.ZodOptional<z.ZodEnum<{
170
- reject: "reject";
171
- overwrite: "overwrite";
172
- notify: "notify";
173
- }>>;
174
- }, z.core.$strip>, z.ZodObject<{
175
- group: z.ZodString;
176
- readAt: z.ZodNumber;
177
- onStale: z.ZodOptional<z.ZodEnum<{
178
- reject: "reject";
179
- overwrite: "overwrite";
180
- notify: "notify";
181
- }>>;
182
- }, z.core.$strip>]>>>>;
183
- track: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
184
- model: z.ZodString;
185
- id: z.ZodString;
186
- readAt: z.ZodOptional<z.ZodNumber>;
187
- }, z.core.$strip>, z.ZodObject<{
188
- group: z.ZodString;
189
- readAt: z.ZodOptional<z.ZodNumber>;
190
- }, z.core.$strip>]>>>>;
191
- }, z.core.$strip>;
192
- /**
193
- * The server's acknowledgement of a {@link CommitMessage}. Runtime shape and
194
- * TypeScript type are both owned by `wire/commit.ts`; HTTP, WebSocket, and
195
- * cached replay no longer maintain parallel receipt declarations.
196
- */
197
- export type MutationResultMessage = MutationResultMessageWire;
@@ -1,49 +0,0 @@
1
- /**
2
- * The write-path message shapes for the sync protocol. These cover the frames
3
- * a client sends to commit work — {@link CommitMessage}, a batch of raw
4
- * operations — and the server's {@link MutationResultMessage}
5
- * acknowledgement. The same frames flow over a WebSocket connection and over
6
- * the HTTP commit endpoint.
7
- *
8
- * Both the client and the server import these definitions from here, so the two
9
- * sides cannot drift. Each interface is paired with a Zod validator
10
- * ({@link commitOperationSchema}, {@link commitPayloadSchema}) pinned to it at
11
- * compile time, so the runtime check and the type stay in lockstep. Changing
12
- * any shape in this file changes the wire contract and requires the client and
13
- * server to update together.
14
- */
15
- import { z } from 'zod';
16
- // The runtime schema primitives are imported straight from the coordination
17
- // schema module to keep this file's runtime dependencies limited to Zod.
18
- import { commitOperationSchema as coordinationCommitOperationSchema, readDependencySchema, trackDependencySchema, } from '../coordination/schema.js';
19
- /**
20
- * Runtime validator for {@link CommitOperation}. Both commit transports — the
21
- * WebSocket `commit` frame and the HTTP `/v1/commits` endpoint — run this check
22
- * on every operation before it is applied, so a malformed operation is rejected
23
- * at the edge. It builds on the shared coordination schema, widening `bypass`
24
- * to also accept `null` so the validator and the interface match exactly. Note
25
- * that `readAt` must be a number: it feeds the server's stale-check comparison,
26
- * so a non-numeric watermark is refused here.
27
- */
28
- export const commitOperationSchema = coordinationCommitOperationSchema.extend({
29
- bypass: z.boolean().nullish(),
30
- });
31
- // Pins the schema to the interface: this fails to compile if either side drifts.
32
- const _commitOperationContract = true;
33
- void _commitOperationContract;
34
- /**
35
- * Runtime validator for the payload of {@link CommitMessage}. It checks every
36
- * field the server acts on — `operations`, `clientTxId`, `causedByTaskId`, and
37
- * `reads` — validating each operation with {@link commitOperationSchema} and
38
- * each read dependency with the shared read-dependency schema.
39
- */
40
- export const commitPayloadSchema = z.object({
41
- operations: z.array(commitOperationSchema),
42
- clientTxId: z.string(),
43
- causedByTaskId: z.string().nullish(),
44
- reads: z.array(readDependencySchema).nullish(),
45
- track: z.array(trackDependencySchema).nullish(),
46
- });
47
- // Pins the schema to the payload type: fails to compile if either side drifts.
48
- const _commitPayloadContract = true;
49
- void _commitPayloadContract;
@@ -1,18 +0,0 @@
1
- /**
2
- * Wraps an already-fetched page of rows in the uniform {@link ListEnvelope}.
3
- *
4
- * Pagination stays the caller's job — fetch one more row than the limit to
5
- * decide `hasMore`, and derive the cursor from the last row's sort key. This
6
- * helper only applies the envelope so no endpoint has to build the shape by
7
- * hand. The defaults describe a small, unpaginated collection
8
- * (`has_more: false`, `next_cursor: null`); a paginated endpoint passes both
9
- * explicitly.
10
- */
11
- export function listEnvelope(data, opts = {}) {
12
- return {
13
- object: 'list',
14
- data,
15
- has_more: opts.hasMore ?? false,
16
- next_cursor: opts.nextCursor ?? null,
17
- };
18
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes