@sammorrowdrums/mcpi-ai 0.70.9 → 0.85.0-bootstrap.0

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 (795) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +845 -486
  3. package/dist/api/anthropic-messages.d.ts +71 -0
  4. package/dist/api/anthropic-messages.d.ts.map +1 -0
  5. package/dist/api/anthropic-messages.js +1060 -0
  6. package/dist/api/anthropic-messages.js.map +1 -0
  7. package/dist/api/anthropic-messages.lazy.d.ts +3 -0
  8. package/dist/api/anthropic-messages.lazy.d.ts.map +1 -0
  9. package/dist/api/anthropic-messages.lazy.js +3 -0
  10. package/dist/api/anthropic-messages.lazy.js.map +1 -0
  11. package/dist/api/azure-openai-responses.d.ts +15 -0
  12. package/dist/api/azure-openai-responses.d.ts.map +1 -0
  13. package/dist/api/azure-openai-responses.js +242 -0
  14. package/dist/api/azure-openai-responses.js.map +1 -0
  15. package/dist/api/azure-openai-responses.lazy.d.ts +3 -0
  16. package/dist/api/azure-openai-responses.lazy.d.ts.map +1 -0
  17. package/dist/api/azure-openai-responses.lazy.js +3 -0
  18. package/dist/api/azure-openai-responses.lazy.js.map +1 -0
  19. package/dist/api/bedrock-converse-stream.d.ts +38 -0
  20. package/dist/api/bedrock-converse-stream.d.ts.map +1 -0
  21. package/dist/api/bedrock-converse-stream.js +967 -0
  22. package/dist/api/bedrock-converse-stream.js.map +1 -0
  23. package/dist/api/bedrock-converse-stream.lazy.d.ts +9 -0
  24. package/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -0
  25. package/dist/api/bedrock-converse-stream.lazy.js +30 -0
  26. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -0
  27. package/dist/api/cloudflare-gateway-binding.d.ts +69 -0
  28. package/dist/api/cloudflare-gateway-binding.d.ts.map +1 -0
  29. package/dist/api/cloudflare-gateway-binding.js +159 -0
  30. package/dist/api/cloudflare-gateway-binding.js.map +1 -0
  31. package/dist/api/cloudflare.d.ts +9 -0
  32. package/dist/api/cloudflare.d.ts.map +1 -0
  33. package/dist/api/cloudflare.js +9 -0
  34. package/dist/api/cloudflare.js.map +1 -0
  35. package/dist/api/constrained-sampling.d.ts +20 -0
  36. package/dist/api/constrained-sampling.d.ts.map +1 -0
  37. package/dist/api/constrained-sampling.js +222 -0
  38. package/dist/api/constrained-sampling.js.map +1 -0
  39. package/dist/{providers → api}/github-copilot-headers.d.ts +1 -1
  40. package/dist/api/github-copilot-headers.d.ts.map +1 -0
  41. package/dist/api/github-copilot-headers.js.map +1 -0
  42. package/dist/api/google-generative-ai.d.ts +13 -0
  43. package/dist/api/google-generative-ai.d.ts.map +1 -0
  44. package/dist/api/google-generative-ai.js +417 -0
  45. package/dist/api/google-generative-ai.js.map +1 -0
  46. package/dist/api/google-generative-ai.lazy.d.ts +3 -0
  47. package/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  48. package/dist/api/google-generative-ai.lazy.js +3 -0
  49. package/dist/api/google-generative-ai.lazy.js.map +1 -0
  50. package/dist/{providers → api}/google-shared.d.ts +23 -7
  51. package/dist/api/google-shared.d.ts.map +1 -0
  52. package/dist/{providers → api}/google-shared.js +76 -30
  53. package/dist/api/google-shared.js.map +1 -0
  54. package/dist/api/google-vertex.d.ts +15 -0
  55. package/dist/api/google-vertex.d.ts.map +1 -0
  56. package/dist/api/google-vertex.js +466 -0
  57. package/dist/api/google-vertex.js.map +1 -0
  58. package/dist/api/google-vertex.lazy.d.ts +3 -0
  59. package/dist/api/google-vertex.lazy.d.ts.map +1 -0
  60. package/dist/api/google-vertex.lazy.js +3 -0
  61. package/dist/api/google-vertex.lazy.js.map +1 -0
  62. package/dist/api/lazy.d.ts +19 -0
  63. package/dist/api/lazy.d.ts.map +1 -0
  64. package/dist/api/lazy.js +70 -0
  65. package/dist/api/lazy.js.map +1 -0
  66. package/dist/api/mistral-conversations.d.ts +25 -0
  67. package/dist/api/mistral-conversations.d.ts.map +1 -0
  68. package/dist/api/mistral-conversations.js +736 -0
  69. package/dist/api/mistral-conversations.js.map +1 -0
  70. package/dist/api/mistral-conversations.lazy.d.ts +3 -0
  71. package/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  72. package/dist/api/mistral-conversations.lazy.js +3 -0
  73. package/dist/api/mistral-conversations.lazy.js.map +1 -0
  74. package/dist/api/openai-codex-responses.d.ts +31 -0
  75. package/dist/api/openai-codex-responses.d.ts.map +1 -0
  76. package/dist/api/openai-codex-responses.js +1294 -0
  77. package/dist/api/openai-codex-responses.js.map +1 -0
  78. package/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  79. package/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  80. package/dist/api/openai-codex-responses.lazy.js +3 -0
  81. package/dist/api/openai-codex-responses.lazy.js.map +1 -0
  82. package/dist/api/openai-completions.d.ts +22 -0
  83. package/dist/api/openai-completions.d.ts.map +1 -0
  84. package/dist/api/openai-completions.js +1279 -0
  85. package/dist/api/openai-completions.js.map +1 -0
  86. package/dist/api/openai-completions.lazy.d.ts +3 -0
  87. package/dist/api/openai-completions.lazy.d.ts.map +1 -0
  88. package/dist/api/openai-completions.lazy.js +3 -0
  89. package/dist/api/openai-completions.lazy.js.map +1 -0
  90. package/dist/api/openai-prompt-cache.d.ts +3 -0
  91. package/dist/api/openai-prompt-cache.d.ts.map +1 -0
  92. package/dist/api/openai-prompt-cache.js +10 -0
  93. package/dist/api/openai-prompt-cache.js.map +1 -0
  94. package/dist/{providers → api}/openai-responses-shared.d.ts +11 -3
  95. package/dist/api/openai-responses-shared.d.ts.map +1 -0
  96. package/dist/api/openai-responses-shared.js +686 -0
  97. package/dist/api/openai-responses-shared.js.map +1 -0
  98. package/dist/{providers → api}/openai-responses.d.ts +5 -4
  99. package/dist/api/openai-responses.d.ts.map +1 -0
  100. package/dist/api/openai-responses.js +283 -0
  101. package/dist/api/openai-responses.js.map +1 -0
  102. package/dist/api/openai-responses.lazy.d.ts +3 -0
  103. package/dist/api/openai-responses.lazy.d.ts.map +1 -0
  104. package/dist/api/openai-responses.lazy.js +3 -0
  105. package/dist/api/openai-responses.lazy.js.map +1 -0
  106. package/dist/api/openrouter-images.d.ts +3 -0
  107. package/dist/api/openrouter-images.d.ts.map +1 -0
  108. package/dist/api/openrouter-images.js +132 -0
  109. package/dist/api/openrouter-images.js.map +1 -0
  110. package/dist/api/openrouter-images.lazy.d.ts +3 -0
  111. package/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  112. package/dist/api/openrouter-images.lazy.js +4 -0
  113. package/dist/api/openrouter-images.lazy.js.map +1 -0
  114. package/dist/api/pi-messages.d.ts +97 -0
  115. package/dist/api/pi-messages.d.ts.map +1 -0
  116. package/dist/api/pi-messages.js +307 -0
  117. package/dist/api/pi-messages.js.map +1 -0
  118. package/dist/api/pi-messages.lazy.d.ts +3 -0
  119. package/dist/api/pi-messages.lazy.d.ts.map +1 -0
  120. package/dist/api/pi-messages.lazy.js +3 -0
  121. package/dist/api/pi-messages.lazy.js.map +1 -0
  122. package/dist/api/simple-options.d.ts +11 -0
  123. package/dist/api/simple-options.d.ts.map +1 -0
  124. package/dist/api/simple-options.js +59 -0
  125. package/dist/api/simple-options.js.map +1 -0
  126. package/dist/{providers → api}/transform-messages.d.ts +1 -1
  127. package/dist/api/transform-messages.d.ts.map +1 -0
  128. package/dist/{providers → api}/transform-messages.js +4 -1
  129. package/dist/api/transform-messages.js.map +1 -0
  130. package/dist/auth/context.d.ts +7 -0
  131. package/dist/auth/context.d.ts.map +1 -0
  132. package/dist/auth/context.js +42 -0
  133. package/dist/auth/context.js.map +1 -0
  134. package/dist/auth/credential-store.d.ts +17 -0
  135. package/dist/auth/credential-store.d.ts.map +1 -0
  136. package/dist/auth/credential-store.js +51 -0
  137. package/dist/auth/credential-store.js.map +1 -0
  138. package/dist/auth/helpers.d.ts +22 -0
  139. package/dist/auth/helpers.d.ts.map +1 -0
  140. package/dist/auth/helpers.js +53 -0
  141. package/dist/auth/helpers.js.map +1 -0
  142. package/dist/auth/oauth/anthropic.d.ts +9 -0
  143. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  144. package/dist/{utils → auth}/oauth/anthropic.js +66 -93
  145. package/dist/auth/oauth/anthropic.js.map +1 -0
  146. package/dist/auth/oauth/device-code.d.ts +23 -0
  147. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  148. package/dist/auth/oauth/device-code.js +69 -0
  149. package/dist/auth/oauth/device-code.js.map +1 -0
  150. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  151. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  152. package/dist/auth/oauth/github-copilot.js +328 -0
  153. package/dist/auth/oauth/github-copilot.js.map +1 -0
  154. package/dist/auth/oauth/kimi-coding.d.ts +10 -0
  155. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  156. package/dist/auth/oauth/kimi-coding.js +261 -0
  157. package/dist/auth/oauth/kimi-coding.js.map +1 -0
  158. package/dist/auth/oauth/load.d.ts +27 -0
  159. package/dist/auth/oauth/load.d.ts.map +1 -0
  160. package/dist/auth/oauth/load.js +59 -0
  161. package/dist/auth/oauth/load.js.map +1 -0
  162. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  163. package/dist/auth/oauth/oauth-page.js.map +1 -0
  164. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  165. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  166. package/dist/auth/oauth/openai-codex.js +450 -0
  167. package/dist/auth/oauth/openai-codex.js.map +1 -0
  168. package/dist/auth/oauth/openrouter.d.ts +15 -0
  169. package/dist/auth/oauth/openrouter.d.ts.map +1 -0
  170. package/dist/auth/oauth/openrouter.js +277 -0
  171. package/dist/auth/oauth/openrouter.js.map +1 -0
  172. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  173. package/dist/auth/oauth/pkce.js.map +1 -0
  174. package/dist/auth/oauth/radius.d.ts +17 -0
  175. package/dist/auth/oauth/radius.d.ts.map +1 -0
  176. package/dist/auth/oauth/radius.js +321 -0
  177. package/dist/auth/oauth/radius.js.map +1 -0
  178. package/dist/auth/oauth/xai.d.ts +6 -0
  179. package/dist/auth/oauth/xai.d.ts.map +1 -0
  180. package/dist/auth/oauth/xai.js +190 -0
  181. package/dist/auth/oauth/xai.js.map +1 -0
  182. package/dist/auth/resolve.d.ts +27 -0
  183. package/dist/auth/resolve.d.ts.map +1 -0
  184. package/dist/auth/resolve.js +132 -0
  185. package/dist/auth/resolve.js.map +1 -0
  186. package/dist/auth/types.d.ts +231 -0
  187. package/dist/auth/types.d.ts.map +1 -0
  188. package/dist/auth/types.js.map +1 -0
  189. package/dist/bedrock-provider.d.ts +2 -2
  190. package/dist/bedrock-provider.d.ts.map +1 -1
  191. package/dist/bedrock-provider.js +3 -3
  192. package/dist/bedrock-provider.js.map +1 -1
  193. package/dist/bun-oauth.d.ts +3 -0
  194. package/dist/bun-oauth.d.ts.map +1 -0
  195. package/dist/bun-oauth.js +21 -0
  196. package/dist/bun-oauth.js.map +1 -0
  197. package/dist/cli.d.ts.map +1 -1
  198. package/dist/cli.js +60 -63
  199. package/dist/cli.js.map +1 -1
  200. package/dist/compat/extension-oauth-types.d.ts +39 -0
  201. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  202. package/dist/compat/extension-oauth-types.js +2 -0
  203. package/dist/compat/extension-oauth-types.js.map +1 -0
  204. package/dist/compat.d.ts +67 -0
  205. package/dist/compat.d.ts.map +1 -0
  206. package/dist/compat.js +199 -0
  207. package/dist/compat.js.map +1 -0
  208. package/dist/env-api-keys.d.ts +8 -5
  209. package/dist/env-api-keys.d.ts.map +1 -1
  210. package/dist/env-api-keys.js +60 -22
  211. package/dist/env-api-keys.js.map +1 -1
  212. package/dist/image-models.d.ts +10 -0
  213. package/dist/image-models.d.ts.map +1 -0
  214. package/dist/image-models.generated.d.ts +740 -0
  215. package/dist/image-models.generated.d.ts.map +1 -0
  216. package/dist/image-models.generated.js +742 -0
  217. package/dist/image-models.generated.js.map +1 -0
  218. package/dist/image-models.js +23 -0
  219. package/dist/image-models.js.map +1 -0
  220. package/dist/images-api-registry.d.ts +14 -0
  221. package/dist/images-api-registry.d.ts.map +1 -0
  222. package/dist/images-api-registry.js +22 -0
  223. package/dist/images-api-registry.js.map +1 -0
  224. package/dist/images-models.d.ts +95 -0
  225. package/dist/images-models.d.ts.map +1 -0
  226. package/dist/images-models.js +143 -0
  227. package/dist/images-models.js.map +1 -0
  228. package/dist/images.d.ts +4 -0
  229. package/dist/images.d.ts.map +1 -0
  230. package/dist/images.js +14 -0
  231. package/dist/images.js.map +1 -0
  232. package/dist/index.d.ts +32 -23
  233. package/dist/index.d.ts.map +1 -1
  234. package/dist/index.js +12 -4
  235. package/dist/index.js.map +1 -1
  236. package/dist/legacy-api-aliases.d.ts +42 -0
  237. package/dist/legacy-api-aliases.d.ts.map +1 -0
  238. package/dist/legacy-api-aliases.js +49 -0
  239. package/dist/legacy-api-aliases.js.map +1 -0
  240. package/dist/model-catalog.d.ts +17 -0
  241. package/dist/model-catalog.d.ts.map +1 -0
  242. package/dist/model-catalog.js +4 -0
  243. package/dist/model-catalog.js.map +1 -0
  244. package/dist/models-store.d.ts +29 -0
  245. package/dist/models-store.d.ts.map +1 -0
  246. package/dist/models-store.js +17 -0
  247. package/dist/models-store.js.map +1 -0
  248. package/dist/models.d.ts +191 -15
  249. package/dist/models.d.ts.map +1 -1
  250. package/dist/models.generated.d.ts +78 -15427
  251. package/dist/models.generated.d.ts.map +1 -1
  252. package/dist/models.generated.js +78 -15235
  253. package/dist/models.generated.js.map +1 -1
  254. package/dist/models.js +565 -38
  255. package/dist/models.js.map +1 -1
  256. package/dist/oauth.d.ts +2 -1
  257. package/dist/oauth.d.ts.map +1 -1
  258. package/dist/oauth.js +1 -1
  259. package/dist/oauth.js.map +1 -1
  260. package/dist/providers/all.d.ts +28 -0
  261. package/dist/providers/all.d.ts.map +1 -0
  262. package/dist/providers/all.js +131 -0
  263. package/dist/providers/all.js.map +1 -0
  264. package/dist/providers/amazon-bedrock.d.ts +2 -37
  265. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  266. package/dist/providers/amazon-bedrock.js +81 -724
  267. package/dist/providers/amazon-bedrock.js.map +1 -1
  268. package/dist/providers/amazon-bedrock.models.d.ts +4 -0
  269. package/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  270. package/dist/providers/amazon-bedrock.models.js +6 -0
  271. package/dist/providers/amazon-bedrock.models.js.map +1 -0
  272. package/dist/providers/ant-ling.d.ts +3 -0
  273. package/dist/providers/ant-ling.d.ts.map +1 -0
  274. package/dist/providers/ant-ling.js +15 -0
  275. package/dist/providers/ant-ling.js.map +1 -0
  276. package/dist/providers/ant-ling.models.d.ts +4 -0
  277. package/dist/providers/ant-ling.models.d.ts.map +1 -0
  278. package/dist/providers/ant-ling.models.js +6 -0
  279. package/dist/providers/ant-ling.models.js.map +1 -0
  280. package/dist/providers/anthropic.d.ts +2 -53
  281. package/dist/providers/anthropic.d.ts.map +1 -1
  282. package/dist/providers/anthropic.js +48 -940
  283. package/dist/providers/anthropic.js.map +1 -1
  284. package/dist/providers/anthropic.models.d.ts +4 -0
  285. package/dist/providers/anthropic.models.d.ts.map +1 -0
  286. package/dist/providers/anthropic.models.js +6 -0
  287. package/dist/providers/anthropic.models.js.map +1 -0
  288. package/dist/providers/azure-openai-responses.d.ts +2 -14
  289. package/dist/providers/azure-openai-responses.d.ts.map +1 -1
  290. package/dist/providers/azure-openai-responses.js +11 -184
  291. package/dist/providers/azure-openai-responses.js.map +1 -1
  292. package/dist/providers/azure-openai-responses.models.d.ts +4 -0
  293. package/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  294. package/dist/providers/azure-openai-responses.models.js +6 -0
  295. package/dist/providers/azure-openai-responses.models.js.map +1 -0
  296. package/dist/providers/baseten.d.ts +3 -0
  297. package/dist/providers/baseten.d.ts.map +1 -0
  298. package/dist/providers/baseten.js +15 -0
  299. package/dist/providers/baseten.js.map +1 -0
  300. package/dist/providers/baseten.models.d.ts +4 -0
  301. package/dist/providers/baseten.models.d.ts.map +1 -0
  302. package/dist/providers/baseten.models.js +6 -0
  303. package/dist/providers/baseten.models.js.map +1 -0
  304. package/dist/providers/cerebras.d.ts +3 -0
  305. package/dist/providers/cerebras.d.ts.map +1 -0
  306. package/dist/providers/cerebras.js +15 -0
  307. package/dist/providers/cerebras.js.map +1 -0
  308. package/dist/providers/cerebras.models.d.ts +4 -0
  309. package/dist/providers/cerebras.models.d.ts.map +1 -0
  310. package/dist/providers/cerebras.models.js +6 -0
  311. package/dist/providers/cerebras.models.js.map +1 -0
  312. package/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  313. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  314. package/dist/providers/cloudflare-ai-gateway.js +21 -0
  315. package/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  316. package/dist/providers/cloudflare-ai-gateway.models.d.ts +4 -0
  317. package/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  318. package/dist/providers/cloudflare-ai-gateway.models.js +6 -0
  319. package/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  320. package/dist/providers/cloudflare-auth.d.ts +4 -0
  321. package/dist/providers/cloudflare-auth.d.ts.map +1 -0
  322. package/dist/providers/cloudflare-auth.js +86 -0
  323. package/dist/providers/cloudflare-auth.js.map +1 -0
  324. package/dist/providers/cloudflare-stream.d.ts +8 -0
  325. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  326. package/dist/providers/cloudflare-stream.js +21 -0
  327. package/dist/providers/cloudflare-stream.js.map +1 -0
  328. package/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  329. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  330. package/dist/providers/cloudflare-workers-ai.js +15 -0
  331. package/dist/providers/cloudflare-workers-ai.js.map +1 -0
  332. package/dist/providers/cloudflare-workers-ai.models.d.ts +4 -0
  333. package/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  334. package/dist/providers/cloudflare-workers-ai.models.js +6 -0
  335. package/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  336. package/dist/providers/data/.manifest.json +1 -0
  337. package/dist/providers/data/amazon-bedrock.json +1 -0
  338. package/dist/providers/data/ant-ling.json +1 -0
  339. package/dist/providers/data/anthropic.json +1 -0
  340. package/dist/providers/data/azure-openai-responses.json +1 -0
  341. package/dist/providers/data/baseten.json +1 -0
  342. package/dist/providers/data/cerebras.json +1 -0
  343. package/dist/providers/data/cloudflare-ai-gateway.json +1 -0
  344. package/dist/providers/data/cloudflare-workers-ai.json +1 -0
  345. package/dist/providers/data/deepseek.json +1 -0
  346. package/dist/providers/data/fireworks.json +1 -0
  347. package/dist/providers/data/github-copilot.json +1 -0
  348. package/dist/providers/data/google-vertex.json +1 -0
  349. package/dist/providers/data/google.json +1 -0
  350. package/dist/providers/data/groq.json +1 -0
  351. package/dist/providers/data/huggingface.json +1 -0
  352. package/dist/providers/data/kimi-coding.json +1 -0
  353. package/dist/providers/data/minimax-cn.json +1 -0
  354. package/dist/providers/data/minimax.json +1 -0
  355. package/dist/providers/data/mistral.json +1 -0
  356. package/dist/providers/data/moonshotai-cn.json +1 -0
  357. package/dist/providers/data/moonshotai.json +1 -0
  358. package/dist/providers/data/nvidia.json +1 -0
  359. package/dist/providers/data/openai-codex.json +1 -0
  360. package/dist/providers/data/openai.json +1 -0
  361. package/dist/providers/data/opencode-go.json +1 -0
  362. package/dist/providers/data/opencode.json +1 -0
  363. package/dist/providers/data/openrouter.json +1 -0
  364. package/dist/providers/data/qwen-token-plan-cn.json +1 -0
  365. package/dist/providers/data/qwen-token-plan-individual.json +1 -0
  366. package/dist/providers/data/qwen-token-plan.json +1 -0
  367. package/dist/providers/data/together.json +1 -0
  368. package/dist/providers/data/vercel-ai-gateway.json +1 -0
  369. package/dist/providers/data/xai.json +1 -0
  370. package/dist/providers/data/xiaomi-token-plan-ams.json +1 -0
  371. package/dist/providers/data/xiaomi-token-plan-cn.json +1 -0
  372. package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -0
  373. package/dist/providers/data/xiaomi.json +1 -0
  374. package/dist/providers/data/zai-coding-cn.json +1 -0
  375. package/dist/providers/data/zai.json +1 -0
  376. package/dist/providers/deepseek.d.ts +3 -0
  377. package/dist/providers/deepseek.d.ts.map +1 -0
  378. package/dist/providers/deepseek.js +15 -0
  379. package/dist/providers/deepseek.js.map +1 -0
  380. package/dist/providers/deepseek.models.d.ts +4 -0
  381. package/dist/providers/deepseek.models.d.ts.map +1 -0
  382. package/dist/providers/deepseek.models.js +6 -0
  383. package/dist/providers/deepseek.models.js.map +1 -0
  384. package/dist/providers/faux.d.ts +53 -7
  385. package/dist/providers/faux.d.ts.map +1 -1
  386. package/dist/providers/faux.js +131 -11
  387. package/dist/providers/faux.js.map +1 -1
  388. package/dist/providers/fireworks.d.ts +3 -0
  389. package/dist/providers/fireworks.d.ts.map +1 -0
  390. package/dist/providers/fireworks.js +19 -0
  391. package/dist/providers/fireworks.js.map +1 -0
  392. package/dist/providers/fireworks.models.d.ts +4 -0
  393. package/dist/providers/fireworks.models.d.ts.map +1 -0
  394. package/dist/providers/fireworks.models.js +6 -0
  395. package/dist/providers/fireworks.models.js.map +1 -0
  396. package/dist/providers/github-copilot.d.ts +3 -0
  397. package/dist/providers/github-copilot.d.ts.map +1 -0
  398. package/dist/providers/github-copilot.js +35 -0
  399. package/dist/providers/github-copilot.js.map +1 -0
  400. package/dist/providers/github-copilot.models.d.ts +4 -0
  401. package/dist/providers/github-copilot.models.d.ts.map +1 -0
  402. package/dist/providers/github-copilot.models.js +6 -0
  403. package/dist/providers/github-copilot.models.js.map +1 -0
  404. package/dist/providers/google-vertex.d.ts +2 -14
  405. package/dist/providers/google-vertex.d.ts.map +1 -1
  406. package/dist/providers/google-vertex.js +86 -433
  407. package/dist/providers/google-vertex.js.map +1 -1
  408. package/dist/providers/google-vertex.models.d.ts +4 -0
  409. package/dist/providers/google-vertex.models.d.ts.map +1 -0
  410. package/dist/providers/google-vertex.models.js +6 -0
  411. package/dist/providers/google-vertex.models.js.map +1 -0
  412. package/dist/providers/google.d.ts +2 -12
  413. package/dist/providers/google.d.ts.map +1 -1
  414. package/dist/providers/google.js +12 -396
  415. package/dist/providers/google.js.map +1 -1
  416. package/dist/providers/google.models.d.ts +4 -0
  417. package/dist/providers/google.models.d.ts.map +1 -0
  418. package/dist/providers/google.models.js +6 -0
  419. package/dist/providers/google.models.js.map +1 -0
  420. package/dist/providers/groq.d.ts +3 -0
  421. package/dist/providers/groq.d.ts.map +1 -0
  422. package/dist/providers/groq.js +15 -0
  423. package/dist/providers/groq.js.map +1 -0
  424. package/dist/providers/groq.models.d.ts +4 -0
  425. package/dist/providers/groq.models.d.ts.map +1 -0
  426. package/dist/providers/groq.models.js +6 -0
  427. package/dist/providers/groq.models.js.map +1 -0
  428. package/dist/providers/huggingface.d.ts +3 -0
  429. package/dist/providers/huggingface.d.ts.map +1 -0
  430. package/dist/providers/huggingface.js +15 -0
  431. package/dist/providers/huggingface.js.map +1 -0
  432. package/dist/providers/huggingface.models.d.ts +4 -0
  433. package/dist/providers/huggingface.models.d.ts.map +1 -0
  434. package/dist/providers/huggingface.models.js +6 -0
  435. package/dist/providers/huggingface.models.js.map +1 -0
  436. package/dist/providers/images/register-builtins.d.ts +4 -0
  437. package/dist/providers/images/register-builtins.d.ts.map +1 -0
  438. package/dist/providers/images/register-builtins.js +34 -0
  439. package/dist/providers/images/register-builtins.js.map +1 -0
  440. package/dist/providers/kimi-coding.d.ts +3 -0
  441. package/dist/providers/kimi-coding.d.ts.map +1 -0
  442. package/dist/providers/kimi-coding.js +24 -0
  443. package/dist/providers/kimi-coding.js.map +1 -0
  444. package/dist/providers/kimi-coding.models.d.ts +4 -0
  445. package/dist/providers/kimi-coding.models.d.ts.map +1 -0
  446. package/dist/providers/kimi-coding.models.js +6 -0
  447. package/dist/providers/kimi-coding.models.js.map +1 -0
  448. package/dist/providers/minimax-cn.d.ts +3 -0
  449. package/dist/providers/minimax-cn.d.ts.map +1 -0
  450. package/dist/providers/minimax-cn.js +15 -0
  451. package/dist/providers/minimax-cn.js.map +1 -0
  452. package/dist/providers/minimax-cn.models.d.ts +4 -0
  453. package/dist/providers/minimax-cn.models.d.ts.map +1 -0
  454. package/dist/providers/minimax-cn.models.js +6 -0
  455. package/dist/providers/minimax-cn.models.js.map +1 -0
  456. package/dist/providers/minimax.d.ts +3 -0
  457. package/dist/providers/minimax.d.ts.map +1 -0
  458. package/dist/providers/minimax.js +15 -0
  459. package/dist/providers/minimax.js.map +1 -0
  460. package/dist/providers/minimax.models.d.ts +4 -0
  461. package/dist/providers/minimax.models.d.ts.map +1 -0
  462. package/dist/providers/minimax.models.js +6 -0
  463. package/dist/providers/minimax.models.js.map +1 -0
  464. package/dist/providers/mistral.d.ts +2 -24
  465. package/dist/providers/mistral.d.ts.map +1 -1
  466. package/dist/providers/mistral.js +12 -531
  467. package/dist/providers/mistral.js.map +1 -1
  468. package/dist/providers/mistral.models.d.ts +4 -0
  469. package/dist/providers/mistral.models.d.ts.map +1 -0
  470. package/dist/providers/mistral.models.js +6 -0
  471. package/dist/providers/mistral.models.js.map +1 -0
  472. package/dist/providers/moonshotai-cn.d.ts +3 -0
  473. package/dist/providers/moonshotai-cn.d.ts.map +1 -0
  474. package/dist/providers/moonshotai-cn.js +15 -0
  475. package/dist/providers/moonshotai-cn.js.map +1 -0
  476. package/dist/providers/moonshotai-cn.models.d.ts +4 -0
  477. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  478. package/dist/providers/moonshotai-cn.models.js +6 -0
  479. package/dist/providers/moonshotai-cn.models.js.map +1 -0
  480. package/dist/providers/moonshotai.d.ts +3 -0
  481. package/dist/providers/moonshotai.d.ts.map +1 -0
  482. package/dist/providers/moonshotai.js +15 -0
  483. package/dist/providers/moonshotai.js.map +1 -0
  484. package/dist/providers/moonshotai.models.d.ts +4 -0
  485. package/dist/providers/moonshotai.models.d.ts.map +1 -0
  486. package/dist/providers/moonshotai.models.js +6 -0
  487. package/dist/providers/moonshotai.models.js.map +1 -0
  488. package/dist/providers/nvidia.d.ts +3 -0
  489. package/dist/providers/nvidia.d.ts.map +1 -0
  490. package/dist/providers/nvidia.js +15 -0
  491. package/dist/providers/nvidia.js.map +1 -0
  492. package/dist/providers/nvidia.models.d.ts +4 -0
  493. package/dist/providers/nvidia.models.d.ts.map +1 -0
  494. package/dist/providers/nvidia.models.js +6 -0
  495. package/dist/providers/nvidia.models.js.map +1 -0
  496. package/dist/providers/openai-codex.d.ts +3 -0
  497. package/dist/providers/openai-codex.d.ts.map +1 -0
  498. package/dist/providers/openai-codex.js +22 -0
  499. package/dist/providers/openai-codex.js.map +1 -0
  500. package/dist/providers/openai-codex.models.d.ts +4 -0
  501. package/dist/providers/openai-codex.models.d.ts.map +1 -0
  502. package/dist/providers/openai-codex.models.js +6 -0
  503. package/dist/providers/openai-codex.models.js.map +1 -0
  504. package/dist/providers/openai.d.ts +3 -0
  505. package/dist/providers/openai.d.ts.map +1 -0
  506. package/dist/providers/openai.js +15 -0
  507. package/dist/providers/openai.js.map +1 -0
  508. package/dist/providers/openai.models.d.ts +4 -0
  509. package/dist/providers/openai.models.d.ts.map +1 -0
  510. package/dist/providers/openai.models.js +6 -0
  511. package/dist/providers/openai.models.js.map +1 -0
  512. package/dist/providers/opencode-go.d.ts +3 -0
  513. package/dist/providers/opencode-go.d.ts.map +1 -0
  514. package/dist/providers/opencode-go.js +20 -0
  515. package/dist/providers/opencode-go.js.map +1 -0
  516. package/dist/providers/opencode-go.models.d.ts +4 -0
  517. package/dist/providers/opencode-go.models.d.ts.map +1 -0
  518. package/dist/providers/opencode-go.models.js +6 -0
  519. package/dist/providers/opencode-go.models.js.map +1 -0
  520. package/dist/providers/opencode.d.ts +3 -0
  521. package/dist/providers/opencode.d.ts.map +1 -0
  522. package/dist/providers/opencode.js +22 -0
  523. package/dist/providers/opencode.js.map +1 -0
  524. package/dist/providers/opencode.models.d.ts +4 -0
  525. package/dist/providers/opencode.models.d.ts.map +1 -0
  526. package/dist/providers/opencode.models.js +6 -0
  527. package/dist/providers/opencode.models.js.map +1 -0
  528. package/dist/providers/openrouter-images.d.ts +3 -0
  529. package/dist/providers/openrouter-images.d.ts.map +1 -0
  530. package/dist/providers/openrouter-images.js +22 -0
  531. package/dist/providers/openrouter-images.js.map +1 -0
  532. package/dist/providers/openrouter.d.ts +3 -0
  533. package/dist/providers/openrouter.d.ts.map +1 -0
  534. package/dist/providers/openrouter.js +23 -0
  535. package/dist/providers/openrouter.js.map +1 -0
  536. package/dist/providers/openrouter.models.d.ts +4 -0
  537. package/dist/providers/openrouter.models.d.ts.map +1 -0
  538. package/dist/providers/openrouter.models.js +6 -0
  539. package/dist/providers/openrouter.models.js.map +1 -0
  540. package/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  541. package/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  542. package/dist/providers/qwen-token-plan-cn.js +15 -0
  543. package/dist/providers/qwen-token-plan-cn.js.map +1 -0
  544. package/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  545. package/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  546. package/dist/providers/qwen-token-plan-cn.models.js +6 -0
  547. package/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  548. package/dist/providers/qwen-token-plan-individual.d.ts +3 -0
  549. package/dist/providers/qwen-token-plan-individual.d.ts.map +1 -0
  550. package/dist/providers/qwen-token-plan-individual.js +15 -0
  551. package/dist/providers/qwen-token-plan-individual.js.map +1 -0
  552. package/dist/providers/qwen-token-plan-individual.models.d.ts +4 -0
  553. package/dist/providers/qwen-token-plan-individual.models.d.ts.map +1 -0
  554. package/dist/providers/qwen-token-plan-individual.models.js +6 -0
  555. package/dist/providers/qwen-token-plan-individual.models.js.map +1 -0
  556. package/dist/providers/qwen-token-plan.d.ts +3 -0
  557. package/dist/providers/qwen-token-plan.d.ts.map +1 -0
  558. package/dist/providers/qwen-token-plan.js +15 -0
  559. package/dist/providers/qwen-token-plan.js.map +1 -0
  560. package/dist/providers/qwen-token-plan.models.d.ts +4 -0
  561. package/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  562. package/dist/providers/qwen-token-plan.models.js +6 -0
  563. package/dist/providers/qwen-token-plan.models.js.map +1 -0
  564. package/dist/providers/radius-config.d.ts +26 -0
  565. package/dist/providers/radius-config.d.ts.map +1 -0
  566. package/dist/providers/radius-config.js +63 -0
  567. package/dist/providers/radius-config.js.map +1 -0
  568. package/dist/providers/radius.d.ts +9 -0
  569. package/dist/providers/radius.d.ts.map +1 -0
  570. package/dist/providers/radius.js +64 -0
  571. package/dist/providers/radius.js.map +1 -0
  572. package/dist/providers/together.d.ts +3 -0
  573. package/dist/providers/together.d.ts.map +1 -0
  574. package/dist/providers/together.js +15 -0
  575. package/dist/providers/together.js.map +1 -0
  576. package/dist/providers/together.models.d.ts +4 -0
  577. package/dist/providers/together.models.d.ts.map +1 -0
  578. package/dist/providers/together.models.js +6 -0
  579. package/dist/providers/together.models.js.map +1 -0
  580. package/dist/providers/vercel-ai-gateway.d.ts +3 -0
  581. package/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  582. package/dist/providers/vercel-ai-gateway.js +15 -0
  583. package/dist/providers/vercel-ai-gateway.js.map +1 -0
  584. package/dist/providers/vercel-ai-gateway.models.d.ts +4 -0
  585. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  586. package/dist/providers/vercel-ai-gateway.models.js +6 -0
  587. package/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  588. package/dist/providers/xai.d.ts +3 -0
  589. package/dist/providers/xai.d.ts.map +1 -0
  590. package/dist/providers/xai.js +28 -0
  591. package/dist/providers/xai.js.map +1 -0
  592. package/dist/providers/xai.models.d.ts +4 -0
  593. package/dist/providers/xai.models.d.ts.map +1 -0
  594. package/dist/providers/xai.models.js +6 -0
  595. package/dist/providers/xai.models.js.map +1 -0
  596. package/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  597. package/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  598. package/dist/providers/xiaomi-token-plan-ams.js +15 -0
  599. package/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  600. package/dist/providers/xiaomi-token-plan-ams.models.d.ts +4 -0
  601. package/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  602. package/dist/providers/xiaomi-token-plan-ams.models.js +6 -0
  603. package/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  604. package/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  605. package/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  606. package/dist/providers/xiaomi-token-plan-cn.js +15 -0
  607. package/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  608. package/dist/providers/xiaomi-token-plan-cn.models.d.ts +4 -0
  609. package/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  610. package/dist/providers/xiaomi-token-plan-cn.models.js +6 -0
  611. package/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  612. package/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  613. package/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  614. package/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  615. package/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  616. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts +4 -0
  617. package/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  618. package/dist/providers/xiaomi-token-plan-sgp.models.js +6 -0
  619. package/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  620. package/dist/providers/xiaomi.d.ts +3 -0
  621. package/dist/providers/xiaomi.d.ts.map +1 -0
  622. package/dist/providers/xiaomi.js +15 -0
  623. package/dist/providers/xiaomi.js.map +1 -0
  624. package/dist/providers/xiaomi.models.d.ts +4 -0
  625. package/dist/providers/xiaomi.models.d.ts.map +1 -0
  626. package/dist/providers/xiaomi.models.js +6 -0
  627. package/dist/providers/xiaomi.models.js.map +1 -0
  628. package/dist/providers/zai-coding-cn.d.ts +3 -0
  629. package/dist/providers/zai-coding-cn.d.ts.map +1 -0
  630. package/dist/providers/zai-coding-cn.js +15 -0
  631. package/dist/providers/zai-coding-cn.js.map +1 -0
  632. package/dist/providers/zai-coding-cn.models.d.ts +4 -0
  633. package/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  634. package/dist/providers/zai-coding-cn.models.js +6 -0
  635. package/dist/providers/zai-coding-cn.models.js.map +1 -0
  636. package/dist/providers/zai.d.ts +3 -0
  637. package/dist/providers/zai.d.ts.map +1 -0
  638. package/dist/providers/zai.js +15 -0
  639. package/dist/providers/zai.js.map +1 -0
  640. package/dist/providers/zai.models.d.ts +4 -0
  641. package/dist/providers/zai.models.d.ts.map +1 -0
  642. package/dist/providers/zai.models.js +6 -0
  643. package/dist/providers/zai.models.js.map +1 -0
  644. package/dist/session-resources.d.ts +4 -0
  645. package/dist/session-resources.d.ts.map +1 -0
  646. package/dist/session-resources.js +22 -0
  647. package/dist/session-resources.js.map +1 -0
  648. package/dist/types.d.ts +361 -49
  649. package/dist/types.d.ts.map +1 -1
  650. package/dist/types.js.map +1 -1
  651. package/dist/utils/abort-signals.d.ts +6 -0
  652. package/dist/utils/abort-signals.d.ts.map +1 -0
  653. package/dist/utils/abort-signals.js +34 -0
  654. package/dist/utils/abort-signals.js.map +1 -0
  655. package/dist/utils/abort.d.ts +8 -0
  656. package/dist/utils/abort.d.ts.map +1 -0
  657. package/dist/utils/abort.js +49 -0
  658. package/dist/utils/abort.js.map +1 -0
  659. package/dist/utils/deferred-tools.d.ts +9 -0
  660. package/dist/utils/deferred-tools.d.ts.map +1 -0
  661. package/dist/utils/deferred-tools.js +36 -0
  662. package/dist/utils/deferred-tools.js.map +1 -0
  663. package/dist/utils/diagnostics.d.ts +19 -0
  664. package/dist/utils/diagnostics.d.ts.map +1 -0
  665. package/dist/utils/diagnostics.js +25 -0
  666. package/dist/utils/diagnostics.js.map +1 -0
  667. package/dist/utils/error-body.d.ts +25 -0
  668. package/dist/utils/error-body.d.ts.map +1 -0
  669. package/dist/utils/error-body.js +133 -0
  670. package/dist/utils/error-body.js.map +1 -0
  671. package/dist/utils/estimate.d.ts +17 -0
  672. package/dist/utils/estimate.d.ts.map +1 -0
  673. package/dist/utils/estimate.js +116 -0
  674. package/dist/utils/estimate.js.map +1 -0
  675. package/dist/utils/event-stream.d.ts +3 -3
  676. package/dist/utils/event-stream.d.ts.map +1 -1
  677. package/dist/utils/event-stream.js +2 -2
  678. package/dist/utils/event-stream.js.map +1 -1
  679. package/dist/utils/headers.d.ts +2 -0
  680. package/dist/utils/headers.d.ts.map +1 -1
  681. package/dist/utils/headers.js +10 -0
  682. package/dist/utils/headers.js.map +1 -1
  683. package/dist/utils/node-http-proxy.d.ts +4 -0
  684. package/dist/utils/node-http-proxy.d.ts.map +1 -0
  685. package/dist/utils/node-http-proxy.js +92 -0
  686. package/dist/utils/node-http-proxy.js.map +1 -0
  687. package/dist/utils/overflow.d.ts +19 -4
  688. package/dist/utils/overflow.d.ts.map +1 -1
  689. package/dist/utils/overflow.js +44 -4
  690. package/dist/utils/overflow.js.map +1 -1
  691. package/dist/utils/pi-user-agent.d.ts +2 -0
  692. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  693. package/dist/utils/pi-user-agent.js +12 -0
  694. package/dist/utils/pi-user-agent.js.map +1 -0
  695. package/dist/utils/provider-env.d.ts +7 -0
  696. package/dist/utils/provider-env.d.ts.map +1 -0
  697. package/dist/utils/provider-env.js +44 -0
  698. package/dist/utils/provider-env.js.map +1 -0
  699. package/dist/utils/provider-retry.d.ts +16 -0
  700. package/dist/utils/provider-retry.d.ts.map +1 -0
  701. package/dist/utils/provider-retry.js +94 -0
  702. package/dist/utils/provider-retry.js.map +1 -0
  703. package/dist/utils/retry.d.ts +53 -0
  704. package/dist/utils/retry.d.ts.map +1 -0
  705. package/dist/utils/retry.js +174 -0
  706. package/dist/utils/retry.js.map +1 -0
  707. package/dist/utils/text.d.ts +6 -0
  708. package/dist/utils/text.d.ts.map +1 -0
  709. package/dist/utils/text.js +10 -0
  710. package/dist/utils/text.js.map +1 -0
  711. package/dist/utils/uuid.d.ts +3 -0
  712. package/dist/utils/uuid.d.ts.map +1 -0
  713. package/dist/utils/uuid.js +46 -0
  714. package/dist/utils/uuid.js.map +1 -0
  715. package/dist/utils/validation.d.ts +1 -1
  716. package/dist/utils/validation.d.ts.map +1 -1
  717. package/dist/utils/validation.js +49 -21
  718. package/dist/utils/validation.js.map +1 -1
  719. package/package.json +52 -55
  720. package/dist/api-registry.d.ts +0 -20
  721. package/dist/api-registry.d.ts.map +0 -1
  722. package/dist/api-registry.js +0 -44
  723. package/dist/api-registry.js.map +0 -1
  724. package/dist/providers/github-copilot-headers.d.ts.map +0 -1
  725. package/dist/providers/github-copilot-headers.js.map +0 -1
  726. package/dist/providers/google-gemini-cli.d.ts +0 -74
  727. package/dist/providers/google-gemini-cli.d.ts.map +0 -1
  728. package/dist/providers/google-gemini-cli.js +0 -779
  729. package/dist/providers/google-gemini-cli.js.map +0 -1
  730. package/dist/providers/google-shared.d.ts.map +0 -1
  731. package/dist/providers/google-shared.js.map +0 -1
  732. package/dist/providers/openai-codex-responses.d.ts +0 -11
  733. package/dist/providers/openai-codex-responses.d.ts.map +0 -1
  734. package/dist/providers/openai-codex-responses.js +0 -779
  735. package/dist/providers/openai-codex-responses.js.map +0 -1
  736. package/dist/providers/openai-completions.d.ts +0 -19
  737. package/dist/providers/openai-completions.d.ts.map +0 -1
  738. package/dist/providers/openai-completions.js +0 -876
  739. package/dist/providers/openai-completions.js.map +0 -1
  740. package/dist/providers/openai-responses-shared.d.ts.map +0 -1
  741. package/dist/providers/openai-responses-shared.js +0 -483
  742. package/dist/providers/openai-responses-shared.js.map +0 -1
  743. package/dist/providers/openai-responses.d.ts.map +0 -1
  744. package/dist/providers/openai-responses.js +0 -208
  745. package/dist/providers/openai-responses.js.map +0 -1
  746. package/dist/providers/register-builtins.d.ts +0 -38
  747. package/dist/providers/register-builtins.d.ts.map +0 -1
  748. package/dist/providers/register-builtins.js +0 -261
  749. package/dist/providers/register-builtins.js.map +0 -1
  750. package/dist/providers/simple-options.d.ts +0 -8
  751. package/dist/providers/simple-options.d.ts.map +0 -1
  752. package/dist/providers/simple-options.js +0 -36
  753. package/dist/providers/simple-options.js.map +0 -1
  754. package/dist/providers/transform-messages.d.ts.map +0 -1
  755. package/dist/providers/transform-messages.js.map +0 -1
  756. package/dist/stream.d.ts +0 -8
  757. package/dist/stream.d.ts.map +0 -1
  758. package/dist/stream.js +0 -27
  759. package/dist/stream.js.map +0 -1
  760. package/dist/utils/oauth/anthropic.d.ts +0 -25
  761. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  762. package/dist/utils/oauth/anthropic.js.map +0 -1
  763. package/dist/utils/oauth/github-copilot.d.ts +0 -30
  764. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  765. package/dist/utils/oauth/github-copilot.js +0 -292
  766. package/dist/utils/oauth/github-copilot.js.map +0 -1
  767. package/dist/utils/oauth/google-antigravity.d.ts +0 -26
  768. package/dist/utils/oauth/google-antigravity.d.ts.map +0 -1
  769. package/dist/utils/oauth/google-antigravity.js +0 -377
  770. package/dist/utils/oauth/google-antigravity.js.map +0 -1
  771. package/dist/utils/oauth/google-gemini-cli.d.ts +0 -26
  772. package/dist/utils/oauth/google-gemini-cli.d.ts.map +0 -1
  773. package/dist/utils/oauth/google-gemini-cli.js +0 -482
  774. package/dist/utils/oauth/google-gemini-cli.js.map +0 -1
  775. package/dist/utils/oauth/index.d.ts +0 -61
  776. package/dist/utils/oauth/index.d.ts.map +0 -1
  777. package/dist/utils/oauth/index.js +0 -131
  778. package/dist/utils/oauth/index.js.map +0 -1
  779. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  780. package/dist/utils/oauth/oauth-page.js.map +0 -1
  781. package/dist/utils/oauth/openai-codex.d.ts +0 -34
  782. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  783. package/dist/utils/oauth/openai-codex.js +0 -374
  784. package/dist/utils/oauth/openai-codex.js.map +0 -1
  785. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  786. package/dist/utils/oauth/pkce.js.map +0 -1
  787. package/dist/utils/oauth/types.d.ts +0 -47
  788. package/dist/utils/oauth/types.d.ts.map +0 -1
  789. package/dist/utils/oauth/types.js.map +0 -1
  790. /package/dist/{providers → api}/github-copilot-headers.js +0 -0
  791. /package/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  792. /package/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  793. /package/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  794. /package/dist/{utils → auth}/oauth/pkce.js +0 -0
  795. /package/dist/{utils/oauth → auth}/types.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA2FpD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC9B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,KAChB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,mFAAmF;IACnF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnG;AA0BD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EACxC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,SAAS,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA4C3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAK5E","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\t\"exceeded request buffer limit while retrying upstream\",\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\"getaddrinfo\",\n\t\"ENOTFOUND\",\n\t\"EAI_AGAIN\",\n\t\"upstream.?connect\",\n\t\"reset before headers\",\n\t\"socket hang up\",\n\t\"socket connection was closed\",\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\"stream ended before a terminal response event\",\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\t// gRPC based providers (e.g. NVIDIA NIM)\n\t\"ResourceExhausted\",\n]);\n\n/**\n * Retry policy: bounded attempts with exponential backoff (`baseDelayMs * 2^(attempt-1)`).\n * Matches `settings.retry` (`enabled`, `maxRetries`, `baseDelayMs`) in coding-agent; kept\n * here so the classifier and the policy-driven retry loop live together and stay reusable\n * by the SDK and other callers.\n */\nexport interface RetryPolicy {\n\tenabled: boolean;\n\t/** Max retry attempts (0 = no retries). The initial call never counts as a retry. */\n\tmaxRetries: number;\n\t/** Base delay in ms. Per-attempt delay is `baseDelayMs * 2^(attempt-1)` before jitter. */\n\tbaseDelayMs: number;\n}\n\n/** Optional callbacks emitted by {@link retryAssistantCall} around each retry. */\nexport interface RetryCallbacks {\n\t/** Emitted before the backoff sleep of each retry attempt (1-indexed). */\n\tonRetryScheduled?: (\n\t\tattempt: number,\n\t\tmaxAttempts: number,\n\t\tdelayMs: number,\n\t\terrorMessage: string,\n\t) => void | Promise<void>;\n\t/** Emitted after the backoff sleep, immediately before the retried call starts. */\n\tonRetryAttemptStart?: () => void | Promise<void>;\n\t/** Emitted once when the loop ends: success if a later call completed normally. */\n\tonRetryFinished?: (success: boolean, attempt: number, finalError?: string) => void | Promise<void>;\n}\n\nclass RetrySleepAbortError extends Error {\n\tconstructor() {\n\t\tsuper(\"Aborted\");\n\t}\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new RetrySleepAbortError());\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(resolve, ms);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\treject(new RetrySleepAbortError());\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n\n/**\n * Run a single assistant-producing call with bounded retry on transient errors.\n *\n * Behavior:\n * - A successful response is returned immediately. Aborts are terminal and never\n * retried, but reported as unsuccessful if they happen after a retry was scheduled.\n * Aborts during the backoff sleep are normalized to an aborted `AssistantMessage`\n * too, so callers do not need to care when cancellation happened.\n * - A non-retryable error (per {@link isRetryableAssistantError}, including quota/\n * billing exhaustion) is returned immediately so deterministic errors fail fast.\n * - Otherwise retries up to `maxRetries` times with exponential backoff, emitting\n * `onRetryScheduled` before each sleep, `onRetryAttemptStart` after each sleep before\n * the retried call starts, and `onRetryFinished` once at the end (whether the loop\n * ends in success, exhausted retries, or an aborted backoff).\n *\n * When `policy` is undefined or disabled, the first response is returned unchanged\n * (equivalent to calling `produce()` directly).\n */\nexport async function retryAssistantCall(\n\tproduce: () => Promise<AssistantMessage>,\n\tpolicy: RetryPolicy | undefined,\n\tsignal: AbortSignal | undefined,\n\tcallbacks?: RetryCallbacks,\n): Promise<AssistantMessage> {\n\tconst maxAttempts = policy?.enabled ? policy.maxRetries : 0;\n\n\tlet attempt = 0;\n\tlet lastRetry: { attempt: number; errorMessage: string } | undefined;\n\tfor (;;) {\n\t\tconst response = await produce();\n\n\t\t// Abort: terminal but not successful. Never retry an aborted message.\n\t\tif (response.stopReason === \"aborted\") {\n\t\t\tif (lastRetry) await callbacks?.onRetryFinished?.(false, lastRetry.attempt);\n\t\t\treturn response;\n\t\t}\n\n\t\t// Success: non-error, non-abort responses return as-is.\n\t\tif (response.stopReason !== \"error\") {\n\t\t\tif (lastRetry) await callbacks?.onRetryFinished?.(true, lastRetry.attempt);\n\t\t\treturn response;\n\t\t}\n\n\t\t// Non-retryable, or budget exhausted: return the final error message.\n\t\tif (attempt >= maxAttempts || !isRetryableAssistantError(response)) {\n\t\t\tif (lastRetry) await callbacks?.onRetryFinished?.(false, lastRetry.attempt, response.errorMessage);\n\t\t\treturn response;\n\t\t}\n\n\t\tattempt++;\n\t\tlastRetry = { attempt, errorMessage: response.errorMessage || \"Unknown error\" };\n\t\tconst delayMs = policy!.baseDelayMs * 2 ** (attempt - 1);\n\t\tawait callbacks?.onRetryScheduled?.(attempt, maxAttempts, delayMs, lastRetry.errorMessage);\n\n\t\t// Normalize aborts during retry backoff to the same AssistantMessage shape as\n\t\t// provider stream aborts, so callers do not need to care when cancellation happened.\n\t\ttry {\n\t\t\tawait sleep(delayMs, signal);\n\t\t} catch (error) {\n\t\t\tawait callbacks?.onRetryFinished?.(false, attempt, lastRetry.errorMessage);\n\t\t\tif (error instanceof RetrySleepAbortError) {\n\t\t\t\treturn { ...response, stopReason: \"aborted\", errorMessage: undefined };\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tawait callbacks?.onRetryAttemptStart?.();\n\t}\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"]}
