@abloatai/ablo 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +101 -85
  3. package/dist/BaseSyncedStore.d.ts +85 -88
  4. package/dist/BaseSyncedStore.js +131 -147
  5. package/dist/Database.d.ts +54 -68
  6. package/dist/Database.js +97 -113
  7. package/dist/{ObjectPool.d.ts → InstanceCache.d.ts} +10 -13
  8. package/dist/{ObjectPool.js → InstanceCache.js} +85 -83
  9. package/dist/LazyReferenceCollection.d.ts +11 -15
  10. package/dist/LazyReferenceCollection.js +12 -16
  11. package/dist/Model.d.ts +37 -52
  12. package/dist/Model.js +46 -61
  13. package/dist/ModelRegistry.d.ts +21 -19
  14. package/dist/ModelRegistry.js +23 -27
  15. package/dist/NetworkMonitor.d.ts +5 -6
  16. package/dist/NetworkMonitor.js +5 -6
  17. package/dist/SyncClient.d.ts +112 -112
  18. package/dist/SyncClient.js +165 -172
  19. package/dist/adapters/alwaysOnline.d.ts +6 -8
  20. package/dist/adapters/alwaysOnline.js +6 -8
  21. package/dist/adapters/inMemoryStorage.d.ts +9 -9
  22. package/dist/adapters/inMemoryStorage.js +9 -9
  23. package/dist/agent/Agent.d.ts +27 -32
  24. package/dist/agent/Agent.js +18 -19
  25. package/dist/agent/index.d.ts +4 -4
  26. package/dist/agent/index.js +5 -5
  27. package/dist/agent/session.d.ts +47 -44
  28. package/dist/agent/session.js +37 -48
  29. package/dist/agent/types.d.ts +26 -31
  30. package/dist/agent/types.js +6 -7
  31. package/dist/ai-sdk/coordinatedTool.d.ts +108 -0
  32. package/dist/ai-sdk/{coordinated-tool.js → coordinatedTool.js} +44 -38
  33. package/dist/ai-sdk/coordinationContext.d.ts +46 -0
  34. package/dist/ai-sdk/{coordination-context.js → coordinationContext.js} +26 -33
  35. package/dist/ai-sdk/index.d.ts +25 -22
  36. package/dist/ai-sdk/index.js +25 -22
  37. package/dist/ai-sdk/wrap.d.ts +6 -7
  38. package/dist/ai-sdk/wrap.js +1 -1
  39. package/dist/auth/credentialPolicy.d.ts +69 -74
  40. package/dist/auth/credentialPolicy.js +51 -56
  41. package/dist/auth/credentialSource.d.ts +6 -5
  42. package/dist/auth/credentialSource.js +9 -10
  43. package/dist/auth/index.d.ts +59 -58
  44. package/dist/auth/index.js +31 -37
  45. package/dist/auth/schemas.d.ts +5 -4
  46. package/dist/auth/schemas.js +5 -4
  47. package/dist/batching/index.d.ts +19 -21
  48. package/dist/batching/index.js +14 -17
  49. package/dist/cli.cjs +167 -119
  50. package/dist/client/Ablo.d.ts +73 -73
  51. package/dist/client/Ablo.js +125 -160
  52. package/dist/client/ApiClient.d.ts +30 -19
  53. package/dist/client/ApiClient.js +133 -38
  54. package/dist/client/auth.d.ts +47 -47
  55. package/dist/client/auth.js +108 -117
  56. package/dist/client/claimHeartbeatLoop.d.ts +50 -0
  57. package/dist/client/claimHeartbeatLoop.js +88 -0
  58. package/dist/client/consoleLogger.d.ts +5 -6
  59. package/dist/client/consoleLogger.js +5 -6
  60. package/dist/client/createInternalComponents.d.ts +14 -17
  61. package/dist/client/createInternalComponents.js +25 -30
  62. package/dist/client/createModelProxy.d.ts +130 -120
  63. package/dist/client/createModelProxy.js +152 -122
  64. package/dist/client/credentialEndpoint.d.ts +40 -42
  65. package/dist/client/credentialEndpoint.js +35 -36
  66. package/dist/client/functionalUpdate.d.ts +29 -27
  67. package/dist/client/functionalUpdate.js +21 -21
  68. package/dist/client/hostedEndpoints.d.ts +9 -12
  69. package/dist/client/hostedEndpoints.js +9 -12
  70. package/dist/client/httpClient.d.ts +57 -53
  71. package/dist/client/httpClient.js +29 -31
  72. package/dist/client/identity.d.ts +15 -20
  73. package/dist/client/identity.js +47 -58
  74. package/dist/client/modelRegistration.d.ts +5 -9
  75. package/dist/client/modelRegistration.js +67 -87
  76. package/dist/client/options.d.ts +134 -157
  77. package/dist/client/options.js +3 -7
  78. package/dist/client/registerDataSource.d.ts +9 -9
  79. package/dist/client/registerDataSource.js +15 -16
  80. package/dist/client/resourceTypes.d.ts +64 -75
  81. package/dist/client/resourceTypes.js +4 -10
  82. package/dist/client/schemaConfig.d.ts +31 -43
  83. package/dist/client/schemaConfig.js +38 -50
  84. package/dist/client/sessionMint.d.ts +16 -12
  85. package/dist/client/sessionMint.js +26 -31
  86. package/dist/client/validateAbloOptions.d.ts +12 -14
  87. package/dist/client/validateAbloOptions.js +8 -9
  88. package/dist/client/writeOptionsSchema.d.ts +18 -16
  89. package/dist/client/writeOptionsSchema.js +23 -20
  90. package/dist/client/wsMutationExecutor.d.ts +15 -20
  91. package/dist/client/wsMutationExecutor.js +17 -23
  92. package/dist/context.d.ts +6 -4
  93. package/dist/context.js +6 -4
  94. package/dist/coordination/index.d.ts +10 -8
  95. package/dist/coordination/index.js +14 -12
  96. package/dist/coordination/schema.d.ts +176 -128
  97. package/dist/coordination/schema.js +197 -133
  98. package/dist/coordination/trace.d.ts +9 -10
  99. package/dist/coordination/trace.js +13 -14
  100. package/dist/core/DatabaseManager.d.ts +5 -7
  101. package/dist/core/DatabaseManager.js +15 -19
  102. package/dist/core/QueryProcessor.d.ts +7 -9
  103. package/dist/core/QueryProcessor.js +22 -28
  104. package/dist/core/QueryView.d.ts +8 -8
  105. package/dist/core/QueryView.js +2 -2
  106. package/dist/core/StoreManager.d.ts +12 -14
  107. package/dist/core/StoreManager.js +21 -24
  108. package/dist/core/ViewRegistry.d.ts +5 -5
  109. package/dist/core/ViewRegistry.js +4 -4
  110. package/dist/core/index.d.ts +17 -12
  111. package/dist/core/index.js +32 -26
  112. package/dist/core/openIDBWithTimeout.d.ts +38 -36
  113. package/dist/core/openIDBWithTimeout.js +42 -43
  114. package/dist/core/queryUtils.d.ts +45 -0
  115. package/dist/core/queryUtils.js +69 -0
  116. package/dist/core/storeContract.d.ts +63 -61
  117. package/dist/core/storeContract.js +8 -12
  118. package/dist/environment.d.ts +28 -0
  119. package/dist/environment.js +21 -0
  120. package/dist/errorCodes.d.ts +107 -99
  121. package/dist/errorCodes.js +131 -132
  122. package/dist/errors.d.ts +160 -166
  123. package/dist/errors.js +155 -158
  124. package/dist/index.d.ts +30 -27
  125. package/dist/index.js +89 -86
  126. package/dist/interfaces/index.d.ts +102 -113
  127. package/dist/interfaces/index.js +5 -4
  128. package/dist/keys/index.d.ts +27 -29
  129. package/dist/keys/index.js +41 -40
  130. package/dist/mutators/RecordingTransaction.d.ts +16 -16
  131. package/dist/mutators/RecordingTransaction.js +31 -37
  132. package/dist/mutators/Transaction.d.ts +18 -26
  133. package/dist/mutators/Transaction.js +14 -20
  134. package/dist/mutators/UndoManager.d.ts +122 -131
  135. package/dist/mutators/UndoManager.js +145 -156
  136. package/dist/mutators/defineMutators.d.ts +23 -34
  137. package/dist/mutators/defineMutators.js +14 -20
  138. package/dist/mutators/inverseOp.d.ts +12 -15
  139. package/dist/mutators/inverseOp.js +12 -15
  140. package/dist/mutators/mutateActions.d.ts +10 -9
  141. package/dist/mutators/mutateActions.js +1 -1
  142. package/dist/mutators/readerActions.d.ts +9 -8
  143. package/dist/mutators/readerActions.js +2 -2
  144. package/dist/mutators/undoApply.d.ts +31 -27
  145. package/dist/mutators/undoApply.js +26 -24
  146. package/dist/policy/index.d.ts +5 -3
  147. package/dist/policy/index.js +5 -3
  148. package/dist/policy/types.d.ts +104 -100
  149. package/dist/policy/types.js +67 -66
  150. package/dist/query/client.d.ts +28 -23
  151. package/dist/query/client.js +45 -43
  152. package/dist/query/types.d.ts +37 -60
  153. package/dist/query/types.js +13 -33
  154. package/dist/react/AbloProvider.d.ts +1 -1
  155. package/dist/react/AbloProvider.js +2 -2
  156. package/dist/react/context.d.ts +25 -28
  157. package/dist/react/context.js +9 -10
  158. package/dist/react/index.d.ts +41 -42
  159. package/dist/react/index.js +37 -38
  160. package/dist/react/internalContext.d.ts +17 -19
  161. package/dist/react/useAblo.d.ts +23 -22
  162. package/dist/react/useAblo.js +16 -14
  163. package/dist/react/useCurrentUserId.d.ts +8 -7
  164. package/dist/react/useCurrentUserId.js +8 -7
  165. package/dist/react/useErrorListener.d.ts +7 -7
  166. package/dist/react/useErrorListener.js +10 -11
  167. package/dist/react/useMutationFailureListener.d.ts +8 -8
  168. package/dist/react/useMutationFailureListener.js +8 -8
  169. package/dist/react/useMutators.d.ts +11 -11
  170. package/dist/react/useMutators.js +3 -3
  171. package/dist/react/useReactive.js +2 -2
  172. package/dist/react/useSyncStatus.d.ts +4 -6
  173. package/dist/react/useUndoScope.d.ts +7 -9
  174. package/dist/react/useUndoScope.js +1 -1
  175. package/dist/schema/coordination.d.ts +21 -25
  176. package/dist/schema/coordination.js +21 -25
  177. package/dist/schema/ddl.d.ts +43 -39
  178. package/dist/schema/ddl.js +75 -68
  179. package/dist/schema/ddlLock.d.ts +20 -24
  180. package/dist/schema/ddlLock.js +18 -23
  181. package/dist/schema/diff.d.ts +99 -61
  182. package/dist/schema/diff.js +43 -34
  183. package/dist/schema/field.d.ts +37 -42
  184. package/dist/schema/field.js +35 -48
  185. package/dist/schema/generate.d.ts +12 -12
  186. package/dist/schema/generate.js +12 -12
  187. package/dist/schema/index.d.ts +2 -2
  188. package/dist/schema/index.js +21 -23
  189. package/dist/schema/model.d.ts +118 -143
  190. package/dist/schema/model.js +22 -33
  191. package/dist/schema/openapi.d.ts +10 -9
  192. package/dist/schema/openapi.js +5 -3
  193. package/dist/schema/queries.d.ts +29 -31
  194. package/dist/schema/queries.js +23 -25
  195. package/dist/schema/relation.d.ts +89 -99
  196. package/dist/schema/relation.js +13 -13
  197. package/dist/schema/residency.d.ts +16 -13
  198. package/dist/schema/residency.js +16 -13
  199. package/dist/schema/roles.d.ts +36 -43
  200. package/dist/schema/roles.js +31 -37
  201. package/dist/schema/schema.d.ts +33 -42
  202. package/dist/schema/schema.js +31 -32
  203. package/dist/schema/select.d.ts +13 -13
  204. package/dist/schema/select.js +13 -13
  205. package/dist/schema/serialize.d.ts +28 -31
  206. package/dist/schema/serialize.js +27 -31
  207. package/dist/schema/sugar.d.ts +17 -32
  208. package/dist/schema/sugar.js +14 -29
  209. package/dist/schema/{sync-delta-row.d.ts → syncDeltaRow.d.ts} +26 -49
  210. package/dist/schema/syncDeltaRow.js +89 -0
  211. package/dist/schema/tenancy.d.ts +44 -46
  212. package/dist/schema/tenancy.js +46 -48
  213. package/dist/server/adapter.d.ts +58 -58
  214. package/dist/server/adapter.js +13 -14
  215. package/dist/server/commit.d.ts +60 -64
  216. package/dist/server/index.d.ts +9 -10
  217. package/dist/server/index.js +1 -1
  218. package/dist/server/readConfig.d.ts +70 -0
  219. package/dist/server/readConfig.js +8 -0
  220. package/dist/server/storageMode.d.ts +23 -0
  221. package/dist/server/storageMode.js +17 -0
  222. package/dist/source/adapter.d.ts +30 -25
  223. package/dist/source/adapter.js +10 -10
  224. package/dist/source/adapters/drizzle.d.ts +28 -23
  225. package/dist/source/adapters/drizzle.js +30 -25
  226. package/dist/source/adapters/kysely.d.ts +27 -25
  227. package/dist/source/adapters/kysely.js +24 -23
  228. package/dist/source/adapters/memory.d.ts +8 -7
  229. package/dist/source/adapters/memory.js +9 -8
  230. package/dist/source/adapters/prisma.d.ts +13 -12
  231. package/dist/source/adapters/prisma.js +22 -25
  232. package/dist/source/conformance.d.ts +18 -11
  233. package/dist/source/conformance.js +17 -11
  234. package/dist/source/connector.d.ts +31 -32
  235. package/dist/source/connector.js +28 -28
  236. package/dist/source/connectorProtocol.d.ts +160 -0
  237. package/dist/source/connectorProtocol.js +162 -0
  238. package/dist/source/contract.d.ts +26 -27
  239. package/dist/source/contract.js +28 -29
  240. package/dist/source/factory.d.ts +46 -58
  241. package/dist/source/factory.js +22 -27
  242. package/dist/source/index.d.ts +7 -9
  243. package/dist/source/index.js +12 -14
  244. package/dist/source/migrations.d.ts +9 -9
  245. package/dist/source/migrations.js +9 -9
  246. package/dist/source/next.d.ts +9 -10
  247. package/dist/source/next.js +6 -7
  248. package/dist/source/pushQueue.d.ts +69 -47
  249. package/dist/source/pushQueue.js +32 -28
  250. package/dist/source/signing.d.ts +46 -17
  251. package/dist/source/signing.js +28 -11
  252. package/dist/source/types.d.ts +121 -104
  253. package/dist/source/types.js +13 -14
  254. package/dist/stores/ObjectStore.d.ts +10 -11
  255. package/dist/stores/ObjectStore.js +11 -12
  256. package/dist/stores/ObjectStoreContract.d.ts +12 -15
  257. package/dist/stores/SyncActionStore.d.ts +7 -11
  258. package/dist/stores/SyncActionStore.js +13 -17
  259. package/dist/surface.d.ts +27 -20
  260. package/dist/surface.js +27 -20
  261. package/dist/sync/{BootstrapHelper.d.ts → BootstrapFetcher.d.ts} +36 -42
  262. package/dist/sync/{BootstrapHelper.js → BootstrapFetcher.js} +76 -76
  263. package/dist/sync/ConnectionManager.d.ts +39 -50
  264. package/dist/sync/ConnectionManager.js +55 -66
  265. package/dist/sync/NetworkProbe.d.ts +24 -29
  266. package/dist/sync/NetworkProbe.js +63 -69
  267. package/dist/sync/{HydrationCoordinator.d.ts → OnDemandLoader.d.ts} +42 -41
  268. package/dist/sync/{HydrationCoordinator.js → OnDemandLoader.js} +59 -54
  269. package/dist/sync/{AreaOfInterestManager.d.ts → SubscriptionManager.d.ts} +43 -57
  270. package/dist/sync/{AreaOfInterestManager.js → SubscriptionManager.js} +43 -51
  271. package/dist/sync/SyncWebSocket.d.ts +139 -165
  272. package/dist/sync/SyncWebSocket.js +191 -223
  273. package/dist/sync/awaitClaimGrant.d.ts +18 -18
  274. package/dist/sync/awaitClaimGrant.js +11 -11
  275. package/dist/sync/bootstrapApply.d.ts +34 -24
  276. package/dist/sync/bootstrapApply.js +27 -19
  277. package/dist/sync/commitFrames.d.ts +21 -20
  278. package/dist/sync/commitFrames.js +18 -18
  279. package/dist/sync/createClaimStream.d.ts +23 -22
  280. package/dist/sync/createClaimStream.js +105 -23
  281. package/dist/sync/createPresenceStream.d.ts +19 -18
  282. package/dist/sync/createPresenceStream.js +25 -26
  283. package/dist/sync/createSnapshot.d.ts +12 -14
  284. package/dist/sync/createSnapshot.js +20 -26
  285. package/dist/sync/credentialLifecycle.d.ts +104 -104
  286. package/dist/sync/credentialLifecycle.js +140 -147
  287. package/dist/sync/deltaPipeline.d.ts +36 -34
  288. package/dist/sync/deltaPipeline.js +64 -65
  289. package/dist/sync/groupChange.d.ts +63 -61
  290. package/dist/sync/groupChange.js +74 -78
  291. package/dist/sync/heartbeat.d.ts +34 -33
  292. package/dist/sync/heartbeat.js +31 -31
  293. package/dist/sync/participants.d.ts +19 -19
  294. package/dist/sync/schemas.d.ts +3 -2
  295. package/dist/sync/schemas.js +14 -10
  296. package/dist/sync/syncCursor.d.ts +17 -21
  297. package/dist/sync/syncCursor.js +17 -21
  298. package/dist/sync/syncPlan.d.ts +28 -36
  299. package/dist/sync/syncPlan.js +18 -19
  300. package/dist/sync/syncPosition.d.ts +54 -49
  301. package/dist/sync/syncPosition.js +57 -52
  302. package/dist/sync/wsFrameHandlers.d.ts +35 -36
  303. package/dist/sync/wsFrameHandlers.js +63 -67
  304. package/dist/testing/fixtures/bootstrap.d.ts +12 -6
  305. package/dist/testing/fixtures/bootstrap.js +12 -6
  306. package/dist/testing/fixtures/deltas.d.ts +30 -33
  307. package/dist/testing/fixtures/deltas.js +30 -33
  308. package/dist/testing/fixtures/models.d.ts +11 -10
  309. package/dist/testing/fixtures/models.js +11 -10
  310. package/dist/testing/helpers/{react-wrapper.d.ts → reactWrapper.d.ts} +13 -10
  311. package/dist/testing/helpers/{react-wrapper.js → reactWrapper.js} +15 -12
  312. package/dist/testing/helpers/{sync-engine-harness.d.ts → syncEngineHarness.d.ts} +17 -15
  313. package/dist/testing/helpers/{sync-engine-harness.js → syncEngineHarness.js} +12 -10
  314. package/dist/testing/helpers/wait.d.ts +13 -8
  315. package/dist/testing/helpers/wait.js +13 -8
  316. package/dist/testing/index.d.ts +3 -3
  317. package/dist/testing/index.js +2 -2
  318. package/dist/testing/mocks/MockMutationExecutor.d.ts +18 -17
  319. package/dist/testing/mocks/MockMutationExecutor.js +15 -14
  320. package/dist/testing/mocks/MockNetworkMonitor.d.ts +8 -8
  321. package/dist/testing/mocks/MockNetworkMonitor.js +8 -8
  322. package/dist/testing/mocks/MockSyncContext.d.ts +20 -17
  323. package/dist/testing/mocks/MockSyncContext.js +15 -13
  324. package/dist/testing/mocks/MockSyncStore.d.ts +10 -10
  325. package/dist/testing/mocks/MockSyncStore.js +11 -11
  326. package/dist/testing/mocks/MockWebSocket.d.ts +26 -22
  327. package/dist/testing/mocks/MockWebSocket.js +22 -21
  328. package/dist/transactions/TransactionQueue.d.ts +181 -176
  329. package/dist/transactions/TransactionQueue.js +338 -350
  330. package/dist/transactions/TransactionStore.d.ts +6 -4
  331. package/dist/transactions/TransactionStore.js +6 -4
  332. package/dist/transactions/UnconfirmedWrites.d.ts +82 -0
  333. package/dist/transactions/UnconfirmedWrites.js +104 -0
  334. package/dist/transactions/coalesceRules.d.ts +41 -17
  335. package/dist/transactions/coalesceRules.js +40 -17
  336. package/dist/transactions/commitPayload.d.ts +48 -52
  337. package/dist/transactions/commitPayload.js +48 -57
  338. package/dist/transactions/deltaConfirmation.d.ts +20 -22
  339. package/dist/transactions/deltaConfirmation.js +37 -45
  340. package/dist/transactions/optimisticApply.d.ts +49 -0
  341. package/dist/transactions/optimisticApply.js +65 -0
  342. package/dist/transactions/{persistedReplay.d.ts → replayValidation.d.ts} +28 -22
  343. package/dist/transactions/{persistedReplay.js → replayValidation.js} +33 -27
  344. package/dist/types/global.d.ts +46 -41
  345. package/dist/types/global.js +20 -19
  346. package/dist/types/index.d.ts +71 -77
  347. package/dist/types/index.js +22 -22
  348. package/dist/types/modelData.d.ts +6 -8
  349. package/dist/types/modelData.js +5 -7
  350. package/dist/types/participant.d.ts +10 -11
  351. package/dist/types/participant.js +6 -8
  352. package/dist/types/streams.d.ts +208 -195
  353. package/dist/types/streams.js +7 -7
  354. package/dist/utils/asyncIterator.d.ts +25 -32
  355. package/dist/utils/asyncIterator.js +25 -32
  356. package/dist/utils/duration.d.ts +12 -15
  357. package/dist/utils/duration.js +12 -15
  358. package/dist/utils/mobxSetup.d.ts +53 -0
  359. package/dist/utils/{mobx-setup.js → mobxSetup.js} +42 -98
  360. package/dist/webhooks/events.d.ts +21 -16
  361. package/dist/webhooks/events.js +10 -8
  362. package/dist/webhooks/index.d.ts +5 -7
  363. package/dist/webhooks/index.js +5 -7
  364. package/dist/{schema/sync-delta-wire.d.ts → wire/delta.d.ts} +58 -41
  365. package/dist/wire/delta.js +114 -0
  366. package/dist/wire/errorEnvelope.d.ts +30 -31
  367. package/dist/wire/errorEnvelope.js +34 -40
  368. package/dist/wire/frames.d.ts +79 -86
  369. package/dist/wire/frames.js +26 -33
  370. package/dist/wire/index.d.ts +14 -12
  371. package/dist/wire/index.js +30 -26
  372. package/dist/wire/listEnvelope.d.ts +16 -23
  373. package/dist/wire/listEnvelope.js +7 -6
  374. package/dist/wire/protocol.d.ts +25 -32
  375. package/dist/wire/protocol.js +25 -32
  376. package/dist/wire/protocolVersion.d.ts +44 -40
  377. package/dist/wire/protocolVersion.js +44 -40
  378. package/docs/coordination.md +59 -0
  379. package/package.json +11 -10
  380. package/dist/ai-sdk/coordinated-tool.d.ts +0 -101
  381. package/dist/ai-sdk/coordination-context.d.ts +0 -52
  382. package/dist/core/query-utils.d.ts +0 -34
  383. package/dist/core/query-utils.js +0 -59
  384. package/dist/schema/sync-delta-row.js +0 -103
  385. package/dist/schema/sync-delta-wire.js +0 -102
  386. package/dist/server/read-config.d.ts +0 -67
  387. package/dist/server/read-config.js +0 -8
  388. package/dist/server/storage-mode.d.ts +0 -8
  389. package/dist/server/storage-mode.js +0 -28
  390. package/dist/source/connector-protocol.d.ts +0 -159
  391. package/dist/source/connector-protocol.js +0 -161
  392. package/dist/transactions/OptimisticEchoTracker.d.ts +0 -82
  393. package/dist/transactions/OptimisticEchoTracker.js +0 -104
  394. package/dist/transactions/mutation-error-handler.d.ts +0 -5
  395. package/dist/transactions/mutation-error-handler.js +0 -39
  396. package/dist/transactions/optimistic.d.ts +0 -24
  397. package/dist/transactions/optimistic.js +0 -45
  398. package/dist/utils/mobx-setup.d.ts +0 -42
