@abloatai/ablo 0.34.1 → 0.35.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 (483) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +674 -5
  3. package/README.md +39 -22
  4. package/dist/BaseSyncedStore.d.ts +152 -44
  5. package/dist/BaseSyncedStore.js +300 -184
  6. package/dist/Database.d.ts +9 -24
  7. package/dist/Database.js +37 -22
  8. package/dist/InstanceCache.d.ts +25 -4
  9. package/dist/InstanceCache.js +48 -15
  10. package/dist/LazyReferenceCollection.d.ts +3 -3
  11. package/dist/LazyReferenceCollection.js +4 -4
  12. package/dist/Model.d.ts +6 -6
  13. package/dist/Model.js +10 -10
  14. package/dist/ModelRegistry.d.ts +4 -4
  15. package/dist/ModelRegistry.js +3 -3
  16. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  17. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  18. package/dist/SyncClient.d.ts +42 -32
  19. package/dist/SyncClient.js +166 -110
  20. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  21. package/dist/ai-sdk/coordinatedTool.js +1 -1
  22. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  23. package/dist/ai-sdk/coordinationContext.js +1 -1
  24. package/dist/ai-sdk/wrap.d.ts +3 -3
  25. package/dist/ai-sdk/wrap.js +2 -2
  26. package/dist/auth/index.d.ts +1 -156
  27. package/dist/auth/index.js +8 -301
  28. package/dist/cli.cjs +3344 -1073
  29. package/dist/client/Ablo.d.ts +42 -287
  30. package/dist/client/Ablo.js +118 -963
  31. package/dist/client/abloClient.d.ts +309 -0
  32. package/dist/client/abloClient.js +13 -0
  33. package/dist/client/clientPrelude.d.ts +52 -0
  34. package/dist/client/clientPrelude.js +60 -0
  35. package/dist/client/consoleLogger.d.ts +2 -2
  36. package/dist/client/coreClient.d.ts +60 -0
  37. package/dist/client/coreClient.js +118 -0
  38. package/dist/client/createInternalComponents.d.ts +4 -4
  39. package/dist/client/createInternalComponents.js +9 -8
  40. package/dist/client/createModelProxy.d.ts +78 -373
  41. package/dist/client/createModelProxy.js +114 -86
  42. package/dist/client/humans.d.ts +48 -0
  43. package/dist/client/humans.js +52 -0
  44. package/dist/client/modelRegistration.d.ts +1 -1
  45. package/dist/client/modelRegistration.js +9 -9
  46. package/dist/client/options.d.ts +73 -17
  47. package/dist/client/reactiveEngine.d.ts +48 -0
  48. package/dist/client/reactiveEngine.js +910 -0
  49. package/dist/client/resourceTypes.d.ts +9 -250
  50. package/dist/client/resourceTypes.js +8 -5
  51. package/dist/client/schemaConfig.d.ts +4 -4
  52. package/dist/client/schemaConfig.js +6 -2
  53. package/dist/client/validateAbloOptions.d.ts +3 -2
  54. package/dist/client/validateAbloOptions.js +1 -1
  55. package/dist/client/wsMutationExecutor.d.ts +3 -3
  56. package/dist/client/wsMutationExecutor.js +3 -3
  57. package/dist/context.d.ts +9 -9
  58. package/dist/context.js +10 -9
  59. package/dist/coordination/ClaimLog.d.ts +26 -0
  60. package/dist/coordination/ClaimLog.js +32 -0
  61. package/dist/coordination/index.d.ts +1 -15
  62. package/dist/coordination/index.js +8 -31
  63. package/dist/core/DatabaseManager.js +1 -1
  64. package/dist/core/QueryView.d.ts +1 -1
  65. package/dist/core/QueryView.js +1 -1
  66. package/dist/core/StoreManager.d.ts +4 -23
  67. package/dist/core/StoreManager.js +5 -55
  68. package/dist/core/index.d.ts +2 -2
  69. package/dist/core/index.js +2 -2
  70. package/dist/core/storeContract.d.ts +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +227 -0
  73. package/dist/docs/index.d.ts +10 -0
  74. package/dist/docs/index.js +10 -0
  75. package/dist/environment.d.ts +1 -40
  76. package/dist/environment.js +8 -37
  77. package/dist/index.d.ts +40 -34
  78. package/dist/index.js +26 -20
  79. package/dist/interfaces/index.d.ts +44 -134
  80. package/dist/keys/index.d.ts +1 -77
  81. package/dist/keys/index.js +8 -190
  82. package/dist/mutators/{RecordingTransaction.d.ts → RecordingMutation.d.ts} +4 -4
  83. package/dist/mutators/{RecordingTransaction.js → RecordingMutation.js} +2 -2
  84. package/dist/mutators/Transaction.d.ts +1 -1
  85. package/dist/mutators/Transaction.js +1 -1
  86. package/dist/mutators/UndoManager.d.ts +6 -6
  87. package/dist/mutators/UndoManager.js +5 -5
  88. package/dist/mutators/defineMutators.d.ts +3 -3
  89. package/dist/mutators/defineMutators.js +1 -1
  90. package/dist/mutators/inverseOp.js +2 -2
  91. package/dist/mutators/mutateActions.d.ts +3 -3
  92. package/dist/mutators/mutateActions.js +1 -1
  93. package/dist/mutators/readerActions.d.ts +1 -1
  94. package/dist/mutators/undoApply.d.ts +1 -1
  95. package/dist/mutators/undoApply.js +1 -1
  96. package/dist/policy/index.d.ts +2 -2
  97. package/dist/policy/index.js +1 -1
  98. package/dist/query/client.d.ts +2 -2
  99. package/dist/query/client.js +4 -4
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +6 -8
  103. package/dist/react/AbloProvider.js +5 -7
  104. package/dist/react/context.d.ts +1 -1
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/index.d.ts +5 -5
  107. package/dist/react/index.js +3 -3
  108. package/dist/react/internalContext.d.ts +1 -1
  109. package/dist/react/useAblo.d.ts +3 -3
  110. package/dist/react/useAblo.js +1 -1
  111. package/dist/react/useCurrentUserId.js +1 -1
  112. package/dist/react/useErrorListener.js +1 -1
  113. package/dist/react/useMutationFailureListener.d.ts +2 -2
  114. package/dist/react/useMutationFailureListener.js +1 -1
  115. package/dist/react/useMutators.d.ts +3 -3
  116. package/dist/react/useMutators.js +3 -3
  117. package/dist/react/useUndoScope.d.ts +5 -5
  118. package/dist/react/useUndoScope.js +1 -1
  119. package/dist/schema/coordination.d.ts +69 -10
  120. package/dist/schema/coordination.js +86 -9
  121. package/dist/schema/ddl.js +2 -2
  122. package/dist/schema/diff.d.ts +1 -1
  123. package/dist/schema/generate.js +1 -1
  124. package/dist/schema/index.d.ts +10 -10
  125. package/dist/schema/index.js +18 -18
  126. package/dist/schema/queries.d.ts +27 -27
  127. package/dist/schema/queries.js +23 -23
  128. package/dist/schema/select.d.ts +3 -3
  129. package/dist/schema/select.js +3 -3
  130. package/dist/schema/serialize.d.ts +15 -6
  131. package/dist/schema/serialize.js +17 -3
  132. package/dist/schema/sugar.d.ts +6 -7
  133. package/dist/schema/sugar.js +9 -12
  134. package/dist/schema/syncDeltaRow.d.ts +4 -152
  135. package/dist/schema/syncDeltaRow.js +4 -105
  136. package/dist/server/adapter.d.ts +18 -1
  137. package/dist/server/commit.d.ts +10 -16
  138. package/dist/server/index.d.ts +1 -1
  139. package/dist/server/index.js +1 -1
  140. package/dist/server/readConfig.d.ts +1 -1
  141. package/dist/source/adapters/drizzle.d.ts +1 -1
  142. package/dist/source/adapters/drizzle.js +2 -2
  143. package/dist/source/adapters/kysely.d.ts +1 -1
  144. package/dist/source/adapters/kysely.js +1 -1
  145. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  146. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  147. package/dist/source/adapters/memory.js +1 -1
  148. package/dist/source/adapters/prisma.d.ts +8 -3
  149. package/dist/source/adapters/prisma.js +1 -1
  150. package/dist/source/connector.js +1 -1
  151. package/dist/source/connectorProtocol.d.ts +2 -8
  152. package/dist/source/connectorProtocol.js +3 -2
  153. package/dist/source/contract.d.ts +29 -17
  154. package/dist/source/contract.js +27 -22
  155. package/dist/source/factory.d.ts +1 -1
  156. package/dist/source/footprint.d.ts +111 -0
  157. package/dist/source/footprint.js +0 -0
  158. package/dist/source/idempotency.js +2 -2
  159. package/dist/source/index.d.ts +1 -0
  160. package/dist/source/index.js +3 -0
  161. package/dist/source/next.d.ts +1 -1
  162. package/dist/source/signing.d.ts +9 -2
  163. package/dist/source/signing.js +4 -1
  164. package/dist/source/types.d.ts +6 -4
  165. package/dist/source/types.js +1 -1
  166. package/dist/stores/ObjectStore.d.ts +1 -1
  167. package/dist/stores/SyncActionStore.d.ts +1 -1
  168. package/dist/stores/SyncActionStore.js +2 -10
  169. package/dist/stores/syncAction.d.ts +26 -0
  170. package/dist/stores/syncAction.js +16 -0
  171. package/dist/surface.d.ts +3 -3
  172. package/dist/surface.js +6 -4
  173. package/dist/sync/BootstrapFetcher.d.ts +123 -6
  174. package/dist/sync/BootstrapFetcher.js +492 -66
  175. package/dist/sync/ConnectionManager.d.ts +6 -198
  176. package/dist/sync/ConnectionManager.js +6 -677
  177. package/dist/sync/OnDemandLoader.d.ts +2 -2
  178. package/dist/sync/OnDemandLoader.js +60 -21
  179. package/dist/sync/SubscriptionManager.d.ts +13 -2
  180. package/dist/sync/SubscriptionManager.js +23 -5
  181. package/dist/sync/SyncWebSocket.d.ts +27 -510
  182. package/dist/sync/SyncWebSocket.js +76 -954
  183. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  184. package/dist/sync/awaitClaimGrant.js +4 -109
  185. package/dist/sync/commitFrames.d.ts +6 -40
  186. package/dist/sync/commitFrames.js +6 -97
  187. package/dist/sync/contextPorts.d.ts +18 -0
  188. package/dist/sync/contextPorts.js +31 -0
  189. package/dist/sync/createClaimStream.d.ts +5 -49
  190. package/dist/sync/createClaimStream.js +5 -469
  191. package/dist/sync/createPresenceStream.d.ts +26 -4
  192. package/dist/sync/createPresenceStream.js +28 -20
  193. package/dist/sync/createSnapshot.d.ts +2 -2
  194. package/dist/sync/createSnapshot.js +1 -1
  195. package/dist/sync/credentialLifecycle.d.ts +5 -173
  196. package/dist/sync/credentialLifecycle.js +5 -320
  197. package/dist/sync/deltaPipeline.d.ts +1 -1
  198. package/dist/sync/participants.d.ts +5 -4
  199. package/dist/sync/participants.js +29 -22
  200. package/dist/sync/schemaDrift.d.ts +55 -0
  201. package/dist/sync/schemaDrift.js +53 -0
  202. package/dist/sync/schemas.d.ts +21 -32
  203. package/dist/sync/schemas.js +26 -17
  204. package/dist/sync/syncPlan.d.ts +3 -3
  205. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  206. package/dist/sync/wsFrameHandlers.js +6 -392
  207. package/dist/testing/fixtures/bootstrap.d.ts +1 -1
  208. package/dist/testing/fixtures/deltas.d.ts +1 -1
  209. package/dist/testing/fixtures/httpResponses.d.ts +70 -0
  210. package/dist/testing/fixtures/httpResponses.js +90 -0
  211. package/dist/testing/fixtures/models.js +1 -1
  212. package/dist/testing/helpers/wait.js +1 -1
  213. package/dist/testing/mocks/MockMutationExecutor.d.ts +2 -2
  214. package/dist/testing/mocks/MockMutationExecutor.js +8 -14
  215. package/dist/testing/mocks/MockSyncContext.d.ts +11 -11
  216. package/dist/testing/mocks/MockSyncContext.js +10 -9
  217. package/dist/testing/mocks/MockSyncStore.js +1 -1
  218. package/dist/testing/mocks/MockWebSocket.d.ts +2 -2
  219. package/dist/transaction/ablo.d.ts +88 -0
  220. package/dist/transaction/ablo.js +33 -0
  221. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  222. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  223. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  224. package/dist/transaction/auth/bootstrapScope.js +1 -0
  225. package/dist/transaction/auth/capability.d.ts +177 -0
  226. package/dist/transaction/auth/capability.js +199 -0
  227. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  228. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  229. package/dist/{client → transaction/auth}/identity.js +1 -1
  230. package/dist/transaction/auth/index.d.ts +162 -0
  231. package/dist/transaction/auth/index.js +304 -0
  232. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  233. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  234. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  235. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  236. package/dist/transaction/coordination/awaitClaimGrant.d.ts +49 -0
  237. package/dist/transaction/coordination/awaitClaimGrant.js +112 -0
  238. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  239. package/dist/transaction/coordination/claimMeta.js +52 -0
  240. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  241. package/dist/transaction/coordination/createClaimStream.js +475 -0
  242. package/dist/transaction/coordination/events.d.ts +74 -0
  243. package/dist/transaction/coordination/events.js +7 -0
  244. package/dist/transaction/coordination/index.d.ts +19 -0
  245. package/dist/transaction/coordination/index.js +44 -0
  246. package/dist/transaction/coordination/locator.d.ts +83 -0
  247. package/dist/transaction/coordination/locator.js +82 -0
  248. package/dist/transaction/coordination/schema.d.ts +1473 -0
  249. package/dist/{coordination → transaction/coordination}/schema.js +490 -55
  250. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  251. package/dist/transaction/coordination/targetConflict.js +103 -0
  252. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  253. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  254. package/dist/transaction/durableWrites.d.ts +62 -0
  255. package/dist/{client → transaction}/durableWrites.js +28 -3
  256. package/dist/transaction/environment.d.ts +105 -0
  257. package/dist/transaction/environment.js +108 -0
  258. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +11 -11
  259. package/dist/{errorCodes.js → transaction/errorCodes.js} +35 -12
  260. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  261. package/dist/{errors.js → transaction/errors.js} +85 -16
  262. package/dist/transaction/index.d.ts +20 -0
  263. package/dist/transaction/index.js +20 -0
  264. package/dist/transaction/keys/index.d.ts +87 -0
  265. package/dist/transaction/keys/index.js +207 -0
  266. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  267. package/dist/transaction/log/syncDeltaRow.js +95 -0
  268. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  269. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  270. package/dist/transaction/logger.d.ts +16 -0
  271. package/dist/transaction/logger.js +7 -0
  272. package/dist/transaction/observability.d.ts +53 -0
  273. package/dist/transaction/observability.js +19 -0
  274. package/dist/transaction/plugin.d.ts +192 -0
  275. package/dist/transaction/plugin.js +87 -0
  276. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  277. package/dist/{policy → transaction/policy}/types.js +2 -0
  278. package/dist/transaction/resources/httpResources.d.ts +266 -0
  279. package/dist/transaction/resources/httpResources.js +7 -0
  280. package/dist/transaction/resources/modelOperations.d.ts +319 -0
  281. package/dist/transaction/resources/modelOperations.js +12 -0
  282. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  283. package/dist/transaction/resources/mutationOptions.js +9 -0
  284. package/dist/transaction/resources/where.d.ts +85 -0
  285. package/dist/transaction/resources/where.js +70 -0
  286. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  287. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  288. package/dist/{schema → transaction/schema}/field.d.ts +5 -5
  289. package/dist/{schema → transaction/schema}/field.js +5 -5
  290. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  291. package/dist/transaction/schema/loadStrategy.js +46 -0
  292. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  293. package/dist/{schema → transaction/schema}/model.js +30 -20
  294. package/dist/transaction/schema/openapi.d.ts +57 -0
  295. package/dist/transaction/schema/openapi.js +340 -0
  296. package/dist/{schema → transaction/schema}/relation.d.ts +14 -14
  297. package/dist/{schema → transaction/schema}/relation.js +7 -7
  298. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  299. package/dist/{schema → transaction/schema}/residency.js +0 -5
  300. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  301. package/dist/{schema → transaction/schema}/roles.js +5 -5
  302. package/dist/{schema → transaction/schema}/schema.d.ts +12 -10
  303. package/dist/{schema → transaction/schema}/schema.js +4 -3
  304. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  305. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  306. package/dist/transaction/transactionLayer.d.ts +82 -0
  307. package/dist/transaction/transactionLayer.js +24 -0
  308. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +4 -5
  309. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  310. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  311. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  312. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +10 -36
  313. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  314. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  315. package/dist/transaction/transport/commitFrames.js +134 -0
  316. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  317. package/dist/transaction/transport/connectionManager.js +673 -0
  318. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  319. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  320. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  321. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  322. package/dist/{client → transaction/transport}/httpClient.d.ts +59 -16
  323. package/dist/{client → transaction/transport}/httpClient.js +5 -5
  324. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  325. package/dist/transaction/transport/httpOptions.js +12 -0
  326. package/dist/{client → transaction/transport}/httpTransport.js +171 -85
  327. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  328. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  329. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  330. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  331. package/dist/transaction/transport/wsTransport.d.ts +576 -0
  332. package/dist/transaction/transport/wsTransport.js +1017 -0
  333. package/dist/transaction/types/assertExact.d.ts +17 -0
  334. package/dist/transaction/types/assertExact.js +1 -0
  335. package/dist/{types → transaction/types}/global.d.ts +17 -2
  336. package/dist/{types → transaction/types}/global.js +2 -1
  337. package/dist/{types → transaction/types}/index.d.ts +14 -46
  338. package/dist/{types → transaction/types}/index.js +7 -16
  339. package/dist/{types → transaction/types}/streams.d.ts +63 -45
  340. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  341. package/dist/transaction/utils/json.js +276 -0
  342. package/dist/transaction/wire/accountResponses.d.ts +351 -0
  343. package/dist/transaction/wire/accountResponses.js +255 -0
  344. package/dist/transaction/wire/auth.d.ts +49 -0
  345. package/dist/transaction/wire/auth.js +57 -0
  346. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  347. package/dist/transaction/wire/claimEvent.js +73 -0
  348. package/dist/transaction/wire/claims.d.ts +463 -0
  349. package/dist/transaction/wire/claims.js +229 -0
  350. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  351. package/dist/{wire → transaction/wire}/commit.js +68 -47
  352. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  353. package/dist/{wire → transaction/wire}/delta.js +37 -13
  354. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  355. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  356. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  357. package/dist/transaction/wire/feedCursor.js +82 -0
  358. package/dist/transaction/wire/feedEvent.d.ts +177 -0
  359. package/dist/transaction/wire/feedEvent.js +39 -0
  360. package/dist/transaction/wire/frames.d.ts +194 -0
  361. package/dist/transaction/wire/frames.js +50 -0
  362. package/dist/transaction/wire/inboundFrames.d.ts +552 -0
  363. package/dist/transaction/wire/inboundFrames.js +116 -0
  364. package/dist/transaction/wire/index.d.ts +50 -0
  365. package/dist/transaction/wire/index.js +74 -0
  366. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  367. package/dist/transaction/wire/listEnvelope.js +42 -0
  368. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  369. package/dist/transaction/wire/modelResponses.js +43 -0
  370. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +79 -38
  371. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +110 -59
  372. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  373. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  374. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  375. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  376. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  377. package/dist/transactions/mutations/commitLatency.js +130 -0
  378. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  379. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  380. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +16 -15
  381. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +12 -12
  382. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +11 -11
  383. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +7 -7
  384. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  385. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  386. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  387. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +3 -3
  388. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +4 -3
  389. package/dist/utils/mobxSetup.d.ts +1 -1
  390. package/dist/utils/mobxSetup.js +5 -2
  391. package/dist/webhooks/events.d.ts +2 -2
  392. package/dist/wire/index.d.ts +1 -34
  393. package/dist/wire/index.js +8 -49
  394. package/docs/agent-messaging.md +3 -3
  395. package/docs/agents.md +19 -12
  396. package/docs/api-keys.md +8 -4
  397. package/docs/api.md +22 -18
  398. package/docs/audit.md +2 -0
  399. package/docs/cli.md +31 -3
  400. package/docs/client-behavior.md +8 -6
  401. package/docs/concurrency-convention.md +30 -24
  402. package/docs/coordination.md +48 -38
  403. package/docs/data-sources.md +3 -1
  404. package/docs/debugging.md +5 -3
  405. package/docs/deployment.md +267 -0
  406. package/docs/examples/agent-human.md +49 -42
  407. package/docs/examples/ai-sdk-tool.md +69 -44
  408. package/docs/examples/existing-python-backend.md +8 -6
  409. package/docs/examples/nextjs.md +129 -47
  410. package/docs/examples/scoped-agent.md +45 -44
  411. package/docs/examples/server-agent.md +46 -26
  412. package/docs/groups.md +32 -29
  413. package/docs/guarantees.md +4 -2
  414. package/docs/how-it-works.md +9 -7
  415. package/docs/idempotency.md +126 -0
  416. package/docs/identity.md +58 -54
  417. package/docs/index.md +172 -86
  418. package/docs/integration-guide.md +17 -16
  419. package/docs/interaction-model.md +6 -4
  420. package/docs/mcp.md +41 -16
  421. package/docs/migration.md +63 -5
  422. package/docs/operating-on-your-database.md +3 -1
  423. package/docs/projects.md +2 -0
  424. package/docs/quickstart.md +22 -5
  425. package/docs/react.md +12 -10
  426. package/docs/schema-contract.md +5 -3
  427. package/docs/session-settings.md +108 -0
  428. package/docs/sessions.md +3 -1
  429. package/docs/webhooks.md +3 -1
  430. package/llms.txt +47 -17
  431. package/package.json +10 -8
  432. package/dist/agent/Agent.d.ts +0 -366
  433. package/dist/agent/Agent.js +0 -514
  434. package/dist/agent/index.d.ts +0 -115
  435. package/dist/agent/index.js +0 -128
  436. package/dist/agent/session.d.ts +0 -93
  437. package/dist/agent/session.js +0 -149
  438. package/dist/agent/types.d.ts +0 -68
  439. package/dist/agent/types.js +0 -9
  440. package/dist/client/durableWrites.d.ts +0 -21
  441. package/dist/coordination/schema.d.ts +0 -722
  442. package/dist/schema/openapi.d.ts +0 -29
  443. package/dist/schema/openapi.js +0 -124
  444. package/dist/transactions/durableWriteStore.js +0 -30
  445. package/dist/utils/json.js +0 -88
  446. package/dist/wire/errorEnvelope.d.ts +0 -55
  447. package/dist/wire/frames.d.ts +0 -197
  448. package/dist/wire/frames.js +0 -49
  449. package/dist/wire/listEnvelope.js +0 -18
  450. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  451. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  452. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  453. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  454. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  455. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  456. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  457. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +0 -0
  458. /package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +0 -0
  459. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  460. /package/dist/{client → transaction}/persistence.js +0 -0
  461. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  462. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  463. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  464. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  465. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  466. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  467. /package/dist/{types → transaction/types}/modelData.js +0 -0
  468. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  469. /package/dist/{types → transaction/types}/participant.js +0 -0
  470. /package/dist/{types → transaction/types}/streams.js +0 -0
  471. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  472. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  473. /package/dist/{utils → transaction/utils}/duration.d.ts +0 -0
  474. /package/dist/{utils → transaction/utils}/duration.js +0 -0
  475. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  476. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  477. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  478. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  479. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  480. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  481. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  482. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  483. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Capability — the one definition of what a credential may do.