@@ -0,0 +1,174 @@
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
+ "exceeded request buffer limit while retrying upstream",
38
+ // Network, proxy, and fetch transport failures. This includes OpenAI Codex
39
+ // raw-fetch failures such as "upstream connect", "connection refused", and
40
+ // "reset before headers" (#733), plus OpenRouter connection drops (#3317).
41
+ "network.?error",
42
+ "connection.?error",
43
+ "connection.?refused",
44
+ "connection.?lost",
45
+ "other side closed",
46
+ "fetch failed",
47
+ "getaddrinfo",
48
+ "ENOTFOUND",
49
+ "EAI_AGAIN",
50
+ "upstream.?connect",
51
+ "reset before headers",
52
+ "socket hang up",
53
+ "socket connection was closed",
54
+ "timed? out",
55
+ "timeout",
56
+ "terminated",
57
+ // WebSocket transports can report close/error text instead of HTTP/fetch text.
58
+ "websocket.?closed",
59
+ "websocket.?error",
60
+ // Premature stream endings from SDKs and transports. Anthropic can throw
61
+ // "stream ended without ..." and "Anthropic stream ended before message_stop"
62
+ // (#4433); Bedrock/Smithy can throw an HTTP/2 no-response error (#3594).
63
+ "ended without",
64
+ "stream ended before message_stop",
65
+ "stream ended before a terminal response event",
66
+ "http2 request did not get a response",
67
+ // Provider-requested retry delay cap failures should flow through the outer
68
+ // retry policy so callers can surface/abort the backoff (#1123).
69
+ "retry delay",
70
+ // Explicit retry guidance emitted mid-stream by OpenAI Responses and Bedrock
71
+ // stream exceptions (#6019).
72
+ "you can retry your request",
73
+ "try your request again",
74
+ "please retry your request",
75
+ // gRPC based providers (e.g. NVIDIA NIM)
76
+ "ResourceExhausted",
77
+ ]);
78
+ class RetrySleepAbortError extends Error {
79
+ constructor() {
80
+ super("Aborted");
81
+ }
82
+ }
83
+ function sleep(ms, signal) {
84
+ return new Promise((resolve, reject) => {
85
+ if (signal?.aborted) {
86
+ reject(new RetrySleepAbortError());
87
+ return;
88
+ }
89
+ const timeout = setTimeout(resolve, ms);
90
+ signal?.addEventListener("abort", () => {
91
+ clearTimeout(timeout);
92
+ reject(new RetrySleepAbortError());
93
+ }, { once: true });
94
+ });
95
+ }
96
+ /**
97
+ * Run a single assistant-producing call with bounded retry on transient errors.
98
+ *
99
+ * Behavior:
100
+ * - A successful response is returned immediately. Aborts are terminal and never
101
+ * retried, but reported as unsuccessful if they happen after a retry was scheduled.
102
+ * Aborts during the backoff sleep are normalized to an aborted `AssistantMessage`
103
+ * too, so callers do not need to care when cancellation happened.
104
+ * - A non-retryable error (per {@link isRetryableAssistantError}, including quota/
105
+ * billing exhaustion) is returned immediately so deterministic errors fail fast.
106
+ * - Otherwise retries up to `maxRetries` times with exponential backoff, emitting
107
+ * `onRetryScheduled` before each sleep, `onRetryAttemptStart` after each sleep before
108
+ * the retried call starts, and `onRetryFinished` once at the end (whether the loop
109
+ * ends in success, exhausted retries, or an aborted backoff).
110
+ *
111
+ * When `policy` is undefined or disabled, the first response is returned unchanged
112
+ * (equivalent to calling `produce()` directly).
113
+ */
114
+ export async function retryAssistantCall(produce, policy, signal, callbacks) {
115
+ const maxAttempts = policy?.enabled ? policy.maxRetries : 0;
116
+ let attempt = 0;
117
+ let lastRetry;
118
+ for (;;) {
119
+ const response = await produce();
120
+ // Abort: terminal but not successful. Never retry an aborted message.
121
+ if (response.stopReason === "aborted") {
122
+ if (lastRetry)
123
+ await callbacks?.onRetryFinished?.(false, lastRetry.attempt);
124
+ return response;
125
+ }
126
+ // Success: non-error, non-abort responses return as-is.
127
+ if (response.stopReason !== "error") {
128
+ if (lastRetry)
129
+ await callbacks?.onRetryFinished?.(true, lastRetry.attempt);
130
+ return response;
131
+ }
132
+ // Non-retryable, or budget exhausted: return the final error message.
133
+ if (attempt >= maxAttempts || !isRetryableAssistantError(response)) {
134
+ if (lastRetry)
135
+ await callbacks?.onRetryFinished?.(false, lastRetry.attempt, response.errorMessage);
136
+ return response;
137
+ }
138
+ attempt++;
139
+ lastRetry = { attempt, errorMessage: response.errorMessage || "Unknown error" };
140
+ const delayMs = policy.baseDelayMs * 2 ** (attempt - 1);
141
+ await callbacks?.onRetryScheduled?.(attempt, maxAttempts, delayMs, lastRetry.errorMessage);
142
+ // Normalize aborts during retry backoff to the same AssistantMessage shape as
143
+ // provider stream aborts, so callers do not need to care when cancellation happened.
144
+ try {
145
+ await sleep(delayMs, signal);
146
+ }
147
+ catch (error) {
148
+ await callbacks?.onRetryFinished?.(false, attempt, lastRetry.errorMessage);
149
+ if (error instanceof RetrySleepAbortError) {
150
+ return { ...response, stopReason: "aborted", errorMessage: undefined };
151
+ }
152
+ throw error;
153
+ }
154
+ await callbacks?.onRetryAttemptStart?.();
155
+ }
156
+ }
157
+ /**
158
+ * Classifies whether a failed assistant message looks like a transient provider
159
+ * or transport error, so callers can decide if the last assistant turn should be
160
+ * restarted.
161
+ *
162
+ * This does not implement retry policy. Callers should first handle context
163
+ * overflow separately, then apply their own retry budget, backoff, and reporting
164
+ * before restarting the assistant turn.
165
+ */
166
+ export function isRetryableAssistantError(message) {
167
+ if (message.stopReason !== "error" || !message.errorMessage)
168
+ return false;
169
+ const errorMessage = message.errorMessage;
170
+ if (NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN.test(errorMessage))
171
+ return false;
172
+ return RETRYABLE_PROVIDER_ERROR_PATTERN.test(errorMessage);
173
+ }
174
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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","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\t\"exceeded request buffer limit while retrying upstream\",\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\"getaddrinfo\",\n\t\"ENOTFOUND\",\n\t\"EAI_AGAIN\",\n\t\"upstream.?connect\",\n\t\"reset before headers\",\n\t\"socket hang up\",\n\t\"socket connection was closed\",\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\"stream ended before a terminal response event\",\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\t// gRPC based providers (e.g. NVIDIA NIM)\n\t\"ResourceExhausted\",\n]);\n\n/**\n * Retry policy: bounded attempts with exponential backoff (`baseDelayMs * 2^(attempt-1)`).\n * Matches `settings.retry` (`enabled`, `maxRetries`, `baseDelayMs`) in coding-agent; kept\n * here so the classifier and the policy-driven retry loop live together and stay reusable\n * by the SDK and other callers.\n */\nexport interface RetryPolicy {\n\tenabled: boolean;\n\t/** Max retry attempts (0 = no retries). The initial call never counts as a retry. */\n\tmaxRetries: number;\n\t/** Base delay in ms. Per-attempt delay is `baseDelayMs * 2^(attempt-1)` before jitter. */\n\tbaseDelayMs: number;\n}\n\n/** Optional callbacks emitted by {@link retryAssistantCall} around each retry. */\nexport interface RetryCallbacks {\n\t/** Emitted before the backoff sleep of each retry attempt (1-indexed). */\n\tonRetryScheduled?: (\n\t\tattempt: number,\n\t\tmaxAttempts: number,\n\t\tdelayMs: number,\n\t\terrorMessage: string,\n\t) => void | Promise<void>;\n\t/** Emitted after the backoff sleep, immediately before the retried call starts. */\n\tonRetryAttemptStart?: () => void | Promise<void>;\n\t/** Emitted once when the loop ends: success if a later call completed normally. */\n\tonRetryFinished?: (success: boolean, attempt: number, finalError?: string) => void | Promise<void>;\n}\n\nclass RetrySleepAbortError extends Error {\n\tconstructor() {\n\t\tsuper(\"Aborted\");\n\t}\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new RetrySleepAbortError());\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(resolve, ms);\n\t\tsignal?.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\treject(new RetrySleepAbortError());\n\t\t\t},\n\t\t\t{ once: true },\n\t\t);\n\t});\n}\n\n/**\n * Run a single assistant-producing call with bounded retry on transient errors.\n *\n * Behavior:\n * - A successful response is returned immediately. Aborts are terminal and never\n * retried, but reported as unsuccessful if they happen after a retry was scheduled.\n * Aborts during the backoff sleep are normalized to an aborted `AssistantMessage`\n * too, so callers do not need to care when cancellation happened.\n * - A non-retryable error (per {@link isRetryableAssistantError}, including quota/\n * billing exhaustion) is returned immediately so deterministic errors fail fast.\n * - Otherwise retries up to `maxRetries` times with exponential backoff, emitting\n * `onRetryScheduled` before each sleep, `onRetryAttemptStart` after each sleep before\n * the retried call starts, and `onRetryFinished` once at the end (whether the loop\n * ends in success, exhausted retries, or an aborted backoff).\n *\n * When `policy` is undefined or disabled, the first response is returned unchanged\n * (equivalent to calling `produce()` directly).\n */\nexport async function retryAssistantCall(\n\tproduce: () => Promise<AssistantMessage>,\n\tpolicy: RetryPolicy | undefined,\n\tsignal: AbortSignal | undefined,\n\tcallbacks?: RetryCallbacks,\n): Promise<AssistantMessage> {\n\tconst maxAttempts = policy?.enabled ? policy.maxRetries : 0;\n\n\tlet attempt = 0;\n\tlet lastRetry: { attempt: number; errorMessage: string } | undefined;\n\tfor (;;) {\n\t\tconst response = await produce();\n\n\t\t// Abort: terminal but not successful. Never retry an aborted message.\n\t\tif (response.stopReason === \"aborted\") {\n\t\t\tif (lastRetry) await callbacks?.onRetryFinished?.(false, lastRetry.attempt);\n\t\t\treturn response;\n\t\t}\n\n\t\t// Success: non-error, non-abort responses return as-is.\n\t\tif (response.stopReason !== \"error\") {\n\t\t\tif (lastRetry) await callbacks?.onRetryFinished?.(true, lastRetry.attempt);\n\t\t\treturn response;\n\t\t}\n\n\t\t// Non-retryable, or budget exhausted: return the final error message.\n\t\tif (attempt >= maxAttempts || !isRetryableAssistantError(response)) {\n\t\t\tif (lastRetry) await callbacks?.onRetryFinished?.(false, lastRetry.attempt, response.errorMessage);\n\t\t\treturn response;\n\t\t}\n\n\t\tattempt++;\n\t\tlastRetry = { attempt, errorMessage: response.errorMessage || \"Unknown error\" };\n\t\tconst delayMs = policy!.baseDelayMs * 2 ** (attempt - 1);\n\t\tawait callbacks?.onRetryScheduled?.(attempt, maxAttempts, delayMs, lastRetry.errorMessage);\n\n\t\t// Normalize aborts during retry backoff to the same AssistantMessage shape as\n\t\t// provider stream aborts, so callers do not need to care when cancellation happened.\n\t\ttry {\n\t\t\tawait sleep(delayMs, signal);\n\t\t} catch (error) {\n\t\t\tawait callbacks?.onRetryFinished?.(false, attempt, lastRetry.errorMessage);\n\t\t\tif (error instanceof RetrySleepAbortError) {\n\t\t\t\treturn { ...response, stopReason: \"aborted\", errorMessage: undefined };\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tawait callbacks?.onRetryAttemptStart?.();\n\t}\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"]}
@@ -0,0 +1,6 @@
1
+ import type { ImageContent, TextContent, ThinkingContent, ToolCall } from "../types.ts";
2
+ type Content = TextContent | ImageContent | ThinkingContent | ToolCall;
3
+ /** Extract and join text from message content. */
4
+ export declare function contentText(content: string | readonly Content[], separator?: string): string;
5
+ export {};
6
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExF,KAAK,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEvE,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,EAAE,SAAS,SAAO,GAAG,MAAM,CAM1F","sourcesContent":["import type { ImageContent, TextContent, ThinkingContent, ToolCall } from \"../types.ts\";\n\ntype Content = TextContent | ImageContent | ThinkingContent | ToolCall;\n\n/** Extract and join text from message content. */\nexport function contentText(content: string | readonly Content[], separator = \"\\n\"): string {\n\tif (typeof content === \"string\") return content;\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(separator);\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /** Extract and join text from message content. */
2
+ export function contentText(content, separator = "\n") {
3
+ if (typeof content === "string")
4
+ return content;
5
+ return content
6
+ .filter((block) => block.type === "text")
7
+ .map((block) => block.text)
8
+ .join(separator);
9
+ }
10
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAIA,kDAAkD;AAClD,MAAM,UAAU,WAAW,CAAC,OAAoC,EAAE,SAAS,GAAG,IAAI,EAAU;IAC3F,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,SAAS,CAAC,CAAC;AAAA,CAClB","sourcesContent":["import type { ImageContent, TextContent, ThinkingContent, ToolCall } from \"../types.ts\";\n\ntype Content = TextContent | ImageContent | ThinkingContent | ToolCall;\n\n/** Extract and join text from message content. */\nexport function contentText(content: string | readonly Content[], separator = \"\\n\"): string {\n\tif (typeof content === \"string\") return content;\n\treturn content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(separator);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /** Generate a time-ordered UUIDv7. */
2
+ export declare function uuidv7(): string;
3
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/utils/uuid.ts"],"names":[],"mappings":"AAaA,sCAAsC;AACtC,wBAAgB,MAAM,IAAI,MAAM,CAiC/B","sourcesContent":["let lastTimestamp = -Infinity;\nlet sequence = 0;\n\nfunction fillRandomBytes(bytes: Uint8Array<ArrayBuffer>): void {\n\tif (globalThis.crypto?.getRandomValues) {\n\t\tglobalThis.crypto.getRandomValues(bytes);\n\t\treturn;\n\t}\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbytes[i] = Math.floor(Math.random() * 256);\n\t}\n}\n\n/** Generate a time-ordered UUIDv7. */\nexport function uuidv7(): string {\n\tconst random = new Uint8Array(16);\n\tfillRandomBytes(random);\n\tconst timestamp = Date.now();\n\n\tif (timestamp > lastTimestamp) {\n\t\tsequence = random[6] * 0x1000000 + random[7] * 0x10000 + random[8] * 0x100 + random[9];\n\t\tlastTimestamp = timestamp;\n\t} else {\n\t\tsequence = (sequence + 1) >>> 0;\n\t\tif (sequence === 0) lastTimestamp++;\n\t}\n\n\tconst bytes = new Uint8Array(16);\n\tbytes[0] = (lastTimestamp / 0x10000000000) & 0xff;\n\tbytes[1] = (lastTimestamp / 0x100000000) & 0xff;\n\tbytes[2] = (lastTimestamp / 0x1000000) & 0xff;\n\tbytes[3] = (lastTimestamp / 0x10000) & 0xff;\n\tbytes[4] = (lastTimestamp / 0x100) & 0xff;\n\tbytes[5] = lastTimestamp & 0xff;\n\tbytes[6] = 0x70 | ((sequence >>> 28) & 0x0f);\n\tbytes[7] = (sequence >>> 20) & 0xff;\n\tbytes[8] = 0x80 | ((sequence >>> 14) & 0x3f);\n\tbytes[9] = (sequence >>> 6) & 0xff;\n\tbytes[10] = ((sequence & 0x3f) << 2) | (random[10] & 0x03);\n\tbytes[11] = random[11];\n\tbytes[12] = random[12];\n\tbytes[13] = random[13];\n\tbytes[14] = random[14];\n\tbytes[15] = random[15];\n\n\tconst hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\"));\n\treturn `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n"]}
@@ -0,0 +1,46 @@
1
+ let lastTimestamp = -Infinity;
2
+ let sequence = 0;
3
+ function fillRandomBytes(bytes) {
4
+ if (globalThis.crypto?.getRandomValues) {
5
+ globalThis.crypto.getRandomValues(bytes);
6
+ return;
7
+ }
8
+ for (let i = 0; i < bytes.length; i++) {
9
+ bytes[i] = Math.floor(Math.random() * 256);
10
+ }
11
+ }
12
+ /** Generate a time-ordered UUIDv7. */
13
+ export function uuidv7() {
14
+ const random = new Uint8Array(16);
15
+ fillRandomBytes(random);
16
+ const timestamp = Date.now();
17
+ if (timestamp > lastTimestamp) {
18
+ sequence = random[6] * 0x1000000 + random[7] * 0x10000 + random[8] * 0x100 + random[9];
19
+ lastTimestamp = timestamp;
20
+ }
21
+ else {
22
+ sequence = (sequence + 1) >>> 0;
23
+ if (sequence === 0)
24
+ lastTimestamp++;
25
+ }
26
+ const bytes = new Uint8Array(16);
27
+ bytes[0] = (lastTimestamp / 0x10000000000) & 0xff;
28
+ bytes[1] = (lastTimestamp / 0x100000000) & 0xff;
29
+ bytes[2] = (lastTimestamp / 0x1000000) & 0xff;
30
+ bytes[3] = (lastTimestamp / 0x10000) & 0xff;
31
+ bytes[4] = (lastTimestamp / 0x100) & 0xff;
32
+ bytes[5] = lastTimestamp & 0xff;
33
+ bytes[6] = 0x70 | ((sequence >>> 28) & 0x0f);
34
+ bytes[7] = (sequence >>> 20) & 0xff;
35
+ bytes[8] = 0x80 | ((sequence >>> 14) & 0x3f);
36
+ bytes[9] = (sequence >>> 6) & 0xff;
37
+ bytes[10] = ((sequence & 0x3f) << 2) | (random[10] & 0x03);
38
+ bytes[11] = random[11];
39
+ bytes[12] = random[12];
40
+ bytes[13] = random[13];
41
+ bytes[14] = random[14];
42
+ bytes[15] = random[15];
43
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0"));
44
+ return `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10, 16).join("")}`;
45
+ }
46
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../src/utils/uuid.ts"],"names":[],"mappings":"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","sourcesContent":["let lastTimestamp = -Infinity;\nlet sequence = 0;\n\nfunction fillRandomBytes(bytes: Uint8Array<ArrayBuffer>): void {\n\tif (globalThis.crypto?.getRandomValues) {\n\t\tglobalThis.crypto.getRandomValues(bytes);\n\t\treturn;\n\t}\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbytes[i] = Math.floor(Math.random() * 256);\n\t}\n}\n\n/** Generate a time-ordered UUIDv7. */\nexport function uuidv7(): string {\n\tconst random = new Uint8Array(16);\n\tfillRandomBytes(random);\n\tconst timestamp = Date.now();\n\n\tif (timestamp > lastTimestamp) {\n\t\tsequence = random[6] * 0x1000000 + random[7] * 0x10000 + random[8] * 0x100 + random[9];\n\t\tlastTimestamp = timestamp;\n\t} else {\n\t\tsequence = (sequence + 1) >>> 0;\n\t\tif (sequence === 0) lastTimestamp++;\n\t}\n\n\tconst bytes = new Uint8Array(16);\n\tbytes[0] = (lastTimestamp / 0x10000000000) & 0xff;\n\tbytes[1] = (lastTimestamp / 0x100000000) & 0xff;\n\tbytes[2] = (lastTimestamp / 0x1000000) & 0xff;\n\tbytes[3] = (lastTimestamp / 0x10000) & 0xff;\n\tbytes[4] = (lastTimestamp / 0x100) & 0xff;\n\tbytes[5] = lastTimestamp & 0xff;\n\tbytes[6] = 0x70 | ((sequence >>> 28) & 0x0f);\n\tbytes[7] = (sequence >>> 20) & 0xff;\n\tbytes[8] = 0x80 | ((sequence >>> 14) & 0x3f);\n\tbytes[9] = (sequence >>> 6) & 0xff;\n\tbytes[10] = ((sequence & 0x3f) << 2) | (random[10] & 0x03);\n\tbytes[11] = random[11];\n\tbytes[12] = random[12];\n\tbytes[13] = random[13];\n\tbytes[14] = random[14];\n\tbytes[15] = random[15];\n\n\tconst hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\"));\n\treturn `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\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":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA0QlD;;;;;;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.js\";\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 isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isJsonSchemaObject(value: unknown): value is JsonSchemaObject {\n\treturn isRecord(value);\n}\n\nfunction hasTypeBoxMetadata(schema: unknown): boolean {\n\treturn isRecord(schema) && Object.getOwnPropertySymbols(schema).includes(TYPEBOX_KIND);\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 isRecord(value) && !Array.isArray(value);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction isValidatorSchema(value: unknown): value is Tool[\"parameters\"] {\n\treturn isRecord(value);\n}\n\nfunction getSubSchemaValidator(schema: JsonSchemaObject): ReturnType<typeof Compile> | undefined {\n\tif (!isValidatorSchema(schema)) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\treturn getValidator(schema);\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 && isJsonSchemaObject(schema.additionalProperties)) {\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 (isJsonSchemaObject(schema.items)) {\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 (schemaTypes.includes(\"object\") && isRecord(nextValue) && !Array.isArray(nextValue)) {\n\t\tapplySchemaObjectCoercion(nextValue, 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 (!hasTypeBoxMetadata(tool.parameters) && isJsonSchemaObject(tool.parameters)) {\n\t\tconst coerced = coerceWithJsonSchema(args, tool.parameters);\n\t\tif (coerced !== args) {\n\t\t\tif (isRecord(args) && isRecord(coerced)) {\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
+ {"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;AAmSlD;;;;;;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,CAiCzE","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\trequired?: string[];\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 validator = getSubSchemaValidator(schema);\n\t\tif (validator?.Check(value)) {\n\t\t\treturn value;\n\t\t}\n\t}\n\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 normalizeOptionalNulls(value: unknown, schema: JsonSchemaObject): void {\n\tif (Array.isArray(value)) {\n\t\tif (Array.isArray(schema.items)) {\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\tconst itemSchema = schema.items[index];\n\t\t\t\tif (itemSchema) normalizeOptionalNulls(value[index], itemSchema);\n\t\t\t}\n\t\t} else if (schema.items) {\n\t\t\tfor (const item of value) normalizeOptionalNulls(item, schema.items);\n\t\t}\n\t\treturn;\n\t}\n\tif (typeof value !== \"object\" || value === null || !schema.properties) return;\n\n\tconst object = value as Record<string, unknown>;\n\tconst required = new Set(schema.required ?? []);\n\tfor (const [key, propertySchema] of Object.entries(schema.properties)) {\n\t\tif (!(key in object)) continue;\n\t\tif (\n\t\t\tobject[key] === null &&\n\t\t\t!required.has(key) &&\n\t\t\ttypeof (propertySchema as { $ref?: unknown }).$ref !== \"string\" &&\n\t\t\tgetSubSchemaValidator(propertySchema)?.Check(null) === false\n\t\t) {\n\t\t\tdelete object[key];\n\t\t} else {\n\t\t\tnormalizeOptionalNulls(object[key], propertySchema);\n\t\t}\n\t}\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\tnormalizeOptionalNulls(args, tool.parameters as JsonSchemaObject);\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"]}
@@ -2,15 +2,6 @@ import { Compile } from "typebox/compile";
2
2
  import { Value } from "typebox/value";
