@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,96 @@
1
+ import type { FetchImpl } from "../../types";
2
+ import type { OAuthProviderUnion } from "../registry";
3
+
4
+ export type OAuthCredentials = {
5
+ refresh: string;
6
+ access: string;
7
+ expires: number;
8
+ enterpriseUrl?: string;
9
+ projectId?: string;
10
+ email?: string;
11
+ accountId?: string;
12
+ apiEndpoint?: string;
13
+ /**
14
+ * Organization/workspace the token is scoped to (e.g. an Anthropic org
15
+ * UUID or a ChatGPT workspace id). Captured once at login; token refreshes
16
+ * never rewrite it. Lets one account email hold credentials for multiple
17
+ * subscriptions.
18
+ */
19
+ orgId?: string;
20
+ /** Human-readable organization name for display (may embed the email). */
21
+ orgName?: string;
22
+ /**
23
+ * Epoch ms of the interactive login that minted this grant. Set by
24
+ * `AuthStorage.login`; token refreshes preserve it. Providers with an
25
+ * absolute grant lifetime (Anthropic expires the whole refresh-token
26
+ * family ~30 days after authorization regardless of rotation) use it to
27
+ * surface re-login deadlines before the grant dies.
28
+ */
29
+ authorizedAt?: number;
30
+ };
31
+
32
+ export type OAuthProvider = OAuthProviderUnion;
33
+
34
+ export type OAuthProviderId = OAuthProvider | (string & {});
35
+
36
+ export type OAuthPrompt = {
37
+ message: string;
38
+ placeholder?: string;
39
+ allowEmpty?: boolean;
40
+ };
41
+
42
+ export type OAuthAuthInfo = {
43
+ /**
44
+ * Full authorization URL. Suitable for direct browser launch, OSC 8
45
+ * hyperlinks, and clipboard when the target UI can guarantee the full
46
+ * string reaches the user unmodified.
47
+ */
48
+ url: string;
49
+ /**
50
+ * Short loopback URL that 302-redirects to {@link url}. Provided by flows
51
+ * that host the redirect on the same callback server they already run
52
+ * ({@link OAuthCallbackFlow}). UIs SHOULD prefer this as the copy target
53
+ * so viewport truncation cannot corrupt OAuth query parameters. Undefined
54
+ * for flows without a loopback callback server (device code, paste-code
55
+ * providers with fixed non-loopback redirects, etc.).
56
+ */
57
+ launchUrl?: string;
58
+ instructions?: string;
59
+ };
60
+
61
+ export interface OAuthProviderInfo {
62
+ id: OAuthProviderId;
63
+ name: string;
64
+ available: boolean;
65
+ /**
66
+ * Provider id the login stores credentials under, when it differs from `id`
67
+ * (e.g. `openai-codex-device` ⇒ `openai-codex`). Lets callers map a login
68
+ * entry back to the model provider it authenticates.
69
+ */
70
+ storeCredentialsAs?: string;
71
+ }
72
+
73
+ export interface OAuthController {
74
+ onAuth?(info: OAuthAuthInfo): void;
75
+ onProgress?(message: string): void;
76
+ onManualCodeInput?(): Promise<string>;
77
+ onPrompt?(prompt: OAuthPrompt): Promise<string>;
78
+ signal?: AbortSignal;
79
+ fetch?: FetchImpl;
80
+ }
81
+
82
+ export interface OAuthLoginCallbacks extends OAuthController {
83
+ onAuth: (info: OAuthAuthInfo) => void;
84
+ onPrompt: (prompt: OAuthPrompt) => Promise<string>;
85
+ }
86
+
87
+ export interface OAuthProviderInterface {
88
+ readonly id: OAuthProviderId;
89
+ readonly name: string;
90
+ readonly sourceId?: string;
91
+ login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials | string>;
92
+ refreshToken?(credentials: OAuthCredentials): Promise<OAuthCredentials>;
93
+ getApiKey?(credentials: OAuthCredentials): string;
94
+ /** Store resulting OAuth credentials under a different provider id. */
95
+ readonly storeCredentialsAs?: string;
96
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Wafer Serverless login flow.
3
+ *
4
+ * Wafer (https://wafer.ai) exposes a pay-as-you-go OpenAI-compatible SKU at
5
+ * `https://pass.wafer.ai/v1`. Keys use the `wfr_…` prefix and are validated
6
+ * against `/v1/models`, which is cheap (no token spend).
7
+ */
8
+ import { createApiKeyLogin } from "../api-key-login";
9
+
10
+ const WAFER_AUTH_URL = "https://app.wafer.ai/usage";
11
+ const WAFER_MODELS_URL = "https://pass.wafer.ai/v1/models";
12
+
13
+ export const loginWaferServerless = createApiKeyLogin({
14
+ providerLabel: "Wafer Serverless",
15
+ authUrl: WAFER_AUTH_URL,
16
+ instructions: "Create or copy your Wafer Serverless API key from the Wafer dashboard",
17
+ promptMessage: "Paste your Wafer Serverless API key",
18
+ placeholder: "wfr_...",
19
+ validation: {
20
+ kind: "models-endpoint",
21
+ provider: "Wafer Serverless",
22
+ modelsUrl: WAFER_MODELS_URL,
23
+ },
24
+ });
@@ -0,0 +1,559 @@
1
+ // Device authorization and token refresh adapted from NousResearch/hermes-agent (MIT).
2
+
3
+ /**
4
+ * xAI Grok OAuth device authorization flow.
5
+ *
6
+ * Requests an RFC 8628 device code, opens xAI's verification page, and polls
7
+ * the discovered token endpoint until the user approves the login.
8
+ */
9
+
10
+ import * as AIError from "../../error";
11
+ import type { FetchImpl } from "../../types";
12
+ import { type OAuthDeviceCodePollResult, pollOAuthDeviceCodeFlow } from "./device-code";
13
+ import type { OAuthController, OAuthCredentials } from "./types";
14
+
15
+ const XAI_OAUTH_ISSUER = "https://auth.x.ai";
16
+ const XAI_OAUTH_DISCOVERY_URL = `${XAI_OAUTH_ISSUER}/.well-known/openid-configuration`;
17
+ const XAI_OAUTH_DEVICE_CODE_URL = `${XAI_OAUTH_ISSUER}/oauth2/device/code`;
18
+ const XAI_OAUTH_USERINFO_URL = `${XAI_OAUTH_ISSUER}/oauth2/userinfo`;
19
+ const XAI_OAUTH_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
20
+ const XAI_OAUTH_SCOPE = "openid profile email offline_access grok-cli:access api:access";
21
+ const XAI_CLI_BILLING_BASE_URL = "https://cli-chat-proxy.grok.com";
22
+ const XAI_CLI_BILLING_PATH = "/v1/billing";
23
+ const XAI_CLI_BILLING_FORMAT = "credits";
24
+
25
+ // Mirrors the 5-min skew used by anthropic.ts:160 — keeps every provider on the
26
+ // same conservative client-side expiry window.
27
+ const ACCESS_TOKEN_CLIENT_SKEW_MS = 5 * 60 * 1000;
28
+
29
+ const DISCOVERY_TIMEOUT_MS = 15_000;
30
+ const TOKEN_REQUEST_TIMEOUT_MS = 20_000;
31
+
32
+ interface XAIOAuthDiscovery {
33
+ token_endpoint: string;
34
+ }
35
+
36
+ interface XAIDeviceAuthorization {
37
+ deviceCode: string;
38
+ userCode: string;
39
+ verificationUriComplete: string;
40
+ expiresInSeconds: number;
41
+ intervalSeconds: number;
42
+ }
43
+
44
+ function isRecord(value: unknown): value is Record<string, unknown> {
45
+ return typeof value === "object" && value !== null;
46
+ }
47
+
48
+ /**
49
+ * Validate an xAI OIDC endpoint against its scheme and host.
50
+ *
51
+ * The discovery response is long-lived and its token endpoint receives every
52
+ * future refresh token. Rejecting non-HTTPS or non-`x.ai` / `*.x.ai` hosts
53
+ * pins that endpoint to the xAI auth origin.
54
+ *
55
+ * @throws Error with message `Invalid xAI <field>: <url>` when the URL fails
56
+ * either scheme or host validation.
57
+ */
58
+ function isXaiAuthHostname(host: string): boolean {
59
+ return host === "x.ai" || host.endsWith(".x.ai");
60
+ }
61
+
62
+ /** SuperGrok CLI billing proxy host (`cli-chat-proxy.grok.com`), not the OIDC issuer. */
63
+ function isXaiBillingHostname(host: string): boolean {
64
+ return host === "grok.com" || host.endsWith(".grok.com");
65
+ }
66
+
67
+ export function validateXAIEndpoint(url: string, field: string): string {
68
+ let parsed: URL;
69
+ try {
70
+ parsed = new URL(url);
71
+ } catch {
72
+ throw new AIError.OAuthError(`Invalid xAI ${field}: ${url}`, { kind: "validation", provider: "xai" });
73
+ }
74
+ if (parsed.protocol !== "https:") {
75
+ throw new AIError.OAuthError(`Invalid xAI ${field}: ${url}`, { kind: "validation", provider: "xai" });
76
+ }
77
+ const host = parsed.hostname.toLowerCase();
78
+ if (!host || !isXaiAuthHostname(host)) {
79
+ throw new AIError.OAuthError(`Invalid xAI ${field}: ${url}`, { kind: "validation", provider: "xai" });
80
+ }
81
+ return url;
82
+ }
83
+
84
+ /**
85
+ * Pin SuperGrok billing URLs to HTTPS `grok.com` / `*.grok.com`.
86
+ * The CLI billing proxy is intentionally not on `*.x.ai`.
87
+ */
88
+ export function validateXAIBillingEndpoint(url: string, field: string = "billing_url"): string {
89
+ let parsed: URL;
90
+ try {
91
+ parsed = new URL(url);
92
+ } catch {
93
+ throw new AIError.OAuthError(`Invalid xAI ${field}: ${url}`, { kind: "validation", provider: "xai" });
94
+ }
95
+ if (parsed.protocol !== "https:") {
96
+ throw new AIError.OAuthError(`Invalid xAI ${field}: ${url}`, { kind: "validation", provider: "xai" });
97
+ }
98
+ const host = parsed.hostname.toLowerCase();
99
+ if (!host || !isXaiBillingHostname(host)) {
100
+ throw new AIError.OAuthError(`Invalid xAI ${field}: ${url}`, { kind: "validation", provider: "xai" });
101
+ }
102
+ return url;
103
+ }
104
+
105
+ /** Fetch xAI's OIDC discovery document and validate the token endpoint. */
106
+ async function xaiOAuthDiscovery(
107
+ timeoutMs: number = DISCOVERY_TIMEOUT_MS,
108
+ fetchOverride?: FetchImpl,
109
+ ): Promise<XAIOAuthDiscovery> {
110
+ const fetchImpl = fetchOverride ?? fetch;
111
+ let response: Response;
112
+ try {
113
+ response = await fetchImpl(XAI_OAUTH_DISCOVERY_URL, {
114
+ method: "GET",
115
+ headers: { Accept: "application/json" },
116
+ signal: AbortSignal.timeout(timeoutMs),
117
+ });
118
+ } catch (error) {
119
+ throw new AIError.OAuthError(
120
+ `xAI OIDC discovery failed: ${error instanceof Error ? error.message : String(error)}`,
121
+ {
122
+ kind: "discovery",
123
+ provider: "xai",
124
+ cause: error,
125
+ },
126
+ );
127
+ }
128
+ if (response.status !== 200) {
129
+ throw new AIError.OAuthError(`xAI OIDC discovery returned status ${response.status}.`, {
130
+ kind: "discovery",
131
+ provider: "xai",
132
+ status: response.status,
133
+ });
134
+ }
135
+ let payload: unknown;
136
+ try {
137
+ payload = await response.json();
138
+ } catch (error) {
139
+ throw new AIError.OAuthError(
140
+ `xAI OIDC discovery returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`,
141
+ { kind: "validation", provider: "xai", cause: error },
142
+ );
143
+ }
144
+ if (!isRecord(payload)) {
145
+ throw new AIError.OAuthError("xAI OIDC discovery response was not a JSON object.", {
146
+ kind: "validation",
147
+ provider: "xai",
148
+ });
149
+ }
150
+ const tokenEndpoint = typeof payload.token_endpoint === "string" ? payload.token_endpoint.trim() : "";
151
+ if (!tokenEndpoint) {
152
+ throw new AIError.OAuthError("xAI OIDC discovery response was missing token_endpoint.", {
153
+ kind: "validation",
154
+ provider: "xai",
155
+ });
156
+ }
157
+ validateXAIEndpoint(tokenEndpoint, "token_endpoint");
158
+ return { token_endpoint: tokenEndpoint };
159
+ }
160
+
161
+ /** Decode an xAI access-token JWT payload without verifying its signature. */
162
+ export function parseXAIAccessTokenPayload(jwt: string): Record<string, unknown> | null {
163
+ try {
164
+ if (typeof jwt !== "string" || !jwt.includes(".")) return null;
165
+ const parts = jwt.split(".");
166
+ if (parts.length < 2) return null;
167
+ const payloadPart = parts[1];
168
+ if (!payloadPart) return null;
169
+ const decoded = Buffer.from(payloadPart, "base64url").toString("utf8");
170
+ const payload = JSON.parse(decoded) as unknown;
171
+ return isRecord(payload) && !Array.isArray(payload) ? payload : null;
172
+ } catch {
173
+ return null;
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Check whether a JWT access token is at or past its `exp` claim (with an
179
+ * optional refresh-skew margin).
180
+ *
181
+ * Returns `false` for malformed input because this is a refresh-trigger check,
182
+ * not token validation.
183
+ */
184
+ export function isXAIAccessTokenExpiring(jwt: string, skewSeconds: number = 0): boolean {
185
+ const payload = parseXAIAccessTokenPayload(jwt);
186
+ if (!payload) return false;
187
+ const exp = payload.exp;
188
+ if (typeof exp !== "number" || !Number.isFinite(exp)) return false;
189
+ const now = Math.floor(Date.now() / 1000);
190
+ const skew = Math.max(0, Math.floor(skewSeconds));
191
+ return exp <= now + skew;
192
+ }
193
+
194
+ /** Extract the stable xAI subject UUID from an access token. */
195
+ export function extractXAIAccessTokenSubject(jwt: string): string | undefined {
196
+ const sub = parseXAIAccessTokenPayload(jwt)?.sub;
197
+ return typeof sub === "string" && sub.trim() ? sub.trim() : undefined;
198
+ }
199
+
200
+ export interface XAIOAuthIdentity {
201
+ accountId?: string;
202
+ email?: string;
203
+ name?: string;
204
+ }
205
+
206
+ /** Fetch optional OIDC userinfo for a valid xAI access token. */
207
+ export async function fetchXAIOAuthIdentity(
208
+ accessToken: string,
209
+ fetchOverride?: FetchImpl,
210
+ signal?: AbortSignal,
211
+ ): Promise<XAIOAuthIdentity | null> {
212
+ const token = accessToken.trim();
213
+ if (!token) return null;
214
+ const fetchImpl = fetchOverride ?? fetch;
215
+ try {
216
+ const response = await fetchImpl(XAI_OAUTH_USERINFO_URL, {
217
+ method: "GET",
218
+ headers: {
219
+ Authorization: `Bearer ${token}`,
220
+ Accept: "application/json",
221
+ },
222
+ redirect: "error",
223
+ signal: signal
224
+ ? AbortSignal.any([signal, AbortSignal.timeout(DISCOVERY_TIMEOUT_MS)])
225
+ : AbortSignal.timeout(DISCOVERY_TIMEOUT_MS),
226
+ });
227
+ if (!response.ok) return null;
228
+ const payload = (await response.json()) as unknown;
229
+ if (!isRecord(payload) || Array.isArray(payload)) return null;
230
+ const sub = typeof payload.sub === "string" && payload.sub.trim() ? payload.sub.trim() : undefined;
231
+ const email = typeof payload.email === "string" && payload.email.trim() ? payload.email.trim() : undefined;
232
+ const name = typeof payload.name === "string" && payload.name.trim() ? payload.name.trim() : undefined;
233
+ if (!sub && !email && !name) return null;
234
+ return {
235
+ ...(sub ? { accountId: sub } : {}),
236
+ ...(email ? { email: email.toLowerCase() } : {}),
237
+ ...(name ? { name } : {}),
238
+ };
239
+ } catch {
240
+ return null;
241
+ }
242
+ }
243
+
244
+ async function withXAIOAuthIdentity(
245
+ credentials: OAuthCredentials,
246
+ fetchOverride?: FetchImpl,
247
+ signal?: AbortSignal,
248
+ ): Promise<OAuthCredentials> {
249
+ const identity = await fetchXAIOAuthIdentity(credentials.access, fetchOverride, signal);
250
+ const accountId = identity?.accountId ?? credentials.accountId ?? extractXAIAccessTokenSubject(credentials.access);
251
+ const email = identity?.email ?? credentials.email;
252
+ return {
253
+ ...credentials,
254
+ ...(accountId ? { accountId } : {}),
255
+ ...(email ? { email } : {}),
256
+ };
257
+ }
258
+
259
+ /** Build the SuperGrok CLI billing URL. Pass `""` to omit `format` (unified monthly payload). */
260
+ export function buildXAICliBillingUrl(format: string = XAI_CLI_BILLING_FORMAT): string {
261
+ const url = new URL(XAI_CLI_BILLING_PATH, XAI_CLI_BILLING_BASE_URL);
262
+ if (format) url.searchParams.set("format", format);
263
+ return validateXAIBillingEndpoint(url.toString());
264
+ }
265
+
266
+ /**
267
+ * Headers for SuperGrok CLI billing (`cli-chat-proxy.grok.com`).
268
+ * Official Grok CLI also sends `X-XAI-Token-Auth: xai-grok-cli` on this host;
269
+ * include it so billing stays on the same product gate as chat inference.
270
+ */
271
+ export function getXAICliBillingHeaders(options: { accessToken: string }): Record<string, string> {
272
+ return {
273
+ Authorization: `Bearer ${options.accessToken}`,
274
+ Accept: "application/json",
275
+ "X-XAI-Token-Auth": "xai-grok-cli",
276
+ };
277
+ }
278
+
279
+ function parseXAIDeviceAuthorization(payload: unknown): XAIDeviceAuthorization {
280
+ if (!isRecord(payload)) {
281
+ throw new AIError.OAuthError("xAI device-code response was not a JSON object.", {
282
+ kind: "validation",
283
+ provider: "xai",
284
+ });
285
+ }
286
+
287
+ const deviceCode = typeof payload.device_code === "string" ? payload.device_code.trim() : "";
288
+ const userCode = typeof payload.user_code === "string" ? payload.user_code.trim() : "";
289
+ const verificationUri = typeof payload.verification_uri === "string" ? payload.verification_uri.trim() : "";
290
+ const verificationUriComplete =
291
+ typeof payload.verification_uri_complete === "string" ? payload.verification_uri_complete.trim() : "";
292
+ const expiresInSeconds = payload.expires_in;
293
+ const intervalSeconds = payload.interval;
294
+ if (
295
+ !deviceCode ||
296
+ !userCode ||
297
+ !verificationUri ||
298
+ !verificationUriComplete ||
299
+ typeof expiresInSeconds !== "number" ||
300
+ !Number.isFinite(expiresInSeconds) ||
301
+ expiresInSeconds <= 0 ||
302
+ typeof intervalSeconds !== "number" ||
303
+ !Number.isFinite(intervalSeconds) ||
304
+ intervalSeconds <= 0
305
+ ) {
306
+ throw new AIError.OAuthError("xAI device-code response missing or invalid required fields.", {
307
+ kind: "validation",
308
+ provider: "xai",
309
+ });
310
+ }
311
+
312
+ validateXAIEndpoint(verificationUri, "verification_uri");
313
+ validateXAIEndpoint(verificationUriComplete, "verification_uri_complete");
314
+ return {
315
+ deviceCode,
316
+ userCode,
317
+ verificationUriComplete,
318
+ expiresInSeconds,
319
+ intervalSeconds,
320
+ };
321
+ }
322
+
323
+ function parseXAITokenResponse(payload: unknown, label: string, refreshTokenFallback?: string): OAuthCredentials {
324
+ if (!isRecord(payload)) {
325
+ throw new AIError.OAuthError(`${label} was not a JSON object`, {
326
+ kind: "validation",
327
+ provider: "xai",
328
+ });
329
+ }
330
+ const accessToken = typeof payload.access_token === "string" ? payload.access_token : "";
331
+ const responseRefreshToken = typeof payload.refresh_token === "string" ? payload.refresh_token : "";
332
+ const refreshToken = responseRefreshToken || refreshTokenFallback || "";
333
+ const expiresInSeconds = payload.expires_in;
334
+ if (!accessToken) {
335
+ throw new AIError.OAuthError(`${label} missing access_token`, {
336
+ kind: "validation",
337
+ provider: "xai",
338
+ });
339
+ }
340
+ if (!refreshToken) {
341
+ throw new AIError.OAuthError(`${label} missing refresh_token`, {
342
+ kind: "validation",
343
+ provider: "xai",
344
+ });
345
+ }
346
+ if (typeof expiresInSeconds !== "number" || !Number.isFinite(expiresInSeconds)) {
347
+ throw new AIError.OAuthError(`${label} missing expires_in`, {
348
+ kind: "validation",
349
+ provider: "xai",
350
+ });
351
+ }
352
+ return {
353
+ access: accessToken,
354
+ refresh: refreshToken,
355
+ expires: Date.now() + expiresInSeconds * 1000 - ACCESS_TOKEN_CLIENT_SKEW_MS,
356
+ };
357
+ }
358
+
359
+ async function requestXAIDeviceAuthorization(
360
+ fetchImpl: FetchImpl,
361
+ signal?: AbortSignal,
362
+ ): Promise<XAIDeviceAuthorization> {
363
+ let response: Response;
364
+ try {
365
+ const timeoutSignal = AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS);
366
+ response = await fetchImpl(XAI_OAUTH_DEVICE_CODE_URL, {
367
+ method: "POST",
368
+ headers: {
369
+ "Content-Type": "application/x-www-form-urlencoded",
370
+ Accept: "application/json",
371
+ },
372
+ body: new URLSearchParams({
373
+ client_id: XAI_OAUTH_CLIENT_ID,
374
+ scope: XAI_OAUTH_SCOPE,
375
+ }),
376
+ signal: signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal,
377
+ });
378
+ } catch (error) {
379
+ if (signal?.aborted) throw new AIError.LoginCancelledError();
380
+ throw new AIError.OAuthError(
381
+ `xAI device-code request failed: ${error instanceof Error ? error.message : String(error)}`,
382
+ { kind: "device-auth", provider: "xai", cause: error },
383
+ );
384
+ }
385
+
386
+ if (!response.ok) {
387
+ let detail = "";
388
+ try {
389
+ detail = (await response.text()).trim();
390
+ } catch {
391
+ // Ignore body-read failures; the status code is the diagnostic.
392
+ }
393
+ throw new AIError.OAuthError(`xAI device-code request failed: ${response.status}${detail ? ` ${detail}` : ""}`, {
394
+ kind: "device-auth",
395
+ provider: "xai",
396
+ status: response.status,
397
+ });
398
+ }
399
+
400
+ let payload: unknown;
401
+ try {
402
+ payload = await response.json();
403
+ } catch (error) {
404
+ throw new AIError.OAuthError(
405
+ `xAI device-code response returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`,
406
+ { kind: "validation", provider: "xai", cause: error },
407
+ );
408
+ }
409
+ return parseXAIDeviceAuthorization(payload);
410
+ }
411
+
412
+ async function pollXAIDeviceToken(
413
+ tokenEndpoint: string,
414
+ deviceCode: string,
415
+ fetchImpl: FetchImpl,
416
+ signal?: AbortSignal,
417
+ ): Promise<OAuthDeviceCodePollResult<OAuthCredentials>> {
418
+ let response: Response;
419
+ try {
420
+ const timeoutSignal = AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS);
421
+ response = await fetchImpl(tokenEndpoint, {
422
+ method: "POST",
423
+ headers: {
424
+ "Content-Type": "application/x-www-form-urlencoded",
425
+ Accept: "application/json",
426
+ },
427
+ body: new URLSearchParams({
428
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
429
+ client_id: XAI_OAUTH_CLIENT_ID,
430
+ device_code: deviceCode,
431
+ }),
432
+ redirect: "error",
433
+ signal: signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal,
434
+ });
435
+ } catch (error) {
436
+ if (signal?.aborted) throw new AIError.LoginCancelledError();
437
+ throw new AIError.OAuthError(
438
+ `xAI device-code token polling failed: ${error instanceof Error ? error.message : String(error)}`,
439
+ { kind: "polling", provider: "xai", cause: error },
440
+ );
441
+ }
442
+
443
+ let payload: unknown;
444
+ try {
445
+ payload = await response.json();
446
+ } catch (error) {
447
+ throw new AIError.OAuthError(
448
+ `xAI device-code token polling returned invalid JSON: ${
449
+ error instanceof Error ? error.message : String(error)
450
+ }`,
451
+ { kind: "polling", provider: "xai", status: response.status, cause: error },
452
+ );
453
+ }
454
+
455
+ if (response.ok) {
456
+ return {
457
+ status: "complete",
458
+ value: parseXAITokenResponse(payload, "xAI device-code token response"),
459
+ };
460
+ }
461
+ if (!isRecord(payload)) {
462
+ throw new AIError.OAuthError(`xAI device-code token polling failed: ${response.status}`, {
463
+ kind: "polling",
464
+ provider: "xai",
465
+ status: response.status,
466
+ });
467
+ }
468
+
469
+ const errorCode = typeof payload.error === "string" ? payload.error : "";
470
+ if (errorCode === "authorization_pending") return { status: "pending" };
471
+ if (errorCode === "slow_down") return { status: "slow_down" };
472
+
473
+ const errorDescription = typeof payload.error_description === "string" ? payload.error_description : "";
474
+ const detail = errorDescription || errorCode || String(response.status);
475
+ throw new AIError.OAuthError(`xAI device-code token polling failed: ${detail}`, {
476
+ kind: "polling",
477
+ provider: "xai",
478
+ status: response.status,
479
+ });
480
+ }
481
+
482
+ /** Log in to xAI Grok with the RFC 8628 device authorization grant. */
483
+ export async function loginXAIOAuth(ctrl: OAuthController): Promise<OAuthCredentials> {
484
+ const fetchImpl = ctrl.fetch ?? fetch;
485
+ const discovery = await xaiOAuthDiscovery(DISCOVERY_TIMEOUT_MS, fetchImpl);
486
+ const device = await requestXAIDeviceAuthorization(fetchImpl, ctrl.signal);
487
+ ctrl.onAuth?.({
488
+ url: device.verificationUriComplete,
489
+ instructions: `Enter code: ${device.userCode}`,
490
+ });
491
+ ctrl.onProgress?.("Waiting for xAI device authorization...");
492
+
493
+ const credentials = await pollOAuthDeviceCodeFlow({
494
+ poll: () => pollXAIDeviceToken(discovery.token_endpoint, device.deviceCode, fetchImpl, ctrl.signal),
495
+ intervalSeconds: device.intervalSeconds,
496
+ expiresInSeconds: device.expiresInSeconds,
497
+ signal: ctrl.signal,
498
+ });
499
+ return withXAIOAuthIdentity(credentials, fetchImpl, ctrl.signal);
500
+ }
501
+
502
+ /**
503
+ * Refresh an xAI OAuth access token using a stored refresh_token.
504
+ *
505
+ * Re-runs OIDC discovery and re-validates the token endpoint before sending
506
+ * the stored refresh token.
507
+ */
508
+ export async function refreshXAIOAuthToken(refreshToken: string, fetchOverride?: FetchImpl): Promise<OAuthCredentials> {
509
+ const fetchImpl = fetchOverride ?? fetch;
510
+ if (typeof refreshToken !== "string" || !refreshToken.trim()) {
511
+ throw new AIError.OAuthError("missing refresh_token", { kind: "validation", provider: "xai" });
512
+ }
513
+
514
+ const discovery = await xaiOAuthDiscovery(DISCOVERY_TIMEOUT_MS, fetchImpl);
515
+ const tokenEndpoint = validateXAIEndpoint(discovery.token_endpoint, "token_endpoint");
516
+
517
+ const body = new URLSearchParams({
518
+ grant_type: "refresh_token",
519
+ client_id: XAI_OAUTH_CLIENT_ID,
520
+ refresh_token: refreshToken,
521
+ });
522
+
523
+ const response = await fetchImpl(tokenEndpoint, {
524
+ method: "POST",
525
+ headers: {
526
+ "Content-Type": "application/x-www-form-urlencoded",
527
+ Accept: "application/json",
528
+ },
529
+ body,
530
+ redirect: "error",
531
+ signal: AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS),
532
+ });
533
+
534
+ if (!response.ok) {
535
+ let detail = "";
536
+ try {
537
+ detail = (await response.text()).trim();
538
+ } catch {
539
+ // Ignore body-read failures; the status code is the diagnostic.
540
+ }
541
+ throw new AIError.OAuthError(`xAI token refresh failed: ${response.status}${detail ? ` ${detail}` : ""}`, {
542
+ kind: "token-refresh",
543
+ provider: "xai",
544
+ status: response.status,
545
+ });
546
+ }
547
+
548
+ let payload: unknown;
549
+ try {
550
+ payload = await response.json();
551
+ } catch (error) {
552
+ throw new AIError.OAuthError(
553
+ `xAI token refresh returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`,
554
+ { kind: "validation", provider: "xai", cause: error },
555
+ );
556
+ }
557
+ const credentials = parseXAITokenResponse(payload, "xAI token refresh response", refreshToken);
558
+ return withXAIOAuthIdentity(credentials, fetchImpl);
559
+ }