promptfoo 0.121.1 → 0.121.3

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 (316) hide show
  1. package/README.md +2 -0
  2. package/dist/src/{accounts-xrUGFA6n.js → accounts-B2XmGjty.js} +5 -5
  3. package/dist/src/{accounts-Bx-x3bmW.cjs → accounts-BPyfpSeU.cjs} +5 -5
  4. package/dist/src/{accounts-CMqkzrVf.js → accounts-CFLK3mnD.js} +6 -6
  5. package/dist/src/{accounts-BgNJDBE6.js → accounts-Xatc0RYb.js} +5 -5
  6. package/dist/src/{agentic-utils-BKIN5PKu.js → agentic-utils-36epdqwB.js} +3 -3
  7. package/dist/src/{cometapi-DkXrKi5z.js → agentic-utils-D8yXo5Lm.js} +4 -61
  8. package/dist/src/{cometapi-vY6aDZgo.cjs → agentic-utils-DAVsChuB.cjs} +24 -62
  9. package/dist/src/agentic-utils-DIYAAYE7.js +153 -0
  10. package/dist/src/{agents-C-dDThPK.js → agents-BBVJCIYr.js} +226 -13
  11. package/dist/src/{agents-CErsqg5U.cjs → agents-BBWxKSM0.cjs} +7 -7
  12. package/dist/src/{agents-Dy2YpZpa.js → agents-Bqgfdokm.js} +227 -14
  13. package/dist/src/{agents-B0f4HICh.cjs → agents-CAYbM7qD.cjs} +226 -13
  14. package/dist/src/{agents-CVIn-Utx.js → agents-CLQ-P15P.js} +7 -7
  15. package/dist/src/{agents-DeH4Gu94.js → agents-CgBniSlI.js} +8 -8
  16. package/dist/src/{agents-CXknwsFX.js → agents-DSSTV4bv.js} +226 -13
  17. package/dist/src/{agents-aF4-T121.js → agents-wg3ohknq.js} +7 -7
  18. package/dist/src/{aimlapi-tg0Gkcvr.cjs → aimlapi-Bv8Fmc-b.cjs} +14 -14
  19. package/dist/src/{aimlapi-BNfTBexL.js → aimlapi-BwGC1TtS.js} +13 -13
  20. package/dist/src/{aimlapi-BAGZDo5G.js → aimlapi-DaC3qZ-o.js} +14 -14
  21. package/dist/src/{aimlapi-DHRKlBEA.js → aimlapi-MgSLdvy7.js} +13 -13
  22. package/dist/src/app/assets/index-B6l9CVVb.js +439 -0
  23. package/dist/src/app/assets/index-DyZ0Ep37.css +1 -0
  24. package/dist/src/app/assets/sync-CStkzc6u.js +4 -0
  25. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +36 -0
  26. package/dist/src/app/assets/vendor-markdown-Bz7N-ca6.js +29 -0
  27. package/dist/src/app/index.html +4 -4
  28. package/dist/src/{audio-tf_NBjlC.js → audio-Bn44pQxv.js} +4 -4
  29. package/dist/src/{audio-CHQ4r-RV.js → audio-DDA5WHdx.js} +4 -4
  30. package/dist/src/{audio-BWeaWovU.cjs → audio-DVFjQ67_.cjs} +4 -4
  31. package/dist/src/{audio-BRODU0UK.js → audio-DjU9GswO.js} +5 -5
  32. package/dist/src/{base-DBtwl2FR.cjs → base-BboXIF_0.cjs} +3 -3
  33. package/dist/src/{base-B4QJRyFS.js → base-CKjwebIH.js} +3 -3
  34. package/dist/src/{base-B0tcrnq_.js → base-CqzQ4K8j.js} +3 -3
  35. package/dist/src/{base-fEDN28WM.js → base-Cz2ZC_iA.js} +3 -3
  36. package/dist/src/{blobs-BAU-dXan.js → blobs-B1JriOyi.js} +3 -3
  37. package/dist/src/{blobs-qTYm-1PY.js → blobs-BUWmKWzo.js} +3 -3
  38. package/dist/src/{blobs-DvS-O6be.cjs → blobs-C6j0bvFz.cjs} +3 -3
  39. package/dist/src/{blobs-Bpg5rH6i.js → blobs-DXTl6J3H.js} +3 -3
  40. package/dist/src/{cache-COish3-W.cjs → cache-C5yFZ4gC.cjs} +75 -58
  41. package/dist/src/{cache-8XhNqPKW.js → cache-CaT5tPgo.js} +75 -58
  42. package/dist/src/cache-CyCanoMu.js +6 -0
  43. package/dist/src/{cache-CG0SlR1d.js → cache-DSqR6ezl.js} +75 -58
  44. package/dist/src/cache-Df_QFDNu.cjs +5 -0
  45. package/dist/src/{cache-D3eqDYGU.js → cache-HP0NP4k3.js} +75 -58
  46. package/dist/src/{chat-DHMH-N64.js → chat-B-52XYI1.js} +12 -12
  47. package/dist/src/{chat-BKm79wib.js → chat-B0iaWhoh.js} +16 -14
  48. package/dist/src/{chat-DxysjBvt.js → chat-BE0qTA8e.js} +13 -13
  49. package/dist/src/{chat-CRWNNq73.js → chat-BEwdgGEg.js} +16 -14
  50. package/dist/src/{chat-2K608PeQ.cjs → chat-BtIKkLKx.cjs} +13 -13
  51. package/dist/src/{chat-DaqekjFr.cjs → chat-CM8qWR3_.cjs} +17 -15
  52. package/dist/src/{chat-CM_kyI8B.js → chat-DK1U-eZ-.js} +12 -12
  53. package/dist/src/{chat-CznLWr_D.js → chat-pxmiVpWe.js} +16 -14
  54. package/dist/src/{chatkit-65VXf5SR.js → chatkit-BYGQlHlV.js} +4 -4
  55. package/dist/src/{chatkit-DKyPi1Gs.cjs → chatkit-Cx174XI3.cjs} +4 -4
  56. package/dist/src/{chatkit-BxFvW8KY.js → chatkit-_8eJqKcD.js} +4 -4
  57. package/dist/src/{chatkit-Be-Q-a9F.js → chatkit-a2D6mY6s.js} +4 -4
  58. package/dist/src/{claude-agent-sdk-CJH22shf.cjs → claude-agent-sdk-8ddRp1L2.cjs} +35 -17
  59. package/dist/src/{claude-agent-sdk-Dy5lT-Tx.js → claude-agent-sdk-Bq5EArsX.js} +33 -15
  60. package/dist/src/{claude-agent-sdk-BLTu0WBO.js → claude-agent-sdk-CMjh4LFH.js} +33 -15
  61. package/dist/src/{claude-agent-sdk-D6_k9FKA.js → claude-agent-sdk-HgbFioFw.js} +33 -15
  62. package/dist/src/cloud-DE3t1-ZI.js +4 -0
  63. package/dist/src/{cloud-Bc9526yV.js → cloud-z8KZpUoa.js} +3 -3
  64. package/dist/src/{cloudflare-ai-CWWJCRim.js → cloudflare-ai-BGyXlpXJ.js} +13 -13
  65. package/dist/src/{cloudflare-ai-C9r2sRhw.js → cloudflare-ai-Bbp26N0L.js} +13 -13
  66. package/dist/src/{cloudflare-ai-ClWSdor4.cjs → cloudflare-ai-C62x6MQG.cjs} +14 -14
  67. package/dist/src/{cloudflare-ai-ICsOuD-z.js → cloudflare-ai-DdKP9TKT.js} +14 -14
  68. package/dist/src/{cloudflare-gateway-D6xFc5pa.js → cloudflare-gateway-BwAaUgeW.js} +14 -14
  69. package/dist/src/{cloudflare-gateway-D6O7AlYb.js → cloudflare-gateway-D-e9i1Sn.js} +15 -15
  70. package/dist/src/{cloudflare-gateway-pXGHxJ47.js → cloudflare-gateway-DXhtXDRb.js} +15 -163
  71. package/dist/src/{cloudflare-gateway-C2_-KG5o.cjs → cloudflare-gateway-Dx36ftqF.cjs} +15 -15
  72. package/dist/src/{codex-sdk-DUwKWezN.js → codex-sdk-BQEw16R_.js} +180 -11
  73. package/dist/src/{codex-sdk-C6UMlxwV.js → codex-sdk-C_07GuVS.js} +180 -11
  74. package/dist/src/{codex-sdk-GGAw0qbD.js → codex-sdk-DE5G18dx.js} +180 -11
  75. package/dist/src/{codex-sdk-fAO0c3yA.cjs → codex-sdk-ZLKfDjqP.cjs} +181 -12
  76. package/dist/src/cometapi-BDyV-NNm.js +62 -0
  77. package/dist/src/cometapi-C3hOlM7-.cjs +62 -0
  78. package/dist/src/{cometapi-Bbjp5V4x.js → cometapi-hhL4TAh3.js} +14 -14
  79. package/dist/src/{cometapi-BasUi7-_.js → cometapi-sp7sJpBD.js} +15 -15
  80. package/dist/src/{completion-C_P3ypkJ.js → completion-BCimtq-h.js} +6 -6
  81. package/dist/src/{completion-6Mx_iXxK.js → completion-DCjv7RZ3.js} +6 -6
  82. package/dist/src/{completion-CDOouNzq.cjs → completion-DlXUhj5c.cjs} +6 -6
  83. package/dist/src/{completion-C5rtR_9P.js → completion-DoYy49ti.js} +6 -6
  84. package/dist/src/{createHash-CfZSc0b4.cjs → createHash-BYwImsYv.cjs} +2 -2
  85. package/dist/src/{docker-BwsKwxFs.cjs → docker-Cqj2-QVi.cjs} +14 -14
  86. package/dist/src/{docker-CZnqU1XV.js → docker-CxCkwMzc.js} +13 -13
  87. package/dist/src/{docker-DzxyDPIj.js → docker-DpguQj-w.js} +14 -14
  88. package/dist/src/{docker-5KcG-_86.js → docker-FeBni2dw.js} +13 -13
  89. package/dist/src/{esm-C03C-mv3.js → esm-7UIl0pPM.js} +2 -2
  90. package/dist/src/{esm-Cd1AjG1D.js → esm-CKWP3u_P.js} +3 -3
  91. package/dist/src/{esm-CnNt7sI4.cjs → esm-CipptfDu.cjs} +2 -2
  92. package/dist/src/{esm-CaIwzWR5.js → esm-SUNIX1x3.js} +3 -3
  93. package/dist/src/eval-7aEqoMs3.js +15 -0
  94. package/dist/src/{eval-DmFyWU7i.js → eval-BTqTn7lb.js} +10 -10
  95. package/dist/src/{evalResult-CDQiuUuf.js → evalResult-BkIhRdTe.js} +7 -7
  96. package/dist/src/evalResult-CYNHkk5A.js +12 -0
  97. package/dist/src/evalResult-CuvJeNiM.js +10 -0
  98. package/dist/src/{evalResult-CTG2AHOS.js → evalResult-DUDShQrm.js} +7 -7
  99. package/dist/src/{evalResult-Dap2CekP.cjs → evalResult-DpARzUCb.cjs} +7 -7
  100. package/dist/src/evalResult-tGdilrWt.cjs +10 -0
  101. package/dist/src/evaluator-BBUqRhz1.js +36 -0
  102. package/dist/src/{evaluator-DPFRbFIL.js → evaluator-BcvOGaam.js} +833 -79
  103. package/dist/src/{extractor-YMU_Gvt8.js → extractor-C8XwivI9.js} +6 -6
  104. package/dist/src/{extractor-CFG6bcWJ.js → extractor-CAZ2G3Kh.js} +6 -6
  105. package/dist/src/{extractor-DX36oYEv.cjs → extractor-DG3sSfXE.cjs} +6 -6
  106. package/dist/src/{extractor-M67RUtg6.js → extractor-D_wd8jxt.js} +6 -6
  107. package/dist/src/{fetch-4M3YRaqL.js → fetch-BiYv2BZc.js} +3 -3
  108. package/dist/src/{fetch-BxUk8odA.cjs → fetch-BnR9wSnm.cjs} +3 -3
  109. package/dist/src/{fetch-60Gzydls.js → fetch-CVAtKnI3.js} +3 -3
  110. package/dist/src/{fetch-BMv0O527.js → fetch-DoVRJZhJ.js} +4 -4
  111. package/dist/src/fetch-UWU706qb.js +5 -0
  112. package/dist/src/{genaiTracer-DN4dQywX.cjs → genaiTracer-BfxrvSUb.cjs} +2 -2
  113. package/dist/src/{graders-DOXycdlG.cjs → graders-BElhu9ZY.cjs} +126 -55
  114. package/dist/src/{graders-R9rYUM0d.js → graders-BXAJ0sbS.js} +120 -55
  115. package/dist/src/graders-BxfEguVY.js +32 -0
  116. package/dist/src/graders-CzVMbEnv.js +34 -0
  117. package/dist/src/{graders-CpdqD9PI.js → graders-DG7mhg-b.js} +120 -55
  118. package/dist/src/graders-DjCXfj0l.cjs +32 -0
  119. package/dist/src/{graders-CHO8EPM4.js → graders-RjHF8VfG.js} +120 -55
  120. package/dist/src/graders-kHzIWOKu.js +32 -0
  121. package/dist/src/{image-DTedmQPg.cjs → image--F58eEIn.cjs} +6 -6
  122. package/dist/src/{image-DJEvKveK.js → image-6WQXK8m8.js} +4 -4
  123. package/dist/src/{image-pAX56tPG.js → image-B8b6f36E.js} +6 -6
  124. package/dist/src/{image-BmEZqVmk.js → image-CoxZp9PZ.js} +6 -6
  125. package/dist/src/{image-gvmivTEe.js → image-DO0RYnjH.js} +5 -5
  126. package/dist/src/{image-CBBVXWuT.js → image-PoF6DN3x.js} +6 -6
  127. package/dist/src/{image-CDLQOcqT.cjs → image-fza3zuKs.cjs} +4 -4
  128. package/dist/src/{image-tL5hIOFh.js → image-xNbw5ph2.js} +4 -4
  129. package/dist/src/index.cjs +863 -110
  130. package/dist/src/index.d.cts +833 -60
  131. package/dist/src/index.d.ts +833 -60
  132. package/dist/src/index.js +860 -108
  133. package/dist/src/{interactiveCheck-BgLZUIt3.js → interactiveCheck-BnMYOjMu.js} +2 -2
  134. package/dist/src/{knowledgeBase-CoU-UQBg.js → knowledgeBase-Bi7CmDbx.js} +7 -7
  135. package/dist/src/{knowledgeBase-CLJybhnF.js → knowledgeBase-Ce3ofVan.js} +8 -8
  136. package/dist/src/{knowledgeBase-DjWPVqSb.js → knowledgeBase-DFRXPZl_.js} +7 -7
  137. package/dist/src/{knowledgeBase-wkxuRFhA.cjs → knowledgeBase-DqrLX8fy.cjs} +7 -7
  138. package/dist/src/{litellm-B9Hysuri.js → litellm-Bo2gQXpo.js} +16 -15
  139. package/dist/src/{litellm-ePxtr9F1.js → litellm-CKiAxnoM.js} +15 -14
  140. package/dist/src/{litellm-NYpQ8RQu.cjs → litellm-CnHI69aj.cjs} +16 -15
  141. package/dist/src/{litellm-CTfa0hqi.js → litellm-Tc294Jhj.js} +15 -14
  142. package/dist/src/{logger-KkObSCzq.js → logger-BcJBzSSA.js} +10 -14
  143. package/dist/src/{logger-DLcq4dWf.js → logger-BnkjG2jt.js} +10 -14
  144. package/dist/src/{logger-Cp1GPUjj.cjs → logger-D5iKBpu_.cjs} +27 -13
  145. package/dist/src/{logger-CT3IKMKA.js → logger-DO8_zM18.js} +10 -14
  146. package/dist/src/{luma-ray-BW9IRGIc.js → luma-ray-0ehMPt5N.js} +10 -10
  147. package/dist/src/{luma-ray-BE2mOt6N.js → luma-ray-C9q8rdQe.js} +9 -9
  148. package/dist/src/{luma-ray-Cm1KZBhs.js → luma-ray-DP0QA9qn.js} +9 -9
  149. package/dist/src/{luma-ray-B0GGNRc1.cjs → luma-ray-m9Ku2meV.cjs} +9 -9
  150. package/dist/src/main.js +69 -71
  151. package/dist/src/{messages-1x9atZmP.js → messages-DJNo37Ko.js} +14 -9
  152. package/dist/src/{messages-BLbWdsyt.js → messages-Dy9QecMs.js} +14 -9
  153. package/dist/src/{messages-1JrJs91T.cjs → messages-HJsyEh4o.cjs} +15 -10
  154. package/dist/src/{messages-D8EA0oDc.js → messages-biC_ex-p.js} +14 -9
  155. package/dist/src/{modelslab-C1OLRmVX.js → modelslab-B5J-ZM5c.js} +9 -9
  156. package/dist/src/{modelslab-CqXBy3U8.js → modelslab-BI458moT.js} +10 -10
  157. package/dist/src/{modelslab-X5-4LroM.js → modelslab-BTOT8FUO.js} +9 -9
  158. package/dist/src/{modelslab-DcOSFwKh.cjs → modelslab-IQbNg-r7.cjs} +9 -9
  159. package/dist/src/{nova-reel-DihqLeol.js → nova-reel-BZ9y-Y5s.js} +9 -9
  160. package/dist/src/{nova-reel-D9xfaMBs.cjs → nova-reel-CE5etkv9.cjs} +9 -9
  161. package/dist/src/{nova-reel-D2ZkOSyr.js → nova-reel-DEeQlnOJ.js} +10 -10
  162. package/dist/src/{nova-reel-BgS1ZWuK.js → nova-reel-Xw1SXLpg.js} +9 -9
  163. package/dist/src/{nova-sonic-Q3BOJeig.js → nova-sonic-DWswpN1E.js} +7 -7
  164. package/dist/src/{nova-sonic-DezhVUYT.js → nova-sonic-DXTLpi-r.js} +6 -6
  165. package/dist/src/{nova-sonic-DVu3mMIy.cjs → nova-sonic-N0yCm0vb.cjs} +6 -6
  166. package/dist/src/{nova-sonic-P-CdUMlV.js → nova-sonic-Ogqf-csn.js} +6 -6
  167. package/dist/src/{openai-DhbB7eWK.js → openai-BMcwgD5C.js} +2 -2
  168. package/dist/src/{openai-j-sE2O7r.js → openai-BcB5KlTk.js} +2 -2
  169. package/dist/src/{openai-Cuif0GEt.cjs → openai-CoxGAQwn.cjs} +2 -2
  170. package/dist/src/{openai-DElQ-fPX.js → openai-D6wITiVn.js} +2 -2
  171. package/dist/src/{openclaw-Bv1DINsX.js → openclaw-0Sv7AK3O.js} +172 -109
  172. package/dist/src/{openclaw-DAfWQn-o.cjs → openclaw-CXxbKgDH.cjs} +174 -110
  173. package/dist/src/{openclaw-BiSZPL7J.js → openclaw-D1FSCps-.js} +172 -109
  174. package/dist/src/{openclaw-D1D_ej1z.js → openclaw-D2ENvu7a.js} +173 -110
  175. package/dist/src/{opencode-sdk-D95s6SnR.js → opencode-sdk-C71Z0ehR.js} +13 -13
  176. package/dist/src/{opencode-sdk-DxUPkLT7.js → opencode-sdk-CHCs7dEb.js} +12 -12
  177. package/dist/src/{opencode-sdk-C7m-wRfI.js → opencode-sdk-DDxj4QqH.js} +12 -12
  178. package/dist/src/{opencode-sdk-CfaLN8PY.cjs → opencode-sdk-WWJhnbKr.cjs} +16 -16
  179. package/dist/src/{otlpReceiver-g3ByGaXs.js → otlpReceiver-C9KlUtxh.js} +6 -6
  180. package/dist/src/{otlpReceiver--AIRW_S4.js → otlpReceiver-CZL48YfC.js} +6 -6
  181. package/dist/src/{otlpReceiver-Bn5wGB1v.js → otlpReceiver-CavGAA6k.js} +6 -6
  182. package/dist/src/{otlpReceiver-Diec4cln.cjs → otlpReceiver-DHKqJlsz.cjs} +6 -6
  183. package/dist/src/{providerRegistry-B0RUOLI_.js → providerRegistry-B9lh-_tx.js} +2 -2
  184. package/dist/src/{providerRegistry-Civky8Ar.cjs → providerRegistry-BTDgfV5h.cjs} +2 -2
  185. package/dist/src/{providerRegistry-CD8MEar9.js → providerRegistry-BkzVH5Ba.js} +2 -2
  186. package/dist/src/{providerRegistry-DM8rZYol.js → providerRegistry-CUWki5mQ.js} +2 -2
  187. package/dist/src/providers-BSLEaIQG.js +32 -0
  188. package/dist/src/{providers-CFu-TZl-.cjs → providers-CScd1wN6.cjs} +733 -464
  189. package/dist/src/{providers-CFLy1_ji.js → providers-Ch6Mr0gn.js} +795 -526
  190. package/dist/src/{providers-BKRJTjBz.js → providers-Cn73d5sr.js} +795 -526
  191. package/dist/src/providers-D-FnDg8k.cjs +31 -0
  192. package/dist/src/providers-DEYiFVAo.js +30 -0
  193. package/dist/src/{providers-B3HvufyI.js → providers-DvddrgxL.js} +795 -526
  194. package/dist/src/providers-sS2WI8YD.js +30 -0
  195. package/dist/src/{pythonUtils-D6fwaDSg.js → pythonUtils-Bzwbgpbg.js} +3 -3
  196. package/dist/src/{pythonUtils-D5nxkQ0P.js → pythonUtils-Cpo0Ez1p.js} +3 -3
  197. package/dist/src/{pythonUtils-CTU3Y3lw.cjs → pythonUtils-dAVigVK-.cjs} +3 -3
  198. package/dist/src/{pythonUtils-C3py6GC1.js → pythonUtils-wIqk7zAf.js} +3 -3
  199. package/dist/src/{quiverai-CI6gYJVI.js → quiverai-BeofbLVc.js} +4 -4
  200. package/dist/src/{quiverai-MHSxbmmZ.js → quiverai-CCQn73lq.js} +5 -5
  201. package/dist/src/{quiverai-CLkWkyZc.cjs → quiverai-CcUhPIBg.cjs} +4 -4
  202. package/dist/src/{quiverai-C2jVwbH1.js → quiverai-DVSEqJiq.js} +4 -4
  203. package/dist/src/{render-Drod8m7K.js → render-BHl6QVq9.js} +3 -3
  204. package/dist/src/{responses-CGw0DCzh.js → responses-BKP_WYis.js} +16 -12
  205. package/dist/src/{responses-BKqJmhhc.js → responses-CQb1Tj69.js} +16 -12
  206. package/dist/src/{responses-jxdehPkC.js → responses-CgNyTPsY.js} +16 -12
  207. package/dist/src/{responses-tD4Bd4dc.cjs → responses-mo0KQDbu.cjs} +16 -12
  208. package/dist/src/rubyUtils-B1HXG4ej.cjs +4 -0
  209. package/dist/src/{rubyUtils-DhCAlxZr.cjs → rubyUtils-CGeUtCfW.cjs} +3 -3
  210. package/dist/src/{rubyUtils-Boc4HZzX.js → rubyUtils-CiVfln3g.js} +3 -3
  211. package/dist/src/{rubyUtils-BcuGX77l.js → rubyUtils-DECSbsfY.js} +3 -3
  212. package/dist/src/{rubyUtils-BUVePouc.js → rubyUtils-PgU-gHmx.js} +3 -3
  213. package/dist/src/rubyUtils-Rt6pKA96.js +5 -0
  214. package/dist/src/{sagemaker-BK4Zb993.js → sagemaker-CVv8W7so.js} +17 -17
  215. package/dist/src/{sagemaker-D2Q1c-sD.js → sagemaker-CqeASYE5.js} +17 -17
  216. package/dist/src/{sagemaker-BfiWTmvn.js → sagemaker-MUbD5V3v.js} +18 -18
  217. package/dist/src/{sagemaker-CcQHM1jV.cjs → sagemaker-jiw1wQa-.cjs} +17 -17
  218. package/dist/src/{scanner-J8CA3LsV.js → scanner-DVDeUz1r.js} +10 -10
  219. package/dist/src/server/index.js +864 -112
  220. package/dist/src/server-B0Xh1Gx-.js +7 -0
  221. package/dist/src/{server-B0PPuDw-.cjs → server-BtoCXeXI.cjs} +4 -4
  222. package/dist/src/{server-BC7XJFgr.js → server-CP9qKM40.js} +4 -4
  223. package/dist/src/{server-OAs3nBRT.js → server-Cns05F1j.js} +5 -5
  224. package/dist/src/server-DJTKu9IR.cjs +5 -0
  225. package/dist/src/{server-DbFphssR.js → server-DZ9MtCn0.js} +6 -6
  226. package/dist/src/{signal-BOTbd53Z.js → signal-C3ZTsUgi.js} +3 -3
  227. package/dist/src/{slack-DXMKtA-f.js → slack-2sdpGzbt.js} +2 -2
  228. package/dist/src/{slack-BmVAVGaK.cjs → slack-94iG3T0s.cjs} +2 -2
  229. package/dist/src/{slack-DCUPTzS2.js → slack-BR0HtO3K.js} +2 -2
  230. package/dist/src/{slack-DOdy_kyv.js → slack-DCEV-vWP.js} +2 -2
  231. package/dist/src/store-C5u6MgC8.js +6 -0
  232. package/dist/src/{store-BSc-TF2w.cjs → store-CLyU7AtI.cjs} +17 -5
  233. package/dist/src/store-CNHk-De4.cjs +5 -0
  234. package/dist/src/{store-DQLEjuEO.js → store-Cj258DgL.js} +17 -5
  235. package/dist/src/{store-D1tv90v3.js → store-P8OKm19S.js} +17 -5
  236. package/dist/src/{store-Ub2vaGJ1.js → store-VB0GP46K.js} +17 -5
  237. package/dist/src/{tables-xKANLRBD.js → tables-BEIFz2tM.js} +3 -3
  238. package/dist/src/{tables-C7K-XKWp.cjs → tables-BdZQEpRz.cjs} +3 -3
  239. package/dist/src/{tables-D36WTqKX.js → tables-DmzvLbeZ.js} +3 -3
  240. package/dist/src/{tables-5EvT_Bwn.js → tables-kC7R5kiK.js} +3 -3
  241. package/dist/src/{telemetry-C2YDkUQH.js → telemetry-BnH5VJAU.js} +4 -4
  242. package/dist/src/{telemetry-C15ziL8u.js → telemetry-BugWqKiu.js} +4 -4
  243. package/dist/src/{telemetry-DMb2Mpfm.js → telemetry-DPXLd7UE.js} +4 -4
  244. package/dist/src/telemetry-Yig0Tino.js +7 -0
  245. package/dist/src/telemetry-p8Pwqm1i.cjs +5 -0
  246. package/dist/src/{telemetry-CbrnxHp_.cjs → telemetry-re627Lre.cjs} +4 -4
  247. package/dist/src/{transcription-CL78qbOU.cjs → transcription-BvtsrzRG.cjs} +13 -13
  248. package/dist/src/{transcription-DAtxHhAM.js → transcription-CaMivnjG.js} +13 -13
  249. package/dist/src/{transcription-QHh3AH6Z.js → transcription-DOMMTu01.js} +14 -14
  250. package/dist/src/{transcription-LNZTNUUL.js → transcription-Hb3VnC4M.js} +13 -13
  251. package/dist/src/{transform-DOcQeLld.cjs → transform-0BwoBsvO.cjs} +19 -5
  252. package/dist/src/{transform-DGxXocjk.js → transform-B2-jIv68.js} +8 -6
  253. package/dist/src/{transform-DECvGmzp.js → transform-BqPkNPYm.js} +4 -4
  254. package/dist/src/{transform-aa6tmVpZ.js → transform-BzK09Q_9.js} +4 -4
  255. package/dist/src/transform-ChNIpHz7.js +6 -0
  256. package/dist/src/{transform-Cgi24fJ7.js → transform-DrleutM3.js} +8 -6
  257. package/dist/src/{transform-DGLazrMm.js → transform-DyDAwEpE.js} +8 -6
  258. package/dist/src/transform-PtQ6rAE3.cjs +5 -0
  259. package/dist/src/{transform-CzK1Q0zl.cjs → transform-ZrG2dvlo.cjs} +4 -4
  260. package/dist/src/{transform-DilY9wbS.js → transform-ljLYHEPh.js} +4 -4
  261. package/dist/src/{transformersAvailability-CEVM2GNQ.js → transformersAvailability-BGkzavwb.js} +1 -1
  262. package/dist/src/{transformersAvailability-CwayUSlh.cjs → transformersAvailability-DKoRtQLy.cjs} +1 -1
  263. package/dist/src/{types-CH3Ge2sE.js → types-CIhFeUC4.js} +45 -11
  264. package/dist/src/{types-CN_TZ2GJ.js → types-Cd3ygw8W.js} +45 -11
  265. package/dist/src/{types-LJ0r3wbR.cjs → types-D8cGDZbL.cjs} +46 -12
  266. package/dist/src/{types-CLKiCBW3.js → types-q8GXGF65.js} +45 -11
  267. package/dist/src/{util-CchiqXh_.cjs → util--9u9UVCt.cjs} +3 -3
  268. package/dist/src/{util-5cB-L7U3.js → util-BLvy9qfE.js} +7 -11
  269. package/dist/src/{util-YT5HPZaS.js → util-Bm3E9jpK.js} +7 -11
  270. package/dist/src/{util-6-GqIvzS.js → util-BtoGs5Cb.js} +18 -4
  271. package/dist/src/{util-Db0a0AFH.cjs → util-CFj4YKIn.cjs} +18 -4
  272. package/dist/src/{util-Dlz_Wvgm.js → util-CMMkIxfU.js} +7 -11
  273. package/dist/src/{util-Betm42rL.js → util-CgDCK4KI.js} +18 -4
  274. package/dist/src/{util-Yz-1aEhW.cjs → util-CuLo2pMR.cjs} +7 -11
  275. package/dist/src/{util-C-PPYSMq.js → util-DM2rTn_6.js} +18 -4
  276. package/dist/src/{util-B7T3SiBS.js → util-DMFeUvLz.js} +3 -3
  277. package/dist/src/{util-ZZH-3QZz.js → util-DbVG-yZU.js} +3 -3
  278. package/dist/src/{util-DaWTWKBK.js → util-vNmDL5DT.js} +3 -3
  279. package/dist/src/{utils-XiOAgly5.js → utils-CFxO9KGo.js} +2 -2
  280. package/dist/src/{utils-f2-Moju7.js → utils-DEuL4VNB.js} +2 -2
  281. package/dist/src/{utils-Cz9qXqII.cjs → utils-DKw8mrgr.cjs} +3 -3
  282. package/dist/src/{utils-dLokC-eR.js → utils-DOjD4dTC.js} +2 -2
  283. package/dist/tsconfig.tsbuildinfo +1 -1
  284. package/package.json +38 -38
  285. package/dist/src/app/assets/index-BFCZg7hQ.js +0 -439
  286. package/dist/src/app/assets/index-NCn4eVBv.css +0 -1
  287. package/dist/src/app/assets/sync-9qqYcY-B.js +0 -4
  288. package/dist/src/app/assets/vendor-charts-CCl15Imd.js +0 -36
  289. package/dist/src/app/assets/vendor-markdown-0tekx3KX.js +0 -29
  290. package/dist/src/cache-Bbn1Nyrd.cjs +0 -5
  291. package/dist/src/cache-BwsMSda7.js +0 -6
  292. package/dist/src/cloud-DmE0EwsY.js +0 -4
  293. package/dist/src/eval-17JizQIv.js +0 -15
  294. package/dist/src/evalResult-Cqj8pldJ.js +0 -12
  295. package/dist/src/evalResult-DvcJAWJU.cjs +0 -10
  296. package/dist/src/evalResult-Hftn-S_i.js +0 -10
  297. package/dist/src/evaluator-B2CFNt-P.js +0 -36
  298. package/dist/src/fetch-KV5kNASw.js +0 -5
  299. package/dist/src/graders-Bu0H9nXi.js +0 -32
  300. package/dist/src/graders-Cfhkvx-e.js +0 -34
  301. package/dist/src/graders-DClJVpGP.cjs +0 -32
  302. package/dist/src/graders-DcnJsrMO.js +0 -32
  303. package/dist/src/providers-C1rOSHiR.js +0 -32
  304. package/dist/src/providers-CxmDwEFf.cjs +0 -31
  305. package/dist/src/providers-Dodakqr0.js +0 -30
  306. package/dist/src/providers-GIQ2TcsA.js +0 -30
  307. package/dist/src/rubyUtils-BUHu6PhO.js +0 -5
  308. package/dist/src/rubyUtils-CP42kMvq.cjs +0 -4
  309. package/dist/src/server-B1vi21hA.js +0 -7
  310. package/dist/src/server-Cm9Kai_h.cjs +0 -5
  311. package/dist/src/store-BNmZ1KAz.cjs +0 -5
  312. package/dist/src/store-BltJg2cd.js +0 -6
  313. package/dist/src/telemetry-5BCRNBbe.cjs +0 -5
  314. package/dist/src/telemetry-D4W5hboe.js +0 -7
  315. package/dist/src/transform-DTGDnAzW.js +0 -6
  316. package/dist/src/transform-m3qNw4KP.cjs +0 -5
