@abloatai/ablo 0.34.1 → 0.36.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 (536) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +758 -5
  3. package/README.md +56 -502
  4. package/bin/ablo.cjs +39 -0
  5. package/dist/BaseSyncedStore.d.ts +176 -48
  6. package/dist/BaseSyncedStore.js +346 -214
  7. package/dist/Database.d.ts +17 -44
  8. package/dist/Database.js +96 -79
  9. package/dist/InstanceCache.d.ts +31 -6
  10. package/dist/InstanceCache.js +65 -30
  11. package/dist/LazyReferenceCollection.d.ts +3 -3
  12. package/dist/LazyReferenceCollection.js +4 -4
  13. package/dist/Model.d.ts +23 -13
  14. package/dist/Model.js +27 -17
  15. package/dist/ModelRegistry.d.ts +8 -4
  16. package/dist/ModelRegistry.js +20 -18
  17. package/dist/NetworkMonitor.d.ts +3 -1
  18. package/dist/NetworkMonitor.js +7 -5
  19. package/dist/{SyncEngineContext.d.ts → RuntimeContext.d.ts} +20 -13
  20. package/dist/{SyncEngineContext.js → RuntimeContext.js} +11 -12
  21. package/dist/SyncClient.d.ts +47 -47
  22. package/dist/SyncClient.js +215 -156
  23. package/dist/ai-sdk/coordinatedTool.d.ts +2 -2
  24. package/dist/ai-sdk/coordinatedTool.js +1 -1
  25. package/dist/ai-sdk/coordinationContext.d.ts +2 -2
  26. package/dist/ai-sdk/coordinationContext.js +1 -1
  27. package/dist/ai-sdk/wrap.d.ts +3 -3
  28. package/dist/ai-sdk/wrap.js +2 -2
  29. package/dist/auth/index.d.ts +1 -156
  30. package/dist/auth/index.js +8 -301
  31. package/dist/client/Ablo.d.ts +42 -287
  32. package/dist/client/Ablo.js +129 -963
  33. package/dist/client/abloClient.d.ts +309 -0
  34. package/dist/client/abloClient.js +13 -0
  35. package/dist/client/clientPrelude.d.ts +52 -0
  36. package/dist/client/clientPrelude.js +60 -0
  37. package/dist/client/consoleLogger.d.ts +2 -2
  38. package/dist/client/coreClient.d.ts +60 -0
  39. package/dist/client/coreClient.js +118 -0
  40. package/dist/client/createInternalComponents.d.ts +8 -4
  41. package/dist/client/createInternalComponents.js +17 -10
  42. package/dist/client/createModelProxy.d.ts +98 -373
  43. package/dist/client/createModelProxy.js +233 -139
  44. package/dist/client/humans.d.ts +69 -0
  45. package/dist/client/humans.js +78 -0
  46. package/dist/client/modelRegistration.d.ts +1 -1
  47. package/dist/client/modelRegistration.js +9 -9
  48. package/dist/client/options.d.ts +73 -17
  49. package/dist/client/reactiveEngine.d.ts +53 -0
  50. package/dist/client/reactiveEngine.js +688 -0
  51. package/dist/client/resourceTypes.d.ts +9 -250
  52. package/dist/client/resourceTypes.js +8 -5
  53. package/dist/client/schemaConfig.d.ts +4 -4
  54. package/dist/client/schemaConfig.js +6 -2
  55. package/dist/client/storeCluster.d.ts +47 -0
  56. package/dist/client/storeCluster.js +118 -0
  57. package/dist/client/storeLifecycle.d.ts +61 -0
  58. package/dist/client/storeLifecycle.js +231 -0
  59. package/dist/client/validateAbloOptions.d.ts +3 -2
  60. package/dist/client/validateAbloOptions.js +1 -1
  61. package/dist/client/wsMutationExecutor.d.ts +3 -3
  62. package/dist/client/wsMutationExecutor.js +3 -3
  63. package/dist/context.d.ts +22 -9
  64. package/dist/context.js +33 -9
  65. package/dist/coordination/ClaimLog.d.ts +26 -0
  66. package/dist/coordination/ClaimLog.js +32 -0
  67. package/dist/coordination/index.d.ts +1 -15
  68. package/dist/coordination/index.js +8 -31
  69. package/dist/core/index.d.ts +3 -3
  70. package/dist/core/index.js +2 -2
  71. package/dist/docs/catalog.d.ts +72 -0
  72. package/dist/docs/catalog.js +230 -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 +44 -36
  78. package/dist/index.js +30 -22
  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 +5 -2
  99. package/dist/query/client.js +10 -9
  100. package/dist/query/types.d.ts +6 -41
  101. package/dist/query/types.js +2 -2
  102. package/dist/react/AbloProvider.d.ts +18 -8
  103. package/dist/react/AbloProvider.js +10 -9
  104. package/dist/react/context.d.ts +3 -3
  105. package/dist/react/context.js +1 -1
  106. package/dist/react/createAbloReact.d.ts +56 -0
  107. package/dist/react/createAbloReact.js +51 -0
  108. package/dist/react/index.d.ts +6 -5
  109. package/dist/react/index.js +6 -3
  110. package/dist/react/internalContext.d.ts +1 -1
  111. package/dist/react/useAblo.d.ts +12 -5
  112. package/dist/react/useAblo.js +26 -8
  113. package/dist/react/useCurrentUserId.js +1 -1
  114. package/dist/react/useErrorListener.js +1 -1
  115. package/dist/react/useMutationFailureListener.d.ts +2 -2
  116. package/dist/react/useMutationFailureListener.js +1 -1
  117. package/dist/react/useMutators.d.ts +3 -3
  118. package/dist/react/useMutators.js +3 -3
  119. package/dist/react/useUndoScope.d.ts +5 -5
  120. package/dist/react/useUndoScope.js +1 -1
  121. package/dist/schema/coordination.d.ts +69 -10
  122. package/dist/schema/coordination.js +90 -9
  123. package/dist/schema/ddl.js +2 -2
  124. package/dist/schema/diff.d.ts +1 -1
  125. package/dist/schema/generate.js +1 -1
  126. package/dist/schema/index.d.ts +11 -10
  127. package/dist/schema/index.js +22 -18
  128. package/dist/schema/queries.d.ts +27 -27
  129. package/dist/schema/queries.js +23 -23
  130. package/dist/schema/select.d.ts +3 -3
  131. package/dist/schema/select.js +6 -3
  132. package/dist/schema/serialize.d.ts +15 -6
  133. package/dist/schema/serialize.js +20 -3
  134. package/dist/schema/sugar.d.ts +6 -7
  135. package/dist/schema/sugar.js +9 -12
  136. package/dist/schema/syncDeltaRow.d.ts +4 -152
  137. package/dist/schema/syncDeltaRow.js +4 -105
  138. package/dist/server/adapter.d.ts +18 -1
  139. package/dist/server/commit.d.ts +10 -16
  140. package/dist/server/index.d.ts +1 -1
  141. package/dist/server/index.js +1 -1
  142. package/dist/server/readConfig.d.ts +1 -1
  143. package/dist/source/adapter.d.ts +7 -5
  144. package/dist/source/adapter.js +7 -5
  145. package/dist/source/adapters/drizzle.d.ts +1 -1
  146. package/dist/source/adapters/drizzle.js +2 -2
  147. package/dist/source/adapters/kysely.d.ts +1 -1
  148. package/dist/source/adapters/kysely.js +1 -1
  149. package/dist/source/adapters/kyselyMutationCore.d.ts +1 -1
  150. package/dist/source/adapters/kyselyMutationCore.js +2 -2
  151. package/dist/source/adapters/memory.js +1 -1
  152. package/dist/source/adapters/prisma.d.ts +8 -3
  153. package/dist/source/adapters/prisma.js +1 -1
  154. package/dist/source/connector.js +1 -1
  155. package/dist/source/connectorProtocol.d.ts +2 -8
  156. package/dist/source/connectorProtocol.js +3 -2
  157. package/dist/source/contract.d.ts +29 -17
  158. package/dist/source/contract.js +27 -22
  159. package/dist/source/factory.d.ts +1 -1
  160. package/dist/source/idempotency.js +2 -2
  161. package/dist/source/index.d.ts +1 -0
  162. package/dist/source/index.js +3 -0
  163. package/dist/source/next.d.ts +1 -1
  164. package/dist/source/signing.d.ts +9 -2
  165. package/dist/source/signing.js +4 -1
  166. package/dist/source/types.d.ts +6 -4
  167. package/dist/source/types.js +1 -1
  168. package/dist/{core/storeContract.d.ts → storeContract.d.ts} +6 -6
  169. package/dist/{core → stores}/DatabaseManager.d.ts +3 -1
  170. package/dist/{core → stores}/DatabaseManager.js +14 -13
  171. package/dist/stores/ObjectStore.d.ts +1 -1
  172. package/dist/{core → stores}/StoreManager.d.ts +9 -26
  173. package/dist/{core → stores}/StoreManager.js +29 -77
  174. package/dist/stores/SyncActionStore.d.ts +4 -2
  175. package/dist/stores/SyncActionStore.js +11 -17
  176. package/dist/stores/syncAction.d.ts +26 -0
  177. package/dist/stores/syncAction.js +16 -0
  178. package/dist/surface.d.ts +3 -3
  179. package/dist/surface.js +6 -4
  180. package/dist/sync/BootstrapFetcher.d.ts +127 -6
  181. package/dist/sync/BootstrapFetcher.js +511 -83
  182. package/dist/sync/ConnectionManager.d.ts +6 -198
  183. package/dist/sync/ConnectionManager.js +6 -677
  184. package/dist/sync/OnDemandLoader.d.ts +5 -2
  185. package/dist/sync/OnDemandLoader.js +61 -21
  186. package/dist/sync/SubscriptionManager.d.ts +13 -2
  187. package/dist/sync/SubscriptionManager.js +23 -5
  188. package/dist/sync/SyncWebSocket.d.ts +27 -510
  189. package/dist/sync/SyncWebSocket.js +76 -954
  190. package/dist/sync/awaitClaimGrant.d.ts +4 -44
  191. package/dist/sync/awaitClaimGrant.js +4 -109
  192. package/dist/sync/bootstrapApply.d.ts +3 -0
  193. package/dist/sync/bootstrapApply.js +2 -2
  194. package/dist/sync/commitFrames.d.ts +6 -40
  195. package/dist/sync/commitFrames.js +6 -97
  196. package/dist/sync/contextPorts.d.ts +18 -0
  197. package/dist/sync/contextPorts.js +31 -0
  198. package/dist/sync/createClaimStream.d.ts +5 -49
  199. package/dist/sync/createClaimStream.js +5 -469
  200. package/dist/sync/createPresenceStream.d.ts +26 -4
  201. package/dist/sync/createPresenceStream.js +28 -20
  202. package/dist/sync/createSnapshot.d.ts +2 -2
  203. package/dist/sync/createSnapshot.js +1 -1
  204. package/dist/sync/credentialLifecycle.d.ts +5 -173
  205. package/dist/sync/credentialLifecycle.js +5 -320
  206. package/dist/sync/deltaPipeline.d.ts +13 -12
  207. package/dist/sync/deltaPipeline.js +21 -4
  208. package/dist/sync/groupChange.d.ts +3 -0
  209. package/dist/sync/groupChange.js +16 -14
  210. package/dist/sync/participants.d.ts +24 -6
  211. package/dist/sync/participants.js +32 -23
  212. package/dist/sync/schemaDrift.d.ts +55 -0
  213. package/dist/sync/schemaDrift.js +53 -0
  214. package/dist/sync/schemas.d.ts +23 -33
  215. package/dist/sync/schemas.js +29 -20
  216. package/dist/sync/syncPlan.d.ts +3 -3
  217. package/dist/sync/wsFrameHandlers.d.ts +6 -114
  218. package/dist/sync/wsFrameHandlers.js +6 -392
  219. package/dist/syncLog/contract.d.ts +20 -0
  220. package/dist/syncLog/contract.js +19 -0
  221. package/dist/syncLog/index.d.ts +1 -0
  222. package/dist/syncLog/index.js +1 -0
  223. package/dist/transaction/ablo.d.ts +88 -0
  224. package/dist/transaction/ablo.js +33 -0
  225. package/dist/{client/auth.d.ts → transaction/auth/apiKey.d.ts} +43 -8
  226. package/dist/{client/auth.js → transaction/auth/apiKey.js} +19 -0
  227. package/dist/transaction/auth/bootstrapScope.d.ts +15 -0
  228. package/dist/transaction/auth/bootstrapScope.js +1 -0
  229. package/dist/transaction/auth/capability.d.ts +212 -0
  230. package/dist/transaction/auth/capability.js +224 -0
  231. package/dist/{auth → transaction/auth}/credentialSource.d.ts +8 -1
  232. package/dist/{client → transaction/auth}/identity.d.ts +8 -7
  233. package/dist/{client → transaction/auth}/identity.js +1 -1
  234. package/dist/transaction/auth/index.d.ts +162 -0
  235. package/dist/transaction/auth/index.js +304 -0
  236. package/dist/{auth → transaction/auth}/schemas.d.ts +1 -1
  237. package/dist/{auth → transaction/auth}/schemas.js +13 -13
  238. package/dist/{client → transaction/auth}/sessionMint.d.ts +8 -8
  239. package/dist/{client → transaction/auth}/sessionMint.js +4 -7
  240. package/dist/transaction/coordination/awaitClaimGrant.d.ts +56 -0
  241. package/dist/transaction/coordination/awaitClaimGrant.js +124 -0
  242. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.d.ts +34 -0
  243. package/dist/{client → transaction/coordination}/claimHeartbeatLoop.js +20 -0
  244. package/dist/transaction/coordination/claimMeta.d.ts +49 -0
  245. package/dist/transaction/coordination/claimMeta.js +52 -0
  246. package/dist/transaction/coordination/createClaimStream.d.ts +64 -0
  247. package/dist/transaction/coordination/createClaimStream.js +475 -0
  248. package/dist/transaction/coordination/events.d.ts +74 -0
  249. package/dist/transaction/coordination/events.js +7 -0
  250. package/dist/transaction/coordination/index.d.ts +19 -0
  251. package/dist/transaction/coordination/index.js +45 -0
  252. package/dist/transaction/coordination/locator.d.ts +104 -0
  253. package/dist/transaction/coordination/locator.js +102 -0
  254. package/dist/transaction/coordination/schema.d.ts +1536 -0
  255. package/dist/transaction/coordination/schema.js +1177 -0
  256. package/dist/transaction/coordination/targetConflict.d.ts +2 -0
  257. package/dist/transaction/coordination/targetConflict.js +107 -0
  258. package/dist/{coordination → transaction/coordination}/trace.d.ts +7 -18
  259. package/dist/{coordination → transaction/coordination}/trace.js +18 -25
  260. package/dist/transaction/durableWrites.d.ts +62 -0
  261. package/dist/{client → transaction}/durableWrites.js +28 -3
  262. package/dist/transaction/environment.d.ts +105 -0
  263. package/dist/transaction/environment.js +108 -0
  264. package/dist/{errorCodes.d.ts → transaction/errorCodes.d.ts} +12 -12
  265. package/dist/{errorCodes.js → transaction/errorCodes.js} +45 -18
  266. package/dist/{errors.d.ts → transaction/errors.d.ts} +37 -13
  267. package/dist/{errors.js → transaction/errors.js} +85 -16
  268. package/dist/transaction/footprint.d.ts +111 -0
  269. package/dist/transaction/footprint.js +0 -0
  270. package/dist/transaction/index.d.ts +20 -0
  271. package/dist/transaction/index.js +20 -0
  272. package/dist/transaction/keys/index.d.ts +87 -0
  273. package/dist/transaction/keys/index.js +207 -0
  274. package/dist/transaction/log/syncDeltaRow.d.ts +158 -0
  275. package/dist/transaction/log/syncDeltaRow.js +95 -0
  276. package/dist/{sync/syncPosition.d.ts → transaction/logPosition.d.ts} +22 -8
  277. package/dist/{sync/syncPosition.js → transaction/logPosition.js} +15 -6
  278. package/dist/transaction/logger.d.ts +16 -0
  279. package/dist/transaction/logger.js +7 -0
  280. package/dist/transaction/observability.d.ts +53 -0
  281. package/dist/transaction/observability.js +19 -0
  282. package/dist/transaction/plugin.d.ts +285 -0
  283. package/dist/transaction/plugin.js +106 -0
  284. package/dist/{policy → transaction/policy}/types.d.ts +3 -3
  285. package/dist/{policy → transaction/policy}/types.js +2 -0
  286. package/dist/transaction/resources/httpResources.d.ts +321 -0
  287. package/dist/transaction/resources/httpResources.js +7 -0
  288. package/dist/transaction/resources/modelOperations.d.ts +427 -0
  289. package/dist/transaction/resources/modelOperations.js +12 -0
  290. package/dist/transaction/resources/mutationOptions.d.ts +66 -0
  291. package/dist/transaction/resources/mutationOptions.js +9 -0
  292. package/dist/transaction/resources/where.d.ts +101 -0
  293. package/dist/transaction/resources/where.js +115 -0
  294. package/dist/{client → transaction/resources}/writeOptionsSchema.d.ts +2 -6
  295. package/dist/{client → transaction/resources}/writeOptionsSchema.js +9 -5
  296. package/dist/{schema → transaction/schema}/field.d.ts +17 -23
  297. package/dist/{schema → transaction/schema}/field.js +5 -5
  298. package/dist/transaction/schema/fieldRef.d.ts +38 -0
  299. package/dist/transaction/schema/fieldRef.js +11 -0
  300. package/dist/transaction/schema/loadStrategy.d.ts +45 -0
  301. package/dist/transaction/schema/loadStrategy.js +46 -0
  302. package/dist/{schema → transaction/schema}/model.d.ts +50 -35
  303. package/dist/{schema → transaction/schema}/model.js +30 -20
  304. package/dist/transaction/schema/openapi.d.ts +58 -0
  305. package/dist/transaction/schema/openapi.js +501 -0
  306. package/dist/{schema → transaction/schema}/relation.d.ts +21 -16
  307. package/dist/{schema → transaction/schema}/relation.js +7 -7
  308. package/dist/{schema → transaction/schema}/residency.d.ts +0 -9
  309. package/dist/{schema → transaction/schema}/residency.js +0 -5
  310. package/dist/{schema → transaction/schema}/roles.d.ts +5 -5
  311. package/dist/{schema → transaction/schema}/roles.js +5 -5
  312. package/dist/{schema → transaction/schema}/schema.d.ts +39 -10
  313. package/dist/{schema → transaction/schema}/schema.js +24 -3
  314. package/dist/{schema → transaction/schema}/tenancy.d.ts +1 -1
  315. package/dist/{schema → transaction/schema}/tenancy.js +7 -4
  316. package/dist/transaction/transactionLayer.d.ts +82 -0
  317. package/dist/transaction/transactionLayer.js +24 -0
  318. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.d.ts +5 -6
  319. package/dist/{transactions → transaction/transactions/settlement}/commitEnvelope.js +9 -13
  320. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.d.ts +9 -2
  321. package/dist/{transactions → transaction/transactions/settlement}/httpCommitEnvelope.js +5 -9
  322. package/dist/{transactions/durableWriteStore.d.ts → transaction/transactions/settlement/pendingWrite.d.ts} +11 -37
  323. package/dist/transaction/transactions/settlement/pendingWrite.js +20 -0
  324. package/dist/transaction/transport/commitFrames.d.ts +90 -0
  325. package/dist/transaction/transport/commitFrames.js +134 -0
  326. package/dist/transaction/transport/connectionManager.d.ts +215 -0
  327. package/dist/transaction/transport/connectionManager.js +673 -0
  328. package/dist/transaction/transport/credentialLifecycle.d.ts +177 -0
  329. package/dist/transaction/transport/credentialLifecycle.js +324 -0
  330. package/dist/{sync → transaction/transport}/heartbeat.d.ts +3 -1
  331. package/dist/{sync → transaction/transport}/heartbeat.js +6 -4
  332. package/dist/transaction/transport/httpClient.d.ts +131 -0
  333. package/dist/{client → transaction/transport}/httpClient.js +6 -5
  334. package/dist/transaction/transport/httpOptions.d.ts +33 -0
  335. package/dist/transaction/transport/httpOptions.js +12 -0
  336. package/dist/{client → transaction/transport}/httpTransport.js +295 -97
  337. package/dist/{sync/NetworkProbe.d.ts → transaction/transport/networkProbe.d.ts} +7 -4
  338. package/dist/{sync/NetworkProbe.js → transaction/transport/networkProbe.js} +14 -13
  339. package/dist/transaction/transport/wsFrameHandlers.d.ts +128 -0
  340. package/dist/transaction/transport/wsFrameHandlers.js +429 -0
  341. package/dist/transaction/transport/wsTransport.d.ts +574 -0
  342. package/dist/transaction/transport/wsTransport.js +1023 -0
  343. package/dist/transaction/types/assertExact.d.ts +17 -0
  344. package/dist/transaction/types/assertExact.js +1 -0
  345. package/dist/{types → transaction/types}/global.d.ts +17 -2
  346. package/dist/{types → transaction/types}/global.js +2 -1
  347. package/dist/{types → transaction/types}/index.d.ts +14 -46
  348. package/dist/{types → transaction/types}/index.js +7 -16
  349. package/dist/{types → transaction/types}/streams.d.ts +73 -45
  350. package/dist/transaction/utils/duration.d.ts +50 -0
  351. package/dist/{utils → transaction/utils}/duration.js +32 -0
  352. package/dist/{utils → transaction/utils}/json.d.ts +18 -0
  353. package/dist/transaction/utils/json.js +276 -0
  354. package/dist/transaction/wire/accountResponses.d.ts +420 -0
  355. package/dist/transaction/wire/accountResponses.js +290 -0
  356. package/dist/transaction/wire/auth.d.ts +56 -0
  357. package/dist/transaction/wire/auth.js +63 -0
  358. package/dist/transaction/wire/claimEvent.d.ts +76 -0
  359. package/dist/transaction/wire/claimEvent.js +73 -0
  360. package/dist/transaction/wire/claims.d.ts +530 -0
  361. package/dist/transaction/wire/claims.js +327 -0
  362. package/dist/{wire → transaction/wire}/commit.d.ts +125 -193
  363. package/dist/{wire → transaction/wire}/commit.js +68 -47
  364. package/dist/{wire → transaction/wire}/delta.d.ts +66 -17
  365. package/dist/{wire → transaction/wire}/delta.js +37 -13
  366. package/dist/transaction/wire/errorEnvelope.d.ts +72 -0
  367. package/dist/{wire → transaction/wire}/errorEnvelope.js +36 -5
  368. package/dist/transaction/wire/feedCursor.d.ts +60 -0
  369. package/dist/transaction/wire/feedCursor.js +82 -0
  370. package/dist/transaction/wire/feedEvent.d.ts +204 -0
  371. package/dist/transaction/wire/feedEvent.js +65 -0
  372. package/dist/transaction/wire/frames.d.ts +194 -0
  373. package/dist/transaction/wire/frames.js +50 -0
  374. package/dist/transaction/wire/inboundFrames.d.ts +562 -0
  375. package/dist/transaction/wire/inboundFrames.js +116 -0
  376. package/dist/transaction/wire/index.d.ts +54 -0
  377. package/dist/transaction/wire/index.js +83 -0
  378. package/dist/{wire → transaction/wire}/listEnvelope.d.ts +13 -14
  379. package/dist/transaction/wire/listEnvelope.js +42 -0
  380. package/dist/transaction/wire/modelMutations.d.ts +31 -0
  381. package/dist/transaction/wire/modelMutations.js +52 -0
  382. package/dist/transaction/wire/modelResponses.d.ts +85 -0
  383. package/dist/transaction/wire/modelResponses.js +43 -0
  384. package/dist/transaction/wire/modelShape.d.ts +78 -0
  385. package/dist/transaction/wire/modelShape.js +74 -0
  386. package/dist/transactions/{TransactionQueue.d.ts → mutations/MutationQueue.d.ts} +85 -38
  387. package/dist/transactions/{TransactionQueue.js → mutations/MutationQueue.js} +141 -80
  388. package/dist/transactions/{TransactionStore.d.ts → mutations/MutationStore.d.ts} +8 -8
  389. package/dist/transactions/{TransactionStore.js → mutations/MutationStore.js} +2 -2
  390. package/dist/transactions/{coalesceRules.d.ts → mutations/coalesceRules.d.ts} +10 -10
  391. package/dist/transactions/{coalesceRules.js → mutations/coalesceRules.js} +1 -1
  392. package/dist/transactions/mutations/commitLatency.d.ts +52 -0
  393. package/dist/transactions/mutations/commitLatency.js +130 -0
  394. package/dist/transactions/{commitOutboxStore.d.ts → mutations/commitOutboxStore.d.ts} +1 -5
  395. package/dist/transactions/{commitOutboxStore.js → mutations/commitOutboxStore.js} +1 -1
  396. package/dist/transactions/{commitPayload.d.ts → mutations/commitPayload.d.ts} +18 -16
  397. package/dist/transactions/{commitPayload.js → mutations/commitPayload.js} +15 -15
  398. package/dist/transactions/{deltaConfirmation.d.ts → mutations/deltaConfirmation.d.ts} +15 -11
  399. package/dist/transactions/{deltaConfirmation.js → mutations/deltaConfirmation.js} +14 -12
  400. package/dist/transactions/mutations/durableWriteStore.d.ts +14 -0
  401. package/dist/transactions/mutations/durableWriteStore.js +12 -0
  402. package/dist/transactions/{optimisticApply.d.ts → mutations/optimisticApply.d.ts} +7 -7
  403. package/dist/transactions/{replayValidation.d.ts → mutations/replayValidation.d.ts} +4 -3
  404. package/dist/transactions/{replayValidation.js → mutations/replayValidation.js} +7 -5
  405. package/dist/utils/mobxSetup.d.ts +1 -1
  406. package/dist/utils/mobxSetup.js +5 -2
  407. package/dist/{core → views}/QueryView.d.ts +2 -2
  408. package/dist/{core → views}/QueryView.js +2 -2
  409. package/dist/{core → views}/ViewRegistry.d.ts +1 -1
  410. package/dist/{core/queryUtils.d.ts → views/incrementalView.d.ts} +6 -6
  411. package/dist/{core/queryUtils.js → views/incrementalView.js} +6 -6
  412. package/dist/webhooks/events.d.ts +2 -2
  413. package/dist/wire/index.d.ts +1 -34
  414. package/dist/wire/index.js +8 -49
  415. package/docs/agent-messaging.md +3 -3
  416. package/docs/agents.md +20 -13
  417. package/docs/api-keys.md +14 -10
  418. package/docs/api.md +27 -61
  419. package/docs/audit.md +6 -3
  420. package/docs/cli.md +41 -13
  421. package/docs/client-behavior.md +11 -9
  422. package/docs/concurrency-convention.md +49 -57
  423. package/docs/coordination.md +283 -121
  424. package/docs/data-sources.md +7 -5
  425. package/docs/debugging.md +39 -15
  426. package/docs/deployment.md +267 -0
  427. package/docs/examples/agent-human.md +49 -42
  428. package/docs/examples/ai-sdk-tool.md +69 -44
  429. package/docs/examples/existing-python-backend.md +8 -6
  430. package/docs/examples/nextjs.md +129 -47
  431. package/docs/examples/scoped-agent.md +46 -45
  432. package/docs/examples/server-agent.md +46 -26
  433. package/docs/groups.md +87 -30
  434. package/docs/guarantees.md +41 -12
  435. package/docs/how-it-works.md +38 -12
  436. package/docs/idempotency.md +126 -0
  437. package/docs/identity.md +77 -74
  438. package/docs/index.md +172 -86
  439. package/docs/integration-guide.md +31 -19
  440. package/docs/mcp.md +46 -21
  441. package/docs/migration.md +95 -18
  442. package/docs/operating-on-your-database.md +3 -1
  443. package/docs/projects.md +3 -1
  444. package/docs/quickstart.md +22 -5
  445. package/docs/react.md +31 -18
  446. package/docs/schema-contract.md +5 -3
  447. package/docs/session-settings.md +108 -0
  448. package/docs/sessions.md +4 -2
  449. package/docs/webhooks.md +12 -10
  450. package/llms.txt +48 -18
  451. package/package.json +21 -26
  452. package/dist/agent/Agent.d.ts +0 -366
  453. package/dist/agent/Agent.js +0 -514
  454. package/dist/agent/index.d.ts +0 -115
  455. package/dist/agent/index.js +0 -128
  456. package/dist/agent/session.d.ts +0 -93
  457. package/dist/agent/session.js +0 -149
  458. package/dist/agent/types.d.ts +0 -68
  459. package/dist/agent/types.js +0 -9
  460. package/dist/cli.cjs +0 -286329
  461. package/dist/client/durableWrites.d.ts +0 -21
  462. package/dist/client/httpClient.d.ts +0 -80
  463. package/dist/coordination/schema.d.ts +0 -722
  464. package/dist/coordination/schema.js +0 -578
  465. package/dist/schema/openapi.d.ts +0 -29
  466. package/dist/schema/openapi.js +0 -124
  467. package/dist/testing/fixtures/bootstrap.d.ts +0 -49
  468. package/dist/testing/fixtures/bootstrap.js +0 -59
  469. package/dist/testing/fixtures/deltas.d.ts +0 -83
  470. package/dist/testing/fixtures/deltas.js +0 -136
  471. package/dist/testing/fixtures/models.d.ts +0 -83
  472. package/dist/testing/fixtures/models.js +0 -272
  473. package/dist/testing/helpers/reactWrapper.d.ts +0 -69
  474. package/dist/testing/helpers/reactWrapper.js +0 -67
  475. package/dist/testing/helpers/syncEngineHarness.d.ts +0 -54
  476. package/dist/testing/helpers/syncEngineHarness.js +0 -73
  477. package/dist/testing/helpers/wait.d.ts +0 -30
  478. package/dist/testing/helpers/wait.js +0 -49
  479. package/dist/testing/index.d.ts +0 -23
  480. package/dist/testing/index.js +0 -33
  481. package/dist/testing/mocks/FakeDatabase.d.ts +0 -18
  482. package/dist/testing/mocks/FakeDatabase.js +0 -10
  483. package/dist/testing/mocks/MockMutationExecutor.d.ts +0 -87
  484. package/dist/testing/mocks/MockMutationExecutor.js +0 -192
  485. package/dist/testing/mocks/MockNetworkMonitor.d.ts +0 -20
  486. package/dist/testing/mocks/MockNetworkMonitor.js +0 -46
  487. package/dist/testing/mocks/MockSyncContext.d.ts +0 -51
  488. package/dist/testing/mocks/MockSyncContext.js +0 -71
  489. package/dist/testing/mocks/MockSyncStore.d.ts +0 -88
  490. package/dist/testing/mocks/MockSyncStore.js +0 -171
  491. package/dist/testing/mocks/MockWebSocket.d.ts +0 -71
  492. package/dist/testing/mocks/MockWebSocket.js +0 -118
  493. package/dist/transactions/durableWriteStore.js +0 -30
  494. package/dist/utils/duration.d.ts +0 -25
  495. package/dist/utils/json.js +0 -88
  496. package/dist/wire/errorEnvelope.d.ts +0 -55
  497. package/dist/wire/frames.d.ts +0 -197
  498. package/dist/wire/frames.js +0 -49
  499. package/dist/wire/listEnvelope.js +0 -18
  500. package/docs/interaction-model.md +0 -97
  501. /package/dist/{core → query}/QueryProcessor.d.ts +0 -0
  502. /package/dist/{core → query}/QueryProcessor.js +0 -0
  503. /package/dist/{core/storeContract.js → storeContract.js} +0 -0
  504. /package/dist/{core → stores}/openIDBWithTimeout.d.ts +0 -0
  505. /package/dist/{core → stores}/openIDBWithTimeout.js +0 -0
  506. /package/dist/{client → transaction/auth}/credentialEndpoint.d.ts +0 -0
  507. /package/dist/{client → transaction/auth}/credentialEndpoint.js +0 -0
  508. /package/dist/{auth → transaction/auth}/credentialPolicy.d.ts +0 -0
  509. /package/dist/{auth → transaction/auth}/credentialPolicy.js +0 -0
  510. /package/dist/{auth → transaction/auth}/credentialSource.js +0 -0
  511. /package/dist/{client → transaction/auth}/hostedEndpoints.d.ts +0 -0
  512. /package/dist/{client → transaction/auth}/hostedEndpoints.js +0 -0
  513. /package/dist/{client → transaction}/persistence.d.ts +0 -0
  514. /package/dist/{client → transaction}/persistence.js +0 -0
  515. /package/dist/{client → transaction/resources}/functionalUpdate.d.ts +0 -0
  516. /package/dist/{client → transaction/resources}/functionalUpdate.js +0 -0
  517. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.d.ts +0 -0
  518. /package/dist/{transactions → transaction/transactions/settlement}/idempotencyKey.js +0 -0
  519. /package/dist/{client → transaction/transport}/httpTransport.d.ts +0 -0
  520. /package/dist/{types → transaction/types}/modelData.d.ts +0 -0
  521. /package/dist/{types → transaction/types}/modelData.js +0 -0
  522. /package/dist/{types → transaction/types}/participant.d.ts +0 -0
  523. /package/dist/{types → transaction/types}/participant.js +0 -0
  524. /package/dist/{types → transaction/types}/streams.js +0 -0
  525. /package/dist/{utils → transaction/utils}/asyncIterator.d.ts +0 -0
  526. /package/dist/{utils → transaction/utils}/asyncIterator.js +0 -0
  527. /package/dist/{wire → transaction/wire}/bootstrapReason.d.ts +0 -0
  528. /package/dist/{wire → transaction/wire}/bootstrapReason.js +0 -0
  529. /package/dist/{wire → transaction/wire}/protocol.d.ts +0 -0
  530. /package/dist/{wire → transaction/wire}/protocol.js +0 -0
  531. /package/dist/{wire → transaction/wire}/protocolVersion.d.ts +0 -0
  532. /package/dist/{wire → transaction/wire}/protocolVersion.js +0 -0
  533. /package/dist/transactions/{UnconfirmedWrites.d.ts → mutations/UnconfirmedWrites.d.ts} +0 -0
  534. /package/dist/transactions/{UnconfirmedWrites.js → mutations/UnconfirmedWrites.js} +0 -0
  535. /package/dist/transactions/{optimisticApply.js → mutations/optimisticApply.js} +0 -0
  536. /package/dist/{core → views}/ViewRegistry.js +0 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `Ablo` — the entry point to the coordination layer.