3
+ *
4
+ * A grant is declared once, in the vocabulary a developer writes:
5
+ *
6
+ * can: { documents: ['read', 'update'] }
7
+ *
8
+ * Everything downstream derives from that declaration: the wire spelling
9
+ * (`documents.update`) stored on the key row, the typed `can` a schema narrows
10
+ * to its own models, the request body the mint route parses, the pattern the
11
+ * published contract advertises, and the scope block echoed back on the minted
12
+ * session.
13
+ *
14
+ * Before this module the same grant was spelled five times — a literal union in
15
+ * the resource types, a `z.array(z.string())` on the wire, a hand-rolled
16
+ * field-by-field parser in the mint route, an object literal in the response
17
+ * type, and a hand-written `model.verb` array at each caller that mints without
18
+ * the SDK. Nothing failed when they drifted; the drift surfaced as
19
+ * `capability_scope_denied` on a grant the caller believed it held.
20
+ *
21
+ * Two axes decide blast radius. VERBS come from `can`; ROWS come from
22
+ * `syncGroups`. They belong to one grant, which is why they are declared
23
+ * together here rather than meeting for the first time on the wire.
24
+ */
25
+ import { z } from 'zod';
26
+ import { participantKindSchema } from '../coordination/schema.js';
27
+ import { syncGroupInputSchema } from '../schema/roles.js';
28
+ /**
29
+ * The verbs a grant can name — the whole vocabulary, in one place. Every other
30
+ * spelling of an operation in the system derives from this enum: the SDK's
31
+ * `can` values, the wire's `model.verb` pattern, and the JSON Schema the
32
+ * published contract advertises.
33
+ */
34
+ export const capabilityOperationSchema = z.enum(['read', 'create', 'update', 'delete']);
35
+ /**
36
+ * One granted operation in its wire spelling: `<model>.<verb>`, lowercased.
37
+ *
38
+ * The template literal derives both halves — the verb set from
39
+ * {@link capabilityOperationSchema}, the pattern in the published contract from
40
+ * the template — so tightening the verb vocabulary can never leave a stale
41
+ * regex or a stale doc behind. The model half is the name the server matches
42
+ * against a model's registered aliases (type name, schema key, or table name),
43
+ * so it stays permissive here and is resolved at the gate.
44
+ */
45
+ export const grantedOperationSchema = z.templateLiteral([
46
+ z.string().regex(/^[^.\s]+$/),
47
+ '.',
48
+ capabilityOperationSchema,
49
+ ]);
50
+ /**
51
+ * The declared grant, per model — the runtime shape of `can`. Model keys are
52
+ * free-form at runtime because the server resolves them against the schema it
53
+ * has; {@link CapabilityCan} narrows them to a known schema's models at the
54
+ * type level.
55
+ */
56
+ export const capabilityCanSchema = z.record(z.string().min(1), z.array(capabilityOperationSchema).readonly());
57
+ /**
58
+ * Read-your-writes expansion: append `<model>.read` for every model the grant
59
+ * can write.
60
+ *
61
+ * A scoped agent that may update a row must be able to read it, or the read
62
+ * gate (query / bootstrap / entity self-heal / delta fan-out) starves the very
63
+ * writes the grant allows. The write verbs stay the source of truth; reads are
64
+ * derived and deduped, and models the grant cannot write stay unreadable —
65
+ * that is the read-side blast-radius reduction.
66
+ *
67
+ * It lives beside the declaration, so it applies wherever a grant is built,
68
+ * rather than only at whichever mint the callers happen to share. The server
69
+ * applies it again at the mint chokepoint for callers that post raw JSON; the
70
+ * function is idempotent, so the second application is a no-op.
71
+ */
72
+ export function expandReadYourWrites(operations) {
73
+ const out = new Set(operations);
74
+ for (const op of operations) {
75
+ const [model] = op.split('.');
76
+ if (model)
77
+ out.add(`${model}.read`);
78
+ }
79
+ return [...out];
80
+ }
81
+ /**
82
+ * Schema key → the wire name a grant must be minted with.
83
+ *
84
+ * THE derivation. A model whose type name is overridden — schema key
85
+ * `documents`, type name `Document` — has to mint `document.update`, not
86
+ * `documents.update`, and a caller who works that out by hand gets it wrong
87
+ * once and learns at `capability_scope_denied`. Callers pass their schema's
88
+ * models, never a map they assembled themselves.
89
+ */
90
+ export function modelWireNames(models) {
91
+ return Object.fromEntries(Object.entries(models).map(([key, def]) => [key, def.typename ?? key]));
92
+ }
93
+ /**
94
+ * Every name the enforcement gates accept for a model, lowercased. Three
95
+ * vocabularies name one logical model — the wire type name (`lineitem`), the
96
+ * schema key (`lineItems`), and the table name (`line_items`) — so a grant
97
+ * minted in any of them is honored, and the mint can tell a real model from a
98
+ * typo without guessing which vocabulary the caller used.
99
+ */
100
+ export function capabilityModelAliases(models) {
101
+ const aliases = new Set();
102
+ for (const [key, def] of Object.entries(models)) {
103
+ aliases.add(key.toLowerCase());
104
+ if (def.typename)
105
+ aliases.add(def.typename.toLowerCase());
106
+ if (def.tableName)
107
+ aliases.add(def.tableName.toLowerCase());
108
+ }
109
+ return aliases;
110
+ }
111
+ /**
112
+ * The granted operations whose model half names nothing in the schema.
113
+ *
114
+ * A grant is checked against the schema at MINT, the way a write to an unpushed
115
+ * model already fails with `server_execute_unknown_model` — so a typo in
116
+ * `lineitem.update` is a rejected mint rather than a credential that looks
117
+ * healthy and is denied on its first write. Without this the `model` half is a
118
+ * hole: an opaque string nothing validates until enforcement time.
119
+ */
120
+ export function unresolvableOperations(operations, aliases) {
121
+ // The model half holds no dot (see `grantedOperationSchema`), so the first
122
+ // separator is the only one.
123
+ return operations.filter((op) => !aliases.has(op.slice(0, op.indexOf('.'))));
124
+ }
125
+ /**
126
+ * Serializes a declared `can` into the wire allowlist — the ONE translation
127
+ * from what a developer writes to what the server stores and enforces.
128
+ *
129
+ * `wireNames` comes from {@link modelWireNames} over the client's own schema.
130
+ * It is required rather than optional: an omitted map silently mints the schema
131
+ * key verbatim, which is right for most models and wrong for every model with
132
+ * a type-name override — the kind of default that is correct until it isn't.
133
+ */
134
+ export function grantedOperations(can, wireNames) {
135
+ const declared = Object.entries(can).flatMap(([model, ops]) => {
136
+ const wireName = (wireNames[model] ?? model).toLowerCase();
137
+ return (ops ?? []).map((op) => `${wireName}.${op}`);
138
+ });
139
+ return expandReadYourWrites(declared);
140
+ }
141
+ /**
142
+ * The grant at rest: what the credential ended up with, on both axes, plus the
143
+ * participant it acts as. The mint echoes this block, the key row stores it,
144
+ * and the gates read it — so a session's reported scope and its enforced scope
145
+ * are the same shape by construction.
146
+ */
147
+ export const capabilityScopeSchema = z.object({
148
+ organizationId: z.string().min(1),
149
+ /**
150
+ * The ROW axis — which sync groups this credential may act within. Read back
151
+ * as plain strings rather than the branded form the request enforces: this is
152
+ * what the key row already holds, including rows minted before that gate.
153
+ */
154
+ syncGroups: z.array(z.string()),
155
+ /** The VERB axis — the allowlist as minted, after read-your-writes. */
156
+ operations: z.array(grantedOperationSchema),
157
+ participantKind: participantKindSchema,
158
+ participantId: z.string().min(1),
159
+ });
160
+ /**
161
+ * `POST /v1/capabilities` — mint a capability for a participant.
162
+ *
163
+ * Where an ephemeral key is a session for a person, a capability is a scoped,
164
+ * revocable grant for an agent or a system. Narrow by default: an agent or
165
+ * system capability must name its `operations` unless the caller explicitly
166
+ * asks for `wideScope`, which is itself privileged.
167
+ *
168
+ * This is the parsed body — the mint route validates against it rather than
169
+ * reading fields one at a time, so the shape and the validation rules cannot
170
+ * drift from each other or from the published contract.
171
+ */
172
+ export const capabilityRequestSchema = z.object({
173
+ participantKind: participantKindSchema,
174
+ participantId: z.string().min(1).optional(),
175
+ /**
176
+ * The ROW axis. Validated as the engine's branded sync-group form
177
+ * (`default` or `<namespace>:<id>`): a malformed group stored on the key row
178
+ * would subscribe the connection to NOTHING and fail silently at fan-out
179
+ * time, so it is rejected loudly at the boundary.
180
+ */
181
+ syncGroups: z.array(syncGroupInputSchema).readonly().optional(),
182
+ /** The VERB axis, as `model.verb` — e.g. `tasks.update`. */
183
+ operations: z.array(grantedOperationSchema).readonly().optional(),
184
+ ttlSeconds: z.number().int().positive(),
185
+ label: z.string().min(1).optional(),
186
+ /**
187
+ * Opt out of narrow-by-default scoping. Without it, agent and system
188
+ * capabilities require non-empty `operations`; with it, the caller must
189
+ * additionally hold an admin/owner role or present a secret key.
190
+ */
191
+ wideScope: z.boolean().optional(),
192
+ /**
193
+ * Caller-attested identity for the end user this capability acts for — the
194
+ * on-behalf-of pattern. Ablo does not validate it and has no view into the
195
+ * caller's user directory; the API key is what is trusted, and this blob is
196
+ * echoed back to the client.
197
+ */
198
+ userMeta: z.record(z.string(), z.unknown()).optional(),
199
+ });
@@ -9,7 +9,14 @@
9
9
  */
