promptfoo 0.120.26 → 0.121.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/drizzle/0023_wooden_mandrill.sql +2 -0
- package/dist/drizzle/meta/0023_snapshot.json +1496 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/src/{ListApp-D3DG0F8h.js → ListApp-Du7YVwj5.js} +2 -4
- package/dist/src/accounts-BgNJDBE6.js +206 -0
- package/dist/src/{accounts-BzEY8H3v.cjs → accounts-Bx-x3bmW.cjs} +99 -80
- package/dist/src/{accounts-DHHiXsy6.js → accounts-CMqkzrVf.js} +61 -36
- package/dist/src/{accounts-R3gfCR_g.js → accounts-xrUGFA6n.js} +60 -35
- package/dist/src/{agentic-utils-D6_gzOUF.js → agentic-utils-BKIN5PKu.js} +9 -10
- package/dist/src/{agents-CwM7re15.cjs → agents-B0f4HICh.cjs} +37 -40
- package/dist/src/{agents-Cnph5GLD.js → agents-C-dDThPK.js} +37 -37
- package/dist/src/{agents-C7BiinFI.cjs → agents-CErsqg5U.cjs} +19 -27
- package/dist/src/{agents-v4cW_ZgC.js → agents-CVIn-Utx.js} +19 -22
- package/dist/src/{agents-GiUianme.js → agents-CXknwsFX.js} +37 -40
- package/dist/src/{agents-DETIQHqF.js → agents-DeH4Gu94.js} +21 -28
- package/dist/src/{agents-DYIT-hQy.js → agents-Dy2YpZpa.js} +38 -41
- package/dist/src/{agents-Cao4i7AX.js → agents-aF4-T121.js} +19 -30
- package/dist/src/{aimlapi-DMF6v_vb.js → aimlapi-BAGZDo5G.js} +16 -18
- package/dist/src/{aimlapi-CMJpKK-B.js → aimlapi-BNfTBexL.js} +15 -17
- package/dist/src/{aimlapi-DtSf1ykJ.js → aimlapi-DHRKlBEA.js} +15 -4
- package/dist/src/{aimlapi-DoGLcQW_.cjs → aimlapi-tg0Gkcvr.cjs} +15 -16
- package/dist/src/app/assets/index-BFCZg7hQ.js +439 -0
- package/dist/src/app/assets/index-NCn4eVBv.css +1 -0
- package/dist/src/app/assets/{vendor-charts-CYyo8R8v.js → vendor-charts-CCl15Imd.js} +1 -1
- package/dist/src/app/assets/{vendor-markdown-DSmzq4Jh.js → vendor-markdown-0tekx3KX.js} +1 -1
- package/dist/src/app/index.html +4 -34
- package/dist/src/{audio-DUH4q0Xq.js → audio-BRODU0UK.js} +7 -9
- package/dist/src/{audio-BWjyvHn9.cjs → audio-BWeaWovU.cjs} +6 -7
- package/dist/src/{audio-U580w8jM.js → audio-CHQ4r-RV.js} +6 -5
- package/dist/src/{audio-BrJBFN2b.js → audio-tf_NBjlC.js} +6 -8
- package/dist/src/base-B0tcrnq_.js +193 -0
- package/dist/src/base-B4QJRyFS.js +194 -0
- package/dist/src/base-DBtwl2FR.cjs +222 -0
- package/dist/src/base-fEDN28WM.js +193 -0
- package/dist/src/{blobs-kt8v3UyH.js → blobs-BAU-dXan.js} +9 -12
- package/dist/src/{blobs-C9J2mVgo.js → blobs-Bpg5rH6i.js} +9 -12
- package/dist/src/{blobs-673H0jCl.cjs → blobs-DvS-O6be.cjs} +34 -37
- package/dist/src/blobs-qTYm-1PY.js +236 -0
- package/dist/src/{cache-BLLayYEN.js → cache-8XhNqPKW.js} +64 -67
- package/dist/src/cache-Bbn1Nyrd.cjs +5 -0
- package/dist/src/cache-BwsMSda7.js +6 -0
- package/dist/src/{cache-mIszOnuz.js → cache-CG0SlR1d.js} +64 -66
- package/dist/src/{cache-7xULbvt3.cjs → cache-COish3-W.cjs} +114 -117
- package/dist/src/cache-D3eqDYGU.js +739 -0
- package/dist/src/{chat-Fl6TZJRS.cjs → chat-2K608PeQ.cjs} +20 -21
- package/dist/src/chat-BKm79wib.js +764 -0
- package/dist/src/{chat-XPN9YHhr.js → chat-CM_kyI8B.js} +20 -9
- package/dist/src/{chat-DIywASPG.js → chat-CRWNNq73.js} +49 -49
- package/dist/src/{chat-C8Ei4f87.js → chat-CznLWr_D.js} +49 -49
- package/dist/src/{chat-CgyGj2hC.js → chat-DHMH-N64.js} +20 -22
- package/dist/src/{chat-C4zqjObh.cjs → chat-DaqekjFr.cjs} +69 -69
- package/dist/src/{chat-Cpz3O-Xl.js → chat-DxysjBvt.js} +21 -23
- package/dist/src/{chatkit-Dpxrq4eD.js → chatkit-65VXf5SR.js} +58 -58
- package/dist/src/{chatkit-DIrJX8xk.js → chatkit-Be-Q-a9F.js} +58 -60
- package/dist/src/{chatkit-DEls11hE.js → chatkit-BxFvW8KY.js} +58 -60
- package/dist/src/{chatkit-e25Ziu17.cjs → chatkit-DKyPi1Gs.cjs} +58 -60
- package/dist/src/chunk-DEq-mXcV.js +15 -0
- package/dist/src/chunk-DRamLcfz.js +16 -0
- package/dist/src/{claude-agent-sdk-6-xTaLwM.js → claude-agent-sdk-BLTu0WBO.js} +45 -31
- package/dist/src/{claude-agent-sdk-BzxF6NIJ.cjs → claude-agent-sdk-CJH22shf.cjs} +44 -29
- package/dist/src/{claude-agent-sdk-CmkTnKGH.js → claude-agent-sdk-D6_k9FKA.js} +45 -33
- package/dist/src/{claude-agent-sdk-rXCBLK_o.js → claude-agent-sdk-Dy5lT-Tx.js} +46 -21
- package/dist/src/{cloud-BMbRVJFw.js → cloud-Bc9526yV.js} +32 -12
- package/dist/src/cloud-DmE0EwsY.js +4 -0
- package/dist/src/{cloudflare-ai-CUg4BTcj.js → cloudflare-ai-C9r2sRhw.js} +16 -18
- package/dist/src/{cloudflare-ai-Z9X219gp.js → cloudflare-ai-CWWJCRim.js} +16 -4
- package/dist/src/{cloudflare-ai-BAQ0u_dg.cjs → cloudflare-ai-ClWSdor4.cjs} +16 -17
- package/dist/src/{cloudflare-ai-CobxMTR4.js → cloudflare-ai-ICsOuD-z.js} +17 -19
- package/dist/src/{cloudflare-gateway-C0sgfr_z.cjs → cloudflare-gateway-C2_-KG5o.cjs} +21 -22
- package/dist/src/{cloudflare-gateway-_itGuXry.js → cloudflare-gateway-D6O7AlYb.js} +23 -23
- package/dist/src/{cloudflare-gateway-D2_yi-Fh.js → cloudflare-gateway-D6xFc5pa.js} +21 -25
- package/dist/src/{cloudflare-gateway-Djf3F3_H.js → cloudflare-gateway-pXGHxJ47.js} +26 -14
- package/dist/src/{codex-sdk-ibXwdglL.js → codex-sdk-C6UMlxwV.js} +49 -32
- package/dist/src/{codex-sdk-BASDNkIl.js → codex-sdk-DUwKWezN.js} +49 -30
- package/dist/src/{codex-sdk-dSnGdgIp.js → codex-sdk-GGAw0qbD.js} +49 -32
- package/dist/src/{codex-sdk-wTEpMM_X.cjs → codex-sdk-fAO0c3yA.cjs} +49 -32
- package/dist/src/{cometapi-B01btbfb.js → cometapi-BasUi7-_.js} +17 -19
- package/dist/src/{cometapi-DHUAH6nK.js → cometapi-Bbjp5V4x.js} +16 -4
- package/dist/src/{cometapi-ChAaRjg5.js → cometapi-DkXrKi5z.js} +21 -24
- package/dist/src/{cometapi-JbvOJSCO.cjs → cometapi-vY6aDZgo.cjs} +21 -22
- package/dist/src/{completion-D9_MDlnd.js → completion-6Mx_iXxK.js} +11 -13
- package/dist/src/{completion-BBJ6zmG3.js → completion-C5rtR_9P.js} +11 -13
- package/dist/src/{completion-DDyL3Cb2.cjs → completion-CDOouNzq.cjs} +21 -23
- package/dist/src/completion-C_P3ypkJ.js +120 -0
- package/dist/src/createHash-CTQmL3G2.js +15 -0
- package/dist/src/createHash-CfZSc0b4.cjs +27 -0
- package/dist/src/createHash-Da8fMwqB.js +16 -0
- package/dist/src/createHash-DmPQkvBh.js +15 -0
- package/dist/src/{docker-JAAubMw3.js → docker-5KcG-_86.js} +18 -20
- package/dist/src/{docker-Ckw-j7Rr.cjs → docker-BwsKwxFs.cjs} +18 -19
- package/dist/src/{docker-vnOg96gi.js → docker-CZnqU1XV.js} +18 -7
- package/dist/src/{docker-BuButc4D.js → docker-DzxyDPIj.js} +19 -21
- package/dist/src/entrypoint.js +2 -3
- package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
- package/dist/src/{esm-CYhseqj4.js → esm-C03C-mv3.js} +17 -20
- package/dist/src/{esm-rDtG_2rg.js → esm-CaIwzWR5.js} +18 -21
- package/dist/src/esm-Cd1AjG1D.js +379 -0
- package/dist/src/{esm-BQkx5roy.cjs → esm-CnNt7sI4.cjs} +47 -49
- package/dist/src/eval-17JizQIv.js +15 -0
- package/dist/src/{eval-CYrbG57o.js → eval-DmFyWU7i.js} +49 -55
- package/dist/src/{evalResult-COsVttMA.js → evalResult-CDQiuUuf.js} +16 -12
- package/dist/src/{evalResult-6JaUIStC.js → evalResult-CTG2AHOS.js} +10 -11
- package/dist/src/evalResult-Cqj8pldJ.js +12 -0
- package/dist/src/{evalResult-DlRfu_Rq.cjs → evalResult-Dap2CekP.cjs} +20 -21
- package/dist/src/evalResult-DvcJAWJU.cjs +10 -0
- package/dist/src/evalResult-Hftn-S_i.js +10 -0
- package/dist/src/evaluator-B2CFNt-P.js +36 -0
- package/dist/src/{evaluator-3EJCMTs0.js → evaluator-DPFRbFIL.js} +210 -232
- package/dist/src/{extractor-LSYjrhK0.js → extractor-CFG6bcWJ.js} +23 -38
- package/dist/src/{extractor-DbhlYEeo.cjs → extractor-DX36oYEv.cjs} +37 -64
- package/dist/src/{extractor-Hs7la_19.js → extractor-M67RUtg6.js} +23 -38
- package/dist/src/extractor-YMU_Gvt8.js +374 -0
- package/dist/src/fetch-4M3YRaqL.js +780 -0
- package/dist/src/{fetch-18MuNu9i.js → fetch-60Gzydls.js} +60 -46
- package/dist/src/{fetch-SRsE6Ctl.js → fetch-BMv0O527.js} +41 -35
- package/dist/src/{fetch-ZMn_oemb.cjs → fetch-BxUk8odA.cjs} +268 -279
- package/dist/src/fetch-KV5kNASw.js +5 -0
- package/dist/src/{fileExtensions-ePDqouxn.js → fileExtensions-DnqA1y9x.js} +2 -2
- package/dist/src/{fileExtensions-BpuMmaFL.js → fileExtensions-Ds-foDzt.js} +2 -2
- package/dist/src/fileExtensions-LcDYkU4v.js +85 -0
- package/dist/src/{fileExtensions-DkJYkWUy.cjs → fileExtensions-bYh77CN8.cjs} +27 -28
- package/dist/src/{formatDuration-Doo0xq-z.js → formatDuration-DgBVMN65.js} +2 -2
- package/dist/src/{genaiTracer-Ce19n68P.js → genaiTracer-70Z8BIuV.js} +2 -3
- package/dist/src/{genaiTracer-CqNnnXrE.js → genaiTracer-C1rxGO8Q.js} +2 -3
- package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
- package/dist/src/{genaiTracer-CQlpZkrp.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
- package/dist/src/graders-Bu0H9nXi.js +32 -0
- package/dist/src/{graders-BaMCwIKp.js → graders-CHO8EPM4.js} +385 -417
- package/dist/src/graders-Cfhkvx-e.js +34 -0
- package/dist/src/{graders-QsALpIdy.js → graders-CpdqD9PI.js} +385 -417
- package/dist/src/graders-DClJVpGP.cjs +32 -0
- package/dist/src/{graders-DzUUnUjC.cjs → graders-DOXycdlG.cjs} +721 -753
- package/dist/src/graders-DcnJsrMO.js +32 -0
- package/dist/src/graders-R9rYUM0d.js +13466 -0
- package/dist/src/{image-BiEVdpdP.js → image-BmEZqVmk.js} +57 -18
- package/dist/src/{image-mhAGP07h.js → image-CBBVXWuT.js} +57 -18
- package/dist/src/{image-D10zEe1f.cjs → image-CDLQOcqT.cjs} +6 -7
- package/dist/src/{image-COCWy5dX.js → image-DJEvKveK.js} +6 -5
- package/dist/src/{image-C3BjJUAU.cjs → image-DTedmQPg.cjs} +77 -32
- package/dist/src/{image-DB4sHxdJ.js → image-gvmivTEe.js} +7 -9
- package/dist/src/image-pAX56tPG.js +257 -0
- package/dist/src/{image-BXt_7u0v.js → image-tL5hIOFh.js} +6 -8
- package/dist/src/index.cjs +696 -693
- package/dist/src/index.d.cts +113 -10
- package/dist/src/index.d.ts +113 -6
- package/dist/src/index.js +657 -658
- package/dist/src/{interactiveCheck-DU-MAhp5.js → interactiveCheck-BgLZUIt3.js} +7 -8
- package/dist/src/{invariant-DT20jrBd.js → invariant-BtWWVVhl.js} +2 -2
- package/dist/src/{invariant-1pAf2CD1.js → invariant-Ddh24eXh.js} +2 -2
- package/dist/src/{invariant-CKcJAQ6M.cjs → invariant-kfQ8Bu82.cjs} +7 -8
- package/dist/src/invariant-vgHWClmd.js +25 -0
- package/dist/src/{knowledgeBase-DotRBzUE.js → knowledgeBase-CLJybhnF.js} +19 -34
- package/dist/src/{knowledgeBase-XJQ0Qyez.js → knowledgeBase-CoU-UQBg.js} +17 -41
- package/dist/src/{knowledgeBase-CMvMlLZR.js → knowledgeBase-DjWPVqSb.js} +17 -43
- package/dist/src/{knowledgeBase-Bnb00xKs.cjs → knowledgeBase-wkxuRFhA.cjs} +17 -40
- package/dist/src/{litellm-CHrRmPAe.js → litellm-B9Hysuri.js} +16 -18
- package/dist/src/{litellm-CrLJrPIm.js → litellm-CTfa0hqi.js} +15 -17
- package/dist/src/{litellm-BrnZhMcL.cjs → litellm-NYpQ8RQu.cjs} +15 -16
- package/dist/src/{litellm-BECdjOTx.js → litellm-ePxtr9F1.js} +15 -4
- package/dist/src/{logger-w8Ozp0Td.js → logger-CT3IKMKA.js} +24 -41
- package/dist/src/{logger-BdZ-IqBc.cjs → logger-Cp1GPUjj.cjs} +166 -192
- package/dist/src/logger-DLcq4dWf.js +713 -0
- package/dist/src/{logger-BotXmWKW.js → logger-KkObSCzq.js} +27 -43
- package/dist/src/{luma-ray-C0RkI3lt.cjs → luma-ray-B0GGNRc1.cjs} +20 -21
- package/dist/src/{luma-ray-C-w6EsJm.js → luma-ray-BE2mOt6N.js} +20 -13
- package/dist/src/{luma-ray-BOeX-h0M.js → luma-ray-BW9IRGIc.js} +22 -21
- package/dist/src/{luma-ray-DgKLS0BF.js → luma-ray-Cm1KZBhs.js} +20 -23
- package/dist/src/main.js +1985 -2055
- package/dist/src/{messages-DXV3Qh8_.cjs → messages-1JrJs91T.cjs} +35 -34
- package/dist/src/{messages-D61tPFQo.js → messages-1x9atZmP.js} +25 -24
- package/dist/src/{messages-CDZYGNlS.js → messages-BLbWdsyt.js} +25 -24
- package/dist/src/messages-D8EA0oDc.js +240 -0
- package/dist/src/{meteor-P2rUE-Uz.js → meteor-44VjEACX.js} +3 -4
- package/dist/src/{meteor-SLNTgmXm.js → meteor-D-SotUw9.js} +3 -4
- package/dist/src/{meteor-odmwVbyG.cjs → meteor-DLZZ3osF.cjs} +3 -4
- package/dist/src/{meteor-Dj8cTkU_.js → meteor-DUiCJRC-.js} +3 -4
- package/dist/src/modelslab-C1OLRmVX.js +166 -0
- package/dist/src/modelslab-CqXBy3U8.js +168 -0
- package/dist/src/modelslab-DcOSFwKh.cjs +166 -0
- package/dist/src/modelslab-X5-4LroM.js +166 -0
- package/dist/src/{nova-reel-C2LFfVTf.js → nova-reel-BgS1ZWuK.js} +20 -13
- package/dist/src/{nova-reel-DtCjbD5O.js → nova-reel-D2ZkOSyr.js} +22 -21
- package/dist/src/{nova-reel-D9FXq3Mt.cjs → nova-reel-D9xfaMBs.cjs} +20 -21
- package/dist/src/{nova-reel-Bk5npr2q.js → nova-reel-DihqLeol.js} +20 -23
- package/dist/src/{nova-sonic-BoRSY_U6.cjs → nova-sonic-DVu3mMIy.cjs} +30 -31
- package/dist/src/{nova-sonic-D_qERM-K.js → nova-sonic-DezhVUYT.js} +30 -26
- package/dist/src/{nova-sonic-CgaWLDM1.js → nova-sonic-P-CdUMlV.js} +30 -31
- package/dist/src/{nova-sonic-BXRfQyF-.js → nova-sonic-Q3BOJeig.js} +31 -32
- package/dist/src/{openai-Bigwjgo1.cjs → openai-Cuif0GEt.cjs} +8 -9
- package/dist/src/{openai-Dz3surb_.js → openai-DElQ-fPX.js} +3 -4
- package/dist/src/{openai-CT5fwbve.js → openai-DhbB7eWK.js} +3 -4
- package/dist/src/openai-j-sE2O7r.js +44 -0
- package/dist/src/{openclaw-dHLcXUWZ.js → openclaw-BiSZPL7J.js} +20 -14
- package/dist/src/{openclaw-CpPrXwf6.js → openclaw-Bv1DINsX.js} +20 -27
- package/dist/src/{openclaw-B6XY2kUf.js → openclaw-D1D_ej1z.js} +21 -28
- package/dist/src/{openclaw-DDSfq5fp.cjs → openclaw-DAfWQn-o.cjs} +33 -39
- package/dist/src/opencode-sdk-C7m-wRfI.js +560 -0
- package/dist/src/opencode-sdk-CfaLN8PY.cjs +564 -0
- package/dist/src/opencode-sdk-D95s6SnR.js +562 -0
- package/dist/src/opencode-sdk-DxUPkLT7.js +560 -0
- package/dist/src/{otlpReceiver-DmRb0NBj.js → otlpReceiver--AIRW_S4.js} +53 -51
- package/dist/src/{otlpReceiver-Dg817agV.js → otlpReceiver-Bn5wGB1v.js} +53 -55
- package/dist/src/{otlpReceiver-B6Xo4KZM.cjs → otlpReceiver-Diec4cln.cjs} +53 -55
- package/dist/src/{otlpReceiver-BO0rbDzh.js → otlpReceiver-g3ByGaXs.js} +53 -55
- package/dist/src/{providerRegistry-Xf0qdqGQ.js → providerRegistry-B0RUOLI_.js} +7 -8
- package/dist/src/{providerRegistry-wCWd7sKQ.js → providerRegistry-CD8MEar9.js} +7 -8
- package/dist/src/{providerRegistry-lc7a7utN.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
- package/dist/src/providerRegistry-DM8rZYol.js +45 -0
- package/dist/src/providers-B3HvufyI.js +33246 -0
- package/dist/src/{providers-BiNq_Iyc.js → providers-BKRJTjBz.js} +1743 -1795
- package/dist/src/providers-C1rOSHiR.js +32 -0
- package/dist/src/{providers-BlEhY5mi.js → providers-CFLy1_ji.js} +1750 -1802
- package/dist/src/{providers-BNKVY53V.cjs → providers-CFu-TZl-.cjs} +2111 -2163
- package/dist/src/providers-CxmDwEFf.cjs +31 -0
- package/dist/src/providers-Dodakqr0.js +30 -0
- package/dist/src/providers-GIQ2TcsA.js +30 -0
- package/dist/src/{pythonUtils-r1uBuA0n.js → pythonUtils-C3py6GC1.js} +18 -19
- package/dist/src/{pythonUtils-DZ6EbdY4.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
- package/dist/src/{pythonUtils-vMlk9Qp5.js → pythonUtils-D5nxkQ0P.js} +18 -19
- package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
- package/dist/src/quiverai-C2jVwbH1.js +213 -0
- package/dist/src/quiverai-CI6gYJVI.js +213 -0
- package/dist/src/quiverai-CLkWkyZc.cjs +213 -0
- package/dist/src/quiverai-MHSxbmmZ.js +215 -0
- package/dist/src/{render-CAZvKKkB.js → render-Drod8m7K.js} +4 -5
- package/dist/src/{responses-DLLjADw5.js → responses-BKqJmhhc.js} +34 -27
- package/dist/src/{responses-TsdODUpm.js → responses-CGw0DCzh.js} +34 -27
- package/dist/src/responses-jxdehPkC.js +660 -0
- package/dist/src/{responses-zOtKtnY_.cjs → responses-tD4Bd4dc.cjs} +49 -42
- package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
- package/dist/src/{rubyUtils-Cs35SDYa.js → rubyUtils-BUVePouc.js} +27 -20
- package/dist/src/rubyUtils-BcuGX77l.js +222 -0
- package/dist/src/{rubyUtils-BtjlqyXt.js → rubyUtils-Boc4HZzX.js} +18 -19
- package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
- package/dist/src/{rubyUtils-DCVaJ3mc.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
- package/dist/src/{sagemaker-Du4LIR97.js → sagemaker-BK4Zb993.js} +75 -70
- package/dist/src/{sagemaker-CLdUAv5z.js → sagemaker-BfiWTmvn.js} +77 -77
- package/dist/src/{sagemaker-DwNnEVYt.cjs → sagemaker-CcQHM1jV.cjs} +75 -76
- package/dist/src/{sagemaker-BcgLu0U4.js → sagemaker-D2Q1c-sD.js} +75 -79
- package/dist/src/{scanner-Dyw21Wg_.js → scanner-J8CA3LsV.js} +149 -122
- package/dist/src/server/index.js +5620 -67302
- package/dist/src/{server-CgUQ25qW.cjs → server-B0PPuDw-.cjs} +57 -67
- package/dist/src/server-B1vi21hA.js +7 -0
- package/dist/src/{server-CbMTRQkg.js → server-BC7XJFgr.js} +19 -24
- package/dist/src/server-Cm9Kai_h.cjs +5 -0
- package/dist/src/{server-DWmZLfCy.js → server-DbFphssR.js} +26 -29
- package/dist/src/server-OAs3nBRT.js +229 -0
- package/dist/src/{signal-Bl32q42d.js → signal-BOTbd53Z.js} +9 -11
- package/dist/src/{slack-BtMkB6xP.cjs → slack-BmVAVGaK.cjs} +7 -8
- package/dist/src/{slack-OZYxoVON.js → slack-DCUPTzS2.js} +8 -8
- package/dist/src/{slack-DPqj42Ts.js → slack-DOdy_kyv.js} +7 -8
- package/dist/src/{slack-BfdBx2tO.js → slack-DXMKtA-f.js} +7 -9
- package/dist/src/store-BNmZ1KAz.cjs +5 -0
- package/dist/src/{store-BqwfFEyF.cjs → store-BSc-TF2w.cjs} +44 -45
- package/dist/src/store-BltJg2cd.js +6 -0
- package/dist/src/{store-D4gdn9ih.js → store-D1tv90v3.js} +34 -35
- package/dist/src/{store-2ocbYY9D.js → store-DQLEjuEO.js} +40 -36
- package/dist/src/store-Ub2vaGJ1.js +228 -0
- package/dist/src/{tables-D-NSwNIb.js → tables-5EvT_Bwn.js} +23 -23
- package/dist/src/{tables-B9E1kRp-.cjs → tables-C7K-XKWp.cjs} +93 -93
- package/dist/src/{tables-C7TT2XVn.js → tables-D36WTqKX.js} +25 -25
- package/dist/src/tables-xKANLRBD.js +288 -0
- package/dist/src/telemetry-5BCRNBbe.cjs +5 -0
- package/dist/src/{telemetry-DZ_7PaVq.js → telemetry-C15ziL8u.js} +17 -14
- package/dist/src/{telemetry-BXyVqyAg.js → telemetry-C2YDkUQH.js} +11 -13
- package/dist/src/{telemetry-D0_yFdtU.cjs → telemetry-CbrnxHp_.cjs} +21 -24
- package/dist/src/telemetry-D4W5hboe.js +7 -0
- package/dist/src/telemetry-DMb2Mpfm.js +171 -0
- package/dist/src/{text-Dm78AVGG.js → text-B_UCRPp2.js} +2 -2
- package/dist/src/{text-DF2hMKdg.cjs → text-CW1cyrwj.cjs} +12 -13
- package/dist/src/{text-DgMr_tiM.js → text-Db-Wt2u2.js} +2 -2
- package/dist/src/text-TIv0QYnd.js +22 -0
- package/dist/src/{tokenUsageUtils-FZd5O_4A.js → tokenUsageUtils-BDGe-iyI.js} +2 -2
- package/dist/src/{tokenUsageUtils-DmZSD2eU.js → tokenUsageUtils-DflFMjS0.js} +2 -2
- package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
- package/dist/src/{tokenUsageUtils-CXhxVj72.cjs → tokenUsageUtils-bVa1ga6f.cjs} +32 -33
- package/dist/src/{transcription-FNIz3YOe.cjs → transcription-CL78qbOU.cjs} +14 -15
- package/dist/src/{transcription-C-M81iDA.js → transcription-DAtxHhAM.js} +14 -7
- package/dist/src/{transcription-CYuY5sFO.js → transcription-LNZTNUUL.js} +14 -16
- package/dist/src/{transcription-Ch7S-LWw.js → transcription-QHh3AH6Z.js} +15 -17
- package/dist/src/{transform-CoP2bJ7P.js → transform-Cgi24fJ7.js} +94 -66
- package/dist/src/{transform-Kd6u-oNm.cjs → transform-CzK1Q0zl.cjs} +24 -26
- package/dist/src/{transform-D8dILpfZ.js → transform-DECvGmzp.js} +15 -13
- package/dist/src/{transform-DMaxQwDx.js → transform-DGLazrMm.js} +94 -66
- package/dist/src/transform-DGxXocjk.js +1506 -0
- package/dist/src/{transform-ivxEY4f7.cjs → transform-DOcQeLld.cjs} +234 -206
- package/dist/src/transform-DTGDnAzW.js +6 -0
- package/dist/src/{transform-CqTFr7KR.js → transform-DilY9wbS.js} +10 -12
- package/dist/src/transform-aa6tmVpZ.js +216 -0
- package/dist/src/transform-m3qNw4KP.cjs +5 -0
- package/dist/src/{transformersAvailability-DEU2naS1.js → transformersAvailability-CEVM2GNQ.js} +2 -2
- package/dist/src/{transformersAvailability-Bkep3ka7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
- package/dist/src/{transformersAvailability-DwmezkVe.js → transformersAvailability-D6c6ROpT.js} +2 -2
- package/dist/src/{types-t52w-XsS.js → types-CH3Ge2sE.js} +103 -92
- package/dist/src/{types-DMVjYLpx.js → types-CLKiCBW3.js} +98 -91
- package/dist/src/types-CN_TZ2GJ.js +3260 -0
- package/dist/src/{types-BIfttHrT.cjs → types-LJ0r3wbR.cjs} +573 -566
- package/dist/src/util-5cB-L7U3.js +1430 -0
- package/dist/src/util-6-GqIvzS.js +599 -0
- package/dist/src/{util-vjscpUzy.js → util-B7T3SiBS.js} +5 -6
- package/dist/src/{util-Cl0zfT3V.js → util-Betm42rL.js} +44 -17
- package/dist/src/{util-CUEt0Vum.js → util-C-PPYSMq.js} +44 -17
- package/dist/src/{util-DkFTvieG.cjs → util-CchiqXh_.cjs} +35 -36
- package/dist/src/{util-mJ58qbbw.js → util-DaWTWKBK.js} +5 -6
- package/dist/src/{util-C08Kns6-.cjs → util-Db0a0AFH.cjs} +89 -62
- package/dist/src/{util-DiCePfDu.js → util-Dlz_Wvgm.js} +102 -53
- package/dist/src/{util-BSh4a_Q8.js → util-YT5HPZaS.js} +102 -53
- package/dist/src/{util-DUYOvxAy.cjs → util-Yz-1aEhW.cjs} +274 -219
- package/dist/src/util-ZZH-3QZz.js +293 -0
- package/dist/src/{utils-DFaZa6Rf.cjs → utils-Cz9qXqII.cjs} +32 -35
- package/dist/src/{utils-CVzb4YiI.js → utils-XiOAgly5.js} +4 -7
- package/dist/src/utils-dLokC-eR.js +94 -0
- package/dist/src/{utils-JaY9veb5.js → utils-f2-Moju7.js} +4 -7
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +59 -53
- package/dist/src/app/assets/index-BOgkICuY.css +0 -1
- package/dist/src/app/assets/index-CSgqn_Vd.js +0 -428
- package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
- package/dist/src/base-BaXmtXYp.js +0 -107
- package/dist/src/base-Dtp8b4_N.js +0 -106
- package/dist/src/base-f71xxWai.cjs +0 -111
- package/dist/src/cache-BUPcq0Ad.js +0 -6
- package/dist/src/cache-CVfRb-HD.cjs +0 -6
- package/dist/src/cache-O4EuX2JV.js +0 -8
- package/dist/src/chunk-DHDDz29n.js +0 -22
- package/dist/src/chunk-FhC4c-0y.js +0 -21
- package/dist/src/cloud-CZ4hytdm.js +0 -5
- package/dist/src/eval-CKHWqG9f.js +0 -16
- package/dist/src/evalResult-CxTP-LMm.cjs +0 -11
- package/dist/src/evalResult-CzLURDcP.js +0 -13
- package/dist/src/evalResult-DyttNQ_G.js +0 -11
- package/dist/src/evaluator-0PvfeBYh.js +0 -38
- package/dist/src/fetch-Bi0o-fdp.js +0 -4
- package/dist/src/fetch-CMptBDVg.cjs +0 -4
- package/dist/src/fetch-DAZkv3gV.js +0 -6
- package/dist/src/graders-BCytzXrb.js +0 -34
- package/dist/src/graders-CGZQShfJ.cjs +0 -33
- package/dist/src/graders-spkuVC-E.js +0 -36
- package/dist/src/opencode-sdk-CImWVqy9.js +0 -382
- package/dist/src/opencode-sdk-CuCztr4P.js +0 -380
- package/dist/src/opencode-sdk-DhcfRbBH.js +0 -376
- package/dist/src/opencode-sdk-mqF-Oj3f.cjs +0 -383
- package/dist/src/providers-BMZZmPBJ.cjs +0 -32
- package/dist/src/providers-CQQrNaJk.js +0 -32
- package/dist/src/providers-Ck8HyrC-.js +0 -34
- package/dist/src/quiverai-BNfIwKCO.cjs +0 -54
- package/dist/src/quiverai-BQigKdIH.js +0 -57
- package/dist/src/quiverai-Bfy2WnE2.js +0 -55
- package/dist/src/quiverai-CedIP0PJ.js +0 -43
- package/dist/src/rubyUtils-D7--T12C.js +0 -6
- package/dist/src/rubyUtils-DRRiMFV2.js +0 -5
- package/dist/src/rubyUtils-vb8OYFC-.cjs +0 -5
- package/dist/src/server-BUbS0Qfh.js +0 -6
- package/dist/src/server-XpGXFHkS.cjs +0 -6
- package/dist/src/server-gfOx5Zrk.js +0 -8
- package/dist/src/store-5u2yriTV.js +0 -7
- package/dist/src/store-D_lq_8oQ.js +0 -6
- package/dist/src/store-m5KT6Ly7.cjs +0 -6
- package/dist/src/telemetry-5RHFoCJh.js +0 -6
- package/dist/src/telemetry-Do8wMnA-.js +0 -8
- package/dist/src/telemetry-LojxPoFq.cjs +0 -6
- package/dist/src/transform-8eGmaH-7.js +0 -7
- package/dist/src/transform-BRVvWaG4.cjs +0 -6
- package/dist/src/transform-GybT0X0u.js +0 -8
- package/dist/src/transformersAvailability-DkAWaK5B.js +0 -35
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { g as getConfigDirectoryPath, i as logger } from "./logger-DLcq4dWf.js";
|
|
2
|
+
import { h as getDb, n as blobReferencesTable, t as blobAssetsTable } from "./tables-xKANLRBD.js";
|
|
3
|
+
import * as fs$1 from "node:fs";
|
|
4
|
+
import * as path$1 from "node:path";
|
|
5
|
+
import * as fsPromises$1 from "node:fs/promises";
|
|
6
|
+
import { and, eq } from "drizzle-orm";
|
|
7
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
8
|
+
//#region src/blobs/constants.ts
|
|
9
|
+
const BLOB_MIN_SIZE = 1024;
|
|
10
|
+
const BLOB_MAX_SIZE = 52428800;
|
|
11
|
+
const BLOB_SCHEME = "promptfoo://blob/";
|
|
12
|
+
const DEFAULT_FILESYSTEM_SUBDIR = "blobs";
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/blobs/filesystemProvider.ts
|
|
15
|
+
const BLOB_HASH_REGEX = /^[a-f0-9]{64}$/i;
|
|
16
|
+
function computeHash(data) {
|
|
17
|
+
return createHash("sha256").update(data).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
function buildUri(hash) {
|
|
20
|
+
return `${BLOB_SCHEME}${hash}`;
|
|
21
|
+
}
|
|
22
|
+
var FilesystemBlobStorageProvider = class {
|
|
23
|
+
providerId = "filesystem";
|
|
24
|
+
basePath;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
const defaultBase = path$1.join(getConfigDirectoryPath(true), DEFAULT_FILESYSTEM_SUBDIR);
|
|
27
|
+
this.basePath = path$1.resolve(config?.basePath || defaultBase);
|
|
28
|
+
this.ensureDirectory();
|
|
29
|
+
}
|
|
30
|
+
ensureDirectory() {
|
|
31
|
+
if (!fs$1.existsSync(this.basePath)) {
|
|
32
|
+
fs$1.mkdirSync(this.basePath, { recursive: true });
|
|
33
|
+
logger.debug("[BlobFS] Created blob directory", { basePath: this.basePath });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
assertValidHash(hash) {
|
|
37
|
+
if (!BLOB_HASH_REGEX.test(hash)) throw new Error(`[BlobFS] Invalid blob hash: "${hash}"`);
|
|
38
|
+
}
|
|
39
|
+
resolvePathInBase(unsafePath) {
|
|
40
|
+
const targetPath = path$1.isAbsolute(unsafePath) ? path$1.resolve(unsafePath) : path$1.resolve(this.basePath, unsafePath);
|
|
41
|
+
const safeBase = path$1.resolve(this.basePath) + path$1.sep;
|
|
42
|
+
if (!targetPath.startsWith(safeBase)) throw new Error("[BlobFS] Path traversal attempt detected");
|
|
43
|
+
return targetPath;
|
|
44
|
+
}
|
|
45
|
+
hashToPath(hash) {
|
|
46
|
+
this.assertValidHash(hash);
|
|
47
|
+
const dirRelative = path$1.join(hash.slice(0, 2), hash.slice(2, 4));
|
|
48
|
+
const fileRelative = path$1.join(dirRelative, hash);
|
|
49
|
+
return this.resolvePathInBase(fileRelative);
|
|
50
|
+
}
|
|
51
|
+
async ensureHashDir(hash) {
|
|
52
|
+
this.assertValidHash(hash);
|
|
53
|
+
const dirRelative = path$1.join(hash.slice(0, 2), hash.slice(2, 4));
|
|
54
|
+
const dirPath = this.resolvePathInBase(dirRelative);
|
|
55
|
+
await fsPromises$1.mkdir(dirPath, { recursive: true });
|
|
56
|
+
}
|
|
57
|
+
metadataPath(filePath) {
|
|
58
|
+
return `${filePath}.meta.json`;
|
|
59
|
+
}
|
|
60
|
+
async store(data, mimeType) {
|
|
61
|
+
const hash = computeHash(data);
|
|
62
|
+
await this.ensureHashDir(hash);
|
|
63
|
+
const filePath = this.hashToPath(hash);
|
|
64
|
+
try {
|
|
65
|
+
await fsPromises$1.access(filePath);
|
|
66
|
+
const meta = await this.readMetadata(filePath);
|
|
67
|
+
return {
|
|
68
|
+
ref: this.buildRef(hash, meta?.mimeType ?? mimeType, meta?.sizeBytes ?? data.length, meta?.provider ?? this.providerId),
|
|
69
|
+
deduplicated: true
|
|
70
|
+
};
|
|
71
|
+
} catch {}
|
|
72
|
+
await fsPromises$1.writeFile(filePath, data);
|
|
73
|
+
const metadata = {
|
|
74
|
+
mimeType,
|
|
75
|
+
sizeBytes: data.length,
|
|
76
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
77
|
+
provider: this.providerId,
|
|
78
|
+
key: filePath
|
|
79
|
+
};
|
|
80
|
+
await fsPromises$1.writeFile(this.metadataPath(filePath), JSON.stringify(metadata, null, 2));
|
|
81
|
+
return {
|
|
82
|
+
ref: this.buildRef(hash, mimeType, data.length, this.providerId),
|
|
83
|
+
deduplicated: false
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async getByHash(hash) {
|
|
87
|
+
const filePath = this.hashToPath(hash);
|
|
88
|
+
let data;
|
|
89
|
+
try {
|
|
90
|
+
data = await fsPromises$1.readFile(filePath);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (error.code === "ENOENT") throw new Error(`Blob not found: ${hash}`);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
const metadata = await this.readMetadata(filePath) || {
|
|
96
|
+
mimeType: "application/octet-stream",
|
|
97
|
+
sizeBytes: data.length,
|
|
98
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
99
|
+
provider: this.providerId,
|
|
100
|
+
key: filePath
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
data,
|
|
104
|
+
metadata
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async exists(hash) {
|
|
108
|
+
try {
|
|
109
|
+
const filePath = this.hashToPath(hash);
|
|
110
|
+
await fsPromises$1.access(filePath);
|
|
111
|
+
return true;
|
|
112
|
+
} catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async deleteByHash(hash) {
|
|
117
|
+
try {
|
|
118
|
+
const filePath = this.hashToPath(hash);
|
|
119
|
+
const metaPath = this.metadataPath(filePath);
|
|
120
|
+
try {
|
|
121
|
+
await fsPromises$1.unlink(filePath);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
if (error.code !== "ENOENT") throw error;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
await fsPromises$1.unlink(metaPath);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
if (error.code !== "ENOENT") throw error;
|
|
129
|
+
}
|
|
130
|
+
} catch {}
|
|
131
|
+
}
|
|
132
|
+
async getUrl(_hash, _expiresInSeconds) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
buildRef(hash, mimeType, sizeBytes, provider) {
|
|
136
|
+
return {
|
|
137
|
+
uri: buildUri(hash),
|
|
138
|
+
hash,
|
|
139
|
+
mimeType,
|
|
140
|
+
sizeBytes,
|
|
141
|
+
provider
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async readMetadata(filePath) {
|
|
145
|
+
const safeFilePath = this.resolvePathInBase(filePath);
|
|
146
|
+
const metaPath = this.metadataPath(safeFilePath);
|
|
147
|
+
try {
|
|
148
|
+
const raw = await fsPromises$1.readFile(metaPath, "utf8");
|
|
149
|
+
return JSON.parse(raw);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
if (error.code === "ENOENT") return null;
|
|
152
|
+
logger.warn("[BlobFS] Failed to read metadata", { error });
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/blobs/index.ts
|
|
159
|
+
let defaultProvider = null;
|
|
160
|
+
function createDefaultProvider() {
|
|
161
|
+
return new FilesystemBlobStorageProvider();
|
|
162
|
+
}
|
|
163
|
+
function getBlobStorageProvider() {
|
|
164
|
+
if (!defaultProvider) {
|
|
165
|
+
defaultProvider = createDefaultProvider();
|
|
166
|
+
logger.debug("[BlobStorage] Initialized provider", { provider: defaultProvider.providerId });
|
|
167
|
+
}
|
|
168
|
+
return defaultProvider;
|
|
169
|
+
}
|
|
170
|
+
async function storeBlob(data, mimeType, refContext) {
|
|
171
|
+
const provider = getBlobStorageProvider();
|
|
172
|
+
const result = await provider.store(data, mimeType);
|
|
173
|
+
const db = getDb();
|
|
174
|
+
try {
|
|
175
|
+
db.transaction(() => {
|
|
176
|
+
const assetInsert = db.insert(blobAssetsTable).values({
|
|
177
|
+
hash: result.ref.hash,
|
|
178
|
+
sizeBytes: result.ref.sizeBytes,
|
|
179
|
+
mimeType: result.ref.mimeType,
|
|
180
|
+
provider: result.ref.provider
|
|
181
|
+
}).onConflictDoNothing().run();
|
|
182
|
+
return (refContext?.evalId && db.insert(blobReferencesTable).values({
|
|
183
|
+
id: randomUUID(),
|
|
184
|
+
blobHash: result.ref.hash,
|
|
185
|
+
evalId: refContext.evalId,
|
|
186
|
+
testIdx: refContext.testIdx,
|
|
187
|
+
promptIdx: refContext.promptIdx,
|
|
188
|
+
location: refContext.location,
|
|
189
|
+
kind: refContext.kind
|
|
190
|
+
}).onConflictDoNothing().run()) ?? assetInsert;
|
|
191
|
+
});
|
|
192
|
+
} catch (error) {
|
|
193
|
+
try {
|
|
194
|
+
await provider.deleteByHash(result.ref.hash);
|
|
195
|
+
} catch (cleanupError) {
|
|
196
|
+
logger.warn("[BlobStorage] Failed to rollback blob after DB error", {
|
|
197
|
+
error: cleanupError,
|
|
198
|
+
hash: result.ref.hash
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
async function getBlobByHash(hash) {
|
|
206
|
+
return getBlobStorageProvider().getByHash(hash);
|
|
207
|
+
}
|
|
208
|
+
async function getBlobUrl(hash, expiresInSeconds) {
|
|
209
|
+
return getBlobStorageProvider().getUrl(hash, expiresInSeconds);
|
|
210
|
+
}
|
|
211
|
+
async function recordBlobReference(hash, refContext) {
|
|
212
|
+
if (!refContext.evalId) return;
|
|
213
|
+
if (!await getBlobStorageProvider().exists(hash).catch(() => false)) {
|
|
214
|
+
logger.debug("[BlobStorage] Attempted to record reference for missing blob", {
|
|
215
|
+
hash,
|
|
216
|
+
evalId: refContext.evalId,
|
|
217
|
+
location: refContext.location
|
|
218
|
+
});
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const db = getDb();
|
|
222
|
+
if (db.select({ id: blobReferencesTable.id }).from(blobReferencesTable).where(and(eq(blobReferencesTable.blobHash, hash), eq(blobReferencesTable.evalId, refContext.evalId))).get()) return;
|
|
223
|
+
db.insert(blobReferencesTable).values({
|
|
224
|
+
id: randomUUID(),
|
|
225
|
+
blobHash: hash,
|
|
226
|
+
evalId: refContext.evalId,
|
|
227
|
+
testIdx: refContext.testIdx,
|
|
228
|
+
promptIdx: refContext.promptIdx,
|
|
229
|
+
location: refContext.location,
|
|
230
|
+
kind: refContext.kind
|
|
231
|
+
}).run();
|
|
232
|
+
}
|
|
233
|
+
//#endregion
|
|
234
|
+
export { BLOB_MAX_SIZE as a, storeBlob as i, getBlobUrl as n, BLOB_MIN_SIZE as o, recordBlobReference as r, getBlobByHash as t };
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=blobs-qTYm-1PY.js.map
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { t as __exportAll } from "./chunk-
|
|
2
|
-
import { _ as getEnvBool, b as getEnvString, g as getConfigDirectoryPath, i as
|
|
3
|
-
import {
|
|
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-60Gzydls.js";
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import path from "path";
|
|
6
6
|
import { createCache } from "cache-manager";
|
|
7
7
|
import { Keyv } from "keyv";
|
|
8
8
|
import { KeyvFile } from "keyv-file";
|
|
9
9
|
import { randomBytes } from "crypto";
|
|
10
|
-
|
|
11
10
|
//#region src/cacheMigration.ts
|
|
12
11
|
/**
|
|
13
12
|
* Migration sunset date: After this date, skip migration entirely.
|
|
@@ -39,7 +38,7 @@ function getDirSize(dirPath) {
|
|
|
39
38
|
else totalSize += fs.statSync(itemPath).size;
|
|
40
39
|
}
|
|
41
40
|
} catch (err) {
|
|
42
|
-
if (err.code !== "ENOENT")
|
|
41
|
+
if (err.code !== "ENOENT") logger.warn(`[Cache Migration] Error calculating directory size: ${err.message}`);
|
|
43
42
|
}
|
|
44
43
|
return totalSize;
|
|
45
44
|
}
|
|
@@ -54,18 +53,18 @@ function checkDiskSpace(cachePath) {
|
|
|
54
53
|
const stats = fs.statfsSync(cachePath);
|
|
55
54
|
const availableBytes = stats.bavail * stats.bsize;
|
|
56
55
|
const requiredBytes = cacheSize * 2 + 10 * 1024 * 1024;
|
|
57
|
-
|
|
56
|
+
logger.debug(`[Cache Migration] Disk space check: need ${(requiredBytes / 1024 / 1024).toFixed(2)}MB, have ${(availableBytes / 1024 / 1024).toFixed(2)}MB available`);
|
|
58
57
|
if (availableBytes < requiredBytes) {
|
|
59
|
-
|
|
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.`);
|
|
60
59
|
return false;
|
|
61
60
|
}
|
|
62
61
|
return true;
|
|
63
62
|
} else {
|
|
64
|
-
|
|
63
|
+
logger.debug("[Cache Migration] Disk space check not available on this platform, proceeding");
|
|
65
64
|
return true;
|
|
66
65
|
}
|
|
67
66
|
} catch (err) {
|
|
68
|
-
|
|
67
|
+
logger.warn(`[Cache Migration] Could not check disk space: ${err.message}`);
|
|
69
68
|
return true;
|
|
70
69
|
}
|
|
71
70
|
}
|
|
@@ -91,7 +90,7 @@ function isProcessRunning(pid) {
|
|
|
91
90
|
*/
|
|
92
91
|
function acquireMigrationLock(cachePath, attempt = 1) {
|
|
93
92
|
if (attempt > MAX_LOCK_ATTEMPTS) {
|
|
94
|
-
|
|
93
|
+
logger.warn(`[Cache Migration] Failed to acquire lock after ${MAX_LOCK_ATTEMPTS} attempts`);
|
|
95
94
|
return null;
|
|
96
95
|
}
|
|
97
96
|
const lockFile = path.join(cachePath, ".migration.lock");
|
|
@@ -100,7 +99,7 @@ function acquireMigrationLock(cachePath, attempt = 1) {
|
|
|
100
99
|
const fd = fs.openSync(lockFile, "wx");
|
|
101
100
|
fs.writeSync(fd, process.pid.toString());
|
|
102
101
|
fs.fsyncSync(fd);
|
|
103
|
-
|
|
102
|
+
logger.debug(`[Cache Migration] Lock acquired (PID: ${process.pid})`);
|
|
104
103
|
return fd;
|
|
105
104
|
} catch (err) {
|
|
106
105
|
if (err.code === "EEXIST") {
|
|
@@ -109,20 +108,20 @@ function acquireMigrationLock(cachePath, attempt = 1) {
|
|
|
109
108
|
const pid = parseInt(content, 10);
|
|
110
109
|
if (!isNaN(pid)) {
|
|
111
110
|
if (isProcessRunning(pid)) {
|
|
112
|
-
|
|
111
|
+
logger.info(`[Cache Migration] Another migration is in progress (PID: ${pid})`);
|
|
113
112
|
return null;
|
|
114
113
|
}
|
|
115
|
-
|
|
114
|
+
logger.warn(`[Cache Migration] Removing stale lock file (PID: ${pid} not found)`);
|
|
116
115
|
try {
|
|
117
116
|
fs.unlinkSync(lockFile);
|
|
118
117
|
return acquireMigrationLock(cachePath, attempt + 1);
|
|
119
118
|
} catch (unlinkErr) {
|
|
120
|
-
|
|
119
|
+
logger.error(`[Cache Migration] Failed to remove stale lock: ${unlinkErr.message}`);
|
|
121
120
|
return null;
|
|
122
121
|
}
|
|
123
122
|
}
|
|
124
123
|
} catch (readErr) {
|
|
125
|
-
|
|
124
|
+
logger.warn(`[Cache Migration] Could not read lock file: ${readErr.message}`);
|
|
126
125
|
}
|
|
127
126
|
return null;
|
|
128
127
|
}
|
|
@@ -138,13 +137,13 @@ function releaseMigrationLock(fd, cachePath) {
|
|
|
138
137
|
try {
|
|
139
138
|
fs.closeSync(fd);
|
|
140
139
|
} catch (err) {
|
|
141
|
-
|
|
140
|
+
logger.warn(`[Cache Migration] Failed to close lock file: ${err.message}`);
|
|
142
141
|
}
|
|
143
142
|
try {
|
|
144
143
|
fs.unlinkSync(lockFile);
|
|
145
|
-
|
|
144
|
+
logger.debug("[Cache Migration] Lock released");
|
|
146
145
|
} catch (err) {
|
|
147
|
-
|
|
146
|
+
logger.warn(`[Cache Migration] Failed to remove lock file: ${err.message}`);
|
|
148
147
|
}
|
|
149
148
|
}
|
|
150
149
|
/**
|
|
@@ -177,28 +176,28 @@ function readOldCacheEntries(cachePath) {
|
|
|
177
176
|
};
|
|
178
177
|
const entries = /* @__PURE__ */ new Map();
|
|
179
178
|
if (!fs.existsSync(cachePath)) {
|
|
180
|
-
|
|
179
|
+
logger.info(`[Cache Migration] No old cache directory found at ${cachePath}`);
|
|
181
180
|
return {
|
|
182
181
|
entries,
|
|
183
182
|
stats
|
|
184
183
|
};
|
|
185
184
|
}
|
|
186
185
|
const diskstoreDirs = fs.readdirSync(cachePath, { withFileTypes: true }).filter((dirEntry) => dirEntry.isDirectory() && dirEntry.name.startsWith("diskstore-")).map((dirEntry) => dirEntry.name);
|
|
187
|
-
|
|
186
|
+
logger.info(`[Cache Migration] Found ${diskstoreDirs.length} diskstore directories`);
|
|
188
187
|
const shouldLogProgress = diskstoreDirs.length > 100;
|
|
189
|
-
if (shouldLogProgress)
|
|
188
|
+
if (shouldLogProgress) logger.info(`[Cache Migration] Processing large cache, this may take a moment...`);
|
|
190
189
|
const now = Date.now();
|
|
191
190
|
let dirCount = 0;
|
|
192
191
|
for (const dir of diskstoreDirs) {
|
|
193
192
|
const dirPath = path.join(cachePath, dir);
|
|
194
193
|
dirCount++;
|
|
195
|
-
if (shouldLogProgress && dirCount % 100 === 0)
|
|
194
|
+
if (shouldLogProgress && dirCount % 100 === 0) logger.info(`[Cache Migration] Processed ${dirCount}/${diskstoreDirs.length} directories...`);
|
|
196
195
|
try {
|
|
197
196
|
const jsonFiles = fs.readdirSync(dirPath).filter((f) => f.endsWith(".json"));
|
|
198
197
|
for (const file of jsonFiles) {
|
|
199
198
|
const filePath = path.join(dirPath, file);
|
|
200
199
|
stats.totalFiles++;
|
|
201
|
-
if (stats.totalFiles % 1e3 === 0 && stats.totalFiles > 0)
|
|
200
|
+
if (stats.totalFiles % 1e3 === 0 && stats.totalFiles > 0) logger.info(`[Cache Migration] Processed ${stats.totalFiles} files...`);
|
|
202
201
|
try {
|
|
203
202
|
const content = fs.readFileSync(filePath, "utf-8");
|
|
204
203
|
const oldEntry = JSON.parse(content);
|
|
@@ -249,7 +248,7 @@ function validateCacheFile(cachePath, expectedEntryCount) {
|
|
|
249
248
|
if (!Array.isArray(parsed.cache)) throw new Error("Cache file has invalid structure: missing or invalid \"cache\" array");
|
|
250
249
|
if (typeof parsed.lastExpire !== "number") throw new Error("Cache file has invalid structure: missing or invalid \"lastExpire\" field");
|
|
251
250
|
if (parsed.cache.length !== expectedEntryCount) throw new Error(`Cache file entry count mismatch: expected ${expectedEntryCount}, got ${parsed.cache.length}`);
|
|
252
|
-
|
|
251
|
+
logger.debug(`[Cache Migration] Validated cache file: ${cachePath} (${expectedEntryCount} entries)`);
|
|
253
252
|
}
|
|
254
253
|
/**
|
|
255
254
|
* Write entries in keyv-file format using atomic write operation.
|
|
@@ -273,7 +272,7 @@ function writeNewCacheFile(entries, newCachePath) {
|
|
|
273
272
|
}
|
|
274
273
|
fs.writeFileSync(tempFile, serialized, "utf-8");
|
|
275
274
|
fs.renameSync(tempFile, newCachePath);
|
|
276
|
-
|
|
275
|
+
logger.debug(`[Cache Migration] Atomically wrote cache file: ${newCachePath}`);
|
|
277
276
|
validateCacheFile(newCachePath, entries.size);
|
|
278
277
|
} catch (err) {
|
|
279
278
|
try {
|
|
@@ -287,7 +286,7 @@ function writeNewCacheFile(entries, newCachePath) {
|
|
|
287
286
|
*/
|
|
288
287
|
function createBackup(cachePath) {
|
|
289
288
|
const backupPath = `${cachePath}.backup.${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
|
|
290
|
-
|
|
289
|
+
logger.info(`[Cache Migration] Creating backup at ${backupPath}`);
|
|
291
290
|
if (fs.existsSync(cachePath)) fs.cpSync(cachePath, backupPath, { recursive: true });
|
|
292
291
|
return backupPath;
|
|
293
292
|
}
|
|
@@ -315,11 +314,11 @@ function isMigrationComplete(cacheBasePath, newCacheFile) {
|
|
|
315
314
|
if (newCacheFile && fs.existsSync(newCacheFile)) return true;
|
|
316
315
|
if (newCacheFile) {
|
|
317
316
|
if (hasOldCacheFormat(cacheBasePath)) {
|
|
318
|
-
|
|
317
|
+
logger.warn("[Cache Migration] Marker file exists but migration appears incomplete. Old cache format found but new cache missing. Retrying migration...");
|
|
319
318
|
try {
|
|
320
319
|
fs.unlinkSync(markerPath);
|
|
321
320
|
} catch (err) {
|
|
322
|
-
|
|
321
|
+
logger.warn(`[Cache Migration] Failed to remove stale marker: ${err.message}`);
|
|
323
322
|
}
|
|
324
323
|
return false;
|
|
325
324
|
}
|
|
@@ -351,7 +350,7 @@ function cleanupOldCache(cachePath) {
|
|
|
351
350
|
throw err;
|
|
352
351
|
}
|
|
353
352
|
const diskstoreDirs = dirEntries.filter((dirEntry) => dirEntry.isDirectory() && dirEntry.name.startsWith("diskstore-")).map((dirEntry) => dirEntry.name);
|
|
354
|
-
|
|
353
|
+
logger.info(`[Cache Migration] Cleaning up ${diskstoreDirs.length} old cache directories`);
|
|
355
354
|
for (const dir of diskstoreDirs) {
|
|
356
355
|
const dirPath = path.join(cachePath, dir);
|
|
357
356
|
try {
|
|
@@ -360,7 +359,7 @@ function cleanupOldCache(cachePath) {
|
|
|
360
359
|
force: true
|
|
361
360
|
});
|
|
362
361
|
} catch (err) {
|
|
363
|
-
|
|
362
|
+
logger.warn(`[Cache Migration] Failed to remove ${dirPath}: ${err.message}`);
|
|
364
363
|
}
|
|
365
364
|
}
|
|
366
365
|
}
|
|
@@ -370,23 +369,23 @@ function cleanupOldCache(cachePath) {
|
|
|
370
369
|
*/
|
|
371
370
|
function cleanupBackup(backupPath, stats) {
|
|
372
371
|
if (stats.successCount === 0 && stats.failureCount === 0) {
|
|
373
|
-
|
|
372
|
+
logger.info(`[Cache Migration] No valid entries found (${stats.skippedExpired} expired only). Removing backup to save space.`);
|
|
374
373
|
try {
|
|
375
374
|
fs.rmSync(backupPath, {
|
|
376
375
|
recursive: true,
|
|
377
376
|
force: true
|
|
378
377
|
});
|
|
379
|
-
|
|
378
|
+
logger.info(`[Cache Migration] Backup removed: ${backupPath}`);
|
|
380
379
|
return true;
|
|
381
380
|
} catch (err) {
|
|
382
|
-
|
|
381
|
+
logger.warn(`[Cache Migration] Failed to remove backup ${backupPath}: ${err.message}`);
|
|
383
382
|
return false;
|
|
384
383
|
}
|
|
385
384
|
} else if (stats.failureCount > 0) {
|
|
386
|
-
|
|
385
|
+
logger.info(`[Cache Migration] Backup kept at ${backupPath} due to ${stats.failureCount} migration errors. You may want to investigate these failures.`);
|
|
387
386
|
return false;
|
|
388
387
|
} else {
|
|
389
|
-
|
|
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.`);
|
|
390
389
|
return false;
|
|
391
390
|
}
|
|
392
391
|
}
|
|
@@ -395,10 +394,10 @@ function cleanupBackup(backupPath, stats) {
|
|
|
395
394
|
* Migrates cache from cache-manager v4 (cache-manager-fs-hash) to v7 (keyv-file)
|
|
396
395
|
*/
|
|
397
396
|
function runMigration(cachePath, newCacheFilePath) {
|
|
398
|
-
|
|
397
|
+
logger.info("[Cache Migration] Starting cache migration from v4 to v7");
|
|
399
398
|
const lock = acquireMigrationLock(cachePath);
|
|
400
399
|
if (lock === null) {
|
|
401
|
-
|
|
400
|
+
logger.info("[Cache Migration] Another migration is in progress, skipping");
|
|
402
401
|
return {
|
|
403
402
|
success: true,
|
|
404
403
|
stats: {
|
|
@@ -412,7 +411,7 @@ function runMigration(cachePath, newCacheFilePath) {
|
|
|
412
411
|
}
|
|
413
412
|
try {
|
|
414
413
|
if (isMigrationComplete(cachePath, newCacheFilePath)) {
|
|
415
|
-
|
|
414
|
+
logger.info("[Cache Migration] Migration already completed, skipping");
|
|
416
415
|
return {
|
|
417
416
|
success: true,
|
|
418
417
|
stats: {
|
|
@@ -425,7 +424,7 @@ function runMigration(cachePath, newCacheFilePath) {
|
|
|
425
424
|
};
|
|
426
425
|
}
|
|
427
426
|
if (!hasOldCacheFormat(cachePath)) {
|
|
428
|
-
|
|
427
|
+
logger.info("[Cache Migration] No old cache format detected, skipping migration");
|
|
429
428
|
markMigrationComplete(cachePath, {
|
|
430
429
|
totalFiles: 0,
|
|
431
430
|
successCount: 0,
|
|
@@ -445,7 +444,7 @@ function runMigration(cachePath, newCacheFilePath) {
|
|
|
445
444
|
};
|
|
446
445
|
}
|
|
447
446
|
if (!checkDiskSpace(cachePath)) {
|
|
448
|
-
|
|
447
|
+
logger.error("[Cache Migration] Insufficient disk space, aborting migration");
|
|
449
448
|
return {
|
|
450
449
|
success: false,
|
|
451
450
|
stats: {
|
|
@@ -458,30 +457,30 @@ function runMigration(cachePath, newCacheFilePath) {
|
|
|
458
457
|
};
|
|
459
458
|
}
|
|
460
459
|
const backupPath = createBackup(cachePath);
|
|
461
|
-
|
|
460
|
+
logger.info("[Cache Migration] Reading old cache entries");
|
|
462
461
|
const { entries, stats } = readOldCacheEntries(cachePath);
|
|
463
|
-
|
|
462
|
+
logger.info(`[Cache Migration] Read ${stats.successCount} entries (${stats.failureCount} failures, ${stats.skippedExpired} expired)`);
|
|
464
463
|
if (stats.errors.length > 0) {
|
|
465
|
-
|
|
466
|
-
stats.errors.slice(0, 10).forEach((err) =>
|
|
467
|
-
if (stats.errors.length > 10)
|
|
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`);
|
|
468
467
|
}
|
|
469
468
|
if (entries.size > 0) {
|
|
470
|
-
|
|
469
|
+
logger.info(`[Cache Migration] Writing ${entries.size} entries to new cache file: ${newCacheFilePath}`);
|
|
471
470
|
writeNewCacheFile(entries, newCacheFilePath);
|
|
472
|
-
} else
|
|
471
|
+
} else logger.info("[Cache Migration] No entries to migrate");
|
|
473
472
|
cleanupOldCache(cachePath);
|
|
474
473
|
const backupDeleted = cleanupBackup(backupPath, stats);
|
|
475
474
|
markMigrationComplete(cachePath, stats);
|
|
476
|
-
|
|
475
|
+
logger.info("[Cache Migration] Migration completed successfully");
|
|
477
476
|
return {
|
|
478
477
|
success: true,
|
|
479
478
|
stats,
|
|
480
479
|
backupPath: backupDeleted ? void 0 : backupPath
|
|
481
480
|
};
|
|
482
481
|
} catch (err) {
|
|
483
|
-
|
|
484
|
-
|
|
482
|
+
logger.error(`[Cache Migration] Migration failed: ${err.message}`);
|
|
483
|
+
logger.error(`[Cache Migration] Stack trace: ${err.stack}`);
|
|
485
484
|
return {
|
|
486
485
|
success: false,
|
|
487
486
|
stats: {
|
|
@@ -508,7 +507,6 @@ function shouldRunMigration(cachePath, newCacheFile) {
|
|
|
508
507
|
if (isMigrationComplete(cachePath, newCacheFile)) return false;
|
|
509
508
|
return hasOldCacheFormat(cachePath);
|
|
510
509
|
}
|
|
511
|
-
|
|
512
510
|
//#endregion
|
|
513
511
|
//#region src/util/fetch/errors.ts
|
|
514
512
|
/**
|
|
@@ -541,7 +539,6 @@ function isTransientConnectionError(error) {
|
|
|
541
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;
|
|
542
540
|
return message.includes("bad record mac") || message.includes("eproto") || message.includes("econnreset") || message.includes("socket hang up");
|
|
543
541
|
}
|
|
544
|
-
|
|
545
542
|
//#endregion
|
|
546
543
|
//#region src/cache.ts
|
|
547
544
|
var cache_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -572,23 +569,23 @@ function getCache() {
|
|
|
572
569
|
if (cacheType === "disk" && enabled) {
|
|
573
570
|
cachePath = getEnvString("PROMPTFOO_CACHE_PATH") || path.join(getConfigDirectoryPath(), "cache");
|
|
574
571
|
if (!fs.existsSync(cachePath)) {
|
|
575
|
-
|
|
572
|
+
logger.info(`Creating cache folder at ${cachePath}.`);
|
|
576
573
|
fs.mkdirSync(cachePath, { recursive: true });
|
|
577
574
|
}
|
|
578
575
|
const newCacheFile = path.join(cachePath, "cache.json");
|
|
579
576
|
if (shouldRunMigration(cachePath, newCacheFile)) {
|
|
580
|
-
|
|
577
|
+
logger.info("[Cache] Migrating cache from v4 to v7...");
|
|
581
578
|
try {
|
|
582
579
|
const result = runMigration(cachePath, newCacheFile);
|
|
583
580
|
if (result.success) {
|
|
584
|
-
|
|
585
|
-
if (result.backupPath)
|
|
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}`);
|
|
586
583
|
} else {
|
|
587
|
-
|
|
584
|
+
logger.error(`[Cache] Migration failed: ${result.stats.errors.join(", ")}. Falling back to memory cache.`);
|
|
588
585
|
migrationFailed = true;
|
|
589
586
|
}
|
|
590
587
|
} catch (err) {
|
|
591
|
-
|
|
588
|
+
logger.error(`[Cache] Migration error: ${err.message}. Falling back to memory cache.`);
|
|
592
589
|
migrationFailed = true;
|
|
593
590
|
}
|
|
594
591
|
}
|
|
@@ -599,7 +596,7 @@ function getCache() {
|
|
|
599
596
|
});
|
|
600
597
|
stores.push(keyv);
|
|
601
598
|
} catch (err) {
|
|
602
|
-
|
|
599
|
+
logger.warn(`[Cache] Failed to initialize disk cache: ${err.message}. Using memory cache instead.`);
|
|
603
600
|
}
|
|
604
601
|
}
|
|
605
602
|
cacheInstance = createCache({
|
|
@@ -625,7 +622,7 @@ async function fetchAndReadBody(url, options, timeout, maxRetries, isIdempotent)
|
|
|
625
622
|
} catch (err) {
|
|
626
623
|
if (isTransientConnectionError(err) && bodyAttempt < maxBodyRetries) {
|
|
627
624
|
const backoffMs = Math.pow(2, bodyAttempt) * 1e3;
|
|
628
|
-
|
|
625
|
+
logger.debug("[Cache] Body stream failed with transient error, retrying", {
|
|
629
626
|
attempt: bodyAttempt + 1,
|
|
630
627
|
maxRetries: maxBodyRetries,
|
|
631
628
|
backoffMs,
|
|
@@ -700,16 +697,16 @@ async function fetchWithCache(url, options = {}, timeout = REQUEST_TIMEOUT_MS, f
|
|
|
700
697
|
}
|
|
701
698
|
if (!data) return;
|
|
702
699
|
if (format === "json" && parsedData?.error) {
|
|
703
|
-
|
|
700
|
+
logger.debug(`Not caching ${url} because it contains an 'error' key: ${parsedData.error}`);
|
|
704
701
|
return data;
|
|
705
702
|
}
|
|
706
|
-
|
|
703
|
+
logger.debug(`Storing ${url} response in cache with latencyMs=${fetchLatencyMs}: ${data}`);
|
|
707
704
|
return data;
|
|
708
705
|
} catch (err) {
|
|
709
706
|
throw new Error(`Error parsing response from ${url}: ${err.message}. Received text: ${responseText}`);
|
|
710
707
|
}
|
|
711
708
|
});
|
|
712
|
-
if (cached && cachedResponse)
|
|
709
|
+
if (cached && cachedResponse) logger.debug(`Returning cached response for ${url}: ${cachedResponse}`);
|
|
713
710
|
const parsedResponse = JSON.parse(cachedResponse ?? errorResponse);
|
|
714
711
|
return {
|
|
715
712
|
cached,
|
|
@@ -720,7 +717,7 @@ async function fetchWithCache(url, options = {}, timeout = REQUEST_TIMEOUT_MS, f
|
|
|
720
717
|
latencyMs: parsedResponse.latencyMs,
|
|
721
718
|
deleteFromCache: async () => {
|
|
722
719
|
await cache.del(cacheKey);
|
|
723
|
-
|
|
720
|
+
logger.debug(`Evicted from cache: ${cacheKey}`);
|
|
724
721
|
}
|
|
725
722
|
};
|
|
726
723
|
}
|
|
@@ -736,7 +733,7 @@ async function clearCache() {
|
|
|
736
733
|
function isCacheEnabled() {
|
|
737
734
|
return enabled;
|
|
738
735
|
}
|
|
739
|
-
|
|
740
736
|
//#endregion
|
|
741
|
-
export {
|
|
742
|
-
|
|
737
|
+
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 };
|
|
738
|
+
|
|
739
|
+
//# sourceMappingURL=cache-8XhNqPKW.js.map
|