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,54 @@
1
+ import { isDashscopeCompatibleModeUrl } from "jeopi-catalog/hosts";
2
+ import { isQwenModelId } from "jeopi-catalog/identity";
3
+
4
+ import type { ImageContent, Model, TextContent } from "../types";
5
+
6
+ export const NON_VISION_IMAGE_PLACEHOLDER = "[image omitted: model does not support vision]";
7
+
8
+ export function partitionVisionContent(
9
+ content: ReadonlyArray<TextContent | ImageContent>,
10
+ supportsImages: boolean,
11
+ ): {
12
+ textBlocks: TextContent[];
13
+ imageBlocks: ImageContent[];
14
+ omittedImages: boolean;
15
+ } {
16
+ const textBlocks = content.filter((block): block is TextContent => block.type === "text");
17
+ const imageBlocks = content.filter((block): block is ImageContent => block.type === "image");
18
+ return {
19
+ textBlocks,
20
+ imageBlocks: supportsImages ? imageBlocks : [],
21
+ omittedImages: !supportsImages && imageBlocks.length > 0,
22
+ };
23
+ }
24
+
25
+ export function joinTextWithImagePlaceholder(text: string, omittedImages: boolean): string {
26
+ const parts: string[] = [];
27
+ if (text.length > 0) {
28
+ parts.push(text);
29
+ }
30
+ if (omittedImages) {
31
+ parts.push(NON_VISION_IMAGE_PLACEHOLDER);
32
+ }
33
+ return parts.join("\n");
34
+ }
35
+
36
+ /**
37
+ * Detect known text-only Qwen models served via Alibaba DashScope's consumer
38
+ * `compatible-mode` endpoint that the upstream chat-completions API rejects
39
+ * multimodal content arrays for. The compatible-mode endpoint also serves
40
+ * multimodal Qwen SKUs without `vl` in the id (e.g. `qwen3.7-plus`), so this
41
+ * guard only covers families verified to be text-only for issue #1859:
42
+ * `qwen*-max` and `qwen*-coder*`.
43
+ *
44
+ * Used as a defensive override in `convertMessages` so a misconfigured custom
45
+ * provider (issue #1859) can't drive the request into an unrecoverable 400.
46
+ */
47
+ export function isDashscopeCompatibleModeTextOnlyQwen(model: Model<"openai-completions">): boolean {
48
+ if (!isDashscopeCompatibleModeUrl(model.baseUrl)) {
49
+ return false;
50
+ }
51
+ const id = model.id.toLowerCase();
52
+ if (!isQwenModelId(model.id)) return false;
53
+ return /\bqwen(?:[\d.]+)?-max\b/.test(id) || /\bqwen(?:[\d.]+)?-coder\b/.test(id);
54
+ }
@@ -0,0 +1,6 @@
1
+ import type { ProviderDefinition } from "./types";
2
+
3
+ export const aimlApiProvider = {
4
+ id: "aimlapi",
5
+ name: "AIML API",
6
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,95 @@
1
+ import * as AIError from "../error";
2
+ import * as apiKeyValidation from "./api-key-validation";
3
+ import type { OAuthController, OAuthCredentials, OAuthLoginCallbacks } from "./oauth/types";
4
+ import type { ProviderDefinition } from "./types";
5
+
6
+ const DEFAULT_AUTH_URL = "https://modelstudio.console.alibabacloud.com/";
7
+ const CHINA_AUTH_URL = "https://dashscope.console.aliyun.com/";
8
+ const DEFAULT_API_BASE_URL = "https://coding-intl.dashscope.aliyuncs.com/v1";
9
+ const CHINA_API_BASE_URL = "https://coding.dashscope.aliyuncs.com/v1";
10
+ const VALIDATION_MODEL = "qwen3.5-plus";
11
+
12
+ export async function loginAlibabaCodingPlan(options: OAuthController): Promise<OAuthCredentials> {
13
+ if (!options.onPrompt) {
14
+ throw new AIError.OnPromptRequiredError("Alibaba Coding Plan");
15
+ }
16
+
17
+ // Ask which endpoint to use
18
+ const endpointChoice = await options.onPrompt({
19
+ message: "Select Alibaba Coding Plan endpoint: 1=International (default), 2=China, 3=Custom — enter 1, 2, or 3",
20
+ placeholder: "1",
21
+ });
22
+
23
+ // Check for abort after endpoint selection (Escape returns "")
24
+ if (options.signal?.aborted) {
25
+ throw new AIError.LoginCancelledError();
26
+ }
27
+
28
+ const choice = endpointChoice.trim();
29
+ let baseUrl: string;
30
+ let authUrl: string;
31
+ let instructions: string;
32
+ if (choice === "2") {
33
+ baseUrl = CHINA_API_BASE_URL;
34
+ authUrl = CHINA_AUTH_URL;
35
+ instructions = "Copy your API key from the Alibaba Cloud DashScope console (China mainland)";
36
+ } else if (choice === "3") {
37
+ const customUrl = await options.onPrompt({
38
+ message: "Enter custom base URL",
39
+ placeholder: "https://your-proxy.com/v1",
40
+ });
41
+ const trimmedUrl = customUrl.trim().replace(/\/+$/, "");
42
+ if (!trimmedUrl) {
43
+ throw new AIError.ConfigurationError("Custom URL is required for option 3");
44
+ }
45
+ baseUrl = trimmedUrl;
46
+ authUrl = DEFAULT_AUTH_URL;
47
+ instructions = "Copy your API key from the Alibaba Cloud DashScope console";
48
+ } else {
49
+ baseUrl = DEFAULT_API_BASE_URL;
50
+ authUrl = DEFAULT_AUTH_URL;
51
+ instructions = "Copy your API key from the Alibaba Cloud DashScope console (International)";
52
+ }
53
+
54
+ options.onAuth?.({
55
+ url: authUrl,
56
+ instructions,
57
+ });
58
+
59
+ const apiKey = await options.onPrompt({
60
+ message: "Paste your Alibaba Coding Plan API key",
61
+ placeholder: "sk-...",
62
+ });
63
+
64
+ if (options.signal?.aborted) {
65
+ throw new AIError.LoginCancelledError();
66
+ }
67
+
68
+ const trimmed = apiKey.trim();
69
+ if (!trimmed) {
70
+ throw new AIError.ApiKeyRequiredError();
71
+ }
72
+
73
+ options.onProgress?.("Validating API key...");
74
+ await apiKeyValidation.validateOpenAICompatibleApiKey({
75
+ provider: "Alibaba Coding Plan",
76
+ apiKey: trimmed,
77
+ baseUrl,
78
+ model: VALIDATION_MODEL,
79
+ signal: options.signal,
80
+ });
81
+
82
+ return {
83
+ access: trimmed,
84
+ refresh: trimmed,
85
+ expires: Number.MAX_SAFE_INTEGER,
86
+ enterpriseUrl: baseUrl,
87
+ };
88
+ }
89
+
90
+ export const alibabaCodingPlanProvider = {
91
+ id: "alibaba-coding-plan",
92
+ name: "Alibaba Coding Plan",
93
+ login: (cb: OAuthLoginCallbacks) => loginAlibabaCodingPlan(cb),
94
+ getApiKey: credentials => credentials.access,
95
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,22 @@
1
+ import { $env } from "jeopi-utils";
2
+ import type { ProviderDefinition } from "./types";
3
+
4
+ export const amazonBedrockProvider = {
5
+ id: "amazon-bedrock",
6
+ name: "Amazon Bedrock",
7
+ // Amazon Bedrock accepts bearer tokens, IAM keys, profiles, ECS/IRSA credential chains.
8
+ envKeys: () => {
9
+ const hasEcsCredentials =
10
+ !!$env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI || !!$env.AWS_CONTAINER_CREDENTIALS_FULL_URI;
11
+ const hasWebIdentity = !!$env.AWS_WEB_IDENTITY_TOKEN_FILE && !!$env.AWS_ROLE_ARN;
12
+ if (
13
+ $env.AWS_PROFILE ||
14
+ ($env.AWS_ACCESS_KEY_ID && $env.AWS_SECRET_ACCESS_KEY) ||
15
+ $env.AWS_BEARER_TOKEN_BEDROCK ||
16
+ hasEcsCredentials ||
17
+ hasWebIdentity
18
+ ) {
19
+ return "<authenticated>";
20
+ }
21
+ },
22
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,26 @@
1
+ import { $pickenv } from "jeopi-utils";
2
+ import { isFoundryEnabled } from "../utils/foundry";
3
+ import type { OAuthCredentials, OAuthLoginCallbacks } from "./oauth/types";
4
+ import type { ProviderDefinition } from "./types";
5
+
6
+ export const anthropicProvider = {
7
+ id: "anthropic",
8
+ name: "Anthropic (Claude Pro/Max)",
9
+ // Foundry mode optionally switches Anthropic auth to enterprise gateway credentials.
10
+ envKeys: () =>
11
+ isFoundryEnabled()
12
+ ? $pickenv("ANTHROPIC_FOUNDRY_API_KEY", "ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY")
13
+ : $pickenv("ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"),
14
+ login: async (cb: OAuthLoginCallbacks) => {
15
+ // Lazy import: keep heavy OAuth flow modules out of the eager registry graph.
16
+ const { loginAnthropic } = await import("./oauth/anthropic");
17
+ return loginAnthropic(cb);
18
+ },
19
+ refreshToken: async (credentials: OAuthCredentials) => {
20
+ // Lazy import: keep heavy OAuth flow modules out of the eager registry graph.
21
+ const { refreshAnthropicToken } = await import("./oauth/anthropic");
22
+ return refreshAnthropicToken(credentials.refresh);
23
+ },
24
+ callbackPort: 54545,
25
+ pasteCodeFlow: true,
26
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Shared factory for API-key-paste "login" flows.
3
+ *
4
+ * Several providers (Cerebras, Synthetic, Moonshot, Together, NanoGPT, ZenMux)
5
+ * don't actually implement OAuth — they just ask the user to paste an API key,
6
+ * optionally validate it, and return the trimmed key.
7
+ */
8
+
9
+ import * as AIError from "../error";
10
+ import {
11
+ validateAnthropicCompatibleApiKey,
12
+ validateApiKeyAgainstModelsEndpoint,
13
+ validateOpenAICompatibleApiKey,
14
+ } from "./api-key-validation";
15
+ import type { OAuthController } from "./oauth/types";
16
+
17
+ type ChatCompletionsValidation = {
18
+ kind: "chat-completions";
19
+ provider: string;
20
+ baseUrl: string;
21
+ model: string;
22
+ };
23
+
24
+ type AnthropicMessagesValidation = {
25
+ kind: "anthropic-messages";
26
+ provider: string;
27
+ baseUrl: string;
28
+ model: string;
29
+ };
30
+
31
+ type ModelsEndpointValidation = {
32
+ kind: "models-endpoint";
33
+ provider: string;
34
+ modelsUrl: string;
35
+ headers?: Record<string, string> | (() => Record<string, string> | undefined);
36
+ };
37
+
38
+ export type ApiKeyLoginConfig = {
39
+ /** Display name used in error messages, e.g. "Cerebras", "NanoGPT". */
40
+ providerLabel: string;
41
+ /** URL opened in browser for the user to grab their key. */
42
+ authUrl: string;
43
+ /** Instructions shown with the onAuth callback. */
44
+ instructions: string;
45
+ /** Prompt message shown when asking for the key paste. */
46
+ promptMessage: string;
47
+ /** Placeholder string for the prompt (e.g. "sk-...", "csk-..."). */
48
+ placeholder: string;
49
+ /** Validation strategy, or `null` to skip validation. */
50
+ validation: ChatCompletionsValidation | AnthropicMessagesValidation | ModelsEndpointValidation | null;
51
+ };
52
+
53
+ export function createApiKeyLogin(config: ApiKeyLoginConfig): (options: OAuthController) => Promise<string> {
54
+ return async function login(options: OAuthController): Promise<string> {
55
+ if (!options.onPrompt) {
56
+ throw new AIError.OnPromptRequiredError(config.providerLabel);
57
+ }
58
+
59
+ options.onAuth?.({
60
+ url: config.authUrl,
61
+ instructions: config.instructions,
62
+ });
63
+
64
+ const apiKey = await options.onPrompt({
65
+ message: config.promptMessage,
66
+ placeholder: config.placeholder,
67
+ });
68
+
69
+ if (options.signal?.aborted) {
70
+ throw new AIError.LoginCancelledError();
71
+ }
72
+
73
+ const trimmed = apiKey.trim();
74
+ if (!trimmed) {
75
+ throw new AIError.ApiKeyRequiredError();
76
+ }
77
+
78
+ if (config.validation) {
79
+ options.onProgress?.("Validating API key...");
80
+ if (config.validation.kind === "chat-completions") {
81
+ await validateOpenAICompatibleApiKey({
82
+ provider: config.validation.provider,
83
+ apiKey: trimmed,
84
+ baseUrl: config.validation.baseUrl,
85
+ model: config.validation.model,
86
+ signal: options.signal,
87
+ fetch: options.fetch,
88
+ });
89
+ } else if (config.validation.kind === "anthropic-messages") {
90
+ await validateAnthropicCompatibleApiKey({
91
+ provider: config.validation.provider,
92
+ apiKey: trimmed,
93
+ baseUrl: config.validation.baseUrl,
94
+ model: config.validation.model,
95
+ signal: options.signal,
96
+ fetch: options.fetch,
97
+ });
98
+ } else {
99
+ await validateApiKeyAgainstModelsEndpoint({
100
+ provider: config.validation.provider,
101
+ apiKey: trimmed,
102
+ modelsUrl: config.validation.modelsUrl,
103
+ headers: config.validation.headers,
104
+ signal: options.signal,
105
+ fetch: options.fetch,
106
+ });
107
+ }
108
+ }
109
+
110
+ return trimmed;
111
+ };
112
+ }
@@ -0,0 +1,161 @@
1
+ import * as AIError from "../error";
2
+ import type { FetchImpl } from "../types";
3
+
4
+ type OpenAICompatibleValidationOptions = {
5
+ provider: string;
6
+ apiKey: string;
7
+ baseUrl: string;
8
+ model: string;
9
+ signal?: AbortSignal;
10
+ fetch?: FetchImpl;
11
+ };
12
+ type AnthropicCompatibleValidationOptions = {
13
+ provider: string;
14
+ apiKey: string;
15
+ baseUrl: string;
16
+ model: string;
17
+ signal?: AbortSignal;
18
+ fetch?: FetchImpl;
19
+ };
20
+
21
+ type ModelListValidationOptions = {
22
+ provider: string;
23
+ apiKey: string;
24
+ modelsUrl: string;
25
+ headers?: Record<string, string> | (() => Record<string, string> | undefined);
26
+ signal?: AbortSignal;
27
+ fetch?: FetchImpl;
28
+ };
29
+
30
+ const VALIDATION_TIMEOUT_MS = 15_000;
31
+
32
+ function normalizeAnthropicCompatibleBaseUrl(baseUrl: string): string {
33
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
34
+ return trimmed.endsWith("/v1") ? trimmed.slice(0, -3) : trimmed;
35
+ }
36
+
37
+ function resolveValidationHeaders(
38
+ headers: Record<string, string> | (() => Record<string, string> | undefined) | undefined,
39
+ ): Record<string, string> | undefined {
40
+ return typeof headers === "function" ? headers() : headers;
41
+ }
42
+
43
+ /**
44
+ * Validate an API key against an OpenAI-compatible chat completions endpoint.
45
+ *
46
+ * Performs a minimal request to verify credentials and endpoint access.
47
+ */
48
+ export async function validateOpenAICompatibleApiKey(options: OpenAICompatibleValidationOptions): Promise<void> {
49
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
50
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
51
+ const fetchImpl = options.fetch ?? fetch;
52
+
53
+ const response = await fetchImpl(`${options.baseUrl}/chat/completions`, {
54
+ method: "POST",
55
+ headers: {
56
+ "Content-Type": "application/json",
57
+ Authorization: `Bearer ${options.apiKey}`,
58
+ },
59
+ body: JSON.stringify({
60
+ model: options.model,
61
+ messages: [{ role: "user", content: "ping" }],
62
+ max_tokens: 1,
63
+ temperature: 0,
64
+ }),
65
+ signal,
66
+ });
67
+
68
+ if (response.ok) {
69
+ return;
70
+ }
71
+
72
+ let details = "";
73
+ try {
74
+ details = (await response.text()).trim();
75
+ } catch {
76
+ // ignore body parse errors, status is enough
77
+ }
78
+
79
+ const message = details
80
+ ? `${options.provider} API key validation failed (${response.status}): ${details}`
81
+ : `${options.provider} API key validation failed (${response.status})`;
82
+ throw new AIError.ApiKeyRequiredError(message);
83
+ }
84
+
85
+ /**
86
+ * Validate an API key against an Anthropic-compatible messages endpoint.
87
+ */
88
+ export async function validateAnthropicCompatibleApiKey(options: AnthropicCompatibleValidationOptions): Promise<void> {
89
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
90
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
91
+ const baseUrl = normalizeAnthropicCompatibleBaseUrl(options.baseUrl);
92
+ const fetchImpl = options.fetch ?? fetch;
93
+
94
+ const response = await fetchImpl(`${baseUrl}/v1/messages`, {
95
+ method: "POST",
96
+ headers: {
97
+ "Content-Type": "application/json",
98
+ "anthropic-version": "2023-06-01",
99
+ "x-api-key": options.apiKey,
100
+ },
101
+ body: JSON.stringify({
102
+ model: options.model,
103
+ messages: [{ role: "user", content: "ping" }],
104
+ max_tokens: 1,
105
+ }),
106
+ signal,
107
+ });
108
+
109
+ if (response.ok) {
110
+ return;
111
+ }
112
+
113
+ let details = "";
114
+ try {
115
+ details = (await response.text()).trim();
116
+ } catch {
117
+ // ignore body parse errors, status is enough
118
+ }
119
+
120
+ const message = details
121
+ ? `${options.provider} API key validation failed (${response.status}): ${details}`
122
+ : `${options.provider} API key validation failed (${response.status})`;
123
+ throw new AIError.ApiKeyRequiredError(message);
124
+ }
125
+
126
+ /**
127
+ * Validate an API key against a provider models endpoint.
128
+ *
129
+ * Useful for providers where access to specific models may vary by plan and
130
+ * should not block key validation.
131
+ */
132
+ export async function validateApiKeyAgainstModelsEndpoint(options: ModelListValidationOptions): Promise<void> {
133
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
134
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
135
+ const fetchImpl = options.fetch ?? fetch;
136
+
137
+ const response = await fetchImpl(options.modelsUrl, {
138
+ method: "GET",
139
+ headers: {
140
+ ...(resolveValidationHeaders(options.headers) ?? {}),
141
+ Authorization: `Bearer ${options.apiKey}`,
142
+ },
143
+ signal,
144
+ });
145
+
146
+ if (response.ok) {
147
+ return;
148
+ }
149
+
150
+ let details = "";
151
+ try {
152
+ details = (await response.text()).trim();
153
+ } catch {
154
+ // ignore body parse errors, status is enough
155
+ }
156
+
157
+ const message = details
158
+ ? `${options.provider} API key validation failed (${response.status}): ${details}`
159
+ : `${options.provider} API key validation failed (${response.status})`;
160
+ throw new AIError.ApiKeyRequiredError(message);
161
+ }
@@ -0,0 +1,6 @@
1
+ import type { ProviderDefinition } from "./types";
2
+
3
+ export const azureProvider = {
4
+ id: "azure",
5
+ name: "Azure OpenAI",
6
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,23 @@
1
+ import { createApiKeyLogin } from "./api-key-login";
2
+ import type { OAuthLoginCallbacks } from "./oauth/types";
3
+ import type { ProviderDefinition } from "./types";
4
+
5
+ export const loginCerebras = createApiKeyLogin({
6
+ providerLabel: "Cerebras",
7
+ authUrl: "https://cloud.cerebras.ai/platform/",
8
+ instructions: "Copy your API key from the Cerebras dashboard",
9
+ promptMessage: "Paste your Cerebras API key",
10
+ placeholder: "csk-...",
11
+ validation: {
12
+ kind: "chat-completions",
13
+ provider: "Cerebras",
14
+ baseUrl: "https://api.cerebras.ai/v1",
15
+ model: "gpt-oss-120b",
16
+ },
17
+ });
18
+
19
+ export const cerebrasProvider = {
20
+ id: "cerebras",
21
+ name: "Cerebras",
22
+ login: (cb: OAuthLoginCallbacks) => loginCerebras(cb),
23
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,45 @@
1
+ import * as AIError from "../error";
2
+ import type { OAuthController, OAuthLoginCallbacks } from "./oauth/types";
3
+ import type { ProviderDefinition } from "./types";
4
+
5
+ const AUTH_URL = "https://developers.cloudflare.com/ai-gateway/configuration/authentication/";
6
+
7
+ /**
8
+ * Login to Cloudflare AI Gateway.
9
+ *
10
+ * Opens browser to Cloudflare AI Gateway authentication docs and prompts for a gateway token/API key.
11
+ * Returns the API key directly (not OAuthCredentials - this isn't OAuth).
12
+ */
13
+ export async function loginCloudflareAiGateway(options: OAuthController): Promise<string> {
14
+ if (!options.onPrompt) {
15
+ throw new AIError.OnPromptRequiredError("Cloudflare AI Gateway");
16
+ }
17
+
18
+ options.onAuth?.({
19
+ url: AUTH_URL,
20
+ instructions:
21
+ "Copy your Cloudflare AI Gateway token/API key. Configure account/gateway base URL in models config.",
22
+ });
23
+
24
+ const apiKey = await options.onPrompt({
25
+ message: "Paste your Cloudflare AI Gateway token/API key",
26
+ placeholder: "cf-aig-...",
27
+ });
28
+
29
+ if (options.signal?.aborted) {
30
+ throw new AIError.LoginCancelledError();
31
+ }
32
+
33
+ const trimmed = apiKey.trim();
34
+ if (!trimmed) {
35
+ throw new AIError.ApiKeyRequiredError();
36
+ }
37
+
38
+ return trimmed;
39
+ }
40
+
41
+ export const cloudflareAiGatewayProvider = {
42
+ id: "cloudflare-ai-gateway",
43
+ name: "Cloudflare AI Gateway",
44
+ login: (cb: OAuthLoginCallbacks) => loginCloudflareAiGateway(cb),
45
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,40 @@
1
+ import { coreWeaveProjectHeaders } from "jeopi-catalog/wire/coreweave";
2
+ import { $env } from "jeopi-utils";
3
+ import * as AIError from "../error";
4
+ import { createApiKeyLogin } from "./api-key-login";
5
+ import type { OAuthLoginCallbacks } from "./oauth/types";
6
+ import type { ProviderDefinition } from "./types";
7
+
8
+ const PROJECT_PERSIST_INSTRUCTIONS =
9
+ "add export COREWEAVE_PROJECT=<team>/<project> to your shell startup file (for example ~/.zshrc, ~/.bashrc, or your shell's profile/rc file)";
10
+ const PROJECT_SETUP_INSTRUCTIONS = `Create or select a CoreWeave Serverless Inference project, ${PROJECT_PERSIST_INSTRUCTIONS} for the OpenAI-Project header, then copy your API key from account settings`;
11
+
12
+ function requireCoreWeaveProjectHeaders(): Record<string, string> {
13
+ const headers = coreWeaveProjectHeaders($env);
14
+ if (!headers) {
15
+ throw new AIError.ConfigurationError(
16
+ `CoreWeave Serverless Inference requires OpenAI-Project. Set COREWEAVE_PROJECT=<team>/<project> before running /login coreweave. To persist it, ${PROJECT_PERSIST_INSTRUCTIONS}.`,
17
+ );
18
+ }
19
+ return headers;
20
+ }
21
+
22
+ export const loginCoreWeave = createApiKeyLogin({
23
+ providerLabel: "CoreWeave Serverless Inference",
24
+ authUrl: "https://wandb.ai/settings",
25
+ instructions: PROJECT_SETUP_INSTRUCTIONS,
26
+ promptMessage: "Paste your CoreWeave Serverless Inference API key",
27
+ placeholder: "api-key",
28
+ validation: {
29
+ kind: "models-endpoint",
30
+ provider: "CoreWeave Serverless Inference",
31
+ modelsUrl: "https://api.inference.wandb.ai/v1/models",
32
+ headers: requireCoreWeaveProjectHeaders,
33
+ },
34
+ });
35
+
36
+ export const coreWeaveProvider = {
37
+ id: "coreweave",
38
+ name: "CoreWeave Serverless Inference",
39
+ login: (cb: OAuthLoginCallbacks) => loginCoreWeave(cb),
40
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,20 @@
1
+ import type { OAuthCredentials, OAuthLoginCallbacks } from "./oauth/types";
2
+ import type { ProviderDefinition } from "./types";
3
+
4
+ export const cursorProvider = {
5
+ id: "cursor",
6
+ name: "Cursor (Claude, GPT, etc.)",
7
+ login: async (cb: OAuthLoginCallbacks) => {
8
+ // Lazy import: keep heavy OAuth flow modules out of the eager registry graph.
9
+ const { loginCursor } = await import("./oauth/cursor");
10
+ return loginCursor(
11
+ url => cb.onAuth({ url }),
12
+ cb.onProgress ? () => cb.onProgress?.("Waiting for browser authentication...") : undefined,
13
+ );
14
+ },
15
+ refreshToken: async (credentials: OAuthCredentials) => {
16
+ // Lazy import: keep heavy OAuth flow modules out of the eager registry graph.
17
+ const { refreshCursorToken } = await import("./oauth/cursor");
18
+ return refreshCursorToken(credentials.refresh);
19
+ },
20
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,46 @@
1
+ import * as AIError from "../error";
2
+ import { createApiKeyLogin } from "./api-key-login";
3
+ import type { OAuthController, OAuthLoginCallbacks, OAuthPrompt } from "./oauth/types";
4
+ import type { ProviderDefinition } from "./types";
5
+
6
+ const innerLogin = createApiKeyLogin({
7
+ providerLabel: "DeepSeek",
8
+ authUrl: "https://platform.deepseek.com/api_keys",
9
+ instructions: "Create or copy your API key from the DeepSeek dashboard",
10
+ promptMessage: "Paste your DeepSeek API key",
11
+ placeholder: "sk-...",
12
+ validation: {
13
+ kind: "models-endpoint",
14
+ provider: "deepseek",
15
+ modelsUrl: "https://api.deepseek.com/v1/models",
16
+ },
17
+ });
18
+
19
+ export function normalizeDeepSeekApiKey(raw: string): string {
20
+ const trimmed = raw.trim();
21
+ if (!trimmed) {
22
+ return trimmed;
23
+ }
24
+ const stripped = trimmed.replace(/^bearer\b\s*/i, "");
25
+ if (!stripped) {
26
+ throw new AIError.ApiKeyRequiredError("DeepSeek API key is empty after stripping Bearer prefix");
27
+ }
28
+ return stripped;
29
+ }
30
+
31
+ export const loginDeepSeek = async (options: OAuthController): Promise<string> => {
32
+ const userOnPrompt = options.onPrompt;
33
+ const wrapped: OAuthController = userOnPrompt
34
+ ? {
35
+ ...options,
36
+ onPrompt: async (prompt: OAuthPrompt) => normalizeDeepSeekApiKey(await userOnPrompt(prompt)),
37
+ }
38
+ : options;
39
+ return innerLogin(wrapped);
40
+ };
41
+
42
+ export const deepseekProvider = {
43
+ id: "deepseek",
44
+ name: "DeepSeek",
45
+ login: (cb: OAuthLoginCallbacks) => loginDeepSeek(cb),
46
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,9 @@
1
+ import { PROVIDER_REGISTRY } from "./registry";
2
+
3
+ /**
4
+ * Providers whose OAuth flow needs a pasted code/redirect URL rather than a
5
+ * local callback server. Consumed by the coding-agent login UX.
6
+ */
7
+ export const PASTE_CODE_LOGIN_PROVIDERS: ReadonlySet<string> = new Set(
8
+ PROVIDER_REGISTRY.filter(p => p.pasteCodeFlow).map(p => p.id),
9
+ );