promptfoo 0.120.27 → 0.121.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/README.md +1 -1
  2. package/dist/src/{ListApp-8WOe2nT6.js → ListApp-Du7YVwj5.js} +2 -4
  3. package/dist/src/accounts-B0pgC1oV.js +206 -0
  4. package/dist/src/{accounts-DVINui-2.js → accounts-Bm2D8Db9.js} +39 -34
  5. package/dist/src/{accounts-CPDRAMND.js → accounts-CiBLOnA7.js} +38 -33
  6. package/dist/src/{accounts-Fl2J3_Fu.cjs → accounts-gtkH-5KX.cjs} +77 -78
  7. package/dist/src/{agentic-utils-D922n6mm.js → agentic-utils-DS1g3GLF.js} +9 -10
  8. package/dist/src/{agents-BcsN_BgB.js → agents-9qiOy0ho.js} +16 -12
  9. package/dist/src/{agents-BXLmVsxR.js → agents-CBr9A01V.js} +37 -37
  10. package/dist/src/{agents-pMfppv9Z.js → agents-CmvBq8LV.js} +16 -18
  11. package/dist/src/{agents-hqgSV-3o.js → agents-D__IdAlg.js} +39 -40
  12. package/dist/src/{agents-BO2n8Z0d.cjs → agents-DbRtpYxR.cjs} +37 -40
  13. package/dist/src/{agents-BdUTAwi-.js → agents-DgF2zDag.js} +37 -42
  14. package/dist/src/{agents-DgJf2-ez.cjs → agents-Di9DKPzn.cjs} +16 -17
  15. package/dist/src/{agents-DNvSH78i.js → agents-cLXA8a_8.js} +17 -19
  16. package/dist/src/{aimlapi-DtgPI0nE.js → aimlapi-B4rcnZgv.js} +15 -17
  17. package/dist/src/{aimlapi-BE_Tg9Fl.cjs → aimlapi-BvlNH0gr.cjs} +15 -16
  18. package/dist/src/{aimlapi-DOib86oE.js → aimlapi-CnkC2HqE.js} +16 -18
  19. package/dist/src/{aimlapi-DTPACCB1.js → aimlapi-DHJU_kcV.js} +15 -4
  20. package/dist/src/app/assets/index-4LKxG2CG.js +439 -0
  21. package/dist/src/app/assets/{index-NCn4eVBv.css → index-C3zcsZFQ.css} +1 -1
  22. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +36 -0
  23. package/dist/src/app/index.html +3 -3
  24. package/dist/src/app/tsconfig.app.tsbuildinfo +1 -1
  25. package/dist/src/{audio-BnRUGAm_.js → audio-Bkv46et0.js} +6 -5
  26. package/dist/src/{audio-Cwo68yZS.cjs → audio-CGMyULza.cjs} +6 -7
  27. package/dist/src/{audio-MSRki4JU.js → audio-ClI_AFre.js} +6 -8
  28. package/dist/src/{audio-BRYU0BFo.js → audio-Dz3z7s3J.js} +7 -9
  29. package/dist/src/{base-pGVmXNl4.cjs → base-CGrhspbK.cjs} +36 -38
  30. package/dist/src/{base-h961VXYk.js → base-CpjcHe4e.js} +11 -13
  31. package/dist/src/base-DLKtKMFh.js +193 -0
  32. package/dist/src/{base-XB2tDJrB.js → base-Dy1V8--Z.js} +11 -13
  33. package/dist/src/blobs-BDbfYdrJ.js +236 -0
  34. package/dist/src/{blobs-CR5C4Ihh.js → blobs-CBO20krR.js} +9 -12
  35. package/dist/src/{blobs-BM_e6hCa.js → blobs-CMHN0Qcz.js} +9 -12
  36. package/dist/src/{blobs-B-KQAFhX.cjs → blobs-D23XLin-.cjs} +34 -37
  37. package/dist/src/{cache-jsiwsAJv.js → cache-BVeDlD87.js} +132 -117
  38. package/dist/src/{cache-CIpsoBZR.js → cache-C4Nxf52C.js} +132 -118
  39. package/dist/src/cache-CeUpFm3M.cjs +5 -0
  40. package/dist/src/{cache-BTVYfbka.cjs → cache-Dh5WtQps.cjs} +182 -168
  41. package/dist/src/cache-i1P6crbO.js +756 -0
  42. package/dist/src/cache-n-RCJ-hL.js +6 -0
  43. package/dist/src/{chat-BcPjZXIp.js → chat-BiKyneZl.js} +45 -46
  44. package/dist/src/{chat-D31K7C4u.cjs → chat-C1Qst7jL.cjs} +20 -21
  45. package/dist/src/{chat-B84t99NW.js → chat-C2jrdPMx.js} +20 -9
  46. package/dist/src/{chat-BE44YOc6.cjs → chat-CgF-J-Jj.cjs} +65 -66
  47. package/dist/src/{chat-DwWifjxi.js → chat-CzkrVDfz.js} +20 -22
  48. package/dist/src/chat-DJIw17u0.js +766 -0
  49. package/dist/src/{chat-CcUCysjU.js → chat-DqxYYtWA.js} +45 -46
  50. package/dist/src/{chat-DZM2GUHO.js → chat-qmatte1u.js} +21 -23
  51. package/dist/src/{chatkit-D67HS_0b.js → chatkit-65VXf5SR.js} +58 -58
  52. package/dist/src/{chatkit-DAB_qfzI.js → chatkit-Be-Q-a9F.js} +58 -60
  53. package/dist/src/{chatkit-Biqb_wsD.js → chatkit-BxFvW8KY.js} +58 -60
  54. package/dist/src/{chatkit-PGG4ZYIn.cjs → chatkit-DKyPi1Gs.cjs} +58 -60
  55. package/dist/src/chunk-DEq-mXcV.js +15 -0
  56. package/dist/src/chunk-DRamLcfz.js +16 -0
  57. package/dist/src/{claude-agent-sdk-SVM6AdBu.js → claude-agent-sdk-Apiy0iaz.js} +31 -31
  58. package/dist/src/{claude-agent-sdk-C-IOTPfo.js → claude-agent-sdk-D2bJee9S.js} +31 -29
  59. package/dist/src/{claude-agent-sdk-C9SiaQub.cjs → claude-agent-sdk-D9Z5Pr9X.cjs} +31 -28
  60. package/dist/src/{claude-agent-sdk-CiluSyW1.js → claude-agent-sdk-DfCoW0E6.js} +33 -20
  61. package/dist/src/cloud-BBh91EUK.js +4 -0
  62. package/dist/src/{cloud-CZ-q9Ier.js → cloud-C0dlstV_.js} +7 -9
  63. package/dist/src/{cloudflare-ai-BahKHyhh.js → cloudflare-ai-8TDxHR0x.js} +16 -18
  64. package/dist/src/{cloudflare-ai-v_qZD6_q.js → cloudflare-ai-BxAGvfju.js} +17 -19
  65. package/dist/src/{cloudflare-ai-Dfahv5SY.cjs → cloudflare-ai-CknbZ5LJ.cjs} +16 -17
  66. package/dist/src/{cloudflare-ai-Dxyt50Nl.js → cloudflare-ai-g7PB6VHR.js} +16 -4
  67. package/dist/src/{cloudflare-gateway-Bi_FpOFy.js → cloudflare-gateway-B9HWA5wf.js} +23 -23
  68. package/dist/src/{cloudflare-gateway-BPWoZIzJ.cjs → cloudflare-gateway-BSnDmHYo.cjs} +21 -22
  69. package/dist/src/{cloudflare-gateway-C0guUNwk.js → cloudflare-gateway-CKDb4dJ8.js} +26 -14
  70. package/dist/src/{cloudflare-gateway-btS7h1OZ.js → cloudflare-gateway-CP9QEWYS.js} +21 -25
  71. package/dist/src/{codex-sdk-DSxAnbfT.js → codex-sdk-C6UMlxwV.js} +28 -29
  72. package/dist/src/{codex-sdk-IYVi9fuM.js → codex-sdk-DUwKWezN.js} +28 -27
  73. package/dist/src/{codex-sdk-DulY0ZRq.js → codex-sdk-GGAw0qbD.js} +28 -29
  74. package/dist/src/{codex-sdk-DFKMtAyf.cjs → codex-sdk-fAO0c3yA.cjs} +28 -29
  75. package/dist/src/{cometapi-DzrR3SR_.js → cometapi-BL9yvj_f.js} +16 -4
  76. package/dist/src/{cometapi-DIO64tf4.cjs → cometapi-C4xSqeID.cjs} +21 -22
  77. package/dist/src/{cometapi-C9EEpJzT.js → cometapi-CUQq3H_a.js} +21 -24
  78. package/dist/src/{cometapi-DkNBMk0G.js → cometapi-DFNiKmSz.js} +17 -19
  79. package/dist/src/{completion-CG29bfKX.js → completion-5MzrpJxT.js} +11 -13
  80. package/dist/src/{completion-CCRT4kX1.cjs → completion-CM6oK8PS.cjs} +21 -23
  81. package/dist/src/{completion-Bgf1VJoq.js → completion-DZ083F31.js} +11 -13
  82. package/dist/src/completion-qRoZAYRB.js +120 -0
  83. package/dist/src/{createHash-Dw_iLu31.js → createHash-CTQmL3G2.js} +2 -3
  84. package/dist/src/{createHash-CYQy4YeL.cjs → createHash-CfZSc0b4.cjs} +13 -14
  85. package/dist/src/{createHash-CJcfskIZ.js → createHash-Da8fMwqB.js} +2 -3
  86. package/dist/src/createHash-DmPQkvBh.js +15 -0
  87. package/dist/src/{docker-D-ayp2FW.js → docker-Bb5dcxr8.js} +18 -20
  88. package/dist/src/{docker-B81N0t4e.js → docker-BvfL2BrW.js} +19 -21
  89. package/dist/src/{docker-DNcLR4Ig.cjs → docker-DcF2pRrj.cjs} +18 -19
  90. package/dist/src/{docker-egERKxCF.js → docker-ExVyLp0S.js} +18 -7
  91. package/dist/src/entrypoint.js +2 -3
  92. package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
  93. package/dist/src/{esm-B9dPm_BF.js → esm-C03C-mv3.js} +17 -20
  94. package/dist/src/{esm-D2pZ87fL.js → esm-CaIwzWR5.js} +18 -21
  95. package/dist/src/esm-Cd1AjG1D.js +379 -0
  96. package/dist/src/{esm-Ct-Joyue.cjs → esm-CnNt7sI4.cjs} +47 -49
  97. package/dist/src/eval-B3r2CVXr.js +15 -0
  98. package/dist/src/{eval-C-Nr6wX_.js → eval-Dg2nG4v2.js} +47 -54
  99. package/dist/src/evalResult-5xwYnECe.js +12 -0
  100. package/dist/src/evalResult-71lY93Kj.cjs +10 -0
  101. package/dist/src/{evalResult-DXMWJ3sx.js → evalResult-BBRNtX4I.js} +10 -11
  102. package/dist/src/{evalResult-4BzI2tmj.js → evalResult-BDMqrapS.js} +16 -12
  103. package/dist/src/evalResult-Dx5P5cIv.js +10 -0
  104. package/dist/src/{evalResult-CX8wQecI.cjs → evalResult-fuaI8HkH.cjs} +20 -21
  105. package/dist/src/{evaluator-8aGyV12L.js → evaluator-BhoWwp5b.js} +211 -235
  106. package/dist/src/evaluator-Jx6bRZV6.js +36 -0
  107. package/dist/src/{extractor-V5x_m1i0.js → extractor-C0EVHewb.js} +22 -24
  108. package/dist/src/extractor-D25qpmGX.js +374 -0
  109. package/dist/src/{extractor-CD5yKL-G.js → extractor-DReVID0K.js} +22 -24
  110. package/dist/src/{extractor-C031XmTA.cjs → extractor-pYLLi3wS.cjs} +37 -39
  111. package/dist/src/{fetch-BmbD-v1L.cjs → fetch-BPkYtG8K.cjs} +244 -277
  112. package/dist/src/fetch-BxNb_Lp3.js +5 -0
  113. package/dist/src/{fetch-D3OHf-lV.js → fetch-Cwxnd8zz.js} +36 -44
  114. package/dist/src/{fetch-CXZI9RRr.js → fetch-Dxpd4_sr.js} +23 -35
  115. package/dist/src/fetch-HaqdX7U1.js +780 -0
  116. package/dist/src/{fileExtensions-ePDqouxn.js → fileExtensions-DnqA1y9x.js} +2 -2
  117. package/dist/src/{fileExtensions-BpuMmaFL.js → fileExtensions-Ds-foDzt.js} +2 -2
  118. package/dist/src/fileExtensions-LcDYkU4v.js +85 -0
  119. package/dist/src/{fileExtensions-DkJYkWUy.cjs → fileExtensions-bYh77CN8.cjs} +27 -28
  120. package/dist/src/{formatDuration-CdevI3An.js → formatDuration-DgBVMN65.js} +2 -2
  121. package/dist/src/{genaiTracer-Ce19n68P.js → genaiTracer-70Z8BIuV.js} +2 -3
  122. package/dist/src/{genaiTracer-CqNnnXrE.js → genaiTracer-C1rxGO8Q.js} +2 -3
  123. package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
  124. package/dist/src/{genaiTracer-Dres3qrN.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
  125. package/dist/src/{graders--1y2u9HO.js → graders-BTeBGqjJ.js} +349 -397
  126. package/dist/src/graders-B_pgMLS2.js +34 -0
  127. package/dist/src/{graders-DTeBrzWp.js → graders-Bj_Odv7c.js} +349 -397
  128. package/dist/src/graders-DErokPDO.cjs +32 -0
  129. package/dist/src/graders-DP7KFFo-.js +13466 -0
  130. package/dist/src/graders-DR_uNe54.js +32 -0
  131. package/dist/src/{graders-DohM2dir.cjs → graders-DU49_J8Y.cjs} +684 -732
  132. package/dist/src/graders-w3176Wz-.js +32 -0
  133. package/dist/src/{image-B0U4Hqll.js → image-B02ogr_b.js} +7 -9
  134. package/dist/src/{image-DmE-niFE.js → image-B0h9VEMc.js} +6 -5
  135. package/dist/src/{image-CuKHuccK.cjs → image-BLmROtN3.cjs} +29 -30
  136. package/dist/src/{image-DNEIf_aI.js → image-Bb4vWQLM.js} +6 -8
  137. package/dist/src/{image-DpKl2F15.cjs → image-C1madmKh.cjs} +6 -7
  138. package/dist/src/{image-C3wHC9_h.js → image-CHfWvljl.js} +9 -10
  139. package/dist/src/{image-O1u4bCFg.js → image-DS-o-0ph.js} +9 -10
  140. package/dist/src/image-Dpxa1Jt6.js +257 -0
  141. package/dist/src/index.cjs +615 -695
  142. package/dist/src/index.d.cts +271 -7
  143. package/dist/src/index.d.ts +271 -3
  144. package/dist/src/index.js +580 -664
  145. package/dist/src/{interactiveCheck-Bxj1Swex.js → interactiveCheck-BgLZUIt3.js} +7 -8
  146. package/dist/src/{invariant-DT20jrBd.js → invariant-BtWWVVhl.js} +2 -2
  147. package/dist/src/{invariant-1pAf2CD1.js → invariant-Ddh24eXh.js} +2 -2
  148. package/dist/src/{invariant-CKcJAQ6M.cjs → invariant-kfQ8Bu82.cjs} +7 -8
  149. package/dist/src/invariant-vgHWClmd.js +25 -0
  150. package/dist/src/{knowledgeBase-CEzQobWX.js → knowledgeBase-B3OoKIej.js} +14 -9
  151. package/dist/src/{knowledgeBase-Be_zyW4L.js → knowledgeBase-CYTLHOt1.js} +16 -16
  152. package/dist/src/{knowledgeBase-BZ41IFwq.js → knowledgeBase-D33Ty2l6.js} +14 -18
  153. package/dist/src/{knowledgeBase-D-5BMXlr.cjs → knowledgeBase-DOO_BM9b.cjs} +14 -15
  154. package/dist/src/{litellm-DnbRJ2if.js → litellm-AaeZcZQF.js} +18 -19
  155. package/dist/src/{litellm-hUSNM_M2.cjs → litellm-I_hbp_dc.cjs} +17 -17
  156. package/dist/src/{litellm-CRDqPhNI.js → litellm-NbjknEh6.js} +17 -18
  157. package/dist/src/{litellm-9vR8zpfU.js → litellm-TrljxD9G.js} +17 -5
  158. package/dist/src/{logger-CG1uZPbQ.js → logger-CT3IKMKA.js} +10 -29
  159. package/dist/src/{logger-B7sBeGa0.cjs → logger-Cp1GPUjj.cjs} +152 -180
  160. package/dist/src/logger-DLcq4dWf.js +713 -0
  161. package/dist/src/{logger-LSBxlt7a.js → logger-KkObSCzq.js} +13 -31
  162. package/dist/src/{luma-ray-4blv9iZ2.js → luma-ray-BS2_tY8L.js} +22 -21
  163. package/dist/src/{luma-ray-drvgdpP9.js → luma-ray-DDsjcgZZ.js} +20 -13
  164. package/dist/src/{luma-ray-Hm3d6VJE.cjs → luma-ray-Due0n7di.cjs} +20 -21
  165. package/dist/src/{luma-ray-B2__8lYH.js → luma-ray-f6I2fft-.js} +20 -23
  166. package/dist/src/main.js +1170 -1321
  167. package/dist/src/{messages-Uee41Mj5.js → messages-BS17jdMx.js} +22 -24
  168. package/dist/src/{messages-XhiwCbi4.cjs → messages-Bs1kC7P4.cjs} +32 -34
  169. package/dist/src/{messages-CGPPidQr.js → messages-D0lx5qK7.js} +22 -24
  170. package/dist/src/messages-ZJk778GH.js +240 -0
  171. package/dist/src/{meteor-BYykdXrV.js → meteor-44VjEACX.js} +3 -4
  172. package/dist/src/{meteor-CsopaHrH.js → meteor-D-SotUw9.js} +3 -4
  173. package/dist/src/{meteor-e-E-2vVl.cjs → meteor-DLZZ3osF.cjs} +3 -4
  174. package/dist/src/{meteor-C8lGP6P4.js → meteor-DUiCJRC-.js} +3 -4
  175. package/dist/src/{modelslab-yKz-ZNB4.js → modelslab-Bmni6skY.js} +17 -10
  176. package/dist/src/{modelslab-E9gO-bYd.js → modelslab-Bx9IrZfS.js} +18 -20
  177. package/dist/src/{modelslab-lUVW0cmB.cjs → modelslab-CoUX6Jc_.cjs} +17 -18
  178. package/dist/src/{modelslab-ClBkr8_9.js → modelslab-DRb74SP4.js} +17 -19
  179. package/dist/src/{nova-reel-Dk8jNpId.js → nova-reel-BfPq-0Yk.js} +20 -13
  180. package/dist/src/{nova-reel-D8CuO6QH.cjs → nova-reel-C_QM18Xn.cjs} +20 -21
  181. package/dist/src/{nova-reel-u2eF2Cxm.js → nova-reel-D_W1tjMH.js} +22 -21
  182. package/dist/src/{nova-reel-P9bwvtYX.js → nova-reel-bgjxilYW.js} +20 -23
  183. package/dist/src/{nova-sonic-CK2rAiKi.js → nova-sonic-CFb5GYhg.js} +30 -26
  184. package/dist/src/{nova-sonic-BaqWlkds.js → nova-sonic-DIGQNR07.js} +30 -31
  185. package/dist/src/{nova-sonic-yZapPLv7.js → nova-sonic-De1HW5fD.js} +31 -32
  186. package/dist/src/{nova-sonic-Ds1C-dpm.cjs → nova-sonic-zfcljeRp.cjs} +30 -31
  187. package/dist/src/{openai-DUFopMrH.cjs → openai-Cuif0GEt.cjs} +8 -9
  188. package/dist/src/{openai-PblZ3jUE.js → openai-DElQ-fPX.js} +3 -4
  189. package/dist/src/{openai-CcN1B8Sb.js → openai-DhbB7eWK.js} +3 -4
  190. package/dist/src/openai-j-sE2O7r.js +44 -0
  191. package/dist/src/{openclaw-B6qqDr_u.cjs → openclaw-CSugPYAr.cjs} +188 -130
  192. package/dist/src/{openclaw-A-3_loM7.js → openclaw-DiSz3I5L.js} +180 -109
  193. package/dist/src/{openclaw-a3lylB-V.js → openclaw-DuvJKEW5.js} +178 -124
  194. package/dist/src/{openclaw-COn6QzDi.js → openclaw-tiVYRtr-.js} +178 -122
  195. package/dist/src/opencode-sdk-0j6rTWNb.js +562 -0
  196. package/dist/src/opencode-sdk-B3CWY9h_.js +560 -0
  197. package/dist/src/opencode-sdk-BL764Jdi.cjs +564 -0
  198. package/dist/src/opencode-sdk-C2y6UkP2.js +560 -0
  199. package/dist/src/{otlpReceiver-oyf5wLGC.js → otlpReceiver-C99PPb48.js} +53 -51
  200. package/dist/src/{otlpReceiver-lXsYVbpj.cjs → otlpReceiver-CGq6LspY.cjs} +53 -55
  201. package/dist/src/{otlpReceiver-94URx7UW.js → otlpReceiver-CdNBdbsk.js} +53 -55
  202. package/dist/src/{otlpReceiver-BmmTiMjA.js → otlpReceiver-D89fR-rC.js} +53 -55
  203. package/dist/src/{providerRegistry-Cq_JK_CJ.js → providerRegistry-B0RUOLI_.js} +7 -8
  204. package/dist/src/{providerRegistry-DSSHjMKf.js → providerRegistry-CD8MEar9.js} +7 -8
  205. package/dist/src/{providerRegistry-CvHEVJad.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
  206. package/dist/src/providerRegistry-DM8rZYol.js +45 -0
  207. package/dist/src/providers-B7V0njNs.js +32 -0
  208. package/dist/src/providers-BEwbhv0X.js +30 -0
  209. package/dist/src/{providers-Iil64vk9.js → providers-BlqUifFg.js} +1543 -1676
  210. package/dist/src/providers-CH3C7zf7.js +30 -0
  211. package/dist/src/{providers-DHbjzW2e.cjs → providers-CgKOSgTR.cjs} +1896 -2029
  212. package/dist/src/providers-D8lF1sqW.js +33246 -0
  213. package/dist/src/{providers-BnFpbY_s.js → providers-Dk_6ocUX.js} +1536 -1669
  214. package/dist/src/providers-zyB6k_38.cjs +31 -0
  215. package/dist/src/{pythonUtils-CcT5LH1M.js → pythonUtils-C3py6GC1.js} +18 -19
  216. package/dist/src/{pythonUtils-DBbuI3QJ.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
  217. package/dist/src/{pythonUtils-hZ8LeQLv.js → pythonUtils-D5nxkQ0P.js} +18 -19
  218. package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
  219. package/dist/src/{quiverai-BuI0tE39.js → quiverai-BbOUOn2L.js} +8 -7
  220. package/dist/src/{quiverai-DCGSZt4U.js → quiverai-CIaELU_m.js} +8 -10
  221. package/dist/src/{quiverai-DiMVJQDz.cjs → quiverai-PdShCPox.cjs} +8 -9
  222. package/dist/src/{quiverai-fQNkExW4.js → quiverai-uH-dcTIr.js} +9 -11
  223. package/dist/src/{render-Dj1smHEb.js → render-Drod8m7K.js} +4 -5
  224. package/dist/src/responses-CB2jwoAr.js +660 -0
  225. package/dist/src/{responses-ghR3IOfy.cjs → responses-D8SBTL64.cjs} +39 -42
  226. package/dist/src/{responses-DOAFFENS.js → responses-DIR9Ud3j.js} +24 -27
  227. package/dist/src/{responses-CxzoQoBe.js → responses-WNGNYe3K.js} +24 -27
  228. package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
  229. package/dist/src/{rubyUtils-CwbGmgYN.js → rubyUtils-BUVePouc.js} +27 -20
  230. package/dist/src/rubyUtils-BcuGX77l.js +222 -0
  231. package/dist/src/{rubyUtils-DudlFZed.js → rubyUtils-Boc4HZzX.js} +18 -19
  232. package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
  233. package/dist/src/{rubyUtils-C8MhKGHb.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
  234. package/dist/src/{sagemaker-gmskuyre.js → sagemaker-CNBxx5CJ.js} +75 -70
  235. package/dist/src/{sagemaker-CcxhlOAR.js → sagemaker-CemTFp2h.js} +75 -79
  236. package/dist/src/{sagemaker-77zbJ2Q2.cjs → sagemaker-Cl28mZU2.cjs} +75 -76
  237. package/dist/src/{sagemaker-DuM71dVU.js → sagemaker-YSyBXQQh.js} +77 -77
  238. package/dist/src/{scanner-DJYiSXQj.js → scanner-BsBlNXNn.js} +100 -121
  239. package/dist/src/server/index.js +5520 -67427
  240. package/dist/src/{server-B5v33lvE.cjs → server-C_7Ax-hA.cjs} +57 -67
  241. package/dist/src/{server-BJ4m4f1D.js → server-CqzrVGpF.js} +26 -29
  242. package/dist/src/server-CuxBbeSY.js +229 -0
  243. package/dist/src/server-DA4Cyrrq.js +7 -0
  244. package/dist/src/server-Dulb-4-K.cjs +5 -0
  245. package/dist/src/{server-RV_i_YX5.js → server-VWgWb00X.js} +19 -24
  246. package/dist/src/{signal-BW33JuId.js → signal-4U3mfRvL.js} +9 -11
  247. package/dist/src/{slack-DEURelTy.cjs → slack-BmVAVGaK.cjs} +7 -8
  248. package/dist/src/{slack-BQYeW9L3.js → slack-DCUPTzS2.js} +8 -8
  249. package/dist/src/{slack-BB6yuZzp.js → slack-DOdy_kyv.js} +7 -8
  250. package/dist/src/{slack-2pRrhhgJ.js → slack-DXMKtA-f.js} +7 -9
  251. package/dist/src/store-CXGFv4aR.js +228 -0
  252. package/dist/src/store-CXS-Q_91.js +6 -0
  253. package/dist/src/{store-D7CgQzAR.cjs → store-DLlFCC4h.cjs} +44 -45
  254. package/dist/src/{store-DJNsD1iC.js → store-DXilxTl-.js} +40 -36
  255. package/dist/src/{store-s3SftUwF.js → store-Dim__MDd.js} +34 -35
  256. package/dist/src/store-eYkaKMwq.cjs +5 -0
  257. package/dist/src/{tables-DfTsNN7X.js → tables-6YKwjN9-.js} +19 -21
  258. package/dist/src/tables-DLJPUdUE.js +288 -0
  259. package/dist/src/{tables-BKTmd6u7.cjs → tables-DPi7wKeM.cjs} +89 -91
  260. package/dist/src/{tables-DMegD0Xf.js → tables-gftXzE9I.js} +21 -23
  261. package/dist/src/telemetry-BpMfhthR.cjs +5 -0
  262. package/dist/src/{telemetry--WAdAfVi.js → telemetry-CMrFgtPB.js} +11 -13
  263. package/dist/src/telemetry-Cps3mIU-.js +171 -0
  264. package/dist/src/{telemetry-DQgVBCAb.cjs → telemetry-DaX14Chu.cjs} +21 -24
  265. package/dist/src/{telemetry-BedSm-bZ.js → telemetry-Dthj_BbD.js} +17 -14
  266. package/dist/src/telemetry-Dw38hanS.js +7 -0
  267. package/dist/src/{text-oiSbwSOI.js → text-B_UCRPp2.js} +2 -2
  268. package/dist/src/{text-oKzCBnK6.cjs → text-CW1cyrwj.cjs} +12 -13
  269. package/dist/src/{text-B_IrO4GZ.js → text-Db-Wt2u2.js} +2 -2
  270. package/dist/src/text-TIv0QYnd.js +22 -0
  271. package/dist/src/{tokenUsageUtils-FZd5O_4A.js → tokenUsageUtils-BDGe-iyI.js} +2 -2
  272. package/dist/src/{tokenUsageUtils-DmZSD2eU.js → tokenUsageUtils-DflFMjS0.js} +2 -2
  273. package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
  274. package/dist/src/{tokenUsageUtils-CXhxVj72.cjs → tokenUsageUtils-bVa1ga6f.cjs} +32 -33
  275. package/dist/src/{transcription-mYS9vd5v.js → transcription-BNYURcXg.js} +14 -7
  276. package/dist/src/{transcription-X2-B4vkX.js → transcription-B_OdaHp7.js} +14 -16
  277. package/dist/src/{transcription-BO1AHegO.cjs → transcription-NLVG9MT1.cjs} +14 -15
  278. package/dist/src/{transcription-lzBLiTFJ.js → transcription-s6A-bNrZ.js} +15 -17
  279. package/dist/src/{transform-B1Hi5lWS.cjs → transform-CzK1Q0zl.cjs} +24 -26
  280. package/dist/src/{transform-DeGlxb0D.js → transform-D5HsjduX.js} +39 -47
  281. package/dist/src/{transform-CYDILYDe.js → transform-DECvGmzp.js} +15 -13
  282. package/dist/src/transform-DTGDnAzW.js +6 -0
  283. package/dist/src/{transform-BEgStbHK.js → transform-DilY9wbS.js} +10 -12
  284. package/dist/src/{transform-D5PjiWiZ.cjs → transform-DuHvhZpj.cjs} +179 -187
  285. package/dist/src/transform-aa6tmVpZ.js +216 -0
  286. package/dist/src/transform-m3qNw4KP.cjs +5 -0
  287. package/dist/src/transform-uAytVuyX.js +1506 -0
  288. package/dist/src/{transform-Dfl89yi4.js → transform-vNucnNr0.js} +39 -47
  289. package/dist/src/{transformersAvailability-SZnTS3pJ.js → transformersAvailability-CEVM2GNQ.js} +2 -2
  290. package/dist/src/{transformersAvailability-D-glmEy7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
  291. package/dist/src/{transformersAvailability-CjeFXhuJ.js → transformersAvailability-D6c6ROpT.js} +2 -2
  292. package/dist/src/{types-DWNf48sT.cjs → types-C_7nyzr1.cjs} +538 -574
  293. package/dist/src/{types-CXQduE9o.js → types-Cbd8uOMq.js} +68 -100
  294. package/dist/src/types-CzW2QFyi.js +3288 -0
  295. package/dist/src/{types-C5hEkb-x.js → types-DmyIJ-sR.js} +63 -99
  296. package/dist/src/{util-CoQjmE3u.js → util-B3xGByQh.js} +4 -5
  297. package/dist/src/{util-aLhtl3fe.cjs → util-B9vlHIIh.cjs} +208 -223
  298. package/dist/src/{util-Du96oyYS.js → util-BHGHw5G1.js} +4 -5
  299. package/dist/src/{util-DQ984syk.js → util-BRYkYPTd.js} +36 -51
  300. package/dist/src/{util-D9eLdGfa.js → util-BV4XUC0n.js} +5 -6
  301. package/dist/src/util-Bv6uGDfH.js +293 -0
  302. package/dist/src/{util-1wWM599Z.cjs → util-BzMcevZc.cjs} +50 -51
  303. package/dist/src/{util-_h4pVqrz.js → util-C1CeHl-P.js} +36 -51
  304. package/dist/src/{util-Bm_-UMD_.js → util-CMy69ZgQ.js} +5 -6
  305. package/dist/src/{util-CyUdMzV0.cjs → util-DGNOS1db.cjs} +34 -35
  306. package/dist/src/util-Dnmk2mBQ.js +599 -0
  307. package/dist/src/util-ZzmqNPlg.js +1426 -0
  308. package/dist/src/{utils-BjLy-Q72.cjs → utils-Cz9qXqII.cjs} +29 -32
  309. package/dist/src/{utils-CFMn2yHW.js → utils-XiOAgly5.js} +4 -7
  310. package/dist/src/utils-dLokC-eR.js +94 -0
  311. package/dist/src/{utils-DvWMzuMx.js → utils-f2-Moju7.js} +4 -7
  312. package/dist/tsconfig.tsbuildinfo +1 -1
  313. package/package.json +38 -38
  314. package/dist/src/app/assets/index-B2D0bCSI.js +0 -439
  315. package/dist/src/app/assets/vendor-charts-CCl15Imd.js +0 -36
  316. package/dist/src/cache-ChPcurj7.js +0 -6
  317. package/dist/src/cache-VVu_W-yg.js +0 -8
  318. package/dist/src/cache-YLNCFEM2.cjs +0 -6
  319. package/dist/src/chunk-DHDDz29n.js +0 -22
  320. package/dist/src/chunk-FhC4c-0y.js +0 -21
  321. package/dist/src/cloud-BndfXy4H.js +0 -5
  322. package/dist/src/eval-BhHvMY82.js +0 -17
  323. package/dist/src/evalResult-Dq2gFNQY.js +0 -12
  324. package/dist/src/evalResult-nmcP5VKH.cjs +0 -12
  325. package/dist/src/evalResult-trqZjVYh.js +0 -14
  326. package/dist/src/evaluator-CnfPstzT.js +0 -39
  327. package/dist/src/fetch-IDPDue6F.cjs +0 -4
  328. package/dist/src/fetch-hKJ-It8q.js +0 -6
  329. package/dist/src/fetch-ouKnrWK-.js +0 -4
  330. package/dist/src/graders-CQn7WUsd.cjs +0 -34
  331. package/dist/src/graders-DC6QAbpW.js +0 -35
  332. package/dist/src/graders-DUWz3Y7j.js +0 -37
  333. package/dist/src/opencode-sdk-4bL9n-Gk.js +0 -382
  334. package/dist/src/opencode-sdk-BfC2zWcR.js +0 -376
  335. package/dist/src/opencode-sdk-DMJyuwMg.js +0 -380
  336. package/dist/src/opencode-sdk-Da-9adza.cjs +0 -383
  337. package/dist/src/providers-CsXB2Ix-.js +0 -35
  338. package/dist/src/providers-DO8ltjLC.js +0 -33
  339. package/dist/src/providers-Dtq-xnXd.cjs +0 -33
  340. package/dist/src/rubyUtils-BUbcND2f.js +0 -6
  341. package/dist/src/rubyUtils-Cr55X_KE.js +0 -5
  342. package/dist/src/rubyUtils-DlIiqoYo.cjs +0 -5
  343. package/dist/src/server-C2eQH4Gu.js +0 -6
  344. package/dist/src/server-CXWycu7H.cjs +0 -6
  345. package/dist/src/server-Q6OGlxxT.js +0 -8
  346. package/dist/src/store-B3EDO9Q3.js +0 -7
  347. package/dist/src/store-Dl9F8aw5.js +0 -6
  348. package/dist/src/store-SnrGrlt9.cjs +0 -6
  349. package/dist/src/telemetry-BGhiPZtl.js +0 -8
  350. package/dist/src/telemetry-CFfiYan6.cjs +0 -6
  351. package/dist/src/telemetry-DHzEduxX.js +0 -6
  352. package/dist/src/transform-C1x1ZlMQ.cjs +0 -6
  353. package/dist/src/transform-DYHjFmQu.js +0 -8
  354. package/dist/src/transform-rmwJT5JQ.js +0 -7
  355. package/dist/src/transformersAvailability-eJooj0gX.js +0 -35
@@ -0,0 +1,564 @@
1
+ const require_logger = require("./logger-Cp1GPUjj.cjs");
2
+ const require_esm = require("./esm-CnNt7sI4.cjs");
3
+ require("./fetch-BPkYtG8K.cjs");
4
+ require("./cache-Dh5WtQps.cjs");
5
+ const require_cometapi = require("./cometapi-C4xSqeID.cjs");
6
+ let fs = require("fs");
7
+ fs = require_logger.__toESM(fs);
8
+ let path = require("path");
9
+ path = require_logger.__toESM(path);
10
+ let node_module = require("node:module");
11
+ let os = require("os");
12
+ os = require_logger.__toESM(os);
13
+ let dedent = require("dedent");
14
+ dedent = require_logger.__toESM(dedent);
15
+ //#region src/providers/opencode-sdk.ts
16
+ /**
17
+ * Check if promptfoo is in debug mode
18
+ */
19
+ function isDebugMode() {
20
+ return require_logger.getLogLevel() === "debug";
21
+ }
22
+ /**
23
+ * Maximum number of sessions to keep in memory to prevent unbounded growth
24
+ */
25
+ const MAX_SESSIONS = 100;
26
+ /**
27
+ * Resolve ESM-only package entry point by reading package.json exports
28
+ * Handles packages that only have "import" condition (no "require" condition)
29
+ *
30
+ * @param packageName - The package name (e.g., '@opencode-ai/sdk')
31
+ * @param basePath - Base path for resolution
32
+ * @returns Absolute path to the ESM entry point
33
+ */
34
+ function resolveEsmPackage(packageName, exportPath, basePath) {
35
+ const require = (0, node_module.createRequire)(path.default.join(basePath, "package.json"));
36
+ let packageJsonPath;
37
+ try {
38
+ packageJsonPath = require.resolve(`${packageName}/package.json`);
39
+ } catch {
40
+ packageJsonPath = path.default.join(basePath, "node_modules", ...packageName.split("/"), "package.json");
41
+ if (!fs.default.existsSync(packageJsonPath)) throw new Error(`Cannot find ${packageName}/package.json`);
42
+ }
43
+ const packageDir = path.default.dirname(packageJsonPath);
44
+ const packageJson = JSON.parse(fs.default.readFileSync(packageJsonPath, "utf-8"));
45
+ let esmEntry;
46
+ if (packageJson.exports) {
47
+ const mainExport = packageJson.exports[exportPath] || (exportPath === "." ? packageJson.exports["."] || packageJson.exports : void 0);
48
+ if (typeof mainExport === "string") esmEntry = mainExport;
49
+ else if (typeof mainExport === "object") esmEntry = mainExport.import || mainExport.default;
50
+ }
51
+ if (!esmEntry) esmEntry = packageJson.module || packageJson.main;
52
+ if (!esmEntry) throw new Error(`Cannot find ESM entry point in ${packageName}/package.json`);
53
+ return path.default.join(packageDir, esmEntry);
54
+ }
55
+ function unwrapOpenCodeResult(result) {
56
+ if (!result) return;
57
+ if (typeof result === "object" && result !== null && "data" in result) return result.data;
58
+ return result;
59
+ }
60
+ function getSessionPath(sessionId) {
61
+ return {
62
+ id: sessionId,
63
+ sessionID: sessionId
64
+ };
65
+ }
66
+ function tryParseJson(value) {
67
+ try {
68
+ return JSON.stringify(JSON.parse(value));
69
+ } catch {
70
+ return;
71
+ }
72
+ }
73
+ function normalizeStructuredText(value) {
74
+ const trimmedValue = value.trim();
75
+ const directJson = tryParseJson(trimmedValue);
76
+ if (directJson) return directJson;
77
+ const fencedJsonMatch = trimmedValue.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i);
78
+ if (!fencedJsonMatch?.[1]) return;
79
+ return tryParseJson(fencedJsonMatch[1]);
80
+ }
81
+ /**
82
+ * Helper to load the OpenCode SDK ESM module
83
+ *
84
+ * Uses a two-phase approach:
85
+ * 1. Try simple dynamic import - works when SDK is in same node_modules tree
86
+ * 2. Fall back to smart ESM resolution for edge cases (pnpm, global installs, monorepos)
87
+ */
88
+ async function loadOpenCodeSDK() {
89
+ const directImports = [{
90
+ specifier: "@opencode-ai/sdk/v2",
91
+ exportPath: "./v2",
92
+ apiVersion: "v2"
93
+ }, {
94
+ specifier: "@opencode-ai/sdk",
95
+ exportPath: ".",
96
+ apiVersion: "v1"
97
+ }];
98
+ for (const candidate of directImports) try {
99
+ require_logger.logger.debug(`Attempting dynamic import of ${candidate.specifier}`);
100
+ return {
101
+ ...await import(candidate.specifier),
102
+ apiVersion: candidate.apiVersion
103
+ };
104
+ } catch (error) {
105
+ require_logger.logger.debug(`Dynamic import failed for ${candidate.specifier}`, { error });
106
+ }
107
+ const basePath = require_logger.state.basePath && path.default.isAbsolute(require_logger.state.basePath) ? require_logger.state.basePath : process.cwd();
108
+ for (const candidate of directImports) try {
109
+ const modulePath = resolveEsmPackage("@opencode-ai/sdk", candidate.exportPath, basePath);
110
+ require_logger.logger.debug(`Resolved OpenCode SDK path (${candidate.apiVersion}): ${modulePath}`);
111
+ return {
112
+ ...await require_esm.importModule(modulePath),
113
+ apiVersion: candidate.apiVersion
114
+ };
115
+ } catch (error) {
116
+ require_logger.logger.debug(`Smart resolution failed for ${candidate.specifier}`, { error });
117
+ }
118
+ const err = /* @__PURE__ */ new Error("Failed to resolve @opencode-ai/sdk");
119
+ require_logger.logger.error(`Failed to load OpenCode SDK: ${err}`);
120
+ throw new Error(dedent.default`The @opencode-ai/sdk package is required but not installed.
121
+
122
+ To use the OpenCode SDK provider, install it with:
123
+ npm install @opencode-ai/sdk
124
+
125
+ For more information, see: https://www.promptfoo.dev/docs/providers/opencode-sdk/`);
126
+ }
127
+ var OpenCodeSDKProvider = class {
128
+ config;
129
+ env;
130
+ providerId = "opencode:sdk";
131
+ opencodeModule;
132
+ client;
133
+ server;
134
+ sessions = /* @__PURE__ */ new Map();
135
+ sessionOrder = [];
136
+ constructor(options = {}) {
137
+ const { config, env, id } = options;
138
+ this.config = config ?? {};
139
+ this.env = env;
140
+ this.providerId = id ?? this.providerId;
141
+ }
142
+ id() {
143
+ return this.providerId;
144
+ }
145
+ /**
146
+ * Get API key based on provider_id or common environment variables
147
+ */
148
+ getApiKey(config = this.config) {
149
+ if (config?.apiKey) return config.apiKey;
150
+ const providerId = config?.provider_id?.toLowerCase();
151
+ if (providerId === "anthropic") return this.env?.ANTHROPIC_API_KEY || require_logger.getEnvString("ANTHROPIC_API_KEY");
152
+ if (providerId === "openai") return this.env?.OPENAI_API_KEY || require_logger.getEnvString("OPENAI_API_KEY");
153
+ if (providerId === "google") return this.env?.GOOGLE_API_KEY || require_logger.getEnvString("GOOGLE_API_KEY");
154
+ return this.env?.ANTHROPIC_API_KEY || require_logger.getEnvString("ANTHROPIC_API_KEY") || this.env?.OPENAI_API_KEY || require_logger.getEnvString("OPENAI_API_KEY");
155
+ }
156
+ toString() {
157
+ return "[OpenCode SDK Provider]";
158
+ }
159
+ async cleanup() {
160
+ for (const session of this.sessions.values()) try {
161
+ await this.deleteSession(session);
162
+ } catch (err) {
163
+ require_logger.logger.debug(`Failed to delete persistent session ${session.id}: ${err}`);
164
+ }
165
+ this.sessions.clear();
166
+ this.sessionOrder = [];
167
+ if (this.server) {
168
+ try {
169
+ this.server.close();
170
+ } catch (err) {
171
+ require_logger.logger.debug(`Failed to close OpenCode server: ${err}`);
172
+ }
173
+ this.server = void 0;
174
+ }
175
+ }
176
+ /**
177
+ * Build the tools configuration based on config and defaults
178
+ */
179
+ buildToolsConfig(config) {
180
+ if (config.tools) return config.tools;
181
+ if (!config.working_dir) return {
182
+ bash: false,
183
+ edit: false,
184
+ write: false,
185
+ read: false,
186
+ grep: false,
187
+ glob: false,
188
+ list: false,
189
+ patch: false,
190
+ todowrite: false,
191
+ todoread: false,
192
+ webfetch: false,
193
+ question: false,
194
+ skill: false,
195
+ lsp: false
196
+ };
197
+ return {
198
+ bash: false,
199
+ edit: false,
200
+ write: false,
201
+ read: true,
202
+ grep: true,
203
+ glob: true,
204
+ list: true,
205
+ patch: false,
206
+ todowrite: false,
207
+ todoread: false,
208
+ webfetch: false,
209
+ question: false,
210
+ skill: false,
211
+ lsp: false
212
+ };
213
+ }
214
+ buildQuery(config, workingDir) {
215
+ const query = {};
216
+ if (config.working_dir && workingDir) query.directory = workingDir;
217
+ if (config.workspace) query.workspace = config.workspace;
218
+ return Object.keys(query).length > 0 ? query : void 0;
219
+ }
220
+ buildSessionKey(config, workingDir) {
221
+ return require_cometapi.generateCacheKey("opencode:sdk:session", {
222
+ baseUrl: config.baseUrl,
223
+ workingDir: config.working_dir ? workingDir : void 0,
224
+ workspace: config.workspace,
225
+ provider_id: config.provider_id,
226
+ model: config.model,
227
+ tools: this.buildToolsConfig(config),
228
+ permission: config.permission,
229
+ agent: config.agent,
230
+ custom_agent: config.custom_agent,
231
+ format: config.format,
232
+ variant: config.variant,
233
+ mcp: config.mcp
234
+ });
235
+ }
236
+ buildServerEnv(config) {
237
+ const serverEnv = {};
238
+ for (const [key, value] of Object.entries(process.env)) if (value !== void 0) serverEnv[key] = value;
239
+ if (this.env) for (const key of Object.keys(this.env).sort()) {
240
+ const value = this.env[key];
241
+ if (value !== void 0) serverEnv[key] = value;
242
+ }
243
+ if (config.log_level === "debug" || isDebugMode()) {
244
+ serverEnv.DEBUG = serverEnv.DEBUG || "opencode:*";
245
+ require_logger.logger.debug("[OpenCode SDK] Debug mode enabled, synced from promptfoo log level");
246
+ }
247
+ const homeDir = os.default.homedir();
248
+ const opencodeBinPath = path.default.join(homeDir, ".opencode", "bin");
249
+ if (!serverEnv.PATH?.includes(opencodeBinPath)) {
250
+ serverEnv.PATH = `${opencodeBinPath}:${serverEnv.PATH ?? ""}`;
251
+ require_logger.logger.debug(`Added ${opencodeBinPath} to PATH for OpenCode CLI`);
252
+ }
253
+ return serverEnv;
254
+ }
255
+ buildServerConfig(config) {
256
+ const serverConfig = {};
257
+ if (config.log_level) serverConfig.logLevel = config.log_level;
258
+ if (config.mcp && Object.keys(config.mcp).length > 0) {
259
+ serverConfig.mcp = config.mcp;
260
+ require_logger.logger.debug(`[OpenCode SDK] Configuring MCP servers: ${Object.keys(config.mcp).join(", ")}`);
261
+ }
262
+ if (config.custom_agent) {
263
+ serverConfig.agent = { custom: {
264
+ description: config.custom_agent.description,
265
+ model: config.custom_agent.model,
266
+ temperature: config.custom_agent.temperature,
267
+ top_p: config.custom_agent.top_p,
268
+ tools: config.custom_agent.tools,
269
+ permission: config.custom_agent.permission,
270
+ prompt: config.custom_agent.prompt,
271
+ mode: config.custom_agent.mode ?? "primary",
272
+ maxSteps: config.custom_agent.steps ?? config.custom_agent.maxSteps,
273
+ color: config.custom_agent.color,
274
+ disable: config.custom_agent.disable,
275
+ hidden: config.custom_agent.hidden
276
+ } };
277
+ require_logger.logger.debug(`[OpenCode SDK] Configuring custom agent: ${config.custom_agent.description}`);
278
+ }
279
+ if (config.permission) {
280
+ serverConfig.permission = config.permission;
281
+ require_logger.logger.debug("[OpenCode SDK] Configuring global permissions");
282
+ }
283
+ const toolsConfig = this.buildToolsConfig(config);
284
+ if (toolsConfig) serverConfig.tools = toolsConfig;
285
+ if (config.provider_id && config.apiKey) {
286
+ serverConfig.provider = { [config.provider_id]: { options: { apiKey: config.apiKey } } };
287
+ require_logger.logger.debug(`[OpenCode SDK] Injecting provider apiKey for ${config.provider_id}`);
288
+ }
289
+ return serverConfig;
290
+ }
291
+ warnOnIgnoredBaseUrlConfig(config) {
292
+ if (!config.baseUrl) return;
293
+ const ignoredSettings = [
294
+ config.hostname !== void 0 ? "hostname" : void 0,
295
+ config.port !== void 0 ? "port" : void 0,
296
+ config.timeout !== void 0 ? "timeout" : void 0,
297
+ config.log_level !== void 0 ? "log_level" : void 0,
298
+ config.mcp ? "mcp" : void 0,
299
+ config.custom_agent ? "custom_agent" : void 0,
300
+ config.apiKey ? "apiKey" : void 0
301
+ ].filter(Boolean);
302
+ if (ignoredSettings.length > 0) require_logger.logger.warn(`[OpenCode SDK] baseUrl uses an existing OpenCode server. These config keys are ignored unless that server is preconfigured: ${ignoredSettings.join(", ")}`);
303
+ }
304
+ buildDeleteSessionParameters(session) {
305
+ if (!this.opencodeModule) throw new Error("OpenCode SDK module is not loaded");
306
+ if (this.opencodeModule.apiVersion === "v2") return {
307
+ sessionID: session.id,
308
+ ...session.query
309
+ };
310
+ return {
311
+ path: getSessionPath(session.id),
312
+ query: session.query
313
+ };
314
+ }
315
+ async deleteSession(session) {
316
+ if (!session || !this.client?.session?.delete) return;
317
+ await this.client.session.delete(this.buildDeleteSessionParameters(session));
318
+ }
319
+ /**
320
+ * Add a session to the cache with LRU eviction
321
+ */
322
+ addSession(cacheKey, session) {
323
+ while (this.sessions.size >= MAX_SESSIONS && this.sessionOrder.length > 0) {
324
+ const oldestKey = this.sessionOrder.shift();
325
+ if (oldestKey) {
326
+ const oldSession = this.sessions.get(oldestKey);
327
+ this.sessions.delete(oldestKey);
328
+ if (oldSession) this.deleteSession(oldSession).catch((err) => {
329
+ require_logger.logger.debug(`Failed to delete evicted session ${oldSession.id}: ${err}`);
330
+ });
331
+ }
332
+ }
333
+ this.sessions.set(cacheKey, session);
334
+ this.sessionOrder.push(cacheKey);
335
+ }
336
+ prepareCall(context) {
337
+ const config = {
338
+ ...this.config,
339
+ ...context?.prompt?.config
340
+ };
341
+ if (config.workspace && !config.baseUrl && !config.working_dir) throw new Error("OpenCode SDK workspace support requires either baseUrl or working_dir");
342
+ if (config.apiKey && !config.provider_id && !config.baseUrl) require_logger.logger.warn("[OpenCode SDK] apiKey is set without provider_id. Prefer setting provider_id so promptfoo can wire the credential into the spawned OpenCode server.");
343
+ this.warnOnIgnoredBaseUrlConfig(config);
344
+ if (config.working_dir) {
345
+ const workingDir = path.default.isAbsolute(config.working_dir) ? config.working_dir : path.default.resolve(process.cwd(), config.working_dir);
346
+ let stats;
347
+ try {
348
+ stats = fs.default.statSync(workingDir);
349
+ } catch (err) {
350
+ throw new Error(`Working directory ${config.working_dir} (resolved to ${workingDir}) does not exist or isn't accessible: ${err.message}`);
351
+ }
352
+ if (!stats.isDirectory()) throw new Error(`Working directory ${config.working_dir} (resolved to ${workingDir}) is not a directory`);
353
+ return {
354
+ config,
355
+ isTempDir: false,
356
+ workingDir
357
+ };
358
+ }
359
+ return {
360
+ config,
361
+ isTempDir: true,
362
+ workingDir: fs.default.mkdtempSync(path.default.join(os.default.tmpdir(), "promptfoo-opencode-sdk-"))
363
+ };
364
+ }
365
+ async ensureClient(config) {
366
+ if (!this.opencodeModule) this.opencodeModule = await loadOpenCodeSDK();
367
+ if (this.client) return;
368
+ const { createOpencode, createOpencodeClient } = this.opencodeModule;
369
+ if (config.baseUrl) {
370
+ this.client = createOpencodeClient({ baseUrl: config.baseUrl });
371
+ return;
372
+ }
373
+ const serverOptions = {
374
+ hostname: config.hostname ?? "127.0.0.1",
375
+ port: config.port ?? 0,
376
+ timeout: config.timeout ?? 3e4,
377
+ env: this.buildServerEnv(config)
378
+ };
379
+ const serverConfig = this.buildServerConfig(config);
380
+ if (Object.keys(serverConfig).length > 0) serverOptions.config = serverConfig;
381
+ const opencode = await createOpencode(serverOptions);
382
+ this.client = opencode.client;
383
+ this.server = opencode.server;
384
+ require_logger.logger.debug(`OpenCode server started at ${opencode.server.url}`);
385
+ }
386
+ async getOrCreateSession(config, workingDir) {
387
+ if (!this.client || !this.opencodeModule) throw new Error("OpenCode SDK client is not initialized");
388
+ const sessionQuery = this.buildQuery(config, workingDir);
389
+ if (config.session_id) return {
390
+ sessionId: config.session_id,
391
+ sessionQuery
392
+ };
393
+ const sessionCacheKey = this.buildSessionKey(config, workingDir);
394
+ if (config.persist_sessions && this.sessions.has(sessionCacheKey)) return {
395
+ sessionId: this.sessions.get(sessionCacheKey).id,
396
+ sessionQuery
397
+ };
398
+ const createResult = await this.client.session.create(this.buildCreateSessionParameters(config, sessionQuery));
399
+ const sessionId = unwrapOpenCodeResult(createResult)?.id ?? createResult?.id;
400
+ if (!sessionId) throw new Error("Failed to get session ID from OpenCode SDK response");
401
+ const session = {
402
+ id: sessionId,
403
+ query: sessionQuery
404
+ };
405
+ if (config.persist_sessions) {
406
+ this.addSession(sessionCacheKey, session);
407
+ return {
408
+ sessionId,
409
+ sessionQuery
410
+ };
411
+ }
412
+ return {
413
+ sessionId,
414
+ sessionQuery,
415
+ ephemeralSession: session
416
+ };
417
+ }
418
+ buildPromptBody(config, prompt) {
419
+ if (!this.opencodeModule) throw new Error("OpenCode SDK module is not loaded");
420
+ const promptBody = { parts: [{
421
+ type: "text",
422
+ text: prompt
423
+ }] };
424
+ if (config.provider_id || config.model) promptBody.model = {
425
+ providerID: config.provider_id ?? "",
426
+ modelID: config.model ?? ""
427
+ };
428
+ const toolsConfig = this.buildToolsConfig(config);
429
+ if (toolsConfig) promptBody.tools = toolsConfig;
430
+ if (config.agent) promptBody.agent = config.agent;
431
+ else if (config.custom_agent) promptBody.agent = "custom";
432
+ if (config.custom_agent?.prompt) promptBody.system = config.custom_agent.prompt;
433
+ if (config.format) promptBody.format = config.format;
434
+ if (config.variant) promptBody.variant = config.variant;
435
+ if (config.permission && this.opencodeModule.apiVersion === "v1") promptBody.permission = config.permission;
436
+ return promptBody;
437
+ }
438
+ buildCreateSessionParameters(config, sessionQuery) {
439
+ if (!this.opencodeModule) throw new Error("OpenCode SDK module is not loaded");
440
+ const createBody = { title: `promptfoo-${Date.now()}` };
441
+ if (config.permission && this.opencodeModule.apiVersion === "v2") createBody.permission = config.permission;
442
+ if (this.opencodeModule.apiVersion === "v2") return {
443
+ ...sessionQuery,
444
+ ...createBody
445
+ };
446
+ return {
447
+ body: createBody,
448
+ query: sessionQuery
449
+ };
450
+ }
451
+ buildPromptParameters(config, prompt, sessionId, sessionQuery) {
452
+ if (!this.opencodeModule) throw new Error("OpenCode SDK module is not loaded");
453
+ const promptBody = this.buildPromptBody(config, prompt);
454
+ if (this.opencodeModule.apiVersion === "v2") return {
455
+ sessionID: sessionId,
456
+ ...sessionQuery,
457
+ ...promptBody
458
+ };
459
+ return {
460
+ path: getSessionPath(sessionId),
461
+ body: promptBody,
462
+ query: sessionQuery
463
+ };
464
+ }
465
+ buildProviderResponse(config, response, sessionId) {
466
+ const responseData = unwrapOpenCodeResult(response);
467
+ const assistantMessage = responseData?.info;
468
+ const parts = responseData?.parts ?? [];
469
+ let output = "";
470
+ for (const part of parts) if (part.type === "text" && part.text) output += (output ? "\n" : "") + part.text;
471
+ if (config.format?.type === "json_schema") if (assistantMessage?.structured !== void 0) output = JSON.stringify(assistantMessage.structured);
472
+ else output = normalizeStructuredText(output) ?? output;
473
+ const tokens = assistantMessage?.tokens;
474
+ return {
475
+ output,
476
+ tokenUsage: tokens ? {
477
+ prompt: tokens.input ?? 0,
478
+ completion: tokens.output ?? 0,
479
+ total: (tokens.input ?? 0) + (tokens.output ?? 0)
480
+ } : void 0,
481
+ cost: assistantMessage?.cost ?? 0,
482
+ raw: JSON.stringify(response),
483
+ sessionId
484
+ };
485
+ }
486
+ handleCallError(error, callOptions) {
487
+ if (error instanceof Error && error.name === "AbortError" || callOptions?.abortSignal?.aborted) {
488
+ require_logger.logger.warn("OpenCode SDK call aborted");
489
+ return { error: "OpenCode SDK call aborted" };
490
+ }
491
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT" && "message" in error && typeof error.message === "string" && error.message.includes("opencode")) {
492
+ const cliError = dedent.default`The OpenCode CLI is required but not installed.
493
+
494
+ The OpenCode SDK requires the 'opencode' CLI to be installed and available in your PATH.
495
+
496
+ Install it with:
497
+ curl -fsSL https://opencode.ai/install | bash
498
+
499
+ Or see: https://opencode.ai for other installation methods.`;
500
+ require_logger.logger.error(cliError);
501
+ return { error: cliError };
502
+ }
503
+ const errorMessage = error instanceof Error ? error.message : String(error);
504
+ require_logger.logger.error("Error calling OpenCode SDK", { error });
505
+ return { error: `Error calling OpenCode SDK: ${errorMessage}` };
506
+ }
507
+ async callApi(prompt, context, callOptions) {
508
+ const { config, isTempDir, workingDir } = this.prepareCall(context);
509
+ const mcpConfig = config.mcp && Object.keys(config.mcp).length > 0 ? config.mcp : void 0;
510
+ const cacheResult = await require_cometapi.initializeAgenticCache({
511
+ cacheKeyPrefix: "opencode:sdk",
512
+ workingDir: config.working_dir ? workingDir : void 0,
513
+ bustCache: context?.bustCache,
514
+ mcp: mcpConfig,
515
+ cacheMcp: config.cache_mcp
516
+ }, {
517
+ prompt,
518
+ provider_id: config.provider_id,
519
+ model: config.model,
520
+ tools: this.buildToolsConfig(config),
521
+ permission: config.permission,
522
+ agent: config.agent,
523
+ custom_agent: config.custom_agent,
524
+ workspace: config.workspace,
525
+ format: config.format,
526
+ variant: config.variant
527
+ });
528
+ const cachedResponse = await require_cometapi.getCachedResponse(cacheResult, "OpenCode SDK");
529
+ if (cachedResponse) return cachedResponse;
530
+ if (callOptions?.abortSignal?.aborted) return { error: "OpenCode SDK call aborted before it started" };
531
+ let ephemeralSession;
532
+ try {
533
+ await this.ensureClient(config);
534
+ const session = await this.getOrCreateSession(config, workingDir);
535
+ ephemeralSession = session.ephemeralSession;
536
+ const promptOptions = this.buildPromptParameters(config, prompt, session.sessionId, session.sessionQuery);
537
+ require_logger.logger.debug(`OpenCode SDK prompt options:`, promptOptions);
538
+ const client = this.client;
539
+ if (!client) throw new Error("OpenCode SDK client is not initialized");
540
+ const response = await client.session.prompt(promptOptions);
541
+ require_logger.logger.debug(`OpenCode SDK response received`);
542
+ const providerResponse = this.buildProviderResponse(config, response, session.sessionId);
543
+ await require_cometapi.cacheResponse(cacheResult, providerResponse, "OpenCode SDK");
544
+ require_logger.logger.debug(`OpenCode SDK response: ${providerResponse.output.slice(0, 100)}...`);
545
+ return providerResponse;
546
+ } catch (error) {
547
+ return this.handleCallError(error, callOptions);
548
+ } finally {
549
+ if (ephemeralSession) try {
550
+ await this.deleteSession(ephemeralSession);
551
+ } catch (err) {
552
+ require_logger.logger.debug(`Failed to delete non-persistent session ${ephemeralSession.id}: ${err}`);
553
+ }
554
+ if (isTempDir && workingDir) fs.default.rmSync(workingDir, {
555
+ recursive: true,
556
+ force: true
557
+ });
558
+ }
559
+ }
560
+ };
561
+ //#endregion
562
+ exports.OpenCodeSDKProvider = OpenCodeSDKProvider;
563
+
564
+ //# sourceMappingURL=opencode-sdk-BL764Jdi.cjs.map