@draht/ai 2026.5.12 → 2026.7.7-1

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 (611) hide show
  1. package/dist/api/anthropic-messages.d.ts +71 -0
  2. package/dist/api/anthropic-messages.d.ts.map +1 -0
  3. package/dist/api/anthropic-messages.js +972 -0
  4. package/dist/api/anthropic-messages.js.map +1 -0
  5. package/dist/api/anthropic-messages.lazy.d.ts +3 -0
  6. package/dist/api/anthropic-messages.lazy.d.ts.map +1 -0
  7. package/dist/api/anthropic-messages.lazy.js +3 -0
  8. package/dist/api/anthropic-messages.lazy.js.map +1 -0
  9. package/dist/api/azure-openai-responses.d.ts +15 -0
  10. package/dist/api/azure-openai-responses.d.ts.map +1 -0
  11. package/dist/api/azure-openai-responses.js +222 -0
  12. package/dist/api/azure-openai-responses.js.map +1 -0
  13. package/dist/api/azure-openai-responses.lazy.d.ts +3 -0
  14. package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -0
  15. package/dist/api/azure-openai-responses.lazy.js +3 -0
  16. package/dist/api/azure-openai-responses.lazy.js.map +1 -0
  17. package/dist/api/bedrock-converse-stream.d.ts +38 -0
  18. package/dist/api/bedrock-converse-stream.d.ts.map +1 -0
  19. package/dist/api/bedrock-converse-stream.js +876 -0
  20. package/dist/api/bedrock-converse-stream.js.map +1 -0
  21. package/dist/api/bedrock-converse-stream.lazy.d.ts +9 -0
  22. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -0
  23. package/dist/api/bedrock-converse-stream.lazy.js +30 -0
  24. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -0
  25. package/dist/api/cloudflare.d.ts +9 -0
  26. package/dist/api/cloudflare.d.ts.map +1 -0
  27. package/dist/api/cloudflare.js +9 -0
  28. package/dist/api/cloudflare.js.map +1 -0
  29. package/dist/{providers → api}/github-copilot-headers.d.ts +1 -1
  30. package/dist/api/github-copilot-headers.d.ts.map +1 -0
  31. package/dist/api/github-copilot-headers.js.map +1 -0
  32. package/dist/api/google-generative-ai.d.ts +13 -0
  33. package/dist/api/google-generative-ai.d.ts.map +1 -0
  34. package/dist/api/google-generative-ai.js +407 -0
  35. package/dist/api/google-generative-ai.js.map +1 -0
  36. package/dist/api/google-generative-ai.lazy.d.ts +3 -0
  37. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  38. package/dist/api/google-generative-ai.lazy.js +3 -0
  39. package/dist/api/google-generative-ai.lazy.js.map +1 -0
  40. package/dist/{providers → api}/google-shared.d.ts +8 -3
  41. package/dist/api/google-shared.d.ts.map +1 -0
  42. package/dist/{providers → api}/google-shared.js +34 -17
  43. package/dist/api/google-shared.js.map +1 -0
  44. package/dist/api/google-vertex.d.ts +15 -0
  45. package/dist/api/google-vertex.d.ts.map +1 -0
  46. package/dist/api/google-vertex.js +456 -0
  47. package/dist/api/google-vertex.js.map +1 -0
  48. package/dist/api/google-vertex.lazy.d.ts +3 -0
  49. package/dist/api/google-vertex.lazy.d.ts.map +1 -0
  50. package/dist/api/google-vertex.lazy.js +3 -0
  51. package/dist/api/google-vertex.lazy.js.map +1 -0
  52. package/dist/api/lazy.d.ts +15 -0
  53. package/dist/api/lazy.d.ts.map +1 -0
  54. package/dist/api/lazy.js +59 -0
  55. package/dist/api/lazy.js.map +1 -0
  56. package/dist/api/mistral-conversations.d.ts +25 -0
  57. package/dist/api/mistral-conversations.d.ts.map +1 -0
  58. package/dist/api/mistral-conversations.js +555 -0
  59. package/dist/api/mistral-conversations.js.map +1 -0
  60. package/dist/api/mistral-conversations.lazy.d.ts +3 -0
  61. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  62. package/dist/api/mistral-conversations.lazy.js +3 -0
  63. package/dist/api/mistral-conversations.lazy.js.map +1 -0
  64. package/dist/api/openai-codex-responses.d.ts +30 -0
  65. package/dist/api/openai-codex-responses.d.ts.map +1 -0
  66. package/dist/api/openai-codex-responses.js +1228 -0
  67. package/dist/api/openai-codex-responses.js.map +1 -0
  68. package/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  69. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  70. package/dist/api/openai-codex-responses.lazy.js +3 -0
  71. package/dist/api/openai-codex-responses.lazy.js.map +1 -0
  72. package/dist/api/openai-completions.d.ts +19 -0
  73. package/dist/api/openai-completions.d.ts.map +1 -0
  74. package/dist/api/openai-completions.js +1061 -0
  75. package/dist/api/openai-completions.js.map +1 -0
  76. package/dist/api/openai-completions.lazy.d.ts +3 -0
  77. package/dist/api/openai-completions.lazy.d.ts.map +1 -0
  78. package/dist/api/openai-completions.lazy.js +3 -0
  79. package/dist/api/openai-completions.lazy.js.map +1 -0
  80. package/dist/api/openai-prompt-cache.d.ts +3 -0
  81. package/dist/api/openai-prompt-cache.d.ts.map +1 -0
  82. package/dist/api/openai-prompt-cache.js +10 -0
  83. package/dist/api/openai-prompt-cache.js.map +1 -0
  84. package/dist/{providers → api}/openai-responses-shared.d.ts +3 -2
  85. package/dist/api/openai-responses-shared.d.ts.map +1 -0
  86. package/dist/{providers → api}/openai-responses-shared.js +201 -189
  87. package/dist/api/openai-responses-shared.js.map +1 -0
  88. package/dist/{providers → api}/openai-responses.d.ts +3 -3
  89. package/dist/api/openai-responses.d.ts.map +1 -0
  90. package/dist/api/openai-responses.js +229 -0
  91. package/dist/api/openai-responses.js.map +1 -0
  92. package/dist/api/openai-responses.lazy.d.ts +3 -0
  93. package/dist/api/openai-responses.lazy.d.ts.map +1 -0
  94. package/dist/api/openai-responses.lazy.js +3 -0
  95. package/dist/api/openai-responses.lazy.js.map +1 -0
  96. package/dist/api/openrouter-images.d.ts +3 -0
  97. package/dist/api/openrouter-images.d.ts.map +1 -0
  98. package/dist/api/openrouter-images.js +126 -0
  99. package/dist/api/openrouter-images.js.map +1 -0
  100. package/dist/api/openrouter-images.lazy.d.ts +3 -0
  101. package/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  102. package/dist/api/openrouter-images.lazy.js +4 -0
  103. package/dist/api/openrouter-images.lazy.js.map +1 -0
  104. package/dist/api/simple-options.d.ts +14 -0
  105. package/dist/api/simple-options.d.ts.map +1 -0
  106. package/dist/{providers → api}/simple-options.js +20 -4
  107. package/dist/api/simple-options.js.map +1 -0
  108. package/dist/{providers → api}/transform-messages.d.ts +1 -1
  109. package/dist/api/transform-messages.d.ts.map +1 -0
  110. package/dist/{providers → api}/transform-messages.js +66 -34
  111. package/dist/api/transform-messages.js.map +1 -0
  112. package/dist/auth/context.d.ts +7 -0
  113. package/dist/auth/context.d.ts.map +1 -0
  114. package/dist/auth/context.js +42 -0
  115. package/dist/auth/context.js.map +1 -0
  116. package/dist/auth/credential-store.d.ts +16 -0
  117. package/dist/auth/credential-store.d.ts.map +1 -0
  118. package/dist/auth/credential-store.js +37 -0
  119. package/dist/auth/credential-store.js.map +1 -0
  120. package/dist/auth/helpers.d.ts +20 -0
  121. package/dist/auth/helpers.d.ts.map +1 -0
  122. package/dist/auth/helpers.js +46 -0
  123. package/dist/auth/helpers.js.map +1 -0
  124. package/dist/auth/resolve.d.ts +26 -0
  125. package/dist/auth/resolve.d.ts.map +1 -0
  126. package/dist/auth/resolve.js +101 -0
  127. package/dist/auth/resolve.js.map +1 -0
  128. package/dist/auth/types.d.ts +180 -0
  129. package/dist/auth/types.d.ts.map +1 -0
  130. package/dist/auth/types.js +2 -0
  131. package/dist/auth/types.js.map +1 -0
  132. package/dist/bedrock-provider.d.ts +2 -2
  133. package/dist/bedrock-provider.d.ts.map +1 -1
  134. package/dist/bedrock-provider.js +3 -3
  135. package/dist/bedrock-provider.js.map +1 -1
  136. package/dist/cli.d.ts.map +1 -1
  137. package/dist/cli.js +14 -0
  138. package/dist/cli.js.map +1 -1
  139. package/dist/compat.d.ts +65 -0
  140. package/dist/compat.d.ts.map +1 -0
  141. package/dist/compat.js +182 -0
  142. package/dist/compat.js.map +1 -0
  143. package/dist/env-api-keys.d.ts +12 -3
  144. package/dist/env-api-keys.d.ts.map +1 -1
  145. package/dist/env-api-keys.js +77 -39
  146. package/dist/env-api-keys.js.map +1 -1
  147. package/dist/image-models.d.ts +10 -0
  148. package/dist/image-models.d.ts.map +1 -0
  149. package/dist/image-models.generated.d.ts +530 -0
  150. package/dist/image-models.generated.d.ts.map +1 -0
  151. package/dist/image-models.generated.js +532 -0
  152. package/dist/image-models.generated.js.map +1 -0
  153. package/dist/image-models.js +23 -0
  154. package/dist/image-models.js.map +1 -0
  155. package/dist/images-api-registry.d.ts +14 -0
  156. package/dist/images-api-registry.d.ts.map +1 -0
  157. package/dist/images-api-registry.js +22 -0
  158. package/dist/images-api-registry.js.map +1 -0
  159. package/dist/images-models.d.ts +93 -0
  160. package/dist/images-models.d.ts.map +1 -0
  161. package/dist/images-models.js +141 -0
  162. package/dist/images-models.js.map +1 -0
  163. package/dist/images.d.ts +4 -0
  164. package/dist/images.d.ts.map +1 -0
  165. package/dist/images.js +14 -0
  166. package/dist/images.js.map +1 -0
  167. package/dist/index.d.ts +30 -25
  168. package/dist/index.d.ts.map +1 -1
  169. package/dist/index.js +10 -5
  170. package/dist/index.js.map +1 -1
  171. package/dist/legacy-api-aliases.d.ts +42 -0
  172. package/dist/legacy-api-aliases.d.ts.map +1 -0
  173. package/dist/legacy-api-aliases.js +49 -0
  174. package/dist/legacy-api-aliases.js.map +1 -0
  175. package/dist/models.d.ts +136 -15
  176. package/dist/models.d.ts.map +1 -1
  177. package/dist/models.generated.d.ts +8182 -2013
  178. package/dist/models.generated.d.ts.map +1 -1
  179. package/dist/models.generated.js +70 -14888
  180. package/dist/models.generated.js.map +1 -1
  181. package/dist/models.js +218 -24
  182. package/dist/models.js.map +1 -1
  183. package/dist/oauth.d.ts +1 -1
  184. package/dist/oauth.d.ts.map +1 -1
  185. package/dist/oauth.js.map +1 -1
  186. package/dist/providers/all.d.ts +21 -0
  187. package/dist/providers/all.d.ts.map +1 -0
  188. package/dist/providers/all.js +114 -0
  189. package/dist/providers/all.js.map +1 -0
  190. package/dist/providers/amazon-bedrock.d.ts +2 -19
  191. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  192. package/dist/providers/amazon-bedrock.js +33 -649
  193. package/dist/providers/amazon-bedrock.js.map +1 -1
  194. package/dist/providers/amazon-bedrock.models.d.ts +1875 -0
  195. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  196. package/dist/providers/amazon-bedrock.models.js +1829 -0
  197. package/dist/providers/amazon-bedrock.models.js.map +1 -0
  198. package/dist/providers/ant-ling.d.ts +3 -0
  199. package/dist/providers/ant-ling.d.ts.map +1 -0
  200. package/dist/providers/ant-ling.js +15 -0
  201. package/dist/providers/ant-ling.js.map +1 -0
  202. package/dist/providers/ant-ling.models.d.ts +86 -0
  203. package/dist/providers/ant-ling.models.d.ts.map +1 -0
  204. package/dist/providers/ant-ling.models.js +60 -0
  205. package/dist/providers/ant-ling.models.js.map +1 -0
  206. package/dist/providers/anthropic.d.ts +2 -39
  207. package/dist/providers/anthropic.d.ts.map +1 -1
  208. package/dist/providers/anthropic.js +17 -771
  209. package/dist/providers/anthropic.js.map +1 -1
  210. package/dist/providers/anthropic.models.d.ts +274 -0
  211. package/dist/providers/anthropic.models.d.ts.map +1 -0
  212. package/dist/providers/anthropic.models.js +253 -0
  213. package/dist/providers/anthropic.models.js.map +1 -0
  214. package/dist/providers/azure-openai-responses.d.ts +2 -14
  215. package/dist/providers/azure-openai-responses.d.ts.map +1 -1
  216. package/dist/providers/azure-openai-responses.js +11 -173
  217. package/dist/providers/azure-openai-responses.js.map +1 -1
  218. package/dist/providers/azure-openai-responses.models.d.ts +804 -0
  219. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  220. package/dist/providers/azure-openai-responses.models.js +743 -0
  221. package/dist/providers/azure-openai-responses.models.js.map +1 -0
  222. package/dist/providers/cerebras.d.ts +3 -0
  223. package/dist/providers/cerebras.d.ts.map +1 -0
  224. package/dist/providers/cerebras.js +15 -0
  225. package/dist/providers/cerebras.js.map +1 -0
  226. package/dist/providers/cerebras.models.d.ts +66 -0
  227. package/dist/providers/cerebras.models.d.ts.map +1 -0
  228. package/dist/providers/cerebras.models.js +59 -0
  229. package/dist/providers/cerebras.models.js.map +1 -0
  230. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  231. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  232. package/dist/providers/cloudflare-ai-gateway.js +20 -0
  233. package/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  234. package/dist/providers/cloudflare-ai-gateway.models.d.ts +786 -0
  235. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  236. package/dist/providers/cloudflare-ai-gateway.models.js +684 -0
  237. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  238. package/dist/providers/cloudflare-auth.d.ts +4 -0
  239. package/dist/providers/cloudflare-auth.d.ts.map +1 -0
  240. package/dist/providers/cloudflare-auth.js +85 -0
  241. package/dist/providers/cloudflare-auth.js.map +1 -0
  242. package/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  243. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  244. package/dist/providers/cloudflare-workers-ai.js +14 -0
  245. package/dist/providers/cloudflare-workers-ai.js.map +1 -0
  246. package/dist/providers/cloudflare-workers-ai.models.d.ts +302 -0
  247. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  248. package/dist/providers/cloudflare-workers-ai.models.js +239 -0
  249. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  250. package/dist/providers/deepseek.d.ts +3 -0
  251. package/dist/providers/deepseek.d.ts.map +1 -0
  252. package/dist/providers/deepseek.js +15 -0
  253. package/dist/providers/deepseek.js.map +1 -0
  254. package/dist/providers/deepseek.models.d.ts +63 -0
  255. package/dist/providers/deepseek.models.d.ts.map +1 -0
  256. package/dist/providers/deepseek.models.js +43 -0
  257. package/dist/providers/deepseek.models.js.map +1 -0
  258. package/dist/providers/faux.d.ts +43 -2
  259. package/dist/providers/faux.d.ts.map +1 -1
  260. package/dist/providers/faux.js +35 -7
  261. package/dist/providers/faux.js.map +1 -1
  262. package/dist/providers/fireworks.d.ts +3 -0
  263. package/dist/providers/fireworks.d.ts.map +1 -0
  264. package/dist/providers/fireworks.js +19 -0
  265. package/dist/providers/fireworks.js.map +1 -0
  266. package/dist/providers/fireworks.models.d.ts +381 -0
  267. package/dist/providers/fireworks.models.d.ts.map +1 -0
  268. package/dist/providers/fireworks.models.js +295 -0
  269. package/dist/providers/fireworks.models.js.map +1 -0
  270. package/dist/providers/github-copilot.d.ts +3 -0
  271. package/dist/providers/github-copilot.d.ts.map +1 -0
  272. package/dist/providers/github-copilot.js +25 -0
  273. package/dist/providers/github-copilot.js.map +1 -0
  274. package/dist/providers/github-copilot.models.d.ts +698 -0
  275. package/dist/providers/github-copilot.models.d.ts.map +1 -0
  276. package/dist/providers/github-copilot.models.js +483 -0
  277. package/dist/providers/github-copilot.models.js.map +1 -0
  278. package/dist/providers/google-vertex.d.ts +2 -14
  279. package/dist/providers/google-vertex.d.ts.map +1 -1
  280. package/dist/providers/google-vertex.js +30 -414
  281. package/dist/providers/google-vertex.js.map +1 -1
  282. package/dist/providers/google-vertex.models.d.ts +202 -0
  283. package/dist/providers/google-vertex.models.d.ts.map +1 -0
  284. package/dist/providers/google-vertex.models.js +182 -0
  285. package/dist/providers/google-vertex.models.js.map +1 -0
  286. package/dist/providers/google.d.ts +2 -12
  287. package/dist/providers/google.d.ts.map +1 -1
  288. package/dist/providers/google.js +12 -396
  289. package/dist/providers/google.js.map +1 -1
  290. package/dist/providers/google.models.d.ts +328 -0
  291. package/dist/providers/google.models.d.ts.map +1 -0
  292. package/dist/providers/google.models.js +288 -0
  293. package/dist/providers/google.models.js.map +1 -0
  294. package/dist/providers/groq.d.ts +3 -0
  295. package/dist/providers/groq.d.ts.map +1 -0
  296. package/dist/providers/groq.js +15 -0
  297. package/dist/providers/groq.js.map +1 -0
  298. package/dist/providers/groq.models.d.ts +128 -0
  299. package/dist/providers/groq.models.d.ts.map +1 -0
  300. package/dist/providers/groq.models.js +125 -0
  301. package/dist/providers/groq.models.js.map +1 -0
  302. package/dist/providers/huggingface.d.ts +3 -0
  303. package/dist/providers/huggingface.d.ts.map +1 -0
  304. package/dist/providers/huggingface.js +15 -0
  305. package/dist/providers/huggingface.js.map +1 -0
  306. package/dist/providers/huggingface.models.d.ts +983 -0
  307. package/dist/providers/huggingface.models.d.ts.map +1 -0
  308. package/dist/providers/huggingface.models.js +887 -0
  309. package/dist/providers/huggingface.models.js.map +1 -0
  310. package/dist/providers/images/register-builtins.d.ts +4 -0
  311. package/dist/providers/images/register-builtins.d.ts.map +1 -0
  312. package/dist/providers/images/register-builtins.js +34 -0
  313. package/dist/providers/images/register-builtins.js.map +1 -0
  314. package/dist/providers/kimi-coding.d.ts +3 -0
  315. package/dist/providers/kimi-coding.d.ts.map +1 -0
  316. package/dist/providers/kimi-coding.js +15 -0
  317. package/dist/providers/kimi-coding.js.map +1 -0
  318. package/dist/providers/kimi-coding.models.d.ts +63 -0
  319. package/dist/providers/kimi-coding.models.d.ts.map +1 -0
  320. package/dist/providers/kimi-coding.models.js +59 -0
  321. package/dist/providers/kimi-coding.models.js.map +1 -0
  322. package/dist/providers/minimax-cn.d.ts +3 -0
  323. package/dist/providers/minimax-cn.d.ts.map +1 -0
  324. package/dist/providers/minimax-cn.js +15 -0
  325. package/dist/providers/minimax-cn.js.map +1 -0
  326. package/dist/providers/minimax-cn.models.d.ts +54 -0
  327. package/dist/providers/minimax-cn.models.d.ts.map +1 -0
  328. package/dist/providers/minimax-cn.models.js +56 -0
  329. package/dist/providers/minimax-cn.models.js.map +1 -0
  330. package/dist/providers/minimax.d.ts +3 -0
  331. package/dist/providers/minimax.d.ts.map +1 -0
  332. package/dist/providers/minimax.js +15 -0
  333. package/dist/providers/minimax.js.map +1 -0
  334. package/dist/providers/minimax.models.d.ts +54 -0
  335. package/dist/providers/minimax.models.d.ts.map +1 -0
  336. package/dist/providers/minimax.models.js +56 -0
  337. package/dist/providers/minimax.models.js.map +1 -0
  338. package/dist/providers/mistral.d.ts +2 -21
  339. package/dist/providers/mistral.d.ts.map +1 -1
  340. package/dist/providers/mistral.js +12 -498
  341. package/dist/providers/mistral.js.map +1 -1
  342. package/dist/providers/mistral.models.d.ts +513 -0
  343. package/dist/providers/mistral.models.d.ts.map +1 -0
  344. package/dist/providers/mistral.models.js +515 -0
  345. package/dist/providers/mistral.models.js.map +1 -0
  346. package/dist/providers/moonshotai-cn.d.ts +3 -0
  347. package/dist/providers/moonshotai-cn.d.ts.map +1 -0
  348. package/dist/providers/moonshotai-cn.js +15 -0
  349. package/dist/providers/moonshotai-cn.js.map +1 -0
  350. package/dist/providers/moonshotai-cn.models.d.ts +234 -0
  351. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  352. package/dist/providers/moonshotai-cn.models.js +169 -0
  353. package/dist/providers/moonshotai-cn.models.js.map +1 -0
  354. package/dist/providers/moonshotai.d.ts +3 -0
  355. package/dist/providers/moonshotai.d.ts.map +1 -0
  356. package/dist/providers/moonshotai.js +15 -0
  357. package/dist/providers/moonshotai.js.map +1 -0
  358. package/dist/providers/moonshotai.models.d.ts +234 -0
  359. package/dist/providers/moonshotai.models.d.ts.map +1 -0
  360. package/dist/providers/moonshotai.models.js +169 -0
  361. package/dist/providers/moonshotai.models.js.map +1 -0
  362. package/dist/providers/nvidia.d.ts +3 -0
  363. package/dist/providers/nvidia.d.ts.map +1 -0
  364. package/dist/providers/nvidia.js +15 -0
  365. package/dist/providers/nvidia.js.map +1 -0
  366. package/dist/providers/nvidia.models.d.ts +563 -0
  367. package/dist/providers/nvidia.models.d.ts.map +1 -0
  368. package/dist/providers/nvidia.models.js +385 -0
  369. package/dist/providers/nvidia.models.js.map +1 -0
  370. package/dist/providers/openai-codex.d.ts +3 -0
  371. package/dist/providers/openai-codex.d.ts.map +1 -0
  372. package/dist/providers/openai-codex.js +18 -0
  373. package/dist/providers/openai-codex.js.map +1 -0
  374. package/dist/providers/openai-codex.models.d.ts +87 -0
  375. package/dist/providers/openai-codex.models.d.ts.map +1 -0
  376. package/dist/providers/openai-codex.models.js +77 -0
  377. package/dist/providers/openai-codex.models.js.map +1 -0
  378. package/dist/providers/openai.d.ts +3 -0
  379. package/dist/providers/openai.d.ts.map +1 -0
  380. package/dist/providers/openai.js +15 -0
  381. package/dist/providers/openai.js.map +1 -0
  382. package/dist/providers/openai.models.d.ts +805 -0
  383. package/dist/providers/openai.models.d.ts.map +1 -0
  384. package/dist/providers/openai.models.js +743 -0
  385. package/dist/providers/openai.models.js.map +1 -0
  386. package/dist/providers/opencode-go.d.ts +3 -0
  387. package/dist/providers/opencode-go.d.ts.map +1 -0
  388. package/dist/providers/opencode-go.js +18 -0
  389. package/dist/providers/opencode-go.js.map +1 -0
  390. package/dist/providers/opencode-go.models.d.ts +309 -0
  391. package/dist/providers/opencode-go.models.d.ts.map +1 -0
  392. package/dist/providers/opencode-go.models.js +240 -0
  393. package/dist/providers/opencode-go.models.js.map +1 -0
  394. package/dist/providers/opencode.d.ts +3 -0
  395. package/dist/providers/opencode.d.ts.map +1 -0
  396. package/dist/providers/opencode.js +22 -0
  397. package/dist/providers/opencode.js.map +1 -0
  398. package/dist/providers/opencode.models.d.ts +1086 -0
  399. package/dist/providers/opencode.models.d.ts.map +1 -0
  400. package/dist/providers/opencode.models.js +906 -0
  401. package/dist/providers/opencode.models.js.map +1 -0
  402. package/dist/providers/openrouter-images.d.ts +3 -0
  403. package/dist/providers/openrouter-images.d.ts.map +1 -0
  404. package/dist/providers/openrouter-images.js +14 -0
  405. package/dist/providers/openrouter-images.js.map +1 -0
  406. package/dist/providers/openrouter.d.ts +3 -0
  407. package/dist/providers/openrouter.d.ts.map +1 -0
  408. package/dist/providers/openrouter.js +15 -0
  409. package/dist/providers/openrouter.js.map +1 -0
  410. package/dist/providers/openrouter.models.d.ts +5528 -0
  411. package/dist/providers/openrouter.models.d.ts.map +1 -0
  412. package/dist/providers/openrouter.models.js +4742 -0
  413. package/dist/providers/openrouter.models.js.map +1 -0
  414. package/dist/providers/together.d.ts +3 -0
  415. package/dist/providers/together.d.ts.map +1 -0
  416. package/dist/providers/together.js +15 -0
  417. package/dist/providers/together.js.map +1 -0
  418. package/dist/providers/together.models.d.ts +598 -0
  419. package/dist/providers/together.models.d.ts.map +1 -0
  420. package/dist/providers/together.models.js +380 -0
  421. package/dist/providers/together.models.js.map +1 -0
  422. package/dist/providers/vercel-ai-gateway.d.ts +3 -0
  423. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  424. package/dist/providers/vercel-ai-gateway.js +15 -0
  425. package/dist/providers/vercel-ai-gateway.js.map +1 -0
  426. package/dist/providers/vercel-ai-gateway.models.d.ts +3254 -0
  427. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  428. package/dist/providers/vercel-ai-gateway.models.js +3206 -0
  429. package/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  430. package/dist/providers/xai.d.ts +3 -0
  431. package/dist/providers/xai.d.ts.map +1 -0
  432. package/dist/providers/xai.js +15 -0
  433. package/dist/providers/xai.js.map +1 -0
  434. package/dist/providers/xai.models.d.ts +157 -0
  435. package/dist/providers/xai.models.d.ts.map +1 -0
  436. package/dist/providers/xai.models.js +131 -0
  437. package/dist/providers/xai.models.js.map +1 -0
  438. package/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  439. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  440. package/dist/providers/xiaomi-token-plan-ams.js +15 -0
  441. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  442. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +108 -0
  443. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  444. package/dist/providers/xiaomi-token-plan-ams.models.js +95 -0
  445. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  446. package/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  447. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  448. package/dist/providers/xiaomi-token-plan-cn.js +15 -0
  449. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  450. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +108 -0
  451. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  452. package/dist/providers/xiaomi-token-plan-cn.models.js +95 -0
  453. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  454. package/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  455. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  456. package/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  457. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  458. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +108 -0
  459. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  460. package/dist/providers/xiaomi-token-plan-sgp.models.js +95 -0
  461. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  462. package/dist/providers/xiaomi.d.ts +3 -0
  463. package/dist/providers/xiaomi.d.ts.map +1 -0
  464. package/dist/providers/xiaomi.js +15 -0
  465. package/dist/providers/xiaomi.js.map +1 -0
  466. package/dist/providers/xiaomi.models.d.ts +129 -0
  467. package/dist/providers/xiaomi.models.d.ts.map +1 -0
  468. package/dist/providers/xiaomi.models.js +113 -0
  469. package/dist/providers/xiaomi.models.js.map +1 -0
  470. package/dist/providers/zai-coding-cn.d.ts +3 -0
  471. package/dist/providers/zai-coding-cn.d.ts.map +1 -0
  472. package/dist/providers/zai-coding-cn.js +15 -0
  473. package/dist/providers/zai-coding-cn.js.map +1 -0
  474. package/dist/providers/zai-coding-cn.models.d.ts +153 -0
  475. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  476. package/dist/providers/zai-coding-cn.models.js +114 -0
  477. package/dist/providers/zai-coding-cn.models.js.map +1 -0
  478. package/dist/providers/zai.d.ts +3 -0
  479. package/dist/providers/zai.d.ts.map +1 -0
  480. package/dist/providers/zai.js +15 -0
  481. package/dist/providers/zai.js.map +1 -0
  482. package/dist/providers/zai.models.d.ts +153 -0
  483. package/dist/providers/zai.models.d.ts.map +1 -0
  484. package/dist/providers/zai.models.js +114 -0
  485. package/dist/providers/zai.models.js.map +1 -0
  486. package/dist/session-resources.d.ts +4 -0
  487. package/dist/session-resources.d.ts.map +1 -0
  488. package/dist/session-resources.js +22 -0
  489. package/dist/session-resources.js.map +1 -0
  490. package/dist/types.d.ts +262 -18
  491. package/dist/types.d.ts.map +1 -1
  492. package/dist/types.js.map +1 -1
  493. package/dist/utils/abort-signals.d.ts +6 -0
  494. package/dist/utils/abort-signals.d.ts.map +1 -0
  495. package/dist/utils/abort-signals.js +34 -0
  496. package/dist/utils/abort-signals.js.map +1 -0
  497. package/dist/utils/diagnostics.d.ts +19 -0
  498. package/dist/utils/diagnostics.d.ts.map +1 -0
  499. package/dist/utils/diagnostics.js +25 -0
  500. package/dist/utils/diagnostics.js.map +1 -0
  501. package/dist/utils/error-body.d.ts +25 -0
  502. package/dist/utils/error-body.d.ts.map +1 -0
  503. package/dist/utils/error-body.js +109 -0
  504. package/dist/utils/error-body.js.map +1 -0
  505. package/dist/utils/estimate.d.ts +17 -0
  506. package/dist/utils/estimate.d.ts.map +1 -0
  507. package/dist/utils/estimate.js +95 -0
  508. package/dist/utils/estimate.js.map +1 -0
  509. package/dist/utils/event-stream.d.ts +3 -3
  510. package/dist/utils/event-stream.d.ts.map +1 -1
  511. package/dist/utils/event-stream.js +2 -2
  512. package/dist/utils/event-stream.js.map +1 -1
  513. package/dist/utils/headers.d.ts +4 -0
  514. package/dist/utils/headers.d.ts.map +1 -0
  515. package/dist/utils/headers.js +18 -0
  516. package/dist/utils/headers.js.map +1 -0
  517. package/dist/utils/json-parse.d.ts +8 -1
  518. package/dist/utils/json-parse.d.ts.map +1 -1
  519. package/dist/utils/json-parse.js +89 -5
  520. package/dist/utils/json-parse.js.map +1 -1
  521. package/dist/utils/node-http-proxy.d.ts +4 -0
  522. package/dist/utils/node-http-proxy.d.ts.map +1 -0
  523. package/dist/utils/node-http-proxy.js +92 -0
  524. package/dist/utils/node-http-proxy.js.map +1 -0
  525. package/dist/utils/oauth/anthropic.d.ts +3 -1
  526. package/dist/utils/oauth/anthropic.d.ts.map +1 -1
  527. package/dist/utils/oauth/anthropic.js +33 -1
  528. package/dist/utils/oauth/anthropic.js.map +1 -1
  529. package/dist/utils/oauth/device-code.d.ts +23 -0
  530. package/dist/utils/oauth/device-code.d.ts.map +1 -0
  531. package/dist/utils/oauth/device-code.js +69 -0
  532. package/dist/utils/oauth/device-code.js.map +1 -0
  533. package/dist/utils/oauth/github-copilot.d.ts +5 -3
  534. package/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  535. package/dist/utils/oauth/github-copilot.js +158 -79
  536. package/dist/utils/oauth/github-copilot.js.map +1 -1
  537. package/dist/utils/oauth/index.d.ts +8 -11
  538. package/dist/utils/oauth/index.d.ts.map +1 -1
  539. package/dist/utils/oauth/index.js +2 -11
  540. package/dist/utils/oauth/index.js.map +1 -1
  541. package/dist/utils/oauth/load.d.ts +5 -0
  542. package/dist/utils/oauth/load.d.ts.map +1 -0
  543. package/dist/utils/oauth/load.js +22 -0
  544. package/dist/utils/oauth/load.js.map +1 -0
  545. package/dist/utils/oauth/openai-codex.d.ts +13 -2
  546. package/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  547. package/dist/utils/oauth/openai-codex.js +237 -73
  548. package/dist/utils/oauth/openai-codex.js.map +1 -1
  549. package/dist/utils/oauth/types.d.ts +18 -1
  550. package/dist/utils/oauth/types.d.ts.map +1 -1
  551. package/dist/utils/oauth/types.js.map +1 -1
  552. package/dist/utils/overflow.d.ts +8 -3
  553. package/dist/utils/overflow.d.ts.map +1 -1
  554. package/dist/utils/overflow.js +29 -3
  555. package/dist/utils/overflow.js.map +1 -1
  556. package/dist/utils/provider-env.d.ts +7 -0
  557. package/dist/utils/provider-env.d.ts.map +1 -0
  558. package/dist/utils/provider-env.js +44 -0
  559. package/dist/utils/provider-env.js.map +1 -0
  560. package/dist/utils/retry.d.ts +12 -0
  561. package/dist/utils/retry.d.ts.map +1 -0
  562. package/dist/utils/retry.js +87 -0
  563. package/dist/utils/retry.js.map +1 -0
  564. package/dist/utils/typebox-helpers.d.ts +1 -1
  565. package/dist/utils/typebox-helpers.d.ts.map +1 -1
  566. package/dist/utils/typebox-helpers.js +1 -1
  567. package/dist/utils/typebox-helpers.js.map +1 -1
  568. package/dist/utils/validation.d.ts +1 -1
  569. package/dist/utils/validation.d.ts.map +1 -1
  570. package/dist/utils/validation.js +230 -41
  571. package/dist/utils/validation.js.map +1 -1
  572. package/package.json +24 -44
  573. package/dist/api-registry.d.ts +0 -20
  574. package/dist/api-registry.d.ts.map +0 -1
  575. package/dist/api-registry.js +0 -44
  576. package/dist/api-registry.js.map +0 -1
  577. package/dist/providers/github-copilot-headers.d.ts.map +0 -1
  578. package/dist/providers/github-copilot-headers.js.map +0 -1
  579. package/dist/providers/google-gemini-cli.d.ts +0 -74
  580. package/dist/providers/google-gemini-cli.d.ts.map +0 -1
  581. package/dist/providers/google-gemini-cli.js +0 -776
  582. package/dist/providers/google-gemini-cli.js.map +0 -1
  583. package/dist/providers/google-shared.d.ts.map +0 -1
  584. package/dist/providers/google-shared.js.map +0 -1
  585. package/dist/providers/openai-codex-responses.d.ts +0 -9
  586. package/dist/providers/openai-codex-responses.d.ts.map +0 -1
  587. package/dist/providers/openai-codex-responses.js +0 -741
  588. package/dist/providers/openai-codex-responses.js.map +0 -1
  589. package/dist/providers/openai-completions.d.ts +0 -15
  590. package/dist/providers/openai-completions.d.ts.map +0 -1
  591. package/dist/providers/openai-completions.js +0 -760
  592. package/dist/providers/openai-completions.js.map +0 -1
  593. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  594. package/dist/providers/openai-responses-shared.js.map +0 -1
  595. package/dist/providers/openai-responses.d.ts.map +0 -1
  596. package/dist/providers/openai-responses.js +0 -190
  597. package/dist/providers/openai-responses.js.map +0 -1
  598. package/dist/providers/register-builtins.d.ts +0 -38
  599. package/dist/providers/register-builtins.d.ts.map +0 -1
  600. package/dist/providers/register-builtins.js +0 -261
  601. package/dist/providers/register-builtins.js.map +0 -1
  602. package/dist/providers/simple-options.d.ts +0 -13
  603. package/dist/providers/simple-options.d.ts.map +0 -1
  604. package/dist/providers/simple-options.js.map +0 -1
  605. package/dist/providers/transform-messages.d.ts.map +0 -1
  606. package/dist/providers/transform-messages.js.map +0 -1
  607. package/dist/stream.d.ts +0 -8
  608. package/dist/stream.d.ts.map +0 -1
  609. package/dist/stream.js +0 -27
  610. package/dist/stream.js.map +0 -1
  611. /package/dist/{providers → api}/github-copilot-headers.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../../src/utils/event-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"../types.js\";\n\n// Generic event stream class for async iteration\nexport class EventStream<T, R = T> implements AsyncIterable<T> {\n\tprivate queue: T[] = [];\n\tprivate waiting: ((value: IteratorResult<T>) => void)[] = [];\n\tprivate done = false;\n\tprivate finalResultPromise: Promise<R>;\n\tprivate resolveFinalResult!: (result: R) => void;\n\n\tconstructor(\n\t\tprivate isComplete: (event: T) => boolean,\n\t\tprivate extractResult: (event: T) => R,\n\t) {\n\t\tthis.finalResultPromise = new Promise((resolve) => {\n\t\t\tthis.resolveFinalResult = resolve;\n\t\t});\n\t}\n\n\tpush(event: T): void {\n\t\tif (this.done) return;\n\n\t\tif (this.isComplete(event)) {\n\t\t\tthis.done = true;\n\t\t\tthis.resolveFinalResult(this.extractResult(event));\n\t\t}\n\n\t\t// Deliver to waiting consumer or queue it\n\t\tconst waiter = this.waiting.shift();\n\t\tif (waiter) {\n\t\t\twaiter({ value: event, done: false });\n\t\t} else {\n\t\t\tthis.queue.push(event);\n\t\t}\n\t}\n\n\tend(result?: R): void {\n\t\tthis.done = true;\n\t\tif (result !== undefined) {\n\t\t\tthis.resolveFinalResult(result);\n\t\t}\n\t\t// Notify all waiting consumers that we're done\n\t\twhile (this.waiting.length > 0) {\n\t\t\tconst waiter = this.waiting.shift()!;\n\t\t\twaiter({ value: undefined as any, done: true });\n\t\t}\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncIterator<T> {\n\t\twhile (true) {\n\t\t\tif (this.queue.length > 0) {\n\t\t\t\tyield this.queue.shift()!;\n\t\t\t} else if (this.done) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst result = await new Promise<IteratorResult<T>>((resolve) => this.waiting.push(resolve));\n\t\t\t\tif (result.done) return;\n\t\t\t\tyield result.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tresult(): Promise<R> {\n\t\treturn this.finalResultPromise;\n\t}\n}\n\nexport class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {\n\tconstructor() {\n\t\tsuper(\n\t\t\t(event) => event.type === \"done\" || event.type === \"error\",\n\t\t\t(event) => {\n\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\treturn event.message;\n\t\t\t\t} else if (event.type === \"error\") {\n\t\t\t\t\treturn event.error;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Unexpected event type for final result\");\n\t\t\t},\n\t\t);\n\t}\n}\n\n/** Factory function for AssistantMessageEventStream (for use in extensions) */\nexport function createAssistantMessageEventStream(): AssistantMessageEventStream {\n\treturn new AssistantMessageEventStream();\n}\n"]}
