@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
@@ -72,22 +72,24 @@
72
72
  * to one entity before any tool is chosen; tool implementations stay exactly
73
73
  * the same.
74
74
  *
75
- * ## Multi-agent coordination — the canonical way
76
- *
77
- * When several agents (or agents + humans) write the SAME row concurrently, the
78
- * outcome is decided by **(write path) × (the model's conflict policy)**, NOT by
79
- * how smart the model is. The same model silently loses 3 of 4 concurrent
80
- * contributions through a blind whole-row write, and lands all 4 through a
81
- * coordinated one because the coordinated write returns a *signal* the model
82
- * (or the runtime) acts on. Two empirical laws fall out:
83
- *
84
- * 1. **Surface the signal.** A write that swallows the conflict and reports
85
- * success is the footgun. Every robust path returns a legible result
86
- * (`reject` re-read & retry; `claimed` → the model tries again) instead of
87
- * clobbering. Reaching for a bigger model does not fix a silent write.
88
- * 2. **Back off.** Under N-way contention, writers that retry in lock-step just
89
- * re-collide. The shared reconcile loop already jitters its backoff; any
90
- * hand-rolled retry must too, or it exhausts its budget and drops a writer.
75
+ * ## Multi-agent coordination
76
+ *
77
+ * When several agents, or agents and people, write the same row at once, the
78
+ * outcome depends on the write path and the model's conflict policy, not on how
79
+ * capable the model is. The same model silently loses three of four concurrent
80
+ * contributions through a blind whole-row write, yet lands all four through a
81
+ * coordinated one, because a coordinated write returns a signal the model or the
82
+ * runtime can act on. Two rules follow:
83
+ *
84
+ * 1. Surface the signal. A write that swallows the conflict and reports success
85
+ * is the trap. Every reliable path returns a legible result instead of
86
+ * overwriting a rejection leads to a re-read and retry, and a `'claimed'`
87
+ * result leads the model to try again. A larger model does not fix a silent
88
+ * write.
89
+ * 2. Back off. Under heavy contention, writers that retry in lock-step simply
90
+ * collide again. The shared reconcile loop already jitters its backoff, and
91
+ * any retry you write by hand should too, or it exhausts its budget and drops
92
+ * a writer.
91
93
  *
92
94
  * `coordinatedTool` (below) encodes both. Prefer it over a hand-written tool for
93
95
  * "save the agent's contribution into the shared row":
@@ -107,12 +109,13 @@
107
109
  * |----------|-------------------|---------------|------------------------|
108
110
  * | `merge` | accumulate (CAS) | re-read + re-apply (silent, backed off) | must be `reject` (default) |
109
111
  * | `claim` | mutual exclusion | returns `{status:'claimed'}` → model retries | any |
110
- * | `queue` | FIFO-ish (SQS) | poll-acquire until granted / timeout | any |
112
+ * | `queue` | FIFO-ish (poll) | poll-acquire until granted / timeout | any |
111
113
  *
112
- * Note: a model declaring `agentsNotify()` HOLDS a losing write instead of
113
- * rejecting it, which defeats `merge`'s reconcile (the loser is dropped, not
114
- * retried). Use `agentsReject()` for accumulate semantics, or `claim`/`queue`.
114
+ * Note: a model that declares `agentsNotify()` holds a losing write rather than
115
+ * rejecting it, which defeats `'merge'`'s reconcile loop — the loser is dropped
116
+ * instead of retried. Use `agentsReject()` for accumulate semantics, or the
117
+ * `'claim'` or `'queue'` strategy.
115
118
  */
116
- export { coordinationContextMiddleware, type CoordinationContextMiddlewareOptions, type ClaimTarget, } from './coordination-context.js';
119
+ export { coordinationContextMiddleware, type CoordinationContextMiddlewareOptions, type ClaimTarget, } from './coordinationContext.js';
117
120
  export { wrapWithMultiplayer, type WrapWithMultiplayerOptions } from './wrap.js';
118
- export { coordinatedTool, type CoordinationStrategy, type CoordinatedToolOptions, type CoordinatedWriteResult, } from './coordinated-tool.js';
121
+ export { coordinatedTool, type CoordinationStrategy, type CoordinatedToolOptions, type CoordinatedWriteResult, } from './coordinatedTool.js';
@@ -72,22 +72,24 @@
72
72
  * to one entity before any tool is chosen; tool implementations stay exactly
73
73
  * the same.
74
74
  *
