@aryee337/aery-ai 0.1.148 → 0.2.10

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 (592) hide show
  1. package/CHANGELOG.md +2914 -0
  2. package/README.md +614 -813
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth-broker/client.d.ts +66 -0
  5. package/dist/types/auth-broker/index.d.ts +5 -0
  6. package/dist/types/auth-broker/refresher.d.ts +25 -0
  7. package/dist/types/auth-broker/remote-store.d.ts +96 -0
  8. package/dist/types/auth-broker/server.d.ts +32 -0
  9. package/dist/types/auth-broker/types.d.ts +105 -0
  10. package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
  11. package/dist/types/auth-gateway/http.d.ts +39 -0
  12. package/dist/types/auth-gateway/index.d.ts +3 -0
  13. package/dist/types/auth-gateway/server.d.ts +36 -0
  14. package/dist/types/auth-gateway/types.d.ts +117 -0
  15. package/dist/types/auth-storage.d.ts +739 -0
  16. package/dist/types/index.d.ts +49 -0
  17. package/dist/types/model-cache.d.ts +17 -0
  18. package/dist/types/model-manager.d.ts +64 -0
  19. package/dist/types/model-thinking.d.ts +100 -0
  20. package/dist/types/models.d.ts +12 -0
  21. package/dist/types/provider-details.d.ts +24 -0
  22. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  23. package/dist/types/provider-models/descriptors.d.ts +50 -0
  24. package/dist/types/provider-models/google.d.ts +24 -0
  25. package/dist/types/provider-models/index.d.ts +5 -0
  26. package/dist/types/provider-models/ollama.d.ts +7 -0
  27. package/dist/types/provider-models/openai-compat.d.ts +296 -0
  28. package/dist/types/provider-models/special.d.ts +16 -0
  29. package/dist/types/providers/aery-native-client.d.ts +13 -0
  30. package/dist/types/providers/aery-native-server.d.ts +68 -0
  31. package/dist/types/providers/amazon-bedrock.d.ts +38 -0
  32. package/dist/types/providers/anthropic-client.d.ts +99 -0
  33. package/dist/types/providers/anthropic-messages-server-schema.d.ts +465 -0
  34. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  35. package/dist/types/providers/anthropic-wire.d.ts +262 -0
  36. package/dist/types/providers/anthropic.d.ts +206 -0
  37. package/dist/types/providers/aws-credentials.d.ts +43 -0
  38. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  39. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  40. package/dist/types/providers/azure-openai-responses.d.ts +15 -0
  41. package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
  42. package/dist/types/providers/cursor.d.ts +43 -0
  43. package/dist/types/providers/error-message.d.ts +27 -0
  44. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  45. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  46. package/dist/types/providers/google-auth.d.ts +24 -0
  47. package/dist/types/providers/google-gemini-cli.d.ts +81 -0
  48. package/dist/types/providers/google-gemini-headers.d.ts +18 -0
  49. package/dist/types/providers/google-shared.d.ts +171 -0
  50. package/dist/types/providers/google-types.d.ts +138 -0
  51. package/dist/types/providers/google-vertex.d.ts +7 -0
  52. package/dist/types/providers/google.d.ts +4 -0
  53. package/dist/types/providers/grammar.d.ts +1 -0
  54. package/dist/types/providers/kimi.d.ts +27 -0
  55. package/dist/types/providers/mock.d.ts +173 -0
  56. package/dist/types/providers/ollama.d.ts +6 -0
  57. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  58. package/dist/types/providers/openai-chat-server-schema.d.ts +817 -0
  59. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  60. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  61. package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
  62. package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
  63. package/dist/types/providers/openai-codex-responses.d.ts +67 -0
  64. package/dist/types/providers/openai-completions-compat.d.ts +25 -0
  65. package/dist/types/providers/openai-completions.d.ts +54 -0
  66. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  67. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  68. package/dist/types/providers/openai-responses-shared.d.ts +100 -0
  69. package/dist/types/providers/openai-responses.d.ts +66 -0
  70. package/dist/types/providers/register-builtins.d.ts +31 -0
  71. package/dist/types/providers/synthetic.d.ts +26 -0
  72. package/dist/{providers → types/providers}/transform-messages.d.ts +6 -2
  73. package/dist/types/providers/vision-guard.d.ts +8 -0
  74. package/dist/types/providers/xai-responses.d.ts +23 -0
  75. package/dist/types/rate-limit-utils.d.ts +19 -0
  76. package/dist/types/stream.d.ts +28 -0
  77. package/dist/types/types.d.ts +801 -0
  78. package/dist/types/usage/claude.d.ts +4 -0
  79. package/dist/types/usage/gemini.d.ts +2 -0
  80. package/dist/types/usage/github-copilot.d.ts +7 -0
  81. package/dist/types/usage/google-antigravity.d.ts +2 -0
  82. package/dist/types/usage/kimi.d.ts +2 -0
  83. package/dist/types/usage/minimax-code.d.ts +2 -0
  84. package/dist/types/usage/openai-codex.d.ts +3 -0
  85. package/dist/types/usage/shared.d.ts +1 -0
  86. package/dist/types/usage/zai.d.ts +2 -0
  87. package/dist/types/usage.d.ts +260 -0
  88. package/dist/types/utils/abort.d.ts +19 -0
  89. package/dist/types/utils/abortable-iterator.d.ts +4 -0
  90. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  91. package/dist/types/utils/discovery/antigravity.d.ts +61 -0
  92. package/dist/types/utils/discovery/codex.d.ts +38 -0
  93. package/dist/types/utils/discovery/cursor.d.ts +23 -0
  94. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  95. package/dist/types/utils/discovery/index.d.ts +4 -0
  96. package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
  97. package/dist/types/utils/event-stream.d.ts +28 -0
  98. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  99. package/dist/types/utils/foundry.d.ts +1 -0
  100. package/dist/types/utils/http-inspector.d.ts +31 -0
  101. package/dist/types/utils/idle-iterator.d.ts +78 -0
  102. package/dist/types/utils/json-parse.d.ts +37 -0
  103. package/dist/types/utils/oauth/__tests__/xai-oauth.test.d.ts +1 -0
  104. package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
  105. package/dist/types/utils/oauth/anthropic.d.ts +22 -0
  106. package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
  107. package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
  108. package/dist/types/utils/oauth/callback-server.d.ts +57 -0
  109. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  110. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  111. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  112. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  113. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  114. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  115. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  116. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  117. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  118. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  119. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  120. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  121. package/dist/types/utils/oauth/index.d.ts +38 -0
  122. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  123. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  124. package/dist/types/utils/oauth/kimi.d.ts +21 -0
  125. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  126. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  127. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  128. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  129. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  130. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  131. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  132. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  133. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  134. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  135. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  136. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  137. package/dist/types/utils/oauth/perplexity.d.ts +9 -0
  138. package/dist/{utils → types/utils}/oauth/pkce.d.ts +0 -5
  139. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  140. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  141. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  142. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  143. package/dist/types/utils/oauth/together.d.ts +1 -0
  144. package/dist/types/utils/oauth/types.d.ts +44 -0
  145. package/dist/types/utils/oauth/venice.d.ts +18 -0
  146. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  147. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  148. package/dist/types/utils/oauth/wafer.d.ts +2 -0
  149. package/dist/types/utils/oauth/xai-oauth.d.ts +60 -0
  150. package/dist/types/utils/oauth/xiaomi.d.ts +19 -0
  151. package/dist/types/utils/oauth/zai.d.ts +18 -0
  152. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  153. package/dist/types/utils/oauth/zhipu.d.ts +18 -0
  154. package/dist/{utils → types/utils}/overflow.d.ts +9 -11
  155. package/dist/types/utils/parse-bind.d.ts +23 -0
  156. package/dist/types/utils/provider-response.d.ts +3 -0
  157. package/dist/types/utils/request-debug.d.ts +29 -0
  158. package/dist/types/utils/retry-after.d.ts +3 -0
  159. package/dist/types/utils/retry.d.ts +26 -0
  160. package/dist/types/utils/schema/adapt.d.ts +24 -0
  161. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  162. package/dist/types/utils/schema/dereference.d.ts +11 -0
  163. package/dist/types/utils/schema/draft.d.ts +10 -0
  164. package/dist/types/utils/schema/equality.d.ts +4 -0
  165. package/dist/types/utils/schema/fields.d.ts +49 -0
  166. package/dist/types/utils/schema/index.d.ts +13 -0
  167. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  168. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  169. package/dist/types/utils/schema/normalize.d.ts +93 -0
  170. package/dist/types/utils/schema/spill.d.ts +8 -0
  171. package/dist/types/utils/schema/stamps.d.ts +25 -0
  172. package/dist/types/utils/schema/types.d.ts +4 -0
  173. package/dist/types/utils/schema/wire.d.ts +53 -0
  174. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  175. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  176. package/dist/types/utils/sse-debug.d.ts +10 -0
  177. package/dist/types/utils/stream-markup-healing.d.ts +80 -0
  178. package/dist/types/utils/tool-choice.d.ts +50 -0
  179. package/dist/types/utils/validation.d.ts +17 -0
  180. package/dist/types/utils.d.ts +28 -0
  181. package/package.json +139 -105
  182. package/src/api-registry.ts +96 -0
  183. package/src/auth-broker/client.ts +358 -0
  184. package/src/auth-broker/index.ts +5 -0
  185. package/src/auth-broker/refresher.ts +117 -0
  186. package/src/auth-broker/remote-store.ts +623 -0
  187. package/src/auth-broker/server.ts +644 -0
  188. package/src/auth-broker/types.ts +127 -0
  189. package/src/auth-broker/wire-schemas.ts +200 -0
  190. package/src/auth-gateway/http.ts +194 -0
  191. package/src/auth-gateway/index.ts +3 -0
  192. package/src/auth-gateway/server.ts +818 -0
  193. package/src/auth-gateway/types.ts +143 -0
  194. package/src/auth-storage.ts +4422 -0
  195. package/src/index.ts +54 -0
  196. package/src/model-cache.ts +129 -0
  197. package/src/model-manager.ts +469 -0
  198. package/src/model-thinking.ts +782 -0
  199. package/src/models.json +83530 -0
  200. package/src/models.json.d.ts +9 -0
  201. package/src/models.ts +56 -0
  202. package/src/prompts/turn-aborted-guidance.md +4 -0
  203. package/src/provider-details.ts +90 -0
  204. package/src/provider-models/bundled-references.ts +38 -0
  205. package/src/provider-models/descriptors.ts +355 -0
  206. package/src/provider-models/google.ts +88 -0
  207. package/src/provider-models/index.ts +5 -0
  208. package/src/provider-models/ollama.ts +153 -0
  209. package/src/provider-models/openai-compat.ts +2817 -0
  210. package/src/provider-models/special.ts +67 -0
  211. package/src/providers/aery-native-client.ts +228 -0
  212. package/src/providers/aery-native-server.ts +212 -0
  213. package/src/providers/amazon-bedrock.ts +873 -0
  214. package/src/providers/anthropic-client.ts +318 -0
  215. package/src/providers/anthropic-messages-server-schema.ts +243 -0
  216. package/src/providers/anthropic-messages-server.ts +683 -0
  217. package/src/providers/anthropic-wire.ts +268 -0
  218. package/src/providers/anthropic.ts +3094 -0
  219. package/src/providers/aws-credentials.ts +501 -0
  220. package/src/providers/aws-eventstream.ts +185 -0
  221. package/src/providers/aws-sigv4.ts +218 -0
  222. package/src/providers/azure-openai-responses.ts +361 -0
  223. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  224. package/src/providers/cursor/proto/agent.proto +3526 -0
  225. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  226. package/src/providers/cursor/proto/buf.yaml +17 -0
  227. package/src/providers/cursor.ts +2621 -0
  228. package/src/providers/error-message.ts +21 -0
  229. package/src/providers/github-copilot-headers.ts +140 -0
  230. package/src/providers/gitlab-duo.ts +372 -0
  231. package/src/providers/google-auth.ts +252 -0
  232. package/src/providers/google-gemini-cli.ts +809 -0
  233. package/src/providers/google-gemini-headers.ts +41 -0
  234. package/src/providers/google-shared.ts +917 -0
  235. package/src/providers/google-types.ts +167 -0
  236. package/src/providers/google-vertex.ts +91 -0
  237. package/src/providers/google.ts +41 -0
  238. package/src/providers/grammar.ts +70 -0
  239. package/src/providers/kimi.ts +52 -0
  240. package/src/providers/mock.ts +496 -0
  241. package/src/providers/ollama.ts +644 -0
  242. package/src/providers/openai-anthropic-shim.ts +138 -0
  243. package/src/providers/openai-chat-server-schema.ts +252 -0
  244. package/src/providers/openai-chat-server.ts +647 -0
  245. package/src/providers/openai-codex/constants.ts +43 -0
  246. package/src/providers/openai-codex/request-transformer.ts +161 -0
  247. package/src/providers/openai-codex/response-handler.ts +81 -0
  248. package/src/providers/openai-codex-responses.ts +3018 -0
  249. package/src/providers/openai-completions-compat.ts +300 -0
  250. package/src/providers/openai-completions.ts +1979 -0
  251. package/src/providers/openai-responses-server-schema.ts +290 -0
  252. package/src/providers/openai-responses-server.ts +1183 -0
  253. package/src/providers/openai-responses-shared.ts +873 -0
  254. package/src/providers/openai-responses.ts +679 -0
  255. package/src/providers/register-builtins.ts +436 -0
  256. package/src/providers/synthetic.ts +50 -0
  257. package/src/providers/transform-messages.ts +382 -0
  258. package/src/providers/vision-guard.ts +31 -0
  259. package/src/providers/xai-responses.ts +82 -0
  260. package/src/rate-limit-utils.ts +84 -0
  261. package/src/stream.ts +1065 -0
  262. package/src/types.ts +944 -0
  263. package/src/usage/claude.ts +482 -0
  264. package/src/usage/gemini.ts +250 -0
  265. package/src/usage/github-copilot.ts +421 -0
  266. package/src/usage/google-antigravity.ts +201 -0
  267. package/src/usage/kimi.ts +271 -0
  268. package/src/usage/minimax-code.ts +31 -0
  269. package/src/usage/openai-codex.ts +503 -0
  270. package/src/usage/shared.ts +10 -0
  271. package/src/usage/zai.ts +247 -0
  272. package/src/usage.ts +185 -0
  273. package/src/utils/abort.ts +51 -0
  274. package/src/utils/abortable-iterator.ts +69 -0
  275. package/src/utils/anthropic-auth.ts +93 -0
  276. package/src/utils/discovery/antigravity.ts +261 -0
  277. package/src/utils/discovery/codex.ts +371 -0
  278. package/src/utils/discovery/cursor.ts +306 -0
  279. package/src/utils/discovery/gemini.ts +248 -0
  280. package/src/utils/discovery/index.ts +4 -0
  281. package/src/utils/discovery/openai-compatible.ts +224 -0
  282. package/src/utils/event-stream.ts +142 -0
  283. package/src/utils/fireworks-model-id.ts +30 -0
  284. package/src/utils/foundry.ts +8 -0
  285. package/src/utils/http-inspector.ts +176 -0
  286. package/src/utils/idle-iterator.ts +267 -0
  287. package/src/utils/json-parse.ts +182 -0
  288. package/src/utils/oauth/__tests__/xai-oauth.test.ts +107 -0
  289. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  290. package/src/utils/oauth/anthropic.ts +273 -0
  291. package/src/utils/oauth/api-key-login.ts +87 -0
  292. package/src/utils/oauth/api-key-validation.ts +92 -0
  293. package/src/utils/oauth/callback-server.ts +276 -0
  294. package/src/utils/oauth/cerebras.ts +16 -0
  295. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  296. package/src/utils/oauth/cursor.ts +157 -0
  297. package/src/utils/oauth/deepseek.ts +53 -0
  298. package/src/utils/oauth/firepass.ts +24 -0
  299. package/src/utils/oauth/fireworks.ts +15 -0
  300. package/src/utils/oauth/github-copilot.ts +362 -0
  301. package/src/utils/oauth/gitlab-duo.ts +123 -0
  302. package/src/utils/oauth/google-antigravity.ts +200 -0
  303. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  304. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  305. package/src/utils/oauth/huggingface.ts +62 -0
  306. package/src/utils/oauth/index.ts +484 -0
  307. package/src/utils/oauth/kagi.ts +47 -0
  308. package/src/utils/oauth/kilo.ts +87 -0
  309. package/src/utils/oauth/kimi.ts +254 -0
  310. package/src/utils/oauth/litellm.ts +47 -0
  311. package/src/utils/oauth/lm-studio.ts +38 -0
  312. package/src/utils/oauth/minimax-code.ts +78 -0
  313. package/src/utils/oauth/moonshot.ts +23 -0
  314. package/src/utils/oauth/nanogpt.ts +15 -0
  315. package/src/utils/oauth/nvidia.ts +70 -0
  316. package/src/utils/oauth/oauth.html +203 -0
  317. package/src/utils/oauth/ollama-cloud.ts +28 -0
  318. package/src/utils/oauth/ollama.ts +47 -0
  319. package/src/utils/oauth/openai-codex.ts +299 -0
  320. package/src/utils/oauth/opencode.ts +49 -0
  321. package/src/utils/oauth/openrouter.ts +20 -0
  322. package/src/utils/oauth/parallel.ts +46 -0
  323. package/src/utils/oauth/perplexity.ts +206 -0
  324. package/src/utils/oauth/pkce.ts +18 -0
  325. package/src/utils/oauth/qianfan.ts +58 -0
  326. package/src/utils/oauth/qwen-portal.ts +60 -0
  327. package/src/utils/oauth/synthetic.ts +15 -0
  328. package/src/utils/oauth/tavily.ts +46 -0
  329. package/src/utils/oauth/together.ts +16 -0
  330. package/src/utils/oauth/types.ts +99 -0
  331. package/src/utils/oauth/venice.ts +59 -0
  332. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  333. package/src/utils/oauth/vllm.ts +40 -0
  334. package/src/utils/oauth/wafer.ts +50 -0
  335. package/src/utils/oauth/xai-oauth.ts +342 -0
  336. package/src/utils/oauth/xiaomi.ts +139 -0
  337. package/src/utils/oauth/zai.ts +60 -0
  338. package/src/utils/oauth/zenmux.ts +15 -0
  339. package/src/utils/oauth/zhipu.ts +60 -0
  340. package/src/utils/overflow.ts +137 -0
  341. package/src/utils/parse-bind.ts +54 -0
  342. package/src/utils/provider-response.ts +30 -0
  343. package/src/utils/request-debug.ts +336 -0
  344. package/src/utils/retry-after.ts +110 -0
  345. package/src/utils/retry.ts +54 -0
  346. package/src/utils/schema/CONSTRAINTS.md +164 -0
  347. package/src/utils/schema/adapt.ts +36 -0
  348. package/src/utils/schema/compatibility.ts +435 -0
  349. package/src/utils/schema/dereference.ts +98 -0
  350. package/src/utils/schema/draft.ts +341 -0
  351. package/src/utils/schema/equality.ts +97 -0
  352. package/src/utils/schema/fields.ts +191 -0
  353. package/src/utils/schema/index.ts +13 -0
  354. package/src/utils/schema/json-schema-validator.ts +577 -0
  355. package/src/utils/schema/meta-validator.ts +167 -0
  356. package/src/utils/schema/normalize.ts +1588 -0
  357. package/src/utils/schema/spill.ts +43 -0
  358. package/src/utils/schema/stamps.ts +97 -0
  359. package/src/utils/schema/types.ts +10 -0
  360. package/src/utils/schema/wire.ts +293 -0
  361. package/src/utils/schema/zod-decontaminate.ts +331 -0
  362. package/src/utils/sdk-stream-timeout.ts +43 -0
  363. package/src/utils/sse-debug.ts +289 -0
  364. package/src/utils/stream-markup-healing.ts +612 -0
  365. package/src/utils/tool-choice.ts +99 -0
  366. package/src/utils/validation.ts +1024 -0
  367. package/src/utils.ts +166 -0
  368. package/dist/api-registry.d.ts +0 -20
  369. package/dist/api-registry.d.ts.map +0 -1
  370. package/dist/api-registry.js +0 -44
  371. package/dist/api-registry.js.map +0 -1
  372. package/dist/bedrock-provider.d.ts +0 -5
  373. package/dist/bedrock-provider.d.ts.map +0 -1
  374. package/dist/bedrock-provider.js +0 -6
  375. package/dist/bedrock-provider.js.map +0 -1
  376. package/dist/cli.d.ts +0 -3
  377. package/dist/cli.d.ts.map +0 -1
  378. package/dist/cli.js +0 -130
  379. package/dist/cli.js.map +0 -1
  380. package/dist/env-api-keys.d.ts +0 -18
  381. package/dist/env-api-keys.d.ts.map +0 -1
  382. package/dist/env-api-keys.js +0 -178
  383. package/dist/env-api-keys.js.map +0 -1
  384. package/dist/image-models.d.ts +0 -10
  385. package/dist/image-models.d.ts.map +0 -1
  386. package/dist/image-models.generated.d.ts +0 -440
  387. package/dist/image-models.generated.d.ts.map +0 -1
  388. package/dist/image-models.generated.js +0 -442
  389. package/dist/image-models.generated.js.map +0 -1
  390. package/dist/image-models.js +0 -23
  391. package/dist/image-models.js.map +0 -1
  392. package/dist/images-api-registry.d.ts +0 -14
  393. package/dist/images-api-registry.d.ts.map +0 -1
  394. package/dist/images-api-registry.js +0 -22
  395. package/dist/images-api-registry.js.map +0 -1
  396. package/dist/images.d.ts +0 -4
  397. package/dist/images.d.ts.map +0 -1
  398. package/dist/images.js +0 -14
  399. package/dist/images.js.map +0 -1
  400. package/dist/index.d.ts +0 -32
  401. package/dist/index.d.ts.map +0 -1
  402. package/dist/index.js +0 -20
  403. package/dist/index.js.map +0 -1
  404. package/dist/models.d.ts +0 -18
  405. package/dist/models.d.ts.map +0 -1
  406. package/dist/models.generated.d.ts +0 -17480
  407. package/dist/models.generated.d.ts.map +0 -1
  408. package/dist/models.generated.js +0 -16339
  409. package/dist/models.generated.js.map +0 -1
  410. package/dist/models.js +0 -71
  411. package/dist/models.js.map +0 -1
  412. package/dist/oauth.d.ts +0 -2
  413. package/dist/oauth.d.ts.map +0 -1
  414. package/dist/oauth.js +0 -2
  415. package/dist/oauth.js.map +0 -1
  416. package/dist/providers/aery-error-formatting.d.ts +0 -13
  417. package/dist/providers/aery-error-formatting.d.ts.map +0 -1
  418. package/dist/providers/aery-error-formatting.js +0 -112
  419. package/dist/providers/aery-error-formatting.js.map +0 -1
  420. package/dist/providers/amazon-bedrock.d.ts +0 -38
  421. package/dist/providers/amazon-bedrock.d.ts.map +0 -1
  422. package/dist/providers/amazon-bedrock.js +0 -763
  423. package/dist/providers/amazon-bedrock.js.map +0 -1
  424. package/dist/providers/anthropic.d.ts +0 -71
  425. package/dist/providers/anthropic.d.ts.map +0 -1
  426. package/dist/providers/anthropic.js +0 -949
  427. package/dist/providers/anthropic.js.map +0 -1
  428. package/dist/providers/azure-openai-responses.d.ts +0 -15
  429. package/dist/providers/azure-openai-responses.d.ts.map +0 -1
  430. package/dist/providers/azure-openai-responses.js +0 -225
  431. package/dist/providers/azure-openai-responses.js.map +0 -1
  432. package/dist/providers/cloudflare.d.ts +0 -13
  433. package/dist/providers/cloudflare.d.ts.map +0 -1
  434. package/dist/providers/cloudflare.js +0 -26
  435. package/dist/providers/cloudflare.js.map +0 -1
  436. package/dist/providers/faux.d.ts +0 -56
  437. package/dist/providers/faux.d.ts.map +0 -1
  438. package/dist/providers/faux.js +0 -368
  439. package/dist/providers/faux.js.map +0 -1
  440. package/dist/providers/github-copilot-headers.d.ts +0 -8
  441. package/dist/providers/github-copilot-headers.d.ts.map +0 -1
  442. package/dist/providers/github-copilot-headers.js +0 -29
  443. package/dist/providers/github-copilot-headers.js.map +0 -1
  444. package/dist/providers/google-gemini-cli.d.ts +0 -74
  445. package/dist/providers/google-gemini-cli.d.ts.map +0 -1
  446. package/dist/providers/google-gemini-cli.js +0 -779
  447. package/dist/providers/google-gemini-cli.js.map +0 -1
  448. package/dist/providers/google-shared.d.ts +0 -70
  449. package/dist/providers/google-shared.d.ts.map +0 -1
  450. package/dist/providers/google-shared.js +0 -329
  451. package/dist/providers/google-shared.js.map +0 -1
  452. package/dist/providers/google-vertex.d.ts +0 -15
  453. package/dist/providers/google-vertex.d.ts.map +0 -1
  454. package/dist/providers/google-vertex.js +0 -442
  455. package/dist/providers/google-vertex.js.map +0 -1
  456. package/dist/providers/google.d.ts +0 -13
  457. package/dist/providers/google.d.ts.map +0 -1
  458. package/dist/providers/google.js +0 -400
  459. package/dist/providers/google.js.map +0 -1
  460. package/dist/providers/images/openrouter.d.ts +0 -3
  461. package/dist/providers/images/openrouter.d.ts.map +0 -1
  462. package/dist/providers/images/openrouter.js +0 -129
  463. package/dist/providers/images/openrouter.js.map +0 -1
  464. package/dist/providers/images/register-builtins.d.ts +0 -4
  465. package/dist/providers/images/register-builtins.d.ts.map +0 -1
  466. package/dist/providers/images/register-builtins.js +0 -34
  467. package/dist/providers/images/register-builtins.js.map +0 -1
  468. package/dist/providers/mistral.d.ts +0 -25
  469. package/dist/providers/mistral.d.ts.map +0 -1
  470. package/dist/providers/mistral.js +0 -535
  471. package/dist/providers/mistral.js.map +0 -1
  472. package/dist/providers/openai-codex-responses.d.ts +0 -30
  473. package/dist/providers/openai-codex-responses.d.ts.map +0 -1
  474. package/dist/providers/openai-codex-responses.js +0 -1090
  475. package/dist/providers/openai-codex-responses.js.map +0 -1
  476. package/dist/providers/openai-completions.d.ts +0 -19
  477. package/dist/providers/openai-completions.d.ts.map +0 -1
  478. package/dist/providers/openai-completions.js +0 -950
  479. package/dist/providers/openai-completions.js.map +0 -1
  480. package/dist/providers/openai-prompt-cache.d.ts +0 -3
  481. package/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  482. package/dist/providers/openai-prompt-cache.js +0 -10
  483. package/dist/providers/openai-prompt-cache.js.map +0 -1
  484. package/dist/providers/openai-responses-shared.d.ts +0 -18
  485. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  486. package/dist/providers/openai-responses-shared.js +0 -492
  487. package/dist/providers/openai-responses-shared.js.map +0 -1
  488. package/dist/providers/openai-responses.d.ts +0 -13
  489. package/dist/providers/openai-responses.d.ts.map +0 -1
  490. package/dist/providers/openai-responses.js +0 -237
  491. package/dist/providers/openai-responses.js.map +0 -1
  492. package/dist/providers/register-builtins.d.ts +0 -38
  493. package/dist/providers/register-builtins.d.ts.map +0 -1
  494. package/dist/providers/register-builtins.js +0 -278
  495. package/dist/providers/register-builtins.js.map +0 -1
  496. package/dist/providers/simple-options.d.ts +0 -8
  497. package/dist/providers/simple-options.d.ts.map +0 -1
  498. package/dist/providers/simple-options.js +0 -41
  499. package/dist/providers/simple-options.js.map +0 -1
  500. package/dist/providers/transform-messages.d.ts.map +0 -1
  501. package/dist/providers/transform-messages.js +0 -184
  502. package/dist/providers/transform-messages.js.map +0 -1
  503. package/dist/session-resources.d.ts +0 -4
  504. package/dist/session-resources.d.ts.map +0 -1
  505. package/dist/session-resources.js +0 -22
  506. package/dist/session-resources.js.map +0 -1
  507. package/dist/stream.d.ts +0 -8
  508. package/dist/stream.d.ts.map +0 -1
  509. package/dist/stream.js +0 -27
  510. package/dist/stream.js.map +0 -1
  511. package/dist/types.d.ts +0 -498
  512. package/dist/types.d.ts.map +0 -1
  513. package/dist/types.js +0 -2
  514. package/dist/types.js.map +0 -1
  515. package/dist/utils/diagnostics.d.ts +0 -19
  516. package/dist/utils/diagnostics.d.ts.map +0 -1
  517. package/dist/utils/diagnostics.js +0 -25
  518. package/dist/utils/diagnostics.js.map +0 -1
  519. package/dist/utils/event-stream.d.ts +0 -21
  520. package/dist/utils/event-stream.d.ts.map +0 -1
  521. package/dist/utils/event-stream.js +0 -81
  522. package/dist/utils/event-stream.js.map +0 -1
  523. package/dist/utils/hash.d.ts +0 -3
  524. package/dist/utils/hash.d.ts.map +0 -1
  525. package/dist/utils/hash.js +0 -14
  526. package/dist/utils/hash.js.map +0 -1
  527. package/dist/utils/headers.d.ts +0 -2
  528. package/dist/utils/headers.d.ts.map +0 -1
  529. package/dist/utils/headers.js +0 -8
  530. package/dist/utils/headers.js.map +0 -1
  531. package/dist/utils/json-parse.d.ts +0 -16
  532. package/dist/utils/json-parse.d.ts.map +0 -1
  533. package/dist/utils/json-parse.js +0 -113
  534. package/dist/utils/json-parse.js.map +0 -1
  535. package/dist/utils/node-http-proxy.d.ts +0 -10
  536. package/dist/utils/node-http-proxy.d.ts.map +0 -1
  537. package/dist/utils/node-http-proxy.js +0 -97
  538. package/dist/utils/node-http-proxy.js.map +0 -1
  539. package/dist/utils/oauth/anthropic.d.ts +0 -25
  540. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  541. package/dist/utils/oauth/anthropic.js +0 -335
  542. package/dist/utils/oauth/anthropic.js.map +0 -1
  543. package/dist/utils/oauth/device-code.d.ts +0 -19
  544. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  545. package/dist/utils/oauth/device-code.js +0 -55
  546. package/dist/utils/oauth/device-code.js.map +0 -1
  547. package/dist/utils/oauth/github-copilot.d.ts +0 -30
  548. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  549. package/dist/utils/oauth/github-copilot.js +0 -268
  550. package/dist/utils/oauth/github-copilot.js.map +0 -1
  551. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  552. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  553. package/dist/utils/oauth/google-antigravity.js +0 -377
  554. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  555. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  556. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  557. package/dist/utils/oauth/google-gemini-cli.js +0 -482
  558. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  559. package/dist/utils/oauth/index.d.ts +0 -63
  560. package/dist/utils/oauth/index.d.ts.map +0 -1
  561. package/dist/utils/oauth/index.js +0 -131
  562. package/dist/utils/oauth/index.js.map +0 -1
  563. package/dist/utils/oauth/oauth-page.d.ts +0 -3
  564. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  565. package/dist/utils/oauth/oauth-page.js +0 -105
  566. package/dist/utils/oauth/oauth-page.js.map +0 -1
  567. package/dist/utils/oauth/openai-codex.d.ts +0 -34
  568. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  569. package/dist/utils/oauth/openai-codex.js +0 -385
  570. package/dist/utils/oauth/openai-codex.js.map +0 -1
  571. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  572. package/dist/utils/oauth/pkce.js +0 -31
  573. package/dist/utils/oauth/pkce.js.map +0 -1
  574. package/dist/utils/oauth/types.d.ts +0 -64
  575. package/dist/utils/oauth/types.d.ts.map +0 -1
  576. package/dist/utils/oauth/types.js +0 -2
  577. package/dist/utils/oauth/types.js.map +0 -1
  578. package/dist/utils/overflow.d.ts.map +0 -1
  579. package/dist/utils/overflow.js +0 -151
  580. package/dist/utils/overflow.js.map +0 -1
  581. package/dist/utils/sanitize-unicode.d.ts +0 -22
  582. package/dist/utils/sanitize-unicode.d.ts.map +0 -1
  583. package/dist/utils/sanitize-unicode.js +0 -26
  584. package/dist/utils/sanitize-unicode.js.map +0 -1
  585. package/dist/utils/typebox-helpers.d.ts +0 -17
  586. package/dist/utils/typebox-helpers.d.ts.map +0 -1
  587. package/dist/utils/typebox-helpers.js +0 -21
  588. package/dist/utils/typebox-helpers.js.map +0 -1
  589. package/dist/utils/validation.d.ts +0 -18
  590. package/dist/utils/validation.d.ts.map +0 -1
  591. package/dist/utils/validation.js +0 -281
  592. package/dist/utils/validation.js.map +0 -1
