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,58 @@
1
+ import { attach, create, Flag } from "./flags";
2
+
3
+ /**
4
+ * What stage of an OAuth / device-code login flow failed. Discriminates the
5
+ * single {@link OAuthError} class so login flows don't each mint a bespoke
6
+ * error type.
7
+ */
8
+ export type OAuthErrorKind =
9
+ /** Token-exchange / refresh / discovery HTTP response was non-2xx or unparseable. */
10
+ | "http"
11
+ /** Response body was missing required fields (token, account id, endpoints, …). */
12
+ | "validation"
13
+ /** Authorization-code → token exchange failed. */
14
+ | "token-exchange"
15
+ /** Refresh-token grant failed. */
16
+ | "token-refresh"
17
+ /** Device-code / authorization polling failed (server error, too many retries). */
18
+ | "polling"
19
+ /** The flow exceeded its deadline (device-code expiry, polling timeout). */
20
+ | "timeout"
21
+ /** Device authorization was denied or cancelled by the user/provider. */
22
+ | "device-auth"
23
+ /** Misconfiguration (bad redirect URI, missing projectId, callback bind, …). */
24
+ | "configuration"
25
+ /** Cloud project provisioning / onboarding (loadCodeAssist, onboardUser). */
26
+ | "provisioning"
27
+ /** OIDC / endpoint discovery failed. */
28
+ | "discovery";
29
+
30
+ export interface OAuthErrorOptions {
31
+ kind?: OAuthErrorKind;
32
+ provider?: string;
33
+ status?: number;
34
+ cause?: unknown;
35
+ }
36
+
37
+ /**
38
+ * A failure inside an interactive OAuth / device-code login flow. The `kind`
39
+ * pinpoints the stage. Timeout/polling are classified transient; everything
40
+ * else is a hard auth failure so the credential layer does not silently retry.
41
+ */
42
+ export class OAuthError extends Error {
43
+ readonly kind: OAuthErrorKind;
44
+ readonly provider: string | undefined;
45
+ readonly status: number | undefined;
46
+
47
+ constructor(message: string, options: OAuthErrorOptions = {}) {
48
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
49
+ this.name = "OAuthError";
50
+ this.kind = options.kind ?? "http";
51
+ this.provider = options.provider;
52
+ this.status = options.status;
53
+ attach(
54
+ this,
55
+ this.kind === "timeout" || this.kind === "polling" ? create(Flag.Transient) : create(Flag.AuthFailed),
56
+ );
57
+ }
58
+ }
@@ -0,0 +1,62 @@
1
+ import { ProviderHttpError } from "./classes";
2
+ import { attach, create, Flag } from "./flags";
3
+
4
+ /** Which part of a provider exchange produced a non-HTTP error. */
5
+ export type ProviderResponseErrorKind =
6
+ /** Stream closed before a terminal completion/response event. */
7
+ | "incomplete-stream"
8
+ /** Terminal event carried an error / unexpected stop reason. */
9
+ | "output"
10
+ /** Response body was empty/missing when content was required. */
11
+ | "empty-body"
12
+ /** Malformed wire envelope (unexpected message ordering / shape). */
13
+ | "envelope"
14
+ /** Content was blocked by a provider safety filter. */
15
+ | "content-blocked"
16
+ /** Runtime/namespace resolution or other provider-internal failure. */
17
+ | "runtime";
18
+
19
+ export interface ProviderResponseErrorOptions {
20
+ provider?: string;
21
+ kind?: ProviderResponseErrorKind;
22
+ cause?: unknown;
23
+ }
24
+
25
+ /**
26
+ * A non-HTTP provider failure: a truncated stream, an error stop reason, an
27
+ * empty body, a malformed envelope, or a runtime fault. For non-2xx HTTP
28
+ * responses use {@link ProviderHttpError} (or a provider subclass) instead.
29
+ */
30
+ export class ProviderResponseError extends Error {
31
+ readonly provider: string | undefined;
32
+ readonly kind: ProviderResponseErrorKind;
33
+
34
+ constructor(message: string, options: ProviderResponseErrorOptions = {}) {
35
+ super(message, options.cause === undefined ? undefined : { cause: options.cause });
36
+ this.name = "ProviderResponseError";
37
+ this.provider = options.provider;
38
+ this.kind = options.kind ?? "output";
39
+ // A safety filter block is a terminal provider finish, not a transient fault.
40
+ if (this.kind === "content-blocked") attach(this, create(Flag.ProviderFinishError));
41
+ // An incomplete stream (connection dropped / truncated before any terminal
42
+ // event) never produced a finish reason — the request didn't complete, so it
43
+ // is safe to retry. The retry layer's replay-unsafe guard still blocks a
44
+ // retry when partial tool output was already emitted.
45
+ else if (this.kind === "incomplete-stream") attach(this, create(Flag.Transient));
46
+ }
47
+ }
48
+
49
+ /** Non-2xx response from the Devin API. */
50
+ export class DevinApiError extends ProviderHttpError {
51
+ override readonly name = "DevinApiError";
52
+ }
53
+
54
+ /** Non-2xx response from the GitLab Duo direct-access API. */
55
+ export class GitLabDuoApiError extends ProviderHttpError {
56
+ override readonly name = "GitLabDuoApiError";
57
+ }
58
+
59
+ /** Non-2xx response from the GitLab Duo Workflow API. */
60
+ export class GitLabDuoWorkflowApiError extends ProviderHttpError {
61
+ override readonly name = "GitLabDuoWorkflowApiError";
62
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Rate limit reason classification and backoff calculation utilities.
3
+ * Ported from opencode-antigravity-auth plugin for consistency.
4
+ */
5
+
6
+ export type RateLimitReason =
7
+ | "QUOTA_EXHAUSTED"
8
+ | "RATE_LIMIT_EXCEEDED"
9
+ | "MODEL_CAPACITY_EXHAUSTED"
10
+ | "SERVER_ERROR"
11
+ | "UNKNOWN";
12
+
13
+ const QUOTA_EXHAUSTED_BACKOFF_MS = 30 * 60 * 1000; // 30 min
14
+ const RATE_LIMIT_EXCEEDED_BACKOFF_MS = 30 * 1000; // 30s
15
+ const MODEL_CAPACITY_BASE_MS = 45 * 1000; // 45s base
16
+ const MODEL_CAPACITY_JITTER_MS = 30 * 1000; // ±15s
17
+ const SERVER_ERROR_BACKOFF_MS = 20 * 1000; // 20s
18
+
19
+ const ACCOUNT_RATE_LIMIT_PATTERN =
20
+ /\baccount(?:'s)?\b[^\n]{0,80}\brate.?limit\b|\brate.?limit\b[^\n]{0,80}\baccount\b/i;
21
+ const INSUFFICIENT_BALANCE_PATTERN = /insufficient.?balance/i;
22
+
23
+ /**
24
+ * Classify a rate-limit error message into a reason category.
25
+ * Priority order: QUOTA (Antigravity "quota will reset") > MODEL_CAPACITY > QUOTA (account) >
26
+ * RATE_LIMIT > QUOTA (generic) > SERVER_ERROR > UNKNOWN.
27
+ *
28
+ * "resource exhausted" maps to MODEL_CAPACITY (transient, short wait)
29
+ * "quota exceeded" / "quota will reset" maps to QUOTA_EXHAUSTED (long wait, switch account)
30
+ */
31
+ export function parseRateLimitReason(errorMessage: string): RateLimitReason {
32
+ const lower = errorMessage.toLowerCase();
33
+
34
+ // Antigravity / Cloud Code Assist surface multi-hour daily-quota exhaustion as
35
+ // "You have exhausted your capacity on this model. Your quota will reset after …".
36
+ // The literal "capacity" used to pre-empt the QUOTA branch even though "quota
37
+ // will reset" is the long-wait signal — short-circuit here before the
38
+ // MODEL_CAPACITY fallthrough so credential rotation (not 60s backoff) kicks in.
39
+ if (lower.includes("quota will reset") || lower.includes("exhausted your capacity")) {
40
+ return "QUOTA_EXHAUSTED";
41
+ }
42
+
43
+ if (
44
+ lower.includes("capacity") ||
45
+ lower.includes("overloaded") ||
46
+ lower.includes("529") ||
47
+ lower.includes("503") ||
48
+ lower.includes("resource exhausted")
49
+ ) {
50
+ return "MODEL_CAPACITY_EXHAUSTED";
51
+ }
52
+
53
+ if (ACCOUNT_RATE_LIMIT_PATTERN.test(errorMessage)) {
54
+ return "QUOTA_EXHAUSTED";
55
+ }
56
+
57
+ if (
58
+ lower.includes("per minute") ||
59
+ lower.includes("rate limit") ||
60
+ lower.includes("too many requests") ||
61
+ lower.includes("presque")
62
+ ) {
63
+ return "RATE_LIMIT_EXCEEDED";
64
+ }
65
+
66
+ if (
67
+ lower.includes("exhausted") ||
68
+ lower.includes("quota") ||
69
+ lower.includes("usage limit") ||
70
+ INSUFFICIENT_BALANCE_PATTERN.test(errorMessage)
71
+ ) {
72
+ return "QUOTA_EXHAUSTED";
73
+ }
74
+
75
+ if (lower.includes("500") || lower.includes("internal error") || lower.includes("internal server error")) {
76
+ return "SERVER_ERROR";
77
+ }
78
+
79
+ return "UNKNOWN";
80
+ }
81
+
82
+ /**
83
+ * Calculate backoff delay in ms for a given rate limit reason.
84
+ * MODEL_CAPACITY gets jitter to prevent thundering herd.
85
+ */
86
+ export function calculateRateLimitBackoffMs(reason: RateLimitReason): number {
87
+ switch (reason) {
88
+ case "QUOTA_EXHAUSTED":
89
+ return QUOTA_EXHAUSTED_BACKOFF_MS;
90
+ case "RATE_LIMIT_EXCEEDED":
91
+ return RATE_LIMIT_EXCEEDED_BACKOFF_MS;
92
+ case "MODEL_CAPACITY_EXHAUSTED":
93
+ return MODEL_CAPACITY_BASE_MS + Math.random() * MODEL_CAPACITY_JITTER_MS;
94
+ case "SERVER_ERROR":
95
+ return SERVER_ERROR_BACKOFF_MS;
96
+ default:
97
+ return QUOTA_EXHAUSTED_BACKOFF_MS; // conservative default
98
+ }
99
+ }
100
+
101
+ /** Detect usage/quota limit errors in error messages (persistent, requires credential switch). */
102
+ const USAGE_LIMIT_PATTERN =
103
+ /usage.?limit|usage_limit_reached|usage_not_included|limit_reached|quota.?exceeded|quota.?reached|resource.?exhausted|exhausted your capacity|quota will reset|insufficient.?(?:balance|quota)/i;
104
+
105
+ /**
106
+ * HTTP status codes that, absent richer body classification, represent an
107
+ * account-local usage cap rather than a bad credential or a transient blip.
108
+ * Always combine with {@link isUsageLimitOutcome} when a message is available
109
+ * — a 429 carrying transient rate-limit wording is NOT a usage cap.
110
+ */
111
+ export function isUsageLimitStatus(status: number | undefined): boolean {
112
+ return status === 429;
113
+ }
114
+
115
+ /**
116
+ * Returns true for failures that should burn one credential and rotate to a
117
+ * sibling account. Decision tree:
118
+ *
119
+ * 1. Body matches {@link isUsageLimitError} (Codex `usage_limit_reached`,
120
+ * Anthropic account rate-limit, Google `resource_exhausted`, OpenAI
121
+ * `insufficient_quota`, …) → rotate.
122
+ * 2. Status is not 429 → backoff (caller's domain).
123
+ * 3. Body is absent or {@link isOpaqueStatusBody opaque} (just the status,
124
+ * empty JSON, HTTP framing only) → rotate conservatively: the server
125
+ * gave us nothing else to go on.
126
+ * 4. Body has content → defer to {@link parseRateLimitReason}. Only
127
+ * `QUOTA_EXHAUSTED` rotates; `RATE_LIMIT_EXCEEDED` (`Too many requests`,
128
+ * per-minute caps), `MODEL_CAPACITY_EXHAUSTED` (`Service overloaded`),
129
+ * `SERVER_ERROR`, and `UNKNOWN` (`Please retry in 5s`) stay in the
130
+ * provider's own backoff layer so transient 429s don't burn sibling
131
+ * credentials.
132
+ */
133
+ export function isUsageLimitOutcome(status: number | undefined, message: string | undefined): boolean {
134
+ if (message && matchesUsageLimitText(message)) return true;
135
+ if (!isUsageLimitStatus(status)) return false;
136
+ if (!message || isOpaqueStatusBody(message)) return true;
137
+ return parseRateLimitReason(message) === "QUOTA_EXHAUSTED";
138
+ }
139
+
140
+ /**
141
+ * A 429 body is opaque when it carries no signal beyond the status itself —
142
+ * empty, whitespace-only, the status digits with HTTP/JSON framing, or
143
+ * generic punctuation. Anything else (retry hints, capacity wording, error
144
+ * descriptions) is informative enough to defer to the classifier.
145
+ */
146
+ export function isOpaqueStatusBody(message: string): boolean {
147
+ const cleaned = message
148
+ .replace(/\b429\b/g, "")
149
+ .replace(/\b(?:http|https|status|error|code|response|message)\b/gi, "");
150
+ return !/[a-z\d]{3,}/i.test(cleaned);
151
+ }
152
+
153
+ /**
154
+ * Internal text matcher for usage/quota-limit phrasing. NOT part of the public
155
+ * API — callers classify through {@link import("./flags").isUsageLimit} (the
156
+ * flag accessor). `flags.ts` consumes this to populate `Flag.UsageLimit`, and
157
+ * {@link isUsageLimitOutcome} uses it for the account-rotation decision.
158
+ */
159
+ export function matchesUsageLimitText(errorMessage: string): boolean {
160
+ return USAGE_LIMIT_PATTERN.test(errorMessage) || ACCOUNT_RATE_LIMIT_PATTERN.test(errorMessage);
161
+ }
@@ -0,0 +1,70 @@
1
+ import { isRetryableError, isUnexpectedSocketCloseMessage } from "jeopi-utils";
2
+ import {
3
+ isRetryableStreamEnvelopeError,
4
+ isTransientStreamParseError,
5
+ isUsageLimit,
6
+ status,
7
+ TRANSIENT_TRANSPORT_PATTERN,
8
+ } from "./flags";
9
+
10
+ /**
11
+ * Whether a numeric HTTP status is in the canonical transient/retryable set:
12
+ * 408 (Request Timeout), 429 (Too Many Requests), and any 5xx.
13
+ *
14
+ * This is a pure predicate over a status code already in hand — distinct from
15
+ * {@link classify}, which inspects a whole error (including message text) and
16
+ * may match more. Use this when you only have a `status: number`.
17
+ */
18
+ export function isTransientStatus(status: number | undefined): boolean {
19
+ return status !== undefined && (status === 408 || status === 429 || status >= 500);
20
+ }
21
+
22
+ // Provider-stream transient phrasings not covered by the shared
23
+ // TRANSIENT_TRANSPORT_PATTERN (TLS record corruption, HTTP/2 peer stream
24
+ // errors, upstream code 1302). The shared pattern already covers rate-limit /
25
+ // overloaded / 5xx / timeout / first-event wording.
26
+ const PROVIDER_TRANSIENT_EXTRA_PATTERN = /bad record mac|stream error.*received from peer|1302/i;
27
+
28
+ function isTransientTransportMessage(message: string): boolean {
29
+ return message.includes("tls: bad record mac") || message.includes("type=server_error");
30
+ }
31
+
32
+ /** Hook for provider-specific transient detection that the error module must not import directly. */
33
+ export interface ProviderRetryableHooks {
34
+ /** Provider id of the failing request, used to gate provider-specific checks. */
35
+ provider?: string;
36
+ /** Provider-specific transient predicate (e.g. Copilot `model_not_supported`). */
37
+ isProviderTransient?: (error: Error) => boolean;
38
+ }
39
+
40
+ /**
41
+ * Whether a provider stream error should be retried against the same credential.
42
+ *
43
+ * Account-level usage/quota limits are deliberately treated as **non**-retryable
44
+ * here — they are owned by the credential-rotation layer (auth-gateway /
45
+ * `streamSimple` a/b/c policy), not this seconds-scale provider backoff.
46
+ *
47
+ * Provider-specific transient cases are injected via {@link ProviderRetryableHooks}
48
+ * so this stays free of provider imports.
49
+ */
50
+ export function isProviderRetryableError(error: unknown, hooks: ProviderRetryableHooks = {}): boolean {
51
+ if (!(error instanceof Error)) return false;
52
+ if (hooks.isProviderTransient?.(error)) return true;
53
+ if (isUsageLimit(error)) return false;
54
+ const httpStatus = status(error);
55
+ if (httpStatus !== undefined && httpStatus >= 400 && httpStatus < 500 && httpStatus !== 408 && httpStatus !== 429) {
56
+ return false;
57
+ }
58
+ const msg = error.message.toLowerCase();
59
+ if (
60
+ isUnexpectedSocketCloseMessage(msg) ||
61
+ isTransientTransportMessage(msg) ||
62
+ TRANSIENT_TRANSPORT_PATTERN.test(msg) ||
63
+ PROVIDER_TRANSIENT_EXTRA_PATTERN.test(msg) ||
64
+ isTransientStreamParseError(error) ||
65
+ isRetryableStreamEnvelopeError(error)
66
+ ) {
67
+ return true;
68
+ }
69
+ return isRetryableError(error);
70
+ }
@@ -0,0 +1,44 @@
1
+ import { attach, create, Flag } from "./flags";
2
+
3
+ /**
4
+ * Caller-supplied input failed validation before/while building a provider
5
+ * request: bad request body, malformed tool arguments, unsupported content
6
+ * type, a schema that cannot be normalized, an unknown tool, etc.
7
+ *
8
+ * This is a programmer/config/contract error, not a transient provider fault —
9
+ * it is never retried.
10
+ */
11
+ export class ValidationError extends Error {
12
+ constructor(message: string, options?: { cause?: unknown }) {
13
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
14
+ this.name = "ValidationError";
15
+ }
16
+ }
17
+
18
+ /** A referenced tool was not found in the active tool set. */
19
+ export class ToolNotFoundError extends ValidationError {
20
+ constructor(toolName: string) {
21
+ super(`Tool "${toolName}" not found`);
22
+ this.name = "ToolNotFoundError";
23
+ }
24
+ }
25
+
26
+ /**
27
+ * Provider/auth configuration was missing or malformed (env var pointing at a
28
+ * missing file, missing projectId, bad bind string, mTLS half-configured, …).
29
+ */
30
+ export class ConfigurationError extends Error {
31
+ constructor(message: string, options?: { cause?: unknown }) {
32
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
33
+ this.name = "ConfigurationError";
34
+ }
35
+ }
36
+
37
+ /** A request was abandoned because it exceeded a stream/idle/first-event deadline. */
38
+ export class StreamTimeoutError extends Error {
39
+ constructor(message = "Request timed out.", options?: { cause?: unknown }) {
40
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
41
+ this.name = "StreamTimeoutError";
42
+ attach(this, create(Flag.Transient, Flag.Timeout));
43
+ }
44
+ }
package/src/index.ts ADDED
@@ -0,0 +1,49 @@
1
+ export { type Type, type } from "arktype";
2
+ export { type ZodType, z } from "zod/v4";
3
+ export * from "./api-registry";
4
+ export type * from "./auth-broker";
5
+ export type { AuthGatewayBootOptions, ModelResolver } from "./auth-gateway/server";
6
+ export * from "./auth-gateway/types";
7
+ export * from "./auth-retry";
8
+ export * from "./auth-storage";
9
+ export * from "./error/rate-limit";
10
+ export * from "./provider-details";
11
+ export * from "./providers/anthropic";
12
+ export * from "./providers/anthropic-client";
13
+ export * from "./providers/azure-openai-responses";
14
+ export type * from "./providers/cursor";
15
+ export * from "./providers/gitlab-duo";
16
+ export * from "./providers/gitlab-duo-workflow";
17
+ export type * from "./providers/google";
18
+ export type * from "./providers/google-gemini-cli";
19
+ export type * from "./providers/google-vertex";
20
+ export * from "./providers/kimi";
21
+ export * from "./providers/mock";
22
+ export * from "./providers/ollama";
23
+ export * from "./providers/openai-codex-responses";
24
+ export * from "./providers/openai-completions";
25
+ export * from "./providers/openai-responses";
26
+ export * from "./providers/synthetic";
27
+ export * from "./registry";
28
+ export * from "./stream";
29
+ export * from "./types";
30
+ export * from "./usage";
31
+ export * from "./usage/claude";
32
+ export * from "./usage/gemini";
33
+ export * from "./usage/github-copilot";
34
+ export * from "./usage/google-antigravity";
35
+ export * from "./usage/kimi";
36
+ export * from "./usage/minimax-code";
37
+ export * from "./usage/ollama";
38
+ export * from "./usage/openai-codex";
39
+ export * from "./usage/openai-codex-reset";
40
+ export * from "./usage/opencode-go";
41
+ export * from "./usage/zai";
42
+ export * from "./utils/anthropic-auth";
43
+ export * from "./utils/event-stream";
44
+ export * from "./utils/openrouter-headers";
45
+ export * from "./utils/retry";
46
+ export * from "./utils/schema";
47
+ export * from "./utils/thinking-loop";
48
+ export * from "./utils/tool-call-loop-guard";
49
+ export * from "./utils/validation";
@@ -0,0 +1,90 @@
1
+ import { getOpenAICodexTransportDetails, type OpenAICodexTransportDetails } from "./providers/openai-codex-responses";
2
+ import type { Api, Model, Provider, ProviderSessionState } from "./types";
3
+
4
+ export interface ProviderDetailField {
5
+ label: string;
6
+ value: string;
7
+ }
8
+
9
+ export interface ProviderDetails {
10
+ provider: Provider;
11
+ api: Api;
12
+ fields: ProviderDetailField[];
13
+ }
14
+
15
+ export interface ProviderDetailsContext {
16
+ model: Model<Api>;
17
+ sessionId?: string;
18
+ authMode?: string;
19
+ /**
20
+ * Human-readable description of the active credential, e.g.
21
+ * `"broker http://omp.internal:8765 · oauth #5 (foo@bar.com)"`.
22
+ * Rendered as a `Source` field; omitted when undefined.
23
+ */
24
+ credentialSource?: string;
25
+ preferWebsockets?: boolean;
26
+ providerSessionState?: Map<string, ProviderSessionState>;
27
+ }
28
+
29
+ export function getProviderDetails(context: ProviderDetailsContext): ProviderDetails {
30
+ const endpoint = formatEndpoint(context.model.baseUrl);
31
+ const fields: ProviderDetailField[] = [
32
+ { label: "Model", value: context.model.id },
33
+ { label: "API", value: context.model.api },
34
+ { label: "Auth", value: context.authMode ?? "auto" },
35
+ { label: "Endpoint", value: endpoint },
36
+ ];
37
+ if (context.credentialSource) {
38
+ fields.push({ label: "Source", value: context.credentialSource });
39
+ }
40
+
41
+ if (context.model.api === "openai-codex-responses") {
42
+ const codexDetails = getOpenAICodexTransportDetails(context.model as Model<"openai-codex-responses">, {
43
+ sessionId: context.sessionId,
44
+ baseUrl: context.model.baseUrl,
45
+ preferWebsockets: context.preferWebsockets,
46
+ providerSessionState: context.providerSessionState,
47
+ });
48
+ fields.push({ label: "Transport", value: formatCodexTransport(codexDetails) });
49
+ fields.push({ label: "WebSocket", value: formatCodexWebSocket(codexDetails) });
50
+ fields.push({ label: "Reuse", value: formatCodexReuse(codexDetails, context.sessionId) });
51
+ }
52
+
53
+ return {
54
+ provider: context.model.provider,
55
+ api: context.model.api,
56
+ fields,
57
+ };
58
+ }
59
+
60
+ function formatEndpoint(baseUrl: string): string {
61
+ try {
62
+ const parsed = new URL(baseUrl);
63
+ const path = parsed.pathname.replace(/\/$/, "");
64
+ return `${parsed.origin}${path || "/"}`;
65
+ } catch {
66
+ return baseUrl;
67
+ }
68
+ }
69
+
70
+ function formatCodexTransport(details: OpenAICodexTransportDetails): string {
71
+ if (details.lastTransport === "websocket") return "websocket";
72
+ if (details.lastTransport === "sse" && (details.websocketDisabled || details.fallbackCount > 0)) {
73
+ return "sse (fallback)";
74
+ }
75
+ if (details.lastTransport === "sse") return "sse";
76
+ return details.websocketPreferred ? "websocket preferred" : "sse";
77
+ }
78
+
79
+ function formatCodexWebSocket(details: OpenAICodexTransportDetails): string {
80
+ if (!details.websocketPreferred) return "off";
81
+ if (details.websocketDisabled) return "disabled after fallback";
82
+ if (details.websocketConnected) return "connected";
83
+ if (details.prewarmed) return "prewarmed";
84
+ return details.hasSessionState ? "enabled" : "waiting for first request";
85
+ }
86
+
87
+ function formatCodexReuse(details: OpenAICodexTransportDetails, sessionId: string | undefined): string {
88
+ if (!sessionId) return "no session key";
89
+ return details.canAppend ? "append enabled" : "full request";
90
+ }
@@ -0,0 +1,144 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "bun:test";
2
+ import { Buffer } from "node:buffer";
3
+ import * as fs from "node:fs/promises";
4
+ import * as os from "node:os";
5
+ import * as path from "node:path";
6
+ import type { FetchImpl } from "../../types";
7
+ import { __resetVertexTokenCache, getVertexAccessToken } from "../google-auth";
8
+
9
+ const CLOUD_PLATFORM_SCOPE = "https://www.googleapis.com/auth/cloud-platform";
10
+ const JWT_BEARER_GRANT = "urn:ietf:params:oauth:grant-type:jwt-bearer";
11
+
12
+ /** Generate a real RS256 private key so signJwtRs256 / pemToPkcs8 run for real. */
13
+ async function generateServiceAccountPem(): Promise<string> {
14
+ const keyPair = (await globalThis.crypto.subtle.generateKey(
15
+ { name: "RSASSA-PKCS1-v1_5", modulusLength: 2048, publicExponent: new Uint8Array([1, 0, 1]), hash: "SHA-256" },
16
+ true,
17
+ ["sign", "verify"],
18
+ )) as CryptoKeyPair;
19
+ const pkcs8 = new Uint8Array(await globalThis.crypto.subtle.exportKey("pkcs8", keyPair.privateKey));
20
+ const body = (
21
+ Buffer.from(pkcs8)
22
+ .toString("base64")
23
+ .match(/.{1,64}/g) ?? []
24
+ ).join("\n");
25
+ return `-----BEGIN PRIVATE KEY-----\n${body}\n-----END PRIVATE KEY-----\n`;
26
+ }
27
+
28
+ function urlOf(input: string | URL | Request): string {
29
+ if (typeof input === "string") return input;
30
+ if (input instanceof URL) return input.toString();
31
+ return input.url;
32
+ }
33
+
34
+ describe("getVertexAccessToken impersonated_service_account ADC", () => {
35
+ let tmpDir: string;
36
+ let originalGac: string | undefined;
37
+
38
+ beforeEach(async () => {
39
+ __resetVertexTokenCache();
40
+ originalGac = Bun.env.GOOGLE_APPLICATION_CREDENTIALS;
41
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "omp-vertex-adc-"));
42
+ });
43
+
44
+ afterEach(async () => {
45
+ __resetVertexTokenCache();
46
+ if (originalGac === undefined) delete Bun.env.GOOGLE_APPLICATION_CREDENTIALS;
47
+ else Bun.env.GOOGLE_APPLICATION_CREDENTIALS = originalGac;
48
+ await fs.rm(tmpDir, { recursive: true, force: true });
49
+ });
50
+
51
+ it("rejects a malformed service_account_impersonation_url before any network call", async () => {
52
+ const adcPath = path.join(tmpDir, "impersonated-bad-url.json");
53
+ await Bun.write(
54
+ adcPath,
55
+ JSON.stringify({
56
+ type: "impersonated_service_account",
57
+ // Missing the trailing ":generateAccessToken" the principal parser requires.
58
+ service_account_impersonation_url:
59
+ "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/target@project.iam.gserviceaccount.com",
60
+ source_credentials: {
61
+ type: "authorized_user",
62
+ client_id: "client-id",
63
+ client_secret: "client-secret",
64
+ refresh_token: "refresh-token",
65
+ },
66
+ }),
67
+ );
68
+ Bun.env.GOOGLE_APPLICATION_CREDENTIALS = adcPath;
69
+
70
+ const calls: string[] = [];
71
+ const fetchImpl: FetchImpl = async input => {
72
+ calls.push(urlOf(input));
73
+ return new Response("{}");
74
+ };
75
+
76
+ // The principal is parsed before the source exchange, so a bad URL must fail
77
+ // up front rather than after burning a source-token round trip.
78
+ await expect(getVertexAccessToken({ fetch: fetchImpl })).rejects.toBeInstanceOf(RangeError);
79
+ expect(calls).toEqual([]);
80
+ });
81
+
82
+ it("signs an RS256 JWT for a service_account source and reconstructs the IAM URL", async () => {
83
+ const pem = await generateServiceAccountPem();
84
+ const adcPath = path.join(tmpDir, "impersonated-sa.json");
85
+ await Bun.write(
86
+ adcPath,
87
+ JSON.stringify({
88
+ type: "impersonated_service_account",
89
+ // Non-canonical project segment proves the request URL is rebuilt, not echoed.
90
+ service_account_impersonation_url:
91
+ "https://iamcredentials.googleapis.com/v1/projects/explicit-proj/serviceAccounts/target@project.iam.gserviceaccount.com:generateAccessToken",
92
+ source_credentials: {
93
+ type: "service_account",
94
+ client_email: "source@project.iam.gserviceaccount.com",
95
+ private_key: pem,
96
+ private_key_id: "key-1",
97
+ },
98
+ // delegates intentionally omitted — the IAM body must default to [].
99
+ }),
100
+ );
101
+ Bun.env.GOOGLE_APPLICATION_CREDENTIALS = adcPath;
102
+
103
+ const calls: { url: string; init?: RequestInit }[] = [];
104
+ const fetchImpl: FetchImpl = async (input, init) => {
105
+ const url = urlOf(input);
106
+ calls.push({ url, init });
107
+ if (url === "https://oauth2.googleapis.com/token") {
108
+ return new Response(JSON.stringify({ access_token: "sa-source-token", expires_in: 3600 }));
109
+ }
110
+ if (url.startsWith("https://iamcredentials.googleapis.com/")) {
111
+ return new Response(
112
+ JSON.stringify({
113
+ accessToken: "impersonated-token",
114
+ expireTime: new Date(Date.now() + 3_600_000).toISOString(),
115
+ }),
116
+ );
117
+ }
118
+ return new Response("unexpected", { status: 404 });
119
+ };
120
+
121
+ const token = await getVertexAccessToken({ fetch: fetchImpl });
122
+ expect(token).toBe("impersonated-token");
123
+
124
+ // Source JWT exchange happens first, then the impersonation exchange.
125
+ expect(calls.map(c => c.url)).toEqual([
126
+ "https://oauth2.googleapis.com/token",
127
+ "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/target@project.iam.gserviceaccount.com:generateAccessToken",
128
+ ]);
129
+
130
+ // Source credential is exchanged via a signed JWT bearer assertion, not a refresh grant.
131
+ const sourceBody = new URLSearchParams(String(calls[0].init?.body));
132
+ expect(sourceBody.get("grant_type")).toBe(JWT_BEARER_GRANT);
133
+ expect((sourceBody.get("assertion") ?? "").split(".")).toHaveLength(3);
134
+
135
+ // The IAM call carries the source-derived bearer token and defaults delegates to [].
136
+ const iamHeaders = calls[1].init?.headers as Record<string, string>;
137
+ expect(iamHeaders.Authorization).toBe("Bearer sa-source-token");
138
+ expect(JSON.parse(String(calls[1].init?.body))).toEqual({
139
+ delegates: [],
140
+ scope: [CLOUD_PLATFORM_SCOPE],
141
+ lifetime: "3600s",
142
+ });
143
+ });
144
+ });