@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,30 +1,30 @@
1
1
  /**
2
2
  * The functional update — `ablo.<model>.update(id, current => next)`.
3
3
  *
4
- * This is the "just works under contention" surface. The developer expresses
5
- * ONLY their intent — "given the latest row, here is the next state" — and the
6
- * SDK owns everything else: read the fresh row + its watermark, run the updater,
7
- * write it as a compare-and-swap against that watermark, and on any concurrent
8
- * write re-read recompute → retry. No claim, no identity, no transport
9
- * awareness, and no `stale_context` / `claim_*` error codes ever reach the
4
+ * This is the surface that just works under contention. You express only your
5
+ * intent — given the latest row, here is the next state — and the client does
6
+ * the rest: it reads the fresh row and its watermark, runs your updater, writes
7
+ * the result as a compare-and-swap against that watermark, and on any concurrent
8
+ * write it re-reads, recomputes, and retries. No claim, no identity, no transport
9
+ * awareness, and no `stale_context` or `claim_*` error codes ever reach the
10
10
  * caller. The write either lands or, at the extreme, throws a single
11
- * {@link AbloContentionError} after the reconcile budget is spent.
11
+ * {@link AbloContentionError} once the reconcile budget is spent.
12
12
  *
13
- * Correctness comes from the `readAt` watermark + `onStale: 'reject'`
14
- * (optimistic concurrency / compare-and-swap), NOT from participant identity
15
- * which is why it is immune to the shared-credential silent-clobber footgun and
16
- * behaves identically on both transports. The HTTP and WebSocket clients inject
17
- * the same two thunks ({@link ReconcileTransport}); the loop below is shared, so
18
- * the guarantee can never drift between them — only the mechanism differs.
13
+ * Correctness comes from the `readAt` watermark plus `onStale: 'reject'`
14
+ * (optimistic concurrency, or compare-and-swap), not from participant identity.
15
+ * That is why it is immune to the shared-credential silent-overwrite hazard and
16
+ * behaves identically on both transports: the HTTP and WebSocket clients inject
17
+ * the same two functions ({@link ReconcileTransport}) into the shared loop below,
18
+ * so the guarantee cannot drift between them — only the mechanism differs.
19
19
  *
20
20
  * The mental model is React's `setState(prev => next)`: pass a function of the
21
- * current state, the runtime owns reconciliation.
21
+ * current state and the runtime owns reconciliation.
22
22
  */
23
23
  import { AbloContentionError } from '../errors.js';
24
24
  /**
25
25
  * The functional form of an update: given the freshly-read row, return the
26
- * fields to write. Return `null` / `undefined` to make NO write — a no-op the
27
- * caller decided on after seeing the latest state (e.g. "already done").
26
+ * fields to write. Return `null` or `undefined` to make no write — a no-op the
27
+ * caller chose after seeing the latest state (for example, "already done").
28
28
  */
29
29
  export type ModelUpdater<T> = (current: T) => Partial<T> | null | undefined | Promise<Partial<T> | null | undefined>;
30
30
  /** Tuning for the functional update's internal reconcile loop. */
