@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,358 @@
1
+ /**
2
+ * HTTP client for the aery auth-broker server.
3
+ *
4
+ * Used by {@link RemoteAuthCredentialStore} (snapshot pulls) and by
5
+ * `aery auth-broker status` (liveness checks). All endpoints except
6
+ * `/v1/healthz` require a bearer token.
7
+ */
8
+ import { readSseEvents } from "@aryee337/aery-utils";
9
+ import type { ZodType, infer as zInfer } from "zod/v4";
10
+ import type { AuthCredential } from "../auth-storage";
11
+ import type {
12
+ CredentialDisableRequest,
13
+ CredentialDisableResponse,
14
+ CredentialRefreshResponse,
15
+ CredentialUploadRequest,
16
+ CredentialUploadResponse,
17
+ HealthzResponse,
18
+ SnapshotResponse,
19
+ SnapshotStreamEvent,
20
+ UsageResponse,
21
+ } from "./types";
22
+ import {
23
+ credentialDisableResponseSchema,
24
+ credentialRefreshResponseSchema,
25
+ credentialUploadResponseSchema,
26
+ healthzResponseSchema,
27
+ snapshotResponseSchema,
28
+ snapshotStreamEventSchema,
29
+ usageResponseSchema,
30
+ } from "./wire-schemas";
31
+
32
+ export interface AuthBrokerClientOptions {
33
+ /** Base URL (e.g. `https://broker.tailnet:8765`). Trailing slashes are trimmed. */
34
+ url: string;
35
+ /** Bearer token used for everything except `healthz`. */
36
+ token: string;
37
+ /** Per-request timeout in milliseconds. Default 10s. */
38
+ timeoutMs?: number;
39
+ /** Retry connection errors this many times. Default 1. */
40
+ maxRetries?: number;
41
+ /** Override fetch (used in tests). Default global `fetch`. */
42
+ fetchImpl?: typeof fetch;
43
+ }
44
+
45
+ export class AuthBrokerError extends Error {
46
+ readonly status: number | undefined;
47
+ readonly body: string | undefined;
48
+ constructor(message: string, opts: { status?: number; body?: string; cause?: unknown } = {}) {
49
+ super(message, { cause: opts.cause });
50
+ this.name = "AuthBrokerError";
51
+ this.status = opts.status;
52
+ this.body = opts.body;
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Thrown when a broker responds 404 to `GET /v1/snapshot/stream` — old
58
+ * brokers that predate the SSE endpoint. Callers (`RemoteAuthCredentialStore`)
59
+ * detect this sentinel to fall back to long-polling permanently.
60
+ */
61
+ export class AuthBrokerStreamUnsupportedError extends AuthBrokerError {
62
+ constructor(message = "Auth broker does not support /v1/snapshot/stream") {
63
+ super(message, { status: 404 });
64
+ this.name = "AuthBrokerStreamUnsupportedError";
65
+ }
66
+ }
67
+
68
+ export interface FetchSnapshotOptions {
69
+ ifGenerationGt?: number;
70
+ waitMs?: number;
71
+ signal?: AbortSignal;
72
+ }
73
+
74
+ export type FetchSnapshotResult =
75
+ | { status: 200; snapshot: SnapshotResponse; generation: number }
76
+ | { status: 304; generation: number };
77
+
78
+ function parseGenerationTag(header: string | null): number | undefined {
79
+ if (!header) return undefined;
80
+ let value = header.trim();
81
+ if (value.startsWith("W/")) value = value.slice(2).trim();
82
+ if (value.startsWith('"') && value.endsWith('"') && value.length >= 2) {
83
+ value = value.slice(1, -1);
84
+ }
85
+ const generation = Number(value);
86
+ if (!Number.isInteger(generation) || generation < 0) return undefined;
87
+ return generation;
88
+ }
89
+
90
+ const DEFAULT_TIMEOUT_MS = 10_000;
91
+ const DEFAULT_MAX_RETRIES = 1;
92
+
93
+ export class AuthBrokerClient {
94
+ readonly #baseUrl: string;
95
+ readonly #token: string;
96
+ readonly #timeoutMs: number;
97
+ readonly #maxRetries: number;
98
+ readonly #fetch: typeof fetch;
99
+
100
+ constructor(opts: AuthBrokerClientOptions) {
101
+ this.#baseUrl = opts.url.replace(/\/+$/, "");
102
+ this.#token = opts.token;
103
+ this.#timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
104
+ this.#maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;
105
+ this.#fetch = opts.fetchImpl ?? fetch;
106
+ }
107
+
108
+ healthz(signal?: AbortSignal): Promise<HealthzResponse> {
109
+ return this.#request("GET", "/v1/healthz", { schema: healthzResponseSchema, auth: false, signal });
110
+ }
111
+
112
+ async fetchSnapshot(opts: FetchSnapshotOptions = {}): Promise<FetchSnapshotResult> {
113
+ return this.#fetchSnapshotResult(opts);
114
+ }
115
+ async #fetchSnapshotResult(opts: FetchSnapshotOptions): Promise<FetchSnapshotResult> {
116
+ const query = new URLSearchParams();
117
+ if (opts.waitMs !== undefined) query.set("wait", String(opts.waitMs));
118
+ const path = `/v1/snapshot${query.size > 0 ? `?${query.toString()}` : ""}`;
119
+ const headers: Record<string, string> = {};
120
+ if (opts.ifGenerationGt !== undefined) headers["If-None-Match"] = `"${opts.ifGenerationGt}"`;
121
+ const timeoutMs =
122
+ opts.waitMs !== undefined && opts.waitMs > 0 ? Math.max(this.#timeoutMs, opts.waitMs + 1000) : undefined;
123
+ const response = await this.#fetchRaw("GET", path, {
124
+ auth: true,
125
+ headers,
126
+ signal: opts.signal,
127
+ timeoutMs,
128
+ });
129
+ const etagGeneration = parseGenerationTag(response.headers.get("etag"));
130
+ if (response.status === 304) {
131
+ return { status: 304, generation: etagGeneration ?? opts.ifGenerationGt ?? 0 };
132
+ }
133
+ const text = await response.text();
134
+ const raw = this.#parseJson(text, response.status);
135
+ const validated = snapshotResponseSchema.safeParse(raw);
136
+ if (!validated.success) {
137
+ throw new AuthBrokerError("Auth broker response failed schema validation", {
138
+ status: response.status,
139
+ body: validated.error.message,
140
+ });
141
+ }
142
+ const snapshot = validated.data as SnapshotResponse;
143
+ return { status: 200, snapshot, generation: etagGeneration ?? snapshot.generation };
144
+ }
145
+
146
+ /**
147
+ * Subscribe to the broker's SSE snapshot stream. The first frame is always
148
+ * a full `snapshot`; subsequent frames are `entry` upserts / refreshes or
149
+ * `removed` deletes. Caller controls lifecycle via `opts.signal`.
150
+ *
151
+ * Throws {@link AuthBrokerStreamUnsupportedError} when the broker responds
152
+ * 404 — older brokers predate this endpoint and the caller should fall back
153
+ * to long-polling for the remainder of its lifetime.
154
+ */
155
+ async *openSnapshotStream(opts: { signal?: AbortSignal } = {}): AsyncGenerator<SnapshotStreamEvent> {
156
+ const url = `${this.#baseUrl}/v1/snapshot/stream`;
157
+ const headers: Record<string, string> = {
158
+ Accept: "text/event-stream",
159
+ Authorization: `Bearer ${this.#token}`,
160
+ };
161
+ if (opts.signal?.aborted) {
162
+ throw new AuthBrokerError("Auth broker request aborted", { cause: opts.signal.reason });
163
+ }
164
+ // No timeout: this connection is intentionally long-lived. Caller's signal
165
+ // is the only cancel path.
166
+ const response = await this.#fetch(url, { method: "GET", headers, signal: opts.signal });
167
+ if (response.status === 404) {
168
+ // Drain the body so the socket can be reused; tiny payload.
169
+ await response.text().catch(() => {});
170
+ throw new AuthBrokerStreamUnsupportedError();
171
+ }
172
+ if (!response.ok) {
173
+ const text = await response.text().catch(() => "");
174
+ throw new AuthBrokerError(`Auth broker stream failed: ${response.status} ${response.statusText}`, {
175
+ status: response.status,
176
+ body: text,
177
+ });
178
+ }
179
+ if (!response.body) {
180
+ throw new AuthBrokerError("Auth broker stream response had no body", { status: response.status });
181
+ }
182
+ const contentType = response.headers.get("content-type")?.toLowerCase();
183
+ if (contentType?.split(";", 1)[0].trim() !== "text/event-stream") {
184
+ await response.body.cancel().catch(() => {});
185
+ throw new AuthBrokerError("Auth broker stream returned non-SSE response", {
186
+ status: response.status,
187
+ body: contentType ?? "",
188
+ });
189
+ }
190
+
191
+ let sawFirstEvent = false;
192
+ for await (const sse of readSseEvents(response.body, opts.signal)) {
193
+ if (sse.event === null && sse.data === "") continue; // keepalive comment frames
194
+ let parsed: unknown;
195
+ try {
196
+ parsed = JSON.parse(sse.data);
197
+ } catch (err) {
198
+ throw new AuthBrokerError("Auth broker stream returned malformed JSON", {
199
+ body: sse.data,
200
+ cause: err,
201
+ });
202
+ }
203
+ const validated = snapshotStreamEventSchema.safeParse(parsed);
204
+ if (!validated.success) {
205
+ throw new AuthBrokerError("Auth broker stream event failed schema validation", {
206
+ body: validated.error.message,
207
+ });
208
+ }
209
+ const event = validated.data;
210
+ if (!sawFirstEvent) {
211
+ sawFirstEvent = true;
212
+ if (event.kind !== "snapshot") {
213
+ throw new AuthBrokerError("Auth broker stream did not start with snapshot", { body: sse.data });
214
+ }
215
+ }
216
+ yield event;
217
+ }
218
+ if (!opts.signal?.aborted) {
219
+ throw new AuthBrokerError(
220
+ sawFirstEvent
221
+ ? "Auth broker stream ended unexpectedly"
222
+ : "Auth broker stream ended before initial snapshot",
223
+ { status: response.status },
224
+ );
225
+ }
226
+ }
227
+
228
+ fetchUsage(signal?: AbortSignal): Promise<UsageResponse> {
229
+ // Validates the envelope (`generatedAt`, `reports[].provider`, `limits`,
230
+ // `metadata`) but leaves provider-specific extension fields permissive so
231
+ // the broker can ship new shapes ahead of the client. `raw` is accepted
232
+ // but normally stripped by the broker before send.
233
+ return this.#request("GET", "/v1/usage", { schema: usageResponseSchema, signal }) as Promise<UsageResponse>;
234
+ }
235
+
236
+ async refreshCredential(id: number, signal?: AbortSignal): Promise<CredentialRefreshResponse> {
237
+ return this.#request("POST", `/v1/credential/${id}/refresh`, {
238
+ schema: credentialRefreshResponseSchema,
239
+ signal,
240
+ }) as Promise<CredentialRefreshResponse>;
241
+ }
242
+
243
+ async disableCredential(id: number, cause: string, signal?: AbortSignal): Promise<CredentialDisableResponse> {
244
+ const body: CredentialDisableRequest = { cause };
245
+ return this.#request("POST", `/v1/credential/${id}/disable`, {
246
+ body,
247
+ schema: credentialDisableResponseSchema,
248
+ signal,
249
+ });
250
+ }
251
+
252
+ async uploadCredential(
253
+ provider: string,
254
+ credential: AuthCredential,
255
+ signal?: AbortSignal,
256
+ ): Promise<CredentialUploadResponse> {
257
+ const body: CredentialUploadRequest = { provider, credential };
258
+ return this.#request("POST", "/v1/credential", {
259
+ body,
260
+ schema: credentialUploadResponseSchema,
261
+ signal,
262
+ }) as Promise<CredentialUploadResponse>;
263
+ }
264
+
265
+ async #request<TSchema extends ZodType>(
266
+ method: "GET" | "POST",
267
+ path: string,
268
+ opts: { schema: TSchema; auth?: boolean; body?: unknown; signal?: AbortSignal },
269
+ ): Promise<zInfer<TSchema>> {
270
+ const response = await this.#fetchRaw(method, path, opts);
271
+ const text = await response.text();
272
+ const raw = this.#parseJson(text, response.status);
273
+ const validated = opts.schema.safeParse(raw);
274
+ if (!validated.success) {
275
+ throw new AuthBrokerError("Auth broker response failed schema validation", {
276
+ status: response.status,
277
+ body: validated.error.message,
278
+ });
279
+ }
280
+ return validated.data;
281
+ }
282
+
283
+ #parseJson(text: string, status: number): unknown {
284
+ try {
285
+ return text.length === 0 ? null : JSON.parse(text);
286
+ } catch (parseError) {
287
+ throw new AuthBrokerError("Auth broker returned malformed JSON", {
288
+ status,
289
+ body: text,
290
+ cause: parseError,
291
+ });
292
+ }
293
+ }
294
+
295
+ async #fetchRaw(
296
+ method: "GET" | "POST",
297
+ path: string,
298
+ opts: {
299
+ auth?: boolean;
300
+ body?: unknown;
301
+ signal?: AbortSignal;
302
+ headers?: Record<string, string>;
303
+ timeoutMs?: number;
304
+ },
305
+ ): Promise<Response> {
306
+ const auth = opts.auth ?? true;
307
+ const url = `${this.#baseUrl}${path}`;
308
+ const headers: Record<string, string> = { Accept: "application/json", ...(opts.headers ?? {}) };
309
+ if (auth) headers.Authorization = `Bearer ${this.#token}`;
310
+ let payload: string | undefined;
311
+ if (opts.body !== undefined) {
312
+ payload = JSON.stringify(opts.body);
313
+ headers["Content-Type"] = "application/json";
314
+ }
315
+
316
+ // Fast-fail when the caller's signal is already aborted — avoids spinning
317
+ // up a fetch + timer that the first `await` would just abort anyway.
318
+ if (opts.signal?.aborted) {
319
+ throw new AuthBrokerError("Auth broker request aborted", { cause: opts.signal.reason });
320
+ }
321
+
322
+ let lastError: unknown;
323
+ for (let attempt = 0; attempt <= this.#maxRetries; attempt += 1) {
324
+ const timeoutSignal = AbortSignal.timeout(opts.timeoutMs ?? this.#timeoutMs);
325
+ const signal = opts.signal ? AbortSignal.any([opts.signal, timeoutSignal]) : timeoutSignal;
326
+ try {
327
+ const response = await this.#fetch(url, {
328
+ method,
329
+ headers,
330
+ body: payload,
331
+ signal,
332
+ });
333
+ if (!response.ok && response.status !== 304) {
334
+ const text = await response.text();
335
+ throw new AuthBrokerError(`Auth broker request failed: ${response.status} ${response.statusText}`, {
336
+ status: response.status,
337
+ body: text,
338
+ });
339
+ }
340
+ return response;
341
+ } catch (error) {
342
+ lastError = error;
343
+ // Caller-driven abort wins over retry — the caller said stop.
344
+ if (opts.signal?.aborted) {
345
+ throw new AuthBrokerError("Auth broker request aborted", { cause: opts.signal.reason });
346
+ }
347
+ if (error instanceof AuthBrokerError && error.status !== undefined) {
348
+ // HTTP errors (4xx/5xx) don't retry — caller knows what to do.
349
+ throw error;
350
+ }
351
+ if (attempt >= this.#maxRetries) break;
352
+ }
353
+ }
354
+ throw new AuthBrokerError(`Auth broker request failed after ${this.#maxRetries + 1} attempt(s)`, {
355
+ cause: lastError,
356
+ });
357
+ }
358
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./client";
2
+ export * from "./refresher";
3
+ export * from "./remote-store";
4
+ export * from "./server";
5
+ export * from "./types";
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Background OAuth refresh loop for the auth-broker server.
3
+ *
4
+ * Iterates active OAuth credentials at `refreshIntervalMs` cadence, refreshing
5
+ * any whose `expires - Date.now() < refreshSkewMs`. Refresh single-flight
6
+ * lives in {@link AuthStorage} so manual and background refreshes share the
7
+ * same upstream attempt.
8
+ * Definitively-failed credentials (invalid_grant / 401 not from network blip)
9
+ * are disabled via {@link AuthStorage.disableCredentialById} so the next
10
+ * snapshot pull surfaces a clean delete on the client.
11
+ */
12
+ import { logger } from "@aryee337/aery-utils";
13
+ import { type AuthStorage, isDefinitiveOAuthFailure } from "../auth-storage";
14
+ import { DEFAULT_REFRESH_INTERVAL_MS, DEFAULT_REFRESH_SKEW_MS } from "./types";
15
+
16
+ export interface AuthBrokerRefresherOptions {
17
+ storage: AuthStorage;
18
+ /** Refresh credentials expiring within this window. Default 5 min. */
19
+ refreshSkewMs?: number;
20
+ /** Loop cadence. Default 60s. */
21
+ refreshIntervalMs?: number;
22
+ /** Override clock (tests). */
23
+ now?: () => number;
24
+ }
25
+
26
+ export interface AuthBrokerRefresherSchedule {
27
+ enabled: boolean;
28
+ intervalMs: number;
29
+ skewMs: number;
30
+ nextSweepAt: number;
31
+ }
32
+
33
+ export class AuthBrokerRefresher {
34
+ readonly #storage: AuthStorage;
35
+ readonly #refreshSkewMs: number;
36
+ readonly #refreshIntervalMs: number;
37
+ readonly #now: () => number;
38
+ #timer: NodeJS.Timeout | undefined;
39
+ #running = false;
40
+ #nextSweepAt: number;
41
+ constructor(opts: AuthBrokerRefresherOptions) {
42
+ this.#storage = opts.storage;
43
+ this.#refreshSkewMs = opts.refreshSkewMs ?? DEFAULT_REFRESH_SKEW_MS;
44
+ this.#refreshIntervalMs = opts.refreshIntervalMs ?? DEFAULT_REFRESH_INTERVAL_MS;
45
+ this.#now = opts.now ?? Date.now;
46
+ this.#nextSweepAt = this.#now();
47
+ }
48
+
49
+ start(): void {
50
+ if (this.#timer !== undefined) return;
51
+ // Refresh sweep is best-effort; kick once immediately so freshly-booted
52
+ // brokers don't hand out near-expired tokens for the first interval.
53
+ this.#nextSweepAt = this.#now();
54
+ void this.tick();
55
+ this.#timer = setInterval(() => {
56
+ void this.tick();
57
+ }, this.#refreshIntervalMs);
58
+ }
59
+
60
+ stop(): void {
61
+ if (this.#timer !== undefined) {
62
+ clearInterval(this.#timer);
63
+ this.#timer = undefined;
64
+ }
65
+ }
66
+
67
+ getSchedule(): AuthBrokerRefresherSchedule {
68
+ return {
69
+ enabled: true,
70
+ intervalMs: this.#refreshIntervalMs,
71
+ skewMs: this.#refreshSkewMs,
72
+ nextSweepAt: this.#nextSweepAt,
73
+ };
74
+ }
75
+
76
+ /** Run one sweep. Exposed for tests. */
77
+ async tick(): Promise<void> {
78
+ if (this.#running) return;
79
+ this.#running = true;
80
+ this.#nextSweepAt = this.#now();
81
+ try {
82
+ await this.#storage.reload();
83
+ const snapshot = this.#storage.exportSnapshot();
84
+ const now = this.#now();
85
+ const deadline = now + this.#refreshSkewMs;
86
+ const targets: number[] = [];
87
+ for (const entry of snapshot.credentials) {
88
+ if (entry.credential.type !== "oauth") continue;
89
+ const expires = entry.credential.expires;
90
+ if (typeof expires !== "number" || !Number.isFinite(expires)) continue;
91
+ if (expires > deadline) continue;
92
+ targets.push(entry.id);
93
+ }
94
+ await Promise.all(targets.map(id => this.#refreshOne(id)));
95
+ } finally {
96
+ this.#running = false;
97
+ this.#nextSweepAt = this.#now() + this.#refreshIntervalMs;
98
+ }
99
+ }
100
+
101
+ async #refreshOne(id: number): Promise<void> {
102
+ try {
103
+ await this.#storage.refreshCredentialById(id);
104
+ } catch (error) {
105
+ const errorMsg = String(error);
106
+ if (isDefinitiveOAuthFailure(errorMsg)) {
107
+ logger.warn("auth-broker refresh failed definitively; disabling credential", {
108
+ id,
109
+ error: errorMsg,
110
+ });
111
+ this.#storage.disableCredentialById(id, `auth-broker refresh failed: ${errorMsg}`);
112
+ } else {
113
+ logger.debug("auth-broker refresh failed (transient)", { id, error: errorMsg });
114
+ }
115
+ }
116
+ }
117
+ }