@abloatai/transaction 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (723) hide show
  1. package/CONVENTIONS.md +83 -0
  2. package/README.md +48 -0
  3. package/dist/ablo.d.ts +90 -0
  4. package/dist/ablo.d.ts.map +1 -0
  5. package/dist/ablo.js +34 -0
  6. package/dist/ablo.js.map +1 -0
  7. package/dist/ai-sdk/coordinatedTool.d.ts +123 -0
  8. package/dist/ai-sdk/coordinatedTool.d.ts.map +1 -0
  9. package/dist/ai-sdk/coordinatedTool.js +135 -0
  10. package/dist/ai-sdk/coordinatedTool.js.map +1 -0
  11. package/dist/ai-sdk/index.d.ts +2 -0
  12. package/dist/ai-sdk/index.d.ts.map +1 -0
  13. package/dist/ai-sdk/index.js +2 -0
  14. package/dist/ai-sdk/index.js.map +1 -0
  15. package/dist/auth/apiKey.d.ts +154 -0
  16. package/dist/auth/apiKey.d.ts.map +1 -0
  17. package/dist/auth/apiKey.js +408 -0
  18. package/dist/auth/apiKey.js.map +1 -0
  19. package/dist/auth/bootstrapScope.d.ts +16 -0
  20. package/dist/auth/bootstrapScope.d.ts.map +1 -0
  21. package/dist/auth/bootstrapScope.js +2 -0
  22. package/dist/auth/bootstrapScope.js.map +1 -0
  23. package/dist/auth/browserCredentialSafety.d.ts +7 -0
  24. package/dist/auth/browserCredentialSafety.d.ts.map +1 -0
  25. package/dist/auth/browserCredentialSafety.js +29 -0
  26. package/dist/auth/browserCredentialSafety.js.map +1 -0
  27. package/dist/auth/capability.d.ts +241 -0
  28. package/dist/auth/capability.d.ts.map +1 -0
  29. package/dist/auth/capability.js +253 -0
  30. package/dist/auth/capability.js.map +1 -0
  31. package/dist/auth/capabilityLifecycle.d.ts +47 -0
  32. package/dist/auth/capabilityLifecycle.d.ts.map +1 -0
  33. package/dist/auth/capabilityLifecycle.js +108 -0
  34. package/dist/auth/capabilityLifecycle.js.map +1 -0
  35. package/dist/auth/credentialEndpoint.d.ts +10 -0
  36. package/dist/auth/credentialEndpoint.d.ts.map +1 -0
  37. package/dist/auth/credentialEndpoint.js +58 -0
  38. package/dist/auth/credentialEndpoint.js.map +1 -0
  39. package/dist/auth/credentialEndpointProtocol.d.ts +24 -0
  40. package/dist/auth/credentialEndpointProtocol.d.ts.map +1 -0
  41. package/dist/auth/credentialEndpointProtocol.js +34 -0
  42. package/dist/auth/credentialEndpointProtocol.js.map +1 -0
  43. package/dist/auth/credentialKind.d.ts +4 -0
  44. package/dist/auth/credentialKind.d.ts.map +1 -0
  45. package/dist/auth/credentialKind.js +15 -0
  46. package/dist/auth/credentialKind.js.map +1 -0
  47. package/dist/auth/credentialPolicy.d.ts +141 -0
  48. package/dist/auth/credentialPolicy.d.ts.map +1 -0
  49. package/dist/auth/credentialPolicy.js +113 -0
  50. package/dist/auth/credentialPolicy.js.map +1 -0
  51. package/dist/auth/credentialResult.d.ts +7 -0
  52. package/dist/auth/credentialResult.d.ts.map +1 -0
  53. package/dist/auth/credentialResult.js +9 -0
  54. package/dist/auth/credentialResult.js.map +1 -0
  55. package/dist/auth/credentialSource.d.ts +31 -0
  56. package/dist/auth/credentialSource.d.ts.map +1 -0
  57. package/dist/auth/credentialSource.js +56 -0
  58. package/dist/auth/credentialSource.js.map +1 -0
  59. package/dist/auth/hostedEndpoints.d.ts +22 -0
  60. package/dist/auth/hostedEndpoints.d.ts.map +1 -0
  61. package/dist/auth/hostedEndpoints.js +22 -0
  62. package/dist/auth/hostedEndpoints.js.map +1 -0
  63. package/dist/auth/identity.d.ts +62 -0
  64. package/dist/auth/identity.d.ts.map +1 -0
  65. package/dist/auth/identity.js +224 -0
  66. package/dist/auth/identity.js.map +1 -0
  67. package/dist/auth/index.d.ts +189 -0
  68. package/dist/auth/index.d.ts.map +1 -0
  69. package/dist/auth/index.js +312 -0
  70. package/dist/auth/index.js.map +1 -0
  71. package/dist/auth/schemas.d.ts +41 -0
  72. package/dist/auth/schemas.d.ts.map +1 -0
  73. package/dist/auth/schemas.js +69 -0
  74. package/dist/auth/schemas.js.map +1 -0
  75. package/dist/auth/sessionMint.d.ts +29 -0
  76. package/dist/auth/sessionMint.d.ts.map +1 -0
  77. package/dist/auth/sessionMint.js +92 -0
  78. package/dist/auth/sessionMint.js.map +1 -0
  79. package/dist/auth/token.d.ts +4 -0
  80. package/dist/auth/token.d.ts.map +1 -0
  81. package/dist/auth/token.js +4 -0
  82. package/dist/auth/token.js.map +1 -0
  83. package/dist/batching/index.d.ts +56 -0
  84. package/dist/batching/index.d.ts.map +1 -0
  85. package/dist/batching/index.js +148 -0
  86. package/dist/batching/index.js.map +1 -0
  87. package/dist/coordination/awaitClaimGrant.d.ts +57 -0
  88. package/dist/coordination/awaitClaimGrant.d.ts.map +1 -0
  89. package/dist/coordination/awaitClaimGrant.js +138 -0
  90. package/dist/coordination/awaitClaimGrant.js.map +1 -0
  91. package/dist/coordination/claimHeartbeatLoop.d.ts +85 -0
  92. package/dist/coordination/claimHeartbeatLoop.d.ts.map +1 -0
  93. package/dist/coordination/claimHeartbeatLoop.js +109 -0
  94. package/dist/coordination/claimHeartbeatLoop.js.map +1 -0
  95. package/dist/coordination/claimMeta.d.ts +50 -0
  96. package/dist/coordination/claimMeta.d.ts.map +1 -0
  97. package/dist/coordination/claimMeta.js +53 -0
  98. package/dist/coordination/claimMeta.js.map +1 -0
  99. package/dist/coordination/events.d.ts +75 -0
  100. package/dist/coordination/events.d.ts.map +1 -0
  101. package/dist/coordination/events.js +8 -0
  102. package/dist/coordination/events.js.map +1 -0
  103. package/dist/coordination/index.d.ts +20 -0
  104. package/dist/coordination/index.d.ts.map +1 -0
  105. package/dist/coordination/index.js +46 -0
  106. package/dist/coordination/index.js.map +1 -0
  107. package/dist/coordination/locator.d.ts +106 -0
  108. package/dist/coordination/locator.d.ts.map +1 -0
  109. package/dist/coordination/locator.js +110 -0
  110. package/dist/coordination/locator.js.map +1 -0
  111. package/dist/coordination/schema.d.ts +1332 -0
  112. package/dist/coordination/schema.d.ts.map +1 -0
  113. package/dist/coordination/schema.js +1137 -0
  114. package/dist/coordination/schema.js.map +1 -0
  115. package/dist/coordination/targetConflict.d.ts +3 -0
  116. package/dist/coordination/targetConflict.d.ts.map +1 -0
  117. package/dist/coordination/targetConflict.js +74 -0
  118. package/dist/coordination/targetConflict.js.map +1 -0
  119. package/dist/coordination/trace.d.ts +79 -0
  120. package/dist/coordination/trace.d.ts.map +1 -0
  121. package/dist/coordination/trace.js +139 -0
  122. package/dist/coordination/trace.js.map +1 -0
  123. package/dist/docs/catalog.d.ts +73 -0
  124. package/dist/docs/catalog.d.ts.map +1 -0
  125. package/dist/docs/catalog.js +231 -0
  126. package/dist/docs/catalog.js.map +1 -0
  127. package/dist/docs/index.d.ts +11 -0
  128. package/dist/docs/index.d.ts.map +1 -0
  129. package/dist/docs/index.js +11 -0
  130. package/dist/docs/index.js.map +1 -0
  131. package/dist/durableWrites.d.ts +63 -0
  132. package/dist/durableWrites.d.ts.map +1 -0
  133. package/dist/durableWrites.js +72 -0
  134. package/dist/durableWrites.js.map +1 -0
  135. package/dist/environment.d.ts +106 -0
  136. package/dist/environment.d.ts.map +1 -0
  137. package/dist/environment.js +109 -0
  138. package/dist/environment.js.map +1 -0
  139. package/dist/errorCodes.d.ts +411 -0
  140. package/dist/errorCodes.d.ts.map +1 -0
  141. package/dist/errorCodes.js +500 -0
  142. package/dist/errorCodes.js.map +1 -0
  143. package/dist/errors.d.ts +429 -0
  144. package/dist/errors.d.ts.map +1 -0
  145. package/dist/errors.js +687 -0
  146. package/dist/errors.js.map +1 -0
  147. package/dist/footprint.d.ts +112 -0
  148. package/dist/footprint.d.ts.map +1 -0
  149. package/dist/footprint.js +0 -0
  150. package/dist/footprint.js.map +1 -0
  151. package/dist/headlessClient.d.ts +10 -0
  152. package/dist/headlessClient.d.ts.map +1 -0
  153. package/dist/headlessClient.js +114 -0
  154. package/dist/headlessClient.js.map +1 -0
  155. package/dist/index.d.ts +21 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +21 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/keys/index.d.ts +88 -0
  160. package/dist/keys/index.d.ts.map +1 -0
  161. package/dist/keys/index.js +208 -0
  162. package/dist/keys/index.js.map +1 -0
  163. package/dist/log/syncDeltaRow.d.ts +159 -0
  164. package/dist/log/syncDeltaRow.d.ts.map +1 -0
  165. package/dist/log/syncDeltaRow.js +96 -0
  166. package/dist/log/syncDeltaRow.js.map +1 -0
  167. package/dist/logger.d.ts +17 -0
  168. package/dist/logger.d.ts.map +1 -0
  169. package/dist/logger.js +8 -0
  170. package/dist/logger.js.map +1 -0
  171. package/dist/observability.d.ts +54 -0
  172. package/dist/observability.d.ts.map +1 -0
  173. package/dist/observability.js +20 -0
  174. package/dist/observability.js.map +1 -0
  175. package/dist/policy/types.d.ts +218 -0
  176. package/dist/policy/types.d.ts.map +1 -0
  177. package/dist/policy/types.js +127 -0
  178. package/dist/policy/types.js.map +1 -0
  179. package/dist/resources/functionalUpdate.d.ts +80 -0
  180. package/dist/resources/functionalUpdate.d.ts.map +1 -0
  181. package/dist/resources/functionalUpdate.js +88 -0
  182. package/dist/resources/functionalUpdate.js.map +1 -0
  183. package/dist/resources/httpResources.d.ts +449 -0
  184. package/dist/resources/httpResources.d.ts.map +1 -0
  185. package/dist/resources/httpResources.js +8 -0
  186. package/dist/resources/httpResources.js.map +1 -0
  187. package/dist/resources/modelOperations.d.ts +380 -0
  188. package/dist/resources/modelOperations.d.ts.map +1 -0
  189. package/dist/resources/modelOperations.js +13 -0
  190. package/dist/resources/modelOperations.js.map +1 -0
  191. package/dist/resources/mutationOptions.d.ts +67 -0
  192. package/dist/resources/mutationOptions.d.ts.map +1 -0
  193. package/dist/resources/mutationOptions.js +10 -0
  194. package/dist/resources/mutationOptions.js.map +1 -0
  195. package/dist/resources/where.d.ts +102 -0
  196. package/dist/resources/where.d.ts.map +1 -0
  197. package/dist/resources/where.js +116 -0
  198. package/dist/resources/where.js.map +1 -0
  199. package/dist/resources/writeOptionsSchema.d.ts +48 -0
  200. package/dist/resources/writeOptionsSchema.d.ts.map +1 -0
  201. package/dist/resources/writeOptionsSchema.js +74 -0
  202. package/dist/resources/writeOptionsSchema.js.map +1 -0
  203. package/dist/schema/coordination.d.ts +113 -0
  204. package/dist/schema/coordination.d.ts.map +1 -0
  205. package/dist/schema/coordination.js +134 -0
  206. package/dist/schema/coordination.js.map +1 -0
  207. package/dist/schema/ddl.d.ts +98 -0
  208. package/dist/schema/ddl.d.ts.map +1 -0
  209. package/dist/schema/ddl.js +492 -0
  210. package/dist/schema/ddl.js.map +1 -0
  211. package/dist/schema/ddlLock.d.ts +36 -0
  212. package/dist/schema/ddlLock.d.ts.map +1 -0
  213. package/dist/schema/ddlLock.js +47 -0
  214. package/dist/schema/ddlLock.js.map +1 -0
  215. package/dist/schema/diff.d.ts +226 -0
  216. package/dist/schema/diff.d.ts.map +1 -0
  217. package/dist/schema/diff.js +290 -0
  218. package/dist/schema/diff.js.map +1 -0
  219. package/dist/schema/field.d.ts +121 -0
  220. package/dist/schema/field.d.ts.map +1 -0
  221. package/dist/schema/field.js +266 -0
  222. package/dist/schema/field.js.map +1 -0
  223. package/dist/schema/fieldRef.d.ts +58 -0
  224. package/dist/schema/fieldRef.d.ts.map +1 -0
  225. package/dist/schema/fieldRef.js +26 -0
  226. package/dist/schema/fieldRef.js.map +1 -0
  227. package/dist/schema/generate.d.ts +20 -0
  228. package/dist/schema/generate.d.ts.map +1 -0
  229. package/dist/schema/generate.js +87 -0
  230. package/dist/schema/generate.js.map +1 -0
  231. package/dist/schema/index.d.ts +43 -0
  232. package/dist/schema/index.d.ts.map +1 -0
  233. package/dist/schema/index.js +81 -0
  234. package/dist/schema/index.js.map +1 -0
  235. package/dist/schema/loadStrategy.d.ts +46 -0
  236. package/dist/schema/loadStrategy.d.ts.map +1 -0
  237. package/dist/schema/loadStrategy.js +47 -0
  238. package/dist/schema/loadStrategy.js.map +1 -0
  239. package/dist/schema/model.d.ts +380 -0
  240. package/dist/schema/model.d.ts.map +1 -0
  241. package/dist/schema/model.js +124 -0
  242. package/dist/schema/model.js.map +1 -0
  243. package/dist/schema/openapi.d.ts +59 -0
  244. package/dist/schema/openapi.d.ts.map +1 -0
  245. package/dist/schema/openapi.js +508 -0
  246. package/dist/schema/openapi.js.map +1 -0
  247. package/dist/schema/queries.d.ts +202 -0
  248. package/dist/schema/queries.d.ts.map +1 -0
  249. package/dist/schema/queries.js +144 -0
  250. package/dist/schema/queries.js.map +1 -0
  251. package/dist/schema/relation.d.ts +205 -0
  252. package/dist/schema/relation.d.ts.map +1 -0
  253. package/dist/schema/relation.js +105 -0
  254. package/dist/schema/relation.js.map +1 -0
  255. package/dist/schema/residency.d.ts +30 -0
  256. package/dist/schema/residency.d.ts.map +1 -0
  257. package/dist/schema/residency.js +26 -0
  258. package/dist/schema/residency.js.map +1 -0
  259. package/dist/schema/roles.d.ts +250 -0
  260. package/dist/schema/roles.d.ts.map +1 -0
  261. package/dist/schema/roles.js +231 -0
  262. package/dist/schema/roles.js.map +1 -0
  263. package/dist/schema/schema.d.ts +352 -0
  264. package/dist/schema/schema.d.ts.map +1 -0
  265. package/dist/schema/schema.js +326 -0
  266. package/dist/schema/schema.js.map +1 -0
  267. package/dist/schema/select.d.ts +41 -0
  268. package/dist/schema/select.d.ts.map +1 -0
  269. package/dist/schema/select.js +91 -0
  270. package/dist/schema/select.js.map +1 -0
  271. package/dist/schema/serialize.d.ts +116 -0
  272. package/dist/schema/serialize.d.ts.map +1 -0
  273. package/dist/schema/serialize.js +278 -0
  274. package/dist/schema/serialize.js.map +1 -0
  275. package/dist/schema/sugar.d.ts +110 -0
  276. package/dist/schema/sugar.d.ts.map +1 -0
  277. package/dist/schema/sugar.js +84 -0
  278. package/dist/schema/sugar.js.map +1 -0
  279. package/dist/schema/tenancy.d.ts +140 -0
  280. package/dist/schema/tenancy.d.ts.map +1 -0
  281. package/dist/schema/tenancy.js +191 -0
  282. package/dist/schema/tenancy.js.map +1 -0
  283. package/dist/server/adapter.d.ts +174 -0
  284. package/dist/server/adapter.d.ts.map +1 -0
  285. package/dist/server/adapter.js +19 -0
  286. package/dist/server/adapter.js.map +1 -0
  287. package/dist/server/commit.d.ts +108 -0
  288. package/dist/server/commit.d.ts.map +1 -0
  289. package/dist/server/commit.js +2 -0
  290. package/dist/server/commit.js.map +1 -0
  291. package/dist/server/index.d.ts +15 -0
  292. package/dist/server/index.d.ts.map +1 -0
  293. package/dist/server/index.js +3 -0
  294. package/dist/server/index.js.map +1 -0
  295. package/dist/server/readConfig.d.ts +81 -0
  296. package/dist/server/readConfig.d.ts.map +1 -0
  297. package/dist/server/readConfig.js +9 -0
  298. package/dist/server/readConfig.js.map +1 -0
  299. package/dist/server/storageMode.d.ts +24 -0
  300. package/dist/server/storageMode.d.ts.map +1 -0
  301. package/dist/server/storageMode.js +18 -0
  302. package/dist/server/storageMode.js.map +1 -0
  303. package/dist/source/adapter.d.ts +84 -0
  304. package/dist/source/adapter.d.ts.map +1 -0
  305. package/dist/source/adapter.js +25 -0
  306. package/dist/source/adapter.js.map +1 -0
  307. package/dist/source/adapters/drizzle.d.ts +49 -0
  308. package/dist/source/adapters/drizzle.d.ts.map +1 -0
  309. package/dist/source/adapters/drizzle.js +220 -0
  310. package/dist/source/adapters/drizzle.js.map +1 -0
  311. package/dist/source/adapters/kysely.d.ts +43 -0
  312. package/dist/source/adapters/kysely.d.ts.map +1 -0
  313. package/dist/source/adapters/kysely.js +206 -0
  314. package/dist/source/adapters/kysely.js.map +1 -0
  315. package/dist/source/adapters/kyselyMutationCore.d.ts +77 -0
  316. package/dist/source/adapters/kyselyMutationCore.d.ts.map +1 -0
  317. package/dist/source/adapters/kyselyMutationCore.js +126 -0
  318. package/dist/source/adapters/kyselyMutationCore.js.map +1 -0
  319. package/dist/source/adapters/memory.d.ts +14 -0
  320. package/dist/source/adapters/memory.d.ts.map +1 -0
  321. package/dist/source/adapters/memory.js +131 -0
  322. package/dist/source/adapters/memory.js.map +1 -0
  323. package/dist/source/adapters/prisma.d.ts +64 -0
  324. package/dist/source/adapters/prisma.d.ts.map +1 -0
  325. package/dist/source/adapters/prisma.js +203 -0
  326. package/dist/source/adapters/prisma.js.map +1 -0
  327. package/dist/source/conformance.d.ts +38 -0
  328. package/dist/source/conformance.d.ts.map +1 -0
  329. package/dist/source/conformance.js +216 -0
  330. package/dist/source/conformance.js.map +1 -0
  331. package/dist/source/connector.d.ts +96 -0
  332. package/dist/source/connector.d.ts.map +1 -0
  333. package/dist/source/connector.js +267 -0
  334. package/dist/source/connector.js.map +1 -0
  335. package/dist/source/connectorProtocol.d.ts +155 -0
  336. package/dist/source/connectorProtocol.d.ts.map +1 -0
  337. package/dist/source/connectorProtocol.js +164 -0
  338. package/dist/source/connectorProtocol.js.map +1 -0
  339. package/dist/source/contract.d.ts +196 -0
  340. package/dist/source/contract.d.ts.map +1 -0
  341. package/dist/source/contract.js +165 -0
  342. package/dist/source/contract.js.map +1 -0
  343. package/dist/source/drizzle.d.ts +2 -0
  344. package/dist/source/drizzle.d.ts.map +1 -0
  345. package/dist/source/drizzle.js +2 -0
  346. package/dist/source/drizzle.js.map +1 -0
  347. package/dist/source/factory.d.ts +93 -0
  348. package/dist/source/factory.d.ts.map +1 -0
  349. package/dist/source/factory.js +287 -0
  350. package/dist/source/factory.js.map +1 -0
  351. package/dist/source/idempotency.d.ts +62 -0
  352. package/dist/source/idempotency.d.ts.map +1 -0
  353. package/dist/source/idempotency.js +145 -0
  354. package/dist/source/idempotency.js.map +1 -0
  355. package/dist/source/index.d.ts +24 -0
  356. package/dist/source/index.d.ts.map +1 -0
  357. package/dist/source/index.js +29 -0
  358. package/dist/source/index.js.map +1 -0
  359. package/dist/source/kysely.d.ts +3 -0
  360. package/dist/source/kysely.d.ts.map +1 -0
  361. package/dist/source/kysely.js +3 -0
  362. package/dist/source/kysely.js.map +1 -0
  363. package/dist/source/migrations.d.ts +22 -0
  364. package/dist/source/migrations.d.ts.map +1 -0
  365. package/dist/source/migrations.js +104 -0
  366. package/dist/source/migrations.js.map +1 -0
  367. package/dist/source/next.d.ts +33 -0
  368. package/dist/source/next.d.ts.map +1 -0
  369. package/dist/source/next.js +26 -0
  370. package/dist/source/next.js.map +1 -0
  371. package/dist/source/pushQueue.d.ts +135 -0
  372. package/dist/source/pushQueue.d.ts.map +1 -0
  373. package/dist/source/pushQueue.js +257 -0
  374. package/dist/source/pushQueue.js.map +1 -0
  375. package/dist/source/signing.d.ts +93 -0
  376. package/dist/source/signing.d.ts.map +1 -0
  377. package/dist/source/signing.js +163 -0
  378. package/dist/source/signing.js.map +1 -0
  379. package/dist/source/types.d.ts +402 -0
  380. package/dist/source/types.d.ts.map +1 -0
  381. package/dist/source/types.js +60 -0
  382. package/dist/source/types.js.map +1 -0
  383. package/dist/syncLog/contract.d.ts +21 -0
  384. package/dist/syncLog/contract.d.ts.map +1 -0
  385. package/dist/syncLog/contract.js +20 -0
  386. package/dist/syncLog/contract.js.map +1 -0
  387. package/dist/syncLog/index.d.ts +2 -0
  388. package/dist/syncLog/index.d.ts.map +1 -0
  389. package/dist/syncLog/index.js +2 -0
  390. package/dist/syncLog/index.js.map +1 -0
  391. package/dist/testing/fixtures/httpResponses.d.ts +74 -0
  392. package/dist/testing/fixtures/httpResponses.d.ts.map +1 -0
  393. package/dist/testing/fixtures/httpResponses.js +102 -0
  394. package/dist/testing/fixtures/httpResponses.js.map +1 -0
  395. package/dist/transactionLayer.d.ts +110 -0
  396. package/dist/transactionLayer.d.ts.map +1 -0
  397. package/dist/transactionLayer.js +25 -0
  398. package/dist/transactionLayer.js.map +1 -0
  399. package/dist/transactions/settlement/commitEnvelope.d.ts +144 -0
  400. package/dist/transactions/settlement/commitEnvelope.d.ts.map +1 -0
  401. package/dist/transactions/settlement/commitEnvelope.js +162 -0
  402. package/dist/transactions/settlement/commitEnvelope.js.map +1 -0
  403. package/dist/transactions/settlement/httpCommitEnvelope.d.ts +54 -0
  404. package/dist/transactions/settlement/httpCommitEnvelope.d.ts.map +1 -0
  405. package/dist/transactions/settlement/httpCommitEnvelope.js +208 -0
  406. package/dist/transactions/settlement/httpCommitEnvelope.js.map +1 -0
  407. package/dist/transactions/settlement/idempotencyKey.d.ts +11 -0
  408. package/dist/transactions/settlement/idempotencyKey.d.ts.map +1 -0
  409. package/dist/transactions/settlement/idempotencyKey.js +10 -0
  410. package/dist/transactions/settlement/idempotencyKey.js.map +1 -0
  411. package/dist/transactions/settlement/pendingWrite.d.ts +113 -0
  412. package/dist/transactions/settlement/pendingWrite.d.ts.map +1 -0
  413. package/dist/transactions/settlement/pendingWrite.js +21 -0
  414. package/dist/transactions/settlement/pendingWrite.js.map +1 -0
  415. package/dist/transport/commitFrames.d.ts +91 -0
  416. package/dist/transport/commitFrames.d.ts.map +1 -0
  417. package/dist/transport/commitFrames.js +135 -0
  418. package/dist/transport/commitFrames.js.map +1 -0
  419. package/dist/transport/connectionManager.d.ts +216 -0
  420. package/dist/transport/connectionManager.d.ts.map +1 -0
  421. package/dist/transport/connectionManager.js +674 -0
  422. package/dist/transport/connectionManager.js.map +1 -0
  423. package/dist/transport/credentialLifecycle.d.ts +178 -0
  424. package/dist/transport/credentialLifecycle.d.ts.map +1 -0
  425. package/dist/transport/credentialLifecycle.js +324 -0
  426. package/dist/transport/credentialLifecycle.js.map +1 -0
  427. package/dist/transport/heartbeat.d.ts +66 -0
  428. package/dist/transport/heartbeat.d.ts.map +1 -0
  429. package/dist/transport/heartbeat.js +94 -0
  430. package/dist/transport/heartbeat.js.map +1 -0
  431. package/dist/transport/httpClient.d.ts +143 -0
  432. package/dist/transport/httpClient.d.ts.map +1 -0
  433. package/dist/transport/httpClient.js +150 -0
  434. package/dist/transport/httpClient.js.map +1 -0
  435. package/dist/transport/httpFeed.d.ts +4 -0
  436. package/dist/transport/httpFeed.d.ts.map +1 -0
  437. package/dist/transport/httpFeed.js +94 -0
  438. package/dist/transport/httpFeed.js.map +1 -0
  439. package/dist/transport/httpOptions.d.ts +34 -0
  440. package/dist/transport/httpOptions.d.ts.map +1 -0
  441. package/dist/transport/httpOptions.js +13 -0
  442. package/dist/transport/httpOptions.js.map +1 -0
  443. package/dist/transport/httpTransport.d.ts +68 -0
  444. package/dist/transport/httpTransport.d.ts.map +1 -0
  445. package/dist/transport/httpTransport.js +1433 -0
  446. package/dist/transport/httpTransport.js.map +1 -0
  447. package/dist/transport/networkProbe.d.ts +85 -0
  448. package/dist/transport/networkProbe.d.ts.map +1 -0
  449. package/dist/transport/networkProbe.js +208 -0
  450. package/dist/transport/networkProbe.js.map +1 -0
  451. package/dist/transport/wsFrameHandlers.d.ts +129 -0
  452. package/dist/transport/wsFrameHandlers.d.ts.map +1 -0
  453. package/dist/transport/wsFrameHandlers.js +429 -0
  454. package/dist/transport/wsFrameHandlers.js.map +1 -0
  455. package/dist/transport/wsTransport.d.ts +575 -0
  456. package/dist/transport/wsTransport.d.ts.map +1 -0
  457. package/dist/transport/wsTransport.js +1024 -0
  458. package/dist/transport/wsTransport.js.map +1 -0
  459. package/dist/types/assertExact.d.ts +18 -0
  460. package/dist/types/assertExact.d.ts.map +1 -0
  461. package/dist/types/assertExact.js +2 -0
  462. package/dist/types/assertExact.js.map +1 -0
  463. package/dist/types/global.d.ts +108 -0
  464. package/dist/types/global.d.ts.map +1 -0
  465. package/dist/types/global.js +41 -0
  466. package/dist/types/global.js.map +1 -0
  467. package/dist/types/index.d.ts +206 -0
  468. package/dist/types/index.d.ts.map +1 -0
  469. package/dist/types/index.js +57 -0
  470. package/dist/types/index.js.map +1 -0
  471. package/dist/types/modelData.d.ts +11 -0
  472. package/dist/types/modelData.d.ts.map +1 -0
  473. package/dist/types/modelData.js +10 -0
  474. package/dist/types/modelData.js.map +1 -0
  475. package/dist/types/participant.d.ts +21 -0
  476. package/dist/types/participant.d.ts.map +1 -0
  477. package/dist/types/participant.js +11 -0
  478. package/dist/types/participant.js.map +1 -0
  479. package/dist/types/streams.d.ts +545 -0
  480. package/dist/types/streams.d.ts.map +1 -0
  481. package/dist/types/streams.js +12 -0
  482. package/dist/types/streams.js.map +1 -0
  483. package/dist/utils/asyncIterator.d.ts +35 -0
  484. package/dist/utils/asyncIterator.d.ts.map +1 -0
  485. package/dist/utils/asyncIterator.js +136 -0
  486. package/dist/utils/asyncIterator.js.map +1 -0
  487. package/dist/utils/duration.d.ts +51 -0
  488. package/dist/utils/duration.d.ts.map +1 -0
  489. package/dist/utils/duration.js +78 -0
  490. package/dist/utils/duration.js.map +1 -0
  491. package/dist/utils/json.d.ts +58 -0
  492. package/dist/utils/json.d.ts.map +1 -0
  493. package/dist/utils/json.js +277 -0
  494. package/dist/utils/json.js.map +1 -0
  495. package/dist/webhooks/events.d.ts +44 -0
  496. package/dist/webhooks/events.d.ts.map +1 -0
  497. package/dist/webhooks/events.js +43 -0
  498. package/dist/webhooks/events.js.map +1 -0
  499. package/dist/webhooks/index.d.ts +9 -0
  500. package/dist/webhooks/index.d.ts.map +1 -0
  501. package/dist/webhooks/index.js +9 -0
  502. package/dist/webhooks/index.js.map +1 -0
  503. package/dist/wire/accountResponses.d.ts +463 -0
  504. package/dist/wire/accountResponses.d.ts.map +1 -0
  505. package/dist/wire/accountResponses.js +294 -0
  506. package/dist/wire/accountResponses.js.map +1 -0
  507. package/dist/wire/auth.d.ts +57 -0
  508. package/dist/wire/auth.d.ts.map +1 -0
  509. package/dist/wire/auth.js +71 -0
  510. package/dist/wire/auth.js.map +1 -0
  511. package/dist/wire/bootstrapReason.d.ts +10 -0
  512. package/dist/wire/bootstrapReason.d.ts.map +1 -0
  513. package/dist/wire/bootstrapReason.js +9 -0
  514. package/dist/wire/bootstrapReason.js.map +1 -0
  515. package/dist/wire/claimEvent.d.ts +70 -0
  516. package/dist/wire/claimEvent.d.ts.map +1 -0
  517. package/dist/wire/claimEvent.js +74 -0
  518. package/dist/wire/claimEvent.js.map +1 -0
  519. package/dist/wire/claims.d.ts +475 -0
  520. package/dist/wire/claims.d.ts.map +1 -0
  521. package/dist/wire/claims.js +326 -0
  522. package/dist/wire/claims.js.map +1 -0
  523. package/dist/wire/commit.d.ts +604 -0
  524. package/dist/wire/commit.d.ts.map +1 -0
  525. package/dist/wire/commit.js +322 -0
  526. package/dist/wire/commit.js.map +1 -0
  527. package/dist/wire/delta.d.ts +251 -0
  528. package/dist/wire/delta.d.ts.map +1 -0
  529. package/dist/wire/delta.js +148 -0
  530. package/dist/wire/delta.js.map +1 -0
  531. package/dist/wire/errorEnvelope.d.ts +73 -0
  532. package/dist/wire/errorEnvelope.d.ts.map +1 -0
  533. package/dist/wire/errorEnvelope.js +124 -0
  534. package/dist/wire/errorEnvelope.js.map +1 -0
  535. package/dist/wire/feedCursor.d.ts +61 -0
  536. package/dist/wire/feedCursor.d.ts.map +1 -0
  537. package/dist/wire/feedCursor.js +83 -0
  538. package/dist/wire/feedCursor.js.map +1 -0
  539. package/dist/wire/feedEvent.d.ts +264 -0
  540. package/dist/wire/feedEvent.d.ts.map +1 -0
  541. package/dist/wire/feedEvent.js +66 -0
  542. package/dist/wire/feedEvent.js.map +1 -0
  543. package/dist/wire/frames.d.ts +195 -0
  544. package/dist/wire/frames.d.ts.map +1 -0
  545. package/dist/wire/frames.js +51 -0
  546. package/dist/wire/frames.js.map +1 -0
  547. package/dist/wire/inboundFrames.d.ts +490 -0
  548. package/dist/wire/inboundFrames.d.ts.map +1 -0
  549. package/dist/wire/inboundFrames.js +117 -0
  550. package/dist/wire/inboundFrames.js.map +1 -0
  551. package/dist/wire/index.d.ts +55 -0
  552. package/dist/wire/index.d.ts.map +1 -0
  553. package/dist/wire/index.js +84 -0
  554. package/dist/wire/index.js.map +1 -0
  555. package/dist/wire/listEnvelope.d.ts +38 -0
  556. package/dist/wire/listEnvelope.d.ts.map +1 -0
  557. package/dist/wire/listEnvelope.js +43 -0
  558. package/dist/wire/listEnvelope.js.map +1 -0
  559. package/dist/wire/modelMutations.d.ts +32 -0
  560. package/dist/wire/modelMutations.d.ts.map +1 -0
  561. package/dist/wire/modelMutations.js +53 -0
  562. package/dist/wire/modelMutations.js.map +1 -0
  563. package/dist/wire/modelResponses.d.ts +79 -0
  564. package/dist/wire/modelResponses.d.ts.map +1 -0
  565. package/dist/wire/modelResponses.js +44 -0
  566. package/dist/wire/modelResponses.js.map +1 -0
  567. package/dist/wire/modelShape.d.ts +79 -0
  568. package/dist/wire/modelShape.d.ts.map +1 -0
  569. package/dist/wire/modelShape.js +75 -0
  570. package/dist/wire/modelShape.js.map +1 -0
  571. package/dist/wire/protocol.d.ts +39 -0
  572. package/dist/wire/protocol.d.ts.map +1 -0
  573. package/dist/wire/protocol.js +39 -0
  574. package/dist/wire/protocol.js.map +1 -0
  575. package/dist/wire/protocolVersion.d.ts +74 -0
  576. package/dist/wire/protocolVersion.d.ts.map +1 -0
  577. package/dist/wire/protocolVersion.js +84 -0
  578. package/dist/wire/protocolVersion.js.map +1 -0
  579. package/package.json +187 -0
  580. package/src/ablo.ts +139 -0
  581. package/src/ai-sdk/coordinatedTool.ts +214 -0
  582. package/src/ai-sdk/index.ts +7 -0
  583. package/src/auth/apiKey.ts +540 -0
  584. package/src/auth/bootstrapScope.ts +15 -0
  585. package/src/auth/browserCredentialSafety.ts +48 -0
  586. package/src/auth/capability.ts +326 -0
  587. package/src/auth/capabilityLifecycle.ts +174 -0
  588. package/src/auth/credentialEndpoint.ts +79 -0
  589. package/src/auth/credentialEndpointProtocol.ts +51 -0
  590. package/src/auth/credentialKind.ts +20 -0
  591. package/src/auth/credentialPolicy.ts +244 -0
  592. package/src/auth/credentialResult.ts +23 -0
  593. package/src/auth/credentialSource.ts +99 -0
  594. package/src/auth/hostedEndpoints.ts +24 -0
  595. package/src/auth/identity.ts +330 -0
  596. package/src/auth/index.ts +592 -0
  597. package/src/auth/schemas.ts +94 -0
  598. package/src/auth/sessionMint.ts +126 -0
  599. package/src/auth/token.ts +4 -0
  600. package/src/batching/index.ts +200 -0
  601. package/src/coordination/awaitClaimGrant.ts +243 -0
  602. package/src/coordination/claimHeartbeatLoop.ts +165 -0
  603. package/src/coordination/claimMeta.ts +56 -0
  604. package/src/coordination/events.ts +86 -0
  605. package/src/coordination/index.ts +181 -0
  606. package/src/coordination/locator.ts +200 -0
  607. package/src/coordination/schema.ts +1346 -0
  608. package/src/coordination/targetConflict.ts +85 -0
  609. package/src/coordination/trace.ts +173 -0
  610. package/src/docs/catalog.ts +274 -0
  611. package/src/docs/index.ts +18 -0
  612. package/src/durableWrites.ts +134 -0
  613. package/src/environment.ts +132 -0
  614. package/src/errorCodes.ts +1591 -0
  615. package/src/errors.ts +918 -0
  616. package/src/footprint.ts +0 -0
  617. package/src/headlessClient.ts +161 -0
  618. package/src/index.ts +52 -0
  619. package/src/keys/index.ts +254 -0
  620. package/src/log/syncDeltaRow.ts +119 -0
  621. package/src/logger.ts +22 -0
  622. package/src/observability.ts +85 -0
  623. package/src/policy/types.ts +292 -0
  624. package/src/resources/functionalUpdate.ts +151 -0
  625. package/src/resources/httpResources.ts +520 -0
  626. package/src/resources/modelOperations.ts +444 -0
  627. package/src/resources/mutationOptions.ts +66 -0
  628. package/src/resources/where.ts +160 -0
  629. package/src/resources/writeOptionsSchema.ts +91 -0
  630. package/src/schema/coordination.ts +161 -0
  631. package/src/schema/ddl.ts +593 -0
  632. package/src/schema/ddlLock.ts +53 -0
  633. package/src/schema/diff.ts +489 -0
  634. package/src/schema/field.ts +321 -0
  635. package/src/schema/fieldRef.ts +88 -0
  636. package/src/schema/generate.ts +95 -0
  637. package/src/schema/index.ts +278 -0
  638. package/src/schema/loadStrategy.ts +52 -0
  639. package/src/schema/model.ts +476 -0
  640. package/src/schema/openapi.ts +658 -0
  641. package/src/schema/queries.ts +273 -0
  642. package/src/schema/relation.ts +291 -0
  643. package/src/schema/residency.ts +30 -0
  644. package/src/schema/roles.ts +325 -0
  645. package/src/schema/schema.ts +825 -0
  646. package/src/schema/select.ts +115 -0
  647. package/src/schema/serialize.ts +373 -0
  648. package/src/schema/sugar.ts +194 -0
  649. package/src/schema/tenancy.ts +221 -0
  650. package/src/server/adapter.ts +203 -0
  651. package/src/server/commit.ts +109 -0
  652. package/src/server/index.ts +26 -0
  653. package/src/server/readConfig.ts +82 -0
  654. package/src/server/storageMode.ts +20 -0
  655. package/src/source/adapter.ts +85 -0
  656. package/src/source/adapters/drizzle.ts +291 -0
  657. package/src/source/adapters/kysely.ts +346 -0
  658. package/src/source/adapters/kyselyMutationCore.ts +220 -0
  659. package/src/source/adapters/memory.ts +154 -0
  660. package/src/source/adapters/prisma.ts +282 -0
  661. package/src/source/conformance.ts +287 -0
  662. package/src/source/connector.ts +394 -0
  663. package/src/source/connectorProtocol.ts +189 -0
  664. package/src/source/contract.ts +221 -0
  665. package/src/source/drizzle.ts +1 -0
  666. package/src/source/factory.ts +444 -0
  667. package/src/source/idempotency.ts +189 -0
  668. package/src/source/index.ts +182 -0
  669. package/src/source/kysely.ts +2 -0
  670. package/src/source/migrations.ts +109 -0
  671. package/src/source/next.ts +38 -0
  672. package/src/source/pushQueue.ts +368 -0
  673. package/src/source/signing.ts +279 -0
  674. package/src/source/types.ts +502 -0
  675. package/src/syncLog/contract.ts +32 -0
  676. package/src/syncLog/index.ts +1 -0
  677. package/src/testing/fixtures/httpResponses.ts +155 -0
  678. package/src/transactionLayer.ts +122 -0
  679. package/src/transactions/settlement/commitEnvelope.ts +192 -0
  680. package/src/transactions/settlement/httpCommitEnvelope.ts +250 -0
  681. package/src/transactions/settlement/idempotencyKey.ts +11 -0
  682. package/src/transactions/settlement/pendingWrite.ts +24 -0
  683. package/src/transport/commitFrames.ts +225 -0
  684. package/src/transport/connectionManager.ts +856 -0
  685. package/src/transport/credentialLifecycle.ts +389 -0
  686. package/src/transport/heartbeat.ts +118 -0
  687. package/src/transport/httpClient.ts +354 -0
  688. package/src/transport/httpFeed.ts +111 -0
  689. package/src/transport/httpOptions.ts +41 -0
  690. package/src/transport/httpTransport.ts +1976 -0
  691. package/src/transport/networkProbe.ts +249 -0
  692. package/src/transport/wsFrameHandlers.ts +619 -0
  693. package/src/transport/wsTransport.ts +1491 -0
  694. package/src/types/assertExact.ts +17 -0
  695. package/src/types/global.ts +123 -0
  696. package/src/types/index.ts +270 -0
  697. package/src/types/modelData.ts +11 -0
  698. package/src/types/participant.ts +22 -0
  699. package/src/types/streams.ts +702 -0
  700. package/src/utils/asyncIterator.ts +141 -0
  701. package/src/utils/duration.ts +88 -0
  702. package/src/utils/json.ts +281 -0
  703. package/src/webhooks/events.ts +96 -0
  704. package/src/webhooks/index.ts +12 -0
  705. package/src/wire/accountResponses.ts +328 -0
  706. package/src/wire/auth.ts +86 -0
  707. package/src/wire/bootstrapReason.ts +10 -0
  708. package/src/wire/claimEvent.ts +85 -0
  709. package/src/wire/claims.ts +370 -0
  710. package/src/wire/commit.ts +379 -0
  711. package/src/wire/delta.ts +173 -0
  712. package/src/wire/errorEnvelope.ts +133 -0
  713. package/src/wire/feedCursor.ts +91 -0
  714. package/src/wire/feedEvent.ts +74 -0
  715. package/src/wire/frames.ts +77 -0
  716. package/src/wire/inboundFrames.ts +182 -0
  717. package/src/wire/index.ts +328 -0
  718. package/src/wire/listEnvelope.ts +51 -0
  719. package/src/wire/modelMutations.ts +55 -0
  720. package/src/wire/modelResponses.ts +48 -0
  721. package/src/wire/modelShape.ts +83 -0
  722. package/src/wire/protocol.ts +39 -0
  723. package/src/wire/protocolVersion.ts +97 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Mints a session token. This is the single implementation behind
