@linxiraos/pi-ai 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/CHANGELOG.md +5066 -0
  2. package/README.md +1195 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
  5. package/dist/types/auth-broker/client.d.ts +93 -0
  6. package/dist/types/auth-broker/discover.d.ts +39 -0
  7. package/dist/types/auth-broker/index.d.ts +7 -0
  8. package/dist/types/auth-broker/refresher.d.ts +25 -0
  9. package/dist/types/auth-broker/remote-store.d.ts +136 -0
  10. package/dist/types/auth-broker/server.d.ts +48 -0
  11. package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
  12. package/dist/types/auth-broker/types.d.ts +152 -0
  13. package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
  14. package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
  15. package/dist/types/auth-gateway/http.d.ts +56 -0
  16. package/dist/types/auth-gateway/index.d.ts +3 -0
  17. package/dist/types/auth-gateway/server.d.ts +36 -0
  18. package/dist/types/auth-gateway/types.d.ts +127 -0
  19. package/dist/types/auth-retry.d.ts +150 -0
  20. package/dist/types/auth-storage.d.ts +1258 -0
  21. package/dist/types/dialect/anthropic.d.ts +15 -0
  22. package/dist/types/dialect/catalog.d.ts +3 -0
  23. package/dist/types/dialect/coercion.d.ts +23 -0
  24. package/dist/types/dialect/deepseek.d.ts +14 -0
  25. package/dist/types/dialect/demotion.d.ts +30 -0
  26. package/dist/types/dialect/examples.d.ts +18 -0
  27. package/dist/types/dialect/factory.d.ts +3 -0
  28. package/dist/types/dialect/fenced-thinking.d.ts +53 -0
  29. package/dist/types/dialect/gemini.d.ts +17 -0
  30. package/dist/types/dialect/gemma.d.ts +15 -0
  31. package/dist/types/dialect/glm.d.ts +9 -0
  32. package/dist/types/dialect/harmony.d.ts +8 -0
  33. package/dist/types/dialect/hermes.d.ts +9 -0
  34. package/dist/types/dialect/history.d.ts +3 -0
  35. package/dist/types/dialect/index.d.ts +11 -0
  36. package/dist/types/dialect/inventory.d.ts +9 -0
  37. package/dist/types/dialect/kimi.d.ts +14 -0
  38. package/dist/types/dialect/minimax.d.ts +3 -0
  39. package/dist/types/dialect/owned-stream.d.ts +4 -0
  40. package/dist/types/dialect/qwen3.d.ts +9 -0
  41. package/dist/types/dialect/rendering.d.ts +54 -0
  42. package/dist/types/dialect/thinking.d.ts +6 -0
  43. package/dist/types/dialect/types.d.ts +68 -0
  44. package/dist/types/dialect/xml.d.ts +9 -0
  45. package/dist/types/error/abort.d.ts +14 -0
  46. package/dist/types/error/auth-classify.d.ts +20 -0
  47. package/dist/types/error/auth.d.ts +27 -0
  48. package/dist/types/error/aws.d.ts +27 -0
  49. package/dist/types/error/classes.d.ts +106 -0
  50. package/dist/types/error/finalize.d.ts +39 -0
  51. package/dist/types/error/flags.d.ts +94 -0
  52. package/dist/types/error/format.d.ts +20 -0
  53. package/dist/types/error/gateway.d.ts +20 -0
  54. package/dist/types/error/index.d.ts +14 -0
  55. package/dist/types/error/oauth.d.ts +43 -0
  56. package/dist/types/error/provider.d.ts +42 -0
  57. package/dist/types/error/rate-limit.d.ts +80 -0
  58. package/dist/types/error/retryable.d.ts +27 -0
  59. package/dist/types/error/validation.d.ts +32 -0
  60. package/dist/types/index.d.ts +51 -0
  61. package/dist/types/provider-details.d.ts +24 -0
  62. package/dist/types/providers/amazon-bedrock.d.ts +39 -0
  63. package/dist/types/providers/anthropic-client.d.ts +106 -0
  64. package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
  65. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  66. package/dist/types/providers/anthropic-wire.d.ts +345 -0
  67. package/dist/types/providers/anthropic.d.ts +261 -0
  68. package/dist/types/providers/aws-credentials.d.ts +48 -0
  69. package/dist/types/providers/aws-eventstream.d.ts +39 -0
  70. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  71. package/dist/types/providers/azure-openai-responses.d.ts +16 -0
  72. package/dist/types/providers/bedrock-mantle.d.ts +13 -0
  73. package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
  74. package/dist/types/providers/cowork-fetch.d.ts +3 -0
  75. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  76. package/dist/types/providers/cursor-pi-args.d.ts +105 -0
  77. package/dist/types/providers/cursor.d.ts +221 -0
  78. package/dist/types/providers/devin.d.ts +12 -0
  79. package/dist/types/providers/error-message.d.ts +25 -0
  80. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  81. package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
  82. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  83. package/dist/types/providers/google-auth.d.ts +24 -0
  84. package/dist/types/providers/google-gemini-cli.d.ts +120 -0
  85. package/dist/types/providers/google-shared.d.ts +203 -0
  86. package/dist/types/providers/google-types.d.ts +155 -0
  87. package/dist/types/providers/google-vertex.d.ts +7 -0
  88. package/dist/types/providers/google.d.ts +4 -0
  89. package/dist/types/providers/grammar.d.ts +1 -0
  90. package/dist/types/providers/kimi.d.ts +27 -0
  91. package/dist/types/providers/mock.d.ts +179 -0
  92. package/dist/types/providers/ollama.d.ts +8 -0
  93. package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
  94. package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
  95. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  96. package/dist/types/providers/openai-chat-wire.d.ts +669 -0
  97. package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
  98. package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
  99. package/dist/types/providers/openai-codex-responses.d.ts +238 -0
  100. package/dist/types/providers/openai-completions.d.ts +48 -0
  101. package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
  102. package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
  103. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  104. package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
  105. package/dist/types/providers/openai-responses.d.ts +131 -0
  106. package/dist/types/providers/openai-shared.d.ts +624 -0
  107. package/dist/types/providers/pi-native-client.d.ts +13 -0
  108. package/dist/types/providers/pi-native-server.d.ts +69 -0
  109. package/dist/types/providers/register-builtins.d.ts +37 -0
  110. package/dist/types/providers/synthetic.d.ts +26 -0
  111. package/dist/types/providers/transform-messages.d.ts +32 -0
  112. package/dist/types/providers/vision-guard.d.ts +20 -0
  113. package/dist/types/registry/aiand.d.ts +7 -0
  114. package/dist/types/registry/aimlapi.d.ts +4 -0
  115. package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
  116. package/dist/types/registry/alibaba-token-plan.d.ts +18 -0
  117. package/dist/types/registry/amazon-bedrock.d.ts +5 -0
  118. package/dist/types/registry/anthropic.d.ts +10 -0
  119. package/dist/types/registry/api-key-login.d.ts +42 -0
  120. package/dist/types/registry/api-key-validation.d.ts +43 -0
  121. package/dist/types/registry/aws.d.ts +13 -0
  122. package/dist/types/registry/azure.d.ts +4 -0
  123. package/dist/types/registry/baseten.d.ts +7 -0
  124. package/dist/types/registry/bedrock-mantle.d.ts +22 -0
  125. package/dist/types/registry/cerebras.d.ts +7 -0
  126. package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
  127. package/dist/types/registry/coreweave.d.ts +7 -0
  128. package/dist/types/registry/cursor.d.ts +7 -0
  129. package/dist/types/registry/deepseek.d.ts +8 -0
  130. package/dist/types/registry/derived.d.ts +5 -0
  131. package/dist/types/registry/devin.d.ts +8 -0
  132. package/dist/types/registry/exa.d.ts +8 -0
  133. package/dist/types/registry/firepass.d.ts +16 -0
  134. package/dist/types/registry/fireworks.d.ts +7 -0
  135. package/dist/types/registry/github-copilot.d.ts +7 -0
  136. package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
  137. package/dist/types/registry/gitlab-duo.d.ts +9 -0
  138. package/dist/types/registry/gmi-cloud.d.ts +7 -0
  139. package/dist/types/registry/google-antigravity.d.ts +9 -0
  140. package/dist/types/registry/google-gemini-cli.d.ts +9 -0
  141. package/dist/types/registry/google-vertex.d.ts +5 -0
  142. package/dist/types/registry/google.d.ts +4 -0
  143. package/dist/types/registry/groq.d.ts +4 -0
  144. package/dist/types/registry/huggingface.d.ts +7 -0
  145. package/dist/types/registry/index.d.ts +4 -0
  146. package/dist/types/registry/kagi.d.ts +14 -0
  147. package/dist/types/registry/kilo.d.ts +7 -0
  148. package/dist/types/registry/kimi-code.d.ts +7 -0
  149. package/dist/types/registry/litellm.d.ts +13 -0
  150. package/dist/types/registry/llama-cpp.d.ts +8 -0
  151. package/dist/types/registry/lm-studio.d.ts +8 -0
  152. package/dist/types/registry/meta.d.ts +7 -0
  153. package/dist/types/registry/minimax-code-cn.d.ts +6 -0
  154. package/dist/types/registry/minimax-code.d.ts +6 -0
  155. package/dist/types/registry/minimax.d.ts +4 -0
  156. package/dist/types/registry/mistral.d.ts +4 -0
  157. package/dist/types/registry/moonshot.d.ts +7 -0
  158. package/dist/types/registry/nanogpt.d.ts +7 -0
  159. package/dist/types/registry/novita.d.ts +6 -0
  160. package/dist/types/registry/nvidia.d.ts +7 -0
  161. package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
  162. package/dist/types/registry/oauth/anthropic.d.ts +24 -0
  163. package/dist/types/registry/oauth/callback-server.d.ts +74 -0
  164. package/dist/types/registry/oauth/cursor.d.ts +16 -0
  165. package/dist/types/registry/oauth/device-code.d.ts +25 -0
  166. package/dist/types/registry/oauth/devin.d.ts +5 -0
  167. package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
  168. package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
  169. package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
  170. package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
  171. package/dist/types/registry/oauth/google-gemini-cli.d.ts +22 -0
  172. package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
  173. package/dist/types/registry/oauth/index.d.ts +45 -0
  174. package/dist/types/registry/oauth/kimi.d.ts +21 -0
  175. package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
  176. package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
  177. package/dist/types/registry/oauth/opencode.d.ts +18 -0
  178. package/dist/types/registry/oauth/perplexity.d.ts +9 -0
  179. package/dist/types/registry/oauth/pkce.d.ts +8 -0
  180. package/dist/types/registry/oauth/types.d.ts +87 -0
  181. package/dist/types/registry/oauth/wafer.d.ts +1 -0
  182. package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
  183. package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
  184. package/dist/types/registry/oauth/zai.d.ts +25 -0
  185. package/dist/types/registry/ollama-cloud.d.ts +7 -0
  186. package/dist/types/registry/ollama.d.ts +12 -0
  187. package/dist/types/registry/openai-codex-device.d.ts +8 -0
  188. package/dist/types/registry/openai-codex.d.ts +9 -0
  189. package/dist/types/registry/openai.d.ts +4 -0
  190. package/dist/types/registry/opencode-go.d.ts +6 -0
  191. package/dist/types/registry/opencode-zen.d.ts +6 -0
  192. package/dist/types/registry/openrouter.d.ts +13 -0
  193. package/dist/types/registry/parallel.d.ts +14 -0
  194. package/dist/types/registry/perplexity.d.ts +7 -0
  195. package/dist/types/registry/qianfan.d.ts +7 -0
  196. package/dist/types/registry/qwen-portal.d.ts +7 -0
  197. package/dist/types/registry/registry.d.ts +367 -0
  198. package/dist/types/registry/sakana.d.ts +7 -0
  199. package/dist/types/registry/siliconflow-cn.d.ts +7 -0
  200. package/dist/types/registry/siliconflow.d.ts +7 -0
  201. package/dist/types/registry/synthetic.d.ts +6 -0
  202. package/dist/types/registry/tavily.d.ts +14 -0
  203. package/dist/types/registry/together.d.ts +6 -0
  204. package/dist/types/registry/types.d.ts +75 -0
  205. package/dist/types/registry/umans.d.ts +7 -0
  206. package/dist/types/registry/venice.d.ts +13 -0
  207. package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
  208. package/dist/types/registry/vllm.d.ts +7 -0
  209. package/dist/types/registry/wafer-serverless.d.ts +6 -0
  210. package/dist/types/registry/xai-oauth.d.ts +7 -0
  211. package/dist/types/registry/xai.d.ts +7 -0
  212. package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
  213. package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
  214. package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
  215. package/dist/types/registry/xiaomi.d.ts +6 -0
  216. package/dist/types/registry/zai.d.ts +15 -0
  217. package/dist/types/registry/zenmux.d.ts +7 -0
  218. package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
  219. package/dist/types/stream.d.ts +46 -0
  220. package/dist/types/types.d.ts +1064 -0
  221. package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
  222. package/dist/types/usage/claude.d.ts +4 -0
  223. package/dist/types/usage/cursor.d.ts +4 -0
  224. package/dist/types/usage/gemini.d.ts +2 -0
  225. package/dist/types/usage/github-copilot.d.ts +7 -0
  226. package/dist/types/usage/google-antigravity.d.ts +15 -0
  227. package/dist/types/usage/kimi.d.ts +2 -0
  228. package/dist/types/usage/minimax-code.d.ts +3 -0
  229. package/dist/types/usage/ollama.d.ts +5 -0
  230. package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
  231. package/dist/types/usage/openai-codex-reset.d.ts +88 -0
  232. package/dist/types/usage/openai-codex.d.ts +10 -0
  233. package/dist/types/usage/opencode-go.d.ts +2 -0
  234. package/dist/types/usage/shared.d.ts +1 -0
  235. package/dist/types/usage/synthetic.d.ts +2 -0
  236. package/dist/types/usage/umans.d.ts +2 -0
  237. package/dist/types/usage/xai-oauth.d.ts +12 -0
  238. package/dist/types/usage/zai.d.ts +3 -0
  239. package/dist/types/usage.d.ts +527 -0
  240. package/dist/types/utils/abort.d.ts +25 -0
  241. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  242. package/dist/types/utils/aws-profile.d.ts +17 -0
  243. package/dist/types/utils/block-symbols.d.ts +62 -0
  244. package/dist/types/utils/deterministic-id.d.ts +16 -0
  245. package/dist/types/utils/empty-completion-retry.d.ts +21 -0
  246. package/dist/types/utils/event-stream.d.ts +39 -0
  247. package/dist/types/utils/foundry.d.ts +1 -0
  248. package/dist/types/utils/google-validation.d.ts +2 -0
  249. package/dist/types/utils/harmony-leak.d.ts +135 -0
  250. package/dist/types/utils/http-inspector.d.ts +49 -0
  251. package/dist/types/utils/idle-iterator.d.ts +149 -0
  252. package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
  253. package/dist/types/utils/openai-http.d.ts +48 -0
  254. package/dist/types/utils/openrouter-headers.d.ts +1 -0
  255. package/dist/types/utils/parse-bind.d.ts +23 -0
  256. package/dist/types/utils/provider-response.d.ts +3 -0
  257. package/dist/types/utils/proxy.d.ts +39 -0
  258. package/dist/types/utils/request-debug.d.ts +29 -0
  259. package/dist/types/utils/retry-after.d.ts +4 -0
  260. package/dist/types/utils/retry.d.ts +14 -0
  261. package/dist/types/utils/schema/adapt.d.ts +24 -0
  262. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  263. package/dist/types/utils/schema/dereference.d.ts +11 -0
  264. package/dist/types/utils/schema/draft.d.ts +10 -0
  265. package/dist/types/utils/schema/equality.d.ts +4 -0
  266. package/dist/types/utils/schema/fields.d.ts +54 -0
  267. package/dist/types/utils/schema/index.d.ts +14 -0
  268. package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
  269. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  270. package/dist/types/utils/schema/normalize.d.ts +153 -0
  271. package/dist/types/utils/schema/spill.d.ts +8 -0
  272. package/dist/types/utils/schema/stamps.d.ts +17 -0
  273. package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
  274. package/dist/types/utils/schema/types.d.ts +4 -0
  275. package/dist/types/utils/schema/typescript.d.ts +24 -0
  276. package/dist/types/utils/schema/wire.d.ts +52 -0
  277. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  278. package/dist/types/utils/sse-debug.d.ts +5 -0
  279. package/dist/types/utils/stream-markup-healing.d.ts +87 -0
  280. package/dist/types/utils/thinking-loop.d.ts +102 -0
  281. package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
  282. package/dist/types/utils/tool-choice.d.ts +52 -0
  283. package/dist/types/utils/validation.d.ts +28 -0
  284. package/dist/types/utils.d.ts +57 -0
  285. package/package.json +138 -0
  286. package/src/api-registry.ts +109 -0
  287. package/src/auth/sqlite-credential-store.ts +2066 -0
  288. package/src/auth-broker/client.ts +471 -0
  289. package/src/auth-broker/discover.ts +310 -0
  290. package/src/auth-broker/index.ts +7 -0
  291. package/src/auth-broker/refresher.ts +117 -0
  292. package/src/auth-broker/remote-store.ts +1332 -0
  293. package/src/auth-broker/server.ts +898 -0
  294. package/src/auth-broker/snapshot-cache.ts +200 -0
  295. package/src/auth-broker/types.ts +193 -0
  296. package/src/auth-broker/wire-schema-resource.ts +487 -0
  297. package/src/auth-broker/wire-schemas.ts +43 -0
  298. package/src/auth-gateway/http.ts +227 -0
  299. package/src/auth-gateway/index.ts +3 -0
  300. package/src/auth-gateway/server.ts +836 -0
  301. package/src/auth-gateway/types.ts +153 -0
  302. package/src/auth-retry.ts +401 -0
  303. package/src/auth-storage.ts +6540 -0
  304. package/src/dialect/anthropic.md +31 -0
  305. package/src/dialect/anthropic.ts +608 -0
  306. package/src/dialect/catalog.ts +29 -0
  307. package/src/dialect/coercion.ts +136 -0
  308. package/src/dialect/deepseek.md +24 -0
  309. package/src/dialect/deepseek.ts +609 -0
  310. package/src/dialect/demotion.ts +40 -0
  311. package/src/dialect/examples.ts +71 -0
  312. package/src/dialect/factory.ts +34 -0
  313. package/src/dialect/fenced-thinking.ts +184 -0
  314. package/src/dialect/gemini.md +44 -0
  315. package/src/dialect/gemini.ts +583 -0
  316. package/src/dialect/gemma.md +33 -0
  317. package/src/dialect/gemma.ts +387 -0
  318. package/src/dialect/glm.md +32 -0
  319. package/src/dialect/glm.ts +579 -0
  320. package/src/dialect/harmony.md +31 -0
  321. package/src/dialect/harmony.ts +345 -0
  322. package/src/dialect/hermes.md +25 -0
  323. package/src/dialect/hermes.ts +206 -0
  324. package/src/dialect/history.ts +81 -0
  325. package/src/dialect/index.ts +15 -0
  326. package/src/dialect/inventory.ts +30 -0
  327. package/src/dialect/kimi.md +24 -0
  328. package/src/dialect/kimi.ts +340 -0
  329. package/src/dialect/minimax.md +31 -0
  330. package/src/dialect/minimax.ts +95 -0
  331. package/src/dialect/owned-stream.ts +481 -0
  332. package/src/dialect/prompt-template.md +12 -0
  333. package/src/dialect/qwen3.md +28 -0
  334. package/src/dialect/qwen3.ts +240 -0
  335. package/src/dialect/rendering.ts +304 -0
  336. package/src/dialect/thinking.ts +292 -0
  337. package/src/dialect/types.ts +56 -0
  338. package/src/dialect/xml.md +22 -0
  339. package/src/dialect/xml.ts +90 -0
  340. package/src/error/abort.ts +18 -0
  341. package/src/error/auth-classify.ts +47 -0
  342. package/src/error/auth.ts +48 -0
  343. package/src/error/aws.ts +35 -0
  344. package/src/error/classes.ts +281 -0
  345. package/src/error/finalize.ts +69 -0
  346. package/src/error/flags.ts +602 -0
  347. package/src/error/format.ts +45 -0
  348. package/src/error/gateway.ts +96 -0
  349. package/src/error/index.ts +14 -0
  350. package/src/error/oauth.ts +58 -0
  351. package/src/error/provider.ts +63 -0
  352. package/src/error/rate-limit.ts +303 -0
  353. package/src/error/retryable.ts +70 -0
  354. package/src/error/validation.ts +44 -0
  355. package/src/index.ts +51 -0
  356. package/src/provider-details.ts +90 -0
  357. package/src/providers/amazon-bedrock.ts +1064 -0
  358. package/src/providers/anthropic-client.ts +317 -0
  359. package/src/providers/anthropic-messages-server-schema.ts +252 -0
  360. package/src/providers/anthropic-messages-server.ts +818 -0
  361. package/src/providers/anthropic-wire.ts +359 -0
  362. package/src/providers/anthropic.ts +4539 -0
  363. package/src/providers/aws-credentials.ts +772 -0
  364. package/src/providers/aws-eventstream.ts +181 -0
  365. package/src/providers/aws-sigv4.ts +218 -0
  366. package/src/providers/azure-openai-responses.ts +438 -0
  367. package/src/providers/bedrock-mantle.ts +110 -0
  368. package/src/providers/claude-code-fingerprint.ts +20 -0
  369. package/src/providers/cowork-fetch.ts +201 -0
  370. package/src/providers/cursor/exec-modern.ts +496 -0
  371. package/src/providers/cursor/proto/agent.proto +4533 -0
  372. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  373. package/src/providers/cursor/proto/buf.yaml +17 -0
  374. package/src/providers/cursor-pi-args.ts +165 -0
  375. package/src/providers/cursor.ts +4689 -0
  376. package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
  377. package/src/providers/devin/proto/buf.gen.yaml +33 -0
  378. package/src/providers/devin/proto/buf.yaml +17 -0
  379. package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
  380. package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
  381. package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
  382. package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
  383. package/src/providers/devin/proto/cel/expr/value.proto +41 -0
  384. package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
  385. package/src/providers/devin/proto/errorspb/errors.proto +56 -0
  386. package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
  387. package/src/providers/devin/proto/errorspb/markers.proto +10 -0
  388. package/src/providers/devin/proto/errorspb/tags.proto +12 -0
  389. package/src/providers/devin/proto/errorspb/testing.proto +6 -0
  390. package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
  391. package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
  392. package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
  393. package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
  394. package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
  395. package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
  396. package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
  397. package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
  398. package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
  399. package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
  400. package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
  401. package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
  402. package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
  403. package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
  404. package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
  405. package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
  406. package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
  407. package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
  408. package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
  409. package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
  410. package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
  411. package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
  412. package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
  413. package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
  414. package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
  415. package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
  416. package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
  417. package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
  418. package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
  419. package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
  420. package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
  421. package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
  422. package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
  423. package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
  424. package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
  425. package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
  426. package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
  427. package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
  428. package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
  429. package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
  430. package/src/providers/devin.ts +679 -0
  431. package/src/providers/error-message.ts +23 -0
  432. package/src/providers/github-copilot-headers.ts +141 -0
  433. package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
  434. package/src/providers/gitlab-duo-workflow.ts +3135 -0
  435. package/src/providers/gitlab-duo.ts +399 -0
  436. package/src/providers/google-auth.ts +330 -0
  437. package/src/providers/google-gemini-cli.ts +1370 -0
  438. package/src/providers/google-shared.ts +1122 -0
  439. package/src/providers/google-types.ts +180 -0
  440. package/src/providers/google-vertex.ts +135 -0
  441. package/src/providers/google.ts +47 -0
  442. package/src/providers/grammar.ts +70 -0
  443. package/src/providers/kimi.ts +51 -0
  444. package/src/providers/mock.ts +514 -0
  445. package/src/providers/ollama.ts +776 -0
  446. package/src/providers/openai-anthropic-shim.ts +166 -0
  447. package/src/providers/openai-chat-server-schema.ts +243 -0
  448. package/src/providers/openai-chat-server.ts +752 -0
  449. package/src/providers/openai-chat-wire.ts +859 -0
  450. package/src/providers/openai-codex/request-transformer.ts +491 -0
  451. package/src/providers/openai-codex/response-handler.ts +102 -0
  452. package/src/providers/openai-codex-responses.ts +4716 -0
  453. package/src/providers/openai-completions.ts +2389 -0
  454. package/src/providers/openai-reasoning-fallback.ts +269 -0
  455. package/src/providers/openai-responses-server-schema.ts +397 -0
  456. package/src/providers/openai-responses-server.ts +1466 -0
  457. package/src/providers/openai-responses-wire.ts +6416 -0
  458. package/src/providers/openai-responses.ts +1393 -0
  459. package/src/providers/openai-shared.ts +3500 -0
  460. package/src/providers/pi-native-client.ts +275 -0
  461. package/src/providers/pi-native-server.ts +245 -0
  462. package/src/providers/register-builtins.ts +503 -0
  463. package/src/providers/synthetic.ts +50 -0
  464. package/src/providers/transform-messages.ts +1083 -0
  465. package/src/providers/vision-guard.ts +54 -0
  466. package/src/registry/aiand.ts +22 -0
  467. package/src/registry/aimlapi.ts +6 -0
  468. package/src/registry/alibaba-coding-plan.ts +104 -0
  469. package/src/registry/alibaba-token-plan.ts +125 -0
  470. package/src/registry/amazon-bedrock.ts +22 -0
  471. package/src/registry/anthropic.ts +26 -0
  472. package/src/registry/api-key-login.ts +115 -0
  473. package/src/registry/api-key-validation.ts +145 -0
  474. package/src/registry/aws.ts +57 -0
  475. package/src/registry/azure.ts +6 -0
  476. package/src/registry/baseten.ts +22 -0
  477. package/src/registry/bedrock-mantle.ts +34 -0
  478. package/src/registry/cerebras.ts +23 -0
  479. package/src/registry/cloudflare-ai-gateway.ts +45 -0
  480. package/src/registry/coreweave.ts +40 -0
  481. package/src/registry/cursor.ts +20 -0
  482. package/src/registry/deepseek.ts +46 -0
  483. package/src/registry/derived.ts +9 -0
  484. package/src/registry/devin.ts +15 -0
  485. package/src/registry/exa.ts +19 -0
  486. package/src/registry/firepass.ts +32 -0
  487. package/src/registry/fireworks.ts +28 -0
  488. package/src/registry/github-copilot.ts +22 -0
  489. package/src/registry/gitlab-duo-workflow.ts +20 -0
  490. package/src/registry/gitlab-duo.ts +19 -0
  491. package/src/registry/gmi-cloud.ts +22 -0
  492. package/src/registry/google-antigravity.ts +22 -0
  493. package/src/registry/google-gemini-cli.ts +22 -0
  494. package/src/registry/google-vertex.ts +38 -0
  495. package/src/registry/google.ts +6 -0
  496. package/src/registry/groq.ts +6 -0
  497. package/src/registry/huggingface.ts +29 -0
  498. package/src/registry/index.ts +4 -0
  499. package/src/registry/kagi.ts +46 -0
  500. package/src/registry/kilo.ts +114 -0
  501. package/src/registry/kimi-code.ts +17 -0
  502. package/src/registry/litellm.ts +45 -0
  503. package/src/registry/llama-cpp.ts +35 -0
  504. package/src/registry/lm-studio.ts +31 -0
  505. package/src/registry/meta.ts +22 -0
  506. package/src/registry/minimax-code-cn.ts +12 -0
  507. package/src/registry/minimax-code.ts +12 -0
  508. package/src/registry/minimax.ts +6 -0
  509. package/src/registry/mistral.ts +6 -0
  510. package/src/registry/moonshot.ts +28 -0
  511. package/src/registry/nanogpt.ts +22 -0
  512. package/src/registry/novita.ts +25 -0
  513. package/src/registry/nvidia.ts +61 -0
  514. package/src/registry/oauth/anthropic-constants.ts +12 -0
  515. package/src/registry/oauth/anthropic.ts +346 -0
  516. package/src/registry/oauth/callback-server.ts +438 -0
  517. package/src/registry/oauth/cursor.ts +187 -0
  518. package/src/registry/oauth/device-code.ts +92 -0
  519. package/src/registry/oauth/devin.ts +124 -0
  520. package/src/registry/oauth/github-copilot.ts +369 -0
  521. package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
  522. package/src/registry/oauth/gitlab-duo.ts +222 -0
  523. package/src/registry/oauth/google-antigravity.ts +225 -0
  524. package/src/registry/oauth/google-gemini-cli.ts +297 -0
  525. package/src/registry/oauth/google-oauth-shared.ts +211 -0
  526. package/src/registry/oauth/index.ts +187 -0
  527. package/src/registry/oauth/kimi.ts +297 -0
  528. package/src/registry/oauth/minimax-code.ts +53 -0
  529. package/src/registry/oauth/oauth.html +317 -0
  530. package/src/registry/oauth/openai-codex.ts +384 -0
  531. package/src/registry/oauth/opencode.ts +50 -0
  532. package/src/registry/oauth/perplexity.ts +228 -0
  533. package/src/registry/oauth/pkce.ts +18 -0
  534. package/src/registry/oauth/types.ts +96 -0
  535. package/src/registry/oauth/wafer.ts +24 -0
  536. package/src/registry/oauth/xai-oauth.ts +559 -0
  537. package/src/registry/oauth/xiaomi.ts +211 -0
  538. package/src/registry/oauth/zai.ts +285 -0
  539. package/src/registry/ollama-cloud.ts +36 -0
  540. package/src/registry/ollama.ts +43 -0
  541. package/src/registry/openai-codex-device.ts +18 -0
  542. package/src/registry/openai-codex.ts +19 -0
  543. package/src/registry/openai.ts +6 -0
  544. package/src/registry/opencode-go.ts +12 -0
  545. package/src/registry/opencode-zen.ts +12 -0
  546. package/src/registry/openrouter.ts +28 -0
  547. package/src/registry/parallel.ts +45 -0
  548. package/src/registry/perplexity.ts +13 -0
  549. package/src/registry/qianfan.ts +27 -0
  550. package/src/registry/qwen-portal.ts +50 -0
  551. package/src/registry/registry.ts +182 -0
  552. package/src/registry/sakana.ts +22 -0
  553. package/src/registry/siliconflow-cn.ts +22 -0
  554. package/src/registry/siliconflow.ts +22 -0
  555. package/src/registry/synthetic.ts +21 -0
  556. package/src/registry/tavily.ts +45 -0
  557. package/src/registry/together.ts +22 -0
  558. package/src/registry/types.ts +86 -0
  559. package/src/registry/umans.ts +23 -0
  560. package/src/registry/venice.ts +33 -0
  561. package/src/registry/vercel-ai-gateway.ts +38 -0
  562. package/src/registry/vllm.ts +34 -0
  563. package/src/registry/wafer-serverless.ts +12 -0
  564. package/src/registry/xai-oauth.ts +17 -0
  565. package/src/registry/xai.ts +22 -0
  566. package/src/registry/xiaomi-token-plan-ams.ts +12 -0
  567. package/src/registry/xiaomi-token-plan-cn.ts +12 -0
  568. package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
  569. package/src/registry/xiaomi.ts +12 -0
  570. package/src/registry/zai.ts +41 -0
  571. package/src/registry/zenmux.ts +22 -0
  572. package/src/registry/zhipu-coding-plan.ts +27 -0
  573. package/src/stream.ts +1944 -0
  574. package/src/types.ts +1243 -0
  575. package/src/usage/alibaba-token-plan.ts +230 -0
  576. package/src/usage/claude.ts +830 -0
  577. package/src/usage/cursor.ts +335 -0
  578. package/src/usage/gemini.ts +258 -0
  579. package/src/usage/github-copilot.ts +424 -0
  580. package/src/usage/google-antigravity.ts +497 -0
  581. package/src/usage/kimi.ts +277 -0
  582. package/src/usage/minimax-code.ts +291 -0
  583. package/src/usage/ollama.ts +41 -0
  584. package/src/usage/openai-codex-base-url.ts +35 -0
  585. package/src/usage/openai-codex-reset.ts +205 -0
  586. package/src/usage/openai-codex.ts +627 -0
  587. package/src/usage/opencode-go.ts +89 -0
  588. package/src/usage/shared.ts +10 -0
  589. package/src/usage/synthetic.ts +180 -0
  590. package/src/usage/umans.ts +192 -0
  591. package/src/usage/xai-oauth.ts +414 -0
  592. package/src/usage/zai.ts +370 -0
  593. package/src/usage.ts +411 -0
  594. package/src/utils/abort.ts +67 -0
  595. package/src/utils/anthropic-auth.ts +93 -0
  596. package/src/utils/aws-profile.ts +88 -0
  597. package/src/utils/block-symbols.ts +78 -0
  598. package/src/utils/deterministic-id.ts +20 -0
  599. package/src/utils/empty-completion-retry.ts +161 -0
  600. package/src/utils/event-stream.ts +202 -0
  601. package/src/utils/foundry.ts +8 -0
  602. package/src/utils/google-validation.ts +25 -0
  603. package/src/utils/harmony-leak.ts +500 -0
  604. package/src/utils/http-inspector.ts +196 -0
  605. package/src/utils/idle-iterator.ts +531 -0
  606. package/src/utils/leaked-thinking-stream.ts +483 -0
  607. package/src/utils/openai-http.ts +119 -0
  608. package/src/utils/openrouter-headers.ts +12 -0
  609. package/src/utils/parse-bind.ts +56 -0
  610. package/src/utils/provider-response.ts +30 -0
  611. package/src/utils/proxy.ts +314 -0
  612. package/src/utils/request-debug.ts +351 -0
  613. package/src/utils/retry-after.ts +121 -0
  614. package/src/utils/retry.ts +77 -0
  615. package/src/utils/schema/CONSTRAINTS.md +168 -0
  616. package/src/utils/schema/adapt.ts +36 -0
  617. package/src/utils/schema/compatibility.ts +435 -0
  618. package/src/utils/schema/dereference.ts +98 -0
  619. package/src/utils/schema/draft.ts +341 -0
  620. package/src/utils/schema/equality.ts +97 -0
  621. package/src/utils/schema/fields.ts +210 -0
  622. package/src/utils/schema/index.ts +14 -0
  623. package/src/utils/schema/json-schema-validator.ts +595 -0
  624. package/src/utils/schema/meta-validator.ts +167 -0
  625. package/src/utils/schema/normalize.ts +2314 -0
  626. package/src/utils/schema/spill.ts +43 -0
  627. package/src/utils/schema/stamps.ts +109 -0
  628. package/src/utils/schema/strict-tool-validation.ts +117 -0
  629. package/src/utils/schema/types.ts +10 -0
  630. package/src/utils/schema/typescript.ts +212 -0
  631. package/src/utils/schema/wire.ts +662 -0
  632. package/src/utils/sdk-stream-timeout.ts +43 -0
  633. package/src/utils/sse-debug.ts +18 -0
  634. package/src/utils/stream-markup-healing.ts +247 -0
  635. package/src/utils/thinking-loop.ts +552 -0
  636. package/src/utils/tool-call-loop-guard.ts +107 -0
  637. package/src/utils/tool-choice.ts +101 -0
  638. package/src/utils/validation.ts +1932 -0
  639. package/src/utils.ts +492 -0
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Gemini CLI OAuth flow (Google Cloud Code Assist)
3
+ * Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)
4
+ */
5
+
6
+ import { getGeminiCliHeaders } from "@linxiraos/pi-catalog/wire/gemini-headers";
7
+ import { $env } from "@linxiraos/pi-utils";
8
+ import * as AIError from "../../error";
9
+ import { oauthFetch, runGoogleOAuthLogin, throwIfLoginCancelled } from "./google-oauth-shared";
10
+ import type { OAuthController, OAuthCredentials } from "./types";
11
+
12
+ const decode = (s: string) => atob(s);
13
+ const CLIENT_ID = decode(
14
+ "NjgxMjU1ODA5Mzk1LW9vOGZ0Mm9wcmRybnA5ZTNhcWY2YXYzaG1kaWIxMzVqLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29t",
15
+ );
16
+ const CLIENT_SECRET = decode("R09DU1BYLTR1SGdNUG0tMW83U2stZ2VWNkN1NWNsWEZzeGw=");
17
+ const CALLBACK_PORT = 8085;
18
+ const CALLBACK_PATH = "/oauth2callback";
19
+ const SCOPES = [
20
+ "https://www.googleapis.com/auth/cloud-platform",
21
+ "https://www.googleapis.com/auth/userinfo.email",
22
+ "https://www.googleapis.com/auth/userinfo.profile",
23
+ ];
24
+ const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
25
+ const TOKEN_URL = "https://oauth2.googleapis.com/token";
26
+ const CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
27
+
28
+ interface LoadCodeAssistPayload {
29
+ cloudaicompanionProject?: string;
30
+ currentTier?: { id?: string };
31
+ allowedTiers?: Array<{ id?: string; isDefault?: boolean }>;
32
+ }
33
+
34
+ interface LongRunningOperationResponse {
35
+ name?: string;
36
+ done?: boolean;
37
+ response?: {
38
+ cloudaicompanionProject?: { id?: string };
39
+ };
40
+ }
41
+
42
+ const TIER_FREE = "free-tier";
43
+ const TIER_LEGACY = "legacy-tier";
44
+ const TIER_STANDARD = "standard-tier";
45
+
46
+ interface GoogleRpcErrorResponse {
47
+ error?: {
48
+ details?: Array<{ reason?: string }>;
49
+ };
50
+ }
51
+
52
+ function getDefaultTier(allowedTiers?: Array<{ id?: string; isDefault?: boolean }>): { id?: string } {
53
+ if (!allowedTiers || allowedTiers.length === 0) return { id: TIER_LEGACY };
54
+ const defaultTier = allowedTiers.find(t => t.isDefault);
55
+ return defaultTier ?? { id: TIER_LEGACY };
56
+ }
57
+
58
+ function isVpcScAffectedUser(payload: unknown): boolean {
59
+ if (!payload || typeof payload !== "object") return false;
60
+ if (!("error" in payload)) return false;
61
+ const error = (payload as GoogleRpcErrorResponse).error;
62
+ if (!error?.details || !Array.isArray(error.details)) return false;
63
+ return error.details.some(detail => detail.reason === "SECURITY_POLICY_VIOLATED");
64
+ }
65
+
66
+ /**
67
+ * LRO poll cadence and bound. Cloud Code Assist project provisioning normally
68
+ * completes within a handful of polls; the attempt cap converts a stuck
69
+ * `done: false` operation (or a service incident) into a bounded login error
70
+ * instead of the previous unbounded loop.
71
+ */
72
+ const POLL_INTERVAL_MS = 5000;
73
+ export const POLL_MAX_ATTEMPTS = 24;
74
+
75
+ export async function pollOperation(
76
+ operationName: string,
77
+ headers: Record<string, string>,
78
+ signal: AbortSignal | undefined,
79
+ onProgress?: (message: string) => void,
80
+ ): Promise<LongRunningOperationResponse> {
81
+ for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt += 1) {
82
+ if (attempt > 0) {
83
+ onProgress?.(`Waiting for project provisioning (attempt ${attempt + 1}/${POLL_MAX_ATTEMPTS})...`);
84
+ throwIfLoginCancelled(signal);
85
+ await Bun.sleep(POLL_INTERVAL_MS);
86
+ }
87
+
88
+ throwIfLoginCancelled(signal);
89
+ const response = await oauthFetch(
90
+ `${CODE_ASSIST_ENDPOINT}/v1internal/${operationName}`,
91
+ { method: "GET", headers },
92
+ { provider: "google-gemini-cli", signal },
93
+ );
94
+
95
+ if (!response.ok) {
96
+ throw new AIError.OAuthError(`Failed to poll operation: ${response.status} ${response.statusText}`, {
97
+ kind: "polling",
98
+ provider: "google-gemini-cli",
99
+ status: response.status,
100
+ });
101
+ }
102
+
103
+ const data = (await response.json()) as LongRunningOperationResponse;
104
+ if (data.done) {
105
+ return data;
106
+ }
107
+ }
108
+
109
+ throw new AIError.OAuthError(`Project provisioning did not complete after ${POLL_MAX_ATTEMPTS} attempts`, {
110
+ kind: "timeout",
111
+ provider: "google-gemini-cli",
112
+ });
113
+ }
114
+
115
+ async function discoverProject(
116
+ accessToken: string,
117
+ onProgress?: (message: string) => void,
118
+ signal?: AbortSignal,
119
+ ): Promise<string> {
120
+ const envProjectId = $env.GOOGLE_CLOUD_PROJECT || $env.GOOGLE_CLOUD_PROJECT_ID;
121
+
122
+ const headers = {
123
+ Authorization: `Bearer ${accessToken}`,
124
+ "Content-Type": "application/json",
125
+ ...getGeminiCliHeaders(),
126
+ };
127
+
128
+ onProgress?.("Checking for existing Cloud Code Assist project...");
129
+ const loadResponse = await oauthFetch(
130
+ `${CODE_ASSIST_ENDPOINT}/v1internal:loadCodeAssist`,
131
+ {
132
+ method: "POST",
133
+ headers,
134
+ body: JSON.stringify({
135
+ cloudaicompanionProject: envProjectId,
136
+ metadata: {
137
+ ideType: "IDE_UNSPECIFIED",
138
+ platform: "PLATFORM_UNSPECIFIED",
139
+ pluginType: "GEMINI",
140
+ duetProject: envProjectId,
141
+ },
142
+ }),
143
+ },
144
+ { provider: "google-gemini-cli", signal },
145
+ );
146
+
147
+ let data: LoadCodeAssistPayload;
148
+
149
+ if (!loadResponse.ok) {
150
+ let errorPayload: unknown;
151
+ try {
152
+ errorPayload = await loadResponse.clone().json();
153
+ } catch {
154
+ errorPayload = undefined;
155
+ }
156
+
157
+ if (isVpcScAffectedUser(errorPayload)) {
158
+ data = { currentTier: { id: TIER_STANDARD } };
159
+ } else {
160
+ const errorText = await loadResponse.text();
161
+ throw new AIError.OAuthError(
162
+ `loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`,
163
+ { kind: "discovery", provider: "google-gemini-cli", status: loadResponse.status },
164
+ );
165
+ }
166
+ } else {
167
+ data = (await loadResponse.json()) as LoadCodeAssistPayload;
168
+ }
169
+
170
+ if (data.currentTier) {
171
+ if (data.cloudaicompanionProject) {
172
+ return data.cloudaicompanionProject;
173
+ }
174
+ if (envProjectId) {
175
+ return envProjectId;
176
+ }
177
+ throw new AIError.OAuthError(
178
+ "This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
179
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
180
+ { kind: "configuration", provider: "google-gemini-cli" },
181
+ );
182
+ }
183
+
184
+ const tier = getDefaultTier(data.allowedTiers);
185
+ const tierId = tier?.id ?? TIER_FREE;
186
+
187
+ if (tierId !== TIER_FREE && !envProjectId) {
188
+ throw new AIError.OAuthError(
189
+ "This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
190
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
191
+ { kind: "configuration", provider: "google-gemini-cli" },
192
+ );
193
+ }
194
+
195
+ onProgress?.("Provisioning Cloud Code Assist project (this may take a moment)...");
196
+
197
+ const onboardBody: Record<string, unknown> = {
198
+ tierId,
199
+ metadata: {
200
+ ideType: "IDE_UNSPECIFIED",
201
+ platform: "PLATFORM_UNSPECIFIED",
202
+ pluginType: "GEMINI",
203
+ },
204
+ };
205
+
206
+ if (tierId !== TIER_FREE && envProjectId) {
207
+ onboardBody.cloudaicompanionProject = envProjectId;
208
+ (onboardBody.metadata as Record<string, unknown>).duetProject = envProjectId;
209
+ }
210
+
211
+ const onboardResponse = await oauthFetch(
212
+ `${CODE_ASSIST_ENDPOINT}/v1internal:onboardUser`,
213
+ { method: "POST", headers, body: JSON.stringify(onboardBody) },
214
+ { provider: "google-gemini-cli", signal },
215
+ );
216
+
217
+ if (!onboardResponse.ok) {
218
+ const errorText = await onboardResponse.text();
219
+ throw new AIError.OAuthError(
220
+ `onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`,
221
+ { kind: "provisioning", provider: "google-gemini-cli", status: onboardResponse.status },
222
+ );
223
+ }
224
+
225
+ let lroData = (await onboardResponse.json()) as LongRunningOperationResponse;
226
+
227
+ if (!lroData.done && lroData.name) {
228
+ lroData = await pollOperation(lroData.name, headers, signal, onProgress);
229
+ }
230
+
231
+ const projectId = lroData.response?.cloudaicompanionProject?.id;
232
+ if (projectId) {
233
+ return projectId;
234
+ }
235
+
236
+ if (envProjectId) {
237
+ return envProjectId;
238
+ }
239
+
240
+ throw new AIError.OAuthError(
241
+ "Could not discover or provision a Google Cloud project. " +
242
+ "Try setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
243
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
244
+ { kind: "validation", provider: "google-gemini-cli" },
245
+ );
246
+ }
247
+
248
+ export async function loginGeminiCli(ctrl: OAuthController): Promise<OAuthCredentials> {
249
+ return runGoogleOAuthLogin(ctrl, {
250
+ provider: "google-gemini-cli",
251
+ clientId: CLIENT_ID,
252
+ clientSecret: CLIENT_SECRET,
253
+ authUrl: AUTH_URL,
254
+ tokenUrl: TOKEN_URL,
255
+ scopes: SCOPES,
256
+ callbackPort: CALLBACK_PORT,
257
+ callbackPath: CALLBACK_PATH,
258
+ discoverProject,
259
+ });
260
+ }
261
+
262
+ /**
263
+ * Refresh Google Cloud Code Assist token
264
+ */
265
+ export async function refreshGoogleCloudToken(refreshToken: string, projectId: string): Promise<OAuthCredentials> {
266
+ const response = await fetch(TOKEN_URL, {
267
+ method: "POST",
268
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
269
+ body: new URLSearchParams({
270
+ client_id: CLIENT_ID,
271
+ client_secret: CLIENT_SECRET,
272
+ refresh_token: refreshToken,
273
+ grant_type: "refresh_token",
274
+ }),
275
+ });
276
+
277
+ if (!response.ok) {
278
+ const error = await response.text();
279
+ throw new AIError.OAuthError(`Google Cloud token refresh failed: ${error}`, {
280
+ kind: "token-refresh",
281
+ provider: "google-gemini-cli",
282
+ });
283
+ }
284
+
285
+ const data = (await response.json()) as {
286
+ access_token: string;
287
+ expires_in: number;
288
+ refresh_token?: string;
289
+ };
290
+
291
+ return {
292
+ refresh: data.refresh_token || refreshToken,
293
+ access: data.access_token,
294
+ expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
295
+ projectId,
296
+ };
297
+ }
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Shared OAuth flow for Google-style providers (Gemini CLI, Antigravity).
3
+ *
4
+ * Both providers use the same authorization-code flow shape; only the client
5
+ * credentials, scopes, endpoint constants, and project-discovery logic differ.
6
+ */
7
+ import * as AIError from "../../error";
8
+ import { extractGoogleValidationUrl, formatGoogleValidationRequiredMessage } from "../../utils/google-validation";
9
+ import { OAuthCallbackFlow } from "./callback-server";
10
+ import type { OAuthController, OAuthCredentials } from "./types";
11
+
12
+ /**
13
+ * Per-request timeout for the post-callback provisioning phase (token exchange,
14
+ * user-info, project discovery/onboarding, LRO polling). These Cloud Code
15
+ * Assist calls normally settle in well under this window; a longer stall means
16
+ * a hung endpoint that must surface a login error instead of hanging forever.
17
+ * The callback server's own 300s deadline covers only the browser-callback wait
18
+ * ({@link OAuthCallbackFlow}) and does not gate this phase.
19
+ */
20
+ export const OAUTH_REQUEST_TIMEOUT_MS = 30_000;
21
+
22
+ /** Options for {@link oauthFetch}. */
23
+ export interface OAuthFetchOptions {
24
+ /** Provider id recorded on any {@link AIError.OAuthError} raised. */
25
+ provider: string;
26
+ /** Controller signal; when it aborts, the in-flight request is cancelled. */
27
+ signal?: AbortSignal;
28
+ /** Override the per-request timeout (defaults to {@link OAUTH_REQUEST_TIMEOUT_MS}). */
29
+ timeoutMs?: number;
30
+ }
31
+
32
+ /**
33
+ * Throw {@link AIError.LoginCancelledError} when the controller signal has
34
+ * already aborted. Gates each provisioning round-trip, which the callback-wait
35
+ * cancellation checks in {@link OAuthCallbackFlow} do not reach.
36
+ */
37
+ export function throwIfLoginCancelled(signal: AbortSignal | undefined): void {
38
+ if (signal?.aborted) {
39
+ throw new AIError.LoginCancelledError(`OAuth login cancelled: ${String(signal.reason)}`);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * `fetch` for the provisioning phase: composes the controller signal with a
45
+ * per-request timeout so a stalled endpoint aborts instead of hanging login,
46
+ * and user cancellation aborts the in-flight request. Cancellation surfaces as
47
+ * {@link AIError.LoginCancelledError}; a timeout surfaces as an
48
+ * {@link AIError.OAuthError} with `kind: "timeout"`.
49
+ */
50
+ export async function oauthFetch(
51
+ url: string,
52
+ init: RequestInit,
53
+ { provider, signal, timeoutMs = OAUTH_REQUEST_TIMEOUT_MS }: OAuthFetchOptions,
54
+ ): Promise<Response> {
55
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
56
+ const requestSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
57
+ try {
58
+ return await fetch(url, { ...init, signal: requestSignal });
59
+ } catch (err) {
60
+ if (signal?.aborted) {
61
+ throw new AIError.LoginCancelledError(`OAuth login cancelled: ${String(signal.reason)}`);
62
+ }
63
+ if (timeoutSignal.aborted) {
64
+ throw new AIError.OAuthError(`Timed out after ${timeoutMs}ms waiting for ${url}`, {
65
+ kind: "timeout",
66
+ provider,
67
+ });
68
+ }
69
+ throw err;
70
+ }
71
+ }
72
+
73
+ export interface GoogleOAuthFlowConfig {
74
+ /** Provider id used in progress/error reporting and per-request fetches. */
75
+ provider: string;
76
+ clientId: string;
77
+ clientSecret: string;
78
+ authUrl: string;
79
+ tokenUrl: string;
80
+ scopes: string[];
81
+ callbackPort: number;
82
+ callbackPath: string;
83
+ discoverProject: (
84
+ accessToken: string,
85
+ onProgress?: (message: string) => void,
86
+ signal?: AbortSignal,
87
+ ) => Promise<string>;
88
+ }
89
+
90
+ async function getUserEmail(
91
+ accessToken: string,
92
+ provider: string,
93
+ signal: AbortSignal | undefined,
94
+ ): Promise<string | undefined> {
95
+ try {
96
+ const response = await oauthFetch(
97
+ "https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
98
+ { headers: { Authorization: `Bearer ${accessToken}` } },
99
+ { provider, signal },
100
+ );
101
+
102
+ if (response.ok) {
103
+ const data = (await response.json()) as { email?: string };
104
+ return data.email;
105
+ }
106
+ } catch {
107
+ // Ignore errors, email is optional; the caller re-checks cancellation.
108
+ }
109
+ return undefined;
110
+ }
111
+
112
+ export class GoogleOAuthFlow extends OAuthCallbackFlow {
113
+ private readonly config: GoogleOAuthFlowConfig;
114
+
115
+ constructor(ctrl: OAuthController, config: GoogleOAuthFlowConfig) {
116
+ super(ctrl, {
117
+ preferredPort: config.callbackPort,
118
+ callbackPath: config.callbackPath,
119
+ callbackHostname: "127.0.0.1",
120
+ });
121
+ this.config = config;
122
+ }
123
+
124
+ async generateAuthUrl(state: string, redirectUri: string): Promise<{ url: string; instructions?: string }> {
125
+ const authParams = new URLSearchParams({
126
+ client_id: this.config.clientId,
127
+ response_type: "code",
128
+ redirect_uri: redirectUri,
129
+ scope: this.config.scopes.join(" "),
130
+ state,
131
+ access_type: "offline",
132
+ prompt: "consent",
133
+ });
134
+
135
+ const url = `${this.config.authUrl}?${authParams.toString()}`;
136
+ return { url, instructions: "Complete the sign-in in your browser." };
137
+ }
138
+
139
+ async exchangeToken(code: string, _state: string, redirectUri: string): Promise<OAuthCredentials> {
140
+ const { provider } = this.config;
141
+ const signal = this.ctrl.signal;
142
+ throwIfLoginCancelled(signal);
143
+ this.ctrl.onProgress?.("Exchanging authorization code for tokens...");
144
+
145
+ const tokenResponse = await oauthFetch(
146
+ this.config.tokenUrl,
147
+ {
148
+ method: "POST",
149
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
150
+ body: new URLSearchParams({
151
+ client_id: this.config.clientId,
152
+ client_secret: this.config.clientSecret,
153
+ code,
154
+ grant_type: "authorization_code",
155
+ redirect_uri: redirectUri,
156
+ }),
157
+ },
158
+ { provider, signal },
159
+ );
160
+
161
+ if (!tokenResponse.ok) {
162
+ const error = await tokenResponse.text();
163
+ throw new AIError.OAuthError(`Token exchange failed: ${error}`, { kind: "token-exchange", provider });
164
+ }
165
+
166
+ const tokenData = (await tokenResponse.json()) as {
167
+ access_token: string;
168
+ refresh_token: string;
169
+ expires_in: number;
170
+ };
171
+
172
+ if (!tokenData.refresh_token) {
173
+ throw new AIError.OAuthError("No refresh token received. Please try again.", {
174
+ kind: "validation",
175
+ provider,
176
+ });
177
+ }
178
+
179
+ throwIfLoginCancelled(signal);
180
+ this.ctrl.onProgress?.("Getting user info...");
181
+ const email = await getUserEmail(tokenData.access_token, provider, signal);
182
+ throwIfLoginCancelled(signal);
183
+ let projectId: string;
184
+ try {
185
+ projectId = await this.config.discoverProject(tokenData.access_token, this.ctrl.onProgress, signal);
186
+ } catch (err) {
187
+ const validationUrl = extractGoogleValidationUrl(err instanceof Error ? err.message : String(err));
188
+ if (!validationUrl) throw err;
189
+ throw new AIError.OAuthError(formatGoogleValidationRequiredMessage(validationUrl, "sign in again", email), {
190
+ kind: "validation",
191
+ provider,
192
+ });
193
+ }
194
+
195
+ return {
196
+ refresh: tokenData.refresh_token,
197
+ access: tokenData.access_token,
198
+ expires: Date.now() + tokenData.expires_in * 1000 - 5 * 60 * 1000,
199
+ projectId,
200
+ email,
201
+ };
202
+ }
203
+ }
204
+
205
+ export async function runGoogleOAuthLogin(
206
+ ctrl: OAuthController,
207
+ config: GoogleOAuthFlowConfig,
208
+ ): Promise<OAuthCredentials> {
209
+ const flow = new GoogleOAuthFlow(ctrl, config);
210
+ return flow.login();
211
+ }
@@ -0,0 +1,187 @@
1
+ // ============================================================================
2
+ // High-level API
3
+ // ============================================================================
4
+
5
+ import * as AIError from "../../error";
6
+ import { getProviderDefinition, PROVIDER_REGISTRY } from "../registry";
7
+ import type {
8
+ OAuthCredentials,
9
+ OAuthProvider,
10
+ OAuthProviderId,
11
+ OAuthProviderInfo,
12
+ OAuthProviderInterface,
13
+ } from "./types";
14
+
15
+ export * from "./anthropic";
16
+ export * from "./device-code";
17
+ export type * from "./types";
18
+
19
+ const builtInOAuthProviders: OAuthProviderInfo[] = PROVIDER_REGISTRY.filter(
20
+ provider => provider.login && provider.showInLoginList !== false,
21
+ ).map(provider => ({
22
+ id: provider.id,
23
+ name: provider.name,
24
+ available: provider.available ?? true,
25
+ storeCredentialsAs: provider.storeCredentialsAs,
26
+ }));
27
+
28
+ const customOAuthProviders = new Map<string, OAuthProviderInterface>();
29
+
30
+ /**
31
+ * Register a custom OAuth provider.
32
+ */
33
+ export function registerOAuthProvider(provider: OAuthProviderInterface): void {
34
+ customOAuthProviders.set(provider.id, provider);
35
+ }
36
+
37
+ /**
38
+ * Remove a custom OAuth provider by ID.
39
+ */
40
+ export function unregisterOAuthProvider(id: string): void {
41
+ customOAuthProviders.delete(id);
42
+ }
43
+
44
+ /**
45
+ * Get a custom OAuth provider by ID.
46
+ */
47
+ export function getOAuthProvider(id: OAuthProviderId): OAuthProviderInterface | undefined {
48
+ return customOAuthProviders.get(id);
49
+ }
50
+
51
+ /**
52
+ * Remove all custom OAuth providers registered by a source.
53
+ */
54
+ export function unregisterOAuthProviders(sourceId: string): void {
55
+ for (const [id, provider] of customOAuthProviders.entries()) {
56
+ if (provider.sourceId === sourceId) {
57
+ customOAuthProviders.delete(id);
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Refresh token for any OAuth provider.
64
+ * Saves the new credentials and returns the new access token.
65
+ */
66
+ export async function refreshOAuthToken(
67
+ provider: OAuthProvider,
68
+ credentials: OAuthCredentials,
69
+ ): Promise<OAuthCredentials> {
70
+ if (!credentials) {
71
+ throw new AIError.OAuthError(`No OAuth credentials found for ${provider}`, {
72
+ kind: "validation",
73
+ provider,
74
+ });
75
+ }
76
+ const def = getProviderDefinition(provider);
77
+ if (!def?.login) {
78
+ throw new AIError.OAuthError(`Unknown OAuth provider: ${provider}`, {
79
+ kind: "validation",
80
+ provider,
81
+ });
82
+ }
83
+ // Providers without a real refresher (static bearer tokens / API keys that
84
+ // don't expire) return the credentials unchanged.
85
+ return def.refreshToken ? def.refreshToken(credentials) : credentials;
86
+ }
87
+ function getPerplexityJwtExpiryMs(token: string): number | undefined {
88
+ const parts = token.split(".");
89
+ if (parts.length !== 3) return undefined;
90
+ const payload = parts[1];
91
+ if (!payload) return undefined;
92
+ try {
93
+ const decoded = JSON.parse(Buffer.from(payload, "base64url").toString("utf8")) as { exp?: unknown };
94
+ if (typeof decoded.exp !== "number" || !Number.isFinite(decoded.exp)) return undefined;
95
+ return decoded.exp * 1000 - 5 * 60_000;
96
+ } catch {
97
+ return undefined;
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Build API-key bytes for a provider from an already-fresh OAuth credential.
103
+ *
104
+ * Refresh is owned by AuthStorage. This helper deliberately refuses expired
105
+ * credentials so it cannot POST broker redaction sentinels to upstream token
106
+ * endpoints as a side channel.
107
+ *
108
+ * For providers that need credential metadata at request time, returns
109
+ * JSON-encoded credentials plus expiry metadata for diagnostics/edge guards.
110
+ * @returns API key string, or null if no credentials
111
+ * @throws Error if the credential is expired and must be refreshed upstream
112
+ */
113
+ export async function getOAuthApiKey(
114
+ provider: OAuthProvider,
115
+ credentials: Record<string, OAuthCredentials>,
116
+ ): Promise<{ newCredentials: OAuthCredentials; apiKey: string } | null> {
117
+ let creds = credentials[provider];
118
+ if (!creds) {
119
+ return null;
120
+ }
121
+
122
+ if (provider === "perplexity") {
123
+ // Perplexity JWTs usually omit `exp` (server-side sessions). Trust the JWT
124
+ // claim when present; otherwise treat the credential as non-expiring rather
125
+ // than honoring a stale stored `expires` (older logins wrote loginTime+1h).
126
+ const NEVER_EXPIRES = 8.64e15;
127
+ const normalizedExpires =
128
+ creds.expires > 0 && creds.expires < 10_000_000_000 ? creds.expires * 1000 : creds.expires;
129
+ const jwtExpiry = getPerplexityJwtExpiryMs(creds.access);
130
+ const expires = jwtExpiry ?? Math.max(normalizedExpires, NEVER_EXPIRES);
131
+ if (expires !== creds.expires) {
132
+ creds = { ...creds, expires };
133
+ }
134
+ }
135
+ // Refresh is the sole responsibility of `AuthStorage` (which calls
136
+ // `refreshOAuthToken` directly with broker-aware single-flighting). If we
137
+ // reach here with an expired credential, the outer pipeline failed to
138
+ // refresh before this call OR the refresh slot is the broker sentinel —
139
+ // either way, posting the credential to a provider endpoint would only
140
+ // trigger a `__remote__`-against-real-provider failure that gets classified
141
+ // as `invalid_grant` and disables the row. Refuse loudly instead.
142
+ if (Date.now() >= creds.expires) {
143
+ if (provider === "perplexity") {
144
+ const jwtExpiry = getPerplexityJwtExpiryMs(creds.access);
145
+ if (jwtExpiry && Date.now() < jwtExpiry) {
146
+ const fallbackCredentials = { ...creds, expires: jwtExpiry };
147
+ return { newCredentials: fallbackCredentials, apiKey: fallbackCredentials.access };
148
+ }
149
+ }
150
+ throw new AIError.OAuthError(
151
+ `OAuth credential for ${provider} is expired and must be refreshed via AuthStorage before getOAuthApiKey is called`,
152
+ { kind: "validation", provider },
153
+ );
154
+ }
155
+ // For providers that need request-time credential metadata, return JSON.
156
+ const needsStructuredApiKey =
157
+ provider === "github-copilot" ||
158
+ provider === "google-gemini-cli" ||
159
+ provider === "google-antigravity" ||
160
+ provider === "alibaba-coding-plan";
161
+ const apiKey = needsStructuredApiKey
162
+ ? JSON.stringify({
163
+ apiEndpoint: creds.apiEndpoint,
164
+ token: creds.access,
165
+ enterpriseUrl: creds.enterpriseUrl,
166
+ projectId: creds.projectId,
167
+ refreshToken: creds.refresh,
168
+ expiresAt: creds.expires,
169
+ email: creds.email,
170
+ accountId: creds.accountId,
171
+ })
172
+ : creds.access;
173
+ return { newCredentials: creds, apiKey };
174
+ }
175
+
176
+ /**
177
+ * Get list of OAuth providers.
178
+ */
179
+ export function getOAuthProviders(): OAuthProviderInfo[] {
180
+ const customProviders = Array.from(customOAuthProviders.values(), provider => ({
181
+ id: provider.id,
182
+ name: provider.name,
183
+ available: true,
184
+ storeCredentialsAs: provider.storeCredentialsAs,
185
+ }));
186
+ return [...builtInOAuthProviders, ...customProviders];
187
+ }