promptfoo 0.121.2 → 0.121.4

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 (379) hide show
  1. package/README.md +2 -0
  2. package/dist/src/{ListApp-Du7YVwj5.js → ListApp-DQkFNqE9.js} +1 -1
  3. package/dist/src/{accounts-B0pgC1oV.js → accounts-DdJ2pHMI.js} +5 -5
  4. package/dist/src/{accounts-CiBLOnA7.js → accounts-DhMYUUbu.js} +5 -5
  5. package/dist/src/{accounts-gtkH-5KX.cjs → accounts-Dy17bs4D.cjs} +5 -5
  6. package/dist/src/{accounts-Bm2D8Db9.js → accounts-F9d_5sMC.js} +6 -6
  7. package/dist/src/{cometapi-C4xSqeID.cjs → agentic-utils-BpX5b23w.cjs} +24 -62
  8. package/dist/src/{cometapi-CUQq3H_a.js → agentic-utils-P172hM8B.js} +4 -61
  9. package/dist/src/agentic-utils-qFlm6zes.js +153 -0
  10. package/dist/src/{agentic-utils-DS1g3GLF.js → agentic-utils-w68v6_Dz.js} +3 -3
  11. package/dist/src/{agents-CmvBq8LV.js → agents-8FDnTriG.js} +6 -7
  12. package/dist/src/{agents-DbRtpYxR.cjs → agents-BahDpe5G.cjs} +255 -20
  13. package/dist/src/{agents-DgF2zDag.js → agents-C-R_jfzI.js} +255 -20
  14. package/dist/src/{agents-9qiOy0ho.js → agents-CgaMXvLM.js} +5 -7
  15. package/dist/src/{agents-Di9DKPzn.cjs → agents-D7-HGxUj.cjs} +5 -7
  16. package/dist/src/{agents-CBr9A01V.js → agents-DJ35I3Nt.js} +255 -20
  17. package/dist/src/{agents-cLXA8a_8.js → agents-aYPQLf8W.js} +5 -9
  18. package/dist/src/{agents-D__IdAlg.js → agents-pQeBEXMm.js} +255 -21
  19. package/dist/src/{aimlapi-B4rcnZgv.js → aimlapi-BCq3MHeL.js} +8 -14
  20. package/dist/src/{aimlapi-DHJU_kcV.js → aimlapi-BD6J9oKt.js} +7 -14
  21. package/dist/src/{aimlapi-BvlNH0gr.cjs → aimlapi-qcK4OT55.cjs} +8 -15
  22. package/dist/src/{aimlapi-CnkC2HqE.js → aimlapi-sgYnkE54.js} +7 -16
  23. package/dist/src/app/app/tsconfig.app.tsbuildinfo +1 -0
  24. package/dist/src/app/assets/Report-CQYFezYu.js +1 -0
  25. package/dist/src/app/assets/index-BXGkeMwh.css +1 -0
  26. package/dist/src/app/assets/index-BzJt18Jz.js +385 -0
  27. package/dist/src/app/assets/rolldown-runtime-COnpUsM8.js +1 -0
  28. package/dist/src/app/assets/scroll-timeline-D9IT_e8Z.js +1 -0
  29. package/dist/src/app/assets/sync-IjzpWrOE.js +4 -0
  30. package/dist/src/app/assets/vendor-charts-BNdH8TCw.js +36 -0
  31. package/dist/src/app/assets/vendor-markdown-Ch00wnNI.js +29 -0
  32. package/dist/src/app/assets/vendor-react-CVvmk1UB.js +9 -0
  33. package/dist/src/app/assets/vendor-utils-BnEYbx2Q.js +37 -0
  34. package/dist/src/app/index.html +7 -7
  35. package/dist/src/{audio-Dz3z7s3J.js → audio-B7izf48x.js} +4 -5
  36. package/dist/src/{audio-CGMyULza.cjs → audio-BQtNuYBj.cjs} +4 -4
  37. package/dist/src/{audio-Bkv46et0.js → audio-COrn8rM6.js} +4 -4
  38. package/dist/src/{audio-ClI_AFre.js → audio-DcVKoInv.js} +4 -4
  39. package/dist/src/{base-CGrhspbK.cjs → base-D-670DX8.cjs} +3 -3
  40. package/dist/src/{base-CpjcHe4e.js → base-PYJvBE1i.js} +3 -3
  41. package/dist/src/{base-Dy1V8--Z.js → base-fZ9wgg50.js} +3 -3
  42. package/dist/src/{base-DLKtKMFh.js → base-yrI1Yal4.js} +3 -3
  43. package/dist/src/{blobs-BDbfYdrJ.js → blobs-BCZavS8s.js} +4 -4
  44. package/dist/src/{blobs-CMHN0Qcz.js → blobs-BQWqnnvL.js} +4 -4
  45. package/dist/src/{blobs-CBO20krR.js → blobs-C-F78Kfn.js} +3 -3
  46. package/dist/src/{blobs-D23XLin-.cjs → blobs-D2FAd1Q5.cjs} +3 -3
  47. package/dist/src/cache-BIyPcp5v.cjs +376 -0
  48. package/dist/src/cache-C4Xb-hNb.js +310 -0
  49. package/dist/src/cache-Cr9oLMUa.js +3 -0
  50. package/dist/src/cache-D5NZmMiT.js +310 -0
  51. package/dist/src/cache-DbLsVWB2.cjs +3 -0
  52. package/dist/src/cache-mb7c8hbp.js +280 -0
  53. package/dist/src/{chat-C2jrdPMx.js → chat-0bwXjVP0.js} +3 -13
  54. package/dist/src/{chat-C1Qst7jL.cjs → chat-BPXSW8Bv.cjs} +3 -13
  55. package/dist/src/{chat-DJIw17u0.js → chat-BfPaS15_.js} +68 -42
  56. package/dist/src/{chat-CgF-J-Jj.cjs → chat-CclRbxGf.cjs} +68 -42
  57. package/dist/src/{chat-BiKyneZl.js → chat-Dr3DUQ0D.js} +68 -42
  58. package/dist/src/{chat-DqxYYtWA.js → chat-I9izLm49.js} +67 -41
  59. package/dist/src/{chat-CzkrVDfz.js → chat-MKxMnZJZ.js} +3 -13
  60. package/dist/src/{chat-qmatte1u.js → chat-mW0ORo8G.js} +3 -14
  61. package/dist/src/{chatkit-DKyPi1Gs.cjs → chatkit-BoWoSgXl.cjs} +4 -4
  62. package/dist/src/{chatkit-65VXf5SR.js → chatkit-CJnHRRMM.js} +4 -4
  63. package/dist/src/{chatkit-Be-Q-a9F.js → chatkit-Cv6AhukM.js} +4 -4
  64. package/dist/src/{chatkit-BxFvW8KY.js → chatkit-zUIVoDos.js} +4 -4
  65. package/dist/src/{claude-agent-sdk-Apiy0iaz.js → claude-agent-sdk-BQNuLaAK.js} +41 -18
  66. package/dist/src/{claude-agent-sdk-D9Z5Pr9X.cjs → claude-agent-sdk-CPJo3dBQ.cjs} +45 -22
  67. package/dist/src/{claude-agent-sdk-D2bJee9S.js → claude-agent-sdk-Dtq_L-Sc.js} +40 -17
  68. package/dist/src/{claude-agent-sdk-DfCoW0E6.js → claude-agent-sdk-nfAIcxNf.js} +42 -20
  69. package/dist/src/{cloud-C0dlstV_.js → cloud-DQZ5sVjW.js} +25 -13
  70. package/dist/src/cloud-Hphvo8kr.js +3 -0
  71. package/dist/src/{cloudflare-ai-8TDxHR0x.js → cloudflare-ai-BIB567w6.js} +5 -14
  72. package/dist/src/{cloudflare-ai-g7PB6VHR.js → cloudflare-ai-DGLte7Py.js} +5 -14
  73. package/dist/src/{cloudflare-ai-CknbZ5LJ.cjs → cloudflare-ai-Dl3N9OVD.cjs} +6 -15
  74. package/dist/src/{cloudflare-ai-BxAGvfju.js → cloudflare-ai-DlKr0rY7.js} +5 -15
  75. package/dist/src/{cloudflare-gateway-B9HWA5wf.js → cloudflare-gateway-BDZrYydE.js} +4 -16
  76. package/dist/src/{cloudflare-gateway-BSnDmHYo.cjs → cloudflare-gateway-BYDp495F.cjs} +4 -15
  77. package/dist/src/{cloudflare-gateway-CKDb4dJ8.js → cloudflare-gateway-CiIZHU0Q.js} +5 -164
  78. package/dist/src/{cloudflare-gateway-CP9QEWYS.js → cloudflare-gateway-DI1HNP5F.js} +4 -15
  79. package/dist/src/codex-sdk-BAmYE7qy.js +3 -0
  80. package/dist/src/codex-sdk-C2_M2pl_.cjs +1172 -0
  81. package/dist/src/codex-sdk-CErXn7qh.js +1165 -0
  82. package/dist/src/codex-sdk-CWEnH70W.cjs +2 -0
  83. package/dist/src/codex-sdk-CpqiOqDO.js +1164 -0
  84. package/dist/src/codex-sdk-Rtky3M4I.js +1165 -0
  85. package/dist/src/{cometapi-BL9yvj_f.js → cometapi-BUlt_ELa.js} +8 -15
  86. package/dist/src/{cometapi-DFNiKmSz.js → cometapi-CtJ-mS8R.js} +8 -16
  87. package/dist/src/cometapi-DT-jlVCB.js +55 -0
  88. package/dist/src/cometapi-UVOryo4W.cjs +55 -0
  89. package/dist/src/{completion-CM6oK8PS.cjs → completion-BozdoXba.cjs} +7 -62
  90. package/dist/src/{completion-5MzrpJxT.js → completion-Dnxn7E-j.js} +8 -57
  91. package/dist/src/{completion-qRoZAYRB.js → completion-HUe8wDhZ.js} +8 -57
  92. package/dist/src/{completion-DZ083F31.js → completion-x0a_c2y1.js} +8 -57
  93. package/dist/src/{createHash-CTQmL3G2.js → createHash-4gFQpDDv.js} +3 -3
  94. package/dist/src/{createHash-CfZSc0b4.cjs → createHash-B7KvgoOD.cjs} +4 -4
  95. package/dist/src/{createHash-Da8fMwqB.js → createHash-ChI45QR1.js} +3 -3
  96. package/dist/src/{createHash-DmPQkvBh.js → createHash-CwDVU5xr.js} +3 -3
  97. package/dist/src/{docker-ExVyLp0S.js → docker-CQmlA2NU.js} +7 -14
  98. package/dist/src/{docker-Bb5dcxr8.js → docker-ClnmCf1Z.js} +6 -14
  99. package/dist/src/{docker-BvfL2BrW.js → docker-DCgsveLD.js} +6 -16
  100. package/dist/src/{docker-DcF2pRrj.cjs → docker-DS4_Osau.cjs} +7 -15
  101. package/dist/src/embedding-D3xTseo7.js +59 -0
  102. package/dist/src/embedding-DD9wa3ae.js +58 -0
  103. package/dist/src/embedding-I45KG3o7.cjs +63 -0
  104. package/dist/src/embedding-nFbumxcv.js +58 -0
  105. package/dist/src/entrypoint.js +69 -6
  106. package/dist/src/{errors-P6ll7XSJ.js → errors-Cw810C93.js} +1 -1
  107. package/dist/src/{esm-CaIwzWR5.js → esm-C7PnfdF8.js} +16 -7
  108. package/dist/src/{esm-CnNt7sI4.cjs → esm-CtEPLdAj.cjs} +15 -6
  109. package/dist/src/{esm-Cd1AjG1D.js → esm-Dh4dOLlt.js} +15 -6
  110. package/dist/src/{esm-C03C-mv3.js → esm-tVgYPY-f.js} +27 -18
  111. package/dist/src/eval-CzJFfFO9.js +3 -0
  112. package/dist/src/{eval-Dg2nG4v2.js → eval-u4UVafl6.js} +49 -20
  113. package/dist/src/{evalResult-BDMqrapS.js → evalResult-Bgm9ZH31.js} +7 -7
  114. package/dist/src/{evalResult-BBRNtX4I.js → evalResult-D3hVYFis.js} +7 -7
  115. package/dist/src/evalResult-D8MT9p0s.js +3 -0
  116. package/dist/src/evalResult-DElBuddX.js +2 -0
  117. package/dist/src/evalResult-Dvc-iucu.cjs +2 -0
  118. package/dist/src/{evalResult-fuaI8HkH.cjs → evalResult-KZqXl4XP.cjs} +7 -7
  119. package/dist/src/evaluator-CVessDWe.js +3 -0
  120. package/dist/src/{evaluator-BhoWwp5b.js → evaluator-IvuDYSvQ.js} +3080 -1254
  121. package/dist/src/{extractor-D25qpmGX.js → extractor-CAfTSraf.js} +6 -6
  122. package/dist/src/{extractor-DReVID0K.js → extractor-DNSeBVOJ.js} +6 -6
  123. package/dist/src/{extractor-C0EVHewb.js → extractor-Dk6bRWkv.js} +6 -6
  124. package/dist/src/{extractor-pYLLi3wS.cjs → extractor-WVPOrH43.cjs} +6 -6
  125. package/dist/src/{fetch-HaqdX7U1.js → fetch-B0Z3Oe4k.js} +218 -55
  126. package/dist/src/{fetch-Dxpd4_sr.js → fetch-BEWnXrrG.js} +195 -45
  127. package/dist/src/fetch-C7bGKDlQ.js +3 -0
  128. package/dist/src/{fetch-BPkYtG8K.cjs → fetch-CJU5ELPa.cjs} +223 -48
  129. package/dist/src/{fetch-Cwxnd8zz.js → fetch-Di00EQrc.js} +218 -55
  130. package/dist/src/{fileExtensions-Ds-foDzt.js → fileExtensions-AWa2ZML4.js} +1 -1
  131. package/dist/src/{fileExtensions-LcDYkU4v.js → fileExtensions-BArZuxsI.js} +1 -1
  132. package/dist/src/{formatDuration-DgBVMN65.js → formatDuration-DZzPsexs.js} +1 -1
  133. package/dist/src/{genaiTracer-D3fD9dNV.js → genaiTracer-COYDi-tC.js} +6 -2
  134. package/dist/src/{genaiTracer-C1rxGO8Q.js → genaiTracer-DWdZ28hY.js} +6 -2
  135. package/dist/src/{genaiTracer-70Z8BIuV.js → genaiTracer-XnrcgDCe.js} +6 -2
  136. package/dist/src/{genaiTracer-DN4dQywX.cjs → genaiTracer-yRuxj9-L.cjs} +7 -3
  137. package/dist/src/golang/wrapper.go +1 -1
  138. package/dist/src/{graders-DU49_J8Y.cjs → graders--zknU_uk.cjs} +5747 -3206
  139. package/dist/src/graders-BOAzQEUe.cjs +2 -0
  140. package/dist/src/graders-D4BTsZdG2.js +3 -0
  141. package/dist/src/graders-DOJK1XpV.js +2 -0
  142. package/dist/src/graders-NAv9LcBn.js +2 -0
  143. package/dist/src/{graders-BTeBGqjJ.js → graders-Zy3x0zqX.js} +5727 -3218
  144. package/dist/src/{graders-Bj_Odv7c.js → graders-eIHhRqoC.js} +5719 -3210
  145. package/dist/src/{graders-DP7KFFo-.js → graders-pvbReLLn.js} +5728 -3219
  146. package/dist/src/{image-B0h9VEMc.js → image-9302QVqR.js} +4 -4
  147. package/dist/src/{image-CHfWvljl.js → image-B5Mv-Z3h.js} +8 -8
  148. package/dist/src/{image-DS-o-0ph.js → image-DVz2RiMF.js} +8 -8
  149. package/dist/src/{image-C1madmKh.cjs → image-De2FBmYV.cjs} +4 -4
  150. package/dist/src/{image-B02ogr_b.js → image-dnoUgPrC.js} +4 -5
  151. package/dist/src/{image-Dpxa1Jt6.js → image-qUpPvmNZ.js} +8 -8
  152. package/dist/src/{image-Bb4vWQLM.js → image-u7-rKnYU.js} +4 -4
  153. package/dist/src/{image-BLmROtN3.cjs → image-x6KqLQl4.cjs} +8 -8
  154. package/dist/src/index.cjs +3728 -1482
  155. package/dist/src/index.d.cts +3232 -79
  156. package/dist/src/index.d.ts +3232 -79
  157. package/dist/src/index.js +3735 -1490
  158. package/dist/src/{interactiveCheck-BgLZUIt3.js → interactiveCheck-CLERUB0c.js} +2 -2
  159. package/dist/src/{knowledgeBase-DOO_BM9b.cjs → knowledgeBase-Bpoe_nLu.cjs} +6 -8
  160. package/dist/src/{knowledgeBase-D33Ty2l6.js → knowledgeBase-Dgc7CBWF.js} +6 -8
  161. package/dist/src/{knowledgeBase-B3OoKIej.js → knowledgeBase-RhFPGWDc.js} +6 -8
  162. package/dist/src/{knowledgeBase-CYTLHOt1.js → knowledgeBase-lm9RXSAm.js} +6 -9
  163. package/dist/src/{litellm-NbjknEh6.js → litellm-C2kqjxqp.js} +6 -14
  164. package/dist/src/{litellm-I_hbp_dc.cjs → litellm-CoyI4IAl.cjs} +6 -15
  165. package/dist/src/{litellm-TrljxD9G.js → litellm-DRjpcSa7.js} +5 -14
  166. package/dist/src/{litellm-AaeZcZQF.js → litellm-p37R1dzQ.js} +5 -16
  167. package/dist/src/{logger-DLcq4dWf.js → logger-B88EkIn6.js} +48 -23
  168. package/dist/src/{logger-Cp1GPUjj.cjs → logger-COuQb2xB.cjs} +77 -22
  169. package/dist/src/{logger-CT3IKMKA.js → logger-Ct2S6Yx-.js} +48 -23
  170. package/dist/src/{logger-KkObSCzq.js → logger-DksKw1Qc.js} +48 -23
  171. package/dist/src/{luma-ray-f6I2fft-.js → luma-ray-B863CmuZ.js} +6 -10
  172. package/dist/src/{luma-ray-DDsjcgZZ.js → luma-ray-BTTLtqQ8.js} +7 -10
  173. package/dist/src/{luma-ray-Due0n7di.cjs → luma-ray-BxVKaW2a.cjs} +6 -10
  174. package/dist/src/{luma-ray-BS2_tY8L.js → luma-ray-KgTCXrZC.js} +6 -12
  175. package/dist/src/main.d.ts +1 -26
  176. package/dist/src/main.js +1011 -548
  177. package/dist/src/{messages-Bs1kC7P4.cjs → messages-811uVVW5.cjs} +74 -19
  178. package/dist/src/{messages-BS17jdMx.js → messages-BTQz42fn.js} +74 -19
  179. package/dist/src/{messages-ZJk778GH.js → messages-MYTQ2TWp.js} +74 -19
  180. package/dist/src/{messages-D0lx5qK7.js → messages-zWbkLLHz.js} +74 -19
  181. package/dist/src/{meteor-D-SotUw9.js → meteor-CU5UAE-H.js} +1 -1
  182. package/dist/src/{meteor-DLZZ3osF.cjs → meteor-Co1VQ1u5.cjs} +1 -1
  183. package/dist/src/{meteor-44VjEACX.js → meteor-DHdzY1Ss.js} +1 -1
  184. package/dist/src/{meteor-DUiCJRC-.js → meteor-DuAFv6gF.js} +1 -1
  185. package/dist/src/{modelslab-Bmni6skY.js → modelslab-D0erNWKe.js} +7 -10
  186. package/dist/src/{modelslab-DRb74SP4.js → modelslab-DIq-6y7x.js} +7 -10
  187. package/dist/src/{modelslab-CoUX6Jc_.cjs → modelslab-Dk1JAtVo.cjs} +7 -10
  188. package/dist/src/{modelslab-Bx9IrZfS.js → modelslab-wu9yi5GE.js} +7 -11
  189. package/dist/src/{nova-reel-BfPq-0Yk.js → nova-reel-CCFRfeRb.js} +7 -10
  190. package/dist/src/{nova-reel-C_QM18Xn.cjs → nova-reel-CrLXVKQf.cjs} +6 -10
  191. package/dist/src/{nova-reel-bgjxilYW.js → nova-reel-DQrm74ng.js} +6 -10
  192. package/dist/src/{nova-reel-D_W1tjMH.js → nova-reel-gr11WG7f.js} +6 -12
  193. package/dist/src/{nova-sonic-DIGQNR07.js → nova-sonic-BYdp-QLs.js} +5 -7
  194. package/dist/src/{nova-sonic-CFb5GYhg.js → nova-sonic-B_ZXcUJB.js} +4 -7
  195. package/dist/src/{nova-sonic-De1HW5fD.js → nova-sonic-TDgrlTk7.js} +4 -9
  196. package/dist/src/{nova-sonic-zfcljeRp.cjs → nova-sonic-i5tUvXKn.cjs} +4 -7
  197. package/dist/src/{openai-DElQ-fPX.js → openai-DhVEmgeZ.js} +6 -3
  198. package/dist/src/{openai-DhbB7eWK.js → openai-Qsvz25mV.js} +6 -3
  199. package/dist/src/{openai-Cuif0GEt.cjs → openai-URNyItar.cjs} +6 -3
  200. package/dist/src/{openai-j-sE2O7r.js → openai-iYtrXzOX.js} +6 -3
  201. package/dist/src/openclaw-CLWrW03k.js +1200 -0
  202. package/dist/src/openclaw-CnQ363Wi.js +1199 -0
  203. package/dist/src/openclaw-CwzlQSQX.js +1199 -0
  204. package/dist/src/openclaw-wX9rtfke.cjs +1205 -0
  205. package/dist/src/{opencode-sdk-B3CWY9h_.js → opencode-sdk-BUu5Nevv.js} +12 -14
  206. package/dist/src/{opencode-sdk-BL764Jdi.cjs → opencode-sdk-BZ2idgYA.cjs} +16 -18
  207. package/dist/src/{opencode-sdk-0j6rTWNb.js → opencode-sdk-BxD8vXp_.js} +12 -15
  208. package/dist/src/{opencode-sdk-C2y6UkP2.js → opencode-sdk-GI2KaAXq.js} +12 -14
  209. package/dist/src/{otlpReceiver-C99PPb48.js → otlpReceiver-B2z58l4e.js} +154 -98
  210. package/dist/src/{otlpReceiver-CGq6LspY.cjs → otlpReceiver-BfcVq2Nq.cjs} +154 -98
  211. package/dist/src/{otlpReceiver-D89fR-rC.js → otlpReceiver-BntK801g.js} +154 -98
  212. package/dist/src/{otlpReceiver-CdNBdbsk.js → otlpReceiver-DmVulbhC.js} +154 -98
  213. package/dist/src/{providerRegistry-CD8MEar9.js → providerRegistry-Bvh8mv85.js} +2 -2
  214. package/dist/src/{providerRegistry-DM8rZYol.js → providerRegistry-CPQ_CmVO.js} +2 -2
  215. package/dist/src/{providerRegistry-Civky8Ar.cjs → providerRegistry-CQMdTmHP.cjs} +2 -2
  216. package/dist/src/{providerRegistry-B0RUOLI_.js → providerRegistry-CWoPjKFZ.js} +2 -2
  217. package/dist/src/{providers-CgKOSgTR.cjs → providers-1eKkXBKp.cjs} +1435 -930
  218. package/dist/src/{providers-BlqUifFg.js → providers-BV_KMZje.js} +1419 -944
  219. package/dist/src/providers-Bp4S-FvO.js +2 -0
  220. package/dist/src/providers-DV3ax9e_.cjs +3 -0
  221. package/dist/src/{providers-D8lF1sqW.js → providers-Domz_llv.js} +1427 -952
  222. package/dist/src/{providers-Dk_6ocUX.js → providers-DruaQfwu.js} +1424 -949
  223. package/dist/src/providers-iUt5fbAN.js +3 -0
  224. package/dist/src/providers-u9Enmfok.js +2 -0
  225. package/dist/src/python/persistent_wrapper.py +0 -5
  226. package/dist/src/{pythonUtils-D6fwaDSg.js → pythonUtils-C2UQ30Rz.js} +4 -4
  227. package/dist/src/{pythonUtils-D5nxkQ0P.js → pythonUtils-Cldx7huE.js} +4 -4
  228. package/dist/src/{pythonUtils-C3py6GC1.js → pythonUtils-CnndUbW-.js} +3 -3
  229. package/dist/src/{pythonUtils-CTU3Y3lw.cjs → pythonUtils-tAJvvpS-.cjs} +3 -3
  230. package/dist/src/{quiverai-CIaELU_m.js → quiverai-CtWi6x_g.js} +4 -4
  231. package/dist/src/{quiverai-PdShCPox.cjs → quiverai-DFotyafY.cjs} +4 -4
  232. package/dist/src/{quiverai-BbOUOn2L.js → quiverai-DR0SnIQV.js} +4 -4
  233. package/dist/src/{quiverai-uH-dcTIr.js → quiverai-aPPvXOgn.js} +4 -5
  234. package/dist/src/render-CH-62LbA.js +135 -0
  235. package/dist/src/render-CMEpfLaO.js +136 -0
  236. package/dist/src/{render-Drod8m7K.js → render-CgVDrJmM.js} +2 -3
  237. package/dist/src/render-DHIZ6_k8.js +135 -0
  238. package/dist/src/render-DfQSFxGE.cjs +165 -0
  239. package/dist/src/{responses-DIR9Ud3j.js → responses--OsX2aYW.js} +23 -14
  240. package/dist/src/{responses-D8SBTL64.cjs → responses-Bi9vBuW_.cjs} +24 -15
  241. package/dist/src/{responses-CB2jwoAr.js → responses-C-flexAY.js} +24 -15
  242. package/dist/src/{responses-WNGNYe3K.js → responses-DL9m8CyY.js} +24 -15
  243. package/dist/src/{rubyUtils-DhCAlxZr.cjs → rubyUtils-B6eljPuh.cjs} +3 -3
  244. package/dist/src/{rubyUtils-BcuGX77l.js → rubyUtils-CYSQEG4a.js} +3 -3
  245. package/dist/src/rubyUtils-D1L2d3jb.js +3 -0
  246. package/dist/src/rubyUtils-DUbq4tff.cjs +2 -0
  247. package/dist/src/{rubyUtils-BUVePouc.js → rubyUtils-DVLeA2jg.js} +3 -3
  248. package/dist/src/{rubyUtils-Boc4HZzX.js → rubyUtils-DsGrTx8R.js} +3 -3
  249. package/dist/src/{sagemaker-CNBxx5CJ.js → sagemaker-BVkaG2-l.js} +14 -18
  250. package/dist/src/{sagemaker-CemTFp2h.js → sagemaker-BveBvuxm.js} +14 -18
  251. package/dist/src/{sagemaker-YSyBXQQh.js → sagemaker-D67yzMzs.js} +14 -19
  252. package/dist/src/{sagemaker-Cl28mZU2.cjs → sagemaker-XnfhheQv.cjs} +14 -18
  253. package/dist/src/{scanner-BsBlNXNn.js → scanner-1DqWi1Ej.js} +130 -35
  254. package/dist/src/server/golang/wrapper.go +1 -1
  255. package/dist/src/server/index.js +3757 -1511
  256. package/dist/src/server/python/persistent_wrapper.py +0 -5
  257. package/dist/src/{server-CqzrVGpF.js → server-BNYztJkh.js} +128 -9
  258. package/dist/src/{server-CuxBbeSY.js → server-BSB45Nt9.js} +127 -8
  259. package/dist/src/{server-VWgWb00X.js → server-D6Il2Sob.js} +126 -7
  260. package/dist/src/server-DCtHUqlp.js +3 -0
  261. package/dist/src/server-DaA2eR26.cjs +2 -0
  262. package/dist/src/{server-C_7Ax-hA.cjs → server-Dx2TyCH2.cjs} +140 -6
  263. package/dist/src/{signal-4U3mfRvL.js → signal-CE5G3a7x.js} +3 -3
  264. package/dist/src/{slack-BmVAVGaK.cjs → slack-1Rhq0EoV.cjs} +2 -2
  265. package/dist/src/{slack-DCUPTzS2.js → slack-D5Wpy8LM.js} +2 -2
  266. package/dist/src/{slack-DXMKtA-f.js → slack-DDUe-5MC.js} +2 -2
  267. package/dist/src/{slack-DOdy_kyv.js → slack-acRb0IqQ.js} +2 -2
  268. package/dist/src/store-CWOSz6D_.cjs +2 -0
  269. package/dist/src/{store-Dim__MDd.js → store-CYEy5J2D.js} +17 -5
  270. package/dist/src/{store-DLlFCC4h.cjs → store-DAAyxcy6.cjs} +17 -5
  271. package/dist/src/store-DCDBhv7B.js +3 -0
  272. package/dist/src/{store-CXGFv4aR.js → store-Dn9HUkdW.js} +17 -5
  273. package/dist/src/{store-DXilxTl-.js → store-M0b1WfYb.js} +17 -5
  274. package/dist/src/{tables-gftXzE9I.js → tables-C4CH3zRr.js} +3 -3
  275. package/dist/src/{tables-DLJPUdUE.js → tables-CsWou1Bx.js} +3 -3
  276. package/dist/src/{tables-6YKwjN9-.js → tables-DQ4WU5tX.js} +3 -3
  277. package/dist/src/{tables-DPi7wKeM.cjs → tables-DUfh1F7Z.cjs} +3 -3
  278. package/dist/src/telemetry-C1IqxcdW.js +3 -0
  279. package/dist/src/telemetry-C4ZEa_es.cjs +2 -0
  280. package/dist/src/{telemetry-CMrFgtPB.js → telemetry-CQPez_Jp.js} +4 -4
  281. package/dist/src/{telemetry-DaX14Chu.cjs → telemetry-Dsw_faFj.cjs} +4 -4
  282. package/dist/src/{telemetry-Dthj_BbD.js → telemetry-Dvqxv3YC.js} +4 -4
  283. package/dist/src/{telemetry-Cps3mIU-.js → telemetry-dbaJ0E98.js} +4 -4
  284. package/dist/src/{text-CW1cyrwj.cjs → text-BVi-cLPJ.cjs} +1 -1
  285. package/dist/src/{text-B_UCRPp2.js → text-CZr46tp_.js} +1 -1
  286. package/dist/src/{text-TIv0QYnd.js → text-DHxdyQqT.js} +1 -1
  287. package/dist/src/{text-Db-Wt2u2.js → text-KvuD2Iko.js} +1 -1
  288. package/dist/src/{tokenUsageUtils-bVa1ga6f.cjs → tokenUsageUtils-Bb7DkZPz.cjs} +7 -3
  289. package/dist/src/{tokenUsageUtils-NYT-WKS6.js → tokenUsageUtils-C-bmyHoE.js} +7 -3
  290. package/dist/src/{tokenUsageUtils-DflFMjS0.js → tokenUsageUtils-CXrvO-wA.js} +7 -3
  291. package/dist/src/{transcription-NLVG9MT1.cjs → transcription-BvjmiYB1.cjs} +12 -16
  292. package/dist/src/{transcription-BNYURcXg.js → transcription-CJspiD2c.js} +11 -14
  293. package/dist/src/{transcription-B_OdaHp7.js → transcription-DuWDupG7.js} +10 -14
  294. package/dist/src/{transcription-s6A-bNrZ.js → transcription-V2HaAmy2.js} +10 -16
  295. package/dist/src/{transform-DECvGmzp.js → transform-Bbg6A8Jk.js} +4 -4
  296. package/dist/src/{transform-vNucnNr0.js → transform-CG0ehZNG.js} +11 -7
  297. package/dist/src/{transform-DuHvhZpj.cjs → transform-CTeuTR3S.cjs} +31 -9
  298. package/dist/src/{transform-CzK1Q0zl.cjs → transform-CUnzlsbn.cjs} +4 -4
  299. package/dist/src/{transform-aa6tmVpZ.js → transform-DYX1_Xnh.js} +5 -5
  300. package/dist/src/transform-DgKlRr73.cjs +2 -0
  301. package/dist/src/transform-M6ITAESf.js +3 -0
  302. package/dist/src/{transform-DilY9wbS.js → transform-UN5UGu8U.js} +5 -5
  303. package/dist/src/{transform-uAytVuyX.js → transform-lQrDE1BQ.js} +11 -7
  304. package/dist/src/{transform-D5HsjduX.js → transform-zDhMmzwX.js} +11 -7
  305. package/dist/src/{transformersAvailability-CEVM2GNQ.js → transformersAvailability-CcHusyhw.js} +1 -1
  306. package/dist/src/{transformersAvailability-CwayUSlh.cjs → transformersAvailability-Cju9mHgR.cjs} +1 -1
  307. package/dist/src/{transformersAvailability-D6c6ROpT.js → transformersAvailability-DLlROWhg.js} +1 -1
  308. package/dist/src/{types-DmyIJ-sR.js → types-BGQDAP8i.js} +357 -22
  309. package/dist/src/{types-CzW2QFyi.js → types-Bgh5SOn6.js} +358 -24
  310. package/dist/src/{types-C_7nyzr1.cjs → types-CeaeaZdP.cjs} +393 -22
  311. package/dist/src/{types-Cbd8uOMq.js → types-Dm9JM6Vb.js} +368 -23
  312. package/dist/src/{util-BHGHw5G1.js → util-BYvQUPp7.js} +138 -36
  313. package/dist/src/{util-B9vlHIIh.cjs → util-Bxn8emtE.cjs} +15 -168
  314. package/dist/src/{util-ZzmqNPlg.js → util-C8e5uydV.js} +19 -142
  315. package/dist/src/{util-CMy69ZgQ.js → util-C9J8ahRn.js} +18 -4
  316. package/dist/src/{util-BzMcevZc.cjs → util-CN3SrLT4.cjs} +18 -4
  317. package/dist/src/{util-BV4XUC0n.js → util-D3q0WQ-0.js} +18 -4
  318. package/dist/src/{util-Dnmk2mBQ.js → util-D9TisOyk.js} +18 -4
  319. package/dist/src/{util-B3xGByQh.js → util-DDs-7g6-.js} +138 -36
  320. package/dist/src/{util-Bv6uGDfH.js → util-DvU2Pw8c.js} +138 -36
  321. package/dist/src/{util-C1CeHl-P.js → util-DxWpWjhc.js} +13 -136
  322. package/dist/src/{util-BRYkYPTd.js → util-oGMLA7vc.js} +17 -140
  323. package/dist/src/{util-DGNOS1db.cjs → util-olYL5C6N.cjs} +143 -35
  324. package/dist/src/{utils-Cz9qXqII.cjs → utils-B05gLxER.cjs} +6 -4
  325. package/dist/src/{utils-f2-Moju7.js → utils-BLJKfv0y.js} +6 -4
  326. package/dist/src/{utils-dLokC-eR.js → utils-DJfvjyMj.js} +6 -4
  327. package/dist/src/{utils-XiOAgly5.js → utils-hXtCYanr.js} +6 -4
  328. package/dist/tsconfig.tsbuildinfo +1 -1
  329. package/package.json +66 -57
  330. package/dist/src/app/assets/index-4LKxG2CG.js +0 -439
  331. package/dist/src/app/assets/index-C3zcsZFQ.css +0 -1
  332. package/dist/src/app/assets/scroll-timeline-BdJZVXlz.js +0 -1
  333. package/dist/src/app/assets/sync-9qqYcY-B.js +0 -4
  334. package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +0 -36
  335. package/dist/src/app/assets/vendor-markdown-0tekx3KX.js +0 -29
  336. package/dist/src/app/assets/vendor-react-AtKqiNEf.js +0 -4
  337. package/dist/src/app/assets/vendor-syntax-D06x6TQF.js +0 -2
  338. package/dist/src/app/assets/vendor-utils-BvMHZmO7.js +0 -37
  339. package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
  340. package/dist/src/cache-BVeDlD87.js +0 -726
  341. package/dist/src/cache-C4Nxf52C.js +0 -756
  342. package/dist/src/cache-CeUpFm3M.cjs +0 -5
  343. package/dist/src/cache-Dh5WtQps.cjs +0 -816
  344. package/dist/src/cache-i1P6crbO.js +0 -756
  345. package/dist/src/cache-n-RCJ-hL.js +0 -6
  346. package/dist/src/cloud-BBh91EUK.js +0 -4
  347. package/dist/src/codex-sdk-C6UMlxwV.js +0 -665
  348. package/dist/src/codex-sdk-DUwKWezN.js +0 -665
  349. package/dist/src/codex-sdk-GGAw0qbD.js +0 -666
  350. package/dist/src/codex-sdk-fAO0c3yA.cjs +0 -669
  351. package/dist/src/eval-B3r2CVXr.js +0 -15
  352. package/dist/src/evalResult-5xwYnECe.js +0 -12
  353. package/dist/src/evalResult-71lY93Kj.cjs +0 -10
  354. package/dist/src/evalResult-Dx5P5cIv.js +0 -10
  355. package/dist/src/evaluator-Jx6bRZV6.js +0 -36
  356. package/dist/src/fetch-BxNb_Lp3.js +0 -5
  357. package/dist/src/graders-B_pgMLS2.js +0 -34
  358. package/dist/src/graders-DErokPDO.cjs +0 -32
  359. package/dist/src/graders-DR_uNe54.js +0 -32
  360. package/dist/src/graders-w3176Wz-.js +0 -32
  361. package/dist/src/openclaw-CSugPYAr.cjs +0 -586
  362. package/dist/src/openclaw-DiSz3I5L.js +0 -582
  363. package/dist/src/openclaw-DuvJKEW5.js +0 -580
  364. package/dist/src/openclaw-tiVYRtr-.js +0 -580
  365. package/dist/src/providers-B7V0njNs.js +0 -32
  366. package/dist/src/providers-BEwbhv0X.js +0 -30
  367. package/dist/src/providers-CH3C7zf7.js +0 -30
  368. package/dist/src/providers-zyB6k_38.cjs +0 -31
  369. package/dist/src/rubyUtils-BUHu6PhO.js +0 -5
  370. package/dist/src/rubyUtils-CP42kMvq.cjs +0 -4
  371. package/dist/src/server-DA4Cyrrq.js +0 -7
  372. package/dist/src/server-Dulb-4-K.cjs +0 -5
  373. package/dist/src/store-CXS-Q_91.js +0 -6
  374. package/dist/src/store-eYkaKMwq.cjs +0 -5
  375. package/dist/src/telemetry-BpMfhthR.cjs +0 -5
  376. package/dist/src/telemetry-Dw38hanS.js +0 -7
  377. package/dist/src/tokenUsageUtils-BDGe-iyI.js +0 -138
  378. package/dist/src/transform-DTGDnAzW.js +0 -6
  379. package/dist/src/transform-m3qNw4KP.cjs +0 -5
