@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,540 @@
1
+ /**
2
+ * Authentication and URL resolution for the `Ablo()` client.
3
+ *
4
+ * Each function here makes one decision: it resolves a configuration value with
5
+ * the right precedence, or fails with an actionable message. Together they let
6
+ * the client constructor read as a sequence of named steps rather than a chain
7
+ * of fallbacks.
8
+ *
9
+ * The environment surface is deliberately small: `ABLO_API_KEY` is the only
10
+ * value read from the environment. Every other routing or authentication
11
+ * override is an explicit option, so an app never picks up hidden behavior from
12
+ * a stray environment variable.
13
+ */
14
+
15
+ import { AbloAuthenticationError, AbloValidationError } from '../errors.js';
16
+ import { classifyCredentialKind } from './credentialKind.js';
17
+ import { ABLO_HOSTED_API_DOMAIN, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
18
+ import type { KeyEnvironment } from '../environment.js';
19
+ import { isCredentialEndpoint, createEndpointCredentialResolver } from './credentialEndpoint.js';
20
+ import {
21
+ credentialToken,
22
+ type CredentialProvider,
23
+ } from './credentialResult.js';
24
+ import {
25
+ assertBrowserSafety,
26
+ protectBrowserCredentialProvider,
27
+ } from './browserCredentialSafety.js';
28
+ export { assertBrowserSafety };
29
+
30
+ /**
31
+ * The credential-resolver callable type. It is defined alongside
32
+ * {@link createEndpointCredentialResolver} in `./credentialEndpoint` and
33
+ * re-exported here so importers of this module keep working. See that module
34
+ * for the full contract.
35
+ */
36
+ export type { CredentialProvider } from './credentialResult.js';
37
+
38
+ /**
39
+ * The client options that decide a credential.
40
+ *
41
+ * This is the ONE declaration of that set. The resolvers below read it, and the
42
+ * transport configs that accept these options derive from it rather than listing
43
+ * the fields again — a second list is how `authEndpoint` came to be supported at
44
+ * runtime, named in an error message, and absent from the type a caller writes
45
+ * against.
46
+ */
47
+ export interface AuthClientOptions {
48
+ readonly apiKey?: string | CredentialProvider | null;
49
+ /** A route that mints the token, instead of a key the process holds. */
50
+ readonly authEndpoint?: string | CredentialProvider | null;
51
+ /** A token the caller already has, used as-is. */
52
+ readonly authToken?: string | null;
53
+ readonly baseURL?: string | null;
54
+ readonly dangerouslyAllowBrowser?: boolean;
55
+ readonly fetch?: typeof globalThis.fetch;
56
+ readonly authTimeoutMs?: number;
57
+ readonly allowCrossOriginAuthEndpoint?: boolean;
58
+ }
59
+
60
+ export interface AuthResolveInput {
61
+ /**
62
+ * The full set of options the caller passed to the client constructor. Each
63
+ * resolver reads only the fields it needs; passing the whole object avoids
64
+ * threading many separate parameters through every helper.
65
+ */
66
+ readonly options: AuthClientOptions;
67
+ readonly env: Record<string, string | undefined>;
68
+ }
69
+
70
+ /**
71
+ * Read `process.env` defensively. Works in browser (where `process`
72
+ * is undefined), Node, and edge runtimes that expose a partial
73
+ * process polyfill.
74
+ */
75
+ export function readProcessEnv(): Record<string, string | undefined> {
76
+ const maybeGlobal = globalThis as typeof globalThis & {
77
+ process?: { env?: Record<string, string | undefined> };
78
+ };
79
+ return maybeGlobal.process?.env ?? {};
80
+ }
81
+
82
+ export function resolveApiKey(
83
+ input: AuthResolveInput,
84
+ ): string | CredentialProvider | null {
85
+ // `authEndpoint` is the option that names a session-mint route: a URL the
86
+ // client exchanges for a short-lived token, or an async resolver for custom
87
+ // exchanges. It is resolved into a `CredentialProvider` here — the single point
88
+ // shared by every client variant (WebSocket, HTTP, and protocol clients) — so
89
+ // every downstream consumer sees the same resolver and the credential
90
+ // lifecycle drives renewal off it.
91
+ const endpoint = input.options.authEndpoint;
92
+ const configured = input.options.apiKey;
93
+ if (endpoint != null) {
94
+ if (configured != null) {
95
+ throw new AbloValidationError(
96
+ 'Ablo: pass either `apiKey` (a key the process holds) or `authEndpoint` ' +
97
+ '(a route that mints the token) — not both; the client cannot know ' +
98
+ 'which credential to use.',
99
+ { code: 'invalid_options', param: 'authEndpoint' },
100
+ );
101
+ }
102
+ if (typeof endpoint === 'function') {
103
+ return protectBrowserCredentialProvider(
104
+ endpoint,
105
+ input.options.dangerouslyAllowBrowser,
106
+ );
107
+ }
108
+ if (!isCredentialEndpoint(endpoint)) {
109
+ throw new AbloValidationError(
110
+ '`authEndpoint` expects a URL or path (e.g. \'/api/ablo-session\') or an ' +
111
+ 'async resolver — a key string belongs in `apiKey`.',
112
+ { code: 'invalid_options', param: 'authEndpoint' },
113
+ );
114
+ }
115
+ return protectBrowserCredentialProvider(createEndpointCredentialResolver(endpoint, {
116
+ fetch: input.options.fetch,
117
+ timeoutMs: input.options.authTimeoutMs,
118
+ allowCrossOrigin: input.options.allowCrossOriginAuthEndpoint,
119
+ }), input.options.dangerouslyAllowBrowser);
120
+ }
121
+ if (typeof configured === 'string' && isCredentialEndpoint(configured)) {
122
+ throw new AbloValidationError(
123
+ '`apiKey` no longer accepts an endpoint. Move this value to `authEndpoint`.',
124
+ { code: 'invalid_options', param: 'apiKey' },
125
+ );
126
+ }
127
+ if (typeof configured === 'function') {
128
+ return protectBrowserCredentialProvider(
129
+ configured,
130
+ input.options.dangerouslyAllowBrowser,
131
+ );
132
+ }
133
+ return configured ?? input.env.ABLO_API_KEY ?? null;
134
+ }
135
+
136
+ /**
137
+ * Narrow a resolved `apiKey` to the single resolver the credential lifecycle
138
+ * needs: an async `() => token | null`, or `null` when auth is static — a plain
139
+ * long-lived key string with no refresh, which is the common case.
140
+ *
141
+ * The short-lived per-user browser path passes a credential provider, and the
142
+ * SDK then drives the whole credential lifecycle
143
+ * from it: mint-before-connect, the proactive refresh timer with its
144
+ * wake/online/focus re-mint, and the reactive `credential_stale` re-mint. The
145
+ * resolver follows the provider contract end to end: resolve a token,
146
+ * resolve `null` when the login is gone (terminal — surfaces `session_expired`
147
+ * and signs the user out), or throw on a transient failure (backs off, without
148
+ * signing out).
149
+ */
150
+ export function resolveCredentialResolver(
151
+ apiKey: string | CredentialProvider | null,
152
+ ): CredentialProvider | null {
153
+ if (typeof apiKey === 'function') return apiKey;
154
+ return null;
155
+ }
156
+
157
+ export function resolveAuthToken(input: AuthResolveInput): string | null {
158
+ return input.options.authToken ?? null;
159
+ }
160
+
161
+ /**
162
+ * The credential axis, not a second copy of it. `environment.ts` documents two
163
+ * incidents caused by conflating the plane a request runs on with the mode a
164
+ * credential was minted in, and states the credential axis must not grow when
165
+ * planes do — so the CLI mismatch path reads the canonical vocabulary rather
166
+ * than restating its members here.
167
+ */
168
+ type CliMode = KeyEnvironment;
169
+ type StaticApiKeySource = 'option' | 'env';
170
+
171
+ interface StaticApiKey {
172
+ readonly key: string;
173
+ readonly source: StaticApiKeySource;
174
+ }
175
+
176
+ interface CliCredentialSnapshot {
177
+ readonly mode: CliMode;
178
+ readonly activeProfile: string;
179
+ readonly storedKey?: string;
180
+ }
181
+
182
+ export interface CliKeyMismatch {
183
+ readonly source: StaticApiKeySource;
184
+ readonly configuredKeyPrefix: string;
185
+ readonly configuredMode?: CliMode;
186
+ readonly cliMode: CliMode;
187
+ readonly storedKeyPrefix?: string;
188
+ readonly kind: 'mode_mismatch' | 'key_override';
189
+ readonly message: string;
190
+ }
191
+
192
+ function keyPrefix(key: string): string {
193
+ return `${key.slice(0, 12)}…`;
194
+ }
195
+
196
+ /** Infer the sandbox or production mode from an Ablo key's prefix. */
197
+ export function modeFromApiKey(key: string): CliMode | undefined {
198
+ if (/^(sk|rk)_test_/.test(key)) return 'sandbox';
199
+ if (/^(sk|rk)_live_/.test(key)) return 'production';
200
+ return undefined;
201
+ }
202
+
203
+ function resolveStaticApiKey(input: AuthResolveInput): StaticApiKey | null {
204
+ if (typeof input.options.apiKey === 'string') {
205
+ return { key: input.options.apiKey, source: 'option' };
206
+ }
207
+ if (input.options.apiKey !== undefined && input.options.apiKey !== null) {
208
+ return null;
209
+ }
210
+ const envKey = input.env.ABLO_API_KEY;
211
+ if (typeof envKey === 'string' && envKey.length > 0) {
212
+ return { key: envKey, source: 'env' };
213
+ }
214
+ return null;
215
+ }
216
+
217
+ function readProfileKeys(
218
+ value: unknown,
219
+ ): Record<string, Record<CliMode, { apiKey?: string } | undefined>> {
220
+ if (!value || typeof value !== 'object') return {};
221
+ const profiles: Record<string, Record<CliMode, { apiKey?: string } | undefined>> = {};
222
+ for (const [name, raw] of Object.entries(value as Record<string, unknown>)) {
223
+ if (!raw || typeof raw !== 'object') continue;
224
+ const row = raw as Record<string, unknown>;
225
+ const sandbox = row.sandbox;
226
+ const production = row.production;
227
+ profiles[name] = {
228
+ sandbox: sandbox && typeof sandbox === 'object' ? sandbox : undefined,
229
+ production: production && typeof production === 'object' ? production : undefined,
230
+ };
231
+ }
232
+ return profiles;
233
+ }
234
+
235
+ function legacyProfileKeys(
236
+ value: Record<string, unknown> | null,
237
+ ): Record<CliMode, { apiKey?: string } | undefined> {
238
+ if (!value) return { sandbox: undefined, production: undefined };
239
+ const sandbox = value.sandbox;
240
+ const production = value.production;
241
+ if (
242
+ (sandbox && typeof sandbox === 'object') ||
243
+ (production && typeof production === 'object')
244
+ ) {
245
+ return {
246
+ sandbox: sandbox && typeof sandbox === 'object' ? sandbox : undefined,
247
+ production: production && typeof production === 'object' ? production : undefined,
248
+ };
249
+ }
250
+ if (typeof value.apiKey === 'string') {
251
+ return { sandbox: { apiKey: value.apiKey }, production: undefined };
252
+ }
253
+ return { sandbox: undefined, production: undefined };
254
+ }
255
+
256
+ function normalizeCliMode(value: unknown): CliMode | undefined {
257
+ return value === 'sandbox' || value === 'production' ? value : undefined;
258
+ }
259
+
260
+ function activeProjectSlug(value: unknown): string | undefined {
261
+ if (!value || typeof value !== 'object') return undefined;
262
+ const slug = (value as { slug?: unknown }).slug;
263
+ return typeof slug === 'string' && slug.length > 0 ? slug : undefined;
264
+ }
265
+
266
+ function importNodeBuiltin<T>(specifier: string): Promise<T> {
267
+ // Node-only runtime import (CLI credential snapshot). The call is dead in
268
+ // browser/edge builds — guarded by `process.versions.node` and `window`
269
+ // checks in the callers — but bundlers still try to resolve the dynamic
270
+ // `import()` and Turbopack fails the build on the unanalyzable specifier.
271
+ // The magic comments tell each bundler to emit the import verbatim and never
272
+ // resolve it. Keep both so webpack and Turbopack consumers are covered.
273
+ return import(/* webpackIgnore: true */ /* turbopackIgnore: true */ specifier) as Promise<T>;
274
+ }
275
+
276
+ async function readJsonIfPresent(path: string): Promise<Record<string, unknown> | null> {
277
+ try {
278
+ const { readFile } = await importNodeBuiltin<typeof import('node:fs/promises')>(
279
+ 'node:fs/promises',
280
+ );
281
+ const text = await readFile(path, 'utf8');
282
+ const parsed = JSON.parse(text) as unknown;
283
+ return parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : null;
284
+ } catch {
285
+ return null;
286
+ }
287
+ }
288
+
289
+ async function readCliCredentialSnapshot(env: Record<string, string | undefined>): Promise<CliCredentialSnapshot | null> {
290
+ const processLike = (globalThis as typeof globalThis & {
291
+ process?: { versions?: { node?: string } };
292
+ }).process;
293
+ if (!processLike?.versions?.node) return null;
294
+ if (typeof window !== 'undefined') return null;
295
+
296
+ const [{ homedir }, { join }] = await Promise.all([
297
+ importNodeBuiltin<typeof import('node:os')>('node:os'),
298
+ importNodeBuiltin<typeof import('node:path')>('node:path'),
299
+ ]);
300
+ const dir = env.ABLO_CONFIG_DIR
301
+ ?? (env.XDG_CONFIG_HOME ? join(env.XDG_CONFIG_HOME, 'ablo') : join(homedir(), '.config', 'ablo'));
302
+ const [cfg, creds] = await Promise.all([
303
+ readJsonIfPresent(join(dir, 'config.json')),
304
+ readJsonIfPresent(join(dir, 'credentials.json')),
305
+ ]);
306
+ const mode = normalizeCliMode(cfg?.mode) ?? normalizeCliMode(creds?.mode);
307
+ const activeProfile = activeProjectSlug(cfg?.activeProject) ?? 'default';
308
+
309
+ const profiles = {
310
+ ...readProfileKeys(creds?.profiles),
311
+ ...readProfileKeys(cfg?.profiles),
312
+ };
313
+ if (!profiles[activeProfile]) {
314
+ const legacy = { ...legacyProfileKeys(cfg), ...legacyProfileKeys(creds) };
315
+ if (legacy.sandbox?.apiKey || legacy.production?.apiKey) {
316
+ profiles[activeProfile] = legacy;
317
+ }
318
+ }
319
+ const effectiveMode = mode ?? (Object.keys(profiles).length > 0 ? 'sandbox' : undefined);
320
+ if (!effectiveMode) return null;
321
+ return {
322
+ mode: effectiveMode,
323
+ activeProfile,
324
+ ...(profiles[activeProfile]?.[effectiveMode]?.apiKey
325
+ ? { storedKey: profiles[activeProfile][effectiveMode].apiKey }
326
+ : {}),
327
+ };
328
+ }
329
+
330
+ export function describeCliKeyMismatch(
331
+ configured: StaticApiKey,
332
+ cli: CliCredentialSnapshot,
333
+ ): CliKeyMismatch | null {
334
+ const configuredMode = modeFromApiKey(configured.key);
335
+ const configuredKeyPrefix = keyPrefix(configured.key);
336
+ const storedKeyPrefix = cli.storedKey ? keyPrefix(cli.storedKey) : undefined;
337
+ const sourceLabel = configured.source === 'env' ? 'ABLO_API_KEY' : 'configured apiKey';
338
+
339
+ if (configuredMode && configuredMode !== cli.mode) {
340
+ return {
341
+ source: configured.source,
342
+ configuredKeyPrefix,
343
+ configuredMode,
344
+ cliMode: cli.mode,
345
+ ...(storedKeyPrefix ? { storedKeyPrefix } : {}),
346
+ kind: 'mode_mismatch',
347
+ message:
348
+ `${sourceLabel} is a ${configuredMode} key (${configuredKeyPrefix}) but the Ablo CLI is in ` +
349
+ `${cli.mode} mode${storedKeyPrefix ? ` (active stored key ${storedKeyPrefix})` : ''}. ` +
350
+ `Requests will use ${configuredMode}. Use the ${cli.mode} key, unset ABLO_API_KEY, ` +
351
+ `or run \`ablo mode ${configuredMode}\` intentionally.`,
352
+ };
353
+ }
354
+
355
+ if (configured.source === 'env' && cli.storedKey && configured.key !== cli.storedKey) {
356
+ return {
357
+ source: configured.source,
358
+ configuredKeyPrefix,
359
+ ...(configuredMode ? { configuredMode } : {}),
360
+ cliMode: cli.mode,
361
+ storedKeyPrefix,
362
+ kind: 'key_override',
363
+ message:
364
+ `ABLO_API_KEY (${configuredKeyPrefix}) overrides the CLI's stored active ${cli.mode} key ` +
365
+ `(${storedKeyPrefix}). Requests will use the environment key. Unset ABLO_API_KEY to use ` +
366
+ '`ablo status` / `ablo mode` credentials.',
367
+ };
368
+ }
369
+
370
+ return null;
371
+ }
372
+
373
+
374
+ let warnedCliKeyMismatch = false;
375
+ export async function warnIfCliKeyMismatch(
376
+ input: AuthResolveInput,
377
+ warn?: (message: string) => void,
378
+ ): Promise<void> {
379
+ if (warnedCliKeyMismatch) return;
380
+ if (input.env.NODE_ENV === 'production') return;
381
+ const configured = resolveStaticApiKey(input);
382
+ if (!configured) return;
383
+ const cli = await readCliCredentialSnapshot(input.env);
384
+ if (!cli) return;
385
+ const mismatch = describeCliKeyMismatch(configured, cli);
386
+ if (!mismatch) return;
387
+ warnedCliKeyMismatch = true;
388
+ if (warn) warn(mismatch.message);
389
+ else if (typeof console !== 'undefined') console.warn('[Ablo]', mismatch.message);
390
+ }
391
+
392
+ // Declared in `./hostedEndpoints`, the single source of the hosted domain, and
393
+ // re-exported here so existing import paths keep working.
394
+ export { ABLO_HOSTED_API_DOMAIN, ABLO_HOSTED_HTTP_BASE_URL, ABLO_DEFAULT_BASE_URL } from './hostedEndpoints.js';
395
+
396
+ const LEGACY_HOSTED_API_HOSTS = new Set([
397
+ 'mesh.ablo.finance',
398
+ 'mesh-staging.ablo.finance',
399
+ 'api.ablo.finance',
400
+ 'sync-staging.ablo.finance',
401
+ ]);
402
+
403
+ /**
404
+ * Normalizes older hosted host names to the current public API domain.
405
+ * Self-hosted or custom URLs pass through unchanged; only the retired
406
+ * first-party host names are rewritten.
407
+ */
408
+ export function normalizeAbloHostedBaseUrl(rawUrl: string): string {
409
+ const trimmed = rawUrl.trim();
410
+ if (!trimmed) return trimmed;
411
+
412
+ // A scheme-less value (e.g. `api-staging.abloatai.com`) is treated as a
413
+ // relative URL: `new URL()` throws on it, and a later `fetch` would resolve it
414
+ // against the current page — producing a 404 from the app's own origin.
415
+ // Prepending a scheme makes the base absolute. `https` matches
416
+ // {@link ABLO_HOSTED_HTTP_BASE_URL}; the socket layer derives `wss` from it.
417
+ // An existing scheme (ws, wss, http, or https) is preserved untouched.
418
+ const schemed = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
419
+
420
+ try {
421
+ const url = new URL(schemed);
422
+ // Canonicalize the scheme to the HTTP family: accept all four schemes
423
+ // (http, https, ws, wss), normalize at this single entry point, and let
424
+ // each layer derive its own protocol (the socket layer maps http to ws and
425
+ // https to wss; fetch uses the URL as-is). Without this, a `ws://` base URL
426
+ // reaches HTTP consumers un-normalized and the client fails at startup
427
+ // instead of connecting.
428
+ if (url.protocol === 'ws:') url.protocol = 'http:';
429
+ if (url.protocol === 'wss:') url.protocol = 'https:';
430
+
431
+ if (!LEGACY_HOSTED_API_HOSTS.has(url.hostname)) {
432
+ return url.toString().replace(/\/+$/, '');
433
+ }
434
+
435
+ url.hostname = ABLO_HOSTED_API_DOMAIN;
436
+ if (url.protocol === 'http:') url.protocol = 'https:';
437
+ return url.toString().replace(/\/+$/, '');
438
+ } catch {
439
+ return schemed;
440
+ }
441
+ }
442
+
443
+ export function resolveBaseURL(input: AuthResolveInput): string {
444
+ return normalizeAbloHostedBaseUrl(input.options.baseURL ?? ABLO_DEFAULT_BASE_URL);
445
+ }
446
+
447
+ /**
448
+ * Guards against using a secret `apiKey` in a browser. A secret key is
449
+ * server-side only by default: shipping an `sk_live_...` key to a browser would
450
+ * expose it in every visitor's network tab. Callers opt in explicitly when the
451
+ * browser instead holds a minted session token (`ek_`/`rk_`) or routes through a
452
+ * server proxy. Throws {@link AbloAuthenticationError} when a secret key is
453
+ * detected in a browser without opt-in.
454
+ */
455
+ /**
456
+ * Rejects the REMOVED `databaseUrl` dial-in option loudly. The option is gone
457
+ * from the types, but an untyped or stale caller could still pass it — and
458
+ * silently ignoring it would reroute their writes to Ablo-hosted storage,
459
+ * the opposite of what that option used to promise. A construction-time throw
460
+ * turns a wrong-storage surprise into a clear migration instruction.
461
+ */
462
+ export function rejectRemovedDatabaseUrlOption(options: object): void {
463
+ const legacyValue: unknown = Reflect.get(options, 'databaseUrl');
464
+ if (legacyValue == null) return;
465
+ throw new AbloValidationError(
466
+ 'The `databaseUrl` option was removed. Your database connects through ' +
467
+ '`ablo connect` now: Ablo writes it directly with a scoped DML role and ' +
468
+ 'confirms through its replication stream. Run `npx ablo connect` to ' +
469
+ 'register it, then construct the client with your API key only.',
470
+ { code: 'invalid_body' },
471
+ );
472
+ }
473
+
474
+ /**
475
+ * Resolves a credential provider to its current string value, or
476
+ * returns a plain string key as-is. Called at request time so a rotating
477
+ * credential picks up new values between requests. Returns `null` when no key
478
+ * was configured.
479
+ */
480
+ export async function resolveApiKeyValue(
481
+ apiKey: string | CredentialProvider | null,
482
+ ): Promise<string | null> {
483
+ if (apiKey == null) return null;
484
+ if (typeof apiKey === 'function') return credentialToken(await apiKey());
485
+ return apiKey;
486
+ }
487
+
488
+ /**
489
+ * Translates a WebSocket URL into the matching HTTP API base URL, defaulting to
490
+ * `${url}/api` when the caller has not overridden `bootstrapBaseUrl`. The
491
+ * bootstrap helper, the hydration coordinator, the credential-exchange flow, and
492
+ * the identity flow all derive their base URL through this one function, so the
493
+ * derivation stays consistent across them.
494
+ *
495
+ * When both `wss://` and `https://` are valid, the ws-to-http rewrite preserves
496
+ * the protocol family: ws becomes http and wss becomes https.
497
+ */
498
+ export function resolveBootstrapBaseUrl(input: {
499
+ readonly url: string;
500
+ readonly bootstrapBaseUrl?: string;
501
+ }): string {
502
+ if (input.bootstrapBaseUrl) {
503
+ // Coerce ws/wss to http/https on the override path as well. This base URL is
504
+ // used for HTTP fetches (identity resolution, credential exchange, and
505
+ // bootstrap), and the browser `fetch` rejects ws and wss schemes outright.
506
+ // The override can legitimately arrive with a WebSocket scheme when a caller
507
+ // derives it as `${baseUrl}/api` from a WebSocket base URL, so normalize it
508
+ // here rather than failing at fetch time.
509
+ return ensureApiSuffix(normalizeAbloHostedBaseUrl(input.bootstrapBaseUrl).replace(/^ws/, 'http'));
510
+ }
511
+ const url = normalizeAbloHostedBaseUrl(input.url);
512
+ return ensureApiSuffix(url.replace(/^ws/, 'http'));
513
+ }
514
+
515
+ /**
516
+ * Ensures the HTTP base ends in the `/api` route segment that every endpoint is
517
+ * mounted under.
518
+ *
519
+ * A hosted deployment that sets a custom `baseURL` or `bootstrapBaseUrl` (a
520
+ * custom subdomain, a staging host, and so on) without the `/api` suffix would
521
+ * send every credential exchange to `…/v1/capabilities` instead of
522
+ * `…/api/v1/capabilities`, producing a 404 that surfaces as `exchange_failed`.
523
+ * Since the client builds routes relative to this base and no valid deployment
524
+ * serves them from the root, appending a single trailing `/api` here is always
525
+ * correct, and it is idempotent for callers who already include it.
526
+ */
527
+ function ensureApiSuffix(httpBase: string): string {
528
+ const trimmed = httpBase.replace(/\/+$/, '');
529
+ try {
530
+ const u = new URL(trimmed);
531
+ const segments = u.pathname.split('/').filter(Boolean);
532
+ if (segments[segments.length - 1] === 'api') return trimmed;
533
+ u.pathname = `${u.pathname.replace(/\/+$/, '')}/api`;
534
+ return u.toString().replace(/\/+$/, '');
535
+ } catch {
536
+ // Should be unreachable after `normalizeAbloHostedBaseUrl`, which yields an
537
+ // absolute URL, but fall back to a string check rather than throwing.
538
+ return trimmed.endsWith("/api") ? trimmed : `${trimmed}/api`;
539
+ }
540
+ }
@@ -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,48 @@
1
+ import { AbloAuthenticationError } from '../errors.js';
2
+ import { classifyCredentialKind } from './credentialKind.js';
3
+ import {
4
+ credentialToken,
5
+ type CredentialProvider,
6
+ type CredentialProviderResult,
7
+ } from './credentialResult.js';
8
+
9
+ export function assertBrowserSafety(input: {
10
+ readonly apiKey: string | CredentialProvider | null;
11
+ readonly dangerouslyAllowBrowser: boolean | undefined;
12
+ }): void {
13
+ if (
14
+ !input.dangerouslyAllowBrowser &&
15
+ typeof window !== 'undefined' &&
16
+ typeof input.apiKey === 'string' &&
17
+ classifyCredentialKind(input.apiKey) === 'secret'
18
+ ) {
19
+ throwBrowserSecretError();
20
+ }
21
+ }
22
+
23
+ export function protectBrowserCredentialProvider(
24
+ provider: CredentialProvider,
25
+ dangerouslyAllowBrowser: boolean | undefined,
26
+ ): CredentialProvider {
27
+ return async (): Promise<CredentialProviderResult> => {
28
+ const result = await provider();
29
+ const token = credentialToken(result);
30
+ if (
31
+ !dangerouslyAllowBrowser &&
32
+ typeof window !== 'undefined' &&
33
+ token !== null &&
34
+ classifyCredentialKind(token) === 'secret'
35
+ ) {
36
+ throwBrowserSecretError();
37
+ }
38
+ return result;
39
+ };
40
+ }
41
+
42
+ function throwBrowserSecretError(): never {
43
+ throw new AbloAuthenticationError(
44
+ 'A secret `sk_` credential reached the browser. Keep it server-side and ' +
45
+ 'configure the browser with `authEndpoint` instead.',
46
+ { code: 'browser_apikey_blocked' },
47
+ );
48
+ }