promptfoo 0.121.10 → 0.121.11

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 (323) hide show
  1. package/dist/src/{accounts-D4iTShVh.js → accounts-BGs8AMhG.js} +4 -4
  2. package/dist/src/{accounts-ECb2xAYn.js → accounts-BjCiVnil.js} +4 -4
  3. package/dist/src/{accounts-DbmMSaOW.js → accounts-C06-4dXo.js} +5 -5
  4. package/dist/src/{accounts-5Sf1PCNo.cjs → accounts-C6NiTdum.cjs} +4 -4
  5. package/dist/src/{agentic-utils-DxzgjGfK.js → agentic-utils-B5IO5YR-.js} +2 -2
  6. package/dist/src/{agentic-utils-eGLKHNlT.cjs → agentic-utils-BDKz7KHx.cjs} +2 -2
  7. package/dist/src/{agentic-utils-CLrqlGZc.js → agentic-utils-Bj9P7suD.js} +2 -2
  8. package/dist/src/{agentic-utils-jiE8RROB.js → agentic-utils-kgc1YTAx.js} +2 -2
  9. package/dist/src/{agents-CI9ETpr0.js → agents-BMcjQUHA.js} +2 -2
  10. package/dist/src/{agents-B0gmhYyj.js → agents-CyHaf9xC.js} +2 -2
  11. package/dist/src/{agents-Dl4uviKE.cjs → agents-DOhrSQhK.cjs} +4 -4
  12. package/dist/src/{agents-CK9Kxnix.js → agents-DT1nSZix.js} +4 -4
  13. package/dist/src/{agents-6d6pdEFT.js → agents-DgakfoxG.js} +4 -4
  14. package/dist/src/{agents-C5zoy2ZS.js → agents-VKHVNG4J.js} +2 -2
  15. package/dist/src/{agents-Br5HYLBT.cjs → agents-zYAXB2ja.cjs} +2 -2
  16. package/dist/src/{agents-CvL6W9kz.js → agents-zzIht0lm.js} +4 -4
  17. package/dist/src/{aimlapi-DGCN4rpi.cjs → aimlapi-Bv6rnE4W.cjs} +6 -6
  18. package/dist/src/{aimlapi-BonWl7zl.js → aimlapi-C05Ca41Z.js} +6 -6
  19. package/dist/src/{aimlapi-NJzALFkC.js → aimlapi-CLaCvZn8.js} +6 -6
  20. package/dist/src/{aimlapi-UwsBeqRG.js → aimlapi-DW7KNdkd.js} +6 -6
  21. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -1
  22. package/dist/src/app/assets/Report-BgwGPDAJ.js +1 -0
  23. package/dist/src/app/assets/index-CBwcpPdR.js +413 -0
  24. package/dist/src/app/assets/index-ZYpt1xFX.css +1 -0
  25. package/dist/src/app/index.html +2 -2
  26. package/dist/src/{audio-yUZrS0JJ.js → audio-Cd92j4tr.js} +3 -3
  27. package/dist/src/{audio-9N6nZqw9.js → audio-De3snmla.js} +3 -3
  28. package/dist/src/{audio-DBqadfGk.js → audio-Dh44iWq7.js} +3 -3
  29. package/dist/src/{audio-BR4j1oG1.cjs → audio-MqvGQVvP.cjs} +3 -3
  30. package/dist/src/{authoritativeMarkupInjection-2C63bFKe.cjs → authoritativeMarkupInjection-BAuWkXwn.cjs} +5 -5
  31. package/dist/src/{authoritativeMarkupInjection-B2MJXBR1.js → authoritativeMarkupInjection-CDCg-jRQ.js} +4 -4
  32. package/dist/src/{authoritativeMarkupInjection-CE4HOCHa.js → authoritativeMarkupInjection-COd4q9Hp.js} +5 -5
  33. package/dist/src/{authoritativeMarkupInjection-DrBqZVP1.js → authoritativeMarkupInjection-D5oKM43M.js} +5 -5
  34. package/dist/src/{base-tmVReihS.js → base-B8G9Ob46.js} +2 -2
  35. package/dist/src/{base-6Aaed910.js → base-CzDq5YwX.js} +2 -2
  36. package/dist/src/{base-S8I8vPVY.js → base-DqNtZTrF.js} +2 -2
  37. package/dist/src/{base-BS60m8JA.cjs → base-OeMKpFIB.cjs} +2 -2
  38. package/dist/src/{bestOfN-BkH9d3Lr.js → bestOfN-B89i9zc7.js} +6 -6
  39. package/dist/src/{bestOfN-C1_WFZFb.js → bestOfN-BEfIajMY.js} +5 -5
  40. package/dist/src/{bestOfN-DfRpoheE.js → bestOfN-Czr-c62W.js} +6 -6
  41. package/dist/src/{bestOfN-b6uHssUC.cjs → bestOfN-QWGyCB5j.cjs} +6 -6
  42. package/dist/src/{billing-DwpSQ_4i.js → billing-BhghtFas.js} +2 -2
  43. package/dist/src/{billing-CAB1s36q.js → billing-BkQJKKdm.js} +2 -2
  44. package/dist/src/{billing-Dn9Gm2tN.cjs → billing-Co_1rjfG.cjs} +2 -2
  45. package/dist/src/{billing-DimGp80i.js → billing-MY86Oqwg.js} +2 -2
  46. package/dist/src/{blobs-7T2OXYkC.js → blobs-B8d9jKvz.js} +2 -2
  47. package/dist/src/{blobs-CqhgM_fa.js → blobs-BTzPmpq-.js} +2 -2
  48. package/dist/src/{blobs-DQ6pIlJQ.cjs → blobs-BcpoigIU.cjs} +7 -1
  49. package/dist/src/{blobs-Dxfq3woN.js → blobs-DQ4bXN5O.js} +2 -2
  50. package/dist/src/{cache-DgKlV56y.js → cache-BEZBHFxd.js} +2 -2
  51. package/dist/src/cache-Cqg9f4d4.js +3 -0
  52. package/dist/src/{cache-CmidsPv2.js → cache-D2MfIrzr.js} +3 -3
  53. package/dist/src/{cache-B-fzj_aE.cjs → cache-DWEZYdJG.cjs} +2 -2
  54. package/dist/src/{cache-Z4cklSHj.js → cache-WT_2CYA-.js} +2 -2
  55. package/dist/src/{chat-uLo5fkVu.js → chat-C9yx5XD4.js} +2 -2
  56. package/dist/src/{chat-VVJW_GJC.js → chat-CuPbIKVa.js} +2 -2
  57. package/dist/src/{chat-BWdNGktf.js → chat-DBG4VxM7.js} +7 -7
  58. package/dist/src/{chat-CrOCT2BA.js → chat-Dwfr4jHi.js} +2 -2
  59. package/dist/src/{chat-BE0BP7oZ.js → chat-FNWhaysj.js} +7 -7
  60. package/dist/src/{chat-CvN2w9fY.js → chat-PfM8xgFA.js} +7 -7
  61. package/dist/src/{chat-CpFzezkO.cjs → chat-XVIowajy.cjs} +7 -7
  62. package/dist/src/{chat-DAkk46Lf.cjs → chat-sZgq1_-v.cjs} +2 -2
  63. package/dist/src/{claude-agent-sdk-CocknPbL.js → claude-agent-sdk-B0AZ38ny.js} +4 -4
  64. package/dist/src/{claude-agent-sdk-BH0L9H8Y.js → claude-agent-sdk-BfYAjuTk.js} +4 -4
  65. package/dist/src/{claude-agent-sdk-DxyDxejT.cjs → claude-agent-sdk-CklMerFa.cjs} +4 -4
  66. package/dist/src/{claude-agent-sdk-Bh0MH9Z9.js → claude-agent-sdk-DTFpCefB.js} +4 -4
  67. package/dist/src/cloud-BNr2N1RY.js +3 -0
  68. package/dist/src/{cloud-DJB9yPQB.js → cloud-DKKGeJBV.js} +2 -2
  69. package/dist/src/{cloudflare-ai-DeUFFMJE.cjs → cloudflare-ai-C7pMPgpc.cjs} +4 -4
  70. package/dist/src/{cloudflare-ai-Bg1wwMId.js → cloudflare-ai-Cqz_3WD2.js} +4 -4
  71. package/dist/src/{cloudflare-ai-CpbxtQGT.js → cloudflare-ai-CuUCQanF.js} +4 -4
  72. package/dist/src/{cloudflare-ai-B2Sjijq0.js → cloudflare-ai-lAgV52qE.js} +4 -4
  73. package/dist/src/{cloudflare-gateway-DKsO0VKU.js → cloudflare-gateway-8T5x83eI.js} +3 -3
  74. package/dist/src/{cloudflare-gateway-CvQV6nA1.js → cloudflare-gateway-Bq7SdErk.js} +3 -3
  75. package/dist/src/{cloudflare-gateway-BwdJezUO.js → cloudflare-gateway-moRfeZJJ.js} +3 -3
  76. package/dist/src/{cloudflare-gateway-cBHiORfX.cjs → cloudflare-gateway-peUrx9oi.cjs} +3 -3
  77. package/dist/src/{codex-app-server-BHVKRhkY.js → codex-app-server-BvPHEwJg.js} +5 -5
  78. package/dist/src/{codex-app-server-CojV6u3_.js → codex-app-server-DBTBsZ1t.js} +5 -5
  79. package/dist/src/{codex-app-server-B471dabg.cjs → codex-app-server-Dwl3iupA.cjs} +5 -5
  80. package/dist/src/{codex-app-server-DF2PMuc1.js → codex-app-server-t-QoeeGd.js} +5 -5
  81. package/dist/src/{codex-sdk-Bj4uY6sS.js → codex-sdk-C4FTldKU.js} +4 -4
  82. package/dist/src/{codex-sdk-D4JF0nj6.js → codex-sdk-C4aieKza.js} +4 -4
  83. package/dist/src/codex-sdk-CTD1qSKx.js +3 -0
  84. package/dist/src/{codex-sdk-aezPvTAB.js → codex-sdk-CnSzlhih.js} +4 -4
  85. package/dist/src/{codex-sdk-C9c-416d.cjs → codex-sdk-bWIQVOBL.cjs} +4 -4
  86. package/dist/src/{cometapi-CgaDmO4i.js → cometapi-B0mQIIzf.js} +7 -7
  87. package/dist/src/{cometapi-BlBmHq7-.js → cometapi-CFrYNMs5.js} +7 -7
  88. package/dist/src/{cometapi-mtyRjerU.js → cometapi-CMnFU1wL.js} +7 -7
  89. package/dist/src/{cometapi-D8sWSnb1.cjs → cometapi-D2thnPaL.cjs} +7 -7
  90. package/dist/src/{completion-RkFAOVSF.js → completion-B0yVZF3v.js} +5 -5
  91. package/dist/src/{completion-CHnFmpnp.js → completion-Dz36rtPd.js} +5 -5
  92. package/dist/src/{completion-Di0-4tYi.cjs → completion-Ny3XQpqx.cjs} +5 -5
  93. package/dist/src/{completion-Bd8G9VHW.js → completion-sMpCTaBm.js} +5 -5
  94. package/dist/src/{crescendo-C8YuBd9K.js → crescendo-BpVWWleP.js} +11 -11
  95. package/dist/src/{crescendo-TWgp7uGp.cjs → crescendo-CqQhmeC0.cjs} +13 -13
  96. package/dist/src/{crescendo-BgGio6G0.js → crescendo-JAvyVRKK.js} +13 -13
  97. package/dist/src/{crescendo-BQ2VI9FD.js → crescendo-RfCMSIM-.js} +13 -13
  98. package/dist/src/{custom-D0p5pikf.cjs → custom-B_fKUq6j.cjs} +11 -11
  99. package/dist/src/{custom-DsSELzzx.js → custom-Bm6Tu-ji.js} +11 -11
  100. package/dist/src/{custom-CFnjgHKp.js → custom-LxkvkOvG.js} +9 -9
  101. package/dist/src/{custom-CSaH4Qj9.js → custom-jLsK8Wf9.js} +11 -11
  102. package/dist/src/{docker-ByT3LmHN.js → docker-B60virtZ.js} +5 -5
  103. package/dist/src/{docker-BRA5ruGU.cjs → docker-D_f3qyDE.cjs} +5 -5
  104. package/dist/src/{docker-CVY-oMv4.js → docker-DogRc30z.js} +5 -5
  105. package/dist/src/{docker-DIxhfwlx.js → docker-wwQ1pPGy.js} +5 -5
  106. package/dist/src/{embedding-BpX-WENP.js → embedding-BMe9ZgQF.js} +5 -5
  107. package/dist/src/{embedding-B_0mJpXs.cjs → embedding-ClHIOEld.cjs} +5 -5
  108. package/dist/src/{embedding-LplgjBJ0.js → embedding-Dy2o5RFQ.js} +5 -5
  109. package/dist/src/{embedding-CCbgRo4z.js → embedding-HXOpA992.js} +5 -5
  110. package/dist/src/{eval-BXF3bRvV.js → eval-BLgDYWPd.js} +4 -4
  111. package/dist/src/{eval-BcM9YiOW.js → eval-DbGugzR8.js} +1 -1
  112. package/dist/src/evalResult-B6Jpy3kJ.js +3 -0
  113. package/dist/src/{evalResult-C8MROHS8.js → evalResult-BWE17Tqm.js} +3 -3
  114. package/dist/src/{evalResult-CIxAdUVQ.cjs → evalResult-DDohNAHL.cjs} +3 -3
  115. package/dist/src/{evalResult-DaACTv0f.js → evalResult-DOh0QQix.js} +3 -3
  116. package/dist/src/evaluator-CTl-lKuh.js +3 -0
  117. package/dist/src/{evaluator-C_gCkBe3.js → evaluator-DbOsHSRe.js} +212 -21
  118. package/dist/src/{evaluatorHelpers-BVvi8tWH.cjs → evaluatorHelpers-CaaC50RB.cjs} +4 -4
  119. package/dist/src/{evaluatorHelpers-C6-aKnJe.js → evaluatorHelpers-CoLW5rKU.js} +4 -4
  120. package/dist/src/{evaluatorHelpers-RQo-m90b.js → evaluatorHelpers-DTtYkrGO.js} +4 -4
  121. package/dist/src/{extractor-B1hELWwJ.js → extractor-BIqe0lMN.js} +70 -12
  122. package/dist/src/{extractor-_E41W0Fl.cjs → extractor-CUVurbDW.cjs} +71 -12
  123. package/dist/src/{extractor-DV6WBfAi.js → extractor-DOhjGS0m.js} +70 -12
  124. package/dist/src/{extractor-ItsKh8lH.js → extractor-h1HS9f6y.js} +70 -12
  125. package/dist/src/{fetch-BBa1Lxgp.js → fetch-B1Rb0VdL.js} +3 -3
  126. package/dist/src/{fetch-BtdsABrj.js → fetch-BErWGTUY.js} +2 -2
  127. package/dist/src/{fetch-CFIU30wy.js → fetch-BNUDixbE.js} +2 -2
  128. package/dist/src/{fetch-OePjzUmA.cjs → fetch-C7yU9CNr.cjs} +2 -2
  129. package/dist/src/fetch-DVj4dF4V.js +3 -0
  130. package/dist/src/{goat-kpeOOE-K.js → goat-BnB1zGir.js} +13 -13
  131. package/dist/src/{goat-Coh2te0S.cjs → goat-C1RkjWv1.cjs} +13 -13
  132. package/dist/src/{goat-BCFeW4zk.js → goat-CNpA_tT8.js} +11 -11
  133. package/dist/src/{goat-Dr2YGfiG.js → goat-ZRARvAD5.js} +13 -13
  134. package/dist/src/graders-CA3QVnK3.js +3 -0
  135. package/dist/src/{graders-BrLOEmxX.js → graders-CO5drf0x.js} +17 -17
  136. package/dist/src/{graders-DEz7EeRy.js → graders-CpUlNVnh.js} +17 -17
  137. package/dist/src/{graders-CY4Ft8A9.js → graders-Z5qzvpuI.js} +17 -17
  138. package/dist/src/{graders-CCrX0NG3.cjs → graders-t_K-nZ_X.cjs} +17 -17
  139. package/dist/src/{hydra-C90CylNi.js → hydra-BMb0WtZA.js} +13 -13
  140. package/dist/src/{hydra-dOBPmWHt.js → hydra-BXmf4FCK.js} +11 -11
  141. package/dist/src/{hydra-Cq_3qKz_.js → hydra-C5_Vuh-m.js} +13 -13
  142. package/dist/src/{hydra-B524i6K6.cjs → hydra-c1_7vPsg.cjs} +13 -13
  143. package/dist/src/{image-DBnzfeuJ.cjs → image-BhHFD4Vb.cjs} +3 -3
  144. package/dist/src/{image-CvhTr1GY.cjs → image-CYFea400.cjs} +5 -5
  145. package/dist/src/{image-CHJ-KjNE.js → image-CgkOODNn.js} +5 -5
  146. package/dist/src/{image-_-h6GCQ7.js → image-DGQkq3aK.js} +5 -5
  147. package/dist/src/{image-CkF1ruDX.js → image-DWveOfTz.js} +3 -3
  148. package/dist/src/{image-BmVZRCkS.js → image-DfF12xzt.js} +5 -5
  149. package/dist/src/{image-B6P9JAV2.js → image-DkSUFfLd.js} +3 -3
  150. package/dist/src/{image-CD22vXth.js → image-nYwdqnax.js} +3 -3
  151. package/dist/src/index.cjs +218 -26
  152. package/dist/src/index.js +216 -26
  153. package/dist/src/{indirectWebPwn-BgIfQ2ON.js → indirectWebPwn-BajQ_evT.js} +5 -5
  154. package/dist/src/{indirectWebPwn-A16xYmav.js → indirectWebPwn-BbFMiv79.js} +4 -4
  155. package/dist/src/{indirectWebPwn-BRhR4Dk9.js → indirectWebPwn-BnrxhAAL.js} +4 -4
  156. package/dist/src/{indirectWebPwn-Bfp-t224.cjs → indirectWebPwn-BqOgtzny.cjs} +5 -5
  157. package/dist/src/{indirectWebPwn-8G6tgDBW.js → indirectWebPwn-C6_BaxjA.js} +5 -5
  158. package/dist/src/{indirectWebPwn-BWGexuih.js → indirectWebPwn-C779yDi6.js} +4 -4
  159. package/dist/src/{indirectWebPwn-DcKDbCn_.cjs → indirectWebPwn-CDo9rC06.cjs} +4 -4
  160. package/dist/src/{indirectWebPwn-CZ2kTy4r.js → indirectWebPwn-k8D0JacN.js} +5 -5
  161. package/dist/src/{iterative-BIHF31Io.js → iterative-BzKNkXHn.js} +13 -13
  162. package/dist/src/{iterative-XRfxQ0i8.cjs → iterative-CD3I_Rwq.cjs} +13 -13
  163. package/dist/src/{iterative-CZPHLUKZ.js → iterative-DL8iDwrE.js} +13 -13
  164. package/dist/src/{iterative-DZkNlFE-.js → iterative-DyEoFedI.js} +11 -11
  165. package/dist/src/{iterativeImage-BFRM8Jdx.js → iterativeImage-B7qV6kzP.js} +4 -4
  166. package/dist/src/{iterativeImage-DJtVKlFX.cjs → iterativeImage-BaOAhF-S.cjs} +5 -5
  167. package/dist/src/{iterativeImage-7WjhjpHE.js → iterativeImage-D85THuYb.js} +5 -5
  168. package/dist/src/{iterativeImage-CbRn9_MH.js → iterativeImage-noXhuElt.js} +5 -5
  169. package/dist/src/{iterativeMeta-2gyieWbU.js → iterativeMeta-BHNJgPy0.js} +12 -12
  170. package/dist/src/{iterativeMeta-dkFD9UKg.cjs → iterativeMeta-BQrhQ-iJ.cjs} +12 -12
  171. package/dist/src/{iterativeMeta-Bh2AQq8Y.js → iterativeMeta-CAN36NIN.js} +12 -12
  172. package/dist/src/{iterativeMeta-CmMnD77T.js → iterativeMeta-CnPYPYH0.js} +10 -10
  173. package/dist/src/{iterativeTree-DuIk7wjS.js → iterativeTree-B7116aK-.js} +10 -10
  174. package/dist/src/{iterativeTree-bjH__9en.js → iterativeTree-DdXSpkqE.js} +12 -12
  175. package/dist/src/{iterativeTree-DSNss1kE.js → iterativeTree-cKlxQWhi.js} +12 -12
  176. package/dist/src/{iterativeTree-DoE-8nC3.cjs → iterativeTree-u2hKQ51y.cjs} +12 -12
  177. package/dist/src/{knowledgeBase-kyTJpbr0.js → knowledgeBase-D9xW79dS.js} +4 -4
  178. package/dist/src/{knowledgeBase-CQasebQt.js → knowledgeBase-DfwVbdwp.js} +4 -4
  179. package/dist/src/{knowledgeBase-DebHrXhD.cjs → knowledgeBase-DhT8uaMH.cjs} +4 -4
  180. package/dist/src/{knowledgeBase-mzMh6UZt.js → knowledgeBase-DlH6NRlX.js} +4 -4
  181. package/dist/src/{litellm-wSD4Q6-H.cjs → litellm-BA2Fti7H.cjs} +4 -4
  182. package/dist/src/{litellm-BJFH4uKd.js → litellm-CHybAu4l.js} +4 -4
  183. package/dist/src/{litellm-A2eV_lM0.js → litellm-Cn_zDWeA.js} +4 -4
  184. package/dist/src/{litellm-CeJEe_jQ.js → litellm-CnqX4jfm.js} +4 -4
  185. package/dist/src/{luma-ray-DpuaR6Wa.js → luma-ray-C_AWu7K6.js} +4 -4
  186. package/dist/src/{luma-ray-B0GNCw6S.js → luma-ray-CbFOvJZw.js} +4 -4
  187. package/dist/src/{luma-ray-qBfU-mGO.cjs → luma-ray-D7hDEZaC.cjs} +4 -4
  188. package/dist/src/{luma-ray-CM6bvN4t.js → luma-ray-RQAhTNvK.js} +4 -4
  189. package/dist/src/main.js +27 -27
  190. package/dist/src/{memoryPoisoning-9mIgiE3F.cjs → memoryPoisoning-A8N_cbrW.cjs} +5 -5
  191. package/dist/src/{memoryPoisoning-BYBQ1Ns5.js → memoryPoisoning-BGe4fuFU.js} +5 -5
  192. package/dist/src/{memoryPoisoning-SvtQxFjF.js → memoryPoisoning-DDfIRZnk.js} +5 -5
  193. package/dist/src/{memoryPoisoning-D4iqi_nT.js → memoryPoisoning-DtJ5vYZW.js} +5 -5
  194. package/dist/src/{messages-BofXErqC.js → messages-BH83TS-n.js} +7 -7
  195. package/dist/src/{messages-DxzhBs74.js → messages-aXox3d04.js} +7 -7
  196. package/dist/src/{messages-CHZtL-k0.cjs → messages-qapmFqOQ.cjs} +7 -7
  197. package/dist/src/{messages-BKTseD_x.js → messages-yVMPGJ4n.js} +7 -7
  198. package/dist/src/{mischievousUser-D23wQ8f0.js → mischievousUser-BPDyepmu.js} +5 -5
  199. package/dist/src/{mischievousUser-DX1gGvUB.js → mischievousUser-D1mbddId.js} +5 -5
  200. package/dist/src/{mischievousUser-ECTv-u4g.cjs → mischievousUser-DHYVKotH.cjs} +5 -5
  201. package/dist/src/{mischievousUser-B5oT1xjM.js → mischievousUser-D_8tmPfA.js} +5 -5
  202. package/dist/src/{modelslab-D5vwtIYR.js → modelslab-BwywPRoU.js} +5 -5
  203. package/dist/src/{modelslab-DE9CfYYT.js → modelslab-Cc6fn99l.js} +5 -5
  204. package/dist/src/{modelslab-CVkeR8mC.cjs → modelslab-D2F3FtnI.cjs} +5 -5
  205. package/dist/src/{modelslab-BU_qCK1m.js → modelslab-D_izTsvD.js} +5 -5
  206. package/dist/src/{nova-reel-BSM7U8Bp.js → nova-reel-B1Jg1XBk.js} +4 -4
  207. package/dist/src/{nova-reel-BKAkU37Y.js → nova-reel-CZeHbWUe.js} +4 -4
  208. package/dist/src/{nova-reel-BvWH15rr.cjs → nova-reel-CcWrhmGJ.cjs} +4 -4
  209. package/dist/src/{nova-reel-D2tla7dy.js → nova-reel-DFrk1Ey2.js} +4 -4
  210. package/dist/src/{nova-sonic-DU7_krhB.js → nova-sonic-4wwR0tZJ.js} +2 -2
  211. package/dist/src/{nova-sonic-C7CNjG9n.cjs → nova-sonic-BqRQ9CWO.cjs} +2 -2
  212. package/dist/src/{nova-sonic-BQkU8weK.js → nova-sonic-D-IJHou2.js} +2 -2
  213. package/dist/src/{nova-sonic-B8PB4mU2.js → nova-sonic-DJUXNWUJ.js} +2 -2
  214. package/dist/src/{openclaw-CLNjF8ox.js → openclaw-5U8yiy9P.js} +5 -5
  215. package/dist/src/{openclaw-laZmy-8p.cjs → openclaw-B0vjRb3y.cjs} +5 -5
  216. package/dist/src/{openclaw-Gl2a1gR3.js → openclaw-C8xQtncQ.js} +5 -5
  217. package/dist/src/{openclaw-D5yEpk1f.js → openclaw-CqZoWsh0.js} +5 -5
  218. package/dist/src/{opencode-sdk-CGPqE4m0.js → opencode-sdk-B2qz1kCI.js} +2 -2
  219. package/dist/src/{opencode-sdk-5XXP3gNb.js → opencode-sdk-BGO1zuPF.js} +2 -2
  220. package/dist/src/{opencode-sdk-C7mIxApB.cjs → opencode-sdk-Bk9G3WGQ.cjs} +2 -2
  221. package/dist/src/{opencode-sdk-E1fh3vlz.js → opencode-sdk-NhbhYcsR.js} +2 -2
  222. package/dist/src/{promptfoo-C4g2Lx9t.js → promptfoo-CkDcgxiW.js} +4 -4
  223. package/dist/src/{promptfoo-DdsPYNm7.js → promptfoo-De6vQq9F.js} +4 -4
  224. package/dist/src/{promptfoo-x112UyE1.js → promptfoo-DhGR7OQn.js} +4 -4
  225. package/dist/src/{promptfoo-B9KuhWM0.cjs → promptfoo-Dtw3i6YK.cjs} +4 -4
  226. package/dist/src/{providers-xrARCHcC.js → providers-BIgLuX4Z.js} +1 -1
  227. package/dist/src/{providers-BZ-QJYop.cjs → providers-CCRHPNv1.cjs} +50 -49
  228. package/dist/src/{providers-DdNIebwz.js → providers-am7xTa5w.js} +51 -50
  229. package/dist/src/{providers-BnjFZtaq.js → providers-gntyGa2T.js} +50 -49
  230. package/dist/src/{providers-D_OinWvd.js → providers-j-ulWCzy.js} +50 -49
  231. package/dist/src/quiverai-CHV12wRE.js +324 -0
  232. package/dist/src/quiverai-CNSyaZhh.js +325 -0
  233. package/dist/src/quiverai-CNfaxZ3K.cjs +324 -0
  234. package/dist/src/quiverai-CzROwhTy.js +324 -0
  235. package/dist/src/{registry-C57trbNM.js → registry-B0pFfEzq.js} +14 -14
  236. package/dist/src/{registry-Bnb9O892.cjs → registry-BH1mZ37j.cjs} +14 -14
  237. package/dist/src/{registry-CmhcDYtj.js → registry-Bvfyz9Xt.js} +14 -14
  238. package/dist/src/{registry-DhaGoOuz.js → registry-Dzut7txg.js} +14 -14
  239. package/dist/src/{remoteGeneration-BlwssRVS.js → remoteGeneration-CW6zHjQx.js} +4 -4
  240. package/dist/src/{remoteGeneration--4NPfyL-.js → remoteGeneration-DuxbIn94.js} +4 -4
  241. package/dist/src/{remoteGeneration-B0K7iojS.cjs → remoteGeneration-oSmtgmBY.cjs} +4 -4
  242. package/dist/src/{remoteGeneration-DiAuGk9s.js → remoteGeneration-wvnQpzN1.js} +4 -4
  243. package/dist/src/{responses-C57h4gaW.js → responses-CI7uikKQ.js} +6 -6
  244. package/dist/src/{responses-B9ygvEC-.cjs → responses-DRLyW4Lj.cjs} +6 -6
  245. package/dist/src/{responses-CXKL6TPn.js → responses-DxFUQTN2.js} +6 -6
  246. package/dist/src/{responses-CTfu1ToN.js → responses-JNrMb3zS.js} +6 -6
  247. package/dist/src/{sagemaker-DHdeSsnJ.js → sagemaker-5AwedTwq.js} +9 -9
  248. package/dist/src/{sagemaker-CHL8TZFs.js → sagemaker-B5yQiSKh.js} +9 -9
  249. package/dist/src/{sagemaker-DdVGF_UD.cjs → sagemaker-C3aoiFup.cjs} +9 -9
  250. package/dist/src/{sagemaker-DUjuHnmj.js → sagemaker-XmAlwYoN.js} +9 -9
  251. package/dist/src/{scanner-BdoS5ILQ.js → scanner-BdEduFjO.js} +5 -5
  252. package/dist/src/server/index.js +214 -24
  253. package/dist/src/{server-B8UpdwtX.cjs → server-B3QXCltR.cjs} +3 -3
  254. package/dist/src/{server-DaonK4kI.js → server-Ctq0NOMp.js} +3 -3
  255. package/dist/src/{server-Ds_P02x6.js → server-D0pdY_yM.js} +4 -4
  256. package/dist/src/{server-CYxCnoVw.js → server-DMCug-jv.js} +4 -4
  257. package/dist/src/server-Ty5m26Vh.js +3 -0
  258. package/dist/src/{shared-BavzGCp0.js → shared-C-G3NQ1-.js} +7 -7
  259. package/dist/src/{shared-D_0FXjLS.js → shared-CnrYC0Dk.js} +7 -7
  260. package/dist/src/{shared-DY3IzJlT.cjs → shared-D3PxrdDh.cjs} +7 -7
  261. package/dist/src/{shared-B3IkjkNV.js → shared-DHDR-oS4.js} +7 -7
  262. package/dist/src/{simulatedUser-CokouWJT.js → simulatedUser-AhNbPm55.js} +5 -5
  263. package/dist/src/{simulatedUser-DNiOb7YE.js → simulatedUser-DV977ZD0.js} +5 -5
  264. package/dist/src/{simulatedUser-BJabLGod.js → simulatedUser-Dq8cpKLQ.js} +5 -5
  265. package/dist/src/{simulatedUser-CPDlAc1R.cjs → simulatedUser-tAjEGnxH.cjs} +5 -5
  266. package/dist/src/{storage-CH8WC1r3.cjs → storage-C8WR4y77.cjs} +3 -3
  267. package/dist/src/{storage-D_qaZpfe.js → storage-CK2YYGUg.js} +3 -3
  268. package/dist/src/{storage-CLyYkZk-.js → storage-Nc_eXGrV.js} +4 -4
  269. package/dist/src/{storage-3dpIy6f2.js → storage-P9MrA5xv.js} +3 -3
  270. package/dist/src/{strategies-2Q_uZxBs.cjs → strategies-B6Y6G9UV.cjs} +8 -8
  271. package/dist/src/{strategies-DVDC487a.js → strategies-CaefFyHy.js} +9 -9
  272. package/dist/src/{strategies-BuIPOuYL.js → strategies-DE3UN_VH.js} +8 -8
  273. package/dist/src/telemetry-Bbd-BlA7.js +3 -0
  274. package/dist/src/{telemetry-Bh3HJU7r.js → telemetry-C7v0I4YX.js} +3 -3
  275. package/dist/src/{telemetry-B-NTbvDj.js → telemetry-CTYOje0d.js} +3 -3
  276. package/dist/src/{telemetry-3fTnWcSU.js → telemetry-CvJEPKK6.js} +3 -3
  277. package/dist/src/{telemetry-Be4rklbJ.cjs → telemetry-hDovhwWp.cjs} +3 -3
  278. package/dist/src/{tracingOptions-CYCHrrQQ.cjs → tracingOptions-DGai7e5l.cjs} +2 -2
  279. package/dist/src/{tracingOptions-CLKNUvF4.js → tracingOptions-DL2vOmYS.js} +2 -2
  280. package/dist/src/{tracingOptions-CZpFCwyr.js → tracingOptions-e_c5TlHv.js} +2 -2
  281. package/dist/src/{tracingOptions-Bi477wlC.js → tracingOptions-xCBDF3nM.js} +2 -2
  282. package/dist/src/{transcription-CtLhhmYq.js → transcription-BCasJfFB.js} +4 -4
  283. package/dist/src/{transcription-BB9i78R3.js → transcription-BLOD9lN7.js} +4 -4
  284. package/dist/src/{transcription-BRd477OO.js → transcription-BOjp5wlV.js} +4 -4
  285. package/dist/src/{transcription-O3Nc-kEc.cjs → transcription-G6JwbB2P.cjs} +4 -4
  286. package/dist/src/{transform-D9nfyIts.cjs → transform-B92noEAU.cjs} +13 -3
  287. package/dist/src/{transform-DmSzMsCP.js → transform-CD9wrP31.js} +8 -4
  288. package/dist/src/{transform-CUPglRUI.js → transform-D7-gzzhD.js} +8 -4
  289. package/dist/src/{transform-CLzSt5fi.js → transform-D8kXC-nB.js} +8 -4
  290. package/dist/src/{util-CnqjxsAd.js → util-BTAyQmdN.js} +2 -2
  291. package/dist/src/{util-Bg-aMimr.js → util-BbMJxgff.js} +3 -3
  292. package/dist/src/{util-mVC_YCag.cjs → util-C62dCLH_.cjs} +3 -3
  293. package/dist/src/{util-16aq4oHW.js → util-CD4LxH5h.js} +4 -4
  294. package/dist/src/{util-CRYfgRHi.js → util-CHCKTSi5.js} +3 -3
  295. package/dist/src/{util-BIYgspDB.js → util-CKQ_tuWG.js} +4 -4
  296. package/dist/src/{util-Bptzcit_.js → util-CVI1oD-n.js} +3 -3
  297. package/dist/src/{util-DHG9r5sC.js → util-CcW4TZSn.js} +2 -2
  298. package/dist/src/{util-DJLHqGS5.js → util-Ci_vm5u1.js} +2 -2
  299. package/dist/src/{util-D9xyoiGG.js → util-CkLsVF3e.js} +3 -3
  300. package/dist/src/{util-BsKq95ai.js → util-CqfcdA-f.js} +3 -3
  301. package/dist/src/{util-tsZfE0-_.js → util-CubC5Tyt.js} +3 -3
  302. package/dist/src/{util-BHfVEhSs.cjs → util-cAY5C8xI.cjs} +3 -3
  303. package/dist/src/{util-DEMRW89M2.cjs → util-jOGJmpWE2.cjs} +4 -4
  304. package/dist/src/{util-CpS555tc2.js → util-s0NU5XTE2.js} +4 -4
  305. package/dist/src/{util-DJFl6JZF.cjs → util-tFLdovkA.cjs} +2 -2
  306. package/dist/tsconfig.tsbuildinfo +1 -1
  307. package/package.json +1 -1
  308. package/dist/src/app/assets/Report-Cx3cN9Nt.js +0 -1
  309. package/dist/src/app/assets/index-D44ihjH5.css +0 -1
  310. package/dist/src/app/assets/index-DzyLrNWM.js +0 -413
  311. package/dist/src/cache-D_D5rsiE.js +0 -3
  312. package/dist/src/cloud-BmVZ8W_3.js +0 -3
  313. package/dist/src/codex-sdk-BTI9Fvnt.js +0 -3
  314. package/dist/src/evalResult-uL1BStGk.js +0 -3
  315. package/dist/src/evaluator-C2YPxWQP.js +0 -3
  316. package/dist/src/fetch-DAe6a2ih.js +0 -3
  317. package/dist/src/graders-BZe_w0E4.js +0 -3
  318. package/dist/src/quiverai-B8a5RqGP.js +0 -213
  319. package/dist/src/quiverai-BoHFg1Vw.js +0 -214
  320. package/dist/src/quiverai-DYyzyVTF.cjs +0 -213
  321. package/dist/src/quiverai-ktAnwSBA.js +0 -213
  322. package/dist/src/server-DY7p-P4-.js +0 -3
  323. package/dist/src/telemetry-BOwRcACl.js +0 -3
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { r as evaluate } from "./evaluator-DbOsHSRe.js";
3
+ export { evaluate };
@@ -1,44 +1,47 @@
1
1
  #!/usr/bin/env node