@@ -1,5 +1,5 @@
1
- import { b as getEnvString, i as logger, w as state } from "./logger-CT3IKMKA.js";
2
- import { i as resolvePackageEntryPoint, r as importModule } from "./esm-Cd1AjG1D.js";
1
+ import { C as getEnvString, D as state, a as logger, c as REDACTED, l as normalizeFieldName, u as sanitizeObject } from "./logger-DO8_zM18.js";
2
+ import { i as resolvePackageEntryPoint, r as importModule } from "./esm-SUNIX1x3.js";
3
3
  import { n as withGenAISpan, t as getTraceparent } from "./genaiTracer-D3fD9dNV.js";
4
4
  import fs from "fs";
5
5
  import path from "path";
@@ -7,12 +7,43 @@ import dedent from "dedent";
7
7
  import crypto from "crypto";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
9
9
  //#region src/providers/openai/codex-sdk.ts
10
+ const MINIMAL_CLI_ENV_KEYS = [
11
+ "PATH",
12
+ "Path",
13
+ "HOME",
14
+ "USER",
15
+ "USERNAME",
16
+ "USERPROFILE",
17
+ "TMPDIR",
18
+ "TMP",
19
+ "TEMP",
20
+ "SHELL",
21
+ "COMSPEC",
22
+ "SystemRoot",
23
+ "PATHEXT",
24
+ "LANG",
25
+ "LC_ALL",
26
+ "TERM"
27
+ ];
28
+ function getMinimalProcessEnv() {
29
+ const env = {};
30
+ for (const key of MINIMAL_CLI_ENV_KEYS) {
31
+ const value = process.env[key];
32
+ if (typeof value === "string" && value.length > 0) env[key] = value;
33
+ }
34
+ return env;
35
+ }
10
36
  /**
11
37
  * Helper to load the OpenAI Codex SDK ESM module
12
38
  * Uses resolvePackageEntryPoint to handle ESM-only packages with restrictive exports
13
39
  */