3
3
  const validatorCache = new WeakMap();
4
4
  const TYPEBOX_KIND = Symbol.for("TypeBox.Kind");
5
- function isRecord(value) {
6
- return typeof value === "object" && value !== null;
7
- }
8
- function isJsonSchemaObject(value) {
9
- return isRecord(value);
10
- }
11
- function hasTypeBoxMetadata(schema) {
12
- return isRecord(schema) && Object.getOwnPropertySymbols(schema).includes(TYPEBOX_KIND);
13
- }
14
5
  function getSchemaTypes(schema) {
15
6
  if (typeof schema.type === "string") {
16
7
  return [schema.type];
@@ -35,18 +26,12 @@ function matchesJsonType(value, type) {
35
26
  case "array":
36
27
  return Array.isArray(value);
37
28
  case "object":
38
- return isRecord(value) && !Array.isArray(value);
29
+ return typeof value === "object" && value !== null && !Array.isArray(value);
39
30
  default:
40
31
  return false;
41
32
  }
42
33
  }
43
- function isValidatorSchema(value) {
44
- return isRecord(value);
45
- }
46
34
  function getSubSchemaValidator(schema) {
47
- if (!isValidatorSchema(schema)) {
48
- return undefined;
49
- }
50
35
  try {
51
36
  return getValidator(schema);
52
37
  }
@@ -138,7 +123,7 @@ function applySchemaObjectCoercion(value, schema) {
138
123
  value[key] = coerceWithJsonSchema(value[key], propertySchema);
139
124
  }
140
125
  }
141
- if (schema.additionalProperties && isJsonSchemaObject(schema.additionalProperties)) {
126
+ if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
142
127
  for (const [key, propertyValue] of Object.entries(value)) {
143
128
  if (definedKeys.has(key)) {
144
129
  continue;
@@ -158,13 +143,19 @@ function applySchemaArrayCoercion(value, schema) {
158
143
  }
159
144
  return;
160
145
  }
161
- if (isJsonSchemaObject(schema.items)) {
146
+ if (schema.items && typeof schema.items === "object") {
162
147
  for (let index = 0; index < value.length; index++) {
163
148
  value[index] = coerceWithJsonSchema(value[index], schema.items);
164
149
  }
165
150
  }
166
151
  }
167
152
  function coerceWithUnionSchema(value, schemas) {
153
+ for (const schema of schemas) {
154
+ const validator = getSubSchemaValidator(schema);
155
+ if (validator?.Check(value)) {
156
+ return value;
157
+ }
158
+ }
168
159
  for (const schema of schemas) {
169
160
  const candidate = structuredClone(value);
170
161
  const coerced = coerceWithJsonSchema(candidate, schema);
@@ -199,7 +190,10 @@ function coerceWithJsonSchema(value, schema) {
199
190
  }
200
191
  }
201
192
  }
202
- if (schemaTypes.includes("object") && isRecord(nextValue) && !Array.isArray(nextValue)) {
193
+ if (schemaTypes.includes("object") &&
194
+ typeof nextValue === "object" &&
195
+ nextValue !== null &&
196
+ !Array.isArray(nextValue)) {
203
197
  applySchemaObjectCoercion(nextValue, schema);
204
198
  }
205
199
  if (schemaTypes.includes("array") && Array.isArray(nextValue)) {
@@ -207,6 +201,39 @@ function coerceWithJsonSchema(value, schema) {
207
201
  }
208
202
  return nextValue;
209
203
  }
204
+ function normalizeOptionalNulls(value, schema) {
205
+ if (Array.isArray(value)) {
206
+ if (Array.isArray(schema.items)) {
207
+ for (let index = 0; index < value.length; index++) {
208
+ const itemSchema = schema.items[index];
209
+ if (itemSchema)
210
+ normalizeOptionalNulls(value[index], itemSchema);
211
+ }
212
+ }
213
+ else if (schema.items) {
214
+ for (const item of value)
215
+ normalizeOptionalNulls(item, schema.items);
216
+ }
217
+ return;
218
+ }
219
+ if (typeof value !== "object" || value === null || !schema.properties)
220
+ return;
221
+ const object = value;
222
+ const required = new Set(schema.required ?? []);
223
+ for (const [key, propertySchema] of Object.entries(schema.properties)) {
224
+ if (!(key in object))
225
+ continue;
226
+ if (object[key] === null &&
227
+ !required.has(key) &&
228
+ typeof propertySchema.$ref !== "string" &&
229
+ getSubSchemaValidator(propertySchema)?.Check(null) === false) {
230
+ delete object[key];
231
+ }
232
+ else {
233
+ normalizeOptionalNulls(object[key], propertySchema);
234
+ }
235
+ }
236
+ }
210
237
  function getValidator(schema) {
211
238
  const key = schema;
212
239
  const cached = validatorCache.get(key);
@@ -252,12 +279,13 @@ export function validateToolCall(tools, toolCall) {
252
279
  */
253
280
  export function validateToolArguments(tool, toolCall) {
254
281
  const args = structuredClone(toolCall.arguments);
282
+ normalizeOptionalNulls(args, tool.parameters);
255
283
  Value.Convert(tool.parameters, args);
256
284
  const validator = getValidator(tool.parameters);
257
- if (!hasTypeBoxMetadata(tool.parameters) && isJsonSchemaObject(tool.parameters)) {
285
+ if (!Object.getOwnPropertySymbols(tool.parameters).includes(TYPEBOX_KIND)) {
258
286
  const coerced = coerceWithJsonSchema(args, tool.parameters);
259
287
  if (coerced !== args) {
260
- if (isRecord(args) && isRecord(coerced)) {
288
+ if (typeof args === "object" && args !== null && typeof coerced === "object" && coerced !== null) {
261
289
  for (const key of Object.keys(args)) {
262
290
  delete args[key];
263
291
  }
@@ -1 +1 @@
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.js\";\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 isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isJsonSchemaObject(value: unknown): value is JsonSchemaObject {\n\treturn isRecord(value);\n}\n\nfunction hasTypeBoxMetadata(schema: unknown): boolean {\n\treturn isRecord(schema) && Object.getOwnPropertySymbols(schema).includes(TYPEBOX_KIND);\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 isRecord(value) && !Array.isArray(value);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nfunction isValidatorSchema(value: unknown): value is Tool[\"parameters\"] {\n\treturn isRecord(value);\n}\n\nfunction getSubSchemaValidator(schema: JsonSchemaObject): ReturnType<typeof Compile> | undefined {\n\tif (!isValidatorSchema(schema)) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\treturn getValidator(schema);\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 && isJsonSchemaObject(schema.additionalProperties)) {\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 (isJsonSchemaObject(schema.items)) {\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 (schemaTypes.includes(\"object\") && isRecord(nextValue) && !Array.isArray(nextValue)) {\n\t\tapplySchemaObjectCoercion(nextValue, 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 (!hasTypeBoxMetadata(tool.parameters) && isJsonSchemaObject(tool.parameters)) {\n\t\tconst coerced = coerceWithJsonSchema(args, tool.parameters);\n\t\tif (coerced !== args) {\n\t\t\tif (isRecord(args) && isRecord(coerced)) {\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
+ {"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\trequired?: string[];\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 validator = getSubSchemaValidator(schema);\n\t\tif (validator?.Check(value)) {\n\t\t\treturn value;\n\t\t}\n\t}\n\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 normalizeOptionalNulls(value: unknown, schema: JsonSchemaObject): void {\n\tif (Array.isArray(value)) {\n\t\tif (Array.isArray(schema.items)) {\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\tconst itemSchema = schema.items[index];\n\t\t\t\tif (itemSchema) normalizeOptionalNulls(value[index], itemSchema);\n\t\t\t}\n\t\t} else if (schema.items) {\n\t\t\tfor (const item of value) normalizeOptionalNulls(item, schema.items);\n\t\t}\n\t\treturn;\n\t}\n\tif (typeof value !== \"object\" || value === null || !schema.properties) return;\n\n\tconst object = value as Record<string, unknown>;\n\tconst required = new Set(schema.required ?? []);\n\tfor (const [key, propertySchema] of Object.entries(schema.properties)) {\n\t\tif (!(key in object)) continue;\n\t\tif (\n\t\t\tobject[key] === null &&\n\t\t\t!required.has(key) &&\n\t\t\ttypeof (propertySchema as { $ref?: unknown }).$ref !== \"string\" &&\n\t\t\tgetSubSchemaValidator(propertySchema)?.Check(null) === false\n\t\t) {\n\t\t\tdelete object[key];\n\t\t} else {\n\t\t\tnormalizeOptionalNulls(object[key], propertySchema);\n\t\t}\n\t}\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\tnormalizeOptionalNulls(args, tool.parameters as JsonSchemaObject);\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"]}