@@ -41,30 +41,32 @@ export interface ContentionOptions {
41
41
  /** Reconcile rounds before a hot row is declared permanently contended. */
42
42
  export declare const DEFAULT_CONTENTION_RETRIES = 16;
43
43
  /**
44
- * Does this thrown error mean "another writer moved the row — re-read and
45
- * retry" rather than a genuine failure to surface? These are the optimistic-
46
- * concurrency signals the functional update reconciles against:
47
- * - `stale_context` — our `readAt` watermark was overtaken by a concurrent write
48
- * - `claim_lost` — a holder preempted us (e.g. a human under `humansOverwrite`)
44
+ * Reports whether a thrown error means "another writer moved the row — re-read
45
+ * and retry" rather than a genuine failure to surface. These are the
46
+ * optimistic-concurrency signals the functional update reconciles against:
47
+ * - `stale_context` — the `readAt` watermark was overtaken by a concurrent write
48
+ * - `claim_lost` — a holder preempted the write (for example a human under `humansOverwrite`)
49
49
  * - `claim_queued` — a holder is actively editing the row right now
50
50
  */
51
51
  export declare function isReconcilableConflict(err: unknown): boolean;
52
52
  /**
53
- * Transport-specific read/write the shared loop drives. Each client injects its
54
- * own pair — that's the ONLY thing that differs between HTTP and WebSocket.
53
+ * The transport-specific read and write that the shared loop drives. Each client
54
+ * injects its own pair — the one thing that differs between the HTTP and
55
+ * WebSocket transports.
55
56
  */
56
57
  export interface ReconcileTransport<T, R> {
57
58
  readonly model: string;
58
59
  readonly id: string;
59
- /** Read the latest row + its watermark from the authoritative store. */
60
+ /** Read the latest row and its watermark from the authoritative store. */
60
61
  readFresh: () => Promise<{
61
62
  readonly data: T | null | undefined;
62
63
  readonly stamp: number;
63
64
  }>;
64
65
  /**
65
- * Write the computed patch as a compare-and-swap against `readAt`. MUST throw
66
- * a reconcilable conflict (`stale_context` / `claim_*`) when the watermark was
67
- * overtaken — that rejection is what drives the next reconcile round.
66
+ * Write the computed patch as a compare-and-swap against `readAt`. It must
67
+ * throw a reconcilable conflict (`stale_context` or `claim_*`) when the
68
+ * watermark was overtaken — that rejection is what drives the next reconcile
69
+ * round.
68
70
  */
69
71
  writeNext: (patch: Partial<T>, readAt: number) => Promise<R>;
70
72
  }
@@ -1,34 +1,34 @@
1
1
  /**
2
2
  * The functional update — `ablo.<model>.update(id, current => next)`.
3
3
  *
4
- * This is the "just works under contention" surface. The developer expresses
5
- * ONLY their intent — "given the latest row, here is the next state" — and the
6
- * SDK owns everything else: read the fresh row + its watermark, run the updater,
7
- * write it as a compare-and-swap against that watermark, and on any concurrent
8
- * write re-read recompute → retry. No claim, no identity, no transport
9
- * awareness, and no `stale_context` / `claim_*` error codes ever reach the
4
+ * This is the surface that just works under contention. You express only your
5
+ * intent — given the latest row, here is the next state — and the client does
6
+ * the rest: it reads the fresh row and its watermark, runs your updater, writes
7
+ * the result as a compare-and-swap against that watermark, and on any concurrent
8
+ * write it re-reads, recomputes, and retries. No claim, no identity, no transport
9
+ * awareness, and no `stale_context` or `claim_*` error codes ever reach the
10
10
  * caller. The write either lands or, at the extreme, throws a single
11
- * {@link AbloContentionError} after the reconcile budget is spent.
11
+ * {@link AbloContentionError} once the reconcile budget is spent.
12
12
  *
13
- * Correctness comes from the `readAt` watermark + `onStale: 'reject'`
14
- * (optimistic concurrency / compare-and-swap), NOT from participant identity
15
- * which is why it is immune to the shared-credential silent-clobber footgun and
16
- * behaves identically on both transports. The HTTP and WebSocket clients inject
17
- * the same two thunks ({@link ReconcileTransport}); the loop below is shared, so
18
- * the guarantee can never drift between them — only the mechanism differs.
13
+ * Correctness comes from the `readAt` watermark plus `onStale: 'reject'`
14
+ * (optimistic concurrency, or compare-and-swap), not from participant identity.
15
+ * That is why it is immune to the shared-credential silent-overwrite hazard and
16
+ * behaves identically on both transports: the HTTP and WebSocket clients inject
17
+ * the same two functions ({@link ReconcileTransport}) into the shared loop below,
18
+ * so the guarantee cannot drift between them — only the mechanism differs.
19
19
  *
20
20
  * The mental model is React's `setState(prev => next)`: pass a function of the
21
- * current state, the runtime owns reconciliation.
21
+ * current state and the runtime owns reconciliation.
22
22
  */
23
23
  import { AbloError, AbloNotFoundError, AbloStaleContextError, AbloClaimedError, AbloContentionError, } from '../errors.js';
24
24
  /** Reconcile rounds before a hot row is declared permanently contended. */
25
25
  export const DEFAULT_CONTENTION_RETRIES = 16;
26
26
  /**
27
- * Does this thrown error mean "another writer moved the row — re-read and
28
- * retry" rather than a genuine failure to surface? These are the optimistic-
29
- * concurrency signals the functional update reconciles against:
30
- * - `stale_context` — our `readAt` watermark was overtaken by a concurrent write
31
- * - `claim_lost` — a holder preempted us (e.g. a human under `humansOverwrite`)
27
+ * Reports whether a thrown error means "another writer moved the row — re-read
28
+ * and retry" rather than a genuine failure to surface. These are the
29
+ * optimistic-concurrency signals the functional update reconciles against:
30
+ * - `stale_context` — the `readAt` watermark was overtaken by a concurrent write
31
+ * - `claim_lost` — a holder preempted the write (for example a human under `humansOverwrite`)
32
32
  * - `claim_queued` — a holder is actively editing the row right now
33
33
  */
34
34
  export function isReconcilableConflict(err) {
@@ -82,6 +82,6 @@ export async function reconcileFunctionalUpdate(updater, options, transport) {
82
82
  cause: lastConflict,
83
83
  });
84
84
  }
