promptfoo 0.125.0 → 0.125.1

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 (869) hide show
  1. package/README.md +3 -3
  2. package/dist/src/accounts-BOxNYxVN.js +229 -0
  3. package/dist/src/accounts-BezXLdAW.cjs +276 -0
  4. package/dist/src/accounts-CPISMNlh.js +227 -0
  5. package/dist/src/accounts-vJBPs89d.js +222 -0
  6. package/dist/src/agentWorkspace-Bom7SpF2.js +592 -0
  7. package/dist/src/agentWorkspace-CEomAcws.cjs +619 -0
  8. package/dist/src/agentWorkspace-DPtMLrlI.js +593 -0
  9. package/dist/src/agentWorkspace-DkAeEYLz.js +592 -0
  10. package/dist/src/agentic-utils-121v7mJo.js +197 -0
  11. package/dist/src/agentic-utils-CBWD_rcd.cjs +237 -0
  12. package/dist/src/agentic-utils-D8wyQwPG.js +198 -0
  13. package/dist/src/agentic-utils-EP1QkQCs.js +197 -0
  14. package/dist/src/agents-Br3ah8iA.js +778 -0
  15. package/dist/src/agents-C5wj_UTv.js +777 -0
  16. package/dist/src/agents-C9Efp4mC.js +266 -0
  17. package/dist/src/agents-CQYwaVCO.js +267 -0
  18. package/dist/src/agents-CjCd4Vo8.js +777 -0
  19. package/dist/src/agents-DRWiCHYz.js +266 -0
  20. package/dist/src/agents-F2rhx0iL.cjs +266 -0
  21. package/dist/src/agents-RTYyy69h.cjs +777 -0
  22. package/dist/src/agents-api-CY72O86e.js +711 -0
  23. package/dist/src/agents-api-CsSsC21b.js +710 -0
  24. package/dist/src/agents-api-DN-ibDc8.js +710 -0
  25. package/dist/src/agents-api-cNDsCCv1.cjs +710 -0
  26. package/dist/src/ai.studio-Bj6Dyi6o.js +2 -0
  27. package/dist/src/ai.studio-C-e0LzyW.js +369 -0
  28. package/dist/src/ai.studio-CR8M6Aqf.cjs +391 -0
  29. package/dist/src/ai.studio-YKk7F0tv.js +374 -0
  30. package/dist/src/aimlapi-BGunsuTu.js +30 -0
  31. package/dist/src/aimlapi-BkzcfBsL.js +29 -0
  32. package/dist/src/aimlapi-DXFcEdP8.js +28 -0
  33. package/dist/src/aimlapi-r-8iCcAw.cjs +29 -0
  34. package/dist/src/anthropicMessages-7-YNRgQR.js +114 -0
  35. package/dist/src/anthropicMessages-C8m9Whrd.cjs +114 -0
  36. package/dist/src/anthropicMessages-DS1vXD0f.js +115 -0
  37. package/dist/src/anthropicMessages-DmvGkz-0.js +114 -0
  38. package/dist/src/app/assets/index-CrdXWTXm.js +392 -0
  39. package/dist/src/app/browser-inventory.json +4 -4
  40. package/dist/src/app/index.html +1 -1
  41. package/dist/src/audio-BLgFgyw-.cjs +104 -0
  42. package/dist/src/audio-C2sibT7Q.js +104 -0
  43. package/dist/src/audio-DXEXb03H.js +104 -0
  44. package/dist/src/audio-TkvojpwO.js +105 -0
  45. package/dist/src/authoritativeMarkupInjection-BAT9B-Wj.js +79 -0
  46. package/dist/src/authoritativeMarkupInjection-B_yHETKT.js +78 -0
  47. package/dist/src/authoritativeMarkupInjection-BfjecQ3Q.cjs +78 -0
  48. package/dist/src/authoritativeMarkupInjection-D-hDKrhD.js +78 -0
  49. package/dist/src/aws-B_9unI_-.js +1149 -0
  50. package/dist/src/aws-D0FY3qkc.js +2433 -0
  51. package/dist/src/aws-Dh1-a90n.js +2433 -0
  52. package/dist/src/aws-qskKGczY.cjs +2454 -0
  53. package/dist/src/base-CaWlBkVz.js +462 -0
  54. package/dist/src/base-CcViNwVs.js +255 -0
  55. package/dist/src/base-CsVbPJkU.cjs +467 -0
  56. package/dist/src/base-DNK9py25.js +255 -0
  57. package/dist/src/base-DlH5tjEZ.js +463 -0
  58. package/dist/src/base-DyLOZ_iX.js +256 -0
  59. package/dist/src/base-RRYXfG7l.cjs +305 -0
  60. package/dist/src/base-oXVgvtVn.js +462 -0
  61. package/dist/src/bedrock-BP17ZXbR.cjs +2 -0
  62. package/dist/src/bedrock-CsjM1dOt.js +1300 -0
  63. package/dist/src/bedrock-CzPwj8GO.js +1 -0
  64. package/dist/src/bedrock-eGXZw8oh.js +1 -0
  65. package/dist/src/bedrock-tSWjmXdj.js +2 -0
  66. package/dist/src/bestOfN-BQ93nUKV.js +160 -0
  67. package/dist/src/bestOfN-ByGGwlcb.cjs +161 -0
  68. package/dist/src/bestOfN-CbP7csHr.js +159 -0
  69. package/dist/src/bestOfN-xn6i2Xs2.js +159 -0
  70. package/dist/src/cache-CHq9hPz9.js +2 -0
  71. package/dist/src/cache-D-9eZN3I.js +754 -0
  72. package/dist/src/cache-DSm6t1MZ.js +741 -0
  73. package/dist/src/cache-DeF5zIEN.js +782 -0
  74. package/dist/src/cache-iG87oYan.cjs +856 -0
  75. package/dist/src/cerebras-CTtM4yMH.js +98 -0
  76. package/dist/src/cerebras-CogcJ3ce.cjs +97 -0
  77. package/dist/src/cerebras-DmkRypTh.js +97 -0
  78. package/dist/src/cerebras-GUp0B8JY.js +97 -0
  79. package/dist/src/chat-B4ihd3fw.js +226 -0
  80. package/dist/src/chat-B9cAQ_rS.js +227 -0
  81. package/dist/src/chat-BU7EB4R-.cjs +76 -0
  82. package/dist/src/chat-C8yxJ2-s.cjs +226 -0
  83. package/dist/src/chat-ClTFM3qq.js +934 -0
  84. package/dist/src/chat-Cnq0Is68.js +123 -0
  85. package/dist/src/chat-CwrurR57.cjs +987 -0
  86. package/dist/src/chat-D0lsojPv.js +124 -0
  87. package/dist/src/chat-D7_8yFIx.js +76 -0
  88. package/dist/src/chat-DCoETlLG.js +226 -0
  89. package/dist/src/chat-DHE7xaTR.js +76 -0
  90. package/dist/src/chat-DmhT6rz2.cjs +123 -0
  91. package/dist/src/chat-DvfMe8KI.js +123 -0
  92. package/dist/src/chat-DwP5kVnl.js +935 -0
  93. package/dist/src/chat-MB7U-QE2.js +77 -0
  94. package/dist/src/chat-zCWuBKAj.js +934 -0
  95. package/dist/src/claude-agent-sdk-23bIVI75.js +999 -0
  96. package/dist/src/claude-agent-sdk-BACpnIJi.cjs +1005 -0
  97. package/dist/src/claude-agent-sdk-BlYlmcEr.js +999 -0
  98. package/dist/src/claude-agent-sdk-Cr-jqJZl.js +1000 -0
  99. package/dist/src/client-BktbiPx9.cjs +357 -0
  100. package/dist/src/client-CjztEBmW.js +351 -0
  101. package/dist/src/client-mRs2UvH9.js +351 -0
  102. package/dist/src/client-uCz0ydjC.js +352 -0
  103. package/dist/src/cloud-BtYF555L.js +2 -0
  104. package/dist/src/cloud-CVSUEmAy.js +287 -0
  105. package/dist/src/cloud-D7Ifb-Fl.js +599 -0
  106. package/dist/src/cloud-DB5oK5NX.cjs +666 -0
  107. package/dist/src/cloud-ecu989Em.js +657 -0
  108. package/dist/src/cloud-ramjGURF.js +599 -0
  109. package/dist/src/cloudflare-ai-BfDkIjO8.js +133 -0
  110. package/dist/src/cloudflare-ai-D9HaXz1M.js +134 -0
  111. package/dist/src/cloudflare-ai-HrD5WUK8.js +132 -0
  112. package/dist/src/cloudflare-ai-Qdj8aKP2.cjs +133 -0
  113. package/dist/src/cloudflare-gateway-C81uKETQ.js +276 -0
  114. package/dist/src/cloudflare-gateway-CX5Z9X0k.js +276 -0
  115. package/dist/src/cloudflare-gateway-DW-og8gb.js +277 -0
  116. package/dist/src/cloudflare-gateway-iRyXo9n2.cjs +276 -0
  117. package/dist/src/codex-app-server-BFIrSgdy.js +2155 -0
  118. package/dist/src/codex-app-server-By1eDVD4.js +2 -0
  119. package/dist/src/codex-app-server-DKsF4qmY.js +2156 -0
  120. package/dist/src/codex-app-server-n7n4uZzC.cjs +2162 -0
  121. package/dist/src/codex-app-server-xAoELVxu.js +2155 -0
  122. package/dist/src/codex-sdk-C2ZLxa6r.js +1552 -0
  123. package/dist/src/codex-sdk-CzG02tQt.cjs +1588 -0
  124. package/dist/src/codex-sdk-DNxAOhiV.js +2 -0
  125. package/dist/src/codex-sdk-DT3aQezK.js +1557 -0
  126. package/dist/src/codex-sdk-pw9DpcJP.js +1557 -0
  127. package/dist/src/codex-security-B0bLmXJF.js +406 -0
  128. package/dist/src/codex-security-BhYs-3iY.js +406 -0
  129. package/dist/src/codex-security-DQcOfxYW.js +407 -0
  130. package/dist/src/codex-security-DsCWr6GZ.cjs +411 -0
  131. package/dist/src/cometapi-B16asPLX.cjs +55 -0
  132. package/dist/src/cometapi-MgTbZA_H.js +53 -0
  133. package/dist/src/cometapi-i33vKzPV.js +55 -0
  134. package/dist/src/cometapi-wK2UWK0X.js +56 -0
  135. package/dist/src/compatible-COj8ZCy9.js +24 -0
  136. package/dist/src/compatible-CRSsIUGb.cjs +24 -0
  137. package/dist/src/compatible-Dy1vCcNF.js +25 -0
  138. package/dist/src/compatible-aUItQrpk.js +24 -0
  139. package/dist/src/completion-Bn7COFMk.js +119 -0
  140. package/dist/src/completion-Bub2N48b.js +118 -0
  141. package/dist/src/completion-Cf2G9OlM.cjs +123 -0
  142. package/dist/src/conversationScoring-BiTYJ9MD.js +374 -0
  143. package/dist/src/conversationScoring-CKL47uIu.js +373 -0
  144. package/dist/src/conversationScoring-DCvQKp6k.cjs +398 -0
  145. package/dist/src/conversationScoring-DLNJtDZI.js +373 -0
  146. package/dist/src/crescendo-5iLk9WiJ.cjs +734 -0
  147. package/dist/src/crescendo-B5ylG7kW.js +733 -0
  148. package/dist/src/crescendo-BD7k6TIx.js +730 -0
  149. package/dist/src/crescendo-DqO2Ch0P.js +732 -0
  150. package/dist/src/custom-8rv_aG2K.js +617 -0
  151. package/dist/src/custom-BOtrIHFN.js +619 -0
  152. package/dist/src/custom-BvN8seCs.cjs +620 -0
  153. package/dist/src/custom-Cld9v_Y4.js +618 -0
  154. package/dist/src/dataUrl-BdHUey2l.cjs +3187 -0
  155. package/dist/src/dataUrl-DBMifX6C.js +3133 -0
  156. package/dist/src/dataUrl-DUSr-ZvI.js +2868 -0
  157. package/dist/src/decisions-CLazADTw.js +516 -0
  158. package/dist/src/decisions-D5X93awq.js +515 -0
  159. package/dist/src/decisions-DmaeArEn.js +515 -0
  160. package/dist/src/decisions-DyQJyHJz.cjs +514 -0
  161. package/dist/src/docker-C9NYQFeu.js +94 -0
  162. package/dist/src/docker-CGq3mMol.cjs +94 -0
  163. package/dist/src/docker-DOm7nmpl.js +95 -0
  164. package/dist/src/docker-skFN-Kfo.js +93 -0
  165. package/dist/src/embedding-0UbzkTk9.js +82 -0
  166. package/dist/src/embedding-DTrSDt7k.cjs +86 -0
  167. package/dist/src/embedding-j2ORNl5H.js +81 -0
  168. package/dist/src/envoy-BvS8XTQO.js +60 -0
  169. package/dist/src/envoy-Cn6Hzw0e.js +60 -0
  170. package/dist/src/envoy-DC3KWcUY.cjs +60 -0
  171. package/dist/src/envoy-DetHjo5B.js +61 -0
  172. package/dist/src/eval-Cer9dPe9.js +1920 -0
  173. package/dist/src/eval-CytYmI2Z.js +2 -0
  174. package/dist/src/evalResult-DzOq5wt9.js +1300 -0
  175. package/dist/src/evaluator-BxCmvGtv.js +10578 -0
  176. package/dist/src/evaluator-Ct7YDELm.js +2 -0
  177. package/dist/src/evaluatorHelpers-B_AwIrsl.js +600 -0
  178. package/dist/src/evaluatorHelpers-D1Tpc7gd.js +601 -0
  179. package/dist/src/evaluatorHelpers-DRR3rLq0.cjs +622 -0
  180. package/dist/src/fetch-B5KxZuKu.js +1559 -0
  181. package/dist/src/fetch-BG_Jl7ty.js +1556 -0
  182. package/dist/src/fetch-BKlgUg08.cjs +1853 -0
  183. package/dist/src/fetch-C9Fsja0R.js +2 -0
  184. package/dist/src/fetch-CM7P8KWA.cjs +14 -0
  185. package/dist/src/fetch-D0FkIB3G.js +9 -0
  186. package/dist/src/fetch-RXHsZF-J.js +1280 -0
  187. package/dist/src/fetch-rSECy8jR.js +10 -0
  188. package/dist/src/functionCallbackUtils-BB9tmf6a.cjs +262 -0
  189. package/dist/src/functionCallbackUtils-BXk2iY01.js +246 -0
  190. package/dist/src/functionCallbackUtils-B_cYp7P5.js +245 -0
  191. package/dist/src/functionCallbackUtils-BfXnPo0o.js +245 -0
  192. package/dist/src/gemini-image-BXLMADDz.js +471 -0
  193. package/dist/src/gemini-image-BYUZyEUx.js +472 -0
  194. package/dist/src/gemini-image-DSt1QubZ.cjs +471 -0
  195. package/dist/src/gemini-image-DdNDMiZ_.js +471 -0
  196. package/dist/src/goat-9b-uU_k6.js +514 -0
  197. package/dist/src/goat-BCJuiDd0.js +515 -0
  198. package/dist/src/goat-CmAHbemm.js +512 -0
  199. package/dist/src/goat-DdOTdyoS.cjs +515 -0
  200. package/dist/src/goblin-Bp5C5lyb.js +22 -0
  201. package/dist/src/goblin-Dmr7GItI.js +23 -0
  202. package/dist/src/goblin-DpM8wxlf.cjs +22 -0
  203. package/dist/src/goblin-cJyH6Pq-.js +22 -0
  204. package/dist/src/google-B6eaPAbE.js +142 -0
  205. package/dist/src/google-D-FStdN6.cjs +142 -0
  206. package/dist/src/google-DAC7BsCW.js +142 -0
  207. package/dist/src/google-Id18H0Va.js +143 -0
  208. package/dist/src/graders-BjNQWkaB.js +2 -0
  209. package/dist/src/graders-CqdIp_vl.js +15470 -0
  210. package/dist/src/hydra-6Ouh74DE.js +610 -0
  211. package/dist/src/hydra-BHjhZnLB.cjs +612 -0
  212. package/dist/src/hydra-BL6k2REV.js +2 -0
  213. package/dist/src/hydra-BWUc0o67.js +613 -0
  214. package/dist/src/hydra-CUkEOLKw.js +612 -0
  215. package/dist/src/image-B6hG_xhb.js +481 -0
  216. package/dist/src/image-BFaq7Krd.cjs +209 -0
  217. package/dist/src/image-Bql5C0N9.cjs +504 -0
  218. package/dist/src/image-BtZfI2pT.js +163 -0
  219. package/dist/src/image-CIM4oN7Z.cjs +163 -0
  220. package/dist/src/image-CbAl7Jpu.js +209 -0
  221. package/dist/src/image-CiYm_yFw.js +209 -0
  222. package/dist/src/image-DCMNvBiV.js +163 -0
  223. package/dist/src/image-DL7pIuUZ.js +210 -0
  224. package/dist/src/image-ey0kxF8o.js +164 -0
  225. package/dist/src/image-smgIk3rE.js +482 -0
  226. package/dist/src/index.cjs +27 -27
  227. package/dist/src/index.d.cts +8 -8
  228. package/dist/src/index.js +27 -27
  229. package/dist/src/indirectWebPwn-B_-UpWY5.js +285 -0
  230. package/dist/src/indirectWebPwn-Cz3SLiEq.js +434 -0
  231. package/dist/src/indirectWebPwn-D2s8zGiM.cjs +463 -0
  232. package/dist/src/indirectWebPwn-DXbj2wGu.cjs +285 -0
  233. package/dist/src/indirectWebPwn-D_4H44E6.js +285 -0
  234. package/dist/src/indirectWebPwn-L044SrpV.js +434 -0
  235. package/dist/src/indirectWebPwn-cnmvdavH.js +435 -0
  236. package/dist/src/indirectWebPwn-zUBzsqTt.js +286 -0
  237. package/dist/src/interactions-Bu3oVQ-j.js +850 -0
  238. package/dist/src/interactions-CND010Lh.cjs +850 -0
  239. package/dist/src/interactions-DAx7tqUz.js +851 -0
  240. package/dist/src/interactions-DPkIumeh.js +850 -0
  241. package/dist/src/iterative-BO4JRnpG.js +545 -0
  242. package/dist/src/iterative-CAK-k9rz.js +548 -0
  243. package/dist/src/iterative-CDgHc0xO.cjs +549 -0
  244. package/dist/src/iterative-CXJlHLl9.js +547 -0
  245. package/dist/src/iterativeImage-BEdGKSmh.cjs +419 -0
  246. package/dist/src/iterativeImage-BfL0QZw5.js +417 -0
  247. package/dist/src/iterativeImage-C9KhnibC.js +417 -0
  248. package/dist/src/iterativeImage-btjkOfWG.js +418 -0
  249. package/dist/src/iterativeMeta-B5Bdw6QA.js +437 -0
  250. package/dist/src/iterativeMeta-C3mI4gpT.js +440 -0
  251. package/dist/src/iterativeMeta-Co2BKyqS.cjs +439 -0
  252. package/dist/src/iterativeMeta-DD8ihRWD.js +439 -0
  253. package/dist/src/iterativeTree-AMi4GV2O.js +878 -0
  254. package/dist/src/iterativeTree-C8FJOEje.cjs +879 -0
  255. package/dist/src/iterativeTree-CvrY1f2Z.js +877 -0
  256. package/dist/src/iterativeTree-bPtESmaD.js +876 -0
  257. package/dist/src/knowledgeBase-Cf5871e3.js +163 -0
  258. package/dist/src/knowledgeBase-D2PQhqLH.js +164 -0
  259. package/dist/src/knowledgeBase-DpoMw1IH.cjs +163 -0
  260. package/dist/src/knowledgeBase-npGFl763.js +163 -0
  261. package/dist/src/litellm-BBB5DQdt.cjs +146 -0
  262. package/dist/src/litellm-Bo43ow7r.js +145 -0
  263. package/dist/src/litellm-CaU8CMLS.js +146 -0
  264. package/dist/src/litellm-wY7Unh8o.js +147 -0
  265. package/dist/src/live-5g2w-M-E.js +891 -0
  266. package/dist/src/live-BfaXsDyD.cjs +891 -0
  267. package/dist/src/live-C1xewnGD.js +2 -0
  268. package/dist/src/live-DaF7nYy5.js +892 -0
  269. package/dist/src/live-lp3urLUw.js +891 -0
  270. package/dist/src/luma-ray-B7zvKGVG.js +309 -0
  271. package/dist/src/luma-ray-DCf5fnrz.cjs +309 -0
  272. package/dist/src/luma-ray-DepBcn6z.js +309 -0
  273. package/dist/src/luma-ray-XQC4M1pt.js +310 -0
  274. package/dist/src/main.js +26 -26
  275. package/dist/src/mantleChat-7xm95vSV.js +154 -0
  276. package/dist/src/mantleChat-CXhAs5RD.js +155 -0
  277. package/dist/src/mantleChat-CcE-zjfj.cjs +154 -0
  278. package/dist/src/mantleChat-Cpefl7Zm.js +154 -0
  279. package/dist/src/mcp-B0V0ikdM.js +84 -0
  280. package/dist/src/mcp-CV2k2gwj.js +85 -0
  281. package/dist/src/memoryPoisoning-BC5FQQWZ.js +111 -0
  282. package/dist/src/memoryPoisoning-BDwrtZKX.js +111 -0
  283. package/dist/src/memoryPoisoning-BFemS_FF.js +112 -0
  284. package/dist/src/memoryPoisoning-DRs2rbVV.cjs +111 -0
  285. package/dist/src/messages-Bc5oZoAJ.js +1128 -0
  286. package/dist/src/messages-BkaH8fRW.js +1127 -0
  287. package/dist/src/messages-CoHlziS5.js +1127 -0
  288. package/dist/src/messages-Cv_m6kYs.cjs +1161 -0
  289. package/dist/src/mischievousUser-BcyFxrqJ.js +51 -0
  290. package/dist/src/mischievousUser-BlhOQSd2.js +52 -0
  291. package/dist/src/mischievousUser-BuQiKE8D.js +51 -0
  292. package/dist/src/mischievousUser-ChIOk6cT.cjs +51 -0
  293. package/dist/src/modelslab-BXIWBTgX.js +171 -0
  294. package/dist/src/modelslab-ChVsUiaJ.js +170 -0
  295. package/dist/src/modelslab-DZ6BFlDv.js +170 -0
  296. package/dist/src/modelslab-DhRr-vyo.cjs +170 -0
  297. package/dist/src/nova-reel-BL8DrN4_.js +272 -0
  298. package/dist/src/nova-reel-BiOMUm5q.cjs +272 -0
  299. package/dist/src/nova-reel-CTsya1hV.js +273 -0
  300. package/dist/src/nova-reel-kgBY4Svd.js +272 -0
  301. package/dist/src/nova-sonic-CaSSA3Jq.cjs +374 -0
  302. package/dist/src/nova-sonic-DLpmoGsR.js +375 -0
  303. package/dist/src/nova-sonic-DwWc4SoN.js +374 -0
  304. package/dist/src/nova-sonic-qnReTaXm.js +374 -0
  305. package/dist/src/novita-B5mAt3Ui.js +114 -0
  306. package/dist/src/novita-D57vCjDD.js +116 -0
  307. package/dist/src/novita-ITRtG8IJ.js +115 -0
  308. package/dist/src/novita-Rh3T13YO.cjs +115 -0
  309. package/dist/src/nscale-8V7iZ_pI.js +210 -0
  310. package/dist/src/nscale-BQnMv4pH.cjs +209 -0
  311. package/dist/src/nscale-BWZXHZVF.js +209 -0
  312. package/dist/src/nscale-BqrHiUqU.js +207 -0
  313. package/dist/src/openaiResponses-BMtGTu8R.js +317 -0
  314. package/dist/src/openaiResponses-CvcI_viE.js +318 -0
  315. package/dist/src/openaiResponses-DYPZEMX1.cjs +318 -0
  316. package/dist/src/openaiResponses-DZTg1-kb.js +319 -0
  317. package/dist/src/openclaw-BeKuig4g.js +1338 -0
  318. package/dist/src/openclaw-COkdQ83y.js +1337 -0
  319. package/dist/src/openclaw-CSoX_HQ5.cjs +1344 -0
  320. package/dist/src/openclaw-DJlhPGCb.js +1336 -0
  321. package/dist/src/opencode-sdk-BEJftEs6.cjs +1018 -0
  322. package/dist/src/opencode-sdk-DMvBB3V7.js +1013 -0
  323. package/dist/src/opencode-sdk-Df7hMjLO.js +1012 -0
  324. package/dist/src/opencode-sdk-bQp5Xf3W.js +1012 -0
  325. package/dist/src/openinterpreter-B3GgVZjK.js +431 -0
  326. package/dist/src/openinterpreter-BiGcU-HN.cjs +435 -0
  327. package/dist/src/openinterpreter-Buj2l3Eh.js +432 -0
  328. package/dist/src/openinterpreter-C3_Cg5b_.js +431 -0
  329. package/dist/src/pricing-0Pampf0q.cjs +999 -0
  330. package/dist/src/pricing-B8VdhEhY.js +976 -0
  331. package/dist/src/pricing-CtLA-rKA.js +976 -0
  332. package/dist/src/promptfoo-4OkHtH9P.cjs +341 -0
  333. package/dist/src/promptfoo-Bhpm7sH6.js +286 -0
  334. package/dist/src/promptfoo-BqV8ogVA.js +285 -0
  335. package/dist/src/promptfoo-S1Q9OHk_.js +286 -0
  336. package/dist/src/providers-B5zs1ZRv.js +24437 -0
  337. package/dist/src/providers-Cd6CJh6m.js +2 -0
  338. package/dist/src/providers-CpJlgHET.js +24039 -0
  339. package/dist/src/providers-CzvLvK6G.cjs +24180 -0
  340. package/dist/src/quiverai-1E_IvLHn.js +325 -0
  341. package/dist/src/quiverai-BXH004Vv.js +325 -0
  342. package/dist/src/quiverai-Ccya2z8Y.cjs +325 -0
  343. package/dist/src/quiverai-Cez57oe-.js +326 -0
  344. package/dist/src/registry-3zX_M9Ik.js +131 -0
  345. package/dist/src/registry-AuCrKTvS.js +132 -0
  346. package/dist/src/registry-CxXWKtQG.js +131 -0
  347. package/dist/src/registry-DG3o66JQ.cjs +131 -0
  348. package/dist/src/remoteGeneration-CAtvamG6.js +370 -0
  349. package/dist/src/remoteGeneration-CF225pDl.cjs +482 -0
  350. package/dist/src/remoteGeneration-DtnqocnL.js +370 -0
  351. package/dist/src/remoteGeneration-g3KvW-sP.js +371 -0
  352. package/dist/src/responses-BMbaUXQI.js +1098 -0
  353. package/dist/src/responses-B_TOSof-.js +1099 -0
  354. package/dist/src/responses-v-yANwTA.cjs +1109 -0
  355. package/dist/src/runtimeTransform-BBZv-oUZ.js +156 -0
  356. package/dist/src/runtimeTransform-DT2v5ovW.js +156 -0
  357. package/dist/src/runtimeTransform-GXXEIXdS.cjs +161 -0
  358. package/dist/src/runtimeTransform-JTwBQc-P.js +157 -0
  359. package/dist/src/sagemaker-B8D0L4rj.cjs +716 -0
  360. package/dist/src/sagemaker-CR2_AGdB.js +713 -0
  361. package/dist/src/sagemaker-Cd9qSQUV.js +714 -0
  362. package/dist/src/sagemaker-mKlltN4p.js +713 -0
  363. package/dist/src/scanner-PG_8lh8r.js +1971 -0
  364. package/dist/src/server/index.js +55 -55
  365. package/dist/src/server-Bmh7sd9F.js +155 -0
  366. package/dist/src/server-C7b8z6aC.js +63 -0
  367. package/dist/src/server-CAcovgtL.js +2 -0
  368. package/dist/src/server-CuuMfKlh.cjs +74 -0
  369. package/dist/src/server-DMPCj9jy.js +189 -0
  370. package/dist/src/session-BksXvRH_.cjs +69 -0
  371. package/dist/src/session-DOxUjqGQ.js +63 -0
  372. package/dist/src/session-Dujsc-b9.js +62 -0
  373. package/dist/src/session-VjtIxREd.js +62 -0
  374. package/dist/src/shared-Bkyz_7e5.cjs +2185 -0
  375. package/dist/src/shared-DDJg8ycC.js +1929 -0
  376. package/dist/src/shared-Dh3yfRBd.js +1927 -0
  377. package/dist/src/shared-tfPT8Tna.js +1928 -0
  378. package/dist/src/simulatedUser-6JdkyL3k.cjs +252 -0
  379. package/dist/src/simulatedUser-CFr2mr3M.js +248 -0
  380. package/dist/src/simulatedUser-DjwwUqx-.js +247 -0
  381. package/dist/src/slack-C_gIYiUs.js +144 -0
  382. package/dist/src/slack-DhNbz9CM.cjs +144 -0
  383. package/dist/src/slack-Dm2iI1zu.js +145 -0
  384. package/dist/src/strategies-BIY-bNul.js +2248 -0
  385. package/dist/src/strategies-C1KQQj9G.cjs +2420 -0
  386. package/dist/src/strategies-DM_3mReG.js +2385 -0
  387. package/dist/src/telemetry-BhMTibZO.js +2 -0
  388. package/dist/src/telemetry-C04d25BM.cjs +216 -0
  389. package/dist/src/telemetry-CIqy4fSC.js +201 -0
  390. package/dist/src/telemetry-CXozp_6C.js +205 -0
  391. package/dist/src/telemetry-g7PkBxmY.js +205 -0
  392. package/dist/src/togetherai-BvCim68-.js +50 -0
  393. package/dist/src/togetherai-CWyDCA9m.cjs +49 -0
  394. package/dist/src/togetherai-CeSE31vK.js +49 -0
  395. package/dist/src/togetherai-_2W0URf8.js +48 -0
  396. package/dist/src/traceContext-Brw3Oe41.js +1016 -0
  397. package/dist/src/traceContext-DpAYv27G.js +1015 -0
  398. package/dist/src/traceContext-KSqhzZI2.cjs +1032 -0
  399. package/dist/src/transcription-BySopazW.js +175 -0
  400. package/dist/src/transcription-DO4UPkRI.cjs +178 -0
  401. package/dist/src/transcription-RJGBa-pC.js +176 -0
  402. package/dist/src/transcription-fZenF3G5.js +175 -0
  403. package/dist/src/transform-BzhRc5z2.js +125 -0
  404. package/dist/src/transform-CPQu05u6.cjs +154 -0
  405. package/dist/src/transform-DAED8imp.js +126 -0
  406. package/dist/src/transform-DIOIQDmM.js +125 -0
  407. package/dist/src/typesafe-ByE0Kxfg.js +253 -0
  408. package/dist/src/typesafe-CFqGFY34.js +253 -0
  409. package/dist/src/typesafe-DCWIw-CP.cjs +253 -0
  410. package/dist/src/typesafe-DyHFV5Qk.js +254 -0
  411. package/dist/src/util-BHkj9joz.js +2049 -0
  412. package/dist/src/util-CICwIpmu.cjs +934 -0
  413. package/dist/src/util-CePiY2xZ.js +286 -0
  414. package/dist/src/util-CgT3uf4p.js +743 -0
  415. package/dist/src/util-Cj9drvOY.js +1770 -0
  416. package/dist/src/util-ClJRjlQA.cjs +357 -0
  417. package/dist/src/util-Cxf8VF2M.js +395 -0
  418. package/dist/src/util-D7RdV7rS.js +395 -0
  419. package/dist/src/util-DMNFhk47.js +351 -0
  420. package/dist/src/util-DNzh3M0z.js +396 -0
  421. package/dist/src/util-Df7rfMGb.cjs +2305 -0
  422. package/dist/src/util-Kf0KnG_6.js +2051 -0
  423. package/dist/src/util-LEbeiYw_.js +743 -0
  424. package/dist/src/util-WH8CgVs4.js +352 -0
  425. package/dist/src/util-cx6Xw8Lw.cjs +478 -0
  426. package/dist/src/util-qzBqirBH.js +2050 -0
  427. package/dist/src/vertex-CBAMfRz3.js +854 -0
  428. package/dist/src/vertex-CMP2IpN9.js +2 -0
  429. package/dist/src/vertex-CZ5YOotT.js +848 -0
  430. package/dist/src/vertex-DNsh1F1M.cjs +871 -0
  431. package/dist/src/vertexLive-BTXYj3-F.js +55 -0
  432. package/dist/src/vertexLive-Ba_LAqEF.cjs +55 -0
  433. package/dist/src/vertexLive-DM4sFaaj.js +56 -0
  434. package/dist/src/vertexLive-JqZOw7HC.js +55 -0
  435. package/dist/src/video-BY7Q2Gii.cjs +706 -0
  436. package/dist/src/video-CYElP-CK.js +703 -0
  437. package/dist/src/video-C_AdEDH0.js +702 -0
  438. package/dist/src/video-DGvjQ_4j.js +702 -0
  439. package/package.json +1 -1
  440. package/dist/src/accounts-Dpb43yde.cjs +0 -276
  441. package/dist/src/accounts-GKrO1olH.js +0 -229
  442. package/dist/src/accounts-e4FGOsji.js +0 -227
  443. package/dist/src/accounts-sUiEJfkB.js +0 -222
  444. package/dist/src/agentWorkspace-B8A_wuMR.cjs +0 -619
  445. package/dist/src/agentWorkspace-DSPIscXR.js +0 -593
  446. package/dist/src/agentWorkspace-DxUqd-XK.js +0 -592
  447. package/dist/src/agentWorkspace-n0uOJXhD.js +0 -592
  448. package/dist/src/agentic-utils-9bCj4twQ.js +0 -197
  449. package/dist/src/agentic-utils-CyCLuLoj.js +0 -197
  450. package/dist/src/agentic-utils-D23qtOlx.cjs +0 -237
  451. package/dist/src/agentic-utils-DuBMMNCw.js +0 -198
  452. package/dist/src/agents-6hDRNoYD.js +0 -777
  453. package/dist/src/agents-B8w2o7Sc.cjs +0 -777
  454. package/dist/src/agents-Ck0NXl7v.js +0 -777
  455. package/dist/src/agents-CwT3B1qB.js +0 -778
  456. package/dist/src/agents-DOLjfOEq.js +0 -266
  457. package/dist/src/agents-OcF9hq--.js +0 -267
  458. package/dist/src/agents-api-CnZZt8bn.cjs +0 -710
  459. package/dist/src/agents-api-D04u3bmL.js +0 -711
  460. package/dist/src/agents-api-DWw0_Vio.js +0 -710
  461. package/dist/src/agents-api-IWHEwp8i.js +0 -710
  462. package/dist/src/agents-mHt2Mh9O.cjs +0 -266
  463. package/dist/src/agents-sICccZCA.js +0 -266
  464. package/dist/src/ai.studio-Ci4rypDT.js +0 -2
  465. package/dist/src/ai.studio-KkQ6KaHa.js +0 -369
  466. package/dist/src/ai.studio-gSXK2cGI.js +0 -374
  467. package/dist/src/ai.studio-nQF_B4DH.cjs +0 -391
  468. package/dist/src/aimlapi-BeSk5BDV.js +0 -30
  469. package/dist/src/aimlapi-CzNUhdKu.cjs +0 -29
  470. package/dist/src/aimlapi-DCkazDPI.js +0 -29
  471. package/dist/src/aimlapi-WeH5B6K1.js +0 -28
  472. package/dist/src/anthropicMessages-AcNWTpYO.js +0 -115
  473. package/dist/src/anthropicMessages-BUtvzbpL.js +0 -114
  474. package/dist/src/anthropicMessages-DTWhZDCd.js +0 -114
  475. package/dist/src/anthropicMessages-lGVnSgyx.cjs +0 -114
  476. package/dist/src/app/assets/index-CyEI5aDN.js +0 -392
  477. package/dist/src/audio-BE_Duiu1.js +0 -104
  478. package/dist/src/audio-CiUd00k2.cjs +0 -104
  479. package/dist/src/audio-Dop6omna.js +0 -105
  480. package/dist/src/audio-EZNTInr_.js +0 -104
  481. package/dist/src/authoritativeMarkupInjection-BUqH6hNk.js +0 -78
  482. package/dist/src/authoritativeMarkupInjection-BmbJdJO0.cjs +0 -78
  483. package/dist/src/authoritativeMarkupInjection-Cpz12Y3w.js +0 -78
  484. package/dist/src/authoritativeMarkupInjection-W4XfcH91.js +0 -79
  485. package/dist/src/aws-B2Jqbnet.js +0 -2433
  486. package/dist/src/aws-DHtuUIzQ.js +0 -1149
  487. package/dist/src/aws-DLqXP6wY.js +0 -2433
  488. package/dist/src/aws-DfduhmwL.cjs +0 -2454
  489. package/dist/src/base-B9L2Xvpc.js +0 -255
  490. package/dist/src/base-BTZnIsuH.cjs +0 -305
  491. package/dist/src/base-BhaWNQPJ.js +0 -462
  492. package/dist/src/base-Br-G_Xou.js +0 -256
  493. package/dist/src/base-Bzo8hiUS.cjs +0 -467
  494. package/dist/src/base-C82fd2jq.js +0 -463
  495. package/dist/src/base-CRdQwC1W.js +0 -462
  496. package/dist/src/base-CjGwZNOQ.js +0 -255
  497. package/dist/src/bedrock-BdMru_ro.js +0 -1300
  498. package/dist/src/bedrock-CBUmfLX1.cjs +0 -2
  499. package/dist/src/bedrock-DBDxBaF9.js +0 -2
  500. package/dist/src/bedrock-DDrECM21.js +0 -1
  501. package/dist/src/bedrock-DVwkgvRS.js +0 -1
  502. package/dist/src/bestOfN-AKF5beq4.js +0 -159
  503. package/dist/src/bestOfN-C1UIVGJV.js +0 -160
  504. package/dist/src/bestOfN-DlkETbXy.cjs +0 -161
  505. package/dist/src/bestOfN-XIfEgU-g.js +0 -159
  506. package/dist/src/cache-BZaVoKaA.js +0 -2
  507. package/dist/src/cache-CEYhFUsH.js +0 -741
  508. package/dist/src/cache-Cbw1zH6q.js +0 -782
  509. package/dist/src/cache-CdaZNb75.js +0 -754
  510. package/dist/src/cache-DpuIzPxh.cjs +0 -856
  511. package/dist/src/cerebras-Bpn6FPkJ.js +0 -97
  512. package/dist/src/cerebras-CqJ0BRCJ.cjs +0 -97
  513. package/dist/src/cerebras-D4ILa_TY.js +0 -97
  514. package/dist/src/cerebras-DR8uc7ee.js +0 -98
  515. package/dist/src/chat-B7PZfaYp.cjs +0 -987
  516. package/dist/src/chat-BVuSjdEb.js +0 -227
  517. package/dist/src/chat-BsaZRjXN.js +0 -76
  518. package/dist/src/chat-C5liqe3Y.js +0 -226
  519. package/dist/src/chat-C9hyHf5B.js +0 -124
  520. package/dist/src/chat-CFLalAck.js +0 -226
  521. package/dist/src/chat-CN8JGrHu.js +0 -76
  522. package/dist/src/chat-CaHBBpCb.js +0 -123
  523. package/dist/src/chat-CcbLSghx.js +0 -123
  524. package/dist/src/chat-CoSN6sr2.js +0 -934
  525. package/dist/src/chat-CsJRFX8a.cjs +0 -226
  526. package/dist/src/chat-DFoZLvO_.js +0 -934
  527. package/dist/src/chat-DiLQvL7r.js +0 -77
  528. package/dist/src/chat-F6qVSDk3.cjs +0 -123
  529. package/dist/src/chat-Oq4FaJgI.cjs +0 -76
  530. package/dist/src/chat-knMfQUKz.js +0 -935
  531. package/dist/src/claude-agent-sdk-CJkOLpnI.js +0 -999
  532. package/dist/src/claude-agent-sdk-Ckn76PRD.js +0 -999
  533. package/dist/src/claude-agent-sdk-DX0gTr11.cjs +0 -1005
  534. package/dist/src/claude-agent-sdk-LMeikxoR.js +0 -1000
  535. package/dist/src/client-BFf1r6Z8.js +0 -352
  536. package/dist/src/client-CdXyDdDi.js +0 -351
  537. package/dist/src/client-DV8XMu7i.js +0 -351
  538. package/dist/src/client-iEXtOBKW.cjs +0 -357
  539. package/dist/src/cloud-B02qcpjf.js +0 -2
  540. package/dist/src/cloud-BlHP-g1v.cjs +0 -666
  541. package/dist/src/cloud-C9BI4isF.js +0 -287
  542. package/dist/src/cloud-CTTLNdvj.js +0 -657
  543. package/dist/src/cloud-D5X5yQ_d.js +0 -599
  544. package/dist/src/cloud-QxPkpsHA.js +0 -599
  545. package/dist/src/cloudflare-ai-DRTRT1fc.js +0 -132
  546. package/dist/src/cloudflare-ai-DgaXapAV.cjs +0 -133
  547. package/dist/src/cloudflare-ai-DkuJXijS.js +0 -134
  548. package/dist/src/cloudflare-ai-wy9QCHku.js +0 -133
  549. package/dist/src/cloudflare-gateway-9cAN8g29.cjs +0 -276
  550. package/dist/src/cloudflare-gateway-BVFMD292.js +0 -277
  551. package/dist/src/cloudflare-gateway-BuUI4p6I.js +0 -276
  552. package/dist/src/cloudflare-gateway-TlYHizbW.js +0 -276
  553. package/dist/src/codex-app-server-BPz_feug.cjs +0 -2162
  554. package/dist/src/codex-app-server-C9noXM9C.js +0 -2155
  555. package/dist/src/codex-app-server-CEmD-Y5U.js +0 -2
  556. package/dist/src/codex-app-server-DZolc18r.js +0 -2156
  557. package/dist/src/codex-app-server-Dd0A37nO.js +0 -2155
  558. package/dist/src/codex-sdk-BbxjBvBk.cjs +0 -1588
  559. package/dist/src/codex-sdk-BpXeIs-_.js +0 -1557
  560. package/dist/src/codex-sdk-BtQp5X0f.js +0 -1552
  561. package/dist/src/codex-sdk-CH0v9Bk1.js +0 -2
  562. package/dist/src/codex-sdk-CgrN7JB8.js +0 -1557
  563. package/dist/src/codex-security-B5fENNUr.js +0 -406
  564. package/dist/src/codex-security-C6uuJx-y.cjs +0 -411
  565. package/dist/src/codex-security-CifWtZR_.js +0 -407
  566. package/dist/src/codex-security-Kg2bOEKy.js +0 -406
  567. package/dist/src/cometapi-BFpIDLIx.js +0 -55
  568. package/dist/src/cometapi-C6O2PIrN.js +0 -56
  569. package/dist/src/cometapi-D5Yupc6F.js +0 -53
  570. package/dist/src/cometapi-DzgIwJzJ.cjs +0 -55
  571. package/dist/src/compatible-0jhmVfOp.js +0 -25
  572. package/dist/src/compatible-DdtwWdJi.cjs +0 -24
  573. package/dist/src/compatible-Di4nR3sU.js +0 -24
  574. package/dist/src/compatible-iJKLWdnf.js +0 -24
  575. package/dist/src/completion-B0_hVUDG.js +0 -119
  576. package/dist/src/completion-BdI6v0-Q.cjs +0 -123
  577. package/dist/src/completion-CWcJscwv.js +0 -118
  578. package/dist/src/conversationScoring-99EOPJRa.js +0 -373
  579. package/dist/src/conversationScoring-BIq4J0Cq.js +0 -374
  580. package/dist/src/conversationScoring-DARyeATr.cjs +0 -398
  581. package/dist/src/conversationScoring-DS48t4Hb.js +0 -373
  582. package/dist/src/crescendo-CebvXIu4.js +0 -730
  583. package/dist/src/crescendo-CxrLS0oo.js +0 -732
  584. package/dist/src/crescendo-DZQXBSkj.js +0 -733
  585. package/dist/src/crescendo-wjEx68uD.cjs +0 -734
  586. package/dist/src/custom-BiQ-aUNw.cjs +0 -620
  587. package/dist/src/custom-ByyB5Z93.js +0 -619
  588. package/dist/src/custom-C5jOevNb.js +0 -617
  589. package/dist/src/custom-CCrsCz8o.js +0 -618
  590. package/dist/src/dataUrl-C9J7wz9H.js +0 -3133
  591. package/dist/src/dataUrl-CGsBT7UZ.cjs +0 -3187
  592. package/dist/src/dataUrl-CzKvvWNO.js +0 -2868
  593. package/dist/src/decisions-BTusXCUx.cjs +0 -514
  594. package/dist/src/decisions-BYtL9edD.js +0 -515
  595. package/dist/src/decisions-jYix_gCF.js +0 -515
  596. package/dist/src/decisions-nxxfHRAN.js +0 -516
  597. package/dist/src/docker-DDIv4zkg.js +0 -93
  598. package/dist/src/docker-DVLp_5OG.js +0 -94
  599. package/dist/src/docker-INm9w0SY.cjs +0 -94
  600. package/dist/src/docker-sGuoCul_.js +0 -95
  601. package/dist/src/embedding-CAhqLLrR.js +0 -82
  602. package/dist/src/embedding-D94GAsti.cjs +0 -86
  603. package/dist/src/embedding-zb4MAzQy.js +0 -81
  604. package/dist/src/envoy-BMPszwEa.cjs +0 -60
  605. package/dist/src/envoy-Bp-s39_8.js +0 -60
  606. package/dist/src/envoy-BswDt-Ou.js +0 -61
  607. package/dist/src/envoy-rVbYcV80.js +0 -60
  608. package/dist/src/eval-B1-XfrC7.js +0 -2
  609. package/dist/src/eval-pC4qCvLw.js +0 -1920
  610. package/dist/src/evalResult-CzjCb5bd.js +0 -1300
  611. package/dist/src/evaluator-CNq2K7J_.js +0 -10578
  612. package/dist/src/evaluator-LtfxdxEu.js +0 -2
  613. package/dist/src/evaluatorHelpers-C5J0NYpQ.js +0 -601
  614. package/dist/src/evaluatorHelpers-DcdCglCs.cjs +0 -622
  615. package/dist/src/evaluatorHelpers-Rvb88W6B.js +0 -600
  616. package/dist/src/fetch-5HtnNhHg.js +0 -1556
  617. package/dist/src/fetch-BCwjoIFd.js +0 -1559
  618. package/dist/src/fetch-BhfUnKen.js +0 -1280
  619. package/dist/src/fetch-C08w4vVl.js +0 -9
  620. package/dist/src/fetch-DBxy8Tlb.cjs +0 -14
  621. package/dist/src/fetch-DYte6oQX.cjs +0 -1853
  622. package/dist/src/fetch-ElpfcAVG.js +0 -10
  623. package/dist/src/fetch-lM1OIaSt.js +0 -2
  624. package/dist/src/functionCallbackUtils-BCAdWfHO.js +0 -246
  625. package/dist/src/functionCallbackUtils-BYq9qOhG.js +0 -245
  626. package/dist/src/functionCallbackUtils-ByWkmVud.cjs +0 -262
  627. package/dist/src/functionCallbackUtils-D_C_JaFd.js +0 -245
  628. package/dist/src/gemini-image-CAlwaJhZ.js +0 -471
  629. package/dist/src/gemini-image-DJoVoOnZ.cjs +0 -471
  630. package/dist/src/gemini-image-Waio-9Xx.js +0 -472
  631. package/dist/src/gemini-image-vbY6Ftbf.js +0 -471
  632. package/dist/src/goat-BWbtyY9c.js +0 -512
  633. package/dist/src/goat-CXzzeCOQ.cjs +0 -515
  634. package/dist/src/goat-CfgvzSgZ.js +0 -514
  635. package/dist/src/goat-DLeoIHBp.js +0 -515
  636. package/dist/src/goblin-CmfCfwqk.cjs +0 -22
  637. package/dist/src/goblin-CtcaORRH.js +0 -22
  638. package/dist/src/goblin-DF6DDhM-.js +0 -22
  639. package/dist/src/goblin-Nai0xxBV.js +0 -23
  640. package/dist/src/google-ClpkLtKL.cjs +0 -142
  641. package/dist/src/google-CrFgKu9k.js +0 -143
  642. package/dist/src/google-Dj_EIBqS.js +0 -142
  643. package/dist/src/google-e4-vARv6.js +0 -142
  644. package/dist/src/graders-BN1IIa71.js +0 -15470
  645. package/dist/src/graders-C5sCfSP5.js +0 -2
  646. package/dist/src/hydra-B7RfXVBK.js +0 -2
  647. package/dist/src/hydra-C1cFN-Jg.js +0 -613
  648. package/dist/src/hydra-CK6Uc1ia.js +0 -612
  649. package/dist/src/hydra-Dg65rAP_.js +0 -610
  650. package/dist/src/hydra-Fqx8l_Xu.cjs +0 -612
  651. package/dist/src/image-BdlUDAtp.js +0 -163
  652. package/dist/src/image-C-KwEhwt.cjs +0 -163
  653. package/dist/src/image-C76fp6NK.cjs +0 -209
  654. package/dist/src/image-D75ehv3D.js +0 -482
  655. package/dist/src/image-DKtc5v5W.js +0 -209
  656. package/dist/src/image-DT_xOkJY.js +0 -163
  657. package/dist/src/image-DVpdllEE.js +0 -209
  658. package/dist/src/image-DXZ8AzMf.js +0 -481
  659. package/dist/src/image-DZl_1mvy.js +0 -164
  660. package/dist/src/image-DcTD7Ak0.cjs +0 -504
  661. package/dist/src/image-ndxEvBKB.js +0 -210
  662. package/dist/src/indirectWebPwn-70WA5x_q.js +0 -435
  663. package/dist/src/indirectWebPwn-BRVyd3qV.cjs +0 -463
  664. package/dist/src/indirectWebPwn-BsJVsu0q.js +0 -285
  665. package/dist/src/indirectWebPwn-Cw6yJu0i.js +0 -285
  666. package/dist/src/indirectWebPwn-D-PhJzo4.js +0 -286
  667. package/dist/src/indirectWebPwn-DRPHt2I8.js +0 -434
  668. package/dist/src/indirectWebPwn-DXtfFhd9.cjs +0 -285
  669. package/dist/src/indirectWebPwn-DvpNouzc.js +0 -434
  670. package/dist/src/interactions-5ixfW7Cl.js +0 -850
  671. package/dist/src/interactions-BOUzfmg1.cjs +0 -850
  672. package/dist/src/interactions-CSSXcGNc.js +0 -851
  673. package/dist/src/interactions-WB_sgkN0.js +0 -850
  674. package/dist/src/iterative-BShRNqjC.cjs +0 -549
  675. package/dist/src/iterative-BcW_ELtB.js +0 -548
  676. package/dist/src/iterative-BpHbHz8B.js +0 -547
  677. package/dist/src/iterative-YcchP12d.js +0 -545
  678. package/dist/src/iterativeImage-BMFE5Hl7.cjs +0 -419
  679. package/dist/src/iterativeImage-CkSaYLMY.js +0 -417
  680. package/dist/src/iterativeImage-DAEUlQX_.js +0 -418
  681. package/dist/src/iterativeImage-DeUSkEnj.js +0 -417
  682. package/dist/src/iterativeMeta-DbdaKdEO.cjs +0 -439
  683. package/dist/src/iterativeMeta-DcF9JWEK.js +0 -437
  684. package/dist/src/iterativeMeta-DkfPqWIC.js +0 -439
  685. package/dist/src/iterativeMeta-DkrpnVSs.js +0 -440
  686. package/dist/src/iterativeTree-CEMY1FhE.cjs +0 -879
  687. package/dist/src/iterativeTree-Cv5W4tX9.js +0 -877
  688. package/dist/src/iterativeTree-DGvomd3M.js +0 -876
  689. package/dist/src/iterativeTree-KbtC2Mkz.js +0 -878
  690. package/dist/src/knowledgeBase-AYRXn4wO.js +0 -163
  691. package/dist/src/knowledgeBase-BNqQfx01.js +0 -163
  692. package/dist/src/knowledgeBase-C0IaCCVs.js +0 -164
  693. package/dist/src/knowledgeBase-C2uj6wK4.cjs +0 -163
  694. package/dist/src/litellm-CN1ScAwZ.js +0 -147
  695. package/dist/src/litellm-CTjwiKSa.js +0 -146
  696. package/dist/src/litellm-Cd4Nj5ue.js +0 -145
  697. package/dist/src/litellm-DMqLpEBg.cjs +0 -146
  698. package/dist/src/live-Bt50-InO.cjs +0 -891
  699. package/dist/src/live-Bu2ujadG.js +0 -2
  700. package/dist/src/live-C3M52i3p.js +0 -891
  701. package/dist/src/live-CRfHMO3B.js +0 -892
  702. package/dist/src/live-iCIpO14m.js +0 -891
  703. package/dist/src/luma-ray-B8eHC4c8.cjs +0 -309
  704. package/dist/src/luma-ray-BIvkPw0s.js +0 -309
  705. package/dist/src/luma-ray-ChsiBxMA.js +0 -309
  706. package/dist/src/luma-ray-DAvKrInz.js +0 -310
  707. package/dist/src/mantleChat-5YeEXAZI.js +0 -154
  708. package/dist/src/mantleChat-D--mW3hl.js +0 -154
  709. package/dist/src/mantleChat-DHP3siNg.cjs +0 -154
  710. package/dist/src/mantleChat-wBfAX46o.js +0 -155
  711. package/dist/src/mcp-49jlEcTQ.js +0 -85
  712. package/dist/src/mcp-__PIz81I.js +0 -84
  713. package/dist/src/memoryPoisoning-Chxge74M.js +0 -111
  714. package/dist/src/memoryPoisoning-QH6NCUVE.js +0 -112
  715. package/dist/src/memoryPoisoning-tCxZt8Nz.js +0 -111
  716. package/dist/src/memoryPoisoning-ymrRItRR.cjs +0 -111
  717. package/dist/src/messages-BE_eZ7NA.js +0 -1127
  718. package/dist/src/messages-Bo638ShI.js +0 -1127
  719. package/dist/src/messages-BzR0-NQ1.js +0 -1128
  720. package/dist/src/messages-Cbg5Pfd0.cjs +0 -1161
  721. package/dist/src/mischievousUser-BtED2Z5Z.cjs +0 -51
  722. package/dist/src/mischievousUser-KqSOjrDJ.js +0 -51
  723. package/dist/src/mischievousUser-YMD41YNZ.js +0 -51
  724. package/dist/src/mischievousUser-zBxlNdCu.js +0 -52
  725. package/dist/src/modelslab-B8gZxtfE.js +0 -171
  726. package/dist/src/modelslab-C7bmVpTB.js +0 -170
  727. package/dist/src/modelslab-CCeQCTZg.js +0 -170
  728. package/dist/src/modelslab-CvBJGv7y.cjs +0 -170
  729. package/dist/src/nova-reel-BOEWsEKA.cjs +0 -272
  730. package/dist/src/nova-reel-BtyBXq5M.js +0 -273
  731. package/dist/src/nova-reel-C1eF3-EE.js +0 -272
  732. package/dist/src/nova-reel-YhgrxEKT.js +0 -272
  733. package/dist/src/nova-sonic-BaERP20w.js +0 -374
  734. package/dist/src/nova-sonic-CxgM3O-P.cjs +0 -374
  735. package/dist/src/nova-sonic-DJS22fC3.js +0 -375
  736. package/dist/src/nova-sonic-DwvwHyRX.js +0 -374
  737. package/dist/src/novita-D1l2tG0O.js +0 -116
  738. package/dist/src/novita-D84VM3v0.cjs +0 -115
  739. package/dist/src/novita-DGInvwfR.js +0 -115
  740. package/dist/src/novita-vXHkXhTg.js +0 -114
  741. package/dist/src/nscale-CU0Ldr00.js +0 -209
  742. package/dist/src/nscale-ClfKlQeM.cjs +0 -209
  743. package/dist/src/nscale-DxaVnF0x.js +0 -210
  744. package/dist/src/nscale-_poVxIrO.js +0 -207
  745. package/dist/src/openaiResponses-CJGsneNj.js +0 -317
  746. package/dist/src/openaiResponses-CKSl5Sdg.js +0 -319
  747. package/dist/src/openaiResponses-DC8rzFUc.js +0 -318
  748. package/dist/src/openaiResponses-rMHIA3dV.cjs +0 -318
  749. package/dist/src/openclaw-CCbvsNFW.cjs +0 -1344
  750. package/dist/src/openclaw-CZw1lCDZ.js +0 -1336
  751. package/dist/src/openclaw-ChFLgC-a.js +0 -1338
  752. package/dist/src/openclaw-DrPMoRrH.js +0 -1337
  753. package/dist/src/opencode-sdk-2EfIDhFp.cjs +0 -1018
  754. package/dist/src/opencode-sdk-CHw3F845.js +0 -1013
  755. package/dist/src/opencode-sdk-D0EGGxvy.js +0 -1012
  756. package/dist/src/opencode-sdk-jSS7NI2Q.js +0 -1012
  757. package/dist/src/openinterpreter-CY622xHC.js +0 -431
  758. package/dist/src/openinterpreter-DATyhuhP.js +0 -432
  759. package/dist/src/openinterpreter-DDUMyIf1.js +0 -431
  760. package/dist/src/openinterpreter-s5Tz6Lid.cjs +0 -435
  761. package/dist/src/pricing-C498twd2.js +0 -976
  762. package/dist/src/pricing-DBd_bMIh.cjs +0 -999
  763. package/dist/src/pricing-ISrMCskv.js +0 -976
  764. package/dist/src/promptfoo-6p0WG2ih.js +0 -286
  765. package/dist/src/promptfoo-BQRfgNs_.js +0 -285
  766. package/dist/src/promptfoo-Bqo88z20.cjs +0 -341
  767. package/dist/src/promptfoo-Cq5AVI3I.js +0 -286
  768. package/dist/src/providers-ATbeMX5E.cjs +0 -24180
  769. package/dist/src/providers-B7F1FiNI.js +0 -2
  770. package/dist/src/providers-DazIw8mI.js +0 -24039
  771. package/dist/src/providers-QvGlNAD0.js +0 -24437
  772. package/dist/src/quiverai-BPlNcLkV.cjs +0 -325
  773. package/dist/src/quiverai-By99-YmJ.js +0 -325
  774. package/dist/src/quiverai-CmmByDqo.js +0 -325
  775. package/dist/src/quiverai-HZkoJJqw.js +0 -326
  776. package/dist/src/registry-BLTnTfjT.cjs +0 -131
  777. package/dist/src/registry-BMC-COHT.js +0 -132
  778. package/dist/src/registry-C8UZtmBp.js +0 -131
  779. package/dist/src/registry-CfwEUYXG.js +0 -131
  780. package/dist/src/remoteGeneration-Bgg6kC5V.js +0 -370
  781. package/dist/src/remoteGeneration-CKJFE960.cjs +0 -482
  782. package/dist/src/remoteGeneration-DaxwJDKv.js +0 -370
  783. package/dist/src/remoteGeneration-vHMGVKr1.js +0 -371
  784. package/dist/src/responses-BvnyIHrq.js +0 -1099
  785. package/dist/src/responses-CERAgvf-.js +0 -1098
  786. package/dist/src/responses-CwgjeuOg.cjs +0 -1109
  787. package/dist/src/runtimeTransform-3RF9Avyg.cjs +0 -161
  788. package/dist/src/runtimeTransform-C51Z5j4H.js +0 -156
  789. package/dist/src/runtimeTransform-CKE_Iyv8.js +0 -157
  790. package/dist/src/runtimeTransform-Cs11xJpj.js +0 -156
  791. package/dist/src/sagemaker-BJ4dOCxE.js +0 -713
  792. package/dist/src/sagemaker-Bt3JUAWq.js +0 -714
  793. package/dist/src/sagemaker-QVKyLgLF.cjs +0 -716
  794. package/dist/src/sagemaker-l3IB8iTs.js +0 -713
  795. package/dist/src/scanner-DGjIiTZ1.js +0 -1971
  796. package/dist/src/server-BNaLZH6u.js +0 -63
  797. package/dist/src/server-CBMuQul3.js +0 -189
  798. package/dist/src/server-CMKKIzKv.cjs +0 -74
  799. package/dist/src/server-CN2IS9Cs.js +0 -155
  800. package/dist/src/server-ua4cqbjC.js +0 -2
  801. package/dist/src/session-CQIjq_HZ.cjs +0 -69
  802. package/dist/src/session-FTlg8sEu.js +0 -62
  803. package/dist/src/session-GBQXtPWp.js +0 -63
  804. package/dist/src/session-_0-rTdwY.js +0 -62
  805. package/dist/src/shared-BtuO-OAM.js +0 -1927
  806. package/dist/src/shared-Ci78wTZX.js +0 -1928
  807. package/dist/src/shared-Dd3rimdM.js +0 -1929
  808. package/dist/src/shared-KAjFxRre.cjs +0 -2185
  809. package/dist/src/simulatedUser--OjW6xCx.js +0 -247
  810. package/dist/src/simulatedUser-D0-slRye.cjs +0 -252
  811. package/dist/src/simulatedUser-D1Kh_cwA.js +0 -248
  812. package/dist/src/slack-BX0FUevO.js +0 -144
  813. package/dist/src/slack-CcwXFiJE.cjs +0 -144
  814. package/dist/src/slack-CnfqKfXp.js +0 -145
  815. package/dist/src/strategies-2ntcK4tN.js +0 -2248
  816. package/dist/src/strategies-DZIW7Zcs.js +0 -2385
  817. package/dist/src/strategies-YRDF2j-N.cjs +0 -2420
  818. package/dist/src/telemetry-CL8CVA4p.js +0 -205
  819. package/dist/src/telemetry-Cix90qqz.js +0 -201
  820. package/dist/src/telemetry-CkmlqTjV.js +0 -205
  821. package/dist/src/telemetry-DQH7l5bb.js +0 -2
  822. package/dist/src/telemetry-DUCXc1-r.cjs +0 -216
  823. package/dist/src/togetherai-3yUt5Ck7.js +0 -49
  824. package/dist/src/togetherai-BJUByLwt.cjs +0 -49
  825. package/dist/src/togetherai-Bh6KZkmd.js +0 -50
  826. package/dist/src/togetherai-DDl9yk3b.js +0 -48
  827. package/dist/src/traceContext-BiJVppjT.cjs +0 -1032
  828. package/dist/src/traceContext-CKKluULP.js +0 -1016
  829. package/dist/src/traceContext-D3Sk8fO-.js +0 -1015
  830. package/dist/src/transcription-BoVQKIVz.js +0 -175
  831. package/dist/src/transcription-Bs5u8780.js +0 -175
  832. package/dist/src/transcription-Dl654d1p.cjs +0 -178
  833. package/dist/src/transcription-VEvhM1Fu.js +0 -176
  834. package/dist/src/transform-BAbkGpvl.js +0 -125
  835. package/dist/src/transform-C_j4hUH8.js +0 -126
  836. package/dist/src/transform-Da86hs4M.cjs +0 -154
  837. package/dist/src/transform-_i1raQNo.js +0 -125
  838. package/dist/src/typesafe-CKXBeh82.cjs +0 -253
  839. package/dist/src/typesafe-D3VaGeNm.js +0 -253
  840. package/dist/src/typesafe-DYM-SFNH.js +0 -253
  841. package/dist/src/typesafe-LXmSbw8F.js +0 -254
  842. package/dist/src/util-41rb0XHX.js +0 -743
  843. package/dist/src/util-B0WlHYFM.js +0 -2049
  844. package/dist/src/util-BD1R_PsR.js +0 -1770
  845. package/dist/src/util-BLbM_ItC.js +0 -395
  846. package/dist/src/util-C72P0iIa.js +0 -352
  847. package/dist/src/util-C7MpGlJ6.cjs +0 -2305
  848. package/dist/src/util-CCtqagKc.js +0 -286
  849. package/dist/src/util-CM2Ec_uY.js +0 -2051
  850. package/dist/src/util-CSSAWO8v.js +0 -351
  851. package/dist/src/util-CkQc-fx3.cjs +0 -934
  852. package/dist/src/util-DcOlFTFa.cjs +0 -478
  853. package/dist/src/util-DluGTGVB.js +0 -395
  854. package/dist/src/util-PfQ60chz.js +0 -743
  855. package/dist/src/util-f14-CPij.js +0 -396
  856. package/dist/src/util-l9pXX3Eu.cjs +0 -357
  857. package/dist/src/util-o_BnlYqS.js +0 -2050
  858. package/dist/src/vertex-B_-gQgzc.js +0 -2
  859. package/dist/src/vertex-CU4gqoYa.js +0 -854
  860. package/dist/src/vertex-DZ42UHb3.js +0 -848
  861. package/dist/src/vertex-DsYQJA0T.cjs +0 -871
  862. package/dist/src/vertexLive-BvIaHKGB.js +0 -55
  863. package/dist/src/vertexLive-CTULqNx7.js +0 -56
  864. package/dist/src/vertexLive-DjJ_YQBe.cjs +0 -55
  865. package/dist/src/vertexLive-STUGcteB.js +0 -55
  866. package/dist/src/video-CAQGmtEV.js +0 -703
  867. package/dist/src/video-_FSTWlwX.js +0 -702
  868. package/dist/src/video-aBPJPWdt.js +0 -702
  869. package/dist/src/video-gDjkWv5m.cjs +0 -706