2
2
  import { t as getProcessShim } from "./processShim-PekFOUjm.js";
3
3
  import { A as getEvalTimeoutMs, C as summarizeEvaluateResultForLogging, E as getEnvBool, M as isCI, O as getEnvInt, P as state, S as safeJsonStringify, _ as extractFirstJsonObject, c as logger, i as globalLogCallback, j as getMaxEvalTimeMs, k as getEnvString, l as setLogCallback, v as extractJsonObjects, y as getAjv } from "./logger-DNHkR_3S.js";
4
- import { K as VERSION, M as parseChatPrompt, _ as isNonTransientHttpStatus, b as sleep, i as fetchWithRetries, k as isPromptfooSampleTarget, q as FILE_METADATA_KEY } from "./fetch-BBa1Lxgp.js";
4
+ import { K as VERSION, M as parseChatPrompt, _ as isNonTransientHttpStatus, b as sleep, i as fetchWithRetries, k as isPromptfooSampleTarget, q as FILE_METADATA_KEY } from "./fetch-B1Rb0VdL.js";
5
5
  import { t as invariant } from "./invariant-BtWWVVhl.js";
6
- import { n as telemetry } from "./telemetry-Bh3HJU7r.js";
6
+ import { n as telemetry } from "./telemetry-C7v0I4YX.js";
7
7
  import { at as LLAMA_GUARD_REPLICATE_PROVIDER, ct as MULTI_INPUT_VAR, d as isGradingResult, h as isCliEventSource, p as isApiProvider, s as ResultFailureReason, y as filterByRange } from "./types-C7iPXxc5.js";
