@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
@@ -0,0 +1,373 @@
1
+ /**
2
+ * The option types for the {@link Ablo} client: the public {@link AbloOptions}
3
+ * bag callers pass, and the fuller {@link InternalAbloOptions} construction
4
+ * surface. This module holds only types and has no runtime imports.
5
+ */
6
+ import type { Schema, SchemaRecord } from '../schema/schema.js';
7
+ import type { SyncEngineConfig, SyncLogger, MutationExecutor, SyncObservabilityProvider, SyncAnalytics, SessionErrorDetector, OnlineStatusProvider } from '../interfaces/index.js';
8
+ import type { AbloPersistence } from './persistence.js';
9
+ /**
10
+ * An async function that resolves an apiKey at request time. Use it for credential
11
+ * rotation — read from a vault, refresh from session storage, or pull from an
12
+ * existing auth session. The canonical definition lives in `./auth`; it is
13
+ * re-exported here for convenience.
14
+ */
15
+ export type { ApiKeySetter } from './auth.js';
16
+ import type { ApiKeySetter } from './auth.js';
17
+ /**
18
+ * Options for the {@link Ablo} client.
19
+ *
20
+ * The only required field is `schema`. Because `apiKey` defaults to the
21
+ * `ABLO_API_KEY` environment variable, most server setups need nothing more:
22
+ *
23
+ * ```ts
24
+ * const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY });
25
+ * ```
26
+ *
27
+ * Every other field is optional tuning — timeouts, retries, a custom fetch,
28
+ * persistence. If you are unsure whether you need one, you do not.
29
+ *
30
+ * @see https://docs.abloatai.com — full option reference
31
+ */
32
+ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
33
+ /**
34
+ * TypeScript schema defined with `defineSchema()`. Required — it's what
35
+ * makes `ablo.weatherReports.update(...)` typed. This is the one field you must
36
+ * pass; start here.
37
+ */
38
+ schema: Schema<S>;
39
+ /**
40
+ * The API key — the auth field most apps set. It accepts three shapes:
41
+ *
42
+ * - **A key string** (server): your secret `sk_` key. Defaults to the
43
+ * `ABLO_API_KEY` environment variable, so you usually pass nothing. A
44
+ * long-lived key needs no refresh; the client uses it as-is.
45
+ *
46
+ * - **An endpoint path or URL** — for example `apiKey: '/api/ablo-session'`.
47
+ * The client owns the whole exchange: it POSTs the endpoint (same-origin,
48
+ * cookies included), reads the minted short-lived token, and keeps it fresh
49
+ * with a refresh timer ahead of expiry, a re-mint after the machine wakes
50
+ * from sleep, and a re-mint when the server reports the token stale. You
51
+ * never call a refresh method yourself. The shape is detected by prefix (`/`,
52
+ * `http://`, or `https://`); key strings start with `sk_`/`ek_`/`rk_`, so the
53
+ * two cannot be confused. A long-lived server client should pass an absolute
54
+ * URL, which also enables pre-expiry renewal on hosts that never sleep.
55
+ *
56
+ * - **An async resolver** `() => Promise<string | null>` — the escape hatch for
57
+ * when the exchange needs custom headers, a request body, or a non-HTTP mint
58
+ * (vault rotation, a cloud token service, an existing auth session). It uses
59
+ * the same renewal machinery as the endpoint form.
60
+ *
61
+ * The endpoint and resolver forms share one contract: return a token; return
62
+ * `null` when the login itself is gone (terminal — the client signs out and
63
+ * fails `ready()` with `session_expired`); or throw on a transient failure, which
64
+ * backs off and retries without signing out. The endpoint form maps HTTP onto
65
+ * this for you: 401 and 403 mean signed out, any other failure is transient.
66
+ */
67
+ apiKey?: string | ApiKeySetter | null | undefined;
68
+ /**
69
+ * The session-mint endpoint — the browser-side auth field, and the named
70
+ * counterpart to the endpoint-string form of {@link AbloOptions.apiKey}. Point it
71
+ * at the route that mints the signed-in user's short-lived token:
72
+ *
73
+ * ```ts
74
+ * const ablo = Ablo({ schema, authEndpoint: '/api/ablo-session' });
75
+ * ```
76
+ *
77
+ * The client owns the whole exchange: it POSTs the route (same-origin, cookies
78
+ * included), reads `{ token }`, keeps it fresh ahead of expiry, and re-mints when
79
+ * the server reports the token stale. A 401 or 403 from the route means signed
80
+ * out; any other failure is retried rather than treated as a sign-out. It also
81
+ * accepts an async resolver `() => Promise<string | null>` when the exchange
82
+ * needs custom headers or a body — the same contract as the resolver form of
83
+ * `apiKey`.
84
+ *
85
+ * Mutually exclusive with `apiKey`: a server holds a key, a browser holds a mint
86
+ * route, and passing both is a validation error.
87
+ */
88
+ authEndpoint?: string | ApiKeySetter | null | undefined;
89
+ /**
90
+ * @deprecated The direct connector lets Ablo dial into your Postgres and write to
91
+ * it directly. Prefer the signed data-source endpoint: keep your `DATABASE_URL`
92
+ * in your own app, expose `dataSource(...)`, and let your server own the write
93
+ * while Ablo coordinates the sync stream. Ablo hosts only the ordered
94
+ * `sync_deltas` log and coordination, never your rows. To keep the log in your own
95
+ * infrastructure as well, self-host the engine.
96
+ *
97
+ * Still honored at runtime for backward compatibility. It is server-only: because
98
+ * it carries credentials it is never sent from the browser, and constructing a
99
+ * client with both `databaseUrl` and `dangerouslyAllowBrowser` throws. If you do
100
+ * use it, supply a role that is neither a superuser nor `BYPASSRLS`; the connector
101
+ * rejects privileged roles that cannot enforce row-level security.
102
+ */
103
+ databaseUrl?: string | null | undefined;
104
+ /**
105
+ * Local persistence mode. Pass `indexeddb` only when you want offline
106
+ * queueing and a reload-surviving browser cache.
107
+ *
108
+ * @default 'memory'
109
+ */
110
+ persistence?: AbloPersistence;
111
+ /**
112
+ * Selects the transport. `'websocket'` (the default) is the live client: a
113
+ * persistent socket, a local synced cache, and `onChange` subscriptions. `'http'`
114
+ * returns the stateless client for server-side actors — agents, workers, and
115
+ * serverless handlers. It offers the same `ablo.<model>` surface and coordination
116
+ * plane, but every call is a single HTTP round-trip, identity rides the bearer
117
+ * credential, and no socket is opened. With `'http'` the return type narrows to
118
+ * {@link AbloHttpClient}, so stateful-only capabilities such as `get`, `getAll`,
119
+ * and `onChange` become compile errors instead of runtime gaps.
120
+ *
121
+ * Note: session minting through `sessions.create` runs on the default WebSocket
122
+ * client, not the HTTP client.
123
+ *
124
+ * @default 'websocket'
125
+ */
126
+ transport?: 'websocket' | 'http' | undefined;
127
+ /**
128
+ * Turns Ablo's diagnostic logging on or off. `true` surfaces the `[Ablo]`
129
+ * coordination trace — claims requested, queued, granted, and released, agent
130
+ * handovers, and connection state — so you can watch the coordination between
131
+ * humans and agents while debugging. Omitting it, or `false`, keeps the quiet
132
+ * default of warnings and errors only. For a middle ground use {@link logLevel}.
133
+ * The `ABLO_LOG_LEVEL` environment variable overrides it, and a custom logger
134
+ * takes precedence.
135
+ */
136
+ debug?: boolean | undefined;
137
+ /**
138
+ * The log threshold for the default `[Ablo]` logger; takes precedence over
139
+ * {@link debug}. `'info'` shows coordination and connection events without the
140
+ * per-model registration detail, `'debug'` shows everything, `'warn'` (the
141
+ * default) shows warnings and errors only, and `'silent'` shows nothing. The
142
+ * `ABLO_LOG_LEVEL` environment variable overrides it.
143
+ */
144
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'silent' | undefined;
145
+ /**
146
+ * Bearer auth token. Hosted-cloud consumers pass `apiKey`; self-hosted
147
+ * deployments may pass a bearer token minted by their own auth layer.
148
+ */
149
+ authToken?: string | null | undefined;
150
+ /**
151
+ * Override the Ablo API base URL. Defaults to hosted production.
152
+ */
153
+ baseURL?: string | null | undefined;
154
+ /** Custom fetch implementation for tests, proxies, or non-standard runtimes. */
155
+ fetch?: typeof fetch | undefined;
156
+ /** Default headers sent with every API request. */
157
+ defaultHeaders?: Record<string, string | null | undefined> | undefined;
158
+ /** Default query parameters sent with every API request. */
159
+ defaultQuery?: Record<string, string | undefined> | undefined;
160
+ /**
161
+ * Client-side use is disabled by default because private API keys should
162
+ * not ship to browsers. Set this only when the browser holds a minted
163
+ * session token (`ek_`/`rk_`) or you route through a controlled server proxy.
164
+ */
165
+ dangerouslyAllowBrowser?: boolean | undefined;
166
+ }
167
+ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
168
+ /**
169
+ * The API key used for authentication.
170
+ *
171
+ * Accepts a static string (`sk_live_...`) or an async function that resolves to
172
+ * one. Defaults to the `ABLO_API_KEY` environment variable.
173
+ *
174
+ * When a function is provided, it is invoked before each request, so you can
175
+ * rotate or refresh credentials at runtime. It must return a non-empty string, or
176
+ * an `AbloAuthenticationError` is thrown; if it throws, the error is wrapped with
177
+ * the original available as `cause`.
178
+ */
179
+ apiKey?: string | ApiKeySetter | null | undefined;
180
+ /**
181
+ * Session-mint endpoint (string or async resolver) — see
182
+ * {@link AbloOptions.authEndpoint}. Mutually exclusive with `apiKey`.
183
+ */
184
+ authEndpoint?: string | ApiKeySetter | null | undefined;
185
+ /**
186
+ * A bearer auth token, sent as `Authorization: Bearer <token>` on every request.
187
+ *
188
+ * Use it for self-hosted deployments where your own auth layer mints capability
189
+ * tokens directly. Hosted-cloud consumers pass `apiKey` instead and let the
190
+ * server mint the capability token.
191
+ */
192
+ authToken?: string | null | undefined;
193
+ /**
194
+ * Override the default base URL. Defaults to
195
+ * `wss://api.abloatai.com` for hosted production; pass an explicit
196
+ * URL for self-hosted or private deployments.
197
+ */
198
+ baseURL?: string | null | undefined;
199
+ /**
200
+ * Custom `fetch` implementation. Defaults to `globalThis.fetch`.
201
+ * Override for testing, custom transports, or runtime shims.
202
+ */
203
+ fetch?: typeof fetch | undefined;
204
+ /**
205
+ * Default headers to include with every request to the API.
206
+ * Removed per-request by setting the header to `null` in request
207
+ * options.
208
+ */
209
+ defaultHeaders?: Record<string, string | null | undefined> | undefined;
210
+ /**
211
+ * Default query parameters to include with every request.
212
+ * Removed per-request by setting the param to `undefined`.
213
+ */
214
+ defaultQuery?: Record<string, string | undefined> | undefined;
215
+ /**
216
+ * Client-side use of this SDK is disabled by default — your apiKey
217
+ * would ship to every visitor's network tab. Only set this to
218
+ * `true` if you've understood the risk and have appropriate
219
+ * mitigations (a minted session token, a server-side proxy, etc).
220
+ */
221
+ dangerouslyAllowBrowser?: boolean | undefined;
222
+ /**
223
+ * TypeScript schema defined with `defineSchema()`.
224
+ *
225
+ * The root `Ablo(...)` client is schema-first so consumers get typed
226
+ * model clients such as `ablo.weatherReports.update(...)`. Omit `schema`
227
+ * only for the advanced Model / Claim / Commit client.
228
+ */
229
+ schema: Schema<S>;
230
+ /**
231
+ * @deprecated The server derives the participant kind from the apiKey's scope.
232
+ * Pass `apiKey` only.
233
+ */
234
+ kind?: 'user' | 'agent' | 'system';
235
+ /**
236
+ * @deprecated The server derives user identity from the apiKey's scope, or from
237
+ * the `Ablo-Acting-User` request header for multi-tenant setups. Pass `apiKey`
238
+ * only.
239
+ */
240
+ user?: {
241
+ id: string;
242
+ teamIds?: string[];
243
+ };
244
+ /**
245
+ * @deprecated The server derives agent identity from the apiKey's scope. Pass
246
+ * `apiKey` only.
247
+ */
248
+ agentId?: string;
249
+ /**
250
+ * @deprecated Pass `apiKey` only; the server issues the capability token.
251
+ */
252
+ capabilityToken?: string;
253
+ /** Custom logger (default: console). Supplying one bypasses {@link debug}/{@link logLevel}. */
254
+ logger?: SyncLogger;
255
+ /**
256
+ * Turns Ablo's diagnostic logging on or off. `true` surfaces the `[Ablo]`
257
+ * coordination trace — claims acquired, queued, granted, and released, agent
258
+ * handovers, and connection state — along with internal lifecycle events, so you
259
+ * can watch the coordination between humans and agents. Omitting it, or `false`,
260
+ * keeps the quiet default of warnings and errors only. For a middle ground use
261
+ * {@link logLevel}. The `ABLO_LOG_LEVEL` environment variable overrides it, and a
262
+ * custom {@link logger} takes precedence.
263
+ */
264
+ debug?: boolean;
265
+ /**
266
+ * The log threshold for the default `[Ablo]` logger; takes precedence over
267
+ * {@link debug}. `'info'` shows coordination and connection events without the
268
+ * per-model registration detail, `'debug'` shows everything, `'warn'` (the
269
+ * default) shows warnings and errors only, and `'silent'` shows nothing. The
270
+ * `ABLO_LOG_LEVEL` environment variable overrides it.
271
+ */
272
+ logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'silent';
273
+ /** InstanceCache size limit (default: 10000) */
274
+ maxPoolSize?: number;
275
+ /**
276
+ * Local persistence mode. Defaults to `memory`, keeping the local cache in
277
+ * process rather than adding IndexedDB durability to every browser consumer.
278
+ *
279
+ * Pass `persistence: 'indexeddb'` only when you want offline queueing and a
280
+ * reload-surviving local cache in a browser.
281
+ */
282
+ persistence?: AbloPersistence;
283
+ /** @deprecated Use `persistence: 'indexeddb'` for durable browser storage. */
284
+ offline?: boolean;
285
+ /**
286
+ * @deprecated Internal/testing escape hatch. Use `persistence` in
287
+ * production code. `true` maps to `memory`; `false` maps to
288
+ * `indexeddb` in browsers.
289
+ */
290
+ inMemory?: boolean;
291
+ /**
292
+ * When `true`, initialization starts immediately in the background, so reads work
293
+ * once `await ready()` resolves.
294
+ *
295
+ * When `false` (the default), you must call `await ready()` before using the
296
+ * engine; any query before that returns empty results. The explicit default
297
+ * guards against silent initialization failures.
298
+ */
299
+ autoStart?: boolean;
300
+ /**
301
+ * How much baseline state this client pulls at startup.
302
+ *
303
+ * - `'full'`: pull every delta in the configured sync groups before `ready()`
304
+ * resolves. The default for user clients.
305
+ * - `'none'`: open the socket and process live deltas only, with no baseline
306
+ * fetch. Reads round-trip through `retrieve`, and subscriptions fill the local
307
+ * cache lazily. The default for agent clients, which do not need a local
308
+ * replica of the organization's data.
309
+ */
310
+ bootstrapMode?: 'full' | 'none';
311
+ /**
312
+ * Custom observability provider (Sentry, Honeycomb, OTel, etc.).
313
+ * Default: a noop implementation that drops all breadcrumbs and spans.
314
+ */
315
+ observability?: SyncObservabilityProvider;
316
+ /**
317
+ * Custom analytics provider (PostHog, Amplitude, Segment, etc.).
318
+ * Default: a noop implementation that drops all events.
319
+ */
320
+ analytics?: SyncAnalytics;
321
+ /**
322
+ * Detect whether an error from a mutation/bootstrap response means the
323
+ * user's session has expired. Used to surface re-auth prompts. Default:
324
+ * heuristic that matches `401 Unauthorized` and a few common error shapes.
325
+ */
326
+ sessionErrorDetector?: SessionErrorDetector;
327
+ /**
328
+ * Detect whether the browser is currently online. Default: reads
329
+ * `navigator.onLine` and listens to the `online`/`offline` events.
330
+ */
331
+ onlineStatus?: OnlineStatusProvider;
332
+ /**
333
+ * Replace the built-in `MutationExecutor` (which posts a hardcoded
334
+ * `commit` method against `${url}/graphql`) with one that uses your own
335
+ * GraphQL client, auth headers, retry policy, and observability hooks.
336
+ *
337
+ * Default: a fetch-based executor that targets `${url}/graphql` and sends
338
+ * the configured bearer (`apiKey` / backend-minted token) as `Authorization`.
339
+ */
340
+ mutationExecutor?: MutationExecutor;
341
+ /**
342
+ * Partial overrides for the auto-derived `SyncEngineConfig`. Merged on
343
+ * top of `deriveConfigFromSchema(schema)`. Use this when you need
344
+ * specific `modelCreatePriority`, `batchableModels`, or
345
+ * `essentialFields` settings that the schema cannot express.
346
+ */
347
+ configOverrides?: Partial<SyncEngineConfig>;
348
+ /**
349
+ * The sync groups (entity scopes) this client subscribes to. Normally the server
350
+ * derives these from the apiKey's scope; pass them explicitly when the key does
351
+ * not resolve them, otherwise the client fans out nothing and logs a `degenerate
352
+ * syncGroups` warning. Build values with `syncGroup(kind, id)` from
353
+ * `@abloatai/ablo/schema`.
354
+ */
355
+ syncGroups?: string[];
356
+ /**
357
+ * Override the bootstrap endpoint base URL. Use this when your sync
358
+ * server's HTTP API lives on a different host than the WebSocket URL.
359
+ *
360
+ * Must include the `/api` prefix — `BootstrapFetcher` appends
361
+ * `/sync/bootstrap` directly. Example:
362
+ * `'http://api.example.com/api'` → `http://api.example.com/api/sync/bootstrap`.
363
+ *
364
+ * Default: `${url.replace(/^ws/, 'http')}/api`.
365
+ */
366
+ bootstrapBaseUrl?: string;
367
+ /**
368
+ * The account scope. Supply it together with a user or agent id to resolve
369
+ * identity locally without a server round-trip; without it, the client resolves
370
+ * identity from the token through the identity endpoint instead.
371
+ */
372
+ organizationId?: string;
373
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The option types for the {@link Ablo} client: the public {@link AbloOptions}
3
+ * bag callers pass, and the fuller {@link InternalAbloOptions} construction
4
+ * surface. This module holds only types and has no runtime imports.
5
+ */
6
+ export {};
@@ -1,19 +1,19 @@
1
1
  export interface RegisterDataSourceInput {
2
- /** HTTP API base, e.g. `https://api.abloatai.com/api` (from resolveBootstrapBaseUrl). */
2
+ /** The HTTP API base, for example `https://api.abloatai.com/api`. */
3
3
  readonly baseUrl: string;
4
- /** Secret key (`sk_…`) used to authenticate + derive the org. */
4
+ /** The secret key (`sk_…`) used to authenticate the call and derive the organization. */
5
5
  readonly apiKey: string | null;
6
- /** Postgres connection string for the direct connector. */
6
+ /** The Postgres connection string to register. */
7
7
  readonly databaseUrl: string;
8
- /** Optional Postgres schema (defaults server-side to `public`). */
8
+ /** An optional Postgres schema; the server defaults to `public`. */
9
9
  readonly schema?: string;
10
- /** Custom fetch (tests/proxies/odd runtimes). */
10
+ /** A custom fetch implementation for tests, proxies, or unusual runtimes. */
11
11
  readonly fetchImpl?: typeof fetch;
12
12
  }