3
+ *
4
+ * The factory constructs the stateless client: typed model resources, commits,
5
+ * claims, and session minting over request/response HTTP. It holds no socket,
6
+ * no store, and no local copy of anything — the bearer credential is the
7
+ * identity and the server resolves it on every request. This is the client a
8
+ * server-side actor installs: an agent, a worker, a cron job, a route handler.
9
+ *
10
+ * ```ts
11
+ * import { Ablo } from '@abloatai/ablo';
12
+ * import { schema } from './schema';
13
+ *
14
+ * const ablo = Ablo({ schema, apiKey: process.env.ABLO_API_KEY, transport: 'http' });
15
+ * await ablo.tasks.update({ id: taskId, data: { status: 'done' } });
16
+ * ```
17
+ *
18
+ * The reactive materialiser — local store, live queries, presence rendering —
19
+ * is the consumer package's entry point (`@abloatai/ablo`), which layers
20
+ * above this one and shares the same `ablo.<model>` surface (ADR 0016).
21
+ */
22
+ import { createAbloHttpClient, } from './transport/httpClient.js';
23
+ /**
24
+ * Create a coordination-layer client in one call.
25
+ *
26
+ * The core carries one transport today — request/response HTTP — so
27
+ * `transport: 'http'` is accepted for symmetry with the reactive package's
28
+ * factory and may be omitted. The duplex transport joins this slot when the
29
+ * socket carve lands (ADR 0016, follow-up 3a).
30
+ */
31
+ export function Ablo(options) {
32
+ return createAbloHttpClient(options);
33
+ }
@@ -11,6 +11,7 @@
11
11
  * override is an explicit option, so an app never picks up hidden behavior from