@@ -0,0 +1,1300 @@
1
+ #!/usr/bin/env node
2
+ import { A as stripTestProviderPromptSelectors, C as sanitizeObject, F as isApiProvider, H as safeJsonStringify, I as isProviderOptions, J as getEnvBool, N as isProviderTypeMap, _ as mapTestProviderRefs, c as logger, d as REDACTED, h as isSecretField, j as GRADING_PROVIDER_TYPE_KEYS, k as stripProviderPromptSelectors, ot as parseEnvBool } from "./logger-pCNnmVuz.js";
3
+ import "./fetch-RXHsZF-J.js";
4
+ import { t as getCurrentTimestamp } from "./time-Ct6CnABs.js";
5
+ import { O as ResultFailureReason, _ as getDbSignalPath, a as evalResultsTable, g as getDb, k as isResultFailureReason } from "./tables-BONxKPrt.js";
6
+ import { n as PromptfooAttributes } from "./genaiTracer-j8OXa5Va.js";
7
+ import { n as sha256 } from "./createHash-DqA6GWxE.js";
8
+ import { n as isBlobStorageEnabled, s as extractBlobHashesFromValue, t as extractAndStoreBinaryData } from "./extractor-CW3spiLZ.js";
9
+ import { d as createEmptyTokenUsage, o as accumulateGradingTokenUsage, s as accumulateResponseTokenUsage } from "./tokenUsageUtils-CHs91tUW.js";
10
+ import fs from "fs";
11
+ import { isDeepStrictEqual } from "node:util";
12
+ import { and, eq, gte, inArray, lt, ne, sql } from "drizzle-orm";
13
+ import { LRUCache } from "lru-cache";
14
+ //#region src/providers/constants.ts
15
+ const FILE_METADATA_KEY = "_promptfooFileMetadata";
16
+ /**
17
+ * Identifier for manual user ratings in componentResults.
18
+ * Used to distinguish human ratings from automated assertions.
19
+ */
20
+ const HUMAN_ASSERTION_TYPE = "human";
21
+ //#endregion
22
+ //#region src/models/prompt.ts
23
+ /**
24
+ * Generates a unique identifier for a prompt based on its properties.
25
+ *
26
+ * Priority order:
27
+ * 1. If label is truthy, hash the label
28
+ * 2. If id is truthy, hash the id
29
+ * 3. Otherwise, hash the raw content (stringified if object)
30
+ *
31
+ * @param prompt - The prompt object to generate an ID for
32
+ * @returns A SHA-256 hash string
33
+ */
34
+ function generateIdFromPrompt(prompt) {
35
+ if (prompt.label) return sha256(prompt.label);
36
+ if (prompt.id) return sha256(prompt.id);
37
+ return sha256(typeof prompt.raw === "object" ? JSON.stringify(prompt.raw) : prompt.raw);
38
+ }
39
+ //#endregion
40
+ //#region src/prompts/constants.ts
41
+ const VALID_FILE_EXTENSIONS = [
42
+ ".cjs",
43
+ ".cts",
44
+ ".j2",
45
+ ".js",
46
+ ".json",
47
+ ".jsonl",
48
+ ".md",
49
+ ".mjs",
50
+ ".mts",
51
+ ".py",
52
+ ".ts",
53
+ ".txt",
54
+ ".yml",
55
+ ".yaml"
56
+ ];
57
+ //#endregion
58
+ //#region src/prompts/utils.ts
59
+ /**
60
+ * Determines if a string is a valid file path.
61
+ * @param str - The string to check.
62
+ * @returns True if the string is a valid file path, false otherwise.
63
+ */
64
+ function maybeFilePath(str) {
65
+ if (typeof str !== "string") throw new Error(`Invalid input: ${JSON.stringify(str)}`);
66
+ if ([
67
+ "\n",
68
+ "portkey://",
69
+ "langfuse://",
70
+ "helicone://"
71
+ ].some((substring) => str.includes(substring))) return false;
72
+ return str.startsWith("file://") || VALID_FILE_EXTENSIONS.some((ext) => {
73
+ const tokens = str.split(":");
74
+ const pathOrFunctionToken = tokens[tokens.length - 1];
75
+ const pathToken = tokens[tokens.length - 2];
76
+ return pathOrFunctionToken?.endsWith(ext) || pathToken?.endsWith(ext);
77
+ }) || str.charAt(str.length - 3) === "." || str.charAt(str.length - 4) === "." || str.includes("*") || str.includes("/") || str.includes("\\");
78
+ }
79
+ /**
80
+ * Normalizes the input prompt to an array of prompts, rejecting invalid and empty inputs.
81
+ * @param promptPathOrGlobs - The input prompt.
82
+ * @returns The normalized prompts.
83
+ * @throws If the input is invalid or empty.
84
+ */
85
+ function normalizeInput(promptPathOrGlobs) {
86
+ if (!promptPathOrGlobs || (typeof promptPathOrGlobs === "string" || Array.isArray(promptPathOrGlobs)) && promptPathOrGlobs.length === 0) throw new Error(`Invalid input prompt: ${JSON.stringify(promptPathOrGlobs)}`);
87
+ if (typeof promptPathOrGlobs === "string") return [{ raw: promptPathOrGlobs }];
88
+ if (Array.isArray(promptPathOrGlobs)) return promptPathOrGlobs.map((promptPathOrGlob, _index) => {
89
+ if (typeof promptPathOrGlob === "string") return { raw: promptPathOrGlob };
90
+ return {
91
+ raw: promptPathOrGlob.raw || promptPathOrGlob.id,
92
+ ...promptPathOrGlob
93
+ };
94
+ });
95
+ if (typeof promptPathOrGlobs === "object" && Object.keys(promptPathOrGlobs).length) return Object.entries(promptPathOrGlobs).map(([raw, key]) => ({
96
+ label: key,
97
+ raw
98
+ }));
99
+ throw new Error(`Invalid input prompt: ${JSON.stringify(promptPathOrGlobs)}`);
100
+ }
101
+ /**
102
+ * Generates a hash identifier for a prompt.
103
+ * This is an alias for generateIdFromPrompt for backward compatibility.
104
+ *
105
+ * @param prompt - The prompt to hash
106
+ * @returns A SHA-256 hash string
107
+ */
108
+ function hashPrompt(prompt) {
109
+ return generateIdFromPrompt(prompt);
110
+ }
111
+ //#endregion
112
+ //#region src/util/debounce.ts
113
+ /** Coalesce calls at the trailing edge and allow pending work to be cancelled on cleanup. */
114
+ function debounce(callback, wait) {
115
+ let timeout;
116
+ function debounced(...args) {
117
+ clearTimeout(timeout);
118
+ timeout = setTimeout(() => {
119
+ timeout = void 0;
120
+ callback.apply(this, args);
121
+ }, wait);
122
+ }
123
+ debounced.clear = () => {
124
+ clearTimeout(timeout);
125
+ timeout = void 0;
126
+ };
127
+ return debounced;
128
+ }
129
+ //#endregion
130
+ //#region src/database/signal.ts
131
+ const SIGNAL_WATCHER_DEBOUNCE_MS = 250;
132
+ /**
133
+ * The legacy `evalId:timestamp` text format can't be told apart from a stray short token, so
134
+ * {@link readLegacySignalEvalId} only recovers eval ids at least this long. Generated ids
135
+ * (`eval-<rand>-<iso>`) always clear it; a short caller-provided id (e.g. an imported `demo`) is
136
+ * written as JSON instead, which stores the id explicitly and survives the round trip.
137
+ */
138
+ const MIN_LEGACY_EVAL_ID_LENGTH = 9;
139
+ /** Whether {@link readLegacySignalEvalId} can recover this id from the legacy text format. */
140
+ function isLegacyRecoverableEvalId(evalId) {
141
+ return evalId.length >= MIN_LEGACY_EVAL_ID_LENGTH;
142
+ }
143
+ /** Returns the string entries of an unknown value, or undefined if it is not an array. */
144
+ function toStringEvalIds(value) {
145
+ return Array.isArray(value) ? value.filter((evalId) => typeof evalId === "string") : void 0;
146
+ }
147
+ function writeSignalFile(content) {
148
+ const filePath = getDbSignalPath();
149
+ try {
150
+ fs.writeFileSync(filePath, content);
151
+ } catch (err) {
152
+ logger.warn(`Failed to write database signal file: ${err}`);
153
+ }
154
+ }
155
+ /**
156
+ * Updates the signal file with the current timestamp and optional eval ID.
157
+ * This is used to notify clients that there are new data available.
158
+ *
159
+ * If another signal is still pending in the watcher's debounce window, this folds it into a
160
+ * combined JSON payload so no refresh is lost — scoped updates, a pending unscoped "refresh
161
+ * latest", and pending deletes all survive coalescing. When nothing is pending it keeps the
162
+ * compact legacy `evalId:timestamp` text.
163
+ * This read-modify-write is best-effort within a single process; concurrent writes from separate
164
+ * processes can still race the unlocked file, in which case a dropped signal self-heals on the
165
+ * next one.
166
+ * @param evalId - Optional eval ID that triggered the update
167
+ */
168
+ function updateSignalFile(evalId) {
169
+ const now = Date.now();
170
+ const nowIso = new Date(now).toISOString();
171
+ const pending = readPendingSignal(now);
172
+ const pendingUpdateIds = pending ? updateEvalIds(pending) : [];
173
+ const pendingHasDelete = pending ? hasDeleteComponent(pending) : false;
174
+ const pendingHasUnscopedUpdate = pending ? hasUnscopedUpdate(pending) : false;
175
+ const updatedEvalIds = [.../* @__PURE__ */ new Set([...pendingUpdateIds, ...evalId ? [evalId] : []])];
176
+ const refreshLatest = evalId === void 0 || pendingHasUnscopedUpdate;
177
+ const needsCoalesce = pendingHasDelete || pendingUpdateIds.some((id) => id !== evalId) || refreshLatest && updatedEvalIds.length > 0;
178
+ const evalIdNeedsJson = evalId !== void 0 && !isLegacyRecoverableEvalId(evalId);
179
+ if (needsCoalesce || evalIdNeedsJson) {
180
+ writeSignalFile(JSON.stringify({
181
+ type: "update",
182
+ evalId,
183
+ updatedEvalIds: updatedEvalIds.length > 0 ? updatedEvalIds : void 0,
184
+ deletedEvalIds: pendingHasDelete ? pending?.deletedEvalIds ?? [] : void 0,
185
+ refreshLatest: refreshLatest ? true : void 0,
186
+ timestamp: nowIso
187
+ }));
188
+ return;
189
+ }
190
+ writeSignalFile(evalId ? `${evalId}:${nowIso}` : nowIso);
191
+ }
192
+ /** True when the signal carries an update component (a scoped or unscoped eval refresh). */
193
+ function hasUpdateComponent(signal) {
194
+ return signal.type === "update" || signal.evalId !== void 0 || (signal.updatedEvalIds?.length ?? 0) > 0 || signal.refreshLatest === true;
195
+ }
196
+ /**
197
+ * True when the signal asks to refresh the latest eval (an unscoped update component): the
198
+ * `refreshLatest` marker, or a bare update with no scoped ids (e.g. a legacy bare timestamp). The
199
+ * watcher emits {@link Eval.latest} for these, so a root `/eval` view follows new evals even when a
200
+ * coalesced signal also carries scoped updates or a delete.
201
+ */
202
+ function hasUnscopedUpdate(signal) {
203
+ return signal.refreshLatest === true || hasUpdateComponent(signal) && updateEvalIds(signal).length === 0;
204
+ }
205
+ /** True when the signal carries a delete component (specific ids or "all evals deleted"). */
206
+ function hasDeleteComponent(signal) {
207
+ return signal.type === "delete" || signal.deletedEvalIds !== void 0;
208
+ }
209
+ /**
210
+ * True when a delete component means "all evals were deleted" rather than a specific id list.
211
+ * "All" is encoded as `undefined` by direct delete callers and as `[]` when a pending delete-all
212
+ * is folded into a JSON update, so both count. Only meaningful for a signal that actually carries
213
+ * a delete component (see {@link hasDeleteComponent}); an update-only signal has no ids either.
214
+ */
215
+ function isAllEvalsDeleted(deletedEvalIds) {
216
+ return deletedEvalIds === void 0 || deletedEvalIds.length === 0;
217
+ }
218
+ /**
219
+ * The distinct scoped eval ids an update signal refreshes, newest last. Empty for an unscoped
220
+ * update (which means "refresh to the latest eval"). Prefers the accumulated `updatedEvalIds`
221
+ * set and falls back to the single `evalId` for legacy/simple signals.
222
+ */
223
+ function updateEvalIds(signal) {
224
+ if (signal.updatedEvalIds && signal.updatedEvalIds.length > 0) return signal.updatedEvalIds;
225
+ return signal.evalId ? [signal.evalId] : [];
226
+ }
227
+ /**
228
+ * Parses signal-file content as a combined JSON payload, returning the classified signal and
229
+ * its timestamp (used for the debounce-window check), or null if it is not a JSON signal.
230
+ */
231
+ function parseSignalJson(content) {
232
+ try {
233
+ const parsed = JSON.parse(content);
234
+ if (parsed !== null && typeof parsed === "object" && "type" in parsed && (parsed.type === "delete" || parsed.type === "update")) {
235
+ const evalId = "evalId" in parsed && typeof parsed.evalId === "string" ? parsed.evalId : void 0;
236
+ const updatedEvalIds = "updatedEvalIds" in parsed ? toStringEvalIds(parsed.updatedEvalIds) : void 0;
237
+ const deletedEvalIds = "deletedEvalIds" in parsed ? toStringEvalIds(parsed.deletedEvalIds) : void 0;
238
+ const timestamp = "timestamp" in parsed && typeof parsed.timestamp === "string" ? parsed.timestamp : void 0;
239
+ const refreshLatest = "refreshLatest" in parsed && parsed.refreshLatest === true ? true : void 0;
240
+ return {
241
+ signal: {
242
+ type: parsed.type,
243
+ evalId,
244
+ updatedEvalIds,
245
+ deletedEvalIds,
246
+ refreshLatest
247
+ },
248
+ timestamp
249
+ };
250
+ }
251
+ } catch {}
252
+ return null;
253
+ }
254
+ /**
255
+ * Reads the signal file only if it was written within the watcher's debounce window, so a
256
+ * writer can fold a not-yet-observed signal into its own write instead of clobbering it.
257
+ * Returns null when the file is stale (outside the window), unreadable, or unparseable.
258
+ */
259
+ function readPendingSignal(now) {
260
+ const withinWindow = (timestamp) => {
261
+ if (timestamp === void 0) return false;
262
+ const elapsed = now - Date.parse(timestamp);
263
+ return Number.isFinite(elapsed) && elapsed >= 0 && elapsed <= SIGNAL_WATCHER_DEBOUNCE_MS;
264
+ };
265
+ try {
266
+ const content = fs.readFileSync(getDbSignalPath(), "utf8").trim();
267
+ const json = parseSignalJson(content);
268
+ if (json) return withinWindow(json.timestamp) ? json.signal : null;
269
+ const legacyTimestamp = content.match(/(\d{4}-\d{2}-\d{2}T[0-9:.]+Z?)$/)?.[1];
270
+ if (!withinWindow(legacyTimestamp)) return null;
271
+ return {
272
+ type: "update",
273
+ evalId: readLegacySignalEvalId(content)
274
+ };
275
+ } catch {
276
+ return null;
277
+ }
278
+ }
279
+ /**
280
+ * Signals that one or more evals were deleted. Deletions use a JSON payload so the watcher can
281
+ * tell clients exactly which evals to drop (whereas a plain update keeps the legacy
282
+ * `evalId:timestamp` text format unless it has to fold in a pending delete). A delete in the
283
+ * debounce window also carries forward a pending update — scoped ids or an unscoped "refresh
284
+ * latest" — so neither refresh is lost (same-process best-effort, like {@link updateSignalFile};
285
+ * cross-process writes can still race).
286
+ * Pre-PR view servers don't understand this JSON and read it back as "no eval id", falling back
287
+ * to broadcasting the latest eval — a benign degradation, so the view server and CLI should be
288
+ * on matching versions for delete-aware refreshes.
289
+ */
290
+ function updateSignalFileForDeletedEvals(deletedEvalIds) {
291
+ const now = Date.now();
292
+ const pending = readPendingSignal(now);
293
+ const pendingDelete = pending && hasDeleteComponent(pending) ? pending : null;
294
+ const mergedDeletedEvalIds = pendingDelete ? isAllEvalsDeleted(pendingDelete.deletedEvalIds) || isAllEvalsDeleted(deletedEvalIds) ? void 0 : [.../* @__PURE__ */ new Set([...pendingDelete.deletedEvalIds ?? [], ...deletedEvalIds ?? []])] : deletedEvalIds;
295
+ const carriedUpdateIds = pending && hasUpdateComponent(pending) ? updateEvalIds(pending) : [];
296
+ const carriedRefreshLatest = pending ? hasUnscopedUpdate(pending) : false;
297
+ writeSignalFile(JSON.stringify({
298
+ type: "delete",
299
+ deletedEvalIds: mergedDeletedEvalIds,
300
+ evalId: carriedUpdateIds[carriedUpdateIds.length - 1],
301
+ updatedEvalIds: carriedUpdateIds.length > 0 ? carriedUpdateIds : void 0,
302
+ refreshLatest: carriedRefreshLatest ? true : void 0,
303
+ timestamp: new Date(now).toISOString()
304
+ }));
305
+ }
306
+ function readLegacySignalEvalId(content) {
307
+ if (/^\d{4}-\d{2}-\d{2}T/.test(content)) return;
308
+ const evalId = content.match(/^(.*):\d{4}-\d{2}-\d{2}T/)?.[1];
309
+ return evalId && isLegacyRecoverableEvalId(evalId) ? evalId : void 0;
310
+ }
311
+ /**
312
+ * Reads and classifies the signal file into a {@link DatabaseSignal}. It understands the
313
+ * legacy `evalId:timestamp` (or bare timestamp) text written by {@link updateSignalFile} and
314
+ * the JSON payload written by the delete/combined writers. A JSON payload may carry BOTH an
315
+ * update component (`updatedEvalIds` — possibly several ids when scoped updates coalesced) and a
316
+ * delete component (`deletedEvalIds`) when mutations were coalesced inside the watcher's debounce
317
+ * window. Malformed/half-written content or a read error degrades to an unscoped `{type:'update'}`.
318
+ */
319
+ function readSignalFile() {
320
+ const filePath = getDbSignalPath();
321
+ try {
322
+ const content = fs.readFileSync(filePath, "utf8").trim();
323
+ const json = parseSignalJson(content);
324
+ if (json) return json.signal;
325
+ return {
326
+ type: "update",
327
+ evalId: readLegacySignalEvalId(content)
328
+ };
329
+ } catch {
330
+ return { type: "update" };
331
+ }
332
+ }
333
+ /**
334
+ * Ensures the signal file exists, creating it if necessary.
335
+ */
336
+ function ensureSignalFile() {
337
+ const filePath = getDbSignalPath();
338
+ if (!fs.existsSync(filePath)) {
339
+ logger.debug(`Creating signal file at ${filePath}`);
340
+ fs.writeFileSync(filePath, (/* @__PURE__ */ new Date()).toISOString());
341
+ }
342
+ }
343
+ /**
344
+ * Sets up a watcher on the signal file and calls the callback when it changes.
345
+ * @param onChange - Callback function that is called when the signal file changes
346
+ * @returns The watcher instance
347
+ */
348
+ function setupSignalWatcher(onChange) {
349
+ const filePath = getDbSignalPath();
350
+ logger.debug(`Setting up file watcher on ${filePath}`);
351
+ ensureSignalFile();
352
+ try {
353
+ const watcher = fs.watch(filePath);
354
+ const handleChange = debounce(onChange, SIGNAL_WATCHER_DEBOUNCE_MS);
355
+ watcher.on("change", handleChange);
356
+ watcher.on("close", handleChange.clear);
357
+ watcher.on("error", (error) => {
358
+ logger.warn(`File watcher error: ${error}`);
359
+ });
360
+ return watcher;
361
+ } catch (error) {
362
+ logger.warn(`Failed to set up file watcher: ${error}`);
363
+ throw error;
364
+ }
365
+ }
366
+ //#endregion
367
+ //#region src/util/standaloneEvalCache.ts
368
+ const standaloneEvalCache = new LRUCache({
369
+ ttl: 72e5,
370
+ max: 2e3
371
+ });
372
+ function getStandaloneEvalCacheKey({ limit = 100, tag, description } = {}) {
373
+ return `standalone_evals_${limit}_${tag?.key}_${tag?.value}_${description}`;
374
+ }
375
+ function getCachedStandaloneEvals(cacheKey) {
376
+ return standaloneEvalCache.get(cacheKey);
377
+ }
378
+ function setCachedStandaloneEvals(cacheKey, evals) {
379
+ standaloneEvalCache.set(cacheKey, evals);
380
+ }
381
+ function clearStandaloneEvalCache() {
382
+ standaloneEvalCache.clear();
383
+ }
384
+ //#endregion
385
+ //#region src/models/evalPerformance.ts
386
+ const countCache = /* @__PURE__ */ new Map();
387
+ const CACHE_TTL = 3e5;
388
+ async function getResultCount(evalId, distinct) {
389
+ const cacheKey = `${distinct ? "distinct" : "total"}:${evalId}`;
390
+ const cached = countCache.get(cacheKey);
391
+ if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
392
+ logger.debug(`Using cached ${distinct ? "distinct count" : "total row count"} for eval ${evalId}: ${cached.count}`);
393
+ return cached.count;
394
+ }
395
+ const db = await getDb();
396
+ const start = Date.now();
397
+ const result = await db.select({ count: distinct ? sql`COUNT(DISTINCT test_idx)` : sql`COUNT(*)` }).from(evalResultsTable).where(sql`eval_id = ${evalId}`).all();
398
+ const count = Number(result[0]?.count ?? 0);
399
+ const duration = Date.now() - start;
400
+ logger.debug(`${distinct ? "Distinct count" : "Total row count"} query for eval ${evalId}: ${count} in ${duration}ms`);
401
+ countCache.set(cacheKey, {
402
+ count,
403
+ timestamp: Date.now()
404
+ });
405
+ return count;
406
+ }
407
+ /**
408
+ * Get the count of distinct test indices for an eval.
409
+ * This represents the number of unique test cases (rows in the UI table).
410
+ *
411
+ * Use getTotalResultRowCount() if you need the total number of result rows
412
+ * (which may be higher when there are multiple prompts/providers per test case).
413
+ */
414
+ function getCachedResultsCount(evalId) {
415
+ return getResultCount(evalId, true);
416
+ }
417
+ /**
418
+ * Get the total count of all result rows for an eval.
419
+ * This counts every result row in the database, including multiple results
420
+ * per test case (e.g., when using multiple prompts or providers).
421
+ *
422
+ * Use this for progress tracking when iterating over all results (e.g., sharing).
423
+ */
424
+ function getTotalResultRowCount(evalId) {
425
+ return getResultCount(evalId, false);
426
+ }
427
+ function clearCountCache(evalId) {
428
+ if (evalId) {
429
+ countCache.delete(`distinct:${evalId}`);
430
+ countCache.delete(`total:${evalId}`);
431
+ } else countCache.clear();
432
+ }
433
+ async function queryTestIndicesOptimized(evalId, opts) {
434
+ const db = await getDb();
435
+ const offset = opts.offset ?? 0;
436
+ const limit = opts.limit ?? 50;
437
+ const mode = opts.filterMode ?? "all";
438
+ let baseQuery = sql`eval_id = ${evalId}`;
439
+ if (mode === "errors") baseQuery = sql`${baseQuery} AND failure_reason = ${2}`;
440
+ else if (mode === "failures") baseQuery = sql`${baseQuery} AND success = 0 AND failure_reason != ${2}`;
441
+ else if (mode === "passes") baseQuery = sql`${baseQuery} AND success = 1`;
442
+ else if (mode === "highlights") baseQuery = sql`${baseQuery} AND json_extract(grading_result, '$.comment') LIKE '!highlight%'`;
443
+ else if (mode === "user-rated") baseQuery = sql`${baseQuery} AND EXISTS (
444
+ SELECT 1
445
+ FROM json_each(grading_result, '$.componentResults')
446
+ WHERE json_extract(value, '$.assertion.type') = ${HUMAN_ASSERTION_TYPE}
447
+ )`;
448
+ let searchCondition = sql`1=1`;
449
+ if (opts.searchQuery && opts.searchQuery.trim() !== "" && !opts.filters?.length) searchCondition = sql`response LIKE ${`%${opts.searchQuery}%`}`;
450
+ const whereClause = sql`${baseQuery} AND ${searchCondition}`;
451
+ const countStart = Date.now();
452
+ const countQuery = sql`
453
+ SELECT COUNT(DISTINCT test_idx) as count
454
+ FROM ${evalResultsTable}
455
+ WHERE ${whereClause}
456
+ `;
457
+ const countResult = await db.all(countQuery);
458
+ const filteredCount = Number(countResult[0]?.count ?? 0);
459
+ logger.debug(`Optimized count query took ${Date.now() - countStart}ms`);
460
+ const idxStart = Date.now();
461
+ const idxQuery = sql`
462
+ SELECT DISTINCT test_idx
463
+ FROM ${evalResultsTable}
464
+ WHERE ${whereClause}
465
+ ORDER BY test_idx
466
+ LIMIT ${limit}
467
+ OFFSET ${offset}
468
+ `;
469
+ const testIndices = (await db.all(idxQuery)).map((row) => row.test_idx);
470
+ logger.debug(`Optimized index query took ${Date.now() - idxStart}ms`);
471
+ return {
472
+ testIndices,
473
+ filteredCount
474
+ };
475
+ }
476
+ //#endregion
477
+ //#region src/models/evalMutation.ts
478
+ /**
479
+ * Drops this process's cached eval aggregates so the next read re-queries the DB.
480
+ * Always clears the standalone-eval LRU (keyed by filter combos, no per-eval granularity)
481
+ * and the count cache for `evalId` (or every eval's counts when `evalId` is omitted).
482
+ * Use this for in-process cache coherence only — it does NOT notify the view server.
483
+ */
484
+ function invalidateEvaluationCache(evalId) {
485
+ clearStandaloneEvalCache();
486
+ clearCountCache(evalId);
487
+ }
488
+ /**
489
+ * Like {@link invalidateEvaluationCache} but for several evals at once: clears the standalone-eval
490
+ * LRU once (it has no per-eval granularity, so repeating it per id is wasteful) and the count
491
+ * cache for each id.
492
+ */
493
+ function invalidateEvaluationCaches(evalIds) {
494
+ clearStandaloneEvalCache();
495
+ for (const id of evalIds) clearCountCache(id);
496
+ }
497
+ /**
498
+ * Call after creating or mutating an eval's data (results, prompts, ratings). Invalidates
499
+ * this process's caches and writes a scoped update signal so a running `promptfoo view`
500
+ * server refreshes clients viewing this eval (and the root route, which follows the latest).
501
+ */
502
+ function notifyEvaluationChanged(evalId) {
503
+ invalidateEvaluationCache(evalId);
504
+ updateSignalFile(evalId);
505
+ }
506
+ /**
507
+ * Call after deleting one or more evals. Invalidates this process's caches and writes a
508
+ * delete signal so the view server can navigate clients off the removed evals. Pass no
509
+ * argument (or omit ids) for "all evals deleted".
510
+ */
511
+ function notifyEvaluationsDeleted(evalIds) {
512
+ if (evalIds) invalidateEvaluationCaches(evalIds);
513
+ else invalidateEvaluationCache();
514
+ updateSignalFileForDeletedEvals(evalIds);
515
+ }
516
+ //#endregion
517
+ //#region src/models/evalResult.ts
518
+ function sanitizeProviderConfig(config) {
519
+ return sanitizeObject(JSON.parse(safeJsonStringify(config)), {
520
+ context: "provider config",
521
+ sanitizeUrls: true,
522
+ maxDepth: Number.POSITIVE_INFINITY
523
+ });
524
+ }
525
+ function stripMediaReferences(value) {
526
+ if (extractBlobHashesFromValue(value).length > 0 || typeof value === "string" && /^data:[^,]*,/i.test(value)) return "[output stripped]";
527
+ if (Array.isArray(value)) return value.map(stripMediaReferences);
528
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, stripMediaReferences(item)]));
529
+ return value;
530
+ }
531
+ function projectOutputMetadata(metadata, stripOutput, responseMetadata, testMetadata) {
532
+ if (!stripOutput || !metadata || !responseMetadata || typeof metadata !== "object") return metadata;
533
+ return Object.fromEntries(Object.entries(metadata).flatMap(([key, value]) => {
534
+ if (!Object.prototype.hasOwnProperty.call(responseMetadata, key) || testMetadata && isDeepStrictEqual(value, testMetadata[key])) return [[key, value]];
535
+ return key === "audio" || key === "blobUris" ? [] : [[key, stripMediaReferences(sanitizeForDb(value))]];
536
+ }));
537
+ }
538
+ function projectProviderResponse(response, options) {
539
+ if (!response) return response;
540
+ if (!options.stripMetadata && !options.stripOutput) return response;
541
+ const projectedResponse = options.stripMetadata ? (({ metadata: _metadata, ...rest }) => rest)(response) : { ...response };
542
+ if (options.stripOutput) {
543
+ projectedResponse.output = "[output stripped]";
544
+ delete projectedResponse.raw;
545
+ delete projectedResponse.providerTransformedOutput;
546
+ delete projectedResponse.conversationOutput;
547
+ delete projectedResponse.audio;
548
+ delete projectedResponse.video;
549
+ delete projectedResponse.images;
550
+ if (projectedResponse.metadata) projectedResponse.metadata = projectOutputMetadata(projectedResponse.metadata, true, projectedResponse.metadata);
551
+ }
552
+ return projectedResponse;
553
+ }
554
+ function projectPrompt(prompt, stripPromptText) {
555
+ return stripPromptText ? {
556
+ ...prompt,
557
+ raw: "[prompt stripped]",
558
+ template: void 0,
559
+ ...prompt.config?.provider && { config: {
560
+ ...prompt.config,
561
+ provider: stripProviderPromptSelectors(prompt.config.provider)
562
+ } }
563
+ } : prompt;
564
+ }
565
+ function projectTracesForOutput(traces, { shouldStripMetadata, shouldStripPromptText, shouldStripResponseOutput, shouldStripTestVars }) {
566
+ if (!shouldStripMetadata && !shouldStripPromptText && !shouldStripResponseOutput && !shouldStripTestVars) return traces;
567
+ return traces.map((trace) => {
568
+ let projectedTrace = trace;
569
+ if (shouldStripMetadata) {
570
+ const { metadata: _metadata, ...traceWithoutMetadata } = trace;
571
+ projectedTrace = traceWithoutMetadata;
572
+ } else if (shouldStripTestVars && trace.metadata && "vars" in trace.metadata) {
573
+ const { metadata: traceMetadata, ...traceWithoutMetadata } = trace;
574
+ const { vars: _vars, ...metadata } = traceMetadata;
575
+ projectedTrace = {
576
+ ...traceWithoutMetadata,
577
+ ...Object.keys(metadata).length > 0 && { metadata }
578
+ };
579
+ }
580
+ if (!shouldStripPromptText && !shouldStripResponseOutput) return projectedTrace;
581
+ return {
582
+ ...projectedTrace,
583
+ spans: projectedTrace.spans.map((span) => {
584
+ if (!span.attributes) return span;
585
+ const projectedAttributes = { ...span.attributes };
586
+ if (shouldStripPromptText) delete projectedAttributes[PromptfooAttributes.REQUEST_BODY];
587
+ if (shouldStripResponseOutput) delete projectedAttributes[PromptfooAttributes.RESPONSE_BODY];
588
+ const { attributes: _attributes, ...projectedSpan } = span;
589
+ return {
590
+ ...projectedSpan,
591
+ ...Object.keys(projectedAttributes).length > 0 && { attributes: projectedAttributes }
592
+ };
593
+ })
594
+ };
595
+ });
596
+ }
597
+ function projectTestCase(testCase, options) {
598
+ if (!options.stripMetadata && !options.stripVars && !options.stripOutput && !options.stripPromptText) return testCase;
599
+ const projectedTestCase = options.stripMetadata ? (({ metadata: _metadata, ...rest }) => rest)(testCase) : { ...testCase };
600
+ if (options.stripVars) projectedTestCase.vars = void 0;
601
+ if (options.stripOutput) delete projectedTestCase.providerOutput;
602
+ if (options.stripMetadata && testCase.metadata?.__promptfoo?.remote === true) projectedTestCase.metadata = { __promptfoo: { remote: true } };
603
+ return options.stripPromptText ? stripTestProviderPromptSelectors(projectedTestCase) : projectedTestCase;
604
+ }
605
+ /** Map only grading assertion providers and component results. */
606
+ function mapGradingResultProviderRefs(gradingResult, mapProvider) {
607
+ const visited = /* @__PURE__ */ new WeakMap();
608
+ const project = (value) => {
609
+ const result = asRecord(value);
610
+ if (!result) return value;
611
+ const previous = visited.get(result);
612
+ if (previous) return previous;
613
+ const projected = { ...result };
614
+ visited.set(result, projected);
615
+ if (result.assertion) projected.assertion = mapTestProviderRefs(result.assertion, mapProvider);
616
+ if (Array.isArray(result.componentResults)) projected.componentResults = result.componentResults.map(project);
617
+ return projected;
618
+ };
619
+ return project(gradingResult);
620
+ }
621
+ /** Project assertion providers only, preserving grading details and unrelated metadata. */
622
+ function projectGradingResult(gradingResult, stripPromptText) {
623
+ return stripPromptText ? mapGradingResultProviderRefs(gradingResult, stripProviderPromptSelectors) : gradingResult;
624
+ }
625
+ function sanitizeProvider(provider) {
626
+ try {
627
+ if (isApiProvider(provider)) return {
628
+ id: provider.id(),
629
+ label: provider.label,
630
+ ...provider.config && { config: sanitizeProviderConfig(provider.config) }
631
+ };
632
+ if (isProviderOptions(provider)) return {
633
+ id: provider.id,
634
+ label: provider.label,
635
+ ...provider.config && { config: sanitizeProviderConfig(provider.config) }
636
+ };
637
+ if (typeof provider === "object" && provider) {
638
+ const providerObj = provider;
639
+ return {
640
+ id: typeof providerObj.id === "function" ? providerObj.id() : providerObj.id,
641
+ label: providerObj.label,
642
+ ...providerObj.config && { config: sanitizeProviderConfig(providerObj.config) }
643
+ };
644
+ }
645
+ } catch {}
646
+ return JSON.parse(safeJsonStringify(provider));
647
+ }
648
+ /** Snapshot live provider references for replay without retaining runtime client state. */
649
+ function toSerializableProviderRef(provider) {
650
+ if (isApiProvider(provider)) return {
651
+ ...sanitizeProvider(provider),
652
+ ...sanitizeObject({
653
+ transform: typeof provider.transform === "string" ? provider.transform : void 0,
654
+ delay: provider.delay,
655
+ inputs: provider.inputs
656
+ }, {
657
+ context: "provider options",
658
+ sanitizeUrls: true,
659
+ maxDepth: Number.POSITIVE_INFINITY
660
+ }),
661
+ ...provider.prompts && { prompts: [...provider.prompts] }
662
+ };
663
+ if (Array.isArray(provider)) return provider.map(toSerializableProviderRef);
664
+ if (isProviderTypeMap(provider)) {
665
+ let serialized;
666
+ for (const type of GRADING_PROVIDER_TYPE_KEYS) if (isApiProvider(provider[type])) {
667
+ serialized ??= { ...provider };
668
+ serialized[type] = toSerializableProviderRef(provider[type]);
669
+ }
670
+ return serialized ?? provider;
671
+ }
672
+ return provider;
673
+ }
674
+ /** Snapshot live grading references before generic result serialization invokes provider toJSON. */
675
+ function serializeResultProviderRefs(result) {
676
+ const record = result;
677
+ const serializeProvider = (provider) => {
678
+ if (!isApiProvider(provider) && !isProviderTypeMap(provider)) return provider;
679
+ return sanitizeObject(toSerializableProviderRef(provider), {
680
+ context: "grading provider",
681
+ sanitizeUrls: true,
682
+ maxDepth: Number.POSITIVE_INFINITY,
683
+ throwOnError: true
684
+ });
685
+ };
686
+ const projected = { ...record };
687
+ if (record.testCase) projected.testCase = mapTestProviderRefs(record.testCase, serializeProvider);
688
+ const prompt = asRecord(record.prompt);
689
+ const config = asRecord(prompt?.config);
690
+ if (config?.provider !== void 0) projected.prompt = {
691
+ ...prompt,
692
+ config: {
693
+ ...config,
694
+ provider: serializeProvider(config.provider)
695
+ }
696
+ };
697
+ if (record.gradingResult) projected.gradingResult = mapGradingResultProviderRefs(record.gradingResult, serializeProvider);
698
+ return projected;
699
+ }
700
+ /**
701
+ * Sanitize an object for database storage by removing circular references
702
+ * and non-serializable values (functions, Timeout objects, etc.).
703
+ * Uses safeJsonStringify which handles circular references gracefully.
704
+ *
705
+ * This prevents "Converting circular structure to JSON" errors that can occur
706
+ * when Node.js Timeout objects or other non-serializable data leaks into results.
707
+ * See: https://github.com/promptfoo/promptfoo/issues/7266
708
+ */
709
+ function sanitizeForDb(obj) {
710
+ if (obj === null || obj === void 0) return obj;
711
+ try {
712
+ const serialized = safeJsonStringify(obj);
713
+ if (serialized === void 0) {
714
+ logger.debug("sanitizeForDb: Failed to serialize object, using fallback", {
715
+ valueType: typeof obj,
716
+ isArray: Array.isArray(obj)
717
+ });
718
+ return Array.isArray(obj) ? [] : null;
719
+ }
720
+ return JSON.parse(serialized);
721
+ } catch (error) {
722
+ logger.debug("sanitizeForDb: Parse error, using fallback", { error });
723
+ return Array.isArray(obj) ? [] : null;
724
+ }
725
+ }
726
+ /**
727
+ * Sanitize a per-test-case field for persistence: strips circular refs,
728
+ * collapses class instances (e.g. live SDK clients that leaked in via
729
+ * `defaultTest.options.provider`), and redacts credential fields (`apiKey`,
730
+ * `token`, etc.) at any depth. Use this for any slot that can carry a provider
731
+ * config — notably `testCase.options.provider` and `prompt.config.provider`,
732
+ * where the resolved runtime provider (with its Anthropic / Bedrock SDK
733
+ * client) flows in from the evaluator. Without this, credentials configured on
734
+ * the judge provider end up in the Eval results both in the DB and in the
735
+ * polling response served by `/api/eval/job/:id`.
736
+ */
737
+ function sanitizeForDbWithSecrets(obj) {
738
+ if (obj === null || obj === void 0) return obj;
739
+ return sanitizeObject(obj, {
740
+ context: "evalResult field",
741
+ maxDepth: Number.POSITIVE_INFINITY
742
+ });
743
+ }
744
+ const SENSITIVE_RESPONSE_HEADER_NAMES = /* @__PURE__ */ new Set([
745
+ "authorization",
746
+ "proxy-authorization",
747
+ "cookie",
748
+ "set-cookie",
749
+ "openai-organization",
750
+ "openai-project",
751
+ "openai-version",
752
+ "x-request-id",
753
+ "x-amzn-requestid",
754
+ "x-amzn-trace-id",
755
+ "x-amz-security-token",
756
+ "x-amz-cf-id",
757
+ "x-azure-ref",
758
+ "x-correlation-id",
759
+ "x-trace-id",
760
+ "cf-ray",
761
+ "cf-cache-status",
762
+ "x-openai-proxy-wasm",
763
+ "via"
764
+ ]);
765
+ const SENSITIVE_RESPONSE_HEADER_PREFIXES = ["x-ratelimit-"];
766
+ function isSensitiveResponseHeader(headerName) {
767
+ const normalized = headerName.toLowerCase();
768
+ if (SENSITIVE_RESPONSE_HEADER_NAMES.has(normalized)) return true;
769
+ return SENSITIVE_RESPONSE_HEADER_PREFIXES.some((prefix) => normalized.startsWith(prefix));
770
+ }
771
+ function isSensitiveRequestHeader(headerName) {
772
+ return isSensitiveResponseHeader(headerName) || isSecretField(headerName);
773
+ }
774
+ function redactSensitiveHeaders(headers, sourceHeaders = headers, isSensitiveHeader = isSensitiveResponseHeader) {
775
+ let mutated = false;
776
+ const next = {};
777
+ for (const [key, value] of Object.entries(headers)) if (Object.prototype.hasOwnProperty.call(sourceHeaders, key) && isDeepStrictEqual(sourceHeaders[key], value) && isSensitiveHeader(key)) {
778
+ next[key] = REDACTED;
779
+ mutated = true;
780
+ } else next[key] = value;
781
+ return mutated ? next : null;
782
+ }
783
+ function redactHttpHeadersOnMetadata(metadata, options) {
784
+ if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) return metadata;
785
+ const m = metadata;
786
+ let nextMetadata;
787
+ const legacyHeaders = m.headers;
788
+ const legacyHeadersSource = options?.redactLegacyHeaders ? legacyHeaders : (options?.legacyHeadersSource)?.headers;
789
+ if (legacyHeaders && typeof legacyHeaders === "object" && !Array.isArray(legacyHeaders) && legacyHeadersSource && typeof legacyHeadersSource === "object" && !Array.isArray(legacyHeadersSource)) {
790
+ const redacted = redactSensitiveHeaders(legacyHeaders, legacyHeadersSource, isSensitiveRequestHeader);
791
+ if (redacted) nextMetadata = {
792
+ ...m,
793
+ headers: redacted
794
+ };
795
+ }
796
+ const http = m.http;
797
+ if (!http || typeof http !== "object" || Array.isArray(http)) return nextMetadata ?? metadata;
798
+ const httpRecord = http;
799
+ let nextHttp;
800
+ for (const slot of ["headers", "requestHeaders"]) {
801
+ const slotValue = httpRecord[slot];
802
+ if (slotValue && typeof slotValue === "object" && !Array.isArray(slotValue)) {
803
+ const redacted = slot === "requestHeaders" ? redactSensitiveHeaders(slotValue, slotValue, isSensitiveRequestHeader) : redactSensitiveHeaders(slotValue);
804
+ if (redacted) {
805
+ nextHttp ??= { ...httpRecord };
806
+ nextHttp[slot] = redacted;
807
+ }
808
+ }
809
+ }
810
+ if (!nextHttp) return nextMetadata ?? metadata;
811
+ nextMetadata ??= { ...m };
812
+ nextMetadata.http = nextHttp;
813
+ return nextMetadata;
814
+ }
815
+ function redactHttpHeadersOnGradingResult(gradingResult) {
816
+ if (!gradingResult || typeof gradingResult !== "object" || Array.isArray(gradingResult)) return gradingResult;
817
+ const gr = gradingResult;
818
+ let mutated = false;
819
+ const next = { ...gr };
820
+ if (gr.metadata !== void 0) {
821
+ const redacted = redactHttpHeadersOnMetadata(gr.metadata);
822
+ if (redacted !== gr.metadata) {
823
+ next.metadata = redacted;
824
+ mutated = true;
825
+ }
826
+ }
827
+ if (Array.isArray(gr.componentResults)) {
828
+ let componentMutated = false;
829
+ const nextComponents = gr.componentResults.map((component) => {
830
+ const redacted = redactHttpHeadersOnGradingResult(component);
831
+ if (redacted !== component) componentMutated = true;
832
+ return redacted;
833
+ });
834
+ if (componentMutated) {
835
+ next.componentResults = nextComponents;
836
+ mutated = true;
837
+ }
838
+ }
839
+ return mutated ? next : gradingResult;
840
+ }
841
+ function sanitizeResponseForDb(response) {
842
+ if (!response) return response;
843
+ const redactedMetadata = redactHttpHeadersOnMetadata(response.metadata, { redactLegacyHeaders: true });
844
+ if (redactedMetadata === response.metadata) return response;
845
+ return {
846
+ ...response,
847
+ metadata: redactedMetadata
848
+ };
849
+ }
850
+ function sanitizeMetadataForDb(metadata, responseMetadata) {
851
+ return redactHttpHeadersOnMetadata(metadata, { legacyHeadersSource: sanitizeForDb(responseMetadata) });
852
+ }
853
+ function sanitizeGradingResultAssertions(gradingResult) {
854
+ if (!gradingResult || typeof gradingResult !== "object" || Array.isArray(gradingResult)) return gradingResult;
855
+ const gr = gradingResult;
856
+ const assertion = asRecord(gr.assertion);
857
+ const sanitizedAssertion = assertion && { ...assertion };
858
+ if (sanitizedAssertion) {
859
+ for (const field of ["provider", "config"]) if (Object.prototype.hasOwnProperty.call(sanitizedAssertion, field)) sanitizedAssertion[field] = sanitizeObject(sanitizedAssertion[field], {
860
+ context: "grading assertion",
861
+ maxDepth: Number.POSITIVE_INFINITY,
862
+ sanitizeUrls: true,
863
+ throwOnError: true
864
+ });
865
+ }
866
+ return {
867
+ ...gr,
868
+ ...sanitizedAssertion && { assertion: sanitizedAssertion },
869
+ ...Array.isArray(gr.componentResults) && { componentResults: gr.componentResults.map(sanitizeGradingResultAssertions) }
870
+ };
871
+ }
872
+ function sanitizeGradingResultForDb(gradingResult) {
873
+ return redactHttpHeadersOnGradingResult(sanitizeGradingResultAssertions(gradingResult));
874
+ }
875
+ const PROMPTFOO_METADATA_KEY = "__promptfoo";
876
+ const TRACE_LINKAGE_KEY = "traceLinkage";
877
+ const REPEAT_LINKAGE_KEY = "repeatLinkage";
878
+ function asRecord(value) {
879
+ return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
880
+ }
881
+ function persistTraceMetadata(metadata, traceId, evaluationId) {
882
+ if (!traceId && !evaluationId) return stripTraceLinkageFromMetadata(metadata);
883
+ const metadataRecord = metadata ?? {};
884
+ const promptfooMetadata = asRecord(metadataRecord[PROMPTFOO_METADATA_KEY]);
885
+ if (metadataRecord["__promptfoo"] !== void 0 && promptfooMetadata === void 0) logger.warn(`[EvalResult] Overwriting non-object metadata.${PROMPTFOO_METADATA_KEY} with internal trace linkage; the key is reserved for promptfoo internals.`);
886
+ if (promptfooMetadata && TRACE_LINKAGE_KEY in promptfooMetadata) logger.warn(`[EvalResult] Overwriting metadata.${PROMPTFOO_METADATA_KEY}.${TRACE_LINKAGE_KEY} with internal trace linkage; the path is reserved for promptfoo internals.`);
887
+ return {
888
+ ...metadataRecord,
889
+ [PROMPTFOO_METADATA_KEY]: {
890
+ ...promptfooMetadata ?? {},
891
+ [TRACE_LINKAGE_KEY]: {
892
+ traceId,
893
+ evaluationId
894
+ }
895
+ }
896
+ };
897
+ }
898
+ function stripTraceLinkageFromMetadata(metadata) {
899
+ const metadataRecord = asRecord(metadata);
900
+ const promptfooMetadata = asRecord(metadataRecord?.[PROMPTFOO_METADATA_KEY]);
901
+ if (!metadataRecord || !promptfooMetadata || !(TRACE_LINKAGE_KEY in promptfooMetadata)) return metadata;
902
+ const { [TRACE_LINKAGE_KEY]: _traceLinkage, ...remainingPromptfooMetadata } = promptfooMetadata;
903
+ const strippedMetadata = { ...metadataRecord };
904
+ delete strippedMetadata[PROMPTFOO_METADATA_KEY];
905
+ if (Object.keys(remainingPromptfooMetadata).length > 0) strippedMetadata[PROMPTFOO_METADATA_KEY] = remainingPromptfooMetadata;
906
+ return strippedMetadata;
907
+ }
908
+ function persistRepeatMetadata(metadata, repeatIndex, repeatGroupId) {
909
+ if (repeatIndex === void 0 || !repeatGroupId) return stripRepeatLinkageFromMetadata(metadata);
910
+ const metadataRecord = metadata ?? {};
911
+ const promptfooMetadata = asRecord(metadataRecord[PROMPTFOO_METADATA_KEY]);
912
+ if (metadataRecord["__promptfoo"] !== void 0 && promptfooMetadata === void 0) logger.warn(`[EvalResult] Overwriting non-object metadata.${PROMPTFOO_METADATA_KEY} with internal repeat linkage; the key is reserved for promptfoo internals.`);
913
+ if (promptfooMetadata && REPEAT_LINKAGE_KEY in promptfooMetadata) logger.warn(`[EvalResult] Overwriting metadata.${PROMPTFOO_METADATA_KEY}.${REPEAT_LINKAGE_KEY} with internal repeat linkage; the path is reserved for promptfoo internals.`);
914
+ return {
915
+ ...metadataRecord,
916
+ [PROMPTFOO_METADATA_KEY]: {
917
+ ...promptfooMetadata ?? {},
918
+ [REPEAT_LINKAGE_KEY]: {
919
+ repeatIndex,
920
+ repeatGroupId
921
+ }
922
+ }
923
+ };
924
+ }
925
+ function stripRepeatLinkageFromMetadata(metadata) {
926
+ const metadataRecord = asRecord(metadata);
927
+ const promptfooMetadata = asRecord(metadataRecord?.[PROMPTFOO_METADATA_KEY]);
928
+ if (!metadataRecord || !promptfooMetadata || !(REPEAT_LINKAGE_KEY in promptfooMetadata)) return metadata;
929
+ const { [REPEAT_LINKAGE_KEY]: _repeatLinkage, ...remainingPromptfooMetadata } = promptfooMetadata;
930
+ const strippedMetadata = { ...metadataRecord };
931
+ delete strippedMetadata[PROMPTFOO_METADATA_KEY];
932
+ if (Object.keys(remainingPromptfooMetadata).length > 0) strippedMetadata[PROMPTFOO_METADATA_KEY] = remainingPromptfooMetadata;
933
+ return strippedMetadata;
934
+ }
935
+ function surfaceRepeatMetadata(metadata) {
936
+ const metadataRecord = metadata ?? {};
937
+ const promptfooMetadata = asRecord(metadataRecord[PROMPTFOO_METADATA_KEY]);
938
+ const repeatLinkage = asRecord(promptfooMetadata?.[REPEAT_LINKAGE_KEY]);
939
+ return {
940
+ repeatIndex: typeof repeatLinkage?.repeatIndex === "number" && Number.isInteger(repeatLinkage.repeatIndex) && repeatLinkage.repeatIndex >= 0 ? repeatLinkage.repeatIndex : void 0,
941
+ repeatGroupId: typeof repeatLinkage?.repeatGroupId === "string" && repeatLinkage.repeatGroupId.length > 0 ? repeatLinkage.repeatGroupId : void 0,
942
+ metadata: promptfooMetadata != null && REPEAT_LINKAGE_KEY in promptfooMetadata ? stripRepeatLinkageFromMetadata(metadataRecord) : metadataRecord
943
+ };
944
+ }
945
+ function surfaceTraceMetadata(metadata) {
946
+ const metadataRecord = metadata ?? {};
947
+ const promptfooMetadata = asRecord(metadataRecord[PROMPTFOO_METADATA_KEY]);
948
+ const traceLinkage = asRecord(promptfooMetadata?.[TRACE_LINKAGE_KEY]);
949
+ const traceId = typeof traceLinkage?.traceId === "string" ? traceLinkage.traceId : void 0;
950
+ const evaluationId = typeof traceLinkage?.evaluationId === "string" ? traceLinkage.evaluationId : void 0;
951
+ if (!(promptfooMetadata != null && TRACE_LINKAGE_KEY in promptfooMetadata)) return {
952
+ traceId,
953
+ evaluationId,
954
+ metadata: metadataRecord
955
+ };
956
+ return {
957
+ traceId,
958
+ evaluationId,
959
+ metadata: stripTraceLinkageFromMetadata(metadataRecord)
960
+ };
961
+ }
962
+ function redactSensitiveResultFieldsForDb(fields) {
963
+ return {
964
+ response: sanitizeResponseForDb(fields.response),
965
+ gradingResult: sanitizeGradingResultForDb(fields.gradingResult),
966
+ metadata: sanitizeMetadataForDb(fields.metadata, fields.response?.metadata)
967
+ };
968
+ }
969
+ function getStripFlags(env) {
970
+ const getFlag = (key) => {
971
+ const value = env?.[key];
972
+ return value === void 0 ? getEnvBool(key, false) : parseEnvBool(String(value), false);
973
+ };
974
+ return {
975
+ shouldStripPromptText: getFlag("PROMPTFOO_STRIP_PROMPT_TEXT"),
976
+ shouldStripResponseOutput: getFlag("PROMPTFOO_STRIP_RESPONSE_OUTPUT"),
977
+ shouldStripTestVars: getFlag("PROMPTFOO_STRIP_TEST_VARS"),
978
+ shouldStripGradingResult: getFlag("PROMPTFOO_STRIP_GRADING_RESULT"),
979
+ shouldStripMetadata: getFlag("PROMPTFOO_STRIP_METADATA")
980
+ };
981
+ }
982
+ /**
983
+ * Sanitize a result before it is serialized into a JSONL output artifact. This is the
984
+ * JSONL-boundary equivalent of the database-persistence sanitization and must stay in sync
985
+ * with it: it redacts credential-bearing HTTP headers from the response / grading / metadata
986
+ * and applies the `PROMPTFOO_STRIP_*` projections (prompt text, response output, test vars,
987
+ * grading result, metadata). In-memory rows keep their real values for hooks; only the
988
+ * on-disk copy is sanitized.
989
+ */
990
+ function sanitizeResultForJsonlArtifact(result, stripFlags = getStripFlags()) {
991
+ const { shouldStripPromptText, shouldStripResponseOutput, shouldStripTestVars, shouldStripGradingResult, shouldStripMetadata } = stripFlags;
992
+ const artifactResult = serializeResultProviderRefs(result);
993
+ const redacted = redactSensitiveResultFieldsForDb({
994
+ response: sanitizeForDb(artifactResult.response),
995
+ gradingResult: sanitizeForDb(artifactResult.gradingResult),
996
+ metadata: sanitizeForDb(artifactResult.metadata)
997
+ });
998
+ const response = projectProviderResponse(redacted.response ?? void 0, {
999
+ stripMetadata: shouldStripMetadata,
1000
+ stripOutput: shouldStripResponseOutput
1001
+ });
1002
+ return {
1003
+ ...result,
1004
+ ...artifactResult.testCase ? { testCase: projectTestCase(sanitizeForDbWithSecrets(artifactResult.testCase), {
1005
+ stripMetadata: shouldStripMetadata,
1006
+ stripVars: shouldStripTestVars,
1007
+ stripOutput: shouldStripResponseOutput,
1008
+ stripPromptText: shouldStripPromptText
1009
+ }) } : {},
1010
+ ...artifactResult.vars === void 0 ? {} : { vars: shouldStripTestVars ? {} : sanitizeForDbWithSecrets(artifactResult.vars) },
1011
+ ...artifactResult.prompt ? { prompt: projectPrompt(sanitizeForDbWithSecrets(artifactResult.prompt), shouldStripPromptText) } : {},
1012
+ ...artifactResult.provider ? { provider: sanitizeProvider(artifactResult.provider) } : {},
1013
+ response,
1014
+ gradingResult: shouldStripGradingResult ? null : projectGradingResult(redacted.gradingResult, shouldStripPromptText),
1015
+ namedScores: sanitizeForDb(artifactResult.namedScores),
1016
+ metadata: shouldStripMetadata ? {} : projectOutputMetadata(redacted.metadata, shouldStripResponseOutput, redacted.response?.metadata, artifactResult.testCase?.metadata)
1017
+ };
1018
+ }
1019
+ var EvalResult = class EvalResult {
1020
+ static async createFromEvaluateResult(evalId, result, opts) {
1021
+ const persist = opts?.persist == null ? true : opts.persist;
1022
+ const { prompt, error, score, latencyMs, success, provider, gradingResult, namedScores, cost, metadata, failureReason, testCase, traceId, evaluationId, repeatIndex, repeatGroupId } = serializeResultProviderRefs(result);
1023
+ const persistedMetadata = persistTraceMetadata(persistRepeatMetadata(metadata, repeatIndex, repeatGroupId), traceId, evaluationId);
1024
+ const processedResponse = await extractAndStoreBinaryData(result.response, {
1025
+ evalId,
1026
+ testIdx: result.testIdx,
1027
+ promptIdx: result.promptIdx
1028
+ });
1029
+ const args = {
1030
+ id: crypto.randomUUID(),
1031
+ evalId,
1032
+ testCase: sanitizeForDbWithSecrets(testCase),
1033
+ promptIdx: result.promptIdx,
1034
+ testIdx: result.testIdx,
1035
+ prompt: sanitizeForDbWithSecrets(prompt),
1036
+ promptId: hashPrompt(prompt),
1037
+ error: error?.toString(),
1038
+ success,
1039
+ score: score == null ? 0 : score,
1040
+ response: sanitizeForDb(processedResponse || null),
1041
+ gradingResult: sanitizeForDb(gradingResult || null),
1042
+ namedScores: sanitizeForDb(namedScores),
1043
+ provider: sanitizeProvider(provider),
1044
+ latencyMs,
1045
+ cost,
1046
+ metadata: sanitizeForDb(persistedMetadata),
1047
+ failureReason
1048
+ };
1049
+ if (persist) {
1050
+ const db = await getDb();
1051
+ const redacted = redactSensitiveResultFieldsForDb({
1052
+ response: args.response,
1053
+ gradingResult: args.gradingResult,
1054
+ metadata: args.metadata
1055
+ });
1056
+ args.response = redacted.response;
1057
+ args.gradingResult = redacted.gradingResult;
1058
+ args.metadata = redacted.metadata;
1059
+ const dbResult = await db.insert(evalResultsTable).values(args).returning();
1060
+ clearCountCache(evalId);
1061
+ return new EvalResult({
1062
+ ...dbResult[0],
1063
+ persisted: true
1064
+ });
1065
+ }
1066
+ return new EvalResult(args);
1067
+ }
1068
+ static async createManyFromEvaluateResult(results, evalId) {
1069
+ const db = await getDb();
1070
+ const returnResults = [];
1071
+ const processedResults = [];
1072
+ for (const result of results) {
1073
+ const processedResponse = isBlobStorageEnabled() ? await extractAndStoreBinaryData(result.response, {
1074
+ evalId,
1075
+ testIdx: result.testIdx,
1076
+ promptIdx: result.promptIdx
1077
+ }) : result.response;
1078
+ processedResults.push({
1079
+ ...serializeResultProviderRefs(result),
1080
+ response: processedResponse ?? void 0
1081
+ });
1082
+ }
1083
+ await db.transaction(async (tx) => {
1084
+ for (const result of processedResults) {
1085
+ const { traceId: _traceId, evaluationId: _evaluationId, repeatIndex: _repeatIndex, repeatGroupId: _repeatGroupId, ...rest } = result;
1086
+ const sanitizedResult = {
1087
+ ...rest,
1088
+ testCase: sanitizeForDbWithSecrets(result.testCase),
1089
+ prompt: sanitizeForDbWithSecrets(result.prompt),
1090
+ ...redactSensitiveResultFieldsForDb({
1091
+ response: sanitizeForDb(result.response),
1092
+ gradingResult: sanitizeForDb(result.gradingResult),
1093
+ metadata: sanitizeForDb(persistTraceMetadata(persistRepeatMetadata(result.metadata, result.repeatIndex, result.repeatGroupId), result.traceId, result.evaluationId))
1094
+ }),
1095
+ namedScores: sanitizeForDb(result.namedScores),
1096
+ provider: result.provider ? sanitizeProvider(result.provider) : result.provider
1097
+ };
1098
+ const dbResult = await tx.insert(evalResultsTable).values({
1099
+ ...sanitizedResult,
1100
+ evalId,
1101
+ id: crypto.randomUUID()
1102
+ }).returning().get();
1103
+ returnResults.push(new EvalResult({
1104
+ ...dbResult,
1105
+ persisted: true
1106
+ }));
1107
+ }
1108
+ });
1109
+ clearCountCache(evalId);
1110
+ return returnResults;
1111
+ }
1112
+ static async findById(id) {
1113
+ const result = await (await getDb()).select().from(evalResultsTable).where(eq(evalResultsTable.id, id));
1114
+ return result.length > 0 ? new EvalResult({
1115
+ ...result[0],
1116
+ persisted: true
1117
+ }) : null;
1118
+ }
1119
+ static async findManyByEvalId(evalId, opts) {
1120
+ return (await (await getDb()).select().from(evalResultsTable).where(and(eq(evalResultsTable.evalId, evalId), opts?.testIdx == null ? void 0 : eq(evalResultsTable.testIdx, opts.testIdx)))).map((result) => new EvalResult({
1121
+ ...result,
1122
+ persisted: true
1123
+ }));
1124
+ }
1125
+ static async findManyByEvalIdAndTestIndices(evalId, testIndices) {
1126
+ if (!testIndices.length) return [];
1127
+ return (await (await getDb()).select().from(evalResultsTable).where(and(eq(evalResultsTable.evalId, evalId), testIndices.length === 1 ? eq(evalResultsTable.testIdx, testIndices[0]) : inArray(evalResultsTable.testIdx, testIndices)))).map((result) => new EvalResult({
1128
+ ...result,
1129
+ persisted: true
1130
+ }));
1131
+ }
1132
+ /**
1133
+ * Returns a set of completed (testIdx,promptIdx) pairs for a given eval.
1134
+ * Key format: `${testIdx}:${promptIdx}`
1135
+ *
1136
+ * @param evalId - The evaluation ID to query
1137
+ * @param opts.excludeErrors - If true, excludes results with ERROR failureReason (used in retry mode)
1138
+ */
1139
+ static async getCompletedIndexPairs(evalId, opts) {
1140
+ const db = await getDb();
1141
+ const whereClause = opts?.excludeErrors ? and(eq(evalResultsTable.evalId, evalId), ne(evalResultsTable.failureReason, ResultFailureReason.ERROR)) : eq(evalResultsTable.evalId, evalId);
1142
+ const rows = await db.select({
1143
+ testIdx: evalResultsTable.testIdx,
1144
+ promptIdx: evalResultsTable.promptIdx
1145
+ }).from(evalResultsTable).where(whereClause);
1146
+ const ret = /* @__PURE__ */ new Set();
1147
+ for (const r of rows) ret.add(`${r.testIdx}:${r.promptIdx}`);
1148
+ return ret;
1149
+ }
1150
+ static async *findManyByEvalIdBatched(evalId, opts) {
1151
+ const db = await getDb();
1152
+ const batchSize = opts?.batchSize || 100;
1153
+ let offset = 0;
1154
+ while (true) {
1155
+ const nextResult = await db.select({ testIdx: evalResultsTable.testIdx }).from(evalResultsTable).where(and(eq(evalResultsTable.evalId, evalId), gte(evalResultsTable.testIdx, offset))).orderBy(evalResultsTable.testIdx).limit(1).get();
1156
+ if (!nextResult) break;
1157
+ offset = nextResult.testIdx;
1158
+ yield (await db.select().from(evalResultsTable).where(and(eq(evalResultsTable.evalId, evalId), gte(evalResultsTable.testIdx, offset), lt(evalResultsTable.testIdx, offset + batchSize))).all()).map((result) => new EvalResult({
1159
+ ...result,
1160
+ persisted: true
1161
+ }));
1162
+ offset += batchSize;
1163
+ }
1164
+ }
1165
+ id;
1166
+ evalId;
1167
+ description;
1168
+ promptIdx;
1169
+ testIdx;
1170
+ testCase;
1171
+ prompt;
1172
+ promptId;
1173
+ error;
1174
+ success;
1175
+ score;
1176
+ response;
1177
+ gradingResult;
1178
+ namedScores;
1179
+ provider;
1180
+ latencyMs;
1181
+ cost;
1182
+ metadata;
1183
+ traceId;
1184
+ evaluationId;
1185
+ repeatIndex;
1186
+ repeatGroupId;
1187
+ failureReason;
1188
+ persisted;
1189
+ pluginId;
1190
+ constructor(opts) {
1191
+ this.id = opts.id;
1192
+ this.evalId = opts.evalId;
1193
+ this.promptIdx = opts.promptIdx;
1194
+ this.testIdx = opts.testIdx;
1195
+ this.testCase = opts.testCase;
1196
+ this.prompt = opts.prompt;
1197
+ this.promptId = opts.promptId || hashPrompt(opts.prompt);
1198
+ this.error = opts.error;
1199
+ this.score = opts.score;
1200
+ this.success = opts.success;
1201
+ this.response = opts.response || void 0;
1202
+ this.gradingResult = opts.gradingResult;
1203
+ this.namedScores = opts.namedScores || {};
1204
+ this.provider = opts.provider;
1205
+ this.latencyMs = opts.latencyMs || 0;
1206
+ this.cost = opts.cost || 0;
1207
+ const surfacedTrace = surfaceTraceMetadata(opts.metadata);
1208
+ const surfacedRepeat = surfaceRepeatMetadata(surfacedTrace.metadata);
1209
+ this.metadata = surfacedRepeat.metadata;
1210
+ this.traceId = surfacedTrace.traceId;
1211
+ this.evaluationId = surfacedTrace.evaluationId;
1212
+ this.repeatIndex = surfacedRepeat.repeatIndex;
1213
+ this.repeatGroupId = surfacedRepeat.repeatGroupId;
1214
+ this.failureReason = isResultFailureReason(opts.failureReason) ? opts.failureReason : ResultFailureReason.NONE;
1215
+ this.persisted = opts.persisted || false;
1216
+ this.pluginId = opts.testCase.metadata?.pluginId;
1217
+ }
1218
+ async save() {
1219
+ const db = await getDb();
1220
+ const { traceId: _traceId, evaluationId: _evaluationId, repeatIndex: _repeatIndex, repeatGroupId: _repeatGroupId, pluginId: _pluginId, ...rest } = serializeResultProviderRefs(this);
1221
+ const persistedValues = {
1222
+ ...rest,
1223
+ error: this.error ?? null,
1224
+ gradingResult: sanitizeGradingResultForDb(rest.gradingResult),
1225
+ metadata: persistTraceMetadata(persistRepeatMetadata(this.metadata, this.repeatIndex, this.repeatGroupId), this.traceId, this.evaluationId)
1226
+ };
1227
+ if (this.persisted) await db.update(evalResultsTable).set({
1228
+ ...persistedValues,
1229
+ updatedAt: getCurrentTimestamp()
1230
+ }).where(eq(evalResultsTable.id, this.id)).run();
1231
+ else {
1232
+ const result = await db.insert(evalResultsTable).values(persistedValues).returning();
1233
+ this.id = result[0].id;
1234
+ this.persisted = true;
1235
+ }
1236
+ invalidateEvaluationCache(this.evalId);
1237
+ }
1238
+ toEvaluateResult(stripFlags = getStripFlags()) {
1239
+ const { shouldStripPromptText, shouldStripResponseOutput, shouldStripTestVars, shouldStripGradingResult, shouldStripMetadata } = stripFlags;
1240
+ const response = projectProviderResponse(this.response, {
1241
+ stripMetadata: shouldStripMetadata,
1242
+ stripOutput: shouldStripResponseOutput
1243
+ });
1244
+ const prompt = projectPrompt(this.prompt, shouldStripPromptText);
1245
+ const testCase = projectTestCase(this.testCase, {
1246
+ stripMetadata: shouldStripMetadata,
1247
+ stripVars: shouldStripTestVars,
1248
+ stripOutput: shouldStripResponseOutput,
1249
+ stripPromptText: shouldStripPromptText
1250
+ });
1251
+ const tokenUsage = createEmptyTokenUsage();
1252
+ if (this.response) accumulateResponseTokenUsage(tokenUsage, this.response);
1253
+ if (this.gradingResult) accumulateGradingTokenUsage(tokenUsage, this.gradingResult.tokensUsed, { cached: this.gradingResult.metadata?.cachedResponse });
1254
+ return {
1255
+ cost: this.cost,
1256
+ ...this.response?.incurredCost !== void 0 && { incurredCost: this.response.incurredCost },
1257
+ description: this.description || void 0,
1258
+ error: this.error || void 0,
1259
+ gradingResult: shouldStripGradingResult ? null : projectGradingResult(this.gradingResult, shouldStripPromptText),
1260
+ id: this.id,
1261
+ latencyMs: this.latencyMs,
1262
+ namedScores: this.namedScores,
1263
+ prompt,
1264
+ promptId: this.promptId,
1265
+ promptIdx: this.promptIdx,
1266
+ ...this.traceId ? { traceId: this.traceId } : {},
1267
+ ...this.evaluationId ? { evaluationId: this.evaluationId } : {},
1268
+ ...this.repeatGroupId !== void 0 && {
1269
+ repeatGroupId: this.repeatGroupId,
1270
+ repeatIndex: this.repeatIndex
1271
+ },
1272
+ provider: {
1273
+ id: this.provider.id,
1274
+ label: this.provider.label
1275
+ },
1276
+ response,
1277
+ score: this.score,
1278
+ success: this.success,
1279
+ testCase,
1280
+ testIdx: this.testIdx,
1281
+ tokenUsage,
1282
+ vars: shouldStripTestVars ? {} : this.testCase.vars || {},
1283
+ metadata: shouldStripMetadata ? {} : projectOutputMetadata(this.metadata, shouldStripResponseOutput, this.response?.metadata, this.testCase.metadata),
1284
+ failureReason: this.failureReason
1285
+ };
1286
+ }
1287
+ };
1288
+ /** Normalize an `EvalResult` model instance or a plain `EvaluateResult` to `EvaluateResult`. */
1289
+ function asEvaluateResult(result, stripFlags = getStripFlags()) {
1290
+ return "toEvaluateResult" in result ? result.toEvaluateResult(stripFlags) : result;
1291
+ }
1292
+ /** Canonical `testIdx:promptIdx` key used to dedupe/look up a result across the streaming,
1293
+ * recovery, and comparison paths. */
1294
+ function getResultIndexKey(result) {
1295
+ return `${result.testIdx}:${result.promptIdx}`;
1296
+ }
1297
+ //#endregion
1298
+ export { hashPrompt as A, hasDeleteComponent as C, setupSignalWatcher as D, readSignalFile as E, HUMAN_ASSERTION_TYPE as F, normalizeInput as M, generateIdFromPrompt as N, updateEvalIds as O, FILE_METADATA_KEY as P, setCachedStandaloneEvals as S, isAllEvalsDeleted as T, getCachedResultsCount as _, getStripFlags as a, getCachedStandaloneEvals as b, projectPrompt as c, stripTraceLinkageFromMetadata as d, toSerializableProviderRef as f, notifyEvaluationsDeleted as g, notifyEvaluationChanged as h, getResultIndexKey as i, maybeFilePath as j, debounce as k, projectTracesForOutput as l, invalidateEvaluationCaches as m, PROMPTFOO_METADATA_KEY as n, persistRepeatMetadata as o, invalidateEvaluationCache as p, asEvaluateResult as r, persistTraceMetadata as s, EvalResult as t, sanitizeResultForJsonlArtifact as u, getTotalResultRowCount as v, hasUnscopedUpdate as w, getStandaloneEvalCacheKey as x, queryTestIndicesOptimized as y };
1299
+
1300
+ //# sourceMappingURL=evalResult-DzOq5wt9.js.map