85
- // Re-exported so call sites import the loop + its terminal error from one place;
86
- // the class itself lives with the rest of the hierarchy in `errors.ts`.
85
+ // Re-exported so call sites import the loop and its terminal error from one
86
+ // place; the class itself lives with the rest of the error hierarchy.
87
87
  export { AbloContentionError };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The hosted Ablo Cloud endpoint constants, with no dependencies of their own.
3
+ *
4
+ * This is the single place the hosted API host is declared. URL resolution, the
5
+ * CLI's default URL, the data-source connector's base, the generated OpenAPI
6
+ * server entry, and the network probe's default all import from here, so
7
+ * changing the API domain is a one-line edit.
8
+ *
9
+ * These constants are kept dependency-free deliberately: several low-level
10
+ * modules consume them, and routing those modules through the auth layer would
11
+ * pull the error registry and credential policy into otherwise-clean paths and
12
+ * risk an import cycle.
13
+ */
14
+ /** The hosted API domain (no scheme). */
15
+ export declare const ABLO_HOSTED_API_DOMAIN = "api.abloatai.com";
16
+ /** The hosted HTTP origin — `https://` + {@link ABLO_HOSTED_API_DOMAIN}. */
17
+ export declare const ABLO_HOSTED_HTTP_BASE_URL = "https://api.abloatai.com";
18
+ /** Default `baseURL` when the caller passes none. Same value as
19
+ * {@link ABLO_HOSTED_HTTP_BASE_URL}; kept as a distinct name because it is
20
+ * the documented client-options default. */
21
+ export declare const ABLO_DEFAULT_BASE_URL = "https://api.abloatai.com";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The hosted Ablo Cloud endpoint constants, with no dependencies of their own.
3
+ *
4
+ * This is the single place the hosted API host is declared. URL resolution, the
5
+ * CLI's default URL, the data-source connector's base, the generated OpenAPI
6
+ * server entry, and the network probe's default all import from here, so
7
+ * changing the API domain is a one-line edit.
8
+ *
9
+ * These constants are kept dependency-free deliberately: several low-level
10
+ * modules consume them, and routing those modules through the auth layer would
11
+ * pull the error registry and credential policy into otherwise-clean paths and
12
+ * risk an import cycle.
13
+ */
14
+ /** The hosted API domain (no scheme). */
15
+ export const ABLO_HOSTED_API_DOMAIN = 'api.abloatai.com';
16
+ /** The hosted HTTP origin — `https://` + {@link ABLO_HOSTED_API_DOMAIN}. */
17
+ export const ABLO_HOSTED_HTTP_BASE_URL = `https://${ABLO_HOSTED_API_DOMAIN}`;
18
+ /** Default `baseURL` when the caller passes none. Same value as
19
+ * {@link ABLO_HOSTED_HTTP_BASE_URL}; kept as a distinct name because it is
20
+ * the documented client-options default. */
21
+ export const ABLO_DEFAULT_BASE_URL = ABLO_HOSTED_HTTP_BASE_URL;
@@ -1,100 +1,104 @@
1
1
  /**
2
- * `createAbloHttpClient` a STATELESS, typed HTTP client for server-side actors
3
- * (agents, workers, serverless), modelled on `@liveblocks/node` / the Stripe
4
- * server SDK / Netflix Conductor workers: it talks to Ablo over plain HTTP with
5
- * the credential as identity, and holds **no WebSocket and no connection state**.
2
+ * Creates a stateless, typed HTTP client for server-side actors — agents,
3
+ * workers, and serverless handlers. It talks to Ablo over plain request/response
4
+ * HTTP, uses the bearer credential as its identity, and holds no WebSocket and no
5
+ * connection state.
6
6
  *
7
- * Why this exists (docs/plans/agent-transport-event-driven.md): the stateful
8
- * `Ablo({ schema })` client is for INTERACTIVE participants it opens a
9
- * WebSocket and seeds its identity (userId/orgId) during the connect/bootstrap
10
- * step, then routes writes through a `TransactionQueue` that drops mutations
11
- * until that identity exists. A reactive agent has no socket, so that identity is
12
- * never seeded and writes drop. The proven fix (unanimous across Liveblocks,
13
- * Stripe, PlanetScale, Conductor, Better Auth) is NOT to de-socket the stateful
14
- * client — it's a separate stateless client where the credential carries identity
15
- * and the SERVER resolves it per request.
7
+ * This is the counterpart to the stateful {@link Ablo} client. The stateful
8
+ * client is for interactive participants: it opens a WebSocket, learns its
9
+ * identity (user id and organization id) during the connect-and-bootstrap step,
10
+ * and routes writes through a queue that waits for that identity. A server-side
11
+ * actor has no socket, so instead of reusing that machinery it uses this client,
12
+ * where the credential itself carries identity and the server resolves it on
13
+ * every request.
16
14
  *
17
- * Ablo already has that stateless surface: `Ablo({ schema: null })` returns the
18
- * protocol client (`createProtocolClient` `AbloApi`), which commits via
19
- * `POST /v1/commits` and reads via the HTTP `ApiClient`, authenticating with the
20
- * Bearer token on every request. Its only ergonomic gap is that model access is
21
- * string-keyed (`api.model('slides')`) rather than typed (`api.slides`). This
22
- * wraps it in a typed proxy facade so server code gets the SAME `client.<model>`
23
- * surface as the browser client — typed proxies, stateless transport.
15
+ * Under the hood this wraps the schema-agnostic protocol client that
16
+ * {@link createProtocolClient} returns in a typed proxy. The protocol client
17
+ * commits over `POST /v1/commits` and reads over HTTP, authenticating with the
18
+ * bearer token each time; its model access is string-keyed (`api.model('slides')`).
19
+ * The proxy gives server code the same typed `client.<model>` surface the
20
+ * stateful client offers, over stateless transport.
24
21
  */
