promptfoo 0.121.4 → 0.121.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/dist/src/{ListApp-DQkFNqE9.js → ListApp-DLmM02JS.js} +1 -1
  2. package/dist/src/{accounts-DhMYUUbu.js → accounts-Ca7WIoPY.js} +12 -7
  3. package/dist/src/{accounts-F9d_5sMC.js → accounts-CjFnOPmb.js} +14 -9
  4. package/dist/src/{accounts-Dy17bs4D.cjs → accounts-CmWzeD2d.cjs} +16 -10
  5. package/dist/src/{accounts-DdJ2pHMI.js → accounts-DanM1wq_.js} +13 -8
  6. package/dist/src/{agentic-utils-qFlm6zes.js → agentic-utils-CJ0j3fBi.js} +3 -3
  7. package/dist/src/{agentic-utils-w68v6_Dz.js → agentic-utils-DDEGRV9v.js} +3 -3
  8. package/dist/src/{agentic-utils-BpX5b23w.cjs → agentic-utils-DvPWSUpb.cjs} +8 -7
  9. package/dist/src/{agentic-utils-P172hM8B.js → agentic-utils-TxUEMPYS.js} +2 -2
  10. package/dist/src/{agents-BahDpe5G.cjs → agents-B4sRuXg3.cjs} +7 -6
  11. package/dist/src/{agents-pQeBEXMm.js → agents-B8q7h_ek.js} +5 -5
  12. package/dist/src/{agents-CgaMXvLM.js → agents-CBgJvRkB.js} +21 -10
  13. package/dist/src/{agents-C-R_jfzI.js → agents-CYn2n3QP.js} +4 -4
  14. package/dist/src/{agents-8FDnTriG.js → agents-D-vDNFx4.js} +21 -10
  15. package/dist/src/{agents-aYPQLf8W.js → agents-LrHuQqr1.js} +20 -9
  16. package/dist/src/{agents-DJ35I3Nt.js → agents-QGg76OF-.js} +5 -5
  17. package/dist/src/{agents-D7-HGxUj.cjs → agents-eHZ9nlgA.cjs} +21 -10
  18. package/dist/src/{aimlapi-sgYnkE54.js → aimlapi-CJEbQ0o6.js} +7 -7
  19. package/dist/src/{aimlapi-BD6J9oKt.js → aimlapi-D5HXzZ0s.js} +6 -6
  20. package/dist/src/{aimlapi-qcK4OT55.cjs → aimlapi-T6HGNxNe.cjs} +7 -7
  21. package/dist/src/{aimlapi-BCq3MHeL.js → aimlapi-eYv3a_DK.js} +7 -7
  22. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -1
  23. package/dist/src/app/assets/Report-BNHJKN35.js +1 -0
  24. package/dist/src/app/assets/index-BnT6P6sF.js +388 -0
  25. package/dist/src/app/assets/index-yhM8y1PP.css +1 -0
  26. package/dist/src/app/assets/{scroll-timeline-D9IT_e8Z.js → scroll-timeline-RpeTwOvs.js} +1 -1
  27. package/dist/src/app/assets/sync-5gq6fmG4.js +4 -0
  28. package/dist/src/app/assets/vendor-charts-BL9OMNU7.js +36 -0
  29. package/dist/src/app/assets/{vendor-markdown-Ch00wnNI.js → vendor-markdown-BYsQqn7Z.js} +10 -10
  30. package/dist/src/app/assets/{vendor-react-CVvmk1UB.js → vendor-react-CqWgVW6T.js} +2 -2
  31. package/dist/src/app/assets/{vendor-utils-BnEYbx2Q.js → vendor-utils-BHPO71pu.js} +1 -1
  32. package/dist/src/app/index.html +31 -6
  33. package/dist/src/{audio-COrn8rM6.js → audio-BqnRvcWG.js} +3 -3
  34. package/dist/src/{audio-DcVKoInv.js → audio-CPMtV1yR.js} +4 -4
  35. package/dist/src/{audio-B7izf48x.js → audio-DyiebVB3.js} +4 -4
  36. package/dist/src/{audio-BQtNuYBj.cjs → audio-FnxbEnSE.cjs} +4 -4
  37. package/dist/src/authoritativeMarkupInjection-BZIywVjG.js +74 -0
  38. package/dist/src/authoritativeMarkupInjection-DyAXAsSr.js +75 -0
  39. package/dist/src/authoritativeMarkupInjection-F2gBw0lN.cjs +74 -0
  40. package/dist/src/authoritativeMarkupInjection-QEQmFS83.js +74 -0
  41. package/dist/src/{base-PYJvBE1i.js → base-CKLo890h.js} +4 -3
  42. package/dist/src/{base-fZ9wgg50.js → base-Co80MMCi.js} +5 -4
  43. package/dist/src/{base-D-670DX8.cjs → base-DGJW48uz.cjs} +5 -4
  44. package/dist/src/{base-yrI1Yal4.js → base-E9I8zXjz.js} +5 -4
  45. package/dist/src/bestOfN-B3wNzjSB.js +137 -0
  46. package/dist/src/bestOfN-BBsO41z4.js +136 -0
  47. package/dist/src/bestOfN-CAwmg5UL.cjs +140 -0
  48. package/dist/src/bestOfN-_kTi8Bxe.js +136 -0
  49. package/dist/src/{blobs-D2FAd1Q5.cjs → blobs-B0977K1O.cjs} +7 -6
  50. package/dist/src/{blobs-BCZavS8s.js → blobs-CeFdPn_T.js} +3 -3
  51. package/dist/src/{blobs-BQWqnnvL.js → blobs-DODuTK-a.js} +3 -3
  52. package/dist/src/{blobs-C-F78Kfn.js → blobs-Dwef1Ao1.js} +2 -2
  53. package/dist/src/{cache-BIyPcp5v.cjs → cache-CPGUA4Yl.cjs} +135 -25
  54. package/dist/src/cache-Cf7b4pWE.js +3 -0
  55. package/dist/src/{cache-D5NZmMiT.js → cache-DIXbtkNO.js} +125 -10
  56. package/dist/src/{cache-mb7c8hbp.js → cache-DpPWrkTE.js} +128 -12
  57. package/dist/src/{cache-C4Xb-hNb.js → cache-roFAE0cI.js} +126 -11
  58. package/dist/src/{chat-I9izLm49.js → chat-CUCorGiL.js} +12 -12
  59. package/dist/src/{chat-BPXSW8Bv.cjs → chat-DG1wG4w0.cjs} +6 -6
  60. package/dist/src/{chat-BfPaS15_.js → chat-Dabu84Br.js} +12 -12
  61. package/dist/src/{chat-Dr3DUQ0D.js → chat-DqUFcWI0.js} +12 -12
  62. package/dist/src/{chat-CclRbxGf.cjs → chat-DxTDQ83C.cjs} +14 -13
  63. package/dist/src/{chat-MKxMnZJZ.js → chat-GmlolEwo.js} +4 -4
  64. package/dist/src/{chat-0bwXjVP0.js → chat-TP8Qifkh.js} +6 -6
  65. package/dist/src/{chat-mW0ORo8G.js → chat-iwaM5UTQ.js} +6 -6
  66. package/dist/src/{chatkit-zUIVoDos.js → chatkit-B6DWi70Q.js} +4 -4
  67. package/dist/src/{chatkit-BoWoSgXl.cjs → chatkit-BYveR48_.cjs} +6 -5
  68. package/dist/src/{chatkit-Cv6AhukM.js → chatkit-fARZwEfV.js} +3 -3
  69. package/dist/src/{chatkit-CJnHRRMM.js → chatkit-lb6FK02w.js} +4 -4
  70. package/dist/src/{claude-agent-sdk-Dtq_L-Sc.js → claude-agent-sdk-BQNp_y-F.js} +212 -67
  71. package/dist/src/{claude-agent-sdk-BQNuLaAK.js → claude-agent-sdk-D5Jl0SDh.js} +212 -67
  72. package/dist/src/{claude-agent-sdk-CPJo3dBQ.cjs → claude-agent-sdk-DH416NBD.cjs} +218 -72
  73. package/dist/src/{claude-agent-sdk-nfAIcxNf.js → claude-agent-sdk-x1XJ1-pU.js} +212 -67
  74. package/dist/src/{cloud-DQZ5sVjW.js → cloud-D3DiFqH6.js} +3 -3
  75. package/dist/src/cloud-p96PA4MH.js +3 -0
  76. package/dist/src/{cloudflare-ai-BIB567w6.js → cloudflare-ai-B6NVI3ax.js} +4 -4
  77. package/dist/src/{cloudflare-ai-Dl3N9OVD.cjs → cloudflare-ai-CEAW-xQa.cjs} +6 -6
  78. package/dist/src/{cloudflare-ai-DlKr0rY7.js → cloudflare-ai-RFSojyXG.js} +6 -6
  79. package/dist/src/{cloudflare-ai-DGLte7Py.js → cloudflare-ai-r4tbYmWU.js} +6 -6
  80. package/dist/src/{cloudflare-gateway-CiIZHU0Q.js → cloudflare-gateway-BCkLouto.js} +5 -5
  81. package/dist/src/{cloudflare-gateway-DI1HNP5F.js → cloudflare-gateway-BaZ4insB.js} +3 -3
  82. package/dist/src/{cloudflare-gateway-BDZrYydE.js → cloudflare-gateway-CF-Vb-2Z.js} +5 -5
  83. package/dist/src/{cloudflare-gateway-BYDp495F.cjs → cloudflare-gateway-TJMLBj6I.cjs} +5 -5
  84. package/dist/src/codex-app-server-B8KHEiF4.js +1915 -0
  85. package/dist/src/codex-app-server-CnrLBCeA.cjs +1921 -0
  86. package/dist/src/codex-app-server-DIXZ230V.js +1915 -0
  87. package/dist/src/codex-app-server-Dd22dC_N.js +1916 -0
  88. package/dist/src/{codex-sdk-CpqiOqDO.js → codex-sdk-B6Wah8Pa.js} +6 -6
  89. package/dist/src/codex-sdk-BGjVAk23.js +3 -0
  90. package/dist/src/{codex-sdk-C2_M2pl_.cjs → codex-sdk-CFF6gUyi.cjs} +18 -10
  91. package/dist/src/{codex-sdk-Rtky3M4I.js → codex-sdk-CmQABzV3.js} +6 -6
  92. package/dist/src/{codex-sdk-CErXn7qh.js → codex-sdk-D2d54RL8.js} +5 -5
  93. package/dist/src/{cometapi-CtJ-mS8R.js → cometapi-Bu9B8NUY.js} +8 -8
  94. package/dist/src/{cometapi-DT-jlVCB.js → cometapi-CtzNCHKu.js} +7 -7
  95. package/dist/src/{cometapi-UVOryo4W.cjs → cometapi-DHCDlQUI.cjs} +8 -8
  96. package/dist/src/{cometapi-BUlt_ELa.js → cometapi-OBILPLlu.js} +8 -8
  97. package/dist/src/{completion-HUe8wDhZ.js → completion-CO2e1_62.js} +6 -6
  98. package/dist/src/{completion-BozdoXba.cjs → completion-CSYfl2cd.cjs} +6 -6
  99. package/dist/src/{completion-x0a_c2y1.js → completion-DZNxcyfG.js} +6 -6
  100. package/dist/src/{completion-Dnxn7E-j.js → completion-sNvCLTAP.js} +5 -5
  101. package/dist/src/constants-BjJV0cRr.js +6 -0
  102. package/dist/src/constants-DH5XYLKZ.js +7 -0
  103. package/dist/src/constants-DZGEFLsu.js +6 -0
  104. package/dist/src/constants-a2kYssQk.cjs +11 -0
  105. package/dist/src/{createHash-4gFQpDDv.js → createHash-BtbSX3mj.js} +1 -1
  106. package/dist/src/{createHash-CwDVU5xr.js → createHash-CGVzWdjj.js} +1 -1
  107. package/dist/src/{createHash-B7KvgoOD.cjs → createHash-CSiqnK5P.cjs} +2 -2
  108. package/dist/src/{createHash-ChI45QR1.js → createHash-CgRvs4Fn.js} +1 -1
  109. package/dist/src/crescendo-BXEJK_bi.cjs +704 -0
  110. package/dist/src/crescendo-CU_Y2i-m.js +702 -0
  111. package/dist/src/crescendo-J1Xx4_zb.js +703 -0
  112. package/dist/src/crescendo-QiaSLW0d.js +701 -0
  113. package/dist/src/custom-BJfP00Bh.js +619 -0
  114. package/dist/src/custom-CZVn-1-r.js +620 -0
  115. package/dist/src/custom-Cqia7M0D.cjs +621 -0
  116. package/dist/src/custom-notggYVl.js +618 -0
  117. package/dist/src/{docker-DCgsveLD.js → docker-4D1eL6Gq.js} +6 -6
  118. package/dist/src/{docker-ClnmCf1Z.js → docker-BBv1WUDu.js} +5 -5
  119. package/dist/src/{docker-DS4_Osau.cjs → docker-D06JUoe2.cjs} +6 -6
  120. package/dist/src/{docker-CQmlA2NU.js → docker-DdJQBxK9.js} +6 -6
  121. package/dist/src/{embedding-D3xTseo7.js → embedding--UZVe4_7.js} +6 -6
  122. package/dist/src/{embedding-I45KG3o7.cjs → embedding-BbrwopfX.cjs} +6 -6
  123. package/dist/src/{embedding-nFbumxcv.js → embedding-Bi3rxrZF.js} +5 -5
  124. package/dist/src/{embedding-DD9wa3ae.js → embedding-C251p1-8.js} +6 -6
  125. package/dist/src/{errors-Cw810C93.js → errors-9PcUL8BC.js} +1 -1
  126. package/dist/src/{esm-Dh4dOLlt.js → esm-B6whoAcf.js} +2 -2
  127. package/dist/src/{esm-CtEPLdAj.cjs → esm-BIKakvNa.cjs} +8 -7
  128. package/dist/src/{esm-C7PnfdF8.js → esm-BTK1W7lG.js} +1 -1
  129. package/dist/src/{esm-tVgYPY-f.js → esm-Bexx2PFc.js} +2 -2
  130. package/dist/src/{eval-u4UVafl6.js → eval-0VRANImH.js} +21 -21
  131. package/dist/src/{eval-CzJFfFO9.js → eval-DscR5iOM.js} +1 -1
  132. package/dist/src/{evalResult-Bgm9ZH31.js → evalResult-2RRJvFyB.js} +41 -16
  133. package/dist/src/{evalResult-KZqXl4XP.cjs → evalResult-CvtS8h8u.cjs} +51 -15
  134. package/dist/src/evalResult-DqzsS6_W.js +3 -0
  135. package/dist/src/{evalResult-D3hVYFis.js → evalResult-eUkJv9Ko.js} +40 -15
  136. package/dist/src/evaluator-DNdJF1Gv.js +3 -0
  137. package/dist/src/{evaluator-IvuDYSvQ.js → evaluator-DRoiYB2q.js} +1060 -187
  138. package/dist/src/evaluatorHelpers-BsYP_muT.js +511 -0
  139. package/dist/src/evaluatorHelpers-CRqTvSux.cjs +537 -0
  140. package/dist/src/evaluatorHelpers-DuqFFfq7.js +510 -0
  141. package/dist/src/{extractor-CAfTSraf.js → extractor-BR7XAzAL.js} +6 -6
  142. package/dist/src/{extractor-WVPOrH43.cjs → extractor-BdxEtt3J.cjs} +6 -6
  143. package/dist/src/{extractor-DNSeBVOJ.js → extractor-CIW3iN-b.js} +6 -6
  144. package/dist/src/{extractor-Dk6bRWkv.js → extractor-CxRtnaHl.js} +5 -5
  145. package/dist/src/{fetch-B0Z3Oe4k.js → fetch-BufrQtvR.js} +93 -40
  146. package/dist/src/{fetch-BEWnXrrG.js → fetch-DXUnXkVU.js} +89 -40
  147. package/dist/src/{fetch-CJU5ELPa.cjs → fetch-Dw4XZHjj.cjs} +330 -270
  148. package/dist/src/{fetch-Di00EQrc.js → fetch-It34O8Ur.js} +305 -252
  149. package/dist/src/fetch-_YgGd2qv.js +3 -0
  150. package/dist/src/{fileExtensions-bYh77CN8.cjs → fileExtensions-BhdwzYaD.cjs} +24 -1
  151. package/dist/src/{fileExtensions-DnqA1y9x.js → fileExtensions-CXRfY3Ss.js} +12 -2
  152. package/dist/src/{fileExtensions-AWa2ZML4.js → fileExtensions-D4GCJ67J.js} +12 -2
  153. package/dist/src/{formatDuration-DZzPsexs.js → formatDuration-CMVNrYvE.js} +1 -1
  154. package/dist/src/{genaiTracer-yRuxj9-L.cjs → genaiTracer-14nugQQx.cjs} +14 -2
  155. package/dist/src/{genaiTracer-DWdZ28hY.js → genaiTracer-BPVvltoW.js} +2 -2
  156. package/dist/src/{genaiTracer-XnrcgDCe.js → genaiTracer-D18lYzhB.js} +2 -2
  157. package/dist/src/{genaiTracer-COYDi-tC.js → genaiTracer-jJKYsnjc.js} +2 -2
  158. package/dist/src/goat-Ckd3q3AY.js +467 -0
  159. package/dist/src/goat-Qgurm-NP.js +466 -0
  160. package/dist/src/goat-ghadEDdy.js +465 -0
  161. package/dist/src/goat-una6pZGP.cjs +469 -0
  162. package/dist/src/graders-BDT7dif6.js +3 -0
  163. package/dist/src/{graders-eIHhRqoC.js → graders-BGP99PdK.js} +2416 -2224
  164. package/dist/src/{graders-Zy3x0zqX.js → graders-BX0f2tvS.js} +2423 -2226
  165. package/dist/src/{graders-pvbReLLn.js → graders-C0nXU_ZP.js} +1806 -1609
  166. package/dist/src/{graders--zknU_uk.cjs → graders-ClrU2fnd.cjs} +2219 -1949
  167. package/dist/src/hydra-BSNZZm2M.js +543 -0
  168. package/dist/src/hydra-BxdG4nkg.js +541 -0
  169. package/dist/src/hydra-DE4xWwyc.js +542 -0
  170. package/dist/src/hydra-DrJttnvw.cjs +542 -0
  171. package/dist/src/image-B4oBtu6J.js +443 -0
  172. package/dist/src/{image-dnoUgPrC.js → image-BN-hjLL9.js} +4 -4
  173. package/dist/src/{image-9302QVqR.js → image-B_fPIwdg.js} +3 -3
  174. package/dist/src/image-BvUAW344.js +442 -0
  175. package/dist/src/image-Cvjwx1uY.js +442 -0
  176. package/dist/src/{image-De2FBmYV.cjs → image-DfVCGPbI.cjs} +4 -4
  177. package/dist/src/{image-u7-rKnYU.js → image-QzmydkiG.js} +4 -4
  178. package/dist/src/image-X0oY4350.cjs +465 -0
  179. package/dist/src/index.cjs +1689 -558
  180. package/dist/src/index.d.cts +3270 -1624
  181. package/dist/src/index.d.ts +3270 -1624
  182. package/dist/src/index.js +1553 -438
  183. package/dist/src/indirectWebPwn-02ZIghCS.js +259 -0
  184. package/dist/src/indirectWebPwn-BJ22AbQa.cjs +397 -0
  185. package/dist/src/indirectWebPwn-CbjUG0rh.js +385 -0
  186. package/dist/src/indirectWebPwn-CfQJt3gk.cjs +260 -0
  187. package/dist/src/indirectWebPwn-DBQhOjoD.js +260 -0
  188. package/dist/src/indirectWebPwn-OsXnKejv.js +259 -0
  189. package/dist/src/indirectWebPwn-tNx9OZ35.js +385 -0
  190. package/dist/src/indirectWebPwn-uyWdHx04.js +386 -0
  191. package/dist/src/inputVariables-B0qUChbV.js +467 -0
  192. package/dist/src/inputVariables-DUGMb9Ka.js +464 -0
  193. package/dist/src/inputVariables-DXFdi7AI.js +468 -0
  194. package/dist/src/inputVariables-Dq9W-Z3a.cjs +475 -0
  195. package/dist/src/{interactiveCheck-CLERUB0c.js → interactiveCheck-C4QlIuoR.js} +2 -2
  196. package/dist/src/{invariant-BtWWVVhl.js → invariant-B2Rf6avk.js} +1 -1
  197. package/dist/src/{invariant-vgHWClmd.js → invariant-DIYf9sP1.js} +1 -1
  198. package/dist/src/{invariant-kfQ8Bu82.cjs → invariant-QtnLD03y.cjs} +1 -1
  199. package/dist/src/iterative-CpU6i2As.js +490 -0
  200. package/dist/src/iterative-DJQEQpG3.js +491 -0
  201. package/dist/src/iterative-DQBuWM-j.cjs +493 -0
  202. package/dist/src/iterative-FTS4Bz67.js +492 -0
  203. package/dist/src/iterativeImage-BUABMVOA.js +413 -0
  204. package/dist/src/iterativeImage-ByFWkxax.cjs +415 -0
  205. package/dist/src/iterativeImage-BzUapOUi.js +414 -0
  206. package/dist/src/iterativeImage-Doz8mgxF.js +413 -0
  207. package/dist/src/iterativeMeta-B3YiAOc8.js +386 -0
  208. package/dist/src/iterativeMeta-C7APE_P1.js +385 -0
  209. package/dist/src/iterativeMeta-CSS8M6Ds.cjs +385 -0
  210. package/dist/src/iterativeMeta-DgoQ7bLh.js +384 -0
  211. package/dist/src/iterativeTree-B5zxBBSW.js +769 -0
  212. package/dist/src/iterativeTree-CNyIk0Yn.js +768 -0
  213. package/dist/src/iterativeTree-CPMF10ve.cjs +771 -0
  214. package/dist/src/iterativeTree-DvZ7GBwt.js +770 -0
  215. package/dist/src/{knowledgeBase-Dgc7CBWF.js → knowledgeBase-BadkINlJ.js} +24 -10
  216. package/dist/src/{knowledgeBase-RhFPGWDc.js → knowledgeBase-Bi_8sV-H.js} +25 -11
  217. package/dist/src/{knowledgeBase-lm9RXSAm.js → knowledgeBase-CkMljjdg.js} +25 -11
  218. package/dist/src/{knowledgeBase-Bpoe_nLu.cjs → knowledgeBase-DUh34xba.cjs} +25 -11
  219. package/dist/src/{litellm-DRjpcSa7.js → litellm-BKBo0jpC.js} +5 -5
  220. package/dist/src/{litellm-C2kqjxqp.js → litellm-BXyn5kZK.js} +5 -5
  221. package/dist/src/{litellm-p37R1dzQ.js → litellm-CNcfbCfa.js} +4 -4
  222. package/dist/src/{litellm-CoyI4IAl.cjs → litellm-CtAr7bKG.cjs} +5 -5
  223. package/dist/src/{logger-DksKw1Qc.js → logger-BbY6ypFL.js} +2 -2
  224. package/dist/src/{logger-B88EkIn6.js → logger-KD8JjCRJ.js} +2 -2
  225. package/dist/src/{logger-COuQb2xB.cjs → logger-cfNpzI4o.cjs} +13 -55
  226. package/dist/src/{luma-ray-KgTCXrZC.js → luma-ray-BMX1iEB6.js} +5 -5
  227. package/dist/src/{luma-ray-B863CmuZ.js → luma-ray-CR5TSpp4.js} +5 -5
  228. package/dist/src/{luma-ray-BxVKaW2a.cjs → luma-ray-D3FUc2K3.cjs} +9 -8
  229. package/dist/src/{luma-ray-BTTLtqQ8.js → luma-ray-OEMmS1RB.js} +6 -6
  230. package/dist/src/main.js +909 -369
  231. package/dist/src/memoryPoisoning-CM83NWYl.js +107 -0
  232. package/dist/src/memoryPoisoning-D8h9gXJF.js +106 -0
  233. package/dist/src/memoryPoisoning-Dp-btinn.cjs +106 -0
  234. package/dist/src/memoryPoisoning-cLuCoTuJ.js +106 -0
  235. package/dist/src/{messages-BTQz42fn.js → messages-BabO-cX8.js} +273 -17
  236. package/dist/src/{messages-811uVVW5.cjs → messages-DBPir0TQ.cjs} +278 -18
  237. package/dist/src/{messages-zWbkLLHz.js → messages-DGUlSNU7.js} +273 -17
  238. package/dist/src/{messages-MYTQ2TWp.js → messages-vsE_-Lv0.js} +273 -17
  239. package/dist/src/{meteor-DHdzY1Ss.js → meteor--TZYICTI.js} +2 -2
  240. package/dist/src/{meteor-Co1VQ1u5.cjs → meteor-CR226f7Z.cjs} +2 -2
  241. package/dist/src/{meteor-CU5UAE-H.js → meteor-Cl_yd7rJ.js} +2 -2
  242. package/dist/src/{meteor-DuAFv6gF.js → meteor-Dce-_zGQ.js} +1 -1
  243. package/dist/src/mischievousUser-0l8GD7Dp.js +46 -0
  244. package/dist/src/mischievousUser-BUOP9W5r.js +46 -0
  245. package/dist/src/mischievousUser-frFYKxu6.js +47 -0
  246. package/dist/src/mischievousUser-olGgHIVR.cjs +46 -0
  247. package/dist/src/{modelslab-Dk1JAtVo.cjs → modelslab-CNV5bMSk.cjs} +7 -7
  248. package/dist/src/{modelslab-D0erNWKe.js → modelslab-Cogmu4mG.js} +6 -6
  249. package/dist/src/{modelslab-DIq-6y7x.js → modelslab-Dzst7VTU.js} +6 -6
  250. package/dist/src/{modelslab-wu9yi5GE.js → modelslab-EyDczZ5A.js} +7 -7
  251. package/dist/src/{nova-reel-CCFRfeRb.js → nova-reel-BGPNBOMS.js} +6 -6
  252. package/dist/src/{nova-reel-DQrm74ng.js → nova-reel-B_5NKFu1.js} +5 -5
  253. package/dist/src/{nova-reel-gr11WG7f.js → nova-reel-C4eUJGse.js} +5 -5
  254. package/dist/src/{nova-reel-CrLXVKQf.cjs → nova-reel-CjJRxI1X.cjs} +9 -8
  255. package/dist/src/{nova-sonic-BYdp-QLs.js → nova-sonic-BNGmgfFz.js} +4 -4
  256. package/dist/src/{nova-sonic-TDgrlTk7.js → nova-sonic-ChPlh5na.js} +4 -4
  257. package/dist/src/{nova-sonic-B_ZXcUJB.js → nova-sonic-CrV0iaY_.js} +3 -3
  258. package/dist/src/{nova-sonic-i5tUvXKn.cjs → nova-sonic-DuOG9Aun.cjs} +5 -4
  259. package/dist/src/{openai-DhVEmgeZ.js → openai-BMHD2Huo.js} +2 -2
  260. package/dist/src/{openai-URNyItar.cjs → openai-C3uXv8wS.cjs} +2 -2
  261. package/dist/src/{openai-Qsvz25mV.js → openai-CJrsh9n4.js} +2 -2
  262. package/dist/src/{openai-iYtrXzOX.js → openai-zgwBb4Ff.js} +1 -1
  263. package/dist/src/{openclaw-CnQ363Wi.js → openclaw-BIHlu_36.js} +10 -8
  264. package/dist/src/{openclaw-CwzlQSQX.js → openclaw-CF7fMido.js} +9 -7
  265. package/dist/src/{openclaw-wX9rtfke.cjs → openclaw-Dphc01BY.cjs} +18 -15
  266. package/dist/src/{openclaw-CLWrW03k.js → openclaw-zIJAsz3P.js} +10 -8
  267. package/dist/src/{opencode-sdk-BUu5Nevv.js → opencode-sdk-B3vlPLsp.js} +40 -5
  268. package/dist/src/{opencode-sdk-BxD8vXp_.js → opencode-sdk-D05JSgMQ.js} +40 -5
  269. package/dist/src/{opencode-sdk-BZ2idgYA.cjs → opencode-sdk-DoY6GbWw.cjs} +46 -10
  270. package/dist/src/{opencode-sdk-GI2KaAXq.js → opencode-sdk-sRKYHGoI.js} +39 -4
  271. package/dist/src/{otlpReceiver-BntK801g.js → otlpReceiver--gTpSagc.js} +120 -4
  272. package/dist/src/{otlpReceiver-DmVulbhC.js → otlpReceiver-B2eaKC8C.js} +120 -4
  273. package/dist/src/{otlpReceiver-B2z58l4e.js → otlpReceiver-BXjcRqAM.js} +119 -3
  274. package/dist/src/{otlpReceiver-BfcVq2Nq.cjs → otlpReceiver-CvJdBGSc.cjs} +125 -7
  275. package/dist/src/packageParser--MWTSrPW.js +36 -0
  276. package/dist/src/packageParser-CgE-ziRo.js +35 -0
  277. package/dist/src/packageParser-QoCS1FMl.cjs +54 -0
  278. package/dist/src/packageParser-hwwSGnAZ.js +35 -0
  279. package/dist/src/processShim-BBxt7LKO.js +95 -0
  280. package/dist/src/processShim-BcGzU8fY.js +94 -0
  281. package/dist/src/processShim-C_z3aRvF.js +94 -0
  282. package/dist/src/processShim-DSY9BV2T.cjs +98 -0
  283. package/dist/src/promptLength-0qIHyhA5.js +71 -0
  284. package/dist/src/promptLength-4X-Wd8PG.js +72 -0
  285. package/dist/src/promptLength-B9nZEfO6.js +71 -0
  286. package/dist/src/promptLength-BbBbDHNj.cjs +94 -0
  287. package/dist/src/promptfoo-BDrfT30-.js +180 -0
  288. package/dist/src/promptfoo-Cm4hiy1Y.js +180 -0
  289. package/dist/src/promptfoo-Rjp-MeBb.js +181 -0
  290. package/dist/src/promptfoo-b-baRMj-.cjs +205 -0
  291. package/dist/src/prompts-BYMtqPCw.js +259 -0
  292. package/dist/src/prompts-C-bqE1Yp.js +260 -0
  293. package/dist/src/prompts-Cp_Qx5Ml.js +270 -0
  294. package/dist/src/prompts-DHhQsANy.js +259 -0
  295. package/dist/src/prompts-D_QpZ2Dm.js +271 -0
  296. package/dist/src/prompts-hNvWBD3z.cjs +284 -0
  297. package/dist/src/prompts-huDVH2CI.js +270 -0
  298. package/dist/src/prompts-p78Hul5i.cjs +289 -0
  299. package/dist/src/{providerRegistry-CPQ_CmVO.js → providerRegistry-1gB5vtzQ.js} +2 -2
  300. package/dist/src/{providerRegistry-CQMdTmHP.cjs → providerRegistry-CZO_w7ue.cjs} +2 -2
  301. package/dist/src/{providerRegistry-Bvh8mv85.js → providerRegistry-DHcFiVWX.js} +1 -1
  302. package/dist/src/{providerRegistry-CWoPjKFZ.js → providerRegistry-ReCd0sFa.js} +2 -2
  303. package/dist/src/{providers-BV_KMZje.js → providers-B9KzWxAX.js} +10558 -21587
  304. package/dist/src/{providers-DruaQfwu.js → providers-BCCz6_IX.js} +1228 -12196
  305. package/dist/src/{providers-1eKkXBKp.cjs → providers-BDVVIQM6.cjs} +10649 -21843
  306. package/dist/src/{providers-iUt5fbAN.js → providers-BYAn82cf.js} +1 -1
  307. package/dist/src/{providers-Domz_llv.js → providers-DVYRZP4E.js} +10589 -21570
  308. package/dist/src/{pythonUtils-Cldx7huE.js → pythonUtils-CLCgQ9tt.js} +3 -3
  309. package/dist/src/{pythonUtils-CnndUbW-.js → pythonUtils-CgYxeSmO.js} +3 -3
  310. package/dist/src/{pythonUtils-tAJvvpS-.cjs → pythonUtils-Cokhluq3.cjs} +8 -7
  311. package/dist/src/{pythonUtils-C2UQ30Rz.js → pythonUtils-D0BYebvX.js} +3 -3
  312. package/dist/src/{quiverai-DFotyafY.cjs → quiverai-BAp6iTZD.cjs} +4 -4
  313. package/dist/src/{quiverai-aPPvXOgn.js → quiverai-BvIhI_0l.js} +4 -4
  314. package/dist/src/{quiverai-DR0SnIQV.js → quiverai-CdTWPe-A.js} +3 -3
  315. package/dist/src/{quiverai-CtWi6x_g.js → quiverai-Cv7rJKDz.js} +4 -4
  316. package/dist/src/registry-BUJrgjwv.js +124 -0
  317. package/dist/src/registry-DXm1t_x0.js +125 -0
  318. package/dist/src/registry-Dp5EqoXc.js +124 -0
  319. package/dist/src/registry-KCVF1CFC.cjs +124 -0
  320. package/dist/src/{server-D6Il2Sob.js → remoteGeneration-B1_XsKXU.js} +16 -108
  321. package/dist/src/{server-BSB45Nt9.js → remoteGeneration-COpWcmWd.js} +15 -146
  322. package/dist/src/{server-Dx2TyCH2.cjs → remoteGeneration-DS9N3pgB.cjs} +30 -119
  323. package/dist/src/remoteGeneration-DsaSwmG2.js +217 -0
  324. package/dist/src/render-BNTrbmBw.cjs +384 -0
  325. package/dist/src/render-CSP99NLm.js +348 -0
  326. package/dist/src/render-DFfDeYUK.js +347 -0
  327. package/dist/src/{render-CgVDrJmM.js → render-DznWrxGO.js} +2 -2
  328. package/dist/src/render-_6ur1fhE.js +347 -0
  329. package/dist/src/resourceAttributes-D1jP3kL5.js +17 -0
  330. package/dist/src/resourceAttributes-DQbBB--2.js +16 -0
  331. package/dist/src/resourceAttributes-ephgOvdR.cjs +27 -0
  332. package/dist/src/resourceAttributes-v6-I67fn.js +16 -0
  333. package/dist/src/{responses-Bi9vBuW_.cjs → responses-1UFFF9N_.cjs} +51 -16
  334. package/dist/src/{responses-DL9m8CyY.js → responses-B3W2JvOQ.js} +49 -15
  335. package/dist/src/{responses--OsX2aYW.js → responses-B6ktc3Ra.js} +49 -15
  336. package/dist/src/{responses-C-flexAY.js → responses-URRzV8qE.js} +49 -15
  337. package/dist/src/rolldown-runtime-D_mwlA32.cjs +43 -0
  338. package/dist/src/rubyUtils-BYVlQ94c.js +3 -0
  339. package/dist/src/{rubyUtils-DsGrTx8R.js → rubyUtils-CXlFM2rR.js} +3 -3
  340. package/dist/src/{rubyUtils-DVLeA2jg.js → rubyUtils-CnlW8AYb.js} +3 -3
  341. package/dist/src/{rubyUtils-B6eljPuh.cjs → rubyUtils-CqUWBZAt.cjs} +18 -27
  342. package/dist/src/{rubyUtils-CYSQEG4a.js → rubyUtils-DdGojpfv.js} +3 -3
  343. package/dist/src/runtimeTransform-BJOpL9Yc.js +142 -0
  344. package/dist/src/runtimeTransform-Dgh_D7DU.js +143 -0
  345. package/dist/src/runtimeTransform-DigbjU1r.js +142 -0
  346. package/dist/src/runtimeTransform-ON3YYILw.cjs +147 -0
  347. package/dist/src/{sagemaker-BVkaG2-l.js → sagemaker-CujrzP1a.js} +62 -51
  348. package/dist/src/{sagemaker-XnfhheQv.cjs → sagemaker-DzffAqo_.cjs} +65 -53
  349. package/dist/src/{sagemaker-D67yzMzs.js → sagemaker-vhtSV7JI.js} +62 -51
  350. package/dist/src/{sagemaker-BveBvuxm.js → sagemaker-yr1QKeBs.js} +61 -50
  351. package/dist/src/{scanner-1DqWi1Ej.js → scanner-DS0109SS.js} +7 -7
  352. package/dist/src/server/index.js +5105 -605
  353. package/dist/src/server-B8rqV126.cjs +126 -0
  354. package/dist/src/server-BaLytskk.js +3 -0
  355. package/dist/src/server-CMJD10J4.js +107 -0
  356. package/dist/src/server-Ddp8GNMp.js +146 -0
  357. package/dist/src/server-DhMHosWj.js +182 -0
  358. package/dist/src/shared-7pmVZLNO.js +1334 -0
  359. package/dist/src/shared-9WHQ1oNE.js +1335 -0
  360. package/dist/src/{fileExtensions-BArZuxsI.js → shared-BoG7qLMv.js} +12 -2
  361. package/dist/src/shared-D6IjElRI.js +1334 -0
  362. package/dist/src/shared-WkgnDkcg.cjs +1436 -0
  363. package/dist/src/{signal-CE5G3a7x.js → signal-CSurUUyV.js} +3 -3
  364. package/dist/src/simulatedUser-C9aQObBI.js +222 -0
  365. package/dist/src/simulatedUser-Cu601Dd4.cjs +227 -0
  366. package/dist/src/simulatedUser-U_qAHnuB.js +222 -0
  367. package/dist/src/simulatedUser-p3tACcmw.js +223 -0
  368. package/dist/src/{slack-DDUe-5MC.js → slack-Bapo-7_8.js} +2 -2
  369. package/dist/src/{slack-1Rhq0EoV.cjs → slack-DMC1QVEg.cjs} +3 -2
  370. package/dist/src/{slack-D5Wpy8LM.js → slack-DTEFhrMn.js} +2 -2
  371. package/dist/src/{slack-acRb0IqQ.js → slack-k-_CP84Q.js} +1 -1
  372. package/dist/src/storage-BU4qcnOb.js +875 -0
  373. package/dist/src/storage-CA-v9V2v.cjs +911 -0
  374. package/dist/src/storage-CD-GWAdx.js +822 -0
  375. package/dist/src/storage-QdU-SmvD.js +834 -0
  376. package/dist/src/{store-DAAyxcy6.cjs → store-B2NDDooM.cjs} +60 -24
  377. package/dist/src/{store-CYEy5J2D.js → store-DKd5592Q.js} +51 -20
  378. package/dist/src/{store-M0b1WfYb.js → store-HpopRVzl.js} +50 -19
  379. package/dist/src/store-IbiRIF3k.js +3 -0
  380. package/dist/src/strategies-7CS3Alao.cjs +2360 -0
  381. package/dist/src/strategies-CiSeroPH.js +2331 -0
  382. package/dist/src/strategies-DRJjGTIY.js +2333 -0
  383. package/dist/src/{tables-DQ4WU5tX.js → tables-CRSXQ2Ke.js} +2 -2
  384. package/dist/src/{tables-CsWou1Bx.js → tables-CxjU7bBd.js} +3 -3
  385. package/dist/src/{tables-DUfh1F7Z.cjs → tables-DBIJU0WE.cjs} +6 -5
  386. package/dist/src/{tables-C4CH3zRr.js → tables-DafUHOeh.js} +3 -3
  387. package/dist/src/{telemetry-CQPez_Jp.js → telemetry-00ezXr_t.js} +5 -4
  388. package/dist/src/telemetry-ByPqDcKC.js +3 -0
  389. package/dist/src/{telemetry-Dsw_faFj.cjs → telemetry-CJ7FnCsc.cjs} +18 -11
  390. package/dist/src/{telemetry-dbaJ0E98.js → telemetry-DmXYcJNV.js} +5 -4
  391. package/dist/src/{telemetry-Dvqxv3YC.js → telemetry-DwX9XUN5.js} +4 -3
  392. package/dist/src/{text-KvuD2Iko.js → text-Db-Wt2u2.js} +1 -1
  393. package/dist/src/{text-DHxdyQqT.js → text-DwYK5EBn.js} +1 -1
  394. package/dist/src/{text-BVi-cLPJ.cjs → text-nywWsRBM.cjs} +1 -1
  395. package/dist/src/{tokenUsageUtils-C-bmyHoE.js → tokenUsageUtils-BjVkdk18.js} +1 -1
  396. package/dist/src/{tokenUsageUtils-CXrvO-wA.js → tokenUsageUtils-CDet74yk.js} +1 -1
  397. package/dist/src/tokenUsageUtils-CmnQ0G2m.js +142 -0
  398. package/dist/src/{tokenUsageUtils-Bb7DkZPz.cjs → tokenUsageUtils-_B-P8IAi.cjs} +1 -1
  399. package/dist/src/toolAttributes-BAjwcBf0.cjs +103 -0
  400. package/dist/src/toolAttributes-COVgDrBG.js +87 -0
  401. package/dist/src/toolAttributes-DJ9ZEKXD.js +86 -0
  402. package/dist/src/tracingOptions-BnwKCkSB.js +221 -0
  403. package/dist/src/tracingOptions-Chi74lOD.js +219 -0
  404. package/dist/src/tracingOptions-DrbSFaKy.cjs +249 -0
  405. package/dist/src/tracingOptions-ji2OuXbT.js +220 -0
  406. package/dist/src/{transcription-DuWDupG7.js → transcription-B8uIgCYX.js} +5 -5
  407. package/dist/src/{transcription-CJspiD2c.js → transcription-CfU5loSq.js} +6 -6
  408. package/dist/src/{transcription-V2HaAmy2.js → transcription-Dkd22_4K.js} +6 -6
  409. package/dist/src/{transcription-BvjmiYB1.cjs → transcription-mzuf18Mq.cjs} +9 -8
  410. package/dist/src/{transform-lQrDE1BQ.js → transform-BIMynQsA.js} +9 -9
  411. package/dist/src/transform-BnSTnFlp.js +187 -0
  412. package/dist/src/transform-BnSXWmU_2.cjs +221 -0
  413. package/dist/src/transform-CGt7Kt3y2.js +186 -0
  414. package/dist/src/transform-CrPGTsij.js +186 -0
  415. package/dist/src/{transform-CTeuTR3S.cjs → transform-DhNkAUs8.cjs} +13 -12
  416. package/dist/src/{transform-CG0ehZNG.js → transform-DmvYBRll.js} +9 -9
  417. package/dist/src/{transform-zDhMmzwX.js → transform-EtD4jAWi.js} +9 -9
  418. package/dist/src/{transformersAvailability-CcHusyhw.js → transformersAvailability-0ThtPved.js} +1 -1
  419. package/dist/src/transformersAvailability-BYydDE5U.js +35 -0
  420. package/dist/src/{transformersAvailability-DLlROWhg.js → transformersAvailability-BvyU9vDD.js} +1 -1
  421. package/dist/src/{transformersAvailability-Cju9mHgR.cjs → transformersAvailability-BytPvKUW.cjs} +1 -1
  422. package/dist/src/{types-Dm9JM6Vb.js → types-BFevViUY.js} +115 -19
  423. package/dist/src/{types-Bgh5SOn6.js → types-BJQBBPTP.js} +115 -19
  424. package/dist/src/{types-CeaeaZdP.cjs → types-CxJvaY2S.cjs} +357 -172
  425. package/dist/src/{types-BGQDAP8i.js → types-D6glLbdF.js} +271 -170
  426. package/dist/src/{util-BYvQUPp7.js → util--WMgw7wM.js} +28 -8
  427. package/dist/src/{util-C9J8ahRn.js → util-5WnCSb0h.js} +72 -48
  428. package/dist/src/{util-CN3SrLT4.cjs → util-BSIuSLVK.cjs} +74 -49
  429. package/dist/src/{util-C8e5uydV.js → util-Bx677_k2.js} +154 -147
  430. package/dist/src/util-CN8om2rz.cjs +386 -0
  431. package/dist/src/{util-DDs-7g6-.js → util-CoQWM76y.js} +28 -8
  432. package/dist/src/util-DNl96nNs.js +327 -0
  433. package/dist/src/{util-DxWpWjhc.js → util-DURocbYR.js} +667 -507
  434. package/dist/src/util-Df8YMvS1.js +327 -0
  435. package/dist/src/{util-DvU2Pw8c.js → util-DiQ3QvBB.js} +28 -8
  436. package/dist/src/{util-oGMLA7vc.js → util-I-Rf-KaD.js} +862 -577
  437. package/dist/src/{util-olYL5C6N.cjs → util-IYzs5Y04.cjs} +33 -7
  438. package/dist/src/{util-D9TisOyk.js → util-LKTmNsMQ.js} +71 -47
  439. package/dist/src/{util-Bxn8emtE.cjs → util-SPsvFONY.cjs} +738 -582
  440. package/dist/src/{util-D3q0WQ-0.js → util-efByNxcr.js} +72 -48
  441. package/dist/src/util-kDURhgJW.js +328 -0
  442. package/dist/src/{utils-DJfvjyMj.js → utils-B0lzitHZ.js} +3 -3
  443. package/dist/src/{utils-BLJKfv0y.js → utils-BFOh20Gb.js} +3 -3
  444. package/dist/src/{utils-hXtCYanr.js → utils-BGY69tk_.js} +2 -2
  445. package/dist/src/{utils-B05gLxER.cjs → utils-Ve6kuJsa.cjs} +3 -3
  446. package/dist/src/version-BK20a4sw.js +16 -0
  447. package/dist/src/version-BWCSaByA.cjs +27 -0
  448. package/dist/src/version-eRkNuGv8.js +17 -0
  449. package/dist/src/version-lpHV_53E.js +16 -0
  450. package/dist/tsconfig.tsbuildinfo +1 -1
  451. package/package.json +56 -28
  452. package/dist/src/app/assets/Report-CQYFezYu.js +0 -1
  453. package/dist/src/app/assets/index-BXGkeMwh.css +0 -1
  454. package/dist/src/app/assets/index-BzJt18Jz.js +0 -385
  455. package/dist/src/app/assets/sync-IjzpWrOE.js +0 -4
  456. package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +0 -36
  457. package/dist/src/cache-Cr9oLMUa.js +0 -3
  458. package/dist/src/cache-DbLsVWB2.cjs +0 -3
  459. package/dist/src/cloud-Hphvo8kr.js +0 -3
  460. package/dist/src/codex-sdk-BAmYE7qy.js +0 -3
  461. package/dist/src/codex-sdk-CWEnH70W.cjs +0 -2
  462. package/dist/src/evalResult-D8MT9p0s.js +0 -3
  463. package/dist/src/evalResult-DElBuddX.js +0 -2
  464. package/dist/src/evalResult-Dvc-iucu.cjs +0 -2
  465. package/dist/src/evaluator-CVessDWe.js +0 -3
  466. package/dist/src/fetch-C7bGKDlQ.js +0 -3
  467. package/dist/src/graders-BOAzQEUe.cjs +0 -2
  468. package/dist/src/graders-D4BTsZdG2.js +0 -3
  469. package/dist/src/graders-DOJK1XpV.js +0 -2
  470. package/dist/src/graders-NAv9LcBn.js +0 -2
  471. package/dist/src/image-B5Mv-Z3h.js +0 -257
  472. package/dist/src/image-DVz2RiMF.js +0 -258
  473. package/dist/src/image-qUpPvmNZ.js +0 -257
  474. package/dist/src/image-x6KqLQl4.cjs +0 -280
  475. package/dist/src/providers-Bp4S-FvO.js +0 -2
  476. package/dist/src/providers-DV3ax9e_.cjs +0 -3
  477. package/dist/src/providers-u9Enmfok.js +0 -2
  478. package/dist/src/render-CH-62LbA.js +0 -135
  479. package/dist/src/render-CMEpfLaO.js +0 -136
  480. package/dist/src/render-DHIZ6_k8.js +0 -135
  481. package/dist/src/render-DfQSFxGE.cjs +0 -165
  482. package/dist/src/rubyUtils-D1L2d3jb.js +0 -3
  483. package/dist/src/rubyUtils-DUbq4tff.cjs +0 -2
  484. package/dist/src/server-BNYztJkh.js +0 -385
  485. package/dist/src/server-DCtHUqlp.js +0 -3
  486. package/dist/src/server-DaA2eR26.cjs +0 -2
  487. package/dist/src/store-CWOSz6D_.cjs +0 -2
  488. package/dist/src/store-DCDBhv7B.js +0 -3
  489. package/dist/src/store-Dn9HUkdW.js +0 -240
  490. package/dist/src/telemetry-C1IqxcdW.js +0 -3
  491. package/dist/src/telemetry-C4ZEa_es.cjs +0 -2
  492. package/dist/src/transform-Bbg6A8Jk.js +0 -216
  493. package/dist/src/transform-CUnzlsbn.cjs +0 -228
  494. package/dist/src/transform-DYX1_Xnh.js +0 -216
  495. package/dist/src/transform-DgKlRr73.cjs +0 -2
  496. package/dist/src/transform-M6ITAESf.js +0 -3
  497. package/dist/src/transform-UN5UGu8U.js +0 -213