75
- * ## Multi-agent coordination — the canonical way
76
- *
77
- * When several agents (or agents + humans) write the SAME row concurrently, the
78
- * outcome is decided by **(write path) × (the model's conflict policy)**, NOT by
79
- * how smart the model is. The same model silently loses 3 of 4 concurrent
80
- * contributions through a blind whole-row write, and lands all 4 through a
81
- * coordinated one because the coordinated write returns a *signal* the model
82
- * (or the runtime) acts on. Two empirical laws fall out:
83
- *
84
- * 1. **Surface the signal.** A write that swallows the conflict and reports
85
- * success is the footgun. Every robust path returns a legible result
86
- * (`reject` re-read & retry; `claimed` → the model tries again) instead of
87
- * clobbering. Reaching for a bigger model does not fix a silent write.
88
- * 2. **Back off.** Under N-way contention, writers that retry in lock-step just
89
- * re-collide. The shared reconcile loop already jitters its backoff; any
90
- * hand-rolled retry must too, or it exhausts its budget and drops a writer.
75
+ * ## Multi-agent coordination
76
+ *
77
+ * When several agents, or agents and people, write the same row at once, the
78
+ * outcome depends on the write path and the model's conflict policy, not on how
79
+ * capable the model is. The same model silently loses three of four concurrent
80
+ * contributions through a blind whole-row write, yet lands all four through a
81
+ * coordinated one, because a coordinated write returns a signal the model or the
82
+ * runtime can act on. Two rules follow:
83
+ *
84
+ * 1. Surface the signal. A write that swallows the conflict and reports success
85
+ * is the trap. Every reliable path returns a legible result instead of
86
+ * overwriting a rejection leads to a re-read and retry, and a `'claimed'`
87
+ * result leads the model to try again. A larger model does not fix a silent
88
+ * write.
89
+ * 2. Back off. Under heavy contention, writers that retry in lock-step simply
90
+ * collide again. The shared reconcile loop already jitters its backoff, and
91
+ * any retry you write by hand should too, or it exhausts its budget and drops
92
+ * a writer.
91
93
  *
92
94
  * `coordinatedTool` (below) encodes both. Prefer it over a hand-written tool for
93
95
  * "save the agent's contribution into the shared row":
@@ -107,12 +109,13 @@
107
109
  * |----------|-------------------|---------------|------------------------|
108
110
  * | `merge` | accumulate (CAS) | re-read + re-apply (silent, backed off) | must be `reject` (default) |
109
111
  * | `claim` | mutual exclusion | returns `{status:'claimed'}` → model retries | any |
110
- * | `queue` | FIFO-ish (SQS) | poll-acquire until granted / timeout | any |
112
+ * | `queue` | FIFO-ish (poll) | poll-acquire until granted / timeout | any |
111
113
  *
112
- * Note: a model declaring `agentsNotify()` HOLDS a losing write instead of
113
- * rejecting it, which defeats `merge`'s reconcile (the loser is dropped, not
114
- * retried). Use `agentsReject()` for accumulate semantics, or `claim`/`queue`.
114
+ * Note: a model that declares `agentsNotify()` holds a losing write rather than
115
+ * rejecting it, which defeats `'merge'`'s reconcile loop — the loser is dropped
116
+ * instead of retried. Use `agentsReject()` for accumulate semantics, or the
117
+ * `'claim'` or `'queue'` strategy.
115
118
  */
116
- export { coordinationContextMiddleware, } from './coordination-context.js';
119
+ export { coordinationContextMiddleware, } from './coordinationContext.js';
117
120
  export { wrapWithMultiplayer } from './wrap.js';
118
- export { coordinatedTool, } from './coordinated-tool.js';
121
+ export { coordinatedTool, } from './coordinatedTool.js';
@@ -13,7 +13,7 @@
13
13
  * const wrapped = wrapWithMultiplayer({
14
14
  * model: anthropic('claude-opus-4-7'),
15
15
  * agent,
16
- * target: { entityType: 'SlideDeck', entityId: 'deck-abc' },
16
+ * target: { type: 'SlideDeck', id: 'deck-abc' },
17
17
  * });
18
18
  *