8
8
  import { i as isJavascriptFile } from "./fileExtensions-PGPK8Wcw.js";
9
9
  import { t as providerRegistry } from "./providerRegistry-DaK_MD80.js";
10
- import { C as isAnthropicProvider, E as isProviderAllowed, H as loadFunction, K as analyzeTemplateReference, L as maybeLoadToolsFromExternalFile, T as isOpenAiProvider, U as parseFileUrl, Y as getNunjucksEngine, q as extractVariablesFromTemplate, w as isGoogleProvider } from "./util-DHG9r5sC.js";
11
- import { c as withCacheNamespace, i as getCache } from "./cache-CmidsPv2.js";
10
+ import { C as isAnthropicProvider, E as isProviderAllowed, H as loadFunction, K as analyzeTemplateReference, L as maybeLoadToolsFromExternalFile, T as isOpenAiProvider, U as parseFileUrl, Y as getNunjucksEngine, q as extractVariablesFromTemplate, w as isGoogleProvider } from "./util-CcW4TZSn.js";
11
+ import { c as withCacheNamespace, i as getCache } from "./cache-D2MfIrzr.js";
12
12
  import { r as runPython } from "./pythonUtils-yoUkCRXx.js";
13
- import { d as validateFunctionCall } from "./util-D9xyoiGG.js";
14
- import { l as shouldGenerateRemote } from "./remoteGeneration-BlwssRVS.js";
15
- import { c as promptYesNo } from "./server-CYxCnoVw.js";
16
- import { t as OpenAiChatCompletionProvider } from "./chat-CvN2w9fY.js";
17
- import { y as validateFunctionCall$1 } from "./transform-DmSzMsCP.js";
18
- import { _ as VertexChatProvider, b as GoogleLiveProvider, n as loadApiProvider, x as AIStudioChatProvider } from "./providers-DdNIebwz.js";
13
+ import { d as validateFunctionCall } from "./util-CkLsVF3e.js";
14
+ import { l as shouldGenerateRemote } from "./remoteGeneration-CW6zHjQx.js";
15
+ import { c as promptYesNo } from "./server-DMCug-jv.js";
16
+ import { t as OpenAiChatCompletionProvider } from "./chat-PfM8xgFA.js";
17
+ import { y as validateFunctionCall$1 } from "./transform-CD9wrP31.js";
18
+ import { _ as VertexChatProvider, b as GoogleLiveProvider, n as loadApiProvider, p as MCPProvider, x as AIStudioChatProvider } from "./providers-am7xTa5w.js";
19
19
  import { a as createEmptyTokenUsage, i as createEmptyAssertions, n as accumulateResponseTokenUsage, o as normalizeTokenUsage, r as accumulateTokenUsage, t as accumulateAssertionTokenUsage } from "./tokenUsageUtils-kXKUpxyr.js";