25
22
  import { type AbloApiClientOptions } from './ApiClient.js';
26
- import type { CommitReceipt, CommitResource, HttpClaimApi, ModelRead, ModelReadOptions, CreateSessionParams, AbloSession } from './Ablo.js';
23
+ import type { CommitReceipt, CommitResource, HttpClaimApi, ModelRead, ModelReadOptions, CreateSessionParams, AbloSession } from './resourceTypes.js';
27
24
  import type { ModelCreateParams, ModelDeleteParams, ServerReadOptions, ModelRetrieveParams, ModelUpdateParams } from './createModelProxy.js';
28
25
  import type { Schema, SchemaRecord, InferModel, InferCreate } from '../schema/schema.js';
29
26
  import type { ModelUpdater, ContentionOptions } from './functionalUpdate.js';
30
27
  export interface AbloHttpClientOptions<S extends SchemaRecord> extends Omit<AbloApiClientOptions, 'schema'> {
31
- /** The schema used for TYPING only (typed model proxies); never sent or used at runtime. */
28
+ /** The schema. Used only to type the model proxies; it is never sent over the wire or read at runtime. */
32
29
  readonly schema: Schema<S>;
33
30
  }
34
31
  /**
35
- * The per-model HTTP surface exactly what a stateless client can do over
36
- * request/response: reads (`retrieve`/`list`), writes (`create`/`update`/`delete`),
37
- * and the durable-lease claim plane (`claim` acquire/hold/release). It does NOT
38
- * include `get`/`getAll`/`getCount` (local synced-pool reads) or `onChange` (live
39
- * subscription); those need the stateful plane and are absent BY TYPE here.
32
+ * The per-model surface of the stateless HTTP client everything reachable over
33
+ * request/response: reads (`retrieve` and `list`), writes (`create`, `update`,
34
+ * and `delete`), and the durable-lease {@link HttpClaimApi | claim} plane for
35
+ * coordinated writes. It deliberately omits the stateful client's local-cache
36
+ * reads (`get`, `getAll`, `getCount`) and live subscriptions (`onChange`), which
37
+ * need a persistent socket; those are absent from the type, so reaching for one
38
+ * is a compile error rather than a runtime gap.
40
39
  *
41
- * Read-shape asymmetry (by design, not a gap): `retrieve(...)` returns a
42
- * `ModelRead<T>` envelope `{ data, stamp, claims }` the stateless client has no
43
- * local graph, so the watermark/claims the stateful client reads from its pool
44
- * must ride inline on the read (an agent needs the `stamp` to do a stale-guarded
45
- * write; there is no `snapshot()` to fetch it from). `list(...)` returns a bare `T[]`.
40
+ * The read shapes differ on purpose. `retrieve` returns a {@link ModelRead}
41
+ * envelope of `{ data, stamp, claims }`, because a stateless client keeps no local
42
+ * copy of the data: the watermark (`stamp`) and any active claims must travel
43
+ * inline on the read so a caller can follow it with a stale-guarded write. `list`
44
+ * returns a plain array.
46
45
  */