14
40
  async function loadCodexSDK() {
15
- const codexPath = resolvePackageEntryPoint("@openai/codex-sdk", state.basePath && path.isAbsolute(state.basePath) ? state.basePath : process.cwd());
41
+ const basePaths = [state.basePath && path.isAbsolute(state.basePath) ? state.basePath : void 0, process.cwd()].filter((candidate) => Boolean(candidate));
42
+ let codexPath = null;
43
+ for (const basePath of new Set(basePaths)) {
44
+ codexPath = resolvePackageEntryPoint("@openai/codex-sdk", basePath);
45
+ if (codexPath) break;
46
+ }
16
47
  if (!codexPath) throw new Error(dedent`The @openai/codex-sdk package is required but not installed.
17
48
 
18
49
  To use the OpenAI Codex SDK provider, install it with:
@@ -163,7 +194,10 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
163
194
  }
164
195
  }
165
196
  prepareEnvironment(config, traceparent) {
166
- const env = config.cli_env ? { ...config.cli_env } : { ...process.env };
197
+ const env = {
198
+ ...config.cli_env === void 0 || config.inherit_process_env === true ? process.env : getMinimalProcessEnv(),
199
+ ...config.cli_env ?? {}
200
+ };
167
201
  const sortedEnv = {};
168
202
  for (const key of Object.keys(env).sort()) if (env[key] !== void 0) sortedEnv[key] = env[key];
169
203
  if (this.apiKey) {
@@ -192,6 +226,83 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
192
226
  } else delete sortedEnv.TRACEPARENT;
193
227
  return sortedEnv;
194
228
  }
229
+ getSkillRootPrefixes(env) {
230
+ const prefixes = /* @__PURE__ */ new Set();
231
+ const addPrefix = (candidate) => {
232
+ if (!candidate) return;
233
+ const normalized = candidate.replace(/\\/g, "/").replace(/\/+$/g, "");
234
+ if (normalized) prefixes.add(normalized);
235
+ };
236
+ addPrefix(env.CODEX_HOME);
237
+ addPrefix("/etc/codex");
238
+ const homeDir = env.HOME || process.env.HOME;
239
+ if (homeDir) addPrefix(path.posix.join(homeDir.replace(/\\/g, "/"), ".codex"));
240
+ return Array.from(prefixes);
241
+ }
242
+ isValidCodexSkillName(name) {
243
+ return /^[A-Za-z0-9._:-]+$/.test(name);
244
+ }
245
+ extractSkillPathCandidates(text, skillRootPrefixes = []) {
246
+ const matches = /* @__PURE__ */ new Map();
247
+ for (const rawToken of text.split(/\s+/)) {
248
+ const token = rawToken.replace(/^[`"'([{<]+|[`"',;:)\]}>]+$/g, "").trim();
249
+ if (!token) continue;
250
+ const normalizedPath = token.replace(/\\/g, "/");
251
+ const repoMatch = normalizedPath.match(/^\.agents\/skills\/([^/\s]+)\/SKILL\.md$/);
252
+ if (repoMatch) {
253
+ if (this.isValidCodexSkillName(repoMatch[1])) matches.set(normalizedPath, {
254
+ name: repoMatch[1],
255
+ path: normalizedPath
256
+ });
257
+ continue;
258
+ }
259
+ const matchingRoot = skillRootPrefixes.find((prefix) => normalizedPath.startsWith(`${prefix}/skills/`));
260
+ if (!matchingRoot) continue;
261
+ const customRootMatch = normalizedPath.slice(matchingRoot.length + 1).match(/^skills\/([^/\s]+)\/SKILL\.md$/);
262
+ if (customRootMatch && this.isValidCodexSkillName(customRootMatch[1])) matches.set(normalizedPath, {
263
+ name: customRootMatch[1],
264
+ path: normalizedPath
265
+ });
266
+ }
267
+ return Array.from(matches.values());
268
+ }
269
+ extractSkillCallsFromItems(items, skillRootPrefixes = [], options = {}) {
270
+ const skillCalls = /* @__PURE__ */ new Map();
271
+ for (const item of items) {
272
+ if (item?.type !== "command_execution") continue;
273
+ if (options.requireSuccessfulCommand && !this.isSuccessfulCommandExecution(item)) continue;
274
+ const command = typeof item.command === "string" && item.command.trim() ? item.command : void 0;
275
+ if (!command) continue;
276
+ for (const skillPath of this.extractSkillPathCandidates(command, skillRootPrefixes)) {
277
+ const existing = skillCalls.get(skillPath.path) ?? {
278
+ name: skillPath.name,
279
+ path: skillPath.path
280
+ };
281
+ skillCalls.set(skillPath.path, existing);
282
+ }
283
+ }
284
+ return Array.from(skillCalls.values()).map((skillCall) => ({
285
+ name: skillCall.name,
286
+ path: skillCall.path,
287
+ source: "heuristic"
288
+ }));
289
+ }
290
+ buildSkillMetadata(items, skillRootPrefixes = []) {
291
+ if (!Array.isArray(items) || items.length === 0) return;
292
+ const attemptedSkillCalls = this.extractSkillCallsFromItems(items, skillRootPrefixes);
293
+ const skillCalls = this.extractSkillCallsFromItems(items, skillRootPrefixes, { requireSuccessfulCommand: true });
294
+ if (skillCalls.length === 0 && attemptedSkillCalls.length <= skillCalls.length) return;
295
+ return {
296
+ attemptedSkillCalls,
297
+ skillCalls
298
+ };
299
+ }
300
+ isSuccessfulCommandExecution(item) {
301
+ if (item?.type !== "command_execution") return false;
302
+ if (typeof item.status === "string" && item.status !== "completed") return false;
303
+ if (typeof item.exit_code === "number" && item.exit_code !== 0) return false;
304
+ return true;
305
+ }
195
306
  validateWorkingDirectory(workingDir, skipGitCheck = false) {
196
307
  let stats;
197
308
  try {
@@ -230,7 +341,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
230
341
  ...config.additional_directories?.length ? { additionalDirectories: config.additional_directories } : {},
231
342
  ...config.sandbox_mode ? { sandboxMode: config.sandbox_mode } : {},
232
343
  ...config.model_reasoning_effort ? { modelReasoningEffort: config.model_reasoning_effort } : {},
233
- ...config.network_access_enabled !== void 0 ? { networkAccessEnabled: config.network_access_enabled } : {},
344
+ ...config.network_access_enabled === void 0 ? {} : { networkAccessEnabled: config.network_access_enabled },
234
345
  ...config.web_search_mode ? { webSearchMode: config.web_search_mode } : {},
235
346
  ...config.web_search_enabled !== void 0 && !config.web_search_mode ? { webSearchEnabled: config.web_search_enabled } : {},
236
347
  ...config.approval_policy ? { approvalPolicy: config.approval_policy } : {}
@@ -259,7 +370,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
259
370
  if (config.persist_threads && cacheKey) this.threads.set(cacheKey, thread);
260
371
  return thread;
261
372
  }
262
- async runStreaming(thread, prompt, runOptions, callOptions) {
373
+ async runStreaming(thread, prompt, runOptions, callOptions, skillRootPrefixes = []) {
263
374
  const { events } = await thread.runStreamed(prompt, runOptions);
264
375
  const items = [];
265
376
  let usage = void 0;
@@ -338,7 +449,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
338
449
  }
339
450
  });