3
+ * `sessions.create`, shared by the WebSocket and HTTP clients so the two never
4
+ * disagree on how a token is produced.
5
+ *
6
+ * Minting is a plain control-plane HTTP call — no socket, no synced data. A
7
+ * backend holding a secret key (`sk_`) exchanges it for a short-lived, scoped
8
+ * token whose kind depends on the session requested:
9
+ *
10
+ * `{ user }` → POST /v1/ephemeral_keys, returning an `ek_` key carrying the
11
+ * explicit grant in `can`. This is the only route that mints a
12
+ * user session; the capability route rejects a `user`
13
+ * participant with `invalid_participant_kind`.
14
+ * `{ agent }` → POST /v1/capabilities, returning an `rk_` key scoped to exactly
15
+ * the operations named in `can`. For example
16
+ * `can: { tasks: ['update'] }` becomes the wire allowlist entry
17
+ * `tasks.update`, which the server matches against the model's
18
+ * registered names.
19
+ *
20
+ * The caller supplies the already-resolved secret key and base URL in
21
+ * {@link MintSessionContext}. Choosing which key to pass — the original secret
22
+ * key, not a derived key that an earlier exchange may have produced — is the
23
+ * caller's responsibility.
24
+ */
25
+ import {
26
+ exchangeApiKey,
27
+ mintUserSessionKey,
28
+ } from '../auth/index.js';
29
+ import {
30
+ capabilityCanSchemaFor,
31
+ grantedOperations,
32
+ } from './capability.js';
33
+ import type { SchemaRecord } from '../schema/schema.js';
34
+ import type { AbloSession, CreateSessionParams } from '../resources/httpResources.js';
35
+
36
+ /**
37
+ * The resolved control-plane details a mint needs: a secret key, a base URL,
38
+ * and an optional `fetch`. When `fetch` is omitted, the auth helpers fall back
39
+ * to the runtime's global `fetch`.
40
+ */
41
+ export interface MintSessionContext {
42
+ readonly apiKey: string;
43
+ readonly baseUrl: string;
44
+ readonly fetch?: typeof fetch;
45
+ /**
46
+ * Each schema key mapped to its wire type name, from
47
+ * {@link modelWireNames} over the client's own schema. Required, and derived
48
+ * rather than assembled: `can` is keyed by schema key while a capability is
49
+ * scoped by the type name the server checks, so
50
+ * `can: { documents: ['update'] }` on a model whose type name is overridden
51
+ * to `Document` must mint `document.update`. A caller who leaves this out
52
+ * mints a grant the server denies on the first write.
53
+ */
54
+ readonly modelTypenames: Readonly<Record<string, string>>;
55
+ }
56
+
57
+ /**
58
+ * Mints a session token from an already-resolved secret key and base URL.
59
+ * Routes the `{ user }` or `{ agent }` request to the matching mint endpoint
60
+ * and reshapes the response into an {@link AbloSession}.
61
+ */
62
+ export async function mintSession<S extends SchemaRecord>(
63
+ params: CreateSessionParams<S>,
64
+ ctx: MintSessionContext,
65
+ ): Promise<AbloSession> {
66
+ const { apiKey, baseUrl } = ctx;
67
+ // Static typing and runtime validation consume the same schema-bound grant
68
+ // contract. This catches JavaScript callers, decoded JSON, and unsafe casts
69
+ // before a credential reaches either mint endpoint.
70
+ const can = capabilityCanSchemaFor(ctx.modelTypenames).parse(params.can);
71
+
72
+ if (params.user) {
73
+ const operations = grantedOperations(can, ctx.modelTypenames);
74
+ const res = await mintUserSessionKey({
75
+ apiKey,
76
+ baseUrl,
77
+ userId: params.user.id,
78
+ ...(params.organizationId ? { organizationId: params.organizationId } : {}),
79
+ ...(params.syncGroups ? { syncGroups: [...params.syncGroups] } : {}),
80
+ operations,
81
+ ttlSeconds: params.ttlSeconds ?? 900,
82
+ ...(ctx.fetch ? { fetch: ctx.fetch } : {}),
83
+ });
84
+ return {
85
+ object: 'session',
86
+ id: res.id,
87
+ token: res.token,
88
+ expiresAt: res.expiresAt,
89
+ organizationId: res.organizationId,
90
+ // The ephemeral mint stores scope on the key row; reshape its flat
91
+ // response into the session resource's scope block.
92
+ scope: {
93
+ organizationId: res.organizationId,
94
+ syncGroups: res.syncGroups,
95
+ operations: res.operations,
96
+ participantKind: 'user',
97
+ participantId: res.participantId,
98
+ },
99
+ userMeta: params.userMeta ?? { id: res.participantId },
100
+ };
101
+ }
102
+
103
+ // One translation from the declared grant to the wire allowlist, shared with
104
+ // every other door that mints — see `auth/capability.ts`.
105
+ const operations = grantedOperations(can, ctx.modelTypenames);
106
+ const res = await exchangeApiKey({
107
+ apiKey,
108
+ baseUrl,
109
+ participantKind: 'agent',
110
+ participantId: params.agent.id,
111
+ ...(params.syncGroups ? { syncGroups: [...params.syncGroups] } : {}),
112
+ operations,
113
+ ttlSeconds: params.ttlSeconds ?? 900,
114
+ ...(params.userMeta ? { userMeta: params.userMeta } : {}),
115
+ ...(ctx.fetch ? { fetch: ctx.fetch } : {}),
116
+ });
117
+ return {
118
+ object: 'session',
119
+ id: res.capabilityId,
120
+ token: res.token,
121
+ expiresAt: res.expiresAt,
122
+ organizationId: res.organizationId,
123
+ scope: res.scope,
124
+ userMeta: res.userMeta,
125
+ };
126
+ }
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+
3
+ /** Canonical bearer-token field used by every successful auth response. */
4
+ export const authTokenSchema = z.string().trim().min(1);
@@ -0,0 +1,200 @@
1
+ /**
2
+ * A small, dependency-free primitive that coalesces work into batches.
3
+ *
4
+ * It accumulates items enqueued close together — the common case being a
5
+ * synchronous burst such as `Promise.all([ a(), b(), c() ])` within one
6
+ * event-loop tick — and dispatches them as a single batch rather than one call
7
+ * each. It is a pure state machine: it stages items on the microtask queue,
8
+ * flushes on size, cost, or time triggers, and applies in-flight backpressure,
9
+ * with no dependency on any data model, storage layer, or network. You supply
10
+ * the dispatch function through {@link BatchSchedulerHooks}.
11
+ *
12
+ * Guarantees:
13
+ * - each batch is a single `dispatchBatch(items)` call, applied atomically.
14
+ * - if a dispatch fails, every enqueued promise in that batch rejects with
15
+ * the same error.
16
+ * - items dispatch in enqueue order, optionally reordered by `compare` just
17
+ * before a batch is cut; batches run first-in, first-out under a
18
+ * `maxInFlight` cap.
19
+ */
20
+
21
+ export interface BatchSchedulerOptions<T> {
22
+ /** Master switch. When false, every `enqueue` dispatches solo immediately. Default true. */
23
+ readonly enabled?: boolean;
24
+ /** Coalescing window in ms. `0` (default) → flush on the next microtask (zero added latency). */
25
+ readonly windowMs?: number;
26
+ /** Max items per batch before a forced flush. Default 256. */
27
+ readonly maxBatchSize?: number;
28
+ /** Max accumulated `costOf` per batch before a forced flush. Default `Infinity` (disabled). */
29
+ readonly maxBatchCost?: number;
30
+ /** Per-item cost used by `maxBatchCost` (e.g. serialized bytes). Default `() => 0`. */
31
+ readonly costOf?: (item: T) => number;
32
+ /** Max dispatches in flight at once (backpressure). Default 1 → strictly ordered. */
33
+ readonly maxInFlight?: number;
34
+ }
35
+
36
+ export interface BatchSchedulerHooks<T, R> {
37
+ /** The single dispatch for one batch. One call → atomic at this layer. */
38
+ dispatchBatch(items: T[]): Promise<R>;
39
+ /**
40
+ * Optional ordering applied to the staged items just before a batch is cut —
41
+ * for example, to send parent rows ahead of the rows that reference them. Omit
42
+ * for first-in, first-out order. This changes only the order of items within
43
+ * the dispatched array, not which items share a batch.
44
+ */
45
+ compare?(a: T, b: T): number;
46
+ }
47
+
48
+ export interface BatchScheduler<T, R> {
49
+ /** Stage one item; resolves with its batch's dispatch result, or rejects with the batch error. */
50
+ enqueue(item: T): Promise<R>;
51
+ /** Stage an item that must dispatch in a batch of its own — for example, one carrying an explicit idempotency key. */
52
+ enqueueSolo(item: T): Promise<R>;
53
+ /** Force-flush the pending batch and resolve once everything in flight has settled. */
54
+ flush(): Promise<void>;
55
+ /** Stop scheduling and clear timers. Pending/in-flight promises still settle. */
56
+ dispose(): void;
57
+ }
58
+
59
+ interface Deferred<R> {
60
+ resolve(result: R): void;
61
+ reject(error: unknown): void;
62
+ }
63
+
64
+ interface Batch<T, R> {
65
+ items: T[];
66
+ deferreds: Deferred<R>[];
67
+ cost: number;
68
+ }
69
+
70
+ export function createBatchScheduler<T, R>(
71
+ hooks: BatchSchedulerHooks<T, R>,
72
+ options?: BatchSchedulerOptions<T>,
73
+ ): BatchScheduler<T, R> {
74
+ const enabled = options?.enabled ?? true;
75
+ const windowMs = options?.windowMs ?? 0;
76
+ const maxBatchSize = options?.maxBatchSize ?? 256;
77
+ const maxBatchCost = options?.maxBatchCost ?? Infinity;
78
+ const costOf = options?.costOf ?? (() => 0);
79
+ const maxInFlight = options?.maxInFlight ?? 1;
80
+
81
+ let pending: Batch<T, R> | null = null;
82
+ let timer: ReturnType<typeof setTimeout> | null = null;
83
+ let microtaskScheduled = false;
84
+ const ready: Batch<T, R>[] = [];
85
+ let inFlight = 0;
86
+ let idleWaiters: (() => void)[] = [];
87
+ let disposed = false;
88
+
89
+ function scheduleFlush(): void {
90
+ if (microtaskScheduled || timer) return;
91
+ if (windowMs > 0) {
92
+ timer = setTimeout(() => {
93
+ timer = null;
94
+ flushPending();
95
+ }, windowMs);
96
+ } else {
97
+ microtaskScheduled = true;
98
+ queueMicrotask(() => {
99
+ microtaskScheduled = false;
100
+ flushPending();
101
+ });
102
+ }
103
+ }
104
+
105
+ function flushPending(): void {
106
+ if (timer) {
107
+ clearTimeout(timer);
108
+ timer = null;
109
+ }
110
+ microtaskScheduled = false;
111
+ if (!pending) return;
112
+ if (hooks.compare) pending.items.sort(hooks.compare);
113
+ ready.push(pending);
114
+ pending = null;
115
+ pump();
116
+ }
117
+
118
+ function pump(): void {
119
+ while (inFlight < maxInFlight && ready.length > 0) {
120
+ const batch = ready.shift();
121
+ if (!batch) break;
122
+ inFlight++;
123
+ let dispatched: Promise<R>;
124
+ try {
125
+ dispatched = hooks.dispatchBatch(batch.items);
126
+ } catch (error) {
127
+ dispatched = Promise.reject(error);
128
+ }
129
+ dispatched
130
+ .then(
131
+ (result) => {
132
+ for (const d of batch.deferreds) d.resolve(result);
133
+ },
134
+ (error: unknown) => {
135
+ for (const d of batch.deferreds) d.reject(error);
136
+ },
137
+ )
138
+ .finally(() => {
139
+ inFlight--;
140
+ pump();
141
+ notifyIdleIfDrained();
142
+ });
143
+ }
144
+ }
145
+
146
+ function notifyIdleIfDrained(): void {
147
+ if (inFlight === 0 && ready.length === 0 && idleWaiters.length > 0) {
148
+ const waiters = idleWaiters;
149
+ idleWaiters = [];
150
+ for (const w of waiters) w();
151
+ }
152
+ }
153
+
154
+ function enqueueSolo(item: T): Promise<R> {
155
+ return new Promise<R>((resolve, reject) => {
156
+ ready.push({ items: [item], deferreds: [{ resolve, reject }], cost: costOf(item) });
157
+ pump();
158
+ });
159
+ }
160
+
161
+ function enqueue(item: T): Promise<R> {
162
+ if (disposed) return Promise.reject(new Error('batch scheduler disposed'));
163
+ if (!enabled) return enqueueSolo(item);
164
+ const cost = costOf(item);
165
+ return new Promise<R>((resolve, reject) => {
166
+ const deferred: Deferred<R> = { resolve, reject };
167
+ // Rollover: if appending would blow a cap, flush the current batch first.
168
+ if (pending && (pending.items.length + 1 > maxBatchSize || pending.cost + cost > maxBatchCost)) {
169
+ flushPending();
170
+ }
171
+ if (!pending) pending = { items: [], deferreds: [], cost: 0 };
172
+ pending.items.push(item);
173
+ pending.deferreds.push(deferred);
174
+ pending.cost += cost;
175
+ if (pending.items.length >= maxBatchSize || pending.cost >= maxBatchCost) {
176
+ flushPending();
177
+ } else {
178
+ scheduleFlush();
179
+ }
180
+ });
181
+ }
182
+
183
+ async function flush(): Promise<void> {
184
+ flushPending();
185
+ while (ready.length > 0 || inFlight > 0) {
186
+ await new Promise<void>((resolve) => idleWaiters.push(resolve));
187
+ }
188
+ }
189
+
190
+ function dispose(): void {
191
+ disposed = true;
192
+ if (timer) {
193
+ clearTimeout(timer);
194
+ timer = null;
195
+ }
196
+ microtaskScheduled = false;
197
+ }
198
+
199
+ return { enqueue, enqueueSolo, flush, dispose };
200
+ }
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Waits for a queued claim to reach the head of the line — the client side of
3
+ * the fair-queue handover. When a claim is contended, the server puts it in a
4
+ * queue and replies that it is queued (HTTP 202 on `/v1/claims`, or a
5
+ * `claim_queued` frame over the WebSocket). The grant is delivered later, when
6
+ * the claim reaches the head, as a `claim_granted` frame. This resolves once
7
+ * that frame arrives for the given `claimId`, so the caller's `claim` promise
8
+ * stays pending — event-driven, with no polling — until it is actually the
9
+ * caller's turn. It rejects if the claim is lost (`claim_lost`: taken away by a
10
+ * TTL lapse on disconnect, or revoked) or if an optional timeout elapses.
11
+ *
12
+ * It needs only a minimal `{ subscribe }` transport, so it can be tested
13
+ * against a fake; the duplex `WsTransport` satisfies it.
14
+ */
15
+
16
+ import {
17
+ AbloClaimedError,
18
+ AbloValidationError,
19
+ CapabilityError,
20
+ formatClaimedErrorMessage,
21
+ claimTargetLabel,
22
+ } from '../errors.js';
23
+ import type { ClaimRejection } from './schema.js';
24
+ import { modelTarget } from './locator.js';
25
+ import { noopLogger, type Logger } from '../logger.js';
26
+
27
+ export interface GrantTransport {
28
+ subscribe(
29
+ event:
30
+ | 'claim_acquired'
31
+ | 'claim_granted'
32
+ | 'claim_lost'
33
+ | 'claim_queued'
34
+ | 'claim_rejected',
35
+ handler: (payload: Record<string, unknown>) => void,
36
+ ): () => void;
37
+ }
38
+
39
+ export interface ClaimGrantInfo {
40
+ /**
41
+ * True when the grant arrived as `claim_granted` — the target was held when
42
+ * the caller asked, and the caller waited in the FIFO line behind the holder.
43
+ * False for the immediate `claim_acquired`, where the target was free.
44
+ *
45
+ * Callers read this to know the row may have changed while they queued. Claim
46
+ * visibility is scoped to the entity, so a broad, organization-wide
47
+ * subscription receives no presence or claim fan-out, and the local
48
+ * coordination snapshot cannot be trusted to tell whether the caller waited.
49
+ * The grant frame itself is the authoritative signal.
50
+ */
51
+ readonly waited: boolean;
52
+ /**
53
+ * The fencing token the server minted for this grant (Option B), read off the
54
+ * grant frame — the authoritative source, since the token is server-stamped.
55
+ * `undefined` when the server does not fence (no minter wired).
56
+ */
57
+ readonly fenceToken?: number;
58
+ }
59
+
60
+ /** Read the server-stamped fencing token off a grant frame, if present. */
61
+ function readFenceToken(p: Record<string, unknown>): number | undefined {
62
+ return typeof p.fenceToken === 'number' ? p.fenceToken : undefined;
63
+ }
64
+
65
+ export function awaitClaimGrant(
66
+ transport: GrantTransport,
67
+ claimId: string,
68
+ options?: {
69
+ timeoutMs?: number;
70
+ /**
71
+ * Backpressure: reject instead of waiting if, when we join the line, the
72
+ * server reports `position >= maxQueueDepth` (i.e. that many claims are
73
+ * already ahead of us). Omit to wait however deep the queue is.
74
+ */
75
+ maxQueueDepth?: number;
76
+ /**
77
+ * Abort the wait from outside — the same signal that cancels everything
78
+ * else in the program. Rejects with `claim_wait_aborted`; once the grant
79
+ * has arrived the signal is ignored, so a held lease is never torn down
80
+ * by a late abort.
81
+ */
82
+ signal?: AbortSignal;
83
+ /** Where grant transitions are logged. Defaults to silent. */
84
+ logger?: Logger;
85
+ },
86
+ ): Promise<ClaimGrantInfo> {
87
+ const logger = options?.logger ?? noopLogger;
88
+ return new Promise<ClaimGrantInfo>((resolve, reject) => {
89
+ const unsubs: (() => void)[] = [];
90
+ let timer: ReturnType<typeof setTimeout> | undefined;
91
+ const settle = (fn: () => void): void => {
92
+ if (timer) clearTimeout(timer);
93
+ for (const u of unsubs) u();
94
+ fn();
95
+ };
96
+
97
+ // The target was free → `claim_acquired` (immediate); it was contended,
98
+ // we waited in line, and reached the head → `claim_granted`. Either frame
99
+ // means the lease is now ours; `waited` records which path it was.
100
+ unsubs.push(
101
+ transport.subscribe('claim_acquired', (p) => {
102
+ if (p?.claimId === claimId) {
103
+ logger.debug(`claim: acquired ${claimId} (target was free)`);
104
+ const fenceToken = readFenceToken(p);
105
+ settle(() => {
106
+ resolve({ waited: false, ...(fenceToken !== undefined ? { fenceToken } : {}) });
107
+ });
108
+ }
109
+ }),
110
+ );
111
+ unsubs.push(
112
+ transport.subscribe('claim_granted', (p) => {
113
+ if (p?.claimId === claimId) {
114
+ // Promoted to the head of the line — the creator's "it's the agent's
115
+ // turn now" moment after waiting behind a holder.
116
+ logger.info(`claim: granted ${claimId} — your turn (waited in queue)`);
117
+ const fenceToken = readFenceToken(p);
118
+ settle(() => {
119
+ resolve({ waited: true, ...(fenceToken !== undefined ? { fenceToken } : {}) });
120
+ });
121
+ }
122
+ }),
123
+ );
124
+ if (options?.maxQueueDepth !== undefined) {
125
+ const max = options.maxQueueDepth;
126
+ unsubs.push(
127
+ transport.subscribe('claim_queued', (p) => {
128
+ if (p?.claimId !== claimId) return;
129
+ const position = typeof p.position === 'number' ? p.position : 0;
130
+ if (position >= max) {
131
+ settle(() =>
132
+ { reject(
133
+ new AbloClaimedError(
134
+ `Claim queue for ${claimId} is ${position} deep (max ${max}).`,
135
+ { code: 'queue_too_deep' },
136
+ ),
137
+ ); },
138
+ );
139
+ }
140
+ }),
141
+ );
142
+ }
143
+ unsubs.push(
144
+ transport.subscribe('claim_rejected', (p) => {
145
+ const rejection = p as ClaimRejection;
146
+ if (rejection.claimId !== claimId) return;
147
+ const target = rejection.target
148
+ ? claimTargetLabel({
149
+ ...modelTarget(rejection.target),
150
+ field: rejection.target.field,
151
+ })
152
+ : claimId;
153
+ if (rejection.reason === 'capability_denied') {
154
+ settle(() => {
155
+ reject(
156
+ new CapabilityError(
157
+ 'capability_scope_denied',
158
+ rejection.policyReason ??
159
+ `This credential may not claim ${target}.`,
160
+ ),
161
+ );
162
+ });
163
+ return;
164
+ }
165
+ if (rejection.reason === 'invalid_target') {
166
+ settle(() => {
167
+ reject(
168
+ new AbloValidationError(
169
+ rejection.policyReason ?? `Invalid claim target ${target}.`,
170
+ { code: 'invalid_body' },
171
+ ),
172
+ );
173
+ });
174
+ return;
175
+ }
176
+ settle(() =>
177
+ { reject(
178
+ new AbloClaimedError(
179
+ formatClaimedErrorMessage({
180
+ targetLabel: target,
181
+ heldBy: rejection.heldBy,
182
+ claim: rejection.heldByClaim,
183
+ policyReason: rejection.policyReason,
184
+ fallback: `Claim rejected for ${target}.`,
185
+ }),
186
+ {
187
+ code: rejection.reason === 'conflict'
188
+ ? 'claim_conflict'
189
+ : 'claim_lease_unavailable',
190
+ claims: rejection.heldByClaim ? [rejection.heldByClaim] : undefined,
191
+ },
192
+ ),
193
+ ); },
194
+ );
195
+ }),
196
+ );
197
+ unsubs.push(
198
+ transport.subscribe('claim_lost', (p) => {
199
+ if (p?.claimId === claimId) {
200
+ settle(() =>
201
+ { reject(
202
+ new AbloClaimedError(`Claim lost while queued for ${claimId}.`, {
203
+ code: 'claim_lost',
204
+ }),
205
+ ); },
206
+ );
207
+ }
208
+ }),
209
+ );
210
+
211
+ if (options?.signal) {
212
+ const signal = options.signal;
213
+ const abort = (): void =>
214
+ settle(() => {
215
+ reject(
216
+ new AbloClaimedError(
217
+ `The wait for claim ${claimId} was aborted before the grant arrived.`,
218
+ { code: 'claim_wait_aborted' },
219
+ ),
220
+ );
221
+ });
222
+ if (signal.aborted) {
223
+ abort();
224
+ return;
225
+ }
226
+ signal.addEventListener('abort', abort, { once: true });
227
+ unsubs.push(() => { signal.removeEventListener('abort', abort); });
228
+ }
229
+
230
+ if (options?.timeoutMs && options.timeoutMs > 0) {
231
+ timer = setTimeout(() => {
232
+ settle(() =>
233
+ { reject(
234
+ new AbloClaimedError(
235
+ `Timed out waiting for the queue grant on claim ${claimId}.`,
236
+ { code: 'grant_timeout' },
237
+ ),
238
+ ); },
239
+ );
240
+ }, options.timeoutMs);
241
+ }
242
+ });
243
+ }