12
12
  * a stray environment variable.
13
13
  */
14
+ import type { KeyEnvironment } from '../environment.js';
14
15
  /**
15
16
  * The credential-resolver callable type. It is defined alongside
16
17
  * {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
@@ -19,19 +20,31 @@
19
20
  */
20
21
  import type { ApiKeySetter } from './credentialEndpoint.js';
21
22
  export type { ApiKeySetter };
23
+ /**
24
+ * The client options that decide a credential.
25
+ *
26
+ * This is the ONE declaration of that set. The resolvers below read it, and the
27
+ * transport configs that accept these options derive from it rather than listing
28
+ * the fields again — a second list is how `authEndpoint` came to be supported at
29
+ * runtime, named in an error message, and absent from the type a caller writes
30
+ * against.
31
+ */
32
+ export interface AuthClientOptions {
33
+ readonly apiKey?: string | ApiKeySetter | null;
34
+ /** A route that mints the token, instead of a key the process holds. */
35
+ readonly authEndpoint?: string | ApiKeySetter | null;
36
+ /** A token the caller already has, used as-is. */
37
+ readonly authToken?: string | null;
38
+ readonly baseURL?: string | null;
39
+ readonly dangerouslyAllowBrowser?: boolean;
40
+ }
22
41
  export interface AuthResolveInput {
23
42
  /**
24
43
  * The full set of options the caller passed to the client constructor. Each
25
44
  * resolver reads only the fields it needs; passing the whole object avoids
26
45
  * threading many separate parameters through every helper.
27
46
  */
28
- readonly options: {
29
- readonly apiKey?: string | ApiKeySetter | null;
30
- readonly authEndpoint?: string | ApiKeySetter | null;
31
- readonly authToken?: string | null;
32
- readonly baseURL?: string | null;
33
- readonly dangerouslyAllowBrowser?: boolean;
34
- };
47
+ readonly options: AuthClientOptions;
35
48
  readonly env: Record<string, string | undefined>;
36
49
  }