340
451
  }
341
- const completionAttrs = this.getCompletionAttributesForItem(item);
452
+ const completionAttrs = this.getCompletionAttributesForItem(item, skillRootPrefixes);
342
453
  for (const [key, value] of Object.entries(completionAttrs)) span.setAttribute(key, value);
343
454
  const durationMs = eventTime - (itemStartTimes.get(itemId) || lastEventTime);
344
455
  span.setAttribute("codex.duration_ms", durationMs);
@@ -367,7 +478,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
367
478
  const itemId = String(item.id);
368
479
  const span = activeSpans.get(itemId);
369
480
  if (span) {
370
- const updatedAttrs = this.getCompletionAttributesForItem(item);
481
+ const updatedAttrs = this.getCompletionAttributesForItem(item, skillRootPrefixes);
371
482
  for (const [key, value] of Object.entries(updatedAttrs)) span.setAttribute(key, value);
372
483
  }
373
484
  }
@@ -434,6 +545,25 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
434
545
  /**
435
546
  * Get attributes for a Codex item at start
436
547
  */
548
+ getSkillTraceAttributes(item, skillRootPrefixes = [], options = {}) {
549
+ if (item?.type !== "command_execution") return {};
550
+ if (options.requireSuccessfulCommand && !this.isSuccessfulCommandExecution(item)) return {};
551
+ const command = typeof item.command === "string" && item.command.trim() ? item.command : void 0;
552
+ const skillCandidates = /* @__PURE__ */ new Map();
553
+ if (command) for (const skill of this.extractSkillPathCandidates(command, skillRootPrefixes)) skillCandidates.set(skill.path, skill);
554
+ if (skillCandidates.size === 0) return {};
555
+ const skills = Array.from(skillCandidates.values());
556
+ const attrs = {
557
+ "promptfoo.skill.count": skills.length,
558
+ "promptfoo.skill.names": skills.map((skill) => skill.name).join(","),
559
+ "promptfoo.skill.paths": skills.map((skill) => skill.path).join(",")
560
+ };
561
+ if (skills.length === 1) {
562
+ attrs["promptfoo.skill.name"] = skills[0].name;
563
+ attrs["promptfoo.skill.path"] = skills[0].path;
564
+ }
565
+ return attrs;
566
+ }
437
567
  getAttributesForItem(item) {
438
568
  const attrs = {};
439
569
  switch (item.type) {
@@ -443,6 +573,10 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
443
573
  case "mcp_tool_call":
444
574
  if (typeof item.server === "string") attrs["codex.mcp.server"] = item.server;
445
575
  if (typeof item.tool === "string") attrs["codex.mcp.tool"] = item.tool;
576
+ {
577
+ const serializedArgs = this.serializeItemValue(item.arguments ?? item.args ?? item.input);
578
+ if (serializedArgs) attrs["codex.mcp.input"] = serializedArgs;
579
+ }
446
580
  break;
447
581
  case "web_search":
448
582
  if (typeof item.query === "string") attrs["codex.search.query"] = item.query;
@@ -461,16 +595,40 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
461
595
  }
462
596
  return attrs;
463
597
  }
