@abloatai/ablo 0.25.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 (425) hide show
  1. package/AGENTS.md +5 -3
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +104 -88
  4. package/dist/BaseSyncedStore.d.ts +140 -266
  5. package/dist/BaseSyncedStore.js +338 -739
  6. package/dist/Database.d.ts +62 -77
  7. package/dist/Database.js +106 -127
  8. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  9. package/dist/{ObjectPool.js → InstanceCache.js} +91 -83
  10. package/dist/LazyReferenceCollection.d.ts +11 -15
  11. package/dist/LazyReferenceCollection.js +16 -15
  12. package/dist/Model.d.ts +37 -52
  13. package/dist/Model.js +52 -69
  14. package/dist/ModelRegistry.d.ts +46 -25
  15. package/dist/ModelRegistry.js +32 -30
  16. package/dist/NetworkMonitor.d.ts +5 -6
  17. package/dist/NetworkMonitor.js +6 -7
  18. package/dist/SyncClient.d.ts +119 -109
  19. package/dist/SyncClient.js +303 -224
  20. package/dist/SyncEngineContext.d.ts +1 -3
  21. package/dist/SyncEngineContext.js +1 -2
  22. package/dist/adapters/alwaysOnline.d.ts +6 -8
  23. package/dist/adapters/alwaysOnline.js +6 -8
  24. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  25. package/dist/adapters/inMemoryStorage.js +9 -9
  26. package/dist/agent/Agent.d.ts +39 -31
  27. package/dist/agent/Agent.js +35 -23
  28. package/dist/agent/index.d.ts +4 -4
  29. package/dist/agent/index.js +5 -5
  30. package/dist/agent/session.d.ts +47 -44
  31. package/dist/agent/session.js +37 -48
  32. package/dist/agent/types.d.ts +26 -31
  33. package/dist/agent/types.js +6 -7
  34. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  35. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  36. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  37. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +30 -31
  38. package/dist/ai-sdk/index.d.ts +25 -22
  39. package/dist/ai-sdk/index.js +25 -22
  40. package/dist/ai-sdk/wrap.d.ts +7 -8
  41. package/dist/ai-sdk/wrap.js +2 -2
  42. package/dist/auth/credentialPolicy.d.ts +74 -71
  43. package/dist/auth/credentialPolicy.js +51 -56
  44. package/dist/auth/credentialSource.d.ts +7 -18
  45. package/dist/auth/credentialSource.js +10 -18
  46. package/dist/auth/index.d.ts +59 -58
  47. package/dist/auth/index.js +34 -40
  48. package/dist/auth/schemas.d.ts +5 -4
  49. package/dist/auth/schemas.js +5 -4
  50. package/dist/batching/index.d.ts +19 -21
  51. package/dist/batching/index.js +14 -17
  52. package/dist/cli.cjs +483 -369
  53. package/dist/client/Ablo.d.ts +107 -836
  54. package/dist/client/Ablo.js +174 -833
  55. package/dist/client/ApiClient.d.ts +44 -20
  56. package/dist/client/ApiClient.js +193 -44
  57. package/dist/client/auth.d.ts +51 -60
  58. package/dist/client/auth.js +137 -110
  59. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  60. package/dist/client/claimHeartbeatLoop.js +88 -0
  61. package/dist/client/consoleLogger.d.ts +35 -0
  62. package/dist/client/consoleLogger.js +44 -0
  63. package/dist/client/createInternalComponents.d.ts +14 -17
  64. package/dist/client/createInternalComponents.js +26 -31
  65. package/dist/client/createModelProxy.d.ts +130 -120
  66. package/dist/client/createModelProxy.js +158 -124
  67. package/dist/client/credentialEndpoint.d.ts +61 -0
  68. package/dist/client/credentialEndpoint.js +86 -0
  69. package/dist/client/functionalUpdate.d.ts +29 -27
  70. package/dist/client/functionalUpdate.js +21 -21
  71. package/dist/client/hostedEndpoints.d.ts +21 -0
  72. package/dist/client/hostedEndpoints.js +21 -0
  73. package/dist/client/httpClient.d.ts +58 -54
  74. package/dist/client/httpClient.js +29 -31
  75. package/dist/client/identity.d.ts +15 -20
  76. package/dist/client/identity.js +49 -59
  77. package/dist/client/modelRegistration.d.ts +10 -0
  78. package/dist/client/modelRegistration.js +301 -0
  79. package/dist/client/options.d.ts +373 -0
  80. package/dist/client/options.js +6 -0
  81. package/dist/client/registerDataSource.d.ts +9 -9
  82. package/dist/client/registerDataSource.js +15 -16
  83. package/dist/client/resourceTypes.d.ts +333 -0
  84. package/dist/client/resourceTypes.js +7 -0
  85. package/dist/client/schemaConfig.d.ts +44 -0
  86. package/dist/client/schemaConfig.js +176 -0
  87. package/dist/client/sessionMint.d.ts +17 -13
  88. package/dist/client/sessionMint.js +26 -31
  89. package/dist/client/validateAbloOptions.d.ts +12 -14
  90. package/dist/client/validateAbloOptions.js +9 -10
  91. package/dist/client/writeOptionsSchema.d.ts +18 -16
  92. package/dist/client/writeOptionsSchema.js +23 -20
  93. package/dist/client/wsMutationExecutor.d.ts +28 -0
  94. package/dist/client/wsMutationExecutor.js +71 -0
  95. package/dist/context.d.ts +6 -4
  96. package/dist/context.js +6 -7
  97. package/dist/coordination/index.d.ts +13 -4
  98. package/dist/coordination/index.js +29 -4
  99. package/dist/coordination/schema.d.ts +176 -128
  100. package/dist/coordination/schema.js +197 -133
  101. package/dist/coordination/trace.d.ts +9 -11
  102. package/dist/coordination/trace.js +13 -15
  103. package/dist/core/DatabaseManager.d.ts +5 -8
  104. package/dist/core/DatabaseManager.js +38 -40
  105. package/dist/core/QueryProcessor.d.ts +7 -9
  106. package/dist/core/QueryProcessor.js +27 -34
  107. package/dist/core/QueryView.d.ts +17 -5
  108. package/dist/core/QueryView.js +6 -7
  109. package/dist/core/StoreManager.d.ts +14 -16
  110. package/dist/core/StoreManager.js +26 -25
  111. package/dist/core/ViewRegistry.d.ts +5 -5
  112. package/dist/core/ViewRegistry.js +4 -4
  113. package/dist/core/index.d.ts +18 -13
  114. package/dist/core/index.js +32 -26
  115. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  116. package/dist/core/openIDBWithTimeout.js +57 -54
  117. package/dist/core/queryUtils.d.ts +45 -0
  118. package/dist/core/queryUtils.js +69 -0
  119. package/dist/core/storeContract.d.ts +145 -0
  120. package/dist/core/storeContract.js +12 -0
  121. package/dist/environment.d.ts +28 -0
  122. package/dist/environment.js +21 -0
  123. package/dist/errorCodes.d.ts +118 -101
  124. package/dist/errorCodes.js +277 -260
  125. package/dist/errors.d.ts +170 -165
  126. package/dist/errors.js +161 -151
  127. package/dist/index.d.ts +30 -27
  128. package/dist/index.js +90 -82
  129. package/dist/interfaces/index.d.ts +108 -133
  130. package/dist/interfaces/index.js +5 -4
  131. package/dist/keys/index.d.ts +27 -29
  132. package/dist/keys/index.js +59 -49
  133. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  134. package/dist/mutators/RecordingTransaction.js +31 -37
  135. package/dist/mutators/Transaction.d.ts +18 -26
  136. package/dist/mutators/Transaction.js +14 -20
  137. package/dist/mutators/UndoManager.d.ts +122 -131
  138. package/dist/mutators/UndoManager.js +149 -155
  139. package/dist/mutators/defineMutators.d.ts +24 -37
  140. package/dist/mutators/defineMutators.js +14 -20
  141. package/dist/mutators/inverseOp.d.ts +12 -15
  142. package/dist/mutators/inverseOp.js +12 -15
  143. package/dist/mutators/mutateActions.d.ts +10 -9
  144. package/dist/mutators/mutateActions.js +1 -1
  145. package/dist/mutators/readerActions.d.ts +9 -8
  146. package/dist/mutators/readerActions.js +2 -2
  147. package/dist/mutators/undoApply.d.ts +31 -27
  148. package/dist/mutators/undoApply.js +26 -24
  149. package/dist/policy/index.d.ts +5 -3
  150. package/dist/policy/index.js +5 -3
  151. package/dist/policy/types.d.ts +105 -101
  152. package/dist/policy/types.js +67 -66
  153. package/dist/query/client.d.ts +32 -16
  154. package/dist/query/client.js +103 -72
  155. package/dist/query/types.d.ts +37 -60
  156. package/dist/query/types.js +13 -33
  157. package/dist/react/AbloProvider.d.ts +7 -11
  158. package/dist/react/AbloProvider.js +24 -17
  159. package/dist/react/context.d.ts +27 -146
  160. package/dist/react/context.js +9 -10
  161. package/dist/react/index.d.ts +41 -42
  162. package/dist/react/index.js +37 -38
  163. package/dist/react/internalContext.d.ts +17 -19
  164. package/dist/react/useAblo.d.ts +23 -22
  165. package/dist/react/useAblo.js +17 -15
  166. package/dist/react/useCurrentUserId.d.ts +8 -7
  167. package/dist/react/useCurrentUserId.js +8 -7
  168. package/dist/react/useErrorListener.d.ts +7 -7
  169. package/dist/react/useErrorListener.js +11 -12
  170. package/dist/react/useMutationFailureListener.d.ts +8 -8
  171. package/dist/react/useMutationFailureListener.js +9 -9
  172. package/dist/react/useMutators.d.ts +11 -11
  173. package/dist/react/useMutators.js +10 -4
  174. package/dist/react/useReactive.js +2 -3
  175. package/dist/react/useSyncStatus.d.ts +4 -6
  176. package/dist/react/useUndoScope.d.ts +7 -9
  177. package/dist/react/useUndoScope.js +3 -3
  178. package/dist/schema/coordination.d.ts +21 -25
  179. package/dist/schema/coordination.js +21 -25
  180. package/dist/schema/ddl.d.ts +43 -39
  181. package/dist/schema/ddl.js +75 -68
  182. package/dist/schema/ddlLock.d.ts +35 -0
  183. package/dist/schema/ddlLock.js +46 -0
  184. package/dist/schema/diff.d.ts +99 -61
  185. package/dist/schema/diff.js +43 -34
  186. package/dist/schema/field.d.ts +37 -42
  187. package/dist/schema/field.js +36 -49
  188. package/dist/schema/generate.d.ts +12 -12
  189. package/dist/schema/generate.js +12 -12
  190. package/dist/schema/index.d.ts +5 -4
  191. package/dist/schema/index.js +29 -21
  192. package/dist/schema/model.d.ts +121 -146
  193. package/dist/schema/model.js +24 -35
  194. package/dist/schema/openapi.d.ts +10 -9
  195. package/dist/schema/openapi.js +7 -1
  196. package/dist/schema/queries.d.ts +30 -32
  197. package/dist/schema/queries.js +24 -25
  198. package/dist/schema/relation.d.ts +89 -99
  199. package/dist/schema/relation.js +13 -13
  200. package/dist/schema/residency.d.ts +38 -0
  201. package/dist/schema/residency.js +30 -0
  202. package/dist/schema/roles.d.ts +45 -27
  203. package/dist/schema/roles.js +52 -21
  204. package/dist/schema/schema.d.ts +36 -45
  205. package/dist/schema/schema.js +42 -39
  206. package/dist/schema/select.d.ts +13 -13
  207. package/dist/schema/select.js +13 -13
  208. package/dist/schema/serialize.d.ts +36 -39
  209. package/dist/schema/serialize.js +27 -31
  210. package/dist/schema/sugar.d.ts +17 -32
  211. package/dist/schema/sugar.js +14 -29
  212. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +27 -50
  213. package/dist/schema/syncDeltaRow.js +89 -0
  214. package/dist/schema/tenancy.d.ts +44 -46
  215. package/dist/schema/tenancy.js +46 -48
  216. package/dist/server/adapter.d.ts +58 -58
  217. package/dist/server/adapter.js +13 -14
  218. package/dist/server/commit.d.ts +60 -64
  219. package/dist/server/index.d.ts +9 -10
  220. package/dist/server/index.js +1 -1
  221. package/dist/server/readConfig.d.ts +70 -0
  222. package/dist/server/readConfig.js +8 -0
  223. package/dist/server/storageMode.d.ts +23 -0
  224. package/dist/server/storageMode.js +17 -0
  225. package/dist/source/adapter.d.ts +31 -26
  226. package/dist/source/adapter.js +10 -10
  227. package/dist/source/adapters/drizzle.d.ts +28 -23
  228. package/dist/source/adapters/drizzle.js +34 -28
  229. package/dist/source/adapters/kysely.d.ts +27 -25
  230. package/dist/source/adapters/kysely.js +28 -26
  231. package/dist/source/adapters/memory.d.ts +8 -7
  232. package/dist/source/adapters/memory.js +10 -9
  233. package/dist/source/adapters/prisma.d.ts +13 -12
  234. package/dist/source/adapters/prisma.js +27 -29
  235. package/dist/source/conformance.d.ts +18 -11
  236. package/dist/source/conformance.js +27 -19
  237. package/dist/source/connector.d.ts +31 -32
  238. package/dist/source/connector.js +30 -28
  239. package/dist/source/connectorProtocol.d.ts +160 -0
  240. package/dist/source/connectorProtocol.js +162 -0
  241. package/dist/source/contract.d.ts +26 -27
  242. package/dist/source/contract.js +28 -29
  243. package/dist/source/factory.d.ts +94 -0
  244. package/dist/source/factory.js +268 -0
  245. package/dist/source/index.d.ts +10 -462
  246. package/dist/source/index.js +17 -421
  247. package/dist/source/migrations.d.ts +9 -9
  248. package/dist/source/migrations.js +9 -9
  249. package/dist/source/next.d.ts +10 -11
  250. package/dist/source/next.js +7 -8
  251. package/dist/source/pushQueue.d.ts +70 -48
  252. package/dist/source/pushQueue.js +36 -29
  253. package/dist/source/signing.d.ts +88 -0
  254. package/dist/source/signing.js +159 -0
  255. package/dist/source/types.d.ts +351 -0
  256. package/dist/source/types.js +43 -0
  257. package/dist/stores/ObjectStore.d.ts +11 -12
  258. package/dist/stores/ObjectStore.js +34 -35
  259. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  260. package/dist/stores/SyncActionStore.d.ts +8 -12
  261. package/dist/stores/SyncActionStore.js +77 -46
  262. package/dist/surface.d.ts +28 -21
  263. package/dist/surface.js +28 -20
  264. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +37 -45
  265. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +101 -80
  266. package/dist/sync/ConnectionManager.d.ts +47 -50
  267. package/dist/sync/ConnectionManager.js +74 -70
  268. package/dist/sync/NetworkProbe.d.ts +27 -31
  269. package/dist/sync/NetworkProbe.js +67 -72
  270. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +49 -36
  271. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +79 -54
  272. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +45 -59
  273. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +44 -52
  274. package/dist/sync/SyncWebSocket.d.ts +175 -250
  275. package/dist/sync/SyncWebSocket.js +431 -769
  276. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  277. package/dist/sync/awaitClaimGrant.js +38 -30
  278. package/dist/sync/bootstrapApply.d.ts +70 -0
  279. package/dist/sync/bootstrapApply.js +73 -0
  280. package/dist/sync/commitFrames.d.ts +44 -0
  281. package/dist/sync/commitFrames.js +94 -0
  282. package/dist/sync/createClaimStream.d.ts +23 -22
  283. package/dist/sync/createClaimStream.js +108 -25
  284. package/dist/sync/createPresenceStream.d.ts +19 -18
  285. package/dist/sync/createPresenceStream.js +25 -26
  286. package/dist/sync/createSnapshot.d.ts +13 -17
  287. package/dist/sync/createSnapshot.js +20 -26
  288. package/dist/sync/credentialLifecycle.d.ts +175 -0
  289. package/dist/sync/credentialLifecycle.js +322 -0
  290. package/dist/sync/deltaPipeline.d.ts +113 -0
  291. package/dist/sync/deltaPipeline.js +261 -0
  292. package/dist/sync/groupChange.d.ts +113 -0
  293. package/dist/sync/groupChange.js +242 -0
  294. package/dist/sync/heartbeat.d.ts +63 -0
  295. package/dist/sync/heartbeat.js +91 -0
  296. package/dist/sync/participants.d.ts +27 -27
  297. package/dist/sync/schemas.d.ts +3 -2
  298. package/dist/sync/schemas.js +14 -10
  299. package/dist/sync/syncCursor.d.ts +40 -0
  300. package/dist/sync/syncCursor.js +55 -0
  301. package/dist/sync/syncPlan.d.ts +54 -0
  302. package/dist/sync/syncPlan.js +50 -0
  303. package/dist/sync/syncPosition.d.ts +54 -49
  304. package/dist/sync/syncPosition.js +57 -52
  305. package/dist/sync/wsFrameHandlers.d.ts +116 -0
  306. package/dist/sync/wsFrameHandlers.js +374 -0
  307. package/dist/testing/fixtures/bootstrap.d.ts +21 -17
  308. package/dist/testing/fixtures/bootstrap.js +12 -6
  309. package/dist/testing/fixtures/deltas.d.ts +31 -34
  310. package/dist/testing/fixtures/deltas.js +30 -33
  311. package/dist/testing/fixtures/models.d.ts +11 -10
  312. package/dist/testing/fixtures/models.js +12 -10
  313. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  314. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  315. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -18
  316. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +14 -11
  317. package/dist/testing/helpers/wait.d.ts +13 -8
  318. package/dist/testing/helpers/wait.js +13 -8
  319. package/dist/testing/index.d.ts +4 -4
  320. package/dist/testing/index.js +3 -3
  321. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  322. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  323. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  324. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  325. package/dist/testing/mocks/MockSyncContext.d.ts +21 -34
  326. package/dist/testing/mocks/MockSyncContext.js +16 -45
  327. package/dist/testing/mocks/MockSyncStore.d.ts +14 -14
  328. package/dist/testing/mocks/MockSyncStore.js +11 -11
  329. package/dist/testing/mocks/MockWebSocket.d.ts +28 -24
  330. package/dist/testing/mocks/MockWebSocket.js +22 -21
  331. package/dist/transactions/TransactionQueue.d.ts +190 -221
  332. package/dist/transactions/TransactionQueue.js +424 -822
  333. package/dist/transactions/TransactionStore.d.ts +20 -0
  334. package/dist/transactions/TransactionStore.js +53 -0
  335. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  336. package/dist/transactions/UnconfirmedWrites.js +104 -0
  337. package/dist/transactions/coalesceRules.d.ts +58 -0
  338. package/dist/transactions/coalesceRules.js +140 -0
  339. package/dist/transactions/commitPayload.d.ts +130 -0
  340. package/dist/transactions/commitPayload.js +143 -0
  341. package/dist/transactions/deltaConfirmation.d.ts +58 -0
  342. package/dist/transactions/deltaConfirmation.js +215 -0
  343. package/dist/transactions/optimisticApply.d.ts +49 -0
  344. package/dist/transactions/optimisticApply.js +65 -0
  345. package/dist/transactions/replayValidation.d.ts +99 -0
  346. package/dist/transactions/replayValidation.js +111 -0
  347. package/dist/types/global.d.ts +46 -41
  348. package/dist/types/global.js +20 -19
  349. package/dist/types/index.d.ts +74 -80
  350. package/dist/types/index.js +22 -27
  351. package/dist/types/modelData.d.ts +10 -0
  352. package/dist/types/modelData.js +9 -0
  353. package/dist/types/participant.d.ts +20 -0
  354. package/dist/types/participant.js +10 -0
  355. package/dist/types/streams.d.ts +216 -209
  356. package/dist/types/streams.js +7 -7
  357. package/dist/utils/asyncIterator.d.ts +25 -32
  358. package/dist/utils/asyncIterator.js +25 -32
  359. package/dist/utils/duration.d.ts +12 -15
  360. package/dist/utils/duration.js +12 -15
  361. package/dist/utils/mobxSetup.d.ts +53 -0
  362. package/dist/utils/{mobx-setup.js → mobxSetup.js} +44 -100
  363. package/dist/webhooks/events.d.ts +21 -16
  364. package/dist/webhooks/events.js +10 -8
  365. package/dist/webhooks/index.d.ts +5 -7
  366. package/dist/webhooks/index.js +5 -7
  367. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  368. package/dist/wire/delta.js +114 -0
  369. package/dist/wire/errorEnvelope.d.ts +35 -27
  370. package/dist/wire/errorEnvelope.js +38 -32
  371. package/dist/wire/frames.d.ts +150 -67
  372. package/dist/wire/frames.js +48 -1
  373. package/dist/wire/index.d.ts +18 -13
  374. package/dist/wire/index.js +36 -13
  375. package/dist/wire/listEnvelope.d.ts +16 -23
  376. package/dist/wire/listEnvelope.js +7 -6
  377. package/dist/wire/protocol.d.ts +38 -0
  378. package/dist/wire/protocol.js +38 -0
  379. package/dist/wire/protocolVersion.d.ts +60 -0
  380. package/dist/wire/protocolVersion.js +67 -0
  381. package/docs/api-keys.md +4 -3
  382. package/docs/coordination.md +59 -0
  383. package/docs/examples/existing-python-backend.md +3 -3
  384. package/docs/identity.md +4 -4
  385. package/docs/integration-guide.md +1 -1
  386. package/docs/react.md +1 -1
  387. package/docs/sessions.md +5 -7
  388. package/package.json +24 -21
  389. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  390. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  391. package/dist/client/index.d.ts +0 -36
  392. package/dist/client/index.js +0 -33
  393. package/dist/config/index.d.ts +0 -10
  394. package/dist/config/index.js +0 -12
  395. package/dist/core/query-utils.d.ts +0 -34
  396. package/dist/core/query-utils.js +0 -59
  397. package/dist/interfaces/headless.d.ts +0 -95
  398. package/dist/interfaces/headless.js +0 -41
  399. package/dist/query/index.d.ts +0 -6
  400. package/dist/query/index.js +0 -5
  401. package/dist/realtime/index.d.ts +0 -10
  402. package/dist/realtime/index.js +0 -9
  403. package/dist/schema/plane.d.ts +0 -23
  404. package/dist/schema/plane.js +0 -19
  405. package/dist/schema/sync-delta-row.js +0 -103
  406. package/dist/schema/sync-delta-wire.js +0 -102
  407. package/dist/server/next.d.ts +0 -51
  408. package/dist/server/next.js +0 -47
  409. package/dist/server/read-config.d.ts +0 -67
  410. package/dist/server/read-config.js +0 -8
  411. package/dist/server/storage-mode.d.ts +0 -1
  412. package/dist/server/storage-mode.js +0 -18
  413. package/dist/source/connector-protocol.d.ts +0 -159
  414. package/dist/source/connector-protocol.js +0 -161
  415. package/dist/sync/OfflineFlush.d.ts +0 -9
  416. package/dist/sync/OfflineFlush.js +0 -22
  417. package/dist/sync/OfflineTransactionStore.d.ts +0 -37
  418. package/dist/sync/OfflineTransactionStore.js +0 -263
  419. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  420. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  421. package/dist/transactions/index.d.ts +0 -16
  422. package/dist/transactions/index.js +0 -7
  423. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  424. package/dist/transactions/mutation-error-handler.js +0 -39
  425. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,24 +1,16 @@