10
10
  export { WS_BEARER_SUBPROTOCOL_PREFIX, WS_SYNC_SUBPROTOCOL } from '../wire/protocol.js';
11
11
  export interface AuthCredentialSource {
12
- getAuthToken(): string | null;
12
+ /**
13
+ * Declared as a standalone closure rather than a method because callers pass
14
+ * it on by reference — the transport and the core client each take
15
+ * `getAuthToken` alone and call it with no receiver. The implementation is a
16
+ * closure over the token, so that is safe; typing it as a method would say
17
+ * otherwise and make every hand-off read as a lost `this`.
18
+ */
19
+ getAuthToken: () => string | null;
13
20
  setAuthToken(token: string | null | undefined): void;
14
21
  authorizationHeader(): string | undefined;
15
22
  withAuthHeaders(headers?: Record<string, string>): Record<string, string>;
@@ -14,11 +14,12 @@
14
14
  *
15
15
  * Each branch is a separate function below, so it can be read and tested on its own.
16
16
  */
17
+ import type { ParticipantKind } from '../types/participant.js';
17
18
  import { type RefreshScheduler } from '../auth/index.js';
18
- import type { BootstrapFetcher } from '../sync/BootstrapFetcher.js';
19
- import type { SyncLogger } from '../interfaces/index.js';
19
+ import type { BootstrapScope } from '../auth/bootstrapScope.js';
20
+ import type { Logger } from '../logger.js';
20
21
  import type { AuthCredentialSource } from '../auth/credentialSource.js';
21
- import type { ApiKeySetter } from './auth.js';
22
+ import type { ApiKeySetter } from './apiKey.js';
22
23
  export interface IdentityResolveInput {
23
24
  readonly options: {
24
25
  readonly capabilityToken?: string;
@@ -34,12 +35,12 @@ export interface IdentityResolveInput {
34
35
  readonly organizationId?: string;
35
36
  };
36
37
  readonly url: string;
37
- readonly kind: 'user' | 'agent' | 'system';
38
+ readonly kind: ParticipantKind;
38
39
  readonly configuredApiKey: string | ApiKeySetter | null;
39
40
  readonly configuredAuthToken: string | null;
40
- readonly bootstrapHelper: BootstrapFetcher;
41
+ readonly bootstrapHelper: BootstrapScope;
41
42
  readonly auth: AuthCredentialSource;
42
- readonly logger: SyncLogger;
43
+ readonly logger: Logger;
43
44
  }
44
45
  export interface ResolvedIdentity {
45
46
  readonly userId: string;
@@ -47,7 +48,7 @@ export interface ResolvedIdentity {
47
48
  readonly teamIds: string[] | undefined;
48
49
  readonly capabilityToken: string | undefined;
49
50
  readonly syncGroups: readonly string[] | undefined;
50
- readonly participantKind: 'user' | 'agent' | 'system';
51
+ readonly participantKind: ParticipantKind;
51
52
  /** Set only on the hosted-cloud path; the caller keeps it to stop refreshes on shutdown. */
52
53
  readonly refreshScheduler: RefreshScheduler | null;
53
54
  }
@@ -20,7 +20,7 @@ import { mintUserSessionKey } from '../auth/index.js';
20
20
  import { resolveIdentity } from '../auth/index.js';
21
21
  import { createRefreshScheduler, } from '../auth/index.js';
22
22
  import { resolveCredential, } from '../auth/credentialPolicy.js';
23
- import { resolveApiKeyValue, resolveBootstrapBaseUrl } from './auth.js';
23
+ import { resolveApiKeyValue, resolveBootstrapBaseUrl } from './apiKey.js';
24
24
  export async function resolveParticipantIdentity(input) {
25
25
  const { options, internalOptions, url, kind, configuredApiKey, configuredAuthToken, bootstrapHelper, auth, logger, } = input;
26
26
  const apiKeyValue = await resolveApiKeyValue(configuredApiKey);
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Exchanges an API key for a capability token and the scope it grants.
3
+ *
4
+ * The `Ablo({...})` factory calls this during startup when you provide an
5
+ * `apiKey` but no explicit capability token, organization, or user identity. It
6
+ * sends one `POST /auth/capability` request; the server responds with the
7
+ * granted scope and any user metadata, which the client uses to populate its
8
+ * session state. The API key is the only credential you handle directly — this
9
+ * exchange happens automatically behind it.
10
+ */
11
+ import { type CapabilityExchangeResponse, type EphemeralKeyResponse, type IdentityResolveResponse } from './schemas.js';
12
+ import type { ParticipantKind } from '../types/participant.js';
13
+ import type { GrantedOperation } from './capability.js';
14
+ export type { CapabilityExchangeResponse, EphemeralKeyResponse, IdentityResolveResponse, } from './schemas.js';
15
+ export { capabilityOperationSchema, capabilityCanSchema, capabilityScopeSchema, capabilityRequestSchema, grantedOperationSchema, grantedOperations, expandReadYourWrites, modelWireNames, capabilityModelAliases, unresolvableOperations, } from './capability.js';
16
+ export type { CapabilityOperation, CapabilityCan, CapabilityScope, CapabilityRequest, CapabilityModelShape, GrantedOperation, } from './capability.js';
17
+ export interface ExchangeApiKeyRequest {
18
+ readonly apiKey: string;
19
+ readonly baseUrl: string;
20
+ readonly participantKind: ParticipantKind;
21
+ readonly participantId?: string;
22
+ readonly syncGroups?: readonly string[];
23
+ /** The grant's verb axis, already in wire form. Build it with
24
+ * `grantedOperations(can)` rather than assembling `model.verb` by hand. */
25
+ readonly operations?: readonly GrantedOperation[];
26
+ readonly ttlSeconds: number;
27
+ readonly label?: string;
28
+ readonly userMeta?: Record<string, unknown>;
29
+ readonly fetch?: typeof fetch;
30
+ readonly timeoutMs?: number;
31
+ }
32
+ export declare function exchangeApiKey(options: ExchangeApiKeyRequest): Promise<CapabilityExchangeResponse>;
33
+ export interface MintUserSessionRequest {
34
+ /** Your secret API key (an `sk_` key). Minting a session is a server-side
35
+ * operation, so it always presents the secret key, never a token derived
36
+ * from it. */
37
+ readonly apiKey: string;
38
+ readonly baseUrl: string;
39
+ /** The end user's identifier in your identity provider. It becomes the
40
+ * session's `participantId`. */
41
+ readonly userId: string;
42
+ /** The organization to mint the session into, for a platform that manages many
43
+ * organizations. Requires the secret key to carry the `ephemeral:mint-any-org`
44
+ * capability. Omit to mint into the key's own organization. */
45
+ readonly organizationId?: string;
46
+ /** Points this session's schema at a shared project while its data stays scoped
47
+ * to `organizationId`. Use this when each customer has its own organization but
48
+ * they all share one schema: keep a single schema project, and every customer's
49
+ * session resolves its schema from it instead of pushing the schema into each
50
+ * organization separately. Requires the secret key to carry the
51
+ * `ephemeral:mint-any-org` capability. Omit to resolve the schema from the
52
+ * session's own organization. */
53
+ readonly schemaProject?: {
54
+ /** The organization that owns the shared schema project. */
55
+ readonly organizationId: string;
56
+ /** The project the schema was pushed under. */
57
+ readonly projectId: string;
58
+ };
59
+ readonly syncGroups?: readonly string[];
60
+ readonly ttlSeconds: number;
61
+ readonly label?: string;
62
+ readonly fetch?: typeof fetch;
63
+ readonly timeoutMs?: number;
64
+ }
65
+ /**
66
+ * Mints an end-user session key (an `ek_` key) by calling
67
+ * `POST /auth/ephemeral-keys`, using your secret key as authorization. Your
68
+ * backend calls this to issue a session that a browser can present as its bearer
69
+ * credential; the server trusts the resulting key because a secret key minted it.
70
+ *
71
+ * This is a distinct endpoint from `/auth/capability`, which exchanges keys for
72
+ * agents and systems and cannot mint sessions for human users.
73
+ */
74
+ export declare function mintUserSessionKey(options: MintUserSessionRequest): Promise<EphemeralKeyResponse>;
75
+ export interface ResolveIdentityRequest {
76
+ readonly baseUrl: string;
77
+ readonly authToken?: string;
78
+ readonly fetch?: typeof fetch;
79
+ readonly timeoutMs?: number;
80
+ }
81
+ /**
82
+ * Resolves the caller's identity from an authenticated request by calling
83
+ * `GET /auth/identity`. This lets browser and session flows learn who the
84
+ * current user is without requiring the application to pass a user id up front —
85
+ * for example, to key local storage.
86
+ */
87
+ export declare function resolveIdentity(options: ResolveIdentityRequest): Promise<IdentityResolveResponse>;
88
+ /**
89
+ * Keeps a capability token fresh so a long-lived client never disconnects when
90
+ * its token expires.
91
+ *
92
+ * A capability token has a shorter lifetime — one hour by default — than a
93
+ * typical browser session. Without a refresh, the WebSocket is force-closed at
94
+ * expiry (close code 1008) or the next reconnect fails with a 401, and either way
95
+ * the user sees a mid-session disconnect. The scheduler prevents that by
96
+ * re-minting the token ahead of time.
97
+ *
98
+ * Three triggers share one refresh path:
99
+ *
100
+ * 1. Proactive — a timer set for `expiresAtMs - bufferMs - now`.
101
+ * 2. Visibility — when a hidden tab becomes visible and the token is already
102
+ * within the buffer window, refresh immediately. This covers a
103
+ * background tab whose timers were throttled while it was idle.
104
+ * 3. Reactive — the caller invokes {@link RefreshScheduler.refreshNow} after
105
+ * observing an auth failure, such as a WebSocket close 1008 or
106
+ * 4001.
107
+ *
108
+ * All three await the same in-flight promise, so concurrent triggers mint the
109
+ * token only once. Each successful refresh records the new expiry and reschedules
110
+ * the proactive timer.
111
+ *
112
+ * The refresh margin is `max(60s, ttl/10)` — six minutes for a one-hour token,
113
+ * and it scales down for shorter lifetimes.
114
+ */
115
+ export interface RefreshSchedulerOptions {
116
+ /** Initial absolute expiry, ms since epoch (server-supplied). */
117
+ readonly initialExpiresAtMs: number;
118
+ /**
119
+ * Performs the token exchange and returns the new expiry. Errors propagate to
120
+ * `onError`; the scheduler stays alive and retries on its next trigger. It does
121
+ * not back off between retries, since the common failure here is a revoked API
122
+ * key, for which retrying would not help.
123
+ */
124
+ readonly refresh: () => Promise<{
125
+ expiresAtMs: number;
126
+ }>;
127
+ /** Called on every successful refresh. */
128
+ readonly onRefreshed?: (info: {
129
+ expiresAtMs: number;
130
+ }) => void;
131
+ /** Called on every refresh failure. */
132
+ readonly onError?: (error: Error) => void;
133
+ /**
134
+ * Override the buffer (ms ahead of expiry to refresh). Defaults to
135
+ * `max(60_000, ttlMs * 0.1)`. Tests use a tiny value to exercise
136
+ * scheduling without burning real time.
137
+ */
138
+ readonly bufferMs?: number;
139
+ /**
140
+ * If true, install a `visibilitychange` listener on `document` that
141
+ * triggers a refresh when the tab becomes visible and the token is
142
+ * within the buffer window. No-op if `document` is undefined (Node).
143
+ * Default: true in browser environments.
144
+ */
145
+ readonly attachVisibilityListener?: boolean;
146
+ /** Time source. Override in tests; defaults to `Date.now`. */
147
+ readonly now?: () => number;
148
+ /** Timer pair. Override in tests. */
149
+ readonly setTimer?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
150
+ readonly clearTimer?: (handle: ReturnType<typeof setTimeout>) => void;
151
+ }
152
+ export interface RefreshScheduler {
153
+ /** Force a refresh now. Idempotent — concurrent calls share one promise. */
154
+ refreshNow(): Promise<{
155
+ expiresAtMs: number;
156
+ }>;
157
+ /** Stop scheduling. Safe to call multiple times. */
158
+ dispose(): void;
159
+ /** Current absolute expiry. Updated after each successful refresh. */
160
+ readonly expiresAtMs: number;
161
+ }
162
+ export declare function createRefreshScheduler(options: RefreshSchedulerOptions): RefreshScheduler;