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,20 @@
1
+ export interface JsonSchemaValidationIssue {
2
+ path: PropertyKey[];
3
+ message: string;
4
+ expectedTypes?: string[];
5
+ keyword?: string;
6
+ /**
7
+ * Marks issues that originate inside a failed `anyOf` / `oneOf` branch.
8
+ * Consumers such as the tool-argument coercion layer use this to avoid
9
+ * applying type repairs (e.g. singleton-array wrapping) that would be
10
+ * authoritative outside of a combinator but are only one candidate
11
+ * branch's expectation here.
12
+ */
13
+ fromUnionBranch?: boolean;
14
+ }
15
+ export interface JsonSchemaValidationResult {
16
+ success: boolean;
17
+ issues: JsonSchemaValidationIssue[];
18
+ }
19
+ export declare function validateJsonSchemaValue(schema: unknown, value: unknown): JsonSchemaValidationResult;
20
+ export declare function isJsonSchemaValueValid(schema: unknown, value: unknown): boolean;
@@ -0,0 +1,2 @@
1
+ /** Validate that `schema` is structurally a valid JSON Schema (subset). */
2
+ export declare function isValidJsonSchema(schema: unknown): boolean;
@@ -0,0 +1,124 @@
1
+ import { type DescriptionSpillFormat } from "./spill";
2
+ import { type JsonObject } from "./types";
3
+ export type ResidualSchemaIncompatibility = "type-array" | "type-null" | "nullable" | "combiners";
4
+ export interface NormalizeSchemaOptions {
5
+ unsupportedFields: (key: string) => boolean;
6
+ normalizeFieldNames: boolean;
7
+ collapseNullFields: boolean;
8
+ normalizeTypeArrayToNullable: boolean;
9
+ stripNullableKeyword: boolean;
10
+ autoPropertyOrdering: boolean;
11
+ ensureObjectProperties: boolean;
12
+ liftStrippedToDescription: false | {
13
+ keys?: (key: string) => boolean;
14
+ format?: DescriptionSpillFormat;
15
+ };
16
+ mergeObjectCombiners: boolean;
17
+ collapseSameTypeCombiners: boolean;
18
+ collapseMixedTypeCombiners: boolean;
19
+ stripResidualCombinersFixpoint: boolean;
20
+ extractNullableFromUnions: boolean;
21
+ inferTypeForBareEnum: boolean;
22
+ foldOneOfIntoAnyOf: boolean;
23
+ dropNonScalarEnum: boolean;
24
+ rejectResidualIncompatibilities?: ReadonlyArray<ResidualSchemaIncompatibility>;
25
+ validateAndFallback?: {
26
+ fallback: unknown;
27
+ };
28
+ }
29
+ /** Copy all keys from a schema except the specified combiner key. */
30
+ export declare function copySchemaWithout(schema: JsonObject, combiner: string): JsonObject;
31
+ /**
32
+ * Recursively strip any remaining anyOf/oneOf that same-type or mixed-type
33
+ * collapse can handle. This is needed because object-combiner merging can
34
+ * create new anyOf in merged subtrees after child normalization already ran.
35
+ */
36
+ export declare function stripResidualCombiners(value: unknown, epoch?: number): unknown;
37
+ export declare function normalizeSchema(value: unknown, options: NormalizeSchemaOptions): unknown;
38
+ export declare function normalizeSchemaForGoogle(value: unknown): unknown;
39
+ export declare function normalizeSchemaForCCA(value: unknown): unknown;
40
+ export declare function normalizeSchemaForMCP(value: unknown): unknown;
41
+ /**
42
+ * Moonshot Flavored JSON Schema (MFJS) — the stricter subset Moonshot/Kimi
43
+ * native hosts (api.moonshot.ai, api.kimi.com) validate
44
+ * `tools.function.parameters` against. It rejects standard JSON Schema
45
+ * constructs that OpenAI-compatible hosts accept, returning HTTP 400
46
+ * `tools.function.parameters is not a valid moonshot flavored json schema`.
47
+ * Differences this normalizer reconciles:
48
+ *
49
+ * - `const` (incl. `anyOf`/`oneOf` whose every branch is a bare `const`) is
50
+ * rejected; collapse to `enum` with an inferred scalar `type`.
51
+ * - `oneOf` is not an MFJS combinator (only `anyOf` is); residual `oneOf` is
52
+ * folded into `anyOf`.
53
+ * - `type` must be a scalar string; `type: [...]` arrays are reduced to a
54
+ * single scalar (the `null` branch is dropped — `nullable` is unsupported).
55
+ * - Enum-bearing nodes get an inferred `type` (the idiomatic MFJS form; a bare
56
+ * `enum` is valid too) so `anyOf` branches always carry a `type`.
57
+ * - Validation/decorative keywords (`minItems`, `maxItems`, `maxLength`,
58
+ * `pattern`, `format`, `title`, …) and tuple `prefixItems` are rejected and
59
+ * stripped, spilling human-meaningful ones into the sibling `description`.
60
+ * `default` and `description` are MFJS Meta Data fields and are preserved.
61
+ * - `additionalProperties` (boolean or schema) and `type: "null"` (incl.
62
+ * inside `anyOf`) are kept.
63
+ *
64
+ * Out of scope (absent from the built-in tool surface, spec-ambiguous to
65
+ * rewrite blindly): `allOf` intersection merging, external/recursive `$ref`,
66
+ * and the depth-10 limit.
67
+ */
68
+ export declare function normalizeSchemaForMoonshot(value: unknown): unknown;
69
+ /**
70
+ * OpenAI Responses rejects `oneOf` in tool schemas even when strict mode is
71
+ * disabled, and rejects every schema node with `type: "object"` unless it has
72
+ * a `properties` member. Normalize only schema-valued positions so literal
73
+ * payloads under `enum`, `const`, `default`, and `examples` remain unchanged.
74
+ *
75
+ * Identity-preserving: returns the input reference unchanged when no rewrite
76
+ * occurred so callers can dedupe via reference equality (and the strict-mode
77
+ * cache stays warm). If a node has both `oneOf` and `anyOf`, the two are
78
+ * concatenated (the wire payload accepts a single union; preserving both
79
+ * would not survive).
80
+ */
81
+ export declare function sanitizeSchemaForOpenAIResponses(schema: JsonObject): JsonObject;
82
+ /**
83
+ * Alias for {@link sanitizeSchemaForOpenAIResponses} matching the
84
+ * `normalizeSchemaFor*` dispatcher naming used elsewhere in this module.
85
+ */
86
+ export declare const normalizeSchemaForOpenAIResponses: (schema: JsonObject) => JsonObject;
87
+ /**
88
+ * First pass of strict-mode preparation.
89
+ *
90
+ * Rewrites everything strict mode forbids into something it accepts:
91
+ * - Drops non-structural keywords (`format`, `pattern`, `examples`, …),
92
+ * `const`, `nullable`, and `additionalProperties` (re-added by
93
+ * `enforceStrictSchema` as `false`).
94
+ * - `type: [a, b]` → `anyOf: [{type: a, …}, {type: b, …}]`, copying only the
95
+ * keywords each variant can use (e.g. `properties` stays only on the
96
+ * object variant).
97
+ * - `const` → single-entry `enum`.
98
+ * - Description carries a `(default: X)` suffix so the model still sees the
99
+ * documented default after the keyword is stripped.
100
+ * - `nullable: true` wraps the whole node in `anyOf:[T,{type:"null"}]`.
101
+ *
102
+ * Recurses into properties, items, prefixItems, combinators, and $defs. The
103
+ * `cache` WeakMap dedupes shared subgraphs; the `epoch` is the cycle guard.
104
+ */
105
+ export declare function sanitizeSchemaForStrictMode(schema: Record<string, unknown>, epoch?: number, cache?: WeakMap<Record<string, unknown>, Record<string, unknown>>, root?: Record<string, unknown>): Record<string, unknown>;
106
+ /**
107
+ * Recursively enforces JSON Schema constraints required by OpenAI/Codex strict mode:
108
+ * - `additionalProperties: false` on every object node
109
+ * - every key in `properties` present in `required`
110
+ *
111
+ * Properties absent from the original `required` array were TypeBox-optional.
112
+ * They are made nullable (`anyOf: [T, { type: "null" }]`) so the model can
113
+ * signal omission by outputting null rather than omitting the key entirely.
114
+ *
115
+ * @throws {Error} When a schema node has no `type`, array-based combinator
116
+ * (`anyOf`/`allOf`/`oneOf`), object-based combinator (`not`), or `$ref` —
117
+ * i.e. the node is not representable in strict mode. Prefer
118
+ * {@link tryEnforceStrictSchema} which catches this and degrades gracefully.
119
+ */
120
+ export declare function enforceStrictSchema(schema: Record<string, unknown>, cache?: WeakMap<Record<string, unknown>, Record<string, unknown>>): Record<string, unknown>;
121
+ export declare function tryEnforceStrictSchema(schema: Record<string, unknown>): {
122
+ schema: Record<string, unknown>;
123
+ strict: boolean;
124
+ };
@@ -0,0 +1,8 @@
1
+ import type { JsonObject } from "./types";
2
+ export type DescriptionSpillFormat = "spill" | "paren";
3
+ /**
4
+ * Demote stripped JSON Schema keywords into a node's `description` so the model
5
+ * still receives the constraint as natural-language context after the wire
6
+ * schema drops it.
7
+ */
8
+ export declare function spillToDescription(node: JsonObject, entries: ReadonlyArray<readonly [string, unknown]>, format?: DescriptionSpillFormat): void;
@@ -0,0 +1,17 @@
1
+ export declare function stamp<T extends object, V>(target: T, key: symbol, compute: (target: T) => V): V;
2
+ export declare function epochNext(): number;
3
+ /**
4
+ * Marks `target` as visited for this `epoch`. Returns `true` the first time
5
+ * it is called for a given (target, epoch) pair and `false` on every
6
+ * subsequent call within the same epoch.
7
+ */
8
+ export declare function once<T extends object>(target: T, epoch: number): boolean;
9
+ /**
10
+ * Returns `true` on first entry, `false` if `target` is already on the
11
+ * current path. A `false` return does NOT deepen the counter — callers pair
12
+ * `exit` only with successful enters (`if (!enter(n)) bail; try {…} finally
13
+ * { exit(n); }`), so incrementing on the cycle branch would leak depth and
14
+ * make every later top-level walk of the same object misreport a cycle.
15
+ */
16
+ export declare function enter<T extends object>(target: T): boolean;
17
+ export declare function exit<T extends object>(target: T): void;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Detects tool-parameter schemas that pass structural JSON-Schema validation
3
+ * (so {@link isValidJsonSchema} accepts them) yet make OpenAI-style providers
4
+ * reject the whole request with HTTP 400 — namely an `enum`/`const` whose
5
+ * value(s) cannot satisfy the node's declared `type`. MCP servers emit these
6
+ * when a nullable/array branch is built incorrectly (e.g. a non-null `enum`
7
+ * copied onto a `type: "null"` branch, or an `enum` placed on an `array`
8
+ * schema instead of its `items`). One such tool 400s the entire turn, so
9
+ * callers quarantine just the offending tool. See issue #2652.
10
+ */
11
+ /**
12
+ * Walk a tool parameter schema for OpenAI-strict `enum`/`const`-vs-`type`
13
+ * contradictions. Returns a JSON-pointer-ish path to the first offending node,
14
+ * or `null` when the schema is safe to emit.
15
+ */
16
+ export declare function findStrictToolSchemaViolation(schema: unknown, path?: string): string | null;
@@ -0,0 +1,4 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export declare function isJsonObject(value: unknown): value is JsonObject;
3
+ /** True when `value` is a plain JSON object with no own enumerable keys. */
4
+ export declare function isJsonObjectEmpty(value: JsonObject): boolean;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Render a JSON Schema as a simplified, human-readable TypeScript type.
3
+ *
4
+ * This is a *display* conversion, not a faithful TS codegen: it surfaces the
5
+ * shape (objects, arrays, unions, enums, records) and property descriptions so
6
+ * a model — or a human reading `/dump` — can grasp a tool's parameters at a
7
+ * glance, far more legibly than raw JSON Schema. Refinement keywords
8
+ * (min/max/pattern/format) are intentionally dropped; only type structure,
9
+ * literal enums/consts, and descriptions survive.
10
+ */
11
+ export interface JsonSchemaToTsOptions {
12
+ /** Indentation unit for nested object bodies. Default two spaces. */
13
+ readonly indent?: string;
14
+ /** Emit `description` keywords as JSDoc comments on object properties. Default true. */
15
+ readonly comments?: boolean;
16
+ }
17
+ /** Convert a JSON Schema object into a simplified TypeScript type string. */
18
+ export declare function jsonSchemaToTypeScript(schema: unknown, options?: JsonSchemaToTsOptions): string;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Compute the wire (JSON Schema) representation of a tool's parameters.
3
+ *
4
+ * Tools may author parameters in three shapes:
5
+ * 1. Zod (canonical) — converted to JSON Schema on demand.
6
+ * 2. ArkType — converted to JSON Schema via its native `toJsonSchema`.
7
+ * 3. TypeBox / plain JSON Schema (legacy + extension compat) — upgraded to
8
+ * draft 2020-12 without converting.
9
+ *
10
+ * All three are normalized at the boundary so providers and validators see the same
11
+ * JSON Schema dialect.
12
+ */
13
+ import type { Type } from "arktype";
14
+ import { type ZodType } from "zod/v4";
15
+ import type { Tool } from "../../types";
16
+ /**
17
+ * True when `value` is a live Zod schema instance.
18
+ *
19
+ * The check is stricter than "has a `_zod` property" because a JSON
20
+ * round-trip preserves the `_zod` key as a plain object and would otherwise
21
+ * fool the predicate — see issue #1101, where MCP servers ship
22
+ * `JSON.stringify(zodSchemaInstance)` as a tool's `inputSchema` and the
23
+ * resulting plain object then explodes `z.toJSONSchema` because the prototype
24
+ * (and every Zod parsing method) is gone.
25
+ *
26
+ * Live Zod instances always carry a `.parse` function on the prototype;
27
+ * impostors do not.
28
+ */
29
+ export declare function isZodSchema(value: unknown): value is ZodType;
30
+ /**
31
+ * True when `value` is a live ArkType schema instance.
32
+ *
33
+ * ArkType schemas are callable functions carrying `toJsonSchema`/`assert`
34
+ * methods. Zod v4 instances are non-callable objects (keyed off `_zod`), and
35
+ * raw JSON Schema is a plain object — the three are disjoint. We deliberately
36
+ * avoid the Standard Schema `~standard` marker because Zod v4 implements it too.
37
+ */
38
+ export declare function isArkSchema(value: unknown): value is Type;
39
+ /**
40
+ * Normalize `{}` (empty JSON Schema = `z.unknown()` / unconstrained value) to
41
+ * boolean `true` in every schema-valued position. JSON Schema draft 2020-12
42
+ * §4.3.1: `{}` and `true` are semantically equivalent ("any JSON value").
43
+ * Grammar-constrained samplers (llama.cpp, etc.) treat the object form as
44
+ * "generate an empty object" rather than "any JSON value", causing open-typed
45
+ * fields like `extra.title` (from `z.record(z.string(), z.unknown())`) to
46
+ * always emit `{}` instead of the intended string/number/etc. (issue #1179).
47
+ *
48
+ * Mutates in place. Provider-agnostic — applied to every tool wire schema so
49
+ * Anthropic, Google, OpenAI, Ollama, Bedrock, and Cursor all see the
50
+ * normalized form, regardless of whether the source was Zod or TypeBox.
51
+ */
52
+ export declare function normalizeEmptySchemas(node: unknown): void;
53
+ /** Convert a Zod schema into the JSON Schema shape providers consume. */
54
+ export declare function zodToWireSchema(schema: ZodType): Record<string, unknown>;
55
+ /**
56
+ * Convert an ArkType schema into the JSON Schema shape providers consume.
57
+ *
58
+ * Mirrors {@link zodToWireSchema}: emit draft-2020-12, drop the `$schema`
59
+ * metadata, run the JSON-schema post-process (NOT the Zod-only cleanup), then
60
+ * close declared objects so the wire is `additionalProperties: false` like Zod.
61
+ *
62
+ * The `fallback` degrades any un-emittable node (a `.narrow()` predicate or a
63
+ * morph) to its underlying base schema instead of throwing — matching Zod,
64
+ * whose `.refine()`/`.transform()` likewise never appear in the wire schema.
65
+ */
66
+ export declare function arkToWireSchema(schema: Type): Record<string, unknown>;
67
+ /**
68
+ * Resolve a tool's parameters to a JSON Schema object suitable for sending
69
+ * over the wire. Zod schemas are converted (and cached); legacy TypeBox / raw
70
+ * JSON Schema parameters are upgraded to draft 2020-12 (and cached).
71
+ *
72
+ * Zod schemas also receive Zod-artifact cleanup; both branches normalize
73
+ * schema-valued positions and nullable scalar unions.
74
+ */
75
+ export declare function toolWireSchema(tool: Tool): Record<string, unknown>;
76
+ /**
77
+ * Return a deep clone of `schema` with every `description` annotation removed.
78
+ * The result is memoized on the input via a non-enumerable symbol (`stamp`) so
79
+ * repeated provider requests reuse the same stripped object; the input is never
80
+ * mutated, so the stamped `toolWireSchema` cache stays intact for
81
+ * system-prompt/UI rendering.
82
+ */
83
+ export declare function stripSchemaDescriptions(schema: Record<string, unknown>): Record<string, unknown>;
84
+ /**
85
+ * Strip a tool's human-readable text from its provider-bound spec: empties the
86
+ * top-level `description` and removes nested schema `description` annotations.
87
+ * Used when the full tool catalog is rendered into the system prompt instead, so
88
+ * the descriptions ride the wire once (in the prompt) rather than duplicated on
89
+ * every tool definition. Parameters are resolved to wire JSON Schema and cloned,
90
+ * leaving the original tool objects and the stamped schema cache untouched.
91
+ */
92
+ export declare function stripToolDescriptions(tools: readonly Tool[]): Tool[];
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Defensive rewrite for nodes that look like `JSON.stringify(zodSchemaInstance)`
3
+ * output rather than JSON Schema. MCP servers using Zod 4 sometimes ship a
4
+ * serialised schema instance directly as a tool's `inputSchema`, because the
5
+ * fields Zod surfaces on its instances (`type`, `enum`, `options`, `def`) shadow
6
+ * (and clash with) JSON Schema keywords. The resulting payload is neither valid
7
+ * Zod nor valid JSON Schema 2020-12 and Anthropic's strict validator rejects
8
+ * the whole tool list.
9
+ *
10
+ * Symptoms we've observed (gitnexus_impact.direction):
11
+ * {
12
+ * def: { type: "enum", entries: { upstream: "upstream", ... } },
13
+ * type: "enum", // <- invalid `type` value
14
+ * enum: { upstream: "upstream", ... }, // <- `enum` MUST be an array
15
+ * options: ["upstream", "downstream"],
16
+ * }
17
+ *
18
+ * This module recognises the shape (`def.type === node.type` and `def.type` is
19
+ * a known Zod kind) and rewrites it to clean JSON Schema where deterministic.
20
+ * For Zod kinds we don't fully model, we strip the toxic siblings (`def`,
21
+ * `options`, object-shaped `enum`) and drop an invalid `type` so the remainder
22
+ * passes meta-schema validation as a permissive node.
23
+ *
24
+ * Pure / identity-preserving: returns the input reference when nothing changes.
25
+ */
26
+ /**
27
+ * Walks a JSON value and rewrites every Zod-instance-shaped node into clean
28
+ * JSON Schema 2020-12. Identity-preserving when no rewrite fires. Tolerates
29
+ * self-referential graphs — a revisited node returns as-is.
30
+ */
31
+ export declare function decontaminateZodInstance(value: unknown): unknown;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared helpers for mapping `StreamOptions.streamFirstEventTimeoutMs` onto
3
+ * underlying SDK request-timeout options.
4
+ *
5
+ * The hint is intentionally not a watchdog — it just narrows the SDK's
6
+ * "transport timeout" window so a stuck pre-stream request fails fast
7
+ * instead of hanging on the default (often multi-minute) SDK timeout. Once
8
+ * the stream actually starts, silence is not failure; callers must abort
9
+ * to interrupt a quiet stream.
10
+ */
11
+ /**
12
+ * Coerce a caller-supplied `streamFirstEventTimeoutMs` into a positive integer suitable
13
+ * for the SDK's `timeout` option. Returns `undefined` when the caller passed nothing,
14
+ * a non-finite value, or a non-positive value (preserving the SDK's default).
15
+ */
16
+ export declare function resolveSdkTimeoutMs(streamFirstEventTimeoutMs: number | undefined): number | undefined;
17
+ /**
18
+ * Build per-request SDK options that combine an abort signal with the optional
19
+ * `streamFirstEventTimeoutMs` request-timeout hint.
20
+ *
21
+ * The returned `{ signal, timeout?, maxRetries? }` shape is compatible with both
22
+ * OpenAI's and Anthropic's `RequestOptions` (and any other SDK that follows the
23
+ * Stainless conventions), so callers from any of those providers can spread the
24
+ * result directly into `client.X.create(params, requestOptions)`.
25
+ *
26
+ * When the hint is set, retries are forced to zero so the SDK does not silently
27
+ * extend the caller's explicit deadline by re-attempting after a timeout.
28
+ */
29
+ export declare function createSdkStreamRequestOptions(signal: AbortSignal, streamFirstEventTimeoutMs: number | undefined): {
30
+ signal: AbortSignal;
31
+ timeout?: number;
32
+ maxRetries?: number;
33
+ };
@@ -0,0 +1,5 @@
1
+ import type { ServerSentEvent } from "jeopi-utils";
2
+ import type { RawSseEvent } from "../types";
3
+ type RawSseObserver = (event: RawSseEvent) => void;
4
+ export declare function notifyRawSseEvent(observer: RawSseObserver | undefined, event: ServerSentEvent | RawSseEvent): void;
5
+ export {};
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Streaming-safe filters for leaked chat-template tool-call and thinking markup.
3
+ *
4
+ * Hosted models sometimes leak raw template markup into visible `content` instead
5
+ * of returning structured events. Tool-call healing delegates to the same
6
+ * dialect scanners used by owned in-band tool calling; this file keeps the
7
+ * provider-facing compatibility wrapper and model/provider gating.
8
+ */
9
+ export interface HealedToolCall {
10
+ readonly id: string;
11
+ readonly name: string;
12
+ readonly arguments: string;
13
+ }
14
+ export type StreamMarkupHealingPattern = "kimi" | "dsml" | "thinking";
15
+ export interface StreamMarkupHealingOptions {
16
+ readonly pattern: StreamMarkupHealingPattern;
17
+ }
18
+ export type StreamMarkupHealingEvent = {
19
+ readonly type: "text";
20
+ readonly text: string;
21
+ } | {
22
+ readonly type: "thinking";
23
+ readonly thinking: string;
24
+ } | {
25
+ readonly type: "toolCall";
26
+ readonly call: HealedToolCall;
27
+ };
28
+ /**
29
+ * State machine that consumes streamed visible text and emits cleaned text,
30
+ * thinking deltas, and reconstructed tool calls.
31
+ *
32
+ * A {@link ThinkingInbandScanner} always heals leaked reasoning idioms
33
+ * (`<think>`, `<thinking>`, ` ```thinking `, Gemma/Harmony channels, …) out of
34
+ * the visible channel. For Kimi / DeepSeek-DSML the provider tool-call grammar
35
+ * runs first and its cleaned text is piped through that thinking healer, so a
36
+ * model can leak tool-call markup and reasoning in the same stream.
37
+ *
38
+ * Feed only one stream channel (usually `delta.content` / `message.content`).
39
+ * Mixing reasoning and visible text into the same instance can corrupt held-back
40
+ * partial tag buffers.
41
+ */
42
+ export declare class StreamMarkupHealing {
43
+ #private;
44
+ constructor(options: StreamMarkupHealingOptions);
45
+ get pattern(): StreamMarkupHealingPattern;
46
+ /**
47
+ * Feed a chunk and return visible text only. Reconstructed tool calls are
48
+ * stored for {@link drainCompleted}; thinking blocks are intentionally not
49
+ * returned by this compatibility helper. Use {@link feedEvents} when the caller
50
+ * needs ordered text/thinking/tool-call events.
51
+ */
52
+ feed(text: string): string;
53
+ /** Feed a chunk and return cleaned text/thinking/tool-call events in stream order. */
54
+ feedEvents(text: string): StreamMarkupHealingEvent[];
55
+ /**
56
+ * Feed a chunk and return cleaned events, excluding synthesized tool calls.
57
+ * Used when the upstream chunk also carries structured `tool_calls`, keeping
58
+ * that structured payload as the single source of truth while preserving
59
+ * adjacent text and thinking events.
60
+ */
61
+ feedEventsWithoutCalls(text: string): StreamMarkupHealingEvent[];
62
+ /** Drain accumulated tool calls from calls to {@link feed}. */
63
+ drainCompleted(): HealedToolCall[];
64
+ /**
65
+ * Flush held-back stream-end fragments as ordered events. Partial tool-call
66
+ * sections/envelopes are dropped by the delegated scanners; unterminated
67
+ * thinking blocks are emitted as thinking, matching the previous MiniMax parser
68
+ * behavior.
69
+ */
70
+ flushEvents(): StreamMarkupHealingEvent[];
71
+ /** Flush held-back text only. Reconstructed calls are retained for {@link drainCompleted}. */
72
+ flushPending(): string;
73
+ /** True once any configured tool-call section/envelope has fully closed. */
74
+ get sectionClosed(): boolean;
75
+ }
76
+ /** Cheap model/provider gate for Kimi-K2 chat-template token leaks. */
77
+ export declare function modelMayLeakKimiToolCalls(provider: string, modelId: string): boolean;
78
+ /** Cheap model/provider gate for DeepSeek DSML envelope leaks. */
79
+ export declare function modelMayLeakDsmlToolCalls(provider: string, modelId: string): boolean;
80
+ /**
81
+ * Pick the leaked-markup healer for an OpenAI-compatible / Ollama visible-text
82
+ * stream. Kimi chat-template tokens and DeepSeek DSML envelopes need their
83
+ * dedicated tool-call grammars; every other model uses `"thinking"`. All three
84
+ * patterns run the generic {@link ThinkingInbandScanner}, so leaked reasoning
85
+ * idioms (e.g. a Gemini ` ```thinking ` fence on OpenRouter) are always healed.
86
+ */
87
+ export declare function getStreamMarkupHealingPattern(provider: string, modelId: string): StreamMarkupHealingPattern;
@@ -0,0 +1,102 @@
1
+ import type { Api, Model, StreamOptions } from "../types";
2
+ import { AssistantMessageEventStream } from "./event-stream";
3
+ /** Stable lead phrase of the guard's error message; exported for tests. The
4
+ * message also carries "stream stall" so the session + transport retry
5
+ * classifiers treat it as a transient (retryable) stop without bespoke rules. */
6
+ export declare const THINKING_LOOP_ERROR_MARKER = "Thinking loop detected";
7
+ /**
8
+ * True when `model` is a Gemini model whose native thinking stream surfaces the
9
+ * "thought summary" titles this module's header guard counts.
10
+ *
11
+ * OpenAI-compat transports can serve Gemini under an arbitrary provider/id, so they
12
+ * carry the explicit `compat.enableGeminiThinkingLoopGuard` flag; direct Gemini
13
+ * transports carry a clearly shaped id/provider, so a string match is sufficient.
14
+ */
15
+ export declare function isGeminiThinkingModel(model: Model<Api>): boolean;
16
+ /**
17
+ * True when `model` should be guarded for thinking/response loops (Gemini & DeepSeek).
18
+ *
19
+ * OpenAI-compat transports can serve Gemini or DeepSeek under an arbitrary provider/id.
20
+ * Direct Gemini/DeepSeek transports carry a clearly shaped id/provider, so a string match
21
+ * is sufficient.
22
+ */
23
+ export declare function isLoopGuardedModel(model: Model<Api>, options?: StreamOptions): boolean;
24
+ /** @deprecated Use isLoopGuardedModel instead. */
25
+ export declare function isGeminiThinkingLoopModel(model: Model<Api>): boolean;
26
+ /**
27
+ * Stateful detector fed the streamed thinking deltas. `push` returns a
28
+ * human-readable reason the first time a loop shape is recognized; the caller
29
+ * is responsible for stopping after the first hit.
30
+ */
31
+ export declare class ThinkingLoopDetector {
32
+ #private;
33
+ push(delta: string): string | null;
34
+ /** Process the buffered trailing paragraph (one with no blank-line / heading
35
+ * terminator). Called when the thinking block ends so the final segment —
36
+ * which may be the one that completes a duplicate cluster — is not dropped. */
37
+ flush(): string | null;
38
+ }
39
+ /**
40
+ * Consecutive Gemini thought-summary headers in one uninterrupted reasoning
41
+ * stream that trips the tool-call reminder. Gemini occasionally narrates a long
42
+ * chain of titled summaries ("Examining Result Handling", "Refining Result
43
+ * Rendering", …) without ever calling a tool, burning the whole budget on
44
+ * planning. This is the over-planning shape {@link ThinkingLoopDetector} misses —
45
+ * those titles are stripped before its similarity analysis precisely because their
46
+ * wording keeps changing, so a genuinely-distinct planning runaway never trips it.
47
+ *
48
+ * Set well above legitimate hard-problem depth: a capable model can emit ~10
49
+ * distinct, progressing hypotheses in a single reasoning block before acting (and
50
+ * a false trip is costly — the interrupt discards the whole reasoning turn). A
51
+ * real narration runaway burns dozens-to-hundreds of titles, so this still trips
52
+ * fast on the actual pathology.
53
+ */
54
+ export declare const GEMINI_HEADER_RUNAWAY_THRESHOLD = 24;
55
+ /**
56
+ * True when a single trimmed line is a Gemini reasoning-summary title: a markdown
57
+ * ATX heading (`## …`) or a whole-line bold / bold-italic run (`**Title**`,
58
+ * `***Title***`). Inline emphasis inside prose never matches — the bold run must
59
+ * span the entire line. Mirrors the title shapes {@link ThinkingLoopDetector}
60
+ * strips before similarity analysis.
61
+ */
62
+ export declare function isReasoningSummaryHeader(line: string): boolean;
63
+ /**
64
+ * Counts consecutive Gemini reasoning-summary headers across a streamed thinking
65
+ * block. {@link push} returns true exactly once — when the running header count
66
+ * first reaches {@link GEMINI_HEADER_RUNAWAY_THRESHOLD} — and the caller then
67
+ * interrupts the stream and reminds the model to issue a tool call. Paragraph
68
+ * lines between titles do NOT reset the run (Gemini emits header + paragraph per
69
+ * thought, so the run IS the number of summaries); leaving the reasoning channel
70
+ * does, via {@link reset} on a new thinking block / prose / tool call.
71
+ */
72
+ export declare class GeminiHeaderRunDetector {
73
+ #private;
74
+ /** Feed a thinking delta. Returns true the first time the run hits the threshold. */
75
+ push(delta: string): boolean;
76
+ /** Number of summary titles counted in the current run (for the reminder/log). */
77
+ get count(): number;
78
+ /** Re-arm for a fresh reasoning block: clears the buffer, count, and latch. */
79
+ reset(): void;
80
+ }
81
+ /**
82
+ * Wrap a provider stream with the loop guard. `controller` is the guard's own
83
+ * abort handle: aborting it (after wiring it into the provider's signal via
84
+ * {@link withGeminiThinkingLoopGuard}) tears down the upstream once a loop
85
+ * trips.
86
+ */
87
+ export declare function guardThinkingLoopStream(inner: AssistantMessageEventStream, model: Model<Api>, controller: AbortController, options?: StreamOptions): AssistantMessageEventStream;
88
+ /**
89
+ * Apply the loop guard around a provider dispatch. For non-guarded models
90
+ * (or when disabled) this is a transparent pass-through. For guarded models it injects a
91
+ * guard abort signal into the provider call so a detected loop tears down the
92
+ * upstream, then wraps the returned stream. The guard only raises the retryable
93
+ * stall; bounding the re-samples and the final cook pass lives in the
94
+ * result-awaiting caller.
95
+ */
96
+ export declare function withGeminiThinkingLoopGuard<O extends {
97
+ signal?: AbortSignal;
98
+ loopGuard?: {
99
+ enabled?: boolean;
100
+ checkAssistantContent?: boolean;
101
+ };
102
+ }>(model: Model<Api>, options: O | undefined, dispatch: (options: O | undefined) => AssistantMessageEventStream): AssistantMessageEventStream;
@@ -0,0 +1,26 @@
1
+ import type { AssistantMessage, ToolResultMessage } from "../types";
2
+ /** Runtime settings for cross-turn tool-call repetition detection. */
3
+ export interface ToolCallLoopGuardOptions {
4
+ readonly threshold: number;
5
+ readonly exemptTools: readonly string[];
6
+ }
7
+ /** A completed assistant turn plus the tool results it produced. */
8
+ export interface ToolCallLoopTurn {
9
+ readonly message: AssistantMessage;
10
+ readonly toolResults: readonly ToolResultMessage[];
11
+ }
12
+ /** Details needed to steer the model away from a repeated tool call. */
13
+ export interface RepeatedToolCallDetection {
14
+ readonly kind: "repeated_tool_call";
15
+ readonly toolName: string;
16
+ readonly count: number;
17
+ readonly resultSummary: string;
18
+ readonly argumentsSummary: string;
19
+ }
20
+ /** Detects consecutive identical assistant tool calls across model turns. */
21
+ export declare class ToolCallLoopGuard {
22
+ #private;
23
+ constructor(options: ToolCallLoopGuardOptions);
24
+ /** Records one completed turn and returns the threshold hit, if any. */
25
+ recordTurn(turn: ToolCallLoopTurn): RepeatedToolCallDetection | null;
26
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Utility functions for mapping unified ToolChoice to provider-specific formats.
3
+ */
4
+ import type { ToolChoice } from "../types";
5
+ /** OpenAI Completions API tool choice format */
6
+ export type OpenAICompletionsToolChoice = "auto" | "none" | "required" | {
7
+ type: "function";
8
+ function: {
9
+ name: string;
10
+ };
11
+ } | undefined;
12
+ /** OpenAI Responses API tool choice format (flat structure) */
13
+ export type OpenAIResponsesToolChoice = "auto" | "none" | "required" | {
14
+ type: "function";
15
+ name: string;
16
+ } | {
17
+ type: "custom";
18
+ name: string;
19
+ } | undefined;
20
+ /** Anthropic-compatible tool choice format */
21
+ export type AnthropicToolChoice = "auto" | "none" | "any" | {
22
+ type: "tool";
23
+ name: string;
24
+ } | undefined;
25
+ /**
26
+ * Map unified ToolChoice to OpenAI Completions API format.
27
+ * - "any" → "required"
28
+ * - { type: "tool", name } → { type: "function", function: { name } }
29
+ */
30
+ export declare function mapToOpenAICompletionsToolChoice(choice?: ToolChoice): OpenAICompletionsToolChoice;
31
+ /**
32
+ * Returns true when an OpenAI-completions `tool_choice` value forces a tool
33
+ * call (`"required"` or a function-name pin), as opposed to leaving it open
34
+ * (`"auto"`, `"none"`, or unset). Accepts `unknown` because the param shape
35
+ * pulled from the OpenAI SDK (`ChatCompletionToolChoiceOption`) widens with
36
+ * each release; this check only needs the open/forced bit.
37
+ */
38
+ export declare function isForcedToolChoice(choice: unknown): boolean;
39
+ /**
40
+ * Map unified ToolChoice to OpenAI Responses API format.
41
+ * - "any" → "required"
42
+ * - { type: "tool", name } → { type: "function", name } (flat structure)
43
+ */
44
+ export declare function mapToOpenAIResponsesToolChoice(choice?: ToolChoice): OpenAIResponsesToolChoice;
45
+ /**
46
+ * Map unified ToolChoice to Anthropic-compatible format.
47
+ * - "required" → "any"
48
+ * - { type: "function", ... } → { type: "tool", name }
49
+ */
50
+ export declare function mapToAnthropicToolChoice(choice?: ToolChoice): AnthropicToolChoice;