598
+ serializeItemValue(value) {
599
+ if (typeof value === "string") {
600
+ const trimmed = value.trim();
601
+ if (!trimmed) return;
602
+ try {
603
+ return JSON.stringify(this.redactTracePii(sanitizeObject(JSON.parse(trimmed))));
604
+ } catch {
605
+ return this.redactTracePii(sanitizeObject(trimmed, { context: "Codex MCP trace input" }));
606
+ }
607
+ }
608
+ if (value === void 0 || value === null) return;
609
+ try {
610
+ return JSON.stringify(this.redactTracePii(sanitizeObject(value, { context: "Codex MCP trace input" })));
611
+ } catch {
612
+ return;
613
+ }
614
+ }
615
+ redactTracePii(value) {
616
+ if (typeof value === "string" && /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i.test(value)) return REDACTED;
617
+ if (Array.isArray(value)) return value.map((item) => this.redactTracePii(item));
618
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [key, normalizeFieldName(key).includes("email") ? REDACTED : this.redactTracePii(entryValue)]));
619
+ return value;
620
+ }
464
621
  /**
465
622
  * Get attributes for a Codex item at completion
466
623
  */
467
- getCompletionAttributesForItem(item) {
624
+ getCompletionAttributesForItem(item, skillRootPrefixes = []) {
468
625
  const attrs = {};
469
626
  switch (item.type) {
470
627
  case "command_execution":
471
628
  if (typeof item.exit_code === "number") attrs["codex.exit_code"] = item.exit_code;
472
629
  if (typeof item.status === "string") attrs["codex.status"] = item.status;
473
630
  if (typeof item.aggregated_output === "string") attrs["codex.output"] = item.aggregated_output;
631
+ Object.assign(attrs, this.getSkillTraceAttributes(item, skillRootPrefixes, { requireSuccessfulCommand: true }));
474
632
  break;
475
633
  case "file_change":
476
634
  if (typeof item.status === "string") attrs["codex.status"] = item.status;
@@ -482,6 +640,10 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
482
640
  case "mcp_tool_call":
483
641
  if (typeof item.status === "string") attrs["codex.status"] = item.status;
484
642
  if (typeof item.error?.message === "string") attrs["codex.error"] = item.error.message;
643
+ {
644
+ const serializedArgs = this.serializeItemValue(item.arguments ?? item.args ?? item.input);
645
+ if (serializedArgs) attrs["codex.mcp.input"] = serializedArgs;
646
+ }
485
647
  break;
486
648
  case "agent_message":
487
649
  if (typeof item.text === "string") attrs["codex.message"] = item.text;
@@ -571,6 +733,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
571
733
  async callApiInternal(prompt, _context, callOptions, config) {
572
734
  const currentTraceparent = getTraceparent();
573
735
  const env = this.prepareEnvironment(config, currentTraceparent);
736
+ const skillRootPrefixes = this.getSkillRootPrefixes(env);
574
737
  if (!this.apiKey && !env.OPENAI_API_KEY && !env.CODEX_API_KEY) throw new Error("OpenAI API key is not set. Set OPENAI_API_KEY or CODEX_API_KEY environment variable or add \"apiKey\" to provider config.");
575
738
  if (config.working_dir) this.validateWorkingDirectory(config.working_dir, config.skip_git_repo_check);
576
739
  if (callOptions?.abortSignal?.aborted) return { error: "OpenAI Codex SDK call aborted before it started" };
@@ -610,9 +773,14 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
610
773
  if (config.output_schema) runOptions.outputSchema = config.output_schema;
611
774
  if (callOptions?.abortSignal) runOptions.signal = callOptions.abortSignal;
612
775
  try {
613
- const turn = config.enable_streaming ? await this.runStreaming(thread, prompt, runOptions, callOptions) : await thread.run(prompt, runOptions);
776
+ const turn = config.enable_streaming ? await this.runStreaming(thread, prompt, runOptions, callOptions, skillRootPrefixes) : await thread.run(prompt, runOptions);
614
777
  const output = turn.finalResponse || "";
615
778
  const raw = JSON.stringify(turn);
779
+ const skillMetadata = this.buildSkillMetadata(turn.items, skillRootPrefixes);
780
+ const metadata = skillMetadata ? {
781
+ ...skillMetadata.skillCalls.length > 0 ? { skillCalls: skillMetadata.skillCalls } : {},
782
+ ...skillMetadata.attemptedSkillCalls.length > skillMetadata.skillCalls.length ? { attemptedSkillCalls: skillMetadata.attemptedSkillCalls } : {}
783
+ } : void 0;
616
784
  const tokenUsage = turn.usage ? {
617
785
  prompt: turn.usage.input_tokens,
618
786
  completion: turn.usage.output_tokens,
@@ -638,6 +806,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
638
806
  output,
639
807
  tokenUsage,
640
808
  cost,
809
+ metadata,
641
810
  raw,
642
811
  sessionId: thread.id || "unknown"
643
812
  };
@@ -662,4 +831,4 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
662
831
  //#endregion
663
832
  export { OpenAICodexSDKProvider };
664
833
 
665
- //# sourceMappingURL=codex-sdk-C6UMlxwV.js.map
834
+ //# sourceMappingURL=codex-sdk-C_07GuVS.js.map
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { C as getEnvString, O as state, o as logger } from "./logger-KkObSCzq.js";
3
- import { i as resolvePackageEntryPoint, r as importModule } from "./esm-C03C-mv3.js";
2
+ import { E as getEnvString, d as normalizeFieldName, f as sanitizeObject, j as state, s as logger, u as REDACTED } from "./logger-BcJBzSSA.js";
3
+ import { i as resolvePackageEntryPoint, r as importModule } from "./esm-7UIl0pPM.js";
4
4
  import { n as withGenAISpan, t as getTraceparent } from "./genaiTracer-C1rxGO8Q.js";
5
5
  import fs from "fs";
6
6
  import path from "path";
@@ -8,12 +8,43 @@ import dedent from "dedent";
8
8
  import crypto from "crypto";
9
9
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
10
10
  //#region src/providers/openai/codex-sdk.ts
11
+ const MINIMAL_CLI_ENV_KEYS = [
12
+ "PATH",
13
+ "Path",
14
+ "HOME",
15
+ "USER",
16
+ "USERNAME",
17
+ "USERPROFILE",
18
+ "TMPDIR",
19
+ "TMP",
20
+ "TEMP",
21
+ "SHELL",
22
+ "COMSPEC",
23
+ "SystemRoot",
24
+ "PATHEXT",
25
+ "LANG",
26
+ "LC_ALL",
27
+ "TERM"
28
+ ];
29
+ function getMinimalProcessEnv() {
30
+ const env = {};
31
+ for (const key of MINIMAL_CLI_ENV_KEYS) {
32
+ const value = process.env[key];
33
+ if (typeof value === "string" && value.length > 0) env[key] = value;
34
+ }
35
+ return env;
36
+ }
11
37
  /**
12
38
  * Helper to load the OpenAI Codex SDK ESM module
13
39
  * Uses resolvePackageEntryPoint to handle ESM-only packages with restrictive exports
14
40
  */
15
41
  async function loadCodexSDK() {
16
- const codexPath = resolvePackageEntryPoint("@openai/codex-sdk", state.basePath && path.isAbsolute(state.basePath) ? state.basePath : process.cwd());
42
+ const basePaths = [state.basePath && path.isAbsolute(state.basePath) ? state.basePath : void 0, process.cwd()].filter((candidate) => Boolean(candidate));
43
+ let codexPath = null;
44
+ for (const basePath of new Set(basePaths)) {
45
+ codexPath = resolvePackageEntryPoint("@openai/codex-sdk", basePath);
46
+ if (codexPath) break;
47
+ }
17
48
  if (!codexPath) throw new Error(dedent`The @openai/codex-sdk package is required but not installed.
18
49
 
19
50
  To use the OpenAI Codex SDK provider, install it with:
@@ -164,7 +195,10 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
164
195
  }
165
196
  }
166
197
  prepareEnvironment(config, traceparent) {
167
- const env = config.cli_env ? { ...config.cli_env } : { ...process.env };
198
+ const env = {
199
+ ...config.cli_env === void 0 || config.inherit_process_env === true ? process.env : getMinimalProcessEnv(),
200
+ ...config.cli_env ?? {}
201
+ };
168
202
  const sortedEnv = {};
169
203
  for (const key of Object.keys(env).sort()) if (env[key] !== void 0) sortedEnv[key] = env[key];
170
204
  if (this.apiKey) {
@@ -193,6 +227,83 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
193
227
  } else delete sortedEnv.TRACEPARENT;
194
228
  return sortedEnv;
195
229
  }
230
+ getSkillRootPrefixes(env) {
231
+ const prefixes = /* @__PURE__ */ new Set();
232
+ const addPrefix = (candidate) => {
233
+ if (!candidate) return;
234
+ const normalized = candidate.replace(/\\/g, "/").replace(/\/+$/g, "");
235
+ if (normalized) prefixes.add(normalized);
236
+ };
237
+ addPrefix(env.CODEX_HOME);
238
+ addPrefix("/etc/codex");
239
+ const homeDir = env.HOME || process.env.HOME;
240
+ if (homeDir) addPrefix(path.posix.join(homeDir.replace(/\\/g, "/"), ".codex"));
241
+ return Array.from(prefixes);
242
+ }
243
+ isValidCodexSkillName(name) {
244
+ return /^[A-Za-z0-9._:-]+$/.test(name);
245
+ }
246
+ extractSkillPathCandidates(text, skillRootPrefixes = []) {
247
+ const matches = /* @__PURE__ */ new Map();
248
+ for (const rawToken of text.split(/\s+/)) {
249
+ const token = rawToken.replace(/^[`"'([{<]+|[`"',;:)\]}>]+$/g, "").trim();
250
+ if (!token) continue;
251
+ const normalizedPath = token.replace(/\\/g, "/");
252
+ const repoMatch = normalizedPath.match(/^\.agents\/skills\/([^/\s]+)\/SKILL\.md$/);
253
+ if (repoMatch) {
254
+ if (this.isValidCodexSkillName(repoMatch[1])) matches.set(normalizedPath, {
255
+ name: repoMatch[1],
256
+ path: normalizedPath
257
+ });
258
+ continue;
259
+ }
260
+ const matchingRoot = skillRootPrefixes.find((prefix) => normalizedPath.startsWith(`${prefix}/skills/`));
261
+ if (!matchingRoot) continue;
262
+ const customRootMatch = normalizedPath.slice(matchingRoot.length + 1).match(/^skills\/([^/\s]+)\/SKILL\.md$/);
263
+ if (customRootMatch && this.isValidCodexSkillName(customRootMatch[1])) matches.set(normalizedPath, {
264
+ name: customRootMatch[1],
265
+ path: normalizedPath
266
+ });
267
+ }
268
+ return Array.from(matches.values());
269
+ }
270
+ extractSkillCallsFromItems(items, skillRootPrefixes = [], options = {}) {
271
+ const skillCalls = /* @__PURE__ */ new Map();
272
+ for (const item of items) {
273
+ if (item?.type !== "command_execution") continue;
274
+ if (options.requireSuccessfulCommand && !this.isSuccessfulCommandExecution(item)) continue;
275
+ const command = typeof item.command === "string" && item.command.trim() ? item.command : void 0;
276
+ if (!command) continue;
277
+ for (const skillPath of this.extractSkillPathCandidates(command, skillRootPrefixes)) {
278
+ const existing = skillCalls.get(skillPath.path) ?? {
279
+ name: skillPath.name,
280
+ path: skillPath.path
281
+ };
282
+ skillCalls.set(skillPath.path, existing);
283
+ }
284
+ }
285
+ return Array.from(skillCalls.values()).map((skillCall) => ({
286
+ name: skillCall.name,
287
+ path: skillCall.path,
288
+ source: "heuristic"
289
+ }));
290
+ }
291
+ buildSkillMetadata(items, skillRootPrefixes = []) {
292
+ if (!Array.isArray(items) || items.length === 0) return;
293
+ const attemptedSkillCalls = this.extractSkillCallsFromItems(items, skillRootPrefixes);
294
+ const skillCalls = this.extractSkillCallsFromItems(items, skillRootPrefixes, { requireSuccessfulCommand: true });
295
+ if (skillCalls.length === 0 && attemptedSkillCalls.length <= skillCalls.length) return;
296
+ return {
297
+ attemptedSkillCalls,
298
+ skillCalls
299
+ };
300
+ }
301
+ isSuccessfulCommandExecution(item) {
302
+ if (item?.type !== "command_execution") return false;
303
+ if (typeof item.status === "string" && item.status !== "completed") return false;
304
+ if (typeof item.exit_code === "number" && item.exit_code !== 0) return false;
305
+ return true;
306
+ }
196
307
  validateWorkingDirectory(workingDir, skipGitCheck = false) {
197
308
  let stats;
198
309
  try {
@@ -231,7 +342,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
231
342
  ...config.additional_directories?.length ? { additionalDirectories: config.additional_directories } : {},
232
343
  ...config.sandbox_mode ? { sandboxMode: config.sandbox_mode } : {},
233
344
  ...config.model_reasoning_effort ? { modelReasoningEffort: config.model_reasoning_effort } : {},
234
- ...config.network_access_enabled !== void 0 ? { networkAccessEnabled: config.network_access_enabled } : {},
345
+ ...config.network_access_enabled === void 0 ? {} : { networkAccessEnabled: config.network_access_enabled },
235
346
  ...config.web_search_mode ? { webSearchMode: config.web_search_mode } : {},
236
347
  ...config.web_search_enabled !== void 0 && !config.web_search_mode ? { webSearchEnabled: config.web_search_enabled } : {},
237
348
  ...config.approval_policy ? { approvalPolicy: config.approval_policy } : {}
@@ -260,7 +371,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
260
371
  if (config.persist_threads && cacheKey) this.threads.set(cacheKey, thread);
261
372
  return thread;
262
373
  }
263
- async runStreaming(thread, prompt, runOptions, callOptions) {
374
+ async runStreaming(thread, prompt, runOptions, callOptions, skillRootPrefixes = []) {
264
375
  const { events } = await thread.runStreamed(prompt, runOptions);
265
376
  const items = [];
266
377
  let usage = void 0;
@@ -339,7 +450,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
339
450
  }
340
451
  });
341
452
  }
342
- const completionAttrs = this.getCompletionAttributesForItem(item);
453
+ const completionAttrs = this.getCompletionAttributesForItem(item, skillRootPrefixes);
343
454
  for (const [key, value] of Object.entries(completionAttrs)) span.setAttribute(key, value);
344
455
  const durationMs = eventTime - (itemStartTimes.get(itemId) || lastEventTime);
345
456
  span.setAttribute("codex.duration_ms", durationMs);
@@ -368,7 +479,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
368
479
  const itemId = String(item.id);
369
480
  const span = activeSpans.get(itemId);
370
481
  if (span) {
371
- const updatedAttrs = this.getCompletionAttributesForItem(item);
482
+ const updatedAttrs = this.getCompletionAttributesForItem(item, skillRootPrefixes);
372
483
  for (const [key, value] of Object.entries(updatedAttrs)) span.setAttribute(key, value);
373
484
  }
374
485
  }
@@ -435,6 +546,25 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
435
546
  /**
436
547
  * Get attributes for a Codex item at start
437
548
  */
549
+ getSkillTraceAttributes(item, skillRootPrefixes = [], options = {}) {
550
+ if (item?.type !== "command_execution") return {};
551
+ if (options.requireSuccessfulCommand && !this.isSuccessfulCommandExecution(item)) return {};
552
+ const command = typeof item.command === "string" && item.command.trim() ? item.command : void 0;
553
+ const skillCandidates = /* @__PURE__ */ new Map();
554
+ if (command) for (const skill of this.extractSkillPathCandidates(command, skillRootPrefixes)) skillCandidates.set(skill.path, skill);
555
+ if (skillCandidates.size === 0) return {};
556
+ const skills = Array.from(skillCandidates.values());
557
+ const attrs = {
558
+ "promptfoo.skill.count": skills.length,
559
+ "promptfoo.skill.names": skills.map((skill) => skill.name).join(","),
560
+ "promptfoo.skill.paths": skills.map((skill) => skill.path).join(",")
561
+ };
562
+ if (skills.length === 1) {
563
+ attrs["promptfoo.skill.name"] = skills[0].name;
564
+ attrs["promptfoo.skill.path"] = skills[0].path;
565
+ }
566
+ return attrs;
567
+ }
438
568
  getAttributesForItem(item) {
439
569
  const attrs = {};
440
570
  switch (item.type) {
@@ -444,6 +574,10 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
444
574
  case "mcp_tool_call":
445
575
  if (typeof item.server === "string") attrs["codex.mcp.server"] = item.server;
446
576
  if (typeof item.tool === "string") attrs["codex.mcp.tool"] = item.tool;
577
+ {
578
+ const serializedArgs = this.serializeItemValue(item.arguments ?? item.args ?? item.input);
579
+ if (serializedArgs) attrs["codex.mcp.input"] = serializedArgs;
580
+ }
447
581
  break;
448
582
  case "web_search":
449
583
  if (typeof item.query === "string") attrs["codex.search.query"] = item.query;
@@ -462,16 +596,40 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
462
596
  }
463
597
  return attrs;
464
598
  }
599
+ serializeItemValue(value) {
600
+ if (typeof value === "string") {
601
+ const trimmed = value.trim();
602
+ if (!trimmed) return;
603
+ try {
604
+ return JSON.stringify(this.redactTracePii(sanitizeObject(JSON.parse(trimmed))));
605
+ } catch {
606
+ return this.redactTracePii(sanitizeObject(trimmed, { context: "Codex MCP trace input" }));
607
+ }
608
+ }
609
+ if (value === void 0 || value === null) return;
610
+ try {
611
+ return JSON.stringify(this.redactTracePii(sanitizeObject(value, { context: "Codex MCP trace input" })));
612
+ } catch {
613
+ return;
614
+ }
615
+ }
616
+ redactTracePii(value) {
617
+ if (typeof value === "string" && /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i.test(value)) return REDACTED;
618
+ if (Array.isArray(value)) return value.map((item) => this.redactTracePii(item));
619
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([key, entryValue]) => [key, normalizeFieldName(key).includes("email") ? REDACTED : this.redactTracePii(entryValue)]));
620
+ return value;
621
+ }
465
622
  /**
466
623
  * Get attributes for a Codex item at completion
467
624
  */
468
- getCompletionAttributesForItem(item) {
625
+ getCompletionAttributesForItem(item, skillRootPrefixes = []) {
469
626
  const attrs = {};
470
627
  switch (item.type) {
471
628
  case "command_execution":
472
629
  if (typeof item.exit_code === "number") attrs["codex.exit_code"] = item.exit_code;
473
630
  if (typeof item.status === "string") attrs["codex.status"] = item.status;
474
631
  if (typeof item.aggregated_output === "string") attrs["codex.output"] = item.aggregated_output;
632
+ Object.assign(attrs, this.getSkillTraceAttributes(item, skillRootPrefixes, { requireSuccessfulCommand: true }));
475
633
  break;
476
634
  case "file_change":
477
635
  if (typeof item.status === "string") attrs["codex.status"] = item.status;
@@ -483,6 +641,10 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
483
641
  case "mcp_tool_call":
484
642
  if (typeof item.status === "string") attrs["codex.status"] = item.status;
485
643
  if (typeof item.error?.message === "string") attrs["codex.error"] = item.error.message;
644
+ {
645
+ const serializedArgs = this.serializeItemValue(item.arguments ?? item.args ?? item.input);
646
+ if (serializedArgs) attrs["codex.mcp.input"] = serializedArgs;
647
+ }
486
648
  break;
487
649
  case "agent_message":
488
650
  if (typeof item.text === "string") attrs["codex.message"] = item.text;
@@ -572,6 +734,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
572
734
  async callApiInternal(prompt, _context, callOptions, config) {
573
735
  const currentTraceparent = getTraceparent();
574
736
  const env = this.prepareEnvironment(config, currentTraceparent);
737
+ const skillRootPrefixes = this.getSkillRootPrefixes(env);
575
738
  if (!this.apiKey && !env.OPENAI_API_KEY && !env.CODEX_API_KEY) throw new Error("OpenAI API key is not set. Set OPENAI_API_KEY or CODEX_API_KEY environment variable or add \"apiKey\" to provider config.");
576
739
  if (config.working_dir) this.validateWorkingDirectory(config.working_dir, config.skip_git_repo_check);
577
740
  if (callOptions?.abortSignal?.aborted) return { error: "OpenAI Codex SDK call aborted before it started" };
@@ -611,9 +774,14 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
611
774
  if (config.output_schema) runOptions.outputSchema = config.output_schema;
612
775
  if (callOptions?.abortSignal) runOptions.signal = callOptions.abortSignal;
613
776
  try {
614
- const turn = config.enable_streaming ? await this.runStreaming(thread, prompt, runOptions, callOptions) : await thread.run(prompt, runOptions);
777
+ const turn = config.enable_streaming ? await this.runStreaming(thread, prompt, runOptions, callOptions, skillRootPrefixes) : await thread.run(prompt, runOptions);
615
778
  const output = turn.finalResponse || "";
616
779
  const raw = JSON.stringify(turn);
780
+ const skillMetadata = this.buildSkillMetadata(turn.items, skillRootPrefixes);
781
+ const metadata = skillMetadata ? {
782
+ ...skillMetadata.skillCalls.length > 0 ? { skillCalls: skillMetadata.skillCalls } : {},
783
+ ...skillMetadata.attemptedSkillCalls.length > skillMetadata.skillCalls.length ? { attemptedSkillCalls: skillMetadata.attemptedSkillCalls } : {}
784
+ } : void 0;
617
785
  const tokenUsage = turn.usage ? {
618
786
  prompt: turn.usage.input_tokens,
619
787
  completion: turn.usage.output_tokens,
@@ -639,6 +807,7 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
639
807
  output,
640
808
  tokenUsage,
641
809
  cost,
810
+ metadata,
642
811
  raw,
643
812
  sessionId: thread.id || "unknown"
644
813
  };
@@ -663,4 +832,4 @@ var OpenAICodexSDKProvider = class OpenAICodexSDKProvider {
663
832
  //#endregion
664
833
  export { OpenAICodexSDKProvider };
665
834
 
666
- //# sourceMappingURL=codex-sdk-GGAw0qbD.js.map
835
+ //# sourceMappingURL=codex-sdk-DE5G18dx.js.map