@draht/ai 2026.7.13 → 2026.9.5-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 (524) hide show
  1. package/dist/api/anthropic-messages.d.ts.map +1 -1
  2. package/dist/api/anthropic-messages.js +144 -65
  3. package/dist/api/anthropic-messages.js.map +1 -1
  4. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  5. package/dist/api/azure-openai-responses.js +28 -10
  6. package/dist/api/azure-openai-responses.js.map +1 -1
  7. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  8. package/dist/api/bedrock-converse-stream.js +70 -25
  9. package/dist/api/bedrock-converse-stream.js.map +1 -1
  10. package/dist/api/constrained-sampling.d.ts +17 -0
  11. package/dist/api/constrained-sampling.d.ts.map +1 -0
  12. package/dist/api/constrained-sampling.js +100 -0
  13. package/dist/api/constrained-sampling.js.map +1 -0
  14. package/dist/api/google-generative-ai.d.ts +2 -2
  15. package/dist/api/google-generative-ai.d.ts.map +1 -1
  16. package/dist/api/google-generative-ai.js +37 -27
  17. package/dist/api/google-generative-ai.js.map +1 -1
  18. package/dist/api/google-shared.d.ts +19 -5
  19. package/dist/api/google-shared.d.ts.map +1 -1
  20. package/dist/api/google-shared.js +77 -10
  21. package/dist/api/google-shared.js.map +1 -1
  22. package/dist/api/google-vertex.d.ts +2 -2
  23. package/dist/api/google-vertex.d.ts.map +1 -1
  24. package/dist/api/google-vertex.js +35 -25
  25. package/dist/api/google-vertex.js.map +1 -1
  26. package/dist/api/lazy.d.ts.map +1 -1
  27. package/dist/api/lazy.js +9 -10
  28. package/dist/api/lazy.js.map +1 -1
  29. package/dist/api/mistral-conversations.d.ts.map +1 -1
  30. package/dist/api/mistral-conversations.js +38 -21
  31. package/dist/api/mistral-conversations.js.map +1 -1
  32. package/dist/api/openai-codex-responses.d.ts +1 -0
  33. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  34. package/dist/api/openai-codex-responses.js +136 -68
  35. package/dist/api/openai-codex-responses.js.map +1 -1
  36. package/dist/api/openai-completions.d.ts +8 -8
  37. package/dist/api/openai-completions.d.ts.map +1 -1
  38. package/dist/api/openai-completions.js +230 -54
  39. package/dist/api/openai-completions.js.map +1 -1
  40. package/dist/api/openai-responses-shared.d.ts +8 -1
  41. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  42. package/dist/api/openai-responses-shared.js +233 -67
  43. package/dist/api/openai-responses-shared.js.map +1 -1
  44. package/dist/api/openai-responses.d.ts +1 -0
  45. package/dist/api/openai-responses.d.ts.map +1 -1
  46. package/dist/api/openai-responses.js +66 -18
  47. package/dist/api/openai-responses.js.map +1 -1
  48. package/dist/api/openrouter-images.d.ts.map +1 -1
  49. package/dist/api/openrouter-images.js +11 -5
  50. package/dist/api/openrouter-images.js.map +1 -1
  51. package/dist/api/pi-messages.d.ts +97 -0
  52. package/dist/api/pi-messages.d.ts.map +1 -0
  53. package/dist/api/pi-messages.js +305 -0
  54. package/dist/api/pi-messages.js.map +1 -0
  55. package/dist/api/pi-messages.lazy.d.ts +3 -0
  56. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  57. package/dist/api/pi-messages.lazy.js +3 -0
  58. package/dist/api/pi-messages.lazy.js.map +1 -0
  59. package/dist/api/simple-options.d.ts.map +1 -1
  60. package/dist/api/simple-options.js +1 -0
  61. package/dist/api/simple-options.js.map +1 -1
  62. package/dist/auth/credential-store.d.ts +2 -1
  63. package/dist/auth/credential-store.d.ts.map +1 -1
  64. package/dist/auth/credential-store.js +3 -0
  65. package/dist/auth/credential-store.js.map +1 -1
  66. package/dist/auth/helpers.d.ts +1 -0
  67. package/dist/auth/helpers.d.ts.map +1 -1
  68. package/dist/auth/helpers.js +7 -5
  69. package/dist/auth/helpers.js.map +1 -1
  70. package/dist/auth/oauth/anthropic.d.ts +9 -0
  71. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  72. package/dist/{utils → auth}/oauth/anthropic.js +51 -116
  73. package/dist/auth/oauth/anthropic.js.map +1 -0
  74. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  75. package/dist/auth/oauth/device-code.js.map +1 -0
  76. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  77. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  78. package/dist/{utils → auth}/oauth/github-copilot.js +124 -107
  79. package/dist/auth/oauth/github-copilot.js.map +1 -0
  80. package/dist/auth/oauth/google-antigravity.d.ts +21 -0
  81. package/dist/auth/oauth/google-antigravity.d.ts.map +1 -0
  82. package/dist/{utils → auth}/oauth/google-antigravity.js +79 -79
  83. package/dist/auth/oauth/google-antigravity.js.map +1 -0
  84. package/dist/auth/oauth/google-gemini-cli.d.ts +21 -0
  85. package/dist/auth/oauth/google-gemini-cli.d.ts.map +1 -0
  86. package/dist/{utils → auth}/oauth/google-gemini-cli.js +79 -79
  87. package/dist/auth/oauth/google-gemini-cli.js.map +1 -0
  88. package/dist/auth/oauth/kimi-coding.d.ts +10 -0
  89. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  90. package/dist/auth/oauth/kimi-coding.js +249 -0
  91. package/dist/auth/oauth/kimi-coding.js.map +1 -0
  92. package/dist/auth/oauth/load.d.ts +33 -0
  93. package/dist/auth/oauth/load.d.ts.map +1 -0
  94. package/dist/auth/oauth/load.js +74 -0
  95. package/dist/auth/oauth/load.js.map +1 -0
  96. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  97. package/dist/auth/oauth/oauth-page.js.map +1 -0
  98. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  99. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  100. package/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  101. package/dist/auth/oauth/openai-codex.js.map +1 -0
  102. package/dist/auth/oauth/opencode-go.d.ts +14 -0
  103. package/dist/auth/oauth/opencode-go.d.ts.map +1 -0
  104. package/dist/auth/oauth/opencode-go.js +41 -0
  105. package/dist/auth/oauth/opencode-go.js.map +1 -0
  106. package/dist/auth/oauth/openrouter.d.ts +15 -0
  107. package/dist/auth/oauth/openrouter.d.ts.map +1 -0
  108. package/dist/auth/oauth/openrouter.js +277 -0
  109. package/dist/auth/oauth/openrouter.js.map +1 -0
  110. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  111. package/dist/auth/oauth/pkce.js.map +1 -0
  112. package/dist/auth/oauth/radius.d.ts +17 -0
  113. package/dist/auth/oauth/radius.d.ts.map +1 -0
  114. package/dist/auth/oauth/radius.js +318 -0
  115. package/dist/auth/oauth/radius.js.map +1 -0
  116. package/dist/auth/oauth/xai.d.ts +17 -0
  117. package/dist/auth/oauth/xai.d.ts.map +1 -0
  118. package/dist/{utils → auth}/oauth/xai.js +54 -89
  119. package/dist/auth/oauth/xai.js.map +1 -0
  120. package/dist/auth/resolve.d.ts +4 -4
  121. package/dist/auth/resolve.d.ts.map +1 -1
  122. package/dist/auth/resolve.js +38 -17
  123. package/dist/auth/resolve.js.map +1 -1
  124. package/dist/auth/types.d.ts +49 -10
  125. package/dist/auth/types.d.ts.map +1 -1
  126. package/dist/auth/types.js.map +1 -1
  127. package/dist/bun-oauth.d.ts +3 -0
  128. package/dist/bun-oauth.d.ts.map +1 -0
  129. package/dist/bun-oauth.js +27 -0
  130. package/dist/bun-oauth.js.map +1 -0
  131. package/dist/cli.js +58 -76
  132. package/dist/cli.js.map +1 -1
  133. package/dist/compat/extension-oauth-types.d.ts +39 -0
  134. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  135. package/dist/compat/extension-oauth-types.js +2 -0
  136. package/dist/compat/extension-oauth-types.js.map +1 -0
  137. package/dist/compat.d.ts +2 -0
  138. package/dist/compat.d.ts.map +1 -1
  139. package/dist/compat.js +25 -8
  140. package/dist/compat.js.map +1 -1
  141. package/dist/env-api-keys.d.ts +3 -0
  142. package/dist/env-api-keys.d.ts.map +1 -1
  143. package/dist/env-api-keys.js +12 -3
  144. package/dist/env-api-keys.js.map +1 -1
  145. package/dist/image-models.generated.d.ts +75 -0
  146. package/dist/image-models.generated.d.ts.map +1 -1
  147. package/dist/image-models.generated.js +251 -176
  148. package/dist/image-models.generated.js.map +1 -1
  149. package/dist/images-models.d.ts +4 -2
  150. package/dist/images-models.d.ts.map +1 -1
  151. package/dist/images-models.js +5 -4
  152. package/dist/images-models.js.map +1 -1
  153. package/dist/index.d.ts +6 -2
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +3 -0
  156. package/dist/index.js.map +1 -1
  157. package/dist/model-catalog.d.ts +17 -0
  158. package/dist/model-catalog.d.ts.map +1 -0
  159. package/dist/model-catalog.js +4 -0
  160. package/dist/model-catalog.js.map +1 -0
  161. package/dist/models-store.d.ts +32 -0
  162. package/dist/models-store.d.ts.map +1 -0
  163. package/dist/models-store.js +16 -0
  164. package/dist/models-store.js.map +1 -0
  165. package/dist/models.d.ts +66 -30
  166. package/dist/models.d.ts.map +1 -1
  167. package/dist/models.generated.d.ts +74 -22035
  168. package/dist/models.generated.d.ts.map +1 -1
  169. package/dist/models.generated.js +4 -0
  170. package/dist/models.generated.js.map +1 -1
  171. package/dist/models.js +213 -29
  172. package/dist/models.js.map +1 -1
  173. package/dist/oauth.d.ts +2 -1
  174. package/dist/oauth.d.ts.map +1 -1
  175. package/dist/oauth.js +1 -1
  176. package/dist/oauth.js.map +1 -1
  177. package/dist/providers/all.d.ts +13 -6
  178. package/dist/providers/all.d.ts.map +1 -1
  179. package/dist/providers/all.js +13 -0
  180. package/dist/providers/all.js.map +1 -1
  181. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  182. package/dist/providers/amazon-bedrock.js +54 -8
  183. package/dist/providers/amazon-bedrock.js.map +1 -1
  184. package/dist/providers/amazon-bedrock.models.d.ts +3 -1931
  185. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  186. package/dist/providers/amazon-bedrock.models.js +3 -1838
  187. package/dist/providers/amazon-bedrock.models.js.map +1 -1
  188. package/dist/providers/ant-ling.models.d.ts +3 -85
  189. package/dist/providers/ant-ling.models.d.ts.map +1 -1
  190. package/dist/providers/ant-ling.models.js +3 -57
  191. package/dist/providers/ant-ling.models.js.map +1 -1
  192. package/dist/providers/anthropic.d.ts.map +1 -1
  193. package/dist/providers/anthropic.js +31 -4
  194. package/dist/providers/anthropic.js.map +1 -1
  195. package/dist/providers/anthropic.models.d.ts +3 -283
  196. package/dist/providers/anthropic.models.d.ts.map +1 -1
  197. package/dist/providers/anthropic.models.js +3 -252
  198. package/dist/providers/anthropic.models.js.map +1 -1
  199. package/dist/providers/azure-openai-responses.models.d.ts +3 -886
  200. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  201. package/dist/providers/azure-openai-responses.models.js +3 -811
  202. package/dist/providers/azure-openai-responses.models.js.map +1 -1
  203. package/dist/providers/cerebras.models.d.ts +3 -65
  204. package/dist/providers/cerebras.models.d.ts.map +1 -1
  205. package/dist/providers/cerebras.models.js +3 -56
  206. package/dist/providers/cerebras.models.js.map +1 -1
  207. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  208. package/dist/providers/cloudflare-ai-gateway.js +4 -3
  209. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  210. package/dist/providers/cloudflare-ai-gateway.models.d.ts +3 -795
  211. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  212. package/dist/providers/cloudflare-ai-gateway.models.js +3 -683
  213. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  214. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  215. package/dist/providers/cloudflare-auth.js +22 -26
  216. package/dist/providers/cloudflare-auth.js.map +1 -1
  217. package/dist/providers/cloudflare-stream.d.ts +8 -0
  218. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  219. package/dist/providers/cloudflare-stream.js +21 -0
  220. package/dist/providers/cloudflare-stream.js.map +1 -0
  221. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  222. package/dist/providers/cloudflare-workers-ai.js +2 -1
  223. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  224. package/dist/providers/cloudflare-workers-ai.models.d.ts +3 -301
  225. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  226. package/dist/providers/cloudflare-workers-ai.models.js +3 -236
  227. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  228. package/dist/providers/data/.manifest.json +1 -0
  229. package/dist/providers/data/amazon-bedrock.json +1 -0
  230. package/dist/providers/data/ant-ling.json +1 -0
  231. package/dist/providers/data/anthropic.json +1 -0
  232. package/dist/providers/data/azure-openai-responses.json +1 -0
  233. package/dist/providers/data/cerebras.json +1 -0
  234. package/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  235. package/dist/providers/data/cloudflare-workers-ai.json +1 -0
  236. package/dist/providers/data/deepseek.json +1 -0
  237. package/dist/providers/data/fireworks.json +1 -0
  238. package/dist/providers/data/github-copilot.json +1 -0
  239. package/dist/providers/data/google-vertex.json +1 -0
  240. package/dist/providers/data/google.json +1 -0
  241. package/dist/providers/data/groq.json +1 -0
  242. package/dist/providers/data/huggingface.json +1 -0
  243. package/dist/providers/data/kimi-coding.json +1 -0
  244. package/dist/providers/data/minimax-cn.json +1 -0
  245. package/dist/providers/data/minimax.json +1 -0
  246. package/dist/providers/data/mistral.json +1 -0
  247. package/dist/providers/data/moonshotai-cn.json +1 -0
  248. package/dist/providers/data/moonshotai.json +1 -0
  249. package/dist/providers/data/nvidia.json +1 -0
  250. package/dist/providers/data/openai-codex.json +1 -0
  251. package/dist/providers/data/openai.json +1 -0
  252. package/dist/providers/data/opencode-go.json +1 -0
  253. package/dist/providers/data/opencode.json +1 -0
  254. package/dist/providers/data/openrouter.json +1 -0
  255. package/dist/providers/data/qwen-token-plan-cn.json +1 -0
  256. package/dist/providers/data/qwen-token-plan.json +1 -0
  257. package/dist/providers/data/together.json +1 -0
  258. package/dist/providers/data/vercel-ai-gateway.json +1 -0
  259. package/dist/providers/data/xai.json +1 -0
  260. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  261. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  262. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  263. package/dist/providers/data/xiaomi.json +1 -0
  264. package/dist/providers/data/zai-coding-cn.json +1 -0
  265. package/dist/providers/data/zai.json +1 -0
  266. package/dist/providers/deepseek.models.d.ts +3 -62
  267. package/dist/providers/deepseek.models.d.ts.map +1 -1
  268. package/dist/providers/deepseek.models.js +3 -40
  269. package/dist/providers/deepseek.models.js.map +1 -1
  270. package/dist/providers/faux.d.ts.map +1 -1
  271. package/dist/providers/faux.js +4 -1
  272. package/dist/providers/faux.js.map +1 -1
  273. package/dist/providers/fireworks.models.d.ts +3 -380
  274. package/dist/providers/fireworks.models.d.ts.map +1 -1
  275. package/dist/providers/fireworks.models.js +3 -292
  276. package/dist/providers/fireworks.models.js.map +1 -1
  277. package/dist/providers/github-copilot.d.ts.map +1 -1
  278. package/dist/providers/github-copilot.js +11 -1
  279. package/dist/providers/github-copilot.js.map +1 -1
  280. package/dist/providers/github-copilot.models.d.ts +3 -790
  281. package/dist/providers/github-copilot.models.d.ts.map +1 -1
  282. package/dist/providers/github-copilot.models.js +3 -538
  283. package/dist/providers/github-copilot.models.js.map +1 -1
  284. package/dist/providers/google-vertex.d.ts.map +1 -1
  285. package/dist/providers/google-vertex.js +56 -5
  286. package/dist/providers/google-vertex.js.map +1 -1
  287. package/dist/providers/google-vertex.models.d.ts +3 -201
  288. package/dist/providers/google-vertex.models.d.ts.map +1 -1
  289. package/dist/providers/google-vertex.models.js +3 -179
  290. package/dist/providers/google-vertex.models.js.map +1 -1
  291. package/dist/providers/google.models.d.ts +3 -327
  292. package/dist/providers/google.models.d.ts.map +1 -1
  293. package/dist/providers/google.models.js +3 -285
  294. package/dist/providers/google.models.js.map +1 -1
  295. package/dist/providers/groq.models.d.ts +3 -127
  296. package/dist/providers/groq.models.d.ts.map +1 -1
  297. package/dist/providers/groq.models.js +3 -122
  298. package/dist/providers/groq.models.js.map +1 -1
  299. package/dist/providers/huggingface.models.d.ts +3 -982
  300. package/dist/providers/huggingface.models.d.ts.map +1 -1
  301. package/dist/providers/huggingface.models.js +3 -884
  302. package/dist/providers/huggingface.models.js.map +1 -1
  303. package/dist/providers/kimi-coding.d.ts.map +1 -1
  304. package/dist/providers/kimi-coding.js +10 -2
  305. package/dist/providers/kimi-coding.js.map +1 -1
  306. package/dist/providers/kimi-coding.models.d.ts +3 -62
  307. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  308. package/dist/providers/kimi-coding.models.js +3 -56
  309. package/dist/providers/kimi-coding.models.js.map +1 -1
  310. package/dist/providers/minimax-cn.models.d.ts +3 -53
  311. package/dist/providers/minimax-cn.models.d.ts.map +1 -1
  312. package/dist/providers/minimax-cn.models.js +3 -53
  313. package/dist/providers/minimax-cn.models.js.map +1 -1
  314. package/dist/providers/minimax.models.d.ts +3 -53
  315. package/dist/providers/minimax.models.d.ts.map +1 -1
  316. package/dist/providers/minimax.models.js +3 -53
  317. package/dist/providers/minimax.models.js.map +1 -1
  318. package/dist/providers/mistral.models.d.ts +3 -512
  319. package/dist/providers/mistral.models.d.ts.map +1 -1
  320. package/dist/providers/mistral.models.js +3 -512
  321. package/dist/providers/mistral.models.js.map +1 -1
  322. package/dist/providers/moonshotai-cn.models.d.ts +3 -233
  323. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  324. package/dist/providers/moonshotai-cn.models.js +3 -166
  325. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  326. package/dist/providers/moonshotai.models.d.ts +3 -233
  327. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  328. package/dist/providers/moonshotai.models.js +3 -166
  329. package/dist/providers/moonshotai.models.js.map +1 -1
  330. package/dist/providers/nvidia.models.d.ts +3 -562
  331. package/dist/providers/nvidia.models.d.ts.map +1 -1
  332. package/dist/providers/nvidia.models.js +3 -382
  333. package/dist/providers/nvidia.models.js.map +1 -1
  334. package/dist/providers/openai-codex.d.ts.map +1 -1
  335. package/dist/providers/openai-codex.js +1 -1
  336. package/dist/providers/openai-codex.js.map +1 -1
  337. package/dist/providers/openai-codex.models.d.ts +3 -187
  338. package/dist/providers/openai-codex.models.d.ts.map +1 -1
  339. package/dist/providers/openai-codex.models.js +3 -133
  340. package/dist/providers/openai-codex.models.js.map +1 -1
  341. package/dist/providers/openai.models.d.ts +3 -936
  342. package/dist/providers/openai.models.d.ts.map +1 -1
  343. package/dist/providers/openai.models.js +3 -818
  344. package/dist/providers/openai.models.js.map +1 -1
  345. package/dist/providers/opencode-go.d.ts +1 -1
  346. package/dist/providers/opencode-go.d.ts.map +1 -1
  347. package/dist/providers/opencode-go.js +15 -3
  348. package/dist/providers/opencode-go.js.map +1 -1
  349. package/dist/providers/opencode-go.models.d.ts +3 -308
  350. package/dist/providers/opencode-go.models.d.ts.map +1 -1
  351. package/dist/providers/opencode-go.models.js +3 -237
  352. package/dist/providers/opencode-go.models.js.map +1 -1
  353. package/dist/providers/opencode.models.d.ts +3 -1183
  354. package/dist/providers/opencode.models.d.ts.map +1 -1
  355. package/dist/providers/opencode.models.js +3 -977
  356. package/dist/providers/opencode.models.js.map +1 -1
  357. package/dist/providers/openrouter-images.d.ts.map +1 -1
  358. package/dist/providers/openrouter-images.js +10 -2
  359. package/dist/providers/openrouter-images.js.map +1 -1
  360. package/dist/providers/openrouter.d.ts.map +1 -1
  361. package/dist/providers/openrouter.js +10 -2
  362. package/dist/providers/openrouter.js.map +1 -1
  363. package/dist/providers/openrouter.models.d.ts +3 -5705
  364. package/dist/providers/openrouter.models.d.ts.map +1 -1
  365. package/dist/providers/openrouter.models.js +3 -4873
  366. package/dist/providers/openrouter.models.js.map +1 -1
  367. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  368. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  369. package/dist/providers/qwen-token-plan-cn.js +15 -0
  370. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  371. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  372. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  373. package/dist/providers/qwen-token-plan-cn.models.js +6 -0
  374. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  375. package/dist/providers/qwen-token-plan.d.ts +3 -0
  376. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  377. package/dist/providers/qwen-token-plan.js +15 -0
  378. package/dist/providers/qwen-token-plan.js.map +1 -0
  379. package/dist/providers/qwen-token-plan.models.d.ts +4 -0
  380. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  381. package/dist/providers/qwen-token-plan.models.js +6 -0
  382. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  383. package/dist/providers/radius-config.d.ts +26 -0
  384. package/dist/providers/radius-config.d.ts.map +1 -0
  385. package/dist/providers/radius-config.js +63 -0
  386. package/dist/providers/radius-config.js.map +1 -0
  387. package/dist/providers/radius.d.ts +9 -0
  388. package/dist/providers/radius.d.ts.map +1 -0
  389. package/dist/providers/radius.js +54 -0
  390. package/dist/providers/radius.js.map +1 -0
  391. package/dist/providers/together.models.d.ts +3 -597
  392. package/dist/providers/together.models.d.ts.map +1 -1
  393. package/dist/providers/together.models.js +3 -377
  394. package/dist/providers/together.models.js.map +1 -1
  395. package/dist/providers/vercel-ai-gateway.models.d.ts +3 -3391
  396. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  397. package/dist/providers/vercel-ai-gateway.models.js +3 -3327
  398. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  399. package/dist/providers/xai.d.ts +1 -1
  400. package/dist/providers/xai.d.ts.map +1 -1
  401. package/dist/providers/xai.js +8 -4
  402. package/dist/providers/xai.js.map +1 -1
  403. package/dist/providers/xai.models.d.ts +3 -178
  404. package/dist/providers/xai.models.d.ts.map +1 -1
  405. package/dist/providers/xai.models.js +3 -146
  406. package/dist/providers/xai.models.js.map +1 -1
  407. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +3 -65
  408. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  409. package/dist/providers/xiaomi-token-plan-ams.models.js +3 -56
  410. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  411. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +3 -65
  412. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  413. package/dist/providers/xiaomi-token-plan-cn.models.js +3 -56
  414. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  415. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +3 -65
  416. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  417. package/dist/providers/xiaomi-token-plan-sgp.models.js +3 -56
  418. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  419. package/dist/providers/xiaomi.models.d.ts +3 -128
  420. package/dist/providers/xiaomi.models.d.ts.map +1 -1
  421. package/dist/providers/xiaomi.models.js +3 -110
  422. package/dist/providers/xiaomi.models.js.map +1 -1
  423. package/dist/providers/zai-coding-cn.models.d.ts +3 -152
  424. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  425. package/dist/providers/zai-coding-cn.models.js +3 -111
  426. package/dist/providers/zai-coding-cn.models.js.map +1 -1
  427. package/dist/providers/zai.models.d.ts +3 -152
  428. package/dist/providers/zai.models.d.ts.map +1 -1
  429. package/dist/providers/zai.models.js +3 -111
  430. package/dist/providers/zai.models.js.map +1 -1
  431. package/dist/types.d.ts +77 -8
  432. package/dist/types.d.ts.map +1 -1
  433. package/dist/types.js.map +1 -1
  434. package/dist/utils/deferred-tools.d.ts +9 -0
  435. package/dist/utils/deferred-tools.d.ts.map +1 -0
  436. package/dist/utils/deferred-tools.js +36 -0
  437. package/dist/utils/deferred-tools.js.map +1 -0
  438. package/dist/utils/error-body.d.ts.map +1 -1
  439. package/dist/utils/error-body.js +31 -7
  440. package/dist/utils/error-body.js.map +1 -1
  441. package/dist/utils/estimate.d.ts.map +1 -1
  442. package/dist/utils/estimate.js +18 -5
  443. package/dist/utils/estimate.js.map +1 -1
  444. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  445. package/dist/utils/node-http-proxy.js +53 -12
  446. package/dist/utils/node-http-proxy.js.map +1 -1
  447. package/dist/utils/overflow.d.ts +1 -0
  448. package/dist/utils/overflow.d.ts.map +1 -1
  449. package/dist/utils/overflow.js +3 -0
  450. package/dist/utils/overflow.js.map +1 -1
  451. package/dist/utils/pi-user-agent.d.ts +2 -0
  452. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  453. package/dist/utils/pi-user-agent.js +12 -0
  454. package/dist/utils/pi-user-agent.js.map +1 -0
  455. package/dist/utils/provider-retry.d.ts +16 -0
  456. package/dist/utils/provider-retry.d.ts.map +1 -0
  457. package/dist/utils/provider-retry.js +94 -0
  458. package/dist/utils/provider-retry.js.map +1 -0
  459. package/dist/utils/retry.d.ts +41 -0
  460. package/dist/utils/retry.d.ts.map +1 -1
  461. package/dist/utils/retry.js +84 -0
  462. package/dist/utils/retry.js.map +1 -1
  463. package/dist/utils/sleep.d.ts +2 -0
  464. package/dist/utils/sleep.d.ts.map +1 -0
  465. package/dist/utils/sleep.js +15 -0
  466. package/dist/utils/sleep.js.map +1 -0
  467. package/dist/utils/text.d.ts +6 -0
  468. package/dist/utils/text.d.ts.map +1 -0
  469. package/dist/utils/text.js +10 -0
  470. package/dist/utils/text.js.map +1 -0
  471. package/dist/utils/uuid.d.ts +3 -0
  472. package/dist/utils/uuid.d.ts.map +1 -0
  473. package/dist/utils/uuid.js +47 -0
  474. package/dist/utils/uuid.js.map +1 -0
  475. package/dist/utils/validation.d.ts.map +1 -1
  476. package/dist/utils/validation.js +6 -0
  477. package/dist/utils/validation.js.map +1 -1
  478. package/package.json +12 -6
  479. package/dist/utils/oauth/anthropic.d.ts +0 -27
  480. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  481. package/dist/utils/oauth/anthropic.js.map +0 -1
  482. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  483. package/dist/utils/oauth/device-code.js.map +0 -1
  484. package/dist/utils/oauth/github-copilot.d.ts +0 -32
  485. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  486. package/dist/utils/oauth/github-copilot.js.map +0 -1
  487. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  488. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  489. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  490. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  491. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  492. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  493. package/dist/utils/oauth/index.d.ts +0 -60
  494. package/dist/utils/oauth/index.d.ts.map +0 -1
  495. package/dist/utils/oauth/index.js +0 -130
  496. package/dist/utils/oauth/index.js.map +0 -1
  497. package/dist/utils/oauth/load.d.ts +0 -6
  498. package/dist/utils/oauth/load.d.ts.map +0 -1
  499. package/dist/utils/oauth/load.js +0 -23
  500. package/dist/utils/oauth/load.js.map +0 -1
  501. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  502. package/dist/utils/oauth/oauth-page.js.map +0 -1
  503. package/dist/utils/oauth/openai-codex.d.ts +0 -45
  504. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  505. package/dist/utils/oauth/openai-codex.js.map +0 -1
  506. package/dist/utils/oauth/opencode-go.d.ts +0 -23
  507. package/dist/utils/oauth/opencode-go.d.ts.map +0 -1
  508. package/dist/utils/oauth/opencode-go.js +0 -46
  509. package/dist/utils/oauth/opencode-go.js.map +0 -1
  510. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  511. package/dist/utils/oauth/pkce.js.map +0 -1
  512. package/dist/utils/oauth/types.d.ts +0 -64
  513. package/dist/utils/oauth/types.d.ts.map +0 -1
  514. package/dist/utils/oauth/types.js +0 -2
  515. package/dist/utils/oauth/types.js.map +0 -1
  516. package/dist/utils/oauth/xai.d.ts +0 -34
  517. package/dist/utils/oauth/xai.d.ts.map +0 -1
  518. package/dist/utils/oauth/xai.js.map +0 -1
  519. /package/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  520. /package/dist/{utils → auth}/oauth/device-code.js +0 -0
  521. /package/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  522. /package/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  523. /package/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  524. /package/dist/{utils → auth}/oauth/pkce.js +0 -0