@@ -1,756 +0,0 @@
1
- import { t as __exportAll } from "./chunk-DEq-mXcV.js";
2
- import { _ as getEnvBool, b as getEnvString, g as getConfigDirectoryPath, i as logger, y as getEnvInt } from "./logger-CT3IKMKA.js";
3
- import { d as sleep, n as fetchWithRetries, p as REQUEST_TIMEOUT_MS } from "./fetch-Cwxnd8zz.js";
4
- import fs from "fs";
5
- import path from "path";
6
- import { createCache } from "cache-manager";
7
- import { Keyv } from "keyv";
8
- import { KeyvFile } from "keyv-file";
9
- import { randomBytes } from "crypto";
10
- //#region src/cacheMigration.ts
11
- /**
12
- * Migration sunset date: After this date, skip migration entirely.
13
- * Users who haven't upgraded by then will start with a fresh cache.
14
- *
15
- * Set to 4 months after initial release (December 2025).
16
- * After this date, this entire migration module can be removed.
17
- *
18
- * TODO(2026-04-01): Remove this migration code after sunset date.
19
- */
20
- const MIGRATION_SUNSET_DATE = /* @__PURE__ */ new Date("2026-04-01T00:00:00Z");
21
- /**
22
- * Check if migration has been sunset (date has passed).
23
- * After sunset, we skip migration entirely - users get a fresh cache.
24
- */
25
- function isMigrationSunset() {
26
- return Date.now() >= MIGRATION_SUNSET_DATE.getTime();
27
- }
28
- /**
29
- * Calculate total size of a directory recursively
30
- */
31
- function getDirSize(dirPath) {
32
- let totalSize = 0;
33
- try {
34
- const entries = fs.readdirSync(dirPath, { withFileTypes: true });
35
- for (const entry of entries) {
36
- const itemPath = path.join(dirPath, entry.name);
37
- if (entry.isDirectory()) totalSize += getDirSize(itemPath);
38
- else totalSize += fs.statSync(itemPath).size;
39
- }
40
- } catch (err) {
41
- if (err.code !== "ENOENT") logger.warn(`[Cache Migration] Error calculating directory size: ${err.message}`);
42
- }
43
- return totalSize;
44
- }
45
- /**
46
- * Check if sufficient disk space is available for migration
47
- * Returns true if check passes or cannot be performed
48
- */
49
- function checkDiskSpace(cachePath) {
50
- try {
51
- const cacheSize = getDirSize(cachePath);
52
- if (typeof fs.statfsSync === "function") {
53
- const stats = fs.statfsSync(cachePath);
54
- const availableBytes = stats.bavail * stats.bsize;
55
- const requiredBytes = cacheSize * 2 + 10 * 1024 * 1024;
56
- logger.debug(`[Cache Migration] Disk space check: need ${(requiredBytes / 1024 / 1024).toFixed(2)}MB, have ${(availableBytes / 1024 / 1024).toFixed(2)}MB available`);
57
- if (availableBytes < requiredBytes) {
58
- logger.error(`[Cache Migration] Insufficient disk space for migration. Need ${(requiredBytes / 1024 / 1024).toFixed(0)}MB, have ${(availableBytes / 1024 / 1024).toFixed(0)}MB available.`);
59
- return false;
60
- }
61
- return true;
62
- } else {
63
- logger.debug("[Cache Migration] Disk space check not available on this platform, proceeding");
64
- return true;
65
- }
66
- } catch (err) {
67
- logger.warn(`[Cache Migration] Could not check disk space: ${err.message}`);
68
- return true;
69
- }
70
- }
71
- /** Maximum number of attempts to acquire the migration lock */
72
- const MAX_LOCK_ATTEMPTS = 3;
73
- /**
74
- * Check if a process with the given PID exists.
75
- * Uses signal 0 which doesn't actually send a signal but checks process existence.
76
- * Note: On Windows, this may throw different error types but the catch block handles it.
77
- */
78
- function isProcessRunning(pid) {
79
- try {
80
- process.kill(pid, 0);
81
- return true;
82
- } catch (err) {
83
- return err.code === "EPERM";
84
- }
85
- }
86
- /**
87
- * Acquire a migration lock to prevent concurrent migrations.
88
- * Returns file descriptor if lock acquired, null if another process holds the lock.
89
- * Uses atomic file creation with 'wx' flag and includes stale lock detection.
90
- */
91
- function acquireMigrationLock(cachePath, attempt = 1) {
92
- if (attempt > MAX_LOCK_ATTEMPTS) {
93
- logger.warn(`[Cache Migration] Failed to acquire lock after ${MAX_LOCK_ATTEMPTS} attempts`);
94
- return null;
95
- }
96
- const lockFile = path.join(cachePath, ".migration.lock");
97
- try {
98
- if (!fs.existsSync(cachePath)) fs.mkdirSync(cachePath, { recursive: true });
99
- const fd = fs.openSync(lockFile, "wx");
100
- fs.writeSync(fd, process.pid.toString());
101
- fs.fsyncSync(fd);
102
- logger.debug(`[Cache Migration] Lock acquired (PID: ${process.pid})`);
103
- return fd;
104
- } catch (err) {
105
- if (err.code === "EEXIST") {
106
- try {
107
- const content = fs.readFileSync(lockFile, "utf-8");
108
- const pid = parseInt(content, 10);
109
- if (!isNaN(pid)) {
110
- if (isProcessRunning(pid)) {
111
- logger.info(`[Cache Migration] Another migration is in progress (PID: ${pid})`);
112
- return null;
113
- }
114
- logger.warn(`[Cache Migration] Removing stale lock file (PID: ${pid} not found)`);
115
- try {
116
- fs.unlinkSync(lockFile);
117
- return acquireMigrationLock(cachePath, attempt + 1);
118
- } catch (unlinkErr) {
119
- logger.error(`[Cache Migration] Failed to remove stale lock: ${unlinkErr.message}`);
120
- return null;
121
- }
122
- }
123
- } catch (readErr) {
124
- logger.warn(`[Cache Migration] Could not read lock file: ${readErr.message}`);
125
- }
126
- return null;
127
- }
128
- throw err;
129
- }
130
- }
131
- /**
132
- * Release the migration lock
133
- */
134
- function releaseMigrationLock(fd, cachePath) {
135
- if (fd === null) return;
136
- const lockFile = path.join(cachePath, ".migration.lock");
137
- try {
138
- fs.closeSync(fd);
139
- } catch (err) {
140
- logger.warn(`[Cache Migration] Failed to close lock file: ${err.message}`);
141
- }
142
- try {
143
- fs.unlinkSync(lockFile);
144
- logger.debug("[Cache Migration] Lock released");
145
- } catch (err) {
146
- logger.warn(`[Cache Migration] Failed to remove lock file: ${err.message}`);
147
- }
148
- }
149
- /**
150
- * Parse expireTime field, handling the "[object Object]" suffix bug
151
- */
152
- function parseExpireTime(expireTimeValue) {
153
- try {
154
- if (typeof expireTimeValue === "number") return expireTimeValue > 0 ? expireTimeValue : void 0;
155
- if (typeof expireTimeValue === "string") {
156
- const cleaned = expireTimeValue.replace(/\[object Object\].*$/, "");
157
- const timestamp = parseInt(cleaned, 10);
158
- if (isNaN(timestamp) || timestamp <= 0) return;
159
- return timestamp;
160
- }
161
- return;
162
- } catch (_err) {
163
- return;
164
- }
165
- }
166
- /**
167
- * Read all cache entries from cache-manager-fs-hash format
168
- */
169
- function readOldCacheEntries(cachePath) {
170
- const stats = {
171
- totalFiles: 0,
172
- successCount: 0,
173
- failureCount: 0,
174
- skippedExpired: 0,
175
- errors: []
176
- };
177
- const entries = /* @__PURE__ */ new Map();
178
- if (!fs.existsSync(cachePath)) {
179
- logger.info(`[Cache Migration] No old cache directory found at ${cachePath}`);
180
- return {
181
- entries,
182
- stats
183
- };
184
- }
185
- const diskstoreDirs = fs.readdirSync(cachePath, { withFileTypes: true }).filter((dirEntry) => dirEntry.isDirectory() && dirEntry.name.startsWith("diskstore-")).map((dirEntry) => dirEntry.name);
186
- logger.info(`[Cache Migration] Found ${diskstoreDirs.length} diskstore directories`);
187
- const shouldLogProgress = diskstoreDirs.length > 100;
188
- if (shouldLogProgress) logger.info(`[Cache Migration] Processing large cache, this may take a moment...`);
189
- const now = Date.now();
190
- let dirCount = 0;
191
- for (const dir of diskstoreDirs) {
192
- const dirPath = path.join(cachePath, dir);
193
- dirCount++;
194
- if (shouldLogProgress && dirCount % 100 === 0) logger.info(`[Cache Migration] Processed ${dirCount}/${diskstoreDirs.length} directories...`);
195
- try {
196
- const jsonFiles = fs.readdirSync(dirPath).filter((f) => f.endsWith(".json"));
197
- for (const file of jsonFiles) {
198
- const filePath = path.join(dirPath, file);
199
- stats.totalFiles++;
200
- if (stats.totalFiles % 1e3 === 0 && stats.totalFiles > 0) logger.info(`[Cache Migration] Processed ${stats.totalFiles} files...`);
201
- try {
202
- const content = fs.readFileSync(filePath, "utf-8");
203
- const oldEntry = JSON.parse(content);
204
- if (!oldEntry.key || oldEntry.val === void 0) {
205
- stats.failureCount++;
206
- stats.errors.push(`Missing required fields in ${filePath}`);
207
- continue;
208
- }
209
- const expireTime = parseExpireTime(oldEntry.expireTime);
210
- if (expireTime && expireTime <= now) {
211
- stats.skippedExpired++;
212
- continue;
213
- }
214
- const newEntry = {
215
- value: oldEntry.val,
216
- expires: expireTime
217
- };
218
- entries.set(oldEntry.key, newEntry);
219
- stats.successCount++;
220
- } catch (err) {
221
- stats.failureCount++;
222
- stats.errors.push(`Error parsing ${filePath}: ${err.message}`);
223
- }
224
- }
225
- } catch (err) {
226
- stats.failureCount++;
227
- stats.errors.push(`Error reading directory ${dirPath}: ${err.message}`);
228
- }
229
- }
230
- return {
231
- entries,
232
- stats
233
- };
234
- }
235
- /**
236
- * Validate that a cache file can be read and has the expected structure.
237
- * Returns the number of entries if valid, throws if invalid.
238
- */
239
- function validateCacheFile(cachePath, expectedEntryCount) {
240
- if (!fs.existsSync(cachePath)) throw new Error(`Cache file does not exist after write: ${cachePath}`);
241
- const content = fs.readFileSync(cachePath, "utf-8");
242
- let parsed;
243
- try {
244
- parsed = JSON.parse(content);
245
- } catch (err) {
246
- throw new Error(`Cache file is not valid JSON: ${err.message}`);
247
- }
248
- if (!Array.isArray(parsed.cache)) throw new Error("Cache file has invalid structure: missing or invalid \"cache\" array");
249
- if (typeof parsed.lastExpire !== "number") throw new Error("Cache file has invalid structure: missing or invalid \"lastExpire\" field");
250
- if (parsed.cache.length !== expectedEntryCount) throw new Error(`Cache file entry count mismatch: expected ${expectedEntryCount}, got ${parsed.cache.length}`);
251
- logger.debug(`[Cache Migration] Validated cache file: ${cachePath} (${expectedEntryCount} entries)`);
252
- }
253
- /**
254
- * Write entries in keyv-file format using atomic write operation.
255
- * Writes to a temp file first, then renames atomically to prevent corruption.
256
- * Validates the written file before returning.
257
- */
258
- function writeNewCacheFile(entries, newCachePath) {
259
- const data = {
260
- cache: Array.from(entries.entries()),
261
- lastExpire: Date.now()
262
- };
263
- const dir = path.dirname(newCachePath);
264
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
265
- const tempFile = path.join(dir, `.cache.${randomBytes(8).toString("hex")}.tmp`);
266
- try {
267
- let serialized;
268
- try {
269
- serialized = JSON.stringify(data);
270
- } catch (err) {
271
- throw new Error(`Failed to serialize cache data: ${err.message}`);
272
- }
273
- fs.writeFileSync(tempFile, serialized, "utf-8");
274
- fs.renameSync(tempFile, newCachePath);
275
- logger.debug(`[Cache Migration] Atomically wrote cache file: ${newCachePath}`);
276
- validateCacheFile(newCachePath, entries.size);
277
- } catch (err) {
278
- try {
279
- if (fs.existsSync(tempFile)) fs.unlinkSync(tempFile);
280
- } catch (_cleanupErr) {}
281
- throw err;
282
- }
283
- }
284
- /**
285
- * Create a backup of the old cache directory
286
- */
287
- function createBackup(cachePath) {
288
- const backupPath = `${cachePath}.backup.${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
289
- logger.info(`[Cache Migration] Creating backup at ${backupPath}`);
290
- if (fs.existsSync(cachePath)) fs.cpSync(cachePath, backupPath, { recursive: true });
291
- return backupPath;
292
- }
293
- /**
294
- * Mark migration as complete by creating a marker file
295
- */
296
- function markMigrationComplete(cacheBasePath, stats) {
297
- const markerPath = path.join(cacheBasePath, ".cache-migrated");
298
- const metadata = {
299
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
300
- stats,
301
- version: "4-to-7"
302
- };
303
- if (!fs.existsSync(cacheBasePath)) fs.mkdirSync(cacheBasePath, { recursive: true });
304
- fs.writeFileSync(markerPath, JSON.stringify(metadata, null, 2), "utf-8");
305
- }
306
- /**
307
- * Check if migration has already been completed.
308
- * Uses fast-path: if marker exists AND new cache file exists, skip directory scan.
309
- * Only validates old cache format when inconsistency is suspected.
310
- */
311
- function isMigrationComplete(cacheBasePath, newCacheFile) {
312
- const markerPath = path.join(cacheBasePath, ".cache-migrated");
313
- if (!fs.existsSync(markerPath)) return false;
314
- if (newCacheFile && fs.existsSync(newCacheFile)) return true;
315
- if (newCacheFile) {
316
- if (hasOldCacheFormat(cacheBasePath)) {
317
- logger.warn("[Cache Migration] Marker file exists but migration appears incomplete. Old cache format found but new cache missing. Retrying migration...");
318
- try {
319
- fs.unlinkSync(markerPath);
320
- } catch (err) {
321
- logger.warn(`[Cache Migration] Failed to remove stale marker: ${err.message}`);
322
- }
323
- return false;
324
- }
325
- }
326
- return true;
327
- }
328
- /**
329
- * Check if old cache format exists
330
- */
331
- function hasOldCacheFormat(cachePath) {
332
- let dirEntries;
333
- try {
334
- dirEntries = fs.readdirSync(cachePath, { withFileTypes: true });
335
- } catch (err) {
336
- if (err.code === "ENOENT") return false;
337
- throw err;
338
- }
339
- return dirEntries.some((dirEntry) => dirEntry.isDirectory() && dirEntry.name.startsWith("diskstore-"));
340
- }
341
- /**
342
- * Clean up old cache directories after successful migration
343
- */
344
- function cleanupOldCache(cachePath) {
345
- let dirEntries;
346
- try {
347
- dirEntries = fs.readdirSync(cachePath, { withFileTypes: true });
348
- } catch (err) {
349
- if (err.code === "ENOENT") return;
350
- throw err;
351
- }
352
- const diskstoreDirs = dirEntries.filter((dirEntry) => dirEntry.isDirectory() && dirEntry.name.startsWith("diskstore-")).map((dirEntry) => dirEntry.name);
353
- logger.info(`[Cache Migration] Cleaning up ${diskstoreDirs.length} old cache directories`);
354
- for (const dir of diskstoreDirs) {
355
- const dirPath = path.join(cachePath, dir);
356
- try {
357
- fs.rmSync(dirPath, {
358
- recursive: true,
359
- force: true
360
- });
361
- } catch (err) {
362
- logger.warn(`[Cache Migration] Failed to remove ${dirPath}: ${err.message}`);
363
- }
364
- }
365
- }
366
- /**
367
- * Clean up backup directory after successful migration
368
- * Only deletes if no valuable data was migrated AND no failures occurred
369
- */
370
- function cleanupBackup(backupPath, stats) {
371
- if (stats.successCount === 0 && stats.failureCount === 0) {
372
- logger.info(`[Cache Migration] No valid entries found (${stats.skippedExpired} expired only). Removing backup to save space.`);
373
- try {
374
- fs.rmSync(backupPath, {
375
- recursive: true,
376
- force: true
377
- });
378
- logger.info(`[Cache Migration] Backup removed: ${backupPath}`);
379
- return true;
380
- } catch (err) {
381
- logger.warn(`[Cache Migration] Failed to remove backup ${backupPath}: ${err.message}`);
382
- return false;
383
- }
384
- } else if (stats.failureCount > 0) {
385
- logger.info(`[Cache Migration] Backup kept at ${backupPath} due to ${stats.failureCount} migration errors. You may want to investigate these failures.`);
386
- return false;
387
- } else {
388
- logger.info(`[Cache Migration] Backup kept at ${backupPath} (migrated ${stats.successCount} valid entries). You can manually delete this backup if you no longer need it.`);
389
- return false;
390
- }
391
- }
392
- /**
393
- * Main migration function
394
- * Migrates cache from cache-manager v4 (cache-manager-fs-hash) to v7 (keyv-file)
395
- */
396
- function runMigration(cachePath, newCacheFilePath) {
397
- logger.info("[Cache Migration] Starting cache migration from v4 to v7");
398
- const lock = acquireMigrationLock(cachePath);
399
- if (lock === null) {
400
- logger.info("[Cache Migration] Another migration is in progress, skipping");
401
- return {
402
- success: true,
403
- stats: {
404
- totalFiles: 0,
405
- successCount: 0,
406
- failureCount: 0,
407
- skippedExpired: 0,
408
- errors: []
409
- }
410
- };
411
- }
412
- try {
413
- if (isMigrationComplete(cachePath, newCacheFilePath)) {
414
- logger.info("[Cache Migration] Migration already completed, skipping");
415
- return {
416
- success: true,
417
- stats: {
418
- totalFiles: 0,
419
- successCount: 0,
420
- failureCount: 0,
421
- skippedExpired: 0,
422
- errors: []
423
- }
424
- };
425
- }
426
- if (!hasOldCacheFormat(cachePath)) {
427
- logger.info("[Cache Migration] No old cache format detected, skipping migration");
428
- markMigrationComplete(cachePath, {
429
- totalFiles: 0,
430
- successCount: 0,
431
- failureCount: 0,
432
- skippedExpired: 0,
433
- errors: []
434
- });
435
- return {
436
- success: true,
437
- stats: {
438
- totalFiles: 0,
439
- successCount: 0,
440
- failureCount: 0,
441
- skippedExpired: 0,
442
- errors: []
443
- }
444
- };
445
- }
446
- if (!checkDiskSpace(cachePath)) {
447
- logger.error("[Cache Migration] Insufficient disk space, aborting migration");
448
- return {
449
- success: false,
450
- stats: {
451
- totalFiles: 0,
452
- successCount: 0,
453
- failureCount: 1,
454
- skippedExpired: 0,
455
- errors: ["Insufficient disk space for migration"]
456
- }
457
- };
458
- }
459
- const backupPath = createBackup(cachePath);
460
- logger.info("[Cache Migration] Reading old cache entries");
461
- const { entries, stats } = readOldCacheEntries(cachePath);
462
- logger.info(`[Cache Migration] Read ${stats.successCount} entries (${stats.failureCount} failures, ${stats.skippedExpired} expired)`);
463
- if (stats.errors.length > 0) {
464
- logger.warn(`[Cache Migration] Encountered ${stats.errors.length} errors:`);
465
- stats.errors.slice(0, 10).forEach((err) => logger.warn(` - ${err}`));
466
- if (stats.errors.length > 10) logger.warn(` ... and ${stats.errors.length - 10} more errors`);
467
- }
468
- if (entries.size > 0) {
469
- logger.info(`[Cache Migration] Writing ${entries.size} entries to new cache file: ${newCacheFilePath}`);
470
- writeNewCacheFile(entries, newCacheFilePath);
471
- } else logger.info("[Cache Migration] No entries to migrate");
472
- cleanupOldCache(cachePath);
473
- const backupDeleted = cleanupBackup(backupPath, stats);
474
- markMigrationComplete(cachePath, stats);
475
- logger.info("[Cache Migration] Migration completed successfully");
476
- return {
477
- success: true,
478
- stats,
479
- backupPath: backupDeleted ? void 0 : backupPath
480
- };
481
- } catch (err) {
482
- logger.error(`[Cache Migration] Migration failed: ${err.message}`);
483
- logger.error(`[Cache Migration] Stack trace: ${err.stack}`);
484
- return {
485
- success: false,
486
- stats: {
487
- totalFiles: 0,
488
- successCount: 0,
489
- failureCount: 1,
490
- skippedExpired: 0,
491
- errors: [err.message]
492
- }
493
- };
494
- } finally {
495
- releaseMigrationLock(lock, cachePath);
496
- }
497
- }
498
- /**
499
- * Check if migration should be run.
500
- * Returns false if:
501
- * - Migration is already complete (marker + new cache file exist)
502
- * - Migration has been sunset (date passed)
503
- * - No old cache format exists
504
- */
505
- function shouldRunMigration(cachePath, newCacheFile) {
506
- if (isMigrationSunset()) return false;
507
- if (isMigrationComplete(cachePath, newCacheFile)) return false;
508
- return hasOldCacheFormat(cachePath);
509
- }
510
- //#endregion
511
- //#region src/util/fetch/errors.ts
512
- /**
513
- * Non-transient HTTP status codes that indicate the target is unavailable or misconfigured.
514
- * These errors will not resolve on retry and should abort the scan immediately.
515
- *
516
- * - 401: Unauthorized - authentication required or invalid credentials
517
- * - 403: Forbidden - valid credentials but access denied
518
- * - 404: Not Found - target endpoint doesn't exist
519
- * - 501: Not Implemented - server doesn't support the request method
520
- *
521
- * Excluded: 500 (often transient — server crashes, DB timeouts, deployment rollouts,
522
- * or input-dependent bugs where one prompt triggers it but the next doesn't),
523
- * 502/503/504 (typically transient gateway issues).
524
- */
525
- const NON_TRANSIENT_HTTP_STATUSES = [
526
- 401,
527
- 403,
528
- 404,
529
- 501
530
- ];
531
- function isNonTransientHttpStatus(status) {
532
- return NON_TRANSIENT_HTTP_STATUSES.includes(status);
533
- }
534
- function isTransientConnectionError(error) {
535
- if (!error) return false;
536
- const code = error.code;
537
- if (code === "ECONNRESET" || code === "EPIPE") return true;
538
- const message = (error.message ?? "").toLowerCase();
539
- if (message.includes("eproto") && (message.includes("wrong version number") || message.includes("self signed") || message.includes("unable to verify") || message.includes("unknown ca") || message.includes("cert"))) return false;
540
- return message.includes("bad record mac") || message.includes("eproto") || message.includes("econnreset") || message.includes("socket hang up");
541
- }
542
- //#endregion
543
- //#region src/cache.ts
544
- var cache_exports = /* @__PURE__ */ __exportAll({
545
- clearCache: () => clearCache,
546
- disableCache: () => disableCache,
547
- enableCache: () => enableCache,
548
- fetchWithCache: () => fetchWithCache,
549
- getCache: () => getCache,
550
- isCacheEnabled: () => isCacheEnabled
551
- });
552
- let cacheInstance;
553
- let enabled = getEnvBool("PROMPTFOO_CACHE_ENABLED", true);
554
- const cacheType = getEnvString("PROMPTFOO_CACHE_TYPE") || (getEnvString("NODE_ENV") === "test" ? "memory" : "disk");
555
- /** Default cache TTL: 14 days in seconds */
556
- const DEFAULT_CACHE_TTL_SECONDS = 3600 * 24 * 14;
557
- /**
558
- * Get the cache TTL in milliseconds.
559
- * Reads from PROMPTFOO_CACHE_TTL environment variable (in seconds) or uses default.
560
- */
561
- function getCacheTtlMs() {
562
- return getEnvInt("PROMPTFOO_CACHE_TTL", DEFAULT_CACHE_TTL_SECONDS) * 1e3;
563
- }
564
- function getCache() {
565
- if (!cacheInstance) {
566
- let cachePath = "";
567
- const stores = [];
568
- let migrationFailed = false;
569
- if (cacheType === "disk" && enabled) {
570
- cachePath = getEnvString("PROMPTFOO_CACHE_PATH") || path.join(getConfigDirectoryPath(), "cache");
571
- if (!fs.existsSync(cachePath)) {
572
- logger.info(`Creating cache folder at ${cachePath}.`);
573
- fs.mkdirSync(cachePath, { recursive: true });
574
- }
575
- const newCacheFile = path.join(cachePath, "cache.json");
576
- if (shouldRunMigration(cachePath, newCacheFile)) {
577
- logger.info("[Cache] Migrating cache from v4 to v7...");
578
- try {
579
- const result = runMigration(cachePath, newCacheFile);
580
- if (result.success) {
581
- logger.info(`[Cache] Migration completed: ${result.stats.successCount} entries migrated, ${result.stats.skippedExpired} expired`);
582
- if (result.backupPath) logger.info(`[Cache] Backup kept at: ${result.backupPath}`);
583
- } else {
584
- logger.error(`[Cache] Migration failed: ${result.stats.errors.join(", ")}. Falling back to memory cache.`);
585
- migrationFailed = true;
586
- }
587
- } catch (err) {
588
- logger.error(`[Cache] Migration error: ${err.message}. Falling back to memory cache.`);
589
- migrationFailed = true;
590
- }
591
- }
592
- if (!migrationFailed) try {
593
- const keyv = new Keyv({
594
- store: new KeyvFile({ filename: newCacheFile }),
595
- ttl: getCacheTtlMs()
596
- });
597
- stores.push(keyv);
598
- } catch (err) {
599
- logger.warn(`[Cache] Failed to initialize disk cache: ${err.message}. Using memory cache instead.`);
600
- }
601
- }
602
- cacheInstance = createCache({
603
- stores,
604
- ttl: getCacheTtlMs(),
605
- refreshThreshold: 0
606
- });
607
- }
608
- return cacheInstance;
609
- }
610
- const inflightFetchResponses = /* @__PURE__ */ new Map();
611
- function serializeFetchResponse(data, status, statusText, headers, latencyMs) {
612
- return JSON.stringify({
613
- data,
614
- status,
615
- statusText,
616
- headers,
617
- latencyMs
618
- });
619
- }
620
- function deserializeFetchResponse(response, cached, cache, cacheKey) {
621
- const parsedResponse = JSON.parse(response);
622
- return {
623
- cached,
624
- data: parsedResponse.data,
625
- status: parsedResponse.status,
626
- statusText: parsedResponse.statusText,
627
- headers: parsedResponse.headers,
628
- latencyMs: parsedResponse.latencyMs,
629
- deleteFromCache: async () => {
630
- await cache.del(cacheKey);
631
- logger.debug(`Evicted from cache: ${cacheKey}`);
632
- }
633
- };
634
- }
635
- async function fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent) {
636
- const maxBodyRetries = isIdempotent ? 2 : 0;
637
- for (let bodyAttempt = 0; bodyAttempt <= maxBodyRetries; bodyAttempt++) {
638
- const fetchStart = Date.now();
639
- const resp = await fetchWithRetries(url, options, timeout, maxRetries);
640
- const fetchLatencyMs = Date.now() - fetchStart;
641
- try {
642
- return {
643
- respText: await resp.text(),
644
- resp,
645
- fetchLatencyMs
646
- };
647
- } catch (err) {
648
- if (isTransientConnectionError(err) && bodyAttempt < maxBodyRetries) {
649
- const backoffMs = Math.pow(2, bodyAttempt) * 1e3;
650
- logger.debug("[Cache] Body stream failed with transient error, retrying", {
651
- attempt: bodyAttempt + 1,
652
- maxRetries: maxBodyRetries,
653
- backoffMs,
654
- error: err?.message?.slice(0, 200)
655
- });
656
- await sleep(backoffMs);
657
- continue;
658
- }
659
- throw err;
660
- }
661
- }
662
- throw new Error("Exhausted body retries without returning or throwing");
663
- }
664
- async function prepareFetchResponse(url, options, timeout, maxRetries, isIdempotent, format) {
665
- const result = await fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent);
666
- const response = result.resp;
667
- const responseText = result.respText;
668
- const fetchLatencyMs = result.fetchLatencyMs;
669
- const headers = Object.fromEntries(response.headers.entries());
670
- try {
671
- const parsedData = format === "json" ? JSON.parse(responseText) : responseText;
672
- const serializedResponse = serializeFetchResponse(parsedData, response.status, response.statusText, headers, fetchLatencyMs);
673
- if (!response.ok) return {
674
- response: responseText === "" ? serializeFetchResponse(`Empty Response: ${response.status}: ${response.statusText}`, response.status, response.statusText, headers, fetchLatencyMs) : serializedResponse,
675
- cacheable: false
676
- };
677
- if (format === "json" && parsedData?.error) {
678
- logger.debug(`Not caching ${url} because it contains an 'error' key: ${parsedData.error}`);
679
- return {
680
- response: serializedResponse,
681
- cacheable: false
682
- };
683
- }
684
- logger.debug(`Storing ${url} response in cache with latencyMs=${fetchLatencyMs}: ${serializedResponse}`);
685
- return {
686
- response: serializedResponse,
687
- cacheable: true
688
- };
689
- } catch (err) {
690
- throw new Error(`Error parsing response from ${url}: ${err.message}. Received text: ${responseText}`);
691
- }
692
- }
693
- async function fetchWithCache(url, options = {}, timeout = REQUEST_TIMEOUT_MS, format = "json", bust = false, maxRetries) {
694
- const method = (options.method ?? (url instanceof Request ? url.method : "GET")).toUpperCase();
695
- const isIdempotent = [
696
- "GET",
697
- "HEAD",
698
- "OPTIONS",
699
- "PUT",
700
- "DELETE"
701
- ].includes(method);
702
- if (!enabled || bust) {
703
- const { respText, resp, fetchLatencyMs } = await fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent);
704
- try {
705
- return {
706
- cached: false,
707
- data: format === "json" ? JSON.parse(respText) : respText,
708
- status: resp.status,
709
- statusText: resp.statusText,
710
- headers: Object.fromEntries(resp.headers.entries()),
711
- latencyMs: fetchLatencyMs,
712
- deleteFromCache: async () => {}
713
- };
714
- } catch {
715
- throw new Error(`Error parsing response as JSON: ${respText}`);
716
- }
717
- }
718
- const copy = Object.assign({}, options);
719
- delete copy.headers;
720
- const cacheKey = `fetch:v2:${url}:${JSON.stringify(copy)}`;
721
- const cache = await getCache();
722
- const cachedResponse = await cache.get(cacheKey);
723
- if (cachedResponse != null) {
724
- logger.debug(`Returning cached response for ${url}: ${cachedResponse}`);
725
- return deserializeFetchResponse(cachedResponse, true, cache, cacheKey);
726
- }
727
- let inflightResponse = inflightFetchResponses.get(cacheKey);
728
- if (!inflightResponse) {
729
- inflightResponse = (async () => {
730
- const preparedResponse = await prepareFetchResponse(url, options, timeout, maxRetries, isIdempotent, format);
731
- if (preparedResponse.cacheable) await cache.set(cacheKey, preparedResponse.response);
732
- return preparedResponse.response;
733
- })().finally(() => {
734
- inflightFetchResponses.delete(cacheKey);
735
- });
736
- inflightFetchResponses.set(cacheKey, inflightResponse);
737
- }
738
- return deserializeFetchResponse(await inflightResponse, false, cache, cacheKey);
739
- }
740
- function enableCache() {
741
- enabled = true;
742
- }
743
- function disableCache() {
744
- enabled = false;
745
- }
746
- async function clearCache() {
747
- inflightFetchResponses.clear();
748
- return getCache().clear();
749
- }
750
- function isCacheEnabled() {
751
- return enabled;
752
- }
753
- //#endregion
754
- export { isCacheEnabled as a, isTransientConnectionError as c, getCache as i, disableCache as n, NON_TRANSIENT_HTTP_STATUSES as o, fetchWithCache as r, isNonTransientHttpStatus as s, cache_exports as t };
755
-
756
- //# sourceMappingURL=cache-C4Nxf52C.js.map