@@ -1,17 +1,33 @@
1
1
  /**
2
- * Stateless API client for `Ablo({ apiKey })`.
3
- *
4
- * This is the hosted-API product surface: no schema, no object pool, no
5
- * IndexedDB, no WebSocket. It maps the public Model / Claim / Commit
6
- * nouns directly to HTTP routes on sync-server.
2
+ * The stateless API client behind `Ablo({ apiKey })`. It carries no schema,
3
+ * object pool, local database, or WebSocket, and maps the public Model, Claim,
4
+ * and Commit nouns directly to HTTP routes on the server. This is the transport
5
+ * used for server-side agents, workers, and serverless code.
7
6
  */
8
7
  import { AbloClaimedError, AbloAuthenticationError, AbloConnectionError, AbloValidationError, AbloNotFoundError, claimedError, translateHttpError, } from '../errors.js';
9
8
  import { reconcileFunctionalUpdate, } from './functionalUpdate.js';
10
9
  import { assertBrowserSafety, readProcessEnv, resolveApiKey, resolveApiKeyValue, resolveAuthToken, resolveBaseURL, resolveBootstrapBaseUrl, resolveDatabaseUrl, warnIfCliKeyMismatch, warnIfDatabaseUrlEnvIgnored, warnIfDatabaseUrlDeprecated, } from './auth.js';