19
19
  * const result = streamText({
@@ -29,7 +29,7 @@ import { wrapLanguageModel } from 'ai';
29
29
  import type { LanguageModelV3, LanguageModelV3Middleware } from '@ai-sdk/provider';
30
30
  import type { Ablo } from '../client/Ablo.js';
31
31
  import type { SchemaRecord } from '../schema/schema.js';
32
- import { type ClaimTarget } from './coordination-context.js';
32
+ import { type ClaimTarget } from './coordinationContext.js';
33
33
  export interface WrapWithMultiplayerOptions<R extends SchemaRecord = SchemaRecord> {
34
34
  /** The base language model to wrap. Consumer brings their own. */
35
35
  readonly model: LanguageModelV3;
@@ -52,14 +52,13 @@ export interface WrapWithMultiplayerOptions<R extends SchemaRecord = SchemaRecor
52
52
  */
53
53
  readonly excludeClaimIds?: readonly string[];
54
54
  /**
55
- * Optional extra middleware to compose. Runs in the order given,
56
- * INSIDE the multiplayer middlewares (so the multiplayer wrap is
57
- * the outer-most). Useful for caching, observability, custom
58
- * transforms that should not affect the multiplayer signal.
55
+ * Extra middleware to compose. It runs in the order given, nested inside the
56
+ * multiplayer middleware, so the multiplayer wrap stays the outermost layer.
57
+ * Use it for caching, observability, or custom transforms that should not
58
+ * affect the multiplayer signal.
59
59
  *
60
60
  * For full control over ordering, skip this helper and call
61
- * `wrapLanguageModel` directly with all middleware in the order
62
- * you want.
61
+ * `wrapLanguageModel` directly with all the middleware in the order you want.
63
62
  */
64
63
  readonly extraMiddleware?: readonly LanguageModelV3Middleware[];
65
64
  }
@@ -13,7 +13,7 @@
13
13
  * const wrapped = wrapWithMultiplayer({
14
14
  * model: anthropic('claude-opus-4-7'),
15
15
  * agent,
16
- * target: { entityType: 'SlideDeck', entityId: 'deck-abc' },
16
+ * target: { type: 'SlideDeck', id: 'deck-abc' },
17
17
  * });
18
18
  *
19
19
  * const result = streamText({
@@ -26,7 +26,7 @@
26
26
  * ```
27
27
  */
28
28
  import { wrapLanguageModel } from 'ai';
29
- import { coordinationContextMiddleware, } from './coordination-context.js';
29
+ import { coordinationContextMiddleware, } from './coordinationContext.js';
30
30
  export function wrapWithMultiplayer(options) {
31
31
  const { model, agent, target, excludeClaimIds, extraMiddleware } = options;
32
32
  return wrapLanguageModel({
@@ -1,66 +1,65 @@
1
1
  /**
2
- * Credential POLICY the single source of truth for "what KIND of credential
3
- * did the caller hand us, and what do we DO with it at connect time".
2
+ * Decides what a credential is and how to use it when a client connects. A
3
+ * caller configures an Ablo client with an API key, and this module answers two
4
+ * questions about that value: which of the four key kinds it is, and which
5
+ * connect-time route it takes.
4
6
  *
5
- * Before this module the prefix-dispatch decision (`sk_`/`ek_`/`rk_`/`pk_`) was
6
- * re-implemented with raw `startsWith()` sniffs in ~5 places (identity.ts ×3,
7
- * auth.ts browser guard, cli/dev.ts, cli/push.ts) and the connect-time routing
8
- * lived as a 4-branch if/elif tree inside `resolveParticipantIdentity`. Folding
9
- * the policy here keeps the kind-taxonomy and the connect decision in ONE place;
10
- * the consumers below just call into it.
7
+ * The routing decision is the only thing that lives here. This module does not
8
+ * perform the network calls that mint or exchange credentials;
9
+ * {@link resolveCredential} delegates those to primitives the caller supplies,
10
+ * so the decision of what to do stays separate from the work of doing it.
11
11
  *
12
- * This module is deliberately POLICY-ONLY. It does NOT own the auth primitives
13
- * (`exchangeApiKey` / `mintUserSessionKey` / `resolveIdentity`), the credential
14
- * lifecycle (`startCredentialLifecycle` / refresh scheduler), or the connection
15
- * FSM those are correctly distributed consumers. `resolveCredential` DELEGATES
16
- * to injected primitives rather than reimplementing any HTTP mint call.
17
- *
18
- * Browser-safe: `classifyCredentialKind` is a pure-string helper and MUST NOT
19
- * import the Node-only `keys` module (`node:crypto`). The key-prefix contract it
20
- * encodes mirrors `keys/index.ts`'s `KIND_BY_PREFIX` (the Stripe-style model:
21
- * sk_=secret, rk_=restricted, ek_=ephemeral, pk_=publishable) but stays a plain
22
- * prefix lookup so it can ship in the client bundle.
12
+ * {@link classifyCredentialKind} is a plain string check with no Node
13
+ * dependencies, so it is safe to run in a browser bundle. It recognizes the key
14
+ * prefixes `sk_` (secret), `rk_` (restricted), `ek_` (ephemeral), and `pk_`
15
+ * (publishable), but does not validate a key's checksum or environment segment.
23
16
  */
24
17
  import type { exchangeApiKey, mintUserSessionKey, resolveIdentity } from './index.js';
25
- import type { resolveApiKeyValue } from '../client/auth.js';
26
18
  /**
27
- * The four Ablo API-key kinds (Stripe-style). Prefix contractkept in lockstep
28
- * with `keys/index.ts` `API_KEY_KINDS` / `KIND_BY_PREFIX`, but declared locally
29
- * so this browser-safe module never pulls in `node:crypto`.
19
+ * The shape of the function that resolves a configured `apiKey` which may be a
20
+ * string or an async setter — down to a concrete string, or `null` when no key
21
+ * is available. It is declared here structurally, rather than imported, to avoid
22
+ * a circular dependency between this module and the code that supplies the
23
+ * function. Any function with a matching shape satisfies it.
24
+ */
25
+ type ResolveApiKeyValueFn = (apiKey: string | (() => Promise<string | null>) | null) => Promise<string | null>;
26
+ /**
27
+ * The four kinds of Ablo API key, one per prefix: `sk_` is secret, `ek_` is
28
+ * ephemeral, `rk_` is restricted, and `pk_` is publishable. The list is declared
29
+ * here, rather than imported, so this browser-safe module stays free of Node-only
30
+ * dependencies.
30
31
  */
31
32
  export type CredentialKind = 'secret' | 'ephemeral' | 'restricted' | 'publishable';
32
33
  /**
33
- * Lightweight, browser-safe prefix kind classifier. The SINGLE source of truth
34
- * for prefix dispatch across the SDK (connect routing, the browser guard, the
35
- * CLI key-gating). Returns `null` for a value that carries no recognized Ablo
36
- * key prefix (a caller-supplied capability/auth token, an empty/garbage value).
37
- *
38
- * Pure string check — does NOT validate the checksum or environment segment
39
- * (that's `keys/index.ts` `parseApiKey`, which is Node-only). This is only the
40
- * "which of the four buckets" decision.
34
+ * Classifies a credential by its prefix, returning its {@link CredentialKind}, or
35
+ * `null` when the value carries no recognized Ablo key prefix for example a
36
+ * capability or auth token the caller supplied, or an empty string. This is a
37
+ * plain string check that is safe to run in a browser; it decides only which of
38
+ * the four kinds a value is, and does not validate the key's checksum or
39
+ * environment segment.
41
40
  */
42
41
  export declare function classifyCredentialKind(value: string): CredentialKind | null;
43
42
  /**
44
- * Auth primitives injected into {@link resolveCredential}. Each is the canonical
45
- * implementation from `auth/index.ts` / `client/auth.ts`; the policy DELEGATES to
46
- * them so the HTTP mint logic stays in ONE place and only the routing decision
47
- * lives here. `mintUserSessionKey` is carried for completeness of the primitive
48
- * surface (the browser/session path mints it before connect); `resolveCredential`
49
- * never re-mints it a pre-minted `ek_` arrives ready to use.
43
+ * The set of authentication primitives that {@link resolveCredential} delegates
44
+ * to. Injecting them keeps the network calls that mint and exchange credentials
45
+ * in one place and leaves this module responsible only for the routing decision.
46
+ * {@link resolveCredential} never calls `mintUserSessionKey` itself an
47
+ * ephemeral `ek_` key is minted before the client connects and arrives ready to
48
+ * use but it is listed here to describe the full primitive surface.
50
49
  */
51
50
  export interface CredentialPrimitives {
52
51
  readonly exchangeApiKey: typeof exchangeApiKey;
53
52
  readonly mintUserSessionKey: typeof mintUserSessionKey;
54
53
  readonly resolveIdentity: typeof resolveIdentity;
55
- readonly resolveApiKeyValue: typeof resolveApiKeyValue;
54
+ readonly resolveApiKeyValue: ResolveApiKeyValueFn;
56
55
  }
57
56
  export interface ResolveCredentialContext {
58
57
  readonly primitives: CredentialPrimitives;
59
58
  /**
60
- * Build the argument bag for the hosted exchange. identity.ts owns the baseUrl
61
- * derivation + participant scope, so it supplies the args; the policy invokes
62
- * `primitives.exchangeApiKey` with them. The `apiKey` is filled in by the policy
63
- * from the resolved value.
59
+ * The arguments for the credential exchange, minus the `apiKey`. The caller
60
+ * derives the base URL and participant scope and supplies them here;
61
+ * {@link resolveCredential} fills in the resolved `apiKey` and calls
62
+ * `exchangeApiKey`.
64
63
  */
65
64
  readonly exchangeArgs: Omit<Parameters<typeof exchangeApiKey>[0], 'apiKey'>;
66
65
  }
@@ -73,23 +72,23 @@ export interface ResolveCredentialInput {
73
72
  readonly capabilityToken: string | undefined;
74
73
  /** Configured static `authToken`. */
75
74
  readonly authToken: string | null;
76
- /** True once the caller knows its own identity (legacy explicit path). */
75
+ /** True when the caller already knows its own identity, so no server round-trip is needed to resolve it. */
77
76
  readonly hasExplicitIdentity: boolean;
78
77
  }
79
78
  /**
80
- * The connect-time decision, expressed as a discriminated union over the routing
81
- * kind (NOT the raw key kind `ek_` and `rk_` collapse into the same
82
- * `pre-minted` route, and a bare capability token routes the same way). The
83
- * caller (`identity.ts`) switches on `kind` and performs the scope/side-effect
84
- * wiring each route needs.
79
+ * The outcome of the connect-time decision, as a discriminated union over the
80
+ * route rather than the key kind: an `ek_` and an `rk_` key both take the
81
+ * `pre-minted` route, as does a bare capability token. The caller switches on
82
+ * `kind` and wires up the scope and side effects each route needs.
85
83
  *
86
- * Fields carry exactly what each branch in the old if/elif tree produced:
87
- * - `getBearer` — the token to authenticate the bootstrap/`/auth/*` HTTP
88
- * and to seed the credential source with.
89
- * - `expiresAtMs` exchange expiry (drives the refresh scheduler) or null
90
- * when the credential never expires / nothing to refresh.
91
- * - `controlPlaneKey` — the ORIGINAL configured apiKey when the route minted
92
- * via exchange (so a refresh can re-mint), else null.
84
+ * Every variant carries the same three fields:
85
+ * - `getBearer` — the token used to authenticate the bootstrap and `/auth/*`
86
+ * requests, and to seed the credential source.
87
+ * - `expiresAtMs` when the credential expires, which drives the refresh
88
+ * scheduler, or `null` when there is nothing to refresh.
89
+ * - `controlPlaneKey` — the original configured API key when the route minted
90
+ * its bearer through an exchange, so a refresh can mint again; otherwise
91
+ * `null`.
93
92
  */
94
93
  export type ResolvedCredential =
95
94
  /** `pk_` — long-lived browser-safe read-only project key. Used directly as the
@@ -111,16 +110,16 @@ export type ResolvedCredential =
111
110
  /** The configured apiKey (string or setter) — read fresh on each refresh. */
112
111
  readonly controlPlaneKey: string | (() => Promise<string | null>);
113
112
  }
114
- /** Pre-minted `ek_`/`rk_` OR an explicit capability/auth token — used AS-IS as
115
- * the bearer (never exchanged). Identity resolved via `/auth/identity`. */
113
+ /** A pre-minted `ek_` or `rk_` key, or an explicit capability or auth token,
114
+ * used as the bearer without any exchange. Identity resolved via `/auth/identity`. */
116
115
  | {
117
116
  readonly kind: 'pre-minted';
118
117
  readonly getBearer: string;
119
118
  readonly expiresAtMs: null;
120
119
  readonly controlPlaneKey: null;
121
120
  }
122
- /** Legacy explicit caller knows its own organizationId + user/agentId. No
123
- * server round-trip; the (optional) bearer is the initial cap token. */
121
+ /** The caller already knows its own organization and user or agent id, so there
122
+ * is no server round-trip; the optional bearer is the initial capability token. */
124
123
  | {
125
124
  readonly kind: 'explicit';
126
125
  readonly getBearer: string | undefined;
@@ -128,18 +127,22 @@ export type ResolvedCredential =
128
127
  readonly controlPlaneKey: null;
129
128
  };
130
129
  /**
131
- * Connect-time credential routing absorbs the decision tree that used to live
132
- * inline in `resolveParticipantIdentity`. Classifies the configured apiKey, then
133
- * routes to one of four outcomes, DELEGATING the actual HTTP exchange to the
134
- * injected `exchangeApiKey` primitive. The caller switches on
135
- * `ResolvedCredential.kind` to perform scope wiring + scheduler setup.
130
+ * Routes a configured API key to its connect-time outcome. It classifies the
131
+ * key, then returns one of four {@link ResolvedCredential} variants, delegating
132
+ * any credential exchange to the injected `exchangeApiKey` primitive. The caller
133
+ * switches on the result's `kind` to wire up scope and the refresh scheduler.
136
134
  *
137
- * Routing (preserves the old branch order exactly):
138
- * 0. `pk_` + no explicit cap token `publishable` (direct bearer, no refresh).
139
- * 1. exchangeable apiKey (any prefix that ISN'T a pre-minted `ek_`/`rk_`) +
140
- * no explicit cap token `exchange` (hosted-cloud round-trip + scheduler).
141
- * 2. otherwise, identity unknown `pre-minted` (use the cap token as-is). Throws
142
- * `session_expired` when there is no token to authenticate `/auth/identity`.
143
- * 3. otherwise (identity known) `explicit` (legacy self-hosted, no round-trip).
135
+ * The routes, in the order they are tried:
136
+ * 0. A `pk_` key with no explicit capability token becomes `publishable`: used
137
+ * directly as the bearer, with no refresh.
138
+ * 1. Any other exchangeable key (one that is not a pre-minted `ek_` or `rk_`)
139
+ * with no explicit capability token becomes `exchange`: a round-trip mints a
140
+ * capability token, and the refresh scheduler renews it before it expires.
141
+ * 2. Otherwise, when the caller's identity is not yet known, the result is
142
+ * `pre-minted`: the capability token is used as-is. Throws `session_expired`
143
+ * when there is no token to authenticate `/auth/identity`.
144
+ * 3. Otherwise, when the caller already knows its identity, the result is
145
+ * `explicit`, with no round-trip.
144
146
  */
145
147
  export declare function resolveCredential(input: ResolveCredentialInput, ctx: ResolveCredentialContext): Promise<ResolvedCredential>;
148
+ export {};
@@ -1,25 +1,18 @@
1
1
  /**
2
- * Credential POLICY the single source of truth for "what KIND of credential
3
- * did the caller hand us, and what do we DO with it at connect time".
2
+ * Decides what a credential is and how to use it when a client connects. A
3
+ * caller configures an Ablo client with an API key, and this module answers two
4
+ * questions about that value: which of the four key kinds it is, and which
5
+ * connect-time route it takes.
4
6
  *
5
- * Before this module the prefix-dispatch decision (`sk_`/`ek_`/`rk_`/`pk_`) was
6
- * re-implemented with raw `startsWith()` sniffs in ~5 places (identity.ts ×3,
7
- * auth.ts browser guard, cli/dev.ts, cli/push.ts) and the connect-time routing
8
- * lived as a 4-branch if/elif tree inside `resolveParticipantIdentity`. Folding
9
- * the policy here keeps the kind-taxonomy and the connect decision in ONE place;
10
- * the consumers below just call into it.
7
+ * The routing decision is the only thing that lives here. This module does not
8
+ * perform the network calls that mint or exchange credentials;
9
+ * {@link resolveCredential} delegates those to primitives the caller supplies,
10
+ * so the decision of what to do stays separate from the work of doing it.
11
11
  *
12
- * This module is deliberately POLICY-ONLY. It does NOT own the auth primitives
13
- * (`exchangeApiKey` / `mintUserSessionKey` / `resolveIdentity`), the credential
14
- * lifecycle (`startCredentialLifecycle` / refresh scheduler), or the connection
15
- * FSM those are correctly distributed consumers. `resolveCredential` DELEGATES
16
- * to injected primitives rather than reimplementing any HTTP mint call.
17
- *
18
- * Browser-safe: `classifyCredentialKind` is a pure-string helper and MUST NOT
19
- * import the Node-only `keys` module (`node:crypto`). The key-prefix contract it
20
- * encodes mirrors `keys/index.ts`'s `KIND_BY_PREFIX` (the Stripe-style model:
21
- * sk_=secret, rk_=restricted, ek_=ephemeral, pk_=publishable) but stays a plain
22
- * prefix lookup so it can ship in the client bundle.
12
+ * {@link classifyCredentialKind} is a plain string check with no Node
13
+ * dependencies, so it is safe to run in a browser bundle. It recognizes the key
14
+ * prefixes `sk_` (secret), `rk_` (restricted), `ek_` (ephemeral), and `pk_`
15
+ * (publishable), but does not validate a key's checksum or environment segment.
23
16
  */
24
17
  import { AbloAuthenticationError } from '../errors.js';
25
18
  const KIND_BY_PREFIX = [
@@ -29,14 +22,12 @@ const KIND_BY_PREFIX = [
29
22
  ['pk_', 'publishable'],
30
23
  ];
31
24
  /**
32
- * Lightweight, browser-safe prefix kind classifier. The SINGLE source of truth
33
- * for prefix dispatch across the SDK (connect routing, the browser guard, the
34
- * CLI key-gating). Returns `null` for a value that carries no recognized Ablo
35
- * key prefix (a caller-supplied capability/auth token, an empty/garbage value).
36
- *
37
- * Pure string check — does NOT validate the checksum or environment segment
38
- * (that's `keys/index.ts` `parseApiKey`, which is Node-only). This is only the
39
- * "which of the four buckets" decision.
25
+ * Classifies a credential by its prefix, returning its {@link CredentialKind}, or
26
+ * `null` when the value carries no recognized Ablo key prefix for example a
27
+ * capability or auth token the caller supplied, or an empty string. This is a
28
+ * plain string check that is safe to run in a browser; it decides only which of
29
+ * the four kinds a value is, and does not validate the key's checksum or
30
+ * environment segment.
40
31
  */
41
32
  export function classifyCredentialKind(value) {
42
33
  for (const [prefix, kind] of KIND_BY_PREFIX) {
@@ -46,34 +37,37 @@ export function classifyCredentialKind(value) {
46
37
  return null;
47
38
  }
48
39
  /**
49
- * Connect-time credential routing absorbs the decision tree that used to live
50
- * inline in `resolveParticipantIdentity`. Classifies the configured apiKey, then
51
- * routes to one of four outcomes, DELEGATING the actual HTTP exchange to the
52
- * injected `exchangeApiKey` primitive. The caller switches on
53
- * `ResolvedCredential.kind` to perform scope wiring + scheduler setup.
40
+ * Routes a configured API key to its connect-time outcome. It classifies the
41
+ * key, then returns one of four {@link ResolvedCredential} variants, delegating
42
+ * any credential exchange to the injected `exchangeApiKey` primitive. The caller
43
+ * switches on the result's `kind` to wire up scope and the refresh scheduler.
54
44
  *
55
- * Routing (preserves the old branch order exactly):
56
- * 0. `pk_` + no explicit cap token `publishable` (direct bearer, no refresh).
57
- * 1. exchangeable apiKey (any prefix that ISN'T a pre-minted `ek_`/`rk_`) +
58
- * no explicit cap token `exchange` (hosted-cloud round-trip + scheduler).
59
- * 2. otherwise, identity unknown `pre-minted` (use the cap token as-is). Throws
60
- * `session_expired` when there is no token to authenticate `/auth/identity`.
61
- * 3. otherwise (identity known) `explicit` (legacy self-hosted, no round-trip).
45
+ * The routes, in the order they are tried:
46
+ * 0. A `pk_` key with no explicit capability token becomes `publishable`: used
47
+ * directly as the bearer, with no refresh.
48
+ * 1. Any other exchangeable key (one that is not a pre-minted `ek_` or `rk_`)
49
+ * with no explicit capability token becomes `exchange`: a round-trip mints a
50
+ * capability token, and the refresh scheduler renews it before it expires.
51
+ * 2. Otherwise, when the caller's identity is not yet known, the result is
52
+ * `pre-minted`: the capability token is used as-is. Throws `session_expired`
53
+ * when there is no token to authenticate `/auth/identity`.
54
+ * 3. Otherwise, when the caller already knows its identity, the result is
55
+ * `explicit`, with no round-trip.
62
56
  */
63
57
  export async function resolveCredential(input, ctx) {
64
58
  const { apiKeyValue, capabilityToken, authToken, hasExplicitIdentity } = input;
65
59
  const kind = apiKeyValue != null ? classifyCredentialKind(apiKeyValue) : null;
66
- // A pre-minted capability bearer (`ek_` ephemeral / `rk_` restricted) is NOT
67
- // exchangeable it was already minted into the credential source before
68
- // connect and must be USED DIRECTLY as the bearer (Route 2), never sent through
69
- // `exchangeApiKey` (Route 1, which expects an `sk_`).
60
+ // A pre-minted capability bearer (an ephemeral `ek_` or restricted `rk_` key)
61
+ // is not exchangeable: it was minted before connect and is used directly as the
62
+ // bearer on Route 2, never sent through `exchangeApiKey`, which expects an `sk_`.
70
63
  const isPreMintedCapabilityBearer = kind === 'ephemeral' || kind === 'restricted';
71
64
  const initialCapToken = capabilityToken ??
72
65
  (isPreMintedCapabilityBearer ? apiKeyValue ?? undefined : undefined) ??
73
66
  authToken ??
74
67
  undefined;
75
- // Route 0: publishable key (`pk_`) — long-lived, browser-safe, READ-ONLY. Used
76
- // DIRECTLY as the bearer; never exchanged never expires → nothing to refresh.
68
+ // Route 0: a publishable `pk_` key — long-lived, browser-safe, and read-only.
69
+ // Used directly as the bearer; it is never exchanged, so it never expires and
70
+ // there is nothing to refresh.
77
71
  if (apiKeyValue != null && kind === 'publishable' && capabilityToken == null) {
78
72
  return {
79
73
  kind: 'publishable',
@@ -82,8 +76,9 @@ export async function resolveCredential(input, ctx) {
82
76
  controlPlaneKey: null,
83
77
  };
84
78
  }
85
- // Route 1: hosted-cloud (secret/exchangeable apiKey, no caller-supplied cap
86
- // token). A pre-minted `ek_`/`rk_` is NOT exchangeable falls through.
79
+ // Route 1: an exchangeable key (such as a secret `sk_`) with no caller-supplied
80
+ // capability token. A pre-minted `ek_` or `rk_` is not exchangeable and falls
81
+ // through to the next route.
87
82
  if (apiKeyValue != null &&
88
83
  capabilityToken == null &&
89
84
  !isPreMintedCapabilityBearer) {
@@ -99,15 +94,15 @@ export async function resolveCredential(input, ctx) {
99
94
  controlPlaneKey: input.configuredApiKey ?? apiKeyValue,
100
95
  };
101
96
  }
102
- // Route 2: self-derived / pre-minted (use the cap token as-is). Reached when
103
- // identity is NOT caller-supplied.
97
+ // Route 2: pre-minted use the capability token as-is. Reached when the
98
+ // caller's identity was not supplied.
104
99
  if (!hasExplicitIdentity) {
105
100
  if (initialCapToken == null) {
106
- // No apiKey to exchange (Route 1) and no caller-supplied identity (Route 3),
107
- // so `initialCapToken` is the only thing that could authenticate
108
- // `/auth/identity`. Absent — commonly the function `apiKey` resolver
109
- // returning `null` (no/expired session)surface the real, re-auth-able
110
- // condition locally instead of making a doomed round-trip.
101
+ // With no key to exchange and no caller-supplied identity, this token is the
102
+ // only thing that could authenticate `/auth/identity`. When it is absent —
103
+ // commonly a function `apiKey` resolver returning `null` for a missing or
104
+ // expired session — report the re-authenticable condition here instead of
105
+ // making a round-trip that is bound to fail.
111
106
  throw new AbloAuthenticationError('No auth token available to resolve identity — the session token is ' +
112
107
  'missing or expired. Ensure your `apiKey` resolver returns a valid token, or ' +
113
108
  'pass a static `apiKey` / `capabilityToken`.', { code: 'session_expired' });
@@ -119,8 +114,8 @@ export async function resolveCredential(input, ctx) {
119
114
  controlPlaneKey: null,
120
115
  };
121
116
  }
122
- // Route 3: legacy explicit (self-hosted — caller knows its own
123
- // organizationId + user/agentId).
117
+ // Route 3: explicit — the caller already knows its own organization and user
118
+ // or agent id.
124
119
  return {
125
120
  kind: 'explicit',
126
121
  getBearer: initialCapToken,
@@ -1,24 +1,13 @@
1
1
  /**
2
- * Single mutable source for the SDK's active bearer credential.
2
+ * The single mutable holder for the active bearer credential every transport
3
+ * uses.
3
4
  *
4
- * Every transport should read from this object at request/connect time:
5
- * bootstrap HTTP, lazy query HTTP, identity/probe HTTP, and WebSocket URL
6
- * auth. Token refresh writes here once; consumers observe the new value
7
- * through their getter without being manually patched one by one.
5
+ * Each transport reads the current token from this object at request or connect
6
+ * time the HTTP request paths and the WebSocket URL authorizer alike. When the
7
+ * token is refreshed, it is written here once, and every reader observes the new
8
+ * value through its getter rather than being updated one by one.
8
9
  */
9
- /**
10
- * WebSocket subprotocols used to carry the bearer credential OUT of the URL.
11
- *
12
- * Browsers cannot set an `Authorization` header on a WebSocket, so the SDK
13
- * offers the token as a `Sec-WebSocket-Protocol` value — `ablo.bearer.<token>` —
14
- * alongside the real `ablo.sync.v1` protocol the server selects. This keeps the
15
- * credential out of the query string, which ALB access logs, proxies, and
16
- * browser history capture. The server reads the token from the subprotocol and
17
- * echoes back ONLY `ablo.sync.v1`, never the token-bearing value. Shared with
18
- * the sync-server so client and server can never drift on the wire format.
19
- */
20
- export declare const WS_BEARER_SUBPROTOCOL_PREFIX = "ablo.bearer.";
21
- export declare const WS_SYNC_SUBPROTOCOL = "ablo.sync.v1";
10
+ export { WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL } from '../wire/protocol.js';
22
11
  export interface AuthCredentialSource {
23
12
  getAuthToken(): string | null;
24
13
  setAuthToken(token: string | null | undefined): void;