1
+ {"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../../src/utils/event-stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, AssistantMessageEvent } from \"../types.ts\";\n\n// Generic event stream class for async iteration\nexport class EventStream<T, R = T> implements AsyncIterable<T> {\n\tprivate queue: T[] = [];\n\tprivate waiting: ((value: IteratorResult<T>) => void)[] = [];\n\tprivate done = false;\n\tprivate finalResultPromise: Promise<R>;\n\tprivate resolveFinalResult!: (result: R) => void;\n\tprivate isComplete: (event: T) => boolean;\n\tprivate extractResult: (event: T) => R;\n\n\tconstructor(isComplete: (event: T) => boolean, extractResult: (event: T) => R) {\n\t\tthis.isComplete = isComplete;\n\t\tthis.extractResult = extractResult;\n\t\tthis.finalResultPromise = new Promise((resolve) => {\n\t\t\tthis.resolveFinalResult = resolve;\n\t\t});\n\t}\n\n\tpush(event: T): void {\n\t\tif (this.done) return;\n\n\t\tif (this.isComplete(event)) {\n\t\t\tthis.done = true;\n\t\t\tthis.resolveFinalResult(this.extractResult(event));\n\t\t}\n\n\t\t// Deliver to waiting consumer or queue it\n\t\tconst waiter = this.waiting.shift();\n\t\tif (waiter) {\n\t\t\twaiter({ value: event, done: false });\n\t\t} else {\n\t\t\tthis.queue.push(event);\n\t\t}\n\t}\n\n\tend(result?: R): void {\n\t\tthis.done = true;\n\t\tif (result !== undefined) {\n\t\t\tthis.resolveFinalResult(result);\n\t\t}\n\t\t// Notify all waiting consumers that we're done\n\t\twhile (this.waiting.length > 0) {\n\t\t\tconst waiter = this.waiting.shift()!;\n\t\t\twaiter({ value: undefined as any, done: true });\n\t\t}\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncIterator<T> {\n\t\twhile (true) {\n\t\t\tif (this.queue.length > 0) {\n\t\t\t\tyield this.queue.shift()!;\n\t\t\t} else if (this.done) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst result = await new Promise<IteratorResult<T>>((resolve) => this.waiting.push(resolve));\n\t\t\t\tif (result.done) return;\n\t\t\t\tyield result.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tresult(): Promise<R> {\n\t\treturn this.finalResultPromise;\n\t}\n}\n\nexport class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {\n\tconstructor() {\n\t\tsuper(\n\t\t\t(event) => event.type === \"done\" || event.type === \"error\",\n\t\t\t(event) => {\n\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\treturn event.message;\n\t\t\t\t} else if (event.type === \"error\") {\n\t\t\t\t\treturn event.error;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Unexpected event type for final result\");\n\t\t\t},\n\t\t);\n\t}\n}\n\n/** Factory function for AssistantMessageEventStream (for use in extensions) */\nexport function createAssistantMessageEventStream(): AssistantMessageEventStream {\n\treturn new AssistantMessageEventStream();\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ProviderHeaders } from "../types.ts";
2
+ export declare function headersToRecord(headers: Headers): Record<string, string>;
3
+ export declare function providerHeadersToRecord(headers: ProviderHeaders | undefined): Record<string, string> | undefined;
4
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOhH","sourcesContent":["import type { ProviderHeaders } from \"../types.ts\";\n\nexport function headersToRecord(headers: Headers): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\theaders.forEach((value, key) => {\n\t\tresult[key] = value;\n\t});\n\treturn result;\n}\n\nexport function providerHeadersToRecord(headers: ProviderHeaders | undefined): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst result: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value !== null) result[key] = value;\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ export function headersToRecord(headers) {
2
+ const result = {};
3
+ headers.forEach((value, key) => {
4
+ result[key] = value;
5
+ });
6
+ return result;
7
+ }
8
+ export function providerHeadersToRecord(headers) {
9
+ if (!headers)
10
+ return undefined;
11
+ const result = {};
12
+ for (const [key, value] of Object.entries(headers)) {
13
+ if (value !== null)
14
+ result[key] = value;
15
+ }
16
+ return Object.keys(result).length > 0 ? result : undefined;
17
+ }
18
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,OAAgB,EAA0B;IACzE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAAA,CACpB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAAA,CACd;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAoC,EAAsC;IACjH,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CAC3D","sourcesContent":["import type { ProviderHeaders } from \"../types.ts\";\n\nexport function headersToRecord(headers: Headers): Record<string, string> {\n\tconst result: Record<string, string> = {};\n\theaders.forEach((value, key) => {\n\t\tresult[key] = value;\n\t});\n\treturn result;\n}\n\nexport function providerHeadersToRecord(headers: ProviderHeaders | undefined): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst result: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tif (value !== null) result[key] = value;\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined;\n}\n"]}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Repairs malformed JSON string literals by:
3
+ * - escaping raw control characters inside strings
4
+ * - doubling backslashes before invalid escape characters
5
+ */
6
+ export declare function repairJson(json: string): string;
7
+ export declare function parseJsonWithRepair<T>(json: string): T;
1
8
  /**
2
9
  * Attempts to parse potentially incomplete JSON during streaming.
3
10
  * Always returns a valid object, even if the JSON is incomplete.
@@ -5,5 +12,5 @@
5
12
  * @param partialJson The partial JSON string from streaming
6
13
  * @returns Parsed object or empty object if parsing fails
7
14
  */