20
20
  import { n as loadFromPackage, t as isPackagePath } from "./packageParser-C_T8xu-D.js";
21
21
  import { n as runRuby } from "./rubyUtils-BjUJ_Cj-.js";
22
- import { c as isBasicRefusal, o as getSessionId } from "./util-16aq4oHW.js";
23
- import { $ as SELECT_BEST_PROMPT, Ct as DEFAULT_ANTHROPIC_MODEL, Dt as getProviderCallExecutionContext, Et as getGradingProvider, G as matchesLlmRubric, H as matchesClosedQa, J as doRemoteGrading, K as matchesPiScore, Ot as withProviderCallExecutionContext, Q as DEFAULT_WEB_SEARCH_PROMPT, St as getDefaultProviders, Tt as getAndCheckProvider, U as matchesFactuality, V as isGraderFailure, W as matchesGEval, _t as tryParse, at as CONTEXT_RECALL_ATTRIBUTED_TOKEN, bt as loadFromJavaScriptFile, ct as CONTEXT_RELEVANCE_BAD, dt as cosineSimilarity, et as SUGGEST_PROMPTS_SYSTEM_MESSAGE, ft as dotProduct, gt as splitIntoSentences, ht as normalizeMatcherTokenUsage, it as CONTEXT_RECALL, lt as loadRubricPrompt, mt as fail, n as getGraderById, nt as CONTEXT_FAITHFULNESS_LONGFORM, ot as CONTEXT_RECALL_NOT_ATTRIBUTED_TOKEN, pt as euclideanDistance, q as matchesTrajectoryGoalSuccess, rt as CONTEXT_FAITHFULNESS_NLI_STATEMENTS, st as CONTEXT_RELEVANCE, tt as ANSWER_RELEVANCY_GENERATE, ut as renderLlmRubricPrompt, vt as coerceString, wt as callProviderWithContext, xt as processFileReference, yt as getFinalTest } from "./graders-DEz7EeRy.js";
24
- import { f as redteamProviderManager, g as createProviderRateLimitOptions, h as createRateLimitRegistry, m as TokenUsageTracker } from "./shared-BavzGCp0.js";
22
+ import { c as isBasicRefusal, o as getSessionId } from "./util-CD4LxH5h.js";
23
+ import { $ as SELECT_BEST_PROMPT, Ct as DEFAULT_ANTHROPIC_MODEL, Dt as getProviderCallExecutionContext, Et as getGradingProvider, G as matchesLlmRubric, H as matchesClosedQa, J as doRemoteGrading, K as matchesPiScore, Ot as withProviderCallExecutionContext, Q as DEFAULT_WEB_SEARCH_PROMPT, St as getDefaultProviders, Tt as getAndCheckProvider, U as matchesFactuality, V as isGraderFailure, W as matchesGEval, _t as tryParse, at as CONTEXT_RECALL_ATTRIBUTED_TOKEN, bt as loadFromJavaScriptFile, ct as CONTEXT_RELEVANCE_BAD, dt as cosineSimilarity, et as SUGGEST_PROMPTS_SYSTEM_MESSAGE, ft as dotProduct, gt as splitIntoSentences, ht as normalizeMatcherTokenUsage, it as CONTEXT_RECALL, lt as loadRubricPrompt, mt as fail, n as getGraderById, nt as CONTEXT_FAITHFULNESS_LONGFORM, ot as CONTEXT_RECALL_NOT_ATTRIBUTED_TOKEN, pt as euclideanDistance, q as matchesTrajectoryGoalSuccess, rt as CONTEXT_FAITHFULNESS_NLI_STATEMENTS, st as CONTEXT_RELEVANCE, tt as ANSWER_RELEVANCY_GENERATE, ut as renderLlmRubricPrompt, vt as coerceString, wt as callProviderWithContext, xt as processFileReference, yt as getFinalTest } from "./graders-CpUlNVnh.js";
24
+ import { f as redteamProviderManager, g as createProviderRateLimitOptions, h as createRateLimitRegistry, m as TokenUsageTracker } from "./shared-C-G3NQ1-.js";
25
25
  import { i as generateIdFromPrompt } from "./utils-CsmoLRsV.js";
