@draht/ai 2026.5.12 → 2026.7.7

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 (611) hide show
  1. package/dist/api/anthropic-messages.d.ts +71 -0
  2. package/dist/api/anthropic-messages.d.ts.map +1 -0
  3. package/dist/api/anthropic-messages.js +972 -0
  4. package/dist/api/anthropic-messages.js.map +1 -0
  5. package/dist/api/anthropic-messages.lazy.d.ts +3 -0
  6. package/dist/api/anthropic-messages.lazy.d.ts.map +1 -0
  7. package/dist/api/anthropic-messages.lazy.js +3 -0
  8. package/dist/api/anthropic-messages.lazy.js.map +1 -0
  9. package/dist/api/azure-openai-responses.d.ts +15 -0
  10. package/dist/api/azure-openai-responses.d.ts.map +1 -0
  11. package/dist/api/azure-openai-responses.js +222 -0
  12. package/dist/api/azure-openai-responses.js.map +1 -0
  13. package/dist/api/azure-openai-responses.lazy.d.ts +3 -0
  14. package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -0
  15. package/dist/api/azure-openai-responses.lazy.js +3 -0
  16. package/dist/api/azure-openai-responses.lazy.js.map +1 -0
  17. package/dist/api/bedrock-converse-stream.d.ts +38 -0
  18. package/dist/api/bedrock-converse-stream.d.ts.map +1 -0
  19. package/dist/api/bedrock-converse-stream.js +876 -0
  20. package/dist/api/bedrock-converse-stream.js.map +1 -0
  21. package/dist/api/bedrock-converse-stream.lazy.d.ts +9 -0
  22. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -0
  23. package/dist/api/bedrock-converse-stream.lazy.js +30 -0
  24. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -0
  25. package/dist/api/cloudflare.d.ts +9 -0
  26. package/dist/api/cloudflare.d.ts.map +1 -0
  27. package/dist/api/cloudflare.js +9 -0
  28. package/dist/api/cloudflare.js.map +1 -0
  29. package/dist/{providers → api}/github-copilot-headers.d.ts +1 -1
  30. package/dist/api/github-copilot-headers.d.ts.map +1 -0
  31. package/dist/api/github-copilot-headers.js.map +1 -0
  32. package/dist/api/google-generative-ai.d.ts +13 -0
  33. package/dist/api/google-generative-ai.d.ts.map +1 -0
  34. package/dist/api/google-generative-ai.js +407 -0
  35. package/dist/api/google-generative-ai.js.map +1 -0
  36. package/dist/api/google-generative-ai.lazy.d.ts +3 -0
  37. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  38. package/dist/api/google-generative-ai.lazy.js +3 -0
  39. package/dist/api/google-generative-ai.lazy.js.map +1 -0
  40. package/dist/{providers → api}/google-shared.d.ts +8 -3
  41. package/dist/api/google-shared.d.ts.map +1 -0
  42. package/dist/{providers → api}/google-shared.js +34 -17
  43. package/dist/api/google-shared.js.map +1 -0
  44. package/dist/api/google-vertex.d.ts +15 -0
  45. package/dist/api/google-vertex.d.ts.map +1 -0
  46. package/dist/api/google-vertex.js +456 -0
  47. package/dist/api/google-vertex.js.map +1 -0
  48. package/dist/api/google-vertex.lazy.d.ts +3 -0
  49. package/dist/api/google-vertex.lazy.d.ts.map +1 -0
  50. package/dist/api/google-vertex.lazy.js +3 -0
  51. package/dist/api/google-vertex.lazy.js.map +1 -0
  52. package/dist/api/lazy.d.ts +15 -0
  53. package/dist/api/lazy.d.ts.map +1 -0
  54. package/dist/api/lazy.js +59 -0
  55. package/dist/api/lazy.js.map +1 -0
  56. package/dist/api/mistral-conversations.d.ts +25 -0
  57. package/dist/api/mistral-conversations.d.ts.map +1 -0
  58. package/dist/api/mistral-conversations.js +555 -0
  59. package/dist/api/mistral-conversations.js.map +1 -0
  60. package/dist/api/mistral-conversations.lazy.d.ts +3 -0
  61. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  62. package/dist/api/mistral-conversations.lazy.js +3 -0
  63. package/dist/api/mistral-conversations.lazy.js.map +1 -0
  64. package/dist/api/openai-codex-responses.d.ts +30 -0
  65. package/dist/api/openai-codex-responses.d.ts.map +1 -0
  66. package/dist/api/openai-codex-responses.js +1228 -0
  67. package/dist/api/openai-codex-responses.js.map +1 -0
  68. package/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  69. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  70. package/dist/api/openai-codex-responses.lazy.js +3 -0
  71. package/dist/api/openai-codex-responses.lazy.js.map +1 -0
  72. package/dist/api/openai-completions.d.ts +19 -0
  73. package/dist/api/openai-completions.d.ts.map +1 -0
  74. package/dist/api/openai-completions.js +1061 -0
  75. package/dist/api/openai-completions.js.map +1 -0
  76. package/dist/api/openai-completions.lazy.d.ts +3 -0
  77. package/dist/api/openai-completions.lazy.d.ts.map +1 -0
  78. package/dist/api/openai-completions.lazy.js +3 -0
  79. package/dist/api/openai-completions.lazy.js.map +1 -0
  80. package/dist/api/openai-prompt-cache.d.ts +3 -0
  81. package/dist/api/openai-prompt-cache.d.ts.map +1 -0
  82. package/dist/api/openai-prompt-cache.js +10 -0
  83. package/dist/api/openai-prompt-cache.js.map +1 -0
  84. package/dist/{providers → api}/openai-responses-shared.d.ts +3 -2
  85. package/dist/api/openai-responses-shared.d.ts.map +1 -0
  86. package/dist/{providers → api}/openai-responses-shared.js +201 -189
  87. package/dist/api/openai-responses-shared.js.map +1 -0
  88. package/dist/{providers → api}/openai-responses.d.ts +3 -3
  89. package/dist/api/openai-responses.d.ts.map +1 -0
  90. package/dist/api/openai-responses.js +229 -0
  91. package/dist/api/openai-responses.js.map +1 -0
  92. package/dist/api/openai-responses.lazy.d.ts +3 -0
  93. package/dist/api/openai-responses.lazy.d.ts.map +1 -0
  94. package/dist/api/openai-responses.lazy.js +3 -0
  95. package/dist/api/openai-responses.lazy.js.map +1 -0
  96. package/dist/api/openrouter-images.d.ts +3 -0
  97. package/dist/api/openrouter-images.d.ts.map +1 -0
  98. package/dist/api/openrouter-images.js +126 -0
  99. package/dist/api/openrouter-images.js.map +1 -0
  100. package/dist/api/openrouter-images.lazy.d.ts +3 -0
  101. package/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  102. package/dist/api/openrouter-images.lazy.js +4 -0
  103. package/dist/api/openrouter-images.lazy.js.map +1 -0
  104. package/dist/api/simple-options.d.ts +14 -0
  105. package/dist/api/simple-options.d.ts.map +1 -0
  106. package/dist/{providers → api}/simple-options.js +20 -4
  107. package/dist/api/simple-options.js.map +1 -0
  108. package/dist/{providers → api}/transform-messages.d.ts +1 -1
  109. package/dist/api/transform-messages.d.ts.map +1 -0
  110. package/dist/{providers → api}/transform-messages.js +66 -34
  111. package/dist/api/transform-messages.js.map +1 -0
  112. package/dist/auth/context.d.ts +7 -0
  113. package/dist/auth/context.d.ts.map +1 -0
  114. package/dist/auth/context.js +42 -0
  115. package/dist/auth/context.js.map +1 -0
  116. package/dist/auth/credential-store.d.ts +16 -0
  117. package/dist/auth/credential-store.d.ts.map +1 -0
  118. package/dist/auth/credential-store.js +37 -0
  119. package/dist/auth/credential-store.js.map +1 -0
  120. package/dist/auth/helpers.d.ts +20 -0
  121. package/dist/auth/helpers.d.ts.map +1 -0
  122. package/dist/auth/helpers.js +46 -0
  123. package/dist/auth/helpers.js.map +1 -0
  124. package/dist/auth/resolve.d.ts +26 -0
  125. package/dist/auth/resolve.d.ts.map +1 -0
  126. package/dist/auth/resolve.js +101 -0
  127. package/dist/auth/resolve.js.map +1 -0
  128. package/dist/auth/types.d.ts +180 -0
  129. package/dist/auth/types.d.ts.map +1 -0
  130. package/dist/auth/types.js +2 -0
  131. package/dist/auth/types.js.map +1 -0
  132. package/dist/bedrock-provider.d.ts +2 -2
  133. package/dist/bedrock-provider.d.ts.map +1 -1
  134. package/dist/bedrock-provider.js +3 -3
  135. package/dist/bedrock-provider.js.map +1 -1
  136. package/dist/cli.d.ts.map +1 -1
  137. package/dist/cli.js +14 -0
  138. package/dist/cli.js.map +1 -1
  139. package/dist/compat.d.ts +65 -0
  140. package/dist/compat.d.ts.map +1 -0
  141. package/dist/compat.js +182 -0
  142. package/dist/compat.js.map +1 -0
  143. package/dist/env-api-keys.d.ts +12 -3
  144. package/dist/env-api-keys.d.ts.map +1 -1
  145. package/dist/env-api-keys.js +77 -39
  146. package/dist/env-api-keys.js.map +1 -1
  147. package/dist/image-models.d.ts +10 -0
  148. package/dist/image-models.d.ts.map +1 -0
  149. package/dist/image-models.generated.d.ts +530 -0
  150. package/dist/image-models.generated.d.ts.map +1 -0
  151. package/dist/image-models.generated.js +532 -0
  152. package/dist/image-models.generated.js.map +1 -0
  153. package/dist/image-models.js +23 -0
  154. package/dist/image-models.js.map +1 -0
  155. package/dist/images-api-registry.d.ts +14 -0
  156. package/dist/images-api-registry.d.ts.map +1 -0
  157. package/dist/images-api-registry.js +22 -0
  158. package/dist/images-api-registry.js.map +1 -0
  159. package/dist/images-models.d.ts +93 -0
  160. package/dist/images-models.d.ts.map +1 -0
  161. package/dist/images-models.js +141 -0
  162. package/dist/images-models.js.map +1 -0
  163. package/dist/images.d.ts +4 -0
  164. package/dist/images.d.ts.map +1 -0
  165. package/dist/images.js +14 -0
  166. package/dist/images.js.map +1 -0
  167. package/dist/index.d.ts +30 -25
  168. package/dist/index.d.ts.map +1 -1
  169. package/dist/index.js +10 -5
  170. package/dist/index.js.map +1 -1
  171. package/dist/legacy-api-aliases.d.ts +42 -0
  172. package/dist/legacy-api-aliases.d.ts.map +1 -0
  173. package/dist/legacy-api-aliases.js +49 -0
  174. package/dist/legacy-api-aliases.js.map +1 -0
  175. package/dist/models.d.ts +136 -15
  176. package/dist/models.d.ts.map +1 -1
  177. package/dist/models.generated.d.ts +8134 -2008
  178. package/dist/models.generated.d.ts.map +1 -1
  179. package/dist/models.generated.js +70 -14888
  180. package/dist/models.generated.js.map +1 -1
  181. package/dist/models.js +218 -24
  182. package/dist/models.js.map +1 -1
  183. package/dist/oauth.d.ts +1 -1
  184. package/dist/oauth.d.ts.map +1 -1
  185. package/dist/oauth.js.map +1 -1
  186. package/dist/providers/all.d.ts +21 -0
  187. package/dist/providers/all.d.ts.map +1 -0
  188. package/dist/providers/all.js +114 -0
  189. package/dist/providers/all.js.map +1 -0
  190. package/dist/providers/amazon-bedrock.d.ts +2 -19
  191. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  192. package/dist/providers/amazon-bedrock.js +33 -649
  193. package/dist/providers/amazon-bedrock.js.map +1 -1
  194. package/dist/providers/amazon-bedrock.models.d.ts +1875 -0
  195. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  196. package/dist/providers/amazon-bedrock.models.js +1829 -0
  197. package/dist/providers/amazon-bedrock.models.js.map +1 -0
  198. package/dist/providers/ant-ling.d.ts +3 -0
  199. package/dist/providers/ant-ling.d.ts.map +1 -0
  200. package/dist/providers/ant-ling.js +15 -0
  201. package/dist/providers/ant-ling.js.map +1 -0
  202. package/dist/providers/ant-ling.models.d.ts +86 -0
  203. package/dist/providers/ant-ling.models.d.ts.map +1 -0
  204. package/dist/providers/ant-ling.models.js +60 -0
  205. package/dist/providers/ant-ling.models.js.map +1 -0
  206. package/dist/providers/anthropic.d.ts +2 -39
  207. package/dist/providers/anthropic.d.ts.map +1 -1
  208. package/dist/providers/anthropic.js +17 -771
  209. package/dist/providers/anthropic.js.map +1 -1
  210. package/dist/providers/anthropic.models.d.ts +274 -0
  211. package/dist/providers/anthropic.models.d.ts.map +1 -0
  212. package/dist/providers/anthropic.models.js +253 -0
  213. package/dist/providers/anthropic.models.js.map +1 -0
  214. package/dist/providers/azure-openai-responses.d.ts +2 -14
  215. package/dist/providers/azure-openai-responses.d.ts.map +1 -1
  216. package/dist/providers/azure-openai-responses.js +11 -173
  217. package/dist/providers/azure-openai-responses.js.map +1 -1
  218. package/dist/providers/azure-openai-responses.models.d.ts +804 -0
  219. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  220. package/dist/providers/azure-openai-responses.models.js +743 -0
  221. package/dist/providers/azure-openai-responses.models.js.map +1 -0
  222. package/dist/providers/cerebras.d.ts +3 -0
  223. package/dist/providers/cerebras.d.ts.map +1 -0
  224. package/dist/providers/cerebras.js +15 -0
  225. package/dist/providers/cerebras.js.map +1 -0
  226. package/dist/providers/cerebras.models.d.ts +66 -0
  227. package/dist/providers/cerebras.models.d.ts.map +1 -0
  228. package/dist/providers/cerebras.models.js +59 -0
  229. package/dist/providers/cerebras.models.js.map +1 -0
  230. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  231. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  232. package/dist/providers/cloudflare-ai-gateway.js +20 -0
  233. package/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  234. package/dist/providers/cloudflare-ai-gateway.models.d.ts +786 -0
  235. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  236. package/dist/providers/cloudflare-ai-gateway.models.js +684 -0
  237. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  238. package/dist/providers/cloudflare-auth.d.ts +4 -0
  239. package/dist/providers/cloudflare-auth.d.ts.map +1 -0
  240. package/dist/providers/cloudflare-auth.js +85 -0
  241. package/dist/providers/cloudflare-auth.js.map +1 -0
  242. package/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  243. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  244. package/dist/providers/cloudflare-workers-ai.js +14 -0
  245. package/dist/providers/cloudflare-workers-ai.js.map +1 -0
  246. package/dist/providers/cloudflare-workers-ai.models.d.ts +302 -0
  247. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  248. package/dist/providers/cloudflare-workers-ai.models.js +239 -0
  249. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  250. package/dist/providers/deepseek.d.ts +3 -0
  251. package/dist/providers/deepseek.d.ts.map +1 -0
  252. package/dist/providers/deepseek.js +15 -0
  253. package/dist/providers/deepseek.js.map +1 -0
  254. package/dist/providers/deepseek.models.d.ts +63 -0
  255. package/dist/providers/deepseek.models.d.ts.map +1 -0
  256. package/dist/providers/deepseek.models.js +43 -0
  257. package/dist/providers/deepseek.models.js.map +1 -0
  258. package/dist/providers/faux.d.ts +43 -2
  259. package/dist/providers/faux.d.ts.map +1 -1
  260. package/dist/providers/faux.js +35 -7
  261. package/dist/providers/faux.js.map +1 -1
  262. package/dist/providers/fireworks.d.ts +3 -0
  263. package/dist/providers/fireworks.d.ts.map +1 -0
  264. package/dist/providers/fireworks.js +19 -0
  265. package/dist/providers/fireworks.js.map +1 -0
  266. package/dist/providers/fireworks.models.d.ts +381 -0
  267. package/dist/providers/fireworks.models.d.ts.map +1 -0
  268. package/dist/providers/fireworks.models.js +295 -0
  269. package/dist/providers/fireworks.models.js.map +1 -0
  270. package/dist/providers/github-copilot.d.ts +3 -0
  271. package/dist/providers/github-copilot.d.ts.map +1 -0
  272. package/dist/providers/github-copilot.js +25 -0
  273. package/dist/providers/github-copilot.js.map +1 -0
  274. package/dist/providers/github-copilot.models.d.ts +698 -0
  275. package/dist/providers/github-copilot.models.d.ts.map +1 -0
  276. package/dist/providers/github-copilot.models.js +483 -0
  277. package/dist/providers/github-copilot.models.js.map +1 -0
  278. package/dist/providers/google-vertex.d.ts +2 -14
  279. package/dist/providers/google-vertex.d.ts.map +1 -1
  280. package/dist/providers/google-vertex.js +30 -414
  281. package/dist/providers/google-vertex.js.map +1 -1
  282. package/dist/providers/google-vertex.models.d.ts +202 -0
  283. package/dist/providers/google-vertex.models.d.ts.map +1 -0
  284. package/dist/providers/google-vertex.models.js +182 -0
  285. package/dist/providers/google-vertex.models.js.map +1 -0
  286. package/dist/providers/google.d.ts +2 -12
  287. package/dist/providers/google.d.ts.map +1 -1
  288. package/dist/providers/google.js +12 -396
  289. package/dist/providers/google.js.map +1 -1
  290. package/dist/providers/google.models.d.ts +328 -0
  291. package/dist/providers/google.models.d.ts.map +1 -0
  292. package/dist/providers/google.models.js +288 -0
  293. package/dist/providers/google.models.js.map +1 -0
  294. package/dist/providers/groq.d.ts +3 -0
  295. package/dist/providers/groq.d.ts.map +1 -0
  296. package/dist/providers/groq.js +15 -0
  297. package/dist/providers/groq.js.map +1 -0
  298. package/dist/providers/groq.models.d.ts +128 -0
  299. package/dist/providers/groq.models.d.ts.map +1 -0
  300. package/dist/providers/groq.models.js +125 -0
  301. package/dist/providers/groq.models.js.map +1 -0
  302. package/dist/providers/huggingface.d.ts +3 -0
  303. package/dist/providers/huggingface.d.ts.map +1 -0
  304. package/dist/providers/huggingface.js +15 -0
  305. package/dist/providers/huggingface.js.map +1 -0
  306. package/dist/providers/huggingface.models.d.ts +983 -0
  307. package/dist/providers/huggingface.models.d.ts.map +1 -0
  308. package/dist/providers/huggingface.models.js +887 -0
  309. package/dist/providers/huggingface.models.js.map +1 -0
  310. package/dist/providers/images/register-builtins.d.ts +4 -0
  311. package/dist/providers/images/register-builtins.d.ts.map +1 -0
  312. package/dist/providers/images/register-builtins.js +34 -0
  313. package/dist/providers/images/register-builtins.js.map +1 -0
  314. package/dist/providers/kimi-coding.d.ts +3 -0
  315. package/dist/providers/kimi-coding.d.ts.map +1 -0
  316. package/dist/providers/kimi-coding.js +15 -0
  317. package/dist/providers/kimi-coding.js.map +1 -0
  318. package/dist/providers/kimi-coding.models.d.ts +63 -0
  319. package/dist/providers/kimi-coding.models.d.ts.map +1 -0
  320. package/dist/providers/kimi-coding.models.js +59 -0
  321. package/dist/providers/kimi-coding.models.js.map +1 -0
  322. package/dist/providers/minimax-cn.d.ts +3 -0
  323. package/dist/providers/minimax-cn.d.ts.map +1 -0
  324. package/dist/providers/minimax-cn.js +15 -0
  325. package/dist/providers/minimax-cn.js.map +1 -0
  326. package/dist/providers/minimax-cn.models.d.ts +54 -0
  327. package/dist/providers/minimax-cn.models.d.ts.map +1 -0
  328. package/dist/providers/minimax-cn.models.js +56 -0
  329. package/dist/providers/minimax-cn.models.js.map +1 -0
  330. package/dist/providers/minimax.d.ts +3 -0
  331. package/dist/providers/minimax.d.ts.map +1 -0
  332. package/dist/providers/minimax.js +15 -0
  333. package/dist/providers/minimax.js.map +1 -0
  334. package/dist/providers/minimax.models.d.ts +54 -0
  335. package/dist/providers/minimax.models.d.ts.map +1 -0
  336. package/dist/providers/minimax.models.js +56 -0
  337. package/dist/providers/minimax.models.js.map +1 -0
  338. package/dist/providers/mistral.d.ts +2 -21
  339. package/dist/providers/mistral.d.ts.map +1 -1
  340. package/dist/providers/mistral.js +12 -498
  341. package/dist/providers/mistral.js.map +1 -1
  342. package/dist/providers/mistral.models.d.ts +513 -0
  343. package/dist/providers/mistral.models.d.ts.map +1 -0
  344. package/dist/providers/mistral.models.js +515 -0
  345. package/dist/providers/mistral.models.js.map +1 -0
  346. package/dist/providers/moonshotai-cn.d.ts +3 -0
  347. package/dist/providers/moonshotai-cn.d.ts.map +1 -0
  348. package/dist/providers/moonshotai-cn.js +15 -0
  349. package/dist/providers/moonshotai-cn.js.map +1 -0
  350. package/dist/providers/moonshotai-cn.models.d.ts +234 -0
  351. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  352. package/dist/providers/moonshotai-cn.models.js +169 -0
  353. package/dist/providers/moonshotai-cn.models.js.map +1 -0
  354. package/dist/providers/moonshotai.d.ts +3 -0
  355. package/dist/providers/moonshotai.d.ts.map +1 -0
  356. package/dist/providers/moonshotai.js +15 -0
  357. package/dist/providers/moonshotai.js.map +1 -0
  358. package/dist/providers/moonshotai.models.d.ts +234 -0
  359. package/dist/providers/moonshotai.models.d.ts.map +1 -0
  360. package/dist/providers/moonshotai.models.js +169 -0
  361. package/dist/providers/moonshotai.models.js.map +1 -0
  362. package/dist/providers/nvidia.d.ts +3 -0
  363. package/dist/providers/nvidia.d.ts.map +1 -0
  364. package/dist/providers/nvidia.js +15 -0
  365. package/dist/providers/nvidia.js.map +1 -0
  366. package/dist/providers/nvidia.models.d.ts +563 -0
  367. package/dist/providers/nvidia.models.d.ts.map +1 -0
  368. package/dist/providers/nvidia.models.js +385 -0
  369. package/dist/providers/nvidia.models.js.map +1 -0
  370. package/dist/providers/openai-codex.d.ts +3 -0
  371. package/dist/providers/openai-codex.d.ts.map +1 -0
  372. package/dist/providers/openai-codex.js +18 -0
  373. package/dist/providers/openai-codex.js.map +1 -0
  374. package/dist/providers/openai-codex.models.d.ts +87 -0
  375. package/dist/providers/openai-codex.models.d.ts.map +1 -0
  376. package/dist/providers/openai-codex.models.js +77 -0
  377. package/dist/providers/openai-codex.models.js.map +1 -0
  378. package/dist/providers/openai.d.ts +3 -0
  379. package/dist/providers/openai.d.ts.map +1 -0
  380. package/dist/providers/openai.js +15 -0
  381. package/dist/providers/openai.js.map +1 -0
  382. package/dist/providers/openai.models.d.ts +805 -0
  383. package/dist/providers/openai.models.d.ts.map +1 -0
  384. package/dist/providers/openai.models.js +743 -0
  385. package/dist/providers/openai.models.js.map +1 -0
  386. package/dist/providers/opencode-go.d.ts +3 -0
  387. package/dist/providers/opencode-go.d.ts.map +1 -0
  388. package/dist/providers/opencode-go.js +18 -0
  389. package/dist/providers/opencode-go.js.map +1 -0
  390. package/dist/providers/opencode-go.models.d.ts +309 -0
  391. package/dist/providers/opencode-go.models.d.ts.map +1 -0
  392. package/dist/providers/opencode-go.models.js +240 -0
  393. package/dist/providers/opencode-go.models.js.map +1 -0
  394. package/dist/providers/opencode.d.ts +3 -0
  395. package/dist/providers/opencode.d.ts.map +1 -0
  396. package/dist/providers/opencode.js +22 -0
  397. package/dist/providers/opencode.js.map +1 -0
  398. package/dist/providers/opencode.models.d.ts +1064 -0
  399. package/dist/providers/opencode.models.d.ts.map +1 -0
  400. package/dist/providers/opencode.models.js +888 -0
  401. package/dist/providers/opencode.models.js.map +1 -0
  402. package/dist/providers/openrouter-images.d.ts +3 -0
  403. package/dist/providers/openrouter-images.d.ts.map +1 -0
  404. package/dist/providers/openrouter-images.js +14 -0
  405. package/dist/providers/openrouter-images.js.map +1 -0
  406. package/dist/providers/openrouter.d.ts +3 -0
  407. package/dist/providers/openrouter.d.ts.map +1 -0
  408. package/dist/providers/openrouter.js +15 -0
  409. package/dist/providers/openrouter.js.map +1 -0
  410. package/dist/providers/openrouter.models.d.ts +5507 -0
  411. package/dist/providers/openrouter.models.d.ts.map +1 -0
  412. package/dist/providers/openrouter.models.js +4724 -0
  413. package/dist/providers/openrouter.models.js.map +1 -0
  414. package/dist/providers/together.d.ts +3 -0
  415. package/dist/providers/together.d.ts.map +1 -0
  416. package/dist/providers/together.js +15 -0
  417. package/dist/providers/together.js.map +1 -0
  418. package/dist/providers/together.models.d.ts +598 -0
  419. package/dist/providers/together.models.d.ts.map +1 -0
  420. package/dist/providers/together.models.js +380 -0
  421. package/dist/providers/together.models.js.map +1 -0
  422. package/dist/providers/vercel-ai-gateway.d.ts +3 -0
  423. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  424. package/dist/providers/vercel-ai-gateway.js +15 -0
  425. package/dist/providers/vercel-ai-gateway.js.map +1 -0
  426. package/dist/providers/vercel-ai-gateway.models.d.ts +3254 -0
  427. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  428. package/dist/providers/vercel-ai-gateway.models.js +3206 -0
  429. package/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  430. package/dist/providers/xai.d.ts +3 -0
  431. package/dist/providers/xai.d.ts.map +1 -0
  432. package/dist/providers/xai.js +15 -0
  433. package/dist/providers/xai.js.map +1 -0
  434. package/dist/providers/xai.models.d.ts +157 -0
  435. package/dist/providers/xai.models.d.ts.map +1 -0
  436. package/dist/providers/xai.models.js +131 -0
  437. package/dist/providers/xai.models.js.map +1 -0
  438. package/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  439. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  440. package/dist/providers/xiaomi-token-plan-ams.js +15 -0
  441. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  442. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +108 -0
  443. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  444. package/dist/providers/xiaomi-token-plan-ams.models.js +95 -0
  445. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  446. package/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  447. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  448. package/dist/providers/xiaomi-token-plan-cn.js +15 -0
  449. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  450. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +108 -0
  451. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  452. package/dist/providers/xiaomi-token-plan-cn.models.js +95 -0
  453. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  454. package/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  455. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  456. package/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  457. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  458. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +108 -0
  459. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  460. package/dist/providers/xiaomi-token-plan-sgp.models.js +95 -0
  461. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  462. package/dist/providers/xiaomi.d.ts +3 -0
  463. package/dist/providers/xiaomi.d.ts.map +1 -0
  464. package/dist/providers/xiaomi.js +15 -0
  465. package/dist/providers/xiaomi.js.map +1 -0
  466. package/dist/providers/xiaomi.models.d.ts +129 -0
  467. package/dist/providers/xiaomi.models.d.ts.map +1 -0
  468. package/dist/providers/xiaomi.models.js +113 -0
  469. package/dist/providers/xiaomi.models.js.map +1 -0
  470. package/dist/providers/zai-coding-cn.d.ts +3 -0
  471. package/dist/providers/zai-coding-cn.d.ts.map +1 -0
  472. package/dist/providers/zai-coding-cn.js +15 -0
  473. package/dist/providers/zai-coding-cn.js.map +1 -0
  474. package/dist/providers/zai-coding-cn.models.d.ts +153 -0
  475. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  476. package/dist/providers/zai-coding-cn.models.js +114 -0
  477. package/dist/providers/zai-coding-cn.models.js.map +1 -0
  478. package/dist/providers/zai.d.ts +3 -0
  479. package/dist/providers/zai.d.ts.map +1 -0
  480. package/dist/providers/zai.js +15 -0
  481. package/dist/providers/zai.js.map +1 -0
  482. package/dist/providers/zai.models.d.ts +153 -0
  483. package/dist/providers/zai.models.d.ts.map +1 -0
  484. package/dist/providers/zai.models.js +114 -0
  485. package/dist/providers/zai.models.js.map +1 -0
  486. package/dist/session-resources.d.ts +4 -0
  487. package/dist/session-resources.d.ts.map +1 -0
  488. package/dist/session-resources.js +22 -0
  489. package/dist/session-resources.js.map +1 -0
  490. package/dist/types.d.ts +262 -18
  491. package/dist/types.d.ts.map +1 -1
  492. package/dist/types.js.map +1 -1
  493. package/dist/utils/abort-signals.d.ts +6 -0
  494. package/dist/utils/abort-signals.d.ts.map +1 -0
  495. package/dist/utils/abort-signals.js +34 -0
  496. package/dist/utils/abort-signals.js.map +1 -0
  497. package/dist/utils/diagnostics.d.ts +19 -0
  498. package/dist/utils/diagnostics.d.ts.map +1 -0
  499. package/dist/utils/diagnostics.js +25 -0
  500. package/dist/utils/diagnostics.js.map +1 -0
  501. package/dist/utils/error-body.d.ts +25 -0
  502. package/dist/utils/error-body.d.ts.map +1 -0
  503. package/dist/utils/error-body.js +109 -0
  504. package/dist/utils/error-body.js.map +1 -0
  505. package/dist/utils/estimate.d.ts +17 -0
  506. package/dist/utils/estimate.d.ts.map +1 -0
  507. package/dist/utils/estimate.js +95 -0
  508. package/dist/utils/estimate.js.map +1 -0
  509. package/dist/utils/event-stream.d.ts +3 -3
  510. package/dist/utils/event-stream.d.ts.map +1 -1
  511. package/dist/utils/event-stream.js +2 -2
  512. package/dist/utils/event-stream.js.map +1 -1
  513. package/dist/utils/headers.d.ts +4 -0
  514. package/dist/utils/headers.d.ts.map +1 -0
  515. package/dist/utils/headers.js +18 -0
  516. package/dist/utils/headers.js.map +1 -0
  517. package/dist/utils/json-parse.d.ts +8 -1
  518. package/dist/utils/json-parse.d.ts.map +1 -1
  519. package/dist/utils/json-parse.js +89 -5
  520. package/dist/utils/json-parse.js.map +1 -1
  521. package/dist/utils/node-http-proxy.d.ts +4 -0
  522. package/dist/utils/node-http-proxy.d.ts.map +1 -0
  523. package/dist/utils/node-http-proxy.js +92 -0
  524. package/dist/utils/node-http-proxy.js.map +1 -0
  525. package/dist/utils/oauth/anthropic.d.ts +3 -1
  526. package/dist/utils/oauth/anthropic.d.ts.map +1 -1
  527. package/dist/utils/oauth/anthropic.js +33 -1
  528. package/dist/utils/oauth/anthropic.js.map +1 -1
  529. package/dist/utils/oauth/device-code.d.ts +23 -0
  530. package/dist/utils/oauth/device-code.d.ts.map +1 -0
  531. package/dist/utils/oauth/device-code.js +69 -0
  532. package/dist/utils/oauth/device-code.js.map +1 -0
  533. package/dist/utils/oauth/github-copilot.d.ts +5 -3
  534. package/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  535. package/dist/utils/oauth/github-copilot.js +158 -79
  536. package/dist/utils/oauth/github-copilot.js.map +1 -1
  537. package/dist/utils/oauth/index.d.ts +8 -11
  538. package/dist/utils/oauth/index.d.ts.map +1 -1
  539. package/dist/utils/oauth/index.js +2 -11
  540. package/dist/utils/oauth/index.js.map +1 -1
  541. package/dist/utils/oauth/load.d.ts +5 -0
  542. package/dist/utils/oauth/load.d.ts.map +1 -0
  543. package/dist/utils/oauth/load.js +22 -0
  544. package/dist/utils/oauth/load.js.map +1 -0
  545. package/dist/utils/oauth/openai-codex.d.ts +13 -2
  546. package/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  547. package/dist/utils/oauth/openai-codex.js +237 -73
  548. package/dist/utils/oauth/openai-codex.js.map +1 -1
  549. package/dist/utils/oauth/types.d.ts +18 -1
  550. package/dist/utils/oauth/types.d.ts.map +1 -1
  551. package/dist/utils/oauth/types.js.map +1 -1
  552. package/dist/utils/overflow.d.ts +8 -3
  553. package/dist/utils/overflow.d.ts.map +1 -1
  554. package/dist/utils/overflow.js +29 -3
  555. package/dist/utils/overflow.js.map +1 -1
  556. package/dist/utils/provider-env.d.ts +7 -0
  557. package/dist/utils/provider-env.d.ts.map +1 -0
  558. package/dist/utils/provider-env.js +44 -0
  559. package/dist/utils/provider-env.js.map +1 -0
  560. package/dist/utils/retry.d.ts +12 -0
  561. package/dist/utils/retry.d.ts.map +1 -0
  562. package/dist/utils/retry.js +87 -0
  563. package/dist/utils/retry.js.map +1 -0
  564. package/dist/utils/typebox-helpers.d.ts +1 -1
  565. package/dist/utils/typebox-helpers.d.ts.map +1 -1
  566. package/dist/utils/typebox-helpers.js +1 -1
  567. package/dist/utils/typebox-helpers.js.map +1 -1
  568. package/dist/utils/validation.d.ts +1 -1
  569. package/dist/utils/validation.d.ts.map +1 -1
  570. package/dist/utils/validation.js +230 -41
  571. package/dist/utils/validation.js.map +1 -1
  572. package/package.json +24 -44
  573. package/dist/api-registry.d.ts +0 -20
  574. package/dist/api-registry.d.ts.map +0 -1
  575. package/dist/api-registry.js +0 -44
  576. package/dist/api-registry.js.map +0 -1
  577. package/dist/providers/github-copilot-headers.d.ts.map +0 -1
  578. package/dist/providers/github-copilot-headers.js.map +0 -1
  579. package/dist/providers/google-gemini-cli.d.ts +0 -74
  580. package/dist/providers/google-gemini-cli.d.ts.map +0 -1
  581. package/dist/providers/google-gemini-cli.js +0 -776
  582. package/dist/providers/google-gemini-cli.js.map +0 -1
  583. package/dist/providers/google-shared.d.ts.map +0 -1
  584. package/dist/providers/google-shared.js.map +0 -1
  585. package/dist/providers/openai-codex-responses.d.ts +0 -9
  586. package/dist/providers/openai-codex-responses.d.ts.map +0 -1
  587. package/dist/providers/openai-codex-responses.js +0 -741
  588. package/dist/providers/openai-codex-responses.js.map +0 -1
  589. package/dist/providers/openai-completions.d.ts +0 -15
  590. package/dist/providers/openai-completions.d.ts.map +0 -1
  591. package/dist/providers/openai-completions.js +0 -760
  592. package/dist/providers/openai-completions.js.map +0 -1
  593. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  594. package/dist/providers/openai-responses-shared.js.map +0 -1
  595. package/dist/providers/openai-responses.d.ts.map +0 -1
  596. package/dist/providers/openai-responses.js +0 -190
  597. package/dist/providers/openai-responses.js.map +0 -1
  598. package/dist/providers/register-builtins.d.ts +0 -38
  599. package/dist/providers/register-builtins.d.ts.map +0 -1
  600. package/dist/providers/register-builtins.js +0 -261
  601. package/dist/providers/register-builtins.js.map +0 -1
  602. package/dist/providers/simple-options.d.ts +0 -13
  603. package/dist/providers/simple-options.d.ts.map +0 -1
  604. package/dist/providers/simple-options.js.map +0 -1
  605. package/dist/providers/transform-messages.d.ts.map +0 -1
  606. package/dist/providers/transform-messages.js.map +0 -1
  607. package/dist/stream.d.ts +0 -8
  608. package/dist/stream.d.ts.map +0 -1
  609. package/dist/stream.js +0 -27
  610. package/dist/stream.js.map +0 -1
  611. /package/dist/{providers → api}/github-copilot-headers.js +0 -0
