@abloatai/ablo 0.35.0 → 0.37.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 (622) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +71 -1929
  3. package/NOTICE +2 -2
  4. package/README.md +23 -532
  5. package/assets/banner.png +0 -0
  6. package/dist/auth.d.ts +2 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +2 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/coordination.d.ts +2 -0
  15. package/dist/coordination.d.ts.map +1 -0
  16. package/dist/coordination.js +2 -0
  17. package/dist/coordination.js.map +1 -0
  18. package/dist/index.d.ts +3 -112
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -161
  21. package/dist/index.js.map +1 -0
  22. package/dist/react.d.ts +4 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +3 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/schema.d.ts +2 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +2 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/server.d.ts +2 -0
  31. package/dist/server.d.ts.map +1 -0
  32. package/dist/server.js +2 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/source-conformance.d.ts +2 -0
  35. package/dist/source-conformance.d.ts.map +1 -0
  36. package/dist/source-conformance.js +2 -0
  37. package/dist/source-conformance.js.map +1 -0
  38. package/dist/source-drizzle.d.ts +2 -0
  39. package/dist/source-drizzle.d.ts.map +1 -0
  40. package/dist/source-drizzle.js +2 -0
  41. package/dist/source-drizzle.js.map +1 -0
  42. package/dist/source-kysely.d.ts +2 -0
  43. package/dist/source-kysely.d.ts.map +1 -0
  44. package/dist/source-kysely.js +2 -0
  45. package/dist/source-kysely.js.map +1 -0
  46. package/dist/source-next.d.ts +2 -0
  47. package/dist/source-next.d.ts.map +1 -0
  48. package/dist/source-next.js +2 -0
  49. package/dist/source-next.js.map +1 -0
  50. package/dist/source.d.ts +2 -0
  51. package/dist/source.d.ts.map +1 -0
  52. package/dist/source.js +2 -0
  53. package/dist/source.js.map +1 -0
  54. package/dist/wire.d.ts +2 -0
  55. package/dist/wire.d.ts.map +1 -0
  56. package/dist/wire.js +2 -0
  57. package/dist/wire.js.map +1 -0
  58. package/docs/agents.md +2 -2
  59. package/docs/api-keys.md +13 -12
  60. package/docs/api.md +15 -53
  61. package/docs/audit.md +4 -3
  62. package/docs/cli.md +11 -11
  63. package/docs/client-behavior.md +9 -9
  64. package/docs/concurrency-convention.md +28 -42
  65. package/docs/coordination.md +228 -86
  66. package/docs/data-sources.md +5 -5
  67. package/docs/debugging.md +34 -12
  68. package/docs/deployment.md +8 -8
  69. package/docs/examples/agent-human.md +4 -4
  70. package/docs/examples/ai-sdk-tool.md +1 -1
  71. package/docs/examples/existing-python-backend.md +15 -4
  72. package/docs/examples/nextjs.md +27 -6
  73. package/docs/examples/scoped-agent.md +3 -3
  74. package/docs/examples/server-agent.md +2 -2
  75. package/docs/groups.md +57 -3
  76. package/docs/guarantees.md +37 -10
  77. package/docs/how-it-works.md +32 -8
  78. package/docs/idempotency.md +6 -6
  79. package/docs/identity.md +24 -24
  80. package/docs/index.md +8 -8
  81. package/docs/integration-guide.md +38 -16
  82. package/docs/internal/README.md +18 -0
  83. package/docs/internal/agent-fleet-coordination-design.md +171 -0
  84. package/docs/internal/agent-orchestration.md +58 -0
  85. package/docs/internal/commit-identifiers.md +91 -0
  86. package/docs/internal/concurrency-open-decisions.md +37 -0
  87. package/docs/internal/data-source-reverse-channel.md +150 -0
  88. package/docs/internal/per-field-conflict-detection.md +165 -0
  89. package/docs/internal/postgres-replication.md +64 -0
  90. package/docs/internal/serializable-schema.md +119 -0
  91. package/docs/internal/structure.md +32 -0
  92. package/docs/mcp.md +9 -9
  93. package/docs/migration.md +37 -18
  94. package/docs/projects.md +1 -1
  95. package/docs/quickstart.md +2 -2
  96. package/docs/react.md +24 -13
  97. package/docs/schema-contract.md +3 -3
  98. package/docs/sessions.md +91 -37
  99. package/docs/webhooks.md +9 -9
  100. package/examples/README.md +2 -2
  101. package/examples/data-source/README.md +1 -1
  102. package/examples/data-source/ablo-driver.ts +1 -1
  103. package/examples/data-source/customer-server.ts +1 -1
  104. package/examples/data-source/run.ts +1 -1
  105. package/examples/data-source/schema.ts +1 -1
  106. package/examples/quickstart.ts +2 -2
  107. package/llms.txt +12 -12
  108. package/package.json +64 -174
  109. package/dist/BaseSyncedStore.d.ts +0 -823
  110. package/dist/BaseSyncedStore.js +0 -1955
  111. package/dist/Database.d.ts +0 -335
  112. package/dist/Database.js +0 -1500
  113. package/dist/InstanceCache.d.ts +0 -233
  114. package/dist/InstanceCache.js +0 -1164
  115. package/dist/LazyReferenceCollection.d.ts +0 -177
  116. package/dist/LazyReferenceCollection.js +0 -461
  117. package/dist/Model.d.ts +0 -444
  118. package/dist/Model.js +0 -909
  119. package/dist/ModelRegistry.d.ts +0 -221
  120. package/dist/ModelRegistry.js +0 -537
  121. package/dist/NetworkMonitor.d.ts +0 -26
  122. package/dist/NetworkMonitor.js +0 -77
  123. package/dist/RuntimeContext.d.ts +0 -52
  124. package/dist/RuntimeContext.js +0 -80
  125. package/dist/SyncClient.d.ts +0 -551
  126. package/dist/SyncClient.js +0 -2199
  127. package/dist/adapters/alwaysOnline.d.ts +0 -14
  128. package/dist/adapters/alwaysOnline.js +0 -17
  129. package/dist/adapters/inMemoryStorage.d.ts +0 -31
  130. package/dist/adapters/inMemoryStorage.js +0 -110
  131. package/dist/ai-sdk/coordinatedTool.d.ts +0 -120
  132. package/dist/ai-sdk/coordinatedTool.js +0 -134
  133. package/dist/ai-sdk/coordinationContext.d.ts +0 -46
  134. package/dist/ai-sdk/coordinationContext.js +0 -106
  135. package/dist/ai-sdk/index.d.ts +0 -121
  136. package/dist/ai-sdk/index.js +0 -121
  137. package/dist/ai-sdk/wrap.d.ts +0 -65
  138. package/dist/ai-sdk/wrap.js +0 -39
  139. package/dist/auth/index.d.ts +0 -1
  140. package/dist/auth/index.js +0 -8
  141. package/dist/batching/index.d.ts +0 -55
  142. package/dist/batching/index.js +0 -147
  143. package/dist/cli.cjs +0 -288600
  144. package/dist/client/Ablo.d.ts +0 -231
  145. package/dist/client/Ablo.js +0 -149
  146. package/dist/client/abloClient.d.ts +0 -309
  147. package/dist/client/abloClient.js +0 -13
  148. package/dist/client/clientPrelude.d.ts +0 -52
  149. package/dist/client/clientPrelude.js +0 -60
  150. package/dist/client/consoleLogger.d.ts +0 -35
  151. package/dist/client/consoleLogger.js +0 -44
  152. package/dist/client/coreClient.d.ts +0 -60
  153. package/dist/client/coreClient.js +0 -118
  154. package/dist/client/createInternalComponents.d.ts +0 -46
  155. package/dist/client/createInternalComponents.js +0 -92
  156. package/dist/client/createModelProxy.d.ts +0 -228
  157. package/dist/client/createModelProxy.js +0 -818
  158. package/dist/client/humans.d.ts +0 -48
  159. package/dist/client/humans.js +0 -52
  160. package/dist/client/modelRegistration.d.ts +0 -10
  161. package/dist/client/modelRegistration.js +0 -312
  162. package/dist/client/options.d.ts +0 -461
  163. package/dist/client/options.js +0 -7
  164. package/dist/client/reactiveEngine.d.ts +0 -48
  165. package/dist/client/reactiveEngine.js +0 -910
  166. package/dist/client/resourceTypes.d.ts +0 -12
  167. package/dist/client/resourceTypes.js +0 -10
  168. package/dist/client/schemaConfig.d.ts +0 -44
  169. package/dist/client/schemaConfig.js +0 -185
  170. package/dist/client/validateAbloOptions.d.ts +0 -42
  171. package/dist/client/validateAbloOptions.js +0 -43
  172. package/dist/client/wsMutationExecutor.d.ts +0 -27
  173. package/dist/client/wsMutationExecutor.js +0 -72
  174. package/dist/context.d.ts +0 -29
  175. package/dist/context.js +0 -58
  176. package/dist/coordination/ClaimLog.d.ts +0 -26
  177. package/dist/coordination/ClaimLog.js +0 -32
  178. package/dist/coordination/index.d.ts +0 -1
  179. package/dist/coordination/index.js +0 -8
  180. package/dist/core/DatabaseManager.d.ts +0 -105
  181. package/dist/core/DatabaseManager.js +0 -387
  182. package/dist/core/QueryProcessor.d.ts +0 -75
  183. package/dist/core/QueryProcessor.js +0 -255
  184. package/dist/core/QueryView.d.ts +0 -79
  185. package/dist/core/QueryView.js +0 -218
  186. package/dist/core/StoreManager.d.ts +0 -112
  187. package/dist/core/StoreManager.js +0 -302
  188. package/dist/core/ViewRegistry.d.ts +0 -20
  189. package/dist/core/ViewRegistry.js +0 -55
  190. package/dist/core/index.d.ts +0 -33
  191. package/dist/core/index.js +0 -48
  192. package/dist/core/openIDBWithTimeout.d.ts +0 -65
  193. package/dist/core/openIDBWithTimeout.js +0 -153
  194. package/dist/core/queryUtils.d.ts +0 -45
  195. package/dist/core/queryUtils.js +0 -69
  196. package/dist/core/storeContract.d.ts +0 -145
  197. package/dist/core/storeContract.js +0 -12
  198. package/dist/docs/catalog.d.ts +0 -72
  199. package/dist/docs/catalog.js +0 -227
  200. package/dist/docs/index.d.ts +0 -10
  201. package/dist/docs/index.js +0 -10
  202. package/dist/environment.d.ts +0 -1
  203. package/dist/environment.js +0 -8
  204. package/dist/interfaces/index.d.ts +0 -311
  205. package/dist/interfaces/index.js +0 -9
  206. package/dist/keys/index.d.ts +0 -1
  207. package/dist/keys/index.js +0 -8
  208. package/dist/mutators/RecordingMutation.d.ts +0 -36
  209. package/dist/mutators/RecordingMutation.js +0 -182
  210. package/dist/mutators/Transaction.d.ts +0 -40
  211. package/dist/mutators/Transaction.js +0 -58
  212. package/dist/mutators/UndoManager.d.ts +0 -258
  213. package/dist/mutators/UndoManager.js +0 -658
  214. package/dist/mutators/defineMutators.d.ts +0 -60
  215. package/dist/mutators/defineMutators.js +0 -18
  216. package/dist/mutators/inverseOp.d.ts +0 -126
  217. package/dist/mutators/inverseOp.js +0 -71
  218. package/dist/mutators/mutateActions.d.ts +0 -45
  219. package/dist/mutators/mutateActions.js +0 -105
  220. package/dist/mutators/readerActions.d.ts +0 -33
  221. package/dist/mutators/readerActions.js +0 -57
  222. package/dist/mutators/undoApply.d.ts +0 -51
  223. package/dist/mutators/undoApply.js +0 -117
  224. package/dist/policy/index.d.ts +0 -21
  225. package/dist/policy/index.js +0 -20
  226. package/dist/query/client.d.ts +0 -61
  227. package/dist/query/client.js +0 -137
  228. package/dist/query/types.d.ts +0 -85
  229. package/dist/query/types.js +0 -16
  230. package/dist/react/AbloProvider.d.ts +0 -230
  231. package/dist/react/AbloProvider.js +0 -455
  232. package/dist/react/ClientSideSuspense.d.ts +0 -36
  233. package/dist/react/ClientSideSuspense.js +0 -17
  234. package/dist/react/DefaultFallback.d.ts +0 -24
  235. package/dist/react/DefaultFallback.js +0 -43
  236. package/dist/react/context.d.ts +0 -55
  237. package/dist/react/context.js +0 -29
  238. package/dist/react/index.d.ts +0 -61
  239. package/dist/react/index.js +0 -66
  240. package/dist/react/internalContext.d.ts +0 -33
  241. package/dist/react/internalContext.js +0 -3
  242. package/dist/react/useAblo.d.ts +0 -75
  243. package/dist/react/useAblo.js +0 -102
  244. package/dist/react/useCurrentUserId.d.ts +0 -22
  245. package/dist/react/useCurrentUserId.js +0 -34
  246. package/dist/react/useErrorListener.d.ts +0 -20
  247. package/dist/react/useErrorListener.js +0 -38
  248. package/dist/react/useMutationFailureListener.d.ts +0 -26
  249. package/dist/react/useMutationFailureListener.js +0 -38
  250. package/dist/react/useMutators.d.ts +0 -56
  251. package/dist/react/useMutators.js +0 -84
  252. package/dist/react/useReactive.d.ts +0 -35
  253. package/dist/react/useReactive.js +0 -123
  254. package/dist/react/useSyncStatus.d.ts +0 -59
  255. package/dist/react/useSyncStatus.js +0 -76
  256. package/dist/react/useUndoScope.d.ts +0 -34
  257. package/dist/react/useUndoScope.js +0 -81
  258. package/dist/schema/coordination.d.ts +0 -112
  259. package/dist/schema/coordination.js +0 -129
  260. package/dist/schema/ddl.d.ts +0 -97
  261. package/dist/schema/ddl.js +0 -491
  262. package/dist/schema/ddlLock.d.ts +0 -35
  263. package/dist/schema/ddlLock.js +0 -46
  264. package/dist/schema/diff.d.ts +0 -225
  265. package/dist/schema/diff.js +0 -289
  266. package/dist/schema/generate.d.ts +0 -19
  267. package/dist/schema/generate.js +0 -86
  268. package/dist/schema/index.d.ts +0 -41
  269. package/dist/schema/index.js +0 -76
  270. package/dist/schema/queries.d.ts +0 -201
  271. package/dist/schema/queries.js +0 -144
  272. package/dist/schema/select.d.ts +0 -40
  273. package/dist/schema/select.js +0 -87
  274. package/dist/schema/serialize.d.ts +0 -115
  275. package/dist/schema/serialize.js +0 -262
  276. package/dist/schema/sugar.d.ts +0 -109
  277. package/dist/schema/sugar.js +0 -83
  278. package/dist/schema/syncDeltaRow.d.ts +0 -6
  279. package/dist/schema/syncDeltaRow.js +0 -6
  280. package/dist/server/adapter.d.ts +0 -173
  281. package/dist/server/adapter.js +0 -18
  282. package/dist/server/commit.d.ts +0 -107
  283. package/dist/server/commit.js +0 -1
  284. package/dist/server/index.d.ts +0 -14
  285. package/dist/server/index.js +0 -2
  286. package/dist/server/readConfig.d.ts +0 -80
  287. package/dist/server/readConfig.js +0 -8
  288. package/dist/server/storageMode.d.ts +0 -23
  289. package/dist/server/storageMode.js +0 -17
  290. package/dist/source/adapter.d.ts +0 -81
  291. package/dist/source/adapter.js +0 -22
  292. package/dist/source/adapters/drizzle.d.ts +0 -48
  293. package/dist/source/adapters/drizzle.js +0 -219
  294. package/dist/source/adapters/kysely.d.ts +0 -42
  295. package/dist/source/adapters/kysely.js +0 -205
  296. package/dist/source/adapters/kyselyMutationCore.d.ts +0 -76
  297. package/dist/source/adapters/kyselyMutationCore.js +0 -125
  298. package/dist/source/adapters/memory.d.ts +0 -13
  299. package/dist/source/adapters/memory.js +0 -130
  300. package/dist/source/adapters/prisma.d.ts +0 -63
  301. package/dist/source/adapters/prisma.js +0 -202
  302. package/dist/source/conformance.d.ts +0 -37
  303. package/dist/source/conformance.js +0 -215
  304. package/dist/source/connector.d.ts +0 -95
  305. package/dist/source/connector.js +0 -266
  306. package/dist/source/connectorProtocol.d.ts +0 -154
  307. package/dist/source/connectorProtocol.js +0 -163
  308. package/dist/source/contract.d.ts +0 -195
  309. package/dist/source/contract.js +0 -164
  310. package/dist/source/factory.d.ts +0 -92
  311. package/dist/source/factory.js +0 -286
  312. package/dist/source/footprint.d.ts +0 -111
  313. package/dist/source/footprint.js +0 -0
  314. package/dist/source/idempotency.d.ts +0 -61
  315. package/dist/source/idempotency.js +0 -144
  316. package/dist/source/index.d.ts +0 -23
  317. package/dist/source/index.js +0 -30
  318. package/dist/source/migrations.d.ts +0 -21
  319. package/dist/source/migrations.js +0 -103
  320. package/dist/source/next.d.ts +0 -32
  321. package/dist/source/next.js +0 -25
  322. package/dist/source/pushQueue.d.ts +0 -134
  323. package/dist/source/pushQueue.js +0 -256
  324. package/dist/source/signing.d.ts +0 -92
  325. package/dist/source/signing.js +0 -162
  326. package/dist/source/types.d.ts +0 -401
  327. package/dist/source/types.js +0 -59
  328. package/dist/stores/ObjectStore.d.ts +0 -115
  329. package/dist/stores/ObjectStore.js +0 -393
  330. package/dist/stores/ObjectStoreContract.d.ts +0 -38
  331. package/dist/stores/ObjectStoreContract.js +0 -1
  332. package/dist/stores/SyncActionStore.d.ts +0 -97
  333. package/dist/stores/SyncActionStore.js +0 -504
  334. package/dist/stores/syncAction.d.ts +0 -26
  335. package/dist/stores/syncAction.js +0 -16
  336. package/dist/surface.d.ts +0 -36
  337. package/dist/surface.js +0 -75
  338. package/dist/sync/BootstrapFetcher.d.ts +0 -280
  339. package/dist/sync/BootstrapFetcher.js +0 -962
  340. package/dist/sync/ConnectionManager.d.ts +0 -8
  341. package/dist/sync/ConnectionManager.js +0 -8
  342. package/dist/sync/OnDemandLoader.d.ts +0 -228
  343. package/dist/sync/OnDemandLoader.js +0 -742
  344. package/dist/sync/SubscriptionManager.d.ts +0 -159
  345. package/dist/sync/SubscriptionManager.js +0 -243
  346. package/dist/sync/SyncWebSocket.d.ts +0 -173
  347. package/dist/sync/SyncWebSocket.js +0 -438
  348. package/dist/sync/awaitClaimGrant.d.ts +0 -6
  349. package/dist/sync/awaitClaimGrant.js +0 -6
  350. package/dist/sync/bootstrapApply.d.ts +0 -70
  351. package/dist/sync/bootstrapApply.js +0 -73
  352. package/dist/sync/commitFrames.d.ts +0 -8
  353. package/dist/sync/commitFrames.js +0 -8
  354. package/dist/sync/contextPorts.d.ts +0 -18
  355. package/dist/sync/contextPorts.js +0 -31
  356. package/dist/sync/createClaimStream.d.ts +0 -7
  357. package/dist/sync/createClaimStream.js +0 -7
  358. package/dist/sync/createPresenceStream.d.ts +0 -69
  359. package/dist/sync/createPresenceStream.js +0 -200
  360. package/dist/sync/createSnapshot.d.ts +0 -29
  361. package/dist/sync/createSnapshot.js +0 -118
  362. package/dist/sync/credentialLifecycle.d.ts +0 -7
  363. package/dist/sync/credentialLifecycle.js +0 -7
  364. package/dist/sync/deltaPipeline.d.ts +0 -113
  365. package/dist/sync/deltaPipeline.js +0 -261
  366. package/dist/sync/groupChange.d.ts +0 -113
  367. package/dist/sync/groupChange.js +0 -242
  368. package/dist/sync/participants.d.ts +0 -115
  369. package/dist/sync/participants.js +0 -344
  370. package/dist/sync/persistedPrefix.d.ts +0 -12
  371. package/dist/sync/persistedPrefix.js +0 -22
  372. package/dist/sync/schemaDrift.d.ts +0 -55
  373. package/dist/sync/schemaDrift.js +0 -53
  374. package/dist/sync/schemas.d.ts +0 -70
  375. package/dist/sync/schemas.js +0 -94
  376. package/dist/sync/syncCursor.d.ts +0 -40
  377. package/dist/sync/syncCursor.js +0 -55
  378. package/dist/sync/syncPlan.d.ts +0 -54
  379. package/dist/sync/syncPlan.js +0 -50
  380. package/dist/sync/wsFrameHandlers.d.ts +0 -8
  381. package/dist/sync/wsFrameHandlers.js +0 -8
  382. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  383. package/dist/testing/fixtures/bootstrap.js +0 -59
  384. package/dist/testing/fixtures/deltas.d.ts +0 -83
  385. package/dist/testing/fixtures/deltas.js +0 -136
  386. package/dist/testing/fixtures/httpResponses.d.ts +0 -70
  387. package/dist/testing/fixtures/httpResponses.js +0 -90
  388. package/dist/testing/fixtures/models.d.ts +0 -83
  389. package/dist/testing/fixtures/models.js +0 -272
  390. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  391. package/dist/testing/helpers/reactWrapper.js +0 -67
  392. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  393. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  394. package/dist/testing/helpers/wait.d.ts +0 -30
  395. package/dist/testing/helpers/wait.js +0 -49
  396. package/dist/testing/index.d.ts +0 -23
  397. package/dist/testing/index.js +0 -33
  398. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  399. package/dist/testing/mocks/FakeDatabase.js +0 -10
  400. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  401. package/dist/testing/mocks/MockMutationExecutor.js +0 -186
  402. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  403. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  404. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  405. package/dist/testing/mocks/MockSyncContext.js +0 -72
  406. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  407. package/dist/testing/mocks/MockSyncStore.js +0 -171
  408. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  409. package/dist/testing/mocks/MockWebSocket.js +0 -118
  410. package/dist/transaction/ablo.d.ts +0 -88
  411. package/dist/transaction/ablo.js +0 -33
  412. package/dist/transaction/auth/apiKey.d.ts +0 -152
  413. package/dist/transaction/auth/apiKey.js +0 -419
  414. package/dist/transaction/auth/bootstrapScope.d.ts +0 -15
  415. package/dist/transaction/auth/bootstrapScope.js +0 -1
  416. package/dist/transaction/auth/capability.d.ts +0 -177
  417. package/dist/transaction/auth/capability.js +0 -199
  418. package/dist/transaction/auth/credentialEndpoint.d.ts +0 -61
  419. package/dist/transaction/auth/credentialEndpoint.js +0 -86
  420. package/dist/transaction/auth/credentialPolicy.d.ts +0 -148
  421. package/dist/transaction/auth/credentialPolicy.js +0 -125
  422. package/dist/transaction/auth/credentialSource.d.ts +0 -30
  423. package/dist/transaction/auth/credentialSource.js +0 -55
  424. package/dist/transaction/auth/hostedEndpoints.d.ts +0 -21
  425. package/dist/transaction/auth/hostedEndpoints.js +0 -21
  426. package/dist/transaction/auth/identity.d.ts +0 -55
  427. package/dist/transaction/auth/identity.js +0 -210
  428. package/dist/transaction/auth/index.d.ts +0 -162
  429. package/dist/transaction/auth/index.js +0 -304
  430. package/dist/transaction/auth/schemas.d.ts +0 -59
  431. package/dist/transaction/auth/schemas.js +0 -85
  432. package/dist/transaction/auth/sessionMint.d.ts +0 -28
  433. package/dist/transaction/auth/sessionMint.js +0 -85
  434. package/dist/transaction/coordination/awaitClaimGrant.d.ts +0 -49
  435. package/dist/transaction/coordination/awaitClaimGrant.js +0 -112
  436. package/dist/transaction/coordination/claimHeartbeatLoop.d.ts +0 -50
  437. package/dist/transaction/coordination/claimHeartbeatLoop.js +0 -88
  438. package/dist/transaction/coordination/claimMeta.d.ts +0 -49
  439. package/dist/transaction/coordination/claimMeta.js +0 -52
  440. package/dist/transaction/coordination/createClaimStream.d.ts +0 -64
  441. package/dist/transaction/coordination/createClaimStream.js +0 -475
  442. package/dist/transaction/coordination/events.d.ts +0 -74
  443. package/dist/transaction/coordination/events.js +0 -7
  444. package/dist/transaction/coordination/index.d.ts +0 -19
  445. package/dist/transaction/coordination/index.js +0 -44
  446. package/dist/transaction/coordination/locator.d.ts +0 -83
  447. package/dist/transaction/coordination/locator.js +0 -82
  448. package/dist/transaction/coordination/schema.d.ts +0 -1473
  449. package/dist/transaction/coordination/schema.js +0 -1013
  450. package/dist/transaction/coordination/targetConflict.d.ts +0 -2
  451. package/dist/transaction/coordination/targetConflict.js +0 -103
  452. package/dist/transaction/coordination/trace.d.ts +0 -78
  453. package/dist/transaction/coordination/trace.js +0 -138
  454. package/dist/transaction/durableWrites.d.ts +0 -62
  455. package/dist/transaction/durableWrites.js +0 -71
  456. package/dist/transaction/environment.d.ts +0 -105
  457. package/dist/transaction/environment.js +0 -108
  458. package/dist/transaction/errorCodes.d.ts +0 -403
  459. package/dist/transaction/errorCodes.js +0 -480
  460. package/dist/transaction/errors.d.ts +0 -428
  461. package/dist/transaction/errors.js +0 -686
  462. package/dist/transaction/index.d.ts +0 -20
  463. package/dist/transaction/index.js +0 -20
  464. package/dist/transaction/keys/index.d.ts +0 -87
  465. package/dist/transaction/keys/index.js +0 -207
  466. package/dist/transaction/log/syncDeltaRow.d.ts +0 -158
  467. package/dist/transaction/log/syncDeltaRow.js +0 -95
  468. package/dist/transaction/logPosition.d.ts +0 -97
  469. package/dist/transaction/logPosition.js +0 -125
  470. package/dist/transaction/logger.d.ts +0 -16
  471. package/dist/transaction/logger.js +0 -7
  472. package/dist/transaction/observability.d.ts +0 -53
  473. package/dist/transaction/observability.js +0 -19
  474. package/dist/transaction/persistence.d.ts +0 -12
  475. package/dist/transaction/persistence.js +0 -11
  476. package/dist/transaction/plugin.d.ts +0 -192
  477. package/dist/transaction/plugin.js +0 -87
  478. package/dist/transaction/policy/types.d.ts +0 -217
  479. package/dist/transaction/policy/types.js +0 -126
  480. package/dist/transaction/resources/functionalUpdate.d.ts +0 -79
  481. package/dist/transaction/resources/functionalUpdate.js +0 -87
  482. package/dist/transaction/resources/httpResources.d.ts +0 -266
  483. package/dist/transaction/resources/httpResources.js +0 -7
  484. package/dist/transaction/resources/modelOperations.d.ts +0 -319
  485. package/dist/transaction/resources/modelOperations.js +0 -12
  486. package/dist/transaction/resources/mutationOptions.d.ts +0 -66
  487. package/dist/transaction/resources/mutationOptions.js +0 -9
  488. package/dist/transaction/resources/where.d.ts +0 -85
  489. package/dist/transaction/resources/where.js +0 -70
  490. package/dist/transaction/resources/writeOptionsSchema.d.ts +0 -47
  491. package/dist/transaction/resources/writeOptionsSchema.js +0 -73
  492. package/dist/transaction/schema/field.d.ts +0 -126
  493. package/dist/transaction/schema/field.js +0 -265
  494. package/dist/transaction/schema/loadStrategy.d.ts +0 -45
  495. package/dist/transaction/schema/loadStrategy.js +0 -46
  496. package/dist/transaction/schema/model.d.ts +0 -379
  497. package/dist/transaction/schema/model.js +0 -123
  498. package/dist/transaction/schema/openapi.d.ts +0 -57
  499. package/dist/transaction/schema/openapi.js +0 -340
  500. package/dist/transaction/schema/relation.d.ts +0 -199
  501. package/dist/transaction/schema/relation.js +0 -104
  502. package/dist/transaction/schema/residency.d.ts +0 -29
  503. package/dist/transaction/schema/residency.js +0 -25
  504. package/dist/transaction/schema/roles.d.ts +0 -249
  505. package/dist/transaction/schema/roles.js +0 -230
  506. package/dist/transaction/schema/schema.d.ts +0 -324
  507. package/dist/transaction/schema/schema.js +0 -305
  508. package/dist/transaction/schema/tenancy.d.ts +0 -139
  509. package/dist/transaction/schema/tenancy.js +0 -190
  510. package/dist/transaction/transactionLayer.d.ts +0 -82
  511. package/dist/transaction/transactionLayer.js +0 -24
  512. package/dist/transaction/transactions/settlement/commitEnvelope.d.ts +0 -143
  513. package/dist/transaction/transactions/settlement/commitEnvelope.js +0 -161
  514. package/dist/transaction/transactions/settlement/httpCommitEnvelope.d.ts +0 -53
  515. package/dist/transaction/transactions/settlement/httpCommitEnvelope.js +0 -207
  516. package/dist/transaction/transactions/settlement/idempotencyKey.d.ts +0 -10
  517. package/dist/transaction/transactions/settlement/idempotencyKey.js +0 -9
  518. package/dist/transaction/transactions/settlement/pendingWrite.d.ts +0 -112
  519. package/dist/transaction/transactions/settlement/pendingWrite.js +0 -20
  520. package/dist/transaction/transport/commitFrames.d.ts +0 -90
  521. package/dist/transaction/transport/commitFrames.js +0 -134
  522. package/dist/transaction/transport/connectionManager.d.ts +0 -215
  523. package/dist/transaction/transport/connectionManager.js +0 -673
  524. package/dist/transaction/transport/credentialLifecycle.d.ts +0 -177
  525. package/dist/transaction/transport/credentialLifecycle.js +0 -324
  526. package/dist/transaction/transport/heartbeat.d.ts +0 -65
  527. package/dist/transaction/transport/heartbeat.js +0 -93
  528. package/dist/transaction/transport/httpClient.d.ts +0 -123
  529. package/dist/transaction/transport/httpClient.js +0 -145
  530. package/dist/transaction/transport/httpOptions.d.ts +0 -33
  531. package/dist/transaction/transport/httpOptions.js +0 -12
  532. package/dist/transaction/transport/httpTransport.d.ts +0 -8
  533. package/dist/transaction/transport/httpTransport.js +0 -1276
  534. package/dist/transaction/transport/networkProbe.d.ts +0 -84
  535. package/dist/transaction/transport/networkProbe.js +0 -207
  536. package/dist/transaction/transport/wsFrameHandlers.d.ts +0 -128
  537. package/dist/transaction/transport/wsFrameHandlers.js +0 -429
  538. package/dist/transaction/transport/wsTransport.d.ts +0 -576
  539. package/dist/transaction/transport/wsTransport.js +0 -1017
  540. package/dist/transaction/types/assertExact.d.ts +0 -17
  541. package/dist/transaction/types/assertExact.js +0 -1
  542. package/dist/transaction/types/global.d.ts +0 -107
  543. package/dist/transaction/types/global.js +0 -40
  544. package/dist/transaction/types/index.d.ts +0 -205
  545. package/dist/transaction/types/index.js +0 -56
  546. package/dist/transaction/types/modelData.d.ts +0 -10
  547. package/dist/transaction/types/modelData.js +0 -9
  548. package/dist/transaction/types/participant.d.ts +0 -20
  549. package/dist/transaction/types/participant.js +0 -10
  550. package/dist/transaction/types/streams.d.ts +0 -540
  551. package/dist/transaction/types/streams.js +0 -11
  552. package/dist/transaction/utils/asyncIterator.d.ts +0 -34
  553. package/dist/transaction/utils/asyncIterator.js +0 -135
  554. package/dist/transaction/utils/duration.d.ts +0 -25
  555. package/dist/transaction/utils/duration.js +0 -45
  556. package/dist/transaction/utils/json.d.ts +0 -57
  557. package/dist/transaction/utils/json.js +0 -276
  558. package/dist/transaction/wire/accountResponses.d.ts +0 -351
  559. package/dist/transaction/wire/accountResponses.js +0 -255
  560. package/dist/transaction/wire/auth.d.ts +0 -49
  561. package/dist/transaction/wire/auth.js +0 -57
  562. package/dist/transaction/wire/bootstrapReason.d.ts +0 -9
  563. package/dist/transaction/wire/bootstrapReason.js +0 -8
  564. package/dist/transaction/wire/claimEvent.d.ts +0 -76
  565. package/dist/transaction/wire/claimEvent.js +0 -73
  566. package/dist/transaction/wire/claims.d.ts +0 -463
  567. package/dist/transaction/wire/claims.js +0 -229
  568. package/dist/transaction/wire/commit.d.ts +0 -603
  569. package/dist/transaction/wire/commit.js +0 -321
  570. package/dist/transaction/wire/delta.d.ts +0 -250
  571. package/dist/transaction/wire/delta.js +0 -147
  572. package/dist/transaction/wire/errorEnvelope.d.ts +0 -72
  573. package/dist/transaction/wire/errorEnvelope.js +0 -123
  574. package/dist/transaction/wire/feedCursor.d.ts +0 -60
  575. package/dist/transaction/wire/feedCursor.js +0 -82
  576. package/dist/transaction/wire/feedEvent.d.ts +0 -177
  577. package/dist/transaction/wire/feedEvent.js +0 -39
  578. package/dist/transaction/wire/frames.d.ts +0 -194
  579. package/dist/transaction/wire/frames.js +0 -50
  580. package/dist/transaction/wire/inboundFrames.d.ts +0 -552
  581. package/dist/transaction/wire/inboundFrames.js +0 -116
  582. package/dist/transaction/wire/index.d.ts +0 -50
  583. package/dist/transaction/wire/index.js +0 -74
  584. package/dist/transaction/wire/listEnvelope.d.ts +0 -37
  585. package/dist/transaction/wire/listEnvelope.js +0 -42
  586. package/dist/transaction/wire/modelResponses.d.ts +0 -85
  587. package/dist/transaction/wire/modelResponses.js +0 -43
  588. package/dist/transaction/wire/protocol.d.ts +0 -38
  589. package/dist/transaction/wire/protocol.js +0 -38
  590. package/dist/transaction/wire/protocolVersion.d.ts +0 -73
  591. package/dist/transaction/wire/protocolVersion.js +0 -83
  592. package/dist/transactions/mutations/MutationQueue.d.ts +0 -655
  593. package/dist/transactions/mutations/MutationQueue.js +0 -2797
  594. package/dist/transactions/mutations/MutationStore.d.ts +0 -20
  595. package/dist/transactions/mutations/MutationStore.js +0 -53
  596. package/dist/transactions/mutations/UnconfirmedWrites.d.ts +0 -82
  597. package/dist/transactions/mutations/UnconfirmedWrites.js +0 -104
  598. package/dist/transactions/mutations/coalesceRules.d.ts +0 -58
  599. package/dist/transactions/mutations/coalesceRules.js +0 -140
  600. package/dist/transactions/mutations/commitLatency.d.ts +0 -52
  601. package/dist/transactions/mutations/commitLatency.js +0 -130
  602. package/dist/transactions/mutations/commitOutboxStore.d.ts +0 -28
  603. package/dist/transactions/mutations/commitOutboxStore.js +0 -26
  604. package/dist/transactions/mutations/commitPayload.d.ts +0 -164
  605. package/dist/transactions/mutations/commitPayload.js +0 -152
  606. package/dist/transactions/mutations/deltaConfirmation.d.ts +0 -59
  607. package/dist/transactions/mutations/deltaConfirmation.js +0 -233
  608. package/dist/transactions/mutations/durableWriteStore.d.ts +0 -14
  609. package/dist/transactions/mutations/durableWriteStore.js +0 -12
  610. package/dist/transactions/mutations/optimisticApply.d.ts +0 -49
  611. package/dist/transactions/mutations/optimisticApply.js +0 -65
  612. package/dist/transactions/mutations/replayValidation.d.ts +0 -186
  613. package/dist/transactions/mutations/replayValidation.js +0 -163
  614. package/dist/utils/mobxSetup.d.ts +0 -53
  615. package/dist/utils/mobxSetup.js +0 -330
  616. package/dist/webhooks/events.d.ts +0 -43
  617. package/dist/webhooks/events.js +0 -42
  618. package/dist/webhooks/index.d.ts +0 -8
  619. package/dist/webhooks/index.js +0 -8
  620. package/dist/wire/index.d.ts +0 -1
  621. package/dist/wire/index.js +0 -8
  622. package/docs/interaction-model.md +0 -99