11
10
  import { registerDataSource } from './registerDataSource.js';
12
11
  import { PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER } from '../wire/protocolVersion.js';
13
- import { toSeconds } from '../utils/duration.js';
12
+ import { toMs, toSeconds } from '../utils/duration.js';
13
+ import { heartbeatCadenceMs, resolveHeartbeatOptions, startClaimHeartbeatLoop, } from './claimHeartbeatLoop.js';
14
14
  import { mintSession } from './sessionMint.js';
15
+ /**
16
+ * Interpret a heartbeat reply for a lease this handle HOLDS: anything other
17
+ * than `held` means the lease is no longer ours (a holder cannot be `queued`;
18
+ * `lost` rides a 409 that the wire error mapping already surfaces as
19
+ * AbloClaimedError before reaching here). The thrown loss is the definitive
20
+ * signal that stops the auto-heartbeat loop.
21
+ */
22
+ function heldHeartbeatReply(reply, label) {
23
+ if (reply.status === 'held' && typeof reply.expiresAt === 'number') {
24
+ return {
25
+ expiresAt: reply.expiresAt,
26
+ ...(reply.queueDepth !== undefined ? { queueDepth: reply.queueDepth } : {}),
27
+ };
28
+ }
29
+ throw new AbloClaimedError(`The lease behind ${label} is no longer held — it expired or was granted onward. Re-acquire the claim and retry; a write attempted under the old lease is rejected by its \`readAt\` guard.`, { code: 'claim_lost' });
30
+ }
15
31
  import { assertWriteOptions } from './writeOptionsSchema.js';