37
50
  /**
@@ -41,8 +54,30 @@ export interface AuthResolveInput {
41
54
  */
42
55
  export declare function readProcessEnv(): Record<string, string | undefined>;
43
56
  export declare function resolveApiKey(input: AuthResolveInput): string | ApiKeySetter | null;
57
+ /**
58
+ * Narrow a resolved `apiKey` to the single resolver the credential lifecycle
59
+ * needs: an async `() => token | null`, or `null` when auth is static — a plain
60
+ * long-lived key string with no refresh, which is the common case.
61
+ *
62
+ * The short-lived per-user browser path passes a function `apiKey` (an
63
+ * {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
64
+ * from it: mint-before-connect, the proactive refresh timer with its
65
+ * wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
66
+ * resolver follows the `ApiKeySetter` contract end to end: resolve a token,
67
+ * resolve `null` when the login is gone (terminal — surfaces `session_expired`
68
+ * and signs the user out), or throw on a transient failure (backs off, without
69
+ * signing out).
70
+ */
71
+ export declare function resolveCredentialResolver(apiKey: string | ApiKeySetter | null): (() => Promise<string | null>) | null;
44
72
  export declare function resolveAuthToken(input: AuthResolveInput): string | null;
45
- type CliMode = 'sandbox' | 'production';
73
+ /**
74
+ * The credential axis, not a second copy of it. `environment.ts` documents two
75
+ * incidents caused by conflating the plane a request runs on with the mode a
76
+ * credential was minted in, and states the credential axis must not grow when
77
+ * planes do — so the CLI mismatch path reads the canonical vocabulary rather
78
+ * than restating its members here.
79
+ */
80
+ type CliMode = KeyEnvironment;
46
81
  type StaticApiKeySource = 'option' | 'env';