26
26
  import { a as getTransformLabel, i as getTransformErrorMessage, o as transform, r as TransformInputType } from "./transform-Dou53MRF2.js";
27
27
  import { n as getTraceStore } from "./store-Bn1-Urtg.js";
28
28
  import { a as getActualPromptWithFallback, r as updateSignalFile } from "./signal-DdhkLwgQ.js";
29
- import { t as extractAndStoreBinaryData } from "./extractor-DV6WBfAi.js";
29
+ import { t as extractAndStoreBinaryData } from "./extractor-DOhjGS0m.js";
30
30
  import { i as throwIfTargetPromptExceedsMaxChars } from "./promptLength-DYfhyE9j.js";
31
- import { n as checkExfilTracking } from "./indirectWebPwn-A16xYmav.js";
31
+ import { n as checkExfilTracking } from "./indirectWebPwn-BbFMiv79.js";
32
32
  import { n as getFirstStringAttribute, r as getToolNameFromAttributes, t as TOOL_ARGUMENT_ATTRIBUTE_KEYS } from "./toolAttributes-DkzTVYQF.js";
33
- import { i as filterFiniteScores, n as renderPrompt, r as runExtensionHook, t as collectFileMetadata } from "./evaluatorHelpers-C6-aKnJe.js";
33
+ import { i as filterFiniteScores, n as renderPrompt, r as runExtensionHook, t as collectFileMetadata } from "./evaluatorHelpers-CoLW5rKU.js";
34
34
  import { AsyncResource } from "node:async_hooks";
35
35
  import chalk from "chalk";
36
36
  import { createWriteStream } from "fs";
37
37
  import path from "path";
38
38
  import os from "os";
39
+ import Ajv from "ajv";
40
+ import addFormats from "ajv-formats";
39
41
  import yaml from "js-yaml";
40
42
  import fs$1 from "fs/promises";
41
43
  import util from "util";
44
+ import dedent from "dedent";
42
45
  import { randomBytes } from "crypto";
43
46
  import { DiagConsoleLogger, DiagLogLevel, diag, propagation } from "@opentelemetry/api";
44
47
  import { globSync } from "glob";
@@ -5025,6 +5028,193 @@ function maybeEmitAzureOpenAiWarning(testSuite, tests) {
5025
5028
  return false;
5026
5029
  }
5027
5030
  //#endregion