1
1
  /**
2
- * Single mutable source for the SDK's active bearer credential.
2
+ * The single mutable holder for the active bearer credential every transport
3
+ * uses.
3
4
  *
4
- * Every transport should read from this object at request/connect time:
5
- * bootstrap HTTP, lazy query HTTP, identity/probe HTTP, and WebSocket URL
6
- * auth. Token refresh writes here once; consumers observe the new value
7
- * through their getter without being manually patched one by one.
5
+ * Each transport reads the current token from this object at request or connect
6
+ * time the HTTP request paths and the WebSocket URL authorizer alike. When the
7
+ * token is refreshed, it is written here once, and every reader observes the new
8
+ * value through its getter rather than being updated one by one.
8
9
  */
9
- /**
10
- * WebSocket subprotocols used to carry the bearer credential OUT of the URL.
11
- *
12
- * Browsers cannot set an `Authorization` header on a WebSocket, so the SDK
13
- * offers the token as a `Sec-WebSocket-Protocol` value — `ablo.bearer.<token>` —
14
- * alongside the real `ablo.sync.v1` protocol the server selects. This keeps the
15
- * credential out of the query string, which ALB access logs, proxies, and
16
- * browser history capture. The server reads the token from the subprotocol and
17
- * echoes back ONLY `ablo.sync.v1`, never the token-bearing value. Shared with
18
- * the sync-server so client and server can never drift on the wire format.
19
- */
20
- export const WS_BEARER_SUBPROTOCOL_PREFIX = 'ablo.bearer.';
21
- export const WS_SYNC_SUBPROTOCOL = 'ablo.sync.v1';
10
+ // The WebSocket bearer-subprotocol constants are defined in `../wire/protocol.js`
11
+ // as part of the wire contract shared between client and server. They are
12
+ // re-exported here so this module stays a stable import site for them.
13
+ export { WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL } from '../wire/protocol.js';
22
14
  export function createAuthCredentialSource(initialToken) {
23
15
  let authToken = normalizeToken(initialToken);
24
16
  return {
@@ -1,15 +1,12 @@
1
1
  /**
2
- * Internal apiKey capability exchange.
2
+ * Exchanges an API key for a capability token and the scope it grants.
3
3
  *
4
- * Called by the `Ablo({...})` factory's `ready()` flow when the
5
- * consumer passed `apiKey` without an explicit `capabilityToken` /
6
- * `organizationId` / `user.id`. SDK calls `/auth/capability` once,
7
- * server returns the scope + userMeta blobs (Phases 1A + 1B),
8
- * SDK populates internal state from the response.
9
- *
10
- * Consumer never sees this happen. Same shape as Stripe / Anthropic
11
- * SDKs hide their internal auth-handshake — the apiKey is the only
12
- * credential the consumer touches.
4
+ * The `Ablo({...})` factory calls this during startup when you provide an
5
+ * `apiKey` but no explicit capability token, organization, or user identity. It
6
+ * sends one `POST /auth/capability` request; the server responds with the
7
+ * granted scope and any user metadata, which the client uses to populate its
8
+ * session state. The API key is the only credential you handle directly — this
9
+ * exchange happens automatically behind it.
13
10
  */
14
11
  import { type CapabilityExchangeResponse, type EphemeralKeyResponse, type IdentityResolveResponse } from './schemas.js';
15
12
  export type { CapabilityExchangeResponse, EphemeralKeyResponse, IdentityResolveResponse, } from './schemas.js';
@@ -28,24 +25,27 @@ export interface ExchangeApiKeyRequest {
28
25
  }
29
26
  export declare function exchangeApiKey(options: ExchangeApiKeyRequest): Promise<CapabilityExchangeResponse>;
30
27
  export interface MintUserSessionRequest {
31
- /** The ORIGINAL secret (`sk_`) key control-plane calls always present it,
32
- * never the exchanged sync credential. */
28
+ /** Your secret API key (an `sk_` key). Minting a session is a server-side
29
+ * operation, so it always presents the secret key, never a token derived
30
+ * from it. */
33
31
  readonly apiKey: string;
34
32
  readonly baseUrl: string;
35
- /** The end user's external IdP id becomes the session's `participantId`. */
33
+ /** The end user's identifier in your identity provider. It becomes the
34
+ * session's `participantId`. */
36
35
  readonly userId: string;
37
- /** Target org for a cross-org (platform) mint the Stripe-Connect
38
- * `Stripe-Account` analogue. Requires the `sk_` to carry
39
- * `ephemeral:mint-any-org`; omit to mint into the key's own org. */
36
+ /** The organization to mint the session into, for a platform that manages many
37
+ * organizations. Requires the secret key to carry the `ephemeral:mint-any-org`
38
+ * capability. Omit to mint into the key's own organization. */
40
39
  readonly organizationId?: string;
41
- /** SHARED SCHEMA — point this session's SCHEMA at the project that owns it,
42
- * while its DATA stays scoped to `organizationId`. Use this for org-per-customer
43
- * isolation: keep one schema project, and every customer's session resolves its
44
- * schema from it instead of re-pushing the schema into each customer's org.
45
- * Requires the `sk_` to carry `ephemeral:mint-any-org`. Omit for the default
46
- * (the session resolves its schema from its own org). */
40
+ /** Points this session's schema at a shared project while its data stays scoped
41
+ * to `organizationId`. Use this when each customer has its own organization but
42
+ * they all share one schema: keep a single schema project, and every customer's
43
+ * session resolves its schema from it instead of pushing the schema into each
44
+ * organization separately. Requires the secret key to carry the
45
+ * `ephemeral:mint-any-org` capability. Omit to resolve the schema from the
46
+ * session's own organization. */
47
47
  readonly schemaProject?: {
48
- /** The org that owns the schema project. */
48
+ /** The organization that owns the shared schema project. */
49
49
  readonly organizationId: string;
50
50
  /** The project the schema was pushed under. */
51
51
  readonly projectId: string;
@@ -57,13 +57,13 @@ export interface MintUserSessionRequest {
57
57
  readonly timeoutMs?: number;
58
58
  }
59
59
  /**
60
- * Mint an END-USER session key (`ek_`) via `POST /auth/ephemeral-keys` — the
61
- * sk_-gated user-session door. This is deliberately a DIFFERENT endpoint from
62
- * `/auth/capability`: that route can never mint humans (its
63
- * `invalid_participant_kind` gate is what fired in the 2026-06-11 Pulse
64
- * cascade, when `sessions.create({ user })` was funneled through the agent
65
- * door). The server trusts the `ek_` because a secret key minted it; the
66
- * browser presents it as its bearer.
60
+ * Mints an end-user session key (an `ek_` key) by calling
61
+ * `POST /auth/ephemeral-keys`, using your secret key as authorization. Your
62
+ * backend calls this to issue a session that a browser can present as its bearer
63
+ * credential; the server trusts the resulting key because a secret key minted it.
64
+ *
65
+ * This is a distinct endpoint from `/auth/capability`, which exchanges keys for
66
+ * agents and systems and cannot mint sessions for human users.
67
67
  */
68
68
  export declare function mintUserSessionKey(options: MintUserSessionRequest): Promise<EphemeralKeyResponse>;
69
69
  export interface ResolveIdentityRequest {
@@ -73,46 +73,47 @@ export interface ResolveIdentityRequest {
73
73
  readonly timeoutMs?: number;
74
74
  }
75
75
  /**
76
- * Resolve the caller's Ablo identity from the authenticated request
77
- * context. Used by browser/session/capability flows where the SDK should
78
- * not require a public `userId` prop just to open local storage.
76
+ * Resolves the caller's identity from an authenticated request by calling
77
+ * `GET /auth/identity`. This lets browser and session flows learn who the
78
+ * current user is without requiring the application to pass a user id up front —
79
+ * for example, to key local storage.
79
80
  */
80
81
  export declare function resolveIdentity(options: ResolveIdentityRequest): Promise<IdentityResolveResponse>;
81
82
  /**
82
- * Capability-token refresh scheduler.
83
+ * Keeps a capability token fresh so a long-lived client never disconnects when
84
+ * its token expires.
83
85
  *
84
- * Long-lived `@abloatai/ablo` clients hold a server-issued capability
85
- * token whose TTL (1h default) is shorter than typical browser sessions.
86
- * Without proactive refresh, the WebSocket would either be force-closed
87
- * by the server at expiry (code 1008) or fail its next reconnect with
88
- * 401. Either way the user sees a mid-session disconnect.
86
+ * A capability token has a shorter lifetime — one hour by default — than a
87
+ * typical browser session. Without a refresh, the WebSocket is force-closed at
88
+ * expiry (close code 1008) or the next reconnect fails with a 401, and either way
89
+ * the user sees a mid-session disconnect. The scheduler prevents that by
90
+ * re-minting the token ahead of time.
89
91
  *
90
- * This scheduler keeps the token fresh transparently. Three triggers,
91
- * one refresh path:
92
+ * Three triggers share one refresh path:
92
93
  *
93
- * 1. Proactive — `setTimeout` for `(expiresAtMs - bufferMs - now)`.
94
- * 2. Visibility — on `document.visibilitychange→visible`, if the
95
- * token is within the buffer window, refresh now.
96
- * Defends against dormant-tab `setTimeout` throttling.
97
- * 3. Reactive — caller invokes `.refreshNow()` on observed auth
98
- * failure (WS close 1008/4001 etc).
94
+ * 1. Proactive — a timer set for `expiresAtMs - bufferMs - now`.
95
+ * 2. Visibility — when a hidden tab becomes visible and the token is already
96
+ * within the buffer window, refresh immediately. This covers a
97
+ * background tab whose timers were throttled while it was idle.
98
+ * 3. Reactive — the caller invokes {@link RefreshScheduler.refreshNow} after
99
+ * observing an auth failure, such as a WebSocket close 1008 or
100
+ * 4001.
99
101
  *
100
- * All three resolve through the same `inFlight` promise so concurrent
101
- * triggers don't double-mint. On any successful refresh the new
102
- * `expiresAtMs` is captured and trigger 1 is rescheduled.
102
+ * All three await the same in-flight promise, so concurrent triggers mint the
103
+ * token only once. Each successful refresh records the new expiry and reschedules
104
+ * the proactive timer.
103
105
  *
104
- * Buffer policy: `max(60s, ttl/10)` — for a 1h TTL that's 360s, which
105
- * matches the AWS SDK / MSAL.js de-facto 5-minute standard while
106
- * scaling sensibly for shorter TTLs.
106
+ * The refresh margin is `max(60s, ttl/10)` — six minutes for a one-hour token,
107
+ * and it scales down for shorter lifetimes.
107
108
  */
108
109
  export interface RefreshSchedulerOptions {
109
110
  /** Initial absolute expiry, ms since epoch (server-supplied). */
110
111
  readonly initialExpiresAtMs: number;
111
112
  /**
112
- * Performs the actual exchange. Returns the new expiry. Errors
113
- * propagate to `onError`; the scheduler stays alive and retries on
114
- * next trigger (no exponential backoff in v1 most failures here are
115
- * the user's apiKey being revoked, in which case retrying is futile).
113
+ * Performs the token exchange and returns the new expiry. Errors propagate to
114
+ * `onError`; the scheduler stays alive and retries on its next trigger. It does
115
+ * not back off between retries, since the common failure here is a revoked API
116
+ * key, for which retrying would not help.
116
117
  */
117
118
  readonly refresh: () => Promise<{
118
119
  expiresAtMs: number;
@@ -133,7 +134,7 @@ export interface RefreshSchedulerOptions {
133
134
  * If true, install a `visibilitychange` listener on `document` that
134
135
  * triggers a refresh when the tab becomes visible and the token is
135
136
  * within the buffer window. No-op if `document` is undefined (Node).
136
- * Default: true in browser-ish environments.
137
+ * Default: true in browser environments.
137
138
  */
138
139
  readonly attachVisibilityListener?: boolean;
139
140
  /** Time source. Override in tests; defaults to `Date.now`. */
@@ -1,15 +1,12 @@
1
1
  /**
2
- * Internal apiKey capability exchange.
2
+ * Exchanges an API key for a capability token and the scope it grants.
3
3
  *
4
- * Called by the `Ablo({...})` factory's `ready()` flow when the
5
- * consumer passed `apiKey` without an explicit `capabilityToken` /
6
- * `organizationId` / `user.id`. SDK calls `/auth/capability` once,
7
- * server returns the scope + userMeta blobs (Phases 1A + 1B),
8
- * SDK populates internal state from the response.
9
- *
10
- * Consumer never sees this happen. Same shape as Stripe / Anthropic
11
- * SDKs hide their internal auth-handshake — the apiKey is the only
12
- * credential the consumer touches.
4
+ * The `Ablo({...})` factory calls this during startup when you provide an
5
+ * `apiKey` but no explicit capability token, organization, or user identity. It
6
+ * sends one `POST /auth/capability` request; the server responds with the
7
+ * granted scope and any user metadata, which the client uses to populate its
8
+ * session state. The API key is the only credential you handle directly — this
9
+ * exchange happens automatically behind it.
13
10
  */
14
11
  import { parseCapabilityExchangeResponse, parseEphemeralKeyResponse, parseIdentityResolveResponse, } from './schemas.js';
15
12
  import { AbloAuthenticationError, hasWireCode, translateHttpError } from '../errors.js';
@@ -26,7 +23,7 @@ export async function exchangeApiKey(options) {
26
23
  const url = `${options.baseUrl.replace(/\/+$/, '')}/auth/capability`;
27
24
  const timeoutMs = options.timeoutMs ?? 10_000;
28
25
  const controller = new AbortController();
29
- const timer = setTimeout(() => controller.abort(), timeoutMs);
26
+ const timer = setTimeout(() => { controller.abort(); }, timeoutMs);
30
27
  let response;
31
28
  try {
32
29
  response = await fetcher(url, {
@@ -62,12 +59,10 @@ export async function exchangeApiKey(options) {
62
59
  catch {
63
60
  // ignore — server returned non-JSON error
64
61
  }
65
- // Route through the canonical wire-error translator so the server's
66
- // envelope (`code` + `message` + `doc_url`) propagates verbatim and maps to
67
- // the right AbloError subclass instead of the legacy `error`/`reason`
68
- // shape this used to read (which the server no longer emits, collapsing
69
- // every failure to a generic code with an empty message). Fall back to
70
- // `exchange_failed` only when the body carried no recognizable code.
62
+ // Route the error through the wire-error translator so the server's envelope
63
+ // (`code`, `message`, `doc_url`) is preserved and mapped to the matching
64
+ // AbloError subclass. Fall back to `exchange_failed` only when the body
65
+ // carried no recognizable error code.
71
66
  const requestId = response.headers.get('x-request-id') ?? undefined;
72
67
  throw hasWireCode(body)
73
68
  ? translateHttpError(response.status, body, requestId)
@@ -76,13 +71,13 @@ export async function exchangeApiKey(options) {
76
71
  return parseCapabilityExchangeResponse(await response.json());
77
72
  }
78
73
  /**
79
- * Mint an END-USER session key (`ek_`) via `POST /auth/ephemeral-keys` — the
80
- * sk_-gated user-session door. This is deliberately a DIFFERENT endpoint from
81
- * `/auth/capability`: that route can never mint humans (its
82
- * `invalid_participant_kind` gate is what fired in the 2026-06-11 Pulse
83
- * cascade, when `sessions.create({ user })` was funneled through the agent
84
- * door). The server trusts the `ek_` because a secret key minted it; the
85
- * browser presents it as its bearer.
74
+ * Mints an end-user session key (an `ek_` key) by calling
75
+ * `POST /auth/ephemeral-keys`, using your secret key as authorization. Your
76
+ * backend calls this to issue a session that a browser can present as its bearer
77
+ * credential; the server trusts the resulting key because a secret key minted it.
78
+ *
79
+ * This is a distinct endpoint from `/auth/capability`, which exchanges keys for
80
+ * agents and systems and cannot mint sessions for human users.
86
81
  */
87
82
  export async function mintUserSessionKey(options) {
88
83
  if (!options.apiKey) {
@@ -96,7 +91,7 @@ export async function mintUserSessionKey(options) {
96
91
  const url = `${options.baseUrl.replace(/\/+$/, '')}/auth/ephemeral-keys`;
97
92
  const timeoutMs = options.timeoutMs ?? 10_000;
98
93
  const controller = new AbortController();
99
- const timer = setTimeout(() => controller.abort(), timeoutMs);
94
+ const timer = setTimeout(() => { controller.abort(); }, timeoutMs);
100
95
  let response;
101
96
  try {
102
97
  response = await fetcher(url, {
@@ -108,8 +103,8 @@ export async function mintUserSessionKey(options) {
108
103
  body: JSON.stringify({
109
104
  user: { id: options.userId },
110
105
  ...(options.organizationId ? { organizationId: options.organizationId } : {}),
111
- // Flattened to the existing wire keys the public param is project-centric,
112
- // the transport contract is unchanged (no coordinated server deploy needed).
106
+ // The public option is project-centric; map it to the flat wire keys the
107
+ // endpoint expects.
113
108
  ...(options.schemaProject
114
109
  ? {
115
110
  schemaProjectId: options.schemaProject.projectId,
@@ -145,9 +140,10 @@ export async function mintUserSessionKey(options) {
145
140
  return parseEphemeralKeyResponse(await response.json());
146
141
  }
147
142
  /**
148
- * Resolve the caller's Ablo identity from the authenticated request
149
- * context. Used by browser/session/capability flows where the SDK should
150
- * not require a public `userId` prop just to open local storage.
143
+ * Resolves the caller's identity from an authenticated request by calling
144
+ * `GET /auth/identity`. This lets browser and session flows learn who the
145
+ * current user is without requiring the application to pass a user id up front —
146
+ * for example, to key local storage.
151
147
  */
152
148
  export async function resolveIdentity(options) {
153
149
  if (!options.baseUrl) {
@@ -159,7 +155,7 @@ export async function resolveIdentity(options) {
159
155
  const url = `${options.baseUrl.replace(/\/+$/, '')}/auth/identity`;
160
156
  const timeoutMs = options.timeoutMs ?? 10_000;
161
157
  const controller = new AbortController();
162
- const timer = setTimeout(() => controller.abort(), timeoutMs);
158
+ const timer = setTimeout(() => { controller.abort(); }, timeoutMs);
163
159
  let response;
164
160
  try {
165
161
  const headers = { Accept: 'application/json' };
@@ -186,12 +182,10 @@ export async function resolveIdentity(options) {
186
182
  catch {
187
183
  // ignore non-JSON auth errors
188
184
  }
189
- // Canonical envelope translation (see `exchangeApiKey` above). This is what
190
- // surfaces the sync-server's precise auth diagnosis e.g.
191
- // `jwt_issuer_untrusted` with its full message to the SDK consumer,
192
- // instead of collapsing every 401 to `identity_resolve_failed` with an
193
- // empty reason because the old parser looked for `error`/`reason` keys the
194
- // server doesn't emit.
185
+ // Translate the error envelope the same way `exchangeApiKey` does, so the
186
+ // server's precise auth diagnosis (for example `jwt_issuer_untrusted` with
187
+ // its full message) reaches the caller instead of collapsing every 401 to a
188
+ // generic `identity_resolve_failed`.
195
189
  const requestId = response.headers.get('x-request-id') ?? undefined;
196
190
  throw hasWireCode(body)
197
191
  ? translateHttpError(response.status, body, requestId)
@@ -209,9 +203,9 @@ export function createRefreshScheduler(options) {
209
203
  let timer = null;
210
204
  let inFlight = null;
211
205
  let disposed = false;
212
- // Default visibility attach: only when running in a browser-like env.
213
- // The Node-side agent worker never has `document`, so the default
214
- // does the right thing without explicit opt-out.
206
+ // Attach the visibility listener only in a browser-like environment. A
207
+ // non-browser runtime has no `document`, so the default behaves correctly
208
+ // without an explicit opt-out.
215
209
  const wantsVisibility = options.attachVisibilityListener ?? true;
216
210
  const hasDocument = typeof document !== 'undefined';
217
211
  const visibilityActive = wantsVisibility && hasDocument;
@@ -32,10 +32,11 @@ export declare const IdentityResolveResponseSchema: z.ZodObject<{
32
32
  }, z.core.$loose>;
33
33
  export type IdentityResolveResponse = z.infer<typeof IdentityResolveResponseSchema>;
34
34
  /**
35
- * Response of `POST /auth/ephemeral-keys` the sk_-gated END-USER session
36
- * mint (`ek_`). Flat shape (no `scope` block): the server stores the scope on
37
- * the key row and re-derives it at every verify; the client only needs the
38
- * token + identity facts to hand to the browser.
35
+ * The response shape of `POST /auth/ephemeral-keys`, the endpoint that mints an
36
+ * end-user session key (an `ek_` key). The shape is flat, with no nested scope
37
+ * block: the server records the scope on the key itself and re-derives it on
38
+ * every request, so the client only needs the token and identity fields to hand
39
+ * to the browser.
39
40
  */
40
41
  export declare const EphemeralKeyResponseSchema: z.ZodObject<{
41
42
  object: z.ZodOptional<z.ZodLiteral<"ephemeral_key">>;
@@ -30,10 +30,11 @@ export const IdentityResolveResponseSchema = z
30
30
  })
31
31
  .passthrough();
32
32
  /**
33
- * Response of `POST /auth/ephemeral-keys` the sk_-gated END-USER session
34
- * mint (`ek_`). Flat shape (no `scope` block): the server stores the scope on
35
- * the key row and re-derives it at every verify; the client only needs the
36
- * token + identity facts to hand to the browser.
33
+ * The response shape of `POST /auth/ephemeral-keys`, the endpoint that mints an
34
+ * end-user session key (an `ek_` key). The shape is flat, with no nested scope
35
+ * block: the server records the scope on the key itself and re-derives it on
36
+ * every request, so the client only needs the token and identity fields to hand
37
+ * to the browser.
37
38
  */
38
39
  export const EphemeralKeyResponseSchema = z
39
40
  .object({
@@ -1,24 +1,21 @@
1
1
  /**
2
- * `@abloatai/ablo/batching` a dependency-free batch-coalescing primitive.
2
+ * A small, dependency-free primitive that coalesces work into batches.
3
3
  *
4
- * Accumulate items issued close together (the canonical case: a synchronous
5
- * burst, e.g. `Promise.all([ a(), b(), c() ])` in one event-loop tick) and
6
- * dispatch them as ONE atomic batch instead of one call each. This is the
7
- * scheduling essence of Ablo's `TransactionQueue` (and Linear's sync engine)
8
- * microtask same-tick staging, size/cost/delay flush triggers, and in-flight
9
- * backpressure distilled to a pure state machine with NO dependency on
10
- * models, MobX, IndexedDB, or the wire. Consumers inject the actual dispatch.
4
+ * It accumulates items enqueued close together the common case being a
5
+ * synchronous burst such as `Promise.all([ a(), b(), c() ])` within one
6
+ * event-loop tick — and dispatches them as a single batch rather than one call
7
+ * each. It is a pure state machine: it stages items on the microtask queue,
8
+ * flushes on size, cost, or time triggers, and applies in-flight backpressure,
9
+ * with no dependency on any data model, storage layer, or network. You supply
10
+ * the dispatch function through {@link BatchSchedulerHooks}.
11
11
  *
12
12
  * Guarantees:
13
- * - a batch is ONE `dispatchBatch(items)` call **atomic** (all-or-nothing).
14
- * - on dispatch failure, **every** enqueued promise in that batch rejects
15
- * with the same error.
16
- * - items dispatch in enqueue order (optionally reordered by `compare` just
17
- * before a batch is cut); batches run FIFO under a `maxInFlight` cap.
18
- *
19
- * The slides-sdk wraps this to coalesce `commits.create` calls; the stateful
20
- * `TransactionQueue` MAY adopt it later (it would supply `compare` for FK
21
- * ordering and keep its merge/confirm/retry logic in its own hooks).
13
+ * - each batch is a single `dispatchBatch(items)` call, applied atomically.
14
+ * - if a dispatch fails, every enqueued promise in that batch rejects with
15
+ * the same error.
16
+ * - items dispatch in enqueue order, optionally reordered by `compare` just
17
+ * before a batch is cut; batches run first-in, first-out under a
18
+ * `maxInFlight` cap.
22
19
  */
23
20
  export interface BatchSchedulerOptions<T> {
24
21
  /** Master switch. When false, every `enqueue` dispatches solo immediately. Default true. */
@@ -38,16 +35,17 @@ export interface BatchSchedulerHooks<T, R> {
38
35
  /** The single dispatch for one batch. One call → atomic at this layer. */
39
36
  dispatchBatch(items: T[]): Promise<R>;
40
37
  /**
41
- * Optional ordering applied to the staged items immediately before a batch
42
- * is cut (e.g. FK-priority). Omit for FIFO. Does not affect which items share
43
- * a batch only their order within the dispatched array.
38
+ * Optional ordering applied to the staged items just before a batch is cut —
39
+ * for example, to send parent rows ahead of the rows that reference them. Omit
40
+ * for first-in, first-out order. This changes only the order of items within
41
+ * the dispatched array, not which items share a batch.
44
42
  */
45
43
  compare?(a: T, b: T): number;
46
44
  }
47
45
  export interface BatchScheduler<T, R> {
48
46
  /** Stage one item; resolves with its batch's dispatch result, or rejects with the batch error. */
49
47
  enqueue(item: T): Promise<R>;
50
- /** Stage an item that must dispatch in its OWN batch (e.g. it carries an explicit idempotency key). */
48
+ /** Stage an item that must dispatch in a batch of its own for example, one carrying an explicit idempotency key. */
51
49
  enqueueSolo(item: T): Promise<R>;
52
50
  /** Force-flush the pending batch and resolve once everything in flight has settled. */
53
51
  flush(): Promise<void>;
@@ -1,24 +1,21 @@
1
1
  /**
2
- * `@abloatai/ablo/batching` a dependency-free batch-coalescing primitive.
2
+ * A small, dependency-free primitive that coalesces work into batches.
3
3
  *
4
- * Accumulate items issued close together (the canonical case: a synchronous
5
- * burst, e.g. `Promise.all([ a(), b(), c() ])` in one event-loop tick) and
6
- * dispatch them as ONE atomic batch instead of one call each. This is the
7
- * scheduling essence of Ablo's `TransactionQueue` (and Linear's sync engine)
8
- * microtask same-tick staging, size/cost/delay flush triggers, and in-flight
9
- * backpressure distilled to a pure state machine with NO dependency on
10
- * models, MobX, IndexedDB, or the wire. Consumers inject the actual dispatch.
4
+ * It accumulates items enqueued close together the common case being a
5
+ * synchronous burst such as `Promise.all([ a(), b(), c() ])` within one
6
+ * event-loop tick — and dispatches them as a single batch rather than one call
7
+ * each. It is a pure state machine: it stages items on the microtask queue,
8
+ * flushes on size, cost, or time triggers, and applies in-flight backpressure,
9
+ * with no dependency on any data model, storage layer, or network. You supply
10
+ * the dispatch function through {@link BatchSchedulerHooks}.
11
11
  *
12
12
  * Guarantees:
13
- * - a batch is ONE `dispatchBatch(items)` call **atomic** (all-or-nothing).
14
- * - on dispatch failure, **every** enqueued promise in that batch rejects
15
- * with the same error.
16
- * - items dispatch in enqueue order (optionally reordered by `compare` just
17
- * before a batch is cut); batches run FIFO under a `maxInFlight` cap.
18
- *
19
- * The slides-sdk wraps this to coalesce `commits.create` calls; the stateful
20
- * `TransactionQueue` MAY adopt it later (it would supply `compare` for FK
21
- * ordering and keep its merge/confirm/retry logic in its own hooks).
13
+ * - each batch is a single `dispatchBatch(items)` call, applied atomically.
14
+ * - if a dispatch fails, every enqueued promise in that batch rejects with
15
+ * the same error.
16
+ * - items dispatch in enqueue order, optionally reordered by `compare` just
17
+ * before a batch is cut; batches run first-in, first-out under a
18
+ * `maxInFlight` cap.
22
19
  */
23
20
  export function createBatchScheduler(hooks, options) {
24
21
  const enabled = options?.enabled ?? true;