16
32
  /** Default per-request deadline for the stateless HTTP transport. */
17
33
  export const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
@@ -32,11 +48,12 @@ export function createProtocolClient(options) {
32
48
  databaseUrl: configuredDatabaseUrl,
33
49
  dangerouslyAllowBrowser: options.dangerouslyAllowBrowser,
34
50
  });
35
- // Observability seam for the STATELESS HTTP transport. The WS transport emits
36
- // claim/conflict events from SyncWebSocket; the HTTP path (server-side agents,
51
+ // Observability hook for the stateless HTTP transport. The WebSocket transport
52
+ // emits claim and conflict events; the HTTP path (server-side agents,
37
53
  // `transport: 'http'`) emitted nothing, so a `ClaimLog` handed to a headless
38
- // agent eval stayed empty. Mirror the two WS seams here: claim acquired +
39
- // coordination-conflict rejection. No-op when no provider is configured.
54
+ // agent evaluation stayed empty. This mirrors the two WebSocket events here:
55
+ // claim acquired and coordination-conflict rejection. A no-op when no provider
56
+ // is configured.
40
57
  const observability = options.observability;
41
58
  // Shared by the two HTTP write doors (`commits.create` + per-model
42
59
  // `mutateModel`): a rejected write whose code is a coordination conflict is