@@ -1,33 +0,0 @@
1
- /**
2
- * `Ablo` — the entry point to the coordination layer.
3
- *
4
- * The factory constructs the stateless client: typed model resources, commits,
5
- * claims, and session minting over request/response HTTP. It holds no socket,
6
- * no store, and no local copy of anything — the bearer credential is the
7
- * identity and the server resolves it on every request. This is the client a
8
- * server-side actor installs: an agent, a worker, a cron job, a route handler.
9
- *
10
- * ```ts
11
- * import { Ablo } from '@abloatai/ablo';
12
- * import { schema } from './schema';
13
- *
14
- * const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY, transport: 'http' });
15
- * await ablo.tasks.update({ id: taskId, data: { status: 'done' } });
16
- * ```
17
- *
18
- * The reactive materialiser — local store, live queries, presence rendering —
19
- * is the consumer package's entry point (`@abloatai/ablo`), which layers
20
- * above this one and shares the same `ablo.<model>` surface (ADR 0016).
21
- */
22
- import { createAbloHttpClient, } from './transport/httpClient.js';
23
- /**
24
- * Create a coordination-layer client in one call.
25
- *
26
- * The core carries one transport today — request/response HTTP — so
27
- * `transport: 'http'` is accepted for symmetry with the reactive package's
28
- * factory and may be omitted. The duplex transport joins this slot when the
29
- * socket carve lands (ADR 0016, follow-up 3a).
30
- */
31
- export function Ablo(options) {
32
- return createAbloHttpClient(options);
33
- }
@@ -1,152 +0,0 @@
1
- /**
2
- * Authentication and URL resolution for the `Ablo()` client.
3
- *
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.
8
- *
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
- */
14
- import type { KeyEnvironment } from '../environment.js';
15
- /**
16
- * The credential-resolver callable type. It is defined alongside
17
- * {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
18
- * re-exported here so importers of this module keep working. See that module
19
- * for the full contract.
20
- */
21
- import type { ApiKeySetter } from './credentialEndpoint.js';
22
- export type { ApiKeySetter };
23
- /**
24
- * The client options that decide a credential.
25
- *
26
- * This is the ONE declaration of that set. The resolvers below read it, and the
27
- * transport configs that accept these options derive from it rather than listing
28
- * the fields again — a second list is how `authEndpoint` came to be supported at
29
- * runtime, named in an error message, and absent from the type a caller writes
30
- * against.
31
- */
32
- export interface AuthClientOptions {
33
- readonly apiKey?: string | ApiKeySetter | null;
34
- /** A route that mints the token, instead of a key the process holds. */
35
- readonly authEndpoint?: string | ApiKeySetter | null;
36
- /** A token the caller already has, used as-is. */
37
- readonly authToken?: string | null;
38
- readonly baseURL?: string | null;
39
- readonly dangerouslyAllowBrowser?: boolean;
40
- }
41
- export interface AuthResolveInput {
42
- /**
43
- * The full set of options the caller passed to the client constructor. Each
44
- * resolver reads only the fields it needs; passing the whole object avoids
45
- * threading many separate parameters through every helper.
46
- */
47
- readonly options: AuthClientOptions;
48
- readonly env: Record<string, string | undefined>;
49
- }
50
- /**
51
- * Read `process.env` defensively. Works in browser (where `process`
52
- * is undefined), Node, and edge runtimes that expose a partial
53
- * process polyfill.
54
- */
55
- export declare function readProcessEnv(): Record<string, string | undefined>;
56
- export declare function resolveApiKey(input: AuthResolveInput): string | ApiKeySetter | null;
57
- /**
58
- * Narrow a resolved `apiKey` to the single resolver the credential lifecycle
59
- * needs: an async `() => token | null`, or `null` when auth is static — a plain
60
- * long-lived key string with no refresh, which is the common case.
61
- *
62
- * The short-lived per-user browser path passes a function `apiKey` (an
63
- * {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
64
- * from it: mint-before-connect, the proactive refresh timer with its
65
- * wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
66
- * resolver follows the `ApiKeySetter` contract end to end: resolve a token,
67
- * resolve `null` when the login is gone (terminal — surfaces `session_expired`
68
- * and signs the user out), or throw on a transient failure (backs off, without
69
- * signing out).
70
- */
71
- export declare function resolveCredentialResolver(apiKey: string | ApiKeySetter | null): (() => Promise<string | null>) | null;
72
- export declare function resolveAuthToken(input: AuthResolveInput): string | null;
73
- /**
74
- * The credential axis, not a second copy of it. `environment.ts` documents two
75
- * incidents caused by conflating the plane a request runs on with the mode a
76
- * credential was minted in, and states the credential axis must not grow when
77
- * planes do — so the CLI mismatch path reads the canonical vocabulary rather
78
- * than restating its members here.
79
- */
80
- type CliMode = KeyEnvironment;
81
- type StaticApiKeySource = 'option' | 'env';
82
- interface StaticApiKey {
83
- readonly key: string;
84
- readonly source: StaticApiKeySource;
85
- }
86
- interface CliCredentialSnapshot {
87
- readonly mode: CliMode;
88
- readonly activeProfile: string;
89
- readonly storedKey?: string;
90
- }
91
- export interface CliKeyMismatch {
92
- readonly source: StaticApiKeySource;
93
- readonly configuredKeyPrefix: string;
94
- readonly configuredMode?: CliMode;
95
- readonly cliMode: CliMode;
96
- readonly storedKeyPrefix?: string;
97
- readonly kind: 'mode_mismatch' | 'key_override';
98
- readonly message: string;
99
- }
100
- /** Infer the sandbox or production mode from an Ablo key's prefix. */
101
- export declare function modeFromApiKey(key: string): CliMode | undefined;
102
- export declare function describeCliKeyMismatch(configured: StaticApiKey, cli: CliCredentialSnapshot): CliKeyMismatch | null;
103
- export declare function warnIfCliKeyMismatch(input: AuthResolveInput, warn?: (message: string) => void): Promise<void>;
104
- export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
105
- /**
106
- * Normalizes older hosted host names to the current public API domain.
107
- * Self-hosted or custom URLs pass through unchanged; only the retired
108
- * first-party host names are rewritten.
109
- */
110
- export declare function normalizeAbloHostedBaseUrl(rawUrl: string): string;
111
- export declare function resolveBaseURL(input: AuthResolveInput): string;
112
- /**
113
- * Guards against using a secret `apiKey` in a browser. A secret key is
114
- * server-side only by default: shipping an `sk_live_...` key to a browser would
115
- * expose it in every visitor's network tab. Callers opt in explicitly when the
116
- * browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
117
- * server proxy. Throws {@link AbloAuthenticationError} when a secret key is
118
- * detected in a browser without opt-in.
119
- */
120
- /**
121
- * Rejects the REMOVED `databaseUrl` dial-in option loudly. The option is gone
122
- * from the types, but an untyped or stale caller could still pass it — and
123
- * silently ignoring it would reroute their writes to Ablo-hosted storage,
124
- * the opposite of what that option used to promise. A construction-time throw
125
- * turns a wrong-storage surprise into a clear migration instruction.
126
- */
127
- export declare function rejectRemovedDatabaseUrlOption(options: object): void;
128
- export declare function assertBrowserSafety(input: {
129
- apiKey: string | ApiKeySetter | null;
130
- dangerouslyAllowBrowser: boolean | undefined;
131
- }): void;
132
- /**
133
- * Resolves an {@link ApiKeySetter} callable to its current string value, or
134
- * returns a plain string key as-is. Called at request time so a rotating
135
- * credential picks up new values between requests. Returns `null` when no key
136
- * was configured.
137
- */
138
- export declare function resolveApiKeyValue(apiKey: string | ApiKeySetter | null): Promise<string | null>;
139
- /**
140
- * Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
141
- * `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
142
- * bootstrap helper, the hydration coordinator, the credential-exchange flow, and
143
- * the identity flow all derive their base URL through this one function, so the
144
- * derivation stays consistent across them.
145
- *
146
- * When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
147
- * the protocol family: ws becomes http and wss becomes https.
148
- */
149
- export declare function resolveBootstrapBaseUrl(input: {
150
- readonly url: string;
151
- readonly bootstrapBaseUrl?: string;
152
- }): string;
@@ -1,419 +0,0 @@
1
- /**
2
- * Authentication and URL resolution for the `Ablo()` client.
3
- *
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.
8
- *
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
- */
14
- import { AbloAuthenticationError, AbloValidationError } from '../errors.js';
15
- import { classifyCredentialKind } from '../auth/credentialPolicy.js';
16
- import { ABLO_HOSTED_API_DOMAIN, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
17
- import { isCredentialEndpoint, createEndpointCredentialResolver } from './credentialEndpoint.js';
18
- /**
19
- * Read `process.env` defensively. Works in browser (where `process`
20
- * is undefined), Node, and edge runtimes that expose a partial
21
- * process polyfill.
22
- */
23
- export function readProcessEnv() {
24
- const maybeGlobal = globalThis;
25
- return maybeGlobal.process?.env ?? {};
26
- }
27
- export function resolveApiKey(input) {
28
- // `authEndpoint` is the option that names a session-mint route: a URL the
29
- // client exchanges for a short-lived token, or an async resolver for custom
30
- // exchanges. It is resolved into an `ApiKeySetter` here — the single point
31
- // shared by every client variant (WebSocket, HTTP, and protocol clients) — so
32
- // every downstream consumer sees the same resolver and the credential
33
- // lifecycle drives renewal off it.
34
- const endpoint = input.options.authEndpoint;
35
- const configured = input.options.apiKey;
36
- if (endpoint != null) {
37
- if (configured != null) {
38
- throw new AbloValidationError('Ablo: pass either `apiKey` (a key the process holds) or `authEndpoint` ' +
39
- '(a route that mints the token) — not both; the client cannot know ' +
40
- 'which credential to use.', { code: 'invalid_options', param: 'authEndpoint' });
41
- }
42
- if (typeof endpoint === 'function')
43
- return endpoint;
44
- if (!isCredentialEndpoint(endpoint)) {
45
- throw new AbloValidationError('`authEndpoint` expects a URL or path (e.g. \'/api/ablo-session\') or an ' +
46
- 'async resolver — a key string belongs in `apiKey`.', { code: 'invalid_options', param: 'authEndpoint' });
47
- }
48
- return createEndpointCredentialResolver(endpoint);
49
- }
50
- // `apiKey` also accepts the endpoint-string form directly, detected the same
51
- // way — key strings are prefixed (`sk_`/`ek_`/`rk_`), so the two shapes never
52
- // collide. Only the explicit option is treated this way: an `ABLO_API_KEY`
53
- // environment value is always a literal key, never an endpoint.
54
- if (typeof configured === 'string' && isCredentialEndpoint(configured)) {
55
- return createEndpointCredentialResolver(configured);
56
- }
57
- return configured ?? input.env.ABLO_API_KEY ?? null;
58
- }
59
- /**
60
- * Narrow a resolved `apiKey` to the single resolver the credential lifecycle
61
- * needs: an async `() => token | null`, or `null` when auth is static — a plain
62
- * long-lived key string with no refresh, which is the common case.
63
- *
64
- * The short-lived per-user browser path passes a function `apiKey` (an
65
- * {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
66
- * from it: mint-before-connect, the proactive refresh timer with its
67
- * wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
68
- * resolver follows the `ApiKeySetter` contract end to end: resolve a token,
69
- * resolve `null` when the login is gone (terminal — surfaces `session_expired`
70
- * and signs the user out), or throw on a transient failure (backs off, without
71
- * signing out).
72
- */
73
- export function resolveCredentialResolver(apiKey) {
74
- if (typeof apiKey === 'function')
75
- return apiKey;
76
- return null;
77
- }
78
- export function resolveAuthToken(input) {
79
- return input.options.authToken ?? null;
80
- }
81
- function keyPrefix(key) {
82
- return `${key.slice(0, 12)}…`;
83
- }
84
- /** Infer the sandbox or production mode from an Ablo key's prefix. */
85
- export function modeFromApiKey(key) {
86
- if (/^(sk|rk)_test_/.test(key))
87
- return 'sandbox';
88
- if (/^(sk|rk)_live_/.test(key))
89
- return 'production';
90
- return undefined;
91
- }
92
- function resolveStaticApiKey(input) {
93
- if (typeof input.options.apiKey === 'string') {
94
- // An endpoint-string `apiKey` is not a key — it never participates in
95
- // CLI-mode mismatch checks (its minted tokens carry the mode instead).
96
- if (isCredentialEndpoint(input.options.apiKey))
97
- return null;
98
- return { key: input.options.apiKey, source: 'option' };
99
- }
100
- if (input.options.apiKey !== undefined && input.options.apiKey !== null) {
101
- return null;
102
- }
103
- const envKey = input.env.ABLO_API_KEY;
104
- if (typeof envKey === 'string' && envKey.length > 0) {
105
- return { key: envKey, source: 'env' };
106
- }
107
- return null;
108
- }
109
- function readProfileKeys(value) {
110
- if (!value || typeof value !== 'object')
111
- return {};
112
- const profiles = {};
113
- for (const [name, raw] of Object.entries(value)) {
114
- if (!raw || typeof raw !== 'object')
115
- continue;
116
- const row = raw;
117
- const sandbox = row.sandbox;
118
- const production = row.production;
119
- profiles[name] = {
120
- sandbox: sandbox && typeof sandbox === 'object' ? sandbox : undefined,
121
- production: production && typeof production === 'object' ? production : undefined,
122
- };
123
- }
124
- return profiles;
125
- }
126
- function legacyProfileKeys(value) {
127
- if (!value)
128
- return { sandbox: undefined, production: undefined };
129
- const sandbox = value.sandbox;
130
- const production = value.production;
131
- if ((sandbox && typeof sandbox === 'object') ||
132
- (production && typeof production === 'object')) {
133
- return {
134
- sandbox: sandbox && typeof sandbox === 'object' ? sandbox : undefined,
135
- production: production && typeof production === 'object' ? production : undefined,
136
- };
137
- }
138
- if (typeof value.apiKey === 'string') {
139
- return { sandbox: { apiKey: value.apiKey }, production: undefined };
140
- }
141
- return { sandbox: undefined, production: undefined };
142
- }
143
- function normalizeCliMode(value) {
144
- return value === 'sandbox' || value === 'production' ? value : undefined;
145
- }
146
- function activeProjectSlug(value) {
147
- if (!value || typeof value !== 'object')
148
- return undefined;
149
- const slug = value.slug;
150
- return typeof slug === 'string' && slug.length > 0 ? slug : undefined;
151
- }
152
- function importNodeBuiltin(specifier) {
153
- // Node-only runtime import (CLI credential snapshot). The call is dead in
154
- // browser/edge builds — guarded by `process.versions.node` and `window`
155
- // checks in the callers — but bundlers still try to resolve the dynamic
156
- // `import()` and Turbopack fails the build on the unanalyzable specifier.
157
- // The magic comments tell each bundler to emit the import verbatim and never
158
- // resolve it. Keep both so webpack and Turbopack consumers are covered.
159
- return import(/* webpackIgnore: true */ /* turbopackIgnore: true */ specifier);
160
- }
161
- async function readJsonIfPresent(path) {
162
- try {
163
- const { readFile } = await importNodeBuiltin('node:fs/promises');
164
- const text = await readFile(path, 'utf8');
165
- const parsed = JSON.parse(text);
166
- return parsed && typeof parsed === 'object' ? parsed : null;
167
- }
168
- catch {
169
- return null;
170
- }
171
- }
172
- async function readCliCredentialSnapshot(env) {
173
- const processLike = globalThis.process;
174
- if (!processLike?.versions?.node)
175
- return null;
176
- if (typeof window !== 'undefined')
177
- return null;
178
- const [{ homedir }, { join }] = await Promise.all([
179
- importNodeBuiltin('node:os'),
180
- importNodeBuiltin('node:path'),
181
- ]);
182
- const dir = env.ABLO_CONFIG_DIR
183
- ?? (env.XDG_CONFIG_HOME ? join(env.XDG_CONFIG_HOME, 'ablo') : join(homedir(), '.config', 'ablo'));
184
- const [cfg, creds] = await Promise.all([
185
- readJsonIfPresent(join(dir, 'config.json')),
186
- readJsonIfPresent(join(dir, 'credentials.json')),
187
- ]);
188
- const mode = normalizeCliMode(cfg?.mode) ?? normalizeCliMode(creds?.mode);
189
- const activeProfile = activeProjectSlug(cfg?.activeProject) ?? 'default';
190
- const profiles = {
191
- ...readProfileKeys(creds?.profiles),
192
- ...readProfileKeys(cfg?.profiles),
193
- };
194
- if (!profiles[activeProfile]) {
195
- const legacy = { ...legacyProfileKeys(cfg), ...legacyProfileKeys(creds) };
196
- if (legacy.sandbox?.apiKey || legacy.production?.apiKey) {
197
- profiles[activeProfile] = legacy;
198
- }
199
- }
200
- const effectiveMode = mode ?? (Object.keys(profiles).length > 0 ? 'sandbox' : undefined);
201
- if (!effectiveMode)
202
- return null;
203
- return {
204
- mode: effectiveMode,
205
- activeProfile,
206
- ...(profiles[activeProfile]?.[effectiveMode]?.apiKey
207
- ? { storedKey: profiles[activeProfile][effectiveMode].apiKey }
208
- : {}),
209
- };
210
- }
211
- export function describeCliKeyMismatch(configured, cli) {
212
- const configuredMode = modeFromApiKey(configured.key);
213
- const configuredKeyPrefix = keyPrefix(configured.key);
214
- const storedKeyPrefix = cli.storedKey ? keyPrefix(cli.storedKey) : undefined;
215
- const sourceLabel = configured.source === 'env' ? 'ABLO_API_KEY' : 'configured apiKey';
216
- if (configuredMode && configuredMode !== cli.mode) {
217
- return {
218
- source: configured.source,
219
- configuredKeyPrefix,
220
- configuredMode,
221
- cliMode: cli.mode,
222
- ...(storedKeyPrefix ? { storedKeyPrefix } : {}),
223
- kind: 'mode_mismatch',
224
- message: `${sourceLabel} is a ${configuredMode} key (${configuredKeyPrefix}) but the Ablo CLI is in ` +
225
- `${cli.mode} mode${storedKeyPrefix ? ` (active stored key ${storedKeyPrefix})` : ''}. ` +
226
- `Requests will use ${configuredMode}. Use the ${cli.mode} key, unset ABLO_API_KEY, ` +
227
- `or run \`ablo mode ${configuredMode}\` intentionally.`,
228
- };
229
- }
230
- if (configured.source === 'env' && cli.storedKey && configured.key !== cli.storedKey) {
231
- return {
232
- source: configured.source,
233
- configuredKeyPrefix,
234
- ...(configuredMode ? { configuredMode } : {}),
235
- cliMode: cli.mode,
236
- storedKeyPrefix,
237
- kind: 'key_override',
238
- message: `ABLO_API_KEY (${configuredKeyPrefix}) overrides the CLI's stored active ${cli.mode} key ` +
239
- `(${storedKeyPrefix}). Requests will use the environment key. Unset ABLO_API_KEY to use ` +
240
- '`ablo status` / `ablo mode` credentials.',
241
- };
242
- }
243
- return null;
244
- }
245
- let warnedCliKeyMismatch = false;
246
- export async function warnIfCliKeyMismatch(input, warn) {
247
- if (warnedCliKeyMismatch)
248
- return;
249
- if (input.env.NODE_ENV === 'production')
250
- return;
251
- const configured = resolveStaticApiKey(input);
252
- if (!configured)
253
- return;
254
- const cli = await readCliCredentialSnapshot(input.env);
255
- if (!cli)
256
- return;
257
- const mismatch = describeCliKeyMismatch(configured, cli);
258
- if (!mismatch)
259
- return;
260
- warnedCliKeyMismatch = true;
261
- if (warn)
262
- warn(mismatch.message);
263
- else if (typeof console !== 'undefined')
264
- console.warn('[Ablo]', mismatch.message);
265
- }
266
- // Declared in `./hostedEndpoints`, the single source of the hosted domain, and
267
- // re-exported here so existing import paths keep working.
268
- export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
269
- const LEGACY_HOSTED_API_HOSTS = new Set([
270
- 'mesh.ablo.finance',
271
- 'mesh-staging.ablo.finance',
272
- 'api.ablo.finance',
273
- 'sync-staging.ablo.finance',
274
- ]);
275
- /**
276
- * Normalizes older hosted host names to the current public API domain.
277
- * Self-hosted or custom URLs pass through unchanged; only the retired
278
- * first-party host names are rewritten.
279
- */
280
- export function normalizeAbloHostedBaseUrl(rawUrl) {
281
- const trimmed = rawUrl.trim();
282
- if (!trimmed)
283
- return trimmed;
284
- // A scheme-less value (e.g. `api-staging.abloatai.com`) is treated as a
285
- // relative URL: `new URL()` throws on it, and a later `fetch` would resolve it
286
- // against the current page — producing a 404 from the app's own origin.
287
- // Prepending a scheme makes the base absolute. `https` matches
288
- // {@link ABLO_HOSTED_HTTP_BASE_URL}; the socket layer derives `wss` from it.
289
- // An existing scheme (ws, wss, http, or https) is preserved untouched.
290
- const schemed = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
291
- try {
292
- const url = new URL(schemed);
293
- // Canonicalize the scheme to the HTTP family: accept all four schemes
294
- // (http, https, ws, wss), normalize at this single entry point, and let
295
- // each layer derive its own protocol (the socket layer maps http to ws and
296
- // https to wss; fetch uses the URL as-is). Without this, a `ws://` base URL
297
- // reaches HTTP consumers un-normalized and the client fails at startup
298
- // instead of connecting.
299
- if (url.protocol === 'ws:')
300
- url.protocol = 'http:';
301
- if (url.protocol === 'wss:')
302
- url.protocol = 'https:';
303
- if (!LEGACY_HOSTED_API_HOSTS.has(url.hostname)) {
304
- return url.toString().replace(/\/+$/, '');
305
- }
306
- url.hostname = ABLO_HOSTED_API_DOMAIN;
307
- if (url.protocol === 'http:')
308
- url.protocol = 'https:';
309
- return url.toString().replace(/\/+$/, '');
310
- }
311
- catch {
312
- return schemed;
313
- }
314
- }
315
- export function resolveBaseURL(input) {
316
- return normalizeAbloHostedBaseUrl(input.options.baseURL ?? ABLO_DEFAULT_BASE_URL);
317
- }
318
- /**
319
- * Guards against using a secret `apiKey` in a browser. A secret key is
320
- * server-side only by default: shipping an `sk_live_...` key to a browser would
321
- * expose it in every visitor's network tab. Callers opt in explicitly when the
322
- * browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
323
- * server proxy. Throws {@link AbloAuthenticationError} when a secret key is
324
- * detected in a browser without opt-in.
325
- */
326
- /**
327
- * Rejects the REMOVED `databaseUrl` dial-in option loudly. The option is gone
328
- * from the types, but an untyped or stale caller could still pass it — and
329
- * silently ignoring it would reroute their writes to Ablo-hosted storage,
330
- * the opposite of what that option used to promise. A construction-time throw
331
- * turns a wrong-storage surprise into a clear migration instruction.
332
- */
333
- export function rejectRemovedDatabaseUrlOption(options) {
334
- const legacyValue = Reflect.get(options, 'databaseUrl');
335
- if (legacyValue == null)
336
- return;
337
- throw new AbloValidationError('The `databaseUrl` option was removed. Your database connects through ' +
338
- '`ablo connect` now: Ablo writes it directly with a scoped DML role and ' +
339
- 'confirms through its replication stream. Run `npx ablo connect` to ' +
340
- 'register it, then construct the client with your API key only.', { code: 'invalid_body' });
341
- }
342
- export function assertBrowserSafety(input) {
343
- const inBrowser = typeof window !== 'undefined';
344
- if (!input.dangerouslyAllowBrowser &&
345
- inBrowser &&
346
- typeof input.apiKey === 'string' &&
347
- classifyCredentialKind(input.apiKey) === 'secret') {
348
- throw new AbloAuthenticationError("It looks like you're running in a browser-like environment.\n\n" +
349
- 'This is disabled by default — your secret API key would be ' +
350
- "exposed to every visitor's network tab. If you understand the risks " +
351
- 'and have appropriate mitigations in place, you can set the ' +
352
- '`dangerouslyAllowBrowser` option to `true`, e.g.,\n\n' +
353
- ' Ablo({ schema, apiKey, dangerouslyAllowBrowser: true });\n', { code: 'browser_apikey_blocked' });
354
- }
355
- }
356
- /**
357
- * Resolves an {@link ApiKeySetter} callable to its current string value, or
358
- * returns a plain string key as-is. Called at request time so a rotating
359
- * credential picks up new values between requests. Returns `null` when no key
360
- * was configured.
361
- */
362
- export async function resolveApiKeyValue(apiKey) {
363
- if (apiKey == null)
364
- return null;
365
- if (typeof apiKey === 'function')
366
- return apiKey();
367
- return apiKey;
368
- }
369
- /**
370
- * Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
371
- * `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
372
- * bootstrap helper, the hydration coordinator, the credential-exchange flow, and
373
- * the identity flow all derive their base URL through this one function, so the
374
- * derivation stays consistent across them.
375
- *
376
- * When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
377
- * the protocol family: ws becomes http and wss becomes https.
378
- */
379
- export function resolveBootstrapBaseUrl(input) {
380
- if (input.bootstrapBaseUrl) {
381
- // Coerce ws/wss to http/https on the override path as well. This base URL is
382
- // used for HTTP fetches (identity resolution, credential exchange, and
383
- // bootstrap), and the browser `fetch` rejects ws and wss schemes outright.
384
- // The override can legitimately arrive with a WebSocket scheme when a caller
385
- // derives it as `${baseUrl}/api` from a WebSocket base URL, so normalize it
386
- // here rather than failing at fetch time.
387
- return ensureApiSuffix(normalizeAbloHostedBaseUrl(input.bootstrapBaseUrl).replace(/^ws/, 'http'));
388
- }
389
- const url = normalizeAbloHostedBaseUrl(input.url);
390
- return ensureApiSuffix(url.replace(/^ws/, 'http'));
391
- }
392
- /**
393
- * Ensures the HTTP base ends in the `/api` route segment that every endpoint is
394
- * mounted under.
395
- *
396
- * A hosted deployment that sets a custom `baseURL` or `bootstrapBaseUrl` (a
397
- * custom subdomain, a staging host, and so on) without the `/api` suffix would
398
- * send every credential exchange to `…/auth/capability` instead of
399
- * `…/api/auth/capability`, producing a 404 that surfaces as `exchange_failed`.
400
- * Since the client builds routes relative to this base and no valid deployment
401
- * serves them from the root, appending a single trailing `/api` here is always
402
- * correct, and it is idempotent for callers who already include it.
403
- */
404
- function ensureApiSuffix(httpBase) {
405
- const trimmed = httpBase.replace(/\/+$/, '');
406
- try {
407
- const u = new URL(trimmed);
408
- const segments = u.pathname.split('/').filter(Boolean);
409
- if (segments[segments.length - 1] === 'api')
410
- return trimmed;
411
- u.pathname = `${u.pathname.replace(/\/+$/, '')}/api`;
412
- return u.toString().replace(/\/+$/, '');
413
- }
414
- catch {
415
- // Should be unreachable after `normalizeAbloHostedBaseUrl`, which yields an
416
- // absolute URL, but fall back to a string check rather than throwing.
417
- return trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
418
- }
419
- }
@@ -1,15 +0,0 @@
1
- /**
2
- * The hand-off the identity flow performs once a credential resolves: it names
3
- * the account scope and the sync groups everything downstream should read under.
4
- *
5
- * The core defines the port; the consumer supplies the implementation. That
6
- * keeps identity resolution — which is settlement's business — from depending on
7
- * whatever happens to materialise rows on the other side of it (ADR 0016). The
8
- * reactive engine's `BootstrapFetcher` satisfies this structurally.
9
- */
10
- export interface BootstrapScope {
11
- /** Bind subsequent reads to one account's cache partition. */
12
- setCacheScope(cacheScope: string): void;
13
- /** Narrow subsequent reads to the sync groups the credential authorises. */
14
- setSyncGroups(syncGroups: readonly string[] | undefined): void;
15
- }
@@ -1 +0,0 @@
1
- export {};