@abloatai/ablo 0.26.0 → 0.27.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 (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,13 +1,9 @@
1
1
  /**
2
- * The `abloSource()` / `dataSource()` endpoint factory — the customer-owned
3
- * Data Source handler. Takes the options (schema, apiKey, handlers or ORM
4
- * adapter), verifies the signed request, enforces per-key scopes, and
5
- * dispatches the four wire operations (`load`/`list`/`commit`/`events`) to
6
- * the configured handlers.
7
- *
8
- * `AbloSourceOptions` lives here (not `types.ts`) because it references the
9
- * ORM `DataSourceAdapter` — keeping it with the factory keeps `types.ts` a
10
- * dependency-free leaf for `adapter.ts`/`contract.ts` to import from.
2
+ * Builds the Data Source request handler returned by `abloSource()` and its alias
3
+ * `dataSource()`. Given your options the schema, the API key, and either
4
+ * per-model handlers or an ORM adapter the handler verifies each signed request,
5
+ * enforces the per-key scopes, and routes the four wire operations (`load`,
6
+ * `list`, `commit`, and `events`) to whichever handlers you configured.
11
7
  */
12
8
  import type { Schema, SchemaRecord, InferCreate } from '../schema/schema.js';
13
9
  import type { DataSourceAdapter } from './adapter.js';
@@ -20,39 +16,33 @@ type SourceModels<S extends SchemaRecord, TAuth> = Partial<{
20
16
  export type AbloSourceOptions<S extends SchemaRecord, TAuth = unknown> = {
21
17
  readonly schema: Schema<S>;
22
18
  /**
23
- * Customer-visible Ablo credential. In the API-key-only onboarding
24
- * path, Ablo signs Data Source calls with the same project API key
25
- * that the customer's server-side SDK uses. This keeps the customer
26
- * env surface to one Ablo credential while preserving signed request
27
- * verification before any handler runs.
19
+ * Your Ablo project credential. Ablo signs each Data Source call with the same
20
+ * project API key your server-side SDK already uses, so your environment holds a
21
+ * single Ablo credential and every request is signature-verified before any
22
+ * handler runs.
28
23
  */
29
24
  readonly apiKey: SourceApiKey;
30
25
  /**
31
- * Clock-skew window for signed source requests. Default: 5 minutes.
26
+ * How much clock skew to tolerate when verifying a request's signed timestamp.
27
+ * Defaults to five minutes.
32
28
  */
33
29
  readonly signatureToleranceMs?: number;
34
30
  /**
35
- * Verify the Ablo request and return customer-owned context such as
36
- * a database handle, account scope, or current actor. Keep database
37
- * credentials in this function's environment; never send them to Ablo.
38
- *
39
- * Signature verification is handled by `apiKey` before this function
40
- * runs. `authorize` should only attach business context.
31
+ * Attaches your own context to a verified request and returns it for example a
32
+ * database handle, an account scope, or the current actor. Keep database
33
+ * credentials inside this function's environment and never send them to Ablo. The
34
+ * signature has already been checked against `apiKey` by the time this runs, so
35
+ * `authorize` only needs to supply business context, not re-verify the caller.
41
36
  */
42
37
  readonly authorize?: (context: SourceAuthorizeContext) => Promise<TAuth> | TAuth;
43
38
  /**
44
- * Optional per-request scope resolver. When set, the helper checks
45
- * the resolved scope set against the request's operation
46
- * (`load`/`list`/`commit`/`events`) and returns 403
47
- * `source_forbidden` if not allowed before any model handler
48
- * runs.
49
- *
50
- * Customers typically extract a key id from the request (e.g.
51
- * `webhook-id` prefix, a custom header, or the API key itself) and
52
- * look up the scopes for that key in their store.
53
- *
54
- * When omitted, all operations are allowed. Returning an empty set
55
- * denies all operations.
39
+ * Resolves the set of operations a request's key may perform. When you provide
40
+ * it, the handler checks the operation the request is asking for (`load`, `list`,
41
+ * `commit`, or `events`) against the returned set and responds 403
42
+ * `source_forbidden` if it is not allowed, before any model handler runs. A
43
+ * typical implementation reads a key id from the request — a `webhook-id` prefix,
44
+ * a custom header, or the API key itself — and looks that key's scopes up in your
45
+ * store. Omit it to allow every operation; return an empty set to deny them all.
56
46
  */
57
47
  readonly resolveScopes?: (params: {
58
48
  readonly auth: TAuth;
@@ -60,45 +50,43 @@ export type AbloSourceOptions<S extends SchemaRecord, TAuth = unknown> = {
60
50
  readonly body: SourceRequest;
61
51
  }) => Promise<ReadonlySet<SourceScope> | readonly SourceScope[]> | ReadonlySet<SourceScope> | readonly SourceScope[];
62
52
  /**
63
- * Top-level atomic commit handler. Prefer this for real applications:
64
- * one UI/action commit can span several models and should run inside
65
- * one customer-owned transaction.
53
+ * Handles a commit atomically across every model it touches. Prefer this in real
54
+ * applications: a single user action can change several models at once and should
55
+ * run inside one transaction you control.
66
56
  */
67
57
  readonly commit?: SourceCommitHandler<TAuth>;
68
58
  /**
69
- * External-write feed. Ablo polls this to learn about changes that
70
- * happened outside the SDK (cron jobs, dashboard edits, batch
71
- * imports). Each returned event becomes a delta and fans out to
72
- * connected clients.
73
- *
74
- * Handlers may return the raw outbox feed. Ablo dedupes stable
75
- * `event.id` values and filters SDK-origin echoes when rows carry
76
- * the originating `clientTxId`; customers should persist both fields
77
- * in their outbox table.
59
+ * Reports changes that happened outside the SDK cron jobs, dashboard edits,
60
+ * batch imports which Ablo polls for. Each event you return becomes a delta and
61
+ * fans out to connected clients. You can return your outbox rows directly: Ablo
62
+ * dedupes on the stable `event.id` and drops echoes of the SDK's own writes when a
63
+ * row carries the originating `clientTxId`, so store both fields in your outbox
64
+ * table.
78
65
  */
79
66
  readonly events?: SourceEventsHandler<TAuth>;
80
67
  /**
81
- * Optional grouped form. The object-key form below is usually terser:
82
- * `abloSource({ schema, files: { load, list, commit } })`.
68
+ * Groups per-model handlers under a `models` key. The spread form below is
69
+ * usually shorter — `abloSource({ schema, files: { load, list, commit } })` —
70
+ * but this explicit form is available when you prefer it.
83
71
  */
84
72
  readonly models?: SourceModels<S, TAuth>;
85
73
  /**
86
- * An ORM adapter (`prismaDataSource(prisma, schema)`, …). When set, it serves
87
- * ALL four operations — read (load/list), commit (idempotent + outbox), and
88
- * events — so no hand-written `commit`/`events`/model handlers are needed. The
89
- * adapter is consumed at the generic dispatch layer (rows are JSON on the wire),
90
- * which is why it carries no per-model types and needs no cast at the call site.
91
- * Mutually exclusive with hand-written handlers.
74
+ * An ORM adapter, such as `prismaDataSource(prisma, schema)`. When set, it serves
75
+ * all four operations on its own reads for `load` and `list`, an idempotent
76
+ * `commit` backed by the outbox, and `events` — so you write no handlers by hand.
77
+ * Because rows travel as JSON, the adapter is applied at a single generic
78
+ * dispatch point and needs no per-model types. Use either an adapter or
79
+ * hand-written handlers, not both.
92
80
  */
93
81
  readonly adapter?: DataSourceAdapter;
94
82
  } & SourceModels<S, TAuth>;
95
83
  /**
96
- * Create a customer-owned data source endpoint.
84
+ * Creates a Data Source endpoint you host in front of your own database.
97
85
  *
98
- * App code still talks to Ablo with `ablo.files.load/list/update`.
99
- * This helper is only for customers who keep canonical rows in their own
100
- * database and want Ablo Cloud to call a narrow, signed endpoint instead
101
- * of receiving database credentials.
86
+ * Your application code still reads and writes through Ablo, as in
87
+ * `ablo.files.load`, `.list`, and `.update`. This helper is for keeping the
88
+ * canonical rows in your database: Ablo calls a narrow, signed endpoint you
89
+ * control rather than holding your database credentials.
102
90
  */
103
91
  export declare function abloSource<const S extends SchemaRecord, TAuth = unknown>(options: AbloSourceOptions<S, TAuth>): (request: Request) => Promise<Response>;
104
92
  export type DataSourceOptions<S extends SchemaRecord, TAuth = unknown> = AbloSourceOptions<S, TAuth>;
@@ -1,13 +1,9 @@
1
1
  /**
2
- * The `abloSource()` / `dataSource()` endpoint factory — the customer-owned
3
- * Data Source handler. Takes the options (schema, apiKey, handlers or ORM
4
- * adapter), verifies the signed request, enforces per-key scopes, and
5
- * dispatches the four wire operations (`load`/`list`/`commit`/`events`) to
6
- * the configured handlers.
7
- *
8
- * `AbloSourceOptions` lives here (not `types.ts`) because it references the
9
- * ORM `DataSourceAdapter` — keeping it with the factory keeps `types.ts` a
10
- * dependency-free leaf for `adapter.ts`/`contract.ts` to import from.
2
+ * Builds the Data Source request handler returned by `abloSource()` and its alias
3
+ * `dataSource()`. Given your options the schema, the API key, and either
4
+ * per-model handlers or an ORM adapter the handler verifies each signed request,
5
+ * enforces the per-key scopes, and routes the four wire operations (`load`,
6
+ * `list`, `commit`, and `events`) to whichever handlers you configured.
11
7
  */
12
8
  import { changeSetSchema } from './contract.js';
13
9
  import { SourceSignatureError, verifyAbloSourceRequest, } from './signing.js';
@@ -18,9 +14,9 @@ function json(data, status = 200) {
18
14
  });
19
15
  }
20
16
  /**
21
- * Serve a request from an ORM `adapter`. Routes the four operations to the adapter
22
- * interface (`read`/`commit`/`events`) and shapes the wire response. The adapter is the
23
- * single point of dispatch no per-model branching here.
17
+ * Serves one request from an ORM `adapter`, mapping each of the four operations to
18
+ * the adapter's `read`, `commit`, or `events` method and shaping the wire response.
19
+ * The adapter is the only dispatch point, so there is no per-model branching here.
24
20
  */
25
21
  async function handleViaAdapter(adapter, body, scope) {
26
22
  if (body.type === 'load') {
@@ -89,10 +85,9 @@ async function resolveApiKey(apiKey, context) {
89
85
  return typeof apiKey === 'function' ? apiKey(context) : apiKey;
90
86
  }
91
87
  /**
92
- * Map a wire request to its scope tag. Each request type corresponds
93
- * to one scope, so the function is total and exhaustive adding a
94
- * new request type forces a new scope tag, which is the right design
95
- * pressure for keeping the scope vocabulary in sync with the wire.
88
+ * Maps a wire request to the single scope it requires. The mapping is exhaustive,
89
+ * so a new request type must be given its own scope, keeping the scope vocabulary
90
+ * in step with the set of operations.
96
91
  */
97
92
  function scopeFor(body) {
98
93
  switch (body.type) {
@@ -129,12 +124,12 @@ function sameModel(operations) {
129
124
  return operations.every((op) => op.model === first) ? first : null;
130
125
  }
131
126
  /**
132
- * Create a customer-owned data source endpoint.
127
+ * Creates a Data Source endpoint you host in front of your own database.
133
128
  *
134
- * App code still talks to Ablo with `ablo.files.load/list/update`.
135
- * This helper is only for customers who keep canonical rows in their own
136
- * database and want Ablo Cloud to call a narrow, signed endpoint instead
137
- * of receiving database credentials.
129
+ * Your application code still reads and writes through Ablo, as in
130
+ * `ablo.files.load`, `.list`, and `.update`. This helper is for keeping the
131
+ * canonical rows in your database: Ablo calls a narrow, signed endpoint you
132
+ * control rather than holding your database credentials.
138
133
  */
139
134
  export function abloSource(options) {
140
135
  return async function handleAbloSource(request) {
@@ -180,9 +175,9 @@ export function abloSource(options) {
180
175
  const auth = options.authorize
181
176
  ? await options.authorize({ request, body, rawBody })
182
177
  : undefined;
183
- // Per-key permission scope check. When `resolveScopes` is set,
184
- // the customer returns the operation set this key is allowed to
185
- // invoke; we enforce before any model handler runs.
178
+ // Enforce the per-key scope. When `resolveScopes` is set, it returns the
179
+ // operations this key may invoke, and we check the request against that set
180
+ // before any model handler runs.
186
181
  if (options.resolveScopes) {
187
182
  const required = scopeFor(body);
188
183
  const granted = await options.resolveScopes({ auth, request, body });
@@ -202,9 +197,9 @@ export function abloSource(options) {
202
197
  signedAt: signature?.signedAt,
203
198
  ...(body.scope ? { scope: body.scope } : {}),
204
199
  };
205
- // Adapter path: when an ORM adapter is configured it serves every operation,
206
- // consumed at this generic layer (rows are JSON on the wire), so no per-model
207
- // handler lookup and no typed↔generic boundary.
200
+ // When an ORM adapter is configured it serves every operation here, at the
201
+ // generic layer where rows are plain JSON, so there is no per-model handler
202
+ // lookup on this path.
208
203
  if (options.adapter) {
209
204
  return handleViaAdapter(options.adapter, body, context.scope);
210
205
  }
@@ -1,21 +1,19 @@
1
1
  /**
2
- * `@abloatai/ablo/source` the Data Source barrel.
2
+ * The entry point for the Data Source API, re-exporting the pieces you need from
3
+ * their individual modules:
3
4
  *
4
- * Pure re-exports only: the implementation lives in cohesive leaf modules so
5
- * sibling source/* files (`pushQueue.ts`, `adapter.ts`, `contract.ts`, the ORM
6
- * adapters) import the leaves directly instead of routing a runtime circular
7
- * dependency through this barrel.
8
- *
9
- * - `types.ts` — shared wire/handler types + `sourceEventForOperation`
10
- * - `signing.ts` — Standard Webhooks request signing/verification
5
+ * - `types.ts` — the shared wire and handler types, plus `sourceEventForOperation`
6
+ * - `signing.ts` request signing and verification
11
7
  * - `factory.ts` — the `abloSource()` / `dataSource()` endpoint factory
8
+ *
9
+ * Import from here; the sibling modules import one another directly.
12
10
  */
13
11
  export { sourceEventForOperation, type SourcePrimitive, type SourceWhere, type SourceListQuery, type SourceListPage, type SourceListResult, type SourceRequestContext, type SourceOperation, type SourceDelta, type SourceEvent, type SourceEventForOperationOptions, type SourceCommitResult, type SourceCommitParams, type SourceScope, type SourceEventsResult, type SourceEventsHandler, type SourceAuthorizeContext, type SourceHandlerContext, type SourceModelHandlers, type SourceCommitHandler, type SourceApiKey, type SourceLoadRequest, type SourceListRequest, type SourceCommitRequest, type SourceEventsRequest, type SourceRequest, type SourceResponse, type DataSourcePrimitive, type DataSourceWhere, type DataSourceListQuery, type DataSourceListPage, type DataSourceListResult, type DataSourceRequestContext, type DataSourceOperation, type DataSourceDelta, type DataSourceEvent, type DataSourceEventForOperationOptions, type DataSourceCommitResult, type DataSourceCommitParams, type DataSourceScope, type DataSourceEventsResult, type DataSourceEventsHandler, type DataSourceAuthorizeContext, type DataSourceHandlerContext, type DataSourceModelHandlers, type DataSourceCommitHandler, type DataSourceApiKey, type DataSourceLoadRequest, type DataSourceListRequest, type DataSourceCommitRequest, type DataSourceEventsRequest, type DataSourceRequest, type DataSourceResponse, } from './types.js';
14
12
  export { ABLO_SOURCE_HEADERS, SourceSignatureError, signAbloSourceRequest, verifyAbloSourceRequest, type SourceSignatureOptions, type SourceSignatureVerificationOptions, type SourceSignatureVerificationResult, type DataSourceSignatureOptions, type DataSourceSignatureVerificationOptions, type DataSourceSignatureVerificationResult, } from './signing.js';
15
13
  export { abloSource, dataSource, type AbloSourceOptions, type DataSourceOptions, } from './factory.js';
16
14
  export { createPushQueue, InMemoryPushQueueStorage, STANDARD_WEBHOOKS_RETRY_SCHEDULE, type PushQueue, type PushQueueItem, type PushQueueOptions, type PushQueueStorage, } from './pushQueue.js';
17
15
  export { createSourceConnector, DEFAULT_RECONNECT_SCHEDULE, type SourceConnector, type SourceConnectorOptions, type ConnectorWebSocket, type ConnectorWebSocketFactory, type ConnectorStatus, } from './connector.js';
18
- export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, type ConnectorFrame, type RegisterFrame, type ReadyFrame, type RequestFrame, type ResponseFrame, type ErrorFrame, } from './connector-protocol.js';
16
+ export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, type ConnectorFrame, type RegisterFrame, type ReadyFrame, type RequestFrame, type ResponseFrame, type ErrorFrame, } from './connectorProtocol.js';
19
17
  export { type DataSourceAdapter, type AdapterReadRequest, type AdapterCommitResult, type Row as AdapterRow, } from './adapter.js';
20
18
  export { operationSchema, operationTypeSchema, changeSetSchema, outboxEventSchema, eventsPageSchema, migrationSchema, adapterCapabilitiesSchema, type Operation, type ChangeSet, type OutboxEvent, type EventsPage, type Migration, type AdapterCapabilities, } from './contract.js';
21
19
  export { prismaDataSource, type PrismaLike, type PrismaDataSourceOptions } from './adapters/prisma.js';
@@ -1,26 +1,24 @@
1
1
  /**
2
- * `@abloatai/ablo/source` the Data Source barrel.
2
+ * The entry point for the Data Source API, re-exporting the pieces you need from
3
+ * their individual modules:
3
4
  *
4
- * Pure re-exports only: the implementation lives in cohesive leaf modules so
5
- * sibling source/* files (`pushQueue.ts`, `adapter.ts`, `contract.ts`, the ORM
6
- * adapters) import the leaves directly instead of routing a runtime circular
7
- * dependency through this barrel.
8
- *
9
- * - `types.ts` — shared wire/handler types + `sourceEventForOperation`
10
- * - `signing.ts` — Standard Webhooks request signing/verification
5
+ * - `types.ts` — the shared wire and handler types, plus `sourceEventForOperation`
6
+ * - `signing.ts` request signing and verification
11
7
  * - `factory.ts` — the `abloSource()` / `dataSource()` endpoint factory
8
+ *
9
+ * Import from here; the sibling modules import one another directly.
12
10
  */
13
11
  export { sourceEventForOperation, } from './types.js';
14
12
  export { ABLO_SOURCE_HEADERS, SourceSignatureError, signAbloSourceRequest, verifyAbloSourceRequest, } from './signing.js';
15
13
  export { abloSource, dataSource, } from './factory.js';
16
14
  export { createPushQueue, InMemoryPushQueueStorage, STANDARD_WEBHOOKS_RETRY_SCHEDULE, } from './pushQueue.js';
17
- // ── Reverse-channel connector (outbound transport for the commit/load/list leg) ──
18
- // The dial-out counterpart to `createPushQueue`. Lets a customer serve Data
19
- // Source `commit`/`load`/`list` from localhost or a locked-down VPC with no
20
- // public inbound URL see `connector-protocol.ts`.
15
+ // The reverse-channel connector — an outbound transport for the load, list, and
16
+ // commit leg, and the dial-out counterpart to `createPushQueue`. It lets you serve
17
+ // a Data Source from localhost or a private network that has no public inbound
18
+ // URL. See `connectorProtocol.ts` for the frames it exchanges.
21
19
  export { createSourceConnector, DEFAULT_RECONNECT_SCHEDULE, } from './connector.js';
22
- export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, } from './connector-protocol.js';
23
- // ── Data Source adapter interface (Zod contract + one interface, per-ORM packages) ──
20
+ export { SOURCE_CONNECTOR_PROTOCOL_VERSION, SOURCE_CONNECTOR_WS_PATH, WS_SOURCE_SUBPROTOCOL, sourceConnectorSubprotocols, encodeFrame, decodeFrame, ConnectorProtocolError, connectorFrameSchema, } from './connectorProtocol.js';
21
+ // The Data Source adapter interface and its Zod contract, with per-ORM implementations.
24
22
  export {} from './adapter.js';
25
23
  export { operationSchema, operationTypeSchema, changeSetSchema, outboxEventSchema, eventsPageSchema, migrationSchema, adapterCapabilitiesSchema, } from './contract.js';
26
24
  export { prismaDataSource } from './adapters/prisma.js';
@@ -1,14 +1,14 @@
1
1
  /**
2
- * The table-creation SQL every ORM adapter ships for its OWN infrastructure tables —
3
- * `ablo_idempotency` (dedupe by clientTxId) and `ablo_outbox` (transactional
4
- * outbox the `events()` feed reads). Defined ONCE here so the Prisma adapter, the
5
- * Drizzle adapter, and `ablo migrate` can never disagree on the shape (they used
6
- * to inline their own copies, which had already drifted in whitespace).
2
+ * The table-creation SQL every ORM adapter ships for its own infrastructure
3
+ * tables: `ablo_idempotency`, which dedupes commits by `clientTxId`, and
4
+ * `ablo_outbox`, the transactional outbox the `events()` feed reads. Defining it in
5
+ * one place keeps the Prisma adapter, the Drizzle adapter, and `ablo migrate` in
6
+ * agreement on the exact shape.
7
7
  *
8
- * These are NOT model tables and are NOT emitted by the hosted provisioner
9
- * (`generateProvisionPlan`) the hosted path uses `sync_deltas` directly. They
10
- * exist only on a customer's own database in Data Source mode.
8
+ * These are infrastructure tables, not model tables, and they exist only on your
9
+ * own database when you run a Data Source. Ablo's hosted storage does not use them;
10
+ * it records changes in its own `sync_deltas` log instead.
11
11
  */
12
12
  import type { Migration } from './contract.js';
13
- /** Canonical adapter-owned table-creation SQL. Idempotent (`IF NOT EXISTS`). */
13
+ /** Returns the adapter's table-creation migrations. The SQL is idempotent, guarded by `IF NOT EXISTS`. */
14
14
  export declare function adapterTableMigrations(): readonly Migration[];
@@ -1,15 +1,15 @@
1
1
  /**
2
- * The table-creation SQL every ORM adapter ships for its OWN infrastructure tables —
3
- * `ablo_idempotency` (dedupe by clientTxId) and `ablo_outbox` (transactional
4
- * outbox the `events()` feed reads). Defined ONCE here so the Prisma adapter, the
5
- * Drizzle adapter, and `ablo migrate` can never disagree on the shape (they used
6
- * to inline their own copies, which had already drifted in whitespace).
2
+ * The table-creation SQL every ORM adapter ships for its own infrastructure
3
+ * tables: `ablo_idempotency`, which dedupes commits by `clientTxId`, and
4
+ * `ablo_outbox`, the transactional outbox the `events()` feed reads. Defining it in
5
+ * one place keeps the Prisma adapter, the Drizzle adapter, and `ablo migrate` in
6
+ * agreement on the exact shape.
7
7
  *
8
- * These are NOT model tables and are NOT emitted by the hosted provisioner
9
- * (`generateProvisionPlan`) the hosted path uses `sync_deltas` directly. They
10
- * exist only on a customer's own database in Data Source mode.
8
+ * These are infrastructure tables, not model tables, and they exist only on your
9
+ * own database when you run a Data Source. Ablo's hosted storage does not use them;
10
+ * it records changes in its own `sync_deltas` log instead.
11
11
  */
12
- /** Canonical adapter-owned table-creation SQL. Idempotent (`IF NOT EXISTS`). */
12
+ /** Returns the adapter's table-creation migrations. The SQL is idempotent, guarded by `IF NOT EXISTS`. */
13
13
  export function adapterTableMigrations() {
14
14
  return [
15
15
  {
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Next.js App Router adapter for Data Source. The core `dataSource()` already
3
- * returns a Web-standard `(Request) => Promise<Response>`, which Next App Router
4
- * accepts directly so this is pure ergonomics: wire an ORM `adapter` in via the
5
- * bridge and hand back a named `POST` so the customer's route file is the minimum:
2
+ * A thin Next.js App Router wrapper for a Data Source. The core `dataSource()`
3
+ * already returns a standard `(Request) => Promise<Response>`, which the App Router
4
+ * accepts directly, so this helper adds only convenience: it names the handler
5
+ * `POST` so your route file can export it in one line.
6
6
  *
7
7
  * // app/api/ablo/source/route.ts
8
8
  * import { dataSourceNext } from '@abloatai/ablo/source/next';
@@ -16,16 +16,15 @@
16
16
  * adapter: prismaDataSource(prisma, schema),
17
17
  * });
18
18
  *
19
- * Day-one scope: Next + the adapter form only. Hand-written handlers use the core
20
- * `dataSource()` directly; Hono/Express are the same one-liner and land on demand
21
- * — not pre-built.
19
+ * For hand-written handlers, or another framework, call the core `dataSource()`
20
+ * directly and export its result however that framework expects.
22
21
  */
23
22
  import type { SchemaRecord } from '../schema/schema.js';
24
23
  import { type DataSourceOptions } from './factory.js';
25
24
  /**
26
- * Next options ARE the core options — the `adapter` field lives on the core
27
- * handler now, so there is no bridging, no cast, and no per-model-typed boundary
28
- * at the call site. Pass `{ schema, apiKey, adapter }`.
25
+ * The options for `dataSourceNext`, which are exactly the core
26
+ * `DataSourceOptions`. Pass `{ schema, apiKey, adapter }`, the same shape
27
+ * `dataSource()` takes.
29
28
  */
30
29
  export type DataSourceNextOptions<S extends SchemaRecord, TAuth = unknown> = DataSourceOptions<S, TAuth>;
31
30
  export declare function dataSourceNext<const S extends SchemaRecord, TAuth = unknown>(options: DataSourceNextOptions<S, TAuth>): {
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Next.js App Router adapter for Data Source. The core `dataSource()` already
3
- * returns a Web-standard `(Request) => Promise<Response>`, which Next App Router
4
- * accepts directly so this is pure ergonomics: wire an ORM `adapter` in via the
5
- * bridge and hand back a named `POST` so the customer's route file is the minimum:
2
+ * A thin Next.js App Router wrapper for a Data Source. The core `dataSource()`
3
+ * already returns a standard `(Request) => Promise<Response>`, which the App Router
4
+ * accepts directly, so this helper adds only convenience: it names the handler
5
+ * `POST` so your route file can export it in one line.
6
6
  *
7
7
  * // app/api/ablo/source/route.ts
8
8
  * import { dataSourceNext } from '@abloatai/ablo/source/next';
@@ -16,9 +16,8 @@
16
16
  * adapter: prismaDataSource(prisma, schema),
17
17
  * });
18
18
  *
19
- * Day-one scope: Next + the adapter form only. Hand-written handlers use the core
20
- * `dataSource()` directly; Hono/Express are the same one-liner and land on demand
21
- * — not pre-built.
19
+ * For hand-written handlers, or another framework, call the core `dataSource()`
20
+ * directly and export its result however that framework expects.
22
21
  */
23
22
  import { dataSource } from './factory.js';
24
23
  export function dataSourceNext(options) {
@@ -1,100 +1,122 @@
1
1
  /**
2
- * Customer-side push retry queue.
2
+ * A durable retry queue for delivering source events to the server.
3
3
  *
4
- * The push path (`POST /api/source/events` on Ablo Cloud) acks
5
- * synchronously. If the customer's app crashes mid-call, the network
6
- * drops, or Ablo returns 5xx, those events would otherwise be lost
7
- * the poll path is the durability backstop, but it's higher
8
- * latency.
4
+ * When your application changes a row, it can push the resulting event to
5
+ * the server, which acknowledges delivery synchronously. If your process
6
+ * crashes mid-call, the network drops, or the server returns a 5xx, that
7
+ * event would be lost without a safety net. This queue is the safety net:
8
+ * it persists each event first, then delivers it from a background worker
9
+ * with automatic retries. (Polling the change feed is the slower fallback
10
+ * for anything the queue never manages to deliver.)
9
11
  *
10
- * `PushQueue` lives in the customer's process and gives them a
11
- * queue+worker pattern matching Stripe / Svix semantics:
12
+ * The queue follows a familiar enqueue-and-worker shape:
12
13
  *
13
- * - `enqueue(events)` returns immediately after persisting
14
- * - background worker delivers and retries per the Standard
15
- * Webhooks schedule (0, 5s, 5m, 30m, 2h, 5h, 10h, 14h, 20h, 24h
16
- * — ~3 days total)
17
- * - exhausted items move to DLQ for customer-owned monitoring
14
+ * - `enqueue(events)` returns as soon as the events are persisted.
15
+ * - A background worker delivers them and retries on failure, following
16
+ * the Standard Webhooks schedule (0, 5s, 5m, 30m, 2h, 5h, 10h, 14h,
17
+ * 20h, 24h roughly three days in total).
18
+ * - Items that exhaust every retry move to a dead-letter queue you can
19
+ * monitor.
18
20
  *
19
- * Persistence is pluggable `InMemoryPushQueueStorage` for single-
20
- * process customers, a SQL implementation against the customer's own
21
- * outbox table for production.
21
+ * Persistence is pluggable through {@link PushQueueStorage}. Use
22
+ * {@link InMemoryPushQueueStorage} for a single process, or implement that
23
+ * interface against your own outbox table for production durability.
22
24
  */
23
25
  import type { SourceEvent } from './types.js';
26
+ /** One queued delivery: a batch of source events plus its retry bookkeeping. */
24
27
  export interface PushQueueItem {
25
28
  readonly id: string;
26
29
  readonly events: readonly SourceEvent[];
27
30
  readonly attempts: number;
28
- /** Timestamp (ms) of the next attempt. Workers skip earlier items. */
31
+ /** When the next attempt is due, in epoch milliseconds. The worker skips items due later. */
29
32
  readonly nextAttemptAt: number;
30
- /** Most recent error message, when any attempt has failed. */
33
+ /** The most recent error message, set once an attempt has failed. */
31
34
  readonly lastError?: string;
32
- /** `dlq` once retries exhausted. */
35
+ /** `pending` while awaiting delivery, `delivered` on success, `dlq` once retries are exhausted. */
33
36
  readonly status: 'pending' | 'delivered' | 'dlq';
34
37
  }
38
+ /**
39
+ * The persistence behind a {@link PushQueue}. Implement it against your own
40
+ * durable table (or use {@link InMemoryPushQueueStorage}) so queued events
41
+ * survive a process restart. The queue calls these methods; you decide where
42
+ * the rows actually live.
43
+ */
35
44
  export interface PushQueueStorage {
36
45
  /**
37
- * Append a new item; returns the persisted record. Implementations
38
- * generate a stable id (used as the `webhook-id`) and set
39
- * `nextAttemptAt = now`.
46
+ * Append a new item and return the persisted record. Generate a stable id
47
+ * it doubles as the `webhook-id` on the delivered request — and set
48
+ * `nextAttemptAt` to the current time so the item is due immediately.
40
49
  */
41
50
  enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
42
- /** Items whose `nextAttemptAt <= now` and `status === 'pending'`. */
51
+ /** Return pending items whose `nextAttemptAt` is at or before `now`, up to `limit`. */
43
52
  due(now: number, limit: number): Promise<readonly PushQueueItem[]>;
44
- /** Bump attempt count + reschedule. */
53
+ /** Increase the attempt count and set the next attempt time after a failed delivery. */
45
54
  reschedule(id: string, nextAttemptAt: number, lastError: string): Promise<void>;
46
- /** Mark the item delivered (no further attempts). */
55
+ /** Mark the item delivered so no further attempts are made. */
47
56
  markDelivered(id: string): Promise<void>;
48
- /** Mark the item DLQ (retries exhausted). */
57
+ /** Move the item to the dead-letter queue after its retries are exhausted. */
49
58
  markDlq(id: string, lastError: string): Promise<void>;
50
- /** Read DLQ contents customer monitors this. */
59
+ /** Read the dead-letter queue. Your monitoring reads this to surface deliveries that never succeeded. */
51
60
  listDlq(): Promise<readonly PushQueueItem[]>;
52
61
  }
53
62
  /**
54
- * Standard Webhooks retry schedule. Index = attempt number; value =
55
- * delay-ms after the previous attempt. After the last entry, items
56
- * move to DLQ.
63
+ * The default retry schedule, taken from the Standard Webhooks
64
+ * specification. The index is the attempt number and the value is the delay
65
+ * in milliseconds after the previous attempt failed. Once an item runs off
66
+ * the end of this array, it moves to the dead-letter queue.
57
67
  *
58
- * Source: https://www.standardwebhooks.com/
68
+ * See https://www.standardwebhooks.com/.
59
69
  */
60
70
  export declare const STANDARD_WEBHOOKS_RETRY_SCHEDULE: readonly number[];
71
+ /** Configuration for {@link createPushQueue}. */
61
72
  export interface PushQueueOptions {
73
+ /** The URL the worker delivers events to. */
62
74
  readonly endpoint: string;
75
+ /** The API key used to sign each delivery. */
63
76
  readonly apiKey: string;
77
+ /** Where queued items are persisted. */
64
78
  readonly storage: PushQueueStorage;
65
79
  /**
66
- * Override the retry delays. Default: Standard Webhooks schedule.
67
- * The number of attempts equals the array length; the i-th entry
68
- * is the delay after attempt `i` failed.
80
+ * Override the retry delays. Defaults to {@link STANDARD_WEBHOOKS_RETRY_SCHEDULE}.
81
+ * The number of attempts equals the array length, and the i-th entry is the
82
+ * delay after attempt `i` failed.
69
83
  */
70
84
  readonly retrySchedule?: readonly number[];
71
- /** Worker poll interval. Default 1000ms. */
85
+ /** How often the worker checks for due items, in milliseconds. Defaults to 1000. */
72
86
  readonly tickIntervalMs?: number;
73
- /** Max items pulled per tick. Default 50. */
87
+ /** The most items the worker delivers per tick. Defaults to 50. */
74
88
  readonly batchSize?: number;
75
- /** Pluggable for tests / non-Node fetch impls. */
89
+ /** A custom fetch implementation, for tests or runtimes without a global `fetch`. */
76
90
  readonly fetch?: typeof fetch;
77
- /** Pluggable for tests. */
91
+ /** A custom clock source, mainly for tests. Defaults to `Date.now`. */
78
92
  readonly now?: () => number;
79
- /** Random jitter on retry delays. Default ±10%. Set to 0 to disable. */
93
+ /** Random jitter applied to each retry delay, as a fraction. Defaults to ±10%; set 0 to disable. */
80
94
  readonly jitter?: number;
95
+ /** Called when an item is dead-lettered or the worker loop hits an error. */
81
96
  readonly onError?: (item: PushQueueItem, err: unknown) => void;
82
97
  }
98
+ /** A running push queue: persist events, deliver them, and recover dead-lettered ones. */
83
99
  export interface PushQueue {
100
+ /** Persist a batch of events for delivery and return the queued item. */
84
101
  enqueue(events: readonly SourceEvent[]): Promise<PushQueueItem>;
85
- /** Run the worker loop until `signal` aborts. */
102
+ /** Run the delivery worker until `signal` aborts. */
86
103
  run(signal: AbortSignal): Promise<void>;
87
- /** Drain the DLQ by re-enqueueing — customer-triggered redrive. */
104
+ /**
105
+ * Re-enqueue every dead-lettered item for another round of delivery. Call
106
+ * this yourself once you have fixed whatever caused the failures. Returns
107
+ * the number of items re-enqueued.
108
+ */
88
109
  redriveDlq(): Promise<number>;
89
110
  }
111
+ /** Create a {@link PushQueue} from the given {@link PushQueueOptions}. */
90
112
  export declare function createPushQueue(options: PushQueueOptions): PushQueue;
113
+ /**
114
+ * A {@link PushQueueStorage} that keeps items in memory. It is not durable —
115
+ * items are lost when the process restarts — so it suits development and
116
+ * low-volume use. For production, implement {@link PushQueueStorage} against
117
+ * your own table.
118
+ */
91
119
  export declare class InMemoryPushQueueStorage implements PushQueueStorage {
92
- /**
93
- * Real implementation, not a mock. Suitable for low-volume single-
94
- * process customers; not durable across restarts (in-flight items
95
- * are lost). Production customers should swap in a SQL-backed
96
- * storage that writes to their existing outbox table.
97
- */
98
120
  private items;
99
121
  private nextId;
100
122
  private readonly now;