8
- export declare function parseStreamingJson<T = any>(partialJson: string | undefined): T;
15
+ export declare function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T;
9
16
  //# sourceMappingURL=json-parse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-parse.d.ts","sourceRoot":"","sources":["../../src/utils/json-parse.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,CAkB9E","sourcesContent":["import { parse as partialParse } from \"partial-json\";\n\n/**\n * Attempts to parse potentially incomplete JSON during streaming.\n * Always returns a valid object, even if the JSON is incomplete.\n *\n * @param partialJson The partial JSON string from streaming\n * @returns Parsed object or empty object if parsing fails\n */\nexport function parseStreamingJson<T = any>(partialJson: string | undefined): T {\n\tif (!partialJson || partialJson.trim() === \"\") {\n\t\treturn {} as T;\n\t}\n\n\t// Try standard parsing first (fastest for complete JSON)\n\ttry {\n\t\treturn JSON.parse(partialJson) as T;\n\t} catch {\n\t\t// Try partial-json for incomplete JSON\n\t\ttry {\n\t\t\tconst result = partialParse(partialJson);\n\t\t\treturn (result ?? {}) as T;\n\t\t} catch {\n\t\t\t// If all parsing fails, return empty object\n\t\t\treturn {} as T;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"json-parse.d.ts","sourceRoot":"","sources":["../../src/utils/json-parse.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmD/C;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAUtD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,CAoBlG","sourcesContent":["import { parse as partialParse } from \"partial-json\";\n\nconst VALID_JSON_ESCAPES = new Set(['\"', \"\\\\\", \"/\", \"b\", \"f\", \"n\", \"r\", \"t\", \"u\"]);\n\nfunction isControlCharacter(char: string): boolean {\n\tconst codePoint = char.codePointAt(0);\n\treturn codePoint !== undefined && codePoint >= 0x00 && codePoint <= 0x1f;\n}\n\nfunction escapeControlCharacter(char: string): string {\n\tswitch (char) {\n\t\tcase \"\\b\":\n\t\t\treturn \"\\\\b\";\n\t\tcase \"\\f\":\n\t\t\treturn \"\\\\f\";\n\t\tcase \"\\n\":\n\t\t\treturn \"\\\\n\";\n\t\tcase \"\\r\":\n\t\t\treturn \"\\\\r\";\n\t\tcase \"\\t\":\n\t\t\treturn \"\\\\t\";\n\t\tdefault:\n\t\t\treturn `\\\\u${char.codePointAt(0)?.toString(16).padStart(4, \"0\") ?? \"0000\"}`;\n\t}\n}\n\n/**\n * Repairs malformed JSON string literals by:\n * - escaping raw control characters inside strings\n * - doubling backslashes before invalid escape characters\n */\nexport function repairJson(json: string): string {\n\tlet repaired = \"\";\n\tlet inString = false;\n\n\tfor (let index = 0; index < json.length; index++) {\n\t\tconst char = json[index];\n\n\t\tif (!inString) {\n\t\t\trepaired += char;\n\t\t\tif (char === '\"') {\n\t\t\t\tinString = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\trepaired += char;\n\t\t\tinString = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tconst nextChar = json[index + 1];\n\t\t\tif (nextChar === undefined) {\n\t\t\t\trepaired += \"\\\\\\\\\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nextChar === \"u\") {\n\t\t\t\tconst unicodeDigits = json.slice(index + 2, index + 6);\n\t\t\t\tif (/^[0-9a-fA-F]{4}$/.test(unicodeDigits)) {\n\t\t\t\t\trepaired += `\\\\u${unicodeDigits}`;\n\t\t\t\t\tindex += 5;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (VALID_JSON_ESCAPES.has(nextChar)) {\n\t\t\t\trepaired += `\\\\${nextChar}`;\n\t\t\t\tindex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trepaired += \"\\\\\\\\\";\n\t\t\tcontinue;\n\t\t}\n\n\t\trepaired += isControlCharacter(char) ? escapeControlCharacter(char) : char;\n\t}\n\n\treturn repaired;\n}\n\nexport function parseJsonWithRepair<T>(json: string): T {\n\ttry {\n\t\treturn JSON.parse(json) as T;\n\t} catch (error) {\n\t\tconst repairedJson = repairJson(json);\n\t\tif (repairedJson !== json) {\n\t\t\treturn JSON.parse(repairedJson) as T;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n/**\n * Attempts to parse potentially incomplete JSON during streaming.\n * Always returns a valid object, even if the JSON is incomplete.\n *\n * @param partialJson The partial JSON string from streaming\n * @returns Parsed object or empty object if parsing fails\n */\nexport function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T {\n\tif (!partialJson || partialJson.trim() === \"\") {\n\t\treturn {} as T;\n\t}\n\n\ttry {\n\t\treturn parseJsonWithRepair<T>(partialJson);\n\t} catch {\n\t\ttry {\n\t\t\tconst result = partialParse(partialJson);\n\t\t\treturn (result ?? {}) as T;\n\t\t} catch {\n\t\t\ttry {\n\t\t\t\tconst result = partialParse(repairJson(partialJson));\n\t\t\t\treturn (result ?? {}) as T;\n\t\t\t} catch {\n\t\t\t\treturn {} as T;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1,4 +1,85 @@