47
82
  interface StaticApiKey {
48
83
  readonly key: string;
@@ -56,6 +56,25 @@ export function resolveApiKey(input) {
56
56
  }
57
57
  return configured ?? input.env.ABLO_API_KEY ?? null;
58
58
  }
59
+ /**
60
+ * Narrow a resolved `apiKey` to the single resolver the credential lifecycle
61
+ * needs: an async `() => token | null`, or `null` when auth is static — a plain
62
+ * long-lived key string with no refresh, which is the common case.
63
+ *
64
+ * The short-lived per-user browser path passes a function `apiKey` (an
65
+ * {@link ApiKeySetter}), and the SDK then drives the whole credential lifecycle
66
+ * from it: mint-before-connect, the proactive refresh timer with its
67
+ * wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
68
+ * resolver follows the `ApiKeySetter` contract end to end: resolve a token,
69
+ * resolve `null` when the login is gone (terminal — surfaces `session_expired`
70
+ * and signs the user out), or throw on a transient failure (backs off, without
71
+ * signing out).
72
+ */
73
+ export function resolveCredentialResolver(apiKey) {
74
+ if (typeof apiKey === 'function')
75
+ return apiKey;
76
+ return null;
77
+ }
59
78
  export function resolveAuthToken(input) {
60
79
  return input.options.authToken ?? null;
61
80
  }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The hand-off the identity flow performs once a credential resolves: it names
