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,67 @@
1
+ import * as AIError from "../error";
2
+
3
+ export interface AbortSourceTracker {
4
+ requestAbortController: AbortController;
5
+ requestSignal: AbortSignal;
6
+ abortLocally(reason: Error): Error;
7
+ getLocalAbortReason(): Error | undefined;
8
+ wasCallerAbort(): boolean;
9
+ }
10
+
11
+ /**
12
+ * Tracks whether a merged request signal was aborted by the caller or by provider-local logic.
13
+ *
14
+ * Caller aborts always take priority. When both the caller and a local watchdog fire near
15
+ * each other, the merged `requestSignal.reason` reflects whichever AbortController called
16
+ * `.abort()` first — but ordering is racy and not meaningful for upstream consumers. What
17
+ * matters is intent: if the caller's signal aborted, the request was cancelled by the
18
+ * caller, and any local watchdog reason is incidental and **MUST NOT** be surfaced as a
19
+ * retryable transient error (which would cause auto-retry to re-enter streaming and leave
20
+ * the UI showing a spinner the user already tried to cancel).
21
+ */
22
+ export function createAbortSourceTracker(callerSignal?: AbortSignal): AbortSourceTracker {
23
+ const requestAbortController = new AbortController();
24
+ const requestSignal = callerSignal
25
+ ? AbortSignal.any([callerSignal, requestAbortController.signal])
26
+ : requestAbortController.signal;
27
+ let localAbortReason: Error | undefined;
28
+
29
+ return {
30
+ requestAbortController,
31
+ requestSignal,
32
+ abortLocally(reason) {
33
+ localAbortReason = reason;
34
+ requestAbortController.abort(reason);
35
+ return reason;
36
+ },
37
+ getLocalAbortReason() {
38
+ // Caller intent dominates. Surface a local reason only when the caller did not
39
+ // abort, so timeout/idle-watchdog errors don't masquerade as the user's cancel.
40
+ if (!localAbortReason || callerSignal?.aborted) return undefined;
41
+ return requestSignal.reason === localAbortReason ? localAbortReason : undefined;
42
+ },
43
+ wasCallerAbort() {
44
+ // If the caller signal aborted, treat it as a caller abort regardless of which
45
+ // AbortController won the race to set `requestSignal.reason`. The previous
46
+ // `requestSignal.reason !== localAbortReason` heuristic flipped the result to
47
+ // `false` when a local watchdog fired microseconds before the user's ESC, which
48
+ // then routed user-initiated cancels through the auto-retry transient-error
49
+ // path.
50
+ return callerSignal?.aborted === true;
51
+ },
52
+ };
53
+ }
54
+
55
+ /**
56
+ * Race a shared promise against a caller's AbortSignal without coupling the
57
+ * underlying work to that signal. The shared promise keeps running (and caches
58
+ * its result) even when an individual caller bails out.
59
+ */
60
+ export function raceWithSignal<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {
61
+ if (!signal) return promise;
62
+ if (signal.aborted) return Promise.reject(signal.reason ?? new AIError.AbortError());
63
+ const { promise: aborted, reject } = Promise.withResolvers<never>();
64
+ const onAbort = () => reject(signal.reason ?? new AIError.AbortError());
65
+ signal.addEventListener("abort", onAbort, { once: true });
66
+ return Promise.race([promise, aborted]).finally(() => signal.removeEventListener("abort", onAbort));
67
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Anthropic Authentication
3
+ *
4
+ * Thin helper for turning an already-resolved API key into the request-shaping
5
+ * config consumed by {@link buildAnthropicSearchHeaders} / {@link buildAnthropicUrl}.
6
+ *
7
+ * Credential storage and refresh live in `AuthStorage` — call
8
+ * `authStorage.getApiKey("anthropic", sessionId)` first, then pass the result
9
+ * through {@link buildAnthropicAuthConfig} for header/URL shaping.
10
+ */
11
+ import { $env } from "jeopi-utils";
12
+ import {
13
+ buildAnthropicHeaders as buildProviderAnthropicHeaders,
14
+ normalizeAnthropicBaseUrl,
15
+ resolveAnthropicCustomHeadersForBaseUrl,
16
+ } from "../providers/anthropic";
17
+ import { isFoundryEnabled } from "./foundry";
18
+
19
+ /** Auth configuration for Anthropic */
20
+ export interface AnthropicAuthConfig {
21
+ apiKey: string;
22
+ baseUrl: string;
23
+ isOAuth: boolean;
24
+ }
25
+
26
+ const DEFAULT_BASE_URL = "https://api.anthropic.com";
27
+
28
+ function normalizeBaseUrl(baseUrl: string | undefined): string | undefined {
29
+ const trimmed = baseUrl?.trim();
30
+ return trimmed ? trimmed.replace(/\/+$/, "") : undefined;
31
+ }
32
+
33
+ export function resolveAnthropicBaseUrlFromEnv(): string | undefined {
34
+ if (isFoundryEnabled()) {
35
+ const foundryBaseUrl = normalizeBaseUrl($env.FOUNDRY_BASE_URL);
36
+ if (foundryBaseUrl) return foundryBaseUrl;
37
+ }
38
+ const anthropicBaseUrl = normalizeBaseUrl($env.ANTHROPIC_BASE_URL);
39
+ return anthropicBaseUrl || undefined;
40
+ }
41
+
42
+ /**
43
+ * Checks if a token is an OAuth token by looking for sk-ant-oat prefix.
44
+ */
45
+ export function isOAuthToken(apiKey: string): boolean {
46
+ return apiKey.includes("sk-ant-oat");
47
+ }
48
+
49
+ /**
50
+ * Build an {@link AnthropicAuthConfig} from an already-resolved API key.
51
+ *
52
+ * `apiKey` is whatever the caller chose for `Authorization`/`x-api-key` —
53
+ * usually `authStorage.getApiKey("anthropic")`. `baseUrl` overrides the
54
+ * env-derived base; pass `undefined` to fall back to FOUNDRY/ANTHROPIC env
55
+ * resolution and finally `DEFAULT_BASE_URL`.
56
+ *
57
+ * `isOAuth` is derived from the token prefix so the helper stays pure: callers
58
+ * never have to thread the OAuth flag through their own resolution logic.
59
+ */
60
+ export function buildAnthropicAuthConfig(apiKey: string, baseUrl?: string): AnthropicAuthConfig {
61
+ return {
62
+ apiKey,
63
+ baseUrl: normalizeBaseUrl(baseUrl) ?? resolveAnthropicBaseUrlFromEnv() ?? DEFAULT_BASE_URL,
64
+ isOAuth: isOAuthToken(apiKey),
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Builds HTTP headers for Anthropic API requests (search variant).
70
+ *
71
+ * Forwards `ANTHROPIC_CUSTOM_HEADERS` when the resolver deems them applicable
72
+ * (Foundry mode, or a non-Anthropic base URL — typically an enterprise
73
+ * gateway), matching the streaming path so web search behaves identically.
74
+ */
75
+ export function buildAnthropicSearchHeaders(auth: AnthropicAuthConfig): Record<string, string> {
76
+ return buildProviderAnthropicHeaders({
77
+ apiKey: auth.apiKey,
78
+ baseUrl: auth.baseUrl,
79
+ isOAuth: auth.isOAuth,
80
+ extraBetas: ["web-search-2025-03-05"],
81
+ stream: false,
82
+ modelHeaders: resolveAnthropicCustomHeadersForBaseUrl(auth.baseUrl),
83
+ });
84
+ }
85
+
86
+ /**
87
+ * Builds the full API URL for Anthropic messages endpoint.
88
+ */
89
+ export function buildAnthropicUrl(auth: AnthropicAuthConfig): string {
90
+ const normalizedBaseUrl = normalizeAnthropicBaseUrl(auth.baseUrl);
91
+ const base = `${normalizedBaseUrl}/v1/messages`;
92
+ return `${base}?beta=true`;
93
+ }
@@ -0,0 +1,32 @@
1
+ /** Stores streamed tool-call argument JSON for live renderers and parser recovery. */
2
+ export const kStreamingPartialJson = Symbol("provider.block.partialJson");
3
+
4
+ /** Carries streamed tool-call argument JSON without exposing a string-keyed property. */
5
+ export type StreamingPartialJsonCarrier = object & { [kStreamingPartialJson]?: string };
6
+
7
+ /** Reads streamed tool-call argument JSON from a block or event snapshot. */
8
+ export function getStreamingPartialJson(block: StreamingPartialJsonCarrier | null | undefined): string | undefined {
9
+ return block?.[kStreamingPartialJson];
10
+ }
11
+
12
+ /** Writes streamed tool-call argument JSON to a block or clears it with `undefined`. */
13
+ export function setStreamingPartialJson(block: StreamingPartialJsonCarrier, value: string | undefined): void {
14
+ block[kStreamingPartialJson] = value;
15
+ }
16
+
17
+ /** Clears streamed tool-call argument JSON without deleting or changing object shape. */
18
+ export function clearStreamingPartialJson(block: StreamingPartialJsonCarrier): void {
19
+ if (Object.hasOwn(block, kStreamingPartialJson)) block[kStreamingPartialJson] = undefined;
20
+ }
21
+
22
+ /** Stores a provider-local stream block index without exposing a string-keyed property. */
23
+ export const kStreamingBlockIndex = Symbol("provider.block.index");
24
+
25
+ /** Stores the last parsed argument prefix length for throttled streaming JSON parsing. */
26
+ export const kStreamingLastParseLen = Symbol("provider.block.lastParseLen");
27
+
28
+ /** Marks streamed tool-call arguments that already received an authoritative done payload. */
29
+ export const kStreamingArgumentsDone = Symbol("provider.block.argumentsDone");
30
+
31
+ /** Classifies Cursor's in-flight tool-call kind without leaking provider-private state. */
32
+ export const kStreamingBlockKind = Symbol("provider.block.kind");
@@ -0,0 +1,20 @@
1
+ /**
2
+ * A UUID-shaped string: five hex groups in the canonical 8-4-4-4-12 layout.
3
+ *
4
+ * NOT a spec-compliant RFC 4122 UUID — the version/variant nibbles are left as
5
+ * raw hash output — but the shape passes everywhere a UUID string is expected.
6
+ */
7
+ export type DeterministicUuid = `${string}-${string}-${string}-${string}-${string}`;
8
+
9
+ /**
10
+ * Format the leading 128 bits of `seed`'s SHA-256 digest as a v4-shape UUID
11
+ * (8-4-4-4-12 hex groups).
12
+ *
13
+ * Deterministic: identical seeds always map to the same id, so callers get
14
+ * stable ids across requests / conversation turns (reusing message-blob ids,
15
+ * keying prompt caches) without persisting a seed→id mapping.
16
+ */
17
+ export function deterministicUuid(seed: string): DeterministicUuid {
18
+ const hex = new Bun.CryptoHasher("sha256").update(seed).digest("hex");
19
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
20
+ }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Bounded retries for an empty assistant completion.
3
+ *
4
+ * Some providers — and especially flaky OpenAI-/Anthropic-compatible gateways —
5
+ * intermittently return a benign terminal stop carrying no content and no usage
6
+ * (e.g. a single OpenAI `delta: {}` + `finish_reason: "stop"` chunk). Delivered
7
+ * as-is the agent loop has nothing to act on and silently halts mid-task, so the
8
+ * request must be retried instead of surfaced.
9
+ *
10
+ * This wraps a single-attempt provider stream and re-invokes it (a fresh request
11
+ * with its own message state) when an attempt produces no meaningful content.
12
+ * Only a stream that streamed nothing meaningful is retried: the moment any
13
+ * text/thinking/tool delta is forwarded the attempt is committed, so live
14
+ * streaming (including thinking) is never delayed, retried, or duplicated.
15
+ *
16
+ * Mirrors the Gemini empty-response policy in `google-shared` (which keeps its
17
+ * own integrated loop) and is shared by the OpenAI-completions and
18
+ * Anthropic-messages providers.
19
+ */
20
+ import { scheduler } from "node:timers/promises";
21
+ import type { AssistantMessage, AssistantMessageEvent, Context } from "../types";
22
+ import { AssistantMessageEventStream } from "./event-stream";
23
+
24
+ export const MAX_EMPTY_COMPLETION_RETRIES = 2;
25
+ export const EMPTY_COMPLETION_BASE_DELAY_MS = 500;
26
+
27
+ const NON_WHITESPACE_RE = /\S/;
28
+
29
+ /**
30
+ * Whether a completed assistant message carries content worth delivering: a tool
31
+ * call or any non-whitespace text. An empty/whitespace-only message — or one
32
+ * that only ever produced thinking — is the "empty response" failure.
33
+ */
34
+ export function hasVisibleAssistantContent(message: AssistantMessage): boolean {
35
+ for (const block of message.content) {
36
+ if (block.type === "toolCall") return true;
37
+ if (block.type === "text" && NON_WHITESPACE_RE.test(block.text)) return true;
38
+ }
39
+ return false;
40
+ }
41
+
42
+ /** A streamed event that delivers content worth committing the attempt for. */
43
+ function isMeaningfulCompletionEvent(event: AssistantMessageEvent): boolean {
44
+ switch (event.type) {
45
+ case "text_delta":
46
+ case "thinking_delta":
47
+ case "toolcall_delta":
48
+ return event.delta.length > 0;
49
+ case "text_end":
50
+ case "thinking_end":
51
+ return event.content.length > 0;
52
+ case "toolcall_start":
53
+ case "toolcall_end":
54
+ return true;
55
+ default:
56
+ return false;
57
+ }
58
+ }
59
+
60
+ interface EmptyCompletionRetryOptions {
61
+ signal?: AbortSignal;
62
+ providerRetryWait?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
63
+ }
64
+
65
+ /**
66
+ * Wrap a single-attempt provider stream with bounded empty-completion retries.
67
+ * `attempt` MUST create a fresh request (and its own output message) on each
68
+ * call so a retry never inherits stale metadata from an empty attempt.
69
+ */
70
+ export function withEmptyCompletionRetry<M, O extends EmptyCompletionRetryOptions>(
71
+ model: M,
72
+ context: Context,
73
+ options: O | undefined,
74
+ attempt: (model: M, context: Context, options?: O) => AssistantMessageEventStream,
75
+ ): AssistantMessageEventStream {
76
+ const outer = new AssistantMessageEventStream();
77
+ const signal = options?.signal;
78
+ void (async () => {
79
+ for (let emptyAttempt = 0; ; emptyAttempt++) {
80
+ const inner = attempt(model, context, options);
81
+ const buffered: AssistantMessageEvent[] = [];
82
+ let committed = false;
83
+ let terminal: AssistantMessageEvent | undefined;
84
+ const flush = (): void => {
85
+ for (const event of buffered) outer.push(event);
86
+ buffered.length = 0;
87
+ };
88
+ try {
89
+ for await (const event of inner) {
90
+ if (event.type === "done" || event.type === "error") {
91
+ terminal = event;
92
+ break;
93
+ }
94
+ // Buffer pre-content events (start/*_start) so an empty attempt can
95
+ // be discarded; commit the moment real content streams.
96
+ if (!committed && !isMeaningfulCompletionEvent(event)) {
97
+ buffered.push(event);
98
+ continue;
99
+ }
100
+ committed = true;
101
+ flush();
102
+ outer.push(event);
103
+ if (outer.done) return;
104
+ }
105
+ } catch (error) {
106
+ flush();
107
+ outer.fail(error);
108
+ return;
109
+ }
110
+
111
+ // Retry only a genuinely degenerate completion: a normal stop that
112
+ // produced no visible content AND billed no output tokens (the flaky
113
+ // gateway signature — charged nothing, returned nothing). A stop that
114
+ // reports output tokens spent its budget somewhere (e.g. thinking) and
115
+ // is left alone.
116
+ const message = terminal?.type === "done" ? terminal.message : undefined;
117
+ const isRetryableEmpty =
118
+ !committed &&
119
+ message !== undefined &&
120
+ message.stopReason === "stop" &&
121
+ !message.errorMessage &&
122
+ (message.usage?.output ?? 0) <= 0 &&
123
+ !hasVisibleAssistantContent(message);
124
+
125
+ if (isRetryableEmpty && emptyAttempt < MAX_EMPTY_COMPLETION_RETRIES && !signal?.aborted) {
126
+ const delayMs = EMPTY_COMPLETION_BASE_DELAY_MS * 2 ** emptyAttempt;
127
+ try {
128
+ if (options?.providerRetryWait) await options.providerRetryWait(delayMs, signal);
129
+ else await scheduler.wait(delayMs, { signal });
130
+ } catch (waitError) {
131
+ // Aborted during backoff: deliver the empty result rather than hang.
132
+ // Any other wait failure is a real error and must surface.
133
+ flush();
134
+ if (signal?.aborted) {
135
+ if (terminal) outer.push(terminal);
136
+ } else {
137
+ outer.fail(waitError);
138
+ }
139
+ return;
140
+ }
141
+ // Discard the buffered `start` from this empty attempt and retry.
142
+ continue;
143
+ }
144
+
145
+ flush();
146
+ if (terminal) {
147
+ outer.push(terminal);
148
+ } else if (!outer.done) {
149
+ try {
150
+ outer.end(await inner.result());
151
+ } catch (error) {
152
+ outer.fail(error);
153
+ }
154
+ }
155
+ return;
156
+ }
157
+ })();
158
+ return outer;
159
+ }
@@ -0,0 +1,171 @@
1
+ import * as AIError from "../error";
2
+ import type { AssistantMessage, AssistantMessageEvent } from "../types";
3
+
4
+ // Generic event stream class for async iteration
5
+ export class EventStream<T, R = T> implements AsyncIterable<T> {
6
+ queue: T[] = [];
7
+ waiting: Array<{ resolve: (value: IteratorResult<T>) => void; reject: (err: unknown) => void }> = [];
8
+ done = false;
9
+ /** True once finalResultPromise has been resolved or rejected. */
10
+ resultSettled = false;
11
+ #failed = false;
12
+ #error: unknown = undefined;
13
+ finalResultPromise: Promise<R>;
14
+ resolveFinalResult!: (result: R) => void;
15
+ rejectFinalResult!: (err: unknown) => void;
16
+ isComplete: (event: T) => boolean;
17
+ extractResult: (event: T) => R;
18
+
19
+ constructor(isComplete: (event: T) => boolean, extractResult: (event: T) => R) {
20
+ const { promise, resolve, reject } = Promise.withResolvers<R>();
21
+ // Prevent an unhandled rejection when fail() is called but nobody awaits result().
22
+ // Callers who do await result() still receive the rejection normally.
23
+ promise.catch(() => {});
24
+ this.finalResultPromise = promise;
25
+ this.resolveFinalResult = resolve;
26
+ this.rejectFinalResult = reject;
27
+ this.isComplete = isComplete;
28
+ this.extractResult = extractResult;
29
+ }
30
+
31
+ push(event: T): void {
32
+ if (this.done) return;
33
+
34
+ if (this.isComplete(event)) {
35
+ this.done = true;
36
+ this.resultSettled = true;
37
+ this.resolveFinalResult(this.extractResult(event));
38
+ }
39
+
40
+ // Deliver to waiting consumer or queue it
41
+ const waiter = this.waiting.shift();
42
+ if (waiter) {
43
+ waiter.resolve({ value: event, done: false });
44
+ } else {
45
+ this.queue.push(event);
46
+ }
47
+ }
48
+
49
+ deliver(event: T): void {
50
+ const waiter = this.waiting.shift();
51
+ if (waiter) {
52
+ waiter.resolve({ value: event, done: false });
53
+ } else {
54
+ this.queue.push(event);
55
+ }
56
+ }
57
+
58
+ end(result?: R): void {
59
+ this.done = true;
60
+ if (result !== undefined) {
61
+ this.resultSettled = true;
62
+ this.resolveFinalResult(result);
63
+ } else if (!this.resultSettled) {
64
+ // end() without a terminal value must still settle result() —
65
+ // otherwise complete()/result() awaits hang forever.
66
+ this.resultSettled = true;
67
+ this.rejectFinalResult(
68
+ new AIError.ProviderResponseError("Stream ended without a final result", { kind: "envelope" }),
69
+ );
70
+ }
71
+ // Notify all waiting consumers that we're done
72
+ while (this.waiting.length > 0) {
73
+ const waiter = this.waiting.shift()!;
74
+ waiter.resolve({ value: undefined as any, done: true });
75
+ }
76
+ }
77
+
78
+ endWaiting(): void {
79
+ while (this.waiting.length > 0) {
80
+ const waiter = this.waiting.shift()!;
81
+ waiter.resolve({ value: undefined as any, done: true });
82
+ }
83
+ }
84
+
85
+ fail(err: unknown): void {
86
+ if (this.done) return;
87
+ this.done = true;
88
+ this.#failed = true;
89
+ this.#error = err;
90
+ this.resultSettled = true;
91
+ this.rejectFinalResult(err);
92
+ while (this.waiting.length > 0) {
93
+ const waiter = this.waiting.shift()!;
94
+ waiter.reject(err);
95
+ }
96
+ }
97
+
98
+ async *[Symbol.asyncIterator](): AsyncIterator<T> {
99
+ while (true) {
100
+ if (this.queue.length > 0) {
101
+ yield this.queue.shift()!;
102
+ } else if (this.#failed) {
103
+ throw this.#error;
104
+ } else if (this.done) {
105
+ return;
106
+ } else {
107
+ const result = await new Promise<IteratorResult<T>>((resolve, reject) =>
108
+ this.waiting.push({ resolve, reject }),
109
+ );
110
+ if (result.done) return;
111
+ yield result.value;
112
+ }
113
+ }
114
+ }
115
+
116
+ result(): Promise<R> {
117
+ return this.finalResultPromise;
118
+ }
119
+ }
120
+
121
+ export class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {
122
+ constructor() {
123
+ super(
124
+ event => event.type === "done" || event.type === "error",
125
+ event => {
126
+ if (event.type === "done") {
127
+ return event.message;
128
+ } else if (event.type === "error") {
129
+ return event.error;
130
+ }
131
+ throw new AIError.ProviderResponseError("Unexpected event type for final result", { kind: "envelope" });
132
+ },
133
+ );
134
+ }
135
+
136
+ override push(event: AssistantMessageEvent): void {
137
+ if (this.done) return;
138
+
139
+ if (event.type === "error" && event.error.stopReason === "error") {
140
+ AIError.classifyMessage(event.error);
141
+ }
142
+
143
+ // Completion resolves the final result and still emits the terminal event.
144
+ if (this.isComplete(event)) {
145
+ this.done = true;
146
+ this.resultSettled = true;
147
+ this.resolveFinalResult(this.extractResult(event));
148
+ }
149
+
150
+ this.deliver(event);
151
+ }
152
+
153
+ override end(result?: AssistantMessage): void {
154
+ this.done = true;
155
+ if (result !== undefined) {
156
+ if (result.stopReason === "error") {
157
+ AIError.classifyMessage(result);
158
+ }
159
+ this.resultSettled = true;
160
+ this.resolveFinalResult(result);
161
+ } else if (!this.resultSettled) {
162
+ // Mirror the base class: a result-less end() must not leave
163
+ // result() pending forever.
164
+ this.resultSettled = true;
165
+ this.rejectFinalResult(
166
+ new AIError.ProviderResponseError("Stream ended without a final result", { kind: "envelope" }),
167
+ );
168
+ }
169
+ this.endWaiting();
170
+ }
171
+ }
@@ -0,0 +1,8 @@
1
+ import { $env } from "jeopi-utils";
2
+
3
+ export function isFoundryEnabled(): boolean {
4
+ const value = $env.CLAUDE_CODE_USE_FOUNDRY;
5
+ if (!value) return false;
6
+ const normalized = value.trim().toLowerCase();
7
+ return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
8
+ }
@@ -0,0 +1,25 @@
1
+ export function extractGoogleValidationUrl(errorBody: string): string | undefined {
2
+ if (!errorBody.includes("VALIDATION_REQUIRED")) return undefined;
3
+ const start = errorBody.indexOf("{");
4
+ if (start === -1) return undefined;
5
+ try {
6
+ const parsed = JSON.parse(errorBody.slice(start)) as {
7
+ error?: { details?: Array<{ reason?: string; metadata?: { validation_url?: string } }> };
8
+ };
9
+ const detail = parsed.error?.details?.find(
10
+ d => d.reason === "VALIDATION_REQUIRED" && typeof d.metadata?.validation_url === "string",
11
+ );
12
+ return detail?.metadata?.validation_url;
13
+ } catch {
14
+ return undefined;
15
+ }
16
+ }
17
+
18
+ export function formatGoogleValidationRequiredMessage(
19
+ validationUrl: string,
20
+ nextAction: string,
21
+ email?: string,
22
+ ): string {
23
+ const account = email ? ` for ${email}` : "";
24
+ return `Account verification required${account}. Visit ${validationUrl} to continue, then ${nextAction}.`;
25
+ }