@@ -139,7 +156,7 @@ export function createProtocolClient(options) {
139
156
  // is combined with the deadline via a shared controller — the portable
140
157
  // equivalent of `AbortSignal.any([caller, AbortSignal.timeout(t)])`,
141
158
  // which older runtimes (and the jsdom test env) don't implement. The
142
- // same pattern already guards `query/client.ts` and `BootstrapHelper`.
159
+ // same pattern already guards `query/client.ts` and `BootstrapFetcher`.
143
160
  const callerSignal = requestInit.signal ?? undefined;
144
161
  const controller = new AbortController();
145
162
  const onCallerAbort = () => { controller.abort(callerSignal?.reason); };
@@ -482,11 +499,11 @@ export function createProtocolClient(options) {
482
499
  queue: claimOptions.queue,
483
500
  }),
484
501
  });
485
- // The fair-queue grant is PUSHED over a WebSocket (`claim_granted`),
486
- // which this stateless HTTP client doesn't hold. Returning a handle here
487
- // would be a phantom holder — a lease we can't confirm is ours. So a
488
- // queued response is surfaced as a typed claimed signal; callers that need
489
- // to *wait* in line use the realtime (WS-backed) `ablo.<model>.claim`.
502
+ // The fair-queue grant is pushed over a WebSocket (`claim_granted`), which
503
+ // this stateless HTTP client doesn't hold. Returning a handle here would be
504
+ // a phantom holder — a lease we can't confirm is ours. So a queued response
505
+ // is surfaced as a typed claimed signal; callers that need to wait in line
506
+ // use the realtime (WebSocket-backed) `ablo.<model>.claim`.
490
507
  if (body.status === 'queued') {
491
508
  throw new AbloClaimedError(`Target ${claimOptions.target.model}/${claimOptions.target.id} is held; ` +
492
509
  `queued at position ${body.position ?? 0}. The HTTP client can't await ` +
@@ -500,9 +517,24 @@ export function createProtocolClient(options) {
500
517
  released = true;
501
518
  await requestJson(`/v1/claims/${encodeURIComponent(id)}`, { method: 'DELETE' });
502
519
  };
520
+ // The by-id twin of the model-scoped heartbeat — same reply contract.
521
+ const heartbeat = async (beatOptions) => {
522
+ const resolved = resolveHeartbeatOptions(beatOptions);
523
+ const reply = await requestJson(`/v1/claims/${encodeURIComponent(id)}/heartbeat`, {
524
+ method: 'POST',
525
+ body: JSON.stringify({
526
+ ...(resolved.ttl !== undefined ? { ttl: resolved.ttl } : {}),
527
+ ...(resolved.details !== undefined
528
+ ? { details: resolved.details }
529
+ : {}),
530
+ }),
531
+ });
532
+ return heldHeartbeatReply(reply, `claim ${id}`);
533
+ };
503
534
  return {
504
535
  object: 'claim',
505
536
  id,
537
+ heartbeat,
506
538
  reason: claimOptions.reason,
507
539
  target: {
508
540
  type: claimOptions.target.model,
@@ -523,6 +555,23 @@ export function createProtocolClient(options) {
523
555
  waitFor(target, options) {
524
556
  return waitForNoClaims(target, options);
525
557
  },
558
+ async heartbeatAll(options) {
559
+ const reply = await requestJson('/v1/claims/heartbeat', {
560
+ method: 'POST',
561
+ body: JSON.stringify(options?.ttl !== undefined ? { ttl: options.ttl } : {}),
562
+ });
563
+ return (reply.results ?? []).flatMap((entry) => typeof entry.claimId === 'string' && typeof entry.expiresAt === 'number'
564
+ ? [
565
+ {
566
+ claimId: entry.claimId,
567
+ expiresAt: entry.expiresAt,
568
+ ...(entry.queueDepth !== undefined
569
+ ? { queueDepth: entry.queueDepth }
570
+ : {}),
571
+ },
572
+ ]
573
+ : []);
574
+ },
526
575
  };
527
576
  async function listModel(modelName, options) {
528
577
  const params = new URLSearchParams();
@@ -554,11 +603,11 @@ export function createProtocolClient(options) {
554
603
  const query = await requestJson(`/v1/models/${encodeURIComponent(modelName)}/${encodeURIComponent(params.id)}`, {
555
604
  method: 'GET',
556
605
  });
557
- // Miss = `data: undefined`, NOT a thrown error. The WebSocket client's
606
+ // A miss is `data: undefined`, not a thrown error. The WebSocket client's
558
607
  // `retrieve` returns `T | undefined` for a missing row; throwing only here
559
608
  // made the obvious read ("does this row exist?") a hard edge that an agent
560
- // had to wrap in try/catch. Both transports now agree: absent row absent
561
- // data. Callers branch on `.data` (already the documented `.data?.x` usage).
609
+ // had to wrap in try/catch. Both transports agree: an absent row means absent
610
+ // data. Callers branch on `.data` (the documented `.data?.x` usage).
562
611
  // Normalize a miss to `undefined` (the server may send `null` or omit it).
563
612
  const data = (query.data ?? undefined);
564
613
  return {
@@ -568,16 +617,16 @@ export function createProtocolClient(options) {
568
617
  };
569
618
  }
570
619
  /**
571
- * Single-op mutation over the model-scoped routes — the canonical surface
572
- * that mirrors `ablo.<model>.create/update/delete`:
620
+ * A single-operation mutation over the model-scoped routes — the canonical
621
+ * surface that mirrors `ablo.<model>.create/update/delete`:
573
622
  *
574
623
  * POST /v1/models/:model create
575
624
  * PATCH /v1/models/:model/:id update
576
625
  * DELETE /v1/models/:model/:id delete
577
626
  *
578
- * This replaces the previous indirection through `POST /v1/commits`. The raw
579
- * `commits.create(...)` resource is still the path for ATOMIC MULTI-OP
580
- * envelopes — this helper is the one-op, one-record path only.
627
+ * The `commits.create(...)` resource remains the path for atomic
628
+ * multi-operation envelopes; this helper handles the one-operation,
629
+ * one-record case.
581
630
  */
582
631
  async function mutateModel(action, modelName, id, data, options) {
583
632
  assertWriteOptions(options && {
@@ -621,9 +670,8 @@ export function createProtocolClient(options) {
621
670
  });
622
671
  }
623
672
  catch (error) {
624
- // Per-model write door (`ablo.<model>.update/create/delete`) — the path
625
- // the demo editor + server agents actually take. Capture coordination
626
- // collisions here too; this single row IS the fallback target.
673
+ // The per-model write door (`ablo.<model>.update/create/delete`). Capture
674
+ // coordination collisions here too; this single row is the fallback target.
627
675
  recordCoordinationConflict(error, clientTxId, [{ model: modelName, id }]);
628
676
  throw error;
629
677
  }
@@ -669,11 +717,25 @@ export function createProtocolClient(options) {
669
717
  throw new AbloClaimedError(`Target ${name}/${params.id} is held; queued at position ${body.position ?? 0}. ` +
670
718
  `The HTTP client cannot await the grant without a WebSocket.`, { code: 'claim_queued' });
671
719
  }
672
- // `claimId` is the queued-response field name (routes/claims.ts) — a
673
- // pre-rename regression duplicated the `body.id` arm and dropped it.
720
+ // `claimId` is the field name the queued response uses; check it alongside
721
+ // the other id shapes the response may carry.
674
722
  return body.claim?.id ?? body.id ?? body.claimId ?? createClaimId();
675
723
  };
676
724
  const releaseClaim = (params) => requestJson(claimPath(isClaimHandle(params) ? params.target.id : params.id), { method: 'DELETE' }).then(() => undefined);
725
+ // One beat on the held lease. A lapsed lease answers `claim_lost`
726
+ // (409), which the wire error mapping surfaces as AbloClaimedError —
727
+ // the definitive signal that stops the auto-heartbeat loop.
728
+ const heartbeatClaim = async (id, claimId, options) => {
729
+ const reply = await requestJson(`${claimPath(id)}/heartbeat`, {
730
+ method: 'POST',
731
+ body: JSON.stringify({
732
+ claimId,
733
+ ...(options.ttl !== undefined ? { ttl: options.ttl } : {}),
734
+ ...(options.details !== undefined ? { details: options.details } : {}),
735
+ }),
736
+ });
737
+ return heldHeartbeatReply(reply, `claim ${claimId} on ${name}/${id}`);
738
+ };
677
739
  async function claimImpl(params) {
678
740
  const claimId = await acquireClaim(params);
679
741
  observability?.captureClaim({
@@ -691,7 +753,33 @@ export function createProtocolClient(options) {
691
753
  if (data === undefined) {
692
754
  throw new AbloNotFoundError(`Cannot claim ${name}/${params.id}: it does not exist (or is outside this credential's scope).`, [params.id]);
693
755
  }
694
- const release = () => releaseClaim(params);
756
+ const heartbeat = async (beatOptions) => {
757
+ const resolved = resolveHeartbeatOptions(beatOptions);
758
+ const beat = await heartbeatClaim(params.id, claimId, {
759
+ ttl: resolved.ttl ?? params.ttl,
760
+ ...(resolved.details !== undefined
761
+ ? { details: resolved.details }
762
+ : {}),
763
+ });
764
+ params.onHeartbeat?.(beat);
765
+ return beat;
766
+ };
767
+ // Opt-in auto-heartbeat — the background-worker cadence. The stateless
768
+ // HTTP claim defaults to the server's 60s acquire window when no TTL
769
+ // was requested, so the default cadence lands at 20s beats.
770
+ const stopHeartbeatLoop = params.heartbeat
771
+ ? startClaimHeartbeatLoop({
772
+ beat: () => heartbeat(),
773
+ intervalMs: heartbeatCadenceMs(params.ttl !== undefined ? toMs(params.ttl) : 60_000, params.heartbeat),
774
+ ...(params.onHeartbeatLost
775
+ ? { onLost: params.onHeartbeatLost }
776
+ : {}),
777
+ })
778
+ : undefined;
779
+ const release = () => {
780
+ stopHeartbeatLoop?.();
781
+ return releaseClaim(params);
782
+ };
695
783
  return {
696
784
  object: 'claim',
697
785
  id: claimId,
@@ -711,6 +799,7 @@ export function createProtocolClient(options) {
711
799
  revoke: () => {
712
800
  void release().catch(() => { });
713
801
  },
802
+ heartbeat,
714
803
  [Symbol.asyncDispose]: release,
715
804
  };
716
805
  }
@@ -729,8 +818,8 @@ export function createProtocolClient(options) {
729
818
  reorder: async (params) => {
730
819
  await requestJson(`${claimPath(params.id)}/reorder`, {
731
820
  method: 'POST',
732
- // The reorder route's payload is `{ heldBy, claimId }[]` — Claim's id
733
- // IS the claimId.
821
+ // The reorder route's payload is `{ heldBy, claimId }[]` — a Claim's id
822
+ // is the claimId.
734
823
  body: JSON.stringify({ order: params.order.map((i) => ({ heldBy: i.heldBy, claimId: i.id })) }),
735
824
  });
736
825
  },
@@ -742,7 +831,13 @@ export function createProtocolClient(options) {
742
831
  if (isClaimHandle(claimInput)) {
743
832
  return run({ ...input, claimRef: { id: claimInput.id }, claim: undefined });
744
833
  }
745
- const claimId = await acquireClaim({ id, ...claimInput });
834
+ // `isClaimHandle` ruled out the handle form above; the generic mismatch
835
+ // (the union carries `Claim`, the guard narrows `Claim<T>`) keeps the
836
+ // compiler from subtracting it, so narrow to the inline-options form.
837
+ const claimId = await acquireClaim({
838
+ id,
839
+ ...claimInput,
840
+ });
746
841
  try {
747
842
  return await run({ ...input, claimRef: { id: claimId }, claim: undefined });
748
843
  }
@@ -796,8 +891,8 @@ export function createProtocolClient(options) {
796
891
  // Confirm the write, then return the row — the obvious expectation of
797
892
  // "create" (the WebSocket client already returns the row). The read-
798
893
  // back is the authoritative server row, so it carries the framework
799
- // defaults (createdAt/createdBy/…) AND, for an idempotent re-create of
800
- // an existing id, the EXISTING row rather than the caller's input.
894
+ // defaults (createdAt, createdBy, …) and, for an idempotent re-create of
895
+ // an existing id, the existing row rather than the caller's input.
801
896
  await mutateModel('create', name, id, params.data, {
802
897
  ...options,
803
898
  wait: options?.wait ?? 'confirmed',
@@ -829,9 +924,9 @@ export function createProtocolClient(options) {
829
924
  model,
830
925
  sessions: {
831
926
  async create(params) {
832
- // Stateless mint: the configured key IS the control-plane credential here
833
- // (no startup `rk_` exchange runs on this client). Reuse the resolved base
834
- // URL + fetch; the shared `mintSession` owns the two server doors.
927
+ // Stateless mint: the configured key is the control-plane credential here
928
+ // (no startup `rk_` exchange runs on this client). It reuses the resolved
929
+ // base URL and fetch; the shared `mintSession` handles the two server routes.
835
930
  const apiKey = await resolveApiKeyValue(configuredApiKey);
836
931
  if (!apiKey) {
837
932
  throw new AbloAuthenticationError('sessions.create requires a secret (sk_) API key — call it from your backend, not the browser.', { code: 'apikey_missing' });
@@ -1,29 +1,29 @@
1
1
  /**
2
- * Auth + URL resolution for `Ablo()`.
2
+ * Authentication and URL resolution for the `Ablo()` client.
3
3
  *
4
- * Mirrors the small, focused helpers Anthropic ships in `client.ts`
5
- * (`apiKeyAuth`, `bearerAuth`, `validateHeaders`). Each function does
6
- * one thing resolve a value with the right precedence, or fail
7
- * with an actionable message — so the constructor reads as a
8
- * sequence of named decisions rather than a stream of `??`-chains.
4
+ * Each function here makes one decision: it resolves a configuration value with
5
+ * the right precedence, or fails with an actionable message. Together they let
6
+ * the client constructor read as a sequence of named steps rather than a chain
7
+ * of fallbacks.
9
8
  *
10
- * Customer-facing env surface is intentionally small: `ABLO_API_KEY`
11
- * is the only environment fallback. Other routing/auth overrides are
12
- * explicit options so generated apps do not accrete hidden env knobs.
9
+ * The environment surface is deliberately small: `ABLO_API_KEY` is the only
10
+ * value read from the environment. Every other routing or authentication
11
+ * override is an explicit option, so an app never picks up hidden behavior from
12
+ * a stray environment variable.
13
13
  */
14
14
  /**
15
- * The credential-resolver callable contract. Defined in the `credentialEndpoint`
16
- * leaf (which produces one) and re-exported here — the historical home — so
17
- * `./auth` importers keep working while the module graph stays one-directional
18
- * (`auth → credentialEndpoint`, never back). See there for the full contract.
15
+ * The credential-resolver callable type. It is defined alongside
16
+ * {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
17
+ * re-exported here so importers of this module keep working. See that module
18
+ * for the full contract.
19
19
  */
20
20
  import type { ApiKeySetter } from './credentialEndpoint.js';
21
21
  export type { ApiKeySetter };
22
22
  export interface AuthResolveInput {
23
23
  /**
24
- * The full options bag the caller passed to `Ablo()`. Resolvers
25
- * read only the fields they care about; the wide shape avoids
26
- * passing N parameters into each helper.
24
+ * The full set of options the caller passed to the client constructor. Each
25
+ * resolver reads only the fields it needs; passing the whole object avoids
26
+ * threading many separate parameters through every helper.
27
27
  */
28
28
  readonly options: {
29
29
  readonly apiKey?: string | ApiKeySetter | null;
@@ -63,20 +63,21 @@ export interface CliKeyMismatch {
63
63
  readonly kind: 'mode_mismatch' | 'key_override';
64
64
  readonly message: string;
65
65
  }
66
- /** Infer sandbox/production from Ablo key prefixes without importing CLI code. */
66
+ /** Infer the sandbox or production mode from an Ablo key's prefix. */
67
67
  export declare function modeFromApiKey(key: string): CliMode | undefined;
68
68
  export declare function describeCliKeyMismatch(configured: StaticApiKey, cli: CliCredentialSnapshot): CliKeyMismatch | null;
69
69
  /**
70
- * Resolve the direct-URL connector's Postgres connection string.
70
+ * Resolves the Postgres connection string for the direct-connection option, or
71
+ * `null` when none was given.
71
72
  *
72
- * `databaseUrl` is an EXPLICIT, opt-in option: Ablo registers a dedicated
73
- * tenant database only when the caller passes it to `Ablo(...)`. It is NOT
74
- * read from `process.env.DATABASE_URL` per this module's invariant
75
- * (`ABLO_API_KEY` is the only environment fallback), an app's `DATABASE_URL`
76
- * (commonly set for Prisma/Drizzle/docker) must never silently flip the client
77
- * into connection-string mode. The default Data Source path keeps `DATABASE_URL`
78
- * in the app and exposes `dataSource(...)`; that path leaves this null.
79
- * `warnIfDatabaseUrlEnvIgnored` nudges callers who set the env but omitted the option.
73
+ * `databaseUrl` is opt-in: the client registers a dedicated database only when
74
+ * the caller passes it explicitly. It is never read from
75
+ * `process.env.DATABASE_URL`, because this module treats `ABLO_API_KEY` as the
76
+ * one environment fallback an app's `DATABASE_URL`, commonly set for other
77
+ * tools, must not silently switch the client into connection-string mode. The
78
+ * default path leaves `DATABASE_URL` untouched and reads through `dataSource(...)`
79
+ * instead, so this returns `null`. {@link warnIfDatabaseUrlEnvIgnored} nudges a
80
+ * caller who set the environment variable but omitted the option.
80
81
  */
81
82
  export declare function resolveDatabaseUrl(input: AuthResolveInput): string | null;
82
83
  export declare function warnIfDatabaseUrlEnvIgnored(input: AuthResolveInput, warn?: (message: string) => void): void;
@@ -84,17 +85,19 @@ export declare function warnIfDatabaseUrlDeprecated(input: AuthResolveInput, war
84
85
  export declare function warnIfCliKeyMismatch(input: AuthResolveInput, warn?: (message: string) => void): Promise<void>;
85
86
  export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
86
87
  /**
87
- * Normalize old hosted aliases to the public API domain. Self-hosted/custom
88
- * URLs pass through unchanged; only first-party legacy hosts are rewritten.
88
+ * Normalizes older hosted host names to the current public API domain.
89
+ * Self-hosted or custom URLs pass through unchanged; only the retired
90
+ * first-party host names are rewritten.
89
91
  */
90
92
  export declare function normalizeAbloHostedBaseUrl(rawUrl: string): string;
91
93
  export declare function resolveBaseURL(input: AuthResolveInput): string;
92
94
  /**
93
- * Browser guard apiKey is server-side-only by default. Same check
94
- * Anthropic, OpenAI, and Stripe ship: shipping `sk_live_...` to a
95
- * browser exposes it in every visitor's network tab. Consumers opt
96
- * in explicitly when the browser holds a minted session token
97
- * (`ek_`/`rk_`) or routes through a server proxy.
95
+ * Guards against using a secret `apiKey` in a browser. A secret key is
96
+ * server-side only by default: shipping an `sk_live_...` key to a browser would
97
+ * expose it in every visitor's network tab. Callers opt in explicitly when the
98
+ * browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
99
+ * server proxy. Throws {@link AbloAuthenticationError} when a secret key is
100
+ * detected in a browser without opt-in.
98
101
  */
99
102
  export declare function assertBrowserSafety(input: {
100
103
  apiKey: string | ApiKeySetter | null;
@@ -102,24 +105,21 @@ export declare function assertBrowserSafety(input: {
102
105
  dangerouslyAllowBrowser: boolean | undefined;
103
106
  }): void;
104
107
  /**
105
- * Resolve an `ApiKeySetter` callable to its current string value.
106
- * Used at request time so a rotating credential picks up rotations
107
- * between requests. Returns `null` when no key was configured.
108
- *
109
- * Mirrors Anthropic's pattern of supporting both a static string and
110
- * a callable for credential rotation.
108
+ * Resolves an {@link ApiKeySetter} callable to its current string value, or
109
+ * returns a plain string key as-is. Called at request time so a rotating
110
+ * credential picks up new values between requests. Returns `null` when no key
111
+ * was configured.
111
112
  */
112
113
  export declare function resolveApiKeyValue(apiKey: string | ApiKeySetter | null): Promise<string | null>;
113
114
  /**
114
- * Translate a sync-engine WebSocket URL to the matching HTTP API
115
- * base URL, defaulting to `${url}/api` when the caller hasn't
116
- * overridden `bootstrapBaseUrl`. Used by `BootstrapHelper`,
117
- * `HydrationCoordinator`, the apiKey-exchange flow, and the
118
- * self-derived identity flow — same derivation in all four spots,
119
- * so it lives here as a single source of truth.
115
+ * Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
116
+ * `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
117
+ * bootstrap helper, the hydration coordinator, the credential-exchange flow, and
118
+ * the identity flow all derive their base URL through this one function, so the
119
+ * derivation stays consistent across them.
120
120
  *
121
- * Note: when both `wss://` and `https://` are valid, `replace(/^ws/, 'http')`
122
- * preserves the protocol family (ws http, wss https).
121
+ * When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
122
+ * the protocol family: ws becomes http and wss becomes https.
123
123
  */
124
124
  export declare function resolveBootstrapBaseUrl(input: {
125
125
  readonly url: string;