47
46
  export interface HttpModelClient<T, C = T> {
48
47
  retrieve(params: ModelRetrieveParams & ModelReadOptions): Promise<ModelRead<T>>;
49
48
  list(options?: ServerReadOptions<T>): Promise<T[]>;
50
49
  /**
51
- * Create a row and return it — the confirmed, authoritative server row (with
52
- * framework defaults), mirroring the WebSocket client's `create`. A re-create
53
- * of an existing caller-supplied id is idempotent and returns the EXISTING row.
50
+ * Creates a row and returns the confirmed server row, including any
51
+ * framework-applied defaults. Matches the stateful client's `create`. Passing an
52
+ * id that already exists is idempotent: the existing row is returned unchanged.
54
53
  */
55
54
  create(params: ModelCreateParams<T, C>): Promise<T>;
56
55
  update(params: ModelUpdateParams<C>): Promise<CommitReceipt>;
57
56
  /**
58
- * Functional update under contention — `update(id, current => next)`, the
59
- * `setState(prev => next)` of the data layer. The SDK reads the freshest row,
60
- * runs your updater, writes it as a compare-and-swap, and re-reads + re-runs on
61
- * any concurrent write. No claim, no identity, no conflict codes: the write
62
- * lands or throws `AbloContentionError`. Return `null`/`undefined` to skip.
57
+ * Updates a row with a function of its latest value — `update(id, current =>
58
+ * next)`, the data-layer equivalent of a `setState(prev => next)` reducer. The
59
+ * client reads the freshest row, runs your updater, and writes the result as a
60
+ * compare-and-swap against the row's watermark; if another write landed first it
61
+ * re-reads and re-runs. No claim or conflict handling is needed: the write either
62
+ * lands or throws `AbloContentionError` once its retry budget is spent. Return
63
+ * `null` or `undefined` from the updater to skip the write.
63
64
  */
64
65
  update(id: string, updater: ModelUpdater<T>, options?: ContentionOptions): Promise<CommitReceipt | undefined>;
65
66
  delete(params: ModelDeleteParams<T>): Promise<CommitReceipt>;
66
67
  claim: HttpClaimApi<T>;
67
68
  }