1
1
  import { parse as partialParse } from "partial-json";
2
+ const VALID_JSON_ESCAPES = new Set(['"', "\\", "/", "b", "f", "n", "r", "t", "u"]);
3
+ function isControlCharacter(char) {
4
+ const codePoint = char.codePointAt(0);
5
+ return codePoint !== undefined && codePoint >= 0x00 && codePoint <= 0x1f;
6
+ }
7
+ function escapeControlCharacter(char) {
8
+ switch (char) {
9
+ case "\b":
10
+ return "\\b";
11
+ case "\f":
12
+ return "\\f";
13
+ case "\n":
14
+ return "\\n";
15
+ case "\r":
16
+ return "\\r";
17
+ case "\t":
18
+ return "\\t";
19
+ default:
20
+ return `\\u${char.codePointAt(0)?.toString(16).padStart(4, "0") ?? "0000"}`;
21
+ }
22
+ }
23
+ /**
24
+ * Repairs malformed JSON string literals by:
25
+ * - escaping raw control characters inside strings
26
+ * - doubling backslashes before invalid escape characters
27
+ */
28
+ export function repairJson(json) {
29
+ let repaired = "";
30
+ let inString = false;
31
+ for (let index = 0; index < json.length; index++) {
32
+ const char = json[index];
33
+ if (!inString) {
34
+ repaired += char;
35
+ if (char === '"') {
36
+ inString = true;
37
+ }
38
+ continue;
39
+ }
40
+ if (char === '"') {
41
+ repaired += char;
42
+ inString = false;
43
+ continue;
44
+ }
45
+ if (char === "\\") {
46
+ const nextChar = json[index + 1];
47
+ if (nextChar === undefined) {
48
+ repaired += "\\\\";
49
+ continue;
50
+ }
51
+ if (nextChar === "u") {
52
+ const unicodeDigits = json.slice(index + 2, index + 6);
53
+ if (/^[0-9a-fA-F]{4}$/.test(unicodeDigits)) {
54
+ repaired += `\\u${unicodeDigits}`;
55
+ index += 5;
56
+ continue;
57
+ }
58
+ }
59
+ if (VALID_JSON_ESCAPES.has(nextChar)) {
60
+ repaired += `\\${nextChar}`;
61
+ index += 1;
62
+ continue;
63
+ }
64
+ repaired += "\\\\";
65
+ continue;
66
+ }
67
+ repaired += isControlCharacter(char) ? escapeControlCharacter(char) : char;
68
+ }
69
+ return repaired;
70
+ }
71
+ export function parseJsonWithRepair(json) {
72
+ try {
73
+ return JSON.parse(json);
74
+ }
75
+ catch (error) {
76
+ const repairedJson = repairJson(json);
77
+ if (repairedJson !== json) {
78
+ return JSON.parse(repairedJson);
79
+ }
80
+ throw error;
81
+ }
82
+ }
2
83
  /**
3
84
  * Attempts to parse potentially incomplete JSON during streaming.
4
85
  * Always returns a valid object, even if the JSON is incomplete.
@@ -10,19 +91,22 @@ export function parseStreamingJson(partialJson) {
10
91
  if (!partialJson || partialJson.trim() === "") {
11
92
  return {};
12
93
  }
13
- // Try standard parsing first (fastest for complete JSON)
14
94
  try {
15
- return JSON.parse(partialJson);
95
+ return parseJsonWithRepair(partialJson);
16
96
  }
17
97
  catch {
18
- // Try partial-json for incomplete JSON
19
98
  try {
20
99
  const result = partialParse(partialJson);
21
100
  return (result ?? {});
22
101
  }
23
102
  catch {
24
- // If all parsing fails, return empty object
25
- return {};
103
+ try {
104
+ const result = partialParse(repairJson(partialJson));
105
+ return (result ?? {});
106
+ }
107
+ catch {
108
+ return {};
109
+ }
26
110
  }
27
111
  }
28
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"json-parse.js","sourceRoot":"","sources":["../../src/utils/json-parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAU,WAA+B,EAAK;IAC/E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,EAAO,CAAC;IAChB,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAM,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;QACvC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YACzC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAM,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACR,4CAA4C;YAC5C,OAAO,EAAO,CAAC;QAChB,CAAC;IACF,CAAC;AAAA,CACD","sourcesContent":["import { parse as partialParse } from \"partial-json\";\n\n/**\n * Attempts to parse potentially incomplete JSON during streaming.\n * Always returns a valid object, even if the JSON is incomplete.\n *\n * @param partialJson The partial JSON string from streaming\n * @returns Parsed object or empty object if parsing fails\n */\nexport function parseStreamingJson<T = any>(partialJson: string | undefined): T {\n\tif (!partialJson || partialJson.trim() === \"\") {\n\t\treturn {} as T;\n\t}\n\n\t// Try standard parsing first (fastest for complete JSON)\n\ttry {\n\t\treturn JSON.parse(partialJson) as T;\n\t} catch {\n\t\t// Try partial-json for incomplete JSON\n\t\ttry {\n\t\t\tconst result = partialParse(partialJson);\n\t\t\treturn (result ?? {}) as T;\n\t\t} catch {\n\t\t\t// If all parsing fails, return empty object\n\t\t\treturn {} as T;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"json-parse.js","sourceRoot":"","sources":["../../src/utils/json-parse.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse as partialParse } from \"partial-json\";\n\nconst VALID_JSON_ESCAPES = new Set(['\"', \"\\\\\", \"/\", \"b\", \"f\", \"n\", \"r\", \"t\", \"u\"]);\n\nfunction isControlCharacter(char: string): boolean {\n\tconst codePoint = char.codePointAt(0);\n\treturn codePoint !== undefined && codePoint >= 0x00 && codePoint <= 0x1f;\n}\n\nfunction escapeControlCharacter(char: string): string {\n\tswitch (char) {\n\t\tcase \"\\b\":\n\t\t\treturn \"\\\\b\";\n\t\tcase \"\\f\":\n\t\t\treturn \"\\\\f\";\n\t\tcase \"\\n\":\n\t\t\treturn \"\\\\n\";\n\t\tcase \"\\r\":\n\t\t\treturn \"\\\\r\";\n\t\tcase \"\\t\":\n\t\t\treturn \"\\\\t\";\n\t\tdefault:\n\t\t\treturn `\\\\u${char.codePointAt(0)?.toString(16).padStart(4, \"0\") ?? \"0000\"}`;\n\t}\n}\n\n/**\n * Repairs malformed JSON string literals by:\n * - escaping raw control characters inside strings\n * - doubling backslashes before invalid escape characters\n */\nexport function repairJson(json: string): string {\n\tlet repaired = \"\";\n\tlet inString = false;\n\n\tfor (let index = 0; index < json.length; index++) {\n\t\tconst char = json[index];\n\n\t\tif (!inString) {\n\t\t\trepaired += char;\n\t\t\tif (char === '\"') {\n\t\t\t\tinString = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\trepaired += char;\n\t\t\tinString = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tconst nextChar = json[index + 1];\n\t\t\tif (nextChar === undefined) {\n\t\t\t\trepaired += \"\\\\\\\\\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (nextChar === \"u\") {\n\t\t\t\tconst unicodeDigits = json.slice(index + 2, index + 6);\n\t\t\t\tif (/^[0-9a-fA-F]{4}$/.test(unicodeDigits)) {\n\t\t\t\t\trepaired += `\\\\u${unicodeDigits}`;\n\t\t\t\t\tindex += 5;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (VALID_JSON_ESCAPES.has(nextChar)) {\n\t\t\t\trepaired += `\\\\${nextChar}`;\n\t\t\t\tindex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trepaired += \"\\\\\\\\\";\n\t\t\tcontinue;\n\t\t}\n\n\t\trepaired += isControlCharacter(char) ? escapeControlCharacter(char) : char;\n\t}\n\n\treturn repaired;\n}\n\nexport function parseJsonWithRepair<T>(json: string): T {\n\ttry {\n\t\treturn JSON.parse(json) as T;\n\t} catch (error) {\n\t\tconst repairedJson = repairJson(json);\n\t\tif (repairedJson !== json) {\n\t\t\treturn JSON.parse(repairedJson) as T;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n/**\n * Attempts to parse potentially incomplete JSON during streaming.\n * Always returns a valid object, even if the JSON is incomplete.\n *\n * @param partialJson The partial JSON string from streaming\n * @returns Parsed object or empty object if parsing fails\n */\nexport function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T {\n\tif (!partialJson || partialJson.trim() === \"\") {\n\t\treturn {} as T;\n\t}\n\n\ttry {\n\t\treturn parseJsonWithRepair<T>(partialJson);\n\t} catch {\n\t\ttry {\n\t\t\tconst result = partialParse(partialJson);\n\t\t\treturn (result ?? {}) as T;\n\t\t} catch {\n\t\t\ttry {\n\t\t\t\tconst result = partialParse(repairJson(partialJson));\n\t\t\t\treturn (result ?? {}) as T;\n\t\t\t} catch {\n\t\t\t\treturn {} as T;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ProviderEnv } from "../types.ts";
2
+ export declare const UNSUPPORTED_PROXY_PROTOCOL_MESSAGE = "Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.";
3
+ export declare function resolveHttpProxyUrlForTarget(targetUrl: string | URL, env?: ProviderEnv): URL | undefined;
4
+ //# sourceMappingURL=node-http-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http-proxy.d.ts","sourceRoot":"","sources":["../../src/utils/node-http-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAwF/C,eAAO,MAAM,kCAAkC,4GAC2D,CAAC;AAE3G,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,GAAG,GAAG,SAAS,CAoBxG","sourcesContent":["import type { ProviderEnv } from \"../types.ts\";\nimport { getProviderEnvValue } from \"./provider-env.ts\";\n\nconst DEFAULT_PROXY_PORTS: Record<string, number> = {\n\tftp: 21,\n\tgopher: 70,\n\thttp: 80,\n\thttps: 443,\n\tws: 80,\n\twss: 443,\n};\n\nfunction getProxyEnv(key: string, env?: ProviderEnv): string {\n\tconst lowercaseKey = key.toLowerCase();\n\tconst uppercaseKey = key.toUpperCase();\n\treturn (\n\t\tenv?.[lowercaseKey] ||\n\t\tenv?.[uppercaseKey] ||\n\t\tgetProviderEnvValue(lowercaseKey) ||\n\t\tgetProviderEnvValue(uppercaseKey) ||\n\t\t\"\"\n\t);\n}\n\nfunction parseProxyTargetUrl(targetUrl: string | URL): URL | undefined {\n\tif (targetUrl instanceof URL) {\n\t\treturn targetUrl;\n\t}\n\n\ttry {\n\t\treturn new URL(targetUrl);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction shouldProxyHostname(hostname: string, port: number, env?: ProviderEnv): boolean {\n\tconst noProxy = getProxyEnv(\"no_proxy\", env).toLowerCase();\n\tif (!noProxy) {\n\t\treturn true;\n\t}\n\tif (noProxy === \"*\") {\n\t\treturn false;\n\t}\n\n\treturn noProxy.split(/[,\\s]/).every((proxy) => {\n\t\tif (!proxy) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst parsedProxy = proxy.match(/^(.+):(\\d+)$/);\n\t\tlet proxyHostname = parsedProxy ? parsedProxy[1] : proxy;\n\t\tconst proxyPort = parsedProxy ? Number.parseInt(parsedProxy[2]!, 10) : 0;\n\t\tif (proxyPort && proxyPort !== port) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!/^[.*]/.test(proxyHostname)) {\n\t\t\treturn hostname !== proxyHostname;\n\t\t}\n\n\t\tif (proxyHostname.startsWith(\"*\")) {\n\t\t\tproxyHostname = proxyHostname.slice(1);\n\t\t}\n\t\treturn !hostname.endsWith(proxyHostname);\n\t});\n}\n\nfunction getProxyForUrl(targetUrl: string | URL, env?: ProviderEnv): string {\n\tconst parsedUrl = parseProxyTargetUrl(targetUrl);\n\tif (!parsedUrl?.protocol || !parsedUrl.host) {\n\t\treturn \"\";\n\t}\n\n\tconst protocol = parsedUrl.protocol.split(\":\", 1)[0]!;\n\tconst hostname = parsedUrl.host.replace(/:\\d*$/, \"\");\n\tconst port = Number.parseInt(parsedUrl.port, 10) || DEFAULT_PROXY_PORTS[protocol] || 0;\n\tif (!shouldProxyHostname(hostname, port, env)) {\n\t\treturn \"\";\n\t}\n\n\tlet proxy = getProxyEnv(`${protocol}_proxy`, env) || getProxyEnv(\"all_proxy\", env);\n\tif (proxy && !proxy.includes(\"://\")) {\n\t\tproxy = `${protocol}://${proxy}`;\n\t}\n\treturn proxy;\n}\n\nexport const UNSUPPORTED_PROXY_PROTOCOL_MESSAGE =\n\t\"Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.\";\n\nexport function resolveHttpProxyUrlForTarget(targetUrl: string | URL, env?: ProviderEnv): URL | undefined {\n\tconst proxy = getProxyForUrl(targetUrl, env);\n\tif (!proxy) {\n\t\treturn undefined;\n\t}\n\n\tlet proxyUrl: URL;\n\ttry {\n\t\tproxyUrl = new URL(proxy);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\n\tif (proxyUrl.protocol !== \"http:\" && proxyUrl.protocol !== \"https:\") {\n\t\tthrow new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);\n\t}\n\n\treturn proxyUrl;\n}\n"]}
@@ -0,0 +1,92 @@
1
+ import { getProviderEnvValue } from "./provider-env.js";
2
+ const DEFAULT_PROXY_PORTS = {
3
+ ftp: 21,
4
+ gopher: 70,
5
+ http: 80,
6
+ https: 443,
7
+ ws: 80,
8
+ wss: 443,
9
+ };
10
+ function getProxyEnv(key, env) {
11
+ const lowercaseKey = key.toLowerCase();
12
+ const uppercaseKey = key.toUpperCase();
13
+ return (env?.[lowercaseKey] ||
14
+ env?.[uppercaseKey] ||
15
+ getProviderEnvValue(lowercaseKey) ||
16
+ getProviderEnvValue(uppercaseKey) ||
17
+ "");
18
+ }
19
+ function parseProxyTargetUrl(targetUrl) {
20
+ if (targetUrl instanceof URL) {
21
+ return targetUrl;
22
+ }
23
+ try {
24
+ return new URL(targetUrl);
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ function shouldProxyHostname(hostname, port, env) {
31
+ const noProxy = getProxyEnv("no_proxy", env).toLowerCase();
32
+ if (!noProxy) {
33
+ return true;
34
+ }
35
+ if (noProxy === "*") {
36
+ return false;
37
+ }
38
+ return noProxy.split(/[,\s]/).every((proxy) => {
39
+ if (!proxy) {
40
+ return true;
41
+ }
42
+ const parsedProxy = proxy.match(/^(.+):(\d+)$/);
43
+ let proxyHostname = parsedProxy ? parsedProxy[1] : proxy;
44
+ const proxyPort = parsedProxy ? Number.parseInt(parsedProxy[2], 10) : 0;
45
+ if (proxyPort && proxyPort !== port) {
46
+ return true;
47
+ }
48
+ if (!/^[.*]/.test(proxyHostname)) {
49
+ return hostname !== proxyHostname;
50
+ }
51
+ if (proxyHostname.startsWith("*")) {
52
+ proxyHostname = proxyHostname.slice(1);
53
+ }
54
+ return !hostname.endsWith(proxyHostname);
55
+ });
56
+ }
57
+ function getProxyForUrl(targetUrl, env) {
58
+ const parsedUrl = parseProxyTargetUrl(targetUrl);
59
+ if (!parsedUrl?.protocol || !parsedUrl.host) {
60
+ return "";
61
+ }
62
+ const protocol = parsedUrl.protocol.split(":", 1)[0];
63
+ const hostname = parsedUrl.host.replace(/:\d*$/, "");
64
+ const port = Number.parseInt(parsedUrl.port, 10) || DEFAULT_PROXY_PORTS[protocol] || 0;
65
+ if (!shouldProxyHostname(hostname, port, env)) {
66
+ return "";
67
+ }
68
+ let proxy = getProxyEnv(`${protocol}_proxy`, env) || getProxyEnv("all_proxy", env);
69
+ if (proxy && !proxy.includes("://")) {
70
+ proxy = `${protocol}://${proxy}`;
71
+ }
72
+ return proxy;
73
+ }
74
+ export const UNSUPPORTED_PROXY_PROTOCOL_MESSAGE = "Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.";
75
+ export function resolveHttpProxyUrlForTarget(targetUrl, env) {
76
+ const proxy = getProxyForUrl(targetUrl, env);
77
+ if (!proxy) {
78
+ return undefined;
79
+ }
80
+ let proxyUrl;
81
+ try {
82
+ proxyUrl = new URL(proxy);
83
+ }
84
+ catch (error) {
85
+ throw new Error(`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error ? error.message : String(error)}`);
86
+ }
87
+ if (proxyUrl.protocol !== "http:" && proxyUrl.protocol !== "https:") {
88
+ throw new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);
89
+ }
90
+ return proxyUrl;
91
+ }
92
+ //# sourceMappingURL=node-http-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http-proxy.js","sourceRoot":"","sources":["../../src/utils/node-http-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProviderEnv } from \"../types.ts\";\nimport { getProviderEnvValue } from \"./provider-env.ts\";\n\nconst DEFAULT_PROXY_PORTS: Record<string, number> = {\n\tftp: 21,\n\tgopher: 70,\n\thttp: 80,\n\thttps: 443,\n\tws: 80,\n\twss: 443,\n};\n\nfunction getProxyEnv(key: string, env?: ProviderEnv): string {\n\tconst lowercaseKey = key.toLowerCase();\n\tconst uppercaseKey = key.toUpperCase();\n\treturn (\n\t\tenv?.[lowercaseKey] ||\n\t\tenv?.[uppercaseKey] ||\n\t\tgetProviderEnvValue(lowercaseKey) ||\n\t\tgetProviderEnvValue(uppercaseKey) ||\n\t\t\"\"\n\t);\n}\n\nfunction parseProxyTargetUrl(targetUrl: string | URL): URL | undefined {\n\tif (targetUrl instanceof URL) {\n\t\treturn targetUrl;\n\t}\n\n\ttry {\n\t\treturn new URL(targetUrl);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction shouldProxyHostname(hostname: string, port: number, env?: ProviderEnv): boolean {\n\tconst noProxy = getProxyEnv(\"no_proxy\", env).toLowerCase();\n\tif (!noProxy) {\n\t\treturn true;\n\t}\n\tif (noProxy === \"*\") {\n\t\treturn false;\n\t}\n\n\treturn noProxy.split(/[,\\s]/).every((proxy) => {\n\t\tif (!proxy) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst parsedProxy = proxy.match(/^(.+):(\\d+)$/);\n\t\tlet proxyHostname = parsedProxy ? parsedProxy[1] : proxy;\n\t\tconst proxyPort = parsedProxy ? Number.parseInt(parsedProxy[2]!, 10) : 0;\n\t\tif (proxyPort && proxyPort !== port) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!/^[.*]/.test(proxyHostname)) {\n\t\t\treturn hostname !== proxyHostname;\n\t\t}\n\n\t\tif (proxyHostname.startsWith(\"*\")) {\n\t\t\tproxyHostname = proxyHostname.slice(1);\n\t\t}\n\t\treturn !hostname.endsWith(proxyHostname);\n\t});\n}\n\nfunction getProxyForUrl(targetUrl: string | URL, env?: ProviderEnv): string {\n\tconst parsedUrl = parseProxyTargetUrl(targetUrl);\n\tif (!parsedUrl?.protocol || !parsedUrl.host) {\n\t\treturn \"\";\n\t}\n\n\tconst protocol = parsedUrl.protocol.split(\":\", 1)[0]!;\n\tconst hostname = parsedUrl.host.replace(/:\\d*$/, \"\");\n\tconst port = Number.parseInt(parsedUrl.port, 10) || DEFAULT_PROXY_PORTS[protocol] || 0;\n\tif (!shouldProxyHostname(hostname, port, env)) {\n\t\treturn \"\";\n\t}\n\n\tlet proxy = getProxyEnv(`${protocol}_proxy`, env) || getProxyEnv(\"all_proxy\", env);\n\tif (proxy && !proxy.includes(\"://\")) {\n\t\tproxy = `${protocol}://${proxy}`;\n\t}\n\treturn proxy;\n}\n\nexport const UNSUPPORTED_PROXY_PROTOCOL_MESSAGE =\n\t\"Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.\";\n\nexport function resolveHttpProxyUrlForTarget(targetUrl: string | URL, env?: ProviderEnv): URL | undefined {\n\tconst proxy = getProxyForUrl(targetUrl, env);\n\tif (!proxy) {\n\t\treturn undefined;\n\t}\n\n\tlet proxyUrl: URL;\n\ttry {\n\t\tproxyUrl = new URL(proxy);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\n\tif (proxyUrl.protocol !== \"http:\" && proxyUrl.protocol !== \"https:\") {\n\t\tthrow new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);\n\t}\n\n\treturn proxyUrl;\n}\n"]}
@@ -4,7 +4,8 @@
4
4
  * NOTE: This module uses Node.js http.createServer for the OAuth callback server.
5
5
  * It is only intended for CLI use, not browser environments.
6
6
  */
7
- import type { OAuthCredentials, OAuthPrompt, OAuthProviderInterface } from "./types.js";
7
+ import type { OAuthAuth } from "../../auth/types.ts";
8
+ import type { OAuthCredentials, OAuthPrompt, OAuthProviderInterface } from "./types.ts";
8
9
  /**
9
10
  * Login with Anthropic OAuth (authorization code + PKCE)
10
11
  */
@@ -21,5 +22,6 @@ export declare function loginAnthropic(options: {
21
22
  * Refresh Anthropic OAuth token
22
23
  */
23
24
  export declare function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials>;
25
+ export declare const anthropicOAuth: OAuthAuth;
24
26
  export declare const anthropicOAuthProvider: OAuthProviderInterface;
25
27
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/utils/oauth/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAuB,WAAW,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAwN7G;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/D,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4G5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B3F;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAqBpC,CAAC","sourcesContent":["/**\n * Anthropic OAuth flow (Claude Pro/Max)\n *\n * NOTE: This module uses Node.js http.createServer for the OAuth callback server.\n * It is only intended for CLI use, not browser environments.\n */\n\nimport type { Server } from \"node:http\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.js\";\nimport { generatePKCE } from \"./pkce.js\";\nimport type { OAuthCredentials, OAuthLoginCallbacks, OAuthPrompt, OAuthProviderInterface } from \"./types.js\";\n\ntype CallbackServerInfo = {\n\tserver: Server;\n\tredirectUri: string;\n\tcancelWait: () => void;\n\twaitForCode: () => Promise<{ code: string; state: string } | null>;\n};\n\ntype NodeApis = {\n\tcreateServer: typeof import(\"node:http\").createServer;\n};\n\nlet nodeApis: NodeApis | null = null;\nlet nodeApisPromise: Promise<NodeApis> | null = null;\n\nconst decode = (s: string) => atob(s);\nconst CLIENT_ID = decode(\"OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl\");\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\nconst CALLBACK_HOST = \"127.0.0.1\";\nconst CALLBACK_PORT = 53692;\nconst CALLBACK_PATH = \"/callback\";\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;\nconst SCOPES =\n\t\"org:create_api_key user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload\";\nasync function getNodeApis(): Promise<NodeApis> {\n\tif (nodeApis) return nodeApis;\n\tif (!nodeApisPromise) {\n\t\tif (typeof process === \"undefined\" || (!process.versions?.node && !process.versions?.bun)) {\n\t\t\tthrow new Error(\"Anthropic OAuth is only available in Node.js environments\");\n\t\t}\n\t\tnodeApisPromise = import(\"node:http\").then((httpModule) => ({\n\t\t\tcreateServer: httpModule.createServer,\n\t\t}));\n\t}\n\tnodeApis = await nodeApisPromise;\n\treturn nodeApis;\n}\n\nfunction parseAuthorizationInput(input: string): { code?: string; state?: string } {\n\tconst value = input.trim();\n\tif (!value) return {};\n\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn {\n\t\t\tcode: url.searchParams.get(\"code\") ?? undefined,\n\t\t\tstate: url.searchParams.get(\"state\") ?? undefined,\n\t\t};\n\t} catch {\n\t\t// not a URL\n\t}\n\n\tif (value.includes(\"#\")) {\n\t\tconst [code, state] = value.split(\"#\", 2);\n\t\treturn { code, state };\n\t}\n\n\tif (value.includes(\"code=\")) {\n\t\tconst params = new URLSearchParams(value);\n\t\treturn {\n\t\t\tcode: params.get(\"code\") ?? undefined,\n\t\t\tstate: params.get(\"state\") ?? undefined,\n\t\t};\n\t}\n\n\treturn { code: value };\n}\n\nfunction formatErrorDetails(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tconst details: string[] = [`${error.name}: ${error.message}`];\n\t\tconst errorWithCode = error as Error & { code?: string; errno?: number | string; cause?: unknown };\n\t\tif (errorWithCode.code) details.push(`code=${errorWithCode.code}`);\n\t\tif (typeof errorWithCode.errno !== \"undefined\") details.push(`errno=${String(errorWithCode.errno)}`);\n\t\tif (typeof error.cause !== \"undefined\") {\n\t\t\tdetails.push(`cause=${formatErrorDetails(error.cause)}`);\n\t\t}\n\t\tif (error.stack) {\n\t\t\tdetails.push(`stack=${error.stack}`);\n\t\t}\n\t\treturn details.join(\"; \");\n\t}\n\treturn String(error);\n}\n\nasync function startCallbackServer(expectedState: string): Promise<CallbackServerInfo> {\n\tconst { createServer } = await getNodeApis();\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet settleWait: ((value: { code: string; state: string } | null) => void) | undefined;\n\t\tconst waitForCodePromise = new Promise<{ code: string; state: string } | null>((resolveWait) => {\n\t\t\tlet settled = false;\n\t\t\tsettleWait = (value) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tresolveWait(value);\n\t\t\t};\n\t\t});\n\n\t\tconst server = createServer((req, res) => {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(req.url || \"\", \"http://localhost\");\n\t\t\t\tif (url.pathname !== CALLBACK_PATH) {\n\t\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"Callback route not found.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst code = url.searchParams.get(\"code\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\t\t\t\tconst error = url.searchParams.get(\"error\");\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"Anthropic authentication did not complete.\", `Error: ${error}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!code || !state) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"Missing code or state parameter.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"State mismatch.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\tres.end(oauthSuccessHtml(\"Anthropic authentication completed. You can close this window.\"));\n\t\t\t\tsettleWait?.({ code, state });\n\t\t\t} catch {\n\t\t\t\tres.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n\t\t\t\tres.end(\"Internal error\");\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\n\t\tserver.listen(CALLBACK_PORT, CALLBACK_HOST, () => {\n\t\t\tresolve({\n\t\t\t\tserver,\n\t\t\t\tredirectUri: REDIRECT_URI,\n\t\t\t\tcancelWait: () => {\n\t\t\t\t\tsettleWait?.(null);\n\t\t\t\t},\n\t\t\t\twaitForCode: () => waitForCodePromise,\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function postJson(url: string, body: Record<string, string | number>): Promise<string> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAccept: \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal: AbortSignal.timeout(30_000),\n\t});\n\n\tconst responseBody = await response.text();\n\n\tif (!response.ok) {\n\t\tthrow new Error(`HTTP request failed. status=${response.status}; url=${url}; body=${responseBody}`);\n\t}\n\n\treturn responseBody;\n}\n\nasync function exchangeAuthorizationCode(\n\tcode: string,\n\tstate: string,\n\tverifier: string,\n\tredirectUri: string,\n): Promise<OAuthCredentials> {\n\tlet responseBody: string;\n\ttry {\n\t\tresponseBody = await postJson(TOKEN_URL, {\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tcode,\n\t\t\tstate,\n\t\t\tredirect_uri: redirectUri,\n\t\t\tcode_verifier: verifier,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Token exchange request failed. url=${TOKEN_URL}; redirect_uri=${redirectUri}; response_type=authorization_code; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\tlet tokenData: { access_token: string; refresh_token: string; expires_in: number };\n\ttry {\n\t\ttokenData = JSON.parse(responseBody) as { access_token: string; refresh_token: string; expires_in: number };\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Token exchange returned invalid JSON. url=${TOKEN_URL}; body=${responseBody}; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\trefresh: tokenData.refresh_token,\n\t\taccess: tokenData.access_token,\n\t\texpires: Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000,\n\t};\n}\n\n/**\n * Login with Anthropic OAuth (authorization code + PKCE)\n */\nexport async function loginAnthropic(options: {\n\tonAuth: (info: { url: string; instructions?: string }) => void;\n\tonPrompt: (prompt: OAuthPrompt) => Promise<string>;\n\tonProgress?: (message: string) => void;\n\tonManualCodeInput?: () => Promise<string>;\n}): Promise<OAuthCredentials> {\n\tconst { verifier, challenge } = await generatePKCE();\n\tconst server = await startCallbackServer(verifier);\n\n\tlet code: string | undefined;\n\tlet state: string | undefined;\n\tlet redirectUriForExchange = REDIRECT_URI;\n\n\ttry {\n\t\tconst authParams = new URLSearchParams({\n\t\t\tcode: \"true\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tresponse_type: \"code\",\n\t\t\tredirect_uri: REDIRECT_URI,\n\t\t\tscope: SCOPES,\n\t\t\tcode_challenge: challenge,\n\t\t\tcode_challenge_method: \"S256\",\n\t\t\tstate: verifier,\n\t\t});\n\n\t\toptions.onAuth({\n\t\t\turl: `${AUTHORIZE_URL}?${authParams.toString()}`,\n\t\t\tinstructions:\n\t\t\t\t\"Complete login in your browser. If the browser is on another machine, paste the final redirect URL here.\",\n\t\t});\n\n\t\tif (options.onManualCodeInput) {\n\t\t\tlet manualInput: string | undefined;\n\t\t\tlet manualError: Error | undefined;\n\t\t\tconst manualPromise = options\n\t\t\t\t.onManualCodeInput()\n\t\t\t\t.then((input) => {\n\t\t\t\t\tmanualInput = input;\n\t\t\t\t\tserver.cancelWait();\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tmanualError = err instanceof Error ? err : new Error(String(err));\n\t\t\t\t\tserver.cancelWait();\n\t\t\t\t});\n\n\t\t\tconst result = await server.waitForCode();\n\n\t\t\tif (manualError) {\n\t\t\t\tthrow manualError;\n\t\t\t}\n\n\t\t\tif (result?.code) {\n\t\t\t\tcode = result.code;\n\t\t\t\tstate = result.state;\n\t\t\t\tredirectUriForExchange = REDIRECT_URI;\n\t\t\t} else if (manualInput) {\n\t\t\t\tconst parsed = parseAuthorizationInput(manualInput);\n\t\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\t\tthrow new Error(\"OAuth state mismatch\");\n\t\t\t\t}\n\t\t\t\tcode = parsed.code;\n\t\t\t\tstate = parsed.state ?? verifier;\n\t\t\t}\n\n\t\t\tif (!code) {\n\t\t\t\tawait manualPromise;\n\t\t\t\tif (manualError) {\n\t\t\t\t\tthrow manualError;\n\t\t\t\t}\n\t\t\t\tif (manualInput) {\n\t\t\t\t\tconst parsed = parseAuthorizationInput(manualInput);\n\t\t\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\t\t\tthrow new Error(\"OAuth state mismatch\");\n\t\t\t\t\t}\n\t\t\t\t\tcode = parsed.code;\n\t\t\t\t\tstate = parsed.state ?? verifier;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst result = await server.waitForCode();\n\t\t\tif (result?.code) {\n\t\t\t\tcode = result.code;\n\t\t\t\tstate = result.state;\n\t\t\t\tredirectUriForExchange = REDIRECT_URI;\n\t\t\t}\n\t\t}\n\n\t\tif (!code) {\n\t\t\tconst input = await options.onPrompt({\n\t\t\t\tmessage: \"Paste the authorization code or full redirect URL:\",\n\t\t\t\tplaceholder: REDIRECT_URI,\n\t\t\t});\n\t\t\tconst parsed = parseAuthorizationInput(input);\n\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\tthrow new Error(\"OAuth state mismatch\");\n\t\t\t}\n\t\t\tcode = parsed.code;\n\t\t\tstate = parsed.state ?? verifier;\n\t\t}\n\n\t\tif (!code) {\n\t\t\tthrow new Error(\"Missing authorization code\");\n\t\t}\n\n\t\tif (!state) {\n\t\t\tthrow new Error(\"Missing OAuth state\");\n\t\t}\n\n\t\toptions.onProgress?.(\"Exchanging authorization code for tokens...\");\n\t\treturn exchangeAuthorizationCode(code, state, verifier, redirectUriForExchange);\n\t} finally {\n\t\tserver.server.close();\n\t}\n}\n\n/**\n * Refresh Anthropic OAuth token\n */\nexport async function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials> {\n\tlet responseBody: string;\n\ttry {\n\t\tresponseBody = await postJson(TOKEN_URL, {\n\t\t\tgrant_type: \"refresh_token\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\trefresh_token: refreshToken,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`Anthropic token refresh request failed. url=${TOKEN_URL}; details=${formatErrorDetails(error)}`);\n\t}\n\n\tlet data: { access_token: string; refresh_token: string; expires_in: number; scope?: string };\n\ttry {\n\t\tdata = JSON.parse(responseBody) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t\tscope?: string;\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Anthropic token refresh returned invalid JSON. url=${TOKEN_URL}; body=${responseBody}; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\trefresh: data.refresh_token,\n\t\taccess: data.access_token,\n\t\texpires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,\n\t};\n}\n\nexport const anthropicOAuthProvider: OAuthProviderInterface = {\n\tid: \"anthropic\",\n\tname: \"Anthropic (Claude Pro/Max)\",\n\tusesCallbackServer: true,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\treturn loginAnthropic({\n\t\t\tonAuth: callbacks.onAuth,\n\t\t\tonPrompt: callbacks.onPrompt,\n\t\t\tonProgress: callbacks.onProgress,\n\t\t\tonManualCodeInput: callbacks.onManualCodeInput,\n\t\t});\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\treturn refreshAnthropicToken(credentials.refresh);\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n"]}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/utils/oauth/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,KAAK,EAAE,gBAAgB,EAAuB,WAAW,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAwN7G;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/D,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4G5B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B3F;AAED,eAAO,MAAM,cAAc,EAAE,SAkC5B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,sBAqBpC,CAAC","sourcesContent":["/**\n * Anthropic OAuth flow (Claude Pro/Max)\n *\n * NOTE: This module uses Node.js http.createServer for the OAuth callback server.\n * It is only intended for CLI use, not browser environments.\n */\n\nimport type { Server } from \"node:http\";\nimport type { OAuthAuth } from \"../../auth/types.ts\";\nimport { getProviderEnvValue } from \"../provider-env.ts\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.ts\";\nimport { generatePKCE } from \"./pkce.ts\";\nimport type { OAuthCredentials, OAuthLoginCallbacks, OAuthPrompt, OAuthProviderInterface } from \"./types.ts\";\n\ntype CallbackServerInfo = {\n\tserver: Server;\n\tredirectUri: string;\n\tcancelWait: () => void;\n\twaitForCode: () => Promise<{ code: string; state: string } | null>;\n};\n\ntype NodeApis = {\n\tcreateServer: typeof import(\"node:http\").createServer;\n};\n\nlet nodeApis: NodeApis | null = null;\nlet nodeApisPromise: Promise<NodeApis> | null = null;\n\nconst decode = (s: string) => atob(s);\nconst CLIENT_ID = decode(\"OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl\");\nconst AUTHORIZE_URL = \"https://claude.ai/oauth/authorize\";\nconst TOKEN_URL = \"https://platform.claude.com/v1/oauth/token\";\nconst CALLBACK_HOST = getProviderEnvValue(\"PI_OAUTH_CALLBACK_HOST\") || \"127.0.0.1\";\nconst CALLBACK_PORT = 53692;\nconst CALLBACK_PATH = \"/callback\";\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;\nconst SCOPES =\n\t\"org:create_api_key user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload\";\nasync function getNodeApis(): Promise<NodeApis> {\n\tif (nodeApis) return nodeApis;\n\tif (!nodeApisPromise) {\n\t\tif (typeof process === \"undefined\" || (!process.versions?.node && !process.versions?.bun)) {\n\t\t\tthrow new Error(\"Anthropic OAuth is only available in Node.js environments\");\n\t\t}\n\t\tnodeApisPromise = import(\"node:http\").then((httpModule) => ({\n\t\t\tcreateServer: httpModule.createServer,\n\t\t}));\n\t}\n\tnodeApis = await nodeApisPromise;\n\treturn nodeApis;\n}\n\nfunction parseAuthorizationInput(input: string): { code?: string; state?: string } {\n\tconst value = input.trim();\n\tif (!value) return {};\n\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn {\n\t\t\tcode: url.searchParams.get(\"code\") ?? undefined,\n\t\t\tstate: url.searchParams.get(\"state\") ?? undefined,\n\t\t};\n\t} catch {\n\t\t// not a URL\n\t}\n\n\tif (value.includes(\"#\")) {\n\t\tconst [code, state] = value.split(\"#\", 2);\n\t\treturn { code, state };\n\t}\n\n\tif (value.includes(\"code=\")) {\n\t\tconst params = new URLSearchParams(value);\n\t\treturn {\n\t\t\tcode: params.get(\"code\") ?? undefined,\n\t\t\tstate: params.get(\"state\") ?? undefined,\n\t\t};\n\t}\n\n\treturn { code: value };\n}\n\nfunction formatErrorDetails(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tconst details: string[] = [`${error.name}: ${error.message}`];\n\t\tconst errorWithCode = error as Error & { code?: string; errno?: number | string; cause?: unknown };\n\t\tif (errorWithCode.code) details.push(`code=${errorWithCode.code}`);\n\t\tif (typeof errorWithCode.errno !== \"undefined\") details.push(`errno=${String(errorWithCode.errno)}`);\n\t\tif (typeof error.cause !== \"undefined\") {\n\t\t\tdetails.push(`cause=${formatErrorDetails(error.cause)}`);\n\t\t}\n\t\tif (error.stack) {\n\t\t\tdetails.push(`stack=${error.stack}`);\n\t\t}\n\t\treturn details.join(\"; \");\n\t}\n\treturn String(error);\n}\n\nasync function startCallbackServer(expectedState: string): Promise<CallbackServerInfo> {\n\tconst { createServer } = await getNodeApis();\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet settleWait: ((value: { code: string; state: string } | null) => void) | undefined;\n\t\tconst waitForCodePromise = new Promise<{ code: string; state: string } | null>((resolveWait) => {\n\t\t\tlet settled = false;\n\t\t\tsettleWait = (value) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tresolveWait(value);\n\t\t\t};\n\t\t});\n\n\t\tconst server = createServer((req, res) => {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(req.url || \"\", \"http://localhost\");\n\t\t\t\tif (url.pathname !== CALLBACK_PATH) {\n\t\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"Callback route not found.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst code = url.searchParams.get(\"code\");\n\t\t\t\tconst state = url.searchParams.get(\"state\");\n\t\t\t\tconst error = url.searchParams.get(\"error\");\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"Anthropic authentication did not complete.\", `Error: ${error}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!code || !state) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"Missing code or state parameter.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (state !== expectedState) {\n\t\t\t\t\tres.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthErrorHtml(\"State mismatch.\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\tres.end(oauthSuccessHtml(\"Anthropic authentication completed. You can close this window.\"));\n\t\t\t\tsettleWait?.({ code, state });\n\t\t\t} catch {\n\t\t\t\tres.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n\t\t\t\tres.end(\"Internal error\");\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"error\", (err) => {\n\t\t\treject(err);\n\t\t});\n\n\t\tserver.listen(CALLBACK_PORT, CALLBACK_HOST, () => {\n\t\t\tresolve({\n\t\t\t\tserver,\n\t\t\t\tredirectUri: REDIRECT_URI,\n\t\t\t\tcancelWait: () => {\n\t\t\t\t\tsettleWait?.(null);\n\t\t\t\t},\n\t\t\t\twaitForCode: () => waitForCodePromise,\n\t\t\t});\n\t\t});\n\t});\n}\n\nasync function postJson(url: string, body: Record<string, string | number>): Promise<string> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAccept: \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal: AbortSignal.timeout(30_000),\n\t});\n\n\tconst responseBody = await response.text();\n\n\tif (!response.ok) {\n\t\tthrow new Error(`HTTP request failed. status=${response.status}; url=${url}; body=${responseBody}`);\n\t}\n\n\treturn responseBody;\n}\n\nasync function exchangeAuthorizationCode(\n\tcode: string,\n\tstate: string,\n\tverifier: string,\n\tredirectUri: string,\n): Promise<OAuthCredentials> {\n\tlet responseBody: string;\n\ttry {\n\t\tresponseBody = await postJson(TOKEN_URL, {\n\t\t\tgrant_type: \"authorization_code\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tcode,\n\t\t\tstate,\n\t\t\tredirect_uri: redirectUri,\n\t\t\tcode_verifier: verifier,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Token exchange request failed. url=${TOKEN_URL}; redirect_uri=${redirectUri}; response_type=authorization_code; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\tlet tokenData: { access_token: string; refresh_token: string; expires_in: number };\n\ttry {\n\t\ttokenData = JSON.parse(responseBody) as { access_token: string; refresh_token: string; expires_in: number };\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Token exchange returned invalid JSON. url=${TOKEN_URL}; body=${responseBody}; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\trefresh: tokenData.refresh_token,\n\t\taccess: tokenData.access_token,\n\t\texpires: Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000,\n\t};\n}\n\n/**\n * Login with Anthropic OAuth (authorization code + PKCE)\n */\nexport async function loginAnthropic(options: {\n\tonAuth: (info: { url: string; instructions?: string }) => void;\n\tonPrompt: (prompt: OAuthPrompt) => Promise<string>;\n\tonProgress?: (message: string) => void;\n\tonManualCodeInput?: () => Promise<string>;\n}): Promise<OAuthCredentials> {\n\tconst { verifier, challenge } = await generatePKCE();\n\tconst server = await startCallbackServer(verifier);\n\n\tlet code: string | undefined;\n\tlet state: string | undefined;\n\tlet redirectUriForExchange = REDIRECT_URI;\n\n\ttry {\n\t\tconst authParams = new URLSearchParams({\n\t\t\tcode: \"true\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tresponse_type: \"code\",\n\t\t\tredirect_uri: REDIRECT_URI,\n\t\t\tscope: SCOPES,\n\t\t\tcode_challenge: challenge,\n\t\t\tcode_challenge_method: \"S256\",\n\t\t\tstate: verifier,\n\t\t});\n\n\t\toptions.onAuth({\n\t\t\turl: `${AUTHORIZE_URL}?${authParams.toString()}`,\n\t\t\tinstructions:\n\t\t\t\t\"Complete login in your browser. If the browser is on another machine, paste the final redirect URL here.\",\n\t\t});\n\n\t\tif (options.onManualCodeInput) {\n\t\t\tlet manualInput: string | undefined;\n\t\t\tlet manualError: Error | undefined;\n\t\t\tconst manualPromise = options\n\t\t\t\t.onManualCodeInput()\n\t\t\t\t.then((input) => {\n\t\t\t\t\tmanualInput = input;\n\t\t\t\t\tserver.cancelWait();\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tmanualError = err instanceof Error ? err : new Error(String(err));\n\t\t\t\t\tserver.cancelWait();\n\t\t\t\t});\n\n\t\t\tconst result = await server.waitForCode();\n\n\t\t\tif (manualError) {\n\t\t\t\tthrow manualError;\n\t\t\t}\n\n\t\t\tif (result?.code) {\n\t\t\t\tcode = result.code;\n\t\t\t\tstate = result.state;\n\t\t\t\tredirectUriForExchange = REDIRECT_URI;\n\t\t\t} else if (manualInput) {\n\t\t\t\tconst parsed = parseAuthorizationInput(manualInput);\n\t\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\t\tthrow new Error(\"OAuth state mismatch\");\n\t\t\t\t}\n\t\t\t\tcode = parsed.code;\n\t\t\t\tstate = parsed.state ?? verifier;\n\t\t\t}\n\n\t\t\tif (!code) {\n\t\t\t\tawait manualPromise;\n\t\t\t\tif (manualError) {\n\t\t\t\t\tthrow manualError;\n\t\t\t\t}\n\t\t\t\tif (manualInput) {\n\t\t\t\t\tconst parsed = parseAuthorizationInput(manualInput);\n\t\t\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\t\t\tthrow new Error(\"OAuth state mismatch\");\n\t\t\t\t\t}\n\t\t\t\t\tcode = parsed.code;\n\t\t\t\t\tstate = parsed.state ?? verifier;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst result = await server.waitForCode();\n\t\t\tif (result?.code) {\n\t\t\t\tcode = result.code;\n\t\t\t\tstate = result.state;\n\t\t\t\tredirectUriForExchange = REDIRECT_URI;\n\t\t\t}\n\t\t}\n\n\t\tif (!code) {\n\t\t\tconst input = await options.onPrompt({\n\t\t\t\tmessage: \"Paste the authorization code or full redirect URL:\",\n\t\t\t\tplaceholder: REDIRECT_URI,\n\t\t\t});\n\t\t\tconst parsed = parseAuthorizationInput(input);\n\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\tthrow new Error(\"OAuth state mismatch\");\n\t\t\t}\n\t\t\tcode = parsed.code;\n\t\t\tstate = parsed.state ?? verifier;\n\t\t}\n\n\t\tif (!code) {\n\t\t\tthrow new Error(\"Missing authorization code\");\n\t\t}\n\n\t\tif (!state) {\n\t\t\tthrow new Error(\"Missing OAuth state\");\n\t\t}\n\n\t\toptions.onProgress?.(\"Exchanging authorization code for tokens...\");\n\t\treturn exchangeAuthorizationCode(code, state, verifier, redirectUriForExchange);\n\t} finally {\n\t\tserver.server.close();\n\t}\n}\n\n/**\n * Refresh Anthropic OAuth token\n */\nexport async function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials> {\n\tlet responseBody: string;\n\ttry {\n\t\tresponseBody = await postJson(TOKEN_URL, {\n\t\t\tgrant_type: \"refresh_token\",\n\t\t\tclient_id: CLIENT_ID,\n\t\t\trefresh_token: refreshToken,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`Anthropic token refresh request failed. url=${TOKEN_URL}; details=${formatErrorDetails(error)}`);\n\t}\n\n\tlet data: { access_token: string; refresh_token: string; expires_in: number; scope?: string };\n\ttry {\n\t\tdata = JSON.parse(responseBody) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t\tscope?: string;\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Anthropic token refresh returned invalid JSON. url=${TOKEN_URL}; body=${responseBody}; details=${formatErrorDetails(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\trefresh: data.refresh_token,\n\t\taccess: data.access_token,\n\t\texpires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,\n\t};\n}\n\nexport const anthropicOAuth: OAuthAuth = {\n\tname: \"Anthropic (Claude Pro/Max)\",\n\n\tasync login(callbacks) {\n\t\t// The manual_code prompt races the local callback server; abort it once\n\t\t// the flow settles so the UI can dismiss the pending input.\n\t\tconst manualAbort = new AbortController();\n\t\ttry {\n\t\t\tconst credentials = await loginAnthropic({\n\t\t\t\tonAuth: (info) => callbacks.notify({ type: \"auth_url\", url: info.url, instructions: info.instructions }),\n\t\t\t\tonProgress: (message) => callbacks.notify({ type: \"progress\", message }),\n\t\t\t\tonPrompt: (prompt) =>\n\t\t\t\t\tcallbacks.prompt({ type: \"text\", message: prompt.message, placeholder: prompt.placeholder }),\n\t\t\t\tonManualCodeInput: () =>\n\t\t\t\t\tcallbacks.prompt({\n\t\t\t\t\t\ttype: \"manual_code\",\n\t\t\t\t\t\tmessage: \"Complete login in your browser, or paste the authorization code / redirect URL here:\",\n\t\t\t\t\t\tplaceholder: REDIRECT_URI,\n\t\t\t\t\t\tsignal: manualAbort.signal,\n\t\t\t\t\t}),\n\t\t\t});\n\t\t\treturn { ...credentials, type: \"oauth\" };\n\t\t} finally {\n\t\t\tmanualAbort.abort();\n\t\t}\n\t},\n\n\tasync refresh(credential) {\n\t\treturn { ...(await refreshAnthropicToken(credential.refresh)), type: \"oauth\" };\n\t},\n\n\tasync toAuth(credential) {\n\t\treturn { apiKey: credential.access };\n\t},\n};\n\nexport const anthropicOAuthProvider: OAuthProviderInterface = {\n\tid: \"anthropic\",\n\tname: \"Anthropic (Claude Pro/Max)\",\n\tusesCallbackServer: true,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\treturn loginAnthropic({\n\t\t\tonAuth: callbacks.onAuth,\n\t\t\tonPrompt: callbacks.onPrompt,\n\t\t\tonProgress: callbacks.onProgress,\n\t\t\tonManualCodeInput: callbacks.onManualCodeInput,\n\t\t});\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\treturn refreshAnthropicToken(credentials.refresh);\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n"]}
@@ -4,6 +4,7 @@
4
4
  * NOTE: This module uses Node.js http.createServer for the OAuth callback server.
5
5
  * It is only intended for CLI use, not browser environments.
6
6
  */
7
+ import { getProviderEnvValue } from "../provider-env.js";
7
8
  import { oauthErrorHtml, oauthSuccessHtml } from "./oauth-page.js";
8
9
  import { generatePKCE } from "./pkce.js";
9
10
  let nodeApis = null;
@@ -12,7 +13,7 @@ const decode = (s) => atob(s);
12
13
  const CLIENT_ID = decode("OWQxYzI1MGEtZTYxYi00NGQ5LTg4ZWQtNTk0NGQxOTYyZjVl");
13
14
  const AUTHORIZE_URL = "https://claude.ai/oauth/authorize";
14
15
  const TOKEN_URL = "https://platform.claude.com/v1/oauth/token";
15
- const CALLBACK_HOST = "127.0.0.1";
16
+ const CALLBACK_HOST = getProviderEnvValue("PI_OAUTH_CALLBACK_HOST") || "127.0.0.1";
16
17
  const CALLBACK_PORT = 53692;
17
18
  const CALLBACK_PATH = "/callback";
18
19
  const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
@@ -313,6 +314,37 @@ export async function refreshAnthropicToken(refreshToken) {
313
314
  expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
314
315
  };
315
316
  }
317
+ export const anthropicOAuth = {
318
+ name: "Anthropic (Claude Pro/Max)",
319
+ async login(callbacks) {
320
+ // The manual_code prompt races the local callback server; abort it once
321
+ // the flow settles so the UI can dismiss the pending input.
322
+ const manualAbort = new AbortController();
323
+ try {
324
+ const credentials = await loginAnthropic({
325
+ onAuth: (info) => callbacks.notify({ type: "auth_url", url: info.url, instructions: info.instructions }),
326
+ onProgress: (message) => callbacks.notify({ type: "progress", message }),
327
+ onPrompt: (prompt) => callbacks.prompt({ type: "text", message: prompt.message, placeholder: prompt.placeholder }),
328
+ onManualCodeInput: () => callbacks.prompt({
329
+ type: "manual_code",
330
+ message: "Complete login in your browser, or paste the authorization code / redirect URL here:",
331
+ placeholder: REDIRECT_URI,
332
+ signal: manualAbort.signal,
333
+ }),
334
+ });
335
+ return { ...credentials, type: "oauth" };
336
+ }
337
+ finally {
338
+ manualAbort.abort();
339
+ }
340
+ },
341
+ async refresh(credential) {
342
+ return { ...(await refreshAnthropicToken(credential.refresh)), type: "oauth" };
343
+ },
344
+ async toAuth(credential) {
345
+ return { apiKey: credential.access };
346
+ },
347
+ };
316
348
  export const anthropicOAuthProvider = {
317
349
  id: "anthropic",
318
350
  name: "Anthropic (Claude Pro/Max)",