jeopi-ai 16.2.13

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 (598) hide show
  1. package/CHANGELOG.md +4347 -0
  2. package/README.md +1193 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth-broker/client.d.ts +73 -0
  5. package/dist/types/auth-broker/discover.d.ts +35 -0
  6. package/dist/types/auth-broker/index.d.ts +7 -0
  7. package/dist/types/auth-broker/refresher.d.ts +25 -0
  8. package/dist/types/auth-broker/remote-store.d.ts +102 -0
  9. package/dist/types/auth-broker/server.d.ts +43 -0
  10. package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
  11. package/dist/types/auth-broker/types.d.ts +107 -0
  12. package/dist/types/auth-broker/wire-schemas.d.ts +411 -0
  13. package/dist/types/auth-gateway/http.d.ts +39 -0
  14. package/dist/types/auth-gateway/index.d.ts +3 -0
  15. package/dist/types/auth-gateway/server.d.ts +36 -0
  16. package/dist/types/auth-gateway/types.d.ts +123 -0
  17. package/dist/types/auth-retry.d.ts +124 -0
  18. package/dist/types/auth-storage.d.ts +1026 -0
  19. package/dist/types/dialect/anthropic.d.ts +15 -0
  20. package/dist/types/dialect/catalog.d.ts +3 -0
  21. package/dist/types/dialect/coercion.d.ts +23 -0
  22. package/dist/types/dialect/deepseek.d.ts +14 -0
  23. package/dist/types/dialect/demotion.d.ts +23 -0
  24. package/dist/types/dialect/examples.d.ts +2 -0
  25. package/dist/types/dialect/factory.d.ts +3 -0
  26. package/dist/types/dialect/fenced-thinking.d.ts +53 -0
  27. package/dist/types/dialect/gemini.d.ts +17 -0
  28. package/dist/types/dialect/gemma.d.ts +15 -0
  29. package/dist/types/dialect/glm.d.ts +9 -0
  30. package/dist/types/dialect/harmony.d.ts +8 -0
  31. package/dist/types/dialect/hermes.d.ts +9 -0
  32. package/dist/types/dialect/history.d.ts +3 -0
  33. package/dist/types/dialect/index.d.ts +11 -0
  34. package/dist/types/dialect/inventory.d.ts +12 -0
  35. package/dist/types/dialect/kimi.d.ts +14 -0
  36. package/dist/types/dialect/minimax.d.ts +3 -0
  37. package/dist/types/dialect/owned-stream.d.ts +4 -0
  38. package/dist/types/dialect/qwen3.d.ts +9 -0
  39. package/dist/types/dialect/rendering.d.ts +45 -0
  40. package/dist/types/dialect/thinking.d.ts +6 -0
  41. package/dist/types/dialect/types.d.ts +69 -0
  42. package/dist/types/dialect/xml.d.ts +9 -0
  43. package/dist/types/error/abort.d.ts +14 -0
  44. package/dist/types/error/auth-classify.d.ts +16 -0
  45. package/dist/types/error/auth.d.ts +27 -0
  46. package/dist/types/error/aws.d.ts +23 -0
  47. package/dist/types/error/classes.d.ts +102 -0
  48. package/dist/types/error/finalize.d.ts +39 -0
  49. package/dist/types/error/flags.d.ts +79 -0
  50. package/dist/types/error/format.d.ts +20 -0
  51. package/dist/types/error/gateway.d.ts +20 -0
  52. package/dist/types/error/index.d.ts +13 -0
  53. package/dist/types/error/oauth.d.ts +43 -0
  54. package/dist/types/error/provider.d.ts +42 -0
  55. package/dist/types/error/rate-limit.d.ts +59 -0
  56. package/dist/types/error/retryable.d.ts +27 -0
  57. package/dist/types/error/validation.d.ts +32 -0
  58. package/dist/types/index.d.ts +49 -0
  59. package/dist/types/provider-details.d.ts +24 -0
  60. package/dist/types/providers/__tests__/google-auth.test.d.ts +1 -0
  61. package/dist/types/providers/__tests__/kimi-code-thinking.test.d.ts +1 -0
  62. package/dist/types/providers/__tests__/openai-codex-error.test.d.ts +1 -0
  63. package/dist/types/providers/amazon-bedrock.d.ts +39 -0
  64. package/dist/types/providers/anthropic-client.d.ts +94 -0
  65. package/dist/types/providers/anthropic-messages-server-schema.d.ts +497 -0
  66. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  67. package/dist/types/providers/anthropic-wire.d.ts +318 -0
  68. package/dist/types/providers/anthropic.d.ts +248 -0
  69. package/dist/types/providers/aws-credentials.d.ts +53 -0
  70. package/dist/types/providers/aws-eventstream.d.ts +39 -0
  71. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  72. package/dist/types/providers/azure-openai-responses.d.ts +16 -0
  73. package/dist/types/providers/cursor.d.ts +91 -0
  74. package/dist/types/providers/devin.d.ts +12 -0
  75. package/dist/types/providers/error-message.d.ts +27 -0
  76. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  77. package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
  78. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  79. package/dist/types/providers/google-auth.d.ts +32 -0
  80. package/dist/types/providers/google-gemini-cli.d.ts +118 -0
  81. package/dist/types/providers/google-interactions.d.ts +65 -0
  82. package/dist/types/providers/google-shared.d.ts +203 -0
  83. package/dist/types/providers/google-types.d.ts +155 -0
  84. package/dist/types/providers/google-vertex.d.ts +7 -0
  85. package/dist/types/providers/google.d.ts +4 -0
  86. package/dist/types/providers/grammar.d.ts +1 -0
  87. package/dist/types/providers/kimi.d.ts +27 -0
  88. package/dist/types/providers/mock.d.ts +178 -0
  89. package/dist/types/providers/ollama.d.ts +7 -0
  90. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  91. package/dist/types/providers/openai-chat-server-schema.d.ts +695 -0
  92. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  93. package/dist/types/providers/openai-chat-wire.d.ts +644 -0
  94. package/dist/types/providers/openai-codex/request-transformer.d.ts +54 -0
  95. package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
  96. package/dist/types/providers/openai-codex-responses.d.ts +108 -0
  97. package/dist/types/providers/openai-completions.d.ts +45 -0
  98. package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
  99. package/dist/types/providers/openai-responses-server-schema.d.ts +349 -0
  100. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  101. package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
  102. package/dist/types/providers/openai-responses.d.ts +126 -0
  103. package/dist/types/providers/openai-shared.d.ts +506 -0
  104. package/dist/types/providers/pi-native-client.d.ts +13 -0
  105. package/dist/types/providers/pi-native-server.d.ts +69 -0
  106. package/dist/types/providers/register-builtins.d.ts +32 -0
  107. package/dist/types/providers/synthetic.d.ts +26 -0
  108. package/dist/types/providers/transform-messages.d.ts +11 -0
  109. package/dist/types/providers/vision-guard.d.ts +20 -0
  110. package/dist/types/registry/aimlapi.d.ts +4 -0
  111. package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
  112. package/dist/types/registry/amazon-bedrock.d.ts +5 -0
  113. package/dist/types/registry/anthropic.d.ts +10 -0
  114. package/dist/types/registry/api-key-login.d.ts +42 -0
  115. package/dist/types/registry/api-key-validation.d.ts +43 -0
  116. package/dist/types/registry/azure.d.ts +4 -0
  117. package/dist/types/registry/cerebras.d.ts +7 -0
  118. package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
  119. package/dist/types/registry/coreweave.d.ts +7 -0
  120. package/dist/types/registry/cursor.d.ts +7 -0
  121. package/dist/types/registry/deepseek.d.ts +8 -0
  122. package/dist/types/registry/derived.d.ts +5 -0
  123. package/dist/types/registry/devin.d.ts +8 -0
  124. package/dist/types/registry/firepass.d.ts +16 -0
  125. package/dist/types/registry/fireworks.d.ts +7 -0
  126. package/dist/types/registry/github-copilot.d.ts +7 -0
  127. package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
  128. package/dist/types/registry/gitlab-duo.d.ts +9 -0
  129. package/dist/types/registry/google-antigravity.d.ts +9 -0
  130. package/dist/types/registry/google-gemini-cli.d.ts +9 -0
  131. package/dist/types/registry/google-vertex.d.ts +5 -0
  132. package/dist/types/registry/google.d.ts +4 -0
  133. package/dist/types/registry/groq.d.ts +4 -0
  134. package/dist/types/registry/huggingface.d.ts +7 -0
  135. package/dist/types/registry/index.d.ts +4 -0
  136. package/dist/types/registry/kagi.d.ts +14 -0
  137. package/dist/types/registry/kilo.d.ts +7 -0
  138. package/dist/types/registry/kimi-code.d.ts +7 -0
  139. package/dist/types/registry/litellm.d.ts +13 -0
  140. package/dist/types/registry/llama-cpp.d.ts +8 -0
  141. package/dist/types/registry/lm-studio.d.ts +8 -0
  142. package/dist/types/registry/minimax-code-cn.d.ts +6 -0
  143. package/dist/types/registry/minimax-code.d.ts +6 -0
  144. package/dist/types/registry/minimax.d.ts +4 -0
  145. package/dist/types/registry/mistral.d.ts +4 -0
  146. package/dist/types/registry/moonshot.d.ts +7 -0
  147. package/dist/types/registry/nanogpt.d.ts +7 -0
  148. package/dist/types/registry/nvidia.d.ts +7 -0
  149. package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
  150. package/dist/types/registry/oauth/anthropic.d.ts +23 -0
  151. package/dist/types/registry/oauth/callback-server.d.ts +72 -0
  152. package/dist/types/registry/oauth/cursor.d.ts +15 -0
  153. package/dist/types/registry/oauth/devin.d.ts +5 -0
  154. package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
  155. package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
  156. package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
  157. package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
  158. package/dist/types/registry/oauth/google-gemini-cli.d.ts +10 -0
  159. package/dist/types/registry/oauth/google-oauth-shared.d.ts +22 -0
  160. package/dist/types/registry/oauth/index.d.ts +64 -0
  161. package/dist/types/registry/oauth/kimi.d.ts +21 -0
  162. package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
  163. package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
  164. package/dist/types/registry/oauth/opencode.d.ts +18 -0
  165. package/dist/types/registry/oauth/perplexity.d.ts +9 -0
  166. package/dist/types/registry/oauth/pkce.d.ts +8 -0
  167. package/dist/types/registry/oauth/types.d.ts +56 -0
  168. package/dist/types/registry/oauth/wafer.d.ts +1 -0
  169. package/dist/types/registry/oauth/xai-oauth.d.ts +52 -0
  170. package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
  171. package/dist/types/registry/ollama-cloud.d.ts +7 -0
  172. package/dist/types/registry/ollama.d.ts +12 -0
  173. package/dist/types/registry/openai-codex-device.d.ts +8 -0
  174. package/dist/types/registry/openai-codex.d.ts +9 -0
  175. package/dist/types/registry/openai.d.ts +4 -0
  176. package/dist/types/registry/opencode-go.d.ts +6 -0
  177. package/dist/types/registry/opencode-zen.d.ts +6 -0
  178. package/dist/types/registry/openrouter.d.ts +13 -0
  179. package/dist/types/registry/parallel.d.ts +14 -0
  180. package/dist/types/registry/perplexity.d.ts +7 -0
  181. package/dist/types/registry/qianfan.d.ts +7 -0
  182. package/dist/types/registry/qwen-portal.d.ts +7 -0
  183. package/dist/types/registry/registry.d.ts +303 -0
  184. package/dist/types/registry/sakana.d.ts +7 -0
  185. package/dist/types/registry/synthetic.d.ts +6 -0
  186. package/dist/types/registry/tavily.d.ts +14 -0
  187. package/dist/types/registry/together.d.ts +6 -0
  188. package/dist/types/registry/types.d.ts +51 -0
  189. package/dist/types/registry/umans.d.ts +7 -0
  190. package/dist/types/registry/venice.d.ts +13 -0
  191. package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
  192. package/dist/types/registry/vllm.d.ts +7 -0
  193. package/dist/types/registry/wafer-serverless.d.ts +6 -0
  194. package/dist/types/registry/xai-oauth.d.ts +7 -0
  195. package/dist/types/registry/xai.d.ts +4 -0
  196. package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
  197. package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
  198. package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
  199. package/dist/types/registry/xiaomi.d.ts +6 -0
  200. package/dist/types/registry/zai.d.ts +7 -0
  201. package/dist/types/registry/zenmux.d.ts +7 -0
  202. package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
  203. package/dist/types/stream.d.ts +44 -0
  204. package/dist/types/types.d.ts +715 -0
  205. package/dist/types/usage/claude.d.ts +4 -0
  206. package/dist/types/usage/gemini.d.ts +2 -0
  207. package/dist/types/usage/github-copilot.d.ts +7 -0
  208. package/dist/types/usage/google-antigravity.d.ts +15 -0
  209. package/dist/types/usage/kimi.d.ts +2 -0
  210. package/dist/types/usage/minimax-code.d.ts +2 -0
  211. package/dist/types/usage/ollama.d.ts +5 -0
  212. package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
  213. package/dist/types/usage/openai-codex-reset.d.ts +79 -0
  214. package/dist/types/usage/openai-codex.d.ts +3 -0
  215. package/dist/types/usage/opencode-go.d.ts +2 -0
  216. package/dist/types/usage/shared.d.ts +1 -0
  217. package/dist/types/usage/zai.d.ts +2 -0
  218. package/dist/types/usage.d.ts +346 -0
  219. package/dist/types/utils/abort.d.ts +25 -0
  220. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  221. package/dist/types/utils/block-symbols.d.ts +20 -0
  222. package/dist/types/utils/deterministic-id.d.ts +16 -0
  223. package/dist/types/utils/empty-completion-retry.d.ts +21 -0
  224. package/dist/types/utils/event-stream.d.ts +30 -0
  225. package/dist/types/utils/foundry.d.ts +1 -0
  226. package/dist/types/utils/google-validation.d.ts +2 -0
  227. package/dist/types/utils/harmony-leak.d.ts +118 -0
  228. package/dist/types/utils/http-inspector.d.ts +30 -0
  229. package/dist/types/utils/idle-iterator.d.ts +137 -0
  230. package/dist/types/utils/leaked-thinking-stream.d.ts +29 -0
  231. package/dist/types/utils/openai-http.d.ts +54 -0
  232. package/dist/types/utils/openrouter-headers.d.ts +1 -0
  233. package/dist/types/utils/parse-bind.d.ts +23 -0
  234. package/dist/types/utils/provider-response.d.ts +3 -0
  235. package/dist/types/utils/proxy.d.ts +29 -0
  236. package/dist/types/utils/request-debug.d.ts +29 -0
  237. package/dist/types/utils/retry-after.d.ts +4 -0
  238. package/dist/types/utils/retry.d.ts +14 -0
  239. package/dist/types/utils/schema/adapt.d.ts +24 -0
  240. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  241. package/dist/types/utils/schema/dereference.d.ts +11 -0
  242. package/dist/types/utils/schema/draft.d.ts +10 -0
  243. package/dist/types/utils/schema/equality.d.ts +4 -0
  244. package/dist/types/utils/schema/fields.d.ts +54 -0
  245. package/dist/types/utils/schema/index.d.ts +15 -0
  246. package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
  247. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  248. package/dist/types/utils/schema/normalize.d.ts +124 -0
  249. package/dist/types/utils/schema/spill.d.ts +8 -0
  250. package/dist/types/utils/schema/stamps.d.ts +17 -0
  251. package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
  252. package/dist/types/utils/schema/types.d.ts +4 -0
  253. package/dist/types/utils/schema/typescript.d.ts +18 -0
  254. package/dist/types/utils/schema/wire.d.ts +92 -0
  255. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  256. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  257. package/dist/types/utils/sse-debug.d.ts +5 -0
  258. package/dist/types/utils/stream-markup-healing.d.ts +87 -0
  259. package/dist/types/utils/thinking-loop.d.ts +102 -0
  260. package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
  261. package/dist/types/utils/tool-choice.d.ts +50 -0
  262. package/dist/types/utils/validation.d.ts +42 -0
  263. package/dist/types/utils.d.ts +24 -0
  264. package/package.json +139 -0
  265. package/src/api-registry.ts +109 -0
  266. package/src/auth-broker/client.ts +359 -0
  267. package/src/auth-broker/discover.ts +222 -0
  268. package/src/auth-broker/index.ts +7 -0
  269. package/src/auth-broker/refresher.ts +117 -0
  270. package/src/auth-broker/remote-store.ts +657 -0
  271. package/src/auth-broker/server.ts +646 -0
  272. package/src/auth-broker/snapshot-cache.ts +191 -0
  273. package/src/auth-broker/types.ts +130 -0
  274. package/src/auth-broker/wire-schemas.ts +249 -0
  275. package/src/auth-gateway/http.ts +194 -0
  276. package/src/auth-gateway/index.ts +3 -0
  277. package/src/auth-gateway/server.ts +802 -0
  278. package/src/auth-gateway/types.ts +151 -0
  279. package/src/auth-retry.ts +250 -0
  280. package/src/auth-storage.ts +5576 -0
  281. package/src/dialect/anthropic.md +31 -0
  282. package/src/dialect/anthropic.ts +608 -0
  283. package/src/dialect/catalog.ts +29 -0
  284. package/src/dialect/coercion.ts +136 -0
  285. package/src/dialect/deepseek.md +24 -0
  286. package/src/dialect/deepseek.ts +609 -0
  287. package/src/dialect/demotion.ts +36 -0
  288. package/src/dialect/examples.ts +33 -0
  289. package/src/dialect/factory.ts +34 -0
  290. package/src/dialect/fenced-thinking.ts +184 -0
  291. package/src/dialect/gemini.md +44 -0
  292. package/src/dialect/gemini.ts +597 -0
  293. package/src/dialect/gemma.md +33 -0
  294. package/src/dialect/gemma.ts +387 -0
  295. package/src/dialect/glm.md +32 -0
  296. package/src/dialect/glm.ts +456 -0
  297. package/src/dialect/harmony.md +31 -0
  298. package/src/dialect/harmony.ts +346 -0
  299. package/src/dialect/hermes.md +25 -0
  300. package/src/dialect/hermes.ts +206 -0
  301. package/src/dialect/history.ts +81 -0
  302. package/src/dialect/index.ts +15 -0
  303. package/src/dialect/inventory.ts +73 -0
  304. package/src/dialect/kimi.md +24 -0
  305. package/src/dialect/kimi.ts +340 -0
  306. package/src/dialect/minimax.md +31 -0
  307. package/src/dialect/minimax.ts +95 -0
  308. package/src/dialect/owned-stream.ts +470 -0
  309. package/src/dialect/prompt-template.md +12 -0
  310. package/src/dialect/qwen3.md +28 -0
  311. package/src/dialect/qwen3.ts +240 -0
  312. package/src/dialect/rendering.ts +249 -0
  313. package/src/dialect/thinking.ts +122 -0
  314. package/src/dialect/types.ts +57 -0
  315. package/src/dialect/xml.md +22 -0
  316. package/src/dialect/xml.ts +90 -0
  317. package/src/error/abort.ts +18 -0
  318. package/src/error/auth-classify.ts +30 -0
  319. package/src/error/auth.ts +48 -0
  320. package/src/error/aws.ts +31 -0
  321. package/src/error/classes.ts +186 -0
  322. package/src/error/finalize.ts +69 -0
  323. package/src/error/flags.ts +506 -0
  324. package/src/error/format.ts +45 -0
  325. package/src/error/gateway.ts +96 -0
  326. package/src/error/index.ts +13 -0
  327. package/src/error/oauth.ts +58 -0
  328. package/src/error/provider.ts +62 -0
  329. package/src/error/rate-limit.ts +161 -0
  330. package/src/error/retryable.ts +70 -0
  331. package/src/error/validation.ts +44 -0
  332. package/src/index.ts +49 -0
  333. package/src/provider-details.ts +90 -0
  334. package/src/providers/__tests__/google-auth.test.ts +144 -0
  335. package/src/providers/__tests__/kimi-code-thinking.test.ts +112 -0
  336. package/src/providers/__tests__/openai-codex-error.test.ts +84 -0
  337. package/src/providers/amazon-bedrock.ts +1042 -0
  338. package/src/providers/anthropic-client.ts +295 -0
  339. package/src/providers/anthropic-messages-server-schema.ts +252 -0
  340. package/src/providers/anthropic-messages-server.ts +756 -0
  341. package/src/providers/anthropic-wire.ts +318 -0
  342. package/src/providers/anthropic.ts +4078 -0
  343. package/src/providers/aws-credentials.ts +586 -0
  344. package/src/providers/aws-eventstream.ts +181 -0
  345. package/src/providers/aws-sigv4.ts +218 -0
  346. package/src/providers/azure-openai-responses.ts +382 -0
  347. package/src/providers/cursor/proto/agent.proto +3526 -0
  348. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  349. package/src/providers/cursor/proto/buf.yaml +17 -0
  350. package/src/providers/cursor.ts +2695 -0
  351. package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
  352. package/src/providers/devin/proto/buf.gen.yaml +33 -0
  353. package/src/providers/devin/proto/buf.yaml +17 -0
  354. package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
  355. package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
  356. package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
  357. package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
  358. package/src/providers/devin/proto/cel/expr/value.proto +41 -0
  359. package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
  360. package/src/providers/devin/proto/errorspb/errors.proto +56 -0
  361. package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
  362. package/src/providers/devin/proto/errorspb/markers.proto +10 -0
  363. package/src/providers/devin/proto/errorspb/tags.proto +12 -0
  364. package/src/providers/devin/proto/errorspb/testing.proto +6 -0
  365. package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
  366. package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
  367. package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
  368. package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
  369. package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
  370. package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
  371. package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
  372. package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
  373. package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
  374. package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
  375. package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
  376. package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
  377. package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
  378. package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
  379. package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
  380. package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
  381. package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
  382. package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
  383. package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
  384. package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
  385. package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
  386. package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
  387. package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
  388. package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
  389. package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
  390. package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
  391. package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
  392. package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
  393. package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
  394. package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
  395. package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
  396. package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
  397. package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
  398. package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
  399. package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
  400. package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
  401. package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
  402. package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
  403. package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
  404. package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
  405. package/src/providers/devin.ts +577 -0
  406. package/src/providers/error-message.ts +21 -0
  407. package/src/providers/github-copilot-headers.ts +141 -0
  408. package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
  409. package/src/providers/gitlab-duo-workflow.ts +3058 -0
  410. package/src/providers/gitlab-duo.ts +395 -0
  411. package/src/providers/google-auth.ts +350 -0
  412. package/src/providers/google-gemini-cli.ts +1362 -0
  413. package/src/providers/google-interactions.ts +753 -0
  414. package/src/providers/google-shared.ts +1103 -0
  415. package/src/providers/google-types.ts +180 -0
  416. package/src/providers/google-vertex.ts +183 -0
  417. package/src/providers/google.ts +87 -0
  418. package/src/providers/grammar.ts +70 -0
  419. package/src/providers/kimi.ts +52 -0
  420. package/src/providers/mock.ts +507 -0
  421. package/src/providers/ollama.ts +773 -0
  422. package/src/providers/openai-anthropic-shim.ts +152 -0
  423. package/src/providers/openai-chat-server-schema.ts +242 -0
  424. package/src/providers/openai-chat-server.ts +715 -0
  425. package/src/providers/openai-chat-wire.ts +847 -0
  426. package/src/providers/openai-codex/request-transformer.ts +295 -0
  427. package/src/providers/openai-codex/response-handler.ts +102 -0
  428. package/src/providers/openai-codex-responses.ts +3468 -0
  429. package/src/providers/openai-completions.ts +2173 -0
  430. package/src/providers/openai-reasoning-fallback.ts +269 -0
  431. package/src/providers/openai-responses-reasoning-suppression.md +1 -0
  432. package/src/providers/openai-responses-server-schema.ts +282 -0
  433. package/src/providers/openai-responses-server.ts +1280 -0
  434. package/src/providers/openai-responses-wire.ts +6391 -0
  435. package/src/providers/openai-responses.ts +1022 -0
  436. package/src/providers/openai-shared.ts +2648 -0
  437. package/src/providers/pi-native-client.ts +266 -0
  438. package/src/providers/pi-native-server.ts +242 -0
  439. package/src/providers/register-builtins.ts +475 -0
  440. package/src/providers/synthetic.ts +50 -0
  441. package/src/providers/transform-messages.ts +787 -0
  442. package/src/providers/vision-guard.ts +54 -0
  443. package/src/registry/aimlapi.ts +6 -0
  444. package/src/registry/alibaba-coding-plan.ts +95 -0
  445. package/src/registry/amazon-bedrock.ts +22 -0
  446. package/src/registry/anthropic.ts +26 -0
  447. package/src/registry/api-key-login.ts +112 -0
  448. package/src/registry/api-key-validation.ts +161 -0
  449. package/src/registry/azure.ts +6 -0
  450. package/src/registry/cerebras.ts +23 -0
  451. package/src/registry/cloudflare-ai-gateway.ts +45 -0
  452. package/src/registry/coreweave.ts +40 -0
  453. package/src/registry/cursor.ts +20 -0
  454. package/src/registry/deepseek.ts +46 -0
  455. package/src/registry/derived.ts +9 -0
  456. package/src/registry/devin.ts +15 -0
  457. package/src/registry/firepass.ts +32 -0
  458. package/src/registry/fireworks.ts +28 -0
  459. package/src/registry/github-copilot.ts +22 -0
  460. package/src/registry/gitlab-duo-workflow.ts +20 -0
  461. package/src/registry/gitlab-duo.ts +19 -0
  462. package/src/registry/google-antigravity.ts +22 -0
  463. package/src/registry/google-gemini-cli.ts +22 -0
  464. package/src/registry/google-vertex.ts +38 -0
  465. package/src/registry/google.ts +6 -0
  466. package/src/registry/groq.ts +6 -0
  467. package/src/registry/huggingface.ts +29 -0
  468. package/src/registry/index.ts +4 -0
  469. package/src/registry/kagi.ts +46 -0
  470. package/src/registry/kilo.ts +114 -0
  471. package/src/registry/kimi-code.ts +17 -0
  472. package/src/registry/litellm.ts +45 -0
  473. package/src/registry/llama-cpp.ts +35 -0
  474. package/src/registry/lm-studio.ts +31 -0
  475. package/src/registry/minimax-code-cn.ts +12 -0
  476. package/src/registry/minimax-code.ts +12 -0
  477. package/src/registry/minimax.ts +6 -0
  478. package/src/registry/mistral.ts +6 -0
  479. package/src/registry/moonshot.ts +22 -0
  480. package/src/registry/nanogpt.ts +22 -0
  481. package/src/registry/nvidia.ts +61 -0
  482. package/src/registry/oauth/__tests__/xai-oauth.test.ts +104 -0
  483. package/src/registry/oauth/anthropic.ts +311 -0
  484. package/src/registry/oauth/callback-server.ts +315 -0
  485. package/src/registry/oauth/cursor.ts +171 -0
  486. package/src/registry/oauth/devin.ts +124 -0
  487. package/src/registry/oauth/github-copilot.ts +369 -0
  488. package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
  489. package/src/registry/oauth/gitlab-duo.ts +222 -0
  490. package/src/registry/oauth/google-antigravity.ts +209 -0
  491. package/src/registry/oauth/google-gemini-cli.ts +273 -0
  492. package/src/registry/oauth/google-oauth-shared.ts +125 -0
  493. package/src/registry/oauth/index.ts +269 -0
  494. package/src/registry/oauth/kimi.ts +289 -0
  495. package/src/registry/oauth/minimax-code.ts +53 -0
  496. package/src/registry/oauth/oauth.html +311 -0
  497. package/src/registry/oauth/openai-codex.ts +364 -0
  498. package/src/registry/oauth/opencode.ts +50 -0
  499. package/src/registry/oauth/perplexity.ts +228 -0
  500. package/src/registry/oauth/pkce.ts +18 -0
  501. package/src/registry/oauth/types.ts +65 -0
  502. package/src/registry/oauth/wafer.ts +24 -0
  503. package/src/registry/oauth/xai-oauth.ts +394 -0
  504. package/src/registry/oauth/xiaomi.ts +211 -0
  505. package/src/registry/ollama-cloud.ts +36 -0
  506. package/src/registry/ollama.ts +43 -0
  507. package/src/registry/openai-codex-device.ts +18 -0
  508. package/src/registry/openai-codex.ts +19 -0
  509. package/src/registry/openai.ts +6 -0
  510. package/src/registry/opencode-go.ts +12 -0
  511. package/src/registry/opencode-zen.ts +12 -0
  512. package/src/registry/openrouter.ts +28 -0
  513. package/src/registry/parallel.ts +45 -0
  514. package/src/registry/perplexity.ts +13 -0
  515. package/src/registry/qianfan.ts +27 -0
  516. package/src/registry/qwen-portal.ts +50 -0
  517. package/src/registry/registry.ts +161 -0
  518. package/src/registry/sakana.ts +22 -0
  519. package/src/registry/synthetic.ts +21 -0
  520. package/src/registry/tavily.ts +45 -0
  521. package/src/registry/together.ts +22 -0
  522. package/src/registry/types.ts +56 -0
  523. package/src/registry/umans.ts +23 -0
  524. package/src/registry/venice.ts +33 -0
  525. package/src/registry/vercel-ai-gateway.ts +38 -0
  526. package/src/registry/vllm.ts +34 -0
  527. package/src/registry/wafer-serverless.ts +12 -0
  528. package/src/registry/xai-oauth.ts +17 -0
  529. package/src/registry/xai.ts +6 -0
  530. package/src/registry/xiaomi-token-plan-ams.ts +12 -0
  531. package/src/registry/xiaomi-token-plan-cn.ts +12 -0
  532. package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
  533. package/src/registry/xiaomi.ts +12 -0
  534. package/src/registry/zai.ts +27 -0
  535. package/src/registry/zenmux.ts +22 -0
  536. package/src/registry/zhipu-coding-plan.ts +27 -0
  537. package/src/stream.ts +1778 -0
  538. package/src/types.ts +856 -0
  539. package/src/usage/claude.ts +485 -0
  540. package/src/usage/gemini.ts +258 -0
  541. package/src/usage/github-copilot.ts +424 -0
  542. package/src/usage/google-antigravity.ts +497 -0
  543. package/src/usage/kimi.ts +271 -0
  544. package/src/usage/minimax-code.ts +30 -0
  545. package/src/usage/ollama.ts +41 -0
  546. package/src/usage/openai-codex-base-url.ts +35 -0
  547. package/src/usage/openai-codex-reset.ts +174 -0
  548. package/src/usage/openai-codex.ts +535 -0
  549. package/src/usage/opencode-go.ts +89 -0
  550. package/src/usage/shared.ts +10 -0
  551. package/src/usage/zai.ts +321 -0
  552. package/src/usage.ts +333 -0
  553. package/src/utils/abort.ts +67 -0
  554. package/src/utils/anthropic-auth.ts +93 -0
  555. package/src/utils/block-symbols.ts +32 -0
  556. package/src/utils/deterministic-id.ts +20 -0
  557. package/src/utils/empty-completion-retry.ts +159 -0
  558. package/src/utils/event-stream.ts +171 -0
  559. package/src/utils/foundry.ts +8 -0
  560. package/src/utils/google-validation.ts +25 -0
  561. package/src/utils/harmony-leak.ts +456 -0
  562. package/src/utils/http-inspector.ts +168 -0
  563. package/src/utils/idle-iterator.ts +473 -0
  564. package/src/utils/leaked-thinking-stream.ts +294 -0
  565. package/src/utils/openai-http.ts +122 -0
  566. package/src/utils/openrouter-headers.ts +12 -0
  567. package/src/utils/parse-bind.ts +56 -0
  568. package/src/utils/provider-response.ts +30 -0
  569. package/src/utils/proxy.ts +240 -0
  570. package/src/utils/request-debug.ts +351 -0
  571. package/src/utils/retry-after.ts +110 -0
  572. package/src/utils/retry.ts +59 -0
  573. package/src/utils/schema/CONSTRAINTS.md +166 -0
  574. package/src/utils/schema/adapt.ts +36 -0
  575. package/src/utils/schema/compatibility.ts +435 -0
  576. package/src/utils/schema/dereference.ts +98 -0
  577. package/src/utils/schema/draft.ts +341 -0
  578. package/src/utils/schema/equality.ts +97 -0
  579. package/src/utils/schema/fields.ts +207 -0
  580. package/src/utils/schema/index.ts +15 -0
  581. package/src/utils/schema/json-schema-validator.ts +595 -0
  582. package/src/utils/schema/meta-validator.ts +167 -0
  583. package/src/utils/schema/normalize.ts +1901 -0
  584. package/src/utils/schema/spill.ts +43 -0
  585. package/src/utils/schema/stamps.ts +109 -0
  586. package/src/utils/schema/strict-tool-validation.ts +117 -0
  587. package/src/utils/schema/types.ts +10 -0
  588. package/src/utils/schema/typescript.ts +198 -0
  589. package/src/utils/schema/wire.ts +789 -0
  590. package/src/utils/schema/zod-decontaminate.ts +331 -0
  591. package/src/utils/sdk-stream-timeout.ts +43 -0
  592. package/src/utils/sse-debug.ts +18 -0
  593. package/src/utils/stream-markup-healing.ts +247 -0
  594. package/src/utils/thinking-loop.ts +552 -0
  595. package/src/utils/tool-call-loop-guard.ts +107 -0
  596. package/src/utils/tool-choice.ts +99 -0
  597. package/src/utils/validation.ts +1507 -0
  598. package/src/utils.ts +171 -0
