@piwitests/server 0.15.0 → 0.16.0
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{DzbOHjZH.js → -KQO1A4C.js} +1 -1
- package/.output/public/_nuxt/{BEKwVcvQ.js → 1AB111xL.js} +1 -1
- package/.output/public/_nuxt/{CokbKVE6.js → 2xvsvjLO.js} +1 -1
- package/.output/public/_nuxt/{CNzoIhwN.js → ABGJk0pu.js} +1 -1
- package/.output/public/_nuxt/{Cgr8IKY4.js → B2lYFco4.js} +1 -1
- package/.output/public/_nuxt/B33X4zrC.js +1 -0
- package/.output/public/_nuxt/{V1BQiRoh.js → B3NbDoBP.js} +1 -1
- package/.output/public/_nuxt/{ChWPXucC.js → B3sNtVnf.js} +1 -1
- package/.output/public/_nuxt/{too3WhRB.js → B43OGXzV.js} +1 -1
- package/.output/public/_nuxt/{Cf3RuiXF.js → B6Jp7fpa.js} +4 -4
- package/.output/public/_nuxt/{B32ySRXg.js → B7yG1G_l.js} +1 -1
- package/.output/public/_nuxt/{BgR7oL4p.js → BBdfPriC.js} +1 -1
- package/.output/public/_nuxt/{DNP5tTJo.js → BGYbnqA7.js} +1 -1
- package/.output/public/_nuxt/{DAeYEeCC.js → BIf1R_fu.js} +1 -1
- package/.output/public/_nuxt/{nUsJV5qo.js → BIksQZfR.js} +1 -1
- package/.output/public/_nuxt/{B8fs6GU9.js → BPKwYP2Q.js} +31 -31
- package/.output/public/_nuxt/{DjCfCT_5.js → BP_SWi7S.js} +1 -1
- package/.output/public/_nuxt/{CrFCPOnY.js → BQrSEuzu.js} +1 -1
- package/.output/public/_nuxt/{BpepjHwc.js → BR9H8k-L.js} +1 -1
- package/.output/public/_nuxt/{Dejf0f7D.js → BRKa6EQR.js} +3 -3
- package/.output/public/_nuxt/{BMQIO38j.js → BS0gKVuF.js} +1 -1
- package/.output/public/_nuxt/{BW1UOxWn.js → BV83yObd.js} +1 -1
- package/.output/public/_nuxt/{o5WQ5Z7k.js → BVW5qIDP.js} +1 -1
- package/.output/public/_nuxt/{rvaZFYoE.js → BY4oA2IH.js} +1 -1
- package/.output/public/_nuxt/{DZoSxwj6.js → BZekCf_x.js} +1 -1
- package/.output/public/_nuxt/{lRMjXqiA.js → Bb64FEFL.js} +1 -1
- package/.output/public/_nuxt/{2PU-adwy.js → BdFEUAlx.js} +1 -1
- package/.output/public/_nuxt/{CBrCcDzR.js → Bf62wdzp.js} +1 -1
- package/.output/public/_nuxt/{DYDGGqZ3.js → BkDfdHFm.js} +1 -1
- package/.output/public/_nuxt/{CqA3gM8h.js → BoRFLTAO.js} +1 -1
- package/.output/public/_nuxt/{DxXZN6ed.js → BpIsBP5g.js} +1 -1
- package/.output/public/_nuxt/{DkFbpSsi.js → BpNqHxg2.js} +1 -1
- package/.output/public/_nuxt/{DFw8I2FL.js → BpceIssd.js} +1 -1
- package/.output/public/_nuxt/{n7Htv9PJ.js → Br2K9yi_.js} +1 -1
- package/.output/public/_nuxt/{D4nLD93c.js → BuZOa2M3.js} +1 -1
- package/.output/public/_nuxt/{B32-7cBF.js → Bvfmwzgw.js} +1 -1
- package/.output/public/_nuxt/{h-e-Ca3f.js → Bzl2H_vl.js} +1 -1
- package/.output/public/_nuxt/{IdQR_Djw.js → C1K3r_fc.js} +1 -1
- package/.output/public/_nuxt/C219JuBV.js +1 -0
- package/.output/public/_nuxt/{B_80i5Ge.js → C38aZbFJ.js} +1 -1
- package/.output/public/_nuxt/{DHVmXA9K.js → C3r_Sv1p.js} +1 -1
- package/.output/public/_nuxt/{O1A-LRgV.js → C8RBRg7I.js} +1 -1
- package/.output/public/_nuxt/{60-Zii7v.js → CCRRqXez.js} +1 -1
- package/.output/public/_nuxt/{__m3KqHO.js → CJFqA_QW.js} +1 -1
- package/.output/public/_nuxt/{Surk4Lw-.js → CKB_doYB.js} +1 -1
- package/.output/public/_nuxt/{DaKVSp-6.js → CMYQpoOI.js} +1 -1
- package/.output/public/_nuxt/CQeMb57w.js +1 -0
- package/.output/public/_nuxt/{Bq2ZPvIH.js → CSYJwpXG.js} +1 -1
- package/.output/public/_nuxt/{ETOCcsVw.js → CTdvGdc2.js} +1 -1
- package/.output/public/_nuxt/CX1dcT4v.js +1 -0
- package/.output/public/_nuxt/{evCxpgbd.js → CdME81ij.js} +2 -2
- package/.output/public/_nuxt/{DKTDub7I.js → CgoAUz76.js} +1 -1
- package/.output/public/_nuxt/{0KrkW531.js → CoHGrO41.js} +1 -1
- package/.output/public/_nuxt/{BGsuOpiq.js → CpO-ABDW.js} +1 -1
- package/.output/public/_nuxt/CuYYdFBL.js +1 -0
- package/.output/public/_nuxt/{CHMpVLqo.js → D2jhe9JK.js} +1 -1
- package/.output/public/_nuxt/{C7RarFGi.js → D33On6AX.js} +1 -1
- package/.output/public/_nuxt/{Dv2B_nw_.js → D4VpoHDP.js} +1 -1
- package/.output/public/_nuxt/{CKZn0TUX.js → DAWn6Z7h.js} +1 -1
- package/.output/public/_nuxt/{rWwWS3Kj.js → DCpmQ47_.js} +1 -1
- package/.output/public/_nuxt/{B59-l1Cv.js → DIkLLyR6.js} +1 -1
- package/.output/public/_nuxt/{CFn3w5jn.js → DJS3Bf50.js} +1 -1
- package/.output/public/_nuxt/{F07TcX0U.js → DL20rwkA.js} +1 -1
- package/.output/public/_nuxt/DOuoR2Pk.js +34 -0
- package/.output/public/_nuxt/{BC_Wu-fv.js → DRtTLQri.js} +1 -1
- package/.output/public/_nuxt/{DiUGa0CT.js → DbeHHTk-.js} +1 -1
- package/.output/public/_nuxt/DcCNnjKl.js +1 -0
- package/.output/public/_nuxt/{PPFO8UVt.js → DdbrJwT-.js} +1 -1
- package/.output/public/_nuxt/{Cfk2_UCm.js → DfcAIbcX.js} +1 -1
- package/.output/public/_nuxt/{OG2n3p77.js → DgYM3eyi.js} +1 -1
- package/.output/public/_nuxt/{BBJ9Pu3M.js → DhA17dqR.js} +1 -1
- package/.output/public/_nuxt/{DvdOsTLb.js → DjZKuUMz.js} +1 -1
- package/.output/public/_nuxt/{DCCMLWel.js → DqnyWaSQ.js} +1 -1
- package/.output/public/_nuxt/Dsk4Ic18.js +7 -0
- package/.output/public/_nuxt/{BCK4f6Y3.js → DszOHBMG.js} +1 -1
- package/.output/public/_nuxt/{Cpquifvd.js → DuBBqqbF.js} +1 -1
- package/.output/public/_nuxt/{DWzdeQ3Z.js → DuMv-ugy.js} +1 -1
- package/.output/public/_nuxt/{BfshMo9k.js → Dz55UR7w.js} +2 -2
- package/.output/public/_nuxt/{BkhdAGx0.js → Dzz9_Z0u.js} +1 -1
- package/.output/public/_nuxt/{DgZlpN9l.js → HoKG9cc2.js} +1 -1
- package/.output/public/_nuxt/{C9jjVEQU.js → IFqRT_xJ.js} +1 -1
- package/.output/public/_nuxt/{i38YGG9S.js → JCFZINev.js} +1 -1
- package/.output/public/_nuxt/{B9Q_4Mjt.js → Kc7La4sL.js} +1 -1
- package/.output/public/_nuxt/N3pCB6-m.js +4 -0
- package/.output/public/_nuxt/{CFXonrwQ.js → WctJXszi.js} +1 -1
- package/.output/public/_nuxt/{CHgsEM4U.js → bAfTAihV.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/5182c9fb-56a6-4df2-9685-4020a08ce7a5.json +1 -0
- package/.output/public/_nuxt/{4fB15L_7.js → d5ZB3uxF.js} +1 -1
- package/.output/public/_nuxt/{CIOQo6gB.js → e1zUTrBb.js} +1 -1
- package/.output/public/_nuxt/entry.BsmKRJzR.css +1 -0
- package/.output/public/_nuxt/{BtJkQ3to.js → iwD5atI2.js} +1 -1
- package/.output/public/_nuxt/jIF87ALb.js +1 -0
- package/.output/public/_nuxt/{CvCF77E-.js → k-z_VVTK.js} +2 -2
- package/.output/public/_nuxt/{CHSkT2s0.js → l0gdGdar.js} +1 -1
- package/.output/public/_nuxt/{DVdOm5Bg.js → mGJLLqyN.js} +1 -1
- package/.output/public/_nuxt/{CU-OXXdh.js → mfzslNx_.js} +1 -1
- package/.output/public/_nuxt/{CD-xwM9N.js → nCjfWTGm.js} +1 -1
- package/.output/public/_nuxt/{DQpa8F03.js → oNq5pd3r.js} +1 -1
- package/.output/public/_nuxt/qzAP_nm7.js +1 -0
- package/.output/public/_nuxt/{3SnTawZW.js → r3SBLxtE.js} +1 -1
- package/.output/public/_nuxt/{DI_-kFec.js → uKeO2H7F.js} +1 -1
- package/.output/public/_nuxt/{DZLrAp2i.js → xUrLy-Zn.js} +1 -1
- package/.output/public/_nuxt/{BY0AkhJh.js → ze9-Ill2.js} +1 -1
- package/.output/public/demo/seed.version.json +2 -2
- package/.output/public/sw.js +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{BrowserBadge-BTA4QU_J.mjs → BrowserBadge-DNCp9pF-.mjs} +3 -3
- package/.output/server/chunks/build/BrowserBadge-DNCp9pF-.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-BqAhMip2.mjs → ChartCard-Fr557IbV.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-Fr557IbV.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-_1nGm_DR.mjs → Checkbox-7ZiMz60w.mjs} +5 -5
- package/.output/server/chunks/build/Checkbox-7ZiMz60w.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DAufYuJw.mjs → CiEnvCard-DNxBVvx4.mjs} +5 -5
- package/.output/server/chunks/build/CiEnvCard-DNxBVvx4.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BVKHuYjU.mjs → CodeBlock-BGwNmJ8J.mjs} +2 -2
- package/.output/server/chunks/build/CodeBlock-BGwNmJ8J.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-BR6j4VLd.mjs → DashboardNavbar-Bdp-OwTN.mjs} +2 -2
- package/.output/server/chunks/build/DashboardNavbar-Bdp-OwTN.mjs.map +1 -0
- package/.output/server/chunks/build/DashboardSidebarToggle-Ji6ADuqF.mjs +1 -1
- package/.output/server/chunks/build/{DiagnosisPanel-BnrdXDvd.mjs → DiagnosisPanel-DV1xwGu4.mjs} +6 -6
- package/.output/server/chunks/build/DiagnosisPanel-DV1xwGu4.mjs.map +1 -0
- package/.output/server/chunks/build/EntityLinks-DeOP13Kr.mjs +1 -1
- package/.output/server/chunks/build/{EnvManagedBadge-DdnEtjIl.mjs → EnvManagedBadge-Qpn58Nmr.mjs} +5 -5
- package/.output/server/chunks/build/EnvManagedBadge-Qpn58Nmr.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-D_GJzMpW.mjs → HelpHint-YEMWtKu1.mjs} +18 -2
- package/.output/server/chunks/build/HelpHint-YEMWtKu1.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-COIjm3js.mjs → Modal-CfA78Hm1.mjs} +2 -2
- package/.output/server/chunks/build/Modal-CfA78Hm1.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-D97W6On1.mjs → OpenInIdeLink-B92wosXu.mjs} +3 -3
- package/.output/server/chunks/build/{OpenInIdeLink-D97W6On1.mjs.map → OpenInIdeLink-B92wosXu.mjs.map} +1 -1
- package/.output/server/chunks/build/{PageStateCard-C1HFN4Nv.mjs → PageStateCard-Bwee6JTk.mjs} +10 -10
- package/.output/server/chunks/build/{PageStateCard-C1HFN4Nv.mjs.map → PageStateCard-Bwee6JTk.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-XFBPQGIX.mjs → ProjectTestCasesTable-9418EI8J.mjs} +9 -9
- package/.output/server/chunks/build/ProjectTestCasesTable-9418EI8J.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-ChNkmuWa.mjs → RunReports-BpJqLHY9.mjs} +2 -2
- package/.output/server/chunks/build/RunReports-BpJqLHY9.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-CXpuCUGQ.mjs → RunStatusBadge-BhmJ_RKM.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-BhmJ_RKM.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-zs9FDzps.mjs → SectionCard-COd9TuDq.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-COd9TuDq.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-r3S5nkSY.mjs → Select-COwTIQlV.mjs} +3 -3
- package/.output/server/chunks/build/Select-COwTIQlV.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-Dk6f8i9o.mjs → SelectMenu-BkyAHFCM.mjs} +4 -4
- package/.output/server/chunks/build/{SelectMenu-Dk6f8i9o.mjs.map → SelectMenu-BkyAHFCM.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-pqpPG0up.mjs → Separator-CxZdx8kw.mjs} +2 -2
- package/.output/server/chunks/build/Separator-CxZdx8kw.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-Wdpzlt13.mjs → SettingsField-DDD4oqys.mjs} +5 -5
- package/.output/server/chunks/build/SettingsField-DDD4oqys.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-02XjJjn0.mjs → Slideover-B95Rj237.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-B95Rj237.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-gx_JXgCo.mjs → Switch-htSKgC38.mjs} +2 -2
- package/.output/server/chunks/build/Switch-htSKgC38.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-C64RrBp3.mjs → Table-CPhhVzDv.mjs} +3 -3
- package/.output/server/chunks/build/Table-CPhhVzDv.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar--u4VX_Xf.mjs → TestStatusBar-CEzt76wk.mjs} +2 -2
- package/.output/server/chunks/build/TestStatusBar-CEzt76wk.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-ui_BVvqr.mjs → Tooltip-7vwuDPrZ.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-7vwuDPrZ.mjs.map +1 -0
- package/.output/server/chunks/build/{VisuallyHiddenInput-mMsqmkjz.mjs → VisuallyHiddenInput-C9eJVpPW.mjs} +2 -2
- package/.output/server/chunks/build/VisuallyHiddenInput-C9eJVpPW.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CFVnSs8B.mjs → _id_-BDqvTM9D.mjs} +19 -18
- package/.output/server/chunks/build/{_id_-CFVnSs8B.mjs.map → _id_-BDqvTM9D.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-pkxJKe17.mjs → _id_-CE0Gso6i.mjs} +11 -11
- package/.output/server/chunks/build/_id_-CE0Gso6i.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-R6KGfZOC.mjs → _id_-CnwAyvvS.mjs} +257 -84
- package/.output/server/chunks/build/_id_-CnwAyvvS.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-DXJQABO8.mjs → _id_-Dy67M9Dj.mjs} +25 -25
- package/.output/server/chunks/build/{_id_-DXJQABO8.mjs.map → _id_-Dy67M9Dj.mjs.map} +1 -1
- package/.output/server/chunks/build/{about-CmtGYbC6.mjs → about-FB9PYAHK.mjs} +5 -5
- package/.output/server/chunks/build/about-FB9PYAHK.mjs.map +1 -0
- package/.output/server/chunks/build/{account-AbLuwiZP.mjs → account-Cn-eZqXM.mjs} +4 -4
- package/.output/server/chunks/build/account-Cn-eZqXM.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-DR_slopS.mjs → ai-V3YOh3yx.mjs} +17 -17
- package/.output/server/chunks/build/ai-V3YOh3yx.mjs.map +1 -0
- package/.output/server/chunks/build/{analytics-BbT2-Tr-.mjs → analytics-BBlAEmj5.mjs} +235 -64
- package/.output/server/chunks/build/analytics-BBlAEmj5.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{db.client-DlA_u5y9.mjs → db.client-aHcD0wyX.mjs} +47 -22
- package/.output/server/chunks/build/db.client-aHcD0wyX.mjs.map +1 -0
- package/.output/server/chunks/build/{default-D6diRCW0.mjs → default-BfMirIgG.mjs} +17 -16
- package/.output/server/chunks/build/default-BfMirIgG.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-DbYoZafk.mjs → docs-DtNcJCyb.mjs} +5 -5
- package/.output/server/chunks/build/{docs-DbYoZafk.mjs.map → docs-DtNcJCyb.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-CNV4xdYj.mjs → edit-Dsf11mL5.mjs} +8 -8
- package/.output/server/chunks/build/edit-Dsf11mL5.mjs.map +1 -0
- package/.output/server/chunks/build/fetch-8kznMtBM.mjs +1 -1
- package/.output/server/chunks/build/{help-content-BMumoQQF.mjs → help-content-DmFnuhNu.mjs} +6 -1
- package/.output/server/chunks/build/help-content-DmFnuhNu.mjs.map +1 -0
- package/.output/server/chunks/build/{index-Dw526KXV.mjs → index-BR9hw6qk.mjs} +10 -10
- package/.output/server/chunks/build/index-BR9hw6qk.mjs.map +1 -0
- package/.output/server/chunks/build/{index-dwYB76GO.mjs → index-Ba-Fifra.mjs} +4 -4
- package/.output/server/chunks/build/index-Ba-Fifra.mjs.map +1 -0
- package/.output/server/chunks/build/{index-rSHkKNna.mjs → index-BgpEKTSq.mjs} +505 -84
- package/.output/server/chunks/build/index-BgpEKTSq.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DmHBPf7T.mjs → index-CULN3-en.mjs} +11 -2
- package/.output/server/chunks/build/index-CULN3-en.mjs.map +1 -0
- package/.output/server/chunks/build/{index-C3Ou18qD.mjs → index-DzEgjHlB.mjs} +14 -14
- package/.output/server/chunks/build/{index-C3Ou18qD.mjs.map → index-DzEgjHlB.mjs.map} +1 -1
- package/.output/server/chunks/build/{isValueEqualOrExist-DTJ5ejZs.mjs → isValueEqualOrExist-DBZjbD_3.mjs} +3 -3
- package/.output/server/chunks/build/isValueEqualOrExist-DBZjbD_3.mjs.map +1 -0
- package/.output/server/chunks/build/{login-Da5C8jP2.mjs → login-D2XZDuek.mjs} +3 -3
- package/.output/server/chunks/build/login-D2XZDuek.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-DM1t-9L_.mjs → mcp-CXwa3xU3.mjs} +8 -8
- package/.output/server/chunks/build/mcp-CXwa3xU3.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-BTPF0xA7.mjs → notifications-hJj8tbAT.mjs} +11 -11
- package/.output/server/chunks/build/notifications-hJj8tbAT.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +37 -28
- package/.output/server/chunks/build/{settings-Bmw_JdBS.mjs → settings-Ci_7EXYQ.mjs} +8 -7
- package/.output/server/chunks/build/settings-Ci_7EXYQ.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-CksLgMun.mjs → settings-metadata-Cp0dx0vm.mjs} +12 -3
- package/.output/server/chunks/build/settings-metadata-Cp0dx0vm.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-BqR4acgi.mjs → storage-CM-Pd-9E.mjs} +191 -14
- package/.output/server/chunks/build/storage-CM-Pd-9E.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-miPAzIr3.mjs → tags-DrCQ7QSw.mjs} +6 -6
- package/.output/server/chunks/build/tags-DrCQ7QSw.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-D-LqhLpk.mjs → test-cases-DkGQB027.mjs} +14 -14
- package/.output/server/chunks/build/test-cases-DkGQB027.mjs.map +1 -0
- package/.output/server/chunks/build/timeout-hygiene-CNs71Iah.mjs +318 -0
- package/.output/server/chunks/build/timeout-hygiene-CNs71Iah.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-FwqbA4gz.mjs → useAiStatus-ZO987RY7.mjs} +8 -7
- package/.output/server/chunks/build/useAiStatus-ZO987RY7.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-v_dFuTw9.mjs → useSettingsNav-D2knPCqF.mjs} +6 -6
- package/.output/server/chunks/build/useSettingsNav-D2knPCqF.mjs.map +1 -0
- package/.output/server/chunks/build/{users-D-GDKZmZ.mjs → users-NmAUZs3i.mjs} +6 -6
- package/.output/server/chunks/build/users-NmAUZs3i.mjs.map +1 -0
- package/.output/server/chunks/build/{virtualizer-BcC1XuFf.mjs → virtualizer-0-UBy7xl.mjs} +4 -4
- package/.output/server/chunks/build/virtualizer-0-UBy7xl.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-CFmeT_e2.mjs → wasted-time-L4kBV5Nh.mjs} +8 -8
- package/.output/server/chunks/build/wasted-time-L4kBV5Nh.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +949 -684
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +51 -0
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +5 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +75 -6
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +45 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +50 -0
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +40 -0
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +46 -0
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/database/migrations/0037_tired_hellion.sql +1 -0
- package/.output/server/database/migrations/0038_glamorous_ulik.sql +1 -0
- package/.output/server/database/migrations/meta/0037_snapshot.json +3384 -0
- package/.output/server/database/migrations/meta/0038_snapshot.json +3391 -0
- package/.output/server/database/migrations/meta/_journal.json +14 -0
- package/.output/server/database/migrations-pg/0038_tranquil_moira_mactaggert.sql +1 -0
- package/.output/server/database/migrations-pg/0039_fat_starjammers.sql +1 -0
- package/.output/server/database/migrations-pg/meta/0038_snapshot.json +4027 -0
- package/.output/server/database/migrations-pg/meta/0039_snapshot.json +4033 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +14 -0
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/2kfkdDTz.js +0 -1
- package/.output/public/_nuxt/BXEDsEwG.js +0 -1
- package/.output/public/_nuxt/BbgBGuMG.js +0 -1
- package/.output/public/_nuxt/CJGJI2Of.js +0 -34
- package/.output/public/_nuxt/Ce4EdfL_.js +0 -4
- package/.output/public/_nuxt/CkpB9oBr.js +0 -1
- package/.output/public/_nuxt/D1tZEdSi.js +0 -1
- package/.output/public/_nuxt/DK9uMTYX.js +0 -1
- package/.output/public/_nuxt/YDWXnWou.js +0 -1
- package/.output/public/_nuxt/builds/meta/f549de31-8db6-4504-b526-482778a55eba.json +0 -1
- package/.output/public/_nuxt/entry.BxXHl1Vy.css +0 -1
- package/.output/public/_nuxt/wCQds5_f.js +0 -1
- package/.output/server/chunks/build/BrowserBadge-BTA4QU_J.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-BqAhMip2.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-_1nGm_DR.mjs.map +0 -1
- package/.output/server/chunks/build/CiEnvCard-DAufYuJw.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-BVKHuYjU.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-BR6j4VLd.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-BnrdXDvd.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-DdnEtjIl.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-D_GJzMpW.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-COIjm3js.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-XFBPQGIX.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-ChNkmuWa.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-CXpuCUGQ.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-zs9FDzps.mjs.map +0 -1
- package/.output/server/chunks/build/Select-r3S5nkSY.mjs.map +0 -1
- package/.output/server/chunks/build/Separator-pqpPG0up.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-Wdpzlt13.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-02XjJjn0.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-gx_JXgCo.mjs.map +0 -1
- package/.output/server/chunks/build/Table-C64RrBp3.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar--u4VX_Xf.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-ui_BVvqr.mjs.map +0 -1
- package/.output/server/chunks/build/VisuallyHiddenInput-mMsqmkjz.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-R6KGfZOC.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-pkxJKe17.mjs.map +0 -1
- package/.output/server/chunks/build/about-CmtGYbC6.mjs.map +0 -1
- package/.output/server/chunks/build/account-AbLuwiZP.mjs.map +0 -1
- package/.output/server/chunks/build/ai-DR_slopS.mjs.map +0 -1
- package/.output/server/chunks/build/analytics-BbT2-Tr-.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-DlA_u5y9.mjs.map +0 -1
- package/.output/server/chunks/build/default-D6diRCW0.mjs.map +0 -1
- package/.output/server/chunks/build/edit-CNV4xdYj.mjs.map +0 -1
- package/.output/server/chunks/build/help-content-BMumoQQF.mjs.map +0 -1
- package/.output/server/chunks/build/index-DmHBPf7T.mjs.map +0 -1
- package/.output/server/chunks/build/index-Dw526KXV.mjs.map +0 -1
- package/.output/server/chunks/build/index-dwYB76GO.mjs.map +0 -1
- package/.output/server/chunks/build/index-rSHkKNna.mjs.map +0 -1
- package/.output/server/chunks/build/isValueEqualOrExist-DTJ5ejZs.mjs.map +0 -1
- package/.output/server/chunks/build/login-Da5C8jP2.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-DM1t-9L_.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-BTPF0xA7.mjs.map +0 -1
- package/.output/server/chunks/build/settings-Bmw_JdBS.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-CksLgMun.mjs.map +0 -1
- package/.output/server/chunks/build/storage-BqR4acgi.mjs.map +0 -1
- package/.output/server/chunks/build/tags-miPAzIr3.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-D-LqhLpk.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-FwqbA4gz.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-v_dFuTw9.mjs.map +0 -1
- package/.output/server/chunks/build/users-D-GDKZmZ.mjs.map +0 -1
- package/.output/server/chunks/build/virtualizer-BcC1XuFf.mjs.map +0 -1
- package/.output/server/chunks/build/wasted-time-CFmeT_e2.mjs.map +0 -1
|
@@ -267,6 +267,20 @@
|
|
|
267
267
|
"when": 1784402219845,
|
|
268
268
|
"tag": "0037_deep_mulholland_black",
|
|
269
269
|
"breakpoints": true
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"idx": 38,
|
|
273
|
+
"version": "7",
|
|
274
|
+
"when": 1784582756861,
|
|
275
|
+
"tag": "0038_tranquil_moira_mactaggert",
|
|
276
|
+
"breakpoints": true
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"idx": 39,
|
|
280
|
+
"version": "7",
|
|
281
|
+
"when": 1784619503940,
|
|
282
|
+
"tag": "0039_fat_starjammers",
|
|
283
|
+
"breakpoints": true
|
|
270
284
|
}
|
|
271
285
|
]
|
|
272
286
|
}
|
package/.output/server/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import process from 'node:process';globalThis._importMeta_={url:import.meta.url,env:process.env};import 'node:http';
|
|
2
2
|
import 'node:https';
|
|
3
|
-
export {
|
|
3
|
+
export { dh as default } from './chunks/nitro/nitro.mjs';
|
|
4
4
|
import 'node:crypto';
|
|
5
5
|
import 'drizzle-orm';
|
|
6
6
|
import 'path';
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as $,a as k}from"./B32-7cBF.js";import{_ as y,a as C}from"./C9jjVEQU.js";import{u as B,_ as D}from"./DjCfCT_5.js";import{a1 as M,a3 as S,o as f,f as d,g as i,T as c,i as p,p as u,k as t,V as U,h as _,a6 as N,C as P,r as T,d as j,e as q,j as o,aH as H}from"./B8fs6GU9.js";import"./BtJkQ3to.js";import"./CKZn0TUX.js";import"./DFw8I2FL.js";import"./CBrCcDzR.js";import"./3SnTawZW.js";const V={slots:{root:"shrink-0 flex items-center justify-between border-b border-default px-4 sm:px-6 gap-1.5 overflow-x-auto min-h-[49px]",left:"flex items-center gap-1.5",right:"flex items-center gap-1.5"}},z={__name:"UDashboardToolbar",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(s){const a=M("dashboardToolbar",s),e=S(),l=_(()=>N({extend:V,...e.ui?.dashboardToolbar||{}})());return(r,m)=>(f(),d(t(U),{as:t(a).as,"data-slot":"root",class:u(l.value.root({class:[t(a).ui?.root,t(a).class]}))},{default:i(()=>[c(r.$slots,"default",{},()=>[p("div",{"data-slot":"left",class:u(l.value.left({class:[t(a).ui?.left]}))},[c(r.$slots,"left")],2),p("div",{"data-slot":"right",class:u(l.value.right({class:[t(a).ui?.right]}))},[c(r.$slots,"right")],2)])]),_:3},8,["as","class"]))}};function A(){const s=T({account:!1,users:!1,notifications:!1,tags:!1,storage:!1,"wasted-time":!1,ai:!1,about:!1});async function n(){const a=[];a.push($fetch("/api/settings/ai").then(e=>{s.value.ai=!!e.envManaged}).catch(()=>{})),a.push($fetch("/api/settings/wasted-waits").then(e=>{s.value["wasted-time"]=!!e.envManaged}).catch(()=>{})),a.push($fetch("/api/settings/smtp").then(e=>{s.value.notifications=!!(e.envManaged&&e.configured)}).catch(()=>{})),await Promise.all(a)}return P(()=>{n()}),{envManaged:s,refresh:n}}const E={class:"flex flex-col gap-4 sm:gap-6 lg:gap-12 w-full lg:max-w-4xl mx-auto"},W=j({__name:"settings",setup(s){q({title:"Settings — Piwi Dashboard"});const{envManaged:n}=A(),a=B(n),e=_(()=>[a.value,[{label:"Documentation",icon:"i-lucide-book-open",to:"https://github.com/piwitests/platform",target:"_blank"}]]);return(l,r)=>{const m=$,g=k,h=C,b=D,v=z,x=H,w=y;return f(),d(w,{id:"settings",ui:{body:"lg:py-12"}},{header:i(()=>[o(h,null,{leading:i(()=>[o(m),o(g,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Settings"}]})]),_:1}),o(v,null,{default:i(()=>[o(b,{items:t(e),highlight:"",class:"-mx-1 flex-1",ui:{list:"overflow-x-auto",root:"min-w-0"}},null,8,["items"])]),_:1})]),body:i(()=>[p("div",E,[o(x)])]),_:1})}}});export{W as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as R,b as U,w as M,c as m,i as t,j as a,g as i,F as x,P as z,o as u,v as I,m as p,y as O,k as s,t as n,q as j,_ as A,l as N,r as y}from"./B8fs6GU9.js";import{_ as L}from"./CHgsEM4U.js";import{_ as q}from"./BBJ9Pu3M.js";import{_ as W}from"./IdQR_Djw.js";import{_ as G}from"./PPFO8UVt.js";import{_ as H}from"./CD-xwM9N.js";import{k as w}from"./CvCF77E-.js";import{e as J,g as K}from"./wCQds5_f.js";import{u as Q}from"./DAeYEeCC.js";import"./DFw8I2FL.js";import"./B32ySRXg.js";import"./D1tZEdSi.js";import"./BC_Wu-fv.js";import"./3SnTawZW.js";import"./DWzdeQ3Z.js";const X={class:"space-y-6"},Y={class:"space-y-3"},Z={class:"flex items-center gap-2 text-sm text-muted"},ee={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm"},te={class:"text-muted"},se={class:"flex items-center gap-2 font-mono"},oe={class:"text-xs"},ae={key:0,class:"flex items-center gap-2 py-4 text-muted"},le={key:1,class:"grid grid-cols-2 sm:grid-cols-3 gap-4"},ne={class:"space-y-1"},ie={class:"text-2xl font-semibold"},re={class:"space-y-1"},de={class:"text-2xl font-semibold"},ce={class:"space-y-1"},me={class:"text-2xl font-semibold"},ue={class:"space-y-1"},pe={class:"text-2xl font-semibold"},_e={class:"space-y-1"},fe={class:"text-2xl font-semibold"},ve={class:"space-y-1"},ge={class:"text-2xl font-semibold"},xe={class:"space-y-1"},ye={class:"text-2xl font-semibold"},be={class:"flex flex-col sm:flex-row items-start sm:items-center gap-4"},ze=R({__name:"storage",async setup(he){let _,b;const h=U(),{data:r,refresh:C,pending:k}=([_,b]=M(()=>Q("/api/admin/stats","$-MAlPFSlMr")),_=await _,b(),_),$=J("storage").map(o=>({name:o,...K(o)})),B=[{label:"7 days",value:7},{label:"14 days",value:14},{label:"30 days",value:30},{label:"60 days",value:60},{label:"90 days",value:90},{label:"180 days",value:180},{label:"1 year",value:365}],d=y(30),c=y(!1),f=y(!1);async function T(){c.value=!1,f.value=!0;try{const o=await $fetch("/api/admin/cleanup",{method:"DELETE",body:{olderThanDays:d.value}});h.add({title:"Cleanup complete",description:`Deleted ${o.deletedRuns} test run(s) older than ${d.value} days.`,color:"success"}),await C()}catch(o){const e=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;h.add({title:"Cleanup failed",description:e||"An error occurred",color:"error"})}finally{f.value=!1}}return(o,e)=>{const S=I,V=L,g=q,v=A,E=W,F=G,D=H,P=z;return u(),m(x,null,[t("div",X,[a(g,{icon:"i-lucide-server",title:"Storage backend",help:"settings.storage-backend"},{subtitle:i(()=>[...e[5]||(e[5]=[p(" Configured through environment variables. The active backend is shown read-only. ",-1)])]),default:i(()=>[t("div",Y,[t("div",Z,[a(S,{name:"i-lucide-info",class:"size-4"}),e[6]||(e[6]=p(" Storage backend selection (local disk or S3) and its credentials are set via the environment. Each variable below is shown read-only — hover the lock to see what it controls. ",-1))]),t("div",ee,[(u(!0),m(x,null,O(s($),l=>(u(),m(x,{key:l.name},[t("div",te,n(l.name.replace("PIWI_S3_","S3 ").replace("PIWI_STORAGE_","Storage ")),1),t("div",se,[t("code",oe,n(l.name),1),a(V,{"env-vars":[l.name]},null,8,["env-vars"])])],64))),128))])])]),_:1}),a(g,{icon:"i-lucide-database",title:"Storage statistics",help:"settings.storage-stats"},{footer:i(()=>[a(v,{icon:"i-lucide-refresh-cw",variant:"outline",size:"sm",loading:s(k),label:"Refresh",onClick:e[0]||(e[0]=l=>s(C)())},null,8,["loading"])]),default:i(()=>[s(k)?(u(),m("div",ae,[a(S,{name:"i-lucide-loader-2",class:"animate-spin"}),e[7]||(e[7]=p(" Loading… ",-1))])):s(r)?(u(),m("div",le,[t("div",ne,[e[8]||(e[8]=t("p",{class:"text-sm text-muted"},"Projects",-1)),t("p",ie,n(s(r).totalProjects),1)]),t("div",re,[e[9]||(e[9]=t("p",{class:"text-sm text-muted"},"Test runs",-1)),t("p",de,n(s(r).totalRuns),1)]),t("div",ce,[e[10]||(e[10]=t("p",{class:"text-sm text-muted"},"Test cases (unique)",-1)),t("p",me,n(s(r).totalTestCases),1)]),t("div",ue,[e[11]||(e[11]=t("p",{class:"text-sm text-muted"},"Test results",-1)),t("p",pe,n(s(r).totalRunsCases),1)]),t("div",_e,[e[12]||(e[12]=t("p",{class:"text-sm text-muted"},"Stored files",-1)),t("p",fe,n(s(r).totalFiles),1)]),t("div",ve,[e[13]||(e[13]=t("p",{class:"text-sm text-muted"},"File size (DB)",-1)),t("p",ge,n(("formatBytes"in o?o.formatBytes:s(w))(s(r).totalFileSize)),1)]),t("div",xe,[e[14]||(e[14]=t("p",{class:"text-sm text-muted"},"Storage on disk",-1)),t("p",ye,n(("formatBytes"in o?o.formatBytes:s(w))(s(r).storageSizeOnDisk)),1)])])):j("",!0)]),_:1}),a(g,{icon:"i-lucide-trash-2",title:"Cleanup old test runs",help:"settings.cleanup"},{default:i(()=>[t("div",be,[a(F,{label:"Delete runs older than",name:"period"},{default:i(()=>[a(E,{modelValue:s(d),"onUpdate:modelValue":e[1]||(e[1]=l=>N(d)?d.value=l:null),items:B},null,8,["modelValue"])]),_:1}),a(v,{icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:s(f),label:"Run cleanup",class:"mt-4 sm:mt-5",onClick:e[2]||(e[2]=l=>c.value=!0)},null,8,["loading"])])]),_:1})]),a(P,null,{default:i(()=>[a(D,{open:s(c),title:"Confirm cleanup","onUpdate:open":e[4]||(e[4]=l=>c.value=l)},{body:i(()=>[t("p",null,[e[15]||(e[15]=p(" This will permanently delete all test runs older than ",-1)),t("strong",null,n(s(d))+" days",1),e[16]||(e[16]=p(", along with their associated reports, traces, and test results. This action cannot be undone. ",-1))])]),footer:i(()=>[a(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[3]||(e[3]=l=>c.value=!1)}),a(v,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:s(f),onClick:T},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{ze as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as Re,a as $e}from"./BMQIO38j.js";import{d as H,z as le,B as se,o as n,f as P,g as u,i as s,j as c,D as G,l as W,k as a,c as p,v as ne,F as U,y as F,p as ie,m as A,t as S,q as _,A as q,r as $,h as N,G as Ee,_ as re,w as oe,b as Oe,aa as Le,I as z}from"./B8fs6GU9.js";import{_ as Be}from"./wCQds5_f.js";import{_ as pe}from"./C7RarFGi.js";import{_ as fe}from"./IdQR_Djw.js";import{_ as ge}from"./PPFO8UVt.js";import{_ as ve}from"./CHgsEM4U.js";import{_ as Fe}from"./CD-xwM9N.js";import{h as We}from"./3SnTawZW.js";import{_ as ye}from"./BBJ9Pu3M.js";import{h as De}from"./CvCF77E-.js";import{u as ae}from"./DAeYEeCC.js";import{_ as Ne}from"./CNzoIhwN.js";import{p as qe,g as Xe}from"./CBrCcDzR.js";import"./n7Htv9PJ.js";import"./DWzdeQ3Z.js";import"./BC_Wu-fv.js";import"./D1tZEdSi.js";import"./YDWXnWou.js";import"./DVdOm5Bg.js";import"./DFw8I2FL.js";import"./B32ySRXg.js";const je={class:"space-y-3"},Ke={key:0,class:"flex items-center justify-center gap-2 py-8 text-gray-400"},ze={key:1,class:"py-8 text-center text-sm text-gray-400"},He={key:2,class:"max-h-96 overflow-y-auto space-y-px"},Ge=["onClick"],Qe={class:"flex-1 min-w-0"},Ye={class:"text-sm font-medium leading-snug truncate"},Ze={key:0,class:"text-gray-500 font-normal"},Je={class:"text-xs text-gray-400 leading-snug mt-0.5"},et={key:3,class:"italic text-gray-500"},tt={key:0,class:"flex items-center gap-1 shrink-0 pt-0.5"},st=["title"],ot=["title"],at={key:0,class:"py-8 text-center text-sm text-gray-400"},lt=H({__name:"ModelPickerModal",props:q({models:{},selected:{},loading:{type:Boolean}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:q(["select"],["update:open"]),setup(o,{emit:I}){function T(y){return y?y>=1e6?`${(y/1e6).toFixed(1)}M`:y>=1e3?`${Math.round(y/1e3)}K`:String(y):""}const v=o,r=I,k=le(o,"open"),b=$(null),d=$("");se(k,y=>{y&&Ee(()=>b.value?.focus())});const l=N(()=>{const y=d.value.toLowerCase();return y?v.models.filter(i=>i.id.toLowerCase().includes(y)||(i.label?.toLowerCase()??"").includes(y)):v.models}),x={image:{icon:"i-lucide-image",label:"Image input"},pdf:{icon:"i-lucide-file-text",label:"PDF input"},code:{icon:"i-lucide-code",label:"Code execution"},thinking:{icon:"i-lucide-brain",label:"Extended thinking"},json:{icon:"i-lucide-braces",label:"Structured output"},text:{icon:"i-lucide-type",label:"Text"},audio:{icon:"i-lucide-music",label:"Audio"}};function V(y){return y.map(i=>{const C=i.indexOf("→");if(C!==-1){const R=i.slice(0,C),O=i.slice(C+1);return{inputs:R.split("+").filter(Boolean),outputs:O.split("+").filter(Boolean)}}return{inputs:[i],outputs:[]}})}function E(y){r("select",y),k.value=!1,d.value=""}return(y,i)=>{const C=G,R=ne,O=Fe;return n(),P(O,{open:k.value,"onUpdate:open":i[1]||(i[1]=g=>k.value=g),title:"Select a model",ui:{content:"max-w-2xl"}},{body:u(()=>[s("div",je,[c(C,{ref_key:"searchInput",ref:b,modelValue:a(d),"onUpdate:modelValue":i[0]||(i[0]=g=>W(d)?d.value=g:null),placeholder:"Search models…",icon:"i-lucide-search",size:"sm"},null,8,["modelValue"]),o.models.length===0&&o.loading?(n(),p("div",Ke,[c(R,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),i[2]||(i[2]=s("span",{class:"text-sm"},"Loading models…",-1))])):o.models.length===0?(n(),p("div",ze," No models available — check your provider configuration ")):(n(),p("div",He,[(n(!0),p(U,null,F(a(l),g=>(n(),p("button",{key:g.id,class:ie(["w-full text-left px-4 py-3 rounded-lg hover:bg-elevated transition-colors border border-transparent hover:border-default flex items-start gap-4",o.selected===g.id?"bg-primary/10 ring-1 ring-inset ring-primary/30 border-primary/30":""]),onClick:h=>E(g.id)},[s("div",Qe,[s("p",Ye,[A(S(g.id)+" ",1),g.label&&g.label!==g.id?(n(),p("span",Ze," — "+S(g.label),1)):_("",!0)]),s("p",Je,[g.contextLength?(n(),p(U,{key:0},[A(S(T(g.contextLength))+" ctx",1)],64)):_("",!0),g.maxTokens?(n(),p(U,{key:1},[A(" · up to "+S(T(g.maxTokens))+" out",1)],64)):_("",!0),g.pricing?.prompt?(n(),p(U,{key:2},[A(" · $"+S(g.pricing.prompt)+" / $"+S(g.pricing.completion??"?")+" per 1M",1)],64)):_("",!0),!g.contextLength&&!g.maxTokens&&!g.pricing?.prompt?(n(),p("span",et,"No additional info")):_("",!0)])]),g.modalities?.length?(n(),p("div",tt,[(n(!0),p(U,null,F(V(g.modalities),h=>(n(),p(U,{key:h.inputs.join()+"→"+h.outputs.join()},[(n(!0),p(U,null,F(h.inputs,w=>(n(),p("span",{key:"in-"+w,title:x[w]?.label??w,class:"inline-flex items-center justify-center size-6 rounded-md bg-gray-100 dark:bg-gray-800 text-gray-500 hover:text-primary transition-colors"},[c(R,{name:x[w]?.icon??"i-lucide-cpu",class:"size-3.5"},null,8,["name"])],8,st))),128)),h.outputs.length?(n(),P(R,{key:0,name:"i-lucide-arrow-right",class:"size-3 text-gray-400 shrink-0"})):_("",!0),(n(!0),p(U,null,F(h.outputs,w=>(n(),p("span",{key:"out-"+w,title:x[w]?.label??w,class:"inline-flex items-center justify-center size-6 rounded-md bg-gray-100 dark:bg-gray-800 text-gray-500 hover:text-primary transition-colors"},[c(R,{name:x[w]?.icon??"i-lucide-cpu",class:"size-3.5"},null,8,["name"])],8,ot))),128))],64))),128))])):_("",!0)],10,Ge))),128)),a(l).length===0?(n(),p("div",at,' No models match "'+S(a(d))+'" ',1)):_("",!0)]))])]),_:1},8,["open"])}}}),nt=Object.assign(lt,{__name:"ModelPickerModal"}),it={class:"flex gap-2"},rt=H({__name:"ModelFieldInput",props:q({provider:{},providerResolved:{},reuse:{type:Boolean},models:{},loadingModels:{type:Boolean},placeholderAnthropic:{},placeholderOpenai:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:q(["loadModels"],["update:modelValue"]),setup(o,{emit:I}){const T=I,v=le(o,"modelValue"),r=$(!1);return(k,b)=>{const d=G,l=re,x=nt;return n(),p(U,null,[s("div",it,[c(d,{modelValue:v.value,"onUpdate:modelValue":b[0]||(b[0]=V=>v.value=V),placeholder:o.providerResolved==="anthropic"?o.placeholderAnthropic:o.placeholderOpenai,class:"flex-1"},null,8,["modelValue","placeholder"]),o.providerResolved?(n(),P(l,{key:0,size:"sm",variant:"soft",onClick:b[1]||(b[1]=V=>{T("loadModels"),r.value=!0})},{default:u(()=>[...b[4]||(b[4]=[A(" Choose model… ",-1)])]),_:1})):_("",!0)]),c(x,{open:a(r),"onUpdate:open":b[2]||(b[2]=V=>W(r)?r.value=V:null),models:o.models,selected:v.value,loading:o.loadingModels,onSelect:b[3]||(b[3]=V=>v.value=V)},null,8,["open","models","selected","loading"])],64)}}}),dt=Object.assign(rt,{__name:"ModelFieldInput"}),ct={class:"flex items-start justify-between gap-3"},ut={class:"flex items-start gap-2"},mt={class:"font-medium inline-flex items-center gap-1"},pt={class:"text-sm text-gray-500"},ft={class:"inline-flex items-center gap-1"},gt={class:"inline-flex items-center gap-1"},vt={class:"inline-flex items-center gap-1"},yt={key:3,class:"flex justify-end"},ht=H({__name:"AiRoleConfigForm",props:q({meta:{},hasApiKey:{type:Boolean},reuseOptions:{},providerOptions:{},presetOptions:{},disabled:{type:Boolean},envManaged:{type:Boolean},models:{},loadingModels:{type:Boolean},providerResolved:{},testing:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:q(["applyPreset","loadModels","test"],["update:modelValue"]),setup(o,{emit:I}){const T=o,v=I,r=le(o,"modelValue"),k=N({get:()=>r.value.reuse??"own",set:d=>r.value.reuse=d==="own"?null:d}),b=N(()=>We(T.meta.help));return(d,l)=>{const x=ne,V=Be,E=pe,y=fe,i=ge,C=ve,R=G,O=dt,g=re;return n(),p("div",{class:ie(["rounded-lg border border-default p-4 space-y-4",o.meta.optional&&!r.value.enabled?"opacity-80":""])},[s("div",ct,[s("div",ut,[c(x,{name:o.meta.icon,class:"size-5 mt-0.5 text-primary"},null,8,["name"]),s("div",null,[s("p",mt,[A(S(o.meta.title)+" ",1),c(V,{topic:o.meta.help},null,8,["topic"])]),s("p",pt,S(o.meta.blurb),1)])]),o.meta.optional?(n(),P(E,{key:0,modelValue:r.value.enabled,"onUpdate:modelValue":l[0]||(l[0]=h=>r.value.enabled=h),disabled:o.disabled&&!o.envManaged,"aria-label":o.meta.enableLabel},null,8,["modelValue","disabled","aria-label"])):_("",!0)]),!o.meta.optional||r.value.enabled?(n(),p(U,{key:0},[o.meta.reuseTargets.length?(n(),P(i,{key:0,label:"Provider source"},{default:u(()=>[c(y,{modelValue:a(k),"onUpdate:modelValue":l[1]||(l[1]=h=>W(k)?k.value=h:null),items:o.reuseOptions,disabled:o.disabled&&!o.envManaged,class:"w-full"},null,8,["modelValue","items","disabled"])]),_:1})):_("",!0),r.value.reuse?_("",!0):(n(),p(U,{key:1},[c(i,{label:"Provider"},{label:u(()=>[s("span",ft,[l[9]||(l[9]=A(" Provider ",-1)),o.disabled?(n(),P(C,{key:0,"env-vars":a(b)},null,8,["env-vars"])):_("",!0)])]),default:u(()=>[c(y,{modelValue:r.value.provider,"onUpdate:modelValue":l[2]||(l[2]=h=>r.value.provider=h),items:o.providerOptions,disabled:o.disabled,placeholder:"Choose a provider…",class:"w-full"},null,8,["modelValue","items","disabled"])]),_:1}),r.value.provider==="openai"?(n(),P(i,{key:0,label:"Preset",description:"Pick a known provider to auto-fill the URL and model, then adjust as needed"},{default:u(()=>[c(y,{items:o.presetOptions,placeholder:"Choose a preset…",disabled:o.disabled,class:"w-full","onUpdate:modelValue":l[3]||(l[3]=h=>v("applyPreset",h))},null,8,["items","disabled"])]),_:1})):_("",!0),r.value.provider?(n(),P(i,{key:1,label:"API key",description:o.hasApiKey?"Leave empty to keep the stored key, clear and save to remove it":"Required for Anthropic; optional for local OpenAI-compatible servers"},{label:u(()=>[s("span",gt,[l[10]||(l[10]=A(" API key ",-1)),o.disabled?(n(),P(C,{key:0,"env-vars":a(b)},null,8,["env-vars"])):_("",!0)])]),default:u(()=>[c(R,{modelValue:r.value.apiKey,"onUpdate:modelValue":l[4]||(l[4]=h=>r.value.apiKey=h),type:"password",placeholder:o.hasApiKey?"•••••••• (unchanged)":"sk-…",disabled:o.disabled,class:"w-full font-mono"},null,8,["modelValue","placeholder","disabled"])]),_:1},8,["description"])):_("",!0),r.value.provider==="openai"?(n(),P(i,{key:2,label:"Base URL",description:"Required, e.g. http://localhost:11434/v1"},{label:u(()=>[s("span",vt,[l[11]||(l[11]=A(" Base URL ",-1)),o.disabled?(n(),P(C,{key:0,"env-vars":a(b)},null,8,["env-vars"])):_("",!0)])]),default:u(()=>[c(R,{modelValue:r.value.baseUrl,"onUpdate:modelValue":l[5]||(l[5]=h=>r.value.baseUrl=h),placeholder:"http://localhost:11434/v1",disabled:o.disabled,class:"w-full"},null,8,["modelValue","disabled"])]),_:1})):_("",!0)],64)),r.value.reuse||r.value.provider?(n(),P(i,{key:2,label:"Model",description:r.value.reuse?"Leave empty to use the reused role's model":void 0},{default:u(()=>[c(O,{modelValue:r.value.model,"onUpdate:modelValue":l[6]||(l[6]=h=>r.value.model=h),provider:r.value.provider,"provider-resolved":o.providerResolved,reuse:!!r.value.reuse,models:o.models,"loading-models":o.loadingModels,"placeholder-anthropic":o.meta.modelPlaceholderAnthropic,"placeholder-openai":o.meta.modelPlaceholderOpenai,onLoadModels:l[7]||(l[7]=h=>v("loadModels"))},null,8,["modelValue","provider","provider-resolved","reuse","models","loading-models","placeholder-anthropic","placeholder-openai"])]),_:1},8,["description"])):_("",!0),o.providerResolved?(n(),p("div",yt,[c(g,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-plug",loading:o.testing,onClick:l[8]||(l[8]=h=>v("test"))},{default:u(()=>[...l[12]||(l[12]=[A(" Test connection ",-1)])]),_:1},8,["loading"])])):_("",!0)],64)):_("",!0)],2)}}}),bt=Object.assign(ht,{__name:"AiRoleConfigForm"}),_t={key:0,class:"space-y-3"},xt={class:"text-sm text-gray-500"},kt={key:0,class:"text-sm text-gray-500"},At={key:1,class:"overflow-x-auto"},It={class:"w-full text-sm"},Mt={class:"px-2 py-2"},St={class:"font-mono text-xs"},Vt={class:"text-xs text-gray-400"},wt={class:"text-right px-2 py-2"},Pt=["title"],Tt=["title"],Ut={class:"text-right px-2 py-2"},Ct={key:1,class:"flex items-center gap-2 py-4 text-muted"},Rt=H({__name:"AiUsagePanel",async setup(o){let I,T;const v=$(30),r=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],{data:k,pending:b}=([I,T]=oe(()=>ae("/api/settings/ai/usage",{query:{days:v}},"$1ij5UlwVIK")),I=await I,T(),I);function d(l){return l>=1e6?`${(l/1e6).toFixed(1)}M`:l>=1e3?`${(l/1e3).toFixed(1)}k`:String(l)}return(l,x)=>{const V=fe,E=ne,y=ye;return n(),P(y,{icon:"i-lucide-activity",title:"AI usage"},{actions:u(()=>[c(V,{modelValue:a(v),"onUpdate:modelValue":x[0]||(x[0]=i=>W(v)?v.value=i:null),items:r,size:"sm",class:"w-36"},null,8,["modelValue"])]),default:u(()=>[a(k)?(n(),p("div",_t,[s("p",xt,S(d(a(k).totals.diagnoses))+" diagnoses · "+S(d(a(k).totals.inputTokens))+" input tokens · "+S(d(a(k).totals.outputTokens))+" output tokens ",1),a(k).byModel.length===0?(n(),p("p",kt,"No AI calls recorded in this period.")):(n(),p("div",At,[s("table",It,[x[1]||(x[1]=s("thead",null,[s("tr",{class:"text-xs text-gray-500 uppercase tracking-wider border-b border-default"},[s("th",{class:"text-left px-2 py-2 font-medium"},"Model"),s("th",{class:"text-right px-2 py-2 font-medium"},"Diagnoses"),s("th",{class:"text-right px-2 py-2 font-medium"},"Failed"),s("th",{class:"text-right px-2 py-2 font-medium"},"Input tokens"),s("th",{class:"text-right px-2 py-2 font-medium"},"Output tokens"),s("th",{class:"text-right px-2 py-2 font-medium"},"Avg duration")])],-1)),s("tbody",null,[(n(!0),p(U,null,F(a(k).byModel,i=>(n(),p("tr",{key:`${i.provider??"unknown"}/${i.model}`,class:"border-b last:border-b-0 border-default"},[s("td",Mt,[s("span",St,S(i.model),1),s("span",Vt," · "+S(i.provider??"unknown"),1)]),s("td",wt,S(i.diagnoses),1),s("td",{class:ie(["text-right px-2 py-2",i.failed>0?"text-red-600 dark:text-red-400":""])},S(i.failed),3),s("td",{class:"text-right px-2 py-2",title:i.inputTokens.toLocaleString()},S(d(i.inputTokens)),9,Pt),s("td",{class:"text-right px-2 py-2",title:i.outputTokens.toLocaleString()},S(d(i.outputTokens)),9,Tt),s("td",Ut,S(i.avgDurationMs===null?"—":("formatDuration"in l?l.formatDuration:a(De))(i.avgDurationMs)),1)]))),128))])])]))])):a(b)?(n(),p("div",Ct,[c(E,{name:"i-lucide-loader-circle",class:"size-4 animate-spin"}),x[2]||(x[2]=s("span",{class:"text-sm"},"Loading usage…",-1))])):_("",!0)]),_:1})}}}),$t=Object.assign(Rt,{__name:"AiUsagePanel"}),Et=[{key:"sampleErrorChars",label:"Error text characters",envVar:"PIWI_AI_MAX_SAMPLE_ERROR_CHARS",description:"Max characters of raw error text (per error block).",min:200,max:5e4},{key:"scmPatchBudget",label:"SCM patch budget",envVar:"PIWI_AI_MAX_SCM_PATCH_BUDGET",description:"Total characters of diff patches across changed files.",min:0,max:5e4},{key:"affectedTests",label:"Affected tests",envVar:"PIWI_AI_MAX_AFFECTED_TESTS",description:"Max affected tests listed.",min:1,max:200},{key:"steps",label:"Test steps",envVar:"PIWI_AI_MAX_STEPS",description:"Max recent test steps included.",min:1,max:200},{key:"consoleEntries",label:"Console entries",envVar:"PIWI_AI_MAX_CONSOLE_ENTRIES",description:"Max console error/warning entries included.",min:0,max:200},{key:"consoleEntryChars",label:"Console entry characters",envVar:"PIWI_AI_MAX_CONSOLE_ENTRY_CHARS",description:"Max characters per console entry.",min:50,max:5e3},{key:"networkRequests",label:"Network requests",envVar:"PIWI_AI_MAX_NETWORK_REQUESTS",description:"Max failed network requests included.",min:0,max:200},{key:"ariaSnapshotChars",label:"ARIA snapshot characters",envVar:"PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS",description:"Max characters of the page ARIA snapshot.",min:0,max:5e4},{key:"testSourceChars",label:"Test source characters",envVar:"PIWI_AI_MAX_TEST_SOURCE_CHARS",description:"Max characters of the test source snippet.",min:0,max:5e4},{key:"maxSourceFiles",label:"Full source files",envVar:"PIWI_AI_MAX_SOURCE_FILES",description:"Max full source files fetched from SCM to ground patches (0 disables).",min:0,max:20},{key:"sourceFileChars",label:"Source file characters",envVar:"PIWI_AI_MAX_SOURCE_FILE_CHARS",description:"Max characters per fetched full source file.",min:0,max:5e4},{key:"serverLogEntries",label:"Server log entries",envVar:"PIWI_AI_MAX_SERVER_LOG_ENTRIES",description:"Max backend server log entries (from X-Piwi-Logs header) included.",min:0,max:200},{key:"serverLogEntryChars",label:"Server log entry characters",envVar:"PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS",description:"Max characters per backend server log entry.",min:50,max:5e3},{key:"maxImages",label:"Max screenshots",envVar:"PIWI_AI_MAX_IMAGES",description:"Max screenshots auto-included in the diagnosis context.",min:0,max:20},{key:"maxPassedPeers",label:"Max passed peers",envVar:"PIWI_AI_MAX_PASSED_PEERS",description:"Max peer tests in the same file listed when they passed.",min:0,max:100},{key:"maxConsoleWindow",label:"Console window entries",envVar:"PIWI_AI_MAX_CONSOLE_WINDOW",description:"Max console entries of any type in the window before failure.",min:0,max:200},{key:"slowRequestMs",label:"Slow request threshold (ms)",envVar:"PIWI_AI_SLOW_REQUEST_MS",description:"Network request duration threshold for flagging as slow.",min:100,max:3e4},{key:"maxTraceActions",label:"Trace actions",envVar:"PIWI_AI_MAX_TRACE_ACTIONS",description:"Max actions extracted from trace ZIP for failing-action context (0 disables).",min:0,max:50},{key:"traceDomChars",label:"Trace DOM excerpt characters",envVar:"PIWI_AI_TRACE_DOM_CHARS",description:"Max characters for the trace-derived DOM/ARIA excerpt in failing-action context.",min:0,max:2e4},{key:"traceStackFrames",label:"Trace stack frames",envVar:"PIWI_AI_MAX_TRACE_STACK_FRAMES",description:"Max call-stack frames (with source windows) from the trace (0 disables).",min:0,max:50},{key:"traceNetworkRequests",label:"Trace network requests",envVar:"PIWI_AI_MAX_TRACE_NETWORK_REQUESTS",description:"Max requests from the trace network stream (0 disables).",min:0,max:200},{key:"domSnapshotChars",label:"DOM snapshot characters",envVar:"PIWI_AI_MAX_DOM_SNAPSHOT_CHARS",description:"Max characters of the failure-time DOM snapshot rendered from the trace (0 disables).",min:0,max:5e4},{key:"imageMaxEdge",label:"Screenshot max edge (px)",envVar:"PIWI_AI_IMAGE_MAX_EDGE",description:"Screenshots are downscaled to at most this many pixels on the long edge before being sent.",min:512,max:8192}],Ot={class:"space-y-6"},Lt={class:"space-y-5"},Bt={class:"flex items-center gap-3"},Ft={class:"flex items-center gap-2 justify-end"},Wt={class:"flex justify-end"},Dt={class:"flex justify-end"},Nt={class:"grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-3"},qt={class:"flex justify-end gap-2"},ms=H({__name:"ai",async setup(o){let I,T;const v=Oe(),{data:r,refresh:k}=([I,T]=oe(()=>ae("/api/settings/ai","$nV9xx-QVRl")),I=await I,T(),I);function b(){return{enabled:!1,reuse:null,provider:"",model:"",baseUrl:"",apiKey:""}}const d=z({diagnosis:b(),research:b(),embedding:b()}),l=$(!1),x=$(""),V=$(""),E=$(!1),y=$(!1),i=$(!1),C=z({diagnosis:!1,research:!1,embedding:!1}),R=z({diagnosis:[],research:[],embedding:[]}),O=z({diagnosis:!1,research:!1,embedding:!1});function g(t){const e=d[t];return e.reuse?d[e.reuse]?.provider||"":e.provider}async function h(t){const e=d[t],f=g(t),M=e.reuse?d[e.reuse]:e,ee=M.apiKey||void 0;O[t]=!0;try{const te=await $fetch("/api/settings/ai/models",{method:"POST",body:{role:t,provider:f,baseUrl:M.baseUrl||void 0,apiKey:ee}});R[t]=te.models}catch{R[t]=[]}finally{O[t]=!1}}const w=[{key:"diagnosis",title:"Diagnosis model",icon:"i-lucide-stethoscope",help:"settings.ai-provider",optional:!1,enableLabel:"",blurb:"The main model that writes the final diagnosis. Required to enable AI features.",reuseTargets:[],modelPlaceholderAnthropic:"claude-opus-4-8",modelPlaceholderOpenai:"e.g. gpt-4o, llama3.1"},{key:"research",title:"Research model",icon:"i-lucide-search",help:"settings.ai-research",optional:!0,enableLabel:"Two-stage diagnosis",blurb:"A cheaper/faster model that pre-analyzes the failure before the diagnosis model writes the final answer. Also used for cluster naming and merge adjudication.",reuseTargets:["diagnosis"],modelPlaceholderAnthropic:"e.g. claude-haiku-4-5",modelPlaceholderOpenai:"e.g. llama-3.1-8b-instant"},{key:"embedding",title:"Embedding model",icon:"i-lucide-vector-square",help:"settings.embedding-model",optional:!0,enableLabel:"Semantic clustering",blurb:"Embeds failures so semantically-similar errors group together (used by failure clustering).",reuseTargets:["diagnosis","research"],modelPlaceholderAnthropic:"— Anthropic has no embeddings API —",modelPlaceholderOpenai:"e.g. text-embedding-3-small"}],de=[{label:"Anthropic API",value:"anthropic"},{label:"OpenAI-compatible",value:"openai"}],he=de.filter(t=>t.value!=="anthropic"),be=N(()=>{const t={};for(const e of w)t[e.key]=[{label:"Configure its own provider",value:"own"},...e.reuseTargets.filter(f=>d[f].enabled||f==="diagnosis").filter(f=>e.key!=="embedding"||d[f].provider==="openai").map(f=>({label:`Reuse ${w.find(M=>M.key===f).title.toLowerCase()}`,value:f}))];return t}),D=N(()=>!!r.value?.envManaged),_e=qe(Xe("ai"));se(r,t=>{if(t){for(const e of w){const f=t.roles[e.key],M=d[e.key];M.enabled=!!f,M.reuse=f?.reuse??null,M.provider=f?.provider??"",M.model=f?.model??"",M.baseUrl=f?.baseUrl??"",M.apiKey=""}l.value=t.autoDiagnose,x.value=t.customInstructions||""}},{immediate:!0});function xe(t){return!!r.value?.roles[t]?.hasApiKey}const ce=[{label:"ollama (local)",baseUrl:"http://localhost:11434/v1",model:"llama3.1"},{label:"LM Studio (local)",baseUrl:"http://localhost:1234/v1",model:""},{label:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",model:"meta-llama/llama-3.1-8b-instruct"},{label:"Groq",baseUrl:"https://api.groq.com/openai/v1",model:"llama-3.1-8b-instant"},{label:"OpenAI",baseUrl:"https://api.openai.com/v1",model:"gpt-4o"},{label:"Mistral AI",baseUrl:"https://api.mistral.ai/v1",model:"mistral-small-latest"},{label:"Custom",baseUrl:"",model:""}],ke=ce.map(t=>({label:t.label,value:t.label}));function Ae(t,e){const f=ce.find(M=>M.label===e);!f||f.label==="Custom"||(d[t].baseUrl=f.baseUrl,d[t].model=f.model)}function Q(t){const e=d[t];if(!e.enabled)return null;if(e.reuse)return{reuse:e.reuse,model:e.model||void 0};const f={provider:e.provider,model:e.model||void 0,baseUrl:e.baseUrl||void 0};return e.apiKey!==""&&(f.apiKey=e.apiKey),f}async function Ie(){E.value=!0;try{!D&&(!d.diagnosis.enabled||!d.diagnosis.provider)?await $fetch("/api/settings/ai",{method:"PUT",body:{roles:null,autoDiagnose:l.value}}):await $fetch("/api/settings/ai",{method:"PUT",body:{roles:{diagnosis:Q("diagnosis"),research:Q("research"),embedding:Q("embedding")},autoDiagnose:l.value}}),await k();for(const t of w)d[t.key].apiKey="";v.add({title:"Settings saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{E.value=!1}}async function Me(){i.value=!0;try{await $fetch("/api/settings/ai",{method:"PUT",body:{scmToken:V.value||null}}),await k(),V.value="",v.add({title:"SCM token saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{i.value=!1}}async function Se(){y.value=!0;try{await $fetch("/api/settings/ai",{method:"PUT",body:{customInstructions:x.value||null}}),await k(),v.add({title:"Instructions saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{y.value=!1}}async function Ve(t){C[t]=!0;try{const e=d[t],f=e.reuse?d[e.reuse]:e,M=await $fetch("/api/settings/ai/test",{method:"POST",body:{role:t,provider:f.provider||void 0,apiKey:f.apiKey||void 0,model:e.model||(e.reuse?f.model:"")||void 0,baseUrl:f.baseUrl||void 0}});M.success?v.add({title:"Connection successful",description:`Model: ${M.model}`,color:"success"}):v.add({title:"Connection failed",description:M.error||"Unknown error",color:"error"})}catch(e){v.add({title:"Connection failed",description:String(e?.message??e),color:"error"})}finally{C[t]=!1}}const{data:L}=([I,T]=oe(()=>ae("/api/settings/ai/limits","$cSpsteApgW")),I=await I,T(),I),Y=Et,X=z({}),Z=$(!1),J=N(()=>new Set(L.value?.envManaged??[]));se(L,t=>{if(t)for(const e of Y)X[e.key]=t.limits[e.key]},{immediate:!0});async function we(){Z.value=!0;try{L.value=await $fetch("/api/settings/ai/limits",{method:"PUT",body:{limits:X}}),v.add({title:"Context limits saved",color:"success"})}catch(t){v.add({title:"Failed to save context limits",description:String(t?.message??t),color:"error"})}finally{Z.value=!1}}function Pe(){if(L.value)for(const t of Y)J.value.has(t.key)||(X[t.key]=L.value.defaults[t.key])}return(t,e)=>{const f=Re,M=bt,ee=pe,te=$e,j=re,K=ye,Te=$t,ue=G,me=ge,Ue=Ne,Ce=ve;return n(),p("div",Ot,[a(D)?(n(),P(f,{key:0,"env-vars":a(_e)},null,8,["env-vars"])):_("",!0),c(K,{icon:"i-lucide-sparkles",title:"Model providers",help:"settings.ai-provider"},{subtitle:u(()=>[...e[3]||(e[3]=[A(" Configure a complete provider for each model role. Optional roles can reuse another role's provider so you don't re-enter credentials. ",-1)])]),footer:u(()=>[s("div",Ft,[c(j,{color:"primary",loading:a(E),icon:"i-lucide-save",onClick:Ie},{default:u(()=>[...e[5]||(e[5]=[A(" Save ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[s("div",Lt,[(n(),p(U,null,F(w,m=>c(M,{key:m.key,modelValue:a(d)[m.key],"onUpdate:modelValue":B=>a(d)[m.key]=B,meta:m,"has-api-key":xe(m.key),"reuse-options":a(be)[m.key],"provider-options":m.key==="embedding"?a(he):de,"preset-options":a(ke),disabled:a(D),"env-managed":a(D),"provider-resolved":g(m.key),models:a(R)[m.key],"loading-models":a(O)[m.key],testing:a(C)[m.key],onApplyPreset:B=>Ae(m.key,B),onLoadModels:B=>h(m.key),onTest:B=>Ve(m.key)},null,8,["modelValue","onUpdate:modelValue","meta","has-api-key","reuse-options","provider-options","preset-options","disabled","env-managed","provider-resolved","models","loading-models","testing","onApplyPreset","onLoadModels","onTest"])),64)),c(te,{label:"Auto-diagnose",help:"settings.auto-diagnose","env-managed":a(D)},{default:u(()=>[s("div",Bt,[c(ee,{modelValue:a(l),"onUpdate:modelValue":e[0]||(e[0]=m=>W(l)?l.value=m:null),disabled:a(D)||!a(d).diagnosis.enabled},null,8,["modelValue","disabled"]),e[4]||(e[4]=s("span",{class:"text-sm text-gray-500"}," Automatically diagnose new failure clusters when a run finishes — up to 3 clusters per run (research + diagnosis call each), plus one batched call to title new clusters ",-1))])]),_:1},8,["env-managed"])])]),_:1}),c(Te),c(K,{title:"Repository access",help:"project.scm-token"},{subtitle:u(()=>[...e[6]||(e[6]=[A(" Optional — required for private repositories. Per-project tokens override this. ",-1)])]),footer:u(()=>[s("div",Wt,[c(j,{color:"primary",loading:a(i),icon:"i-lucide-save",onClick:Me},{default:u(()=>[...e[7]||(e[7]=[A(" Save token ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[c(me,{label:"SCM token",description:a(r)?.hasScmToken?"Leave empty to keep the stored token, enter a new value to replace it, or save empty to remove it":"Personal access token with read access to repository contents. Supports GitHub (ghp_), GitLab (glpat-), and Bitbucket tokens."},{default:u(()=>[c(ue,{modelValue:a(V),"onUpdate:modelValue":e[1]||(e[1]=m=>W(V)?V.value=m:null),type:"password",placeholder:a(r)?.hasScmToken?"•••••••• (unchanged)":"ghp_..., glpat-..., or Bitbucket token",class:"w-full font-mono"},null,8,["modelValue","placeholder"])]),_:1},8,["description"])]),_:1}),c(K,{title:"Global analysis instructions",help:"settings.ai-instructions"},{footer:u(()=>[s("div",Dt,[c(j,{color:"primary",loading:a(y),icon:"i-lucide-save",onClick:Se},{default:u(()=>[...e[8]||(e[8]=[A(" Save instructions ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[c(Ue,{modelValue:a(x),"onUpdate:modelValue":e[2]||(e[2]=m=>W(x)?x.value=m:null),rows:6,placeholder:"e.g. Always suggest running failing tests with --repeat-each 5 to confirm flakiness. Prefer network-level evidence over ARIA snapshots. Recommend git bisect when a commit range is available.",class:"w-full font-mono text-sm"},null,8,["modelValue"]),e[9]||(e[9]=s("p",{class:"text-xs text-gray-400 mt-2"}," These instructions are appended to the base system prompt. They shape how the AI analyzes failures but cannot override the response schema or confidence requirement. ",-1))]),_:1}),c(K,{title:"Diagnosis context limits",help:"settings.ai-limits"},{subtitle:u(()=>[...e[10]||(e[10]=[A(" Leave a field empty to use its default; env-managed fields are read-only. ",-1)])]),footer:u(()=>[s("div",qt,[c(j,{color:"neutral",variant:"ghost",size:"sm",onClick:Pe},{default:u(()=>[...e[11]||(e[11]=[A("Reset to defaults",-1)])]),_:1}),c(j,{color:"primary",loading:a(Z),icon:"i-lucide-save",size:"sm",onClick:we},{default:u(()=>[...e[12]||(e[12]=[A(" Save limits ",-1)])]),_:1},8,["loading"])])]),default:u(()=>[s("div",Nt,[(n(!0),p(U,null,F(a(Y),m=>(n(),P(me,{key:m.key,label:m.label,description:m.description,hint:`default ${a(L)?.defaults[m.key]??""}`},{default:u(()=>[c(ue,{modelValue:a(X)[m.key],"onUpdate:modelValue":B=>a(X)[m.key]=B,modelModifiers:{number:!0},type:"number",min:m.min,max:m.max,disabled:a(J).has(m.key),placeholder:`default ${a(L)?.defaults[m.key]??""}`,class:"w-full"},Le({_:2},[a(J).has(m.key)?{name:"trailing",fn:u(()=>[c(Ce,{"env-vars":[m.envVar]},null,8,["env-vars"])]),key:"0"}:void 0]),1032,["modelValue","onUpdate:modelValue","min","max","disabled","placeholder"])]),_:2},1032,["label","description","hint"]))),128))])]),_:1}),c(K,{icon:"i-lucide-shield-check",title:"Privacy notice",help:"settings.privacy"},{default:u(()=>[...e[13]||(e[13]=[s("div",{class:"space-y-2 text-sm text-gray-600 dark:text-gray-400"},[s("p",null,"When diagnosing a failure cluster, the following data is sent to the configured LLM provider:"),s("ul",{class:"list-disc list-inside space-y-1 ml-2"},[s("li",null,"Normalized error signature and sample raw error text"),s("li",null,"Test titles and file paths for affected tests"),s("li",null,"Browser info, test steps, console error/warning entries (excerpts)"),s("li",null,"Failed network request URLs and status codes"),s("li",null,"ARIA page snapshot (if collected)"),s("li",null," Commit SHA range since last passing run, plus changed file names and diff patches fetched from GitHub/GitLab/Bitbucket (if a repository token is configured or the repo is public) ")]),s("p",{class:"mt-2"},[A(" API keys are stored encrypted in the application database (admin-only access). For stricter setups, use the "),s("code",{class:"font-mono text-xs"},"PIWI_AI_*"),A(" environment variables instead of the UI. ")])],-1)])]),_:1})])}}});export{ms as default};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import{_ as Pt,a as It}from"./B32-7cBF.js";import{_ as Ot,a as Lt}from"./C9jjVEQU.js";import{_ as At}from"./IdQR_Djw.js";import{_ as Bt}from"./DNP5tTJo.js";import{d as B,am as zt,C as Ft,G as qt,ab as Ut,B as ft,o as a,c as b,h as T,r as _t,j as v,l as st,k as t,f,q as L,i as o,m as E,w as F,g as y,_ as q,F as V,y as I,ae as $t,x as J,p as P,v as St,t as g,O as nt,s as Ct,e as Wt}from"./B8fs6GU9.js";import{_ as Gt}from"./DiUGa0CT.js";import{_ as Ht}from"./n7Htv9PJ.js";import{e as U,f as rt,h as Xt,c as Yt}from"./CvCF77E-.js";import{u as Jt}from"./BtJkQ3to.js";import{u as Mt}from"./DAeYEeCC.js";import{_ as W}from"./DKTDub7I.js";import{_ as G}from"./Surk4Lw-.js";import{_ as H}from"./DZLrAp2i.js";import{_ as Q}from"./BBJ9Pu3M.js";import{_ as Zt}from"./CrFCPOnY.js";import{_ as wt}from"./o5WQ5Z7k.js";import{_ as Qt}from"./CHMpVLqo.js";import{_ as ot}from"./BgR7oL4p.js";import{X as Kt,b as Rt,c as it,d as te,i as ee,e as se,f as ae,g as K,m as ct,h as ne,j as bt,k as re,l as xt,s as tt,n as vt,o as oe,p as ie,q as le,r as ce,t as de,P as ue,v as me,_ as yt,u as Dt,a as ht,C as ut,w as pe,O as Z}from"./BW1UOxWn.js";import{_ as lt}from"./CokbKVE6.js";import{N as Et}from"./CU-OXXdh.js";import{_ as _e,a as ye}from"./Cgr8IKY4.js";import"./D1tZEdSi.js";import"./CKZn0TUX.js";import"./YDWXnWou.js";import"./DVdOm5Bg.js";import"./B_80i5Ge.js";import"./BC_Wu-fv.js";import"./wCQds5_f.js";import"./3SnTawZW.js";import"./DWzdeQ3Z.js";import"./B32ySRXg.js";import"./D7W_4Sqc.js";function he({x:w,y:e,w:c,h:p,tl:r=!1,tr:C=!1,bl:u=!1,br:R=!1,r:_=0}){let d;d=`M${w+_},${e}h${c-2*_}`;let s=C?_:0,i=C?0:_;return d+=`a${s},${s} 0 0 1 ${s},${s}`,d+=`h${i}v${i}`,d+=`v${p-2*_}`,s=R?_:0,i=R?0:_,d+=`a${s},${s} 0 0 1 ${-s},${s}`,d+=`v${i}h${-i}`,d+=`h${2*_-c}`,s=u?_:0,i=u?0:_,d+=`a${s},${s} 0 0 1 ${-s},${-s}`,d+=`h${-i}v${-i}`,d+=`v${2*_-p}`,s=r?_:0,i=r?0:_,d+=`a${s},${s} 0 0 1 ${s},${-s}`,d+=`v${-i}h${i}`,d+="z",d}const ge=Object.assign(Object.assign({},Kt),{color:void 0,barMaxWidth:void 0,barWidth:void 0,dataStep:void 0,barPadding:0,roundedCorners:2,cursor:null,barMinHeight1Px:!1,barMinHeightZeroValue:null,orientation:Rt.Vertical}),Tt=it`
|
|
2
|
-
label: stacked-bar-component;
|
|
3
|
-
`,fe=ee`
|
|
4
|
-
:root {
|
|
5
|
-
--vis-stacked-bar-cursor: default;
|
|
6
|
-
--vis-stacked-bar-fill-color: var(--vis-color-main);
|
|
7
|
-
--vis-stacked-bar-stroke-color: none;
|
|
8
|
-
--vis-stacked-bar-stroke-width: 0px;
|
|
9
|
-
--vis-stacked-bar-hover-stroke-width: none;
|
|
10
|
-
--vis-stacked-bar-hover-stroke-color: none;
|
|
11
|
-
|
|
12
|
-
/* Dark Theme */
|
|
13
|
-
--vis-dark-stacked-bar-stroke-color: none;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
${te} ${`.${Tt}`} {
|
|
17
|
-
--vis-stacked-bar-stroke-color: var(--vis-dark-stacked-bar-stroke-color);
|
|
18
|
-
}
|
|
19
|
-
`,at=it`
|
|
20
|
-
label: bar;
|
|
21
|
-
fill: var(--vis-stacked-bar-fill-color);
|
|
22
|
-
stroke: var(--vis-stacked-bar-stroke-color);
|
|
23
|
-
stroke-width: var(--vis-stacked-bar-stroke-width);
|
|
24
|
-
cursor: var(--vis-stacked-bar-cursor);
|
|
25
|
-
|
|
26
|
-
&:hover {
|
|
27
|
-
stroke-width: var(--vis-stacked-bar-hover-stroke-width);
|
|
28
|
-
stroke: var(--vis-stacked-bar-hover-stroke-color);
|
|
29
|
-
}
|
|
30
|
-
`,mt=it`
|
|
31
|
-
label: barGroup;
|
|
32
|
-
`,Vt=it`
|
|
33
|
-
label: barGroupExit;
|
|
34
|
-
`,be=Object.freeze(Object.defineProperty({__proto__:null,bar:at,barGroup:mt,barGroupExit:Vt,globalStyles:fe,root:Tt},Symbol.toStringTag,{value:"Module"}));class jt extends se{constructor(e){super(),this._defaultConfig=ge,this.config=this._defaultConfig,this.getAccessors=()=>ae(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],c=this.dataScale.domain(),p=this._getBarWidth()/2,r=this._barData.map(($,x)=>K($,this.config.x,x)),C=ct(r),u=ne(r),R=this.dataScale(C),_=this.dataScale(u),d=this.dataScale.invert(R+(e?p:-p)),s=this.dataScale.invert(_+(e?-p:p)),i=d<=c[0]?this.dataScale(c[0])-this.dataScale(d):0,D=s>c[1]?this.dataScale(s)-this.dataScale(c[1]):0;return{top:this.isVertical()?0:e?-D:i,bottom:this.isVertical()?0:e?-i:D,left:this.isVertical()?i:0,right:this.isVertical()?D:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Rt.Vertical}_render(e){const{config:c}=this,p=bt(e)?e:c.duration,r=this.getAccessors(),C=re(this._barData,0,r,this._prevNegative);this._prevNegative=C.map(x=>!!x.isMostlyNegative);const u=this.g.selectAll(`.${mt}`).data(this._barData,(x,S)=>{var m;return`${(m=xt(x,c.id,S))!==null&&m!==void 0?m:S}`}),R=(x,S)=>{const m=this.dataScale(K(x,c.x,S)),k=this.isVertical()?m:0,n=this.isVertical()?0:m;return`translate(${k},${n})`},d=u.enter().append("g").attr("class",mt).attr("transform",R).style("opacity",1).merge(u);tt(d,p).attr("transform",R).style("opacity",1);const s=u.exit().attr("class",Vt);tt(s,p).style("opacity",0).remove().on("interrupt",function(){this.remove()}),tt(s.selectAll(`.${at}`),p).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const i=d.selectAll(`.${at}`).data((x,S)=>{const m=C.map((k,n)=>({datum:x,index:S,stacked:k[S],stackIndex:n})).filter(k=>k.stacked[0]!==k.stacked[1]);return m.forEach((k,n)=>{k.isEnding=n===m.length-1||n<=m.length-1&&m[n+1].stacked[0]!==k.stacked[1]}),m},x=>x.stackIndex),$=i.enter().append("path").attr("class",at).attr("d",x=>this._getBarPath(x,!0)).style("fill",x=>vt(x.datum,c.color,x.stackIndex)).merge(i);tt($,p).attr("d",x=>this._getBarPath(x)).style("fill",x=>vt(x.datum,c.color,x.stackIndex)).style("cursor",x=>xt(x.datum,c.cursor,x.stackIndex)),tt(i.exit(),p).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:c}}=this;if(oe(c))return 0;if(e.barWidth)return ct([e.barWidth,e.barMaxWidth]);const p=this.dataScale.bandwidth,r=this.dataScale.domain?this.dataScale.domain():[];let u=1+(p?r.length:r[1]-r[0])/e.dataStep||!p&&c.filter((d,s)=>{const i=K(d,e.x,s);return i>=r[0]&&i<=r[1]}).length||c.length;!p&&u>=2&&(u+=1);const _=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return ct([_,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:c}}=this,p=this._getBarWidth(),r=c.length<2?0:p/2,C=this.dataScale,u=Math.abs(C.invert(r)-C.invert(0));return c?.filter((_,d)=>{const s=K(_,e.x,d),i=C.domain(),D=+i[0],$=+i[1];return s>=D-u&&s<=$+u})}_getBarPath(e,c=!1){const{config:p}=this,r=this.getAccessors(),C=this._getBarWidth(),u=e.stacked[1]<0,R=e.isEnding,_=K(e.datum,r[e.stackIndex],e.index),d=c?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),s=!c&&p.barMinHeight1Px&&d<1&&isFinite(_)&&_!==p.barMinHeightZeroValue?1:d,i=c?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(d<1&&p.barMinHeight1Px?1:0),D=-C/2,$=C,x=p.roundedCorners?bt(p.roundedCorners)?+p.roundedCorners:$/2:0,S=ce(x,0,Math.min(d,$)/2),m=this.yScale.range()[0]>this.yScale.range()[1];return he({x:this.isVertical()?D:i-s,y:this.isVertical()?i+(m?0:-s):D,w:this.isVertical()?$:s,h:this.isVertical()?s:$,tl:R&&(this.isVertical()?!u&&m||u&&!m:u),tr:R&&(this.isVertical()?!u&&m||u&&!m:!u),br:R&&(this.isVertical()?u&&m||!u&&!m:!u),bl:R&&(this.isVertical()?u&&m||!u&&!m:u),r:S})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:c}=this,p=this.getAccessors(),r=e?this._getVisibleData():c.data;return ie(r,...p)}getDataScaleExtent(){const{config:e,datamodel:c}=this;return le(c.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}jt.selectors=be;const xe={"data-vis-component":""},ve=B({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(w,{expose:e}){const c=zt(de),p=w,r=T(()=>c.data.value??p.data),C=ue(p),u=_t();return Ft(()=>{qt(()=>{u.value=new jt(C.value),u.value?.setData(r.value),c.update(u.value)})}),Ut(()=>{u.value?.destroy(),c.destroy()}),ft(C,(R,_)=>{me(R,_)||(u.value?.setConfig(C.value),u.value?.render())}),ft(r,()=>{u.value?.setData(r.value)}),e({component:u}),(R,_)=>(a(),b("div",xe))}}),ke=30,pt=3650;function $e(w){const e={days:String(w.days)};return w.projectIds&&w.projectIds.length>0&&(e.projects=w.projectIds.join(",")),w.environment&&(e.environment=w.environment),w.fullRunsOnly||(e.fullRunsOnly="false"),e}const Se={class:"flex items-center gap-3 flex-wrap"},Ce={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},dt="All environments",Me=B({__name:"AnalyticsScopeBar",props:{modelValue:{},availableEnvironments:{}},emits:["update:modelValue"],setup(w,{emit:e}){const c=w,p=e,r=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:pt}],C=T({get:()=>c.modelValue.days,set:d=>p("update:modelValue",{...c.modelValue,days:d})}),u=T({get:()=>c.modelValue.environment??dt,set:d=>p("update:modelValue",{...c.modelValue,environment:d===dt?null:d})}),R=T(()=>[dt,...c.availableEnvironments]),_=T({get:()=>c.modelValue.fullRunsOnly,set:d=>p("update:modelValue",{...c.modelValue,fullRunsOnly:d})});return(d,s)=>{const i=At,D=Bt;return a(),b("div",Se,[v(i,{modelValue:t(C),"onUpdate:modelValue":s[0]||(s[0]=$=>st(C)?C.value=$:null),items:r,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),w.availableEnvironments.length>0?(a(),f(i,{key:0,modelValue:t(u),"onUpdate:modelValue":s[1]||(s[1]=$=>st(u)?u.value=$:null),items:t(R),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):L("",!0),o("label",Ce,[v(D,{modelValue:t(_),"onUpdate:modelValue":s[2]||(s[2]=$=>st(_)?_.value=$:null),size:"sm"},null,8,["modelValue"]),s[3]||(s[3]=E(" Full runs only ",-1))])])}}}),we=Object.assign(Me,{__name:"AnalyticsScopeBar"}),Nt=[{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half"},{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full"}];new Set(Nt.map(w=>w.id));const et={days:ke,environment:null,fullRunsOnly:!0};function Re(){const w=Jt("piwi-analytics-scope",{default:()=>({...et}),encode:p=>JSON.stringify(p),decode:p=>{try{return p?{...et,...JSON.parse(p)}:{...et}}catch{return{...et}}}}),e=T(()=>({days:w.value.days,environment:w.value.environment,fullRunsOnly:w.value.fullRunsOnly})),c=T(()=>$e(e.value));return{state:w,scope:e,scopeQuery:c}}function X(w,e){return Mt(`/api/analytics/${w}`,{query:T(e),lazy:!0,server:!1},"$EEH4o0rJ7t")}const De={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Ee={class:"min-w-0"},Te={class:"text-sm font-medium"},Ve={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},je=B({__name:"InsightsFeed",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("insights",()=>p.query)),e=await e,c(),e),_=J,d={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(s,i)=>{const D=W,$=q,x=G,S=H,m=St,k=Q;return a(),f(k,{icon:"i-lucide-lightbulb",title:"Insights",count:t(r)?.length||void 0,help:"analytics.insights"},{default:y(()=>[t(C)?(a(),f(D,{key:0})):t(u)?(a(),f(x,{key:1,text:`Couldn't load insights: ${("errorMessage"in s?s.errorMessage:t(U))(t(u))}`},{action:y(()=>[v($,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=n=>t(R)())},{default:y(()=>[...i[1]||(i[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).length===0?(a(),f(S,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(a(),b("div",De,[(a(!0),b(V,null,I(t(r),n=>(a(),f($t(n.to?t(_):"div"),{key:n.id,to:n.to,class:P(["flex items-start gap-3 py-3 pl-3 border-l-2",[d[n.severity].border,n.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:y(()=>[v(m,{name:d[n.severity].icon,class:P(["size-4 mt-0.5 shrink-0",d[n.severity].class])},null,8,["name","class"]),o("div",Ee,[o("p",Te,g(n.message),1),n.detail?(a(),b("p",Ve,g(n.detail),1)):L("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Ne=Object.assign(je,{__name:"InsightsFeed"}),Pe={class:"md:hidden space-y-3"},Ie={class:"flex items-center justify-between gap-2"},Oe={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Le={key:0},Ae={class:"hidden md:block"},Be={class:"w-full text-sm"},ze={class:"divide-y divide-gray-100 dark:divide-gray-800"},Fe={class:"py-2.5 pr-4"},qe={class:"flex items-center gap-2 min-w-0"},Ue={class:"py-2.5 pr-4"},We={class:"w-36"},Ge={class:"py-2.5 pr-4 text-right"},He={class:"py-2.5 pr-4 text-right tabular-nums"},Xe={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},Ye={class:"py-2.5 text-right"},Je={class:"text-xs text-gray-500 dark:text-gray-400"},Ze={key:1,class:"text-xs text-gray-400"},Qe=B({__name:"PortfolioScorecard",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("portfolio",()=>p.query)),e=await e,c(),e);function _(s){return s===null?"text-gray-400":s>=90?"text-green-600 dark:text-green-400":s>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function d(s){return s===null||Math.abs(s)<1?null:s>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(s,i)=>{const D=W,$=q,x=G,S=H,m=J,k=Zt,n=wt,l=St,M=Qt,A=ot,j=Q;return a(),f(j,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(r)?.length||void 0,help:"analytics.portfolio"},{default:y(()=>[t(C)?(a(),f(D,{key:0})):t(u)?(a(),f(x,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in s?s.errorMessage:t(U))(t(u))}`},{action:y(()=>[v($,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=h=>t(R)())},{default:y(()=>[...i[1]||(i[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).length===0?(a(),f(S,{key:2,text:"No projects with runs in this period."})):(a(),b(V,{key:3},[o("div",Pe,[(a(!0),b(V,null,I(t(r),h=>(a(),b("div",{key:h.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[o("div",Ie,[v(m,{to:`/projects/${h.projectId}`,class:"font-medium truncate hover:text-primary"},{default:y(()=>[E(g(h.label||h.name),1)]),_:2},1032,["to"]),o("span",{class:P(["tabular-nums font-semibold shrink-0",_(h.passRate)])},g(h.passRate!==null?`${h.passRate}%`:"—"),3)]),v(k,{runs:h.recentRuns,height:20},null,8,["runs"]),o("div",Oe,[o("span",null,g(h.runCount)+" runs · "+g(h.flakyTests)+" flaky · "+g(h.openClusters)+" open clusters",1),h.latestRun?(a(),b("span",Le,g(("formatRelativeTime"in s?s.formatRelativeTime:t(rt))(h.latestRun.startTime)),1)):L("",!0)])]))),128))]),o("div",Ae,[v(A,{"min-width":"52rem"},{default:y(()=>[o("table",Be,[i[2]||(i[2]=o("thead",null,[o("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[o("th",{class:"py-2 pr-4 font-medium"},"Project"),o("th",{class:"py-2 pr-4 font-medium"},"Trend"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),o("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),o("tbody",ze,[(a(!0),b(V,null,I(t(r),h=>(a(),b("tr",{key:h.projectId},[o("td",Fe,[o("div",qe,[v(m,{to:`/projects/${h.projectId}`,class:"font-medium truncate hover:text-primary"},{default:y(()=>[E(g(h.label||h.name),1)]),_:2},1032,["to"]),(a(!0),b(V,null,I(h.tags.slice(0,2),z=>(a(),f(n,{key:z.id,text:z.text,color:z.color},null,8,["text","color"]))),128))])]),o("td",Ue,[o("div",We,[v(k,{runs:h.recentRuns,height:22},null,8,["runs"])])]),o("td",Ge,[o("span",{class:P(["inline-flex items-center gap-1 tabular-nums font-semibold",_(h.passRate)])},[E(g(h.passRate!==null?`${h.passRate}%`:"—")+" ",1),d(h.passRateDelta)?(a(),f(l,{key:0,name:d(h.passRateDelta).icon,class:P(["size-3.5",d(h.passRateDelta).class]),title:`${h.passRateDelta>0?"+":""}${h.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):L("",!0)],2)]),o("td",He,g(h.runCount),1),o("td",{class:P(["py-2.5 pr-4 text-right tabular-nums",h.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},g(h.flakyTests),3),o("td",Xe,g(h.avgRunDurationMs?("formatDuration"in s?s.formatDuration:t(Xt))(h.avgRunDurationMs):"—"),1),o("td",{class:P(["py-2.5 pr-4 text-right tabular-nums",h.openClusters>0?"text-red-600 dark:text-red-400":""])},g(h.openClusters),3),o("td",Ye,[h.latestRun?(a(),f(m,{key:0,to:`/test-runs/${h.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:y(()=>[v(M,{status:h.latestRun.status},null,8,["status"]),o("span",Je,g(("formatRelativeTime"in s?s.formatRelativeTime:t(rt))(h.latestRun.startTime)),1)]),_:2},1032,["to"])):(a(),b("span",Ze,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),Ke=Object.assign(Qe,{__name:"PortfolioScorecard"}),ts={class:"space-y-1"},es={class:"flex gap-px"},ss=["title"],as={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},ns={class:"relative h-4"},rs=B({__name:"PassRateHeatmap",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("pass-rate-heatmap",()=>p.query)),e=await e,c(),e);function _(m){return m===null?{}:m>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:m>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:m>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:m>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function d(m,k,n){const l=r.value?.buckets[k]??"",M=(r.value?.bucketDays??1)>1?` (${r.value.bucketDays} days)`:"";return`${m.label||m.name} · ${l}${M}: ${n!==null?`${n}% passed`:"no runs"}`}const s=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],i=T(()=>{const m=r.value?.bucketDays??1;return m>1?`One cell = ${m} days`:"One cell = one day"}),D=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],$=T(()=>{const m=r.value?.buckets??[];return m.length>1&&m[0].slice(0,4)!==m[m.length-1].slice(0,4)});function x(m){const[k,n,l]=m.split("-"),M=D[Number(n)-1];return $.value?`${M} ${k}`:`${M} ${Number(l)}`}const S=T(()=>{const m=r.value?.buckets??[],k=m.length;if(k===0)return[];const n=Math.min($.value?4:5,k),l=new Set,M=[];for(let A=0;A<n;A++){const j=n===1?0:Math.round(A*(k-1)/(n-1));if(l.has(j))continue;l.add(j);const h=j===0?0:j===k-1?100:(j+.5)/k*100,z=j===0?"translateX(0)":j===k-1?"translateX(-100%)":"translateX(-50%)";M.push({index:j,label:x(m[j]),left:h,transform:z})}return M});return(m,k)=>{const n=W,l=q,M=G,A=H,j=J,h=yt,z=ot,Y=lt;return a(),f(Y,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(i),help:"analytics.heatmap"},{default:y(()=>[t(C)?(a(),f(n,{key:0})):t(u)?(a(),f(M,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in m?m.errorMessage:t(U))(t(u))}`},{action:y(()=>[v(l,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:k[0]||(k[0]=O=>t(R)())},{default:y(()=>[...k[1]||(k[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).rows.length===0?(a(),f(A,{key:2,text:"No runs in this period."})):(a(),f(z,{key:3,"min-width":"22rem"},{default:y(()=>[o("div",ts,[(a(!0),b(V,null,I(t(r).rows,O=>(a(),b("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[v(j,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:y(()=>[E(g(O.label||O.name),1)]),_:2},1032,["to","title"]),o("div",es,[(a(!0),b(V,null,I(O.cells,(N,gt)=>(a(),b("div",{key:gt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:nt(_(N)),title:d(O,gt,N)},null,12,ss))),128))])]))),128)),o("div",as,[k[2]||(k[2]=o("span",null,null,-1)),o("div",ns,[(a(!0),b(V,null,I(t(S),O=>(a(),b("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:nt({left:`${O.left}%`,transform:O.transform})},g(O.label),5))),128))])]),v(h,{items:s,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),os=Object.assign(rs,{__name:"PassRateHeatmap"}),is={key:3,class:"w-full relative"},ls={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},cs={class:"font-semibold mb-1"},ds={class:"text-gray-400 text-xs"},kt="rgb(59, 130, 246)",us=B({__name:"CiTimeTrendChart",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("ci-time-trend",()=>p.query)),e=await e,c(),e),_=T(()=>r.value?.points.map(n=>({date:new Date(n.date),totalMinutes:n.totalMinutes,runCount:n.runCount}))??[]),d=T(()=>_.value.some(n=>n.runCount>0)),s=n=>n.date,i=n=>n.totalMinutes,D=_t(null),{tooltipData:$,tooltipPos:x,onRenderComplete:S}=Dt(D,_,{x:n=>n.date,series:[{y:n=>n.totalMinutes,color:kt}]}),m=T(()=>{if(!r.value||r.value.deltaPct===null)return null;const n=r.value.deltaPct;return{label:`${n>0?"+":""}${n}% vs previous period`,class:n>25?"text-red-600 dark:text-red-400":n<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),k=T(()=>{if(!r.value)return;const n=r.value.totalMinutes;return`${n<60?`${Math.round(n)} min`:`${Math.round(n/60*10)/10} h`} across ${r.value.runCount} runs`});return(n,l)=>{const M=W,A=q,j=G,h=H,z=lt;return a(),f(z,{icon:"i-lucide-timer",title:"CI time",subtitle:t(k),help:"analytics.ci-time"},{actions:y(()=>[t(m)?(a(),b("span",{key:0,class:P(["text-xs font-medium tabular-nums",t(m).class])},g(t(m).label),3)):L("",!0)]),default:y(()=>[t(C)?(a(),f(M,{key:0})):t(u)?(a(),f(j,{key:1,text:`Couldn't load CI time: ${("errorMessage"in n?n.errorMessage:t(U))(t(u))}`},{action:y(()=>[v(A,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=Y=>t(R)())},{default:y(()=>[...l[1]||(l[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(d)?(a(),b("div",is,[v(t(ht),{ref_key:"xyContainerRef",ref:D,data:t(_),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(S)},{default:y(()=>[v(t(Et),{x:s,y:i,color:"rgba(59, 130, 246, 0.15)","curve-type":t(ut).MonotoneX},null,8,["curve-type"]),v(t(pe),{x:s,y:i,color:kt,"curve-type":t(ut).MonotoneX,"line-width":2},null,8,["curve-type"]),v(t(Z),{type:"x","tick-format":Y=>new Date(Y).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),v(t(Z),{type:"y",label:"Minutes","tick-format":Y=>Y.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t($)?(a(),b("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:nt({left:`${t(x).x}px`,top:`${t(x).y}px`})},[o("div",ls,[o("div",cs,g(new Date(t($).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),o("div",null,g(t($).totalMinutes)+" minutes",1),o("div",ds,g(t($).runCount)+" runs",1)])],4)):L("",!0)])):(a(),f(h,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),ms=Object.assign(us,{__name:"CiTimeTrendChart"}),ps={key:3,class:"w-full relative"},_s={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},ys={class:"font-semibold mb-1"},hs={key:1,class:"mt-4 space-y-1"},gs={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},fs=B({__name:"WastedTimeChart",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("wasted-time",()=>p.query)),e=await e,c(),e),_=T(()=>r.value?.points.map(n=>({date:new Date(n.date),waitMinutes:n.waitMinutes,failedExecMinutes:n.failedExecMinutes}))??[]),d=T(()=>_.value.some(n=>n.waitMinutes>0||n.failedExecMinutes>0)),s=n=>n.date,i=["rgb(245, 158, 11)","rgb(239, 68, 68)"],D=_t(null),{tooltipData:$,tooltipPos:x,onRenderComplete:S}=Dt(D,_,{x:n=>n.date,series:[{y:n=>n.waitMinutes,color:i[0]},{y:n=>n.failedExecMinutes,color:i[1]}]}),m=[{color:i[0],label:"Wait steps"},{color:i[1],label:"Failed attempts"}],k=T(()=>{if(!r.value)return;const n=r.value.totalWaitMinutes+r.value.totalFailedExecMinutes;return`${n<60?`${Math.round(n)} min`:`${Math.round(n/60*10)/10} h`} of CI time produced no signal`});return(n,l)=>{const M=yt,A=W,j=q,h=G,z=H,Y=J,O=lt;return a(),f(O,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t(k),help:"analytics.wasted-time"},{legend:y(()=>[v(M,{items:m,dense:""})]),default:y(()=>[t(C)?(a(),f(A,{key:0})):t(u)?(a(),f(h,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in n?n.errorMessage:t(U))(t(u))}`},{action:y(()=>[v(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=N=>t(R)())},{default:y(()=>[...l[1]||(l[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(d)?(a(),b("div",ps,[v(t(ht),{ref_key:"xyContainerRef",ref:D,data:t(_),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(S)},{default:y(()=>[v(t(Et),{x:s,y:[N=>N.waitMinutes,N=>N.failedExecMinutes],color:i,"curve-type":t(ut).MonotoneX},null,8,["y","curve-type"]),v(t(Z),{type:"x","tick-format":N=>new Date(N).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),v(t(Z),{type:"y",label:"Minutes","tick-format":N=>N.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t($)?(a(),b("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:nt({left:`${t(x).x}px`,top:`${t(x).y}px`})},[o("div",_s,[o("div",ys,g(new Date(t($).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),o("div",null,[l[2]||(l[2]=o("span",{class:"text-amber-500"},"●",-1)),E(" Wait steps: "+g(t($).waitMinutes)+" min",1)]),o("div",null,[l[3]||(l[3]=o("span",{class:"text-red-500"},"●",-1)),E(" Failed attempts: "+g(t($).failedExecMinutes)+" min",1)])])],4)):L("",!0),t(r)&&t(r).byProject.length>0?(a(),b("div",hs,[(a(!0),b(V,null,I(t(r).byProject.slice(0,5),N=>(a(),b("div",{key:N.projectId,class:"flex items-center justify-between text-sm"},[v(Y,{to:`/projects/${N.projectId}`,class:"truncate hover:text-primary"},{default:y(()=>[E(g(N.label||N.name),1)]),_:2},1032,["to"]),o("span",gs,g(Math.round(N.waitMinutes+N.failedExecMinutes))+" min ",1)]))),128))])):L("",!0)])):(a(),f(z,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),bs=Object.assign(fs,{__name:"WastedTimeChart"}),xs={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},vs={class:"flex-1 min-w-0"},ks={class:"text-sm font-medium truncate"},$s={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ss={class:"text-right shrink-0"},Cs=B({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("flaky-leaderboard",()=>p.query)),e=await e,c(),e);function _(s){return s>=60?"text-red-600 dark:text-red-400":s>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function d(s){return s.retryPassRuns>0?`flaked ${s.retryPassRuns}/${s.totalRuns} runs`:`${s.alternations} status flips in ${s.totalRuns} runs`}return(s,i)=>{const D=W,$=q,x=G,S=H,m=wt,k=J,n=Q;return a(),f(n,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(r)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:y(()=>[t(C)?(a(),f(D,{key:0})):t(u)?(a(),f(x,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in s?s.errorMessage:t(U))(t(u))}`},{action:y(()=>[v($,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=l=>t(R)())},{default:y(()=>[...i[1]||(i[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).length===0?(a(),f(S,{key:2,text:"No flaky tests detected. Nice and stable."})):(a(),b("div",xs,[(a(!0),b(V,null,I(t(r),l=>(a(),f(k,{key:`${l.projectId}-${l.testCaseId}`,to:`/test-cases/${l.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:y(()=>[o("span",{class:P(["tabular-nums font-bold text-sm w-10 text-right shrink-0",_(l.score)])},g(l.score),3),o("div",vs,[o("p",ks,g(l.title),1),o("p",$s,[E(g(l.projectLabel||l.projectName)+" · "+g(d(l))+" ",1),l.lastFlakeAt?(a(),b(V,{key:0},[E(" · last "+g(("formatRelativeTime"in s?s.formatRelativeTime:t(rt))(l.lastFlakeAt)),1)],64)):L("",!0)])]),o("div",Ss,[o("p",{class:P(["text-sm tabular-nums",l.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":l.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},g(Math.round(l.wastedCiMinutes))+" min ",3),l.rootCause?(a(),f(m,{key:0,text:l.rootCause,color:"neutral"},null,8,["text"])):L("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ms=Object.assign(Cs,{__name:"GlobalFlakyLeaderboard"}),ws={key:3,class:"space-y-4"},Rs={key:0,class:"flex flex-wrap gap-1.5"},Ds={class:"divide-y divide-gray-100 dark:divide-gray-800"},Es={class:"flex-1 min-w-0"},Ts={class:"text-sm font-medium truncate"},Vs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},js={class:"text-right text-xs shrink-0"},Ns={class:"tabular-nums font-medium"},Ps=B({__name:"ClusterLandscape",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("cluster-landscape",()=>p.query)),e=await e,c(),e);function _(d){return d>=30?"text-red-600 dark:text-red-400":d>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(d,s)=>{const i=W,D=q,$=G,x=H,S=ye,m=_e,k=Ct,n=J,l=Q;return a(),f(l,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:y(()=>[t(C)?(a(),f(i,{key:0})):t(u)?(a(),f($,{key:1,text:`Couldn't load clusters: ${("errorMessage"in d?d.errorMessage:t(U))(t(u))}`},{action:y(()=>[v(D,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:s[0]||(s[0]=M=>t(R)())},{default:y(()=>[...s[1]||(s[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).totalOpen===0&&t(r).resolvedInPeriod===0?(a(),f(x,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(a(),b("div",ws,[v(m,null,{default:y(()=>[v(S,{label:"Open",value:t(r).totalOpen,"value-class":t(r).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),v(S,{label:"Resolved this period",value:t(r).resolvedInPeriod},null,8,["value"]),v(S,{label:"Oldest open",value:t(r).clusters.length>0?`${Math.max(...t(r).clusters.map(M=>M.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(r).byErrorType.length>0?(a(),b("div",Rs,[(a(!0),b(V,null,I(t(r).byErrorType,M=>(a(),f(k,{key:M.errorType,color:("clusterErrorTypeColor"in d?d.clusterErrorTypeColor:t(Yt))(M.errorType),variant:"subtle",size:"sm"},{default:y(()=>[E(g(M.errorType)+" · "+g(M.count),1)]),_:2},1032,["color"]))),128))])):L("",!0),o("div",Ds,[(a(!0),b(V,null,I(t(r).clusters.slice(0,8),M=>(a(),f(n,{key:M.id,to:`/failure-clusters/${M.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:y(()=>[o("div",Es,[o("p",Ts,g(M.title||M.signature),1),o("p",Vs,[E(g(M.projectLabel||M.projectName)+" ",1),M.errorType?(a(),b(V,{key:0},[E(" · "+g(M.errorType),1)],64)):L("",!0)])]),o("div",js,[o("p",Ns,g(M.occurrences)+"×",1),o("p",{class:P(["tabular-nums",_(M.ageDays)])},g(M.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Is=Object.assign(Ps,{__name:"ClusterLandscape"}),Os={key:3,class:"w-full"},Ls=B({__name:"RegressionVelocityChart",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("regression-velocity",()=>p.query)),e=await e,c(),e),_=T(()=>r.value?.points.map(S=>({date:new Date(S.date),regressions:S.regressions,newFlaky:S.newFlaky}))??[]),d=T(()=>_.value.some(S=>S.regressions>0||S.newFlaky>0)),s=S=>S.date,i=["rgb(239, 68, 68)","rgb(147, 51, 234)"],D=[{color:i[0],label:"New regressions"},{color:i[1],label:"Newly flaky"}],$=T(()=>{if(!r.value||r.value.deltaPct===null)return null;const S=r.value.deltaPct;return{label:`${S>0?"+":""}${S}% vs previous period`,class:S>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),x=T(()=>{if(r.value)return`${r.value.totalRegressions} new regressions, ${r.value.totalNewFlaky} newly flaky`});return(S,m)=>{const k=yt,n=W,l=q,M=G,A=H,j=lt;return a(),f(j,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(x),help:"analytics.regression-velocity"},{legend:y(()=>[v(k,{items:D,dense:""})]),actions:y(()=>[t($)?(a(),b("span",{key:0,class:P(["text-xs font-medium tabular-nums",t($).class])},g(t($).label),3)):L("",!0)]),default:y(()=>[t(C)?(a(),f(n,{key:0})):t(u)?(a(),f(M,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in S?S.errorMessage:t(U))(t(u))}`},{action:y(()=>[v(l,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:m[0]||(m[0]=h=>t(R)())},{default:y(()=>[...m[1]||(m[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(d)?(a(),b("div",Os,[v(t(ht),{data:t(_),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:y(()=>[v(t(ve),{x:s,y:[h=>h.regressions,h=>h.newFlaky],color:i,"rounded-corners":2},null,8,["y"]),v(t(Z),{type:"x","tick-format":h=>new Date(h).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),v(t(Z),{type:"y",label:"Count","tick-format":h=>h.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(a(),f(A,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),As=Object.assign(Ls,{__name:"RegressionVelocityChart"}),Bs={class:"w-full text-sm border-separate border-spacing-1"},zs={class:"pr-2 max-w-[12rem]"},Fs=["title"],qs=B({__name:"BrowserMatrix",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("browser-matrix",()=>p.query)),e=await e,c(),e);function _(d){return d===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":d>=99.5?"bg-green-500/85 text-white":d>=90?"bg-green-500/45":d>=75?"bg-amber-500/50":d>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(d,s)=>{const i=W,D=q,$=G,x=H,S=J,m=ot,k=Q;return a(),f(k,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:y(()=>[t(C)?(a(),f(i,{key:0})):t(u)?(a(),f($,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in d?d.errorMessage:t(U))(t(u))}`},{action:y(()=>[v(D,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:s[0]||(s[0]=n=>t(R)())},{default:y(()=>[...s[1]||(s[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).rows.length===0?(a(),f(x,{key:2,text:"No runs with browser data in this period."})):(a(),f(m,{key:3,"min-width":"30rem"},{default:y(()=>[o("table",Bs,[o("thead",null,[o("tr",null,[s[2]||(s[2]=o("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(a(!0),b(V,null,I(t(r).browsers,n=>(a(),b("th",{key:n,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},g(n),1))),128))])]),o("tbody",null,[(a(!0),b(V,null,I(t(r).rows,n=>(a(),b("tr",{key:n.projectId},[o("td",zs,[v(S,{to:`/projects/${n.projectId}`,class:"truncate hover:text-primary block",title:n.label||n.name},{default:y(()=>[E(g(n.label||n.name),1)]),_:2},1032,["to","title"])]),(a(!0),b(V,null,I(n.cells,(l,M)=>(a(),b("td",{key:M,class:P(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",_(l)]),title:`${n.label||n.name} · ${t(r).browsers[M]}: ${l!==null?`${l}% passed`:"no tests"}`},g(l!==null?`${Math.round(l)}%`:"—"),11,Fs))),128))]))),128))])])]),_:1}))]),_:1})}}}),Us=Object.assign(qs,{__name:"BrowserMatrix"}),Ws={class:"md:hidden space-y-3"},Gs={class:"flex items-center gap-2 min-w-0"},Hs={class:"text-xs truncate"},Xs={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Ys={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},Js={class:"hidden md:block"},Zs={class:"w-full text-sm"},Qs={class:"divide-y divide-gray-100 dark:divide-gray-800"},Ks={class:"py-2.5 pr-4"},ta={class:"flex items-center gap-2 min-w-0"},ea=["title"],sa={class:"py-2.5 pr-4 text-right tabular-nums"},aa={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},na={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ra={class:"py-2.5 text-right tabular-nums"},oa=B({__name:"SlowEndpointsTable",props:{query:{}},async setup(w){let e,c;const p=w,{data:r,pending:C,error:u,refresh:R}=([e,c]=F(()=>X("slow-endpoints",()=>p.query)),e=await e,c(),e);function _(s){return s>=1e3?"text-red-600 dark:text-red-400":s>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function d(s){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[s.toUpperCase()]??"neutral"}return(s,i)=>{const D=W,$=q,x=G,S=H,m=Ct,k=ot,n=Q;return a(),f(n,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(r)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:y(()=>[t(C)?(a(),f(D,{key:0})):t(u)?(a(),f(x,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in s?s.errorMessage:t(U))(t(u))}`},{action:y(()=>[v($,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=l=>t(R)())},{default:y(()=>[...i[1]||(i[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(r)||t(r).endpoints.length===0?(a(),f(S,{key:2,icon:"i-lucide-network",text:"No network requests captured in this period."})):(a(),b(V,{key:3},[o("div",Ws,[(a(!0),b(V,null,I(t(r).endpoints,l=>(a(),b("div",{key:`${l.method} ${l.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[o("div",Gs,[v(m,{color:d(l.method),variant:"subtle",size:"sm"},{default:y(()=>[E(g(l.method),1)]),_:2},1032,["color"]),o("code",Hs,g(l.route),1)]),o("div",Xs,[o("span",null,[i[2]||(i[2]=E("p90 ",-1)),o("span",{class:P(["tabular-nums font-medium",_(l.p90Ms)])},g(l.p90Ms)+" ms",3)]),o("span",null,g(l.requests)+" reqs · "+g(l.projectCount)+" proj",1),l.errorRate>0?(a(),b("span",Ys,g(l.errorRate)+"% err",1)):L("",!0)])]))),128))]),o("div",Js,[v(k,{"min-width":"44rem"},{default:y(()=>[o("table",Zs,[i[3]||(i[3]=o("thead",null,[o("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[o("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),o("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),o("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),o("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),o("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),o("tbody",Qs,[(a(!0),b(V,null,I(t(r).endpoints,l=>(a(),b("tr",{key:`${l.method} ${l.route}`},[o("td",Ks,[o("div",ta,[v(m,{color:d(l.method),variant:"subtle",size:"sm"},{default:y(()=>[E(g(l.method),1)]),_:2},1032,["color"]),o("code",{class:"text-xs truncate max-w-[22rem]",title:l.route},g(l.route),9,ea)])]),o("td",sa,g(l.requests),1),o("td",aa,g(l.p50Ms)+" ms",1),o("td",{class:P(["py-2.5 pr-4 text-right tabular-nums font-medium",_(l.p90Ms)])},g(l.p90Ms)+" ms ",3),o("td",na,g(l.maxMs)+" ms",1),o("td",{class:P(["py-2.5 pr-4 text-right tabular-nums",l.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},g(l.errorRate)+"% ",3),o("td",ra,g(l.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ia=Object.assign(oa,{__name:"SlowEndpointsTable"}),la={class:"p-6 space-y-6"},ca={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},qa=B({__name:"analytics",async setup(w){let e,c;Wt({title:"Analytics - Piwi Dashboard"});const{state:p,scopeQuery:r}=Re(),{data:C}=([e,c]=F(()=>Mt("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$jZuDAh0IrH")),e=await e,c(),e),u=T(()=>{const i=new Set;for(const D of C.value??[])D.environment&&i.add(D.environment);return[...i].sort()}),R=T(()=>{const i=C.value??[];return i.length===0?null:Math.max(...i.map(D=>new Date(D.startTime).getTime()))}),_=T(()=>{if(R.value===null||p.value.days>=pt)return!1;const i=Date.now()-p.value.days*24*60*60*1e3;return R.value<i});function d(){p.value={...p.value,days:pt}}const s={insights:Ne,portfolio:Ke,"pass-rate-heatmap":os,"ci-time-trend":ms,"wasted-time":bs,"flaky-leaderboard":Ms,"cluster-landscape":Is,"regression-velocity":As,"browser-matrix":Us,"slow-endpoints":ia};return(i,D)=>{const $=Pt,x=It,S=Lt,m=we,k=Gt,n=Ht,l=Ot;return a(),f(l,{id:"analytics"},{header:y(()=>[v(S,null,{leading:y(()=>[v($),v(x,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:y(()=>[o("div",la,[v(k,null,{default:y(()=>[v(m,{modelValue:t(p),"onUpdate:modelValue":D[0]||(D[0]=M=>st(p)?p.value=M:null),"available-environments":t(u)},null,8,["modelValue","available-environments"])]),_:1}),t(_)?(a(),f(n,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(p).days} days`,description:`Your most recent run was ${("formatRelativeTime"in i?i.formatRelativeTime:t(rt))(t(R))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:d}]},null,8,["title","description","actions"])):L("",!0),o("div",ca,[(a(!0),b(V,null,I(t(Nt),M=>(a(),b("div",{key:M.id,class:P(M.size==="full"?"xl:col-span-2":"")},[(a(),f($t(s[M.id]),{query:t(r)},null,8,["query"]))],2))),128))])])]),_:1})}}});export{qa as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{_ as qt}from"./B32-7cBF.js";import{_ as Gt}from"./BY0AkhJh.js";import{d as ee,o as t,f as x,g as m,i as a,p as q,k as e,j as d,t as i,c as o,F as V,y as J,s as me,m as f,q as c,P as mt,v as oe,h as b,x as je,_ as Ce,b as Jt,C as gt,l as de,r as P,a9 as ke,B as ve,aa as Qt,K as Ve,O as ze,u as Zt,a as Xt,w as ct,e as Yt,ab as es,J as ts}from"./B8fs6GU9.js";import{_ as ss}from"./nUsJV5qo.js";import{_ as ns,a as as}from"./C9jjVEQU.js";import{_ as os,a as rs,b as is,c as ls,d as cs}from"./Cpquifvd.js";import{_ as us}from"./CkpB9oBr.js";import{_ as ft,a as Ee}from"./wCQds5_f.js";import{_ as ds}from"./B32ySRXg.js";import{_ as ms}from"./BpepjHwc.js";import{u as gs,_ as fs,e as ps,f as ys,g as vs,h as hs,j as xs,a as pt,i as we,b as Ne,c as _s,k as ks,d as bs}from"./BfshMo9k.js";import{f as $e,h as G,c as ws,e as $s,k as _e,l as yt,m as Oe,n as He,i as Cs,r as ut}from"./CvCF77E-.js";import{_ as vt}from"./DFw8I2FL.js";import{_ as ge}from"./BBJ9Pu3M.js";import{_ as Ts}from"./CNzoIhwN.js";import{u as ht}from"./DWzdeQ3Z.js";import{_ as Ke}from"./BCK4f6Y3.js";import{d as Ss,e as Ds,h as We,a as Is,b as Rs,c as Ls,_ as zs,m as Ns,n as js,o as As,f as Ps,i as Us,j as Ms,k as Bs,l as Fs}from"./ChWPXucC.js";import{_ as qe}from"./DKTDub7I.js";import{_ as xt}from"./DZLrAp2i.js";import{_ as Vs}from"./0KrkW531.js";import{_ as Es}from"./V1BQiRoh.js";import{_ as Os}from"./2PU-adwy.js";import{_ as Hs}from"./D4nLD93c.js";import{_ as Ks}from"./BgR7oL4p.js";import{_ as Ws,a as qs}from"./Cgr8IKY4.js";import{_ as Gs}from"./DYDGGqZ3.js";import{b as Js}from"./lRMjXqiA.js";import{u as dt}from"./DAeYEeCC.js";import"./BtJkQ3to.js";import"./IdQR_Djw.js";import"./D1tZEdSi.js";import"./3SnTawZW.js";import"./CD-xwM9N.js";import"./n7Htv9PJ.js";import"./B_80i5Ge.js";import"./OG2n3p77.js";import"./4fB15L_7.js";import"./ETOCcsVw.js";import"./DQpa8F03.js";import"./D7W_4Sqc.js";import"./BW1UOxWn.js";const Qs={class:"text-sm font-semibold truncate min-w-0"},Zs={class:"flex items-center gap-3 ml-auto max-sm:hidden"},Xs={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ys={class:"text-gray-700 dark:text-gray-300"},en={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},tn={class:"text-gray-700 dark:text-gray-300"},sn={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},nn={class:"text-gray-700 dark:text-gray-300"},an={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},on={class:"text-gray-700 dark:text-gray-300"},rn={key:0,class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},ln={class:"text-gray-700 dark:text-gray-300"},cn={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},un={class:"space-y-3"},dn={class:"flex items-start gap-3"},mn={class:"min-w-0 flex-1"},gn={class:"flex items-center gap-2 flex-wrap"},fn={class:"text-base font-bold truncate"},pn={class:"text-xs text-gray-500 mt-0.5"},yn={key:0},vn=["title"],hn={key:1,class:"ml-2"},xn={class:"grid grid-cols-2 sm:grid-cols-4 gap-2"},_n={class:"rounded-lg bg-gray-50 dark:bg-gray-900 p-3"},kn={class:"text-xl font-bold mt-0.5"},bn={class:"rounded-lg bg-gray-50 dark:bg-gray-900 p-3"},wn={class:"text-xl font-bold mt-0.5"},$n={class:"rounded-lg bg-gray-50 dark:bg-gray-900 p-3"},Cn={class:"text-xl font-bold mt-0.5"},Tn={class:"rounded-lg bg-gray-50 dark:bg-gray-900 p-3"},Sn={class:"text-xl font-bold mt-0.5"},Dn={key:0,class:"flex items-center gap-2 text-sm"},In={class:"text-gray-700 dark:text-gray-300 truncate"},Rn={key:0,class:"text-gray-500 shrink-0"},Ln={key:1,class:"flex items-center gap-1.5 text-sm"},zn={class:"text-gray-700 dark:text-gray-300"},Nn=ee({__name:"TestCaseSummary",props:{testCase:{},scmInfo:{},ciInfo:{},browser:{},environment:{},stepsCount:{},historicalTiming:{},stableLinks:{}},emits:["refresh"],setup(s){const C=s,v=b(()=>{const l=C.testCase;if(!l)return[];const r=[];return l.isNewRegression&&r.push({label:"New regression",color:"error",title:"Passed in the baseline run, failing here"}),l.isNewFlaky&&r.push({label:"New flaky",color:"warning",title:"Newly started passing only on retry"}),l.status==="passed"&&(l.retries??0)>0&&r.push({label:"Passed on retry",color:"warning",title:"This test failed then passed on a retry"}),r}),_=b(()=>C.testCase?.testAnnotations??[]),z=b(()=>C.testCase?.startedAt??null),{summaryColSpanClass:p,blockColSpanClass:n}=gs(()=>{let l=0;return C.scmInfo&&l++,(C.ciInfo||C.environment||C.browser)&&l++,l++,l});return(l,r)=>{const M=os,B=us,h=me,y=mt,F=oe,j=ft,g=ds,k=rs,I=is,W=ms,R=ls,K=fs;return t(),x(K,{"storage-key":"test-case"},{folded:m(()=>[d(M,{status:s.testCase?.status??"",size:"sm"},null,8,["status"]),a("span",Qs,i(s.testCase?.title),1),a("div",Zs,[a("span",Xs,[r[0]||(r[0]=f(" Dur: ",-1)),a("strong",Ys,i(("formatDuration"in l?l.formatDuration:e(G))(s.testCase?.duration)),1)]),a("span",en,[r[1]||(r[1]=f(" Retries: ",-1)),a("strong",tn,i(s.testCase?.retries??0),1)]),a("span",sn,[r[2]||(r[2]=f(" Steps: ",-1)),a("strong",nn,i(s.stepsCount),1)]),a("span",an,[r[3]||(r[3]=f(" Worker: ",-1)),a("strong",on,i(s.testCase?.workerIndex??"—"),1)]),s.testCase?.shardIndex!=null?(t(),o("span",rn,[r[4]||(r[4]=f(" Shard: ",-1)),a("strong",ln,i(s.testCase.shardIndex),1)])):c("",!0)]),s.browser?(t(),x(B,{key:0,browser:s.browser,size:"sm",class:"shrink-0 max-sm:hidden"},null,8,["browser"])):c("",!0)]),default:m(()=>[a("div",cn,[a("div",{class:q(e(p))},[d(g,{class:"shadow-xs h-full"},{default:m(()=>[a("div",un,[a("div",dn,[d(M,{status:s.testCase?.status??"",size:"md"},null,8,["status"]),a("div",mn,[a("div",gn,[a("h2",fn,i(s.testCase?.title),1),(t(!0),o(V,null,J(e(v),S=>(t(),x(h,{key:S.label,color:S.color,variant:"subtle",size:"xs",title:S.title},{default:m(()=>[f(i(S.label),1)]),_:2},1032,["color","title"]))),128)),(t(!0),o(V,null,J(e(_),(S,E)=>(t(),x(h,{key:`ann-${E}`,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:S.description||S.type},{default:m(()=>[f(" @"+i(S.type),1)]),_:2},1032,["title"]))),128))]),a("p",pn,[s.testCase?.location?(t(),o("span",yn,i(s.testCase.location),1)):c("",!0),d(y,null,{default:m(()=>[e(z)?(t(),o("span",{key:0,class:"ml-2 text-gray-400",title:new Date(e(z)).toLocaleString()}," started "+i(("formatRelativeTime"in l?l.formatRelativeTime:e($e))(e(z))),9,vn)):c("",!0)]),_:1}),s.historicalTiming?(t(),o("span",hn,[f(" Avg "+i(("formatDuration"in l?l.formatDuration:e(G))(s.historicalTiming.avg))+" · ",1),a("span",{class:q(s.historicalTiming.diff>0?"text-red-600":"text-green-600")},i(s.historicalTiming.diff>0?"+":"")+i(s.historicalTiming.pct)+"% ",3)])):c("",!0)])])]),a("div",xn,[a("div",_n,[r[5]||(r[5]=a("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Duration",-1)),a("p",kn,i(("formatDuration"in l?l.formatDuration:e(G))(s.testCase?.duration)),1)]),a("div",bn,[r[6]||(r[6]=a("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Retries",-1)),a("p",wn,i(s.testCase?.retries??0),1)]),a("div",$n,[r[7]||(r[7]=a("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Steps",-1)),a("p",Cn,i(s.stepsCount),1)]),a("div",Tn,[r[8]||(r[8]=a("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Worker",-1)),a("p",Sn,i(s.testCase?.workerIndex??"—"),1)])]),s.testCase?.slowestStep?(t(),o("div",Dn,[d(F,{name:"i-lucide-zap",class:"size-4 text-amber-500 shrink-0"}),r[9]||(r[9]=a("span",{class:"font-medium text-amber-700 dark:text-amber-300"},"Slowest step:",-1)),a("span",In,i(s.testCase.slowestStep),1),s.testCase.slowestStepDuration?(t(),o("span",Rn,"("+i(("formatDuration"in l?l.formatDuration:e(G))(s.testCase.slowestStepDuration))+")",1)):c("",!0)])):c("",!0),(s.testCase?.wastedTimeMs??0)>0?(t(),o("div",Ln,[d(F,{name:"i-lucide-hourglass",class:"size-4 text-amber-500 shrink-0"}),r[10]||(r[10]=a("span",{class:"font-medium text-amber-700 dark:text-amber-300"},"Wasted in fixed waits:",-1)),a("span",zn,i(("formatDuration"in l?l.formatDuration:e(G))(s.testCase?.wastedTimeMs)),1),d(j,{topic:"case.wasted-time"})])):c("",!0)])]),_:1})],2),s.scmInfo?(t(),x(k,{key:0,scm:s.scmInfo,class:q(e(n))},null,8,["scm","class"])):c("",!0),s.ciInfo||s.environment||s.browser?(t(),x(I,{key:1,ci:s.ciInfo,environment:s.environment,browser:s.browser,class:q(e(n))},null,8,["ci","environment","browser","class"])):c("",!0),d(R,{class:q(e(n)),title:"Links",icon:"i-lucide-link"},{default:m(()=>[s.testCase?.id?(t(),x(W,{key:0,"entity-type":"test_case","entity-id":s.testCase.id,links:s.stableLinks??null},null,8,["entity-id","links"])):c("",!0)]),_:1},8,["class"])])]),_:1})}}}),jn=Object.assign(Nn,{__name:"TestCaseSummary"}),An={class:"space-y-3"},Pn={key:0,class:"flex flex-wrap gap-1.5"},Un={key:0,class:"text-sm text-gray-600 dark:text-gray-400"},Mn={class:"text-gray-800 dark:text-gray-200"},Bn={key:1},Fn={class:"flex items-center gap-1 flex-wrap"},Vn=ee({__name:"TestCaseVerdictCard",props:{testCase:{},history:{},currentId:{}},setup(s){const C=s,v=l=>l==="failed"||l==="timedOut"||l==="timedout",_=b(()=>{const l=C.testCase;if(!l)return[];const r=[];return l.isNewRegression&&r.push({label:"New regression",color:"error",icon:"i-lucide-git-pull-request-arrow",title:"Passed in the baseline run, failing here — likely fallout from the latest change"}),l.isNewFlaky&&r.push({label:"New flaky",color:"warning",icon:"i-lucide-shuffle",title:"Newly started passing only on retry — intermittent failure"}),l.status==="timedOut"&&r.push({label:"Timed out",color:"warning",icon:"i-lucide-timer-off",title:"The test exceeded its timeout"}),(l.retries??0)>0&&r.push({label:l.status==="passed"?`Passed on retry ${l.retries}`:`Retried ${l.retries}×`,color:l.status==="passed"?"warning":"neutral",icon:"i-lucide-refresh-cw",title:`This execution retried ${l.retries} time${l.retries===1?"":"s"}`}),r}),z=b(()=>C.history.slice(0,24).slice().reverse()),p=b(()=>{const l=C.history;if(!l.length)return null;const r=Math.max(0,l.findIndex(h=>h.id===C.currentId));let M=0;for(let h=r;h<l.length&&v(l[h].status);h++)M++;let B=null;for(let h=r+1;h<l.length;h++)if(l[h].status==="passed"){B=l[h];break}return{streak:M,lastPass:B,total:l.length,anchorFailing:v(l[r]?.status)}}),n=l=>({"bg-red-500 hover:bg-red-600":v(l),"bg-green-500 hover:bg-green-600":l==="passed","bg-yellow-500 hover:bg-yellow-600":l==="skipped","bg-gray-400 hover:bg-gray-500":!v(l)&&!["passed","skipped"].includes(l)});return(l,r)=>{const M=oe,B=me,h=je,y=vt,F=mt,j=ge;return t(),x(j,{icon:"i-lucide-clipboard-check","icon-class":"text-amber-500",title:"Verdict",help:"case.verdict"},{default:m(()=>[a("div",An,[e(_).length?(t(),o("div",Pn,[(t(!0),o(V,null,J(e(_),g=>(t(),x(B,{key:g.label,color:g.color,variant:"subtle",size:"sm",title:g.title,class:"inline-flex items-center gap-1"},{default:m(()=>[d(M,{name:g.icon,class:"size-3 shrink-0"},null,8,["name"]),f(" "+i(g.label),1)]),_:2},1032,["color","title"]))),128))])):c("",!0),d(F,null,{default:m(()=>[e(p)?(t(),o("p",Un,[e(p).streak>=1?(t(),o(V,{key:0},[r[1]||(r[1]=f(" Failing for ",-1)),a("strong",Mn,i(e(p).streak),1),f(" consecutive run"+i(e(p).streak===1?"":"s")+". ",1),e(p).lastPass?(t(),o(V,{key:0},[r[0]||(r[0]=f(" Last passed in ",-1)),d(h,{to:`/test-run-cases/${e(p).lastPass.id}`,class:"text-primary hover:underline"},{default:m(()=>[f(" run #"+i(e(p).lastPass.runId),1)]),_:1},8,["to"]),f(" ("+i(("formatRelativeTime"in l?l.formatRelativeTime:e($e))(e(p).lastPass.startTime))+"). ",1)],64)):e(p).total>1?(t(),o(V,{key:1},[f(" No passing run in the last "+i(e(p).total)+" recorded. ",1)],64)):(t(),o(V,{key:2},[f(" First recorded run of this test. ")],64))],64)):s.testCase?.status==="passed"?(t(),o(V,{key:1},[f(" This execution passed. ")],64)):c("",!0)])):c("",!0),e(z).length>1?(t(),o("div",Bn,[r[2]||(r[2]=a("p",{class:"text-xs text-gray-400 mb-1"},"Recent runs (oldest → newest)",-1)),a("div",Fn,[(t(!0),o(V,null,J(e(z),g=>(t(),x(y,{key:g.id,text:`Run #${g.runId}: ${g.status}`},{default:m(()=>[d(h,{to:`/test-run-cases/${g.id}`,class:q(["size-3.5 rounded-sm inline-block transition-colors",[n(g.status),g.id===s.currentId?"ring-2 ring-offset-1 ring-primary":""]])},null,8,["to","class"])]),_:2},1032,["text"]))),128))])])):c("",!0)]),_:1})])]),_:1})}}}),En=Object.assign(Vn,{__name:"TestCaseVerdictCard"}),On={class:"space-y-3"},Hn={class:"space-y-1.5"},Kn={class:"flex items-center gap-2 flex-wrap"},Wn={class:"text-xs text-gray-500"},qn=["title"],Gn={class:"text-xs text-gray-500 dark:text-gray-400"},Jn={key:0,class:"rounded-lg border border-default bg-elevated/40 p-2.5 space-y-1"},Qn={class:"flex items-center gap-1.5 flex-wrap"},Zn={class:"text-xs text-gray-600 dark:text-gray-400 line-clamp-3"},Xn=["title"],Yn=ee({__name:"FailureClusterCard",props:{cluster:{}},setup(s){const C=s,v=b(()=>Math.max(0,C.cluster.sameRunCaseCount-1)),_=b(()=>{const p=C.cluster.diagnosis;return p&&p.status==="completed"&&p.summary?p:null}),z=p=>p==="high"?"success":p==="medium"?"warning":"neutral";return(p,n)=>{const l=me,r=je,M=oe,B=Ce,h=ge;return t(),x(h,{icon:"i-lucide-layers","icon-class":"text-primary",title:"Failure cluster",help:"cluster.concept"},{actions:m(()=>[s.cluster.isNew?(t(),x(l,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:m(()=>[...n[0]||(n[0]=[f("New",-1)])]),_:1})):c("",!0),s.cluster.status&&s.cluster.status!=="open"?(t(),x(l,{key:1,color:s.cluster.status==="resolved"?"success":"neutral",variant:"subtle",size:"sm",class:"capitalize"},{default:m(()=>[f(i(s.cluster.status),1)]),_:1},8,["color"])):c("",!0)]),default:m(()=>[a("div",On,[a("div",Hn,[a("div",Kn,[s.cluster.errorType?(t(),x(l,{key:0,color:e(ws)(s.cluster.errorType),variant:"soft",size:"sm"},{default:m(()=>[f(i(s.cluster.errorType),1)]),_:1},8,["color"])):c("",!0),a("span",Wn,i(s.cluster.occurrences??0)+" occurrence"+i((s.cluster.occurrences??0)===1?"":"s"),1)]),a("p",{class:"font-mono text-xs text-gray-600 dark:text-gray-400 break-all line-clamp-2",title:s.cluster.signature},i(s.cluster.signature),9,qn)]),a("p",Gn,[e(v)>0?(t(),o(V,{key:0},[f(" Matches "+i(e(v))+" other failing "+i(e(v)===1?"test":"tests")+" in this run. ",1)],64)):c("",!0),s.cluster.isNew?(t(),o(V,{key:2},[f("Opened a new cluster in this run.")],64)):(t(),o(V,{key:1},[n[1]||(n[1]=f(" Known failure — first seen in ",-1)),d(r,{to:`/test-runs/${s.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:m(()=>[f(" run #"+i(s.cluster.firstSeenRunId),1)]),_:1},8,["to"]),s.cluster.firstSeenAt?(t(),o(V,{key:0},[f(" ("+i(("formatRelativeTime"in p?p.formatRelativeTime:e($e))(s.cluster.firstSeenAt))+")",1)],64)):c("",!0),n[2]||(n[2]=f(". ",-1))],64))]),e(_)?(t(),o("div",Jn,[a("div",Qn,[d(M,{name:"i-lucide-sparkles",class:"size-3.5 text-primary shrink-0"}),n[3]||(n[3]=a("span",{class:"text-xs font-medium"},"AI verdict",-1)),e(_).category?(t(),x(l,{key:0,color:"neutral",variant:"soft",size:"xs"},{default:m(()=>[f(i(e(_).category),1)]),_:1})):c("",!0),e(_).confidence?(t(),x(l,{key:1,color:z(e(_).confidence),variant:"soft",size:"xs"},{default:m(()=>[f(i(e(_).confidence)+" confidence ",1)]),_:1},8,["color"])):c("",!0)]),a("p",Zn,i(e(_).summary),1)])):c("",!0),s.cluster.triageNote?(t(),o("p",{key:1,class:"text-xs italic text-gray-500 dark:text-gray-400",title:s.cluster.triageNote}," “"+i(s.cluster.triageNote)+"” ",9,Xn)):c("",!0),d(B,{to:`/failure-clusters/${s.cluster.id}`,size:"sm",color:"primary",variant:"solid",block:"","trailing-icon":"i-lucide-arrow-right"},{default:m(()=>[...n[4]||(n[4]=[f(" Open cluster investigation ",-1)])]),_:1},8,["to"])])]),_:1})}}}),ea=Object.assign(Yn,{__name:"FailureClusterCard"}),ta={class:"space-y-3"},sa={class:"text-xs text-gray-400 inline-flex items-center gap-1"},na={key:0,class:"text-primary"},aa={key:0,class:"flex items-center justify-between gap-2 rounded-lg border border-default bg-elevated/40 p-2.5"},oa={class:"inline-flex items-center gap-2 text-sm text-gray-500"},ra={key:1,class:"flex items-center gap-2"},ia={key:2,class:"rounded-lg border border-dashed border-default p-4 text-center text-gray-400"},la={class:"text-sm inline-flex items-center gap-1 justify-center"},ca={class:"pt-1 text-center"},ua=ee({__name:"TestCaseAiCard",props:{testRunsCaseId:{}},setup(s){const C=s,{aiStatus:v}=ps(),_=Jt(),{copy:z,copied:p}=ht(),n=P(null),l=P(!1),r=P(null),M=P([]),B=P(0),h=P(0),y=P(null),F=P(!1),j=P(!1),g=P(null),k=P(!1),I=P("");async function W(){F.value=!0;try{const A=await $fetch(`/api/test-run-cases/${C.testRunsCaseId}/diagnosis-context`,{query:{format:"json"}});r.value=A.text,M.value=A.sections,B.value=A.tokenEstimate,h.value=A.imageTokenEstimate??0,y.value=A.coverage}catch{r.value=null,M.value=[],B.value=0,y.value=null}finally{F.value=!1}}async function R(){try{const A=await $fetch(`/api/test-run-cases/${C.testRunsCaseId}/diagnosis`);n.value=A.diagnosis}catch{}}gt(()=>{R(),W()});const K=b(()=>{const A=n.value?.details;if(!A)return[];const N=[];if(Array.isArray(A.evidence)&&N.push(...A.evidence),Array.isArray(A.hypotheses))for(const H of A.hypotheses)Array.isArray(H?.evidence)&&N.push(...H.evidence);return xs(N)});function S(A){g.value=A,j.value=!0}function E(A){I.value=I.value?`${I.value}
|
|
2
|
-
|
|
3
|
-
${A}`:A,k.value=!0}function te(){r.value&&z(r.value,{toast:"AI context copied"})}async function se(A=!1){l.value=!0;try{const N=A?`/api/test-run-cases/${C.testRunsCaseId}/diagnose?force=true`:`/api/test-run-cases/${C.testRunsCaseId}/diagnose`,H=I.value.trim()?{additionalContext:I.value.trim()}:void 0;n.value=await $fetch(N,{method:"POST",body:H})}catch(N){const H=N?.statusCode;H===409?(_.add({title:"Diagnosis already running",color:"warning"}),R()):H===503?_.add({title:"AI diagnosis is not configured",color:"warning"}):_.add({title:"Diagnosis failed",description:$s(N),color:"error"})}finally{l.value=!1}}function re(A){return A.status==="running"&&Date.now()-new Date(A.updatedAt).getTime()>300*1e3}const L=b(()=>n.value&&(n.value.status==="completed"||n.value.status==="failed")),$=b(()=>!n.value||n.value.status==="failed"||n.value.status==="running"&&re(n.value)),T=b(()=>n.value?.status==="running"&&!re(n.value)&&!l.value);return(A,N)=>{const H=Ce,X=oe,Z=ys,fe=Ts,pe=vs,U=ft,Q=hs,le=je,Te=ge;return t(),x(Te,{icon:"i-lucide-sparkles","icon-class":"text-primary",title:"AI diagnosis",help:"case.ai"},{actions:m(()=>[d(H,{size:"xs",color:"neutral",variant:"outline",icon:e(p)?"i-lucide-check":"i-lucide-clipboard",loading:e(F),disabled:!e(r),title:"Copy the full evidence context to paste into your own AI assistant",onClick:te},{default:m(()=>[f(i(e(p)?"Copied":"Copy AI context"),1)]),_:1},8,["icon","loading","disabled"])]),default:m(()=>[a("div",ta,[a("p",sa,[d(X,{name:"i-lucide-triangle-alert",class:"size-3 shrink-0"}),N[6]||(N[6]=f(" AI-generated — verify before applying. ",-1))]),e(v)?.configured?(t(),x(Z,{key:0,sections:e(M),"not-applicable":e(y)?.notApplicable,"token-estimate":e(B),loading:e(F),onViewSection:S,onOpen:N[0]||(N[0]=ne=>j.value=!0)},null,8,["sections","not-applicable","token-estimate","loading"])):c("",!0),e(v)?.configured?(t(),o(V,{key:1},[a("div",null,[a("button",{class:"flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-gray-700 dark:hover:text-gray-300",onClick:N[1]||(N[1]=ne=>k.value=!e(k))},[d(X,{name:e(k)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5"},null,8,["name"]),N[7]||(N[7]=f(" Additional context ",-1)),e(I).trim()?(t(),o("span",na,"(1)")):c("",!0)]),e(k)?(t(),x(fe,{key:0,modelValue:e(I),"onUpdate:modelValue":N[2]||(N[2]=ne=>de(I)?I.value=ne:null),placeholder:"e.g. We deployed a new auth middleware yesterday…",rows:3,class:"w-full text-sm mt-1"},null,8,["modelValue"])):c("",!0)]),e(T)?(t(),o("div",aa,[a("span",oa,[d(X,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-primary shrink-0"}),N[8]||(N[8]=f(" Diagnosis in progress… ",-1))]),d(H,{size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",loading:e(l),onClick:R},{default:m(()=>[...N[9]||(N[9]=[f(" Refresh ",-1)])]),_:1},8,["loading"])])):(t(),o("div",ra,[e($)?(t(),x(H,{key:0,icon:"i-lucide-sparkles",size:"sm",color:"primary",variant:"solid",loading:e(l),onClick:N[3]||(N[3]=ne=>se(e(n)?.status==="running"))},{default:m(()=>[f(i(e(n)?.status==="running"?"Restart diagnosis":"Diagnose with AI"),1)]),_:1},8,["loading"])):e(n)?.status==="completed"?(t(),x(H,{key:1,icon:"i-lucide-refresh-cw",size:"xs",color:"primary",variant:"soft",loading:e(l),onClick:N[4]||(N[4]=ne=>se(!0))},{default:m(()=>[...N[10]||(N[10]=[f(" Re-diagnose ",-1)])]),_:1},8,["loading"])):c("",!0)])),e(L)?(t(),x(pe,{key:2,diagnosis:e(n),onViewSection:S,onPrefillContext:E},null,8,["diagnosis"])):c("",!0)],64)):(t(),o("div",ia,[a("p",la,[N[11]||(N[11]=f(" AI diagnosis is not configured ",-1)),d(U,{topic:"cluster.ai-setup"})]),N[13]||(N[13]=a("p",{class:"text-xs mt-2 max-w-xs mx-auto"},[f(" Use "),a("strong",null,"Copy AI context"),f(" above to grab the full evidence bundle for your own AI tool, or configure a provider. ")],-1)),d(H,{to:"/settings/ai",size:"xs",color:"neutral",variant:"outline",class:"mt-3"},{default:m(()=>[...N[12]||(N[12]=[f(" Configure in Settings ",-1)])]),_:1})])),d(Q,{open:e(j),sections:e(M),"token-estimate":e(B),"image-token-estimate":e(h),loading:e(F),"focus-section":e(g),"cited-sections":e(K),"not-applicable-sections":e(y)?.notApplicable,"onUpdate:open":N[5]||(N[5]=ne=>{j.value=ne,ne||(g.value=null)}),onRefresh:W},null,8,["open","sections","token-estimate","image-token-estimate","loading","focus-section","cited-sections","not-applicable-sections"]),a("div",ca,[d(le,{to:"/mcp",class:"inline-flex items-center gap-1 text-xs text-gray-400 hover:text-primary transition-colors"},{default:m(()=>[d(X,{name:"i-lucide-bot",class:"size-3"}),N[14]||(N[14]=f(" Query this failure from your AI agent via MCP ",-1))]),_:1})])])]),_:1})}}}),da=Object.assign(ua,{__name:"TestCaseAiCard"});function _t(s,C,v){const _=P(null),z=P(!1),p=P(!1);async function n(){const l=s();if(!(!l||!ke(C)||z.value)){p.value=!0,z.value=!0;try{_.value=await $fetch(l)}catch{_.value=null}finally{z.value=!1}}}return gt(()=>{ve(()=>ke(C),l=>{l&&(v||p.value)&&!_.value&&n()},{immediate:!0})}),{data:_,pending:z,load:n}}function ma(s,C,v,_={}){return _t(()=>{const z=ke(s),p=ke(C);return z&&p?`/api/test-runs/${z}/cases/${p}/trace-stacks`:null},v,_.auto??!0)}function ga(s,C,v,_={}){return _t(()=>{const z=ke(s),p=ke(C);return z&&p?`/api/test-runs/${z}/cases/${p}/trace-network`:null},v,_.auto??!1)}const fa={class:"max-h-[32rem] overflow-y-auto"},pa={key:0,class:"mb-2 flex items-center gap-1.5 text-xs text-gray-400 dark:text-gray-500"},ya={key:0,class:"mt-3 flex items-center gap-1.5 text-xs text-gray-400 dark:text-gray-500"},va=ee({__name:"TestSourceCard",props:{frames:{},testSource:{},runId:{},testRunsCaseId:{},hasTrace:{type:Boolean},projectKey:{},projectName:{},storageKey:{}},setup(s,{expose:C}){const v=s,{data:_,pending:z}=ma(()=>v.runId,()=>v.testRunsCaseId,()=>v.hasTrace,{auto:!0}),p=b(()=>_.value?.status==="ok"?_.value.frames??[]:[]),n=b(()=>p.value.length>0),l=b(()=>v.frames?.length??0),r=b(()=>l.value>0||!!v.testSource),M=P(null),B=b({get:()=>M.value??(n.value?"trace":"captured"),set:j=>{M.value=j}}),h=b(()=>[{label:`Full stack (${p.value.length})`,value:"trace"},{label:`Captured (${l.value||1})`,value:"captured"}]),y=b(()=>B.value==="trace"&&n.value?p.value.length:l.value||null),F=P(null);return C({reveal:()=>F.value?.reveal()}),(j,g)=>{const k=Ke,I=oe,W=Ss,R=Ds,K=pt,S=qe,E=Ee,te=We;return t(),x(te,{ref_key:"card",ref:F,"storage-key":s.storageKey,icon:"i-lucide-code",count:e(y),title:"Test source",help:"case.test-source"},Qt({folded:m(()=>[e(B)==="trace"&&e(n)?(t(),o(V,{key:0},[f(" Full call stack from the trace"+i(e(_)?.hasSources===!1?" (recorded without sources)":""),1)],64)):e(l)>1?(t(),o(V,{key:1},[f(" The failing line and "+i(e(l)-1)+" caller"+i(e(l)-1===1?"":"s"),1)],64)):(t(),o(V,{key:2},[f("Source around the failing assertion")],64))]),default:m(()=>[a("div",fa,[e(B)==="trace"&&e(n)?(t(),o(V,{key:0},[e(_)?.hasSources===!1?(t(),o("p",pa,[d(I,{name:"i-lucide-info",class:"size-3.5 shrink-0"}),g[1]||(g[1]=f(" Trace recorded without sources — frame list only. ",-1))])):c("",!0),d(W,{frames:e(p),"project-key":s.projectKey,"project-name":s.projectName},null,8,["frames","project-key","project-name"])],64)):(t(),o(V,{key:1},[s.frames?.length?(t(),x(R,{key:0,frames:s.frames,"project-key":s.projectKey,"project-name":s.projectName},null,8,["frames","project-key","project-name"])):s.testSource?(t(),x(K,{key:1,text:"```typescript\n"+s.testSource+"\n```"},null,8,["text"])):s.hasTrace&&e(z)?(t(),x(S,{key:2,text:"Loading call stack from trace…"})):c("",!0)],64))]),s.hasTrace?c("",!0):(t(),o("p",ya,[d(I,{name:"i-lucide-info",class:"size-3.5 shrink-0"}),a("span",null,[g[3]||(g[3]=f(" Want to go deeper? Record traces (",-1)),g[4]||(g[4]=a("code",null,"trace: 'retain-on-failure'",-1)),g[5]||(g[5]=f(") to see the full call stack with source here. ",-1)),d(E,{to:"ui-overview#trace-powered-deep-views","no-icon":"",class:"underline"},{default:m(()=>[...g[2]||(g[2]=[f("Learn more",-1)])]),_:1})])]))]),_:2},[e(n)&&e(r)?{name:"actions",fn:m(()=>[d(k,{modelValue:e(B),"onUpdate:modelValue":g[0]||(g[0]=se=>de(B)?B.value=se:null),items:e(h),size:"xs",variant:"link",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"])]),key:"0"}:void 0]),1032,["storage-key","count"])}}}),ha=Object.assign(va,{__name:"TestSourceCard"}),xa={class:"space-y-3"},_a={class:"divide-y divide-default"},ka={class:"flex items-center gap-2 min-w-0"},ba={class:"text-sm truncate"},wa={key:0,class:"text-xs text-gray-400 shrink-0"},$a=ee({__name:"TestCaseEvidenceCard",props:{attachments:{},traces:{},storageKey:{}},setup(s,{expose:C}){const v=s,_=Ve(),z=b(()=>v.attachments.filter(y=>we(y.path,y.contentType)).length),p=b(()=>v.attachments.filter(y=>Ne(y.path,y.contentType)).length),n=b(()=>v.attachments.filter(y=>!we(y.path,y.contentType)&&!Ne(y.path,y.contentType))),l=b(()=>z.value+p.value+v.traces.length+n.value.length),r=b(()=>{const y=[];return z.value&&y.push(`${z.value} screenshot${z.value===1?"":"s"}`),p.value&&y.push(`${p.value} video${p.value===1?"":"s"}`),v.traces.length&&y.push(`${v.traces.length} trace${v.traces.length===1?"":"s"}`),n.value.length&&y.push(`${n.value.length} file${n.value.length===1?"":"s"}`),y.join(" · ")||"No evidence captured"});function M(y,F){return yt(y,F,_.app?.baseURL)}function B(y){return y.split("/").pop()||y}const h=P(null);return C({reveal:()=>h.value?.reveal?.()}),(y,F)=>{const j=Is,g=Rs,k=Ls,I=oe,W=Ce,R=zs,K=xt,S=We;return t(),x(S,{ref_key:"card",ref:h,"storage-key":s.storageKey,icon:"i-lucide-camera",title:"Failure evidence",count:e(l),help:"case.evidence"},{folded:m(()=>[f(i(e(r)),1)]),default:m(()=>[a("div",xa,[d(j,{attachments:s.attachments},null,8,["attachments"]),d(g,{attachments:s.attachments},null,8,["attachments"]),d(k,{traces:s.traces},null,8,["traces"]),e(n).length?(t(),x(R,{key:0,icon:"i-lucide-paperclip",label:"Attachments",count:e(n).length,collapsible:!1},{default:m(()=>[a("div",_a,[(t(!0),o(V,null,J(e(n),E=>(t(),o("div",{key:E.id,class:"flex items-center justify-between gap-2 px-3 py-2"},[a("div",ka,[d(I,{name:"i-lucide-file",class:"size-4 text-gray-400 shrink-0"}),a("span",ba,i(B(E.path)),1),E.size?(t(),o("span",wa,i(("formatBytes"in y?y.formatBytes:e(_e))(E.size)),1)):c("",!0)]),d(W,{to:M(E.path,E.contentType),target:"_blank",icon:"i-lucide-external-link",size:"xs",color:"neutral",variant:"soft",label:"Open"},null,8,["to"])]))),128))])]),_:1},8,["count"])):c("",!0),e(l)===0?(t(),x(K,{key:1,icon:"i-lucide-camera-off",text:"No screenshots, video or traces captured"})):c("",!0)])]),_:1},8,["storage-key","count"])}}}),Ca=Object.assign($a,{__name:"TestCaseEvidenceCard"}),Ta={class:"space-y-1 max-h-80 overflow-y-auto"},Sa={class:"min-w-0 flex-1"},Da={class:"flex items-center gap-2"},Ia={class:"truncate"},Ra={key:0,class:"text-xs text-gray-400 mt-0.5 ml-0"},La=ee({__name:"TestCaseConsoleCard",props:{entries:{}},setup(s){function C(_){switch(_){case"error":return"error";case"warning":return"warning";case"assert":return"error";default:return"neutral"}}function v(_){switch(_){case"error":return"i-lucide-octagon-x";case"warning":return"i-lucide-alert-triangle";case"assert":return"i-lucide-octagon-x";default:return"i-lucide-message-square"}}return(_,z)=>{const p=oe,n=me,l=ge;return s.entries.length>0?(t(),x(l,{key:0,icon:"i-lucide-terminal",title:"Console output",count:s.entries.length,help:"case.console"},{default:m(()=>[a("div",Ta,[(t(!0),o(V,null,J(s.entries,(r,M)=>(t(),o("div",{key:M,class:"flex items-start gap-2 py-1.5 px-2 rounded hover:bg-gray-50 dark:hover:bg-gray-800 text-sm"},[d(p,{name:v(r.type),class:q([r.type==="error"||r.type==="assert"?"text-red-500":r.type==="warning"?"text-amber-500":"text-gray-400","size-4 mt-0.5 shrink-0"])},null,8,["name","class"]),a("div",Sa,[a("div",Da,[d(n,{color:C(r.type),variant:"soft",size:"xs",class:"shrink-0"},{default:m(()=>[f(i(r.type),1)]),_:2},1032,["color"]),a("span",Ia,i(r.text),1)]),r.location?(t(),o("div",Ra,i(r.location),1)):c("",!0)])]))),128))])]),_:1},8,["count"])):c("",!0)}}}),za=Object.assign(La,{__name:"TestCaseConsoleCard"}),Na={key:0,class:"space-y-4 text-sm"},ja={class:"space-y-1.5"},Aa={class:"flex items-center gap-2"},Pa={key:0,class:"text-xs text-gray-500"},Ua={class:"block text-xs break-all text-gray-700 dark:text-gray-300"},Ma={key:0,class:"text-xs text-red-600 dark:text-red-400 font-mono"},Ba={class:"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-gray-400"},Fa={key:0,class:"font-mono"},Va={key:1,class:"font-mono"},Ea={key:2},Oa={key:3,title:"Bytes on the wire"},Ha={class:"tabular-nums"},Ka={key:0},Wa={class:"flex h-2 rounded overflow-hidden bg-gray-100 dark:bg-gray-800"},qa=["title"],Ga={class:"flex flex-wrap gap-x-3 gap-y-1 mt-1.5 text-xs text-gray-500"},Ja={class:"tabular-nums"},Qa={class:"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1.5 capitalize"},Za={key:0,class:"rounded border border-default divide-y divide-default max-h-48 overflow-y-auto"},Xa={class:"text-gray-500 dark:text-gray-400 shrink-0"},Ya={class:"break-all text-gray-700 dark:text-gray-300"},eo={key:1,class:"text-xs text-gray-400"},to={key:1},so={key:0,class:"rounded border border-default p-2"},no=["src","alt"],ao={key:1,class:"max-h-96 overflow-y-auto"},oo={key:0,class:"mt-1 text-xs text-gray-400"},ro={key:2,class:"text-xs text-gray-400"},io={key:2,class:"text-xs text-gray-400"},lo=ee({__name:"TraceNetworkDrawer",props:{open:{type:Boolean},entry:{},runId:{},testRunsCaseId:{}},emits:["update:open"],setup(s,{emit:C}){const v=s,_=C,z=[{key:"dns",label:"DNS",color:"bg-sky-400"},{key:"connect",label:"Connect",color:"bg-violet-400"},{key:"ssl",label:"TLS",color:"bg-rose-400"},{key:"send",label:"Send",color:"bg-amber-400"},{key:"wait",label:"Wait",color:"bg-blue-400"},{key:"receive",label:"Receive",color:"bg-emerald-400"}],p=b(()=>{const h=v.entry?.timings;return h?z.map(y=>({...y,value:h[y.key]??-1})).filter(y=>typeof y.value=="number"&&y.value>=0):[]}),n=b(()=>p.value.reduce((h,y)=>h+y.value,0)),l=b(()=>{const h=v.entry?.requestPostData??"";return h.startsWith("{")||h.startsWith("[")}),r=P(null),M=P(!1),B=new Map;return ve(()=>[v.open,v.entry?.bodySha1],async([h,y])=>{if(r.value=null,!h||!y||!v.runId)return;const F=B.get(y);if(F){r.value=F;return}M.value=!0;try{const j=await $fetch(`/api/test-runs/${v.runId}/cases/${v.testRunsCaseId}/trace-network-body`,{query:{sha1:y}});B.set(y,j),r.value=j}catch{r.value={status:"not-found"}}finally{M.value=!1}},{immediate:!0}),(h,y)=>{const F=me,j=Vs,g=qe,k=Es;return t(),x(k,{open:s.open,title:"Request detail",ui:{content:"max-w-xl"},"onUpdate:open":y[0]||(y[0]=I=>_("update:open",I))},{body:m(()=>[s.entry?(t(),o("div",Na,[a("div",ja,[a("div",Aa,[d(F,{color:("httpMethodColor"in h?h.httpMethodColor:e(Oe))(s.entry.method),variant:"soft",size:"sm",class:"font-mono shrink-0"},{default:m(()=>[f(i(s.entry.method),1)]),_:1},8,["color"]),d(F,{color:("httpStatusColor"in h?h.httpStatusColor:e(He))(s.entry.status),variant:"soft",size:"sm",class:"font-mono shrink-0 tabular-nums"},{default:m(()=>[f(i(s.entry.status>0?s.entry.status:"—"),1)]),_:1},8,["color"]),s.entry.statusText?(t(),o("span",Pa,i(s.entry.statusText),1)):c("",!0)]),a("code",Ua,i(s.entry.url),1),s.entry.failureText?(t(),o("p",Ma,i(s.entry.failureText),1)):c("",!0),a("div",Ba,[s.entry.resourceType?(t(),o("span",Fa,i(s.entry.resourceType),1)):c("",!0),s.entry.mimeType?(t(),o("span",Va,i(s.entry.mimeType),1)):c("",!0),s.entry.responseBodySize!=null?(t(),o("span",Ea,i(("formatBytes"in h?h.formatBytes:e(_e))(s.entry.responseBodySize)),1)):c("",!0),s.entry.transferSize!=null?(t(),o("span",Oa,i(("formatBytes"in h?h.formatBytes:e(_e))(s.entry.transferSize))+" transferred",1)):c("",!0),a("span",Ha,i(("formatDuration"in h?h.formatDuration:e(G))(s.entry.duration)),1),s.entry.duringFailure?(t(),x(F,{key:4,color:"error",variant:"subtle",size:"xs"},{default:m(()=>[...y[1]||(y[1]=[f("During failing action",-1)])]),_:1})):c("",!0)])]),e(p).length>0&&e(n)>0?(t(),o("div",Ka,[y[2]||(y[2]=a("p",{class:"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1.5"},"Timing",-1)),a("div",Wa,[(t(!0),o(V,null,J(e(p),I=>(t(),o("div",{key:I.key,class:q(I.color),style:ze({width:`${Math.max(.5,I.value/e(n)*100)}%`}),title:`${I.label}: ${("formatDuration"in h?h.formatDuration:e(G))(I.value)}`},null,14,qa))),128))]),a("div",Ga,[(t(!0),o(V,null,J(e(p),I=>(t(),o("span",{key:I.key,class:"inline-flex items-center gap-1"},[a("span",{class:q(["size-2 rounded-full",I.color])},null,2),f(" "+i(I.label)+" ",1),a("span",Ja,i(("formatDuration"in h?h.formatDuration:e(G))(I.value)),1)]))),128))])])):c("",!0),(t(),o(V,null,J(["request","response"],I=>a("div",{key:I},[a("p",Qa,i(I)+" headers",1),(I==="request"?s.entry.requestHeaders:s.entry.responseHeaders).length>0?(t(),o("div",Za,[(t(!0),o(V,null,J(I==="request"?s.entry.requestHeaders:s.entry.responseHeaders,W=>(t(),o("div",{key:`${I}-${W.name}`,class:"px-2 py-1 text-xs font-mono flex gap-2"},[a("span",Xa,i(W.name)+":",1),a("span",Ya,i(W.value),1)]))),128))])):(t(),o("p",eo,"None recorded."))])),64)),s.entry.requestPostData?(t(),o("div",to,[y[3]||(y[3]=a("p",{class:"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1.5"},"Request body",-1)),d(j,{code:s.entry.requestPostData,lang:e(l)?"json":"text"},null,8,["code","lang"])])):c("",!0),a("div",null,[y[4]||(y[4]=a("p",{class:"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1.5"},"Response body",-1)),e(M)?(t(),x(g,{key:0,text:"Loading body…",padded:!1})):e(r)?(t(),o(V,{key:1},[e(r).status==="ok"&&e(r).kind==="image"?(t(),o("div",so,[a("img",{src:e(r).dataUri,alt:s.entry.url,class:"max-w-full max-h-96"},null,8,no)])):e(r).status==="ok"?(t(),o("div",ao,[d(j,{code:e(r).content??"",lang:e(r).kind==="json"?"json":"text"},null,8,["code","lang"]),e(r).truncated?(t(),o("p",oo,"Preview truncated.")):c("",!0)])):(t(),o("p",ro,i(e(r).status==="too-large"?`Body too large to preview (${("formatBytes"in h?h.formatBytes:e(_e))(e(r).size??0)}) — open the trace viewer to inspect it.`:e(r).status==="unsupported"?`No preview for ${e(r).mimeType||"this content type"} — open the trace viewer to inspect it.`:"Body not stored in the trace."),1))],64)):s.entry.bodySha1?c("",!0):(t(),o("p",io,"No body captured for this request."))])])):c("",!0)]),_:1},8,["open"])}}}),co=Object.assign(lo,{__name:"TraceNetworkDrawer"}),uo={class:"flex items-center justify-between gap-2 mb-2"},mo={key:0,class:"hidden sm:flex items-center gap-1.5 text-xs text-gray-400"},go={class:"space-y-1 max-h-[28rem] overflow-y-auto"},fo=["title","onClick"],po={class:"flex items-center gap-2 text-sm min-w-0"},yo={class:"truncate text-xs flex-1 min-w-0"},vo={key:0,class:"shrink-0 text-xs text-gray-400 font-mono hidden md:inline"},ho={key:1,class:"shrink-0 text-xs text-gray-400 tabular-nums hidden sm:inline"},xo={class:"relative h-1.5 mt-1 rounded bg-gray-100 dark:bg-gray-800 overflow-hidden"},_o={key:0,class:"mt-2 text-xs text-gray-400 dark:text-gray-500"},ko=ee({__name:"TraceNetworkList",props:{data:{},runId:{},testRunsCaseId:{}},setup(s){const C=s,v=P("all"),_=b(()=>C.data.requests??[]),z=b(()=>({total:_.value.length,failed:_.value.filter(k=>k.failed).length,duringFailure:_.value.filter(k=>k.duringFailure).length})),p=b(()=>[{label:`All (${z.value.total})`,value:"all"},{label:`Failed (${z.value.failed})`,value:"failed",disabled:z.value.failed===0},{label:`During failure (${z.value.duringFailure})`,value:"duringFailure",disabled:z.value.duringFailure===0}]),n=b(()=>v.value==="failed"?_.value.filter(k=>k.failed):v.value==="duringFailure"?_.value.filter(k=>k.duringFailure):_.value);function l(k){try{return new URL(k).pathname||k}catch{return k}}const r=b(()=>Math.max(1,C.data.timelineDuration??1));function M(k){const I=Math.max(0,Math.min(100,k.start/r.value*100)),W=Math.min(100-I,Math.max(1.5,k.duration/r.value*100));return{left:`${I}%`,width:`${W}%`}}const B=b(()=>{const k=C.data.failingWindow;if(!k||k.end<=k.start)return null;const I=Math.max(0,Math.min(100,k.start/r.value*100)),W=Math.max(.5,Math.min(100-I,(k.end-k.start)/r.value*100));return{left:`${I}%`,width:`${W}%`}});function h(k){return k.failed?"bg-red-500":k.duration>1e3?"bg-orange-400":"bg-gray-400 dark:bg-gray-500"}function y(k){return k.failed?"border-l-2 border-l-red-400 dark:border-l-red-600":k.duringFailure?"border-l-2 border-l-amber-400 dark:border-l-amber-600":"border-l-2 border-l-transparent"}const F=P(null),j=P(!1);function g(k){F.value=k,j.value=!0}return(k,I)=>{const W=Ke,R=me,K=co;return t(),o("div",null,[a("div",uo,[d(W,{modelValue:e(v),"onUpdate:modelValue":I[0]||(I[0]=S=>de(v)?v.value=S:null),items:e(p),size:"xs",variant:"link",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"]),s.data.failingWindow?(t(),o("span",mo,[...I[2]||(I[2]=[a("span",{class:"inline-block w-3 h-2 rounded-sm bg-red-500/10 border border-red-300 dark:border-red-800"},null,-1),f(" failing action ",-1)])])):c("",!0)]),a("div",go,[(t(!0),o(V,null,J(e(n),S=>(t(),o("button",{key:S.index,type:"button",class:q([y(S),"w-full rounded bg-gray-50/60 dark:bg-gray-800/40 py-1.5 px-2 text-left cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800"]),title:S.url,onClick:E=>g(S)},[a("div",po,[d(R,{color:("httpMethodColor"in k?k.httpMethodColor:e(Oe))(S.method),variant:"soft",size:"xs",class:"font-mono shrink-0"},{default:m(()=>[f(i(S.method),1)]),_:2},1032,["color"]),d(R,{color:("httpStatusColor"in k?k.httpStatusColor:e(He))(S.status),variant:"soft",size:"xs",class:"font-mono shrink-0 tabular-nums",title:S.failureText||S.statusText},{default:m(()=>[f(i(S.status>0?S.status:"—"),1)]),_:2},1032,["color","title"]),a("code",yo,i(l(S.url)),1),S.resourceType?(t(),o("span",vo,i(S.resourceType),1)):c("",!0),S.responseBodySize!=null?(t(),o("span",ho,i(("formatBytes"in k?k.formatBytes:e(_e))(S.responseBodySize)),1)):c("",!0),a("span",{class:q(["ml-1 shrink-0 text-xs tabular-nums",S.duration>1e3?"text-red-600 font-medium":S.duration>500?"text-orange-500":"text-gray-500"])},i(("formatDuration"in k?k.formatDuration:e(G))(S.duration)),3)]),a("div",xo,[e(B)?(t(),o("div",{key:0,class:"absolute inset-y-0 bg-red-500/10 border-x border-red-300/60 dark:border-red-800/60",style:ze(e(B))},null,4)):c("",!0),a("div",{class:q(["absolute inset-y-0 rounded-full",h(S)]),style:ze(M(S))},null,6)])],10,fo))),128))]),s.data.truncated?(t(),o("p",_o," Showing the first "+i(e(_).length)+" of "+i(s.data.totalBeforeCap)+" requests recorded in the trace. ",1)):c("",!0),d(K,{open:e(j),"onUpdate:open":I[1]||(I[1]=S=>de(j)?j.value=S:null),entry:e(F),"run-id":s.runId,"test-runs-case-id":s.testRunsCaseId},null,8,["open","entry","run-id","test-runs-case-id"])])}}}),bo=Object.assign(ko,{__name:"TraceNetworkList"}),wo={class:"flex flex-wrap items-center gap-x-3 gap-y-1"},$o={key:0,class:"flex items-center gap-2 text-xs"},Co={key:0,class:"flex items-center gap-1 text-red-600 dark:text-red-400"},To={key:1,class:"flex items-center gap-1 text-amber-600 dark:text-amber-400"},So={key:2,class:"text-xs text-gray-400 py-2"},Do={key:1,class:"space-y-1 max-h-[28rem] overflow-y-auto"},Io=["disabled","onClick"],Ro={key:1,class:"size-3.5 shrink-0"},Lo=["title"],zo=["title"],No=["title"],jo=["title"],Ao=["title"],Po={key:0,class:"px-2 pb-2 pl-7 space-y-1.5"},Uo={class:"flex items-start gap-2"},Mo={key:0,class:"text-gray-400 shrink-0 font-mono"},Bo={class:"font-mono break-all text-gray-700 dark:text-gray-300 flex-1 min-w-0"},Fo=["title"],Vo={key:0,class:"mt-1.5"},Eo=["onClick"],Oo={key:0,class:"mt-1 whitespace-pre-wrap break-all font-mono text-[11px] leading-relaxed text-gray-500 dark:text-gray-400 max-h-48 overflow-y-auto"},Ho={key:2,class:"mt-3 flex items-center gap-1.5 text-xs text-gray-400 dark:text-gray-500"},Ko={key:3,class:"mt-3 flex items-center gap-1.5 text-xs text-gray-400 dark:text-gray-500"},Wo=ee({__name:"TestCaseNetworkRequests",props:{requests:{},runId:{},testRunsCaseId:{},hasTrace:{type:Boolean}},setup(s,{expose:C}){const v=s,_=P("all"),{data:z,pending:p,load:n}=ga(()=>v.runId,()=>v.testRunsCaseId,()=>!!v.hasTrace),l=P(null),r=b({get:()=>l.value??(v.requests.length===0&&v.hasTrace?"trace":"captured"),set:$=>{l.value=$}});ve(()=>r.value==="trace",$=>{$&&n()},{immediate:!0});const M=b(()=>z.value?.status==="ok"?z.value.requests?.length??0:null),B=b(()=>[{label:`Captured (${v.requests.length})`,value:"captured",disabled:v.requests.length===0},{label:M.value!=null?`Full trace (${M.value})`:"Full trace",value:"trace"}]);function h(){v.hasTrace&&(l.value="trace")}C({showTraceMode:h});const y=P(new Set);function F($){const T=new Set(y.value);T.has($)?T.delete($):T.add($),y.value=T}const j=P(new Set);function g($){const T=new Set(j.value);T.has($)?T.delete($):T.add($),j.value=T}function k($){const T=$.toLowerCase();return T==="critical"||T==="fatal"?3:T==="error"?2:T==="warning"||T==="warn"?1:0}function I($){const T=k($);if(T>=2)return"error";if(T===1)return"warning";const A=$.toLowerCase();return A==="info"||A==="information"?"info":"neutral"}function W($){try{return new URL($).pathname||$}catch{return $}}function R($){return($.split("/")[1]??$).replace(/^vnd\.[^+]*\+?/,"").replace(/^x-/,"")||$}function K($){return $?new Date($).toLocaleString():""}const S=b(()=>v.requests.map(($,T)=>{const A=Array.isArray($.serverLogs)?$.serverLogs:[];let N=0,H=0;for(const X of A){const Z=k(X.level);Z>=2?N++:Z===1&&H++}return{...$,_index:T,logs:[...A].sort((X,Z)=>X.timestamp-Z.timestamp),errorLogCount:N,warnLogCount:H,failed:$.status>=400,path:W($.url)}})),E=b(()=>{let $=0,T=0,A=0,N=0;for(const H of S.value)H.failed&&$++,H.logs.length>0&&T++,A+=H.errorLogCount,N+=H.warnLogCount;return{total:S.value.length,failed:$,withLogs:T,errorLogs:A,warnLogs:N}}),te=b(()=>{let $=S.value;return _.value==="failed"?$=$.filter(T=>T.failed):_.value==="logs"&&($=$.filter(T=>T.logs.length>0)),[...$].sort((T,A)=>{const N=H=>(H.errorLogCount>0?3:0)+(H.failed?2:0)+(H.logs.length>0?1:0);return N(A)-N(T)||T._index-A._index})}),se=b(()=>[{label:`All (${E.value.total})`,value:"all"},{label:`Failed (${E.value.failed})`,value:"failed",disabled:E.value.failed===0},{label:`With logs (${E.value.withLogs})`,value:"logs",disabled:E.value.withLogs===0}]),re=b(()=>E.value.withLogs>0);function L($){return $.errorLogCount>0||$.status>=500?"border-l-2 border-l-red-400 dark:border-l-red-600":$.failed||$.warnLogCount>0?"border-l-2 border-l-amber-400 dark:border-l-amber-600":"border-l-2 border-l-transparent"}return($,T)=>{const A=oe,N=Ke,H=qe,X=bo,Z=me,fe=Ee,pe=ge;return t(),x(pe,{icon:"i-lucide-network",title:"Network & backend logs",count:e(r)==="trace"?e(M):e(E).total,help:"case.network"},{actions:m(()=>[a("div",wo,[e(r)==="captured"?(t(),o(V,{key:0},[e(E).errorLogs>0||e(E).warnLogs>0?(t(),o("div",$o,[e(E).errorLogs>0?(t(),o("span",Co,[d(A,{name:"i-lucide-octagon-alert",class:"size-3.5"}),f(i(e(E).errorLogs),1)])):c("",!0),e(E).warnLogs>0?(t(),o("span",To,[d(A,{name:"i-lucide-triangle-alert",class:"size-3.5"}),f(i(e(E).warnLogs),1)])):c("",!0)])):c("",!0),d(N,{modelValue:e(_),"onUpdate:modelValue":T[0]||(T[0]=U=>de(_)?_.value=U:null),items:e(se),size:"xs",variant:"link",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"])],64)):c("",!0),s.hasTrace?(t(),x(N,{key:1,modelValue:e(r),"onUpdate:modelValue":T[1]||(T[1]=U=>de(r)?r.value=U:null),items:e(B),size:"xs",variant:"pill",ui:{list:"gap-1 p-0.5",trigger:"px-2"}},null,8,["modelValue","items"])):c("",!0)])]),default:m(()=>[e(r)==="trace"?(t(),o(V,{key:0},[e(p)||!e(z)?(t(),x(H,{key:0,text:"Parsing trace network stream…"})):e(z).status==="ok"?(t(),x(X,{key:1,data:e(z),"run-id":s.runId??null,"test-runs-case-id":s.testRunsCaseId??0},null,8,["data","run-id","test-runs-case-id"])):(t(),o("p",So,"No network activity recorded in this trace."))],64)):(t(),o("div",Do,[(t(!0),o(V,null,J(e(te),U=>(t(),o("div",{key:U._index,class:q([L(U),"rounded bg-gray-50/60 dark:bg-gray-800/40"])},[a("button",{type:"button",class:q(["w-full flex items-center gap-2 py-1.5 px-2 text-sm text-left",U.logs.length>0?"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800":"cursor-default"]),disabled:U.logs.length===0,onClick:Q=>U.logs.length>0&&F(U._index)},[U.logs.length>0?(t(),x(A,{key:0,name:e(y).has(U._index)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 shrink-0 text-gray-400"},null,8,["name"])):(t(),o("span",Ro)),d(Z,{color:("httpMethodColor"in $?$.httpMethodColor:e(Oe))(U.method),variant:"soft",size:"xs",class:"font-mono shrink-0"},{default:m(()=>[f(i(U.method),1)]),_:2},1032,["color"]),d(Z,{color:("httpStatusColor"in $?$.httpStatusColor:e(He))(U.status),variant:"soft",size:"xs",class:"font-mono shrink-0 tabular-nums"},{default:m(()=>[f(i(U.status||"—"),1)]),_:2},1032,["color"]),a("code",{class:"truncate text-xs flex-1 min-w-0",title:U.url},i(U.path),9,Lo),U.contentType?(t(),o("span",{key:2,class:"shrink-0 text-xs text-gray-400 font-mono hidden md:inline",title:`Response content type: ${U.contentType}`},i(R(U.contentType)),9,zo)):c("",!0),U.errorLogCount>0?(t(),o("span",{key:3,class:"shrink-0 inline-flex items-center gap-1 text-xs text-red-600 dark:text-red-400",title:`${U.errorLogCount} backend error log(s)`},[d(A,{name:"i-lucide-octagon-alert",class:"size-3.5"}),f(i(U.errorLogCount),1)],8,No)):c("",!0),U.warnLogCount>0?(t(),o("span",{key:4,class:"shrink-0 inline-flex items-center gap-1 text-xs text-amber-600 dark:text-amber-400",title:`${U.warnLogCount} backend warning log(s)`},[d(A,{name:"i-lucide-triangle-alert",class:"size-3.5"}),f(i(U.warnLogCount),1)],8,jo)):c("",!0),U.startTime?(t(),o("span",{key:5,class:"shrink-0 text-xs text-gray-400 hidden sm:inline",title:K(U.startTime)},i(("formatRelativeTime"in $?$.formatRelativeTime:e($e))(U.startTime)),9,Ao)):c("",!0),a("span",{class:q(["ml-1 shrink-0 text-xs tabular-nums",(U.duration??0)>1e3?"text-red-600 font-medium":(U.duration??0)>500?"text-orange-500":"text-gray-500"])},i(("formatDuration"in $?$.formatDuration:e(G))(U.duration)),3)],10,Io),U.logs.length>0&&e(y).has(U._index)?(t(),o("div",Po,[(t(!0),o(V,null,J(U.logs,(Q,le)=>(t(),o("div",{key:le,class:"rounded border border-default bg-white dark:bg-gray-900/60 p-2 text-xs"},[a("div",Uo,[d(Z,{color:I(Q.level),variant:"soft",size:"xs",class:"shrink-0 capitalize"},{default:m(()=>[f(i(Q.level),1)]),_:2},1032,["color"]),Q.category?(t(),o("span",Mo,"["+i(Q.category)+"]",1)):c("",!0),a("span",Bo,i(Q.message),1),Q.timestamp?(t(),o("span",{key:1,class:"shrink-0 text-gray-400 tabular-nums",title:K(Q.timestamp)},i(("formatRelativeTime"in $?$.formatRelativeTime:e($e))(Q.timestamp)),9,Fo)):c("",!0)]),Q.stack?(t(),o("div",Vo,[a("button",{type:"button",class:"inline-flex items-center gap-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200",onClick:Te=>g(`${U._index}:${le}`)},[d(A,{name:e(j).has(`${U._index}:${le}`)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3"},null,8,["name"]),T[2]||(T[2]=f(" Stack trace ",-1))],8,Eo),e(j).has(`${U._index}:${le}`)?(t(),o("pre",Oo,i(Q.stack),1)):c("",!0)])):c("",!0)]))),128))])):c("",!0)],2))),128))])),e(r)==="captured"&&!e(re)?(t(),o("p",Ho,[d(A,{name:"i-lucide-info",class:"size-3.5 shrink-0"}),T[4]||(T[4]=f(" No backend server logs captured — install ",-1)),d(fe,{to:"backend-logs","no-icon":"",class:"underline"},{default:m(()=>[...T[3]||(T[3]=[f("a Piwi backend integration",-1)])]),_:1}),T[5]||(T[5]=f(" to see server-side warnings and errors under each request. ",-1))])):c("",!0),s.hasTrace?c("",!0):(t(),o("p",Ko,[d(A,{name:"i-lucide-info",class:"size-3.5 shrink-0"}),a("span",null,[T[7]||(T[7]=f(" Want to go deeper? Record traces (",-1)),T[8]||(T[8]=a("code",null,"trace: 'retain-on-failure'",-1)),T[9]||(T[9]=f(") to see every request with headers, timing and bodies here. ",-1)),d(fe,{to:"ui-overview#trace-powered-deep-views","no-icon":"",class:"underline"},{default:m(()=>[...T[6]||(T[6]=[f("Learn more",-1)])]),_:1})])]))]),_:1},8,["count"])}}}),qo=Object.assign(Wo,{__name:"TestCaseNetworkRequests"}),Go={class:"space-y-2"},Jo=ee({__name:"TestCaseTracesCard",props:{traces:{}},setup(s){return(C,v)=>{const _=Ns,z=ge;return s.traces.length>0?(t(),x(z,{key:0,icon:"i-lucide-bug-play",title:"Traces",count:s.traces.length,help:"case.traces"},{default:m(()=>[a("div",Go,[(t(!0),o(V,null,J(s.traces,p=>(t(),x(_,{key:p.id,trace:p,class:"py-2 px-3 rounded-lg border"},null,8,["trace"]))),128))])]),_:1},8,["count"])):c("",!0)}}}),Qo=Object.assign(Jo,{__name:"TestCaseTracesCard"}),Zo={class:"space-y-3"},Xo={class:"flex items-center justify-between px-3 py-2 bg-gray-50 dark:bg-gray-800/50 border-b"},Yo={class:"flex items-center gap-2 min-w-0"},er={class:"text-sm font-medium truncate"},tr={key:0,class:"text-xs text-gray-400 shrink-0"},sr={class:"text-xs text-gray-400"},nr={class:"flex items-center gap-1 shrink-0"},ar=["href"],or={key:0,class:"bg-gray-100 dark:bg-gray-900"},rr=["src","alt","onClick"],ir={key:1,class:"bg-black"},lr={key:2,class:"bg-gray-50 dark:bg-gray-900"},cr={key:0,class:"flex items-center justify-center py-8"},ur={key:1,class:"p-4 text-red-500 text-sm"},dr={key:2,class:"p-4 overflow-auto max-h-96"},mr={class:"text-sm whitespace-pre-wrap font-sans leading-relaxed"},gr=ee({__name:"TestCaseAttachmentsCard",props:{attachments:{}},setup(s){const C=s,v=Ve(),_=P(null),z=b(()=>C.attachments.filter(R=>we(R.path,R.contentType)).map(R=>({src:B(R.path,R.contentType),name:R.name||h(R.path)})));function p(R){_.value=R}const n=new Set([".md",".mdx",".markdown"]),l=new Set(["text/markdown","text/x-markdown"]);function r(R){return R.toLowerCase().split(".").pop()||""}function M(R,K){return!!(n.has(r(R))||K&&l.has(K.toLowerCase()))}function B(R,K){return yt(R,K,v.app?.baseURL)}function h(R){return R.split("/").pop()||R}function y(R){return R==null?"":_e(R)}const F=P({}),j=P({}),g=P({}),k=P(new Set);async function I(R){if(F.value[R.id]===void 0&&!g.value[R.id]){g.value[R.id]=!0,j.value[R.id]=null;try{const K=await $fetch(B(R.path,R.contentType),{responseType:"text"});F.value[R.id]=K}catch{j.value[R.id]="Failed to load preview"}finally{g.value[R.id]=!1}}}function W(R,K){const S=new Set(k.value);S.has(R)?S.delete(R):(S.add(R),I(K)),k.value=S}return(R,K)=>{const S=oe,E=Ce,te=js,se=As,re=ge;return s.attachments.length>0?(t(),x(re,{key:0,icon:"i-lucide-paperclip",title:"Attachments",count:s.attachments.length},{default:m(()=>[a("div",Zo,[(t(!0),o(V,null,J(s.attachments,L=>(t(),o("div",{key:L.id,class:"rounded-lg border overflow-hidden"},[a("div",Xo,[a("div",Yo,[d(S,{name:e(we)(L.path,L.contentType)?"i-lucide-image":e(Ne)(L.path,L.contentType)?"i-lucide-video":M(L.path,L.contentType)?"i-lucide-file-text":"i-lucide-file",class:"size-4 text-gray-400 shrink-0"},null,8,["name"]),a("span",er,i(h(L.path)),1),L.name&&L.name!==h(L.path)?(t(),o("span",tr,i(L.name),1)):c("",!0),a("span",sr,i(y(L.size)),1)]),a("div",nr,[M(L.path,L.contentType)?(t(),x(E,{key:0,size:"xs",color:"neutral",variant:"soft",onClick:$=>W(L.id,L)},{default:m(()=>[f(i(e(k).has(L.id)?"Hide preview":"Preview"),1)]),_:2},1032,["onClick"])):c("",!0),a("a",{href:B(L.path,L.contentType),target:"_blank",class:"text-primary hover:underline text-xs shrink-0"},"Open",8,ar)])]),e(we)(L.path,L.contentType)?(t(),o("div",or,[a("img",{src:B(L.path,L.contentType),alt:L.name||"Screenshot",class:"max-w-full max-h-96 object-contain mx-auto cursor-pointer hover:opacity-90 transition-opacity",loading:"lazy",onClick:$=>p(e(z).findIndex(T=>T.src===B(L.path,L.contentType)))},null,8,rr)])):e(Ne)(L.path,L.contentType)?(t(),o("div",ir,[d(te,{src:B(L.path,L.contentType)},null,8,["src"])])):M(L.path,L.contentType)&&e(k).has(L.id)?(t(),o("div",lr,[e(g)[L.id]?(t(),o("div",cr,[d(S,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(j)[L.id]?(t(),o("div",ur,i(e(j)[L.id]),1)):e(F)[L.id]?(t(),o("div",dr,[a("pre",mr,i(e(F)[L.id]),1)])):c("",!0)])):c("",!0)]))),128))]),d(se,{modelValue:e(_),"onUpdate:modelValue":K[0]||(K[0]=L=>de(_)?_.value=L:null),images:e(z)},null,8,["modelValue","images"])]),_:1},8,["count"])):c("",!0)}}}),fr=Object.assign(gr,{__name:"TestCaseAttachmentsCard"});function pr(s){const C=[];if(!s)return C;const v=s.steps||[],z=v.filter(n=>n.category==="navigation").filter(n=>n.duration>3e3);if(z.length>0){const n=z.sort((l,r)=>r.duration-l.duration)[0];C.push({type:"warning",message:"Slow navigation detected",details:`"${n.title}" took ${(n.duration/1e3).toFixed(1)}s. The tested page may have performance issues (slow server response, heavy JS bundles, etc.).`})}v.length>20&&C.push({type:"info",message:"Many sequential actions",details:`This test has ${v.length} steps. Consider splitting it into smaller, focused tests for better isolation and faster feedback.`}),s.status==="passed"&&(s.retries||0)>0&&C.push({type:"warning",message:"Flaky test — passed after retries",details:`This test needed ${s.retries} ${s.retries===1?"retry":"retries"} to pass. Consider reviewing locator strategies, adding explicit waits, or checking for race conditions.`});const p=v.filter(n=>n.category==="assertion"&&n.duration>2e3);if(p.length>0){const n=p.sort((l,r)=>r.duration-l.duration)[0];C.push({type:"info",message:"Slow assertions detected",details:`"${n.title}" took ${(n.duration/1e3).toFixed(1)}s. The UI may be slow to render or the assertion timeout may need tuning.`})}return C}const yr={class:"space-y-4"},vr=["innerHTML"],hr={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4"},xr={class:"space-y-4 xl:order-2"},_r={class:"space-y-4 xl:order-1 min-w-0"},kr={class:"max-h-96 overflow-y-auto"},br={class:"space-y-3"},wr={key:0},$r={class:"flex flex-wrap items-center gap-x-3 gap-y-1.5 text-xs mb-3"},Cr={class:"font-medium text-gray-600 dark:text-gray-300"},Tr={class:"tabular-nums text-gray-500 dark:text-gray-400"},Sr={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500"},Dr={key:0,class:"inline-flex items-center justify-center size-5 rounded-full bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 text-xs leading-none",title:"Step failed"},Ir={key:1,class:"inline-flex items-center justify-center size-5 rounded-full bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400 text-xs leading-none",title:"Step passed"},Rr={class:"flex items-center gap-2"},Lr={key:0,class:"text-xs text-red-500 mt-1 whitespace-pre-wrap break-words font-mono"},zr={class:"min-w-[6rem]"},Nr={class:"flex items-center justify-between gap-2"},jr={key:0,class:"text-xs tabular-nums text-gray-400 dark:text-gray-500"},Ar={class:"relative mt-1 h-1.5 w-full overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800"},Pr={class:"space-y-4 pt-4"},Ur={key:3,class:"flex flex-col items-center justify-center py-12 text-gray-400"},Mr={class:"space-y-4 pt-1"},Br={key:0,class:"space-y-2"},Fr={class:"flex items-start gap-2"},Vr={class:"space-y-4"},Er={key:3,class:"text-xs text-gray-400 pt-1"},Or={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Hr={class:"text-xs text-gray-400"},Kr={class:"space-y-4 pt-4"},Wr={key:0,class:"space-y-4"},qr={class:"flex items-center justify-end"},Gr={class:"text-xs whitespace-nowrap"},Jr={class:"text-gray-500"},Qr={class:"text-gray-400 ml-1"},Zr={key:0},Xr={key:1,class:"text-gray-400"},Yr=["title"],Ei=ee({__name:"[id]",async setup(s){let C,v;const _=Zt(),z=Xt(),p=_.params.id,{data:n,refresh:l}=([C,v]=ct(()=>dt(`/api/test-run-cases/${p}`,"$cViH4nbiGI")),C=await C,v(),C),r=P([]);ve(()=>n.value?.testCaseId,async u=>{if(u)try{r.value=await $fetch(`/api/test-cases/${u}/history`)}catch{r.value=[]}else r.value=[]},{immediate:!0});const{data:M,refresh:B}=([C,v]=ct(()=>dt(`/api/test-run-cases/${p}/traces`,"$GsSNbTq_Ec")),C=await C,v(),C),h=b(()=>(M.value?.length??0)>0);Yt(b(()=>({title:`${n.value?.title||`Test run case #${p}`} — Piwi Dashboard`})));const y=b(()=>!!n.value?.error),F=b(()=>n.value?pr(n.value):[]),j=b(()=>n.value?.steps?n.value.steps:[]),g=b(()=>n.value?.webVitals??null),k=b(()=>n.value?.networkRequests??[]),I=b(()=>{if(!r.value||r.value.length<2||!n.value?.duration)return null;const u=r.value.filter(ae=>ae.duration!==null&&ae.id!==n.value?.id);if(u.length===0)return null;const w=u.reduce((ae,ue)=>ae+(ue.duration||0),0)/u.length,O=n.value.duration,Y=O-w,ce=w>0?Math.round(Y/w*100):0;return{avg:Math.round(w),current:O,diff:Math.round(Y),pct:ce}}),W=b(()=>n.value?.testRun?.metadata),R=b(()=>{const u=W.value;return u?.scm?u.scm:null}),K=b(()=>{const u=W.value;return u?.ci?u.ci:null}),S=b(()=>n.value?.failureCluster??null),E=b(()=>{const u=[];return y.value&&u.push({label:"Diagnosis",icon:"i-lucide-stethoscope",value:"diagnosis",slot:"diagnosis"}),u.push({label:`Steps (${j.value.length})`,icon:"i-lucide-list-checks",value:"steps",slot:"steps"}),y.value||u.push({label:"Artifacts",icon:"i-lucide-paperclip",value:"artifacts",slot:"artifacts"}),u.push({label:"Performance",icon:"i-lucide-gauge",value:"performance",slot:"performance"}),u.push({label:`History${r.value?.length?` (${r.value.length})`:""}`,icon:"i-lucide-trending-up",value:"history",slot:"history"}),u}),te=b(()=>E.value.map(u=>u.value));function se(){return y.value?"diagnosis":"steps"}function re(u){let w=typeof u=="string"?u:"";return w==="error"&&(w="diagnosis"),w==="traces"&&(w=y.value?"diagnosis":"artifacts"),te.value.includes(w)?w:se()}const L=P(re(_.query.tab));ve(te,u=>{u.includes(L.value)||(L.value=re(_.query.tab))}),ve(L,u=>{_.query.tab!==u&&z.replace({query:{..._.query,tab:u}})},{immediate:!0});const $=[{accessorKey:"startTime",header:"Date"},{accessorKey:"status",header:"Status"},{accessorKey:"duration",header:"Duration"},{accessorKey:"retries",header:"Retries"},{accessorKey:"runId",header:"Run"},{accessorKey:"error",header:"Error"}],T={navigation:"info",assertion:"success",action:"warning",input:"warning",api:"info",wait:"neutral",hook:"neutral",fixture:"neutral"},A=[{id:"index",header:"#",meta:{class:{th:"w-12",td:"w-12"}}},{id:"status",header:"",meta:{class:{th:"w-10",td:"w-10"}}},{accessorKey:"category",header:"Category",meta:{class:{th:"w-28",td:"w-28"}}},{accessorKey:"title",header:"Step"},{accessorKey:"duration",header:"Duration",meta:{class:{th:"w-44",td:"w-44"}}}],N=b(()=>{const u=new Map;for(const w of j.value){const O=u.get(w.category)??{count:0,duration:0};O.count+=1,O.duration+=w.duration||0,u.set(w.category,O)}return Array.from(u,([w,O])=>({category:w,...O})).sort((w,O)=>O.duration-w.duration)}),H=b(()=>{let u=-1,w=-1;return j.value.forEach((O,Y)=>{(O.duration||0)>w&&(w=O.duration||0,u=Y)}),u}),X=b(()=>j.value.reduce((u,w)=>Math.max(u,w.duration||0),0)),Z=b(()=>j.value.length>0&&j.value.every(u=>typeof u.startTime=="number")),fe=b(()=>n.value?.startedAt??(Z.value?Math.min(...j.value.map(u=>u.startTime)):0)),pe=b(()=>{const u=n.value?.duration??0;if(u>0)return u;if(Z.value){const w=Math.max(...j.value.map(O=>O.startTime+(O.duration||0)));return Math.max(1,w-fe.value)}return 0});function U(u){if(Z.value&&pe.value>0){const O=Math.max(0,Math.min(100,(u.startTime-fe.value)/pe.value*100)),Y=Math.min(100-O,Math.max(1.5,(u.duration||0)/pe.value*100));return{left:`${O}%`,width:`${Y}%`}}return{left:"0%",width:`${X.value>0?Math.max(2,(u.duration||0)/X.value*100):0}%`}}function Q(u){const w=n.value?.duration??0;if(w<=0)return"";const O=u/w*100;return O>0&&O<1?"<1%":`${Math.round(O)}%`}function le(u){return u>2e3?"text-red-600 font-medium":u>500?"text-orange-500":"text-gray-500"}function Te(u){return u>2e3?"bg-red-500":u>500?"bg-orange-400":"bg-gray-400 dark:bg-gray-500"}const ne=b(()=>n.value?.testRun?.environment),kt=b(()=>Js([{filePath:n.value?.filePath??"",title:n.value?.title??"",line:n.value?.line??null,projectName:n.value?.browser?.projectName??null}])),{copy:bt,copied:Ge}=ht(),wt=b(()=>[{label:Ge.value?"Copied":"Retry command",icon:Ge.value?"i-lucide-check":"i-lucide-play",onClick:()=>bt(kt.value,{toast:"Retry command copied"})},{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>l()}]),$t=!!Ve().public.demoMode;let ye=null;const Je=b(()=>{const u=n.value?.testRun?.status;return u==="running"||u==="finalizing"});function Ct(){if($t||ye)return;const u=n.value?.testRun?.id;u&&(ye=new EventSource(`/api/test-runs/${u}/stream`),ye.onmessage=w=>{try{const O=JSON.parse(w.data);O.type==="case-files"&&O.data?.testRunsCaseId===Number(p)?(l(),B()):O.type==="run-finished"&&(l(),B(),Ae())}catch{}},ye.onerror=()=>{})}function Ae(){ye&&(ye.close(),ye=null)}ve(Je,u=>{u?Ct():Ae()},{immediate:!0}),es(Ae);const{copyRich:Tt,copied:Qe}=_s();function St(){const u=n.value;if(!u?.error)return;const w=window.location.origin,O=u.title??"Unknown test",Y=u.location??"",ce=u.error.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,""),ae=xe=>xe.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),ue=S.value?`${w}/failure-clusters/${S.value.id}`:null,Ie=`${w}/test-run-cases/${p}?tab=diagnosis`,he=n.value?.testCaseId?`${w}/test-cases/${n.value.testCaseId}`:null,Re=[`❌ Test failed: ${O}`,Y?`Location: ${Y}`:null,"","Error:",ce,"",ue?`Failure cluster: ${ue}`:null,`Execution: ${Ie}`,he?`History: ${he}`:null].filter(xe=>xe!==null).join(`
|
|
4
|
-
`),Me=[`<p><strong>❌ Test failed: ${ae(O)}</strong>${Y?`<br><code>${ae(Y)}</code>`:""}</p>`,`<p><strong>Error:</strong></p><pre>${ut(u.error)}</pre>`,`<p>🔗 ${ue?`<a href="${ue}">View failure cluster</a> · `:""}<a href="${Ie}">Execution details</a>${he?` · <a href="${he}">Test history</a>`:""}</p>`].join("");Tt(Re,Me,{toast:"Failure copied"})}const Pe=P(null),Ze=P(null),Ue=P(null),Se=P(null),Xe=P(null),De=P(null),Ye=P(null),et=P(null),tt=P(null),st=P(null);function be(u){u?.scrollIntoView({behavior:"smooth",block:"start"})}const nt={sampleError:()=>be(Pe.value),executionError:()=>be(Pe.value),testSource:()=>Se.value?.reveal(),sourceFiles:()=>Se.value?.reveal(),environmentDiff:()=>Ye.value?.reveal(),visualDiff:()=>et.value?.reveal(),domSnapshot:()=>tt.value?.reveal(),ariaSnapshot:()=>st.value?.reveal(),screenshots:()=>De.value?.reveal(),tracePointers:()=>De.value?.reveal(),artifacts:()=>De.value?.reveal(),console:()=>be(Ze.value),networkRequests:()=>be(Ue.value),traceCallStack:()=>Se.value?.reveal(),traceNetwork:()=>{Xe.value?.showTraceMode(),be(Ue.value)},steps:()=>{L.value="steps"},failingSteps:()=>{L.value="steps"}};return ts(bs,{canLocate:u=>u in nt,open:u=>nt[u]?.()}),(u,w)=>{const O=qt,Y=Gt,ce=oe,ae=je,ue=ss,Ie=as,he=jn,Re=Ce,Me=vt,xe=ge,Dt=En,It=ea,Rt=da,Lt=ha,zt=Ca,Nt=Us,jt=Ms,At=Bs,at=za,ot=qo,rt=Ps,Pt=pt,Ut=We,Mt=Fs,Le=me,Bt=Os,it=Hs,lt=Ks,Be=xt,Ft=Qo,Vt=fr,ie=qs,Fe=Ws,Et=Ee,Ot=Gs,Ht=cs,Kt=ns;return t(),x(Kt,{id:"test-run-case-detail"},{header:m(()=>[d(Ie,null,{leading:m(()=>[d(O),d(Y,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...e(n)?.testRun?.project?.id?[{label:e(n).testRun.project.name||"Project",to:`/projects/${e(n).testRun.project.id}`}]:[{label:"Project"}],...e(n)?.testRun?.id?[{label:`Run #${e(n).testRun.id}`+(e(n).testRun.label?` — ${e(n).testRun.label}`:""),to:`/test-runs/${e(n).testRun.id}`}]:[{label:"Test run"}],{label:e(n)?.title||`Test run case #${e(p)}`}]},null,8,["items"])]),right:m(()=>[e(n)?.testCaseId?(t(),x(ae,{key:0,to:`/test-cases/${e(n).testCaseId}`,class:"text-xs text-gray-500 hover:text-primary mr-2 flex items-center gap-1",title:"View test case evolution and history"},{default:m(()=>[d(ce,{name:"i-lucide-trending-up",class:"size-3.5"}),w[2]||(w[2]=a("span",{class:"hidden sm:inline"},"Evolution",-1))]),_:1},8,["to"])):c("",!0),d(ue,{actions:e(wt)},null,8,["actions"])]),_:1})]),body:m(()=>[d(Ht,{modelValue:e(L),"onUpdate:modelValue":w[1]||(w[1]=D=>de(L)?L.value=D:null),"tab-items":e(E)},{summary:m(()=>[d(he,{"test-case":e(n)??null,"scm-info":e(R),"ci-info":e(K),browser:e(n)?.browser??null,environment:e(ne),"steps-count":e(j).length,"historical-timing":e(I),"stable-links":e(n)?.stableLinks??null,onRefresh:w[0]||(w[0]=D=>e(l)())},null,8,["test-case","scm-info","ci-info","browser","environment","steps-count","historical-timing","stable-links"])]),"tab-diagnosis":m(()=>[a("div",yr,[a("div",{ref_key:"errorEl",ref:Pe,class:"scroll-mt-4"},[e(n)?.error?(t(),x(xe,{key:0,icon:"i-lucide-circle-x","icon-class":"text-red-500",title:"Error"},{actions:m(()=>[d(Me,{text:e(Qe)?"Copied!":"Copy failure"},{default:m(()=>[d(Re,{size:"xs",variant:"ghost",color:"neutral",icon:e(Qe)?"i-lucide-check":"i-lucide-clipboard",onClick:St},null,8,["icon"])]),_:1},8,["text"])]),default:m(()=>[a("div",{class:"text-xs font-mono whitespace-pre-wrap break-words max-h-96 overflow-y-auto rounded bg-red-50 dark:bg-red-950/20 p-3",innerHTML:e(ut)(e(ks)(e(n).error))},null,8,vr)]),_:1})):c("",!0)],512),a("div",hr,[a("div",xr,[d(Dt,{"test-case":e(n)??null,history:e(r),"current-id":Number(e(p))},null,8,["test-case","history","current-id"]),e(S)?(t(),x(It,{key:0,cluster:e(S)},null,8,["cluster"])):c("",!0),d(Rt,{"test-runs-case-id":Number(e(p))},null,8,["test-runs-case-id"])]),a("div",_r,[e(n)?.testSourceFrames?.length||e(n)?.testSource||e(h)?(t(),x(Lt,{key:0,ref_key:"testSourceCard",ref:Se,"storage-key":"case-test-source",frames:e(n)?.testSourceFrames??null,"test-source":e(n)?.testSource??null,"run-id":e(n)?.testRun?.id??null,"test-runs-case-id":Number(e(p)),"has-trace":e(h),"project-key":e(n)?.testRun?.project?.id,"project-name":e(n)?.testRun?.project?.name},null,8,["frames","test-source","run-id","test-runs-case-id","has-trace","project-key","project-name"])):c("",!0),d(zt,{ref_key:"evidenceCard",ref:De,"storage-key":"case-evidence",attachments:e(n)?.attachments??[],traces:e(M)??[]},null,8,["attachments","traces"]),e(n)?.testRun?.id?(t(),x(Nt,{key:1,"storage-key":"case-locators","run-id":e(n).testRun.id,"test-runs-case-id":Number(e(p))},null,8,["run-id","test-runs-case-id"])):c("",!0),e(n)?.testRun?.id?(t(),x(jt,{key:2,ref_key:"envDiffCard",ref:Ye,"storage-key":"case-env-diff","run-id":e(n).testRun.id,"test-runs-case-id":Number(e(p))},null,8,["run-id","test-runs-case-id"])):c("",!0),e(n)?.testRun?.id?(t(),x(At,{key:3,ref_key:"visualDiffCard",ref:et,"storage-key":"case-visual-diff","run-id":e(n).testRun.id,"test-runs-case-id":Number(e(p))},null,8,["run-id","test-runs-case-id"])):c("",!0),e(n)?.consoleLogs?.length?(t(),o("div",{key:4,ref_key:"consoleEl",ref:Ze,class:"scroll-mt-4"},[d(at,{entries:e(n)?.consoleLogs??[]},null,8,["entries"])],512)):c("",!0),e(k).length>0||e(h)?(t(),o("div",{key:5,ref_key:"networkEl",ref:Ue,class:"scroll-mt-4"},[d(ot,{ref_key:"networkCard",ref:Xe,requests:e(k),"run-id":e(n)?.testRun?.id??null,"test-runs-case-id":Number(e(p)),"has-trace":e(h)},null,8,["requests","run-id","test-runs-case-id","has-trace"])],512)):c("",!0),e(n)?.pageState?(t(),x(rt,{key:6,"storage-key":"case-page-state","page-state":e(n).pageState},null,8,["page-state"])):c("",!0),e(n)?.ariaSnapshot?(t(),x(Ut,{key:7,ref_key:"ariaCard",ref:st,"storage-key":"case-aria",icon:"i-lucide-scan-text",title:"ARIA snapshot",help:"case.aria"},{folded:m(()=>[...w[3]||(w[3]=[f("Accessibility tree captured at the moment of failure",-1)])]),default:m(()=>[a("div",kr,[d(Pt,{text:"```yaml\n"+e(n).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},512)):c("",!0),e(n)?.testRun?.id?(t(),x(Mt,{key:8,ref_key:"domSnapshotCard",ref:tt,"storage-key":"case-dom-snapshot","run-id":e(n).testRun.id,"test-runs-case-id":Number(e(p))},null,8,["run-id","test-runs-case-id"])):c("",!0)])])])]),"tab-steps":m(()=>[a("div",br,[e(j).length>0?(t(),o("div",wr,[a("div",$r,[a("span",Cr,i(e(j).length)+" steps",1),w[4]||(w[4]=a("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),(t(!0),o(V,null,J(e(N),D=>(t(),o("span",{key:D.category,class:"inline-flex items-center gap-1"},[d(Le,{color:T[D.category]||"neutral",variant:"soft",size:"xs"},{default:m(()=>[f(i(D.category),1)]),_:2},1032,["color"]),a("span",Tr,"×"+i(D.count)+" · "+i(("formatDuration"in u?u.formatDuration:e(G))(D.duration)),1)]))),128))]),d(lt,{"min-width":"40rem",bleed:!1},{default:m(()=>[d(it,{data:e(j),columns:A,ui:{base:"table-fixed w-full border-separate border-spacing-0 min-w-[40rem]",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default align-top"}},{"index-cell":m(({row:D})=>[a("span",Sr,i(D.index+1),1)]),"status-cell":m(({row:D})=>[D.original.failed?(t(),o("span",Dr,"✗")):(t(),o("span",Ir,"✓"))]),"category-cell":m(({row:D})=>[d(Le,{color:T[D.original.category]||"neutral",variant:"soft",size:"xs"},{default:m(()=>[f(i(D.original.category),1)]),_:2},1032,["color"])]),"title-cell":m(({row:D})=>[a("div",Rr,[a("span",{class:q(D.original.failed?"text-red-600 dark:text-red-400 font-medium":"")},i(D.original.title),3),D.index===e(H)?(t(),x(Le,{key:0,color:"warning",variant:"subtle",size:"xs",class:"shrink-0",title:"Slowest step in this test"},{default:m(()=>[...w[5]||(w[5]=[f(" slowest ",-1)])]),_:1})):c("",!0)]),D.original.failed&&D.original.error?.message?(t(),o("p",Lr,i(D.original.error.message),1)):c("",!0),D.original.location?(t(),x(Bt,{key:1,location:D.original.location,"project-key":e(n)?.testRun?.project?.id,"project-name":e(n)?.testRun?.project?.name,class:"text-xs text-gray-400 dark:text-gray-500 mt-0.5"},null,8,["location","project-key","project-name"])):c("",!0)]),"duration-cell":m(({row:D})=>[a("div",zr,[a("div",Nr,[a("span",{class:q(`text-sm tabular-nums ${le(D.original.duration)}`)},i(("formatDuration"in u?u.formatDuration:e(G))(D.original.duration)),3),Q(D.original.duration)?(t(),o("span",jr,i(Q(D.original.duration)),1)):c("",!0)]),a("div",Ar,[a("div",{class:q(["absolute inset-y-0 rounded-full",Te(D.original.duration)]),style:ze(U(D.original))},null,6)])])]),_:1},8,["data"])]),_:1})])):(t(),x(Be,{key:1,icon:"i-lucide-list-checks",text:"No steps recorded for this execution"}))])]),"tab-artifacts":m(()=>[a("div",Pr,[d(Ft,{traces:e(M)||[]},null,8,["traces"]),d(Vt,{attachments:e(n)?.attachments??[]},null,8,["attachments"]),e(n)?.pageState?(t(),x(rt,{key:0,"storage-key":"case-page-state","page-state":e(n).pageState},null,8,["page-state"])):c("",!0),e(n)?.consoleLogs?.length?(t(),x(at,{key:1,entries:e(n)?.consoleLogs??[]},null,8,["entries"])):c("",!0),e(k).length>0||e(h)?(t(),x(ot,{key:2,requests:e(k),"run-id":e(n)?.testRun?.id??null,"test-runs-case-id":Number(e(p)),"has-trace":e(h)},null,8,["requests","run-id","test-runs-case-id","has-trace"])):c("",!0),!e(M)?.length&&!e(n)?.attachments?.length&&!e(n)?.consoleLogs?.length&&!e(k).length?(t(),o("div",Ur,[e(Je)?(t(),o(V,{key:0},[d(ce,{name:"i-lucide-loader-circle",class:"size-8 mb-2 animate-spin"}),w[6]||(w[6]=a("p",{class:"text-sm"}," Run in progress — traces and attachments appear here as soon as they are uploaded. ",-1))],64)):(t(),o(V,{key:1},[d(ce,{name:"i-lucide-inbox",class:"size-8 mb-2"}),w[7]||(w[7]=a("p",{class:"text-sm"},"No traces, console logs, or network requests captured for this test case.",-1))],64))])):c("",!0)])]),"tab-performance":m(()=>[a("div",Mr,[e(F).length>0?(t(),o("div",Br,[(t(!0),o(V,null,J(e(F),(D,Wt)=>(t(),o("div",{key:Wt,class:q(["p-3 rounded-lg border",D.type==="warning"?"bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800":"bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800"])},[a("div",Fr,[d(ce,{name:D.type==="warning"?"i-lucide-alert-triangle":"i-lucide-lightbulb",class:q([D.type==="warning"?"text-amber-600":"text-blue-600","size-4 mt-0.5 shrink-0"])},null,8,["name","class"]),a("div",null,[a("p",{class:q(D.type==="warning"?"text-amber-800 dark:text-amber-200 font-medium":"text-blue-800 dark:text-blue-200 font-medium")},i(D.message),3),a("p",{class:q([D.type==="warning"?"text-amber-700 dark:text-amber-300":"text-blue-700 dark:text-blue-300","mt-1"])},i(D.details),3)])])],2))),128))])):c("",!0),e(g)?(t(),x(xe,{key:1,icon:"i-lucide-gauge",title:"Browser performance (Web Vitals)",help:"case.web-vitals"},{default:m(()=>[a("div",Vr,[e(g).navigation?(t(),x(Fe,{key:0,"min-tile-width":"10rem"},{default:m(()=>[d(ie,{label:"TTFB",value:("formatDuration"in u?u.formatDuration:e(G))(e(g).navigation.ttfb),hint:"Time to first byte","value-class":e(g).navigation.ttfb>600?"text-red-600":e(g).navigation.ttfb>200?"text-orange-500":"text-green-600"},null,8,["value","value-class"]),d(ie,{label:"DOM Interactive",value:("formatDuration"in u?u.formatDuration:e(G))(e(g).navigation.domInteractive),hint:"DOM interactive","value-class":e(g).navigation.domInteractive>3e3?"text-red-600":e(g).navigation.domInteractive>1500?"text-orange-500":"text-green-600"},null,8,["value","value-class"]),d(ie,{label:"DOMContentLoaded",value:("formatDuration"in u?u.formatDuration:e(G))(e(g).navigation.domContentLoaded),hint:"DOMContentLoaded","value-class":e(g).navigation.domContentLoaded>3e3?"text-red-600":e(g).navigation.domContentLoaded>1500?"text-orange-500":"text-green-600"},null,8,["value","value-class"]),d(ie,{label:"Load Complete",value:("formatDuration"in u?u.formatDuration:e(G))(e(g).navigation.loadComplete),hint:"Page fully loaded","value-class":e(g).navigation.loadComplete>5e3?"text-red-600":e(g).navigation.loadComplete>3e3?"text-orange-500":"text-green-600"},null,8,["value","value-class"])]),_:1})):c("",!0),e(g).paint&&(e(g).paint.firstPaint||e(g).paint.firstContentfulPaint)?(t(),x(Fe,{key:1,"min-tile-width":"10rem",class:"pt-2 border-t"},{default:m(()=>[e(g).paint.firstPaint!==void 0?(t(),x(ie,{key:0,label:"First Paint (FP)",value:("formatDuration"in u?u.formatDuration:e(G))(e(g).paint.firstPaint)},null,8,["value"])):c("",!0),e(g).paint.firstContentfulPaint!==void 0?(t(),x(ie,{key:1,label:"First Contentful Paint (FCP)",value:("formatDuration"in u?u.formatDuration:e(G))(e(g).paint.firstContentfulPaint),"value-class":e(g).paint.firstContentfulPaint>3e3?"text-red-600":e(g).paint.firstContentfulPaint>1800?"text-orange-500":"text-green-600"},null,8,["value","value-class"])):c("",!0)]),_:1})):c("",!0),e(g).vitals?(t(),x(Fe,{key:2,"min-tile-width":"10rem",class:"pt-2 border-t"},{default:m(()=>[d(ie,{label:"Largest Contentful Paint (LCP)",value:e(g).vitals.lcp!=null?("formatDuration"in u?u.formatDuration:e(G))(e(g).vitals.lcp):"n/a","value-class":e(g).vitals.lcp==null?"text-gray-400":e(g).vitals.lcp>4e3?"text-red-600":e(g).vitals.lcp>2500?"text-orange-500":"text-green-600"},null,8,["value","value-class"]),d(ie,{label:"Cumulative Layout Shift (CLS)",value:e(g).vitals.cls!=null?String(e(g).vitals.cls):"n/a","value-class":e(g).vitals.cls==null?"text-gray-400":e(g).vitals.cls>.25?"text-red-600":e(g).vitals.cls>.1?"text-orange-500":"text-green-600"},null,8,["value","value-class"]),d(ie,{label:"Interaction to Next Paint (INP)",value:e(g).vitals.inp!=null?("formatDuration"in u?u.formatDuration:e(G))(e(g).vitals.inp):"n/a","value-class":e(g).vitals.inp==null?"text-gray-400":e(g).vitals.inp>500?"text-red-600":e(g).vitals.inp>200?"text-orange-500":"text-green-600"},null,8,["value","value-class"])]),_:1})):c("",!0),e(g).navigation?.url?(t(),o("div",Er,[w[8]||(w[8]=f(" Page: ",-1)),a("code",Or,i(e(g).navigation.url),1)])):c("",!0)])]),_:1})):c("",!0),e(F).length===0&&!e(g)?(t(),x(Be,{key:2,icon:"i-lucide-gauge",text:"No performance hints or Web Vitals were captured for this execution."},{default:m(()=>[a("p",Hr,[w[10]||(w[10]=f(" Web Vitals and timing come from the ",-1)),d(Et,{to:"capture-fixtures"},{default:m(()=>[...w[9]||(w[9]=[f("capture fixtures",-1)])]),_:1}),w[11]||(w[11]=f(". ",-1))])]),_:1})):c("",!0)])]),"tab-history":m(()=>[a("div",Kr,[e(r)&&e(r).length>0?(t(),o("div",Wr,[a("div",qr,[e(n)?.testCaseId?(t(),x(Re,{key:0,to:`/test-cases/${e(n).testCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:m(()=>[...w[12]||(w[12]=[f(" View full test history ",-1)])]),_:1},8,["to"])):c("",!0)]),d(Ot,{data:e(r),height:200},null,8,["data"]),d(lt,{"min-width":"44rem",bleed:!1},{default:m(()=>[d(it,{data:e(r),columns:$,ui:{base:"table-fixed border-separate border-spacing-0 min-w-[44rem]",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"startTime-cell":m(({row:D})=>[a("span",Gr,[a("span",Jr,i(new Date(D.original.startTime).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("span",Qr,i(new Date(D.original.startTime).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})),1)])]),"status-cell":m(({row:D})=>[d(Le,{color:("getStatusColor"in u?u.getStatusColor:e(Cs))(D.original.status),class:"capitalize"},{default:m(()=>[f(i(D.original.status),1)]),_:2},1032,["color"])]),"duration-cell":m(({row:D})=>[D.original.duration!==null?(t(),o("span",Zr,i(("formatDuration"in u?u.formatDuration:e(G))(D.original.duration)),1)):(t(),o("span",Xr,"—"))]),"runId-cell":m(({row:D})=>[d(ae,{to:`/test-runs/${D.original.runId}`,class:"text-primary hover:underline"},{default:m(()=>[f(" #"+i(D.original.runId),1)]),_:2},1032,["to"])]),"error-cell":m(({row:D})=>[D.original.error?(t(),o("span",{key:0,class:"text-red-600 text-xs truncate max-w-xs block",title:D.original.error},i(D.original.error.length>80?`${D.original.error.substring(0,80)}…`:D.original.error),9,Yr)):c("",!0)]),_:1},8,["data"])]),_:1})])):(t(),x(Be,{key:1,icon:"i-lucide-trending-up",text:"No prior executions of this test yet."},{default:m(()=>[...w[13]||(w[13]=[a("p",{class:"text-xs text-gray-400"}," This is the first recorded run. Once it runs again, its status and duration trend appear here. ",-1)])]),_:1}))])]),_:1},8,["modelValue","tab-items"])]),_:1})}}});export{Ei as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as m,k as r,o as c,f as _,g,j as b,v,O as w,p as x,c as $,h as t}from"./B8fs6GU9.js";import{_ as S}from"./DFw8I2FL.js";import{x as C,y as k}from"./CvCF77E-.js";const z={key:1,class:"text-xs text-gray-400 dark:text-gray-500 italic"},y=m({__name:"BrowserBadge",props:{browser:{},size:{}},setup(a){const n=a,s=t(()=>n.browser?.projectName??null),l=t(()=>C(s.value)),p=t(()=>k(s.value)),u=t(()=>n.size==="sm"?"size-3.5":n.size==="lg"?"size-5":"size-4"),i=t(()=>{const e=n.browser;if(!e)return[];const o=[];return e.browserName&&e.browserName!==s.value&&o.push(`Browser: ${e.browserName}`),e.channel&&o.push(`Channel: ${e.channel}`),e.viewport&&o.push(`Viewport: ${e.viewport.width}×${e.viewport.height}`),e.deviceScaleFactor&&e.deviceScaleFactor!==1&&o.push(`Scale: ${e.deviceScaleFactor}x`),e.isMobile&&o.push("Mobile"),e.hasTouch&&!e.isMobile&&o.push("Touch"),e.locale&&o.push(`Locale: ${e.locale}`),e.timezoneId&&o.push(`TZ: ${e.timezoneId}`),e.colorScheme&&e.colorScheme!=="light"&&o.push(`Color: ${e.colorScheme}`),e.reducedMotion&&e.reducedMotion!=="no-preference"&&o.push(`Motion: ${e.reducedMotion}`),e.forcedColors&&e.forcedColors!=="none"&&o.push("Colors: forced"),e.offline&&o.push("Offline"),e.bypassCSP&&o.push("CSP bypassed"),e.javaScriptEnabled===!1&&o.push("JS disabled"),e.serviceWorkers==="block"&&o.push("SW blocked"),e.geolocation&&o.push(`Geo: ${e.geolocation.latitude.toFixed(2)},${e.geolocation.longitude.toFixed(2)}`),e.userAgent&&o.push(`UA: ${e.userAgent.length>60?e.userAgent.slice(0,60)+"…":e.userAgent}`),o}),h=t(()=>s.value?i.value.length?`${s.value} · ${i.value.join(" · ")}`:s.value:"");return(e,o)=>{const f=v,d=S;return r(s)?(c(),_(d,{key:0,text:r(h),popper:{placement:"top"}},{default:g(()=>[b(f,{name:r(l),class:x(["shrink-0 cursor-help",r(u)]),style:w({color:r(p)})},null,8,["name","class","style"])]),_:1},8,["text"])):(c(),$("span",z,"—"))}}}),A=Object.assign(y,{__name:"BrowserBadge"});export{A as _};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as e,a9 as r,bV as t}from"./B8fs6GU9.js";function a(o){return e(()=>r(o)?!!t(o)?.closest("form"):!0)}export{a as u};
|