13
13
  /**
14
- * POST the connection string to the self-serve datasource route. Resolves on
15
- * success (the org's data plane now points at this DB); throws an `AbloError`
16
- * with `datasource_registration_failed` otherwise so `ready()` surfaces it
17
- * instead of silently bootstrapping against the wrong store.
14
+ * Posts the connection string to the data-source registration route. Resolves once
15
+ * the organization's data plane points at this database; otherwise throws an
16
+ * {@link AbloError} with code `datasource_registration_failed`, so `ready()`
17
+ * surfaces the failure instead of quietly bootstrapping against the wrong store.
18
18
  */
19
19
  export declare function registerDataSource(input: RegisterDataSourceInput): Promise<void>;
@@ -1,25 +1,24 @@
1
1
  /**
2
- * Self-serve direct-kind datasource registration.
2
+ * Registers a direct database connection as an organization's data source.
3
3
  *
4
- * When a client is constructed with `databaseUrl`, the SDK registers that
5
- * connection string BEFORE bootstrap so the server resolves the org's data plane
6
- * to that direct connection.
4
+ * When a client is constructed with `databaseUrl`, the SDK calls this before
5
+ * bootstrap so the server points the organization's data plane at that connection.
7
6
  *
8
- * Targets the unified `POST /v1/datasources` resource; on a 404 (an older
9
- * server without the unified route) it falls back to the legacy
10
- * `POST /v1/datasource` alias so an SDK upgrade never strands registration.
7
+ * It posts to `POST /v1/datasources`, falling back to the older
8
+ * `POST /v1/datasource` route on a 404 so registration still works against an
9
+ * earlier server.
11
10
  *
12
- * The org is derived server-side from the API key the caller never sends an
13
- * organization id. The connection string is sent once over TLS and is never
14
- * echoed back (the server stores it as a secret and returns only a safe
15
- * `datasource` projection: host, database, schema).
11
+ * The organization is derived on the server from the API key; the caller never
12
+ * sends an organization id. The connection string is sent once over TLS and is
13
+ * never echoed back the server stores it as a secret and returns only a safe
14
+ * projection of the data source (host, database, schema).
16
15
  */
17
16
  import { AbloError } from '../errors.js';
18
17
  /**
19
- * POST the connection string to the self-serve datasource route. Resolves on
20
- * success (the org's data plane now points at this DB); throws an `AbloError`
21
- * with `datasource_registration_failed` otherwise so `ready()` surfaces it
22
- * instead of silently bootstrapping against the wrong store.
18
+ * Posts the connection string to the data-source registration route. Resolves once
19
+ * the organization's data plane points at this database; otherwise throws an
20
+ * {@link AbloError} with code `datasource_registration_failed`, so `ready()`
21
+ * surfaces the failure instead of quietly bootstrapping against the wrong store.
23
22
  */
24
23
  export async function registerDataSource(input) {
25
24
  if (!input.apiKey) {
@@ -51,7 +50,7 @@ export async function registerDataSource(input) {
51
50
  };
52
51
  let response = await post(`${base}/v1/datasources`);
53
52
  if (response.status === 404) {
54
- // Older server without the unified resource use the legacy alias.
53
+ // The newer route is absent on an older server; use the earlier one.
55
54
  response = await post(`${base}/v1/datasource`);
56
55
  }
57
56
  if (!response.ok) {