@@ -0,0 +1,222 @@
1
+ import * as AIError from "../../error";
2
+ import { clearGitLabDuoDirectAccessCache } from "../../providers/gitlab-duo";
3
+ import type { FetchImpl } from "../../types";
4
+ import { OAuthCallbackFlow, type OAuthCallbackFlowOptions } from "./callback-server";
5
+ import { generatePKCE } from "./pkce";
6
+ import type { OAuthCredentials, OAuthLoginCallbacks } from "./types";
7
+
8
+ const GITLAB_COM_URL = "https://gitlab.com";
9
+ /**
10
+ * Default OAuth client id baked into the bundled GitLab Duo login flow. GitLab
11
+ * authorize requests are rejected outright (`The redirect URI included is not
12
+ * valid`) whenever this client id's registered redirect URI list drifts from
13
+ * `http://localhost:8080/callback`. Users hitting that case can either:
14
+ *
15
+ * - register their own GitLab OAuth application and override the bundled
16
+ * credentials with `GITLAB_CLIENT_ID` + `GITLAB_REDIRECT_URI`, or
17
+ * - skip OAuth entirely and supply a Personal Access Token via `GITLAB_TOKEN`.
18
+ *
19
+ * @see https://github.com/can1357/oh-my-pi/issues/2424
20
+ */
21
+ const DEFAULT_CLIENT_ID = "da4edff2e6ebd2bc3208611e2768bc1c1dd7be791dc5ff26ca34ca9ee44f7d4b";
22
+ const OAUTH_SCOPES = ["api"];
23
+ const DEFAULT_CALLBACK_PORT = 8080;
24
+ const DEFAULT_CALLBACK_PATH = "/callback";
25
+ const DEFAULT_CALLBACK_HOSTNAME = "localhost";
26
+
27
+ interface PKCEPair {
28
+ verifier: string;
29
+ challenge: string;
30
+ }
31
+
32
+ /**
33
+ * Resolve the OAuth client id, preferring `GITLAB_CLIENT_ID` when set so users
34
+ * with their own GitLab OAuth application can bypass the bundled credentials.
35
+ */
36
+ function resolveClientId(): string {
37
+ const env = process.env.GITLAB_CLIENT_ID?.trim();
38
+ return env && env.length > 0 ? env : DEFAULT_CLIENT_ID;
39
+ }
40
+
41
+ /**
42
+ * Resolve callback-server options from `GITLAB_REDIRECT_URI`. When set, the
43
+ * exact string is advertised to GitLab (strict matching), random-port fallback
44
+ * is disabled, and HTTP loopback URIs bind the listener to the URI's host/port
45
+ * so the browser callback lands on us. HTTPS loopback URIs are rejected because
46
+ * the local callback server is plaintext HTTP. Non-loopback URIs bind a random
47
+ * local port — only the paste-code path can complete in that case.
48
+ */
49
+ function resolveCallbackOptions(): OAuthCallbackFlowOptions {
50
+ const raw = process.env.GITLAB_REDIRECT_URI?.trim();
51
+ if (!raw) {
52
+ return {
53
+ preferredPort: DEFAULT_CALLBACK_PORT,
54
+ callbackPath: DEFAULT_CALLBACK_PATH,
55
+ callbackHostname: DEFAULT_CALLBACK_HOSTNAME,
56
+ };
57
+ }
58
+
59
+ let parsed: URL;
60
+ try {
61
+ parsed = new URL(raw);
62
+ } catch {
63
+ throw new AIError.OAuthError(`Invalid GITLAB_REDIRECT_URI: ${raw}`, {
64
+ kind: "configuration",
65
+ provider: "gitlab-duo",
66
+ });
67
+ }
68
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
69
+ throw new AIError.OAuthError(`GITLAB_REDIRECT_URI must use http:// or https://, got: ${raw}`, {
70
+ kind: "configuration",
71
+ provider: "gitlab-duo",
72
+ });
73
+ }
74
+
75
+ const isLoopback = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
76
+ if (isLoopback && parsed.protocol !== "http:") {
77
+ throw new AIError.OAuthError(`GITLAB_REDIRECT_URI loopback callbacks must use http://, got: ${raw}`, {
78
+ kind: "configuration",
79
+ provider: "gitlab-duo",
80
+ });
81
+ }
82
+
83
+ const port = parsed.port ? Number.parseInt(parsed.port, 10) : parsed.protocol === "https:" ? 443 : 80;
84
+
85
+ return {
86
+ preferredPort: isLoopback ? port : 0,
87
+ callbackPath: parsed.pathname || DEFAULT_CALLBACK_PATH,
88
+ callbackHostname: isLoopback ? parsed.hostname : DEFAULT_CALLBACK_HOSTNAME,
89
+ redirectUri: raw,
90
+ };
91
+ }
92
+
93
+ function mapTokenResponse(payload: {
94
+ access_token?: string;
95
+ refresh_token?: string;
96
+ expires_in?: number;
97
+ created_at?: number;
98
+ }): OAuthCredentials {
99
+ if (!payload.access_token || !payload.refresh_token || typeof payload.expires_in !== "number") {
100
+ throw new AIError.OAuthError("GitLab OAuth token response missing required fields", {
101
+ kind: "validation",
102
+ provider: "gitlab-duo",
103
+ });
104
+ }
105
+
106
+ const createdAtMs =
107
+ typeof payload.created_at === "number" && Number.isFinite(payload.created_at)
108
+ ? payload.created_at * 1000
109
+ : Date.now();
110
+
111
+ return {
112
+ access: payload.access_token,
113
+ refresh: payload.refresh_token,
114
+ expires: createdAtMs + payload.expires_in * 1000 - 5 * 60 * 1000,
115
+ };
116
+ }
117
+
118
+ class GitLabDuoOAuthFlow extends OAuthCallbackFlow {
119
+ #pkce: PKCEPair;
120
+ #clientId: string;
121
+ #fetch: FetchImpl;
122
+
123
+ constructor(ctrl: OAuthLoginCallbacks, pkce: PKCEPair, clientId: string, options: OAuthCallbackFlowOptions) {
124
+ super(ctrl, options);
125
+ this.#pkce = pkce;
126
+ this.#clientId = clientId;
127
+ this.#fetch = ctrl.fetch ?? fetch;
128
+ }
129
+
130
+ override async generateAuthUrl(state: string, redirectUri: string): Promise<{ url: string; instructions?: string }> {
131
+ const authParams = new URLSearchParams({
132
+ client_id: this.#clientId,
133
+ redirect_uri: redirectUri,
134
+ response_type: "code",
135
+ scope: OAUTH_SCOPES.join(" "),
136
+ code_challenge: this.#pkce.challenge,
137
+ code_challenge_method: "S256",
138
+ state,
139
+ });
140
+
141
+ return {
142
+ url: `${GITLAB_COM_URL}/oauth/authorize?${authParams.toString()}`,
143
+ instructions:
144
+ 'Complete GitLab login in browser. If GitLab responds with "The redirect URI included is not valid", ' +
145
+ "register your own GitLab OAuth application and set GITLAB_CLIENT_ID + GITLAB_REDIRECT_URI, or use a " +
146
+ "Personal Access Token via GITLAB_TOKEN.",
147
+ };
148
+ }
149
+
150
+ override async exchangeToken(code: string, _state: string, redirectUri: string): Promise<OAuthCredentials> {
151
+ const response = await this.#fetch(`${GITLAB_COM_URL}/oauth/token`, {
152
+ method: "POST",
153
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
154
+ body: new URLSearchParams({
155
+ client_id: this.#clientId,
156
+ grant_type: "authorization_code",
157
+ code,
158
+ code_verifier: this.#pkce.verifier,
159
+ redirect_uri: redirectUri,
160
+ }).toString(),
161
+ });
162
+
163
+ if (!response.ok) {
164
+ throw new AIError.OAuthError(
165
+ `GitLab OAuth token exchange failed: ${response.status} ${await response.text()}`,
166
+ {
167
+ kind: "token-exchange",
168
+ provider: "gitlab-duo",
169
+ status: response.status,
170
+ },
171
+ );
172
+ }
173
+
174
+ clearGitLabDuoDirectAccessCache();
175
+ return mapTokenResponse(
176
+ (await response.json()) as {
177
+ access_token?: string;
178
+ refresh_token?: string;
179
+ expires_in?: number;
180
+ created_at?: number;
181
+ },
182
+ );
183
+ }
184
+ }
185
+
186
+ export async function loginGitLabDuo(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {
187
+ const pkce = await generatePKCE();
188
+ const clientId = resolveClientId();
189
+ const options = resolveCallbackOptions();
190
+ const flow = new GitLabDuoOAuthFlow(callbacks, pkce, clientId, options);
191
+ return flow.login();
192
+ }
193
+
194
+ export async function refreshGitLabDuoToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {
195
+ const response = await fetch(`${GITLAB_COM_URL}/oauth/token`, {
196
+ method: "POST",
197
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
198
+ body: new URLSearchParams({
199
+ client_id: resolveClientId(),
200
+ grant_type: "refresh_token",
201
+ refresh_token: credentials.refresh,
202
+ }).toString(),
203
+ });
204
+
205
+ if (!response.ok) {
206
+ throw new AIError.OAuthError(`GitLab OAuth refresh failed: ${response.status} ${await response.text()}`, {
207
+ kind: "token-refresh",
208
+ provider: "gitlab-duo",
209
+ status: response.status,
210
+ });
211
+ }
212
+
213
+ clearGitLabDuoDirectAccessCache();
214
+ return mapTokenResponse(
215
+ (await response.json()) as {
216
+ access_token?: string;
217
+ refresh_token?: string;
218
+ expires_in?: number;
219
+ created_at?: number;
220
+ },
221
+ );
222
+ }
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Antigravity OAuth flow (Gemini 3, Claude, GPT-OSS via Google Cloud)
3
+ * Uses different OAuth credentials than google-gemini-cli for access to additional models.
4
+ */
5
+ import { getAntigravityUserAgent } from "jeopi-catalog/wire/gemini-headers";
6
+ import * as AIError from "../../error";
7
+ import { runGoogleOAuthLogin } from "./google-oauth-shared";
8
+ import type { OAuthController, OAuthCredentials } from "./types";
9
+
10
+ const decode = (s: string) => atob(s);
11
+ const CLIENT_ID = decode(
12
+ "MTA3MTAwNjA2MDU5MS10bWhzc2luMmgyMWxjcmUyMzV2dG9sb2poNGc0MDNlcC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbQ==",
13
+ );
14
+ const CLIENT_SECRET = decode("R09DU1BYLUs1OEZXUjQ4NkxkTEoxbUxCOHNYQzR6NnFEQWY=");
15
+ const CALLBACK_PORT = 51121;
16
+ const CALLBACK_PATH = "/oauth-callback";
17
+
18
+ const SCOPES = [
19
+ "https://www.googleapis.com/auth/cloud-platform",
20
+ "https://www.googleapis.com/auth/userinfo.email",
21
+ "https://www.googleapis.com/auth/userinfo.profile",
22
+ "https://www.googleapis.com/auth/cclog",
23
+ "https://www.googleapis.com/auth/experimentsandconfigs",
24
+ ];
25
+
26
+ const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
27
+ const TOKEN_URL = "https://oauth2.googleapis.com/token";
28
+ const CLOUD_CODE_ENDPOINT = "https://cloudcode-pa.googleapis.com";
29
+ const TIER_LEGACY = "legacy-tier";
30
+ const PROJECT_ONBOARD_MAX_ATTEMPTS = 5;
31
+ const PROJECT_ONBOARD_INTERVAL_MS = 2000;
32
+
33
+ interface LoadCodeAssistPayload {
34
+ cloudaicompanionProject?: string | { id?: string };
35
+ currentTier?: { id?: string };
36
+ allowedTiers?: Array<{ id?: string; isDefault?: boolean }>;
37
+ }
38
+
39
+ interface LongRunningOperationResponse {
40
+ done?: boolean;
41
+ response?: {
42
+ cloudaicompanionProject?: string | { id?: string };
43
+ };
44
+ }
45
+
46
+ export const ANTIGRAVITY_LOAD_CODE_ASSIST_METADATA = Object.freeze({
47
+ ideType: "ANTIGRAVITY",
48
+ platform: "PLATFORM_UNSPECIFIED",
49
+ pluginType: "GEMINI",
50
+ });
51
+
52
+ function readProjectId(value: string | { id?: string } | undefined): string | undefined {
53
+ if (typeof value === "string" && value.length > 0) {
54
+ return value;
55
+ }
56
+ if (value && typeof value === "object" && typeof value.id === "string" && value.id.length > 0) {
57
+ return value.id;
58
+ }
59
+ return undefined;
60
+ }
61
+
62
+ function getDefaultTierId(allowedTiers?: Array<{ id?: string; isDefault?: boolean }>): string {
63
+ if (!allowedTiers || allowedTiers.length === 0) {
64
+ return TIER_LEGACY;
65
+ }
66
+ const defaultTier = allowedTiers.find(tier => tier.isDefault && typeof tier.id === "string" && tier.id.length > 0);
67
+ if (defaultTier?.id) {
68
+ return defaultTier.id;
69
+ }
70
+ return TIER_LEGACY;
71
+ }
72
+
73
+ async function onboardProjectWithRetries(
74
+ endpoint: string,
75
+ headers: Record<string, string>,
76
+ onboardBody: { tierId: string; metadata: typeof ANTIGRAVITY_LOAD_CODE_ASSIST_METADATA },
77
+ onProgress?: (message: string) => void,
78
+ ): Promise<string> {
79
+ for (let attempt = 1; attempt <= PROJECT_ONBOARD_MAX_ATTEMPTS; attempt += 1) {
80
+ if (attempt > 1) {
81
+ onProgress?.(`Waiting for project provisioning (attempt ${attempt}/${PROJECT_ONBOARD_MAX_ATTEMPTS})...`);
82
+ await Bun.sleep(PROJECT_ONBOARD_INTERVAL_MS);
83
+ }
84
+
85
+ const onboardResponse = await fetch(`${endpoint}/v1internal:onboardUser`, {
86
+ method: "POST",
87
+ headers,
88
+ body: JSON.stringify(onboardBody),
89
+ });
90
+
91
+ if (!onboardResponse.ok) {
92
+ const errorText = await onboardResponse.text();
93
+ throw new AIError.OAuthError(
94
+ `onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`,
95
+ { kind: "provisioning", status: onboardResponse.status },
96
+ );
97
+ }
98
+
99
+ const operation = (await onboardResponse.json()) as LongRunningOperationResponse;
100
+ if (!operation.done) {
101
+ continue;
102
+ }
103
+
104
+ const projectId = readProjectId(operation.response?.cloudaicompanionProject);
105
+ if (projectId) {
106
+ return projectId;
107
+ }
108
+ }
109
+
110
+ throw new AIError.OAuthError(
111
+ `onboardUser did not return a provisioned project id after ${PROJECT_ONBOARD_MAX_ATTEMPTS} attempts`,
112
+ { kind: "provisioning" },
113
+ );
114
+ }
115
+
116
+ async function discoverProject(accessToken: string, onProgress?: (message: string) => void): Promise<string> {
117
+ const headers = {
118
+ Authorization: `Bearer ${accessToken}`,
119
+ "Content-Type": "application/json",
120
+ "User-Agent": getAntigravityUserAgent(),
121
+ };
122
+
123
+ onProgress?.("Checking for existing project...");
124
+ const endpoint = CLOUD_CODE_ENDPOINT;
125
+ try {
126
+ const loadResponse = await fetch(`${endpoint}/v1internal:loadCodeAssist`, {
127
+ method: "POST",
128
+ headers,
129
+ body: JSON.stringify({
130
+ metadata: ANTIGRAVITY_LOAD_CODE_ASSIST_METADATA,
131
+ }),
132
+ });
133
+
134
+ if (!loadResponse.ok) {
135
+ const errorText = await loadResponse.text();
136
+ throw new AIError.OAuthError(
137
+ `loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`,
138
+ { kind: "discovery", status: loadResponse.status },
139
+ );
140
+ }
141
+
142
+ const loadPayload = (await loadResponse.json()) as LoadCodeAssistPayload;
143
+ const existingProject = readProjectId(loadPayload.cloudaicompanionProject);
144
+ if (existingProject) {
145
+ return existingProject;
146
+ }
147
+
148
+ const tierId = getDefaultTierId(loadPayload.allowedTiers);
149
+ onProgress?.("Provisioning project...");
150
+ const onboardBody = {
151
+ tierId,
152
+ metadata: ANTIGRAVITY_LOAD_CODE_ASSIST_METADATA,
153
+ };
154
+ const provisionedProject = await onboardProjectWithRetries(endpoint, headers, onboardBody, onProgress);
155
+ return provisionedProject;
156
+ } catch (error) {
157
+ throw new AIError.OAuthError(
158
+ `Could not discover or provision an Antigravity project. ${error instanceof Error ? error.message : String(error)}`,
159
+ { kind: "discovery", cause: error },
160
+ );
161
+ }
162
+ }
163
+
164
+ export async function loginAntigravity(ctrl: OAuthController): Promise<OAuthCredentials> {
165
+ return runGoogleOAuthLogin(ctrl, {
166
+ clientId: CLIENT_ID,
167
+ clientSecret: CLIENT_SECRET,
168
+ authUrl: AUTH_URL,
169
+ tokenUrl: TOKEN_URL,
170
+ scopes: SCOPES,
171
+ callbackPort: CALLBACK_PORT,
172
+ callbackPath: CALLBACK_PATH,
173
+ discoverProject,
174
+ });
175
+ }
176
+
177
+ /**
178
+ * Refresh Antigravity token
179
+ */
180
+ export async function refreshAntigravityToken(refreshToken: string, projectId: string): Promise<OAuthCredentials> {
181
+ const response = await fetch(TOKEN_URL, {
182
+ method: "POST",
183
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
184
+ body: new URLSearchParams({
185
+ client_id: CLIENT_ID,
186
+ client_secret: CLIENT_SECRET,
187
+ refresh_token: refreshToken,
188
+ grant_type: "refresh_token",
189
+ }),
190
+ });
191
+
192
+ if (!response.ok) {
193
+ const error = await response.text();
194
+ throw new AIError.OAuthError(`Antigravity token refresh failed: ${error}`, { kind: "token-refresh" });
195
+ }
196
+
197
+ const data = (await response.json()) as {
198
+ access_token: string;
199
+ expires_in: number;
200
+ refresh_token?: string;
201
+ };
202
+
203
+ return {
204
+ refresh: data.refresh_token || refreshToken,
205
+ access: data.access_token,
206
+ expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
207
+ projectId,
208
+ };
209
+ }
@@ -0,0 +1,273 @@
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 "jeopi-catalog/wire/gemini-headers";
7
+ import { $env } from "jeopi-utils";
8
+ import * as AIError from "../../error";
9
+ import { runGoogleOAuthLogin } 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
+ async function pollOperation(
67
+ operationName: string,
68
+ headers: Record<string, string>,
69
+ onProgress?: (message: string) => void,
70
+ ): Promise<LongRunningOperationResponse> {
71
+ let attempt = 0;
72
+ while (true) {
73
+ if (attempt > 0) {
74
+ onProgress?.(`Waiting for project provisioning (attempt ${attempt + 1})...`);
75
+ await Bun.sleep(5000);
76
+ }
77
+
78
+ const response = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal/${operationName}`, {
79
+ method: "GET",
80
+ headers,
81
+ });
82
+
83
+ if (!response.ok) {
84
+ throw new AIError.OAuthError(`Failed to poll operation: ${response.status} ${response.statusText}`, {
85
+ kind: "polling",
86
+ provider: "google-gemini-cli",
87
+ status: response.status,
88
+ });
89
+ }
90
+
91
+ const data = (await response.json()) as LongRunningOperationResponse;
92
+ if (data.done) {
93
+ return data;
94
+ }
95
+
96
+ attempt += 1;
97
+ }
98
+ }
99
+
100
+ async function discoverProject(accessToken: string, onProgress?: (message: string) => void): Promise<string> {
101
+ const envProjectId = $env.GOOGLE_CLOUD_PROJECT || $env.GOOGLE_CLOUD_PROJECT_ID;
102
+
103
+ const headers = {
104
+ Authorization: `Bearer ${accessToken}`,
105
+ "Content-Type": "application/json",
106
+ ...getGeminiCliHeaders(),
107
+ };
108
+
109
+ onProgress?.("Checking for existing Cloud Code Assist project...");
110
+ const loadResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:loadCodeAssist`, {
111
+ method: "POST",
112
+ headers,
113
+ body: JSON.stringify({
114
+ cloudaicompanionProject: envProjectId,
115
+ metadata: {
116
+ ideType: "IDE_UNSPECIFIED",
117
+ platform: "PLATFORM_UNSPECIFIED",
118
+ pluginType: "GEMINI",
119
+ duetProject: envProjectId,
120
+ },
121
+ }),
122
+ });
123
+
124
+ let data: LoadCodeAssistPayload;
125
+
126
+ if (!loadResponse.ok) {
127
+ let errorPayload: unknown;
128
+ try {
129
+ errorPayload = await loadResponse.clone().json();
130
+ } catch {
131
+ errorPayload = undefined;
132
+ }
133
+
134
+ if (isVpcScAffectedUser(errorPayload)) {
135
+ data = { currentTier: { id: TIER_STANDARD } };
136
+ } else {
137
+ const errorText = await loadResponse.text();
138
+ throw new AIError.OAuthError(
139
+ `loadCodeAssist failed: ${loadResponse.status} ${loadResponse.statusText}: ${errorText}`,
140
+ { kind: "discovery", provider: "google-gemini-cli", status: loadResponse.status },
141
+ );
142
+ }
143
+ } else {
144
+ data = (await loadResponse.json()) as LoadCodeAssistPayload;
145
+ }
146
+
147
+ if (data.currentTier) {
148
+ if (data.cloudaicompanionProject) {
149
+ return data.cloudaicompanionProject;
150
+ }
151
+ if (envProjectId) {
152
+ return envProjectId;
153
+ }
154
+ throw new AIError.OAuthError(
155
+ "This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
156
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
157
+ { kind: "configuration", provider: "google-gemini-cli" },
158
+ );
159
+ }
160
+
161
+ const tier = getDefaultTier(data.allowedTiers);
162
+ const tierId = tier?.id ?? TIER_FREE;
163
+
164
+ if (tierId !== TIER_FREE && !envProjectId) {
165
+ throw new AIError.OAuthError(
166
+ "This account requires setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
167
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
168
+ { kind: "configuration", provider: "google-gemini-cli" },
169
+ );
170
+ }
171
+
172
+ onProgress?.("Provisioning Cloud Code Assist project (this may take a moment)...");
173
+
174
+ const onboardBody: Record<string, unknown> = {
175
+ tierId,
176
+ metadata: {
177
+ ideType: "IDE_UNSPECIFIED",
178
+ platform: "PLATFORM_UNSPECIFIED",
179
+ pluginType: "GEMINI",
180
+ },
181
+ };
182
+
183
+ if (tierId !== TIER_FREE && envProjectId) {
184
+ onboardBody.cloudaicompanionProject = envProjectId;
185
+ (onboardBody.metadata as Record<string, unknown>).duetProject = envProjectId;
186
+ }
187
+
188
+ const onboardResponse = await fetch(`${CODE_ASSIST_ENDPOINT}/v1internal:onboardUser`, {
189
+ method: "POST",
190
+ headers,
191
+ body: JSON.stringify(onboardBody),
192
+ });
193
+
194
+ if (!onboardResponse.ok) {
195
+ const errorText = await onboardResponse.text();
196
+ throw new AIError.OAuthError(
197
+ `onboardUser failed: ${onboardResponse.status} ${onboardResponse.statusText}: ${errorText}`,
198
+ { kind: "provisioning", provider: "google-gemini-cli", status: onboardResponse.status },
199
+ );
200
+ }
201
+
202
+ let lroData = (await onboardResponse.json()) as LongRunningOperationResponse;
203
+
204
+ if (!lroData.done && lroData.name) {
205
+ lroData = await pollOperation(lroData.name, headers, onProgress);
206
+ }
207
+
208
+ const projectId = lroData.response?.cloudaicompanionProject?.id;
209
+ if (projectId) {
210
+ return projectId;
211
+ }
212
+
213
+ if (envProjectId) {
214
+ return envProjectId;
215
+ }
216
+
217
+ throw new AIError.OAuthError(
218
+ "Could not discover or provision a Google Cloud project. " +
219
+ "Try setting the GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_PROJECT_ID environment variable. " +
220
+ "See https://goo.gle/gemini-cli-auth-docs#workspace-gca",
221
+ { kind: "validation", provider: "google-gemini-cli" },
222
+ );
223
+ }
224
+
225
+ export async function loginGeminiCli(ctrl: OAuthController): Promise<OAuthCredentials> {
226
+ return runGoogleOAuthLogin(ctrl, {
227
+ clientId: CLIENT_ID,
228
+ clientSecret: CLIENT_SECRET,
229
+ authUrl: AUTH_URL,
230
+ tokenUrl: TOKEN_URL,
231
+ scopes: SCOPES,
232
+ callbackPort: CALLBACK_PORT,
233
+ callbackPath: CALLBACK_PATH,
234
+ discoverProject,
235
+ });
236
+ }
237
+
238
+ /**
239
+ * Refresh Google Cloud Code Assist token
240
+ */
241
+ export async function refreshGoogleCloudToken(refreshToken: string, projectId: string): Promise<OAuthCredentials> {
242
+ const response = await fetch(TOKEN_URL, {
243
+ method: "POST",
244
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
245
+ body: new URLSearchParams({
246
+ client_id: CLIENT_ID,
247
+ client_secret: CLIENT_SECRET,
248
+ refresh_token: refreshToken,
249
+ grant_type: "refresh_token",
250
+ }),
251
+ });
252
+
253
+ if (!response.ok) {
254
+ const error = await response.text();
255
+ throw new AIError.OAuthError(`Google Cloud token refresh failed: ${error}`, {
256
+ kind: "token-refresh",
257
+ provider: "google-gemini-cli",
258
+ });
259
+ }
260
+
261
+ const data = (await response.json()) as {
262
+ access_token: string;
263
+ expires_in: number;
264
+ refresh_token?: string;
265
+ };
266
+
267
+ return {
268
+ refresh: data.refresh_token || refreshToken,
269
+ access: data.access_token,
270
+ expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000,
271
+ projectId,
272
+ };
273
+ }