@@ -0,0 +1,87 @@
1
+ function buildProviderErrorPattern(patterns) {
2
+ return new RegExp(patterns.join("|"), "i");
3
+ }
4
+ const NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN = buildProviderErrorPattern([
5
+ // OpenCode Go/free-tier limits returned as 429 JSON error types by OpenCode's
6
+ // Zen API. These are subscription/account limits, not transient throttles.
7
+ "GoUsageLimitError",
8
+ "FreeUsageLimitError",
9
+ // OpenCode Go subscription-limit text asks users to enable available-balance
10
+ // usage after rolling/weekly/monthly limits are reached.
11
+ "Monthly usage limit reached",
12
+ "available balance",
13
+ // Generic quota/budget/billing exhaustion. `insufficient_quota` is OpenAI's
14
+ // quota/billing error code; the other strings cover common gateway wording.
15
+ "insufficient_quota",
16
+ "out of budget",
17
+ "quota exceeded",
18
+ "billing",
19
+ ]);
20
+ const RETRYABLE_PROVIDER_ERROR_PATTERN = buildProviderErrorPattern([
21
+ // Generic provider load, HTTP status, and server-side transient failures.
22
+ "overloaded",
23
+ "rate.?limit",
24
+ "too many requests",
25
+ "429",
26
+ "500",
27
+ "502",
28
+ "503",
29
+ "504",
30
+ "524",
31
+ "service.?unavailable",
32
+ "server.?error",
33
+ "internal.?error",
34
+ // Wrapper/provider text for transient upstream failures, including OpenRouter
35
+ // "Provider returned error" responses (#2264).
36
+ "provider.?returned.?error",
37
+ // Network, proxy, and fetch transport failures. This includes OpenAI Codex
38
+ // raw-fetch failures such as "upstream connect", "connection refused", and
39
+ // "reset before headers" (#733), plus OpenRouter connection drops (#3317).
40
+ "network.?error",
41
+ "connection.?error",
42
+ "connection.?refused",
43
+ "connection.?lost",
44
+ "other side closed",
45
+ "fetch failed",
46
+ "upstream.?connect",
47
+ "reset before headers",
48
+ "socket hang up",
49
+ "timed? out",
50
+ "timeout",
51
+ "terminated",
52
+ // WebSocket transports can report close/error text instead of HTTP/fetch text.
53
+ "websocket.?closed",
54
+ "websocket.?error",
55
+ // Premature stream endings from SDKs and transports. Anthropic can throw
56
+ // "stream ended without ..." and "Anthropic stream ended before message_stop"
57
+ // (#4433); Bedrock/Smithy can throw an HTTP/2 no-response error (#3594).
58
+ "ended without",
59
+ "stream ended before message_stop",
60
+ "http2 request did not get a response",
61
+ // Provider-requested retry delay cap failures should flow through the outer
62
+ // retry policy so callers can surface/abort the backoff (#1123).
63
+ "retry delay",
64
+ // Explicit retry guidance emitted mid-stream by OpenAI Responses and Bedrock
65
+ // stream exceptions (#6019).
66
+ "you can retry your request",
67
+ "try your request again",
68
+ "please retry your request",
69
+ ]);
70
+ /**
71
+ * Classifies whether a failed assistant message looks like a transient provider
72
+ * or transport error, so callers can decide if the last assistant turn should be
73
+ * restarted.
74
+ *
75
+ * This does not implement retry policy. Callers should first handle context
76
+ * overflow separately, then apply their own retry budget, backoff, and reporting
77
+ * before restarting the assistant turn.
78
+ */
79
+ export function isRetryableAssistantError(message) {
80
+ if (message.stopReason !== "error" || !message.errorMessage)
81
+ return false;
82
+ const errorMessage = message.errorMessage;
83
+ if (NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN.test(errorMessage))
84
+ return false;
85
+ return RETRYABLE_PROVIDER_ERROR_PATTERN.test(errorMessage);
86
+ }
87
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAEA,SAAS,yBAAyB,CAAC,QAA2B,EAAU;IACvE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAAA,CAC3C;AAED,MAAM,0CAA0C,GAAG,yBAAyB,CAAC;IAC5E,8EAA8E;IAC9E,2EAA2E;IAC3E,mBAAmB;IACnB,qBAAqB;IAErB,6EAA6E;IAC7E,yDAAyD;IACzD,6BAA6B;IAC7B,mBAAmB;IAEnB,4EAA4E;IAC5E,4EAA4E;IAC5E,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,gCAAgC,GAAG,yBAAyB,CAAC;IAClE,0EAA0E;IAC1E,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IAEjB,8EAA8E;IAC9E,+CAA+C;IAC/C,2BAA2B;IAE3B,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,gBAAgB;IAChB,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,YAAY;IAEZ,+EAA+E;IAC/E,mBAAmB;IACnB,kBAAkB;IAElB,yEAAyE;IACzE,8EAA8E;IAC9E,yEAAyE;IACzE,eAAe;IACf,kCAAkC;IAClC,sCAAsC;IAEtC,4EAA4E;IAC5E,iEAAiE;IACjE,aAAa;IAEb,6EAA6E;IAC7E,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,2BAA2B;CAC3B,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAyB,EAAW;IAC7E,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,0CAA0C,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,OAAO,gCAAgC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAAA,CAC3D","sourcesContent":["import type { AssistantMessage } from \"../types.ts\";\n\nfunction buildProviderErrorPattern(patterns: readonly string[]): RegExp {\n\treturn new RegExp(patterns.join(\"|\"), \"i\");\n}\n\nconst NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN = buildProviderErrorPattern([\n\t// OpenCode Go/free-tier limits returned as 429 JSON error types by OpenCode's\n\t// Zen API. These are subscription/account limits, not transient throttles.\n\t\"GoUsageLimitError\",\n\t\"FreeUsageLimitError\",\n\n\t// OpenCode Go subscription-limit text asks users to enable available-balance\n\t// usage after rolling/weekly/monthly limits are reached.\n\t\"Monthly usage limit reached\",\n\t\"available balance\",\n\n\t// Generic quota/budget/billing exhaustion. `insufficient_quota` is OpenAI's\n\t// quota/billing error code; the other strings cover common gateway wording.\n\t\"insufficient_quota\",\n\t\"out of budget\",\n\t\"quota exceeded\",\n\t\"billing\",\n]);\n\nconst RETRYABLE_PROVIDER_ERROR_PATTERN = buildProviderErrorPattern([\n\t// Generic provider load, HTTP status, and server-side transient failures.\n\t\"overloaded\",\n\t\"rate.?limit\",\n\t\"too many requests\",\n\t\"429\",\n\t\"500\",\n\t\"502\",\n\t\"503\",\n\t\"504\",\n\t\"524\",\n\t\"service.?unavailable\",\n\t\"server.?error\",\n\t\"internal.?error\",\n\n\t// Wrapper/provider text for transient upstream failures, including OpenRouter\n\t// \"Provider returned error\" responses (#2264).\n\t\"provider.?returned.?error\",\n\n\t// Network, proxy, and fetch transport failures. This includes OpenAI Codex\n\t// raw-fetch failures such as \"upstream connect\", \"connection refused\", and\n\t// \"reset before headers\" (#733), plus OpenRouter connection drops (#3317).\n\t\"network.?error\",\n\t\"connection.?error\",\n\t\"connection.?refused\",\n\t\"connection.?lost\",\n\t\"other side closed\",\n\t\"fetch failed\",\n\t\"upstream.?connect\",\n\t\"reset before headers\",\n\t\"socket hang up\",\n\t\"timed? out\",\n\t\"timeout\",\n\t\"terminated\",\n\n\t// WebSocket transports can report close/error text instead of HTTP/fetch text.\n\t\"websocket.?closed\",\n\t\"websocket.?error\",\n\n\t// Premature stream endings from SDKs and transports. Anthropic can throw\n\t// \"stream ended without ...\" and \"Anthropic stream ended before message_stop\"\n\t// (#4433); Bedrock/Smithy can throw an HTTP/2 no-response error (#3594).\n\t\"ended without\",\n\t\"stream ended before message_stop\",\n\t\"http2 request did not get a response\",\n\n\t// Provider-requested retry delay cap failures should flow through the outer\n\t// retry policy so callers can surface/abort the backoff (#1123).\n\t\"retry delay\",\n\n\t// Explicit retry guidance emitted mid-stream by OpenAI Responses and Bedrock\n\t// stream exceptions (#6019).\n\t\"you can retry your request\",\n\t\"try your request again\",\n\t\"please retry your request\",\n]);\n\n/**\n * Classifies whether a failed assistant message looks like a transient provider\n * or transport error, so callers can decide if the last assistant turn should be\n * restarted.\n *\n * This does not implement retry policy. Callers should first handle context\n * overflow separately, then apply their own retry budget, backoff, and reporting\n * before restarting the assistant turn.\n */\nexport function isRetryableAssistantError(message: AssistantMessage): boolean {\n\tif (message.stopReason !== \"error\" || !message.errorMessage) return false;\n\tconst errorMessage = message.errorMessage;\n\tif (NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN.test(errorMessage)) return false;\n\treturn RETRYABLE_PROVIDER_ERROR_PATTERN.test(errorMessage);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { type TUnsafe } from "@sinclair/typebox";
1
+ import { type TUnsafe } from "typebox";
2
2
  /**
3
3
  * Creates a string enum schema compatible with Google's API and other providers
4
4
  * that don't support anyOf/const patterns.
@@ -1 +1 @@
1
- {"version":3,"file":"typebox-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/typebox-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAQ,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;CAAE,GACrD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAOpB","sourcesContent":["import { type TUnsafe, Type } from \"@sinclair/typebox\";\n\n/**\n * Creates a string enum schema compatible with Google's API and other providers\n * that don't support anyOf/const patterns.\n *\n * @example\n * const OperationSchema = StringEnum([\"add\", \"subtract\", \"multiply\", \"divide\"], {\n * description: \"The operation to perform\"\n * });\n *\n * type Operation = Static<typeof OperationSchema>; // \"add\" | \"subtract\" | \"multiply\" | \"divide\"\n */\nexport function StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n"]}
1
+ {"version":3,"file":"typebox-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/typebox-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAQ,MAAM,SAAS,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;CAAE,GACrD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAOpB","sourcesContent":["import { type TUnsafe, Type } from \"typebox\";\n\n/**\n * Creates a string enum schema compatible with Google's API and other providers\n * that don't support anyOf/const patterns.\n *\n * @example\n * const OperationSchema = StringEnum([\"add\", \"subtract\", \"multiply\", \"divide\"], {\n * description: \"The operation to perform\"\n * });\n *\n * type Operation = Static<typeof OperationSchema>; // \"add\" | \"subtract\" | \"multiply\" | \"divide\"\n */\nexport function StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Type } from "@sinclair/typebox";
1
+ import { Type } from "typebox";
2
2
  /**
3
3
  * Creates a string enum schema compatible with Google's API and other providers
4
4
  * that don't support anyOf/const patterns.
@@ -1 +1 @@
1
- {"version":3,"file":"typebox-helpers.js","sourceRoot":"","sources":["../../src/utils/typebox-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CACzB,MAAS,EACT,OAAuD,EAClC;IACrB,OAAO,IAAI,CAAC,MAAM,CAAY;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAa;QACnB,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;KACrD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { type TUnsafe, Type } from \"@sinclair/typebox\";\n\n/**\n * Creates a string enum schema compatible with Google's API and other providers\n * that don't support anyOf/const patterns.\n *\n * @example\n * const OperationSchema = StringEnum([\"add\", \"subtract\", \"multiply\", \"divide\"], {\n * description: \"The operation to perform\"\n * });\n *\n * type Operation = Static<typeof OperationSchema>; // \"add\" | \"subtract\" | \"multiply\" | \"divide\"\n */\nexport function StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n"]}
1
+ {"version":3,"file":"typebox-helpers.js","sourceRoot":"","sources":["../../src/utils/typebox-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,IAAI,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CACzB,MAAS,EACT,OAAuD,EAClC;IACrB,OAAO,IAAI,CAAC,MAAM,CAAY;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAa;QACnB,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;KACrD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { type TUnsafe, Type } from \"typebox\";\n\n/**\n * Creates a string enum schema compatible with Google's API and other providers\n * that don't support anyOf/const patterns.\n *\n * @example\n * const OperationSchema = StringEnum([\"add\", \"subtract\", \"multiply\", \"divide\"], {\n * description: \"The operation to perform\"\n * });\n *\n * type Operation = Static<typeof OperationSchema>; // \"add\" | \"subtract\" | \"multiply\" | \"divide\"\n */\nexport function StringEnum<T extends readonly string[]>(\n\tvalues: T,\n\toptions?: { description?: string; default?: T[number] },\n): TUnsafe<T[number]> {\n\treturn Type.Unsafe<T[number]>({\n\t\ttype: \"string\",\n\t\tenum: values as any,\n\t\t...(options?.description && { description: options.description }),\n\t\t...(options?.default && { default: options.default }),\n\t});\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Tool, ToolCall } from "../types.js";
1
+ import type { Tool, ToolCall } from "../types.ts";
2
2
  /**
3
3
  * Finds a tool by name and validates the tool call arguments against its TypeBox schema
4
4
  * @param tools Array of tool definitions
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAkClD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CA6BzE","sourcesContent":["import AjvModule from \"ajv\";\nimport addFormatsModule from \"ajv-formats\";\n\n// Handle both default and named exports\nconst Ajv = (AjvModule as any).default || AjvModule;\nconst addFormats = (addFormatsModule as any).default || addFormatsModule;\n\nimport type { Tool, ToolCall } from \"../types.js\";\n\n// Detect if we're in a browser extension environment with strict CSP\n// Chrome extensions with Manifest V3 don't allow eval/Function constructor\nconst isBrowserExtension = typeof globalThis !== \"undefined\" && (globalThis as any).chrome?.runtime?.id !== undefined;\n\nfunction canUseRuntimeCodegen(): boolean {\n\tif (isBrowserExtension) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tnew Function(\"return true;\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n// Create a singleton AJV instance with formats only when runtime code generation is available.\nlet ajv: any = null;\nif (canUseRuntimeCodegen()) {\n\ttry {\n\t\tajv = new Ajv({\n\t\t\tallErrors: true,\n\t\t\tstrict: false,\n\t\t\tcoerceTypes: true,\n\t\t});\n\t\taddFormats(ajv);\n\t} catch (_e) {\n\t\tconsole.warn(\"AJV validation disabled due to CSP restrictions\");\n\t}\n}\n\n/**\n * Finds a tool by name and validates the tool call arguments against its TypeBox schema\n * @param tools Array of tool definitions\n * @param toolCall The tool call from the LLM\n * @returns The validated arguments\n * @throws Error if tool is not found or validation fails\n */\nexport function validateToolCall(tools: Tool[], toolCall: ToolCall): any {\n\tconst tool = tools.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolCall.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolCall);\n}\n\n/**\n * Validates tool call arguments against the tool's TypeBox schema\n * @param tool The tool definition with TypeBox schema\n * @param toolCall The tool call from the LLM\n * @returns The validated (and potentially coerced) arguments\n * @throws Error with formatted message if validation fails\n */\nexport function validateToolArguments(tool: Tool, toolCall: ToolCall): any {\n\t// Skip validation in environments where runtime code generation is unavailable.\n\tif (!ajv || !canUseRuntimeCodegen()) {\n\t\treturn toolCall.arguments;\n\t}\n\n\t// Compile the schema.\n\tconst validate = ajv.compile(tool.parameters);\n\n\t// Clone arguments so AJV can safely mutate for type coercion\n\tconst args = structuredClone(toolCall.arguments);\n\n\t// Validate the arguments (AJV mutates args in-place for type coercion)\n\tif (validate(args)) {\n\t\treturn args;\n\t}\n\n\t// Format validation errors nicely\n\tconst errors =\n\t\tvalidate.errors\n\t\t\t?.map((err: any) => {\n\t\t\t\tconst path = err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || \"root\";\n\t\t\t\treturn ` - ${path}: ${err.message}`;\n\t\t\t})\n\t\t\t.join(\"\\n\") || \"Unknown validation error\";\n\n\tconst errorMessage = `Validation failed for tool \"${toolCall.name}\":\\n${errors}\\n\\nReceived arguments:\\n${JSON.stringify(toolCall.arguments, null, 2)}`;\n\n\tthrow new Error(errorMessage);\n}\n"]}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA4PlD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAgCzE","sourcesContent":["import { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { Value } from \"typebox/value\";\nimport type { Tool, ToolCall } from \"../types.ts\";\n\nconst validatorCache = new WeakMap<object, ReturnType<typeof Compile>>();\nconst TYPEBOX_KIND = Symbol.for(\"TypeBox.Kind\");\n\ninterface JsonSchemaObject {\n\ttype?: string | string[];\n\tproperties?: Record<string, JsonSchemaObject>;\n\titems?: JsonSchemaObject | JsonSchemaObject[];\n\tadditionalProperties?: boolean | JsonSchemaObject;\n\tallOf?: JsonSchemaObject[];\n\tanyOf?: JsonSchemaObject[];\n\toneOf?: JsonSchemaObject[];\n}\n\nfunction getSchemaTypes(schema: JsonSchemaObject): string[] {\n\tif (typeof schema.type === \"string\") {\n\t\treturn [schema.type];\n\t}\n\tif (Array.isArray(schema.type)) {\n\t\treturn schema.type.filter((type): type is string => typeof type === \"string\");\n\t}\n\treturn [];\n}\n\nfunction matchesJsonType(value: unknown, type: string): boolean {\n\tswitch (type) {\n\t\tcase \"number\":\n\t\t\treturn typeof value === \"number\";\n\t\tcase \"integer\":\n\t\t\treturn typeof value === \"number\" && Number.isInteger(value);\n\t\tcase \"boolean\":\n\t\t\treturn typeof value === \"boolean\";\n\t\tcase \"string\":\n\t\t\treturn typeof value === \"string\";\n\t\tcase \"null\":\n\t\t\treturn value === null;\n\t\tcase \"array\":\n\t\t\treturn Array.isArray(value);\n\t\tcase \"object\":\n\t\t\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction getSubSchemaValidator(schema: JsonSchemaObject): ReturnType<typeof Compile> | undefined {\n\ttry {\n\t\treturn getValidator(schema as Tool[\"parameters\"]);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction coercePrimitiveByType(value: unknown, type: string): unknown {\n\tswitch (type) {\n\t\tcase \"number\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (typeof value === \"string\" && value.trim() !== \"\") {\n\t\t\t\tconst parsed = Number(value);\n\t\t\t\tif (Number.isFinite(parsed)) {\n\t\t\t\t\treturn parsed;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\treturn value ? 1 : 0;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"integer\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (typeof value === \"string\" && value.trim() !== \"\") {\n\t\t\t\tconst parsed = Number(value);\n\t\t\t\tif (Number.isInteger(parsed)) {\n\t\t\t\t\treturn parsed;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\treturn value ? 1 : 0;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"boolean\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tif (value === \"true\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (value === \"false\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"number\") {\n\t\t\t\tif (value === 1) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"string\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tif (typeof value === \"number\" || typeof value === \"boolean\") {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"null\": {\n\t\t\tif (value === \"\" || value === 0 || value === false) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tdefault:\n\t\t\treturn value;\n\t}\n}\n\nfunction applySchemaObjectCoercion(value: Record<string, unknown>, schema: JsonSchemaObject): void {\n\tconst properties = schema.properties;\n\tconst definedKeys = new Set<string>(properties ? Object.keys(properties) : []);\n\n\tif (properties) {\n\t\tfor (const [key, propertySchema] of Object.entries(properties)) {\n\t\t\tif (!(key in value)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue[key] = coerceWithJsonSchema(value[key], propertySchema);\n\t\t}\n\t}\n\n\tif (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n\t\tfor (const [key, propertyValue] of Object.entries(value)) {\n\t\t\tif (definedKeys.has(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue[key] = coerceWithJsonSchema(propertyValue, schema.additionalProperties);\n\t\t}\n\t}\n}\n\nfunction applySchemaArrayCoercion(value: unknown[], schema: JsonSchemaObject): void {\n\tif (Array.isArray(schema.items)) {\n\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\tconst itemSchema = schema.items[index];\n\t\t\tif (!itemSchema) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue[index] = coerceWithJsonSchema(value[index], itemSchema);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (schema.items && typeof schema.items === \"object\") {\n\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\tvalue[index] = coerceWithJsonSchema(value[index], schema.items);\n\t\t}\n\t}\n}\n\nfunction coerceWithUnionSchema(value: unknown, schemas: JsonSchemaObject[]): unknown {\n\tfor (const schema of schemas) {\n\t\tconst candidate = structuredClone(value);\n\t\tconst coerced = coerceWithJsonSchema(candidate, schema);\n\t\tconst validator = getSubSchemaValidator(schema);\n\t\tif (validator?.Check(coerced)) {\n\t\t\treturn coerced;\n\t\t}\n\t}\n\treturn value;\n}\n\nfunction coerceWithJsonSchema(value: unknown, schema: JsonSchemaObject): unknown {\n\tlet nextValue = value;\n\n\tif (Array.isArray(schema.allOf)) {\n\t\tfor (const nested of schema.allOf) {\n\t\t\tnextValue = coerceWithJsonSchema(nextValue, nested);\n\t\t}\n\t}\n\n\tif (Array.isArray(schema.anyOf)) {\n\t\tnextValue = coerceWithUnionSchema(nextValue, schema.anyOf);\n\t}\n\n\tif (Array.isArray(schema.oneOf)) {\n\t\tnextValue = coerceWithUnionSchema(nextValue, schema.oneOf);\n\t}\n\n\tconst schemaTypes = getSchemaTypes(schema);\n\tconst matchesUnionMember =\n\t\tschemaTypes.length > 1 && schemaTypes.some((schemaType) => matchesJsonType(nextValue, schemaType));\n\tif (schemaTypes.length > 0 && !matchesUnionMember) {\n\t\tfor (const schemaType of schemaTypes) {\n\t\t\tconst candidate = coercePrimitiveByType(nextValue, schemaType);\n\t\t\tif (candidate !== nextValue) {\n\t\t\t\tnextValue = candidate;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\tschemaTypes.includes(\"object\") &&\n\t\ttypeof nextValue === \"object\" &&\n\t\tnextValue !== null &&\n\t\t!Array.isArray(nextValue)\n\t) {\n\t\tapplySchemaObjectCoercion(nextValue as Record<string, unknown>, schema);\n\t}\n\n\tif (schemaTypes.includes(\"array\") && Array.isArray(nextValue)) {\n\t\tapplySchemaArrayCoercion(nextValue, schema);\n\t}\n\n\treturn nextValue;\n}\n\nfunction getValidator(schema: Tool[\"parameters\"]): ReturnType<typeof Compile> {\n\tconst key = schema as object;\n\tconst cached = validatorCache.get(key);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\tconst validator = Compile(schema);\n\tvalidatorCache.set(key, validator);\n\treturn validator;\n}\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\n/**\n * Finds a tool by name and validates the tool call arguments against its TypeBox schema\n * @param tools Array of tool definitions\n * @param toolCall The tool call from the LLM\n * @returns The validated arguments\n * @throws Error if tool is not found or validation fails\n */\nexport function validateToolCall(tools: Tool[], toolCall: ToolCall): any {\n\tconst tool = tools.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolCall.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolCall);\n}\n\n/**\n * Validates tool call arguments against the tool's TypeBox schema\n * @param tool The tool definition with TypeBox schema\n * @param toolCall The tool call from the LLM\n * @returns The validated (and potentially coerced) arguments\n * @throws Error with formatted message if validation fails\n */\nexport function validateToolArguments(tool: Tool, toolCall: ToolCall): any {\n\tconst args = structuredClone(toolCall.arguments);\n\tValue.Convert(tool.parameters, args);\n\n\tconst validator = getValidator(tool.parameters);\n\tif (!Object.getOwnPropertySymbols(tool.parameters).includes(TYPEBOX_KIND)) {\n\t\tconst coerced = coerceWithJsonSchema(args, tool.parameters as JsonSchemaObject);\n\t\tif (coerced !== args) {\n\t\t\tif (typeof args === \"object\" && args !== null && typeof coerced === \"object\" && coerced !== null) {\n\t\t\t\tfor (const key of Object.keys(args)) {\n\t\t\t\t\tdelete args[key];\n\t\t\t\t}\n\t\t\t\tObject.assign(args, coerced);\n\t\t\t} else {\n\t\t\t\treturn validator.Check(coerced) ? coerced : args;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (validator.Check(args)) {\n\t\treturn args;\n\t}\n\n\tconst errors =\n\t\tvalidator\n\t\t\t.Errors(args)\n\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t.join(\"\\n\") || \"Unknown validation error\";\n\n\tconst errorMessage = `Validation failed for tool \"${toolCall.name}\":\\n${errors}\\n\\nReceived arguments:\\n${JSON.stringify(toolCall.arguments, null, 2)}`;\n\n\tthrow new Error(errorMessage);\n}\n"]}
@@ -1,38 +1,222 @@
1
- import AjvModule from "ajv";
2
- import addFormatsModule from "ajv-formats";
3
- // Handle both default and named exports
4
- const Ajv = AjvModule.default || AjvModule;
5
- const addFormats = addFormatsModule.default || addFormatsModule;
6
- // Detect if we're in a browser extension environment with strict CSP
7
- // Chrome extensions with Manifest V3 don't allow eval/Function constructor
8
- const isBrowserExtension = typeof globalThis !== "undefined" && globalThis.chrome?.runtime?.id !== undefined;
9
- function canUseRuntimeCodegen() {
10
- if (isBrowserExtension) {
11
- return false;
1
+ import { Compile } from "typebox/compile";
2
+ import { Value } from "typebox/value";
3
+ const validatorCache = new WeakMap();
4
+ const TYPEBOX_KIND = Symbol.for("TypeBox.Kind");
5
+ function getSchemaTypes(schema) {
6
+ if (typeof schema.type === "string") {
7
+ return [schema.type];
12
8
  }
9
+ if (Array.isArray(schema.type)) {
10
+ return schema.type.filter((type) => typeof type === "string");
11
+ }
12
+ return [];
13
+ }
14
+ function matchesJsonType(value, type) {
15
+ switch (type) {
16
+ case "number":
17
+ return typeof value === "number";
18
+ case "integer":
19
+ return typeof value === "number" && Number.isInteger(value);
20
+ case "boolean":
21
+ return typeof value === "boolean";
22
+ case "string":
23
+ return typeof value === "string";
24
+ case "null":
25
+ return value === null;
26
+ case "array":
27
+ return Array.isArray(value);
28
+ case "object":
29
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30
+ default:
31
+ return false;
32
+ }
33
+ }
34
+ function getSubSchemaValidator(schema) {
13
35
  try {
14
- new Function("return true;");
15
- return true;
36
+ return getValidator(schema);
16
37
  }
17
38
  catch {
18
- return false;
39
+ return undefined;
19
40
  }
20
41
  }
21
- // Create a singleton AJV instance with formats only when runtime code generation is available.
22
- let ajv = null;
23
- if (canUseRuntimeCodegen()) {
24
- try {
25
- ajv = new Ajv({
26
- allErrors: true,
27
- strict: false,
28
- coerceTypes: true,
29
- });
30
- addFormats(ajv);
42
+ function coercePrimitiveByType(value, type) {
43
+ switch (type) {
44
+ case "number": {
45
+ if (value === null) {
46
+ return 0;
47
+ }
48
+ if (typeof value === "string" && value.trim() !== "") {
49
+ const parsed = Number(value);
50
+ if (Number.isFinite(parsed)) {
51
+ return parsed;
52
+ }
53
+ }
54
+ if (typeof value === "boolean") {
55
+ return value ? 1 : 0;
56
+ }
57
+ return value;
58
+ }
59
+ case "integer": {
60
+ if (value === null) {
61
+ return 0;
62
+ }
63
+ if (typeof value === "string" && value.trim() !== "") {
64
+ const parsed = Number(value);
65
+ if (Number.isInteger(parsed)) {
66
+ return parsed;
67
+ }
68
+ }
69
+ if (typeof value === "boolean") {
70
+ return value ? 1 : 0;
71
+ }
72
+ return value;
73
+ }
74
+ case "boolean": {
75
+ if (value === null) {
76
+ return false;
77
+ }
78
+ if (typeof value === "string") {
79
+ if (value === "true") {
80
+ return true;
81
+ }
82
+ if (value === "false") {
83
+ return false;
84
+ }
85
+ }
86
+ if (typeof value === "number") {
87
+ if (value === 1) {
88
+ return true;
89
+ }
90
+ if (value === 0) {
91
+ return false;
92
+ }
93
+ }
94
+ return value;
95
+ }
96
+ case "string": {
97
+ if (value === null) {
98
+ return "";
99
+ }
100
+ if (typeof value === "number" || typeof value === "boolean") {
101
+ return String(value);
102
+ }
103
+ return value;
104
+ }
105
+ case "null": {
106
+ if (value === "" || value === 0 || value === false) {
107
+ return null;
108
+ }
109
+ return value;
110
+ }
111
+ default:
112
+ return value;
113
+ }
114
+ }
115
+ function applySchemaObjectCoercion(value, schema) {
116
+ const properties = schema.properties;
117
+ const definedKeys = new Set(properties ? Object.keys(properties) : []);
118
+ if (properties) {
119
+ for (const [key, propertySchema] of Object.entries(properties)) {
120
+ if (!(key in value)) {
121
+ continue;
122
+ }
123
+ value[key] = coerceWithJsonSchema(value[key], propertySchema);
124
+ }
31
125
  }
32
- catch (_e) {
33
- console.warn("AJV validation disabled due to CSP restrictions");
126
+ if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
127
+ for (const [key, propertyValue] of Object.entries(value)) {
128
+ if (definedKeys.has(key)) {
129
+ continue;
130
+ }
131
+ value[key] = coerceWithJsonSchema(propertyValue, schema.additionalProperties);
132
+ }
34
133
  }
35
134
  }
135
+ function applySchemaArrayCoercion(value, schema) {
136
+ if (Array.isArray(schema.items)) {
137
+ for (let index = 0; index < value.length; index++) {
138
+ const itemSchema = schema.items[index];
139
+ if (!itemSchema) {
140
+ continue;
141
+ }
142
+ value[index] = coerceWithJsonSchema(value[index], itemSchema);
143
+ }
144
+ return;
145
+ }
146
+ if (schema.items && typeof schema.items === "object") {
147
+ for (let index = 0; index < value.length; index++) {
148
+ value[index] = coerceWithJsonSchema(value[index], schema.items);
149
+ }
150
+ }
151
+ }
152
+ function coerceWithUnionSchema(value, schemas) {
153
+ for (const schema of schemas) {
154
+ const candidate = structuredClone(value);
155
+ const coerced = coerceWithJsonSchema(candidate, schema);
156
+ const validator = getSubSchemaValidator(schema);
157
+ if (validator?.Check(coerced)) {
158
+ return coerced;
159
+ }
160
+ }
161
+ return value;
162
+ }
163
+ function coerceWithJsonSchema(value, schema) {
164
+ let nextValue = value;
165
+ if (Array.isArray(schema.allOf)) {
166
+ for (const nested of schema.allOf) {
167
+ nextValue = coerceWithJsonSchema(nextValue, nested);
168
+ }
169
+ }
170
+ if (Array.isArray(schema.anyOf)) {
171
+ nextValue = coerceWithUnionSchema(nextValue, schema.anyOf);
172
+ }
173
+ if (Array.isArray(schema.oneOf)) {
174
+ nextValue = coerceWithUnionSchema(nextValue, schema.oneOf);
175
+ }
176
+ const schemaTypes = getSchemaTypes(schema);
177
+ const matchesUnionMember = schemaTypes.length > 1 && schemaTypes.some((schemaType) => matchesJsonType(nextValue, schemaType));
178
+ if (schemaTypes.length > 0 && !matchesUnionMember) {
179
+ for (const schemaType of schemaTypes) {
180
+ const candidate = coercePrimitiveByType(nextValue, schemaType);
181
+ if (candidate !== nextValue) {
182
+ nextValue = candidate;
183
+ break;
184
+ }
185
+ }
186
+ }
187
+ if (schemaTypes.includes("object") &&
188
+ typeof nextValue === "object" &&
189
+ nextValue !== null &&
190
+ !Array.isArray(nextValue)) {
191
+ applySchemaObjectCoercion(nextValue, schema);
192
+ }
193
+ if (schemaTypes.includes("array") && Array.isArray(nextValue)) {
194
+ applySchemaArrayCoercion(nextValue, schema);
195
+ }
196
+ return nextValue;
197
+ }
198
+ function getValidator(schema) {
199
+ const key = schema;
200
+ const cached = validatorCache.get(key);
201
+ if (cached) {
202
+ return cached;
203
+ }
204
+ const validator = Compile(schema);
205
+ validatorCache.set(key, validator);
206
+ return validator;
207
+ }
208
+ function formatValidationPath(error) {
209
+ if (error.keyword === "required") {
210
+ const requiredProperties = error.params.requiredProperties;
211
+ const requiredProperty = requiredProperties?.[0];
212
+ if (requiredProperty) {
213
+ const basePath = error.instancePath.replace(/^\//, "").replace(/\//g, ".");
214
+ return basePath ? `${basePath}.${requiredProperty}` : requiredProperty;
215
+ }
216
+ }
217
+ const path = error.instancePath.replace(/^\//, "").replace(/\//g, ".");
218
+ return path || "root";
219
+ }
36
220
  /**
37
221
  * Finds a tool by name and validates the tool call arguments against its TypeBox schema
38
222
  * @param tools Array of tool definitions
@@ -55,24 +239,29 @@ export function validateToolCall(tools, toolCall) {
55
239
  * @throws Error with formatted message if validation fails
56
240
  */
57
241
  export function validateToolArguments(tool, toolCall) {
58
- // Skip validation in environments where runtime code generation is unavailable.
59
- if (!ajv || !canUseRuntimeCodegen()) {
60
- return toolCall.arguments;
61
- }
62
- // Compile the schema.
63
- const validate = ajv.compile(tool.parameters);
64
- // Clone arguments so AJV can safely mutate for type coercion
65
242
  const args = structuredClone(toolCall.arguments);
66
- // Validate the arguments (AJV mutates args in-place for type coercion)
67
- if (validate(args)) {
243
+ Value.Convert(tool.parameters, args);
244
+ const validator = getValidator(tool.parameters);
245
+ if (!Object.getOwnPropertySymbols(tool.parameters).includes(TYPEBOX_KIND)) {
246
+ const coerced = coerceWithJsonSchema(args, tool.parameters);
247
+ if (coerced !== args) {
248
+ if (typeof args === "object" && args !== null && typeof coerced === "object" && coerced !== null) {
249
+ for (const key of Object.keys(args)) {
250
+ delete args[key];
251
+ }
252
+ Object.assign(args, coerced);
253
+ }
254
+ else {
255
+ return validator.Check(coerced) ? coerced : args;
256
+ }
257
+ }
258
+ }
259
+ if (validator.Check(args)) {
68
260
  return args;
69
261
  }
70
- // Format validation errors nicely
71
- const errors = validate.errors
72
- ?.map((err) => {
73
- const path = err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || "root";
74
- return ` - ${path}: ${err.message}`;
75
- })
262
+ const errors = validator
263
+ .Errors(args)
264
+ .map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)
76
265
  .join("\n") || "Unknown validation error";
77
266
  const errorMessage = `Validation failed for tool "${toolCall.name}":\n${errors}\n\nReceived arguments:\n${JSON.stringify(toolCall.arguments, null, 2)}`;
78
267
  throw new Error(errorMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import AjvModule from \"ajv\";\nimport addFormatsModule from \"ajv-formats\";\n\n// Handle both default and named exports\nconst Ajv = (AjvModule as any).default || AjvModule;\nconst addFormats = (addFormatsModule as any).default || addFormatsModule;\n\nimport type { Tool, ToolCall } from \"../types.js\";\n\n// Detect if we're in a browser extension environment with strict CSP\n// Chrome extensions with Manifest V3 don't allow eval/Function constructor\nconst isBrowserExtension = typeof globalThis !== \"undefined\" && (globalThis as any).chrome?.runtime?.id !== undefined;\n\nfunction canUseRuntimeCodegen(): boolean {\n\tif (isBrowserExtension) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tnew Function(\"return true;\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n// Create a singleton AJV instance with formats only when runtime code generation is available.\nlet ajv: any = null;\nif (canUseRuntimeCodegen()) {\n\ttry {\n\t\tajv = new Ajv({\n\t\t\tallErrors: true,\n\t\t\tstrict: false,\n\t\t\tcoerceTypes: true,\n\t\t});\n\t\taddFormats(ajv);\n\t} catch (_e) {\n\t\tconsole.warn(\"AJV validation disabled due to CSP restrictions\");\n\t}\n}\n\n/**\n * Finds a tool by name and validates the tool call arguments against its TypeBox schema\n * @param tools Array of tool definitions\n * @param toolCall The tool call from the LLM\n * @returns The validated arguments\n * @throws Error if tool is not found or validation fails\n */\nexport function validateToolCall(tools: Tool[], toolCall: ToolCall): any {\n\tconst tool = tools.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolCall.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolCall);\n}\n\n/**\n * Validates tool call arguments against the tool's TypeBox schema\n * @param tool The tool definition with TypeBox schema\n * @param toolCall The tool call from the LLM\n * @returns The validated (and potentially coerced) arguments\n * @throws Error with formatted message if validation fails\n */\nexport function validateToolArguments(tool: Tool, toolCall: ToolCall): any {\n\t// Skip validation in environments where runtime code generation is unavailable.\n\tif (!ajv || !canUseRuntimeCodegen()) {\n\t\treturn toolCall.arguments;\n\t}\n\n\t// Compile the schema.\n\tconst validate = ajv.compile(tool.parameters);\n\n\t// Clone arguments so AJV can safely mutate for type coercion\n\tconst args = structuredClone(toolCall.arguments);\n\n\t// Validate the arguments (AJV mutates args in-place for type coercion)\n\tif (validate(args)) {\n\t\treturn args;\n\t}\n\n\t// Format validation errors nicely\n\tconst errors =\n\t\tvalidate.errors\n\t\t\t?.map((err: any) => {\n\t\t\t\tconst path = err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || \"root\";\n\t\t\t\treturn ` - ${path}: ${err.message}`;\n\t\t\t})\n\t\t\t.join(\"\\n\") || \"Unknown validation error\";\n\n\tconst errorMessage = `Validation failed for tool \"${toolCall.name}\":\\n${errors}\\n\\nReceived arguments:\\n${JSON.stringify(toolCall.arguments, null, 2)}`;\n\n\tthrow new Error(errorMessage);\n}\n"]}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { Value } from \"typebox/value\";\nimport type { Tool, ToolCall } from \"../types.ts\";\n\nconst validatorCache = new WeakMap<object, ReturnType<typeof Compile>>();\nconst TYPEBOX_KIND = Symbol.for(\"TypeBox.Kind\");\n\ninterface JsonSchemaObject {\n\ttype?: string | string[];\n\tproperties?: Record<string, JsonSchemaObject>;\n\titems?: JsonSchemaObject | JsonSchemaObject[];\n\tadditionalProperties?: boolean | JsonSchemaObject;\n\tallOf?: JsonSchemaObject[];\n\tanyOf?: JsonSchemaObject[];\n\toneOf?: JsonSchemaObject[];\n}\n\nfunction getSchemaTypes(schema: JsonSchemaObject): string[] {\n\tif (typeof schema.type === \"string\") {\n\t\treturn [schema.type];\n\t}\n\tif (Array.isArray(schema.type)) {\n\t\treturn schema.type.filter((type): type is string => typeof type === \"string\");\n\t}\n\treturn [];\n}\n\nfunction matchesJsonType(value: unknown, type: string): boolean {\n\tswitch (type) {\n\t\tcase \"number\":\n\t\t\treturn typeof value === \"number\";\n\t\tcase \"integer\":\n\t\t\treturn typeof value === \"number\" && Number.isInteger(value);\n\t\tcase \"boolean\":\n\t\t\treturn typeof value === \"boolean\";\n\t\tcase \"string\":\n\t\t\treturn typeof value === \"string\";\n\t\tcase \"null\":\n\t\t\treturn value === null;\n\t\tcase \"array\":\n\t\t\treturn Array.isArray(value);\n\t\tcase \"object\":\n\t\t\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction getSubSchemaValidator(schema: JsonSchemaObject): ReturnType<typeof Compile> | undefined {\n\ttry {\n\t\treturn getValidator(schema as Tool[\"parameters\"]);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction coercePrimitiveByType(value: unknown, type: string): unknown {\n\tswitch (type) {\n\t\tcase \"number\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (typeof value === \"string\" && value.trim() !== \"\") {\n\t\t\t\tconst parsed = Number(value);\n\t\t\t\tif (Number.isFinite(parsed)) {\n\t\t\t\t\treturn parsed;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\treturn value ? 1 : 0;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"integer\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (typeof value === \"string\" && value.trim() !== \"\") {\n\t\t\t\tconst parsed = Number(value);\n\t\t\t\tif (Number.isInteger(parsed)) {\n\t\t\t\t\treturn parsed;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"boolean\") {\n\t\t\t\treturn value ? 1 : 0;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"boolean\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tif (value === \"true\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (value === \"false\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (typeof value === \"number\") {\n\t\t\t\tif (value === 1) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"string\": {\n\t\t\tif (value === null) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tif (typeof value === \"number\" || typeof value === \"boolean\") {\n\t\t\t\treturn String(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tcase \"null\": {\n\t\t\tif (value === \"\" || value === 0 || value === false) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t\tdefault:\n\t\t\treturn value;\n\t}\n}\n\nfunction applySchemaObjectCoercion(value: Record<string, unknown>, schema: JsonSchemaObject): void {\n\tconst properties = schema.properties;\n\tconst definedKeys = new Set<string>(properties ? Object.keys(properties) : []);\n\n\tif (properties) {\n\t\tfor (const [key, propertySchema] of Object.entries(properties)) {\n\t\t\tif (!(key in value)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue[key] = coerceWithJsonSchema(value[key], propertySchema);\n\t\t}\n\t}\n\n\tif (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n\t\tfor (const [key, propertyValue] of Object.entries(value)) {\n\t\t\tif (definedKeys.has(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue[key] = coerceWithJsonSchema(propertyValue, schema.additionalProperties);\n\t\t}\n\t}\n}\n\nfunction applySchemaArrayCoercion(value: unknown[], schema: JsonSchemaObject): void {\n\tif (Array.isArray(schema.items)) {\n\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\tconst itemSchema = schema.items[index];\n\t\t\tif (!itemSchema) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue[index] = coerceWithJsonSchema(value[index], itemSchema);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (schema.items && typeof schema.items === \"object\") {\n\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\tvalue[index] = coerceWithJsonSchema(value[index], schema.items);\n\t\t}\n\t}\n}\n\nfunction coerceWithUnionSchema(value: unknown, schemas: JsonSchemaObject[]): unknown {\n\tfor (const schema of schemas) {\n\t\tconst candidate = structuredClone(value);\n\t\tconst coerced = coerceWithJsonSchema(candidate, schema);\n\t\tconst validator = getSubSchemaValidator(schema);\n\t\tif (validator?.Check(coerced)) {\n\t\t\treturn coerced;\n\t\t}\n\t}\n\treturn value;\n}\n\nfunction coerceWithJsonSchema(value: unknown, schema: JsonSchemaObject): unknown {\n\tlet nextValue = value;\n\n\tif (Array.isArray(schema.allOf)) {\n\t\tfor (const nested of schema.allOf) {\n\t\t\tnextValue = coerceWithJsonSchema(nextValue, nested);\n\t\t}\n\t}\n\n\tif (Array.isArray(schema.anyOf)) {\n\t\tnextValue = coerceWithUnionSchema(nextValue, schema.anyOf);\n\t}\n\n\tif (Array.isArray(schema.oneOf)) {\n\t\tnextValue = coerceWithUnionSchema(nextValue, schema.oneOf);\n\t}\n\n\tconst schemaTypes = getSchemaTypes(schema);\n\tconst matchesUnionMember =\n\t\tschemaTypes.length > 1 && schemaTypes.some((schemaType) => matchesJsonType(nextValue, schemaType));\n\tif (schemaTypes.length > 0 && !matchesUnionMember) {\n\t\tfor (const schemaType of schemaTypes) {\n\t\t\tconst candidate = coercePrimitiveByType(nextValue, schemaType);\n\t\t\tif (candidate !== nextValue) {\n\t\t\t\tnextValue = candidate;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\tschemaTypes.includes(\"object\") &&\n\t\ttypeof nextValue === \"object\" &&\n\t\tnextValue !== null &&\n\t\t!Array.isArray(nextValue)\n\t) {\n\t\tapplySchemaObjectCoercion(nextValue as Record<string, unknown>, schema);\n\t}\n\n\tif (schemaTypes.includes(\"array\") && Array.isArray(nextValue)) {\n\t\tapplySchemaArrayCoercion(nextValue, schema);\n\t}\n\n\treturn nextValue;\n}\n\nfunction getValidator(schema: Tool[\"parameters\"]): ReturnType<typeof Compile> {\n\tconst key = schema as object;\n\tconst cached = validatorCache.get(key);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\tconst validator = Compile(schema);\n\tvalidatorCache.set(key, validator);\n\treturn validator;\n}\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\n/**\n * Finds a tool by name and validates the tool call arguments against its TypeBox schema\n * @param tools Array of tool definitions\n * @param toolCall The tool call from the LLM\n * @returns The validated arguments\n * @throws Error if tool is not found or validation fails\n */\nexport function validateToolCall(tools: Tool[], toolCall: ToolCall): any {\n\tconst tool = tools.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolCall.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolCall);\n}\n\n/**\n * Validates tool call arguments against the tool's TypeBox schema\n * @param tool The tool definition with TypeBox schema\n * @param toolCall The tool call from the LLM\n * @returns The validated (and potentially coerced) arguments\n * @throws Error with formatted message if validation fails\n */\nexport function validateToolArguments(tool: Tool, toolCall: ToolCall): any {\n\tconst args = structuredClone(toolCall.arguments);\n\tValue.Convert(tool.parameters, args);\n\n\tconst validator = getValidator(tool.parameters);\n\tif (!Object.getOwnPropertySymbols(tool.parameters).includes(TYPEBOX_KIND)) {\n\t\tconst coerced = coerceWithJsonSchema(args, tool.parameters as JsonSchemaObject);\n\t\tif (coerced !== args) {\n\t\t\tif (typeof args === \"object\" && args !== null && typeof coerced === \"object\" && coerced !== null) {\n\t\t\t\tfor (const key of Object.keys(args)) {\n\t\t\t\t\tdelete args[key];\n\t\t\t\t}\n\t\t\t\tObject.assign(args, coerced);\n\t\t\t} else {\n\t\t\t\treturn validator.Check(coerced) ? coerced : args;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (validator.Check(args)) {\n\t\treturn args;\n\t}\n\n\tconst errors =\n\t\tvalidator\n\t\t\t.Errors(args)\n\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t.join(\"\\n\") || \"Unknown validation error\";\n\n\tconst errorMessage = `Validation failed for tool \"${toolCall.name}\":\\n${errors}\\n\\nReceived arguments:\\n${JSON.stringify(toolCall.arguments, null, 2)}`;\n\n\tthrow new Error(errorMessage);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@draht/ai",
3
- "version": "2026.5.12",
3
+ "version": "2026.7.7",
4
4
  "description": "Unified LLM API with automatic model discovery and provider configuration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -10,41 +10,17 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
12
  },
13
- "./anthropic": {
14
- "types": "./dist/providers/anthropic.d.ts",
15
- "import": "./dist/providers/anthropic.js"
13
+ "./compat": {
14
+ "types": "./dist/compat.d.ts",
15
+ "import": "./dist/compat.js"
16
16
  },
17
- "./azure-openai-responses": {
18
- "types": "./dist/providers/azure-openai-responses.d.ts",
19
- "import": "./dist/providers/azure-openai-responses.js"
17
+ "./providers/*": {
18
+ "types": "./dist/providers/*.d.ts",
19
+ "import": "./dist/providers/*.js"
20
20
  },
21
- "./google": {
22
- "types": "./dist/providers/google.d.ts",
23
- "import": "./dist/providers/google.js"
24
- },
25
- "./google-gemini-cli": {
26
- "types": "./dist/providers/google-gemini-cli.d.ts",
27
- "import": "./dist/providers/google-gemini-cli.js"
28
- },
29
- "./google-vertex": {
30
- "types": "./dist/providers/google-vertex.d.ts",
31
- "import": "./dist/providers/google-vertex.js"
32
- },
33
- "./mistral": {
34
- "types": "./dist/providers/mistral.d.ts",
35
- "import": "./dist/providers/mistral.js"
36
- },
37
- "./openai-codex-responses": {
38
- "types": "./dist/providers/openai-codex-responses.d.ts",
39
- "import": "./dist/providers/openai-codex-responses.js"
40
- },
41
- "./openai-completions": {
42
- "types": "./dist/providers/openai-completions.d.ts",
43
- "import": "./dist/providers/openai-completions.js"
44
- },
45
- "./openai-responses": {
46
- "types": "./dist/providers/openai-responses.d.ts",
47
- "import": "./dist/providers/openai-responses.js"
21
+ "./api/*": {
22
+ "types": "./dist/api/*.d.ts",
23
+ "import": "./dist/api/*.js"
48
24
  },
49
25
  "./oauth": {
50
26
  "types": "./dist/oauth.d.ts",
@@ -65,27 +41,31 @@
65
41
  "scripts": {
66
42
  "clean": "shx rm -rf dist",
67
43
  "generate-models": "npx tsx scripts/generate-models.ts",
68
- "build": "npm run generate-models && tsgo -p tsconfig.build.json",
44
+ "build": "npm run generate-models && npm run generate-image-models && tsgo -p tsconfig.build.json",
69
45
  "dev": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
70
46
  "dev:tsc": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
71
47
  "test": "vitest --run",
72
- "prepublishOnly": "npm run clean && npm run build"
48
+ "prepublishOnly": "npm run clean && npm run build",
49
+ "generate-image-models": "npx tsx scripts/generate-image-models.ts"
73
50
  },
74
51
  "dependencies": {
75
- "@anthropic-ai/sdk": "^0.73.0",
76
- "@aws-sdk/client-bedrock-runtime": "^3.983.0",
77
- "@smithy/node-http-handler": "^4.0.0",
52
+ "@anthropic-ai/sdk": "^0.91.1",
53
+ "@aws-sdk/client-bedrock-runtime": "^3.1030.0",
78
54
  "@google/genai": "^1.40.0",
79
- "@mistralai/mistralai": "1.10.0",
80
- "@sinclair/typebox": "^0.34.41",
81
- "ajv": "^8.17.1",
82
- "ajv-formats": "^3.0.1",
55
+ "@mistralai/mistralai": "^2.2.6",
56
+ "@opentelemetry/api": "^1.9.0",
83
57
  "chalk": "^5.6.2",
58
+ "http-proxy-agent": "7.0.2",
59
+ "https-proxy-agent": "7.0.6",
84
60
  "openai": "6.26.0",
85
61
  "partial-json": "^0.1.7",
86
62
  "proxy-agent": "^6.5.0",
87
63
  "undici": "^7.19.1",
88
- "zod-to-json-schema": "^3.24.6"
64
+ "zod-to-json-schema": "^3.24.6",
65
+ "proxy-from-env": "^1.1.0",
66
+ "typebox": "^1.1.24",
67
+ "@smithy/node-http-handler": "^4.4.12",
68
+ "@smithy/types": "^4.0.0"
89
69
  },
90
70
  "keywords": [
91
71
  "ai",