@@ -0,0 +1,739 @@
1
+ /**
2
+ * Credential storage for API keys and OAuth tokens.
3
+ * Handles loading, saving, refreshing credentials, and usage tracking.
4
+ *
5
+ * This module defines:
6
+ * - `AuthCredentialStore` interface: persistence abstraction (SQLite, remote vault, …)
7
+ * - `AuthStorage` class: credential management with round-robin, usage limits, OAuth refresh
8
+ * - `SqliteAuthCredentialStore`: concrete SQLite-backed implementation
9
+ */
10
+ import { Database } from "bun:sqlite";
11
+ import type { Provider } from "./types";
12
+ import type { CredentialRankingStrategy, UsageLogger, UsageProvider, UsageReport } from "./usage";
13
+ import type { OAuthController, OAuthCredentials, OAuthProviderId } from "./utils/oauth/types";
14
+ export type ApiKeyCredential = {
15
+ type: "api_key";
16
+ key: string;
17
+ };
18
+ export type OAuthCredential = {
19
+ type: "oauth";
20
+ } & OAuthCredentials;
21
+ export type AuthCredential = ApiKeyCredential | OAuthCredential;
22
+ export type AuthCredentialEntry = AuthCredential | AuthCredential[];
23
+ export type AuthStorageData = Record<string, AuthCredentialEntry>;
24
+ /**
25
+ * Serialized representation of AuthStorage for passing to subagent workers.
26
+ * Contains only the essential credential data, not runtime state.
27
+ */
28
+ export interface SerializedAuthStorage {
29
+ credentials: Record<string, Array<{
30
+ id: number;
31
+ type: "api_key" | "oauth";
32
+ data: Record<string, unknown>;
33
+ }>>;
34
+ runtimeOverrides?: Record<string, string>;
35
+ dbPath?: string;
36
+ }
37
+ /**
38
+ * Auth credential with database row ID for updates/deletes.
39
+ * Wraps AuthCredential with storage metadata.
40
+ */
41
+ export interface StoredAuthCredential {
42
+ id: number;
43
+ provider: string;
44
+ credential: AuthCredential;
45
+ disabledCause: string | null;
46
+ }
47
+ /**
48
+ * Per-credential health record returned by {@link AuthStorage.checkCredentials}.
49
+ *
50
+ * Use this to identify which credential in a multi-account pool is causing
51
+ * auth errors. `ok` is tri-state:
52
+ *
53
+ * - `true` — credential authenticated against the provider's auth-verifying
54
+ * probe (today: the usage endpoint). For OAuth this also exercises refresh
55
+ * when the access token was expired.
56
+ * - `false` — the probe rejected the credential (401/403/refresh failure/etc).
57
+ * `reason` carries the upstream error string.
58
+ * - `null` — no probe is configured for this provider (or the configured
59
+ * probe doesn't support this credential type). The credential's auth
60
+ * status is unverifiable from here.
61
+ */
62
+ export interface CredentialHealthResult {
63
+ /** Database row id (matches {@link StoredAuthCredential.id}). */
64
+ id: number;
65
+ provider: string;
66
+ type: AuthCredential["type"];
67
+ /** OAuth email if known on the stored credential or surfaced by the probe. */
68
+ email?: string;
69
+ /** OAuth account id / org id if known. */
70
+ accountId?: string;
71
+ /** `true` when the refresh token lives on a remote broker (sentinel was present). */
72
+ remoteRefresh?: true;
73
+ ok: boolean | null;
74
+ /** Failure / unverifiable reason; absent when `ok === true`. */
75
+ reason?: string;
76
+ /** Probe usage report (raw payload stripped) when `ok === true`. */
77
+ report?: Omit<UsageReport, "raw">;
78
+ /**
79
+ * Result of the optional end-to-end completion probe (see
80
+ * {@link CheckCredentialsOptions.completionProbe}). Absent when no probe was
81
+ * supplied. The completion probe exercises the provider's chat-completion
82
+ * endpoint with the credential's bearer bytes, which is a stricter signal
83
+ * than the usage endpoint (some providers happily 200 a `/usage` call while
84
+ * the chat endpoint 401s the same bearer).
85
+ */
86
+ completion?: CredentialCompletionResult;
87
+ }
88
+ /**
89
+ * Outcome of the end-to-end completion probe. `null` means the probe was
90
+ * skipped (no bearer bytes were available — e.g. OAuth refresh failed
91
+ * upstream of the probe).
92
+ */
93
+ export interface CredentialCompletionResult {
94
+ ok: boolean | null;
95
+ /** Failure / unverifiable reason; absent when `ok === true`. */
96
+ reason?: string;
97
+ /** Probe model id used (carried back from the caller for display). */
98
+ modelId?: string;
99
+ /** Round-trip latency in milliseconds. */
100
+ latencyMs?: number;
101
+ }
102
+ /**
103
+ * Credential payload handed to {@link CompletionProbe}. For API-key
104
+ * credentials only the bytes are exposed; for OAuth, every identity field
105
+ * carried by the refreshed credential is included so the probe can compose
106
+ * provider-specific apiKey shapes (e.g. GitHub Copilot / Google Gemini CLI
107
+ * expect a JSON blob with `token` + `projectId`, not the raw access token).
108
+ *
109
+ * `refreshToken` may be {@link REMOTE_REFRESH_SENTINEL} when the credential
110
+ * lives behind a broker; the chat endpoint never reads it, so the probe can
111
+ * forward it verbatim into the structured shape without harm.
112
+ */
113
+ export type CompletionProbeCredential = {
114
+ type: "api_key";
115
+ apiKey: string;
116
+ } | {
117
+ type: "oauth";
118
+ accessToken: string;
119
+ refreshToken?: string;
120
+ expiresAt?: number;
121
+ accountId?: string;
122
+ projectId?: string;
123
+ email?: string;
124
+ enterpriseUrl?: string;
125
+ };
126
+ /**
127
+ * Caller-supplied bearer probe. Receives the post-refresh credential for a
128
+ * single row and reports whether a real chat-completion round-trip succeeds.
129
+ * The check-credentials pipeline calls this AFTER any OAuth refresh so the
130
+ * bytes match what a live request would send.
131
+ */
132
+ export interface CompletionProbeInput {
133
+ provider: Provider;
134
+ credentialId: number;
135
+ credential: CompletionProbeCredential;
136
+ signal: AbortSignal;
137
+ }
138
+ export type CompletionProbe = (input: CompletionProbeInput) => Promise<CredentialCompletionResult>;
139
+ export interface CheckCredentialsOptions {
140
+ signal?: AbortSignal;
141
+ /** Per-credential probe timeout (ms). Defaults to the configured usage request timeout. */
142
+ timeoutMs?: number;
143
+ /** Provider → base URL override, same shape as {@link AuthStorage.fetchUsageReports}. */
144
+ baseUrlResolver?: (provider: Provider) => string | undefined;
145
+ /**
146
+ * Optional end-to-end probe. When provided, `checkCredentials` invokes it
147
+ * for every credential where a usable bearer is available (API key, or
148
+ * OAuth access token after refresh-on-expiry succeeded). The result lands
149
+ * on {@link CredentialHealthResult.completion}.
150
+ *
151
+ * The probe runs INDEPENDENTLY of whether a {@link UsageProvider} is
152
+ * configured: providers without a usage endpoint still benefit from the
153
+ * extra signal. The probe is NOT invoked when OAuth refresh fails — the
154
+ * bytes would be stale anyway and the upstream failure is already captured
155
+ * on `reason`.
156
+ */
157
+ completionProbe?: CompletionProbe;
158
+ /** Per-credential completion probe timeout (ms). Defaults to `timeoutMs`. */
159
+ completionTimeoutMs?: number;
160
+ }
161
+ /**
162
+ * Sentinel value placed in OAuth `refresh` fields when a credential is shared
163
+ * via {@link AuthStorage.exportSnapshot}. Refresh tokens never leave the broker;
164
+ * clients must call back to refresh.
165
+ */
166
+ export declare const REMOTE_REFRESH_SENTINEL: "__remote__";
167
+ export type RemoteRefreshSentinel = typeof REMOTE_REFRESH_SENTINEL;
168
+ /** OAuth credential with refresh token replaced by the broker sentinel. */
169
+ export type RemoteOAuthCredential = Omit<OAuthCredential, "refresh"> & {
170
+ refresh: RemoteRefreshSentinel;
171
+ };
172
+ /** Discriminated credential payload as published by the broker. */
173
+ export type SnapshotCredential = ApiKeyCredential | RemoteOAuthCredential;
174
+ export interface AuthCredentialSnapshotEntry {
175
+ id: number;
176
+ provider: string;
177
+ credential: SnapshotCredential;
178
+ identityKey: string | null;
179
+ }
180
+ /**
181
+ * Wire-shaped snapshot exported by {@link AuthStorage.exportSnapshot} and
182
+ * served by the auth-broker server on `GET /v1/snapshot`.
183
+ */
184
+ export interface AuthCredentialSnapshot {
185
+ generation: number;
186
+ generatedAt: number;
187
+ credentials: AuthCredentialSnapshotEntry[];
188
+ }
189
+ /**
190
+ * Persistence abstraction consumed by {@link AuthStorage}.
191
+ *
192
+ * Concrete implementations:
193
+ * - {@link SqliteAuthCredentialStore} — local SQLite-backed store (default).
194
+ * - `RemoteAuthCredentialStore` from `./auth-broker` — client-side snapshot of
195
+ * a remote broker; mutating methods (`replace*`, `upsert*`, `delete*ForProvider`)
196
+ * throw because login flows route through the broker, not the client.
197
+ */
198
+ export interface AuthCredentialStore {
199
+ close(): void;
200
+ listAuthCredentials(provider?: string): StoredAuthCredential[];
201
+ updateAuthCredential(id: number, credential: AuthCredential): void;
202
+ deleteAuthCredential(id: number, disabledCause: string): void;
203
+ tryDisableAuthCredentialIfMatches(id: number, expectedData: string, disabledCause: string): boolean;
204
+ replaceAuthCredentialsForProvider(provider: string, credentials: AuthCredential[]): StoredAuthCredential[];
205
+ upsertAuthCredentialForProvider(provider: string, credential: AuthCredential): StoredAuthCredential[];
206
+ deleteAuthCredentialsForProvider(provider: string, disabledCause: string): void;
207
+ getCache(key: string, options?: {
208
+ includeExpired?: boolean;
209
+ }): string | null;
210
+ setCache(key: string, value: string, expiresAtSec: number): void;
211
+ cleanExpiredCache(): void;
212
+ /**
213
+ * Optional store-supplied OAuth refresh. When present, `AuthStorage` uses
214
+ * it before the per-provider local refresh path. `RemoteAuthCredentialStore`
215
+ * implements this against the broker; SQLite stores leave it undefined.
216
+ *
217
+ * Precedence: `AuthStorageOptions.refreshOAuthCredential` > this hook > local.
218
+ *
219
+ * `signal` propagates the agent's cancel (ESC, request abort, …) all the
220
+ * way to the broker fetch so a hung connection can't strand the caller
221
+ * for `timeoutMs * (maxRetries + 1)`.
222
+ */
223
+ refreshOAuthCredential?(provider: Provider, credentialId: number, credential: OAuthCredential, signal?: AbortSignal): Promise<OAuthCredentials>;
224
+ /**
225
+ * Optional async pre-read hook invoked after AuthStorage selects a stored
226
+ * credential but before it returns that credential for an outbound request.
227
+ * Remote broker stores use this to wait out imminent rotations and refresh
228
+ * their local snapshot before the caller sees a stale access token.
229
+ */
230
+ prepareForRequest?(credentialId: number, opts?: {
231
+ signal?: AbortSignal;
232
+ }): Promise<boolean | undefined>;
233
+ /**
234
+ * Optional store-supplied aggregate usage fetch. When present, `AuthStorage`
235
+ * routes `fetchUsageReports()` here instead of fanning out per-credential.
236
+ * `RemoteAuthCredentialStore` proxies to the broker (whose datacenter IP
237
+ * isn't rate-limited like a heavy residential client).
238
+ *
239
+ * Precedence: `AuthStorageOptions.fetchUsageReports` > this hook > local fan-out.
240
+ *
241
+ * `signal` propagates the agent's cancel down to the broker fetch.
242
+ */
243
+ fetchUsageReports?(signal?: AbortSignal): Promise<UsageReport[] | null>;
244
+ /**
245
+ * Optional store-supplied per-credential usage report lookup. When present,
246
+ * `AuthStorage` consults this before its own per-credential upstream fetch
247
+ * (`#getUsageReport`). `RemoteAuthCredentialStore` implements this against
248
+ * the broker's aggregate `/v1/usage` (one coalesced round-trip shared across
249
+ * all callers) so multi-credential ranking on the client never hits the
250
+ * upstream provider's rate-limited usage endpoint from the laptop IP.
251
+ *
252
+ * Returning `null` is authoritative — `AuthStorage` does NOT fall back to
253
+ * the local fetch path. The store hook owns the decision, since falling
254
+ * back would re-introduce the per-IP rate-limit problem the broker exists
255
+ * to avoid.
256
+ *
257
+ * `signal` propagates the agent's cancel down to the broker fetch.
258
+ */
259
+ getUsageReport?(provider: Provider, credential: OAuthCredential, signal?: AbortSignal): Promise<UsageReport | null>;
260
+ /**
261
+ * Optional store hook to invalidate a specific credential after the upstream
262
+ * provider returned 401 on a supposedly-fresh key. Remote stores force the
263
+ * broker to re-issue the row; local stores can leave it undefined and let
264
+ * {@link AuthStorage.invalidateCredentialMatching} fall back to `reload()`.
265
+ */
266
+ markCredentialSuspect?(credentialId: number, opts?: {
267
+ signal?: AbortSignal;
268
+ }): Promise<void>;
269
+ /**
270
+ * Optional async write hook for upserting a single credential. When present,
271
+ * `AuthStorage.#upsertOAuthCredential` routes through this instead of the
272
+ * sync `upsertAuthCredentialForProvider`. `RemoteAuthCredentialStore` uses
273
+ * it to send the upsert to the broker via `POST /v1/credential`.
274
+ *
275
+ * Implementations MUST update the in-memory snapshot before returning so the
276
+ * post-write read path is consistent.
277
+ */
278
+ upsertAuthCredentialRemote?(provider: string, credential: AuthCredential): Promise<StoredAuthCredential[]>;
279
+ /**
280
+ * Optional async write hook for replace-all semantics (e.g. API-key login
281
+ * overwriting any previous keys for the same provider). When present,
282
+ * `AuthStorage.set` routes through this instead of the sync
283
+ * `replaceAuthCredentialsForProvider`.
284
+ */
285
+ replaceAuthCredentialsRemote?(provider: string, credentials: AuthCredential[]): Promise<StoredAuthCredential[]>;
286
+ /**
287
+ * Optional async write hook for clearing every credential for a provider
288
+ * (logout). When present, `AuthStorage.remove` routes through this instead
289
+ * of the sync `deleteAuthCredentialsForProvider`.
290
+ */
291
+ deleteAuthCredentialsRemote?(provider: string, disabledCause: string): Promise<void>;
292
+ }
293
+ /**
294
+ * Event payload describing a credential that was just soft-disabled.
295
+ *
296
+ * Today the only call site is OAuth refresh failures with a definitive cause
297
+ * (`invalid_grant`, `401/403` not from a network blip, etc.) — the
298
+ * disabled_cause string is the verbatim error captured for forensics.
299
+ *
300
+ * Subscribers can use this to surface a notification, banner, or auto-launch
301
+ * a re-login flow instead of letting the credential silently disappear.
302
+ */
303
+ export interface CredentialDisabledEvent {
304
+ provider: string;
305
+ disabledCause: string;
306
+ }
307
+ export type AuthStorageOptions = {
308
+ usageProviderResolver?: (provider: Provider) => UsageProvider | undefined;
309
+ rankingStrategyResolver?: (provider: Provider) => CredentialRankingStrategy | undefined;
310
+ usageFetch?: typeof fetch;
311
+ usageRequestTimeoutMs?: number;
312
+ usageLogger?: UsageLogger;
313
+ /**
314
+ * Resolve a config value (API key, header value, etc.) to an actual value.
315
+ * - coding-agent injects its resolveConfigValue (supports "!command" syntax via aery-engine)
316
+ * - Default: checks environment variable first, then treats as literal
317
+ */
318
+ configValueResolver?: (config: string) => Promise<string | undefined>;
319
+ /**
320
+ * Optional callback fired when AuthStorage automatically disables a
321
+ * credential because something detected it as no longer usable — today
322
+ * that's the OAuth refresh-failure path in `getApiKey`. NOT fired for
323
+ * user-initiated `remove()` (the user already knows) or dedup of
324
+ * duplicate credentials (uninteresting hygiene).
325
+ */
326
+ onCredentialDisabled?: (event: CredentialDisabledEvent) => void | Promise<void>;
327
+ /**
328
+ * Override OAuth refresh. When set, `AuthStorage` calls this instead of the
329
+ * per-provider local refresh function. Receives the credential id so the
330
+ * implementation can address remote credentials.
331
+ *
332
+ * Must return updated {@link OAuthCredentials} with at least `access` and
333
+ * `expires`. `refresh` may be an opaque sentinel (e.g. `"__remote__"`) when
334
+ * the actual refresh token never leaves the broker.
335
+ */
336
+ refreshOAuthCredential?: (provider: Provider, credentialId: number, credential: OAuthCredential, signal?: AbortSignal) => Promise<OAuthCredentials>;
337
+ /**
338
+ * Human-readable description of the credential store backing this
339
+ * AuthStorage instance. Surfaced through {@link AuthStorage.describeCredentialSource}
340
+ * so the TUI can show where a token came from (broker URL or local SQLite path).
341
+ *
342
+ * Examples:
343
+ * - `"local ~/.aery/agent/agent.db"`
344
+ * - `"broker http://can.internal:8765"`
345
+ */
346
+ sourceLabel?: string;
347
+ /**
348
+ * Override `fetchUsageReports`. When set, `AuthStorage.fetchUsageReports`
349
+ * calls this instead of fanning out per-credential. The primary use case is
350
+ * routing through a broker that egresses from a less-throttled IP — e.g. a
351
+ * residential laptop trips Anthropic's per-IP rate limit on the usage
352
+ * endpoint and drops 2-of-5 credentials, while the VPS broker gets all 5.
353
+ *
354
+ * Implementations may return null when no usage data is available; the
355
+ * AuthStorage caller surfaces that to its own consumer unchanged.
356
+ */
357
+ fetchUsageReports?: (signal?: AbortSignal) => Promise<UsageReport[] | null>;
358
+ };
359
+ export declare function isDefinitiveOAuthFailure(errorMsg: string): boolean;
360
+ type AuthApiKeyOptions = {
361
+ baseUrl?: string;
362
+ modelId?: string;
363
+ /**
364
+ * Caller's cancel signal. Threaded into any broker-bound OAuth refresh so
365
+ * `ESC` / request abort actually kills a hung broker fetch instead of
366
+ * stranding the caller for `timeoutMs * (maxRetries + 1)`.
367
+ */
368
+ signal?: AbortSignal;
369
+ };
370
+ /**
371
+ * Refreshed OAuth access plus identity metadata returned by
372
+ * {@link AuthStorage.getOAuthAccess}. Callers that authenticate via a bearer
373
+ * AND need the credential's identity (Codex `chatgpt-account-id`, Google
374
+ * `projectId`, GitHub `enterpriseUrl`) consume this shape directly; the
375
+ * refresh slot is deliberately omitted because rotating refresh tokens never
376
+ * leave {@link AuthStorage}.
377
+ */
378
+ export interface OAuthAccess {
379
+ accessToken: string;
380
+ accountId?: string;
381
+ email?: string;
382
+ projectId?: string;
383
+ enterpriseUrl?: string;
384
+ }
385
+ export interface InvalidateCredentialMatchingOptions {
386
+ signal?: AbortSignal;
387
+ sessionId?: string;
388
+ }
389
+ /**
390
+ * Credential storage backed by an AuthCredentialStore.
391
+ * Reads from storage on reload(), manages round-robin credential selection,
392
+ * usage limit tracking, and OAuth token refresh.
393
+ */
394
+ export declare class AuthStorage {
395
+ #private;
396
+ constructor(store: AuthCredentialStore, options?: AuthStorageOptions);
397
+ /**
398
+ * Create an AuthStorage instance backed by a AuthCredentialStore.
399
+ * Convenience factory for standalone use (e.g., aery-ai CLI).
400
+ * @param dbPath - Path to SQLite database
401
+ */
402
+ static create(dbPath: string, options?: AuthStorageOptions): Promise<AuthStorage>;
403
+ /**
404
+ * Close the underlying credential store.
405
+ *
406
+ * After calling this, the instance must not be reused.
407
+ */
408
+ close(): void;
409
+ getGeneration(): number;
410
+ onGenerationChanged(listener: (generation: number) => void): () => void;
411
+ offGenerationChanged(listener: (generation: number) => void): void;
412
+ /**
413
+ * Subscribe to {@link CredentialDisabledEvent}s. Multiple subscribers are supported and
414
+ * each fires for every disable event; subscribers are invoked in registration order with
415
+ * exceptions and async rejections isolated per-listener so a misbehaving subscriber
416
+ * cannot break the disable path or starve the rest of the chain.
417
+ *
418
+ * If `credential_disabled` events were emitted while no listener was subscribed, they are
419
+ * replayed (in insertion order) to the listener that triggers the empty→non-empty
420
+ * transition. The drain is one-shot — listeners that subscribe after that no longer see
421
+ * past events.
422
+ *
423
+ * Returns an unsubscribe function. The function is idempotent: calling it more than once
424
+ * is a no-op. After every subscriber has unsubscribed, subsequent disable events buffer
425
+ * again until the next subscribe.
426
+ *
427
+ * @param listener Callback invoked with each disable event. May be sync or async.
428
+ * @returns A function that removes this listener from the subscriber set.
429
+ */
430
+ onCredentialDisabled(listener: (event: CredentialDisabledEvent) => void | Promise<void>): () => void;
431
+ /**
432
+ * Set a runtime API key override (not persisted to disk).
433
+ * Used for CLI --api-key flag.
434
+ */
435
+ setRuntimeApiKey(provider: string, apiKey: string): void;
436
+ /**
437
+ * Remove a runtime API key override.
438
+ */
439
+ removeRuntimeApiKey(provider: string): void;
440
+ /**
441
+ * Register a per-provider API key sourced from user configuration
442
+ * (e.g. `models.yml` `providers.<name>.apiKey`). Higher priority than
443
+ * stored credentials and OAuth tokens — when the user pins a key in
444
+ * config, that key is what authenticates outbound requests, regardless
445
+ * of whatever the broker happens to have loaded for that provider.
446
+ *
447
+ * Lower priority than {@link setRuntimeApiKey} so a CLI `--api-key`
448
+ * still wins for the duration of a single invocation.
449
+ */
450
+ setConfigApiKey(provider: string, apiKey: string): void;
451
+ /**
452
+ * Remove a single config-sourced API key override.
453
+ */
454
+ removeConfigApiKey(provider: string): void;
455
+ /**
456
+ * Drop every config-sourced API key. Called by `ModelRegistry` before
457
+ * re-parsing `models.yml` so removed entries actually disappear.
458
+ */
459
+ clearConfigApiKeys(): void;
460
+ /**
461
+ * Set a fallback resolver for API keys not found in storage or env vars.
462
+ * Used for custom provider keys from models.json.
463
+ */
464
+ setFallbackResolver(resolver: (provider: string) => string | undefined): void;
465
+ /**
466
+ * Reload credentials from storage.
467
+ */
468
+ reload(): Promise<void>;
469
+ /**
470
+ * Get credential for a provider (first entry if multiple).
471
+ */
472
+ get(provider: string): AuthCredential | undefined;
473
+ /**
474
+ * Set credential for a provider.
475
+ */
476
+ set(provider: string, credential: AuthCredentialEntry): Promise<void>;
477
+ /**
478
+ * Remove credential for a provider.
479
+ */
480
+ remove(provider: string): Promise<void>;
481
+ /**
482
+ * List all providers with credentials.
483
+ */
484
+ list(): string[];
485
+ /**
486
+ * Check if credentials exist for a provider in storage.
487
+ */
488
+ has(provider: string): boolean;
489
+ /**
490
+ * Check if any form of auth is configured for a provider.
491
+ * Unlike getApiKey(), this doesn't refresh OAuth tokens.
492
+ */
493
+ hasAuth(provider: string): boolean;
494
+ /**
495
+ * True iff a dedicated, non-env credential source is configured for this
496
+ * provider — i.e. anything in the cascade EXCEPT `getEnvApiKey(provider)`.
497
+ *
498
+ * Mirrors `hasAuth` minus the env-fallback leg. Useful for callers that
499
+ * need to distinguish "the user explicitly configured this provider"
500
+ * from "an env var happens to alias this provider via the cross-provider
501
+ * fallback map" (see e.g. `xai-oauth → XAI_OAUTH_TOKEN || XAI_API_KEY` in
502
+ * `stream.ts`). Without that distinction, an `XAI_API_KEY`-only setup
503
+ * silently satisfies xai-oauth and routes around `providers.xai.baseUrl`.
504
+ */
505
+ hasNonEnvCredential(provider: string): boolean;
506
+ /**
507
+ * Check if OAuth credentials are configured for a provider.
508
+ */
509
+ hasOAuth(provider: string): boolean;
510
+ /**
511
+ * Get OAuth credentials for a provider.
512
+ */
513
+ getOAuthCredential(provider: string): OAuthCredential | undefined;
514
+ /**
515
+ * Get the OAuth `accountId` for a provider, preferring the credential that is
516
+ * session-sticky for `sessionId` when multiple OAuth credentials are configured.
517
+ * Falls back to the first OAuth credential when no session preference exists (e.g.
518
+ * first call before any `getApiKey` has been issued, or single-credential setups).
519
+ * Returns `undefined` when no OAuth credential carries an `accountId`.
520
+ */
521
+ getOAuthAccountId(provider: string, sessionId?: string): string | undefined;
522
+ /**
523
+ * Get all credentials.
524
+ */
525
+ getAll(): AuthStorageData;
526
+ /**
527
+ * Login to an OAuth provider.
528
+ */
529
+ login(provider: OAuthProviderId, ctrl: OAuthController & {
530
+ /** onAuth is required by auth-storage but optional in OAuthController */
531
+ onAuth: (info: {
532
+ url: string;
533
+ instructions?: string;
534
+ }) => void;
535
+ /** onPrompt is required for some providers (github-copilot, openai-codex) */
536
+ onPrompt: (prompt: {
537
+ message: string;
538
+ placeholder?: string;
539
+ }) => Promise<string>;
540
+ }): Promise<void>;
541
+ /**
542
+ * Logout from a provider.
543
+ */
544
+ logout(provider: string): Promise<void>;
545
+ ingestUsageHeaders(provider: Provider, headers: Record<string, string>, options?: {
546
+ sessionId?: string;
547
+ baseUrl?: string;
548
+ }): boolean;
549
+ fetchUsageReports(options?: {
550
+ baseUrlResolver?: (provider: Provider) => string | undefined;
551
+ /** Caller's cancel signal; only rejects this caller, never the shared upstream fetch. */
552
+ signal?: AbortSignal;
553
+ }): Promise<UsageReport[] | null>;
554
+ /**
555
+ * Probe each stored credential against its provider's auth-verifying usage
556
+ * endpoint and report per-credential auth health.
557
+ *
558
+ * Surfaces the identity of failing credentials so callers running a
559
+ * multi-account pool (e.g. a broker-backed auth-gateway) can tell which
560
+ * row is producing 401s. The probe mirrors the per-credential fan-out
561
+ * inside {@link AuthStorage.fetchUsageReports} (OAuth refresh-on-expiry,
562
+ * then `UsageProvider.fetchUsage`) but does NOT swallow errors — every
563
+ * credential gets either `ok: true`, `ok: false` with `reason`, or
564
+ * `ok: null` when no probe is configured for the provider.
565
+ *
566
+ * Iterates sequentially to avoid synchronized N-account fan-out that
567
+ * upstream `/usage` rate limiters (per source IP) treat as a burst.
568
+ *
569
+ * Only inspects active rows from {@link AuthCredentialStore.listAuthCredentials};
570
+ * soft-disabled rows are already known-bad and don't need a network probe.
571
+ * Environment-variable API keys are not enumerated — the caller's intent
572
+ * here is "which of my stored credentials is broken".
573
+ *
574
+ * Pass {@link CheckCredentialsOptions.completionProbe} to additionally
575
+ * exercise each credential against the provider's chat-completion endpoint
576
+ * (strict mode). The result lands on
577
+ * {@link CredentialHealthResult.completion}; the usage `ok` field is
578
+ * unchanged so callers can tell the two signals apart.
579
+ */
580
+ checkCredentials(options?: CheckCredentialsOptions): Promise<CredentialHealthResult[]>;
581
+ /**
582
+ * Marks the current session's credential as temporarily blocked due to usage limits.
583
+ * Uses usage reports to determine accurate reset time when available.
584
+ * Returns true if a credential was blocked, enabling automatic fallback to the next credential.
585
+ */
586
+ markUsageLimitReached(provider: string, sessionId: string | undefined, options?: {
587
+ retryAfterMs?: number;
588
+ baseUrl?: string;
589
+ signal?: AbortSignal;
590
+ }): Promise<boolean>;
591
+ /**
592
+ * Peek at API key for a provider without refreshing OAuth tokens.
593
+ * Used for model discovery where we only need to know if credentials exist
594
+ * and get a best-effort token. For GitHub Copilot we preserve enterprise
595
+ * routing metadata so discovery can hit the correct host.
596
+ */
597
+ peekApiKey(provider: string): Promise<string | undefined>;
598
+ /**
599
+ * Get API key for a provider.
600
+ * Priority:
601
+ * 1. Runtime override (CLI --api-key)
602
+ * 2. Config override (models.yml `providers.<name>.apiKey`)
603
+ * 3. API key from storage
604
+ * 4. OAuth token from storage (auto-refreshed)
605
+ * 5. Environment variable
606
+ * 6. Fallback resolver (models.yml custom providers, last-resort)
607
+ */
608
+ getApiKey(provider: string, sessionId?: string, options?: AuthApiKeyOptions): Promise<string | undefined>;
609
+ /**
610
+ * Resolve the OAuth credential for `provider`, refreshing through the same
611
+ * pipeline as {@link AuthStorage.getApiKey} but returning the refreshed
612
+ * {@link OAuthAccess} (raw access token + identity metadata) instead of
613
+ * the API-key bytes.
614
+ *
615
+ * Use this when the caller needs to inject identity headers alongside the
616
+ * bearer (Codex `chatgpt-account-id`, Google `project`, GitHub
617
+ * `enterpriseUrl`). For pure "give me the bytes for `Authorization`"
618
+ * scenarios, prefer {@link AuthStorage.getApiKey}.
619
+ *
620
+ * Returns `undefined` when no OAuth credential is available, the
621
+ * credential fails to refresh, or runtime/config overrides have replaced
622
+ * OAuth with an explicit API key.
623
+ */
624
+ getOAuthAccess(provider: string, sessionId?: string, options?: AuthApiKeyOptions): Promise<OAuthAccess | undefined>;
625
+ invalidateCredentialMatching(provider: string, apiKey: string, options?: InvalidateCredentialMatchingOptions): Promise<boolean>;
626
+ invalidateCredentialMatching(provider: string, apiKey: string, signal?: AbortSignal): Promise<boolean>;
627
+ /**
628
+ * Build a redacted snapshot of all loaded credentials for the auth-broker
629
+ * wire. OAuth refresh tokens are replaced with {@link REMOTE_REFRESH_SENTINEL}
630
+ * so clients never see the actual refresh token.
631
+ *
632
+ * Callers must {@link AuthStorage.reload} first when serving a stale snapshot
633
+ * (the broker server's HTTP handler does this).
634
+ */
635
+ exportSnapshot(): AuthCredentialSnapshot;
636
+ /**
637
+ * Refresh the OAuth credential with the given id through a per-credential
638
+ * single-flight. Concurrent callers for the same row await the same upstream
639
+ * refresh attempt, which is required for providers that rotate refresh tokens
640
+ * on every successful refresh.
641
+ */
642
+ refreshCredentialById(id: number, signal?: AbortSignal): Promise<AuthCredentialSnapshotEntry>;
643
+ /**
644
+ * Force-refresh the OAuth credential with the given id, bypassing the
645
+ * not-yet-expired guard. Used by the auth-broker server to honour
646
+ * `POST /v1/credential/:id/refresh`.
647
+ *
648
+ * Returns the redacted snapshot entry for the refreshed row.
649
+ * Throws when no OAuth credential with that id is loaded.
650
+ */
651
+ forceRefreshCredentialById(id: number, signal?: AbortSignal): Promise<AuthCredentialSnapshotEntry>;
652
+ /**
653
+ * Disable the credential with the given id and emit a
654
+ * {@link CredentialDisabledEvent}. Used by the auth-broker server to honour
655
+ * `POST /v1/credential/:id/disable`. Returns `false` when no such row exists.
656
+ */
657
+ disableCredentialById(id: number, disabledCause: string): boolean;
658
+ /**
659
+ * Upsert a credential into the underlying store, refresh the in-memory
660
+ * snapshot, and return the redacted snapshot entries for the provider.
661
+ *
662
+ * Used by the auth-broker server to honour `POST /v1/credential`. The
663
+ * persistence layer (`SqliteAuthCredentialStore.upsertAuthCredentialForProvider`)
664
+ * does identity-key matching, so re-uploading the same email/account replaces
665
+ * the existing row instead of inserting a duplicate.
666
+ */
667
+ upsertCredential(provider: string, credential: AuthCredential): AuthCredentialSnapshotEntry[];
668
+ /**
669
+ * Describe where the active credential for a provider came from.
670
+ *
671
+ * Surfaces four layers, highest precedence first:
672
+ * 1. Runtime override (`--api-key`).
673
+ * 2. Config override (`models.yml` `providers.<name>.apiKey`).
674
+ * 3. Stored credential (the one this session is currently sticky to, or the
675
+ * one round-robin would pick next when no session id is supplied).
676
+ * 4. Env var / fallback resolver — when no stored credential exists.
677
+ *
678
+ * The string is purely informational; consumers must not parse it.
679
+ */
680
+ describeCredentialSource(provider: string, sessionId?: string): string | undefined;
681
+ }
682
+ /**
683
+ * Default SQLite-backed implementation of {@link AuthCredentialStore}.
684
+ *
685
+ * Used by the aery-ai CLI and as the default store for `AuthStorage.create()`.
686
+ * Also exposes convenience methods (`saveOAuth`, `getOAuth`, `saveApiKey`,
687
+ * `getApiKey`, `listProviders`, `deleteProvider`) that callers can use directly
688
+ * without going through `AuthStorage`.
689
+ */
690
+ export declare class SqliteAuthCredentialStore implements AuthCredentialStore {
691
+ #private;
692
+ constructor(db: Database);
693
+ static open(dbPath?: string): Promise<SqliteAuthCredentialStore>;
694
+ listAuthCredentials(provider?: string): StoredAuthCredential[];
695
+ replaceAuthCredentialsForProvider(provider: string, credentials: AuthCredential[]): StoredAuthCredential[];
696
+ upsertAuthCredentialForProvider(provider: string, credential: AuthCredential): StoredAuthCredential[];
697
+ updateAuthCredential(id: number, credential: AuthCredential): void;
698
+ deleteAuthCredential(id: number, disabledCause: string): void;
699
+ /**
700
+ * CAS-style disable: only soft-deletes the row when its `data` column still
701
+ * matches `expectedData` and the row has not already been disabled. Used by
702
+ * the OAuth refresh-failure path to avoid clobbering a peer that rotated the
703
+ * row between our pre-check and the disable.
704
+ */
705
+ tryDisableAuthCredentialIfMatches(id: number, expectedData: string, disabledCause: string): boolean;
706
+ deleteAuthCredentialsForProvider(provider: string, disabledCause: string): void;
707
+ getCache(key: string, options?: {
708
+ includeExpired?: boolean;
709
+ }): string | null;
710
+ setCache(key: string, value: string, expiresAtSec: number): void;
711
+ cleanExpiredCache(): void;
712
+ /**
713
+ * Save OAuth credentials for a provider.
714
+ * Preserves unrelated identities and replaces only the matching credential.
715
+ */
716
+ saveOAuth(provider: string, credentials: OAuthCredentials): void;
717
+ /**
718
+ * Get OAuth credentials for a provider.
719
+ */
720
+ getOAuth(provider: string): OAuthCredentials | null;
721
+ /**
722
+ * Save API key for a provider (replaces existing).
723
+ */
724
+ saveApiKey(provider: string, apiKey: string): void;
725
+ /**
726
+ * Get API key for a provider.
727
+ */
728
+ getApiKey(provider: string): string | null;
729
+ /**
730
+ * List all providers with credentials.
731
+ */
732
+ listProviders(): string[];
733
+ /**
734
+ * Delete all credentials for a provider.
735
+ */
736
+ deleteProvider(provider: string): void;
737
+ close(): void;
738
+ }
739
+ export {};