promptfoo 0.121.5 → 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 (490) hide show
  1. package/dist/src/{ListApp-BRUsT43Y.js → ListApp-DLmM02JS.js} +1 -1
  2. package/dist/src/{accounts-CaLNYnf7.js → accounts-Ca7WIoPY.js} +12 -7
  3. package/dist/src/{accounts-CLJHCDDb.js → accounts-CjFnOPmb.js} +13 -8
  4. package/dist/src/{accounts-BIFntVWB.cjs → accounts-CmWzeD2d.cjs} +16 -10
  5. package/dist/src/{accounts-bnyHT7Ju.js → accounts-DanM1wq_.js} +12 -7
  6. package/dist/src/{agentic-utils-BclbiXiq.js → agentic-utils-CJ0j3fBi.js} +2 -2
  7. package/dist/src/{agentic-utils-B5krlibj.js → agentic-utils-DDEGRV9v.js} +2 -2
  8. package/dist/src/{agentic-utils-D2x0wGhB.cjs → agentic-utils-DvPWSUpb.cjs} +8 -7
  9. package/dist/src/{agentic-utils-Ba67xmgs.js → agentic-utils-TxUEMPYS.js} +2 -2
  10. package/dist/src/{agents-WULPVjbH.cjs → agents-B4sRuXg3.cjs} +7 -6
  11. package/dist/src/{agents-DhxWMCtH.js → agents-B8q7h_ek.js} +4 -4
  12. package/dist/src/{agents-BGqaTDnr.js → agents-CBgJvRkB.js} +20 -9
  13. package/dist/src/{agents-n6vPqV3i.js → agents-CYn2n3QP.js} +4 -4
  14. package/dist/src/{agents-BV9yFpXX.js → agents-D-vDNFx4.js} +20 -9
  15. package/dist/src/{agents-BYdMl1UE.js → agents-LrHuQqr1.js} +20 -9
  16. package/dist/src/{agents-emVcx3yh.js → agents-QGg76OF-.js} +2 -2
  17. package/dist/src/{agents-DiWmQYH9.cjs → agents-eHZ9nlgA.cjs} +21 -10
  18. package/dist/src/{aimlapi-uPGp0Zdo.js → aimlapi-CJEbQ0o6.js} +6 -6
  19. package/dist/src/{aimlapi-DR4pgeiC.js → aimlapi-D5HXzZ0s.js} +6 -6
  20. package/dist/src/{aimlapi-BzLjZI_m.cjs → aimlapi-T6HGNxNe.cjs} +7 -7
  21. package/dist/src/{aimlapi-BxqK9HF_.js → aimlapi-eYv3a_DK.js} +6 -6
  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 +6 -6
  33. package/dist/src/{audio-Da8U9IS5.js → audio-BqnRvcWG.js} +3 -3
  34. package/dist/src/{audio-BvpTOArF.js → audio-CPMtV1yR.js} +3 -3
  35. package/dist/src/{audio-CScmnmEB.js → audio-DyiebVB3.js} +3 -3
  36. package/dist/src/{audio-C0vDeS0j.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-BTux96b1.js → base-CKLo890h.js} +4 -3
  42. package/dist/src/{base-BOMaNEes.js → base-Co80MMCi.js} +4 -3
  43. package/dist/src/{base-Tw6uhH8K.cjs → base-DGJW48uz.cjs} +5 -4
  44. package/dist/src/{base-dYsl2hmL.js → base-E9I8zXjz.js} +4 -3
  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-B95F_7vE.cjs → blobs-B0977K1O.cjs} +7 -6
  50. package/dist/src/{blobs-D_gg8nbm.js → blobs-CeFdPn_T.js} +2 -2
  51. package/dist/src/{blobs-DjLby-uP.js → blobs-DODuTK-a.js} +2 -2
  52. package/dist/src/{blobs-BW4U31ue.js → blobs-Dwef1Ao1.js} +2 -2
  53. package/dist/src/{cache-DGg-yTZG.cjs → cache-CPGUA4Yl.cjs} +135 -25
  54. package/dist/src/cache-Cf7b4pWE.js +3 -0
  55. package/dist/src/{cache-Bzttsk0X.js → cache-DIXbtkNO.js} +125 -10
  56. package/dist/src/{cache-BI5BY7ey.js → cache-DpPWrkTE.js} +127 -11
  57. package/dist/src/{cache-Cr-qWIbP.js → cache-roFAE0cI.js} +125 -10
  58. package/dist/src/{chat-DChSH_Es.js → chat-CUCorGiL.js} +9 -9
  59. package/dist/src/{chat-DH97tVV9.cjs → chat-DG1wG4w0.cjs} +6 -6
  60. package/dist/src/{chat-Cx_LkwvZ.js → chat-Dabu84Br.js} +11 -11
  61. package/dist/src/{chat-BLOdH60v.js → chat-DqUFcWI0.js} +11 -11
  62. package/dist/src/{chat-vYqqv1gP.cjs → chat-DxTDQ83C.cjs} +14 -13
  63. package/dist/src/{chat-DG2LkwLq.js → chat-GmlolEwo.js} +4 -4
  64. package/dist/src/{chat-aMQZw6R7.js → chat-TP8Qifkh.js} +4 -4
  65. package/dist/src/{chat-D9nudO9b.js → chat-iwaM5UTQ.js} +4 -4
  66. package/dist/src/{chatkit-B8X34dQc.js → chatkit-B6DWi70Q.js} +3 -3
  67. package/dist/src/{chatkit-D44VyUyB.cjs → chatkit-BYveR48_.cjs} +6 -5
  68. package/dist/src/{chatkit-BXu42Qwt.js → chatkit-fARZwEfV.js} +3 -3
  69. package/dist/src/{chatkit-CbMRoeYw.js → chatkit-lb6FK02w.js} +1 -1
  70. package/dist/src/{claude-agent-sdk-BzNZeZ0N.js → claude-agent-sdk-BQNp_y-F.js} +209 -64
  71. package/dist/src/{claude-agent-sdk-BjriSVRZ.js → claude-agent-sdk-D5Jl0SDh.js} +210 -65
  72. package/dist/src/{claude-agent-sdk-BRq0bbIK.cjs → claude-agent-sdk-DH416NBD.cjs} +216 -70
  73. package/dist/src/{claude-agent-sdk-DYv_AJ8u.js → claude-agent-sdk-x1XJ1-pU.js} +210 -65
  74. package/dist/src/{cloud-Da0bofJd.js → cloud-D3DiFqH6.js} +2 -2
  75. package/dist/src/cloud-p96PA4MH.js +3 -0
  76. package/dist/src/{cloudflare-ai-CXC4b1EU.js → cloudflare-ai-B6NVI3ax.js} +4 -4
  77. package/dist/src/{cloudflare-ai-DJv5qnyb.cjs → cloudflare-ai-CEAW-xQa.cjs} +6 -6
  78. package/dist/src/{cloudflare-ai-CyBoIs1Q.js → cloudflare-ai-RFSojyXG.js} +4 -4
  79. package/dist/src/{cloudflare-ai-DGOwgexC.js → cloudflare-ai-r4tbYmWU.js} +4 -4
  80. package/dist/src/{cloudflare-gateway-D-dnkzCF.js → cloudflare-gateway-BCkLouto.js} +3 -3
  81. package/dist/src/{cloudflare-gateway-TJkVrZlB.js → cloudflare-gateway-BaZ4insB.js} +3 -3
  82. package/dist/src/{cloudflare-gateway-1sAoOyft.js → cloudflare-gateway-CF-Vb-2Z.js} +3 -3
  83. package/dist/src/{cloudflare-gateway-DKVjkDav.cjs → cloudflare-gateway-TJMLBj6I.cjs} +5 -5
  84. package/dist/src/{codex-app-server-CCe0TiDc.js → codex-app-server-B8KHEiF4.js} +5 -5
  85. package/dist/src/{codex-app-server-VMRnjZ68.cjs → codex-app-server-CnrLBCeA.cjs} +12 -11
  86. package/dist/src/{codex-app-server-CCLjqCh9.js → codex-app-server-DIXZ230V.js} +4 -4
  87. package/dist/src/{codex-app-server-CPW1LFwh.js → codex-app-server-Dd22dC_N.js} +5 -5
  88. package/dist/src/{codex-sdk-BgEFQ70r.js → codex-sdk-B6Wah8Pa.js} +5 -5
  89. package/dist/src/codex-sdk-BGjVAk23.js +3 -0
  90. package/dist/src/{codex-sdk-Bd8UbO9q.cjs → codex-sdk-CFF6gUyi.cjs} +18 -10
  91. package/dist/src/{codex-sdk-Bzb_TqX9.js → codex-sdk-CmQABzV3.js} +3 -3
  92. package/dist/src/{codex-sdk-DfvDTN33.js → codex-sdk-D2d54RL8.js} +5 -5
  93. package/dist/src/{cometapi-B5ImDlSm.js → cometapi-Bu9B8NUY.js} +7 -7
  94. package/dist/src/{cometapi-CCbpHkuF.js → cometapi-CtzNCHKu.js} +7 -7
  95. package/dist/src/{cometapi-BgAkuYCw.cjs → cometapi-DHCDlQUI.cjs} +8 -8
  96. package/dist/src/{cometapi-CC7hWxmX.js → cometapi-OBILPLlu.js} +7 -7
  97. package/dist/src/{completion-Vq_ad618.js → completion-CO2e1_62.js} +4 -4
  98. package/dist/src/{completion-DtQ72Bm3.cjs → completion-CSYfl2cd.cjs} +6 -6
  99. package/dist/src/{completion-2iuYVxwi.js → completion-DZNxcyfG.js} +5 -5
  100. package/dist/src/{completion-CrD6MQ93.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-Un4Q_huE.js → createHash-CGVzWdjj.js} +1 -1
  107. package/dist/src/{createHash-VvBIc-AW.cjs → createHash-CSiqnK5P.cjs} +2 -2
  108. package/dist/src/{createHash-DPpsZgFF.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--3qzPa-6.js → docker-4D1eL6Gq.js} +5 -5
  118. package/dist/src/{docker-Dorv4_Dg.js → docker-BBv1WUDu.js} +5 -5
  119. package/dist/src/{docker-D3AY-5F5.cjs → docker-D06JUoe2.cjs} +6 -6
  120. package/dist/src/{docker-DCsCDvwM.js → docker-DdJQBxK9.js} +5 -5
  121. package/dist/src/{embedding-DNRvZwRN.js → embedding--UZVe4_7.js} +5 -5
  122. package/dist/src/{embedding-BXhN5lCH.cjs → embedding-BbrwopfX.cjs} +6 -6
  123. package/dist/src/{embedding-ChS1ivFS.js → embedding-Bi3rxrZF.js} +5 -5
  124. package/dist/src/{embedding-D_bI4NDq.js → embedding-C251p1-8.js} +4 -4
  125. package/dist/src/{errors-DFHe4L-n.js → errors-9PcUL8BC.js} +1 -1
  126. package/dist/src/{esm-B_rGuPTo.cjs → esm-BIKakvNa.cjs} +8 -7
  127. package/dist/src/{esm-BRkfNsYs.js → esm-BTK1W7lG.js} +1 -1
  128. package/dist/src/{esm-BX8fwlAO.js → esm-Bexx2PFc.js} +1 -1
  129. package/dist/src/{eval-DJ_4A-tr.js → eval-0VRANImH.js} +19 -19
  130. package/dist/src/{eval-BQPLBJbw.js → eval-DscR5iOM.js} +1 -1
  131. package/dist/src/{evalResult-pSvGWFMo.js → evalResult-2RRJvFyB.js} +18 -11
  132. package/dist/src/{evalResult-Cx-8OWkb.cjs → evalResult-CvtS8h8u.cjs} +29 -11
  133. package/dist/src/evalResult-DqzsS6_W.js +3 -0
  134. package/dist/src/{evalResult-D6P5I5il.js → evalResult-eUkJv9Ko.js} +17 -10
  135. package/dist/src/evaluator-DNdJF1Gv.js +3 -0
  136. package/dist/src/{evaluator-D-UIbbYq.js → evaluator-DRoiYB2q.js} +258 -132
  137. package/dist/src/evaluatorHelpers-BsYP_muT.js +511 -0
  138. package/dist/src/evaluatorHelpers-CRqTvSux.cjs +537 -0
  139. package/dist/src/evaluatorHelpers-DuqFFfq7.js +510 -0
  140. package/dist/src/{extractor-YlZbUMsL.js → extractor-BR7XAzAL.js} +5 -5
  141. package/dist/src/{extractor-Dxr2J_wK.cjs → extractor-BdxEtt3J.cjs} +6 -6
  142. package/dist/src/{extractor-DxyiFhPk.js → extractor-CIW3iN-b.js} +5 -5
  143. package/dist/src/{extractor-BM3jRERL.js → extractor-CxRtnaHl.js} +5 -5
  144. package/dist/src/{fetch-Y5qX_kST.js → fetch-BufrQtvR.js} +90 -26
  145. package/dist/src/{fetch-B6ch2nU2.js → fetch-DXUnXkVU.js} +86 -26
  146. package/dist/src/{fetch-NuqXW1Xb.cjs → fetch-Dw4XZHjj.cjs} +115 -32
  147. package/dist/src/{fetch-D9xxyC1p.js → fetch-It34O8Ur.js} +90 -26
  148. package/dist/src/fetch-_YgGd2qv.js +3 -0
  149. package/dist/src/{fileExtensions-D9h-8Wxg.cjs → fileExtensions-BhdwzYaD.cjs} +24 -1
  150. package/dist/src/{fileExtensions-BGh-W-HT.js → fileExtensions-CXRfY3Ss.js} +12 -2
  151. package/dist/src/{fileExtensions-DysCsxNG.js → fileExtensions-D4GCJ67J.js} +12 -2
  152. package/dist/src/{formatDuration-Ch4A7G3o.js → formatDuration-CMVNrYvE.js} +1 -1
  153. package/dist/src/{genaiTracer-BokHC-MW.cjs → genaiTracer-14nugQQx.cjs} +14 -2
  154. package/dist/src/{genaiTracer-C3ZPQU60.js → genaiTracer-BPVvltoW.js} +2 -2
  155. package/dist/src/{genaiTracer-DxODqT9e.js → genaiTracer-D18lYzhB.js} +2 -2
  156. package/dist/src/{genaiTracer-CFny3gOy.js → genaiTracer-jJKYsnjc.js} +2 -2
  157. package/dist/src/goat-Ckd3q3AY.js +467 -0
  158. package/dist/src/goat-Qgurm-NP.js +466 -0
  159. package/dist/src/goat-ghadEDdy.js +465 -0
  160. package/dist/src/goat-una6pZGP.cjs +469 -0
  161. package/dist/src/graders-BDT7dif6.js +3 -0
  162. package/dist/src/{graders-CgPn32yp.js → graders-BGP99PdK.js} +1017 -84
  163. package/dist/src/{graders-BoUqsCEm.js → graders-BX0f2tvS.js} +1022 -84
  164. package/dist/src/{graders-CwrbifOo.js → graders-C0nXU_ZP.js} +1020 -82
  165. package/dist/src/{graders-Bw1wk_21.cjs → graders-ClrU2fnd.cjs} +1085 -128
  166. package/dist/src/hydra-BSNZZm2M.js +543 -0
  167. package/dist/src/hydra-BxdG4nkg.js +541 -0
  168. package/dist/src/hydra-DE4xWwyc.js +542 -0
  169. package/dist/src/hydra-DrJttnvw.cjs +542 -0
  170. package/dist/src/image-B4oBtu6J.js +443 -0
  171. package/dist/src/{image-Dr_3I3nK.js → image-BN-hjLL9.js} +3 -3
  172. package/dist/src/{image-BeWaInPF.js → image-B_fPIwdg.js} +3 -3
  173. package/dist/src/image-BvUAW344.js +442 -0
  174. package/dist/src/image-Cvjwx1uY.js +442 -0
  175. package/dist/src/{image-D10dNAav.cjs → image-DfVCGPbI.cjs} +4 -4
  176. package/dist/src/{image-qjO6FWPs.js → image-QzmydkiG.js} +3 -3
  177. package/dist/src/image-X0oY4350.cjs +465 -0
  178. package/dist/src/index.cjs +688 -313
  179. package/dist/src/index.d.cts +3152 -1617
  180. package/dist/src/index.d.ts +3151 -1616
  181. package/dist/src/index.js +582 -223
  182. package/dist/src/indirectWebPwn-02ZIghCS.js +259 -0
  183. package/dist/src/indirectWebPwn-BJ22AbQa.cjs +397 -0
  184. package/dist/src/indirectWebPwn-CbjUG0rh.js +385 -0
  185. package/dist/src/indirectWebPwn-CfQJt3gk.cjs +260 -0
  186. package/dist/src/indirectWebPwn-DBQhOjoD.js +260 -0
  187. package/dist/src/indirectWebPwn-OsXnKejv.js +259 -0
  188. package/dist/src/indirectWebPwn-tNx9OZ35.js +385 -0
  189. package/dist/src/indirectWebPwn-uyWdHx04.js +386 -0
  190. package/dist/src/inputVariables-B0qUChbV.js +467 -0
  191. package/dist/src/inputVariables-DUGMb9Ka.js +464 -0
  192. package/dist/src/inputVariables-DXFdi7AI.js +468 -0
  193. package/dist/src/inputVariables-Dq9W-Z3a.cjs +475 -0
  194. package/dist/src/{interactiveCheck-CCICw2cy.js → interactiveCheck-C4QlIuoR.js} +1 -1
  195. package/dist/src/{invariant-kfQ8Bu82.cjs → invariant-QtnLD03y.cjs} +1 -1
  196. package/dist/src/iterative-CpU6i2As.js +490 -0
  197. package/dist/src/iterative-DJQEQpG3.js +491 -0
  198. package/dist/src/iterative-DQBuWM-j.cjs +493 -0
  199. package/dist/src/iterative-FTS4Bz67.js +492 -0
  200. package/dist/src/iterativeImage-BUABMVOA.js +413 -0
  201. package/dist/src/iterativeImage-ByFWkxax.cjs +415 -0
  202. package/dist/src/iterativeImage-BzUapOUi.js +414 -0
  203. package/dist/src/iterativeImage-Doz8mgxF.js +413 -0
  204. package/dist/src/iterativeMeta-B3YiAOc8.js +386 -0
  205. package/dist/src/iterativeMeta-C7APE_P1.js +385 -0
  206. package/dist/src/iterativeMeta-CSS8M6Ds.cjs +385 -0
  207. package/dist/src/iterativeMeta-DgoQ7bLh.js +384 -0
  208. package/dist/src/iterativeTree-B5zxBBSW.js +769 -0
  209. package/dist/src/iterativeTree-CNyIk0Yn.js +768 -0
  210. package/dist/src/iterativeTree-CPMF10ve.cjs +771 -0
  211. package/dist/src/iterativeTree-DvZ7GBwt.js +770 -0
  212. package/dist/src/{knowledgeBase-Dr3Kib7F.js → knowledgeBase-BadkINlJ.js} +24 -10
  213. package/dist/src/{knowledgeBase-BBETc5-S.js → knowledgeBase-Bi_8sV-H.js} +23 -9
  214. package/dist/src/{knowledgeBase-CzAi2rUI.js → knowledgeBase-CkMljjdg.js} +24 -10
  215. package/dist/src/{knowledgeBase-C8qOo26M.cjs → knowledgeBase-DUh34xba.cjs} +25 -11
  216. package/dist/src/{litellm-DRc4qWfc.js → litellm-BKBo0jpC.js} +4 -4
  217. package/dist/src/{litellm-BLSiANhk.js → litellm-BXyn5kZK.js} +4 -4
  218. package/dist/src/{litellm-DQGo_juI.js → litellm-CNcfbCfa.js} +4 -4
  219. package/dist/src/{litellm-CaUmV7Mk.cjs → litellm-CtAr7bKG.cjs} +5 -5
  220. package/dist/src/{logger-COuQb2xB.cjs → logger-cfNpzI4o.cjs} +13 -55
  221. package/dist/src/{luma-ray-B-tNZzqW.js → luma-ray-BMX1iEB6.js} +5 -5
  222. package/dist/src/{luma-ray-CtS3OlGq.js → luma-ray-CR5TSpp4.js} +5 -5
  223. package/dist/src/{luma-ray-if-Ml4R9.cjs → luma-ray-D3FUc2K3.cjs} +9 -8
  224. package/dist/src/{luma-ray-PJJgUjOc.js → luma-ray-OEMmS1RB.js} +5 -5
  225. package/dist/src/main.js +704 -208
  226. package/dist/src/memoryPoisoning-CM83NWYl.js +107 -0
  227. package/dist/src/memoryPoisoning-D8h9gXJF.js +106 -0
  228. package/dist/src/memoryPoisoning-Dp-btinn.cjs +106 -0
  229. package/dist/src/memoryPoisoning-cLuCoTuJ.js +106 -0
  230. package/dist/src/{messages-CewuNcNS.js → messages-BabO-cX8.js} +17 -9
  231. package/dist/src/{messages-BnsVHUnm.cjs → messages-DBPir0TQ.cjs} +24 -15
  232. package/dist/src/{messages-B9dSjrNf.js → messages-DGUlSNU7.js} +18 -10
  233. package/dist/src/{messages-CI69Lasb.js → messages-vsE_-Lv0.js} +18 -10
  234. package/dist/src/{meteor-CeGo0Lu2.js → meteor--TZYICTI.js} +1 -1
  235. package/dist/src/{meteor-BBGcGeCa.cjs → meteor-CR226f7Z.cjs} +2 -2
  236. package/dist/src/{meteor-Wc_aUVvu.js → meteor-Cl_yd7rJ.js} +1 -1
  237. package/dist/src/{meteor-BKTM-7KS.js → meteor-Dce-_zGQ.js} +1 -1
  238. package/dist/src/mischievousUser-0l8GD7Dp.js +46 -0
  239. package/dist/src/mischievousUser-BUOP9W5r.js +46 -0
  240. package/dist/src/mischievousUser-frFYKxu6.js +47 -0
  241. package/dist/src/mischievousUser-olGgHIVR.cjs +46 -0
  242. package/dist/src/{modelslab-BkapYJhh.cjs → modelslab-CNV5bMSk.cjs} +7 -7
  243. package/dist/src/{modelslab-zpz9JcK0.js → modelslab-Cogmu4mG.js} +6 -6
  244. package/dist/src/{modelslab-D73OnKSx.js → modelslab-Dzst7VTU.js} +6 -6
  245. package/dist/src/{modelslab-BCLOtfek.js → modelslab-EyDczZ5A.js} +6 -6
  246. package/dist/src/{nova-reel-B8F_TK5w.js → nova-reel-BGPNBOMS.js} +5 -5
  247. package/dist/src/{nova-reel-Bx0NFV2f.js → nova-reel-B_5NKFu1.js} +5 -5
  248. package/dist/src/{nova-reel-CNGJTLtG.js → nova-reel-C4eUJGse.js} +5 -5
  249. package/dist/src/{nova-reel-DkT7tnoB.cjs → nova-reel-CjJRxI1X.cjs} +9 -8
  250. package/dist/src/{nova-sonic-BaXRN1cr.js → nova-sonic-BNGmgfFz.js} +3 -3
  251. package/dist/src/{nova-sonic-BeTRaFOh.js → nova-sonic-ChPlh5na.js} +2 -2
  252. package/dist/src/{nova-sonic-CL7Zqv0G.js → nova-sonic-CrV0iaY_.js} +3 -3
  253. package/dist/src/{nova-sonic-YT426juD.cjs → nova-sonic-DuOG9Aun.cjs} +5 -4
  254. package/dist/src/{openai-Cy1XLs0c.cjs → openai-C3uXv8wS.cjs} +2 -2
  255. package/dist/src/{openai-BT-JvDse.js → openai-CJrsh9n4.js} +1 -1
  256. package/dist/src/{openai-D4fxGvRx.js → openai-zgwBb4Ff.js} +1 -1
  257. package/dist/src/{openclaw-Bq7RVR3k.js → openclaw-BIHlu_36.js} +9 -8
  258. package/dist/src/{openclaw-DObVgpjC.js → openclaw-CF7fMido.js} +9 -8
  259. package/dist/src/{openclaw-DUBZP3GL.cjs → openclaw-Dphc01BY.cjs} +17 -15
  260. package/dist/src/{openclaw-DA8U4DsD.js → openclaw-zIJAsz3P.js} +9 -8
  261. package/dist/src/{opencode-sdk-BB40Wir1.js → opencode-sdk-B3vlPLsp.js} +38 -3
  262. package/dist/src/{opencode-sdk-ChdK7F7z.js → opencode-sdk-D05JSgMQ.js} +39 -4
  263. package/dist/src/{opencode-sdk-CeqiOcOU.cjs → opencode-sdk-DoY6GbWw.cjs} +45 -9
  264. package/dist/src/{opencode-sdk-BM1UAIv1.js → opencode-sdk-sRKYHGoI.js} +39 -4
  265. package/dist/src/{otlpReceiver-UYMQx3sy.js → otlpReceiver--gTpSagc.js} +119 -3
  266. package/dist/src/{otlpReceiver-C6thJRXi.js → otlpReceiver-B2eaKC8C.js} +118 -2
  267. package/dist/src/{otlpReceiver-CcdIikOu.js → otlpReceiver-BXjcRqAM.js} +119 -3
  268. package/dist/src/{otlpReceiver-DNSQj6bf.cjs → otlpReceiver-CvJdBGSc.cjs} +125 -7
  269. package/dist/src/packageParser--MWTSrPW.js +36 -0
  270. package/dist/src/packageParser-CgE-ziRo.js +35 -0
  271. package/dist/src/packageParser-QoCS1FMl.cjs +54 -0
  272. package/dist/src/packageParser-hwwSGnAZ.js +35 -0
  273. package/dist/src/processShim-BBxt7LKO.js +95 -0
  274. package/dist/src/processShim-BcGzU8fY.js +94 -0
  275. package/dist/src/processShim-C_z3aRvF.js +94 -0
  276. package/dist/src/processShim-DSY9BV2T.cjs +98 -0
  277. package/dist/src/promptLength-0qIHyhA5.js +71 -0
  278. package/dist/src/promptLength-4X-Wd8PG.js +72 -0
  279. package/dist/src/promptLength-B9nZEfO6.js +71 -0
  280. package/dist/src/promptLength-BbBbDHNj.cjs +94 -0
  281. package/dist/src/promptfoo-BDrfT30-.js +180 -0
  282. package/dist/src/promptfoo-Cm4hiy1Y.js +180 -0
  283. package/dist/src/promptfoo-Rjp-MeBb.js +181 -0
  284. package/dist/src/promptfoo-b-baRMj-.cjs +205 -0
  285. package/dist/src/prompts-BYMtqPCw.js +259 -0
  286. package/dist/src/prompts-C-bqE1Yp.js +260 -0
  287. package/dist/src/prompts-Cp_Qx5Ml.js +270 -0
  288. package/dist/src/prompts-DHhQsANy.js +259 -0
  289. package/dist/src/prompts-D_QpZ2Dm.js +271 -0
  290. package/dist/src/prompts-hNvWBD3z.cjs +284 -0
  291. package/dist/src/prompts-huDVH2CI.js +270 -0
  292. package/dist/src/prompts-p78Hul5i.cjs +289 -0
  293. package/dist/src/{providerRegistry-BESeALrr.cjs → providerRegistry-CZO_w7ue.cjs} +2 -2
  294. package/dist/src/{providerRegistry-DoACwqhD.js → providerRegistry-DHcFiVWX.js} +1 -1
  295. package/dist/src/{providerRegistry-PMsleEzs.js → providerRegistry-ReCd0sFa.js} +1 -1
  296. package/dist/src/{providers-DT-GtF2t.js → providers-B9KzWxAX.js} +739 -11919
  297. package/dist/src/{providers-DRrerKra.js → providers-BCCz6_IX.js} +813 -11944
  298. package/dist/src/{providers-eDShy16E.cjs → providers-BDVVIQM6.cjs} +787 -12132
  299. package/dist/src/{providers-Ctcc592x.js → providers-BYAn82cf.js} +1 -1
  300. package/dist/src/{providers-CJh7iriU.js → providers-DVYRZP4E.js} +746 -11866
  301. package/dist/src/{pythonUtils-C4tltmIn.js → pythonUtils-CLCgQ9tt.js} +1 -1
  302. package/dist/src/{pythonUtils-DNqbnRdx.js → pythonUtils-CgYxeSmO.js} +2 -2
  303. package/dist/src/{pythonUtils-CoLaCwNY.cjs → pythonUtils-Cokhluq3.cjs} +7 -6
  304. package/dist/src/{pythonUtils-DMO68Jg7.js → pythonUtils-D0BYebvX.js} +2 -2
  305. package/dist/src/{quiverai-Bpx6MZ7T.cjs → quiverai-BAp6iTZD.cjs} +4 -4
  306. package/dist/src/{quiverai-CPKhWgaT.js → quiverai-BvIhI_0l.js} +3 -3
  307. package/dist/src/{quiverai-BSS9a7wV.js → quiverai-CdTWPe-A.js} +3 -3
  308. package/dist/src/{quiverai-Bk1KrvL6.js → quiverai-Cv7rJKDz.js} +3 -3
  309. package/dist/src/registry-BUJrgjwv.js +124 -0
  310. package/dist/src/registry-DXm1t_x0.js +125 -0
  311. package/dist/src/registry-Dp5EqoXc.js +124 -0
  312. package/dist/src/registry-KCVF1CFC.cjs +124 -0
  313. package/dist/src/{server-ByxbqAcQ.js → remoteGeneration-B1_XsKXU.js} +16 -147
  314. package/dist/src/{server-gyd6d4Hc.js → remoteGeneration-COpWcmWd.js} +15 -108
  315. package/dist/src/{server-BEECpeGG.cjs → remoteGeneration-DS9N3pgB.cjs} +30 -119
  316. package/dist/src/remoteGeneration-DsaSwmG2.js +217 -0
  317. package/dist/src/render-BNTrbmBw.cjs +384 -0
  318. package/dist/src/render-CSP99NLm.js +348 -0
  319. package/dist/src/render-DFfDeYUK.js +347 -0
  320. package/dist/src/{render-nj-UaPdn.js → render-DznWrxGO.js} +2 -2
  321. package/dist/src/render-_6ur1fhE.js +347 -0
  322. package/dist/src/resourceAttributes-D1jP3kL5.js +17 -0
  323. package/dist/src/resourceAttributes-DQbBB--2.js +16 -0
  324. package/dist/src/resourceAttributes-ephgOvdR.cjs +27 -0
  325. package/dist/src/resourceAttributes-v6-I67fn.js +16 -0
  326. package/dist/src/{responses-CF-ayauu.cjs → responses-1UFFF9N_.cjs} +12 -11
  327. package/dist/src/{responses-B8haB-mD.js → responses-B3W2JvOQ.js} +9 -9
  328. package/dist/src/{responses-1ztiVYsx.js → responses-B6ktc3Ra.js} +7 -7
  329. package/dist/src/{responses-BiaBguAu.js → responses-URRzV8qE.js} +9 -9
  330. package/dist/src/rolldown-runtime-D_mwlA32.cjs +43 -0
  331. package/dist/src/rubyUtils-BYVlQ94c.js +3 -0
  332. package/dist/src/{rubyUtils-CIQFnVz4.js → rubyUtils-CXlFM2rR.js} +2 -2
  333. package/dist/src/{rubyUtils-BI0p46eZ.js → rubyUtils-CnlW8AYb.js} +2 -2
  334. package/dist/src/{rubyUtils-DoifqkiA.cjs → rubyUtils-CqUWBZAt.cjs} +16 -26
  335. package/dist/src/{rubyUtils-DGnoCYL2.js → rubyUtils-DdGojpfv.js} +1 -1
  336. package/dist/src/runtimeTransform-BJOpL9Yc.js +142 -0
  337. package/dist/src/runtimeTransform-Dgh_D7DU.js +143 -0
  338. package/dist/src/runtimeTransform-DigbjU1r.js +142 -0
  339. package/dist/src/runtimeTransform-ON3YYILw.cjs +147 -0
  340. package/dist/src/{sagemaker-ClS_NB07.js → sagemaker-CujrzP1a.js} +61 -50
  341. package/dist/src/{sagemaker-ljtY12VM.cjs → sagemaker-DzffAqo_.cjs} +65 -53
  342. package/dist/src/{sagemaker-C5T60MKf.js → sagemaker-vhtSV7JI.js} +61 -50
  343. package/dist/src/{sagemaker-BDLeW29y.js → sagemaker-yr1QKeBs.js} +61 -50
  344. package/dist/src/{scanner-nOCWNIXa.js → scanner-DS0109SS.js} +6 -6
  345. package/dist/src/server/index.js +4147 -449
  346. package/dist/src/server-B8rqV126.cjs +126 -0
  347. package/dist/src/server-BaLytskk.js +3 -0
  348. package/dist/src/server-CMJD10J4.js +107 -0
  349. package/dist/src/server-Ddp8GNMp.js +146 -0
  350. package/dist/src/server-DhMHosWj.js +182 -0
  351. package/dist/src/shared-7pmVZLNO.js +1334 -0
  352. package/dist/src/shared-9WHQ1oNE.js +1335 -0
  353. package/dist/src/{fileExtensions-8CjoL7vB.js → shared-BoG7qLMv.js} +12 -2
  354. package/dist/src/shared-D6IjElRI.js +1334 -0
  355. package/dist/src/shared-WkgnDkcg.cjs +1436 -0
  356. package/dist/src/{signal-DTtUuU3l.js → signal-CSurUUyV.js} +2 -2
  357. package/dist/src/simulatedUser-C9aQObBI.js +222 -0
  358. package/dist/src/simulatedUser-Cu601Dd4.cjs +227 -0
  359. package/dist/src/simulatedUser-U_qAHnuB.js +222 -0
  360. package/dist/src/simulatedUser-p3tACcmw.js +223 -0
  361. package/dist/src/{slack-Bamy_7te.js → slack-Bapo-7_8.js} +1 -1
  362. package/dist/src/{slack-BLlsDpfG.cjs → slack-DMC1QVEg.cjs} +3 -2
  363. package/dist/src/{slack-BPYLQLgb.js → slack-DTEFhrMn.js} +1 -1
  364. package/dist/src/{slack-4zZX1OKP.js → slack-k-_CP84Q.js} +1 -1
  365. package/dist/src/storage-BU4qcnOb.js +875 -0
  366. package/dist/src/storage-CA-v9V2v.cjs +911 -0
  367. package/dist/src/storage-CD-GWAdx.js +822 -0
  368. package/dist/src/storage-QdU-SmvD.js +834 -0
  369. package/dist/src/{store-2K0kDi80.cjs → store-B2NDDooM.cjs} +60 -24
  370. package/dist/src/{store-CPh25336.js → store-DKd5592Q.js} +50 -19
  371. package/dist/src/{store-BPkzEyFM.js → store-HpopRVzl.js} +50 -19
  372. package/dist/src/store-IbiRIF3k.js +3 -0
  373. package/dist/src/strategies-7CS3Alao.cjs +2360 -0
  374. package/dist/src/strategies-CiSeroPH.js +2331 -0
  375. package/dist/src/strategies-DRJjGTIY.js +2333 -0
  376. package/dist/src/{tables-WgdUZ8Ck.js → tables-CRSXQ2Ke.js} +2 -2
  377. package/dist/src/{tables-BMSOS2Gg.js → tables-CxjU7bBd.js} +2 -2
  378. package/dist/src/{tables-CXbaZ9y1.cjs → tables-DBIJU0WE.cjs} +6 -5
  379. package/dist/src/{tables-NlvH23ky.js → tables-DafUHOeh.js} +2 -2
  380. package/dist/src/{telemetry-DWdGHvEf.js → telemetry-00ezXr_t.js} +4 -4
  381. package/dist/src/telemetry-ByPqDcKC.js +3 -0
  382. package/dist/src/{telemetry-CEQxGnMZ.cjs → telemetry-CJ7FnCsc.cjs} +15 -9
  383. package/dist/src/{telemetry--iqaGyaS.js → telemetry-DmXYcJNV.js} +4 -4
  384. package/dist/src/{telemetry-CgdVGV8N.js → telemetry-DwX9XUN5.js} +4 -4
  385. package/dist/src/{text-DDQP0tuQ.js → text-CZr46tp_.js} +1 -1
  386. package/dist/src/{text-D4lz-Jg_.js → text-Db-Wt2u2.js} +1 -1
  387. package/dist/src/{text-NWvfMfkF.js → text-DwYK5EBn.js} +1 -1
  388. package/dist/src/{text-BiNME7QG.cjs → text-nywWsRBM.cjs} +1 -1
  389. package/dist/src/{tokenUsageUtils-2wIvAhB3.js → tokenUsageUtils-CDet74yk.js} +1 -1
  390. package/dist/src/{tokenUsageUtils-4c780gFd.js → tokenUsageUtils-CmnQ0G2m.js} +1 -1
  391. package/dist/src/{tokenUsageUtils-C9odhsbW.cjs → tokenUsageUtils-_B-P8IAi.cjs} +1 -1
  392. package/dist/src/toolAttributes-BAjwcBf0.cjs +103 -0
  393. package/dist/src/toolAttributes-COVgDrBG.js +87 -0
  394. package/dist/src/toolAttributes-DJ9ZEKXD.js +86 -0
  395. package/dist/src/tracingOptions-BnwKCkSB.js +221 -0
  396. package/dist/src/tracingOptions-Chi74lOD.js +219 -0
  397. package/dist/src/tracingOptions-DrbSFaKy.cjs +249 -0
  398. package/dist/src/tracingOptions-ji2OuXbT.js +220 -0
  399. package/dist/src/{transcription-84t4ALo2.js → transcription-B8uIgCYX.js} +5 -5
  400. package/dist/src/{transcription-Bm2emLmJ.js → transcription-CfU5loSq.js} +5 -5
  401. package/dist/src/{transcription-D7Q0vJsh.js → transcription-Dkd22_4K.js} +4 -4
  402. package/dist/src/{transcription-CZ4LG5hQ.cjs → transcription-mzuf18Mq.cjs} +9 -8
  403. package/dist/src/{transform-DtooZqYY.js → transform-BIMynQsA.js} +8 -8
  404. package/dist/src/transform-BnSTnFlp.js +187 -0
  405. package/dist/src/transform-BnSXWmU_2.cjs +221 -0
  406. package/dist/src/transform-CGt7Kt3y2.js +186 -0
  407. package/dist/src/transform-CrPGTsij.js +186 -0
  408. package/dist/src/{transform-Dg4LcO1Y.cjs → transform-DhNkAUs8.cjs} +12 -11
  409. package/dist/src/{transform-_DpNB4qp.js → transform-DmvYBRll.js} +8 -8
  410. package/dist/src/{transform-B-b6Cq-q.js → transform-EtD4jAWi.js} +8 -8
  411. package/dist/src/{transformersAvailability-lvCCvuPT.js → transformersAvailability-0ThtPved.js} +1 -1
  412. package/dist/src/transformersAvailability-BYydDE5U.js +35 -0
  413. package/dist/src/{transformersAvailability-rJGPccjr.js → transformersAvailability-BvyU9vDD.js} +1 -1
  414. package/dist/src/{transformersAvailability-B22swDxr.cjs → transformersAvailability-BytPvKUW.cjs} +1 -1
  415. package/dist/src/{types-BVH9hjgW.js → types-BFevViUY.js} +113 -19
  416. package/dist/src/{types-BDjGOq4E.js → types-BJQBBPTP.js} +113 -19
  417. package/dist/src/{types-CgG2rKiW.cjs → types-CxJvaY2S.cjs} +211 -28
  418. package/dist/src/{types-DNRZVOue.js → types-D6glLbdF.js} +125 -26
  419. package/dist/src/{util-DFPeFkiV.js → util--WMgw7wM.js} +28 -8
  420. package/dist/src/{util-C-kmRosx.js → util-5WnCSb0h.js} +9 -7
  421. package/dist/src/{util-A5_ZsQUn.cjs → util-BSIuSLVK.cjs} +12 -9
  422. package/dist/src/{util-Dub0f_ej.js → util-Bx677_k2.js} +17 -10
  423. package/dist/src/util-CN8om2rz.cjs +386 -0
  424. package/dist/src/{util-DN0-b81k.js → util-CoQWM76y.js} +28 -8
  425. package/dist/src/util-DNl96nNs.js +327 -0
  426. package/dist/src/{util-BQOCAHQC.js → util-DURocbYR.js} +46 -11
  427. package/dist/src/util-Df8YMvS1.js +327 -0
  428. package/dist/src/{util-BVXcTwXu.js → util-DiQ3QvBB.js} +28 -8
  429. package/dist/src/{util-3pBZZb_H.js → util-I-Rf-KaD.js} +45 -10
  430. package/dist/src/{util-Dpmm_dAI.cjs → util-IYzs5Y04.cjs} +33 -7
  431. package/dist/src/{util-BlFVL0UF.js → util-LKTmNsMQ.js} +9 -7
  432. package/dist/src/{util-DvpHnLt0.cjs → util-SPsvFONY.cjs} +29 -21
  433. package/dist/src/{util-B9CNhyac.js → util-efByNxcr.js} +9 -7
  434. package/dist/src/util-kDURhgJW.js +328 -0
  435. package/dist/src/{utils-BUMN8orw.js → utils-B0lzitHZ.js} +2 -2
  436. package/dist/src/{utils-kt7lv30R.js → utils-BFOh20Gb.js} +2 -2
  437. package/dist/src/{utils-o8S5huU2.js → utils-BGY69tk_.js} +2 -2
  438. package/dist/src/{utils-DkVeShIB.cjs → utils-Ve6kuJsa.cjs} +3 -3
  439. package/dist/src/{version-CbuBKu2U.js → version-BK20a4sw.js} +2 -2
  440. package/dist/src/{version-D9zu9FWB.cjs → version-BWCSaByA.cjs} +2 -2
  441. package/dist/src/{version-CbpiUINz.js → version-eRkNuGv8.js} +2 -2
  442. package/dist/src/{version-0frU0UTr.js → version-lpHV_53E.js} +2 -2
  443. package/dist/tsconfig.tsbuildinfo +1 -1
  444. package/package.json +48 -22
  445. package/dist/src/app/assets/Report-vjzrbgce.js +0 -1
  446. package/dist/src/app/assets/index-B3NQ8HTd.js +0 -385
  447. package/dist/src/app/assets/index-Cli2yAXv.css +0 -1
  448. package/dist/src/app/assets/sync-IjzpWrOE.js +0 -4
  449. package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +0 -36
  450. package/dist/src/cache-BRkhlH3k.cjs +0 -3
  451. package/dist/src/cache-BlC6aeJ0.js +0 -3
  452. package/dist/src/cloud-CoD5OacT.js +0 -3
  453. package/dist/src/codex-sdk-1jm_qPHf.js +0 -3
  454. package/dist/src/codex-sdk-Danroptg.cjs +0 -2
  455. package/dist/src/evalResult-BBJAHAtw.cjs +0 -2
  456. package/dist/src/evalResult-BBK58h2B.js +0 -3
  457. package/dist/src/evalResult-spPqh1G_.js +0 -2
  458. package/dist/src/evaluator-DgLKaZk8.js +0 -3
  459. package/dist/src/fetch-8viavNv8.js +0 -3
  460. package/dist/src/graders-C84JI-m5.js +0 -2
  461. package/dist/src/graders-CBbd0K0Q.cjs +0 -2
  462. package/dist/src/graders-CbQqpHSN.js +0 -3
  463. package/dist/src/graders-DS42d3ZG.js +0 -2
  464. package/dist/src/image-BmilRNqO.js +0 -258
  465. package/dist/src/image-CxJoa3aW.cjs +0 -280
  466. package/dist/src/image-DsGRlkh7.js +0 -257
  467. package/dist/src/image-a_SGUobh.js +0 -257
  468. package/dist/src/providers-BuyzKt7C.js +0 -2
  469. package/dist/src/providers-C7lNVBjX.cjs +0 -3
  470. package/dist/src/providers-CCE2COJi2.js +0 -2
  471. package/dist/src/render-7uNJ2V14.js +0 -135
  472. package/dist/src/render-DlscvAUJ.js +0 -135
  473. package/dist/src/render-eui5p5mL.js +0 -136
  474. package/dist/src/render-tG6ir9_g.cjs +0 -165
  475. package/dist/src/rubyUtils-4hjGxvju.js +0 -3
  476. package/dist/src/rubyUtils-CO-tuszQ.cjs +0 -2
  477. package/dist/src/server-ByiF3qlg.js +0 -386
  478. package/dist/src/server-C0XKRNB_.cjs +0 -2
  479. package/dist/src/server-C_15p79-.js +0 -3
  480. package/dist/src/store-2OXm_eBY.js +0 -240
  481. package/dist/src/store-BELqNwvz.js +0 -3
  482. package/dist/src/store-uQZ4AjPe.cjs +0 -2
  483. package/dist/src/telemetry-DjNoC_n3.cjs +0 -2
  484. package/dist/src/telemetry-ZdPZc0fm.js +0 -3
  485. package/dist/src/transform-BQt0BeAW.js +0 -3
  486. package/dist/src/transform-Bq5oqC0s.cjs +0 -2
  487. package/dist/src/transform-C9izGX54.cjs +0 -228
  488. package/dist/src/transform-CwbAZ84V.js +0 -216
  489. package/dist/src/transform-DzCF-wqV.js +0 -213
  490. package/dist/src/transform-eGiUAv86.js +0 -216