@@ -0,0 +1,911 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-D_mwlA32.cjs");
2
+ const require_logger = require("./logger-cfNpzI4o.cjs");
3
+ const require_invariant = require("./invariant-QtnLD03y.cjs");
4
+ const require_types = require("./types-CxJvaY2S.cjs");
5
+ const require_fetch = require("./fetch-Dw4XZHjj.cjs");
6
+ const require_server = require("./server-B8rqV126.cjs");
7
+ let fs = require("fs");
8
+ fs = require_rolldown_runtime.__toESM(fs, 1);
9
+ let path = require("path");
10
+ path = require_rolldown_runtime.__toESM(path, 1);
11
+ let dedent = require("dedent");
12
+ dedent = require_rolldown_runtime.__toESM(dedent, 1);
13
+ let fs_promises = require("fs/promises");
14
+ fs_promises = require_rolldown_runtime.__toESM(fs_promises, 1);
15
+ let crypto = require("crypto");
16
+ crypto = require_rolldown_runtime.__toESM(crypto, 1);
17
+ //#region src/util/cloud.ts
18
+ const PERMISSION_CHECK_SERVER_FEATURE_NAME = "config-permission-check-endpoint";
19
+ const PERMISSION_CHECK_SERVER_FEATURE_DATE = "2025-09-03T14:49:11Z";
20
+ /**
21
+ * Makes an authenticated HTTP request to the PromptFoo Cloud API.
22
+ * @param path - The API endpoint path (with or without leading slash)
23
+ * @param method - HTTP method (GET, POST, PUT, DELETE, etc.)
24
+ * @param body - Optional request body that will be JSON stringified
25
+ * @returns Promise resolving to the fetch Response object
26
+ * @throws Error if the request fails due to network or other issues
27
+ */
28
+ function makeRequest(path, method, body) {
29
+ const apiHost = require_fetch.cloudConfig.getApiHost();
30
+ const apiKey = require_fetch.cloudConfig.getApiKey();
31
+ const url = `${apiHost}/api/v1/${path.startsWith("/") ? path.slice(1) : path}`;
32
+ try {
33
+ return require_fetch.fetchWithProxy(url, {
34
+ method,
35
+ body: JSON.stringify(body),
36
+ headers: {
37
+ Authorization: `Bearer ${apiKey}`,
38
+ "Content-Type": "application/json"
39
+ }
40
+ });
41
+ } catch (e) {
42
+ require_logger.logger.error(`[Cloud] Failed to make request to ${url}: ${e}`);
43
+ if (e.cause) require_logger.logger.error(`Cause: ${e.cause}`);
44
+ throw e;
45
+ }
46
+ }
47
+ /**
48
+ * Fetches a provider configuration from PromptFoo Cloud by its ID.
49
+ * @param id - The unique identifier of the cloud provider
50
+ * @returns Promise resolving to provider options with guaranteed id field
51
+ * @throws Error if cloud is not enabled, provider not found, or request fails
52
+ */
53
+ async function getProviderFromCloud(id) {
54
+ if (!require_fetch.cloudConfig.isEnabled()) throw new Error(`Could not fetch Provider ${id} from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
55
+ try {
56
+ const response = await makeRequest(`providers/${id}`, "GET");
57
+ if (!response.ok) {
58
+ const errorMessage = await response.text();
59
+ require_logger.logger.error(`[Cloud] Failed to fetch provider from cloud: ${errorMessage}. HTTP Status: ${response.status} -- ${response.statusText}.`);
60
+ throw new Error(`Failed to fetch provider from cloud: ${response.statusText}`);
61
+ }
62
+ const body = await response.json();
63
+ require_logger.logger.debug(`Provider fetched from cloud: ${id}`);
64
+ const provider = require_types.ProviderOptionsSchema.parse(body.config);
65
+ require_invariant.invariant(provider.id, `Provider ${id} has no id in ${body.config}`);
66
+ return {
67
+ ...provider,
68
+ id: provider.id
69
+ };
70
+ } catch (e) {
71
+ require_logger.logger.error(`Failed to fetch provider from cloud: ${id}.`);
72
+ require_logger.logger.error(String(e));
73
+ throw new Error(`Failed to fetch provider from cloud: ${id}.`);
74
+ }
75
+ }
76
+ function isRecord(value) {
77
+ return value !== null && typeof value === "object" && !Array.isArray(value);
78
+ }
79
+ async function fetchCloudConfig(path) {
80
+ const response = await makeRequest(path, "GET");
81
+ if (!response.ok) {
82
+ const errorMessage = typeof response.text === "function" ? await response.text() : "";
83
+ require_logger.logger.error(`[Cloud] Failed to fetch config from cloud: ${errorMessage}. HTTP Status: ${response.status} -- ${response.statusText}.`);
84
+ throw new Error(`Failed to fetch config from cloud: ${response.statusText}`);
85
+ }
86
+ return response.json();
87
+ }
88
+ function looksLikeEvalConfig(config) {
89
+ return "providers" in config || "providerIds" in config || "prompts" in config || "tests" in config || "testCases" in config;
90
+ }
91
+ function extractEvalConfigPayload(body) {
92
+ if (!isRecord(body)) throw new Error("Invalid cloud eval config response: expected a JSON object.");
93
+ const bodyConfig = isRecord(body.config) ? body.config : void 0;
94
+ if (!bodyConfig) {
95
+ if (looksLikeEvalConfig(body)) return body;
96
+ throw new Error("Invalid cloud eval config response: missing \"config\" object.");
97
+ }
98
+ const nestedConfig = isRecord(bodyConfig.config) ? bodyConfig.config : void 0;
99
+ if (!nestedConfig) return {
100
+ ...bodyConfig,
101
+ ...typeof bodyConfig.name !== "string" && typeof body.name === "string" ? { name: body.name } : {}
102
+ };
103
+ return {
104
+ ...nestedConfig,
105
+ ...typeof nestedConfig.name !== "string" && typeof bodyConfig.name === "string" ? { name: bodyConfig.name } : {}
106
+ };
107
+ }
108
+ function normalizeCloudEvalProvider(provider) {
109
+ if (typeof provider !== "string") return provider;
110
+ if (provider.startsWith("promptfoo://provider/") || !require_types.isUuid(provider)) return provider;
111
+ return `${require_fetch.CLOUD_PROVIDER_PREFIX}${provider}`;
112
+ }
113
+ function normalizeCloudEvalPrompt(prompt) {
114
+ if (typeof prompt === "string") return prompt;
115
+ if (isRecord(prompt)) {
116
+ if (typeof prompt.content === "string") return prompt.content;
117
+ if (typeof prompt.raw === "string") return prompt.raw;
118
+ }
119
+ return String(prompt ?? "");
120
+ }
121
+ function normalizeEvalConfig(config) {
122
+ const providers = Array.isArray(config.providers) ? config.providers : Array.isArray(config.providerIds) ? config.providerIds : [];
123
+ const prompts = Array.isArray(config.prompts) ? config.prompts : [];
124
+ const tests = Array.isArray(config.tests) ? config.tests : Array.isArray(config.testCases) ? config.testCases : [];
125
+ const commandLineOptions = {
126
+ ...isRecord(config.commandLineOptions) ? config.commandLineOptions : {},
127
+ ...config.maxConcurrency == null ? {} : { maxConcurrency: config.maxConcurrency },
128
+ ...config.delay == null ? {} : { delay: config.delay },
129
+ ...config.verbose == null ? {} : { verbose: config.verbose }
130
+ };
131
+ const normalizedConfig = {
132
+ ...config,
133
+ providers: providers.map(normalizeCloudEvalProvider),
134
+ prompts: prompts.map(normalizeCloudEvalPrompt),
135
+ tests
136
+ };
137
+ if (Object.keys(commandLineOptions).length > 0) normalizedConfig.commandLineOptions = commandLineOptions;
138
+ else delete normalizedConfig.commandLineOptions;
139
+ if (typeof config.description === "string" && config.description.trim().length > 0) normalizedConfig.description = config.description;
140
+ else if (typeof config.name === "string" && config.name.trim().length > 0) normalizedConfig.description = config.name;
141
+ delete normalizedConfig.providerIds;
142
+ delete normalizedConfig.testCases;
143
+ delete normalizedConfig.maxConcurrency;
144
+ delete normalizedConfig.delay;
145
+ delete normalizedConfig.verbose;
146
+ return normalizedConfig;
147
+ }
148
+ /**
149
+ * Fetches an eval configuration from PromptFoo Cloud by ID.
150
+ * The response may contain legacy eval fields, which are normalized into UnifiedConfig.
151
+ * @param id - The unique identifier of the cloud eval configuration
152
+ * @returns Promise resolving to a normalized unified configuration object
153
+ * @throws Error if cloud is not enabled, config not found, or response shape is invalid
154
+ */
155
+ async function getEvalConfigFromCloud(id) {
156
+ if (!require_fetch.cloudConfig.isEnabled()) throw new Error(`Could not fetch Config ${id} from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
157
+ try {
158
+ const config = normalizeEvalConfig(extractEvalConfigPayload(await fetchCloudConfig(`configs/${id}`)));
159
+ require_logger.logger.info(`Eval config fetched from cloud: ${id}`);
160
+ return config;
161
+ } catch (e) {
162
+ require_logger.logger.error(`Failed to fetch eval config from cloud: ${id}.`);
163
+ require_logger.logger.error(String(e));
164
+ if (e instanceof Error) throw e;
165
+ throw new Error(String(e));
166
+ }
167
+ }
168
+ /**
169
+ * Checks if a provider path represents a cloud-based provider.
170
+ * @param providerPath - The provider path to check
171
+ * @returns True if the path starts with the cloud provider prefix, false otherwise
172
+ */
173
+ function isCloudProvider(providerPath) {
174
+ return providerPath.startsWith(require_fetch.CLOUD_PROVIDER_PREFIX);
175
+ }
176
+ /**
177
+ * Extracts the database ID from a cloud provider path.
178
+ * @param providerPath - The cloud provider path
179
+ * @returns The database ID portion of the path
180
+ * @throws Error if the path is not a valid cloud provider path
181
+ */
182
+ function getCloudDatabaseId(providerPath) {
183
+ if (!isCloudProvider(providerPath)) throw new Error(`Provider path ${providerPath} is not a cloud provider.`);
184
+ return providerPath.slice(require_fetch.CLOUD_PROVIDER_PREFIX.length);
185
+ }
186
+ /**
187
+ * Get the plugin severity overrides for a cloud provider.
188
+ * @param cloudProviderId - The cloud provider ID.
189
+ * @returns The plugin severity overrides.
190
+ */
191
+ async function getPluginSeverityOverridesFromCloud(cloudProviderId) {
192
+ if (!require_fetch.cloudConfig.isEnabled()) throw new Error(`Could not fetch plugin severity overrides from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
193
+ try {
194
+ const response = await makeRequest(`/providers/${cloudProviderId}`, "GET");
195
+ if (!response.ok) {
196
+ const formattedErrorMessage = `Failed to provider from cloud: ${await response.text()}. HTTP Status: ${response.status} -- ${response.statusText}.`;
197
+ require_logger.logger.error(`[Cloud] ${formattedErrorMessage}`);
198
+ throw new Error(formattedErrorMessage);
199
+ }
200
+ const body = await response.json();
201
+ if (body.pluginSeverityOverrideId) {
202
+ const overrideRes = await makeRequest(`/redteam/plugins/severity-overrides/${body.pluginSeverityOverrideId}`, "GET");
203
+ if (!overrideRes.ok) {
204
+ const formattedErrorMessage = `Failed to fetch plugin severity override from cloud: ${await overrideRes.text()}. HTTP Status: ${overrideRes.status} -- ${overrideRes.statusText}.`;
205
+ require_logger.logger.error(`[Cloud] ${formattedErrorMessage}`);
206
+ throw new Error(formattedErrorMessage);
207
+ }
208
+ const pluginSeverityOverride = await overrideRes.json();
209
+ return {
210
+ id: pluginSeverityOverride.id,
211
+ severities: pluginSeverityOverride.members.reduce((acc, member) => ({
212
+ ...acc,
213
+ [member.pluginId]: member.severity
214
+ }), {})
215
+ };
216
+ } else {
217
+ require_logger.logger.debug(`No plugin severity overrides found for cloud provider ${cloudProviderId}`);
218
+ return null;
219
+ }
220
+ } catch (e) {
221
+ require_logger.logger.error(`Failed to fetch plugin severity overrides from cloud.`);
222
+ require_logger.logger.error(String(e));
223
+ throw new Error(`Failed to fetch plugin severity overrides from cloud.`);
224
+ }
225
+ }
226
+ /**
227
+ * Retrieves all teams for the current user from Promptfoo Cloud.
228
+ * @returns Promise resolving to an array of team objects
229
+ * @throws Error if the request fails
230
+ */
231
+ async function getUserTeams(apiHost, apiKey) {
232
+ const response = apiHost && apiKey ? await require_fetch.fetchWithProxy(`${apiHost}/api/v1/users/me/teams`, { headers: { Authorization: `Bearer ${apiKey}` } }) : await makeRequest(`/users/me/teams`, "GET");
233
+ if (!response.ok) throw new Error(`Failed to get user teams: ${response.statusText}`);
234
+ return await response.json();
235
+ }
236
+ /**
237
+ * Retrieves the default team for the current user from Promptfoo Cloud.
238
+ * The default team is determined as the oldest team by creation date.
239
+ * @returns Promise resolving to an object with team id, name, organizationId, and createdAt
240
+ * @throws Error if the request fails or no teams are found
241
+ */
242
+ async function getDefaultTeam() {
243
+ const teams = await getUserTeams();
244
+ if (teams.length === 0) throw new Error("No teams found for user");
245
+ const oldestTeam = teams.sort((a, b) => {
246
+ return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
247
+ })[0];
248
+ return {
249
+ id: oldestTeam.id,
250
+ name: oldestTeam.name,
251
+ organizationId: oldestTeam.organizationId,
252
+ createdAt: oldestTeam.createdAt
253
+ };
254
+ }
255
+ /**
256
+ * Retrieves a team by its ID.
257
+ * @param teamId - The team ID to look up
258
+ * @returns Promise resolving to an object with team id, name, organizationId, and createdAt
259
+ * @throws Error if the team is not found or not accessible
260
+ */
261
+ async function getTeamById(teamId) {
262
+ const team = (await getUserTeams()).find((t) => t.id === teamId);
263
+ if (!team) throw new Error(`Team with ID '${teamId}' not found or not accessible`);
264
+ return {
265
+ id: team.id,
266
+ name: team.name,
267
+ organizationId: team.organizationId,
268
+ createdAt: team.createdAt
269
+ };
270
+ }
271
+ /**
272
+ * Resolves a team identifier (name, slug, or ID) to a team object.
273
+ * @param identifier - The team name, slug, or ID
274
+ * @returns Promise resolving to an object with team id, name, organizationId, and createdAt
275
+ * @throws Error if the team is not found
276
+ */
277
+ async function resolveTeamFromIdentifier(identifier) {
278
+ const teams = await getUserTeams();
279
+ let team = teams.find((t) => t.id === identifier);
280
+ if (team) return {
281
+ id: team.id,
282
+ name: team.name,
283
+ organizationId: team.organizationId,
284
+ createdAt: team.createdAt
285
+ };
286
+ team = teams.find((t) => t.name.toLowerCase() === identifier.toLowerCase());
287
+ if (team) return {
288
+ id: team.id,
289
+ name: team.name,
290
+ organizationId: team.organizationId,
291
+ createdAt: team.createdAt
292
+ };
293
+ team = teams.find((t) => t.slug === identifier);
294
+ if (team) return {
295
+ id: team.id,
296
+ name: team.name,
297
+ organizationId: team.organizationId,
298
+ createdAt: team.createdAt
299
+ };
300
+ const availableTeams = teams.map((t) => t.name).join(", ");
301
+ throw new Error(`Team '${identifier}' not found. Available teams: ${availableTeams}`);
302
+ }
303
+ /**
304
+ * Resolves the current team context, checking stored preferences first.
305
+ * @param teamIdentifier - Optional explicit team identifier to use
306
+ * @param fallbackToDefault - Whether to fall back to server default team
307
+ * @returns Promise resolving to an object with team id and name
308
+ * @throws Error if no team can be resolved
309
+ */
310
+ async function resolveTeamId(teamIdentifier, fallbackToDefault = true) {
311
+ if (teamIdentifier) {
312
+ require_logger.logger.debug(`[Team Resolution] Using explicit team identifier: ${teamIdentifier}`);
313
+ return await resolveTeamFromIdentifier(teamIdentifier);
314
+ }
315
+ const currentOrganizationId = require_fetch.cloudConfig.getCurrentOrganizationId();
316
+ const currentTeamId = require_fetch.cloudConfig.getCurrentTeamId(currentOrganizationId);
317
+ if (currentTeamId) try {
318
+ require_logger.logger.debug(`[Team Resolution] Using stored team ID: ${currentTeamId}`);
319
+ return await getTeamById(currentTeamId);
320
+ } catch (_error) {
321
+ require_logger.logger.warn(`[Team Resolution] Stored team ${currentTeamId} no longer accessible, falling back`);
322
+ }
323
+ if (fallbackToDefault) {
324
+ require_logger.logger.debug(`[Team Resolution] Using server default team`);
325
+ const defaultTeam = await getDefaultTeam();
326
+ require_fetch.cloudConfig.setCurrentTeamId(defaultTeam.id, defaultTeam.organizationId);
327
+ require_logger.logger.info(`Using team: ${defaultTeam.name} (use 'promptfoo auth teams set <name>' to change)`);
328
+ return defaultTeam;
329
+ }
330
+ throw new Error("No team specified and no default available");
331
+ }
332
+ /**
333
+ * Custom error class for configuration permission-related failures.
334
+ * Thrown when users lack necessary permissions to use certain cloud features.
335
+ */
336
+ var ConfigPermissionError = class extends Error {
337
+ constructor(message) {
338
+ super(message);
339
+ this.name = "ConfigPermissionError";
340
+ }
341
+ };
342
+ /**
343
+ * Converts an array of structured error objects into a human-readable message.
344
+ * @param errors - Array of error objects with type, id, and message fields
345
+ * @returns A comma-separated string of formatted error messages
346
+ */
347
+ function convertErrorsToReadableMessage(errors) {
348
+ return errors.map((error) => `${error.type} ${error.id}: ${error.message}`).join(", ");
349
+ }
350
+ /**
351
+ * Validates that the current user has necessary permissions for the given configuration.
352
+ * Checks with PromptFoo Cloud to ensure providers and other resources can be accessed.
353
+ * Gracefully degrades if cloud is disabled or server doesn't support permission checking.
354
+ * @param config - The configuration to validate permissions for
355
+ * @throws ConfigPermissionError if permissions are insufficient (403 responses)
356
+ * @throws Error for other critical permission check failures
357
+ */
358
+ async function checkCloudPermissions(config) {
359
+ if (!require_fetch.cloudConfig.isEnabled()) return;
360
+ if (!config.providers) {
361
+ require_logger.logger.warn("No providers specified. Skipping permission check.");
362
+ return;
363
+ }
364
+ try {
365
+ if (!await require_server.checkServerFeatureSupport(PERMISSION_CHECK_SERVER_FEATURE_NAME, PERMISSION_CHECK_SERVER_FEATURE_DATE)) {
366
+ require_logger.logger.debug(`[Config Permission Check] Server feature ${PERMISSION_CHECK_SERVER_FEATURE_NAME} is not supported. Skipping permission check.`);
367
+ return;
368
+ }
369
+ const { tests, scenarios, defaultTest, evaluateOptions, ...minimalConfig } = config;
370
+ if (minimalConfig.redteam) minimalConfig.redteam = {};
371
+ const response = await makeRequest("permissions/check", "POST", { config: minimalConfig });
372
+ if (!response.ok) {
373
+ const errorData = await response.json().catch(() => ({ errors: ["Unknown error"] }));
374
+ const errors = Array.isArray(errorData.errors) ? errorData.errors.map((error) => {
375
+ if (typeof error === "string") return {
376
+ type: "config",
377
+ id: "unknown",
378
+ message: error
379
+ };
380
+ return error;
381
+ }) : [{
382
+ type: "config",
383
+ id: "unknown",
384
+ message: errorData.error || "Permission check failed"
385
+ }];
386
+ if (response.status === 403) throw new ConfigPermissionError(`Permission denied: ${convertErrorsToReadableMessage(errors)}`);
387
+ require_logger.logger.warn(`Error checking permissions: ${convertErrorsToReadableMessage(errors)}. Continuing anyway.`);
388
+ return;
389
+ }
390
+ const result = await response.json();
391
+ if (result.errors && result.errors.length > 0) throw new ConfigPermissionError(`Not able to continue with config: ${convertErrorsToReadableMessage(result.errors)}`);
392
+ require_logger.logger.debug("Permission check passed");
393
+ } catch (error) {
394
+ if (error instanceof ConfigPermissionError) throw error;
395
+ require_logger.logger.warn(`Error checking permissions: ${error}. Continuing anyway.`);
396
+ }
397
+ }
398
+ /**
399
+ * Given a list of policy IDs, fetches custom policies from Promptfoo Cloud.
400
+ * @param ids - The IDs of the policies to fetch.
401
+ * @param teamId - The ID of the team to fetch policies from. Note that all policies must belong to this team.
402
+ * @returns A map of policy IDs to their texts and severities.
403
+ */
404
+ async function getPoliciesFromCloud(ids, teamId) {
405
+ if (!require_fetch.cloudConfig.isEnabled()) throw new Error(`Could not fetch policies from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
406
+ try {
407
+ const searchParams = new URLSearchParams();
408
+ ids.forEach((id) => {
409
+ searchParams.append("id", id);
410
+ });
411
+ const response = await makeRequest(`/custom-policies/?${searchParams.toString()}&teamId=${teamId}`, "GET");
412
+ if (!response.ok) {
413
+ const errorMessage = await response.text();
414
+ throw new Error(`Failed to fetch policies from cloud: ${errorMessage}. HTTP Status: ${response.status} -- ${response.statusText}.`);
415
+ }
416
+ const body = await response.json();
417
+ const policiesById = /* @__PURE__ */ new Map();
418
+ body.forEach((policy) => {
419
+ policiesById.set(policy.id, {
420
+ text: policy.text,
421
+ severity: policy.severity,
422
+ name: policy.name
423
+ });
424
+ });
425
+ return policiesById;
426
+ } catch (e) {
427
+ require_logger.logger.error(`Failed to fetch policies from cloud.`);
428
+ require_logger.logger.error(String(e));
429
+ throw new Error(`Failed to fetch policies from cloud.`);
430
+ }
431
+ }
432
+ /**
433
+ * Validates linkedTargetId format and existence.
434
+ * linkedTargetId is a Promptfoo Cloud feature that links custom provider results
435
+ * to an existing target instead of creating duplicates.
436
+ *
437
+ * Validates the prefix and checks existence in cloud. Format validation
438
+ * (e.g., UUID format) is deferred to the cloud API for simplicity.
439
+ *
440
+ * @param linkedTargetId - The linkedTargetId to validate
441
+ * @throws Error if validation fails
442
+ */
443
+ async function validateLinkedTargetId(linkedTargetId) {
444
+ if (!isCloudProvider(linkedTargetId)) {
445
+ const appHost = require_fetch.cloudConfig.getApiHost().replace("/api", "").replace(":3201", "");
446
+ throw new Error(dedent.default`
447
+ Invalid linkedTargetId format: "${linkedTargetId}"
448
+
449
+ linkedTargetId must start with "${require_fetch.CLOUD_PROVIDER_PREFIX}" followed by a target ID.
450
+ Example: ${require_fetch.CLOUD_PROVIDER_PREFIX}12345678-1234-1234-1234-123456789abc
451
+
452
+ linkedTargetId links your local provider configuration to a cloud target, allowing you to:
453
+ - Consolidate findings from multiple eval runs
454
+ - Track performance and vulnerabilities over time
455
+ - View comprehensive reporting in the cloud dashboard
456
+
457
+ To get a valid linkedTargetId:
458
+ 1. Log in to Promptfoo Cloud: ${appHost}
459
+ 2. Navigate to Targets page: ${appHost}/redteam/targets
460
+ 3. Find the target you want to link to and copy its ID
461
+ 4. Format as: ${require_fetch.CLOUD_PROVIDER_PREFIX}<target-id>
462
+ `);
463
+ }
464
+ if (!require_fetch.cloudConfig.isEnabled()) {
465
+ require_logger.logger.warn("[Cloud] linkedTargetId specified but cloud is not configured", {
466
+ linkedTargetId,
467
+ suggestion: "Run 'promptfoo auth login' to enable cloud features"
468
+ });
469
+ return;
470
+ }
471
+ const providerId = getCloudDatabaseId(linkedTargetId);
472
+ try {
473
+ require_logger.logger.debug("[Cloud] Validating linkedTargetId exists in cloud", {
474
+ linkedTargetId,
475
+ providerId
476
+ });
477
+ await getProviderFromCloud(providerId);
478
+ require_logger.logger.debug("[Cloud] linkedTargetId validation successful", { linkedTargetId });
479
+ } catch (error) {
480
+ require_logger.logger.error("[Cloud] linkedTargetId validation failed", {
481
+ linkedTargetId,
482
+ error
483
+ });
484
+ const appHost = require_fetch.cloudConfig.getApiHost().replace("/api", "").replace(":3201", "");
485
+ throw new Error(dedent.default`
486
+ linkedTargetId not found: "${linkedTargetId}"
487
+
488
+ This target doesn't exist in your Promptfoo Cloud organization or you don't have access to it.
489
+
490
+ Troubleshooting steps:
491
+ 1. Verify you're logged in to the correct organization
492
+ Run: promptfoo auth status
493
+
494
+ 2. Check that the target exists in your cloud dashboard:
495
+ ${appHost}/redteam/targets
496
+
497
+ 3. Ensure you have permission to access this target
498
+ (Targets are scoped to your organization)
499
+
500
+ 4. Verify the target ID is correct and hasn't been deleted
501
+ `);
502
+ }
503
+ }
504
+ /**
505
+ * Fetches the current organization and optional team context for display.
506
+ * Returns null if cloud is not enabled or if fetching fails.
507
+ * @returns Promise resolving to organization name and optional team name, or null
508
+ */
509
+ async function getOrgContext() {
510
+ if (!require_fetch.cloudConfig.isEnabled()) return null;
511
+ try {
512
+ const apiHost = require_fetch.cloudConfig.getApiHost();
513
+ const apiKey = require_fetch.cloudConfig.getApiKey();
514
+ const response = await require_fetch.fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${apiKey}` } });
515
+ if (!response.ok) return null;
516
+ const { organization } = await response.json();
517
+ const currentTeamId = require_fetch.cloudConfig.getCurrentTeamId(organization.id);
518
+ let teamName;
519
+ if (currentTeamId) try {
520
+ const team = await getTeamById(currentTeamId);
521
+ if (team.name !== organization.name) teamName = team.name;
522
+ } catch {}
523
+ return {
524
+ organizationName: organization.name,
525
+ teamName
526
+ };
527
+ } catch {
528
+ return null;
529
+ }
530
+ }
531
+ //#endregion
532
+ //#region src/storage/localFileSystemProvider.ts
533
+ /**
534
+ * Local filesystem storage provider for media files.
535
+ *
536
+ * Stores media in the local promptfoo data directory (~/.promptfoo/media).
537
+ * Uses content-based hashing for deduplication.
538
+ */
539
+ const MEDIA_SUBDIR = "media";
540
+ const HASH_INDEX_FILE = "hash-index.json";
541
+ /**
542
+ * Get file extension from content type
543
+ */
544
+ function getExtensionFromContentType(contentType) {
545
+ return {
546
+ "audio/wav": "wav",
547
+ "audio/mp3": "mp3",
548
+ "audio/mpeg": "mp3",
549
+ "audio/ogg": "ogg",
550
+ "audio/webm": "webm",
551
+ "image/png": "png",
552
+ "image/jpeg": "jpg",
553
+ "image/jpg": "jpg",
554
+ "image/gif": "gif",
555
+ "image/webp": "webp",
556
+ "video/mp4": "mp4",
557
+ "video/webm": "webm",
558
+ "video/ogg": "ogv"
559
+ }[contentType] || "bin";
560
+ }
561
+ /**
562
+ * Compute SHA-256 hash of data
563
+ */
564
+ function computeHash(data) {
565
+ return crypto.createHash("sha256").update(data).digest("hex");
566
+ }
567
+ /**
568
+ * Local filesystem storage provider
569
+ */
570
+ var LocalFileSystemProvider = class {
571
+ providerId = "local";
572
+ basePath;
573
+ hashIndexPath;
574
+ hashIndex = /* @__PURE__ */ new Map();
575
+ constructor(config = {}) {
576
+ this.basePath = config.basePath || path.join(require_logger.getConfigDirectoryPath(true), MEDIA_SUBDIR);
577
+ this.hashIndexPath = path.join(this.basePath, HASH_INDEX_FILE);
578
+ this.ensureDirectory();
579
+ this.loadHashIndex();
580
+ }
581
+ /**
582
+ * Ensure the media directory exists
583
+ */
584
+ ensureDirectory() {
585
+ if (!fs.existsSync(this.basePath)) {
586
+ fs.mkdirSync(this.basePath, { recursive: true });
587
+ require_logger.logger.debug(`[LocalStorage] Created media directory: ${this.basePath}`);
588
+ }
589
+ }
590
+ /**
591
+ * Load the hash index from disk
592
+ */
593
+ loadHashIndex() {
594
+ try {
595
+ if (fs.existsSync(this.hashIndexPath)) {
596
+ const data = fs.readFileSync(this.hashIndexPath, "utf8");
597
+ const parsed = JSON.parse(data);
598
+ this.hashIndex = new Map(Object.entries(parsed));
599
+ require_logger.logger.debug(`[LocalStorage] Loaded hash index with ${this.hashIndex.size} entries`);
600
+ }
601
+ } catch (error) {
602
+ require_logger.logger.warn(`[LocalStorage] Failed to load hash index, starting fresh`, { error });
603
+ this.hashIndex = /* @__PURE__ */ new Map();
604
+ }
605
+ }
606
+ /**
607
+ * Save the hash index to disk
608
+ */
609
+ async saveHashIndex() {
610
+ try {
611
+ const data = JSON.stringify(Object.fromEntries(this.hashIndex), null, 2);
612
+ await fs_promises.writeFile(this.hashIndexPath, data, "utf8");
613
+ } catch (error) {
614
+ require_logger.logger.warn(`[LocalStorage] Failed to save hash index`, { error });
615
+ }
616
+ }
617
+ /**
618
+ * Get the full path for a storage key
619
+ */
620
+ getFilePath(key) {
621
+ const targetPath = path.resolve(this.basePath, key);
622
+ const safeBase = path.resolve(this.basePath) + path.sep;
623
+ if (!targetPath.startsWith(safeBase)) throw new Error(`[LocalStorage] Invalid media key: path traversal attempt detected ("${key}")`);
624
+ return targetPath;
625
+ }
626
+ /**
627
+ * Generate a storage key from hash and metadata
628
+ */
629
+ generateKey(hash, metadata) {
630
+ const extension = getExtensionFromContentType(metadata.contentType);
631
+ return `${metadata.mediaType || "media"}/${hash.slice(0, 12)}.${extension}`;
632
+ }
633
+ async store(data, metadata) {
634
+ const contentHash = computeHash(data);
635
+ const existingKey = await this.findByHash(contentHash);
636
+ if (existingKey) {
637
+ require_logger.logger.debug(`[LocalStorage] Deduplicated media: ${existingKey}`);
638
+ return {
639
+ ref: {
640
+ provider: this.providerId,
641
+ key: existingKey,
642
+ contentHash,
643
+ metadata
644
+ },
645
+ deduplicated: true
646
+ };
647
+ }
648
+ const key = this.generateKey(contentHash, metadata);
649
+ const filePath = this.getFilePath(key);
650
+ const dir = path.dirname(filePath);
651
+ await fs_promises.mkdir(dir, { recursive: true });
652
+ await fs_promises.writeFile(filePath, data);
653
+ this.hashIndex.set(contentHash, key);
654
+ await this.saveHashIndex();
655
+ const metadataPath = `${filePath}.meta.json`;
656
+ await fs_promises.writeFile(metadataPath, JSON.stringify({
657
+ ...metadata,
658
+ contentHash,
659
+ sizeBytes: data.length,
660
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
661
+ }, null, 2));
662
+ require_logger.logger.debug(`[LocalStorage] Stored media: ${key} (${data.length} bytes)`);
663
+ return {
664
+ ref: {
665
+ provider: this.providerId,
666
+ key,
667
+ contentHash,
668
+ metadata: {
669
+ ...metadata,
670
+ sizeBytes: data.length,
671
+ contentHash
672
+ }
673
+ },
674
+ deduplicated: false
675
+ };
676
+ }
677
+ async retrieve(key) {
678
+ const filePath = this.getFilePath(key);
679
+ try {
680
+ return await fs_promises.readFile(filePath);
681
+ } catch (error) {
682
+ if (error.code === "ENOENT") throw new Error(`[LocalStorage] Media not found: ${key}`);
683
+ throw error;
684
+ }
685
+ }
686
+ async exists(key) {
687
+ try {
688
+ const filePath = this.getFilePath(key);
689
+ await fs_promises.access(filePath);
690
+ return true;
691
+ } catch {
692
+ return false;
693
+ }
694
+ }
695
+ async delete(key) {
696
+ const filePath = this.getFilePath(key);
697
+ const metadataPath = `${filePath}.meta.json`;
698
+ for (const [hash, storedKey] of this.hashIndex.entries()) if (storedKey === key) {
699
+ this.hashIndex.delete(hash);
700
+ break;
701
+ }
702
+ await this.saveHashIndex();
703
+ try {
704
+ await fs_promises.unlink(filePath);
705
+ } catch (error) {
706
+ if (error.code !== "ENOENT") throw error;
707
+ }
708
+ try {
709
+ await fs_promises.unlink(metadataPath);
710
+ } catch (error) {
711
+ if (error.code !== "ENOENT") throw error;
712
+ }
713
+ require_logger.logger.debug(`[LocalStorage] Deleted media: ${key}`);
714
+ }
715
+ async getUrl(key, _expiresIn) {
716
+ try {
717
+ const filePath = this.getFilePath(key);
718
+ await fs_promises.access(filePath);
719
+ return `file://${filePath}`;
720
+ } catch {
721
+ return null;
722
+ }
723
+ }
724
+ async findByHash(contentHash) {
725
+ const key = this.hashIndex.get(contentHash);
726
+ if (key && await this.exists(key)) return key;
727
+ if (key) {
728
+ this.hashIndex.delete(contentHash);
729
+ await this.saveHashIndex();
730
+ }
731
+ return null;
732
+ }
733
+ /**
734
+ * Get the base path for this provider
735
+ */
736
+ getBasePath() {
737
+ return this.basePath;
738
+ }
739
+ /**
740
+ * Get stats about stored media
741
+ */
742
+ async getStats() {
743
+ let fileCount = 0;
744
+ let totalSizeBytes = 0;
745
+ const walkDir = async (dir) => {
746
+ let entries;
747
+ try {
748
+ entries = await fs_promises.readdir(dir, { withFileTypes: true });
749
+ } catch (error) {
750
+ if (error.code === "ENOENT") return;
751
+ throw error;
752
+ }
753
+ for (const entry of entries) {
754
+ const fullPath = path.join(dir, entry.name);
755
+ if (entry.isDirectory()) await walkDir(fullPath);
756
+ else if (!entry.name.endsWith(".json")) try {
757
+ const stat = await fs_promises.stat(fullPath);
758
+ fileCount++;
759
+ totalSizeBytes += stat.size;
760
+ } catch (error) {
761
+ if (error.code !== "ENOENT") throw error;
762
+ }
763
+ }
764
+ };
765
+ await walkDir(this.basePath);
766
+ return {
767
+ fileCount,
768
+ totalSizeBytes
769
+ };
770
+ }
771
+ };
772
+ //#endregion
773
+ //#region src/storage/index.ts
774
+ /**
775
+ * Media storage module for promptfoo.
776
+ *
777
+ * Provides abstraction for storing binary media (audio, images, video)
778
+ * separately from the main database.
779
+ *
780
+ * @example
781
+ * ```typescript
782
+ * import { getMediaStorage, storeMedia, retrieveMedia } from './storage';
783
+ *
784
+ * // Store audio data
785
+ * const { ref } = await storeMedia(audioBuffer, {
786
+ * contentType: 'audio/wav',
787
+ * mediaType: 'audio',
788
+ * evalId: 'eval-123',
789
+ * });
790
+ *
791
+ * // Later, retrieve it
792
+ * const buffer = await retrieveMedia(ref.key);
793
+ * ```
794
+ */
795
+ let defaultProvider = null;
796
+ /**
797
+ * Get the default media storage provider.
798
+ *
799
+ * For OSS, this returns a LocalFileSystemProvider.
800
+ * For cloud deployments, this can be overridden.
801
+ */
802
+ function getMediaStorage(config) {
803
+ if (!defaultProvider) {
804
+ defaultProvider = new LocalFileSystemProvider({ basePath: config?.basePath || require_logger.getEnvString("PROMPTFOO_MEDIA_PATH") });
805
+ require_logger.logger.debug(`[MediaStorage] Initialized local storage provider`);
806
+ }
807
+ return defaultProvider;
808
+ }
809
+ /**
810
+ * Store media data and return a reference
811
+ */
812
+ async function storeMedia(data, metadata) {
813
+ return getMediaStorage().store(data, metadata);
814
+ }
815
+ /**
816
+ * Check if media storage should be used based on config/env
817
+ *
818
+ * Returns true if media storage is enabled (default for new installs).
819
+ * Set PROMPTFOO_INLINE_MEDIA=true to disable and use legacy inline base64.
820
+ */
821
+ function isMediaStorageEnabled() {
822
+ const inline = require_logger.getEnvString("PROMPTFOO_INLINE_MEDIA");
823
+ return inline !== "true" && inline !== "1";
824
+ }
825
+ //#endregion
826
+ Object.defineProperty(exports, "checkCloudPermissions", {
827
+ enumerable: true,
828
+ get: function() {
829
+ return checkCloudPermissions;
830
+ }
831
+ });
832
+ Object.defineProperty(exports, "getCloudDatabaseId", {
833
+ enumerable: true,
834
+ get: function() {
835
+ return getCloudDatabaseId;
836
+ }
837
+ });
838
+ Object.defineProperty(exports, "getEvalConfigFromCloud", {
839
+ enumerable: true,
840
+ get: function() {
841
+ return getEvalConfigFromCloud;
842
+ }
843
+ });
844
+ Object.defineProperty(exports, "getMediaStorage", {
845
+ enumerable: true,
846
+ get: function() {
847
+ return getMediaStorage;
848
+ }
849
+ });
850
+ Object.defineProperty(exports, "getOrgContext", {
851
+ enumerable: true,
852
+ get: function() {
853
+ return getOrgContext;
854
+ }
855
+ });
856
+ Object.defineProperty(exports, "getPluginSeverityOverridesFromCloud", {
857
+ enumerable: true,
858
+ get: function() {
859
+ return getPluginSeverityOverridesFromCloud;
860
+ }
861
+ });
862
+ Object.defineProperty(exports, "getPoliciesFromCloud", {
863
+ enumerable: true,
864
+ get: function() {
865
+ return getPoliciesFromCloud;
866
+ }
867
+ });
868
+ Object.defineProperty(exports, "getProviderFromCloud", {
869
+ enumerable: true,
870
+ get: function() {
871
+ return getProviderFromCloud;
872
+ }
873
+ });
874
+ Object.defineProperty(exports, "isCloudProvider", {
875
+ enumerable: true,
876
+ get: function() {
877
+ return isCloudProvider;
878
+ }
879
+ });
880
+ Object.defineProperty(exports, "isMediaStorageEnabled", {
881
+ enumerable: true,
882
+ get: function() {
883
+ return isMediaStorageEnabled;
884
+ }
885
+ });
886
+ Object.defineProperty(exports, "makeRequest", {
887
+ enumerable: true,
888
+ get: function() {
889
+ return makeRequest;
890
+ }
891
+ });
892
+ Object.defineProperty(exports, "resolveTeamId", {
893
+ enumerable: true,
894
+ get: function() {
895
+ return resolveTeamId;
896
+ }
897
+ });
898
+ Object.defineProperty(exports, "storeMedia", {
899
+ enumerable: true,
900
+ get: function() {
901
+ return storeMedia;
902
+ }
903
+ });
904
+ Object.defineProperty(exports, "validateLinkedTargetId", {
905
+ enumerable: true,
906
+ get: function() {
907
+ return validateLinkedTargetId;
908
+ }
909
+ });
910
+
911
+ //# sourceMappingURL=storage-CA-v9V2v.cjs.map