68
69
  /**
69
- * The honest type of the stateless HTTP client: typed model proxies (the
70
- * request/response subset) + `commits` + `dispose`. Reaching for a
71
- * stateful-only capability (`get`/`getAll`/`getCount`, `onChange`,
72
- * `claim.state`/`queue`/`reorder`) is a COMPILE error here, not a latent runtime
73
- * `undefined` — the type matches what the transport can actually do.
70
+ * The type of the stateless HTTP client: a typed {@link HttpModelClient} per
71
+ * schema model, plus `commits`, `dispose`, and the session-mint surface. It
72
+ * exposes only what request/response transport can do, so reaching for a
73
+ * stateful-only capability `get`, `getAll`, `getCount`, `onChange`, or the
74
+ * synchronous `claim.state`/`queue`/`reorder` reads is a compile error rather
75
+ * than a value that is `undefined` at runtime.
74
76
  */
75
77
  export type AbloHttpClient<S extends SchemaRecord> = {
76
78
  readonly [K in keyof S & string]: HttpModelClient<InferModel<Schema<S>, K>, InferCreate<Schema<S>, K>>;
77
79
  } & {
78
- /** Register `databaseUrl` when configured. Also runs lazily before the first request. */
80
+ /** Runs one-time setup, such as registering a configured `databaseUrl` data source, before the client is used. It also runs lazily ahead of the first request, so calling it yourself is optional. */
79
81
  ready(): Promise<void>;
80
82
  readonly commits: CommitResource;
81
83
  dispose(): Promise<void>;
82
- /** Resolve the bearer credential this client authenticates with (see `AbloApi.getAuthToken`). */
84
+ /** Resolves the bearer credential this client authenticates with, or `null` if none is set. */
83
85
  getAuthToken(): Promise<string | null>;
84
86
  /**
85
- * Mint a short-lived scoped session (Stripe ephemeral-key shape). Minting is a
86
- * stateless control-plane call, so unlike `get`/`getAll`/`onChange` it IS
87
- * available on the HTTP client. `{ user }` `ek_`, `{ agent, can }` `rk_`.
87
+ * Mints a short-lived, scoped session token. Minting is itself a stateless
88
+ * request, so it is available here even though the local-cache reads are not.
89
+ * Pass `{ user }` to mint an end-user key (`ek_`) or `{ agent, can }` to mint a
90
+ * scoped agent key (`rk_`). See {@link CreateSessionParams}.
88
91
  */
89
92
  readonly sessions: {
90
93
  create(params: CreateSessionParams<S>): Promise<AbloSession>;
91
94
  };
92
- /** String-keyed model accessor (for dynamic model names). */
95
+ /** Looks up a model client by name, for when the model name is only known at runtime. */
93
96
  model<T = Record<string, unknown>>(name: string): HttpModelClient<T>;
94
97
  };
95
98
  /**
96
- * Stateless, typed HTTP client. Each `client.<model>` resolves to the protocol
97
- * client's `model(name)`; `commits`, `dispose`, etc. pass through. No socket is
98
- * ever opened; identity is the Bearer credential.
99
+ * Builds the stateless, typed HTTP client. Each `client.<model>` resolves to the
100
+ * protocol client's model accessor, while `commits`, `dispose`, and the other
101
+ * protocol members pass through unchanged. No socket is ever opened; the bearer
102
+ * credential is the identity.
99
103
  */
100
104
  export declare function createAbloHttpClient<S extends SchemaRecord>(options: AbloHttpClientOptions<S>): AbloHttpClient<S>;
