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,294 @@
1
+ /**
2
+ * Central live healing for leaked reasoning markup in the visible text channel.
3
+ *
4
+ * Some providers emit their canonical reasoning idioms (` ```thinking `,
5
+ * `<think>`, Gemma/Harmony channels, …) into the *visible* text stream instead
6
+ * of a structured thinking part. {@link wrapLeakedThinkingStream} re-projects any
7
+ * provider stream into a fresh {@link AssistantMessageEventStream}, splitting the
8
+ * leaked fences out into proper `thinking` blocks *live* as deltas arrive — so
9
+ * every provider gets the same healing, not just the three with provider-local
10
+ * {@link StreamMarkupHealing} loops.
11
+ *
12
+ * The healing is idempotent: a second pass over already-clean text finds no
13
+ * fences, so wrapping a provider that already heals (or wrapping twice) is a
14
+ * harmless pass-through. Signatures are load-bearing for Google/Gemini/Vertex
15
+ * thought round-tripping, so text sub-blocks carry the source `textSignature`,
16
+ * forwarded thinking blocks their `thinkingSignature`, and forwarded tool calls
17
+ * their `thoughtSignature`.
18
+ *
19
+ * Modeled on {@link wrapInbandToolStream} / `InbandStreamProjector` in
20
+ * `../dialect/owned-stream.ts`, minus all in-band tool-call grammar: tool-call
21
+ * events are forwarded verbatim.
22
+ */
23
+
24
+ import type { AssistantMessage, TextContent, ThinkingContent, ToolCall } from "../types";
25
+ import {
26
+ clearStreamingPartialJson,
27
+ getStreamingPartialJson,
28
+ type StreamingPartialJsonCarrier,
29
+ setStreamingPartialJson,
30
+ } from "./block-symbols";
31
+ import { AssistantMessageEventStream } from "./event-stream";
32
+ import { StreamMarkupHealing, type StreamMarkupHealingEvent } from "./stream-markup-healing";
33
+
34
+ type StreamingToolCall = ToolCall & StreamingPartialJsonCarrier;
35
+
36
+ function cloneToolCall(source: StreamingToolCall): StreamingToolCall {
37
+ const block: StreamingToolCall = { ...source, arguments: source.arguments };
38
+ const partialJson = getStreamingPartialJson(source);
39
+ if (partialJson !== undefined) setStreamingPartialJson(block, partialJson);
40
+ return block;
41
+ }
42
+
43
+ function syncToolCall(target: StreamingToolCall, source: StreamingToolCall): void {
44
+ Object.assign(target, source);
45
+ const partialJson = getStreamingPartialJson(source);
46
+ if (partialJson === undefined) clearStreamingPartialJson(target);
47
+ else setStreamingPartialJson(target, partialJson);
48
+ }
49
+
50
+ /**
51
+ * Wrap a provider stream so leaked reasoning fences are healed into thinking
52
+ * blocks live, for every provider. Returns a new stream that re-projects the
53
+ * inner one; the inner stream is fully consumed.
54
+ */
55
+ export function wrapLeakedThinkingStream(inner: AssistantMessageEventStream): AssistantMessageEventStream {
56
+ const out = new AssistantMessageEventStream();
57
+ void (async () => {
58
+ try {
59
+ let projector: LeakedThinkingProjector | undefined;
60
+ for await (const event of inner) {
61
+ switch (event.type) {
62
+ case "start":
63
+ projector = new LeakedThinkingProjector(out, event.partial);
64
+ break;
65
+ case "text_delta": {
66
+ projector ??= new LeakedThinkingProjector(out, event.partial);
67
+ const block = event.partial.content[event.contentIndex];
68
+ projector.text(event.delta, block?.type === "text" ? block.textSignature : undefined);
69
+ break;
70
+ }
71
+ case "thinking_delta": {
72
+ projector ??= new LeakedThinkingProjector(out, event.partial);
73
+ const block = event.partial.content[event.contentIndex];
74
+ projector.thinking(event.delta, block?.type === "thinking" ? block.thinkingSignature : undefined);
75
+ break;
76
+ }
77
+ case "toolcall_start": {
78
+ projector ??= new LeakedThinkingProjector(out, event.partial);
79
+ const block = event.partial.content[event.contentIndex];
80
+ projector.toolStart(event.contentIndex, block?.type === "toolCall" ? block : undefined);
81
+ break;
82
+ }
83
+ case "toolcall_delta": {
84
+ const block = event.partial.content[event.contentIndex];
85
+ projector?.toolDelta(event.contentIndex, event.delta, block?.type === "toolCall" ? block : undefined);
86
+ break;
87
+ }
88
+ case "toolcall_end":
89
+ projector?.toolEnd(event.contentIndex, event.toolCall);
90
+ break;
91
+ case "done": {
92
+ projector ??= new LeakedThinkingProjector(out, event.message);
93
+ const content = projector.finish(event.message);
94
+ out.push({ type: "done", reason: event.reason, message: { ...event.message, content } });
95
+ return;
96
+ }
97
+ case "error": {
98
+ projector ??= new LeakedThinkingProjector(out, event.error);
99
+ const content = projector.finish(event.error);
100
+ out.push({ type: "error", reason: event.reason, error: { ...event.error, content } });
101
+ return;
102
+ }
103
+ // text_start/text_end/thinking_start/thinking_end are ignored: the
104
+ // projector owns block boundaries (matches wrapInbandToolStream).
105
+ }
106
+ }
107
+ // Inner ended via end(result) without a terminal event.
108
+ if (!out.done) {
109
+ const result = await inner.result();
110
+ projector ??= new LeakedThinkingProjector(out, result);
111
+ const content = projector.finish(result);
112
+ out.end({ ...result, content });
113
+ }
114
+ } catch (err) {
115
+ if (!out.done) out.fail(err);
116
+ }
117
+ })();
118
+ return out;
119
+ }
120
+
121
+ type OpenBlock = { index: number } | undefined;
122
+
123
+ /**
124
+ * Re-projects an inner stream's events into `out`, healing leaked reasoning out
125
+ * of the visible text channel while forwarding native thinking and tool calls.
126
+ */
127
+ class LeakedThinkingProjector {
128
+ readonly #out: AssistantMessageEventStream;
129
+ readonly #healer = new StreamMarkupHealing({ pattern: "thinking" });
130
+ #partial: AssistantMessage;
131
+ #text: OpenBlock;
132
+ #thinking: OpenBlock;
133
+ /** Total visible text length fed to the healer, to replay any un-streamed tail in {@link finish}. */
134
+ #fedLen = 0;
135
+ /** Latest non-undefined text signature seen, stamped onto held-back text flushed later. */
136
+ #lastTextSignature: string | undefined;
137
+ /** Forwarded native tool calls, keyed by the inner stream's `contentIndex`. */
138
+ #toolBlocks = new Map<number, { index: number; block: StreamingToolCall }>();
139
+
140
+ constructor(out: AssistantMessageEventStream, seed: AssistantMessage) {
141
+ this.#out = out;
142
+ this.#partial = { ...seed, content: [] };
143
+ this.#out.push({ type: "start", partial: this.#partial });
144
+ }
145
+
146
+ /** Feed a visible-text delta through the healer, splitting leaked fences live. */
147
+ text(delta: string, signature: string | undefined): void {
148
+ this.#fedLen += delta.length;
149
+ if (signature !== undefined) this.#lastTextSignature = signature;
150
+ this.#apply(this.#healer.feedEvents(delta), this.#lastTextSignature);
151
+ }
152
+
153
+ /** Forward a native thinking delta, preserving its signature. */
154
+ thinking(delta: string, signature: string | undefined): void {
155
+ const index = this.#openThinking();
156
+ const block = this.#partial.content[index] as ThinkingContent;
157
+ block.thinking += delta;
158
+ if (signature !== undefined) block.thinkingSignature = signature;
159
+ this.#out.push({ type: "thinking_delta", contentIndex: index, delta, partial: this.#partial });
160
+ }
161
+
162
+ /** Forward a native tool call's start, releasing any held-back text first. */
163
+ toolStart(srcIndex: number, source: StreamingToolCall | undefined): void {
164
+ if (!source) return;
165
+ this.#apply(this.#healer.flushEvents(), this.#lastTextSignature);
166
+ this.#closeText();
167
+ this.#closeThinking();
168
+ const block = cloneToolCall(source);
169
+ this.#partial.content.push(block);
170
+ const index = this.#partial.content.length - 1;
171
+ this.#toolBlocks.set(srcIndex, { index, block });
172
+ this.#out.push({ type: "toolcall_start", contentIndex: index, partial: this.#partial });
173
+ }
174
+
175
+ toolDelta(srcIndex: number, delta: string, source: StreamingToolCall | undefined): void {
176
+ let entry = this.#toolBlocks.get(srcIndex);
177
+ if (!entry && source) {
178
+ this.toolStart(srcIndex, source);
179
+ entry = this.#toolBlocks.get(srcIndex);
180
+ }
181
+ if (!entry) return;
182
+ if (source) syncToolCall(entry.block, source);
183
+ this.#out.push({ type: "toolcall_delta", contentIndex: entry.index, delta, partial: this.#partial });
184
+ }
185
+
186
+ toolEnd(srcIndex: number, toolCall: ToolCall): void {
187
+ const entry = this.#toolBlocks.get(srcIndex);
188
+ if (entry) {
189
+ syncToolCall(entry.block, toolCall);
190
+ this.#out.push({
191
+ type: "toolcall_end",
192
+ contentIndex: entry.index,
193
+ toolCall: entry.block,
194
+ partial: this.#partial,
195
+ });
196
+ this.#toolBlocks.delete(srcIndex);
197
+ return;
198
+ }
199
+ // `end` without a matching `start` — release held text, then forward whole.
200
+ this.#apply(this.#healer.flushEvents(), this.#lastTextSignature);
201
+ this.#closeText();
202
+ this.#closeThinking();
203
+ const block = cloneToolCall(toolCall);
204
+ this.#partial.content.push(block);
205
+ const index = this.#partial.content.length - 1;
206
+ this.#out.push({ type: "toolcall_start", contentIndex: index, partial: this.#partial });
207
+ this.#out.push({ type: "toolcall_end", contentIndex: index, toolCall: block, partial: this.#partial });
208
+ }
209
+
210
+ /**
211
+ * Finalize: replay any un-streamed visible-text tail from `message.content`,
212
+ * flush held-back fragments, close open blocks, and return the healed content.
213
+ */
214
+ finish(message: AssistantMessage): AssistantMessage["content"] {
215
+ let fullText = "";
216
+ let tailSignature: string | undefined;
217
+ for (const block of message.content) {
218
+ if (block.type === "text") {
219
+ fullText += block.text;
220
+ tailSignature = block.textSignature;
221
+ }
222
+ }
223
+ if (tailSignature !== undefined) this.#lastTextSignature = tailSignature;
224
+ if (fullText.length > this.#fedLen) {
225
+ this.#apply(this.#healer.feedEvents(fullText.slice(this.#fedLen)), this.#lastTextSignature);
226
+ }
227
+ this.#apply(this.#healer.flushEvents(), this.#lastTextSignature);
228
+ this.#closeText();
229
+ this.#closeThinking();
230
+ return this.#partial.content;
231
+ }
232
+
233
+ #apply(events: readonly StreamMarkupHealingEvent[], signature?: string): void {
234
+ for (const event of events) {
235
+ if (event.type === "text") this.#emitText(event.text, signature);
236
+ else if (event.type === "thinking") this.#emitHealedThinking(event.thinking);
237
+ }
238
+ }
239
+
240
+ #emitText(text: string, signature: string | undefined): void {
241
+ if (text.length === 0) return;
242
+ this.#closeThinking();
243
+ if (!this.#text) {
244
+ const block: TextContent =
245
+ signature === undefined ? { type: "text", text: "" } : { type: "text", text: "", textSignature: signature };
246
+ this.#partial.content.push(block);
247
+ this.#text = { index: this.#partial.content.length - 1 };
248
+ this.#out.push({ type: "text_start", contentIndex: this.#text.index, partial: this.#partial });
249
+ } else if (signature !== undefined) {
250
+ (this.#partial.content[this.#text.index] as TextContent).textSignature = signature;
251
+ }
252
+ const block = this.#partial.content[this.#text.index] as TextContent;
253
+ block.text += text;
254
+ this.#out.push({ type: "text_delta", contentIndex: this.#text.index, delta: text, partial: this.#partial });
255
+ }
256
+
257
+ /** Healed (leaked) thinking carries no signature, matching the source fence. */
258
+ #emitHealedThinking(text: string): void {
259
+ if (text.length === 0) return;
260
+ const index = this.#openThinking();
261
+ const block = this.#partial.content[index] as ThinkingContent;
262
+ block.thinking += text;
263
+ this.#out.push({ type: "thinking_delta", contentIndex: index, delta: text, partial: this.#partial });
264
+ }
265
+
266
+ #openThinking(): number {
267
+ this.#closeText();
268
+ if (!this.#thinking) {
269
+ this.#partial.content.push({ type: "thinking", thinking: "" });
270
+ this.#thinking = { index: this.#partial.content.length - 1 };
271
+ this.#out.push({ type: "thinking_start", contentIndex: this.#thinking.index, partial: this.#partial });
272
+ }
273
+ return this.#thinking.index;
274
+ }
275
+
276
+ #closeText(): void {
277
+ if (!this.#text) return;
278
+ const block = this.#partial.content[this.#text.index] as TextContent;
279
+ this.#out.push({ type: "text_end", contentIndex: this.#text.index, content: block.text, partial: this.#partial });
280
+ this.#text = undefined;
281
+ }
282
+
283
+ #closeThinking(): void {
284
+ if (!this.#thinking) return;
285
+ const block = this.#partial.content[this.#thinking.index] as ThinkingContent;
286
+ this.#out.push({
287
+ type: "thinking_end",
288
+ contentIndex: this.#thinking.index,
289
+ content: block.thinking,
290
+ partial: this.#partial,
291
+ });
292
+ this.#thinking = undefined;
293
+ }
294
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * JSON-POST → SSE transport for OpenAI-wire streaming endpoints (chat
3
+ * completions, responses, azure responses). Replaces the `openai` SDK client:
4
+ *
5
+ * - Retries: `fetchWithRetry` (Retry-After/quota-hint aware; 5xx/408/429 and
6
+ * transient network errors). Default 6 total attempts — parity with the
7
+ * SDK's former `maxRetries: 5`.
8
+ * - SSE decode: `readSseJson` (spec-compliant framing, `[DONE]`-aware).
9
+ * `onSseEvent` observers now receive real wire frames instead of events
10
+ * re-synthesized from decoded SDK objects.
11
+ * - Errors: {@link OpenAIHttpError} exposes `status`/`headers`/`code`
12
+ * structurally (ProviderHttpError contract — `extractHttpStatusFromError`,
13
+ * retry-after extraction, copilot transient classification) and carries the
14
+ * captured response body for the strict-tools fallback and the responses
15
+ * chain-state detectors, which regex over `error.message`.
16
+ */
17
+ import { fetchWithRetry, readSseJson, type SseEventObserver } from "jeopi-utils";
18
+ import * as AIError from "../error";
19
+ import { OpenAIHttpError } from "../error";
20
+
21
+ export { OpenAIHttpError };
22
+
23
+ import type { FetchImpl } from "../types";
24
+ import type { CapturedHttpErrorResponse } from "./http-inspector";
25
+
26
+ /**
27
+ * Total attempts when the caller has no first-event deadline armed. The
28
+ * removed SDK clients ran `maxRetries: 5`, i.e. 6 requests.
29
+ */
30
+ const DEFAULT_MAX_ATTEMPTS = 6;
31
+
32
+ /** Bound the `Error.message` allocation for proxy HTML error pages and the like. */
33
+ const MAX_DETAIL_CHARS = 4096;
34
+
35
+ export interface OpenAIStreamRequestInit {
36
+ url: string;
37
+ headers: Record<string, string>;
38
+ /** JSON request body; serialized once per call (retries resend the same bytes). */
39
+ body: unknown;
40
+ signal: AbortSignal;
41
+ fetch?: FetchImpl;
42
+ /**
43
+ * Total attempts (initial + retries). Defaults to {@link DEFAULT_MAX_ATTEMPTS}.
44
+ * Pass `1` when a first-event watchdog is armed so retries cannot silently
45
+ * extend the caller's deadline (mirrors the old `maxRetries: 0` hint).
46
+ */
47
+ maxAttempts?: number;
48
+ /** Raw wire-frame observer (`onSseEvent` debug pipeline). */
49
+ onSseEvent?: SseEventObserver;
50
+ }
51
+
52
+ export interface OpenAIStreamHandle<TEvent> {
53
+ /** Decoded `data:` payloads; terminates on `[DONE]` or stream end. */
54
+ events: AsyncGenerator<TEvent>;
55
+ response: Response;
56
+ /** `x-request-id` response header (the SDK's former `request_id`). */
57
+ requestId: string | null;
58
+ }
59
+
60
+ /**
61
+ * POST a JSON body and stream back decoded SSE events.
62
+ *
63
+ * Throws {@link OpenAIHttpError} on a non-2xx terminal response. Aborts on
64
+ * `signal` propagate from `fetchWithRetry`/`readSseJson`; callers own the
65
+ * watchdog timers and abort-reason bookkeeping.
66
+ */
67
+ export async function postOpenAIStream<TEvent>(init: OpenAIStreamRequestInit): Promise<OpenAIStreamHandle<TEvent>> {
68
+ const response = await fetchWithRetry(init.url, {
69
+ method: "POST",
70
+ headers: { "Content-Type": "application/json", Accept: "text/event-stream", ...init.headers },
71
+ body: JSON.stringify(init.body),
72
+ signal: init.signal,
73
+ fetch: init.fetch,
74
+ maxAttempts: init.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
75
+ // Bun's native fetch enforces a hard ~300s pre-response timeout (issue #2422).
76
+ // Cold large-context streams legitimately exceed it; the caller's
77
+ // `firstEventTimeoutMs`/`AbortSignal` already govern stuck requests.
78
+ timeout: false,
79
+ });
80
+ if (!response.ok) {
81
+ throw await captureOpenAIHttpError(response);
82
+ }
83
+ if (!response.body) {
84
+ throw new AIError.ProviderResponseError(`OpenAI stream response has no body (status ${response.status})`, {
85
+ kind: "envelope",
86
+ });
87
+ }
88
+ return {
89
+ events: readSseJson<TEvent>(response.body, init.signal, init.onSseEvent),
90
+ response,
91
+ requestId: response.headers.get("x-request-id"),
92
+ };
93
+ }
94
+
95
+ /** Decode a non-2xx response into an {@link OpenAIHttpError} without consuming it twice. */
96
+ export async function captureOpenAIHttpError(response: Response): Promise<AIError.OpenAIHttpError> {
97
+ let bodyText: string | undefined;
98
+ let bodyJson: unknown;
99
+ try {
100
+ bodyText = await response.text();
101
+ if (bodyText.trim().length > 0) {
102
+ try {
103
+ bodyJson = JSON.parse(bodyText);
104
+ } catch {}
105
+ } else {
106
+ bodyText = undefined;
107
+ }
108
+ } catch {}
109
+ const captured: CapturedHttpErrorResponse = {
110
+ status: response.status,
111
+ headers: response.headers,
112
+ bodyText,
113
+ bodyJson,
114
+ };
115
+ const { detail, code } = OpenAIHttpError.parseEnvelope(bodyJson, bodyText);
116
+ // "status code (no body)" matches the SDK's former APIError phrasing;
117
+ // `finalizeErrorMessage` keys a repair path on that exact wording.
118
+ const message = detail
119
+ ? `${response.status} ${detail.length > MAX_DETAIL_CHARS ? detail.slice(0, MAX_DETAIL_CHARS) : detail}`
120
+ : `${response.status} status code (no body)`;
121
+ return new AIError.OpenAIHttpError(message, captured, code);
122
+ }
@@ -0,0 +1,12 @@
1
+ import packageJson from "../../package.json" with { type: "json" };
2
+
3
+ export function getOpenRouterHeaders(): Record<string, string> {
4
+ return {
5
+ "User-Agent": `Oh-My-Pi/${packageJson.version}`,
6
+ "HTTP-Referer": "https://omp.sh/",
7
+ "X-OpenRouter-Title": "Oh-My-Pi",
8
+ "X-OpenRouter-Categories": "cli-agent",
9
+ "X-OpenRouter-Cache": "true",
10
+ "X-OpenRouter-Cache-TTL": "3600",
11
+ };
12
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared `host:port` parser used by the auth-broker and auth-gateway boot
3
+ * paths. Centralized so the two servers can't drift on what they accept (the
4
+ * gateway used to silently allow empty hostnames; this fixes it).
5
+ */
6
+
7
+ import * as AIError from "../error";
8
+
9
+ export interface ParsedBind {
10
+ hostname: string;
11
+ port: number;
12
+ }
13
+
14
+ function parsePort(raw: string, bind: string): number {
15
+ if (!/^\d+$/.test(raw)) {
16
+ throw new AIError.ConfigurationError(`Invalid bind '${bind}'; port must be an integer.`);
17
+ }
18
+ const port = Number.parseInt(raw, 10);
19
+ if (!Number.isFinite(port) || port < 0 || port > 65535) {
20
+ throw new AIError.ConfigurationError(`Invalid bind '${bind}'; port out of range.`);
21
+ }
22
+ return port;
23
+ }
24
+
25
+ /**
26
+ * Parse a `host:port` (or bare `port`, which assumes loopback) string.
27
+ *
28
+ * Accepts:
29
+ * - `"4000"` → `127.0.0.1:4000`
30
+ * - `"0.0.0.0:4000"` → as written
31
+ * - `"[::1]:4000"` → as written (brackets retained, Bun handles them)
32
+ *
33
+ * Rejects:
34
+ * - empty input
35
+ * - empty hostname (`":4000"`)
36
+ * - non-integer / out-of-range port
37
+ */
38
+ export function parseBind(raw: string): ParsedBind {
39
+ const trimmed = raw.trim();
40
+ if (trimmed.length === 0) {
41
+ throw new AIError.ConfigurationError("Invalid bind; expected 'host:port' or 'port'.");
42
+ }
43
+ if (/^\d+$/.test(trimmed)) {
44
+ return { hostname: "127.0.0.1", port: parsePort(trimmed, raw) };
45
+ }
46
+ const lastColon = trimmed.lastIndexOf(":");
47
+ if (lastColon < 0) {
48
+ throw new AIError.ConfigurationError(`Invalid bind '${raw}'; expected 'host:port' or 'port'.`);
49
+ }
50
+ const hostPart = trimmed.slice(0, lastColon);
51
+ const portPart = trimmed.slice(lastColon + 1);
52
+ if (hostPart.length === 0) {
53
+ throw new AIError.ConfigurationError(`Invalid bind '${raw}'; host must not be empty.`);
54
+ }
55
+ return { hostname: hostPart, port: parsePort(portPart, raw) };
56
+ }
@@ -0,0 +1,30 @@
1
+ import type { Api, Model, ProviderResponseMetadata, StreamOptions } from "../types";
2
+
3
+ export function normalizeProviderResponse(
4
+ response: Response,
5
+ requestId?: string | null,
6
+ metadata?: Record<string, unknown>,
7
+ ): ProviderResponseMetadata {
8
+ const headers: Record<string, string> = {};
9
+ response.headers.forEach((value, key) => {
10
+ headers[key.toLowerCase()] = value;
11
+ });
12
+ const providerResponse: ProviderResponseMetadata = {
13
+ status: response.status,
14
+ headers,
15
+ };
16
+ if (requestId !== undefined) providerResponse.requestId = requestId;
17
+ if (metadata !== undefined) providerResponse.metadata = metadata;
18
+ return providerResponse;
19
+ }
20
+
21
+ export async function notifyProviderResponse(
22
+ options: Pick<StreamOptions, "onResponse"> | undefined,
23
+ response: Response,
24
+ model?: Model<Api>,
25
+ requestId?: string | null,
26
+ metadata?: Record<string, unknown>,
27
+ ): Promise<void> {
28
+ if (!options?.onResponse) return;
29
+ await options.onResponse(normalizeProviderResponse(response, requestId, metadata), model);
30
+ }