5031
+ //#region src/redteam/mcpMaterialization.ts
5032
+ const TOOL_NAME_FIELDS = [
5033
+ "tool",
5034
+ "toolName",
5035
+ "function",
5036
+ "functionName",
5037
+ "name"
5038
+ ];
5039
+ const TOOL_ARGS_FIELDS = [
5040
+ "args",
5041
+ "arguments",
5042
+ "params",
5043
+ "parameters"
5044
+ ];
5045
+ const ajv = new Ajv({
5046
+ allErrors: true,
5047
+ strictSchema: false
5048
+ });
5049
+ addFormats(ajv);
5050
+ function parseMcpToolCall(value, allowedToolNames) {
5051
+ let parsed = value;
5052
+ if (typeof value === "string") try {
5053
+ parsed = JSON.parse(value);
5054
+ } catch {
5055
+ return;
5056
+ }
5057
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return;
5058
+ const record = parsed;
5059
+ const toolName = TOOL_NAME_FIELDS.map((field) => record[field]).find((fieldValue) => typeof fieldValue === "string" && allowedToolNames.has(fieldValue));
5060
+ if (!toolName) return;
5061
+ return {
5062
+ tool: toolName,
5063
+ args: TOOL_ARGS_FIELDS.map((field) => record[field]).find((fieldValue) => typeof fieldValue === "object" && fieldValue !== null && !Array.isArray(fieldValue)) ?? {}
5064
+ };
5065
+ }
5066
+ function validateMcpToolCall(toolCall, toolByName) {
5067
+ if (!toolCall) return false;
5068
+ const tool = toolByName.get(toolCall.tool);
5069
+ if (!tool) return false;
5070
+ try {
5071
+ return ajv.validate(tool.inputSchema ?? { type: "object" }, toolCall.args) === true;
5072
+ } catch (error) {
5073
+ logger.warn(`Failed to validate MCP tool call for ${tool.name}: ${error instanceof Error ? error.message : String(error)}`);
5074
+ return false;
5075
+ }
5076
+ }
5077
+ function stringifyToolCall(toolCall) {
5078
+ return JSON.stringify({
5079
+ tool: toolCall.tool,
5080
+ args: toolCall.args
5081
+ });
5082
+ }
5083
+ function getProviderOutputString(response) {
5084
+ if (Array.isArray(response.output)) return response.output.join("\n");
5085
+ return response.output === void 0 ? "" : String(response.output);
5086
+ }
5087
+ async function repairMcpToolCallWithProvider({ allowedToolNames, purpose, provider, toolByName, tools, value }) {
5088
+ let response;
5089
+ try {
5090
+ response = await provider.callApi(dedent`
5091
+ Convert this red team test intent into exactly one MCP tool call JSON object.
5092
+
5093
+ Return JSON only, with this exact shape:
5094
+ {"tool":"tool_name","args":{}}
5095
+
5096
+ Choose only one of these MCP tools and use its input schema:
5097
+ ${JSON.stringify(tools, null, 2)}
5098
+
5099
+ Application purpose:
5100
+ ${purpose}
5101
+
5102
+ Red team test intent:
5103
+ ${typeof value === "string" ? value : JSON.stringify(value)}
5104
+ `.trim());
5105
+ } catch (error) {
5106
+ logger.debug(`Failed to repair MCP value with provider: ${error instanceof Error ? error.message : String(error)}`);
5107
+ return;
5108
+ }
5109
+ if (response.error) {
5110
+ logger.warn(`Failed to materialize MCP value: ${response.error}`);
5111
+ return;
5112
+ }
5113
+ const parsedObjects = extractJsonObjects(getProviderOutputString(response));
5114
+ for (const parsedObject of parsedObjects) {
5115
+ const toolCall = parseMcpToolCall(parsedObject, allowedToolNames);
5116
+ if (validateMcpToolCall(toolCall, toolByName)) return toolCall;
5117
+ }
5118
+ }
5119
+ async function materializeMcpValue({ intentValue, purpose, provider, tools, value }) {
5120
+ if (tools.length === 0) return typeof value === "string" ? value : value === void 0 ? "" : JSON.stringify(value);
5121
+ const allowedToolNames = new Set(tools.map((tool) => tool.name));
5122
+ const toolByName = new Map(tools.map((tool) => [tool.name, tool]));
5123
+ const existingToolCall = parseMcpToolCall(value, allowedToolNames);
5124
+ if (existingToolCall && validateMcpToolCall(existingToolCall, toolByName)) return stringifyToolCall(existingToolCall);
5125
+ const materializationIntentValue = intentValue ?? value;
5126
+ if (!provider) throw new Error(`Failed to materialize MCP value: inference provider is required for non-JSON MCP input ${JSON.stringify(value)}`);
5127
+ const toolCall = await repairMcpToolCallWithProvider({
5128
+ allowedToolNames,
5129
+ provider,
5130
+ purpose: purpose ?? "",
5131
+ toolByName,
5132
+ tools,
5133
+ value: materializationIntentValue
5134
+ });
5135
+ if (!toolCall || !validateMcpToolCall(toolCall, toolByName)) throw new Error(`Failed to materialize MCP value: ${JSON.stringify(value)}`);
5136
+ return stringifyToolCall(toolCall);
5137
+ }
5138
+ //#endregion
5139
+ //#region src/redteam/mcpTargetProvider.ts
5140
+ const WRAPPED_MCP_PROVIDER = Symbol("wrappedMcpProvider");
5141
+ function isRedteamTest(test) {
5142
+ return Boolean(test?.metadata?.pluginId || test?.metadata?.strategyId);
5143
+ }
5144
+ function isMcpProviderWithTools(provider) {
5145
+ return provider instanceof MCPProvider && typeof provider.getAvailableTools === "function";
5146
+ }
5147
+ var RedteamMcpTargetProvider = class {
5148
+ [WRAPPED_MCP_PROVIDER] = true;
5149
+ label;
5150
+ config;
5151
+ delay;
5152
+ transform;
5153
+ inputs;
5154
+ toolsPromise;
5155
+ constructor(target) {
5156
+ this.target = target;
5157
+ this.label = target.label;
5158
+ this.config = target.config;
5159
+ this.delay = target.delay;
5160
+ this.transform = target.transform;
5161
+ this.inputs = target.inputs;
5162
+ }
5163
+ id() {
5164
+ return this.target.id();
5165
+ }
5166
+ toString() {
5167
+ return this.target.toString?.() ?? this.id();
5168
+ }
5169
+ async callApi(prompt, context, options) {
5170
+ const tools = await this.getTools();
5171
+ if (tools.length === 0) return this.target.callApi(prompt, context, options);
5172
+ try {
5173
+ const intentValue = context?.test?.metadata?.goal ?? context?.test?.metadata?.originalPrompt ?? prompt;
5174
+ const purpose = String(context?.test?.metadata?.purpose ?? "");
5175
+ let materializedPrompt;
5176
+ try {
5177
+ materializedPrompt = await materializeMcpValue({
5178
+ intentValue,
5179
+ purpose,
5180
+ tools,
5181
+ value: prompt
5182
+ });
5183
+ } catch (error) {
5184
+ logger.debug(`MCP target prompt requires inference materialization: ${error instanceof Error ? error.message : String(error)}`);
5185
+ materializedPrompt = await materializeMcpValue({
5186
+ intentValue,
5187
+ provider: await redteamProviderManager.getProvider({ jsonOnly: true }),
5188
+ purpose,
5189
+ tools,
5190
+ value: prompt
5191
+ });
5192
+ }
5193
+ const materializedContext = context ? {
5194
+ ...context,
5195
+ vars: {
5196
+ ...context.vars,
5197
+ prompt: materializedPrompt
5198
+ }
5199
+ } : void 0;
5200
+ return this.target.callApi(materializedPrompt, materializedContext, options);
5201
+ } catch (error) {
5202
+ return { error: `Failed to materialize MCP target prompt: ${error instanceof Error ? error.message : String(error)}` };
5203
+ }
5204
+ }
5205
+ async cleanup() {
5206
+ await this.target.cleanup?.();
5207
+ }
5208
+ getTools() {
5209
+ this.toolsPromise ??= this.target.getAvailableTools();
5210
+ return this.toolsPromise;
5211
+ }
5212
+ };
5213
+ function maybeWrapMcpProviderForRedteam(provider, test) {
5214
+ if (!isRedteamTest(test) || provider[WRAPPED_MCP_PROVIDER]) return provider;
5215
+ return isMcpProviderWithTools(provider) ? new RedteamMcpTargetProvider(provider) : provider;
5216
+ }
5217
+ //#endregion
5028
5218
  //#region src/scheduler/providerCallQueue.ts