@@ -1,34 +1,31 @@
1
1
  /**
2
- * `createAbloHttpClient` a STATELESS, typed HTTP client for server-side actors
3
- * (agents, workers, serverless), modelled on `@liveblocks/node` / the Stripe
4
- * server SDK / Netflix Conductor workers: it talks to Ablo over plain HTTP with
5
- * the credential as identity, and holds **no WebSocket and no connection state**.
2
+ * Creates a stateless, typed HTTP client for server-side actors — agents,
3
+ * workers, and serverless handlers. It talks to Ablo over plain request/response
4
+ * HTTP, uses the bearer credential as its identity, and holds no WebSocket and no
5
+ * connection state.
6
6
  *
7
- * Why this exists (docs/plans/agent-transport-event-driven.md): the stateful
8
- * `Ablo({ schema })` client is for INTERACTIVE participants it opens a
9
- * WebSocket and seeds its identity (userId/orgId) during the connect/bootstrap
10
- * step, then routes writes through a `TransactionQueue` that drops mutations
11
- * until that identity exists. A reactive agent has no socket, so that identity is
12
- * never seeded and writes drop. The proven fix (unanimous across Liveblocks,
13
- * Stripe, PlanetScale, Conductor, Better Auth) is NOT to de-socket the stateful
14
- * client — it's a separate stateless client where the credential carries identity
15
- * and the SERVER resolves it per request.
7
+ * This is the counterpart to the stateful {@link Ablo} client. The stateful
8
+ * client is for interactive participants: it opens a WebSocket, learns its
9
+ * identity (user id and organization id) during the connect-and-bootstrap step,
10
+ * and routes writes through a queue that waits for that identity. A server-side
11
+ * actor has no socket, so instead of reusing that machinery it uses this client,
12
+ * where the credential itself carries identity and the server resolves it on
13
+ * every request.
16
14
  *
17
- * Ablo already has that stateless surface: `Ablo({ schema: null })` returns the
18
- * protocol client (`createProtocolClient` `AbloApi`), which commits via
19
- * `POST /v1/commits` and reads via the HTTP `ApiClient`, authenticating with the
20
- * Bearer token on every request. Its only ergonomic gap is that model access is
21
- * string-keyed (`api.model('slides')`) rather than typed (`api.slides`). This
22
- * wraps it in a typed proxy facade so server code gets the SAME `client.<model>`
23
- * surface as the browser client — typed proxies, stateless transport.
15
+ * Under the hood this wraps the schema-agnostic protocol client that
16
+ * {@link createProtocolClient} returns in a typed proxy. The protocol client
17
+ * commits over `POST /v1/commits` and reads over HTTP, authenticating with the
18
+ * bearer token each time; its model access is string-keyed (`api.model('slides')`).
19
+ * The proxy gives server code the same typed `client.<model>` surface the
20
+ * stateful client offers, over stateless transport.
24
21
  */
25
22
  import { createProtocolClient, } from './ApiClient.js';
26
23
  /**
27
- * Members of the underlying `AbloApi` that pass straight through the facade.
28
- * Deliberately EXCLUDES the resource names that collide with common schema model
29
- * names — `tasks`, `claims`, `capabilities`, `agent` — so `client.tasks` resolves
30
- * to the schema model `tasks`, not the protocol `TaskResource`. Only lifecycle +
31
- * the genuinely-protocol methods an agent uses pass through.
24
+ * Names on the underlying protocol client that pass straight through the proxy.
25
+ * This set intentionally leaves out names that collide with common schema models —
26
+ * `tasks`, `claims`, `capabilities`, `agent` — so that `client.tasks` resolves to
27
+ * the schema model named `tasks` rather than a protocol resource. Only lifecycle
28
+ * methods and the genuinely protocol-level members belong here.
32
29
  */
33
30
  const PROTOCOL_MEMBERS = new Set([
34
31
  'ready',
@@ -41,9 +38,10 @@ const PROTOCOL_MEMBERS = new Set([
41
38
  'sessions',
42
39
  ]);
43
40
  /**
44
- * Stateless, typed HTTP client. Each `client.<model>` resolves to the protocol
45
- * client's `model(name)`; `commits`, `dispose`, etc. pass through. No socket is
46
- * ever opened; identity is the Bearer credential.
41
+ * Builds the stateless, typed HTTP client. Each `client.<model>` resolves to the
42
+ * protocol client's model accessor, while `commits`, `dispose`, and the other
43
+ * protocol members pass through unchanged. No socket is ever opened; the bearer
44
+ * credential is the identity.
47
45
  */
48
46
  export function createAbloHttpClient(options) {
49
47
  // The schema is type-level only; the protocol client is schema-agnostic.
@@ -62,8 +60,8 @@ export function createAbloHttpClient(options) {
62
60
  return api.model(prop);
63
61
  },
64
62
  });
65
- // One boundary cast — and now an HONEST one: `AbloHttpClient<S>` declares only
66
- // what `api.model()` + the passed-through protocol members actually implement,
67
- // so there is no method on this type that fails at runtime.
63
+ // A single boundary cast. `AbloHttpClient<S>` declares only what the model
64
+ // accessor and the passed-through protocol members actually implement, so no
65
+ // method on this type is missing at runtime.
68
66
  return facade;
69
67
  }
