promptfoo 0.120.27 → 0.121.2

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 (355) hide show
  1. package/README.md +1 -1
  2. package/dist/src/{ListApp-8WOe2nT6.js → ListApp-Du7YVwj5.js} +2 -4
  3. package/dist/src/accounts-B0pgC1oV.js +206 -0
  4. package/dist/src/{accounts-DVINui-2.js → accounts-Bm2D8Db9.js} +39 -34
  5. package/dist/src/{accounts-CPDRAMND.js → accounts-CiBLOnA7.js} +38 -33
  6. package/dist/src/{accounts-Fl2J3_Fu.cjs → accounts-gtkH-5KX.cjs} +77 -78
  7. package/dist/src/{agentic-utils-D922n6mm.js → agentic-utils-DS1g3GLF.js} +9 -10
  8. package/dist/src/{agents-BcsN_BgB.js → agents-9qiOy0ho.js} +16 -12
  9. package/dist/src/{agents-BXLmVsxR.js → agents-CBr9A01V.js} +37 -37
  10. package/dist/src/{agents-pMfppv9Z.js → agents-CmvBq8LV.js} +16 -18
  11. package/dist/src/{agents-hqgSV-3o.js → agents-D__IdAlg.js} +39 -40
  12. package/dist/src/{agents-BO2n8Z0d.cjs → agents-DbRtpYxR.cjs} +37 -40
  13. package/dist/src/{agents-BdUTAwi-.js → agents-DgF2zDag.js} +37 -42
  14. package/dist/src/{agents-DgJf2-ez.cjs → agents-Di9DKPzn.cjs} +16 -17
  15. package/dist/src/{agents-DNvSH78i.js → agents-cLXA8a_8.js} +17 -19
  16. package/dist/src/{aimlapi-DtgPI0nE.js → aimlapi-B4rcnZgv.js} +15 -17
  17. package/dist/src/{aimlapi-BE_Tg9Fl.cjs → aimlapi-BvlNH0gr.cjs} +15 -16
  18. package/dist/src/{aimlapi-DOib86oE.js → aimlapi-CnkC2HqE.js} +16 -18
  19. package/dist/src/{aimlapi-DTPACCB1.js → aimlapi-DHJU_kcV.js} +15 -4
  20. package/dist/src/app/assets/index-4LKxG2CG.js +439 -0
  21. package/dist/src/app/assets/{index-NCn4eVBv.css → index-C3zcsZFQ.css} +1 -1
  22. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +36 -0
  23. package/dist/src/app/index.html +3 -3
  24. package/dist/src/app/tsconfig.app.tsbuildinfo +1 -1
  25. package/dist/src/{audio-BnRUGAm_.js → audio-Bkv46et0.js} +6 -5
  26. package/dist/src/{audio-Cwo68yZS.cjs → audio-CGMyULza.cjs} +6 -7
  27. package/dist/src/{audio-MSRki4JU.js → audio-ClI_AFre.js} +6 -8
  28. package/dist/src/{audio-BRYU0BFo.js → audio-Dz3z7s3J.js} +7 -9
  29. package/dist/src/{base-pGVmXNl4.cjs → base-CGrhspbK.cjs} +36 -38
  30. package/dist/src/{base-h961VXYk.js → base-CpjcHe4e.js} +11 -13
  31. package/dist/src/base-DLKtKMFh.js +193 -0
  32. package/dist/src/{base-XB2tDJrB.js → base-Dy1V8--Z.js} +11 -13
  33. package/dist/src/blobs-BDbfYdrJ.js +236 -0
  34. package/dist/src/{blobs-CR5C4Ihh.js → blobs-CBO20krR.js} +9 -12
  35. package/dist/src/{blobs-BM_e6hCa.js → blobs-CMHN0Qcz.js} +9 -12
  36. package/dist/src/{blobs-B-KQAFhX.cjs → blobs-D23XLin-.cjs} +34 -37
  37. package/dist/src/{cache-jsiwsAJv.js → cache-BVeDlD87.js} +132 -117
  38. package/dist/src/{cache-CIpsoBZR.js → cache-C4Nxf52C.js} +132 -118
  39. package/dist/src/cache-CeUpFm3M.cjs +5 -0
  40. package/dist/src/{cache-BTVYfbka.cjs → cache-Dh5WtQps.cjs} +182 -168
  41. package/dist/src/cache-i1P6crbO.js +756 -0
  42. package/dist/src/cache-n-RCJ-hL.js +6 -0
  43. package/dist/src/{chat-BcPjZXIp.js → chat-BiKyneZl.js} +45 -46
  44. package/dist/src/{chat-D31K7C4u.cjs → chat-C1Qst7jL.cjs} +20 -21
  45. package/dist/src/{chat-B84t99NW.js → chat-C2jrdPMx.js} +20 -9
  46. package/dist/src/{chat-BE44YOc6.cjs → chat-CgF-J-Jj.cjs} +65 -66
  47. package/dist/src/{chat-DwWifjxi.js → chat-CzkrVDfz.js} +20 -22
  48. package/dist/src/chat-DJIw17u0.js +766 -0
  49. package/dist/src/{chat-CcUCysjU.js → chat-DqxYYtWA.js} +45 -46
  50. package/dist/src/{chat-DZM2GUHO.js → chat-qmatte1u.js} +21 -23
  51. package/dist/src/{chatkit-D67HS_0b.js → chatkit-65VXf5SR.js} +58 -58
  52. package/dist/src/{chatkit-DAB_qfzI.js → chatkit-Be-Q-a9F.js} +58 -60
  53. package/dist/src/{chatkit-Biqb_wsD.js → chatkit-BxFvW8KY.js} +58 -60
  54. package/dist/src/{chatkit-PGG4ZYIn.cjs → chatkit-DKyPi1Gs.cjs} +58 -60
  55. package/dist/src/chunk-DEq-mXcV.js +15 -0
  56. package/dist/src/chunk-DRamLcfz.js +16 -0
  57. package/dist/src/{claude-agent-sdk-SVM6AdBu.js → claude-agent-sdk-Apiy0iaz.js} +31 -31
  58. package/dist/src/{claude-agent-sdk-C-IOTPfo.js → claude-agent-sdk-D2bJee9S.js} +31 -29
  59. package/dist/src/{claude-agent-sdk-C9SiaQub.cjs → claude-agent-sdk-D9Z5Pr9X.cjs} +31 -28
  60. package/dist/src/{claude-agent-sdk-CiluSyW1.js → claude-agent-sdk-DfCoW0E6.js} +33 -20
  61. package/dist/src/cloud-BBh91EUK.js +4 -0
  62. package/dist/src/{cloud-CZ-q9Ier.js → cloud-C0dlstV_.js} +7 -9
  63. package/dist/src/{cloudflare-ai-BahKHyhh.js → cloudflare-ai-8TDxHR0x.js} +16 -18
  64. package/dist/src/{cloudflare-ai-v_qZD6_q.js → cloudflare-ai-BxAGvfju.js} +17 -19
  65. package/dist/src/{cloudflare-ai-Dfahv5SY.cjs → cloudflare-ai-CknbZ5LJ.cjs} +16 -17
  66. package/dist/src/{cloudflare-ai-Dxyt50Nl.js → cloudflare-ai-g7PB6VHR.js} +16 -4
  67. package/dist/src/{cloudflare-gateway-Bi_FpOFy.js → cloudflare-gateway-B9HWA5wf.js} +23 -23
  68. package/dist/src/{cloudflare-gateway-BPWoZIzJ.cjs → cloudflare-gateway-BSnDmHYo.cjs} +21 -22
  69. package/dist/src/{cloudflare-gateway-C0guUNwk.js → cloudflare-gateway-CKDb4dJ8.js} +26 -14
  70. package/dist/src/{cloudflare-gateway-btS7h1OZ.js → cloudflare-gateway-CP9QEWYS.js} +21 -25
  71. package/dist/src/{codex-sdk-DSxAnbfT.js → codex-sdk-C6UMlxwV.js} +28 -29
  72. package/dist/src/{codex-sdk-IYVi9fuM.js → codex-sdk-DUwKWezN.js} +28 -27
  73. package/dist/src/{codex-sdk-DulY0ZRq.js → codex-sdk-GGAw0qbD.js} +28 -29
  74. package/dist/src/{codex-sdk-DFKMtAyf.cjs → codex-sdk-fAO0c3yA.cjs} +28 -29
  75. package/dist/src/{cometapi-DzrR3SR_.js → cometapi-BL9yvj_f.js} +16 -4
  76. package/dist/src/{cometapi-DIO64tf4.cjs → cometapi-C4xSqeID.cjs} +21 -22
  77. package/dist/src/{cometapi-C9EEpJzT.js → cometapi-CUQq3H_a.js} +21 -24
  78. package/dist/src/{cometapi-DkNBMk0G.js → cometapi-DFNiKmSz.js} +17 -19
  79. package/dist/src/{completion-CG29bfKX.js → completion-5MzrpJxT.js} +11 -13
  80. package/dist/src/{completion-CCRT4kX1.cjs → completion-CM6oK8PS.cjs} +21 -23
  81. package/dist/src/{completion-Bgf1VJoq.js → completion-DZ083F31.js} +11 -13
  82. package/dist/src/completion-qRoZAYRB.js +120 -0
  83. package/dist/src/{createHash-Dw_iLu31.js → createHash-CTQmL3G2.js} +2 -3
  84. package/dist/src/{createHash-CYQy4YeL.cjs → createHash-CfZSc0b4.cjs} +13 -14
  85. package/dist/src/{createHash-CJcfskIZ.js → createHash-Da8fMwqB.js} +2 -3
  86. package/dist/src/createHash-DmPQkvBh.js +15 -0
  87. package/dist/src/{docker-D-ayp2FW.js → docker-Bb5dcxr8.js} +18 -20
  88. package/dist/src/{docker-B81N0t4e.js → docker-BvfL2BrW.js} +19 -21
  89. package/dist/src/{docker-DNcLR4Ig.cjs → docker-DcF2pRrj.cjs} +18 -19
  90. package/dist/src/{docker-egERKxCF.js → docker-ExVyLp0S.js} +18 -7
  91. package/dist/src/entrypoint.js +2 -3
  92. package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
  93. package/dist/src/{esm-B9dPm_BF.js → esm-C03C-mv3.js} +17 -20
  94. package/dist/src/{esm-D2pZ87fL.js → esm-CaIwzWR5.js} +18 -21
  95. package/dist/src/esm-Cd1AjG1D.js +379 -0
  96. package/dist/src/{esm-Ct-Joyue.cjs → esm-CnNt7sI4.cjs} +47 -49
  97. package/dist/src/eval-B3r2CVXr.js +15 -0
  98. package/dist/src/{eval-C-Nr6wX_.js → eval-Dg2nG4v2.js} +47 -54
  99. package/dist/src/evalResult-5xwYnECe.js +12 -0
  100. package/dist/src/evalResult-71lY93Kj.cjs +10 -0
  101. package/dist/src/{evalResult-DXMWJ3sx.js → evalResult-BBRNtX4I.js} +10 -11
  102. package/dist/src/{evalResult-4BzI2tmj.js → evalResult-BDMqrapS.js} +16 -12
  103. package/dist/src/evalResult-Dx5P5cIv.js +10 -0
  104. package/dist/src/{evalResult-CX8wQecI.cjs → evalResult-fuaI8HkH.cjs} +20 -21
  105. package/dist/src/{evaluator-8aGyV12L.js → evaluator-BhoWwp5b.js} +211 -235
  106. package/dist/src/evaluator-Jx6bRZV6.js +36 -0
  107. package/dist/src/{extractor-V5x_m1i0.js → extractor-C0EVHewb.js} +22 -24
  108. package/dist/src/extractor-D25qpmGX.js +374 -0
  109. package/dist/src/{extractor-CD5yKL-G.js → extractor-DReVID0K.js} +22 -24
  110. package/dist/src/{extractor-C031XmTA.cjs → extractor-pYLLi3wS.cjs} +37 -39
  111. package/dist/src/{fetch-BmbD-v1L.cjs → fetch-BPkYtG8K.cjs} +244 -277
  112. package/dist/src/fetch-BxNb_Lp3.js +5 -0
  113. package/dist/src/{fetch-D3OHf-lV.js → fetch-Cwxnd8zz.js} +36 -44
  114. package/dist/src/{fetch-CXZI9RRr.js → fetch-Dxpd4_sr.js} +23 -35
  115. package/dist/src/fetch-HaqdX7U1.js +780 -0
  116. package/dist/src/{fileExtensions-ePDqouxn.js → fileExtensions-DnqA1y9x.js} +2 -2
  117. package/dist/src/{fileExtensions-BpuMmaFL.js → fileExtensions-Ds-foDzt.js} +2 -2
  118. package/dist/src/fileExtensions-LcDYkU4v.js +85 -0
  119. package/dist/src/{fileExtensions-DkJYkWUy.cjs → fileExtensions-bYh77CN8.cjs} +27 -28
  120. package/dist/src/{formatDuration-CdevI3An.js → formatDuration-DgBVMN65.js} +2 -2
  121. package/dist/src/{genaiTracer-Ce19n68P.js → genaiTracer-70Z8BIuV.js} +2 -3
  122. package/dist/src/{genaiTracer-CqNnnXrE.js → genaiTracer-C1rxGO8Q.js} +2 -3
  123. package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
  124. package/dist/src/{genaiTracer-Dres3qrN.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
  125. package/dist/src/{graders--1y2u9HO.js → graders-BTeBGqjJ.js} +349 -397
  126. package/dist/src/graders-B_pgMLS2.js +34 -0
  127. package/dist/src/{graders-DTeBrzWp.js → graders-Bj_Odv7c.js} +349 -397
  128. package/dist/src/graders-DErokPDO.cjs +32 -0
  129. package/dist/src/graders-DP7KFFo-.js +13466 -0
  130. package/dist/src/graders-DR_uNe54.js +32 -0
  131. package/dist/src/{graders-DohM2dir.cjs → graders-DU49_J8Y.cjs} +684 -732
  132. package/dist/src/graders-w3176Wz-.js +32 -0
  133. package/dist/src/{image-B0U4Hqll.js → image-B02ogr_b.js} +7 -9
  134. package/dist/src/{image-DmE-niFE.js → image-B0h9VEMc.js} +6 -5
  135. package/dist/src/{image-CuKHuccK.cjs → image-BLmROtN3.cjs} +29 -30
  136. package/dist/src/{image-DNEIf_aI.js → image-Bb4vWQLM.js} +6 -8
  137. package/dist/src/{image-DpKl2F15.cjs → image-C1madmKh.cjs} +6 -7
  138. package/dist/src/{image-C3wHC9_h.js → image-CHfWvljl.js} +9 -10
  139. package/dist/src/{image-O1u4bCFg.js → image-DS-o-0ph.js} +9 -10
  140. package/dist/src/image-Dpxa1Jt6.js +257 -0
  141. package/dist/src/index.cjs +615 -695
  142. package/dist/src/index.d.cts +271 -7
  143. package/dist/src/index.d.ts +271 -3
  144. package/dist/src/index.js +580 -664
  145. package/dist/src/{interactiveCheck-Bxj1Swex.js → interactiveCheck-BgLZUIt3.js} +7 -8
  146. package/dist/src/{invariant-DT20jrBd.js → invariant-BtWWVVhl.js} +2 -2
  147. package/dist/src/{invariant-1pAf2CD1.js → invariant-Ddh24eXh.js} +2 -2
  148. package/dist/src/{invariant-CKcJAQ6M.cjs → invariant-kfQ8Bu82.cjs} +7 -8
  149. package/dist/src/invariant-vgHWClmd.js +25 -0
  150. package/dist/src/{knowledgeBase-CEzQobWX.js → knowledgeBase-B3OoKIej.js} +14 -9
  151. package/dist/src/{knowledgeBase-Be_zyW4L.js → knowledgeBase-CYTLHOt1.js} +16 -16
  152. package/dist/src/{knowledgeBase-BZ41IFwq.js → knowledgeBase-D33Ty2l6.js} +14 -18
  153. package/dist/src/{knowledgeBase-D-5BMXlr.cjs → knowledgeBase-DOO_BM9b.cjs} +14 -15
  154. package/dist/src/{litellm-DnbRJ2if.js → litellm-AaeZcZQF.js} +18 -19
  155. package/dist/src/{litellm-hUSNM_M2.cjs → litellm-I_hbp_dc.cjs} +17 -17
  156. package/dist/src/{litellm-CRDqPhNI.js → litellm-NbjknEh6.js} +17 -18
  157. package/dist/src/{litellm-9vR8zpfU.js → litellm-TrljxD9G.js} +17 -5
  158. package/dist/src/{logger-CG1uZPbQ.js → logger-CT3IKMKA.js} +10 -29
  159. package/dist/src/{logger-B7sBeGa0.cjs → logger-Cp1GPUjj.cjs} +152 -180
  160. package/dist/src/logger-DLcq4dWf.js +713 -0
  161. package/dist/src/{logger-LSBxlt7a.js → logger-KkObSCzq.js} +13 -31
  162. package/dist/src/{luma-ray-4blv9iZ2.js → luma-ray-BS2_tY8L.js} +22 -21
  163. package/dist/src/{luma-ray-drvgdpP9.js → luma-ray-DDsjcgZZ.js} +20 -13
  164. package/dist/src/{luma-ray-Hm3d6VJE.cjs → luma-ray-Due0n7di.cjs} +20 -21
  165. package/dist/src/{luma-ray-B2__8lYH.js → luma-ray-f6I2fft-.js} +20 -23
  166. package/dist/src/main.js +1170 -1321
  167. package/dist/src/{messages-Uee41Mj5.js → messages-BS17jdMx.js} +22 -24
  168. package/dist/src/{messages-XhiwCbi4.cjs → messages-Bs1kC7P4.cjs} +32 -34
  169. package/dist/src/{messages-CGPPidQr.js → messages-D0lx5qK7.js} +22 -24
  170. package/dist/src/messages-ZJk778GH.js +240 -0
  171. package/dist/src/{meteor-BYykdXrV.js → meteor-44VjEACX.js} +3 -4
  172. package/dist/src/{meteor-CsopaHrH.js → meteor-D-SotUw9.js} +3 -4
  173. package/dist/src/{meteor-e-E-2vVl.cjs → meteor-DLZZ3osF.cjs} +3 -4
  174. package/dist/src/{meteor-C8lGP6P4.js → meteor-DUiCJRC-.js} +3 -4
  175. package/dist/src/{modelslab-yKz-ZNB4.js → modelslab-Bmni6skY.js} +17 -10
  176. package/dist/src/{modelslab-E9gO-bYd.js → modelslab-Bx9IrZfS.js} +18 -20
  177. package/dist/src/{modelslab-lUVW0cmB.cjs → modelslab-CoUX6Jc_.cjs} +17 -18
  178. package/dist/src/{modelslab-ClBkr8_9.js → modelslab-DRb74SP4.js} +17 -19
  179. package/dist/src/{nova-reel-Dk8jNpId.js → nova-reel-BfPq-0Yk.js} +20 -13
  180. package/dist/src/{nova-reel-D8CuO6QH.cjs → nova-reel-C_QM18Xn.cjs} +20 -21
  181. package/dist/src/{nova-reel-u2eF2Cxm.js → nova-reel-D_W1tjMH.js} +22 -21
  182. package/dist/src/{nova-reel-P9bwvtYX.js → nova-reel-bgjxilYW.js} +20 -23
  183. package/dist/src/{nova-sonic-CK2rAiKi.js → nova-sonic-CFb5GYhg.js} +30 -26
  184. package/dist/src/{nova-sonic-BaqWlkds.js → nova-sonic-DIGQNR07.js} +30 -31
  185. package/dist/src/{nova-sonic-yZapPLv7.js → nova-sonic-De1HW5fD.js} +31 -32
  186. package/dist/src/{nova-sonic-Ds1C-dpm.cjs → nova-sonic-zfcljeRp.cjs} +30 -31
  187. package/dist/src/{openai-DUFopMrH.cjs → openai-Cuif0GEt.cjs} +8 -9
  188. package/dist/src/{openai-PblZ3jUE.js → openai-DElQ-fPX.js} +3 -4
  189. package/dist/src/{openai-CcN1B8Sb.js → openai-DhbB7eWK.js} +3 -4
  190. package/dist/src/openai-j-sE2O7r.js +44 -0
  191. package/dist/src/{openclaw-B6qqDr_u.cjs → openclaw-CSugPYAr.cjs} +188 -130
  192. package/dist/src/{openclaw-A-3_loM7.js → openclaw-DiSz3I5L.js} +180 -109
  193. package/dist/src/{openclaw-a3lylB-V.js → openclaw-DuvJKEW5.js} +178 -124
  194. package/dist/src/{openclaw-COn6QzDi.js → openclaw-tiVYRtr-.js} +178 -122
  195. package/dist/src/opencode-sdk-0j6rTWNb.js +562 -0
  196. package/dist/src/opencode-sdk-B3CWY9h_.js +560 -0
  197. package/dist/src/opencode-sdk-BL764Jdi.cjs +564 -0
  198. package/dist/src/opencode-sdk-C2y6UkP2.js +560 -0
  199. package/dist/src/{otlpReceiver-oyf5wLGC.js → otlpReceiver-C99PPb48.js} +53 -51
  200. package/dist/src/{otlpReceiver-lXsYVbpj.cjs → otlpReceiver-CGq6LspY.cjs} +53 -55
  201. package/dist/src/{otlpReceiver-94URx7UW.js → otlpReceiver-CdNBdbsk.js} +53 -55
  202. package/dist/src/{otlpReceiver-BmmTiMjA.js → otlpReceiver-D89fR-rC.js} +53 -55
  203. package/dist/src/{providerRegistry-Cq_JK_CJ.js → providerRegistry-B0RUOLI_.js} +7 -8
  204. package/dist/src/{providerRegistry-DSSHjMKf.js → providerRegistry-CD8MEar9.js} +7 -8
  205. package/dist/src/{providerRegistry-CvHEVJad.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
  206. package/dist/src/providerRegistry-DM8rZYol.js +45 -0
  207. package/dist/src/providers-B7V0njNs.js +32 -0
  208. package/dist/src/providers-BEwbhv0X.js +30 -0
  209. package/dist/src/{providers-Iil64vk9.js → providers-BlqUifFg.js} +1543 -1676
  210. package/dist/src/providers-CH3C7zf7.js +30 -0
  211. package/dist/src/{providers-DHbjzW2e.cjs → providers-CgKOSgTR.cjs} +1896 -2029
  212. package/dist/src/providers-D8lF1sqW.js +33246 -0
  213. package/dist/src/{providers-BnFpbY_s.js → providers-Dk_6ocUX.js} +1536 -1669
  214. package/dist/src/providers-zyB6k_38.cjs +31 -0
  215. package/dist/src/{pythonUtils-CcT5LH1M.js → pythonUtils-C3py6GC1.js} +18 -19
  216. package/dist/src/{pythonUtils-DBbuI3QJ.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
  217. package/dist/src/{pythonUtils-hZ8LeQLv.js → pythonUtils-D5nxkQ0P.js} +18 -19
  218. package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
  219. package/dist/src/{quiverai-BuI0tE39.js → quiverai-BbOUOn2L.js} +8 -7
  220. package/dist/src/{quiverai-DCGSZt4U.js → quiverai-CIaELU_m.js} +8 -10
  221. package/dist/src/{quiverai-DiMVJQDz.cjs → quiverai-PdShCPox.cjs} +8 -9
  222. package/dist/src/{quiverai-fQNkExW4.js → quiverai-uH-dcTIr.js} +9 -11
  223. package/dist/src/{render-Dj1smHEb.js → render-Drod8m7K.js} +4 -5
  224. package/dist/src/responses-CB2jwoAr.js +660 -0
  225. package/dist/src/{responses-ghR3IOfy.cjs → responses-D8SBTL64.cjs} +39 -42
  226. package/dist/src/{responses-DOAFFENS.js → responses-DIR9Ud3j.js} +24 -27
  227. package/dist/src/{responses-CxzoQoBe.js → responses-WNGNYe3K.js} +24 -27
  228. package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
  229. package/dist/src/{rubyUtils-CwbGmgYN.js → rubyUtils-BUVePouc.js} +27 -20
  230. package/dist/src/rubyUtils-BcuGX77l.js +222 -0
  231. package/dist/src/{rubyUtils-DudlFZed.js → rubyUtils-Boc4HZzX.js} +18 -19
  232. package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
  233. package/dist/src/{rubyUtils-C8MhKGHb.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
  234. package/dist/src/{sagemaker-gmskuyre.js → sagemaker-CNBxx5CJ.js} +75 -70
  235. package/dist/src/{sagemaker-CcxhlOAR.js → sagemaker-CemTFp2h.js} +75 -79
  236. package/dist/src/{sagemaker-77zbJ2Q2.cjs → sagemaker-Cl28mZU2.cjs} +75 -76
  237. package/dist/src/{sagemaker-DuM71dVU.js → sagemaker-YSyBXQQh.js} +77 -77
  238. package/dist/src/{scanner-DJYiSXQj.js → scanner-BsBlNXNn.js} +100 -121
  239. package/dist/src/server/index.js +5520 -67427
  240. package/dist/src/{server-B5v33lvE.cjs → server-C_7Ax-hA.cjs} +57 -67
  241. package/dist/src/{server-BJ4m4f1D.js → server-CqzrVGpF.js} +26 -29
  242. package/dist/src/server-CuxBbeSY.js +229 -0
  243. package/dist/src/server-DA4Cyrrq.js +7 -0
  244. package/dist/src/server-Dulb-4-K.cjs +5 -0
  245. package/dist/src/{server-RV_i_YX5.js → server-VWgWb00X.js} +19 -24
  246. package/dist/src/{signal-BW33JuId.js → signal-4U3mfRvL.js} +9 -11
  247. package/dist/src/{slack-DEURelTy.cjs → slack-BmVAVGaK.cjs} +7 -8
  248. package/dist/src/{slack-BQYeW9L3.js → slack-DCUPTzS2.js} +8 -8
  249. package/dist/src/{slack-BB6yuZzp.js → slack-DOdy_kyv.js} +7 -8
  250. package/dist/src/{slack-2pRrhhgJ.js → slack-DXMKtA-f.js} +7 -9
  251. package/dist/src/store-CXGFv4aR.js +228 -0
  252. package/dist/src/store-CXS-Q_91.js +6 -0
  253. package/dist/src/{store-D7CgQzAR.cjs → store-DLlFCC4h.cjs} +44 -45
  254. package/dist/src/{store-DJNsD1iC.js → store-DXilxTl-.js} +40 -36
  255. package/dist/src/{store-s3SftUwF.js → store-Dim__MDd.js} +34 -35
  256. package/dist/src/store-eYkaKMwq.cjs +5 -0
  257. package/dist/src/{tables-DfTsNN7X.js → tables-6YKwjN9-.js} +19 -21
  258. package/dist/src/tables-DLJPUdUE.js +288 -0
  259. package/dist/src/{tables-BKTmd6u7.cjs → tables-DPi7wKeM.cjs} +89 -91
  260. package/dist/src/{tables-DMegD0Xf.js → tables-gftXzE9I.js} +21 -23
  261. package/dist/src/telemetry-BpMfhthR.cjs +5 -0
  262. package/dist/src/{telemetry--WAdAfVi.js → telemetry-CMrFgtPB.js} +11 -13
  263. package/dist/src/telemetry-Cps3mIU-.js +171 -0
  264. package/dist/src/{telemetry-DQgVBCAb.cjs → telemetry-DaX14Chu.cjs} +21 -24
  265. package/dist/src/{telemetry-BedSm-bZ.js → telemetry-Dthj_BbD.js} +17 -14
  266. package/dist/src/telemetry-Dw38hanS.js +7 -0
  267. package/dist/src/{text-oiSbwSOI.js → text-B_UCRPp2.js} +2 -2
  268. package/dist/src/{text-oKzCBnK6.cjs → text-CW1cyrwj.cjs} +12 -13
  269. package/dist/src/{text-B_IrO4GZ.js → text-Db-Wt2u2.js} +2 -2
  270. package/dist/src/text-TIv0QYnd.js +22 -0
  271. package/dist/src/{tokenUsageUtils-FZd5O_4A.js → tokenUsageUtils-BDGe-iyI.js} +2 -2
  272. package/dist/src/{tokenUsageUtils-DmZSD2eU.js → tokenUsageUtils-DflFMjS0.js} +2 -2
  273. package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
  274. package/dist/src/{tokenUsageUtils-CXhxVj72.cjs → tokenUsageUtils-bVa1ga6f.cjs} +32 -33
  275. package/dist/src/{transcription-mYS9vd5v.js → transcription-BNYURcXg.js} +14 -7
  276. package/dist/src/{transcription-X2-B4vkX.js → transcription-B_OdaHp7.js} +14 -16
  277. package/dist/src/{transcription-BO1AHegO.cjs → transcription-NLVG9MT1.cjs} +14 -15
  278. package/dist/src/{transcription-lzBLiTFJ.js → transcription-s6A-bNrZ.js} +15 -17
  279. package/dist/src/{transform-B1Hi5lWS.cjs → transform-CzK1Q0zl.cjs} +24 -26
  280. package/dist/src/{transform-DeGlxb0D.js → transform-D5HsjduX.js} +39 -47
  281. package/dist/src/{transform-CYDILYDe.js → transform-DECvGmzp.js} +15 -13
  282. package/dist/src/transform-DTGDnAzW.js +6 -0
  283. package/dist/src/{transform-BEgStbHK.js → transform-DilY9wbS.js} +10 -12
  284. package/dist/src/{transform-D5PjiWiZ.cjs → transform-DuHvhZpj.cjs} +179 -187
  285. package/dist/src/transform-aa6tmVpZ.js +216 -0
  286. package/dist/src/transform-m3qNw4KP.cjs +5 -0
  287. package/dist/src/transform-uAytVuyX.js +1506 -0
  288. package/dist/src/{transform-Dfl89yi4.js → transform-vNucnNr0.js} +39 -47
  289. package/dist/src/{transformersAvailability-SZnTS3pJ.js → transformersAvailability-CEVM2GNQ.js} +2 -2
  290. package/dist/src/{transformersAvailability-D-glmEy7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
  291. package/dist/src/{transformersAvailability-CjeFXhuJ.js → transformersAvailability-D6c6ROpT.js} +2 -2
  292. package/dist/src/{types-DWNf48sT.cjs → types-C_7nyzr1.cjs} +538 -574
  293. package/dist/src/{types-CXQduE9o.js → types-Cbd8uOMq.js} +68 -100
  294. package/dist/src/types-CzW2QFyi.js +3288 -0
  295. package/dist/src/{types-C5hEkb-x.js → types-DmyIJ-sR.js} +63 -99
  296. package/dist/src/{util-CoQjmE3u.js → util-B3xGByQh.js} +4 -5
  297. package/dist/src/{util-aLhtl3fe.cjs → util-B9vlHIIh.cjs} +208 -223
  298. package/dist/src/{util-Du96oyYS.js → util-BHGHw5G1.js} +4 -5
  299. package/dist/src/{util-DQ984syk.js → util-BRYkYPTd.js} +36 -51
  300. package/dist/src/{util-D9eLdGfa.js → util-BV4XUC0n.js} +5 -6
  301. package/dist/src/util-Bv6uGDfH.js +293 -0
  302. package/dist/src/{util-1wWM599Z.cjs → util-BzMcevZc.cjs} +50 -51
  303. package/dist/src/{util-_h4pVqrz.js → util-C1CeHl-P.js} +36 -51
  304. package/dist/src/{util-Bm_-UMD_.js → util-CMy69ZgQ.js} +5 -6
  305. package/dist/src/{util-CyUdMzV0.cjs → util-DGNOS1db.cjs} +34 -35
  306. package/dist/src/util-Dnmk2mBQ.js +599 -0
  307. package/dist/src/util-ZzmqNPlg.js +1426 -0
  308. package/dist/src/{utils-BjLy-Q72.cjs → utils-Cz9qXqII.cjs} +29 -32
  309. package/dist/src/{utils-CFMn2yHW.js → utils-XiOAgly5.js} +4 -7
  310. package/dist/src/utils-dLokC-eR.js +94 -0
  311. package/dist/src/{utils-DvWMzuMx.js → utils-f2-Moju7.js} +4 -7
  312. package/dist/tsconfig.tsbuildinfo +1 -1
  313. package/package.json +38 -38
  314. package/dist/src/app/assets/index-B2D0bCSI.js +0 -439
  315. package/dist/src/app/assets/vendor-charts-CCl15Imd.js +0 -36
  316. package/dist/src/cache-ChPcurj7.js +0 -6
  317. package/dist/src/cache-VVu_W-yg.js +0 -8
  318. package/dist/src/cache-YLNCFEM2.cjs +0 -6
  319. package/dist/src/chunk-DHDDz29n.js +0 -22
  320. package/dist/src/chunk-FhC4c-0y.js +0 -21
  321. package/dist/src/cloud-BndfXy4H.js +0 -5
  322. package/dist/src/eval-BhHvMY82.js +0 -17
  323. package/dist/src/evalResult-Dq2gFNQY.js +0 -12
  324. package/dist/src/evalResult-nmcP5VKH.cjs +0 -12
  325. package/dist/src/evalResult-trqZjVYh.js +0 -14
  326. package/dist/src/evaluator-CnfPstzT.js +0 -39
  327. package/dist/src/fetch-IDPDue6F.cjs +0 -4
  328. package/dist/src/fetch-hKJ-It8q.js +0 -6
  329. package/dist/src/fetch-ouKnrWK-.js +0 -4
  330. package/dist/src/graders-CQn7WUsd.cjs +0 -34
  331. package/dist/src/graders-DC6QAbpW.js +0 -35
  332. package/dist/src/graders-DUWz3Y7j.js +0 -37
  333. package/dist/src/opencode-sdk-4bL9n-Gk.js +0 -382
  334. package/dist/src/opencode-sdk-BfC2zWcR.js +0 -376
  335. package/dist/src/opencode-sdk-DMJyuwMg.js +0 -380
  336. package/dist/src/opencode-sdk-Da-9adza.cjs +0 -383
  337. package/dist/src/providers-CsXB2Ix-.js +0 -35
  338. package/dist/src/providers-DO8ltjLC.js +0 -33
  339. package/dist/src/providers-Dtq-xnXd.cjs +0 -33
  340. package/dist/src/rubyUtils-BUbcND2f.js +0 -6
  341. package/dist/src/rubyUtils-Cr55X_KE.js +0 -5
  342. package/dist/src/rubyUtils-DlIiqoYo.cjs +0 -5
  343. package/dist/src/server-C2eQH4Gu.js +0 -6
  344. package/dist/src/server-CXWycu7H.cjs +0 -6
  345. package/dist/src/server-Q6OGlxxT.js +0 -8
  346. package/dist/src/store-B3EDO9Q3.js +0 -7
  347. package/dist/src/store-Dl9F8aw5.js +0 -6
  348. package/dist/src/store-SnrGrlt9.cjs +0 -6
  349. package/dist/src/telemetry-BGhiPZtl.js +0 -8
  350. package/dist/src/telemetry-CFfiYan6.cjs +0 -6
  351. package/dist/src/telemetry-DHzEduxX.js +0 -6
  352. package/dist/src/transform-C1x1ZlMQ.cjs +0 -6
  353. package/dist/src/transform-DYHjFmQu.js +0 -8
  354. package/dist/src/transform-rmwJT5JQ.js +0 -7
  355. package/dist/src/transformersAvailability-eJooj0gX.js +0 -35
package/README.md CHANGED
@@ -64,7 +64,7 @@ It works on the command line too:
64
64
 
65
65
  It also can generate [security vulnerability reports](https://www.promptfoo.dev/docs/red-team/):
66
66
 
67
- <img src="https://www.promptfoo.dev/img/riskreport-1@2x.png" alt="gen ai red team" width="700">
67
+ <img src="https://www.promptfoo.dev/img/redteam-dashboard@2x.jpg" alt="gen ai red team" width="700">
68
68
 
69
69
  ## Why Promptfoo?
70
70
 
@@ -2,7 +2,6 @@
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
3
  import { Box, Text, useApp, useInput } from "ink";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
-
6
5
  //#region src/ui/init/components/shared/TextInput.tsx
7
6
  /**
8
7
  * TextInput - Single-line text input component.
@@ -103,7 +102,6 @@ function TextInput({ value, onChange, onSubmit, placeholder = "", isFocused = tr
103
102
  ]
104
103
  });
105
104
  }
106
-
107
105
  //#endregion
108
106
  //#region src/ui/list/ListApp.tsx
109
107
  /**
@@ -575,7 +573,7 @@ function ListApp({ resourceType, items: initialItems = [], onSelect, onExit, onL
575
573
  ]
576
574
  });
577
575
  }
578
-
579
576
  //#endregion
580
577
  export { ListApp };
581
- //# sourceMappingURL=ListApp-8WOe2nT6.js.map
578
+
579
+ //# sourceMappingURL=ListApp-Du7YVwj5.js.map
@@ -0,0 +1,206 @@
1
+ import { C as isCI, b as getEnvString, i as logger } from "./logger-DLcq4dWf.js";
2
+ import { O as TERMINAL_MAX_WIDTH, a as CloudConfig, c as writeGlobalConfig, l as writeGlobalConfigPartial, r as fetchWithTimeout, s as readGlobalConfig } from "./fetch-HaqdX7U1.js";
3
+ import chalk from "chalk";
4
+ import input from "@inquirer/input";
5
+ import { z } from "zod";
6
+ const BAD_EMAIL_RESULT = "bad_email";
7
+ const EmailValidationStatus = {
8
+ OK: "ok",
9
+ EXCEEDED_LIMIT: "exceeded_limit",
10
+ SHOW_USAGE_WARNING: "show_usage_warning",
11
+ EMAIL_VERIFICATION_REQUIRED: "email_verification_required",
12
+ RISKY_EMAIL: "risky_email",
13
+ DISPOSABLE_EMAIL: "disposable_email"
14
+ };
15
+ const NO_EMAIL_STATUS = "no_email";
16
+ //#endregion
17
+ //#region src/globalConfig/accounts.ts
18
+ const CI_PLACEHOLDER_EMAIL = "ci-placeholder@promptfoo.dev";
19
+ function getUserId() {
20
+ let globalConfig = readGlobalConfig();
21
+ if (!globalConfig?.id) {
22
+ const newId = crypto.randomUUID();
23
+ globalConfig = {
24
+ ...globalConfig,
25
+ id: newId
26
+ };
27
+ writeGlobalConfig(globalConfig);
28
+ return newId;
29
+ }
30
+ return globalConfig.id;
31
+ }
32
+ function getUserEmail() {
33
+ return readGlobalConfig()?.account?.email || null;
34
+ }
35
+ function setUserEmail(email) {
36
+ const account = readGlobalConfig()?.account ?? {};
37
+ account.email = email;
38
+ writeGlobalConfigPartial({ account });
39
+ }
40
+ function clearUserEmail() {
41
+ const account = readGlobalConfig()?.account ?? {};
42
+ delete account.email;
43
+ writeGlobalConfigPartial({ account });
44
+ }
45
+ function getUserEmailNeedsValidation() {
46
+ return readGlobalConfig()?.account?.emailNeedsValidation || false;
47
+ }
48
+ function setUserEmailNeedsValidation(needsValidation) {
49
+ const account = readGlobalConfig()?.account ?? {};
50
+ account.emailNeedsValidation = needsValidation;
51
+ writeGlobalConfigPartial({ account });
52
+ }
53
+ function getUserEmailValidated() {
54
+ return readGlobalConfig()?.account?.emailValidated || false;
55
+ }
56
+ function setUserEmailValidated(validated) {
57
+ const account = readGlobalConfig()?.account ?? {};
58
+ account.emailValidated = validated;
59
+ writeGlobalConfigPartial({ account });
60
+ }
61
+ function getAuthor() {
62
+ return getEnvString("PROMPTFOO_AUTHOR") || getUserEmail() || null;
63
+ }
64
+ function isLoggedIntoCloud() {
65
+ return new CloudConfig().isEnabled();
66
+ }
67
+ /**
68
+ * Get the authentication method used for cloud access
69
+ * @returns 'api-key' | 'email' | 'none'
70
+ */
71
+ function getAuthMethod() {
72
+ const hasApiKey = new CloudConfig().isEnabled();
73
+ const hasEmail = !!getUserEmail();
74
+ if (hasApiKey && hasEmail) return "api-key";
75
+ if (hasApiKey) return "api-key";
76
+ if (hasEmail) return "email";
77
+ return "none";
78
+ }
79
+ /**
80
+ * Shared function to check email status with the promptfoo API
81
+ * Used by both CLI and server routes
82
+ */
83
+ async function checkEmailStatus(options) {
84
+ const { default: telemetry } = await import("./telemetry-Cps3mIU-.js").then((n) => n.r);
85
+ const ciMode = isCI();
86
+ const userEmail = ciMode ? CI_PLACEHOLDER_EMAIL : getUserEmail();
87
+ if (!userEmail) return {
88
+ status: NO_EMAIL_STATUS,
89
+ hasEmail: false,
90
+ message: "Redteam evals require email verification. Please enter your work email:"
91
+ };
92
+ if (ciMode) return {
93
+ status: EmailValidationStatus.OK,
94
+ hasEmail: true,
95
+ email: userEmail
96
+ };
97
+ try {
98
+ const validateParam = options?.validate ? "&validate=true" : "";
99
+ const timeout = options?.validate ? 3e3 : 500;
100
+ if (options?.validate) logger.info(`Checking email...`);
101
+ const data = await (await fetchWithTimeout(`${getEnvString("PROMPTFOO_CLOUD_API_URL", "https://api.promptfoo.app")}/api/users/status?email=${encodeURIComponent(userEmail)}${validateParam}`, void 0, timeout)).json();
102
+ if (options?.validate) if (new Set([
103
+ EmailValidationStatus.RISKY_EMAIL,
104
+ EmailValidationStatus.DISPOSABLE_EMAIL,
105
+ EmailValidationStatus.EMAIL_VERIFICATION_REQUIRED
106
+ ]).has(data.status)) {
107
+ if (data.status === EmailValidationStatus.EMAIL_VERIFICATION_REQUIRED) {
108
+ setUserEmailValidated(false);
109
+ setUserEmailNeedsValidation(true);
110
+ }
111
+ if (data.status === EmailValidationStatus.RISKY_EMAIL || data.status === EmailValidationStatus.DISPOSABLE_EMAIL) await telemetry.saveConsent(userEmail, { source: "filteredInvalidEmail" });
112
+ } else {
113
+ setUserEmailValidated(true);
114
+ await telemetry.saveConsent(userEmail, { source: "promptForEmailValidated" });
115
+ }
116
+ return {
117
+ status: data.status,
118
+ message: data.message ?? data.error,
119
+ email: userEmail,
120
+ hasEmail: true
121
+ };
122
+ } catch (e) {
123
+ logger.debug(`Failed to check user status: ${e}`);
124
+ return {
125
+ status: EmailValidationStatus.OK,
126
+ message: "Unable to verify email status, but proceeding",
127
+ email: userEmail,
128
+ hasEmail: true
129
+ };
130
+ }
131
+ }
132
+ async function promptForEmailUnverified() {
133
+ const { default: telemetry } = await import("./telemetry-Cps3mIU-.js").then((n) => n.r);
134
+ const ciMode = isCI();
135
+ const existingEmail = getUserEmail();
136
+ let email = ciMode ? CI_PLACEHOLDER_EMAIL : existingEmail;
137
+ const existingEmailNeedsValidation = !ciMode && getUserEmailNeedsValidation();
138
+ const existingEmailValidated = ciMode || getUserEmailValidated();
139
+ let emailNeedsValidation = existingEmailNeedsValidation && !existingEmailValidated;
140
+ if (!email) {
141
+ await telemetry.record("feature_used", { feature: "promptForEmailUnverified" });
142
+ const border = "─".repeat(TERMINAL_MAX_WIDTH);
143
+ logger.info("");
144
+ logger.info(chalk.cyan(border));
145
+ logger.info(chalk.cyan.bold(" Email Verification Required"));
146
+ logger.info(chalk.cyan(border));
147
+ logger.info("");
148
+ logger.info(" Red team scans require email verification to continue.");
149
+ logger.info("");
150
+ const emailSchema = z.email();
151
+ try {
152
+ email = await input({
153
+ message: chalk.bold("Work email:"),
154
+ validate: (input) => {
155
+ const result = emailSchema.safeParse(input);
156
+ return result.success || result.error.issues[0].message;
157
+ }
158
+ });
159
+ } catch (error) {
160
+ const err = error;
161
+ if (err?.name === "AbortPromptError" || err?.name === "ExitPromptError") process.exit(1);
162
+ logger.error(`failed to prompt for email: ${err}`);
163
+ throw err;
164
+ }
165
+ setUserEmail(email);
166
+ setUserEmailNeedsValidation(true);
167
+ setUserEmailValidated(false);
168
+ emailNeedsValidation = true;
169
+ await telemetry.record("feature_used", { feature: "userCompletedPromptForEmailUnverified" });
170
+ }
171
+ return { emailNeedsValidation };
172
+ }
173
+ async function checkEmailStatusAndMaybeExit(options) {
174
+ const result = await checkEmailStatus(options);
175
+ if (isCI()) return "ok";
176
+ if (result.status === EmailValidationStatus.RISKY_EMAIL || result.status === EmailValidationStatus.DISPOSABLE_EMAIL) {
177
+ logger.error("Please use a valid work email.");
178
+ setUserEmail("");
179
+ return BAD_EMAIL_RESULT;
180
+ }
181
+ if (result.status === EmailValidationStatus.EXCEEDED_LIMIT) {
182
+ logger.error("You have exceeded the maximum cloud inference limit. Please contact inquiries@promptfoo.dev to upgrade your account.");
183
+ process.exit(1);
184
+ }
185
+ if (result.status === EmailValidationStatus.EMAIL_VERIFICATION_REQUIRED) {
186
+ setUserEmailNeedsValidation(true);
187
+ setUserEmailValidated(false);
188
+ const message = result.message || "Your email address is not verified. Check your inbox for a verification link, then rerun the command.";
189
+ logger.error(message, {
190
+ status: result.status,
191
+ hasEmail: result.hasEmail
192
+ });
193
+ process.exit(1);
194
+ }
195
+ if (result.status === EmailValidationStatus.SHOW_USAGE_WARNING && result.message) {
196
+ const border = "=".repeat(TERMINAL_MAX_WIDTH);
197
+ logger.info(chalk.yellow(border));
198
+ logger.warn(chalk.yellow(result.message));
199
+ logger.info(chalk.yellow(border));
200
+ }
201
+ return "ok";
202
+ }
203
+ //#endregion
204
+ export { getAuthor as a, isLoggedIntoCloud as c, getAuthMethod as i, promptForEmailUnverified as l, checkEmailStatusAndMaybeExit as n, getUserEmail as o, clearUserEmail as r, getUserId as s, checkEmailStatus as t, setUserEmail as u };
205
+
206
+ //# sourceMappingURL=accounts-B0pgC1oV.js.map
@@ -1,16 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { C as getEnvString, E as isCI, o as logger_default } from "./logger-LSBxlt7a.js";
3
- import { i as fetchWithTimeout, k as TERMINAL_MAX_WIDTH } from "./fetch-CXZI9RRr.js";
4
- import { c as writeGlobalConfigPartial, o as readGlobalConfig, r as CloudConfig, s as writeGlobalConfig } from "./cloud-CZ-q9Ier.js";
2
+ import { C as getEnvString, E as isCI, o as logger } from "./logger-KkObSCzq.js";
3
+ import { D as TERMINAL_MAX_WIDTH, i as fetchWithTimeout } from "./fetch-Dxpd4_sr.js";
4
+ import { c as writeGlobalConfigPartial, o as readGlobalConfig, r as CloudConfig, s as writeGlobalConfig } from "./cloud-C0dlstV_.js";
5
5
  import { z } from "zod";
6
6
  import input from "@inquirer/input";
7
7
  import chalk from "chalk";
8
-
9
- //#region src/types/email.ts
10
- const EMAIL_OK_STATUS = "ok";
11
8
  const BAD_EMAIL_RESULT = "bad_email";
12
9
  const EmailValidationStatus = {
13
- OK: EMAIL_OK_STATUS,
10
+ OK: "ok",
14
11
  EXCEEDED_LIMIT: "exceeded_limit",
15
12
  SHOW_USAGE_WARNING: "show_usage_warning",
16
13
  EMAIL_VERIFICATION_REQUIRED: "email_verification_required",
@@ -18,9 +15,9 @@ const EmailValidationStatus = {
18
15
  DISPOSABLE_EMAIL: "disposable_email"
19
16
  };
20
17
  const NO_EMAIL_STATUS = "no_email";
21
-
22
18
  //#endregion
23
19
  //#region src/globalConfig/accounts.ts
20
+ const CI_PLACEHOLDER_EMAIL = "ci-placeholder@promptfoo.dev";
24
21
  function getUserId() {
25
22
  let globalConfig = readGlobalConfig();
26
23
  if (!globalConfig?.id) {
@@ -86,17 +83,23 @@ function getAuthMethod() {
86
83
  * Used by both CLI and server routes
87
84
  */
88
85
  async function checkEmailStatus(options) {
89
- const { default: telemetry } = await import("./telemetry-BGhiPZtl.js");
90
- const userEmail = isCI() ? "ci-placeholder@promptfoo.dev" : getUserEmail();
86
+ const { default: telemetry } = await import("./telemetry-Dw38hanS.js");
87
+ const ciMode = isCI();
88
+ const userEmail = ciMode ? CI_PLACEHOLDER_EMAIL : getUserEmail();
91
89
  if (!userEmail) return {
92
90
  status: NO_EMAIL_STATUS,
93
91
  hasEmail: false,
94
92
  message: "Redteam evals require email verification. Please enter your work email:"
95
93
  };
94
+ if (ciMode) return {
95
+ status: EmailValidationStatus.OK,
96
+ hasEmail: true,
97
+ email: userEmail
98
+ };
96
99
  try {
97
100
  const validateParam = options?.validate ? "&validate=true" : "";
98
101
  const timeout = options?.validate ? 3e3 : 500;
99
- if (options?.validate) logger_default.info(`Checking email...`);
102
+ if (options?.validate) logger.info(`Checking email...`);
100
103
  const data = await (await fetchWithTimeout(`${getEnvString("PROMPTFOO_CLOUD_API_URL", "https://api.promptfoo.app")}/api/users/status?email=${encodeURIComponent(userEmail)}${validateParam}`, void 0, timeout)).json();
101
104
  if (options?.validate) if (new Set([
102
105
  EmailValidationStatus.RISKY_EMAIL,
@@ -119,7 +122,7 @@ async function checkEmailStatus(options) {
119
122
  hasEmail: true
120
123
  };
121
124
  } catch (e) {
122
- logger_default.debug(`Failed to check user status: ${e}`);
125
+ logger.debug(`Failed to check user status: ${e}`);
123
126
  return {
124
127
  status: EmailValidationStatus.OK,
125
128
  message: "Unable to verify email status, but proceeding",
@@ -129,22 +132,23 @@ async function checkEmailStatus(options) {
129
132
  }
130
133
  }
131
134
  async function promptForEmailUnverified() {
132
- const { default: telemetry } = await import("./telemetry-BGhiPZtl.js");
135
+ const { default: telemetry } = await import("./telemetry-Dw38hanS.js");
136
+ const ciMode = isCI();
133
137
  const existingEmail = getUserEmail();
134
- let email = isCI() ? "ci-placeholder@promptfoo.dev" : existingEmail;
135
- const existingEmailNeedsValidation = !isCI() && getUserEmailNeedsValidation();
136
- const existingEmailValidated = isCI() || getUserEmailValidated();
138
+ let email = ciMode ? CI_PLACEHOLDER_EMAIL : existingEmail;
139
+ const existingEmailNeedsValidation = !ciMode && getUserEmailNeedsValidation();
140
+ const existingEmailValidated = ciMode || getUserEmailValidated();
137
141
  let emailNeedsValidation = existingEmailNeedsValidation && !existingEmailValidated;
138
142
  if (!email) {
139
143
  await telemetry.record("feature_used", { feature: "promptForEmailUnverified" });
140
144
  const border = "─".repeat(TERMINAL_MAX_WIDTH);
141
- logger_default.info("");
142
- logger_default.info(chalk.cyan(border));
143
- logger_default.info(chalk.cyan.bold(" Email Verification Required"));
144
- logger_default.info(chalk.cyan(border));
145
- logger_default.info("");
146
- logger_default.info(" Red team scans require email verification to continue.");
147
- logger_default.info("");
145
+ logger.info("");
146
+ logger.info(chalk.cyan(border));
147
+ logger.info(chalk.cyan.bold(" Email Verification Required"));
148
+ logger.info(chalk.cyan(border));
149
+ logger.info("");
150
+ logger.info(" Red team scans require email verification to continue.");
151
+ logger.info("");
148
152
  const emailSchema = z.email();
149
153
  try {
150
154
  email = await input({
@@ -157,7 +161,7 @@ async function promptForEmailUnverified() {
157
161
  } catch (error) {
158
162
  const err = error;
159
163
  if (err?.name === "AbortPromptError" || err?.name === "ExitPromptError") process.exit(1);
160
- logger_default.error(`failed to prompt for email: ${err}`);
164
+ logger.error(`failed to prompt for email: ${err}`);
161
165
  throw err;
162
166
  }
163
167
  setUserEmail(email);
@@ -170,20 +174,21 @@ async function promptForEmailUnverified() {
170
174
  }
171
175
  async function checkEmailStatusAndMaybeExit(options) {
172
176
  const result = await checkEmailStatus(options);
177
+ if (isCI()) return "ok";
173
178
  if (result.status === EmailValidationStatus.RISKY_EMAIL || result.status === EmailValidationStatus.DISPOSABLE_EMAIL) {
174
- logger_default.error("Please use a valid work email.");
179
+ logger.error("Please use a valid work email.");
175
180
  setUserEmail("");
176
181
  return BAD_EMAIL_RESULT;
177
182
  }
178
183
  if (result.status === EmailValidationStatus.EXCEEDED_LIMIT) {
179
- logger_default.error("You have exceeded the maximum cloud inference limit. Please contact inquiries@promptfoo.dev to upgrade your account.");
184
+ logger.error("You have exceeded the maximum cloud inference limit. Please contact inquiries@promptfoo.dev to upgrade your account.");
180
185
  process.exit(1);
181
186
  }
182
187
  if (result.status === EmailValidationStatus.EMAIL_VERIFICATION_REQUIRED) {
183
188
  setUserEmailNeedsValidation(true);
184
189
  setUserEmailValidated(false);
185
190
  const message = result.message || "Your email address is not verified. Check your inbox for a verification link, then rerun the command.";
186
- logger_default.error(message, {
191
+ logger.error(message, {
187
192
  status: result.status,
188
193
  hasEmail: result.hasEmail
189
194
  });
@@ -191,13 +196,13 @@ async function checkEmailStatusAndMaybeExit(options) {
191
196
  }
192
197
  if (result.status === EmailValidationStatus.SHOW_USAGE_WARNING && result.message) {
193
198
  const border = "=".repeat(TERMINAL_MAX_WIDTH);
194
- logger_default.info(chalk.yellow(border));
195
- logger_default.warn(chalk.yellow(result.message));
196
- logger_default.info(chalk.yellow(border));
199
+ logger.info(chalk.yellow(border));
200
+ logger.warn(chalk.yellow(result.message));
201
+ logger.info(chalk.yellow(border));
197
202
  }
198
- return EMAIL_OK_STATUS;
203
+ return "ok";
199
204
  }
200
-
201
205
  //#endregion
202
- export { getAuthor as a, isLoggedIntoCloud as c, EMAIL_OK_STATUS as d, getAuthMethod as i, promptForEmailUnverified as l, checkEmailStatusAndMaybeExit as n, getUserEmail as o, clearUserEmail as r, getUserId as s, checkEmailStatus as t, setUserEmail as u };
203
- //# sourceMappingURL=accounts-DVINui-2.js.map
206
+ export { getAuthor as a, isLoggedIntoCloud as c, getAuthMethod as i, promptForEmailUnverified as l, checkEmailStatusAndMaybeExit as n, getUserEmail as o, clearUserEmail as r, getUserId as s, checkEmailStatus as t, setUserEmail as u };
207
+
208
+ //# sourceMappingURL=accounts-Bm2D8Db9.js.map
@@ -1,14 +1,11 @@
1
- import { C as isCI, b as getEnvString, i as logger_default } from "./logger-CG1uZPbQ.js";
2
- import { M as TERMINAL_MAX_WIDTH, d as writeGlobalConfigPartial, l as readGlobalConfig, r as fetchWithTimeout, s as CloudConfig, u as writeGlobalConfig } from "./fetch-D3OHf-lV.js";
1
+ import { C as isCI, b as getEnvString, i as logger } from "./logger-CT3IKMKA.js";
2
+ import { O as TERMINAL_MAX_WIDTH, a as CloudConfig, c as writeGlobalConfig, l as writeGlobalConfigPartial, r as fetchWithTimeout, s as readGlobalConfig } from "./fetch-Cwxnd8zz.js";
3
3
  import chalk from "chalk";
4
4
  import { z } from "zod";
5
5
  import input from "@inquirer/input";
6
-
7
- //#region src/types/email.ts
8
- const EMAIL_OK_STATUS = "ok";
9
6
  const BAD_EMAIL_RESULT = "bad_email";
10
7
  const EmailValidationStatus = {
11
- OK: EMAIL_OK_STATUS,
8
+ OK: "ok",
12
9
  EXCEEDED_LIMIT: "exceeded_limit",
13
10
  SHOW_USAGE_WARNING: "show_usage_warning",
14
11
  EMAIL_VERIFICATION_REQUIRED: "email_verification_required",
@@ -16,9 +13,9 @@ const EmailValidationStatus = {
16
13
  DISPOSABLE_EMAIL: "disposable_email"
17
14
  };
18
15
  const NO_EMAIL_STATUS = "no_email";
19
-
20
16
  //#endregion
21
17
  //#region src/globalConfig/accounts.ts
18
+ const CI_PLACEHOLDER_EMAIL = "ci-placeholder@promptfoo.dev";
22
19
  function getUserId() {
23
20
  let globalConfig = readGlobalConfig();
24
21
  if (!globalConfig?.id) {
@@ -79,17 +76,23 @@ function getAuthMethod() {
79
76
  * Used by both CLI and server routes
80
77
  */
81
78
  async function checkEmailStatus(options) {
82
- const { default: telemetry } = await import("./telemetry-DHzEduxX.js");
83
- const userEmail = isCI() ? "ci-placeholder@promptfoo.dev" : getUserEmail();
79
+ const { default: telemetry } = await import("./telemetry-Dthj_BbD.js").then((n) => n.n);
80
+ const ciMode = isCI();
81
+ const userEmail = ciMode ? CI_PLACEHOLDER_EMAIL : getUserEmail();
84
82
  if (!userEmail) return {
85
83
  status: NO_EMAIL_STATUS,
86
84
  hasEmail: false,
87
85
  message: "Redteam evals require email verification. Please enter your work email:"
88
86
  };
87
+ if (ciMode) return {
88
+ status: EmailValidationStatus.OK,
89
+ hasEmail: true,
90
+ email: userEmail
91
+ };
89
92
  try {
90
93
  const validateParam = options?.validate ? "&validate=true" : "";
91
94
  const timeout = options?.validate ? 3e3 : 500;
92
- if (options?.validate) logger_default.info(`Checking email...`);
95
+ if (options?.validate) logger.info(`Checking email...`);
93
96
  const data = await (await fetchWithTimeout(`${getEnvString("PROMPTFOO_CLOUD_API_URL", "https://api.promptfoo.app")}/api/users/status?email=${encodeURIComponent(userEmail)}${validateParam}`, void 0, timeout)).json();
94
97
  if (options?.validate) if (new Set([
95
98
  EmailValidationStatus.RISKY_EMAIL,
@@ -112,7 +115,7 @@ async function checkEmailStatus(options) {
112
115
  hasEmail: true
113
116
  };
114
117
  } catch (e) {
115
- logger_default.debug(`Failed to check user status: ${e}`);
118
+ logger.debug(`Failed to check user status: ${e}`);
116
119
  return {
117
120
  status: EmailValidationStatus.OK,
118
121
  message: "Unable to verify email status, but proceeding",
@@ -122,22 +125,23 @@ async function checkEmailStatus(options) {
122
125
  }
123
126
  }
124
127
  async function promptForEmailUnverified() {
125
- const { default: telemetry } = await import("./telemetry-DHzEduxX.js");
128
+ const { default: telemetry } = await import("./telemetry-Dthj_BbD.js").then((n) => n.n);
129
+ const ciMode = isCI();
126
130
  const existingEmail = getUserEmail();
127
- let email = isCI() ? "ci-placeholder@promptfoo.dev" : existingEmail;
128
- const existingEmailNeedsValidation = !isCI() && getUserEmailNeedsValidation();
129
- const existingEmailValidated = isCI() || getUserEmailValidated();
131
+ let email = ciMode ? CI_PLACEHOLDER_EMAIL : existingEmail;
132
+ const existingEmailNeedsValidation = !ciMode && getUserEmailNeedsValidation();
133
+ const existingEmailValidated = ciMode || getUserEmailValidated();
130
134
  let emailNeedsValidation = existingEmailNeedsValidation && !existingEmailValidated;
131
135
  if (!email) {
132
136
  await telemetry.record("feature_used", { feature: "promptForEmailUnverified" });
133
137
  const border = "─".repeat(TERMINAL_MAX_WIDTH);
134
- logger_default.info("");
135
- logger_default.info(chalk.cyan(border));
136
- logger_default.info(chalk.cyan.bold(" Email Verification Required"));
137
- logger_default.info(chalk.cyan(border));
138
- logger_default.info("");
139
- logger_default.info(" Red team scans require email verification to continue.");
140
- logger_default.info("");
138
+ logger.info("");
139
+ logger.info(chalk.cyan(border));
140
+ logger.info(chalk.cyan.bold(" Email Verification Required"));
141
+ logger.info(chalk.cyan(border));
142
+ logger.info("");
143
+ logger.info(" Red team scans require email verification to continue.");
144
+ logger.info("");
141
145
  const emailSchema = z.email();
142
146
  try {
143
147
  email = await input({
@@ -150,7 +154,7 @@ async function promptForEmailUnverified() {
150
154
  } catch (error) {
151
155
  const err = error;
152
156
  if (err?.name === "AbortPromptError" || err?.name === "ExitPromptError") process.exit(1);
153
- logger_default.error(`failed to prompt for email: ${err}`);
157
+ logger.error(`failed to prompt for email: ${err}`);
154
158
  throw err;
155
159
  }
156
160
  setUserEmail(email);
@@ -163,20 +167,21 @@ async function promptForEmailUnverified() {
163
167
  }
164
168
  async function checkEmailStatusAndMaybeExit(options) {
165
169
  const result = await checkEmailStatus(options);
170
+ if (isCI()) return "ok";
166
171
  if (result.status === EmailValidationStatus.RISKY_EMAIL || result.status === EmailValidationStatus.DISPOSABLE_EMAIL) {
167
- logger_default.error("Please use a valid work email.");
172
+ logger.error("Please use a valid work email.");
168
173
  setUserEmail("");
169
174
  return BAD_EMAIL_RESULT;
170
175
  }
171
176
  if (result.status === EmailValidationStatus.EXCEEDED_LIMIT) {
172
- logger_default.error("You have exceeded the maximum cloud inference limit. Please contact inquiries@promptfoo.dev to upgrade your account.");
177
+ logger.error("You have exceeded the maximum cloud inference limit. Please contact inquiries@promptfoo.dev to upgrade your account.");
173
178
  process.exit(1);
174
179
  }
175
180
  if (result.status === EmailValidationStatus.EMAIL_VERIFICATION_REQUIRED) {
176
181
  setUserEmailNeedsValidation(true);
177
182
  setUserEmailValidated(false);
178
183
  const message = result.message || "Your email address is not verified. Check your inbox for a verification link, then rerun the command.";
179
- logger_default.error(message, {
184
+ logger.error(message, {
180
185
  status: result.status,
181
186
  hasEmail: result.hasEmail
182
187
  });
@@ -184,13 +189,13 @@ async function checkEmailStatusAndMaybeExit(options) {
184
189
  }
185
190
  if (result.status === EmailValidationStatus.SHOW_USAGE_WARNING && result.message) {
186
191
  const border = "=".repeat(TERMINAL_MAX_WIDTH);
187
- logger_default.info(chalk.yellow(border));
188
- logger_default.warn(chalk.yellow(result.message));
189
- logger_default.info(chalk.yellow(border));
192
+ logger.info(chalk.yellow(border));
193
+ logger.warn(chalk.yellow(result.message));
194
+ logger.info(chalk.yellow(border));
190
195
  }
191
- return EMAIL_OK_STATUS;
196
+ return "ok";
192
197
  }
193
-
194
198
  //#endregion
195
- export { getUserId as a, setUserEmail as c, getUserEmail as i, EMAIL_OK_STATUS as l, getAuthMethod as n, isLoggedIntoCloud as o, getAuthor as r, promptForEmailUnverified as s, checkEmailStatusAndMaybeExit as t };
196
- //# sourceMappingURL=accounts-CPDRAMND.js.map
199
+ export { getUserId as a, setUserEmail as c, getUserEmail as i, getAuthMethod as n, isLoggedIntoCloud as o, getAuthor as r, promptForEmailUnverified as s, checkEmailStatusAndMaybeExit as t };
200
+
201
+ //# sourceMappingURL=accounts-CiBLOnA7.js.map