5029
5219
  var ProviderGroupedCallQueue = class {
5030
5220
  jobs = [];
@@ -5834,12 +6024,13 @@ async function callProviderForRunEval({ abortSignal, evalId, evaluateOptions, fi
5834
6024
  };
5835
6025
  }
5836
6026
  async function callActiveProvider({ abortSignal, evalId, filters, promptForRender, provider, rateLimitRegistry, renderedPrompt, repeatIndex, test, traceContext, vars }) {
5837
- const activeProvider = isApiProvider(test.provider) ? test.provider : provider;
6027
+ const originalProvider = maybeWrapMcpProviderForRedteam(provider, test);
6028
+ const activeProvider = maybeWrapMcpProviderForRedteam(isApiProvider(test.provider) ? test.provider : originalProvider, test);
5838
6029
  logger.debug(`Provider type: ${activeProvider.id()}`);
5839
6030
  const callApiContext = buildCallApiContext({
5840
6031
  evalId,
5841
6032
  filters,
5842
- originalProvider: provider,
6033
+ originalProvider,
5843
6034
  promptForRender,
5844
6035
  repeatIndex,
5845
6036
  test,
@@ -6565,7 +6756,7 @@ async function resolveDefaultTestProvider(defaultTest, testCase) {
6565
6756
  const defaultProvider = defaultTest.provider;
6566
6757
  if (isApiProvider(defaultProvider)) return defaultProvider;
6567
6758
  if (typeof defaultProvider === "object" && defaultProvider.id) {
6568
- const { loadApiProvider } = await import("./providers-xrARCHcC.js");
6759
+ const { loadApiProvider } = await import("./providers-BIgLuX4Z.js");
6569
6760
  return loadApiProvider(typeof defaultProvider.id === "function" ? defaultProvider.id() : defaultProvider.id, { options: defaultProvider });
6570
6761
  }
6571
6762
  return defaultProvider;
@@ -6725,7 +6916,7 @@ function buildRepeatCacheContextByTestIdx(runEvalOptions) {
6725
6916
  async function filterCompletedResumeSteps(runEvalOptions, evalRecord) {
6726
6917
  if (!state.resume || !evalRecord.persisted) return;
6727
6918
  try {
6728
- const { default: EvalResult } = await import("./evalResult-uL1BStGk.js");
6919
+ const { default: EvalResult } = await import("./evalResult-B6Jpy3kJ.js");
6729
6920
  const completedPairs = await EvalResult.getCompletedIndexPairs(evalRecord.id, { excludeErrors: state.retryMode });
6730
6921
  const originalCount = runEvalOptions.length;
6731
6922
  for (let i = runEvalOptions.length - 1; i >= 0; i--) {
@@ -7835,4 +8026,4 @@ function evaluate(testSuite, evalRecord, options) {
7835
8026
  //#endregion
7836
8027
  export { generateVarCombinations as a, doesPromptRefMatch as c, runAssertions as d, formatVarsForDisplay as i, warnEmptyFilterRange as l, PromptSuggestionsRejectedError as n, isAllowedPrompt as o, evaluate as r, accumulateNamedMetric as s, ProgressBarManager as t, readAssertions as u };
7837
8028
 
7838
- //# sourceMappingURL=evaluator-C_gCkBe3.js.map
8029
+ //# sourceMappingURL=evaluator-DbOsHSRe.js.map
@@ -1,12 +1,12 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-D_mwlA32.cjs");
2
2
  const require_logger = require("./logger-DPITYeiW.cjs");
3
3
  const require_invariant = require("./invariant-QtnLD03y.cjs");
4
- const require_fetch = require("./fetch-OePjzUmA.cjs");
4
+ const require_fetch = require("./fetch-C7yU9CNr.cjs");
5
5
  const require_fileExtensions = require("./fileExtensions-DB9eTs4y.cjs");
6
6
  const require_esm = require("./esm-BXQgvlCe.cjs");
7
- const require_util = require("./util-DJFl6JZF.cjs");
7
+ const require_util = require("./util-tFLdovkA.cjs");
8
8
  const require_pythonUtils = require("./pythonUtils-Dm5aZDp2.cjs");
9
- const require_telemetry = require("./telemetry-Be4rklbJ.cjs");
9
+ const require_telemetry = require("./telemetry-hDovhwWp.cjs");
10
10
  const require_packageParser = require("./packageParser-ClroutLT.cjs");
11
11
  const require_transform = require("./transform-vjEQU-TM.cjs");
12
12
  let fs_promises = require("fs/promises");
@@ -533,4 +533,4 @@ Object.defineProperty(exports, "runExtensionHook", {
533
533
  }
534
534
  });
535
535
 
536
- //# sourceMappingURL=evaluatorHelpers-BVvi8tWH.cjs.map
536
+ //# sourceMappingURL=evaluatorHelpers-CaaC50RB.cjs.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { E as getEnvBool, P as state, c as logger, k as getEnvString } from "./logger-DNHkR_3S.js";
3
- import { r as fetchWithProxy } from "./fetch-BBa1Lxgp.js";
3
+ import { r as fetchWithProxy } from "./fetch-B1Rb0VdL.js";
4
4
  import { t as invariant } from "./invariant-BtWWVVhl.js";
5
- import { n as telemetry } from "./telemetry-Bh3HJU7r.js";
5
+ import { n as telemetry } from "./telemetry-C7v0I4YX.js";
6
6
  import { a as isVideoFile, i as isJavascriptFile, n as isAudioFile, r as isImageFile } from "./fileExtensions-PGPK8Wcw.js";
7
7
  import { r as importModule } from "./esm-ClRKphVo.js";
8
- import { G as renderVarsInObject, Y as getNunjucksEngine, q as extractVariablesFromTemplate } from "./util-DHG9r5sC.js";
8
+ import { G as renderVarsInObject, Y as getNunjucksEngine, q as extractVariablesFromTemplate } from "./util-CcW4TZSn.js";
9
9
  import { r as runPython } from "./pythonUtils-yoUkCRXx.js";
10
10
  import { n as loadFromPackage, t as isPackagePath } from "./packageParser-C_T8xu-D.js";
11
11
  import { o as transform } from "./transform-Dou53MRF2.js";
@@ -507,4 +507,4 @@ async function runExtensionHook(extensions, hookName, context) {
507
507
  //#endregion
508
508
  export { filterFiniteScores as i, renderPrompt as n, runExtensionHook as r, collectFileMetadata as t };
509
509
 
510
- //# sourceMappingURL=evaluatorHelpers-C6-aKnJe.js.map
510
+ //# sourceMappingURL=evaluatorHelpers-CoLW5rKU.js.map
@@ -1,11 +1,11 @@
1
1
  import { A as state, C as getEnvBool, E as getEnvString, o as logger } from "./logger-2ZstxKQf.js";
2
2
  import { t as invariant } from "./invariant-Ddh24eXh.js";
3
- import { t as fetchWithProxy } from "./fetch-CFIU30wy.js";
3
+ import { t as fetchWithProxy } from "./fetch-BNUDixbE.js";
4
4
  import { a as isVideoFile, i as isJavascriptFile, n as isAudioFile, r as isImageFile } from "./fileExtensions-CvD3YVfM.js";
5
5
  import { r as importModule } from "./esm-D78sHVp9.js";
6
- import { B as getNunjucksEngine, I as renderVarsInObject, R as extractVariablesFromTemplate } from "./util-CnqjxsAd.js";
6
+ import { B as getNunjucksEngine, I as renderVarsInObject, R as extractVariablesFromTemplate } from "./util-BTAyQmdN.js";
7
7
  import { r as runPython } from "./pythonUtils-E3AlITsZ.js";
8
- import { t as telemetry } from "./telemetry-B-NTbvDj.js";
8
+ import { t as telemetry } from "./telemetry-CTYOje0d.js";
9
9
  import { n as loadFromPackage, t as isPackagePath } from "./packageParser-D0SUUwqU.js";
10
10
  import { o as transform } from "./transform-5CliVIgB.js";
11
11
  import fs from "fs/promises";
@@ -506,4 +506,4 @@ async function runExtensionHook(extensions, hookName, context) {
506
506
  //#endregion
507
507
  export { filterFiniteScores as i, renderPrompt as n, runExtensionHook as r, collectFileMetadata as t };
508
508
 
509
- //# sourceMappingURL=evaluatorHelpers-RQo-m90b.js.map
509
+ //# sourceMappingURL=evaluatorHelpers-DTtYkrGO.js.map
@@ -1,7 +1,9 @@
1
1
  import { C as getEnvBool, o as logger } from "./logger-2ZstxKQf.js";
2
- import { M as cloudConfig } from "./fetch-CFIU30wy.js";
3
- import { s as isLoggedIntoCloud } from "./accounts-D4iTShVh.js";
4
- import { n as recordBlobReference, r as storeBlob } from "./blobs-7T2OXYkC.js";
2
+ import { M as cloudConfig } from "./fetch-BNUDixbE.js";
3
+ import { s as isLoggedIntoCloud } from "./accounts-BGs8AMhG.js";
4
+ import { n as sha256 } from "./createHash-CM2Vkqac.js";
5
+ import { a as BLOB_MIN_SIZE, n as recordBlobReference, o as BLOB_SCHEME, r as storeBlob } from "./blobs-B8d9jKvz.js";
6
+ import { XMLParser, XMLValidator } from "fast-xml-parser";
5
7
  //#region src/blobs/remoteUpload.ts
6
8
  function buildRemoteUploadTarget() {
7
9
  if (getEnvBool("PROMPTFOO_DISABLE_SHARING")) return null;
@@ -28,7 +30,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
28
30
  const target = buildRemoteUploadTarget();
29
31
  if (!target) return null;
30
32
  try {
31
- const { fetchWithProxy } = await import("./fetch-CFIU30wy.js").then((n) => n.i);
33
+ const { fetchWithProxy } = await import("./fetch-BNUDixbE.js").then((n) => n.i);
32
34
  const response = await fetchWithProxy(target.url, {
33
35
  method: "POST",
34
36
  headers: {
@@ -86,9 +88,9 @@ function extractBase64(value) {
86
88
  return null;
87
89
  }
88
90
  }
89
- function shouldExternalize(buffer) {
91
+ function shouldExternalize(buffer, minSizeBytes = BLOB_MIN_SIZE) {
90
92
  const size = buffer.length;
91
- return size >= 1024 && size <= 52428800;
93
+ return size >= minSizeBytes && size <= 52428800;
92
94
  }
93
95
  function getKindFromMimeType(mimeType) {
94
96
  return mimeType.startsWith("audio/") ? "audio" : "image";
@@ -135,9 +137,9 @@ function parseBinary(base64OrDataUrl, defaultMimeType) {
135
137
  return null;
136
138
  }
137
139
  }
138
- async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind) {
140
+ async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind, minSizeBytes = BLOB_MIN_SIZE) {
139
141
  const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
140
- if (!parsed || !shouldExternalize(parsed.buffer)) return null;
142
+ if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
141
143
  if (!isBlobStorageEnabled()) return null;
142
144
  const mimeType = parsed.mimeType || "application/octet-stream";
143
145
  const { ref } = await storeBlob(parsed.buffer, mimeType, {
@@ -161,13 +163,13 @@ async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, k
161
163
  }
162
164
  function createStoreOnce(blobContext) {
163
165
  const cache = /* @__PURE__ */ new Map();
164
- return async (base64OrDataUrl, defaultMimeType, location, kind) => {
166
+ return async (base64OrDataUrl, defaultMimeType, location, kind, minSizeBytes) => {
165
167
  const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
166
- if (!parsed || !shouldExternalize(parsed.buffer)) return null;
168
+ if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
167
169
  const cacheKey = `${kind}:${parsed.buffer.toString("base64")}`;
168
170
  const existing = cache.get(cacheKey);
169
171
  if (existing) return existing;
170
- const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind);
172
+ const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind, minSizeBytes);
171
173
  cache.set(cacheKey, pendingStore);
172
174
  try {
173
175
  const stored = await pendingStore;
@@ -179,6 +181,57 @@ function createStoreOnce(blobContext) {
179
181
  }
180
182
  };
181
183
  }
184
+ function getRawSvgOutputPreview(output) {
185
+ const trimmed = output.trim();
186
+ if (!trimmed.startsWith("<")) return null;
187
+ if (XMLValidator.validate(trimmed) !== true) return null;
188
+ try {
189
+ const parsed = new XMLParser({ ignoreAttributes: false }).parse(trimmed);
190
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || !("svg" in parsed)) return null;
191
+ } catch {
192
+ return null;
193
+ }
194
+ const buffer = Buffer.from(trimmed, "utf8");
195
+ return {
196
+ dataUrl: `data:image/svg+xml;base64,${buffer.toString("base64")}`,
197
+ uri: `${BLOB_SCHEME}${sha256(buffer)}`
198
+ };
199
+ }
200
+ function appendMetadataBlobUri(metadata, uri) {
201
+ const existingBlobUris = Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : [];
202
+ return {
203
+ ...metadata || {},
204
+ blobUris: [...new Set([...existingBlobUris, uri])]
205
+ };
206
+ }
207
+ async function storeRawSvgOutputPreview(output, metadata, storeOnce, context) {
208
+ if (typeof output !== "string") return {
209
+ metadata,
210
+ mutated: false
211
+ };
212
+ const preview = getRawSvgOutputPreview(output);
213
+ if (!preview) return {
214
+ metadata,
215
+ mutated: false
216
+ };
217
+ if ((Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : []).includes(preview.uri)) return {
218
+ metadata,
219
+ mutated: false
220
+ };
221
+ const stored = await storeOnce(preview.dataUrl, "image/svg+xml", "response.output", "image", 0);
222
+ if (!stored) return {
223
+ metadata,
224
+ mutated: false
225
+ };
226
+ logger.debug("[BlobExtractor] Stored raw SVG output blob", {
227
+ ...context,
228
+ hash: stored.hash
229
+ });
230
+ return {
231
+ metadata: appendMetadataBlobUri(metadata, stored.uri),
232
+ mutated: true
233
+ };
234
+ }
182
235
  async function externalizeDataUrls(value, storeOnce, location) {
183
236
  if (typeof value === "string") {
184
237
  if (!isDataUrl(value)) return {
@@ -312,6 +365,11 @@ async function extractAndStoreBinaryData(response, context) {
312
365
  }
313
366
  return img;
314
367
  }));
368
+ const rawSvgPreview = await storeRawSvgOutputPreview(response.output, next.metadata || response.metadata, storeOnce, context);
369
+ if (rawSvgPreview.mutated) {
370
+ next.metadata = rawSvgPreview.metadata;
371
+ mutated = true;
372
+ }
315
373
  const turns = response.turns;
316
374
  if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
317
375
  if (turn?.audio?.data && typeof turn.audio.data === "string") {
@@ -429,4 +487,4 @@ async function recordExistingBlobReferences(value, context, location) {
429
487
  //#endregion
430
488
  export { isBlobStorageEnabled as n, shouldAttemptRemoteBlobUpload as r, extractAndStoreBinaryData as t };
431
489
 
432
- //# sourceMappingURL=extractor-B1hELWwJ.js.map
490
+ //# sourceMappingURL=extractor-BIqe0lMN.js.map
@@ -1,7 +1,10 @@
1
+ require("./rolldown-runtime-D_mwlA32.cjs");
1
2
  const require_logger = require("./logger-DPITYeiW.cjs");
2
- const require_fetch = require("./fetch-OePjzUmA.cjs");
3
- const require_accounts = require("./accounts-5Sf1PCNo.cjs");
4
- const require_blobs = require("./blobs-DQ6pIlJQ.cjs");
3
+ const require_fetch = require("./fetch-C7yU9CNr.cjs");
4
+ const require_accounts = require("./accounts-C6NiTdum.cjs");
5
+ const require_createHash = require("./createHash-CF-N1FBc.cjs");
6
+ const require_blobs = require("./blobs-BcpoigIU.cjs");
7
+ let fast_xml_parser = require("fast-xml-parser");
5
8
  //#region src/blobs/remoteUpload.ts
6
9
  function buildRemoteUploadTarget() {
7
10
  if (require_logger.getEnvBool("PROMPTFOO_DISABLE_SHARING")) return null;
@@ -28,7 +31,7 @@ async function uploadBlobRemote(buffer, mimeType, context) {
28
31
  const target = buildRemoteUploadTarget();
29
32
  if (!target) return null;
30
33
  try {
31
- const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-OePjzUmA.cjs")).then((n) => n.fetch_exports);
34
+ const { fetchWithProxy } = await Promise.resolve().then(() => require("./fetch-C7yU9CNr.cjs")).then((n) => n.fetch_exports);
32
35
  const response = await fetchWithProxy(target.url, {
33
36
  method: "POST",
34
37
  headers: {
@@ -86,9 +89,9 @@ function extractBase64(value) {
86
89
  return null;
87
90
  }
88
91
  }
89
- function shouldExternalize(buffer) {
92
+ function shouldExternalize(buffer, minSizeBytes = require_blobs.BLOB_MIN_SIZE) {
90
93
  const size = buffer.length;
91
- return size >= 1024 && size <= 52428800;
94
+ return size >= minSizeBytes && size <= 52428800;
92
95
  }
93
96
  function getKindFromMimeType(mimeType) {
94
97
  return mimeType.startsWith("audio/") ? "audio" : "image";
@@ -135,9 +138,9 @@ function parseBinary(base64OrDataUrl, defaultMimeType) {
135
138
  return null;
136
139
  }
137
140
  }
138
- async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind) {
141
+ async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, kind, minSizeBytes = require_blobs.BLOB_MIN_SIZE) {
139
142
  const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
140
- if (!parsed || !shouldExternalize(parsed.buffer)) return null;
143
+ if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
141
144
  if (!isBlobStorageEnabled()) return null;
142
145
  const mimeType = parsed.mimeType || "application/octet-stream";
143
146
  const { ref } = await require_blobs.storeBlob(parsed.buffer, mimeType, {
@@ -161,13 +164,13 @@ async function maybeStore(base64OrDataUrl, defaultMimeType, context, location, k
161
164
  }
162
165
  function createStoreOnce(blobContext) {
163
166
  const cache = /* @__PURE__ */ new Map();
164
- return async (base64OrDataUrl, defaultMimeType, location, kind) => {
167
+ return async (base64OrDataUrl, defaultMimeType, location, kind, minSizeBytes) => {
165
168
  const parsed = parseBinary(base64OrDataUrl, defaultMimeType);
166
- if (!parsed || !shouldExternalize(parsed.buffer)) return null;
169
+ if (!parsed || !shouldExternalize(parsed.buffer, minSizeBytes)) return null;
167
170
  const cacheKey = `${kind}:${parsed.buffer.toString("base64")}`;
168
171
  const existing = cache.get(cacheKey);
169
172
  if (existing) return existing;
170
- const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind);
173
+ const pendingStore = maybeStore(base64OrDataUrl, defaultMimeType, blobContext, location, kind, minSizeBytes);
171
174
  cache.set(cacheKey, pendingStore);
172
175
  try {
173
176
  const stored = await pendingStore;
@@ -179,6 +182,57 @@ function createStoreOnce(blobContext) {
179
182
  }
180
183
  };
181
184
  }
185
+ function getRawSvgOutputPreview(output) {
186
+ const trimmed = output.trim();
187
+ if (!trimmed.startsWith("<")) return null;
188
+ if (fast_xml_parser.XMLValidator.validate(trimmed) !== true) return null;
189
+ try {
190
+ const parsed = new fast_xml_parser.XMLParser({ ignoreAttributes: false }).parse(trimmed);
191
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || !("svg" in parsed)) return null;
192
+ } catch {
193
+ return null;
194
+ }
195
+ const buffer = Buffer.from(trimmed, "utf8");
196
+ return {
197
+ dataUrl: `data:image/svg+xml;base64,${buffer.toString("base64")}`,
198
+ uri: `${require_blobs.BLOB_SCHEME}${require_createHash.sha256(buffer)}`
199
+ };
200
+ }
201
+ function appendMetadataBlobUri(metadata, uri) {
202
+ const existingBlobUris = Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : [];
203
+ return {
204
+ ...metadata || {},
205
+ blobUris: [...new Set([...existingBlobUris, uri])]
206
+ };
207
+ }
208
+ async function storeRawSvgOutputPreview(output, metadata, storeOnce, context) {
209
+ if (typeof output !== "string") return {
210
+ metadata,
211
+ mutated: false
212
+ };
213
+ const preview = getRawSvgOutputPreview(output);
214
+ if (!preview) return {
215
+ metadata,
216
+ mutated: false
217
+ };
218
+ if ((Array.isArray(metadata?.blobUris) ? metadata.blobUris.filter((value) => typeof value === "string") : []).includes(preview.uri)) return {
219
+ metadata,
220
+ mutated: false
221
+ };
222
+ const stored = await storeOnce(preview.dataUrl, "image/svg+xml", "response.output", "image", 0);
223
+ if (!stored) return {
224
+ metadata,
225
+ mutated: false
226
+ };
227
+ require_logger.logger.debug("[BlobExtractor] Stored raw SVG output blob", {
228
+ ...context,
229
+ hash: stored.hash
230
+ });
231
+ return {
232
+ metadata: appendMetadataBlobUri(metadata, stored.uri),
233
+ mutated: true
234
+ };
235
+ }
182
236
  async function externalizeDataUrls(value, storeOnce, location) {
183
237
  if (typeof value === "string") {
184
238
  if (!isDataUrl(value)) return {
@@ -312,6 +366,11 @@ async function extractAndStoreBinaryData(response, context) {
312
366
  }
313
367
  return img;
314
368
  }));
369
+ const rawSvgPreview = await storeRawSvgOutputPreview(response.output, next.metadata || response.metadata, storeOnce, context);
370
+ if (rawSvgPreview.mutated) {
371
+ next.metadata = rawSvgPreview.metadata;
372
+ mutated = true;
373
+ }
315
374
  const turns = response.turns;
316
375
  if (Array.isArray(turns)) next.turns = await Promise.all(turns.map(async (turn, idx) => {
317
376
  if (turn?.audio?.data && typeof turn.audio.data === "string") {
@@ -446,4 +505,4 @@ Object.defineProperty(exports, "shouldAttemptRemoteBlobUpload", {
446
505
  }
447
506
  });
448
507
 
449
- //# sourceMappingURL=extractor-_E41W0Fl.cjs.map
508
+ //# sourceMappingURL=extractor-CUVurbDW.cjs.map