@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,171 +0,0 @@
1
- /**
2
- * An in-memory {@link SyncStoreContract} for tests. It lets you seed rows,
3
- * read and write them synchronously, and inspect every call the code under
4
- * test made — all without a real sync backend.
5
- */
6
- import { ViewRegistry } from '../../core/ViewRegistry.js';
7
- import { AbloValidationError } from '../../errors.js';
8
- /**
9
- * An in-memory implementation of {@link SyncStoreContract}. Seed rows with
10
- * {@link MockSyncStore.setModels}, then read and write through the contract
11
- * methods; every call is recorded on {@link MockSyncStore.calls} so tests can
12
- * assert on what happened.
13
- */
14
- export class MockSyncStore {
15
- // Seeded data, keyed by model class
16
- byClass = new Map();
17
- // Call tracking for assertions
18
- calls = {
19
- retrieve: [],
20
- query: [],
21
- save: [],
22
- delete: [],
23
- archive: [],
24
- unarchive: [],
25
- };
26
- /**
27
- * Seed the store with models of a specific class.
28
- *
29
- * @example
30
- * mockStore.setModels(Task, [task1, task2]);
31
- */
32
- setModels(modelClass, models) {
33
- const map = new Map();
34
- for (const m of models) {
35
- map.set(m.id, m);
36
- }
37
- this.byClass.set(modelClass, map);
38
- }
39
- /**
40
- * Adds or replaces a single model, keyed by its id.
41
- */
42
- addModel(modelClass, model) {
43
- let map = this.byClass.get(modelClass);
44
- if (!map) {
45
- map = new Map();
46
- this.byClass.set(modelClass, map);
47
- }
48
- map.set(model.id, model);
49
- }
50
- /**
51
- * Remove a model by ID.
52
- */
53
- removeModel(modelClass, id) {
54
- this.byClass.get(modelClass)?.delete(id);
55
- }
56
- /**
57
- * Clear all seeded data and call history.
58
- */
59
- reset() {
60
- this.byClass.clear();
61
- this.calls = {
62
- retrieve: [],
63
- query: [],
64
- save: [],
65
- delete: [],
66
- archive: [],
67
- unarchive: [],
68
- };
69
- }
70
- // ── SyncStoreContract implementation ──────────────────────────────────
71
- retrieve(modelClass, id) {
72
- this.calls.retrieve.push({ modelClass: modelClass, id });
73
- return this.byClass.get(modelClass)?.get(id);
74
- }
75
- queryByClass(modelClass, options) {
76
- this.calls.query.push({
77
- modelClass: modelClass,
78
- options: options,
79
- });
80
- const map = this.byClass.get(modelClass);
81
- if (!map) {
82
- return { data: [] };
83
- }
84
- let data = Array.from(map.values());
85
- // Apply predicate
86
- if (options?.predicate) {
87
- data = data.filter(options.predicate);
88
- }
89
- // Apply ordering
90
- if (options?.orderBy) {
91
- const key = options.orderBy;
92
- const order = options.order ?? 'asc';
93
- data.sort((a, b) => {
94
- const av = a[key];
95
- const bv = b[key];
96
- if (av === bv)
97
- return 0;
98
- const cmp = av < bv ? -1 : 1;
99
- return order === 'asc' ? cmp : -cmp;
100
- });
101
- }
102
- // Apply pagination
103
- if (options?.offset) {
104
- data = data.slice(options.offset);
105
- }
106
- if (options?.limit !== undefined) {
107
- data = data.slice(0, options.limit);
108
- }
109
- return { data };
110
- }
111
- async save(model) {
112
- this.calls.save.push(model);
113
- // Store the model under its constructor so a later retrieve or query
114
- // returns it.
115
- const ctor = model.constructor;
116
- this.addModel(ctor, model);
117
- }
118
- async delete(model) {
119
- this.calls.delete.push(model);
120
- const ctor = model.constructor;
121
- this.removeModel(ctor, model.id);
122
- }
123
- async archive(model) {
124
- this.calls.archive.push(model);
125
- }
126
- async unarchive(model) {
127
- this.calls.unarchive.push(model);
128
- }
129
- // Sync-status getters default to "ready, idle". Tests that exercise
130
- // offline/reconnect flows can set these before rendering.
131
- isReady = true;
132
- isSyncing = false;
133
- isOffline = false;
134
- isReconnecting = false;
135
- isError = false;
136
- hasUnsyncedChanges = false;
137
- syncStatus = {
138
- state: 'idle',
139
- progress: 100,
140
- pendingChanges: 0,
141
- isSessionError: false,
142
- };
143
- /** A minimal object pool backing the useEntity and useEntities hooks in tests. */
144
- pool = {
145
- get: (id) => {
146
- for (const models of this.byClass.values()) {
147
- const model = models.get(id);
148
- if (model)
149
- return model;
150
- }
151
- return undefined;
152
- },
153
- getByTypeName: (_typename) => [],
154
- getByForeignKey: () => [],
155
- createFromData: () => null,
156
- hasForeignKeyIndex: () => false,
157
- createView: () => {
158
- throw new AbloValidationError('MockSyncStore does not support createView', {
159
- code: 'mock_unsupported_operation',
160
- });
161
- },
162
- viewRegistry: new ViewRegistry(),
163
- };
164
- }
165
- /**
166
- * Create a new MockSyncStore.
167
- * Shorthand for `new MockSyncStore()`.
168
- */
169
- export function createMockSyncStore() {
170
- return new MockSyncStore();
171
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * A controllable WebSocket stand-in for sync engine tests. It reproduces the
3
- * event interface of the real connection without opening a socket, so tests
4
- * can drive connection changes, deltas, and bootstrap hints by hand.
5
- */
6
- import type { SyncActionType } from '../../types/index.js';
7
- import type { BootstrapReason } from '../../wire/bootstrapReason.js';
8
- /** The shape of a single delta — one change the server pushes to the client. */
9
- export interface MockDelta {
10
- id: number;
11
- modelName: string;
12
- modelId: string;
13
- action: SyncActionType;
14
- data: Record<string, unknown>;
15
- }
16
- /**
17
- * A hint from the server that the client has fallen too far behind and should
18
- * rebuild its data from scratch rather than catch up one delta at a time.
19
- */
20
- export interface MockBootstrapHint {
21
- reason: BootstrapReason;
22
- tables?: string[];
23
- staleTables?: string[];
24
- }
25
- type EventHandler = (...args: unknown[]) => void;
26
- /**
27
- * A controllable, event-based stand-in for the sync engine's WebSocket
28
- * connection. Subscribe with {@link MockWebSocket.on} exactly as production
29
- * code does, then use the `simulate*` and `receive*` methods to push
30
- * connection changes, deltas, and bootstrap hints. Every event the mock emits
31
- * is recorded on {@link MockWebSocket.emittedEvents} for assertions.
32
- */
33
- export declare class MockWebSocket {
34
- private _connected;
35
- private _sessionError;
36
- private _listeners;
37
- /** Every event the mock has emitted, in order, for assertions. */
38
- readonly emittedEvents: {
39
- type: string;
40
- data: unknown;
41
- }[];
42
- get connected(): boolean;
43
- get sessionError(): boolean;
44
- on(event: string, handler: EventHandler): () => void;
45
- private emit;
46
- /** Fires a successful connection, emitting the `connected` event. */
47
- simulateConnect(): void;
48
- /** Drops the connection, emitting the `disconnected` event. */
49
- simulateDisconnect(): void;
50
- /** Emits a `reconnecting` event carrying the attempt number and retry delay. */
51
- simulateReconnecting(attempt: number, delay: number): void;
52
- /** Emits a `session_error` event, as when the server rejects the session as unauthorized. The code defaults to 401. */
53
- simulateSessionError(code?: number): void;
54
- /** Emits a `reconnect_failed` event, signaling the client gave up after exhausting its retries. */
55
- simulateReconnectFailed(): void;
56
- /** Delivers a single delta, emitting a `delta` event as if the server had sent it. */
57
- receiveDelta(delta: MockDelta): void;
58
- /** Delivers a batch of deltas, emitting a `delta_batch` event. */
59
- receiveDeltas(deltas: MockDelta[]): void;
60
- /** Emits a `bootstrap_required` hint, telling the client to rebuild its data instead of catching up. */
61
- simulateBootstrapHint(hint: MockBootstrapHint): void;
62
- /** Emits a `presence_update` event carrying the given payload. */
63
- simulatePresenceUpdate(data: Record<string, unknown>): void;
64
- /** Returns the payloads of every emitted event of the given type, in order. */
65
- getEvents(type: string): unknown[];
66
- /** Reports whether an event of the given type has been emitted. */
67
- hasEmitted(type: string): boolean;
68
- /** Clears connection state, listeners, and the record of emitted events. */
69
- reset(): void;
70
- }
71
- export {};
@@ -1,118 +0,0 @@
1
- /**
2
- * A controllable WebSocket stand-in for sync engine tests. It reproduces the
3
- * event interface of the real connection without opening a socket, so tests
4
- * can drive connection changes, deltas, and bootstrap hints by hand.
5
- */
6
- /**
7
- * A controllable, event-based stand-in for the sync engine's WebSocket
8
- * connection. Subscribe with {@link MockWebSocket.on} exactly as production
9
- * code does, then use the `simulate*` and `receive*` methods to push
10
- * connection changes, deltas, and bootstrap hints. Every event the mock emits
11
- * is recorded on {@link MockWebSocket.emittedEvents} for assertions.
12
- */
13
- export class MockWebSocket {
14
- _connected = false;
15
- _sessionError = false;
16
- _listeners = new Map();
17
- /** Every event the mock has emitted, in order, for assertions. */
18
- emittedEvents = [];
19
- get connected() {
20
- return this._connected;
21
- }
22
- get sessionError() {
23
- return this._sessionError;
24
- }
25
- // ─────────────────────────────────────────────
26
- // Event subscription (matches the real connection's API)
27
- // ─────────────────────────────────────────────
28
- on(event, handler) {
29
- if (!this._listeners.has(event)) {
30
- this._listeners.set(event, new Set());
31
- }
32
- this._listeners.get(event).add(handler);
33
- return () => {
34
- this._listeners.get(event)?.delete(handler);
35
- };
36
- }
37
- emit(event, ...args) {
38
- this.emittedEvents.push({ type: event, data: args[0] });
39
- const handlers = this._listeners.get(event);
40
- if (handlers) {
41
- for (const handler of handlers) {
42
- handler(...args);
43
- }
44
- }
45
- }
46
- // ─────────────────────────────────────────────
47
- // Test control: connection lifecycle
48
- // ─────────────────────────────────────────────
49
- /** Fires a successful connection, emitting the `connected` event. */
50
- simulateConnect() {
51
- this._connected = true;
52
- this._sessionError = false;
53
- this.emit('connected');
54
- }
55
- /** Drops the connection, emitting the `disconnected` event. */
56
- simulateDisconnect() {
57
- this._connected = false;
58
- this.emit('disconnected');
59
- }
60
- /** Emits a `reconnecting` event carrying the attempt number and retry delay. */
61
- simulateReconnecting(attempt, delay) {
62
- this.emit('reconnecting', { attempt, delay });
63
- }
64
- /** Emits a `session_error` event, as when the server rejects the session as unauthorized. The code defaults to 401. */
65
- simulateSessionError(code = 401) {
66
- this._sessionError = true;
67
- this._connected = false;
68
- this.emit('session_error', { code });
69
- }
70
- /** Emits a `reconnect_failed` event, signaling the client gave up after exhausting its retries. */
71
- simulateReconnectFailed() {
72
- this._connected = false;
73
- this.emit('reconnect_failed');
74
- }
75
- // ─────────────────────────────────────────────
76
- // Test control: delta injection
77
- // ─────────────────────────────────────────────
78
- /** Delivers a single delta, emitting a `delta` event as if the server had sent it. */
79
- receiveDelta(delta) {
80
- this.emit('delta', delta);
81
- }
82
- /** Delivers a batch of deltas, emitting a `delta_batch` event. */
83
- receiveDeltas(deltas) {
84
- this.emit('delta_batch', deltas);
85
- }
86
- // ─────────────────────────────────────────────
87
- // Test control: bootstrap hints
88
- // ─────────────────────────────────────────────
89
- /** Emits a `bootstrap_required` hint, telling the client to rebuild its data instead of catching up. */
90
- simulateBootstrapHint(hint) {
91
- this.emit('bootstrap_required', hint);
92
- }
93
- // ─────────────────────────────────────────────
94
- // Test control: presence
95
- // ─────────────────────────────────────────────
96
- /** Emits a `presence_update` event carrying the given payload. */
97
- simulatePresenceUpdate(data) {
98
- this.emit('presence_update', data);
99
- }
100
- // ─────────────────────────────────────────────
101
- // Assertions
102
- // ─────────────────────────────────────────────
103
- /** Returns the payloads of every emitted event of the given type, in order. */
104
- getEvents(type) {
105
- return this.emittedEvents.filter((e) => e.type === type).map((e) => e.data);
106
- }
107
- /** Reports whether an event of the given type has been emitted. */
108
- hasEmitted(type) {
109
- return this.emittedEvents.some((e) => e.type === type);
110
- }
111
- /** Clears connection state, listeners, and the record of emitted events. */
112
- reset() {
113
- this._connected = false;
114
- this._sessionError = false;
115
- this._listeners.clear();
116
- this.emittedEvents.length = 0;
117
- }
118
- }
@@ -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,25 +0,0 @@
1
- /**
2
- * Parses a duration into milliseconds. A duration is either a number of seconds
3
- * or a string with a unit suffix — milliseconds, seconds, minutes, or hours:
4
- *
5
- * - `'500ms'` → 500 ms
6
- * - `'30s'` → 30 000 ms
7
- * - `'3m'` → 180 000 ms
8
- * - `'24h'` → 86 400 000 ms
9
- *
10
- * A bare number is interpreted as seconds rather than milliseconds, matching the
11
- * `ttlSeconds` fields used throughout the SDK, so a numeric caller and a string
12
- * caller can pass the same field interchangeably. {@link toMs} returns
13
- * milliseconds; {@link toSeconds} returns whole seconds.
14
- */
15
- export type Duration = number | `${number}ms` | `${number}s` | `${number}m` | `${number}h`;
16
- /**
17
- * Parses a duration and returns the equivalent number of milliseconds. Accepts
18
- * either a bare number, interpreted as seconds, or a unit-suffixed string such
19
- * as `'500ms'`, `'30s'`, `'3m'`, or `'24h'`. Throws an
20
- * {@link AbloValidationError} with code `duration_invalid` when a string does
21
- * not match a supported unit.
22
- */
23
- export declare function toMs(input: Duration): number;
24
- /** Parses a duration like {@link toMs} but returns whole seconds, rounding down. */
25
- export declare function toSeconds(input: Duration): number;
@@ -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
- };