@@ -208,6 +208,7 @@ export async function refreshAntigravityToken(refreshToken, projectId) {
208
208
  }
209
209
  const data = (await response.json());
210
210
  return {
211
+ type: "oauth",
211
212
  refresh: data.refresh_token || refreshToken,
212
213
  access: data.access_token,
213
214
  expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
@@ -215,18 +216,20 @@ export async function refreshAntigravityToken(refreshToken, projectId) {
215
216
  };
216
217
  }
217
218
  /**
218
- * Login with Antigravity OAuth
219
+ * Login with Antigravity OAuth.
219
220
  *
220
- * @param onAuth - Callback with URL and optional instructions
221
- * @param onProgress - Optional progress callback
222
- * @param onManualCodeInput - Optional promise that resolves with user-pasted redirect URL.
223
- * Races with browser callback - whichever completes first wins.
221
+ * The pasted-redirect-URL prompt races the local browser callback — whichever
222
+ * completes first wins.
224
223
  */
225
- export async function loginAntigravity(onAuth, onProgress, onManualCodeInput) {
224
+ export async function loginAntigravity(interaction) {
225
+ const onProgress = (message) => interaction.notify({ type: "progress", message });
226
226
  const { verifier, challenge } = await generatePKCE();
227
227
  // Start local server for callback
228
- onProgress?.("Starting local server for OAuth callback...");
228
+ onProgress("Starting local server for OAuth callback...");
229
229
  const server = await startCallbackServer();
230
+ // The manual_code prompt races the callback server; abort it once the flow
231
+ // settles so the UI can dismiss the pending input.
232
+ const manualAbort = new AbortController();
230
233
  let code;
231
234
  try {
232
235
  // Build authorization URL
@@ -243,75 +246,69 @@ export async function loginAntigravity(onAuth, onProgress, onManualCodeInput) {
243
246
  });
244
247
  const authUrl = `${AUTH_URL}?${authParams.toString()}`;
245
248
  // Notify caller with URL to open
246
- onAuth({
249
+ interaction.notify({
250
+ type: "auth_url",
247
251
  url: authUrl,
248
- instructions: "Complete the sign-in in your browser.",
252
+ instructions: "Complete the sign-in in your browser. If the browser is on another machine, paste the final redirect URL here.",
249
253
  });
250
- // Wait for the callback, racing with manual input if provided
251
- onProgress?.("Waiting for OAuth callback...");
252
- if (onManualCodeInput) {
253
- // Race between browser callback and manual input
254
- let manualInput;
255
- let manualError;
256
- const manualPromise = onManualCodeInput()
257
- .then((input) => {
258
- manualInput = input;
259
- server.cancelWait();
260
- })
261
- .catch((err) => {
262
- manualError = err instanceof Error ? err : new Error(String(err));
263
- server.cancelWait();
264
- });
265
- const result = await server.waitForCode();
266
- // If manual input was cancelled, throw that error
254
+ // Wait for the callback, racing with manual input
255
+ onProgress("Waiting for OAuth callback...");
256
+ let manualInput;
257
+ let manualError;
258
+ const manualPromise = interaction
259
+ .prompt({
260
+ type: "manual_code",
261
+ message: "Complete login in your browser, or paste the redirect URL here:",
262
+ placeholder: REDIRECT_URI,
263
+ signal: manualAbort.signal,
264
+ })
265
+ .then((input) => {
266
+ manualInput = input;
267
+ server.cancelWait();
268
+ })
269
+ .catch((err) => {
270
+ manualError = err instanceof Error ? err : new Error(String(err));
271
+ server.cancelWait();
272
+ });
273
+ const result = await server.waitForCode();
274
+ // If manual input was cancelled, throw that error
275
+ if (manualError) {
276
+ throw manualError;
277
+ }
278
+ if (result?.code) {
279
+ // Browser callback won - verify state
280
+ if (result.state !== verifier) {
281
+ throw new Error("OAuth state mismatch - possible CSRF attack");
282
+ }
283
+ code = result.code;
284
+ }
285
+ else if (manualInput) {
286
+ // Manual input won
287
+ const parsed = parseRedirectUrl(manualInput);
288
+ if (parsed.state && parsed.state !== verifier) {
289
+ throw new Error("OAuth state mismatch - possible CSRF attack");
290
+ }
291
+ code = parsed.code;
292
+ }
293
+ // If still no code, wait for manual promise and try that
294
+ if (!code) {
295
+ await manualPromise;
267
296
  if (manualError) {
268
297
  throw manualError;
269
298
  }
270
- if (result?.code) {
271
- // Browser callback won - verify state
272
- if (result.state !== verifier) {
273
- throw new Error("OAuth state mismatch - possible CSRF attack");
274
- }
275
- code = result.code;
276
- }
277
- else if (manualInput) {
278
- // Manual input won
299
+ if (manualInput) {
279
300
  const parsed = parseRedirectUrl(manualInput);
280
301
  if (parsed.state && parsed.state !== verifier) {
281
302
  throw new Error("OAuth state mismatch - possible CSRF attack");
282
303
  }
283
304
  code = parsed.code;
284
305
  }
285
- // If still no code, wait for manual promise and try that
286
- if (!code) {
287
- await manualPromise;
288
- if (manualError) {
289
- throw manualError;
290
- }
291
- if (manualInput) {
292
- const parsed = parseRedirectUrl(manualInput);
293
- if (parsed.state && parsed.state !== verifier) {
294
- throw new Error("OAuth state mismatch - possible CSRF attack");
295
- }
296
- code = parsed.code;
297
- }
298
- }
299
- }
300
- else {
301
- // Original flow: just wait for callback
302
- const result = await server.waitForCode();
303
- if (result?.code) {
304
- if (result.state !== verifier) {
305
- throw new Error("OAuth state mismatch - possible CSRF attack");
306
- }
307
- code = result.code;
308
- }
309
306
  }
310
307
  if (!code) {
311
308
  throw new Error("No authorization code received");
312
309
  }
313
310
  // Exchange code for tokens
314
- onProgress?.("Exchanging authorization code for tokens...");
311
+ onProgress("Exchanging authorization code for tokens...");
315
312
  const tokenResponse = await fetch(TOKEN_URL, {
316
313
  method: "POST",
317
314
  headers: {
@@ -335,42 +332,45 @@ export async function loginAntigravity(onAuth, onProgress, onManualCodeInput) {
335
332
  throw new Error("No refresh token received. Please try again.");
336
333
  }
337
334
  // Get user email
338
- onProgress?.("Getting user info...");
335
+ onProgress("Getting user info...");
339
336
  const email = await getUserEmail(tokenData.access_token);
340
337
  // Discover project
341
338
  const projectId = await discoverProject(tokenData.access_token, onProgress);
342
339
  // Calculate expiry time (current time + expires_in seconds - 5 min buffer)
343
340
  const expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;
344
- const credentials = {
341
+ const credential = {
342
+ type: "oauth",
345
343
  refresh: tokenData.refresh_token,
346
344
  access: tokenData.access_token,
347
345
  expires: expiresAt,
348
346
  projectId,
349
347
  email,
350
348
  };
351
- return credentials;
349
+ return credential;
352
350
  }
353
351
  finally {
352
+ manualAbort.abort();
354
353
  server.server.close();
355
354
  }
356
355
  }
357
- export const antigravityOAuthProvider = {
358
- id: "google-antigravity",
356
+ function antigravityProjectId(credential) {
357
+ const projectId = credential.projectId;
358
+ if (typeof projectId !== "string" || !projectId) {
359
+ throw new Error("Antigravity credentials missing projectId");
360
+ }
361
+ return projectId;
362
+ }
363
+ export const antigravityOAuth = {
359
364
  name: "Antigravity (Gemini 3, Claude, GPT-OSS)",
360
- usesCallbackServer: true,
361
- async login(callbacks) {
362
- return loginAntigravity(callbacks.onAuth, callbacks.onProgress, callbacks.onManualCodeInput);
363
- },
364
- async refreshToken(credentials) {
365
- const creds = credentials;
366
- if (!creds.projectId) {
367
- throw new Error("Antigravity credentials missing projectId");
368
- }
369
- return refreshAntigravityToken(creds.refresh, creds.projectId);
370
- },
371
- getApiKey(credentials) {
372
- const creds = credentials;
373
- return JSON.stringify({ token: creds.access, projectId: creds.projectId });
365
+ loginLabel: "Sign in with Google (Antigravity)",
366
+ login: loginAntigravity,
367
+ refresh: (credential) => refreshAntigravityToken(credential.refresh, antigravityProjectId(credential)),
368
+ /**
369
+ * Antigravity requests need both the access token and the discovered project
370
+ * id, so the credential is handed to callers as a JSON blob in `apiKey`.
371
+ */
372
+ async toAuth(credential) {
373
+ return { apiKey: JSON.stringify({ token: credential.access, projectId: antigravityProjectId(credential) }) };
374
374
  },
375
375
  };
376
376
  //# sourceMappingURL=google-antigravity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-antigravity.js","sourceRoot":"","sources":["../../../src/auth/oauth/google-antigravity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,IAAI,aAAa,GAAmD,IAAI,CAAC;AACzE,IAAI,kBAAkB,GAAyB,IAAI,CAAC;AACpD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;IACzF,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACnD,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC;IAChC,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,SAAS,GAAG,MAAM,CACvB,sGAAsG,CACtG,CAAC;AACF,MAAM,aAAa,GAAG,MAAM,CAAC,kDAAkD,CAAC,CAAC;AACjF,MAAM,YAAY,GAAG,uCAAuC,CAAC;AAE7D,yCAAyC;AACzC,MAAM,MAAM,GAAG;IACd,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;IAClD,uCAAuC;IACvC,uDAAuD;CACvD,CAAC;AAEF,MAAM,QAAQ,GAAG,8CAA8C,CAAC;AAChE,MAAM,SAAS,GAAG,qCAAqC,CAAC;AAExD,2CAA2C;AAC3C,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAQ/C;;GAEG;AACH,KAAK,UAAU,mBAAmB;IACjC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,kBAAkB,EAAE,CAAC;QACxB,MAAM,kBAAkB,CAAC;IAC1B,CAAC;IACD,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,mBAAmB;IACjC,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,IAAI,UAAiF,CAAC;QACtF,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAyC,CAAC,WAAW,EAAE,EAAE;YAC9F,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,UAAU,GAAG,CAAC,KAAK,EAAE,EAAE;gBACtB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,WAAW,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAE7D,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAE5C,IAAI,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,yCAAyC,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC;oBACtF,OAAO;gBACR,CAAC;gBAED,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;oBACnB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,6DAA6D,CAAC,CAAC,CAAC;oBACzF,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACtD,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE;YACtC,OAAO,CAAC;gBACP,MAAM;gBACN,UAAU,EAAE,GAAG,EAAE;oBAChB,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBACD,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB;aACrC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO;YACN,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;YAC/C,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS;SACjD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,0BAA0B;QAC1B,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAQD;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,WAAmB,EAAE,UAAsC;IACzF,MAAM,OAAO,GAAG;QACf,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,iCAAiC;QAC/C,mBAAmB,EAAE,8CAA8C;QACnE,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,sBAAsB;YAChC,UAAU,EAAE,QAAQ;SACpB,CAAC;KACF,CAAC;IAEF,mDAAmD;IACnD,MAAM,SAAS,GAAG,CAAC,qCAAqC,EAAE,mDAAmD,CAAC,CAAC;IAE/G,UAAU,EAAE,CAAC,kCAAkC,CAAC,CAAC;IAEjD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,4BAA4B,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,QAAQ,EAAE;wBACT,OAAO,EAAE,iBAAiB;wBAC1B,QAAQ,EAAE,sBAAsB;wBAChC,UAAU,EAAE,QAAQ;qBACpB;iBACD,CAAC;aACF,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAA0B,CAAC;gBAElE,wCAAwC;gBACxC,IAAI,OAAO,IAAI,CAAC,uBAAuB,KAAK,QAAQ,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACtF,OAAO,IAAI,CAAC,uBAAuB,CAAC;gBACrC,CAAC;gBACD,IACC,IAAI,CAAC,uBAAuB;oBAC5B,OAAO,IAAI,CAAC,uBAAuB,KAAK,QAAQ;oBAChD,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAC9B,CAAC;oBACF,OAAO,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACxC,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,oBAAoB;QACrB,CAAC;IACF,CAAC;IAED,0BAA0B;IAC1B,UAAU,EAAE,CAAC,0BAA0B,CAAC,CAAC;IACzC,OAAO,kBAAkB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,WAAmB;IAC9C,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,wDAAwD,EAAE;YACtF,OAAO,EAAE;gBACR,aAAa,EAAE,UAAU,WAAW,EAAE;aACtC;SACD,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;YAC3D,OAAO,IAAI,CAAC,KAAK,CAAC;QACnB,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,mCAAmC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,YAAoB,EAAE,SAAiB;IACpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QACvC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC;YACzB,SAAS,EAAE,SAAS;YACpB,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,eAAe;SAC3B,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAIlC,CAAC;IAEF,OAAO;QACN,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI,CAAC,aAAa,IAAI,YAAY;QAC3C,MAAM,EAAE,IAAI,CAAC,YAAY;QACzB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;QAC5D,SAAS;KACT,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAA4B;IAClE,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1F,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAErD,kCAAkC;IAClC,UAAU,CAAC,6CAA6C,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC3C,2EAA2E;IAC3E,mDAAmD;IACnD,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAE1C,IAAI,IAAwB,CAAC;IAE7B,IAAI,CAAC;QACJ,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC;YACtC,SAAS,EAAE,SAAS;YACpB,aAAa,EAAE,MAAM;YACrB,YAAY,EAAE,YAAY;YAC1B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,cAAc,EAAE,SAAS;YACzB,qBAAqB,EAAE,MAAM;YAC7B,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEvD,iCAAiC;QACjC,WAAW,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,OAAO;YACZ,YAAY,EACX,gHAAgH;SACjH,CAAC,CAAC;QAEH,kDAAkD;QAClD,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAE5C,IAAI,WAA+B,CAAC;QACpC,IAAI,WAA8B,CAAC;QACnC,MAAM,aAAa,GAAG,WAAW;aAC/B,MAAM,CAAC;YACP,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,iEAAiE;YAC1E,WAAW,EAAE,YAAY;YACzB,MAAM,EAAE,WAAW,CAAC,MAAM;SAC1B,CAAC;aACD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,WAAW,GAAG,KAAK,CAAC;YACpB,MAAM,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,WAAW,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,MAAM,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1C,kDAAkD;QAClD,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;YAClB,sCAAsC;YACtC,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACxB,mBAAmB;YACnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,aAAa,CAAC;YACpB,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,WAAW,CAAC;YACnB,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC7C,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACpB,CAAC;QACF,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACnD,CAAC;QAED,2BAA2B;QAC3B,UAAU,CAAC,6CAA6C,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,mCAAmC;aACnD;YACD,IAAI,EAAE,IAAI,eAAe,CAAC;gBACzB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,aAAa;gBAC5B,IAAI;gBACJ,UAAU,EAAE,oBAAoB;gBAChC,YAAY,EAAE,YAAY;gBAC1B,aAAa,EAAE,QAAQ;aACvB,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAI5C,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACjE,CAAC;QAED,iBAAiB;QACjB,UAAU,CAAC,sBAAsB,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEzD,mBAAmB;QACnB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAE5E,2EAA2E;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAE3E,MAAM,UAAU,GAAoB;YACnC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,SAAS,CAAC,aAAa;YAChC,MAAM,EAAE,SAAS,CAAC,YAAY;YAC9B,OAAO,EAAE,SAAS;YAClB,SAAS;YACT,KAAK;SACL,CAAC;QAEF,OAAO,UAAU,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB,CAAC,UAA2B;IACxD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAc;IAC1C,IAAI,EAAE,yCAAyC;IAC/C,UAAU,EAAE,mCAAmC;IAC/C,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEtG;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,UAAU;QACtB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9G,CAAC;CACD,CAAC","sourcesContent":["/**\n * Antigravity OAuth flow (Gemini 3, Claude, GPT-OSS via Google Cloud)\n * Uses different OAuth credentials than google-gemini-cli for access to additional models.\n *\n * NOTE: This module uses Node.js http.createServer for the OAuth callback.\n * It is only intended for CLI use, not browser environments.\n */\n\nimport type { Server } from \"node:http\";\nimport type { AuthInteraction, OAuthAuth, OAuthCredential } from \"../types.ts\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.ts\";\nimport { generatePKCE } from \"./pkce.ts\";\n\nlet _createServer: typeof import(\"node:http\").createServer | null = null;\nlet _httpImportPromise: Promise<void> | null = null;\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\t_httpImportPromise = import(\"node:http\").then((m) => {\n\t\t_createServer = m.createServer;\n\t});\n}\n\n// Antigravity OAuth credentials (different from Gemini CLI)\nconst decode = (s: string) => atob(s);\nconst CLIENT_ID = decode(\n\t\"MTA3MTAwNjA2MDU5MS10bWhzc2luMmgyMWxjcmUyMzV2dG9sb2poNGc0MDNlcC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbQ==\",\n);\nconst CLIENT_SECRET = decode(\"R09DU1BYLUs1OEZXUjQ4NkxkTEoxbUxCOHNYQzR6NnFEQWY=\");\nconst REDIRECT_URI = \"http://localhost:51121/oauth-callback\";\n\n// Antigravity requires additional scopes\nconst SCOPES = [\n\t\"https://www.googleapis.com/auth/cloud-platform\",\n\t\"https://www.googleapis.com/auth/userinfo.email\",\n\t\"https://www.googleapis.com/auth/userinfo.profile\",\n\t\"https://www.googleapis.com/auth/cclog\",\n\t\"https://www.googleapis.com/auth/experimentsandconfigs\",\n];\n\nconst AUTH_URL = \"https://accounts.google.com/o/oauth2/v2/auth\";\nconst TOKEN_URL = \"https://oauth2.googleapis.com/token\";\n\n// Fallback project ID when discovery fails\nconst DEFAULT_PROJECT_ID = \"rising-fact-p41fc\";\n\ntype CallbackServerInfo = {\n\tserver: Server;\n\tcancelWait: () => void;\n\twaitForCode: () => Promise<{ code: string; state: string } | null>;\n};\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nasync function getNodeCreateServer(): Promise<typeof import(\"node:http\").createServer> {\n\tif (_createServer) return _createServer;\n\tif (_httpImportPromise) {\n\t\tawait _httpImportPromise;\n\t}\n\tif (_createServer) return _createServer;\n\tthrow new Error(\"Antigravity OAuth is only available in Node.js environments\");\n}\n\nasync function startCallbackServer(): Promise<CallbackServerInfo> {\n\tconst createServer = await getNodeCreateServer();\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\tconst url = new URL(req.url || \"\", `http://localhost:51121`);\n\n\t\t\tif (url.pathname === \"/oauth-callback\") {\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(\"Google 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(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthSuccessHtml(\"Google authentication completed. You can close this window.\"));\n\t\t\t\t\tsettleWait?.({ code, state });\n\t\t\t\t} else {\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}\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\tres.end(oauthErrorHtml(\"Callback route not found.\"));\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(51121, \"127.0.0.1\", () => {\n\t\t\tresolve({\n\t\t\t\tserver,\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\n/**\n * Parse redirect URL to extract code and state\n */\nfunction parseRedirectUrl(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, return empty\n\t\treturn {};\n\t}\n}\n\ninterface LoadCodeAssistPayload {\n\tcloudaicompanionProject?: string | { id?: string };\n\tcurrentTier?: { id?: string };\n\tallowedTiers?: Array<{ id?: string; isDefault?: boolean }>;\n}\n\n/**\n * Discover or provision a project for the user\n */\nasync function discoverProject(accessToken: string, onProgress?: (message: string) => void): Promise<string> {\n\tconst headers = {\n\t\tAuthorization: `Bearer ${accessToken}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"User-Agent\": \"google-api-nodejs-client/9.15.1\",\n\t\t\"X-Goog-Api-Client\": \"google-cloud-sdk vscode_cloudshelleditor/0.1\",\n\t\t\"Client-Metadata\": JSON.stringify({\n\t\t\tideType: \"IDE_UNSPECIFIED\",\n\t\t\tplatform: \"PLATFORM_UNSPECIFIED\",\n\t\t\tpluginType: \"GEMINI\",\n\t\t}),\n\t};\n\n\t// Try endpoints in order: prod first, then sandbox\n\tconst endpoints = [\"https://cloudcode-pa.googleapis.com\", \"https://daily-cloudcode-pa.sandbox.googleapis.com\"];\n\n\tonProgress?.(\"Checking for existing project...\");\n\n\tfor (const endpoint of endpoints) {\n\t\ttry {\n\t\t\tconst loadResponse = await fetch(`${endpoint}/v1internal:loadCodeAssist`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders,\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tideType: \"IDE_UNSPECIFIED\",\n\t\t\t\t\t\tplatform: \"PLATFORM_UNSPECIFIED\",\n\t\t\t\t\t\tpluginType: \"GEMINI\",\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tif (loadResponse.ok) {\n\t\t\t\tconst data = (await loadResponse.json()) as LoadCodeAssistPayload;\n\n\t\t\t\t// Handle both string and object formats\n\t\t\t\tif (typeof data.cloudaicompanionProject === \"string\" && data.cloudaicompanionProject) {\n\t\t\t\t\treturn data.cloudaicompanionProject;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tdata.cloudaicompanionProject &&\n\t\t\t\t\ttypeof data.cloudaicompanionProject === \"object\" &&\n\t\t\t\t\tdata.cloudaicompanionProject.id\n\t\t\t\t) {\n\t\t\t\t\treturn data.cloudaicompanionProject.id;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Try next endpoint\n\t\t}\n\t}\n\n\t// Use fallback project ID\n\tonProgress?.(\"Using default project...\");\n\treturn DEFAULT_PROJECT_ID;\n}\n\n/**\n * Get user email from the access token\n */\nasync function getUserEmail(accessToken: string): Promise<string | undefined> {\n\ttry {\n\t\tconst response = await fetch(\"https://www.googleapis.com/oauth2/v1/userinfo?alt=json\", {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${accessToken}`,\n\t\t\t},\n\t\t});\n\n\t\tif (response.ok) {\n\t\t\tconst data = (await response.json()) as { email?: string };\n\t\t\treturn data.email;\n\t\t}\n\t} catch {\n\t\t// Ignore errors, email is optional\n\t}\n\treturn undefined;\n}\n\n/**\n * Refresh Antigravity token\n */\nexport async function refreshAntigravityToken(refreshToken: string, projectId: string): Promise<OAuthCredential> {\n\tconst response = await fetch(TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams({\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tclient_secret: CLIENT_SECRET,\n\t\t\trefresh_token: refreshToken,\n\t\t\tgrant_type: \"refresh_token\",\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.text();\n\t\tthrow new Error(`Antigravity token refresh failed: ${error}`);\n\t}\n\n\tconst data = (await response.json()) as {\n\t\taccess_token: string;\n\t\texpires_in: number;\n\t\trefresh_token?: string;\n\t};\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\trefresh: data.refresh_token || refreshToken,\n\t\taccess: data.access_token,\n\t\texpires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,\n\t\tprojectId,\n\t};\n}\n\n/**\n * Login with Antigravity OAuth.\n *\n * The pasted-redirect-URL prompt races the local browser callback — whichever\n * completes first wins.\n */\nexport async function loginAntigravity(interaction: AuthInteraction): Promise<OAuthCredential> {\n\tconst onProgress = (message: string) => interaction.notify({ type: \"progress\", message });\n\tconst { verifier, challenge } = await generatePKCE();\n\n\t// Start local server for callback\n\tonProgress(\"Starting local server for OAuth callback...\");\n\tconst server = await startCallbackServer();\n\t// The manual_code prompt races the callback server; abort it once the flow\n\t// settles so the UI can dismiss the pending input.\n\tconst manualAbort = new AbortController();\n\n\tlet code: string | undefined;\n\n\ttry {\n\t\t// Build authorization URL\n\t\tconst authParams = new URLSearchParams({\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.join(\" \"),\n\t\t\tcode_challenge: challenge,\n\t\t\tcode_challenge_method: \"S256\",\n\t\t\tstate: verifier,\n\t\t\taccess_type: \"offline\",\n\t\t\tprompt: \"consent\",\n\t\t});\n\n\t\tconst authUrl = `${AUTH_URL}?${authParams.toString()}`;\n\n\t\t// Notify caller with URL to open\n\t\tinteraction.notify({\n\t\t\ttype: \"auth_url\",\n\t\t\turl: authUrl,\n\t\t\tinstructions:\n\t\t\t\t\"Complete the sign-in in your browser. If the browser is on another machine, paste the final redirect URL here.\",\n\t\t});\n\n\t\t// Wait for the callback, racing with manual input\n\t\tonProgress(\"Waiting for OAuth callback...\");\n\n\t\tlet manualInput: string | undefined;\n\t\tlet manualError: Error | undefined;\n\t\tconst manualPromise = interaction\n\t\t\t.prompt({\n\t\t\t\ttype: \"manual_code\",\n\t\t\t\tmessage: \"Complete login in your browser, or paste the redirect URL here:\",\n\t\t\t\tplaceholder: REDIRECT_URI,\n\t\t\t\tsignal: manualAbort.signal,\n\t\t\t})\n\t\t\t.then((input) => {\n\t\t\t\tmanualInput = input;\n\t\t\t\tserver.cancelWait();\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tmanualError = err instanceof Error ? err : new Error(String(err));\n\t\t\t\tserver.cancelWait();\n\t\t\t});\n\n\t\tconst result = await server.waitForCode();\n\n\t\t// If manual input was cancelled, throw that error\n\t\tif (manualError) {\n\t\t\tthrow manualError;\n\t\t}\n\n\t\tif (result?.code) {\n\t\t\t// Browser callback won - verify state\n\t\t\tif (result.state !== verifier) {\n\t\t\t\tthrow new Error(\"OAuth state mismatch - possible CSRF attack\");\n\t\t\t}\n\t\t\tcode = result.code;\n\t\t} else if (manualInput) {\n\t\t\t// Manual input won\n\t\t\tconst parsed = parseRedirectUrl(manualInput);\n\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\tthrow new Error(\"OAuth state mismatch - possible CSRF attack\");\n\t\t\t}\n\t\t\tcode = parsed.code;\n\t\t}\n\n\t\t// If still no code, wait for manual promise and try that\n\t\tif (!code) {\n\t\t\tawait manualPromise;\n\t\t\tif (manualError) {\n\t\t\t\tthrow manualError;\n\t\t\t}\n\t\t\tif (manualInput) {\n\t\t\t\tconst parsed = parseRedirectUrl(manualInput);\n\t\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\t\tthrow new Error(\"OAuth state mismatch - possible CSRF attack\");\n\t\t\t\t}\n\t\t\t\tcode = parsed.code;\n\t\t\t}\n\t\t}\n\n\t\tif (!code) {\n\t\t\tthrow new Error(\"No authorization code received\");\n\t\t}\n\n\t\t// Exchange code for tokens\n\t\tonProgress(\"Exchanging authorization code for tokens...\");\n\t\tconst tokenResponse = await fetch(TOKEN_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\tclient_secret: CLIENT_SECRET,\n\t\t\t\tcode,\n\t\t\t\tgrant_type: \"authorization_code\",\n\t\t\t\tredirect_uri: REDIRECT_URI,\n\t\t\t\tcode_verifier: verifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = (await tokenResponse.json()) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\tif (!tokenData.refresh_token) {\n\t\t\tthrow new Error(\"No refresh token received. Please try again.\");\n\t\t}\n\n\t\t// Get user email\n\t\tonProgress(\"Getting user info...\");\n\t\tconst email = await getUserEmail(tokenData.access_token);\n\n\t\t// Discover project\n\t\tconst projectId = await discoverProject(tokenData.access_token, onProgress);\n\n\t\t// Calculate expiry time (current time + expires_in seconds - 5 min buffer)\n\t\tconst expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;\n\n\t\tconst credential: OAuthCredential = {\n\t\t\ttype: \"oauth\",\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\taccess: tokenData.access_token,\n\t\t\texpires: expiresAt,\n\t\t\tprojectId,\n\t\t\temail,\n\t\t};\n\n\t\treturn credential;\n\t} finally {\n\t\tmanualAbort.abort();\n\t\tserver.server.close();\n\t}\n}\n\nfunction antigravityProjectId(credential: OAuthCredential): string {\n\tconst projectId = credential.projectId;\n\tif (typeof projectId !== \"string\" || !projectId) {\n\t\tthrow new Error(\"Antigravity credentials missing projectId\");\n\t}\n\treturn projectId;\n}\n\nexport const antigravityOAuth: OAuthAuth = {\n\tname: \"Antigravity (Gemini 3, Claude, GPT-OSS)\",\n\tloginLabel: \"Sign in with Google (Antigravity)\",\n\tlogin: loginAntigravity,\n\trefresh: (credential) => refreshAntigravityToken(credential.refresh, antigravityProjectId(credential)),\n\n\t/**\n\t * Antigravity requests need both the access token and the discovered project\n\t * id, so the credential is handed to callers as a JSON blob in `apiKey`.\n\t */\n\tasync toAuth(credential) {\n\t\treturn { apiKey: JSON.stringify({ token: credential.access, projectId: antigravityProjectId(credential) }) };\n\t},\n};\n"]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Gemini CLI OAuth flow (Google Cloud Code Assist)
3
+ * Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)
4
+ *
5
+ * NOTE: This module uses Node.js http.createServer for the OAuth callback.
6
+ * It is only intended for CLI use, not browser environments.
7
+ */
8
+ import type { AuthInteraction, OAuthAuth, OAuthCredential } from "../types.ts";
9
+ /**
10
+ * Refresh Google Cloud Code Assist token
11
+ */
12
+ export declare function refreshGoogleCloudToken(refreshToken: string, projectId: string): Promise<OAuthCredential>;
13
+ /**
14
+ * Login with Gemini CLI (Google Cloud Code Assist) OAuth.
15
+ *
16
+ * The pasted-redirect-URL prompt races the local browser callback — whichever
17
+ * completes first wins.
18
+ */
19
+ export declare function loginGeminiCli(interaction: AuthInteraction): Promise<OAuthCredential>;
20
+ export declare const geminiCliOAuth: OAuthAuth;
21
+ //# sourceMappingURL=google-gemini-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-gemini-cli.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/google-gemini-cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuW/E;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA8B/G;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA2J3F;AAUD,eAAO,MAAM,cAAc,EAAE,SAa5B,CAAC"}
@@ -313,6 +313,7 @@ export async function refreshGoogleCloudToken(refreshToken, projectId) {
313
313
  }
314
314
  const data = (await response.json());
315
315
  return {
316
+ type: "oauth",
316
317
  refresh: data.refresh_token || refreshToken,
317
318
  access: data.access_token,
318
319
  expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
@@ -320,18 +321,20 @@ export async function refreshGoogleCloudToken(refreshToken, projectId) {
320
321
  };
321
322
  }
322
323
  /**
323
- * Login with Gemini CLI (Google Cloud Code Assist) OAuth
324
+ * Login with Gemini CLI (Google Cloud Code Assist) OAuth.
324
325
  *
325
- * @param onAuth - Callback with URL and optional instructions
326
- * @param onProgress - Optional progress callback
327
- * @param onManualCodeInput - Optional promise that resolves with user-pasted redirect URL.
328
- * Races with browser callback - whichever completes first wins.
326
+ * The pasted-redirect-URL prompt races the local browser callback — whichever
327
+ * completes first wins.
329
328
  */
330
- export async function loginGeminiCli(onAuth, onProgress, onManualCodeInput) {
329
+ export async function loginGeminiCli(interaction) {
330
+ const onProgress = (message) => interaction.notify({ type: "progress", message });
331
331
  const { verifier, challenge } = await generatePKCE();
332
332
  // Start local server for callback
333
- onProgress?.("Starting local server for OAuth callback...");
333
+ onProgress("Starting local server for OAuth callback...");
334
334
  const server = await startCallbackServer();
335
+ // The manual_code prompt races the callback server; abort it once the flow
336
+ // settles so the UI can dismiss the pending input.
337
+ const manualAbort = new AbortController();
335
338
  let code;
336
339
  try {
337
340
  // Build authorization URL
@@ -348,75 +351,69 @@ export async function loginGeminiCli(onAuth, onProgress, onManualCodeInput) {
348
351
  });
349
352
  const authUrl = `${AUTH_URL}?${authParams.toString()}`;
350
353
  // Notify caller with URL to open
351
- onAuth({
354
+ interaction.notify({
355
+ type: "auth_url",
352
356
  url: authUrl,
353
- instructions: "Complete the sign-in in your browser.",
357
+ instructions: "Complete the sign-in in your browser. If the browser is on another machine, paste the final redirect URL here.",
354
358
  });
355
- // Wait for the callback, racing with manual input if provided
356
- onProgress?.("Waiting for OAuth callback...");
357
- if (onManualCodeInput) {
358
- // Race between browser callback and manual input
359
- let manualInput;
360
- let manualError;
361
- const manualPromise = onManualCodeInput()
362
- .then((input) => {
363
- manualInput = input;
364
- server.cancelWait();
365
- })
366
- .catch((err) => {
367
- manualError = err instanceof Error ? err : new Error(String(err));
368
- server.cancelWait();
369
- });
370
- const result = await server.waitForCode();
371
- // If manual input was cancelled, throw that error
359
+ // Wait for the callback, racing with manual input
360
+ onProgress("Waiting for OAuth callback...");
361
+ let manualInput;
362
+ let manualError;
363
+ const manualPromise = interaction
364
+ .prompt({
365
+ type: "manual_code",
366
+ message: "Complete login in your browser, or paste the redirect URL here:",
367
+ placeholder: REDIRECT_URI,
368
+ signal: manualAbort.signal,
369
+ })
370
+ .then((input) => {
371
+ manualInput = input;
372
+ server.cancelWait();
373
+ })
374
+ .catch((err) => {
375
+ manualError = err instanceof Error ? err : new Error(String(err));
376
+ server.cancelWait();
377
+ });
378
+ const result = await server.waitForCode();
379
+ // If manual input was cancelled, throw that error
380
+ if (manualError) {
381
+ throw manualError;
382
+ }
383
+ if (result?.code) {
384
+ // Browser callback won - verify state
385
+ if (result.state !== verifier) {
386
+ throw new Error("OAuth state mismatch - possible CSRF attack");
387
+ }
388
+ code = result.code;
389
+ }
390
+ else if (manualInput) {
391
+ // Manual input won
392
+ const parsed = parseRedirectUrl(manualInput);
393
+ if (parsed.state && parsed.state !== verifier) {
394
+ throw new Error("OAuth state mismatch - possible CSRF attack");
395
+ }
396
+ code = parsed.code;
397
+ }
398
+ // If still no code, wait for manual promise and try that
399
+ if (!code) {
400
+ await manualPromise;
372
401
  if (manualError) {
373
402
  throw manualError;
374
403
  }
375
- if (result?.code) {
376
- // Browser callback won - verify state
377
- if (result.state !== verifier) {
378
- throw new Error("OAuth state mismatch - possible CSRF attack");
379
- }
380
- code = result.code;
381
- }
382
- else if (manualInput) {
383
- // Manual input won
404
+ if (manualInput) {
384
405
  const parsed = parseRedirectUrl(manualInput);
385
406
  if (parsed.state && parsed.state !== verifier) {
386
407
  throw new Error("OAuth state mismatch - possible CSRF attack");
387
408
  }
388
409
  code = parsed.code;
389
410
  }
390
- // If still no code, wait for manual promise and try that
391
- if (!code) {
392
- await manualPromise;
393
- if (manualError) {
394
- throw manualError;
395
- }
396
- if (manualInput) {
397
- const parsed = parseRedirectUrl(manualInput);
398
- if (parsed.state && parsed.state !== verifier) {
399
- throw new Error("OAuth state mismatch - possible CSRF attack");
400
- }
401
- code = parsed.code;
402
- }
403
- }
404
- }
405
- else {
406
- // Original flow: just wait for callback
407
- const result = await server.waitForCode();
408
- if (result?.code) {
409
- if (result.state !== verifier) {
410
- throw new Error("OAuth state mismatch - possible CSRF attack");
411
- }
412
- code = result.code;
413
- }
414
411
  }
415
412
  if (!code) {
416
413
  throw new Error("No authorization code received");
417
414
  }
418
415
  // Exchange code for tokens
419
- onProgress?.("Exchanging authorization code for tokens...");
416
+ onProgress("Exchanging authorization code for tokens...");
420
417
  const tokenResponse = await fetch(TOKEN_URL, {
421
418
  method: "POST",
422
419
  headers: {
@@ -440,42 +437,45 @@ export async function loginGeminiCli(onAuth, onProgress, onManualCodeInput) {
440
437
  throw new Error("No refresh token received. Please try again.");
441
438
  }
442
439
  // Get user email
443
- onProgress?.("Getting user info...");
440
+ onProgress("Getting user info...");
444
441
  const email = await getUserEmail(tokenData.access_token);
445
442
  // Discover project
446
443
  const projectId = await discoverProject(tokenData.access_token, onProgress);
447
444
  // Calculate expiry time (current time + expires_in seconds - 5 min buffer)
448
445
  const expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;
449
- const credentials = {
446
+ const credential = {
447
+ type: "oauth",
450
448
  refresh: tokenData.refresh_token,
451
449
  access: tokenData.access_token,
452
450
  expires: expiresAt,
453
451
  projectId,
454
452
  email,
455
453
  };
456
- return credentials;
454
+ return credential;
457
455
  }
458
456
  finally {
457
+ manualAbort.abort();
459
458
  server.server.close();
460
459
  }
461
460
  }
462
- export const geminiCliOAuthProvider = {
463
- id: "google-gemini-cli",
461
+ function geminiCliProjectId(credential) {
462
+ const projectId = credential.projectId;
463
+ if (typeof projectId !== "string" || !projectId) {
464
+ throw new Error("Google Cloud credentials missing projectId");
465
+ }
466
+ return projectId;
467
+ }
468
+ export const geminiCliOAuth = {
464
469
  name: "Google Cloud Code Assist (Gemini CLI)",
465
- usesCallbackServer: true,
466
- async login(callbacks) {
467
- return loginGeminiCli(callbacks.onAuth, callbacks.onProgress, callbacks.onManualCodeInput);
468
- },
469
- async refreshToken(credentials) {
470
- const creds = credentials;
471
- if (!creds.projectId) {
472
- throw new Error("Google Cloud credentials missing projectId");
473
- }
474
- return refreshGoogleCloudToken(creds.refresh, creds.projectId);
475
- },
476
- getApiKey(credentials) {
477
- const creds = credentials;
478
- return JSON.stringify({ token: creds.access, projectId: creds.projectId });
470
+ loginLabel: "Sign in with Google (Gemini CLI)",
471
+ login: loginGeminiCli,
472
+ refresh: (credential) => refreshGoogleCloudToken(credential.refresh, geminiCliProjectId(credential)),
473
+ /**
474
+ * Cloud Code Assist requests need both the access token and the discovered
475
+ * project id, so the credential is handed to callers as a JSON blob in `apiKey`.
476
+ */
477
+ async toAuth(credential) {
478
+ return { apiKey: JSON.stringify({ token: credential.access, projectId: geminiCliProjectId(credential) }) };
479
479
  },
480
480
  };
481
481
  //# sourceMappingURL=google-gemini-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-gemini-cli.js","sourceRoot":"","sources":["../../../src/auth/oauth/google-gemini-cli.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Gemini CLI OAuth flow (Google Cloud Code Assist)\n * Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)\n *\n * NOTE: This module uses Node.js http.createServer for the OAuth callback.\n * It is only intended for CLI use, not browser environments.\n */\n\nimport type { Server } from \"node:http\";\nimport type { AuthInteraction, OAuthAuth, OAuthCredential } from \"../types.ts\";\nimport { oauthErrorHtml, oauthSuccessHtml } from \"./oauth-page.ts\";\nimport { generatePKCE } from \"./pkce.ts\";\n\nlet _createServer: typeof import(\"node:http\").createServer | null = null;\nlet _httpImportPromise: Promise<void> | null = null;\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\t_httpImportPromise = import(\"node:http\").then((m) => {\n\t\t_createServer = m.createServer;\n\t});\n}\n\nconst decode = (s: string) => atob(s);\nconst CLIENT_ID = decode(\n\t\"NjgxMjU1ODA5Mzk1LW9vOGZ0Mm9wcmRybnA5ZTNhcWY2YXYzaG1kaWIxMzVqLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29t\",\n);\nconst CLIENT_SECRET = decode(\"R09DU1BYLTR1SGdNUG0tMW83U2stZ2VWNkN1NWNsWEZzeGw=\");\nconst REDIRECT_URI = \"http://localhost:8085/oauth2callback\";\nconst SCOPES = [\n\t\"https://www.googleapis.com/auth/cloud-platform\",\n\t\"https://www.googleapis.com/auth/userinfo.email\",\n\t\"https://www.googleapis.com/auth/userinfo.profile\",\n];\nconst AUTH_URL = \"https://accounts.google.com/o/oauth2/v2/auth\";\nconst TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nconst CODE_ASSIST_ENDPOINT = \"https://cloudcode-pa.googleapis.com\";\n\ntype CallbackServerInfo = {\n\tserver: Server;\n\tcancelWait: () => void;\n\twaitForCode: () => Promise<{ code: string; state: string } | null>;\n};\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nasync function getNodeCreateServer(): Promise<typeof import(\"node:http\").createServer> {\n\tif (_createServer) return _createServer;\n\tif (_httpImportPromise) {\n\t\tawait _httpImportPromise;\n\t}\n\tif (_createServer) return _createServer;\n\tthrow new Error(\"Gemini CLI OAuth is only available in Node.js environments\");\n}\n\nasync function startCallbackServer(): Promise<CallbackServerInfo> {\n\tconst createServer = await getNodeCreateServer();\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\tconst url = new URL(req.url || \"\", `http://localhost:8085`);\n\n\t\t\tif (url.pathname === \"/oauth2callback\") {\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(\"Google 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(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\t\tres.end(oauthSuccessHtml(\"Google authentication completed. You can close this window.\"));\n\t\t\t\t\tsettleWait?.({ code, state });\n\t\t\t\t} else {\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}\n\t\t\t} else {\n\t\t\t\tres.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\t\tres.end(oauthErrorHtml(\"Callback route not found.\"));\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(8085, \"127.0.0.1\", () => {\n\t\t\tresolve({\n\t\t\t\tserver,\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\n/**\n * Parse redirect URL to extract code and state\n */\nfunction parseRedirectUrl(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, return empty\n\t\treturn {};\n\t}\n}\n\ninterface LoadCodeAssistPayload {\n\tcloudaicompanionProject?: string;\n\tcurrentTier?: { id?: string };\n\tallowedTiers?: Array<{ id?: string; isDefault?: boolean }>;\n}\n\n/**\n * Long-running operation response from onboardUser\n */\ninterface LongRunningOperationResponse {\n\tname?: string;\n\tdone?: boolean;\n\tresponse?: {\n\t\tcloudaicompanionProject?: { id?: string };\n\t};\n}\n\n// Tier IDs as used by the Cloud Code API\nconst TIER_FREE = \"free-tier\";\nconst TIER_LEGACY = \"legacy-tier\";\nconst TIER_STANDARD = \"standard-tier\";\n\ninterface GoogleRpcErrorResponse {\n\terror?: {\n\t\tdetails?: Array<{ reason?: string }>;\n\t};\n}\n\n/**\n * Wait helper for onboarding retries\n */\nfunction wait(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Get default tier from allowed tiers\n */\nfunction getDefaultTier(allowedTiers?: Array<{ id?: string; isDefault?: boolean }>): { id?: string } {\n\tif (!allowedTiers || allowedTiers.length === 0) return { id: TIER_LEGACY };\n\tconst defaultTier = allowedTiers.find((t) => t.isDefault);\n\treturn defaultTier ?? { id: TIER_LEGACY };\n}\n\nfunction isVpcScAffectedUser(payload: unknown): boolean {\n\tif (!payload || typeof payload !== \"object\") return false;\n\tif (!(\"error\" in payload)) return false;\n\tconst error = (payload as GoogleRpcErrorResponse).error;\n\tif (!error?.details || !Array.isArray(error.details)) return false;\n\treturn error.details.some((detail) => detail.reason === \"SECURITY_POLICY_VIOLATED\");\n}\n\n/**\n * Poll a long-running operation until completion\n */\nasync function pollOperation(\n\toperationName: string,\n\theaders: Record<string, string>,\n\tonProgress?: (message: string) => void,\n): Promise<LongRunningOperationResponse> {\n\tlet attempt = 0;\n\twhile (true) {\n\t\tif (attempt > 0) {\n\t\t\tonProgress?.(`Waiting for project provisioning (attempt ${attempt + 1})...`);\n\t\t\tawait wait(5000);\n\t\t}\n\n\t\tconst response = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal/${operationName}`, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to poll operation: ${response.status} ${response.statusText}`);\n\t\t}\n\n\t\tconst data = (await response.json()) as LongRunningOperationResponse;\n\t\tif (data.done) {\n\t\t\treturn data;\n\t\t}\n\n\t\tattempt += 1;\n\t}\n}\n\n/**\n * Discover or provision a Google Cloud project for the user\n */\nasync function discoverProject(accessToken: string, onProgress?: (message: string) => void): Promise<string> {\n\t// Check for user-provided project ID via environment variable\n\tconst envProjectId = process.env.GOOGLE_CLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT_ID;\n\n\tconst headers = {\n\t\tAuthorization: `Bearer ${accessToken}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"User-Agent\": \"google-api-nodejs-client/9.15.1\",\n\t\t\"X-Goog-Api-Client\": \"gl-node/22.17.0\",\n\t};\n\n\t// Try to load existing project via loadCodeAssist\n\tonProgress?.(\"Checking for existing Cloud Code Assist project...\");\n\tconst loadResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:loadCodeAssist`, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({\n\t\t\tcloudaicompanionProject: envProjectId,\n\t\t\tmetadata: {\n\t\t\t\tideType: \"IDE_UNSPECIFIED\",\n\t\t\t\tplatform: \"PLATFORM_UNSPECIFIED\",\n\t\t\t\tpluginType: \"GEMINI\",\n\t\t\t\tduetProject: envProjectId,\n\t\t\t},\n\t\t}),\n\t});\n\n\tlet data: LoadCodeAssistPayload;\n\n\tif (!loadResponse.ok) {\n\t\tlet errorPayload: unknown;\n\t\ttry {\n\t\t\terrorPayload = await loadResponse.clone().json();\n\t\t} catch {\n\t\t\terrorPayload = undefined;\n\t\t}\n\n\t\tif (isVpcScAffectedUser(errorPayload)) {\n\t\t\tdata = { currentTier: { id: TIER_STANDARD } };\n\t\t} else {\n\t\t\tconst errorText = await loadResponse.text();\n\t\t\tthrow new Error(`loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`);\n\t\t}\n\t} else {\n\t\tdata = (await loadResponse.json()) as LoadCodeAssistPayload;\n\t}\n\n\t// If user already has a current tier and project, use it\n\tif (data.currentTier) {\n\t\tif (data.cloudaicompanionProject) {\n\t\t\treturn data.cloudaicompanionProject;\n\t\t}\n\t\t// User has a tier but no managed project - they need to provide one via env var\n\t\tif (envProjectId) {\n\t\t\treturn envProjectId;\n\t\t}\n\t\tthrow new Error(\n\t\t\t\"This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. \" +\n\t\t\t\t\"See https://goo.gle/gemini-cli-auth-docs#workspace-gca\",\n\t\t);\n\t}\n\n\t// User needs to be onboarded - get the default tier\n\tconst tier = getDefaultTier(data.allowedTiers);\n\tconst tierId = tier?.id ?? TIER_FREE;\n\n\tif (tierId !== TIER_FREE && !envProjectId) {\n\t\tthrow new Error(\n\t\t\t\"This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. \" +\n\t\t\t\t\"See https://goo.gle/gemini-cli-auth-docs#workspace-gca\",\n\t\t);\n\t}\n\n\tonProgress?.(\"Provisioning Cloud Code Assist project (this may take a moment)...\");\n\n\t// Build onboard request - for free tier, don't include project ID (Google provisions one)\n\t// For other tiers, include the user's project ID if available\n\tconst onboardBody: Record<string, unknown> = {\n\t\ttierId,\n\t\tmetadata: {\n\t\t\tideType: \"IDE_UNSPECIFIED\",\n\t\t\tplatform: \"PLATFORM_UNSPECIFIED\",\n\t\t\tpluginType: \"GEMINI\",\n\t\t},\n\t};\n\n\tif (tierId !== TIER_FREE && envProjectId) {\n\t\tonboardBody.cloudaicompanionProject = envProjectId;\n\t\t(onboardBody.metadata as Record<string, unknown>).duetProject = envProjectId;\n\t}\n\n\t// Start onboarding - this returns a long-running operation\n\tconst onboardResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:onboardUser`, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify(onboardBody),\n\t});\n\n\tif (!onboardResponse.ok) {\n\t\tconst errorText = await onboardResponse.text();\n\t\tthrow new Error(`onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`);\n\t}\n\n\tlet lroData = (await onboardResponse.json()) as LongRunningOperationResponse;\n\n\t// If the operation isn't done yet, poll until completion\n\tif (!lroData.done && lroData.name) {\n\t\tlroData = await pollOperation(lroData.name, headers, onProgress);\n\t}\n\n\t// Try to get project ID from the response\n\tconst projectId = lroData.response?.cloudaicompanionProject?.id;\n\tif (projectId) {\n\t\treturn projectId;\n\t}\n\n\t// If no project ID from onboarding, fall back to env var\n\tif (envProjectId) {\n\t\treturn envProjectId;\n\t}\n\n\tthrow new Error(\n\t\t\"Could not discover or provision a Google Cloud project. \" +\n\t\t\t\"Try setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. \" +\n\t\t\t\"See https://goo.gle/gemini-cli-auth-docs#workspace-gca\",\n\t);\n}\n\n/**\n * Get user email from the access token\n */\nasync function getUserEmail(accessToken: string): Promise<string | undefined> {\n\ttry {\n\t\tconst response = await fetch(\"https://www.googleapis.com/oauth2/v1/userinfo?alt=json\", {\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${accessToken}`,\n\t\t\t},\n\t\t});\n\n\t\tif (response.ok) {\n\t\t\tconst data = (await response.json()) as { email?: string };\n\t\t\treturn data.email;\n\t\t}\n\t} catch {\n\t\t// Ignore errors, email is optional\n\t}\n\treturn undefined;\n}\n\n/**\n * Refresh Google Cloud Code Assist token\n */\nexport async function refreshGoogleCloudToken(refreshToken: string, projectId: string): Promise<OAuthCredential> {\n\tconst response = await fetch(TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: new URLSearchParams({\n\t\t\tclient_id: CLIENT_ID,\n\t\t\tclient_secret: CLIENT_SECRET,\n\t\t\trefresh_token: refreshToken,\n\t\t\tgrant_type: \"refresh_token\",\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.text();\n\t\tthrow new Error(`Google Cloud token refresh failed: ${error}`);\n\t}\n\n\tconst data = (await response.json()) as {\n\t\taccess_token: string;\n\t\texpires_in: number;\n\t\trefresh_token?: string;\n\t};\n\n\treturn {\n\t\ttype: \"oauth\",\n\t\trefresh: data.refresh_token || refreshToken,\n\t\taccess: data.access_token,\n\t\texpires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,\n\t\tprojectId,\n\t};\n}\n\n/**\n * Login with Gemini CLI (Google Cloud Code Assist) OAuth.\n *\n * The pasted-redirect-URL prompt races the local browser callback — whichever\n * completes first wins.\n */\nexport async function loginGeminiCli(interaction: AuthInteraction): Promise<OAuthCredential> {\n\tconst onProgress = (message: string) => interaction.notify({ type: \"progress\", message });\n\tconst { verifier, challenge } = await generatePKCE();\n\n\t// Start local server for callback\n\tonProgress(\"Starting local server for OAuth callback...\");\n\tconst server = await startCallbackServer();\n\t// The manual_code prompt races the callback server; abort it once the flow\n\t// settles so the UI can dismiss the pending input.\n\tconst manualAbort = new AbortController();\n\n\tlet code: string | undefined;\n\n\ttry {\n\t\t// Build authorization URL\n\t\tconst authParams = new URLSearchParams({\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.join(\" \"),\n\t\t\tcode_challenge: challenge,\n\t\t\tcode_challenge_method: \"S256\",\n\t\t\tstate: verifier,\n\t\t\taccess_type: \"offline\",\n\t\t\tprompt: \"consent\",\n\t\t});\n\n\t\tconst authUrl = `${AUTH_URL}?${authParams.toString()}`;\n\n\t\t// Notify caller with URL to open\n\t\tinteraction.notify({\n\t\t\ttype: \"auth_url\",\n\t\t\turl: authUrl,\n\t\t\tinstructions:\n\t\t\t\t\"Complete the sign-in in your browser. If the browser is on another machine, paste the final redirect URL here.\",\n\t\t});\n\n\t\t// Wait for the callback, racing with manual input\n\t\tonProgress(\"Waiting for OAuth callback...\");\n\n\t\tlet manualInput: string | undefined;\n\t\tlet manualError: Error | undefined;\n\t\tconst manualPromise = interaction\n\t\t\t.prompt({\n\t\t\t\ttype: \"manual_code\",\n\t\t\t\tmessage: \"Complete login in your browser, or paste the redirect URL here:\",\n\t\t\t\tplaceholder: REDIRECT_URI,\n\t\t\t\tsignal: manualAbort.signal,\n\t\t\t})\n\t\t\t.then((input) => {\n\t\t\t\tmanualInput = input;\n\t\t\t\tserver.cancelWait();\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tmanualError = err instanceof Error ? err : new Error(String(err));\n\t\t\t\tserver.cancelWait();\n\t\t\t});\n\n\t\tconst result = await server.waitForCode();\n\n\t\t// If manual input was cancelled, throw that error\n\t\tif (manualError) {\n\t\t\tthrow manualError;\n\t\t}\n\n\t\tif (result?.code) {\n\t\t\t// Browser callback won - verify state\n\t\t\tif (result.state !== verifier) {\n\t\t\t\tthrow new Error(\"OAuth state mismatch - possible CSRF attack\");\n\t\t\t}\n\t\t\tcode = result.code;\n\t\t} else if (manualInput) {\n\t\t\t// Manual input won\n\t\t\tconst parsed = parseRedirectUrl(manualInput);\n\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\tthrow new Error(\"OAuth state mismatch - possible CSRF attack\");\n\t\t\t}\n\t\t\tcode = parsed.code;\n\t\t}\n\n\t\t// If still no code, wait for manual promise and try that\n\t\tif (!code) {\n\t\t\tawait manualPromise;\n\t\t\tif (manualError) {\n\t\t\t\tthrow manualError;\n\t\t\t}\n\t\t\tif (manualInput) {\n\t\t\t\tconst parsed = parseRedirectUrl(manualInput);\n\t\t\t\tif (parsed.state && parsed.state !== verifier) {\n\t\t\t\t\tthrow new Error(\"OAuth state mismatch - possible CSRF attack\");\n\t\t\t\t}\n\t\t\t\tcode = parsed.code;\n\t\t\t}\n\t\t}\n\n\t\tif (!code) {\n\t\t\tthrow new Error(\"No authorization code received\");\n\t\t}\n\n\t\t// Exchange code for tokens\n\t\tonProgress(\"Exchanging authorization code for tokens...\");\n\t\tconst tokenResponse = await fetch(TOKEN_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tclient_id: CLIENT_ID,\n\t\t\t\tclient_secret: CLIENT_SECRET,\n\t\t\t\tcode,\n\t\t\t\tgrant_type: \"authorization_code\",\n\t\t\t\tredirect_uri: REDIRECT_URI,\n\t\t\t\tcode_verifier: verifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = (await tokenResponse.json()) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\tif (!tokenData.refresh_token) {\n\t\t\tthrow new Error(\"No refresh token received. Please try again.\");\n\t\t}\n\n\t\t// Get user email\n\t\tonProgress(\"Getting user info...\");\n\t\tconst email = await getUserEmail(tokenData.access_token);\n\n\t\t// Discover project\n\t\tconst projectId = await discoverProject(tokenData.access_token, onProgress);\n\n\t\t// Calculate expiry time (current time + expires_in seconds - 5 min buffer)\n\t\tconst expiresAt = Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000;\n\n\t\tconst credential: OAuthCredential = {\n\t\t\ttype: \"oauth\",\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\taccess: tokenData.access_token,\n\t\t\texpires: expiresAt,\n\t\t\tprojectId,\n\t\t\temail,\n\t\t};\n\n\t\treturn credential;\n\t} finally {\n\t\tmanualAbort.abort();\n\t\tserver.server.close();\n\t}\n}\n\nfunction geminiCliProjectId(credential: OAuthCredential): string {\n\tconst projectId = credential.projectId;\n\tif (typeof projectId !== \"string\" || !projectId) {\n\t\tthrow new Error(\"Google Cloud credentials missing projectId\");\n\t}\n\treturn projectId;\n}\n\nexport const geminiCliOAuth: OAuthAuth = {\n\tname: \"Google Cloud Code Assist (Gemini CLI)\",\n\tloginLabel: \"Sign in with Google (Gemini CLI)\",\n\tlogin: loginGeminiCli,\n\trefresh: (credential) => refreshGoogleCloudToken(credential.refresh, geminiCliProjectId(credential)),\n\n\t/**\n\t * Cloud Code Assist requests need both the access token and the discovered\n\t * project id, so the credential is handed to callers as a JSON blob in `apiKey`.\n\t */\n\tasync toAuth(credential) {\n\t\treturn { apiKey: JSON.stringify({ token: credential.access, projectId: geminiCliProjectId(credential) }) };\n\t},\n};\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Kimi Code (subscription) OAuth flow
3
+ *
4
+ * RFC 8628 device authorization grant against https://auth.kimi.com with JSON
5
+ * responses. The access token authenticates requests to
6
+ * https://api.kimi.com/coding as an `Authorization: Bearer` header.
7
+ */
8
+ import type { OAuthAuth } from "../types.ts";
9
+ export declare const kimiCodingOAuth: OAuthAuth;
10
+ //# sourceMappingURL=kimi-coding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi-coding.d.ts","sourceRoot":"","sources":["../../../src/auth/oauth/kimi-coding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAmB,SAAS,EAAmB,MAAM,aAAa,CAAC;AAsR/E,eAAO,MAAM,eAAe,EAAE,SAc7B,CAAC"}