@@ -0,0 +1,822 @@
1
+ import { T as getEnvString, a as logger, x as getConfigDirectoryPath } from "./logger-Ct2S6Yx-.js";
2
+ import { t as invariant } from "./invariant-Ddh24eXh.js";
3
+ import { B as isUuid, M as ProviderOptionsSchema } from "./types-D6glLbdF.js";
4
+ import { T as cloudConfig, k as CLOUD_PROVIDER_PREFIX, t as fetchWithProxy } from "./fetch-It34O8Ur.js";
5
+ import { t as checkServerFeatureSupport } from "./server-CMJD10J4.js";
6
+ import * as fs$2 from "fs";
7
+ import * as path$1 from "path";
8
+ import dedent from "dedent";
9
+ import * as fsPromises from "fs/promises";
10
+ import * as crypto$1 from "crypto";
11
+ //#region src/util/cloud.ts
12
+ const PERMISSION_CHECK_SERVER_FEATURE_NAME = "config-permission-check-endpoint";
13
+ const PERMISSION_CHECK_SERVER_FEATURE_DATE = "2025-09-03T14:49:11Z";
14
+ /**
15
+ * Makes an authenticated HTTP request to the PromptFoo Cloud API.
16
+ * @param path - The API endpoint path (with or without leading slash)
17
+ * @param method - HTTP method (GET, POST, PUT, DELETE, etc.)
18
+ * @param body - Optional request body that will be JSON stringified
19
+ * @returns Promise resolving to the fetch Response object
20
+ * @throws Error if the request fails due to network or other issues
21
+ */
22
+ function makeRequest(path, method, body) {
23
+ const apiHost = cloudConfig.getApiHost();
24
+ const apiKey = cloudConfig.getApiKey();
25
+ const url = `${apiHost}/api/v1/${path.startsWith("/") ? path.slice(1) : path}`;
26
+ try {
27
+ return fetchWithProxy(url, {
28
+ method,
29
+ body: JSON.stringify(body),
30
+ headers: {
31
+ Authorization: `Bearer ${apiKey}`,
32
+ "Content-Type": "application/json"
33
+ }
34
+ });
35
+ } catch (e) {
36
+ logger.error(`[Cloud] Failed to make request to ${url}: ${e}`);
37
+ if (e.cause) logger.error(`Cause: ${e.cause}`);
38
+ throw e;
39
+ }
40
+ }
41
+ /**
42
+ * Fetches a provider configuration from PromptFoo Cloud by its ID.
43
+ * @param id - The unique identifier of the cloud provider
44
+ * @returns Promise resolving to provider options with guaranteed id field
45
+ * @throws Error if cloud is not enabled, provider not found, or request fails
46
+ */
47
+ async function getProviderFromCloud(id) {
48
+ if (!cloudConfig.isEnabled()) throw new Error(`Could not fetch Provider ${id} from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
49
+ try {
50
+ const response = await makeRequest(`providers/${id}`, "GET");
51
+ if (!response.ok) {
52
+ const errorMessage = await response.text();
53
+ logger.error(`[Cloud] Failed to fetch provider from cloud: ${errorMessage}. HTTP Status: ${response.status} -- ${response.statusText}.`);
54
+ throw new Error(`Failed to fetch provider from cloud: ${response.statusText}`);
55
+ }
56
+ const body = await response.json();
57
+ logger.debug(`Provider fetched from cloud: ${id}`);
58
+ const provider = ProviderOptionsSchema.parse(body.config);
59
+ invariant(provider.id, `Provider ${id} has no id in ${body.config}`);
60
+ return {
61
+ ...provider,
62
+ id: provider.id
63
+ };
64
+ } catch (e) {
65
+ logger.error(`Failed to fetch provider from cloud: ${id}.`);
66
+ logger.error(String(e));
67
+ throw new Error(`Failed to fetch provider from cloud: ${id}.`);
68
+ }
69
+ }
70
+ function isRecord(value) {
71
+ return value !== null && typeof value === "object" && !Array.isArray(value);
72
+ }
73
+ async function fetchCloudConfig(path) {
74
+ const response = await makeRequest(path, "GET");
75
+ if (!response.ok) {
76
+ const errorMessage = typeof response.text === "function" ? await response.text() : "";
77
+ logger.error(`[Cloud] Failed to fetch config from cloud: ${errorMessage}. HTTP Status: ${response.status} -- ${response.statusText}.`);
78
+ throw new Error(`Failed to fetch config from cloud: ${response.statusText}`);
79
+ }
80
+ return response.json();
81
+ }
82
+ function looksLikeEvalConfig(config) {
83
+ return "providers" in config || "providerIds" in config || "prompts" in config || "tests" in config || "testCases" in config;
84
+ }
85
+ function extractEvalConfigPayload(body) {
86
+ if (!isRecord(body)) throw new Error("Invalid cloud eval config response: expected a JSON object.");
87
+ const bodyConfig = isRecord(body.config) ? body.config : void 0;
88
+ if (!bodyConfig) {
89
+ if (looksLikeEvalConfig(body)) return body;
90
+ throw new Error("Invalid cloud eval config response: missing \"config\" object.");
91
+ }
92
+ const nestedConfig = isRecord(bodyConfig.config) ? bodyConfig.config : void 0;
93
+ if (!nestedConfig) return {
94
+ ...bodyConfig,
95
+ ...typeof bodyConfig.name !== "string" && typeof body.name === "string" ? { name: body.name } : {}
96
+ };
97
+ return {
98
+ ...nestedConfig,
99
+ ...typeof nestedConfig.name !== "string" && typeof bodyConfig.name === "string" ? { name: bodyConfig.name } : {}
100
+ };
101
+ }
102
+ function normalizeCloudEvalProvider(provider) {
103
+ if (typeof provider !== "string") return provider;
104
+ if (provider.startsWith("promptfoo://provider/") || !isUuid(provider)) return provider;
105
+ return `${CLOUD_PROVIDER_PREFIX}${provider}`;
106
+ }
107
+ function normalizeCloudEvalPrompt(prompt) {
108
+ if (typeof prompt === "string") return prompt;
109
+ if (isRecord(prompt)) {
110
+ if (typeof prompt.content === "string") return prompt.content;
111
+ if (typeof prompt.raw === "string") return prompt.raw;
112
+ }
113
+ return String(prompt ?? "");
114
+ }
115
+ function normalizeEvalConfig(config) {
116
+ const providers = Array.isArray(config.providers) ? config.providers : Array.isArray(config.providerIds) ? config.providerIds : [];
117
+ const prompts = Array.isArray(config.prompts) ? config.prompts : [];
118
+ const tests = Array.isArray(config.tests) ? config.tests : Array.isArray(config.testCases) ? config.testCases : [];
119
+ const commandLineOptions = {
120
+ ...isRecord(config.commandLineOptions) ? config.commandLineOptions : {},
121
+ ...config.maxConcurrency == null ? {} : { maxConcurrency: config.maxConcurrency },
122
+ ...config.delay == null ? {} : { delay: config.delay },
123
+ ...config.verbose == null ? {} : { verbose: config.verbose }
124
+ };
125
+ const normalizedConfig = {
126
+ ...config,
127
+ providers: providers.map(normalizeCloudEvalProvider),
128
+ prompts: prompts.map(normalizeCloudEvalPrompt),
129
+ tests
130
+ };
131
+ if (Object.keys(commandLineOptions).length > 0) normalizedConfig.commandLineOptions = commandLineOptions;
132
+ else delete normalizedConfig.commandLineOptions;
133
+ if (typeof config.description === "string" && config.description.trim().length > 0) normalizedConfig.description = config.description;
134
+ else if (typeof config.name === "string" && config.name.trim().length > 0) normalizedConfig.description = config.name;
135
+ delete normalizedConfig.providerIds;
136
+ delete normalizedConfig.testCases;
137
+ delete normalizedConfig.maxConcurrency;
138
+ delete normalizedConfig.delay;
139
+ delete normalizedConfig.verbose;
140
+ return normalizedConfig;
141
+ }
142
+ /**
143
+ * Fetches an eval configuration from PromptFoo Cloud by ID.
144
+ * The response may contain legacy eval fields, which are normalized into UnifiedConfig.
145
+ * @param id - The unique identifier of the cloud eval configuration
146
+ * @returns Promise resolving to a normalized unified configuration object
147
+ * @throws Error if cloud is not enabled, config not found, or response shape is invalid
148
+ */
149
+ async function getEvalConfigFromCloud(id) {
150
+ if (!cloudConfig.isEnabled()) throw new Error(`Could not fetch Config ${id} from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
151
+ try {
152
+ const config = normalizeEvalConfig(extractEvalConfigPayload(await fetchCloudConfig(`configs/${id}`)));
153
+ logger.info(`Eval config fetched from cloud: ${id}`);
154
+ return config;
155
+ } catch (e) {
156
+ logger.error(`Failed to fetch eval config from cloud: ${id}.`);
157
+ logger.error(String(e));
158
+ if (e instanceof Error) throw e;
159
+ throw new Error(String(e));
160
+ }
161
+ }
162
+ /**
163
+ * Checks if a provider path represents a cloud-based provider.
164
+ * @param providerPath - The provider path to check
165
+ * @returns True if the path starts with the cloud provider prefix, false otherwise
166
+ */
167
+ function isCloudProvider(providerPath) {
168
+ return providerPath.startsWith(CLOUD_PROVIDER_PREFIX);
169
+ }
170
+ /**
171
+ * Extracts the database ID from a cloud provider path.
172
+ * @param providerPath - The cloud provider path
173
+ * @returns The database ID portion of the path
174
+ * @throws Error if the path is not a valid cloud provider path
175
+ */
176
+ function getCloudDatabaseId(providerPath) {
177
+ if (!isCloudProvider(providerPath)) throw new Error(`Provider path ${providerPath} is not a cloud provider.`);
178
+ return providerPath.slice(CLOUD_PROVIDER_PREFIX.length);
179
+ }
180
+ /**
181
+ * Get the plugin severity overrides for a cloud provider.
182
+ * @param cloudProviderId - The cloud provider ID.
183
+ * @returns The plugin severity overrides.
184
+ */
185
+ async function getPluginSeverityOverridesFromCloud(cloudProviderId) {
186
+ if (!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.`);
187
+ try {
188
+ const response = await makeRequest(`/providers/${cloudProviderId}`, "GET");
189
+ if (!response.ok) {
190
+ const formattedErrorMessage = `Failed to provider from cloud: ${await response.text()}. HTTP Status: ${response.status} -- ${response.statusText}.`;
191
+ logger.error(`[Cloud] ${formattedErrorMessage}`);
192
+ throw new Error(formattedErrorMessage);
193
+ }
194
+ const body = await response.json();
195
+ if (body.pluginSeverityOverrideId) {
196
+ const overrideRes = await makeRequest(`/redteam/plugins/severity-overrides/${body.pluginSeverityOverrideId}`, "GET");
197
+ if (!overrideRes.ok) {
198
+ const formattedErrorMessage = `Failed to fetch plugin severity override from cloud: ${await overrideRes.text()}. HTTP Status: ${overrideRes.status} -- ${overrideRes.statusText}.`;
199
+ logger.error(`[Cloud] ${formattedErrorMessage}`);
200
+ throw new Error(formattedErrorMessage);
201
+ }
202
+ const pluginSeverityOverride = await overrideRes.json();
203
+ return {
204
+ id: pluginSeverityOverride.id,
205
+ severities: pluginSeverityOverride.members.reduce((acc, member) => ({
206
+ ...acc,
207
+ [member.pluginId]: member.severity
208
+ }), {})
209
+ };
210
+ } else {
211
+ logger.debug(`No plugin severity overrides found for cloud provider ${cloudProviderId}`);
212
+ return null;
213
+ }
214
+ } catch (e) {
215
+ logger.error(`Failed to fetch plugin severity overrides from cloud.`);
216
+ logger.error(String(e));
217
+ throw new Error(`Failed to fetch plugin severity overrides from cloud.`);
218
+ }
219
+ }
220
+ /**
221
+ * Retrieves all teams for the current user from Promptfoo Cloud.
222
+ * @returns Promise resolving to an array of team objects
223
+ * @throws Error if the request fails
224
+ */
225
+ async function getUserTeams(apiHost, apiKey) {
226
+ const response = apiHost && apiKey ? await fetchWithProxy(`${apiHost}/api/v1/users/me/teams`, { headers: { Authorization: `Bearer ${apiKey}` } }) : await makeRequest(`/users/me/teams`, "GET");
227
+ if (!response.ok) throw new Error(`Failed to get user teams: ${response.statusText}`);
228
+ return await response.json();
229
+ }
230
+ /**
231
+ * Retrieves the default team for the current user from Promptfoo Cloud.
232
+ * The default team is determined as the oldest team by creation date.
233
+ * @returns Promise resolving to an object with team id, name, organizationId, and createdAt
234
+ * @throws Error if the request fails or no teams are found
235
+ */
236
+ async function getDefaultTeam() {
237
+ const teams = await getUserTeams();
238
+ if (teams.length === 0) throw new Error("No teams found for user");
239
+ const oldestTeam = teams.sort((a, b) => {
240
+ return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
241
+ })[0];
242
+ return {
243
+ id: oldestTeam.id,
244
+ name: oldestTeam.name,
245
+ organizationId: oldestTeam.organizationId,
246
+ createdAt: oldestTeam.createdAt
247
+ };
248
+ }
249
+ /**
250
+ * Retrieves a team by its ID.
251
+ * @param teamId - The team ID to look up
252
+ * @returns Promise resolving to an object with team id, name, organizationId, and createdAt
253
+ * @throws Error if the team is not found or not accessible
254
+ */
255
+ async function getTeamById(teamId) {
256
+ const team = (await getUserTeams()).find((t) => t.id === teamId);
257
+ if (!team) throw new Error(`Team with ID '${teamId}' not found or not accessible`);
258
+ return {
259
+ id: team.id,
260
+ name: team.name,
261
+ organizationId: team.organizationId,
262
+ createdAt: team.createdAt
263
+ };
264
+ }
265
+ /**
266
+ * Resolves a team identifier (name, slug, or ID) to a team object.
267
+ * @param identifier - The team name, slug, or ID
268
+ * @returns Promise resolving to an object with team id, name, organizationId, and createdAt
269
+ * @throws Error if the team is not found
270
+ */
271
+ async function resolveTeamFromIdentifier(identifier) {
272
+ const teams = await getUserTeams();
273
+ let team = teams.find((t) => t.id === identifier);
274
+ if (team) return {
275
+ id: team.id,
276
+ name: team.name,
277
+ organizationId: team.organizationId,
278
+ createdAt: team.createdAt
279
+ };
280
+ team = teams.find((t) => t.name.toLowerCase() === identifier.toLowerCase());
281
+ if (team) return {
282
+ id: team.id,
283
+ name: team.name,
284
+ organizationId: team.organizationId,
285
+ createdAt: team.createdAt
286
+ };
287
+ team = teams.find((t) => t.slug === identifier);
288
+ if (team) return {
289
+ id: team.id,
290
+ name: team.name,
291
+ organizationId: team.organizationId,
292
+ createdAt: team.createdAt
293
+ };
294
+ const availableTeams = teams.map((t) => t.name).join(", ");
295
+ throw new Error(`Team '${identifier}' not found. Available teams: ${availableTeams}`);
296
+ }
297
+ /**
298
+ * Resolves the current team context, checking stored preferences first.
299
+ * @param teamIdentifier - Optional explicit team identifier to use
300
+ * @param fallbackToDefault - Whether to fall back to server default team
301
+ * @returns Promise resolving to an object with team id and name
302
+ * @throws Error if no team can be resolved
303
+ */
304
+ async function resolveTeamId(teamIdentifier, fallbackToDefault = true) {
305
+ if (teamIdentifier) {
306
+ logger.debug(`[Team Resolution] Using explicit team identifier: ${teamIdentifier}`);
307
+ return await resolveTeamFromIdentifier(teamIdentifier);
308
+ }
309
+ const currentOrganizationId = cloudConfig.getCurrentOrganizationId();
310
+ const currentTeamId = cloudConfig.getCurrentTeamId(currentOrganizationId);
311
+ if (currentTeamId) try {
312
+ logger.debug(`[Team Resolution] Using stored team ID: ${currentTeamId}`);
313
+ return await getTeamById(currentTeamId);
314
+ } catch (_error) {
315
+ logger.warn(`[Team Resolution] Stored team ${currentTeamId} no longer accessible, falling back`);
316
+ }
317
+ if (fallbackToDefault) {
318
+ logger.debug(`[Team Resolution] Using server default team`);
319
+ const defaultTeam = await getDefaultTeam();
320
+ cloudConfig.setCurrentTeamId(defaultTeam.id, defaultTeam.organizationId);
321
+ logger.info(`Using team: ${defaultTeam.name} (use 'promptfoo auth teams set <name>' to change)`);
322
+ return defaultTeam;
323
+ }
324
+ throw new Error("No team specified and no default available");
325
+ }
326
+ /**
327
+ * Custom error class for configuration permission-related failures.
328
+ * Thrown when users lack necessary permissions to use certain cloud features.
329
+ */
330
+ var ConfigPermissionError = class extends Error {
331
+ constructor(message) {
332
+ super(message);
333
+ this.name = "ConfigPermissionError";
334
+ }
335
+ };
336
+ /**
337
+ * Converts an array of structured error objects into a human-readable message.
338
+ * @param errors - Array of error objects with type, id, and message fields
339
+ * @returns A comma-separated string of formatted error messages
340
+ */
341
+ function convertErrorsToReadableMessage(errors) {
342
+ return errors.map((error) => `${error.type} ${error.id}: ${error.message}`).join(", ");
343
+ }
344
+ /**
345
+ * Validates that the current user has necessary permissions for the given configuration.
346
+ * Checks with PromptFoo Cloud to ensure providers and other resources can be accessed.
347
+ * Gracefully degrades if cloud is disabled or server doesn't support permission checking.
348
+ * @param config - The configuration to validate permissions for
349
+ * @throws ConfigPermissionError if permissions are insufficient (403 responses)
350
+ * @throws Error for other critical permission check failures
351
+ */
352
+ async function checkCloudPermissions(config) {
353
+ if (!cloudConfig.isEnabled()) return;
354
+ if (!config.providers) {
355
+ logger.warn("No providers specified. Skipping permission check.");
356
+ return;
357
+ }
358
+ try {
359
+ if (!await checkServerFeatureSupport(PERMISSION_CHECK_SERVER_FEATURE_NAME, PERMISSION_CHECK_SERVER_FEATURE_DATE)) {
360
+ logger.debug(`[Config Permission Check] Server feature ${PERMISSION_CHECK_SERVER_FEATURE_NAME} is not supported. Skipping permission check.`);
361
+ return;
362
+ }
363
+ const { tests, scenarios, defaultTest, evaluateOptions, ...minimalConfig } = config;
364
+ if (minimalConfig.redteam) minimalConfig.redteam = {};
365
+ const response = await makeRequest("permissions/check", "POST", { config: minimalConfig });
366
+ if (!response.ok) {
367
+ const errorData = await response.json().catch(() => ({ errors: ["Unknown error"] }));
368
+ const errors = Array.isArray(errorData.errors) ? errorData.errors.map((error) => {
369
+ if (typeof error === "string") return {
370
+ type: "config",
371
+ id: "unknown",
372
+ message: error
373
+ };
374
+ return error;
375
+ }) : [{
376
+ type: "config",
377
+ id: "unknown",
378
+ message: errorData.error || "Permission check failed"
379
+ }];
380
+ if (response.status === 403) throw new ConfigPermissionError(`Permission denied: ${convertErrorsToReadableMessage(errors)}`);
381
+ logger.warn(`Error checking permissions: ${convertErrorsToReadableMessage(errors)}. Continuing anyway.`);
382
+ return;
383
+ }
384
+ const result = await response.json();
385
+ if (result.errors && result.errors.length > 0) throw new ConfigPermissionError(`Not able to continue with config: ${convertErrorsToReadableMessage(result.errors)}`);
386
+ logger.debug("Permission check passed");
387
+ } catch (error) {
388
+ if (error instanceof ConfigPermissionError) throw error;
389
+ logger.warn(`Error checking permissions: ${error}. Continuing anyway.`);
390
+ }
391
+ }
392
+ /**
393
+ * Given a list of policy IDs, fetches custom policies from Promptfoo Cloud.
394
+ * @param ids - The IDs of the policies to fetch.
395
+ * @param teamId - The ID of the team to fetch policies from. Note that all policies must belong to this team.
396
+ * @returns A map of policy IDs to their texts and severities.
397
+ */
398
+ async function getPoliciesFromCloud(ids, teamId) {
399
+ if (!cloudConfig.isEnabled()) throw new Error(`Could not fetch policies from cloud. Cloud config is not enabled. Please run \`promptfoo auth login\` to login.`);
400
+ try {
401
+ const searchParams = new URLSearchParams();
402
+ ids.forEach((id) => {
403
+ searchParams.append("id", id);
404
+ });
405
+ const response = await makeRequest(`/custom-policies/?${searchParams.toString()}&teamId=${teamId}`, "GET");
406
+ if (!response.ok) {
407
+ const errorMessage = await response.text();
408
+ throw new Error(`Failed to fetch policies from cloud: ${errorMessage}. HTTP Status: ${response.status} -- ${response.statusText}.`);
409
+ }
410
+ const body = await response.json();
411
+ const policiesById = /* @__PURE__ */ new Map();
412
+ body.forEach((policy) => {
413
+ policiesById.set(policy.id, {
414
+ text: policy.text,
415
+ severity: policy.severity,
416
+ name: policy.name
417
+ });
418
+ });
419
+ return policiesById;
420
+ } catch (e) {
421
+ logger.error(`Failed to fetch policies from cloud.`);
422
+ logger.error(String(e));
423
+ throw new Error(`Failed to fetch policies from cloud.`);
424
+ }
425
+ }
426
+ /**
427
+ * Validates linkedTargetId format and existence.
428
+ * linkedTargetId is a Promptfoo Cloud feature that links custom provider results
429
+ * to an existing target instead of creating duplicates.
430
+ *
431
+ * Validates the prefix and checks existence in cloud. Format validation
432
+ * (e.g., UUID format) is deferred to the cloud API for simplicity.
433
+ *
434
+ * @param linkedTargetId - The linkedTargetId to validate
435
+ * @throws Error if validation fails
436
+ */
437
+ async function validateLinkedTargetId(linkedTargetId) {
438
+ if (!isCloudProvider(linkedTargetId)) {
439
+ const appHost = cloudConfig.getApiHost().replace("/api", "").replace(":3201", "");
440
+ throw new Error(dedent`
441
+ Invalid linkedTargetId format: "${linkedTargetId}"
442
+
443
+ linkedTargetId must start with "${CLOUD_PROVIDER_PREFIX}" followed by a target ID.
444
+ Example: ${CLOUD_PROVIDER_PREFIX}12345678-1234-1234-1234-123456789abc
445
+
446
+ linkedTargetId links your local provider configuration to a cloud target, allowing you to:
447
+ - Consolidate findings from multiple eval runs
448
+ - Track performance and vulnerabilities over time
449
+ - View comprehensive reporting in the cloud dashboard
450
+
451
+ To get a valid linkedTargetId:
452
+ 1. Log in to Promptfoo Cloud: ${appHost}
453
+ 2. Navigate to Targets page: ${appHost}/redteam/targets
454
+ 3. Find the target you want to link to and copy its ID
455
+ 4. Format as: ${CLOUD_PROVIDER_PREFIX}<target-id>
456
+ `);
457
+ }
458
+ if (!cloudConfig.isEnabled()) {
459
+ logger.warn("[Cloud] linkedTargetId specified but cloud is not configured", {
460
+ linkedTargetId,
461
+ suggestion: "Run 'promptfoo auth login' to enable cloud features"
462
+ });
463
+ return;
464
+ }
465
+ const providerId = getCloudDatabaseId(linkedTargetId);
466
+ try {
467
+ logger.debug("[Cloud] Validating linkedTargetId exists in cloud", {
468
+ linkedTargetId,
469
+ providerId
470
+ });
471
+ await getProviderFromCloud(providerId);
472
+ logger.debug("[Cloud] linkedTargetId validation successful", { linkedTargetId });
473
+ } catch (error) {
474
+ logger.error("[Cloud] linkedTargetId validation failed", {
475
+ linkedTargetId,
476
+ error
477
+ });
478
+ const appHost = cloudConfig.getApiHost().replace("/api", "").replace(":3201", "");
479
+ throw new Error(dedent`
480
+ linkedTargetId not found: "${linkedTargetId}"
481
+
482
+ This target doesn't exist in your Promptfoo Cloud organization or you don't have access to it.
483
+
484
+ Troubleshooting steps:
485
+ 1. Verify you're logged in to the correct organization
486
+ Run: promptfoo auth status
487
+
488
+ 2. Check that the target exists in your cloud dashboard:
489
+ ${appHost}/redteam/targets
490
+
491
+ 3. Ensure you have permission to access this target
492
+ (Targets are scoped to your organization)
493
+
494
+ 4. Verify the target ID is correct and hasn't been deleted
495
+ `);
496
+ }
497
+ }
498
+ /**
499
+ * Fetches the current organization and optional team context for display.
500
+ * Returns null if cloud is not enabled or if fetching fails.
501
+ * @returns Promise resolving to organization name and optional team name, or null
502
+ */
503
+ async function getOrgContext() {
504
+ if (!cloudConfig.isEnabled()) return null;
505
+ try {
506
+ const apiHost = cloudConfig.getApiHost();
507
+ const apiKey = cloudConfig.getApiKey();
508
+ const response = await fetchWithProxy(`${apiHost}/api/v1/users/me`, { headers: { Authorization: `Bearer ${apiKey}` } });
509
+ if (!response.ok) return null;
510
+ const { organization } = await response.json();
511
+ const currentTeamId = cloudConfig.getCurrentTeamId(organization.id);
512
+ let teamName;
513
+ if (currentTeamId) try {
514
+ const team = await getTeamById(currentTeamId);
515
+ if (team.name !== organization.name) teamName = team.name;
516
+ } catch {}
517
+ return {
518
+ organizationName: organization.name,
519
+ teamName
520
+ };
521
+ } catch {
522
+ return null;
523
+ }
524
+ }
525
+ //#endregion
526
+ //#region src/storage/localFileSystemProvider.ts
527
+ /**
528
+ * Local filesystem storage provider for media files.
529
+ *
530
+ * Stores media in the local promptfoo data directory (~/.promptfoo/media).
531
+ * Uses content-based hashing for deduplication.
532
+ */
533
+ const MEDIA_SUBDIR = "media";
534
+ const HASH_INDEX_FILE = "hash-index.json";
535
+ /**
536
+ * Get file extension from content type
537
+ */
538
+ function getExtensionFromContentType(contentType) {
539
+ return {
540
+ "audio/wav": "wav",
541
+ "audio/mp3": "mp3",
542
+ "audio/mpeg": "mp3",
543
+ "audio/ogg": "ogg",
544
+ "audio/webm": "webm",
545
+ "image/png": "png",
546
+ "image/jpeg": "jpg",
547
+ "image/jpg": "jpg",
548
+ "image/gif": "gif",
549
+ "image/webp": "webp",
550
+ "video/mp4": "mp4",
551
+ "video/webm": "webm",
552
+ "video/ogg": "ogv"
553
+ }[contentType] || "bin";
554
+ }
555
+ /**
556
+ * Compute SHA-256 hash of data
557
+ */
558
+ function computeHash(data) {
559
+ return crypto$1.createHash("sha256").update(data).digest("hex");
560
+ }
561
+ /**
562
+ * Local filesystem storage provider
563
+ */
564
+ var LocalFileSystemProvider = class {
565
+ providerId = "local";
566
+ basePath;
567
+ hashIndexPath;
568
+ hashIndex = /* @__PURE__ */ new Map();
569
+ constructor(config = {}) {
570
+ this.basePath = config.basePath || path$1.join(getConfigDirectoryPath(true), MEDIA_SUBDIR);
571
+ this.hashIndexPath = path$1.join(this.basePath, HASH_INDEX_FILE);
572
+ this.ensureDirectory();
573
+ this.loadHashIndex();
574
+ }
575
+ /**
576
+ * Ensure the media directory exists
577
+ */
578
+ ensureDirectory() {
579
+ if (!fs$2.existsSync(this.basePath)) {
580
+ fs$2.mkdirSync(this.basePath, { recursive: true });
581
+ logger.debug(`[LocalStorage] Created media directory: ${this.basePath}`);
582
+ }
583
+ }
584
+ /**
585
+ * Load the hash index from disk
586
+ */
587
+ loadHashIndex() {
588
+ try {
589
+ if (fs$2.existsSync(this.hashIndexPath)) {
590
+ const data = fs$2.readFileSync(this.hashIndexPath, "utf8");
591
+ const parsed = JSON.parse(data);
592
+ this.hashIndex = new Map(Object.entries(parsed));
593
+ logger.debug(`[LocalStorage] Loaded hash index with ${this.hashIndex.size} entries`);
594
+ }
595
+ } catch (error) {
596
+ logger.warn(`[LocalStorage] Failed to load hash index, starting fresh`, { error });
597
+ this.hashIndex = /* @__PURE__ */ new Map();
598
+ }
599
+ }
600
+ /**
601
+ * Save the hash index to disk
602
+ */
603
+ async saveHashIndex() {
604
+ try {
605
+ const data = JSON.stringify(Object.fromEntries(this.hashIndex), null, 2);
606
+ await fsPromises.writeFile(this.hashIndexPath, data, "utf8");
607
+ } catch (error) {
608
+ logger.warn(`[LocalStorage] Failed to save hash index`, { error });
609
+ }
610
+ }
611
+ /**
612
+ * Get the full path for a storage key
613
+ */
614
+ getFilePath(key) {
615
+ const targetPath = path$1.resolve(this.basePath, key);
616
+ const safeBase = path$1.resolve(this.basePath) + path$1.sep;
617
+ if (!targetPath.startsWith(safeBase)) throw new Error(`[LocalStorage] Invalid media key: path traversal attempt detected ("${key}")`);
618
+ return targetPath;
619
+ }
620
+ /**
621
+ * Generate a storage key from hash and metadata
622
+ */
623
+ generateKey(hash, metadata) {
624
+ const extension = getExtensionFromContentType(metadata.contentType);
625
+ return `${metadata.mediaType || "media"}/${hash.slice(0, 12)}.${extension}`;
626
+ }
627
+ async store(data, metadata) {
628
+ const contentHash = computeHash(data);
629
+ const existingKey = await this.findByHash(contentHash);
630
+ if (existingKey) {
631
+ logger.debug(`[LocalStorage] Deduplicated media: ${existingKey}`);
632
+ return {
633
+ ref: {
634
+ provider: this.providerId,
635
+ key: existingKey,
636
+ contentHash,
637
+ metadata
638
+ },
639
+ deduplicated: true
640
+ };
641
+ }
642
+ const key = this.generateKey(contentHash, metadata);
643
+ const filePath = this.getFilePath(key);
644
+ const dir = path$1.dirname(filePath);
645
+ await fsPromises.mkdir(dir, { recursive: true });
646
+ await fsPromises.writeFile(filePath, data);
647
+ this.hashIndex.set(contentHash, key);
648
+ await this.saveHashIndex();
649
+ const metadataPath = `${filePath}.meta.json`;
650
+ await fsPromises.writeFile(metadataPath, JSON.stringify({
651
+ ...metadata,
652
+ contentHash,
653
+ sizeBytes: data.length,
654
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
655
+ }, null, 2));
656
+ logger.debug(`[LocalStorage] Stored media: ${key} (${data.length} bytes)`);
657
+ return {
658
+ ref: {
659
+ provider: this.providerId,
660
+ key,
661
+ contentHash,
662
+ metadata: {
663
+ ...metadata,
664
+ sizeBytes: data.length,
665
+ contentHash
666
+ }
667
+ },
668
+ deduplicated: false
669
+ };
670
+ }
671
+ async retrieve(key) {
672
+ const filePath = this.getFilePath(key);
673
+ try {
674
+ return await fsPromises.readFile(filePath);
675
+ } catch (error) {
676
+ if (error.code === "ENOENT") throw new Error(`[LocalStorage] Media not found: ${key}`);
677
+ throw error;
678
+ }
679
+ }
680
+ async exists(key) {
681
+ try {
682
+ const filePath = this.getFilePath(key);
683
+ await fsPromises.access(filePath);
684
+ return true;
685
+ } catch {
686
+ return false;
687
+ }
688
+ }
689
+ async delete(key) {
690
+ const filePath = this.getFilePath(key);
691
+ const metadataPath = `${filePath}.meta.json`;
692
+ for (const [hash, storedKey] of this.hashIndex.entries()) if (storedKey === key) {
693
+ this.hashIndex.delete(hash);
694
+ break;
695
+ }
696
+ await this.saveHashIndex();
697
+ try {
698
+ await fsPromises.unlink(filePath);
699
+ } catch (error) {
700
+ if (error.code !== "ENOENT") throw error;
701
+ }
702
+ try {
703
+ await fsPromises.unlink(metadataPath);
704
+ } catch (error) {
705
+ if (error.code !== "ENOENT") throw error;
706
+ }
707
+ logger.debug(`[LocalStorage] Deleted media: ${key}`);
708
+ }
709
+ async getUrl(key, _expiresIn) {
710
+ try {
711
+ const filePath = this.getFilePath(key);
712
+ await fsPromises.access(filePath);
713
+ return `file://${filePath}`;
714
+ } catch {
715
+ return null;
716
+ }
717
+ }
718
+ async findByHash(contentHash) {
719
+ const key = this.hashIndex.get(contentHash);
720
+ if (key && await this.exists(key)) return key;
721
+ if (key) {
722
+ this.hashIndex.delete(contentHash);
723
+ await this.saveHashIndex();
724
+ }
725
+ return null;
726
+ }
727
+ /**
728
+ * Get the base path for this provider
729
+ */
730
+ getBasePath() {
731
+ return this.basePath;
732
+ }
733
+ /**
734
+ * Get stats about stored media
735
+ */
736
+ async getStats() {
737
+ let fileCount = 0;
738
+ let totalSizeBytes = 0;
739
+ const walkDir = async (dir) => {
740
+ let entries;
741
+ try {
742
+ entries = await fsPromises.readdir(dir, { withFileTypes: true });
743
+ } catch (error) {
744
+ if (error.code === "ENOENT") return;
745
+ throw error;
746
+ }
747
+ for (const entry of entries) {
748
+ const fullPath = path$1.join(dir, entry.name);
749
+ if (entry.isDirectory()) await walkDir(fullPath);
750
+ else if (!entry.name.endsWith(".json")) try {
751
+ const stat = await fsPromises.stat(fullPath);
752
+ fileCount++;
753
+ totalSizeBytes += stat.size;
754
+ } catch (error) {
755
+ if (error.code !== "ENOENT") throw error;
756
+ }
757
+ }
758
+ };
759
+ await walkDir(this.basePath);
760
+ return {
761
+ fileCount,
762
+ totalSizeBytes
763
+ };
764
+ }
765
+ };
766
+ //#endregion
767
+ //#region src/storage/index.ts
768
+ /**
769
+ * Media storage module for promptfoo.
770
+ *
771
+ * Provides abstraction for storing binary media (audio, images, video)
772
+ * separately from the main database.
773
+ *
774
+ * @example
775
+ * ```typescript
776
+ * import { getMediaStorage, storeMedia, retrieveMedia } from './storage';
777
+ *
778
+ * // Store audio data
779
+ * const { ref } = await storeMedia(audioBuffer, {
780
+ * contentType: 'audio/wav',
781
+ * mediaType: 'audio',
782
+ * evalId: 'eval-123',
783
+ * });
784
+ *
785
+ * // Later, retrieve it
786
+ * const buffer = await retrieveMedia(ref.key);
787
+ * ```
788
+ */
789
+ let defaultProvider = null;
790
+ /**
791
+ * Get the default media storage provider.
792
+ *
793
+ * For OSS, this returns a LocalFileSystemProvider.
794
+ * For cloud deployments, this can be overridden.
795
+ */
796
+ function getMediaStorage(config) {
797
+ if (!defaultProvider) {
798
+ defaultProvider = new LocalFileSystemProvider({ basePath: config?.basePath || getEnvString("PROMPTFOO_MEDIA_PATH") });
799
+ logger.debug(`[MediaStorage] Initialized local storage provider`);
800
+ }
801
+ return defaultProvider;
802
+ }
803
+ /**
804
+ * Store media data and return a reference
805
+ */
806
+ async function storeMedia(data, metadata) {
807
+ return getMediaStorage().store(data, metadata);
808
+ }
809
+ /**
810
+ * Check if media storage should be used based on config/env
811
+ *
812
+ * Returns true if media storage is enabled (default for new installs).
813
+ * Set PROMPTFOO_INLINE_MEDIA=true to disable and use legacy inline base64.
814
+ */
815
+ function isMediaStorageEnabled() {
816
+ const inline = getEnvString("PROMPTFOO_INLINE_MEDIA");
817
+ return inline !== "true" && inline !== "1";
818
+ }
819
+ //#endregion
820
+ export { getCloudDatabaseId as a, getPluginSeverityOverridesFromCloud as c, isCloudProvider as d, makeRequest as f, checkCloudPermissions as i, getPoliciesFromCloud as l, validateLinkedTargetId as m, isMediaStorageEnabled as n, getEvalConfigFromCloud as o, resolveTeamId as p, storeMedia as r, getOrgContext as s, getMediaStorage as t, getProviderFromCloud as u };
821
+
822
+ //# sourceMappingURL=storage-CD-GWAdx.js.map