3
+ * the account scope and the sync groups everything downstream should read under.
4
+ *
5
+ * The core defines the port; the consumer supplies the implementation. That
6
+ * keeps identity resolution — which is settlement's business — from depending on
7
+ * whatever happens to materialise rows on the other side of it (ADR 0016). The
8
+ * reactive engine's `BootstrapFetcher` satisfies this structurally.
9
+ */
10
+ export interface BootstrapScope {
11
+ /** Bind subsequent reads to one account's cache partition. */
12
+ setCacheScope(cacheScope: string): void;
13
+ /** Narrow subsequent reads to the sync groups the credential authorises. */
14
+ setSyncGroups(syncGroups: readonly string[] | undefined): void;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,212 @@
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
+ /**
27
+ * The verbs a grant can name — the whole vocabulary, in one place. Every other
28
+ * spelling of an operation in the system derives from this enum: the SDK's
29
+ * `can` values, the wire's `model.verb` pattern, and the JSON Schema the
30
+ * published contract advertises.
31
+ */
32
+ export declare const capabilityOperationSchema: z.ZodEnum<{
33
+ update: "update";
34
+ create: "create";
35
+ delete: "delete";
36
+ read: "read";
37
+ }>;
38
+ export type CapabilityOperation = z.infer<typeof capabilityOperationSchema>;
39
+ /**
40
+ * One granted operation in its wire spelling: `<model>.<verb>`, lowercased.
41
+ *
42
+ * The template literal derives both halves — the verb set from
43
+ * {@link capabilityOperationSchema}, the pattern in the published contract from
44
+ * the template — so tightening the verb vocabulary can never leave a stale
45
+ * regex or a stale doc behind. The model half is the name the server matches
46
+ * against a model's registered aliases (type name, schema key, or table name),
47
+ * so it stays permissive here and is resolved at the gate.
48
+ */
49
+ export declare const grantedOperationSchema: z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>;
50
+ export type GrantedOperation = z.infer<typeof grantedOperationSchema>;
51
+ /**
52
+ * The declared grant, per model — the runtime shape of `can`. Model keys are
53
+ * free-form at runtime because the server resolves them against the schema it
54
+ * has; {@link CapabilityCan} narrows them to a known schema's models at the
55
+ * type level.
56
+ */
57
+ export declare const capabilityCanSchema: z.ZodRecord<z.ZodString, z.ZodReadonly<z.ZodArray<z.ZodEnum<{
58
+ update: "update";
59
+ create: "create";
60
+ delete: "delete";
61
+ read: "read";
62
+ }>>>>;
63
+ /**
64
+ * `can`, narrowed to one schema's model names. A projection of
65
+ * {@link capabilityCanSchema} — the value type is the operation enum, the key
66
+ * domain is the schema's models, so `can: { tasks: ['update'] }` fails to
67
+ * compile against a schema with no `tasks` model.
68
+ */
69
+ export type CapabilityCan<S> = Partial<Record<keyof S & string, readonly CapabilityOperation[]>>;
70
+ /**
71
+ * Read-your-writes expansion: append `<model>.read` for every model the grant
72
+ * can write.
73
+ *
74
+ * A scoped agent that may update a row must be able to read it, or the read
75
+ * gate (query / bootstrap / entity self-heal / delta fan-out) starves the very
76
+ * writes the grant allows. The write verbs stay the source of truth; reads are
77
+ * derived and deduped, and models the grant cannot write stay unreadable —
78
+ * that is the read-side blast-radius reduction.
79
+ *
80
+ * It lives beside the declaration, so it applies wherever a grant is built,
81
+ * rather than only at whichever mint the callers happen to share. The server
82
+ * applies it again at the mint chokepoint for callers that post raw JSON; the
83
+ * function is idempotent, so the second application is a no-op.
84
+ */
85
+ export declare function expandReadYourWrites(operations: readonly GrantedOperation[]): GrantedOperation[];
86
+ /**
87
+ * The parts of a model definition a grant can name. Structural, so both the
88
+ * SDK (which holds a `Schema`) and the mint route (which holds the tenant's
89
+ * pushed artifact) derive names from the same rule.
90
+ */
91
+ export interface CapabilityModelShape {
92
+ readonly typename?: string;
93
+ readonly tableName?: string;
94
+ }
95
+ /**
96
+ * Schema key → the wire name a grant must be minted with.
97
+ *
98
+ * THE derivation. A model whose type name is overridden — schema key
99
+ * `documents`, type name `Document` — has to mint `document.update`, not
100
+ * `documents.update`, and a caller who works that out by hand gets it wrong
101
+ * once and learns at `capability_scope_denied`. Callers pass their schema's
102
+ * models, never a map they assembled themselves.
103
+ */
104
+ export declare function modelWireNames(models: Readonly<Record<string, CapabilityModelShape>>): Record<string, string>;
105
+ /**
106
+ * Every name the enforcement gates accept for a model, lowercased. Three
107
+ * vocabularies name one logical model — the wire type name (`lineitem`), the
108
+ * schema key (`lineItems`), and the table name (`line_items`) — so a grant
109
+ * minted in any of them is honored, and the mint can tell a real model from a
110
+ * typo without guessing which vocabulary the caller used.
111
+ */
112
+ export declare function capabilityModelAliases(models: Readonly<Record<string, CapabilityModelShape>>): Set<string>;
113
+ /**
114
+ * The granted operations whose model half names nothing in the schema.
115
+ *
116
+ * A grant is checked against the schema at MINT, the way a write to an unpushed
117
+ * model already fails with `server_execute_unknown_model` — so a typo in
118
+ * `lineitem.update` is a rejected mint rather than a credential that looks
119
+ * healthy and is denied on its first write. Without this the `model` half is a
120
+ * hole: an opaque string nothing validates until enforcement time.
121
+ */
122
+ export declare function unresolvableOperations(operations: readonly GrantedOperation[], aliases: ReadonlySet<string>): GrantedOperation[];
123
+ /**
124
+ * Serializes a declared `can` into the wire allowlist — the ONE translation
125
+ * from what a developer writes to what the server stores and enforces.
126
+ *
127
+ * `wireNames` comes from {@link modelWireNames} over the client's own schema.
128
+ * It is required rather than optional: an omitted map silently mints the schema
129
+ * key verbatim, which is right for most models and wrong for every model with
130
+ * a type-name override — the kind of default that is correct until it isn't.
131
+ */
132
+ export declare function grantedOperations(can: Readonly<Record<string, readonly CapabilityOperation[] | undefined>>, wireNames: Readonly<Record<string, string>>): GrantedOperation[];
133
+ /**
134
+ * The grant at rest: what the credential ended up with, on both axes, plus the
135
+ * participant it acts as. The mint echoes this block, the key row stores it,
136
+ * and the gates read it — so a session's reported scope and its enforced scope
137
+ * are the same shape by construction.
138
+ */
139
+ export declare const capabilityScopeSchema: z.ZodObject<{
140
+ organizationId: z.ZodString;
141
+ syncGroups: z.ZodArray<z.ZodString>;
142
+ operations: z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>;
143
+ participantKind: z.ZodEnum<{
144
+ user: "user";
145
+ agent: "agent";
146
+ system: "system";
147
+ }>;
148
+ participantId: z.ZodString;
149
+ }, z.core.$strip>;
150
+ export type CapabilityScope = z.infer<typeof capabilityScopeSchema>;
151
+ /**
152
+ * What `POST /v1/capabilities` answers with — **201**, the credential is minted.
153
+ *
154
+ * This is the first call any non-TypeScript client makes, and until it had a
155
+ * schema the published contract described it as `{ type: 'object' }`: a caller
156
+ * working from the reference could see that a capability could be minted and
157
+ * not where the token was in the reply.
158
+ *
159
+ * `scope` echoes what was MINTED, not what was asked. A `wideScope` mint stores
160
+ * the org-wide default and read-your-writes widens the verb axis, so a client
161
+ * that assumed its request came back verbatim would report a scope narrower
162
+ * than the one being enforced.
163
+ *
164
+ * `userMeta` is the caller's own blob, echoed. Ablo has no view into their user
165
+ * directory — the API key is what is trusted — so this is deliberately open.
166
+ */
167
+ export declare const capabilityMintResponseSchema: z.ZodObject<{
168
+ capabilityId: z.ZodString;
169
+ token: z.ZodString;
170
+ expiresAt: z.ZodString;
171
+ organizationId: z.ZodString;
172
+ scope: z.ZodObject<{
173
+ organizationId: z.ZodString;
174
+ syncGroups: z.ZodArray<z.ZodString>;
175
+ operations: z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>;
176
+ participantKind: z.ZodEnum<{
177
+ user: "user";
178
+ agent: "agent";
179
+ system: "system";
180
+ }>;
181
+ participantId: z.ZodString;
182
+ }, z.core.$strip>;
183
+ userMeta: z.ZodRecord<z.ZodString, z.ZodUnknown>;
184
+ }, z.core.$strip>;
185
+ export type CapabilityMintResponse = z.infer<typeof capabilityMintResponseSchema>;
186
+ /**
187
+ * `POST /v1/capabilities` — mint a capability for a participant.
188
+ *
189
+ * Where an ephemeral key is a session for a person, a capability is a scoped,
190
+ * revocable grant for an agent or a system. Narrow by default: an agent or
191
+ * system capability must name its `operations` unless the caller explicitly
192
+ * asks for `wideScope`, which is itself privileged.
193
+ *
194
+ * This is the parsed body — the mint route validates against it rather than
195
+ * reading fields one at a time, so the shape and the validation rules cannot
196
+ * drift from each other or from the published contract.
197
+ */
198
+ export declare const capabilityRequestSchema: z.ZodObject<{
199
+ participantKind: z.ZodEnum<{
200
+ user: "user";
201
+ agent: "agent";
202
+ system: "system";
203
+ }>;
204
+ participantId: z.ZodOptional<z.ZodString>;
205
+ syncGroups: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodUnion<readonly [z.ZodLiteral<"default">, z.core.$ZodBranded<z.ZodTemplateLiteral<`${string}:${string}`>, "SyncGroup", "out">]>>>>;
206
+ operations: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodTemplateLiteral<`${string}.update` | `${string}.create` | `${string}.delete` | `${string}.read`>>>>;
207
+ ttlSeconds: z.ZodNumber;
208
+ label: z.ZodOptional<z.ZodString>;
209
+ wideScope: z.ZodOptional<z.ZodBoolean>;
210
+ userMeta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
211
+ }, z.core.$strip>;
212
+ export type CapabilityRequest = z.infer<typeof capabilityRequestSchema>;
@@ -0,0 +1,224 @@
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
+ * What `POST /v1/capabilities` answers with — **201**, the credential is minted.
162
+ *
163
+ * This is the first call any non-TypeScript client makes, and until it had a
164
+ * schema the published contract described it as `{ type: 'object' }`: a caller
165
+ * working from the reference could see that a capability could be minted and
166
+ * not where the token was in the reply.
167
+ *
168
+ * `scope` echoes what was MINTED, not what was asked. A `wideScope` mint stores
169
+ * the org-wide default and read-your-writes widens the verb axis, so a client
170
+ * that assumed its request came back verbatim would report a scope narrower
171
+ * than the one being enforced.
172
+ *
173
+ * `userMeta` is the caller's own blob, echoed. Ablo has no view into their user
174
+ * directory — the API key is what is trusted — so this is deliberately open.
175
+ */
176
+ export const capabilityMintResponseSchema = z.object({
177
+ capabilityId: z.string().min(1),
178
+ token: z.string().min(1),
179
+ /** ISO 8601. */
180
+ expiresAt: z.string().min(1),
181
+ organizationId: z.string().min(1),
182
+ scope: capabilityScopeSchema,
183
+ userMeta: z.record(z.string(), z.unknown()),
184
+ });
185
+ /**
186
+ * `POST /v1/capabilities` — mint a capability for a participant.
187
+ *
188
+ * Where an ephemeral key is a session for a person, a capability is a scoped,
189
+ * revocable grant for an agent or a system. Narrow by default: an agent or
190
+ * system capability must name its `operations` unless the caller explicitly
191
+ * asks for `wideScope`, which is itself privileged.
192
+ *
193
+ * This is the parsed body — the mint route validates against it rather than
194
+ * reading fields one at a time, so the shape and the validation rules cannot
195
+ * drift from each other or from the published contract.
196
+ */
197
+ export const capabilityRequestSchema = z.object({
198
+ participantKind: participantKindSchema,
199
+ participantId: z.string().min(1).optional(),
200
+ /**
201
+ * The ROW axis. Validated as the engine's branded sync-group form
202
+ * (`default` or `<namespace>:<id>`): a malformed group stored on the key row
203
+ * would subscribe the connection to NOTHING and fail silently at fan-out
204
+ * time, so it is rejected loudly at the boundary.
205
+ */
206
+ syncGroups: z.array(syncGroupInputSchema).readonly().optional(),
207
+ /** The VERB axis, as `model.verb` — e.g. `tasks.update`. */
208
+ operations: z.array(grantedOperationSchema).readonly().optional(),
209
+ ttlSeconds: z.number().int().positive(),
210
+ label: z.string().min(1).optional(),
211
+ /**
212
+ * Opt out of narrow-by-default scoping. Without it, agent and system
213
+ * capabilities require non-empty `operations`; with it, the caller must
214
+ * additionally hold an admin/owner role or present a secret key.
215
+ */
216
+ wideScope: z.boolean().optional(),
217
+ /**
218
+ * Caller-attested identity for the end user this capability acts for — the
219
+ * on-behalf-of pattern. Ablo does not validate it and has no view into the
220
+ * caller's user directory; the API key is what is trusted, and this blob is
221
+ * echoed back to the client.
222
+ */
223
+ userMeta: z.record(z.string(), z.unknown()).optional(),
224
+ });
@@ -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);