@@ -1,26 +1,21 @@
1
1
  /**
2
- * Participant identity + scope resolution for `Ablo()`.
2
+ * Resolves a participant's identity and scope when an {@link Ablo} client is
3
+ * constructed, following whichever of three authentication paths the caller's
4
+ * options select:
3
5
  *
4
- * Three branches, mirroring the three auth paths the SDK supports:
6
+ * 1. **Hosted cloud** the caller passed an `apiKey`. The client exchanges it
7
+ * for a capability token and scope, then starts a scheduler that re-mints the
8
+ * token before it expires, so the rotation is invisible to the caller.
9
+ * 2. **Self-derived** — the caller passed a bearer or capability token but not
10
+ * an identity. The client asks the identity endpoint to recover the
11
+ * participant id and scope from the token.
12
+ * 3. **Explicit** — a self-hosted caller passed the organization id and a user
13
+ * or agent id directly. No server round-trip; the client trusts the caller.
5
14
  *
6
- * 1. **Hosted-cloud** caller passed `apiKey`. SDK exchanges it
7
- * server-side for a capability token + scope blob, then sets
8
- * up a refresh scheduler that re-mints transparently before
9
- * expiry.
10
- * 2. **Self-derived** — caller passed an authToken / capability
11
- * token but the SDK doesn't yet know the identity. Calls
12
- * `resolveIdentity` against the bootstrap endpoint to recover
13
- * `participantId` + scope from the token.
14
- * 3. **Legacy explicit** — self-hosted callers that pass
15
- * `organizationId` + `user.id` (or `agentId`) directly. No
16
- * server round-trip; SDK trusts the caller.
17
- *
18
- * Extracted from `Ablo.ts` so each branch is testable in isolation
19
- * and the constructor body reads as a single named call rather than
20
- * a 100+-line if/elif/else with three different side-effect chains.
15
+ * Each branch is a separate function below, so it can be read and tested on its own.
21
16
  */
22
17
  import { type RefreshScheduler } from '../auth/index.js';
23
- import type { BootstrapHelper } from '../sync/BootstrapHelper.js';
18
+ import type { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
24
19
  import type { SyncLogger } from '../interfaces/index.js';
25
20
  import type { AuthCredentialSource } from '../auth/credentialSource.js';
26
21
  import type { ApiKeySetter } from './auth.js';
@@ -42,7 +37,7 @@ export interface IdentityResolveInput {
42
37
  readonly kind: 'user' | 'agent' | 'system';
43
38
  readonly configuredApiKey: string | ApiKeySetter | null;
44
39
  readonly configuredAuthToken: string | null;
45
- readonly bootstrapHelper: BootstrapHelper;
40
+ readonly bootstrapHelper: BootstrapFetcher;
46
41
  readonly auth: AuthCredentialSource;
47
42
  readonly logger: SyncLogger;
48
43
  }
@@ -53,7 +48,7 @@ export interface ResolvedIdentity {
53
48
  readonly capabilityToken: string | undefined;
54
49
  readonly syncGroups: readonly string[] | undefined;
55
50
  readonly participantKind: 'user' | 'agent' | 'system';
56
- /** Non-null on the hosted-cloud path; caller stores it for shutdown. */
51
+ /** Set only on the hosted-cloud path; the caller keeps it to stop refreshes on shutdown. */
57
52
  readonly refreshScheduler: RefreshScheduler | null;
58
53
  }
59
54
  export declare function resolveParticipantIdentity(input: IdentityResolveInput): Promise<ResolvedIdentity>;