@piwitests/server 0.15.0 → 0.17.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/{DCCMLWel.js → -9tk1FrT.js} +1 -1
- package/.output/public/_nuxt/26ll_vBr.js +1 -0
- package/.output/public/_nuxt/{BpepjHwc.js → 3QTorEhJ.js} +1 -1
- package/.output/public/_nuxt/{DKTDub7I.js → 3QTvYrZp.js} +1 -1
- package/.output/public/_nuxt/{CHSkT2s0.js → 73aPL7Ir.js} +1 -1
- package/.output/public/_nuxt/8jZmK2De.js +4 -0
- package/.output/public/_nuxt/8xyZSRSO.js +1 -0
- package/.output/public/_nuxt/{V1BQiRoh.js → 99tAfVF5.js} +1 -1
- package/.output/public/_nuxt/{BY0AkhJh.js → B1CUXGbl.js} +1 -1
- package/.output/public/_nuxt/B6hPf4UR.js +1 -0
- package/.output/public/_nuxt/{F07TcX0U.js → B6w76fJT.js} +1 -1
- package/.output/public/_nuxt/{B32-7cBF.js → BDcIWTTq.js} +1 -1
- package/.output/public/_nuxt/{OG2n3p77.js → BE8ykmwr.js} +1 -1
- package/.output/public/_nuxt/{rvaZFYoE.js → BEsJE07U.js} +1 -1
- package/.output/public/_nuxt/{DQpa8F03.js → BGZQONfm.js} +1 -1
- package/.output/public/_nuxt/{DZoSxwj6.js → BRdhP5lm.js} +1 -1
- package/.output/public/_nuxt/{n7Htv9PJ.js → BU6xjw05.js} +1 -1
- package/.output/public/_nuxt/{DvdOsTLb.js → BWFY2RuU.js} +1 -1
- package/.output/public/_nuxt/{60-Zii7v.js → B_QIrc7l.js} +1 -1
- package/.output/public/_nuxt/{CrFCPOnY.js → Ba4_ydKG.js} +1 -1
- package/.output/public/_nuxt/{BfshMo9k.js → BcLXUmKT.js} +2 -2
- package/.output/public/_nuxt/{CD-xwM9N.js → BciovqwK.js} +1 -1
- package/.output/public/_nuxt/{i38YGG9S.js → BgDEjrcz.js} +1 -1
- package/.output/public/_nuxt/{rWwWS3Kj.js → BoRJdCd4.js} +1 -1
- package/.output/public/_nuxt/{O1A-LRgV.js → Bpha13F_.js} +1 -1
- package/.output/public/_nuxt/{2PU-adwy.js → Bq0PQfQY.js} +1 -1
- package/.output/public/_nuxt/{B8fs6GU9.js → BrT_Sys2.js} +31 -31
- package/.output/public/_nuxt/{ETOCcsVw.js → Bua_L6p4.js} +1 -1
- package/.output/public/_nuxt/{nUsJV5qo.js → BwKwWgQe.js} +1 -1
- package/.output/public/_nuxt/{4fB15L_7.js → BxRsAYRS.js} +1 -1
- package/.output/public/_nuxt/{DVdOm5Bg.js → ByoIgYX_.js} +1 -1
- package/.output/public/_nuxt/{Bq2ZPvIH.js → C7nwFokE.js} +1 -1
- package/.output/public/_nuxt/CEuVRSr0.js +3 -0
- package/.output/public/_nuxt/{CokbKVE6.js → CHHqhAsw.js} +1 -1
- package/.output/public/_nuxt/{BBJ9Pu3M.js → CHIbdzqp.js} +1 -1
- package/.output/public/_nuxt/{C9jjVEQU.js → CMB-NkFa.js} +1 -1
- package/.output/public/_nuxt/{CU-OXXdh.js → CNULGfLp.js} +1 -1
- package/.output/public/_nuxt/{Surk4Lw-.js → COVRAesU.js} +1 -1
- package/.output/public/_nuxt/{h-e-Ca3f.js → CSAmL8XJ.js} +1 -1
- package/.output/public/_nuxt/{CHgsEM4U.js → CWmQcueG.js} +1 -1
- package/.output/public/_nuxt/{BgR7oL4p.js → CYuWAvXE.js} +1 -1
- package/.output/public/_nuxt/CbuWynGG.js +1 -0
- package/.output/public/_nuxt/{CIOQo6gB.js → Ce3tBrN7.js} +1 -1
- package/.output/public/_nuxt/{DNP5tTJo.js → Cf4h8qty.js} +1 -1
- package/.output/public/_nuxt/{B9Q_4Mjt.js → Cl96oI21.js} +1 -1
- package/.output/public/_nuxt/{PPFO8UVt.js → ClJkng9p.js} +1 -1
- package/.output/public/_nuxt/{B32ySRXg.js → CoKEjZX7.js} +1 -1
- package/.output/public/_nuxt/CvtYJHkY.js +1 -0
- package/.output/public/_nuxt/{BCK4f6Y3.js → CxLN5Tmq.js} +1 -1
- package/.output/public/_nuxt/{ChWPXucC.js → Cz2HhsB6.js} +1 -1
- package/.output/public/_nuxt/{B_80i5Ge.js → D0-HTQTD.js} +1 -1
- package/.output/public/_nuxt/{CHMpVLqo.js → D13ybpY3.js} +1 -1
- package/.output/public/_nuxt/{CvCF77E-.js → D7P0ML0H.js} +2 -2
- package/.output/public/_nuxt/{BW1UOxWn.js → D811X8KM.js} +1 -1
- package/.output/public/_nuxt/DATh_1DQ.js +1 -0
- package/.output/public/_nuxt/{BEKwVcvQ.js → DAeYmPfX.js} +1 -1
- package/.output/public/_nuxt/DCffDvxl.js +1 -0
- package/.output/public/_nuxt/DDPptydi.js +2 -0
- package/.output/public/_nuxt/{DkFbpSsi.js → DFM2jv9I.js} +1 -1
- package/.output/public/_nuxt/{D4nLD93c.js → DJHNEqb7.js} +1 -1
- package/.output/public/_nuxt/{DaKVSp-6.js → DPSOtRoz.js} +1 -1
- package/.output/public/_nuxt/{DYDGGqZ3.js → DRTxhZBV.js} +1 -1
- package/.output/public/_nuxt/{Cgr8IKY4.js → DS9yGVFL.js} +1 -1
- package/.output/public/_nuxt/{Cfk2_UCm.js → DT5rhzhJ.js} +1 -1
- package/.output/public/_nuxt/{DFw8I2FL.js → DTH2lteW.js} +1 -1
- package/.output/public/_nuxt/DUe6xuKQ.js +1 -0
- package/.output/public/_nuxt/D_A6axXa.js +1 -0
- package/.output/public/_nuxt/D_TbJDHY.js +1 -0
- package/.output/public/_nuxt/{B59-l1Cv.js → Df3QtbpW.js} +1 -1
- package/.output/public/_nuxt/{BkhdAGx0.js → DjRhouSr.js} +1 -1
- package/.output/public/_nuxt/Dn6cGVYB.js +1 -0
- package/.output/public/_nuxt/{0KrkW531.js → DpJrGwCr.js} +2 -2
- package/.output/public/_nuxt/DqsMiUoW.js +2 -0
- package/.output/public/_nuxt/{C7RarFGi.js → Ds2Y3oms.js} +1 -1
- package/.output/public/_nuxt/Ds4Lb1vi.js +7 -0
- package/.output/public/_nuxt/{DWzdeQ3Z.js → DtXREpk_.js} +1 -1
- package/.output/public/_nuxt/{Dejf0f7D.js → DvC5Adg1.js} +3 -3
- package/.output/public/_nuxt/{o5WQ5Z7k.js → DvXvJzFP.js} +1 -1
- package/.output/public/_nuxt/{DAeYEeCC.js → Dvc1aWpA.js} +1 -1
- package/.output/public/_nuxt/{DzbOHjZH.js → DwZiG9xH.js} +1 -1
- package/.output/public/_nuxt/Dx1oCMgy.js +47 -0
- package/.output/public/_nuxt/{BGsuOpiq.js → DxQq_L07.js} +1 -1
- package/.output/public/_nuxt/{CqA3gM8h.js → Dym66h3p.js} +1 -1
- package/.output/public/_nuxt/{CNzoIhwN.js → Dz3Wbekz.js} +1 -1
- package/.output/public/_nuxt/HCK35QD8.js +1 -0
- package/.output/public/_nuxt/{Cpquifvd.js → L6HlmmEa.js} +1 -1
- package/.output/public/_nuxt/{BMQIO38j.js → PxPbRVF-.js} +1 -1
- package/.output/public/_nuxt/{DiUGa0CT.js → QFMx1VKs.js} +1 -1
- package/.output/public/_nuxt/{DHVmXA9K.js → Sgf5OLhm.js} +1 -1
- package/.output/public/_nuxt/US3YSX4T.js +1 -0
- package/.output/public/_nuxt/{DZLrAp2i.js → Wfk1m0ni.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/05a2dd95-d1c1-4e3a-8625-ac6bfea83837.json +1 -0
- package/.output/public/_nuxt/{too3WhRB.js → cBj9fai9.js} +1 -1
- package/.output/public/_nuxt/{DxXZN6ed.js → csqspBeX.js} +1 -1
- package/.output/public/_nuxt/entry.BaIGwMjT.css +1 -0
- package/.output/public/_nuxt/{__m3KqHO.js → jlBi8Byu.js} +1 -1
- package/.output/public/_nuxt/{Dv2B_nw_.js → lCkcEykv.js} +1 -1
- package/.output/public/_nuxt/qYFZH4Z8.js +34 -0
- package/.output/public/_nuxt/{3SnTawZW.js → r3SBLxtE.js} +1 -1
- package/.output/public/_nuxt/{DI_-kFec.js → r9WApUfF.js} +1 -1
- package/.output/public/_nuxt/{BC_Wu-fv.js → rw7Hdll3.js} +1 -1
- package/.output/public/_nuxt/{IdQR_Djw.js → sMFaPAAR.js} +1 -1
- package/.output/public/_nuxt/{CKZn0TUX.js → vzXhOO8R.js} +1 -1
- package/.output/public/_nuxt/{CFn3w5jn.js → yZ4LuI9d.js} +1 -1
- package/.output/public/_nuxt/{BtJkQ3to.js → z7PmsnBG.js} +1 -1
- package/.output/public/_nuxt/{lRMjXqiA.js → za5M7BGh.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-cVOSIY93.mjs} +6 -6
- package/.output/server/chunks/build/Checkbox-cVOSIY93.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DAufYuJw.mjs → CiEnvCard-DXPOhdSG.mjs} +5 -5
- package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.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/DataLocationCard-D6xSOrme.mjs +102 -0
- package/.output/server/chunks/build/DataLocationCard-D6xSOrme.mjs.map +1 -0
- package/.output/server/chunks/build/DesktopMcpCard-B4JuUTKj.mjs +122 -0
- package/.output/server/chunks/build/DesktopMcpCard-B4JuUTKj.mjs.map +1 -0
- 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-9Ia825h8.mjs} +9 -9
- package/.output/server/chunks/build/ProjectTestCasesTable-9Ia825h8.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-ppPz926C.mjs} +5 -4
- package/.output/server/chunks/build/Select-ppPz926C.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-Dk6f8i9o.mjs → SelectMenu-799c_Ils.mjs} +4 -4
- package/.output/server/chunks/build/{SelectMenu-Dk6f8i9o.mjs.map → SelectMenu-799c_Ils.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-xQQ3_ME1.mjs} +3 -3
- package/.output/server/chunks/build/Switch-xQQ3_ME1.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_-R6KGfZOC.mjs → _id_-B2yirIuA.mjs} +259 -85
- package/.output/server/chunks/build/_id_-B2yirIuA.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CFVnSs8B.mjs → _id_-B4V5fop6.mjs} +21 -19
- package/.output/server/chunks/build/{_id_-CFVnSs8B.mjs.map → _id_-B4V5fop6.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_-DXJQABO8.mjs → _id_-bWcP2xFl.mjs} +27 -26
- package/.output/server/chunks/build/{_id_-DXJQABO8.mjs.map → _id_-bWcP2xFl.mjs.map} +1 -1
- package/.output/server/chunks/build/about-TuEZ9n1Q.mjs +625 -0
- package/.output/server/chunks/build/about-TuEZ9n1Q.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-7jdaPOmj.mjs} +19 -18
- package/.output/server/chunks/build/ai-7jdaPOmj.mjs.map +1 -0
- package/.output/server/chunks/build/{analytics-BbT2-Tr-.mjs → analytics-B276WPeU.mjs} +237 -65
- package/.output/server/chunks/build/analytics-B276WPeU.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-BSzdkM_L.mjs} +20 -17
- package/.output/server/chunks/build/default-BSzdkM_L.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-DbYoZafk.mjs → docs-EXhN3sqC.mjs} +7 -6
- package/.output/server/chunks/build/{docs-DbYoZafk.mjs.map → docs-EXhN3sqC.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-CNV4xdYj.mjs → edit-C9Z7oZeu.mjs} +10 -9
- package/.output/server/chunks/build/edit-C9Z7oZeu.mjs.map +1 -0
- package/.output/server/chunks/build/fetch-8kznMtBM.mjs +1 -1
- package/.output/server/chunks/build/handleAndDispatchCustomEvent-Bk_AVSSo.mjs +13 -0
- package/.output/server/chunks/build/handleAndDispatchCustomEvent-Bk_AVSSo.mjs.map +1 -0
- 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-C3Ou18qD.mjs → index-BK9PTRpd.mjs} +34 -18
- package/.output/server/chunks/build/{index-C3Ou18qD.mjs.map → index-BK9PTRpd.mjs.map} +1 -1
- 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-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-rSHkKNna.mjs → index-DVUtBexc.mjs} +507 -85
- package/.output/server/chunks/build/index-DVUtBexc.mjs.map +1 -0
- 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-CQ-21rwc.mjs} +138 -31
- package/.output/server/chunks/build/mcp-CQ-21rwc.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-BTPF0xA7.mjs → notifications-Dzm9c0u_.mjs} +13 -12
- package/.output/server/chunks/build/notifications-Dzm9c0u_.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +37 -28
- package/.output/server/chunks/build/{settings-metadata-CksLgMun.mjs → settings-metadata-B0wo5R-W.mjs} +14 -3
- package/.output/server/chunks/build/settings-metadata-B0wo5R-W.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-Bmw_JdBS.mjs → settings-pNyPBXVa.mjs} +9 -7
- package/.output/server/chunks/build/settings-pNyPBXVa.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-BqR4acgi.mjs → storage-XelzuyPy.mjs} +23 -12
- package/.output/server/chunks/build/storage-XelzuyPy.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-pmOxi-AN.mjs} +16 -15
- package/.output/server/chunks/build/test-cases-pmOxi-AN.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/useFormControl-BLpq1s4O.mjs +9 -0
- package/.output/server/chunks/build/useFormControl-BLpq1s4O.mjs.map +1 -0
- package/.output/server/chunks/build/useIsDesktop-BS13spVj.mjs +9 -0
- package/.output/server/chunks/build/useIsDesktop-BS13spVj.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-v_dFuTw9.mjs → useSettingsNav-NjI2seBy.mjs} +9 -7
- package/.output/server/chunks/build/useSettingsNav-NjI2seBy.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-ZaqK4guJ.mjs} +6 -5
- package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-CFmeT_e2.mjs → wasted-time-CguAF9zc.mjs} +8 -8
- package/.output/server/chunks/build/wasted-time-CguAF9zc.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1009 -722
- 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/CBrCcDzR.js +0 -1
- package/.output/public/_nuxt/CFXonrwQ.js +0 -3
- package/.output/public/_nuxt/CJGJI2Of.js +0 -34
- package/.output/public/_nuxt/Ce4EdfL_.js +0 -4
- package/.output/public/_nuxt/Cf3RuiXF.js +0 -46
- 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/DgZlpN9l.js +0 -1
- package/.output/public/_nuxt/DjCfCT_5.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/evCxpgbd.js +0 -2
- 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 +0 -313
- 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/useFormControl-DFTjniPG.mjs +0 -19
- package/.output/server/chunks/build/useFormControl-DFTjniPG.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
|
@@ -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,46 +0,0 @@
|
|
|
1
|
-
import{_ as ke,a as Re}from"./B32-7cBF.js";import{d as Q,o as n,c as d,f as _,g as u,i as e,j as l,v as X,p as F,t as c,l as se,k as t,q as y,m,h as f,_ as Z,x as oe,F as D,y as W,r as J,C as we,s as $e,K as Ce,e as Te,aa as Fe}from"./B8fs6GU9.js";import{_ as je}from"./DHVmXA9K.js";import{_ as Se}from"./DNP5tTJo.js";import{_ as Pe,a as ze}from"./C9jjVEQU.js";import{_ as Ie}from"./Surk4Lw-.js";import{_ as Ue}from"./CHSkT2s0.js";import{_ as Ne}from"./n7Htv9PJ.js";import{_ as Ve}from"./o5WQ5Z7k.js";import{_ as Ae}from"./CrFCPOnY.js";import{_ as ie}from"./CHMpVLqo.js";import{_ as Ee}from"./D4nLD93c.js";import{_ as De}from"./DZLrAp2i.js";import{_ as le}from"./BBJ9Pu3M.js";import{f as ne,h as ue,A as M,e as Oe}from"./CvCF77E-.js";import{a as Be,d as Le,_ as We}from"./wCQds5_f.js";import{_ as He}from"./0KrkW531.js";import{_ as de}from"./B32ySRXg.js";import{u as re}from"./DAeYEeCC.js";import{u as Me}from"./O1A-LRgV.js";import{u as Ke}from"./BtJkQ3to.js";import"./BGsuOpiq.js";import"./D1tZEdSi.js";import"./DVdOm5Bg.js";import"./4fB15L_7.js";import"./CKZn0TUX.js";import"./YDWXnWou.js";import"./B_80i5Ge.js";import"./BC_Wu-fv.js";import"./3SnTawZW.js";import"./DWzdeQ3Z.js";const Ge={class:"flex items-center gap-3 flex-wrap"},Ye={class:"flex items-center gap-1.5"},qe={key:0,class:"text-gray-500"},Je={key:1},Qe={key:2},Xe={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"},Ze=Q({__name:"HomeFilters",props:{modelValue:{},availableEnvironments:{}},emits:["update:modelValue"],setup(O,{emit:w}){const $=O,v=w,U=f({get:()=>$.modelValue.environments,set:P=>v("update:modelValue",{...$.modelValue,environments:P})}),T=f({get:()=>$.modelValue.fullRunsOnly,set:P=>v("update:modelValue",{...$.modelValue,fullRunsOnly:P})}),A=f(()=>$.modelValue.environments.length>0||!$.modelValue.fullRunsOnly);function j(){v("update:modelValue",{environments:[],fullRunsOnly:!0})}return(P,b)=>{const N=X,a=je,s=Se,x=Z;return n(),d("div",Ge,[O.availableEnvironments.length>0?(n(),_(a,{key:0,modelValue:t(U),"onUpdate:modelValue":b[0]||(b[0]=g=>se(U)?U.value=g:null),items:O.availableEnvironments,multiple:"",placeholder:"All environments",size:"sm",class:"min-w-[160px]"},{default:u(({modelValue:g})=>[e("div",Ye,[l(N,{name:"i-lucide-server",class:F(["size-3.5 shrink-0",g.length?"text-primary":"text-gray-400"])},null,8,["class"]),g.length?g.length===1?(n(),d("span",Je,c(g[0]),1)):(n(),d("span",Qe,c(g.length)+" environments",1)):(n(),d("span",qe,"All environments"))])]),_:1},8,["modelValue","items"])):y("",!0),e("label",Xe,[l(s,{modelValue:t(T),"onUpdate:modelValue":b[1]||(b[1]=g=>se(T)?T.value=g:null),size:"sm"},null,8,["modelValue"]),b[2]||(b[2]=m(" Full runs only ",-1))]),t(A)?(n(),_(x,{key:1,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:j},{default:u(()=>[...b[3]||(b[3]=[m(" Reset ",-1)])]),_:1})):y("",!0)])}}}),et=Object.assign(Ze,{__name:"HomeFilters"}),tt={class:"hidden md:block overflow-x-auto -mx-4 px-4 sm:mx-0 sm:px-0"},st={key:0,class:"flex flex-wrap gap-1 mt-0.5"},nt={class:"w-40"},rt={key:1,class:"text-gray-400 text-sm"},at={class:"text-xs text-gray-500 dark:text-gray-400"},ot={key:0},it={key:1,class:"text-gray-400 text-sm"},lt={key:0,class:"tabular-nums text-sm text-gray-600 dark:text-gray-400"},ut={key:1,class:"text-gray-400"},dt={class:"space-y-2 md:hidden"},ct={class:"flex items-start justify-between gap-2"},mt={key:0,class:"flex flex-wrap gap-1"},pt={class:"flex items-center justify-between gap-2 text-xs"},gt={class:"text-gray-500 dark:text-gray-400 truncate"},ft={key:1,class:"text-gray-400"},yt={key:2,class:"shrink-0 tabular-nums text-gray-500 dark:text-gray-400"},_t=Q({__name:"ProjectTrendTable",props:{projects:{},limit:{default:10}},setup(O){const w=O,$={failing:0,flaky:1,passing:2,unknown:3},v=J(!1),U=f(()=>w.projects.length>w.limit),T=f(()=>{const a=[...w.projects].sort((s,x)=>{const g=$[s.tendency]-$[x.tendency];if(g!==0)return g;const V=s.latestFullRun?new Date(s.latestFullRun.startTime).getTime():0;return(x.latestFullRun?new Date(x.latestFullRun.startTime).getTime():0)-V});return v.value?a:a.slice(0,w.limit)});function A(a){return a>=90?"text-green-600 dark:text-green-400":a>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function j(a){switch(a){case"failing":return"text-red-700 dark:text-red-400 bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800";case"flaky":return"text-amber-700 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800";case"passing":return"text-green-700 dark:text-green-400 bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800";default:return"text-gray-500 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700"}}function P(a){return a==="unknown"?"Unknown":a.charAt(0).toUpperCase()+a.slice(1)}function b(a){switch(a){case"failing":return"i-lucide-trending-down";case"flaky":return"i-lucide-shuffle";case"passing":return"i-lucide-trending-up";default:return"i-lucide-minus"}}const N=[{accessorKey:"name",header:"Project"},{id:"recentRuns",header:"Last 20 runs"},{accessorKey:"tendency",header:"Tendency"},{id:"passRate",header:"Pass rate"},{id:"latestRun",header:"Latest run"},{id:"tests",header:"Tests"}];return(a,s)=>{const x=Z,g=oe,V=Ve,h=Ae,S=X,z=ie,E=Ee,k=De,K=le;return n(),_(K,{icon:"i-lucide-layout-dashboard",title:"Project health",help:"home.project-health"},{actions:u(()=>[t(U)&&!t(v)?(n(),_(x,{key:0,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-down",onClick:s[0]||(s[0]=r=>v.value=!0)},{default:u(()=>[m(" Show all "+c(w.projects.length),1)]),_:1})):t(v)?(n(),_(x,{key:1,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-up",onClick:s[1]||(s[1]=r=>v.value=!1)},{default:u(()=>[...s[2]||(s[2]=[m(" Show less ",-1)])]),_:1})):y("",!0),l(x,{to:"/projects",variant:"outline",size:"sm"},{default:u(()=>[...s[3]||(s[3]=[m("View all",-1)])]),_:1})]),default:u(()=>[e("div",tt,[l(E,{data:t(T),columns:N,ui:{base:"min-w-[700px]",td:"py-3",th:"py-3 text-xs uppercase tracking-wide"}},{"name-cell":u(({row:r})=>[l(g,{to:`/projects/${r.original.id}`,class:"font-medium text-primary hover:underline truncate block max-w-[200px]"},{default:u(()=>[m(c(r.original.label||r.original.name),1)]),_:2},1032,["to"]),r.original.tags.length>0?(n(),d("div",st,[(n(!0),d(D,null,W(r.original.tags,C=>(n(),_(V,{key:C.id,text:C.text,color:C.color},null,8,["text","color"]))),128))])):y("",!0)]),"recentRuns-cell":u(({row:r})=>[e("div",nt,[l(h,{runs:r.original.recentRuns,height:28},null,8,["runs"])])]),"tendency-cell":u(({row:r})=>[e("span",{class:F(["inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium border whitespace-nowrap",j(r.original.tendency)])},[l(S,{name:b(r.original.tendency),class:"size-3 shrink-0"},null,8,["name"]),m(" "+c(P(r.original.tendency)),1)],2)]),"passRate-cell":u(({row:r})=>[r.original.latestFullRun?(n(),d("span",{key:0,class:F(["font-semibold tabular-nums text-sm",A(("passRate"in a?a.passRate:t(M))(r.original.latestFullRun))])},c(("passRate"in a?a.passRate:t(M))(r.original.latestFullRun))+"% ",3)):(n(),d("span",rt,"—"))]),"latestRun-cell":u(({row:r})=>[r.original.latestFullRun?(n(),_(g,{key:0,to:`/test-runs/${r.original.latestFullRun.id}`,class:"flex items-center gap-2 min-w-[140px] hover:opacity-80 transition-opacity"},{default:u(()=>[l(z,{status:r.original.latestFullRun.status},null,8,["status"]),e("div",at,[e("div",null,c(("formatRelativeTime"in a?a.formatRelativeTime:t(ne))(r.original.latestFullRun.startTime)),1),r.original.latestFullRun.duration?(n(),d("div",ot,c(("formatDuration"in a?a.formatDuration:t(ue))(r.original.latestFullRun.duration)),1)):y("",!0)])]),_:2},1032,["to"])):(n(),d("span",it,"No full runs"))]),"tests-cell":u(({row:r})=>[r.original.latestFullRun?(n(),d("span",lt,c(r.original.latestFullRun.passedTests)+"/"+c(r.original.latestFullRun.totalTests),1)):(n(),d("span",ut,"—"))]),_:1},8,["data"])]),e("div",dt,[(n(!0),d(D,null,W(t(T),r=>(n(),d("div",{key:r.id,class:"rounded-lg border border-default p-3 space-y-2"},[e("div",ct,[l(g,{to:`/projects/${r.id}`,class:"font-medium text-primary hover:underline truncate"},{default:u(()=>[m(c(r.label||r.name),1)]),_:2},1032,["to"]),e("span",{class:F(["inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium whitespace-nowrap",j(r.tendency)])},[l(S,{name:b(r.tendency),class:"size-3 shrink-0"},null,8,["name"]),m(" "+c(P(r.tendency)),1)],2)]),r.tags.length>0?(n(),d("div",mt,[(n(!0),d(D,null,W(r.tags,C=>(n(),_(V,{key:C.id,text:C.text,color:C.color},null,8,["text","color"]))),128))])):y("",!0),l(h,{runs:r.recentRuns,height:24},null,8,["runs"]),e("div",pt,[r.latestFullRun?(n(),_(g,{key:0,to:`/test-runs/${r.latestFullRun.id}`,class:"flex items-center gap-1.5 min-w-0 hover:opacity-80"},{default:u(()=>[l(z,{status:r.latestFullRun.status},null,8,["status"]),e("span",gt,c(("formatRelativeTime"in a?a.formatRelativeTime:t(ne))(r.latestFullRun.startTime)),1)]),_:2},1032,["to"])):(n(),d("span",ft,"No full runs")),r.latestFullRun?(n(),d("span",yt,[e("span",{class:F(["font-semibold",A(("passRate"in a?a.passRate:t(M))(r.latestFullRun))])},c(("passRate"in a?a.passRate:t(M))(r.latestFullRun))+"% ",3),m(" · "+c(r.latestFullRun.passedTests)+"/"+c(r.latestFullRun.totalTests),1)])):y("",!0)])]))),128))]),t(T).length===0?(n(),_(k,{key:0,text:"No projects yet",padded:!1,class:"py-8"})):y("",!0)]),_:1})}}}),xt=Object.assign(_t,{__name:"ProjectTrendTable"}),ht={class:"flex items-center gap-3"},vt={class:"p-2 bg-primary/10 rounded-lg shrink-0"},bt={class:"text-xl font-semibold inline-flex items-center gap-1"},kt={class:"text-sm text-gray-500 dark:text-gray-400"},Rt={class:"flex flex-col items-center shrink-0"},wt={key:1},$t={key:0,class:"w-px flex-1 mt-2 min-h-6 bg-gray-200 dark:bg-gray-700"},Ct={class:"flex-1 pb-6"},Tt={class:"flex items-center gap-2 mb-1"},Ft={class:"font-medium"},jt={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},St={class:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-2"},Pt={key:0,class:"mt-4 space-y-6"},zt={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},It={class:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400"},Ut=`// tests/fixtures.ts
|
|
2
|
-
import { test as base, expect } from '@playwright/test'
|
|
3
|
-
import { piwiFixtures } from '@piwitests/reporter'
|
|
4
|
-
|
|
5
|
-
export const test = base.extend(piwiFixtures)
|
|
6
|
-
export { expect }`,Nt=`// your test file
|
|
7
|
-
import { test, expect } from './fixtures'
|
|
8
|
-
|
|
9
|
-
test('homepage loads', async ({ page }) => {
|
|
10
|
-
await page.goto('/')
|
|
11
|
-
// network requests, web vitals, console errors, and ARIA snapshots
|
|
12
|
-
// are captured automatically and appear in the dashboard
|
|
13
|
-
})`,Vt=`// tests/fixtures.ts
|
|
14
|
-
import { test as base } from '@playwright/test'
|
|
15
|
-
import { extendPiwiFixtures } from '@piwitests/reporter'
|
|
16
|
-
|
|
17
|
-
export const test = extendPiwiFixtures(base)
|
|
18
|
-
export { expect } from '@playwright/test'`,At=Q({__name:"GetStartedWizard",setup(O){const w=Ce(),$=f(()=>!!w.public.authEnabled),v=J("http://localhost:3000");we(()=>{v.value=window.location.origin});const U=f(()=>$.value?`
|
|
19
|
-
apiKey: process.env.PIWI_API_KEY,`:""),T=f(()=>`import { defineConfig } from '@playwright/test'
|
|
20
|
-
|
|
21
|
-
export default defineConfig({
|
|
22
|
-
reporter: [
|
|
23
|
-
['list'],
|
|
24
|
-
['@piwitests/reporter', {
|
|
25
|
-
serverUrl: '${v.value}',
|
|
26
|
-
projectName: 'my-project',${U.value}
|
|
27
|
-
}],
|
|
28
|
-
],
|
|
29
|
-
use: {
|
|
30
|
-
trace: 'retain-on-failure',
|
|
31
|
-
},
|
|
32
|
-
})`),A=f(()=>`import { defineConfig } from '@playwright/test'
|
|
33
|
-
import PiwiDashboard from '@piwitests/reporter'
|
|
34
|
-
|
|
35
|
-
export default PiwiDashboard.wrapConfig(
|
|
36
|
-
defineConfig({
|
|
37
|
-
// your existing config
|
|
38
|
-
use: {
|
|
39
|
-
trace: 'retain-on-failure',
|
|
40
|
-
},
|
|
41
|
-
}),
|
|
42
|
-
{
|
|
43
|
-
serverUrl: '${v.value}',
|
|
44
|
-
projectName: 'my-project',${U.value}
|
|
45
|
-
},
|
|
46
|
-
)`),j=f(()=>{const a=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return $.value&&a.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),a.push({title:"Configure Playwright",description:"Add the reporter to your playwright.config.ts.",code:T.value,lang:"typescript"},{title:"Run your tests",description:"Results appear in the dashboard automatically. The project is created on first submit.",code:"npx playwright test",lang:"bash"}),a.map((s,x)=>({id:x+1,...s}))}),P=["zero","one","two","three","four","five","six"],b=f(()=>P[j.value.length]??String(j.value.length)),N=J(!1);return(a,s)=>{const x=X,g=We,V=$e,h=Z,S=He,z=Be,E=de;return n(),_(E,null,{header:u(()=>[e("div",ht,[e("div",vt,[l(x,{name:"i-lucide-rocket",class:"size-5 text-primary"})]),e("div",null,[e("h2",bt,[s[1]||(s[1]=m(" Get started in 60 seconds ",-1)),l(g,{topic:"home.get-started"})]),e("p",kt,"Send your first test run in "+c(t(b))+" steps",1)])])]),footer:u(()=>[e("div",It,[e("span",null,[s[18]||(s[18]=m("Need more options? See the ",-1)),l(z,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:u(()=>[...s[17]||(s[17]=[m("full reporter docs",-1)])]),_:1}),s[19]||(s[19]=m(".",-1))]),l(h,{to:t(Le)("demo/"),target:"_blank",variant:"ghost",size:"sm",color:"neutral","trailing-icon":"i-lucide-external-link"},{default:u(()=>[...s[20]||(s[20]=[m(" View demo with sample data ",-1)])]),_:1},8,["to"])])]),default:u(()=>[e("div",null,[(n(!0),d(D,null,W(t(j),(k,K)=>(n(),d("div",{key:k.id,class:"flex gap-4"},[e("div",Rt,[e("div",{class:F(["flex size-8 items-center justify-center rounded-full text-sm font-semibold",k.done?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-primary/10 text-primary"])},[k.done?(n(),_(x,{key:0,name:"i-lucide-check",class:"size-4"})):(n(),d("span",wt,c(k.id),1))],2),K<t(j).length-1?(n(),d("div",$t)):y("",!0)]),e("div",Ct,[e("div",Tt,[e("h3",Ft,c(k.title),1),k.done?(n(),_(V,{key:0,color:"success",variant:"subtle",size:"xs"},{default:u(()=>[...s[2]||(s[2]=[m("Done",-1)])]),_:1})):y("",!0)]),e("p",jt,c(k.description),1),k.action==="create-api-key"?(n(),_(h,{key:0,to:"/settings/users",icon:"i-lucide-key-round",size:"sm",variant:"soft"},{default:u(()=>[...s[3]||(s[3]=[m(" Create an API key ",-1)])]),_:1})):y("",!0),k.code?(n(),_(S,{key:1,code:k.code,lang:k.lang},null,8,["code","lang"])):y("",!0)])]))),128)),e("div",St,[e("button",{class:"flex items-center gap-2 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-primary dark:hover:text-primary transition-colors w-full text-left",onClick:s[0]||(s[0]=k=>N.value=!t(N))},[l(x,{name:"i-lucide-chevron-right",class:F(["size-4 transition-transform duration-200",t(N)?"rotate-90":""])},null,8,["class"]),s[4]||(s[4]=m(" Go further — simpler config & capture fixtures ",-1))]),t(N)?(n(),d("div",Pt,[e("div",null,[s[5]||(s[5]=e("h4",{class:"font-medium text-sm mb-1"},[m(" Simpler config with "),e("code",{class:"text-primary text-xs"},"wrapConfig")],-1)),s[6]||(s[6]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},[m(" Instead of manually adding the reporter array entry, "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"wrapConfig"),m(" auto-injects the reporter and chains the global setup in one call. It also registers the run on the dashboard "),e("em",null,"before"),m(" your "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"globalSetup"),m(" runs, so the dashboard shows an initializing state during setup. ")],-1)),l(S,{code:t(A),lang:"typescript"},null,8,["code"])]),e("div",null,[s[14]||(s[14]=e("h4",{class:"font-medium text-sm mb-1"},[m(" Capture fixtures — network, Web Vitals, console & locator healing with "),e("code",{class:"text-primary text-xs"},"piwiFixtures")],-1)),e("p",zt,[s[8]||(s[8]=m(" Extend your Playwright ",-1)),s[9]||(s[9]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"test",-1)),s[10]||(s[10]=m(" with ",-1)),s[11]||(s[11]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"piwiFixtures",-1)),s[12]||(s[12]=m(" to automatically capture network timing, browser Web Vitals, console errors, ARIA snapshots on failure, and the locator snapshots that power locator healing. See the ",-1)),l(z,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:u(()=>[...s[7]||(s[7]=[m("capture fixtures guide",-1)])]),_:1}),s[13]||(s[13]=m(". ",-1))]),s[15]||(s[15]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option A — extend your existing fixtures ",-1)),l(S,{code:Ut,lang:"typescript",class:"mb-3"}),l(S,{code:Nt,lang:"typescript",class:"mb-4"}),s[16]||(s[16]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option B — one-line extend ",-1)),l(S,{code:Vt,lang:"typescript"})])])):y("",!0)])])]),_:1})}}}),Et=Object.assign(At,{__name:"GetStartedWizard"}),Dt={key:0,class:"p-6"},Ot={key:1,class:"p-6 space-y-8","aria-busy":"true"},Bt={class:"grid grid-cols-1 xl:grid-cols-3 gap-6 items-start"},Lt={class:"xl:col-span-2 space-y-3"},Wt={class:"space-y-3"},Ht={key:2,class:"p-6 space-y-8"},Mt={key:1,class:"flex flex-wrap items-center gap-x-8 gap-y-3 text-sm border border-gray-200 dark:border-gray-700 rounded-xl px-6 py-4 bg-gray-50 dark:bg-gray-900/50"},Kt={class:"flex items-center gap-1.5"},Gt={class:"font-semibold tabular-nums"},Yt={class:"flex items-center gap-1.5"},qt={class:"flex items-center gap-1.5"},Jt={key:0,class:"flex items-center gap-1.5"},Qt={class:"font-semibold tabular-nums"},Xt={class:"flex items-center gap-1.5"},Zt={class:"font-semibold tabular-nums"},es={key:2,class:"grid grid-cols-1 xl:grid-cols-3 gap-6 items-start"},ts={class:"xl:col-span-2"},ss={class:"divide-y divide-gray-100 dark:divide-gray-800 text-sm"},ns={class:"flex-1 min-w-0"},rs={class:"font-medium truncate"},as={class:"text-xs text-gray-400"},os={class:"text-right tabular-nums shrink-0"},is={key:0,class:"text-xs text-gray-400"},ls={key:3,class:"text-center py-12 text-gray-500 dark:text-gray-400"},us={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4"},ds={class:"flex flex-col gap-3 h-full"},cs={class:"p-2 bg-primary/10 rounded-lg w-fit"},ms={class:"text-xs font-semibold uppercase tracking-wide text-primary mb-1"},ps={class:"font-semibold mb-1"},gs={class:"text-sm text-gray-600 dark:text-gray-400"},ae=6,Ks=Q({__name:"index",setup(O){Te({title:"Piwi Dashboard"});const{data:w,error:$,refresh:v,status:U}=re("/api/projects/overview",{lazy:!0,default:()=>[]},"$cnA6-rHww6"),{data:T,error:A,refresh:j}=re("/api/test-runs/recent",{lazy:!0},"$LEgADC56ri");Me(()=>Promise.all([v(),j()]));const P=f(()=>U.value==="pending"&&!w.value?.length),b=f(()=>$.value||A.value);function N(){v(),j()}const a=Ke("piwi-home-filters",{default:()=>({environments:[],fullRunsOnly:!0}),encode:i=>JSON.stringify(i),decode:i=>{try{return i?JSON.parse(i):{environments:[],fullRunsOnly:!0}}catch{return{environments:[],fullRunsOnly:!0}}}}),s=f(()=>{const i=new Set;for(const o of T.value??[])o.environment&&i.add(o.environment);for(const o of w.value??[])for(const R of o.recentRuns)R.environment&&i.add(R.environment);return[...i].sort()});function x(i){return a.value.environments.length===0?!0:!!i&&a.value.environments.includes(i)}const g=f(()=>{let i=T.value??[];return a.value.fullRunsOnly&&(i=i.filter(o=>o.isFullRun)),a.value.environments.length>0&&(i=i.filter(o=>x(o.environment))),i}),V=f(()=>{let i=w.value??[];return a.value.environments.length>0&&(i=i.map(o=>({...o,recentRuns:o.recentRuns.filter(R=>x(R.environment))})).filter(o=>o.recentRuns.length>0)),i}),h=f(()=>{const i=V.value,o=i.length,R=i.filter(I=>I.tendency==="failing").length,H=i.filter(I=>I.tendency==="flaky").length;let B=0,G=0;for(const I of i)I.latestFullRun&&(B+=I.latestFullRun.passedTests,G+=I.latestFullRun.totalTests);const Y=G>0?Math.round(B/G*100):null,te=Date.now()-1440*60*1e3,L=g.value.filter(I=>new Date(I.startTime).getTime()>te).length;return{totalProjects:o,failingNow:R,flakyNow:H,avgPassRate:Y,runs24h:L}}),S=new Set(["running","initialising","finalizing"]),z=J(!1),E=f(()=>[...g.value].sort((o,R)=>{const H=S.has(o.status)?0:1,B=S.has(R.status)?0:1;return H!==B?H-B:new Date(R.startTime).getTime()-new Date(o.startTime).getTime()})),k=f(()=>z.value?E.value:E.value.slice(0,ae)),K=f(()=>E.value.length>ae),r=f(()=>g.value.length>0),C=f(()=>(w.value?.length??0)>0),ee=f(()=>a.value.fullRunsOnly?(T.value??[]).filter(R=>x(R.environment)).filter(R=>!R.isFullRun).length:0);function ce(){a.value={...a.value,fullRunsOnly:!1}}function me(i){const o=M(i);return o>=90?"text-green-600 dark:text-green-400":o>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function pe(i){return S.has(i)?"border-l-blue-400":i==="passed"?"border-l-green-500":i==="failed"||i==="timedout"||i==="interrupted"?"border-l-red-500":"border-l-gray-300 dark:border-l-gray-600"}const ge=[{icon:"i-lucide-radio",tagline:"Watch your CI run live",title:"Live streaming",description:"Follow test execution in real time. Investigate failures while the suite is still running — no waiting for the CI job to finish."},{icon:"i-lucide-layers",tagline:"10 failures, 2 root causes",title:"Failure clustering",description:"Tests sharing the same error are grouped automatically. Triage one cluster instead of scrolling through unrelated failures."},{icon:"i-lucide-brain-circuit",tagline:"Diagnosis grounded in your code",title:"AI diagnosis",description:"AI analyzes failure clusters using your actual SCM diff, trace files, and run history — not a generic prompt."},{icon:"i-lucide-archive",tagline:"Every run, forever",title:"Permanent test intelligence",description:"Test results, traces, and HTML reports stored permanently. Compare runs, track flakiness trends, and never lose a CI result again."}];return(i,o)=>{const R=ke,H=Re,B=et,G=ze,Y=Z,te=Ie,L=Ue,I=Ne,q=X,fe=xt,ye=ie,_e=oe,xe=le,he=Et,ve=de,be=Pe;return n(),_(be,{id:"home"},{header:u(()=>[l(G,null,Fe({leading:u(()=>[l(R),l(H,{items:[{label:"Home",icon:"i-lucide-house",to:"/"}]})]),_:2},[t(C)?{name:"trailing",fn:u(()=>[l(B,{modelValue:t(a),"onUpdate:modelValue":o[0]||(o[0]=p=>se(a)?a.value=p:null),"available-environments":t(s)},null,8,["modelValue","available-environments"])]),key:"0"}:void 0]),1024)]),body:u(()=>[t(b)?(n(),d("div",Dt,[l(te,{text:`Couldn't load the dashboard: ${t(Oe)(t(b))}`},{action:u(()=>[l(Y,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:N},{default:u(()=>[...o[3]||(o[3]=[m(" Retry ",-1)])]),_:1})]),_:1},8,["text"])])):t(P)?(n(),d("div",Ot,[o[4]||(o[4]=e("span",{class:"sr-only",role:"status"},"Loading dashboard…",-1)),l(L,{class:"h-14 w-full rounded-xl"}),e("div",Bt,[e("div",Lt,[l(L,{class:"h-7 w-40"}),l(L,{class:"h-72 w-full rounded-lg"})]),e("div",Wt,[l(L,{class:"h-7 w-32"}),(n(),d(D,null,W(5,p=>l(L,{key:p,class:"h-12 w-full rounded-lg"})),64))])])])):(n(),d("div",Ht,[t(ee)>0?(n(),_(I,{key:0,icon:"i-lucide-info",color:"primary",variant:"subtle",title:t(ee)===1?"1 partial run is hidden":`${t(ee)} partial runs are hidden`,description:"The “Full runs only” filter hides runs that only cover part of the suite (e.g. a single spec or --grep).",actions:[{label:"Show them",color:"primary",variant:"solid",size:"xs",onClick:ce}]},null,8,["title","actions"])):y("",!0),t(C)?(n(),d("div",Mt,[e("div",Kt,[l(q,{name:"i-lucide-folder",class:"size-4 text-primary shrink-0"}),e("span",Gt,c(t(h).totalProjects),1),o[5]||(o[5]=e("span",{class:"text-gray-500"},"projects",-1))]),e("div",Yt,[e("div",{class:F(["w-2 h-2 rounded-full shrink-0",t(h).failingNow>0?"bg-red-500":"bg-green-500"])},null,2),e("span",{class:F(["font-semibold tabular-nums",t(h).failingNow>0?"text-red-600 dark:text-red-400":""])},c(t(h).failingNow),3),o[6]||(o[6]=e("span",{class:"text-gray-500"},"failing now",-1))]),e("div",qt,[e("div",{class:F(["w-2 h-2 rounded-full shrink-0",t(h).flakyNow>0?"bg-amber-400":"bg-gray-300 dark:bg-gray-600"])},null,2),e("span",{class:F(["font-semibold tabular-nums",t(h).flakyNow>0?"text-amber-600 dark:text-amber-400":""])},c(t(h).flakyNow),3),o[7]||(o[7]=e("span",{class:"text-gray-500"},"flaky",-1))]),t(h).avgPassRate!==null?(n(),d("div",Jt,[l(q,{name:"i-lucide-check-circle",class:"size-4 text-green-500 shrink-0"}),e("span",Qt,c(t(h).avgPassRate)+"%",1),o[8]||(o[8]=e("span",{class:"text-gray-500"},"avg pass rate",-1))])):y("",!0),e("div",Xt,[l(q,{name:"i-lucide-play-circle",class:"size-4 text-primary shrink-0"}),e("span",Zt,c(t(h).runs24h),1),o[9]||(o[9]=e("span",{class:"text-gray-500"},"runs today",-1))])])):y("",!0),t(C)||t(r)?(n(),d("div",es,[e("div",ts,[t(C)?(n(),_(fe,{key:0,projects:t(V)},null,8,["projects"])):y("",!0)]),t(r)?(n(),_(xe,{key:0,icon:"i-lucide-activity",title:"Recent activity"},{actions:u(()=>[t(K)&&!t(z)?(n(),_(Y,{key:0,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-down",onClick:o[1]||(o[1]=p=>z.value=!0)},{default:u(()=>[m(" Show all "+c(t(E).length),1)]),_:1})):t(z)?(n(),_(Y,{key:1,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-up",onClick:o[2]||(o[2]=p=>z.value=!1)},{default:u(()=>[...o[10]||(o[10]=[m(" Show less ",-1)])]),_:1})):y("",!0)]),default:u(()=>[e("div",ss,[(n(!0),d(D,null,W(t(k),p=>(n(),_(_e,{key:p.id,to:`/test-runs/${p.id}`,class:F(["flex items-center gap-3 py-3 pl-3 border-l-2 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors",pe(p.status)])},{default:u(()=>[l(ye,{status:p.status},null,8,["status"]),e("div",ns,[e("div",rs,c(p.projectLabel||p.projectName),1),e("div",as,"Run #"+c(p.id)+" · "+c(("formatRelativeTime"in i?i.formatRelativeTime:t(ne))(p.startTime)),1)]),e("div",os,[e("div",{class:F(me(p))},c(("passRate"in i?i.passRate:t(M))(p))+"%",3),p.duration?(n(),d("div",is,c(("formatDuration"in i?i.formatDuration:t(ue))(p.duration)),1)):y("",!0)])]),_:2},1032,["to","class"]))),128))])]),_:1})):y("",!0)])):y("",!0),t(C)&&!t(r)&&t(V).length===0?(n(),d("div",ls,[l(q,{name:"i-lucide-filter-x",class:"size-8 mx-auto mb-2 opacity-40"}),o[11]||(o[11]=e("p",null,"No runs match the current filters.",-1))])):y("",!0),t(C)?y("",!0):(n(),d(D,{key:4},[l(he),e("div",us,[(n(),d(D,null,W(ge,p=>l(ve,{key:p.title,class:"flex flex-col"},{default:u(()=>[e("div",ds,[e("div",cs,[l(q,{name:p.icon,class:"size-5 text-primary"},null,8,["name"])]),e("div",null,[e("p",ms,c(p.tagline),1),e("h3",ps,c(p.title),1),e("p",gs,c(p.description),1)])])]),_:2},1024)),64))])],64))]))]),_:1})}}});export{Ks 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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as Ss}from"./B32-7cBF.js";import{_ as Ds}from"./BY0AkhJh.js";import{b as je,K as kt,d as ge,L as Bt,w as $e,B as pe,k as e,o as n,f as k,g as s,j as l,_ as Te,c as i,i as o,m as p,t as c,q as S,F as Y,y as ie,v as Ne,x as at,l as G,M as It,N as Et,p as re,h as E,r as T,E as ws,O as Pt,n as $t,s as Le,P as Ct,D as Nt,I as js,u as Rs,a as As,e as Us,H as Vt,Q as zs,R as Fs}from"./B8fs6GU9.js";import{_ as Ms}from"./OG2n3p77.js";import{_ as Ke,a as Is}from"./wCQds5_f.js";import{_ as Re}from"./IdQR_Djw.js";import{_ as Lt}from"./PPFO8UVt.js";import{u as Es}from"./Bq2ZPvIH.js";import{u as Ce}from"./DAeYEeCC.js";import{_ as Vs}from"./nUsJV5qo.js";import{_ as Bs,a as Ps}from"./C9jjVEQU.js";import{_ as Kt}from"./o5WQ5Z7k.js";import{_ as Ot}from"./ETOCcsVw.js";import{_ as Ae}from"./DZLrAp2i.js";import{C as xt,w as qt,O as st,a as Ht,_ as Xt,u as Gt}from"./BW1UOxWn.js";import{N as Ns}from"./CU-OXXdh.js";import{_ as Ls}from"./CokbKVE6.js";import{_ as Ks}from"./C7RarFGi.js";import{_ as Os}from"./CHMpVLqo.js";import{_ as qs}from"./DFw8I2FL.js";import{_ as Hs}from"./CkpB9oBr.js";import{_ as Xs}from"./BkhdAGx0.js";import{_ as Gs}from"./CqA3gM8h.js";import{_ as Oe}from"./D4nLD93c.js";import{_ as ot}from"./B32ySRXg.js";import{_ as Qt}from"./BBJ9Pu3M.js";import{_ as Tt}from"./BgR7oL4p.js";import{f as St,a as Qs,c as Ys,g as V,e as Yt,p as nt,h as ke,i as Ze}from"./CvCF77E-.js";import{_ as Jt}from"./2PU-adwy.js";import{_ as Wt}from"./DKTDub7I.js";import{_ as Js}from"./DHVmXA9K.js";import{_ as Ws}from"./Cfk2_UCm.js";import{_ as Zs}from"./DNP5tTJo.js";import{_ as en}from"./DQpa8F03.js";import{_ as tn}from"./CNzoIhwN.js";import{_ as Dt}from"./CD-xwM9N.js";import{M as sn,D as ht,g as bt}from"./D7W_4Sqc.js";import{_ as nn}from"./BCK4f6Y3.js";import{u as an}from"./DI_-kFec.js";import{u as on}from"./O1A-LRgV.js";import"./BtJkQ3to.js";import"./3SnTawZW.js";import"./DWzdeQ3Z.js";import"./D1tZEdSi.js";import"./BC_Wu-fv.js";import"./YDWXnWou.js";import"./DVdOm5Bg.js";import"./4fB15L_7.js";import"./lRMjXqiA.js";import"./BGsuOpiq.js";import"./DiUGa0CT.js";import"./Surk4Lw-.js";import"./n7Htv9PJ.js";import"./CFn3w5jn.js";import"./CKZn0TUX.js";import"./B_80i5Ge.js";const ln=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],et=new Map,tt=new Map;function rn(z,w){const b=[{event:"run.failed",scenario:{title:`Test run failed — ${z}`,description:"3 of 12 tests failed on main — checkout › applies discount code +2 more",icon:"i-lucide-circle-x",color:"error"}},{event:"run.failed.default_branch",scenario:{title:`Test run failed on main — ${z}`,description:"2 of 12 tests failed · main — auth › logs in with valid credentials +1 more",icon:"i-lucide-circle-x",color:"error"}},{event:"cluster.new",scenario:{title:`New failure cluster — ${z}`,description:"TimeoutError: locator.click: Timeout 30000ms exceeded",icon:"i-lucide-layers",color:"warning"}},{event:"flakiness.spike",scenario:{title:`Flakiness spike — ${z}`,description:"3 tests became flaky (8.3% rate)",icon:"i-lucide-shuffle",color:"warning"}},{event:"perf.regression",scenario:{title:`Performance regression — ${z}`,description:"p90 duration increased by 42% vs last week",icon:"i-lucide-trending-down",color:"warning"}},{event:"run.finished",scenario:{title:`Test run recovered — ${z}`,description:"All 12 tests passed on main",icon:"i-lucide-circle-check",color:"success"}},{event:"diagnosis.completed",scenario:{title:`Diagnosis complete — ${z}`,description:"Root cause: test bug — confidence: high",icon:"i-lucide-sparkles",color:"info"}}],j=b.filter(h=>w.length===0||w.includes(h.event)).map(h=>h.scenario);return j.length===0?[b[0].scenario,b[b.length-1].scenario]:j}function cn(){if(!kt().public.demoMode)return null;const w=je();function b(h,g,u){j(h);const B=rn(g,u);tt.set(h,0);function R(){const F=(tt.get(h)??0)%B.length;tt.set(h,F+1);const D=B[F];w.add({title:D.title,description:D.description,icon:D.icon,color:D.color,duration:7e3});const v=25e3+Math.random()*1e4;et.set(h,setTimeout(R,v))}et.set(h,setTimeout(R,8e3))}function j(h){const g=et.get(h);g!==void 0&&(clearTimeout(g),et.delete(h)),tt.delete(h)}return{scheduleFor:b,cancelFor:j}}const un={key:0,class:"p-3 space-y-3"},dn={key:0,class:"text-xs text-gray-500"},mn={key:1,class:"text-xs text-gray-500"},pn={key:2,class:"text-xs text-gray-500"},gn={class:"space-y-1"},fn=["checked","onChange"],vn={key:1,class:"p-3 space-y-3"},yn={class:"flex items-center justify-between"},_n={class:"font-medium text-sm inline-flex items-center gap-1"},hn={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},bn={key:1,class:"text-xs text-muted text-center py-2"},xn={key:2,class:"space-y-1.5"},kn={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},$n={class:"space-y-1"},Cn=["value"],Tn={class:"flex gap-1.5 justify-end"},Sn={class:"flex-1 font-medium truncate"},Dn={key:3,class:"text-xs text-muted text-center py-1"},wn={key:4,class:"space-y-2 border-t border-default pt-2"},jn={class:"space-y-1"},Rn=["value"],An={class:"flex gap-1.5 justify-end"},Un=ge({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(z){let w,b;const j=z,h=kt(),g=h.public.demoMode,u=E(()=>h.public.authEnabled),{authState:B}=Bt(),R=E(()=>B.value.authenticated),F=je(),D=T(!1),v=g?cn():null,y=!u.value&&!g?Es():null,A=T("default"),_=E(()=>"Notification"in window);"Notification"in window&&(A.value=Notification.permission);const f=E(()=>y?.getProject(j.projectId).events??[]),M=E(()=>y?.isSubscribed(j.projectId)??!1);async function L(){!_.value||A.value!=="default"||(A.value=await Notification.requestPermission())}function x(I){return f.value.includes(I)}function $(I){y?.toggleEvent(j.projectId,I)}const d=g||u.value&&R.value,q=g?{server:!1}:{},{data:Z,refresh:O}=([w,b]=$e(()=>Ce(`/api/subscriptions?projectId=${j.projectId}`,{immediate:d,...q},"$5zp4moJ-7_")),w=await w,b(),w),P=E(()=>Z.value?.subscriptions??[]),_e=E(()=>P.value.length>0),{data:he}=([w,b]=$e(()=>Ce("/api/channels",{immediate:d,...q},"$vFApQ6eA2X")),w=await w,b(),w),m=E(()=>he.value?.channels??[]),K=T(!1),oe=T(void 0),ue=T(["run.failed"]),be=T(!1),fe=T(null),ce=T(void 0),ve=T([]),J=T(!1);function lt(I){fe.value=I,ce.value=I.channel.id,ve.value=[...I.events]}function rt(){fe.value=null}async function Ue(){if(!(!fe.value||!ce.value||ve.value.length===0)){J.value=!0;try{await $fetch(`/api/subscriptions/${fe.value.id}`,{method:"PATCH",body:{channelId:ce.value,events:ve.value}}),await O(),fe.value=null}catch(I){F.add({title:"Update failed",description:String(I?.message??I),color:"error"})}finally{J.value=!1}}}const qe=E(()=>m.value.map(I=>({label:I.type==="personal_email"?`${I.name} (${I.config.address})`:I.name,value:I.id}))),W=ln.map(I=>({label:I.replace(/\./g," › "),value:I}));pe(D,I=>{I?(d&&O(),m.value.length>0&&!oe.value&&(oe.value=m.value[0].id)):(K.value=!1,fe.value=null)});async function ye(){if(!(!oe.value||ue.value.length===0)){be.value=!0;try{await $fetch("/api/subscriptions",{method:"POST",body:{channelId:oe.value,projectId:j.projectId,events:ue.value,mode:"realtime"}}),await O(),K.value=!1,F.add({title:"Subscribed",color:"success"}),g&&v?.scheduleFor(j.projectId,j.projectLabel||"this project",ue.value)}catch(I){F.add({title:"Subscribe failed",description:String(I?.message??I),color:"error"})}finally{be.value=!1}}}async function ze(I){try{await $fetch(`/api/subscriptions/${I}`,{method:"DELETE"}),await O(),F.add({title:"Unsubscribed",color:"success"}),g&&P.value.length===0&&v?.cancelFor(j.projectId)}catch(C){F.add({title:"Failed",description:String(C?.message??C),color:"error"})}}async function it(I){const C=I.mutedUntil&&new Date(I.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${I.id}`,{method:"PATCH",body:{mutedUntil:C?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await O()}catch(ee){F.add({title:"Failed",description:String(ee?.message??ee),color:"error"})}}function Fe(I){return I.mutedUntil&&new Date(I.mutedUntil)>new Date}function Me(I){return I==="personal_email"?"i-lucide-user-round":I==="email"?"i-lucide-mail":I==="slack"?"i-lucide-slack":"i-lucide-webhook"}const ct=E(()=>g||u.value&&R.value||y!=null),Ie=E(()=>g||u.value?_e.value:M.value);return(I,C)=>{const ee=Te,He=Ms,Ee=Ke,Ve=Ne,ut=at,Xe=Re,Se=Lt,Be=ws;return e(ct)?(n(),k(Be,{key:0,open:e(D),"onUpdate:open":C[6]||(C[6]=N=>G(D)?D.value=N:null),ui:{content:"w-72"}},{content:s(()=>[e(y)?(n(),i("div",un,[C[9]||(C[9]=o("div",{class:"flex items-center justify-between"},[o("span",{class:"font-medium text-sm"},"Browser notifications")],-1)),e(_)&&e(A)==="default"?(n(),i("p",dn,[l(ee,{variant:"link",size:"xs",class:"p-0",onClick:L},{default:s(()=>[...C[7]||(C[7]=[p(" Allow notifications ",-1)])]),_:1}),C[8]||(C[8]=p(" "+c(" ")+"in your browser to get alerts for this project. ",-1))])):e(_)&&e(A)==="denied"?(n(),i("p",mn," Notifications are blocked. Check your browser settings to allow them. ")):e(_)?S("",!0):(n(),i("p",pn,"Notifications are not supported in this browser.")),e(_)&&e(A)==="granted"?(n(),i(Y,{key:3},[l(He),o("div",gn,[(n(!0),i(Y,null,ie(e(W),N=>(n(),i("label",{key:N.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[o("input",{type:"checkbox",checked:x(N.value),class:"accent-primary size-3",onChange:X=>$(N.value)},null,40,fn),p(" "+c(N.label),1)]))),128))])],64)):S("",!0)])):(n(),i("div",vn,[o("div",yn,[o("span",_n,[C[10]||(C[10]=p(" Notifications ",-1)),l(Ee,{topic:"notifications.subscribe"})]),e(K)?S("",!0):(n(),k(ee,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(m).length===0,onClick:C[0]||(C[0]=N=>K.value=!0)},{default:s(()=>[...C[11]||(C[11]=[p(" Add ",-1)])]),_:1},8,["disabled"]))]),e(g)?(n(),i("div",hn,[l(Ve,{name:"i-lucide-sparkles",class:"size-3 inline-block mr-1 text-primary"}),C[12]||(C[12]=p(" Demo — notifications will appear as toasts in ~8 s. ",-1))])):e(m).length===0?(n(),i("div",bn,[C[14]||(C[14]=p(" No channels configured.",-1)),C[15]||(C[15]=o("br",null,null,-1)),l(ut,{to:"/settings/notifications",class:"text-primary underline"},{default:s(()=>[...C[13]||(C[13]=[p("Add one in Settings",-1)])]),_:1})])):S("",!0),e(P).length>0?(n(),i("div",xn,[(n(!0),i(Y,null,ie(e(P),N=>(n(),i(Y,{key:N.id},[e(fe)?.id===N.id?(n(),i("div",kn,[l(Se,{label:"Channel",size:"xs"},{default:s(()=>[l(Xe,{modelValue:e(ce),"onUpdate:modelValue":C[1]||(C[1]=X=>G(ce)?ce.value=X:null),items:e(qe),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),l(Se,{label:"Events",size:"xs"},{default:s(()=>[o("div",$n,[(n(!0),i(Y,null,ie(e(W),X=>(n(),i("label",{key:X.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[It(o("input",{type:"checkbox",value:X.value,"onUpdate:modelValue":C[2]||(C[2]=dt=>G(ve)?ve.value=dt:null),class:"accent-primary size-3"},null,8,Cn),[[Et,e(ve)]]),p(" "+c(X.label),1)]))),128))])]),_:1}),o("div",Tn,[l(ee,{size:"xs",color:"neutral",variant:"ghost",onClick:rt},{default:s(()=>[...C[16]||(C[16]=[p("Cancel",-1)])]),_:1}),l(ee,{size:"xs",color:"primary",loading:e(J),disabled:!e(ce)||e(ve).length===0,onClick:Ue},{default:s(()=>[...C[17]||(C[17]=[p(" Save ",-1)])]),_:1},8,["loading","disabled"])])])):(n(),i("div",{key:1,class:re(["flex items-center gap-2 rounded px-2 py-1.5 text-xs",Fe(N)?"opacity-60":""])},[l(Ve,{name:Me(N.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),o("span",Sn,c(N.channel.name),1),l(ee,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:X=>lt(N)},null,8,["onClick"]),l(ee,{icon:Fe(N)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:Fe(N)?"Unmute":"Mute 7 days",onClick:X=>it(N)},null,8,["icon","title","onClick"]),l(ee,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:X=>ze(N.id)},null,8,["onClick"])],2))],64))),128))])):!e(K)&&e(m).length>0?(n(),i("div",Dn," Not subscribed to this project. ")):S("",!0),e(K)?(n(),i("div",wn,[l(Se,{label:"Channel",size:"xs"},{default:s(()=>[l(Xe,{modelValue:e(oe),"onUpdate:modelValue":C[3]||(C[3]=N=>G(oe)?oe.value=N:null),items:e(qe),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),l(Se,{label:"Events",size:"xs"},{default:s(()=>[o("div",jn,[(n(!0),i(Y,null,ie(e(W),N=>(n(),i("label",{key:N.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[It(o("input",{type:"checkbox",value:N.value,"onUpdate:modelValue":C[4]||(C[4]=X=>G(ue)?ue.value=X:null),class:"accent-primary size-3"},null,8,Rn),[[Et,e(ue)]]),p(" "+c(N.label),1)]))),128))])]),_:1}),o("div",An,[l(ee,{size:"xs",color:"neutral",variant:"ghost",onClick:C[5]||(C[5]=N=>K.value=!1)},{default:s(()=>[...C[18]||(C[18]=[p("Cancel",-1)])]),_:1}),l(ee,{size:"xs",color:"primary",loading:e(be),disabled:!e(oe)||e(ue).length===0,onClick:ye},{default:s(()=>[...C[19]||(C[19]=[p(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):S("",!0)]))]),default:s(()=>[l(ee,{icon:e(Ie)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Ie)?"primary":"neutral",variant:e(Ie)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):S("",!0)}}}),zn=Object.assign(Un,{__name:"SubscribeBell"}),Fn={class:"w-full relative"},Mn={key:0},In={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},En={class:"font-semibold mb-1"},Vn={class:"capitalize mb-1"},Bn={class:"space-y-0.5"},Pn={class:"font-medium mt-1"},Nn=ge({__name:"TestRunsChart",props:{testRuns:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(z,{emit:w}){const b=z,j=w,h=E(()=>b.markers),g=E(()=>!b.testRuns||b.testRuns.length===0?[]:[...b.testRuns].sort((d,q)=>new Date(d.startTime).getTime()-new Date(q.startTime).getTime()).slice(-30).map(d=>({id:d.id,date:new Date(d.startTime),passed:d.passedTests||0,failed:d.failedTests||0,skipped:d.skippedTests||0,flaky:d.flakyTests||0,total:d.totalTests||0,status:d.status}))),u=$=>$.date,B=$=>$.passed,R=$=>$.failed,F=$=>$.skipped,D=$=>$.flaky,v=["rgb(34, 197, 94)","rgb(239, 68, 68)","rgb(245, 158, 11)","rgb(147, 51, 234)"],y=T(null),{tooltipData:A,tooltipPos:_,markerTooltip:f,markerTooltipPos:M,onRenderComplete:L}=Gt(y,g,{x:$=>$.date,series:[{y:$=>$.passed,color:v[0]},{y:$=>$.failed,color:v[1]},{y:$=>$.skipped,color:v[2]},{y:$=>$.flaky,color:v[3]}],onClick:$=>$t(`/test-runs/${$.id}`),markers:h,onMarkerClick:$=>j("marker-click",$.id)}),x=[{color:v[0],label:"Passed"},{color:v[1],label:"Failed"},{color:v[2],label:"Skipped"},{color:v[3],label:"Flaky"}];return($,d)=>{const q=Ot,Z=Ae,O=Xt;return n(),i("div",Fn,[e(g).length>0?(n(),i("div",Mn,[l(e(Ht),{ref_key:"xyContainerRef",ref:y,data:e(g),height:z.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(L)},{default:s(()=>[l(e(Ns),{x:u,y:[B,R,F,D],color:v,"curve-type":e(xt).MonotoneX},null,8,["y","curve-type"]),l(e(qt),{x:u,y:[B,R,F,D],color:v,"curve-type":e(xt).MonotoneX,"line-width":2},null,8,["y","curve-type"]),l(e(st),{type:"x","tick-format":P=>new Date(P).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),l(e(st),{type:"y",label:"Tests","tick-format":P=>P.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(A)?(n(),i("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-[260px]",style:Pt({left:`${e(_).x}px`,top:`${e(_).y}px`})},[o("div",In,[o("div",En,c(new Date(e(A).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),o("div",Vn,"Status: "+c(e(A).status),1),o("div",Bn,[o("div",null,[d[0]||(d[0]=o("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),p(" Passed: "+c(e(A).passed),1)]),o("div",null,[d[1]||(d[1]=o("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),p(" Failed: "+c(e(A).failed),1)]),o("div",null,[d[2]||(d[2]=o("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),p(" Skipped: "+c(e(A).skipped),1)]),o("div",null,[d[3]||(d[3]=o("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),p(" Flaky: "+c(e(A).flaky),1)]),o("div",Pn,"Total: "+c(e(A).total),1)]),d[4]||(d[4]=o("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):S("",!0),l(q,{marker:e(f),pos:e(M)},null,8,["marker","pos"])])):(n(),k(Z,{key:1,text:"No test run data available to display chart"})),l(O,{items:x})])}}}),Ln=Object.assign(Nn,{__name:"TestRunsChart"}),Kn={class:"space-y-3"},On={class:"min-w-0 space-y-1"},qn={class:"flex items-center gap-2 flex-wrap text-sm"},Hn={key:0,class:"text-gray-500"},Xn=["title"],Gn=["title"],Qn={key:0,class:"text-xs text-gray-500 italic"},Yn={class:"flex items-center gap-2 shrink-0"},Jn=ge({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(z,{emit:w}){const b=z,j=w,h=je(),g=T([]),u=T(null);async function B(){try{g.value=await $fetch(`/api/projects/${b.projectId}/cluster-merge-suggestions`)}catch{g.value=[]}}pe(()=>b.projectId,B,{immediate:!0});async function R(D,v){u.value=D;try{await $fetch(`/api/cluster-merge-suggestions/${D}/${v}`,{method:"POST"}),h.add({title:v==="approve"?"Clusters merged":"Suggestion dismissed",color:"success"}),await B(),v==="approve"&&j("merged")}catch(y){h.add({title:"Action failed",description:String(y?.message??y),color:"error"})}finally{u.value=null}}const F=D=>D==null?"":`${Math.round(D*100)}% similar`;return(D,v)=>{const y=Le,A=Te,_=Qt;return e(g).length?(n(),k(_,{key:0,icon:"i-lucide-git-merge",title:"Suggested merges",count:e(g).length,class:"mb-4"},{subtitle:s(()=>[...v[0]||(v[0]=[p(" Likely-duplicate clusters found by semantic analysis. Approving merges them into the older cluster. ",-1)])]),default:s(()=>[o("div",Kn,[(n(!0),i(Y,null,ie(e(g),f=>(n(),i("div",{key:f.id,class:"rounded-lg border border-default p-3 flex items-start justify-between gap-4"},[o("div",On,[o("div",qn,[l(y,{color:f.method==="llm"?"primary":"neutral",variant:"subtle",size:"sm"},{default:s(()=>[p(c(f.method==="llm"?`AI · ${f.llmConfidence??""}`:"similarity"),1)]),_:2},1032,["color"]),F(f.score)?(n(),i("span",Hn,c(F(f.score)),1)):S("",!0)]),o("p",{class:"text-sm truncate",title:f.clusterA?.signature||""},[v[1]||(v[1]=o("span",{class:"text-gray-400"},"A:",-1)),p(" "+c(f.clusterA?.signature||`#${f.id}`),1)],8,Xn),o("p",{class:"text-sm truncate",title:f.clusterB?.signature||""},[v[2]||(v[2]=o("span",{class:"text-gray-400"},"B:",-1)),p(" "+c(f.clusterB?.signature||""),1)],8,Gn),f.llmReason?(n(),i("p",Qn,c(f.llmReason),1)):S("",!0)]),o("div",Yn,[l(A,{size:"sm",color:"primary",icon:"i-lucide-git-merge",loading:e(u)===f.id,onClick:M=>R(f.id,"approve")},{default:s(()=>[...v[3]||(v[3]=[p(" Merge ",-1)])]),_:1},8,["loading","onClick"]),l(A,{size:"sm",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:e(u)===f.id,onClick:M=>R(f.id,"reject")},{default:s(()=>[...v[4]||(v[4]=[p(" Dismiss ",-1)])]),_:1},8,["disabled","onClick"])])]))),128))])]),_:1},8,["count"])):S("",!0)}}}),Wn=Object.assign(Jn,{__name:"ClusterMergeSuggestions"}),Zn={class:"flex items-center justify-between"},ea={class:"text-sm text-gray-500 inline-flex items-center gap-1"},ta={class:"min-w-0 space-y-0.5"},sa={key:0,class:"text-xs text-gray-500 italic truncate"},na={key:1,class:"text-gray-400 text-xs"},aa={class:"text-sm tabular-nums"},oa={class:"text-sm tabular-nums"},la={key:1,class:"text-gray-400 text-xs"},ra={class:"text-sm text-gray-500 whitespace-nowrap"},ia={key:0,class:"ml-1 text-xs text-gray-400"},ca={class:"flex justify-end"},ua=ge({__name:"FailureClustersList",props:{projectId:{}},async setup(z){let w,b;const j=z,h=T(void 0),{data:g,pending:u}=([w,b]=$e(()=>Ce(()=>{const R=new URLSearchParams;h.value&&R.set("status",h.value);const F=R.toString();return`/api/projects/${j.projectId}/failure-clusters${F?`?${F}`:""}`},{lazy:!0,server:!1,watch:[h]},"$f7pDU1t-lL")),w=await w,b(),w),B=[{accessorKey:"signature",header:V("Signature")},{accessorKey:"errorType",header:V("Type")},{accessorKey:"status",header:V("Status")},{accessorKey:"affectedTests",header:V("Tests")},{accessorKey:"occurrences",header:V("Occurrences")},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"lastSeenAt",header:V("Last seen")},{id:"actions",header:"Actions"}];return(R,F)=>{const D=Ke,v=Re,y=at,A=Le,_=Ne,f=Te,M=Oe,L=Tt,x=Ae,$=ot;return n(),k($,null,{header:s(()=>[o("div",Zn,[o("p",ea,[F[1]||(F[1]=p(" Ongoing failure signatures grouped by normalized error. ",-1)),l(D,{topic:"cluster.concept"})]),l(v,{modelValue:e(h),"onUpdate:modelValue":F[0]||(F[0]=d=>G(h)?h.value=d:null),items:[{label:"All",value:void 0},{label:"Open",value:"open"},{label:"Resolved",value:"resolved"},{label:"Ignored",value:"ignored"}],size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:s(()=>[l(L,{"min-width":"48rem",bleed:!1},{default:s(()=>[l(M,{data:e(g)??[],columns:B,loading:e(u)},{"actions-header":s(()=>[...F[2]||(F[2]=[o("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":s(({row:d})=>[o("div",ta,[l(y,{to:`/failure-clusters/${d.original.id}`,class:re(["text-sm text-primary hover:underline truncate block",d.original.title?"":"font-mono"]),title:d.original.signature},{default:s(()=>[p(c(d.original.title||d.original.signature),1)]),_:2},1032,["to","class","title"]),d.original.triageNote?(n(),i("p",sa,c(d.original.triageNote),1)):S("",!0)])]),"errorType-cell":s(({row:d})=>[d.original.errorType?(n(),k(A,{key:0,color:("clusterErrorTypeColor"in R?R.clusterErrorTypeColor:e(Ys))(d.original.errorType),variant:"subtle",size:"sm"},{default:s(()=>[p(c(d.original.errorType),1)]),_:2},1032,["color"])):(n(),i("span",na,"—"))]),"status-cell":s(({row:d})=>[l(A,{color:("clusterStatusColor"in R?R.clusterStatusColor:e(Qs))(d.original.status),variant:"subtle",size:"sm"},{default:s(()=>[p(c(d.original.status),1)]),_:2},1032,["color"])]),"affectedTests-cell":s(({row:d})=>[o("span",aa,c(d.original.affectedTests),1)]),"occurrences-cell":s(({row:d})=>[o("span",oa,c(d.original.occurrences),1)]),"diagnosis-cell":s(({row:d})=>[d.original.diagnosis?.status==="completed"&&d.original.diagnosis.category?(n(),k(A,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:s(()=>[l(_,{name:"i-lucide-sparkles",class:"size-3"}),p(" "+c(d.original.diagnosis.category),1)]),_:2},1024)):(n(),i("span",la,"—"))]),"lastSeenAt-cell":s(({row:d})=>[o("div",ra,[l(y,{to:`/test-runs/${d.original.lastSeenRunId}`,class:"text-primary hover:underline"},{default:s(()=>[p(" run #"+c(d.original.lastSeenRunId),1)]),_:2},1032,["to"]),d.original.lastSeenAt?(n(),i("span",ia," ("+c(("formatRelativeTime"in R?R.formatRelativeTime:e(St))(d.original.lastSeenAt))+") ",1)):S("",!0)])]),"actions-cell":s(({row:d})=>[o("div",ca,[l(f,{to:`/failure-clusters/${d.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:s(()=>[...F[3]||(F[3]=[p(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(u)&&e(g)&&e(g).length===0?(n(),k(x,{key:0,text:"No failure clusters recorded for this project.",padded:!1,class:"py-4"})):S("",!0)]),_:1})}}}),da=Object.assign(ua,{__name:"FailureClustersList"}),ma={class:"flex items-center justify-between"},pa={class:"flex items-center gap-3"},ga={class:"text-sm text-gray-500 inline-flex items-center gap-1"},fa={class:"flex items-center gap-1.5"},va={class:"min-w-0 space-y-0.5"},ya={class:"flex items-center gap-2"},_a={class:"text-sm tabular-nums"},ha={class:"text-sm tabular-nums"},ba={key:1,class:"text-gray-400 text-xs"},xa={key:1,class:"text-gray-400 text-xs"},ka={key:1,class:"text-gray-400 text-xs"},$a={key:0,class:"text-sm text-gray-500"},Ca={key:1,class:"text-gray-400 text-xs"},Ta={class:"flex justify-end"},Sa={key:0,class:"text-sm text-gray-500 py-4 text-center"},Da=ge({__name:"FlakyTestsList",props:{projectId:{},environment:{},projectName:{}},async setup(z){let w,b;const j=z,h=T(50),g=T([]),{data:u,pending:B}=([w,b]=$e(()=>Ce(()=>{const _=new URLSearchParams({runs:String(h.value)});return j.environment&&_.set("environment",j.environment),`/api/projects/${j.projectId}/flaky-tests?${_.toString()}`},{lazy:!0,server:!1,watch:[h,()=>j.environment]},"$qKoEnbecbI")),w=await w,b(),w),R=E(()=>g.value.length===0?u.value??[]:(u.value??[]).filter(_=>g.value.includes(_.rootCause??"")));function F(_){return _>=60?"error":_>=30?"warning":"neutral"}function D(_){switch(_){case"timing":return"amber";case"network":return"red";case"assertion":return"blue";case"environment":return"purple";default:return"gray"}}function v(_){g.value.indexOf(_)>=0?g.value=g.value.filter(M=>M!==_):g.value=[...g.value,_]}const y=[{label:"Timing",value:"timing"},{label:"Network",value:"network"},{label:"Assertion",value:"assertion"},{label:"Environment",value:"environment"},{label:"Other",value:"other"}],A=[{accessorKey:"title",header:V("Test")},{accessorKey:"impact",header:V("Impact")},{accessorKey:"score",header:V("Score")},{accessorKey:"failureRate",header:V("Failure rate")},{accessorKey:"retryPassRuns",header:V("Retry passes")},{accessorKey:"alternations",header:V("Flips")},{accessorKey:"rootCause",header:"Root cause"},{accessorKey:"lastFlakeAt",header:V("Last flake")},{id:"actions",header:"Actions"}];return(_,f)=>{const M=Ke,L=Ne,x=Le,$=Te,d=Re,q=at,Z=Jt,O=Kt,P=Oe,_e=Tt,he=ot;return n(),k(he,null,{header:s(()=>[o("div",ma,[o("div",pa,[o("p",ga,[f[1]||(f[1]=p(" Tests that fail intermittently — detected by retry passes and status alternations ",-1)),l(M,{topic:"project.flaky-tests"})]),z.environment?(n(),k(x,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:s(()=>[l(L,{name:"i-lucide-layers",class:"size-3"}),p(" "+c(z.environment),1)]),_:1})):S("",!0),o("div",fa,[(n(),i(Y,null,ie(y,m=>l($,{key:m.value,size:"xs",variant:e(g).includes(m.value)?"solid":"outline",color:(e(g).includes(m.value),"neutral"),onClick:K=>v(m.value)},{default:s(()=>[p(c(m.label),1)]),_:2},1032,["variant","color","onClick"])),64))])]),l(d,{modelValue:e(h),"onUpdate:modelValue":f[0]||(f[0]=m=>G(h)?h.value=m:null),items:[{label:"Last 20 runs",value:20},{label:"Last 50 runs",value:50},{label:"Last 100 runs",value:100}],size:"xs",class:"w-36"},null,8,["modelValue"])])]),default:s(()=>[l(_e,{"min-width":"52rem",bleed:!1},{default:s(()=>[l(P,{data:e(R),columns:A,loading:e(B),sticky:"",class:"max-h-[32rem]"},{"actions-header":s(()=>[...f[2]||(f[2]=[o("div",{class:"text-right"},"Actions",-1)])]),"title-cell":s(({row:m})=>[o("div",va,[l(q,{to:`/test-run-cases/${m.original.latestRunsCaseId}`,class:"text-sm font-medium text-primary hover:underline truncate block",title:m.original.title},{default:s(()=>[p(c(m.original.title),1)]),_:2},1032,["to","title"]),l(Z,{"file-path":m.original.filePath,"project-key":z.projectId,"project-name":z.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])])]),"impact-cell":s(({row:m})=>[o("div",ya,[o("span",{class:re(["inline-block w-2 h-2 rounded-full shrink-0",{"bg-red-500":m.original.wastedCiMinutes>=30,"bg-amber-500":m.original.wastedCiMinutes>=5&&m.original.wastedCiMinutes<30,"bg-green-500":m.original.wastedCiMinutes>=0&&m.original.wastedCiMinutes<5}])},null,2),o("span",_a,c(Math.round(m.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":s(({row:m})=>[l(x,{color:F(m.original.score),variant:"subtle",size:"sm"},{default:s(()=>[p(c(m.original.score),1)]),_:2},1032,["color"])]),"failureRate-cell":s(({row:m})=>[o("span",ha,c(Math.round(m.original.failureRate*100))+"%",1)]),"retryPassRuns-cell":s(({row:m})=>[m.original.retryPassRuns?(n(),k(x,{key:0,color:"warning",variant:"outline",size:"sm"},{default:s(()=>[p(c(m.original.retryPassRuns)+" run"+c(m.original.retryPassRuns===1?"":"s"),1)]),_:2},1024)):(n(),i("span",ba,"—"))]),"alternations-cell":s(({row:m})=>[m.original.alternations>=2?(n(),k(x,{key:0,color:"neutral",variant:"outline",size:"sm"},{default:s(()=>[p(c(m.original.alternations),1)]),_:2},1024)):(n(),i("span",xa,"—"))]),"rootCause-cell":s(({row:m})=>[m.original.rootCause?(n(),k(O,{key:0,text:m.original.rootCause,color:D(m.original.rootCause)},null,8,["text","color"])):(n(),i("span",ka,"—"))]),"lastFlakeAt-cell":s(({row:m})=>[m.original.lastFlakeAt?(n(),i("span",$a,c(("formatRelativeTime"in _?_.formatRelativeTime:e(St))(m.original.lastFlakeAt)),1)):(n(),i("span",Ca,"—"))]),"actions-cell":s(({row:m})=>[o("div",Ta,[l($,{to:`/test-run-cases/${m.original.latestRunsCaseId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:s(()=>[...f[3]||(f[3]=[p(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(B)&&e(R).length===0?(n(),i("p",Sa," No flaky tests detected in the last "+c(e(h))+" runs. ",1)):S("",!0)]),_:1})}}}),wa=Object.assign(Da,{__name:"FlakyTestsList"}),ja={class:"w-full relative"},Ra={key:0},Aa={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ua={class:"font-semibold mb-1"},za={class:"capitalize mb-1"},Fa={class:"space-y-0.5"},Ma={class:"mt-1"},Ia={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},Ea=ge({__name:"PerformanceTrendChart",props:{data:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(z,{emit:w}){const b=z,j=w,h=E(()=>b.markers),g=E(()=>!b.data||b.data.length===0?[]:b.data.map(x=>({id:x.id,date:new Date(x.startTime),duration:x.duration?Math.round(x.duration/1e3):null,avgTestDuration:x.avgTestDuration?Math.round(x.avgTestDuration/1e3):null,p90TestDuration:x.p90TestDuration?Math.round(x.p90TestDuration/1e3):null,commit:x.commit?x.commit.substring(0,7):null,status:x.status,totalTests:x.totalTests}))),u=x=>x.date,B=x=>x.duration??void 0,R=x=>x.avgTestDuration??void 0,F=x=>x.p90TestDuration??void 0,D=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],v=T(null),{tooltipData:y,tooltipPos:A,markerTooltip:_,markerTooltipPos:f,onRenderComplete:M}=Gt(v,g,{x:x=>x.date,series:[{y:x=>x.duration,color:D[0]},{y:x=>x.avgTestDuration,color:D[1]},{y:x=>x.p90TestDuration,color:D[2]}],onClick:x=>$t(`/test-runs/${x.id}`),markers:h,onMarkerClick:x=>j("marker-click",x.id)}),L=[{color:D[0],label:"Total Duration"},{color:D[1],label:"Avg Test Duration"},{color:D[2],label:"P90 Test Duration"}];return(x,$)=>{const d=Ot,q=Ae,Z=Xt;return n(),i("div",ja,[e(g).length>0?(n(),i("div",Ra,[l(e(Ht),{ref_key:"xyContainerRef",ref:v,data:e(g),height:z.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(M)},{default:s(()=>[l(e(qt),{x:u,y:[B,R,F],color:D,"curve-type":e(xt).MonotoneX,"line-width":2},null,8,["y","curve-type"]),l(e(st),{type:"x","tick-format":O=>new Date(O).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),l(e(st),{type:"y",label:"Duration (s)","tick-format":O=>`${O}s`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(y)?(n(),i("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-[260px]",style:Pt({left:`${e(A).x}px`,top:`${e(A).y}px`})},[o("div",Aa,[o("div",Ua,c(new Date(e(y).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),o("div",za,"Status: "+c(e(y).status),1),o("div",Fa,[o("div",null,[$[0]||($[0]=o("span",{class:"text-blue-500 dark:text-blue-400"},"●",-1)),p(" Total: "+c(e(y).duration??"-")+"s ",1)]),o("div",null,[$[1]||($[1]=o("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),p(" Avg: "+c(e(y).avgTestDuration??"-")+"s ",1)]),o("div",null,[$[2]||($[2]=o("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),p(" P90: "+c(e(y).p90TestDuration??"-")+"s ",1)]),o("div",Ma,"Tests: "+c(e(y).totalTests),1),e(y).commit?(n(),i("div",Ia," Commit: "+c(e(y).commit),1)):S("",!0)]),$[3]||($[3]=o("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):S("",!0),l(d,{marker:e(_),pos:e(f)},null,8,["marker","pos"])])):(n(),k(q,{key:1,text:"No performance data available to display chart"})),l(Z,{items:L})])}}}),Va=Object.assign(Ea,{__name:"PerformanceTrendChart"}),Ba={class:"flex items-center justify-between"},Pa={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Na={class:"truncate font-mono text-xs"},La={class:"tabular-nums"},Ka={class:"tabular-nums text-gray-500"},Oa={class:"tabular-nums text-gray-500"},qa=ge({__name:"SpecHealthTable",props:{projectId:{}},async setup(z){let w,b;const j=z,h=T(30),{data:g,pending:u}=([w,b]=$e(()=>Ce(()=>`/api/projects/${j.projectId}/spec-health?days=${h.value}`,{lazy:!0,server:!1,watch:[h]},"$QL0nEFEG1b")),w=await w,b(),w),B=E(()=>g.value?.specs??[]);function R(_){return _>=.9?"bg-green-500":_>=.7?"bg-amber-500":_>0?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function F(_){return _>=.9?"text-green-600 dark:text-green-400":_>=.7?"text-amber-600 dark:text-amber-400":_>0?"text-red-600 dark:text-red-400":"text-gray-500"}function D(_){return`${Math.round(_*100)}%`}function v(_){return _<1e3?`${_}ms`:`${(_/1e3).toFixed(1)}s`}const y=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],A=[{accessorKey:"prefix",header:V("Spec prefix")},{accessorKey:"passRate",header:V("Pass rate")},{accessorKey:"flakyRate",header:V("Flaky")},{accessorKey:"failureCount",header:V("Failures")},{accessorKey:"testCount",header:V("Tests")},{accessorKey:"avgDuration",header:V("Avg time")}];return(_,f)=>{const M=Ke,L=Re,x=Wt,$=Ae,d=at,q=Oe,Z=Tt,O=ot;return n(),k(O,null,{header:s(()=>[o("div",Ba,[o("p",Pa,[f[1]||(f[1]=p(" Spec-file health overview — pass rate, flaky rate, and failure count per spec prefix ",-1)),l(M,{topic:"project.spec-health"})]),l(L,{modelValue:e(h),"onUpdate:modelValue":f[0]||(f[0]=P=>G(h)?h.value=P:null),items:y,size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:s(()=>[e(u)?(n(),k(x,{key:0})):e(B).length===0?(n(),k($,{key:1,text:"No data",description:"No spec health data available for the selected period."})):(n(),k(Z,{key:2,"min-width":"46rem",bleed:!1},{default:s(()=>[l(q,{data:e(B),columns:A,sticky:"",class:"max-h-[32rem]"},{"prefix-cell":s(({row:P})=>[l(d,{to:`/projects/${z.projectId}/test-cases?file=${encodeURIComponent(P.original.prefix)}`,class:"flex items-center gap-2 min-w-0 text-primary hover:underline",title:P.original.prefix},{default:s(()=>[o("span",{class:re(["inline-block size-3 rounded shrink-0",R(P.original.passRate)])},null,2),o("span",Na,c(P.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":s(({row:P})=>[o("span",{class:re(["font-medium tabular-nums",F(P.original.passRate)])},c(D(P.original.passRate)),3)]),"flakyRate-cell":s(({row:P})=>[o("span",La,c(Math.round(P.original.flakyRate*100))+"%",1)]),"failureCount-cell":s(({row:P})=>[o("span",{class:re(["tabular-nums",P.original.failureCount>0?"text-red-600 dark:text-red-400":""])},c(P.original.failureCount),3)]),"testCount-cell":s(({row:P})=>[o("span",Ka,c(P.original.testCount),1)]),"avgDuration-cell":s(({row:P})=>[o("span",Oa,c(v(P.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),Ha=Object.assign(qa,{__name:"SpecHealthTable"}),Xa={class:"space-y-4"},Ga={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},Qa={id:"marker-environments"},Ya=["value"],Ja=ge({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(z,{emit:w}){const b=z,j=w,h=je(),g=sn.map(v=>({label:v.label,value:v.id,icon:v.icon})),u=js({label:"",occurredAt:"",category:ht,environment:"",description:""}),B=E(()=>!!b.marker),R=T(!1);function F(v){const y=new Date(v),A=_=>String(_).padStart(2,"0");return`${y.getFullYear()}-${A(y.getMonth()+1)}-${A(y.getDate())}T${A(y.getHours())}:${A(y.getMinutes())}`}pe(()=>b.open,v=>{v&&(b.marker?(u.label=b.marker.label,u.occurredAt=F(b.marker.occurredAt),u.category=b.marker.category||ht,u.environment=b.marker.environment??"",u.description=b.marker.description??""):(u.label="",u.occurredAt=F(new Date),u.category=ht,u.environment="",u.description=""))});async function D(){if(!u.label.trim()){h.add({title:"Label is required",color:"error"});return}if(!u.occurredAt){h.add({title:"Date is required",color:"error"});return}R.value=!0;const v={label:u.label.trim(),occurredAt:new Date(u.occurredAt).toISOString(),category:u.category,environment:u.environment.trim()||null,description:u.description.trim()||null};try{b.marker?(await $fetch(`/api/markers/${b.marker.id}`,{method:"PUT",body:v}),h.add({title:"Marker updated",color:"success"})):(await $fetch(`/api/projects/${b.projectId}/markers`,{method:"POST",body:v}),h.add({title:"Marker created",color:"success"})),j("update:open",!1),j("saved")}catch(y){h.add({title:B.value?"Failed to update marker":"Failed to create marker",description:Yt(y),color:"error"})}finally{R.value=!1}}return(v,y)=>{const A=Nt,_=Lt,f=Re,M=tn,L=Te,x=Dt,$=Ct;return n(),k($,null,{default:s(()=>[l(x,{open:z.open,title:e(B)?"Edit marker":"Add marker","onUpdate:open":y[6]||(y[6]=d=>j("update:open",d))},{body:s(()=>[o("div",Xa,[l(_,{label:"Label",name:"label",required:""},{default:s(()=>[l(A,{modelValue:e(u).label,"onUpdate:modelValue":y[0]||(y[0]=d=>e(u).label=d),placeholder:"e.g. Migrated CI to new runners",class:"w-full"},null,8,["modelValue"])]),_:1}),o("div",Ga,[l(_,{label:"Date & time",name:"occurredAt",required:""},{default:s(()=>[l(A,{modelValue:e(u).occurredAt,"onUpdate:modelValue":y[1]||(y[1]=d=>e(u).occurredAt=d),type:"datetime-local",class:"w-full"},null,8,["modelValue"])]),_:1}),l(_,{label:"Category",name:"category"},{default:s(()=>[l(f,{modelValue:e(u).category,"onUpdate:modelValue":y[2]||(y[2]=d=>e(u).category=d),items:e(g),class:"w-full"},null,8,["modelValue","items"])]),_:1})]),l(_,{label:"Environment",name:"environment",help:"Optional. Leave empty to apply to all environments."},{default:s(()=>[l(A,{modelValue:e(u).environment,"onUpdate:modelValue":y[3]||(y[3]=d=>e(u).environment=d),list:"marker-environments",placeholder:"e.g. production",class:"w-full"},null,8,["modelValue"]),o("datalist",Qa,[(n(!0),i(Y,null,ie(z.environments||[],d=>(n(),i("option",{key:d,value:d},null,8,Ya))),128))])]),_:1}),l(_,{label:"Description",name:"description"},{default:s(()=>[l(M,{modelValue:e(u).description,"onUpdate:modelValue":y[4]||(y[4]=d=>e(u).description=d),rows:3,placeholder:"Optional details",class:"w-full"},null,8,["modelValue"])]),_:1})])]),footer:s(()=>[l(L,{color:"neutral",variant:"ghost",label:"Cancel",onClick:y[5]||(y[5]=d=>j("update:open",!1))}),l(L,{label:e(B)?"Save changes":"Add marker",icon:e(B)?"i-lucide-check":"i-lucide-plus",loading:e(R),onClick:D},null,8,["label","icon","loading"])]),_:1},8,["open","title"])]),_:1})}}}),Wa=Object.assign(Ja,{__name:"MarkerFormModal"}),Za={class:"md:hidden space-y-3"},eo={class:"flex items-start justify-between gap-2"},to={key:0,class:"flex gap-1 shrink-0"},so={class:"text-sm text-muted"},no={key:0,class:"text-xs"},ao={key:1,class:"text-sm text-muted"},oo={class:"whitespace-nowrap"},lo={class:"text-sm"},ro={class:"text-xs text-muted"},io={class:"font-medium flex items-center gap-1"},co={key:0,class:"text-xs text-muted line-clamp-1"},uo={key:1,class:"text-xs text-muted"},mo={key:0,class:"flex gap-1 justify-end"},po=ge({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(z,{emit:w}){const b=z,j=w,h=je(),g=E(()=>[...b.markers].sort((f,M)=>+new Date(M.occurredAt)-+new Date(f.occurredAt))),u=[{accessorKey:"occurredAt",header:"When"},{accessorKey:"category",header:"Category"},{accessorKey:"label",header:"Label"},{accessorKey:"environment",header:"Environment"},{accessorKey:"actions",header:""}],B=T(!1),R=T(null);function F(){R.value=null,B.value=!0}function D(f){R.value=f,B.value=!0}pe(()=>b.focusMarkerId,f=>{if(f==null)return;const M=b.markers.find(L=>L.id===f);M&&D(M),j("clear-focus")},{immediate:!0});const v=T(!1),y=T(null);function A(f){y.value=f,v.value=!0}async function _(){const f=y.value;if(v.value=!1,y.value=null,!!f)try{await $fetch(`/api/markers/${f.id}`,{method:"DELETE"}),h.add({title:"Marker deleted",color:"success"}),j("changed")}catch(M){h.add({title:"Failed to delete marker",description:Yt(M),color:"error"})}}return(f,M)=>{const L=Te,x=Ae,$=en,d=Le,q=Ne,Z=Oe,O=Wa,P=Dt,_e=Ct,he=Qt;return n(),k(he,{title:"Timeline markers",count:z.markers.length,icon:"i-lucide-milestone",help:"project.timeline",subtitle:"Dated events overlaid on the analytics charts"},{actions:s(()=>[z.canEdit?(n(),k(L,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:F})):S("",!0)]),default:s(()=>[z.markers.length===0?(n(),k(x,{key:0,icon:"i-lucide-milestone",text:"No markers yet. Add a deploy, config change, or incident to see it on the charts."})):(n(),i(Y,{key:1},[o("div",Za,[(n(!0),i(Y,null,ie(e(g),m=>(n(),i("div",{key:m.id,class:"rounded-lg border border-default p-3 space-y-2"},[o("div",eo,[l($,{marker:m},null,8,["marker"]),z.canEdit?(n(),i("div",to,[l(L,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:K=>D(m)},null,8,["onClick"]),l(L,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:K=>A(m)},null,8,["onClick"])])):S("",!0)]),o("div",so,c(("prettyDateFormat"in f?f.prettyDateFormat:e(nt))(m.occurredAt)),1),m.environment?(n(),i("div",no,[l(d,{color:"neutral",variant:"subtle",size:"xs"},{default:s(()=>[p(c(m.environment),1)]),_:2},1024)])):S("",!0),m.description?(n(),i("p",ao,c(m.description),1)):S("",!0)]))),128))]),l(Z,{data:e(g),columns:u,class:"hidden md:block"},{"occurredAt-cell":s(({row:m})=>[o("div",oo,[o("div",lo,c(("prettyDateFormat"in f?f.prettyDateFormat:e(nt))(m.original.occurredAt)),1),o("div",ro,c(("formatRelativeTime"in f?f.formatRelativeTime:e(St))(m.original.occurredAt)),1)])]),"category-cell":s(({row:m})=>[l(d,{color:e(bt)(m.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:s(()=>[l(q,{name:e(bt)(m.original.category).icon,class:"size-3"},null,8,["name"]),p(" "+c(e(bt)(m.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":s(({row:m})=>[o("div",null,[o("div",io,[p(c(m.original.label)+" ",1),m.original.source==="auto"?(n(),k(q,{key:0,name:"i-lucide-sparkles",class:"size-3 text-muted",title:"Automatically detected"})):S("",!0)]),m.original.description?(n(),i("div",co,c(m.original.description),1)):S("",!0)])]),"environment-cell":s(({row:m})=>[m.original.environment?(n(),k(d,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:s(()=>[p(c(m.original.environment),1)]),_:2},1024)):(n(),i("span",uo,"All"))]),"actions-cell":s(({row:m})=>[z.canEdit?(n(),i("div",mo,[l(L,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:K=>D(m.original)},null,8,["onClick"]),l(L,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:K=>A(m.original)},null,8,["onClick"])])):S("",!0)]),_:1},8,["data"])],64)),l(O,{open:e(B),"onUpdate:open":M[0]||(M[0]=m=>G(B)?B.value=m:null),"project-id":z.projectId,marker:e(R),environments:z.environments,onSaved:M[1]||(M[1]=m=>j("changed"))},null,8,["open","project-id","marker","environments"]),l(_e,null,{default:s(()=>[l(P,{open:e(v),title:"Delete marker","onUpdate:open":M[3]||(M[3]=m=>v.value=m)},{body:s(()=>[o("p",null,[M[4]||(M[4]=p(" Delete marker ",-1)),e(y)?(n(),k($,{key:0,marker:e(y),class:"inline-flex align-middle"},null,8,["marker"])):S("",!0),M[5]||(M[5]=p("? This can't be undone. ",-1))])]),footer:s(()=>[l(L,{color:"neutral",variant:"ghost",label:"Cancel",onClick:M[2]||(M[2]=m=>v.value=!1)}),l(L,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:_})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),go=Object.assign(po,{__name:"ProjectTimeline"}),fo={class:"flex flex-col h-full overflow-y-auto gap-4"},vo={key:0,class:"pb-0 space-y-4"},yo={key:0,class:"text-gray-600"},_o={key:1,class:"flex flex-wrap gap-1 mt-2"},ho={class:"flex flex-wrap items-center gap-3 mb-4"},bo={class:"inline-flex items-center gap-1"},xo=["onClick"],ko={key:0,class:"flex items-center gap-3 px-3 py-2 mb-3 rounded-lg bg-primary-50 dark:bg-primary-900/20 border border-primary-200 dark:border-primary-800"},$o={class:"text-sm text-primary-700 dark:text-primary-300"},Co={key:1,class:"text-xs text-primary-500"},To=["checked","onClick"],So={class:"flex items-center gap-2"},Do=["href","onClick"],wo={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},jo={class:"inline-flex items-center gap-1"},Ro={key:0,class:"flex items-center gap-1"},Ao={class:"text-xs text-gray-600"},Uo={key:0,class:"text-xs font-medium bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 px-1.5 py-0.5 rounded"},zo={key:0,class:"flex items-center gap-1 flex-wrap"},Fo={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Mo={key:1,class:"text-xs text-gray-500"},Io={class:"space-y-1"},Eo={class:"text-xs text-gray-500"},Vo={class:"flex justify-end gap-2"},Bo={key:2,class:"text-center py-8 text-gray-500"},Po={class:"text-xs text-gray-400 max-w-sm"},No={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Lo={class:"flex flex-wrap items-center gap-3"},Ko={class:"text-xl font-semibold inline-flex items-center gap-1"},Oo={class:"font-medium"},qo={class:"mt-1"},Ho={key:0,class:"text-red-600 font-medium"},Xo={key:1,class:"text-green-600 font-medium"},Go={key:2,class:"text-gray-500"},Qo={key:2,class:"text-center py-8 text-red-500"},Yo={key:3,class:"text-center py-8 text-gray-500"},Jo={class:"flex items-center justify-between"},Wo={class:"text-xl font-semibold inline-flex items-center gap-1"},Zo={class:"space-y-4"},el={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},tl={key:0,class:"text-center py-4 text-gray-500"},sl={key:1,class:"space-y-4"},nl={class:"flex gap-4 text-sm"},al={key:0,class:"text-gray-400"},ol={key:0,class:"text-gray-400"},ll={key:0},rl={key:1,class:"text-gray-400"},il={key:0},cl={key:1,class:"text-gray-400"},ul={key:0,class:"text-gray-400"},dl={key:0,class:"text-gray-400"},ml={key:2,class:"text-center py-8 text-gray-500"},pl={key:3,class:"text-center py-8 text-gray-500"},gl={class:"flex items-center justify-between"},fl={class:"text-sm text-gray-600 inline-flex items-center gap-1"},vl={class:"space-y-4"},yl={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},_l={key:0,class:"text-center py-8 text-gray-500"},hl={key:1,class:"space-y-4"},bl={class:"space-y-2"},xl={class:"flex flex-wrap gap-4 text-sm"},kl={key:3,class:"text-sm text-gray-500"},$l={class:"flex flex-wrap gap-4 text-sm"},Cl={key:0,class:"text-gray-400"},Tl={key:0,class:"text-gray-400"},Sl={key:0},Dl={key:1,class:"text-gray-400"},wl={key:0},jl={key:1,class:"text-gray-400"},Rl={key:0,class:"text-gray-400"},Al={key:0,class:"text-gray-400"},Ul={key:2,class:"text-center py-8 text-gray-500"},zl={key:3,class:"text-center py-8 text-gray-500"},Fl={class:"flex items-center justify-between"},Ml={class:"text-sm text-gray-600 inline-flex items-center gap-1"},Il={key:0,class:"space-y-2"},El={class:"font-medium text-sm"},Vl={class:"text-xs text-muted flex items-center gap-2"},Bl={key:0,class:"italic"},Pl={key:1,class:"text-xs text-muted italic"},Nl={key:1,class:"text-center py-8 text-muted text-sm"},Ll={class:"space-y-4"},Kl={class:"text-sm text-gray-600 dark:text-gray-400"},Ol={class:"block text-sm font-medium mb-1"},ql={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Gr=ge({__name:"index",async setup(z){let w,b;const j=Rs(),h=As(),g=j.params.id,{data:u,refresh:B}=([w,b]=$e(()=>Ce(`/api/projects/${g}`,"$NX9Zy2qnH1")),w=await w,b(),w);Us(E(()=>({title:`${u.value?.label||u.value?.name||"Project"} — Piwi Dashboard`})));const R=je(),F=T(null),D=T(null),{isAdmin:v,isReporter:y}=Bt(),A=kt(),_=E(()=>!A.public.authEnabled||v.value),f=T(!1),M=T(""),L=T(!1),x=E(()=>M.value===u.value?.name);async function $(){if(x.value){L.value=!0;try{await $fetch(`/api/projects/${g}`,{method:"DELETE"}),R.add({title:"Project deleted",color:"success"}),await Fs(),await h.push("/")}catch(r){const t=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;R.add({title:"Delete failed",description:t||"An error occurred",color:"error"}),L.value=!1}}}on(B);async function d(r){D.value=null,F.value=r;try{await $fetch(`/api/test-runs/${r}`,{method:"DELETE"}),R.add({title:"Test run deleted",color:"success"}),await B()}catch(t){const U=t&&typeof t=="object"&&"data"in t?t.data?.message:void 0;R.add({title:"Delete failed",description:U||"An error occurred",color:"error"})}finally{F.value=null}}const q=T([]),Z=T([]),O=T([]),P=E(()=>{const r=new Map(q.value.map(U=>[U.id,U])),t=[];for(const U of Z.value){if(U.role==="administrator")continue;const H=r.get(U.id);t.push({id:U.id,username:U.username,name:U.name??null,role:U.role,global:H?.global??!1,hasAccess:!!H})}for(const U of q.value)U.role==="administrator"&&t.push({...U,hasAccess:!0});return t}),_e=E(()=>{const r=q.value.filter(U=>U.role!=="administrator"&&!U.global).map(U=>U.id).sort(),t=[...O.value].sort();return JSON.stringify(r)!==JSON.stringify(t)});pe(()=>u.value?.id,async r=>{if(!(!r||!v.value))try{const[t,U]=await Promise.all([$fetch(`/api/projects/${g}/members`),$fetch("/api/users")]);q.value=t.users,Z.value=U.users,O.value=t.users.filter(H=>H.role!=="administrator"&&!H.global).map(H=>H.id)}catch{q.value=[],Z.value=[],O.value=[]}},{immediate:!0});function he(r){const t=O.value.indexOf(r);t>=0?O.value.splice(t,1):O.value.push(r)}async function m(){try{await $fetch(`/api/projects/${g}/members`,{method:"PUT",body:{userIds:O.value}}),R.add({title:"Members updated",color:"success"});const r=await $fetch(`/api/projects/${g}/members`);q.value=r.users}catch(r){const t=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;R.add({title:"Update failed",description:t||"An error occurred",color:"error"})}}const K=T("test-runs"),oe=T(0),ue=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","timeline","members"],be=j.query.tab;typeof be=="string"&&ue.includes(be)&&(K.value=be),pe(K,r=>{j.query.tab!==r&&ue.includes(r)&&h.replace({query:{...j.query,tab:r}})});const fe=E(()=>u.value?.testRuns?.some(r=>r.failedTests>0)??!1),ce=E(()=>[{label:`Test runs (${Me.value.length})`,icon:"i-lucide-play-circle",value:"test-runs",slot:"test-runs"},...fe.value?[{label:"Failure clusters",icon:"i-lucide-layers",value:"failure-clusters",slot:"failure-clusters"}]:[],{label:"Flaky tests",icon:"i-lucide-shuffle",value:"flaky-tests",slot:"flaky-tests"},{label:"Performance",icon:"i-lucide-trending-up",value:"performance",slot:"performance"},{label:`Test cases${Be.value!=null?` (${Be.value})`:""}`,icon:"i-lucide-list-checks",value:"test-cases",slot:"test-cases"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"},{label:"Spec health",icon:"i-lucide-table-2",value:"spec-health",slot:"spec-health"},{label:`Timeline${C.value.length?` (${C.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"},...v.value?[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]:[]]),ve=E(()=>ce.value.find(r=>r.value===K.value)?.icon),J=T([]),lt=r=>J.value.includes(r);function rt(r){const t=J.value.indexOf(r);if(t>=0)J.value.splice(t,1);else{if(J.value.length>=2){R.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}J.value.push(r)}}const Ue=T(null);function qe(){J.value.length===2&&(Ue.value=[J.value[0],J.value[1]],K.value="compare")}const W=T([]),ye=T(!0),ze=E(()=>{const r=new Set;for(const t of u.value?.testRuns||[])t.environment&&r.add(t.environment);return[...r].sort()});function it(r){const t=W.value.indexOf(r);t===-1?W.value.push(r):W.value.splice(t,1)}function Fe(r){return W.value.includes(r)}const Me=E(()=>{let r=u.value?.testRuns||[];return ye.value&&(r=r.filter(t=>t.isFullRun!==!1)),W.value.length===0?r:r.filter(t=>t.environment&&W.value.includes(t.environment))}),ct=E(()=>W.value.length===1?W.value[0]:void 0),{data:Ie,refresh:I}=([w,b]=$e(()=>Ce(`/api/projects/${g}/markers`,{default:()=>({markers:[]})},"$3gm0grYTFL")),w=await w,b(),w),C=E(()=>Ie.value?.markers??[]),ee=E(()=>!A.public.authEnabled||v.value||y.value),He=E(()=>W.value.length===0?C.value:C.value.filter(r=>r.environment==null||W.value.includes(r.environment))),Ee=T(null);function Ve(r){Ee.value=r,K.value="timeline"}const ut=E(()=>{const r=u.value?.testRuns||[];return ye.value?r.filter(t=>t.isFullRun!==!1):r});function Xe(r){if(r.isFullRun!==!1)return"Full run — the complete test suite ran";const t=[],U=r.filterDetails?.grep?.trim(),H=r.filterDetails?.grepInvert?.trim(),de=r.filterDetails?.files;return U&&U!==".*"&&t.push(`grep: ${U}`),H&&t.push(`grep-invert: ${H}`),de?.length&&t.push(`files: ${de.join(", ")}`),t.length?`Partial run — ${t.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const Se=[{accessorKey:"select",header:""},{accessorKey:"id",header:V("Run")},{accessorKey:"status",header:V("Status")},{accessorKey:"isFullRun",header:"Scope"},{id:"browsers",accessorFn:r=>r.browsers,header:""},{accessorKey:"startTime",header:V("Started")},{accessorKey:"environment",header:V("Environment")},{accessorKey:"metadata",header:"Branch / Commit"},{accessorKey:"duration",header:V("Test status / Dur.")},{accessorKey:"reports",header:"Reports"},{id:"actions",header:"Actions"}],Be=T(null),N=T(""),X=T(""),dt=E(()=>{const r={};return N.value&&(r.from=N.value),X.value&&(r.to=X.value),r}),mt=T(null),pt=T(!1),De=T(null),gt=T(!1),Ge=T(!1),Zt=E(()=>pt.value&&mt.value===null);pe([K,dt,ye],async([r,t])=>{if(r!=="performance")return;pt.value=!0,De.value||(Ge.value=!0);const U=new URLSearchParams(t).toString(),H=ye.value?`${U?"&":""}fullRunsOnly=true`:"",de=U||H?`?${U}${H}`:"";mt.value=await $fetch(`/api/projects/${g}/performance${de}`).catch(me=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",me),null)),pt.value=!1,Ge.value&&(gt.value=!1,De.value=await $fetch(`/api/projects/${g}/slow-tests`).catch(me=>(gt.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",me),null)),Ge.value=!1)},{immediate:!0});const es=[{accessorKey:"title",header:V("Test case")},{accessorKey:"avgDuration",header:V("Avg duration")},{accessorKey:"maxDuration",header:V("Max")},{accessorKey:"minDuration",header:V("Min")},{accessorKey:"latestDuration",header:V("Latest")},{accessorKey:"trend",header:V("Trend")},{accessorKey:"runCount",header:V("Runs")}];function ts(r){const t=nt(r.startTime,{dateOnly:!0}),U=r.metadata?.scm?.commit?` (${r.metadata.scm.commit.substring(0,7)})`:"";return`Run #${r.id} — ${t}${U}`}const le=E(()=>u.value?.testRuns?[...u.value.testRuns].reverse().map(r=>({label:ts(r),value:r.id})):[]),te=T(void 0),se=T(void 0),wt=E(()=>j.query.runA?Number(j.query.runA):null),jt=E(()=>j.query.runB?Number(j.query.runB):null);pe(le,r=>{if(wt.value){const t=r.find(U=>U.value===wt.value);t&&(te.value=t)}if(jt.value){const t=r.find(U=>U.value===jt.value);t&&(se.value=t)}},{immediate:!0}),pe(Ue,r=>{if(r){const t=le.value.find(H=>H.value===r[0]),U=le.value.find(H=>H.value===r[1]);t&&(te.value=t),U&&(se.value=U),Ue.value=null}});function Rt(){le.value.length>=2&&(te.value=le.value[1],se.value=le.value[0])}const ft=T(null),vt=T(null),Qe=T(!1);async function ss(){const r=te.value,t=se.value;if(!(!r?.value&&!t?.value)){Qe.value=!0;try{const U=[];r?.value&&U.push(r.value),t?.value&&U.push(t.value);const H=await Promise.all(U.map(me=>$fetch(`/api/test-runs/${me}/summary`))),de=new Map;for(const me of H)de.set(me.id,me);ft.value=r?.value?de.get(r.value)??null:null,vt.value=t?.value?de.get(t.value)??null:null}catch{ft.value=null,vt.value=null}finally{Qe.value=!1}}}pe([te,se],()=>{ss()});const{comparisonData:Ye,comparisonSummary:Q}=an(ft,vt),At=[{accessorKey:"title",header:V("Test case")},{accessorKey:"statusA",header:V("Status A")},{accessorKey:"statusB",header:V("Status B")},{accessorKey:"durationA",header:V("Duration A")},{accessorKey:"durationB",header:V("Duration B")},{accessorKey:"delta",header:V("Delta")},{accessorKey:"percentChange",header:V("Change")}];return(r,t)=>{const U=Ss,H=Ds,de=zn,me=Vs,ns=Ps,as=Kt,os=Re,ls=Ln,Ut=Ls,rs=Ks,we=Ke,ae=Te,is=Os,yt=Ne,cs=qs,us=Hs,ds=Xs,ms=Gs,Je=Oe,ps=Is,gs=Ae,Pe=ot,fs=Wn,vs=da,ys=wa,_t=Nt,zt=Wt,_s=Va,hs=Jt,We=Js,ne=Le,bs=Ws,xs=Ha,ks=Zs,$s=go,Cs=nn,Ts=Bs,Ft=Dt,Mt=Ct;return n(),i(Y,null,[l(Ts,{id:"project-detail"},{header:s(()=>[l(ns,null,{leading:s(()=>[l(U),l(H,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(u)?.label||e(u)?.name||"Project"}]},null,8,["items"])]),right:s(()=>[l(me,{size:"sm",actions:[...e(_)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{M.value="",f.value=!0}}]:[],{label:"Edit",icon:"i-lucide-pencil",variant:"outline",to:`/projects/${e(g)}/edit`},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>e(B)()}]},{leading:s(()=>[l(de,{"project-id":parseInt(e(g)),"project-label":e(u)?.label||e(u)?.name},null,8,["project-id","project-label"])]),_:1},8,["actions"])]),_:1})]),body:s(()=>[o("div",fo,[e(u)?.description||e(u)?.tags&&e(u).tags.length>0?(n(),i("div",vo,[e(u)?.description?(n(),i("p",yo,c(e(u).description),1)):S("",!0),e(u)?.tags&&e(u).tags.length>0?(n(),i("div",_o,[(n(!0),i(Y,null,ie(e(u).tags,a=>(n(),k(as,{key:a.id,text:a.text,color:a.color},null,8,["text","color"]))),128))])):S("",!0)])):S("",!0),l(os,{modelValue:e(K),"onUpdate:modelValue":t[0]||(t[0]=a=>G(K)?K.value=a:null),items:e(ce),icon:e(ve),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),l(Cs,{modelValue:e(K),"onUpdate:modelValue":t[14]||(t[14]=a=>G(K)?K.value=a:null),items:e(ce),size:"sm",class:"p-1",ui:{list:"max-sm:hidden overflow-x-auto",trigger:"shrink-0"}},{"test-runs":s(()=>[e(u)?.testRuns&&e(u).testRuns.length>0?(n(),k(Ut,{key:0,title:"Run trend",subtitle:`Test run statistics over time for ${e(u)?.label||e(u)?.name}`,help:"project.runs-trend"},{default:s(()=>[l(ls,{"test-runs":e(ut),height:200,markers:e(He),onMarkerClick:Ve},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):S("",!0),l(Pe,{class:"mt-4"},{default:s(()=>[o("div",ho,[o("div",bo,[l(rs,{modelValue:e(ye),"onUpdate:modelValue":t[1]||(t[1]=a=>G(ye)?ye.value=a:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),l(we,{topic:"project.run-scope"})]),e(ze).length>0?(n(),i(Y,{key:0},[t[21]||(t[21]=o("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(n(!0),i(Y,null,ie(e(ze),a=>(n(),i("button",{key:a,type:"button",class:re(["text-xs font-medium px-2 py-1 rounded border cursor-pointer focus:outline-none transition-colors",Fe(a)?"bg-blue-600 text-white border-blue-600":"bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200 border-blue-300 dark:border-blue-700 hover:bg-blue-200 dark:hover:bg-blue-800"]),onClick:xe=>it(a)},c(a),11,xo))),128)),e(W).length>0?(n(),k(ae,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filter",onClick:t[2]||(t[2]=a=>W.value=[])})):S("",!0)],64)):S("",!0)]),e(J).length>0?(n(),i("div",ko,[o("span",$o,c(e(J).length)+" run"+c(e(J).length>1?"s":"")+" selected ",1),e(J).length===2?(n(),k(ae,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:qe})):(n(),i("span",Co," Select another run to compare ")),l(ae,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:t[3]||(t[3]=a=>J.value=[])})])):S("",!0),e(Me).length>0?(n(),k(Je,{key:1,data:e(Me),columns:Se,ui:{base:"table-fixed border-separate border-spacing-0",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"}},{"select-cell":s(({row:a})=>[o("input",{type:"checkbox",checked:lt(a.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Vt(xe=>rt(a.original.id),["stop"])},null,8,To)]),"id-cell":s(({row:a})=>[o("div",So,[o("a",{href:`/test-runs/${a.original.id}`,class:"text-primary hover:underline font-medium",onClick:Vt(xe=>("navigateTo"in r?r.navigateTo:e($t))(`/test-runs/${a.original.id}`),["prevent"])}," Run #"+c(a.original.id),9,Do),a.original.label?(n(),i("span",wo,c(a.original.label),1)):S("",!0)])]),"status-cell":s(({row:a})=>[l(is,{status:a.original.status},null,8,["status"])]),"isFullRun-header":s(()=>[o("span",jo,[t[22]||(t[22]=p("Scope ",-1)),l(we,{topic:"run.partial"})])]),"isFullRun-cell":s(({row:a})=>[l(cs,{text:Xe(a.original)},{default:s(()=>[l(yt,{name:a.original.isFullRun===!1?"i-lucide-list-filter":"i-lucide-list-checks",class:re(["size-4 shrink-0 cursor-help",a.original.isFullRun===!1?"text-amber-500":"text-green-500"])},null,8,["name","class"])]),_:2},1032,["text"])]),"browsers-cell":s(({row:a})=>[a.original.browsers?.length?(n(),i("div",Ro,[(n(!0),i(Y,null,ie(a.original.browsers,xe=>(n(),k(us,{key:xe,browser:{projectName:xe},size:"sm"},null,8,["browser"]))),128))])):S("",!0)]),"startTime-cell":s(({row:a})=>[o("span",Ao,c(("prettyDateFormat"in r?r.prettyDateFormat:e(nt))(a.original.startTime)),1)]),"environment-cell":s(({row:a})=>[a.original.environment?(n(),i("span",Uo,c(a.original.environment),1)):S("",!0)]),"metadata-cell":s(({row:a})=>[a.original.metadata?.scm?(n(),i("div",zo,[a.original.metadata.scm.branch?(n(),i("span",Fo,c(a.original.metadata.scm.branch),1)):S("",!0),a.original.metadata.scm.commit?(n(),i("code",Mo,c(a.original.metadata.scm.commit.substring(0,7)),1)):S("",!0)])):S("",!0)]),"duration-cell":s(({row:a})=>[o("div",Io,[l(ds,{passed:a.original.passedTests,failed:a.original.failedTests,skipped:a.original.skippedTests,flaky:a.original.flakyTests,"did-not-run":a.original.didNotRunTests??0,total:a.original.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),o("span",Eo,c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.duration)),1)])]),"reports-cell":s(({row:a})=>[l(ms,{reports:a.original.reports},null,8,["reports"])]),"actions-header":s(()=>[...t[23]||(t[23]=[o("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":s(({row:a})=>[o("div",Vo,[l(ae,{to:`/test-runs/${a.original.id}`,size:"sm",variant:"outline"},{default:s(()=>[...t[24]||(t[24]=[p(" View ",-1)])]),_:1},8,["to"]),l(ae,{size:"sm",color:"error",variant:"soft",icon:"i-lucide-trash-2",loading:e(F)===a.original.id,onClick:xe=>D.value=a.original.id},{default:s(()=>[...t[25]||(t[25]=[p(" Delete ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data"])):e(u)?.testRuns&&e(u).testRuns.length>0?(n(),i("div",Bo," No test runs match the selected environment filter. ")):(n(),k(gs,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:s(()=>[o("p",Po,[t[27]||(t[27]=p(" Point the reporter's ",-1)),t[28]||(t[28]=o("code",{class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},"projectName",-1)),t[29]||(t[29]=p(" at ",-1)),o("code",No,c(e(u)?.name),1),t[30]||(t[30]=p(" to send results here — see the ",-1)),l(ps,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:s(()=>[...t[26]||(t[26]=[p("reporter docs",-1)])]),_:1}),t[31]||(t[31]=p(" for setup instructions. ",-1))])]),_:1}))]),_:1})]),"failure-clusters":s(()=>[e(K)==="failure-clusters"?(n(),i(Y,{key:0},[(n(),k(fs,{key:`sug-${e(oe)}`,"project-id":String(e(g)),onMerged:t[4]||(t[4]=a=>oe.value++)},null,8,["project-id"])),(n(),k(vs,{key:e(oe),"project-id":String(e(g))},null,8,["project-id"]))],64)):S("",!0)]),"flaky-tests":s(()=>[e(K)==="flaky-tests"?(n(),k(ys,{key:0,"project-id":String(e(g)),environment:e(ct),"project-name":e(u)?.name},null,8,["project-id","environment","project-name"])):S("",!0)]),performance:s(()=>[o("div",Lo,[t[32]||(t[32]=o("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),l(_t,{modelValue:e(N),"onUpdate:modelValue":t[5]||(t[5]=a=>G(N)?N.value=a:null),type:"date",size:"sm",placeholder:"From",class:"w-40"},null,8,["modelValue"]),t[33]||(t[33]=o("span",{class:"text-sm text-muted"},"to",-1)),l(_t,{modelValue:e(X),"onUpdate:modelValue":t[6]||(t[6]=a=>G(X)?X.value=a:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(N)||e(X)?(n(),k(ae,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:t[7]||(t[7]=a=>{N.value="",X.value=""})})):S("",!0)]),l(Ut,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:s(()=>[e(Zt)?(n(),k(zt,{key:0,text:"Loading chart…"})):(n(),k(_s,{key:1,data:e(mt)||[],height:350,markers:e(He),onMarkerClick:Ve},null,8,["data","markers"]))]),_:1}),l(Pe,null,{header:s(()=>[o("h2",Ko,[t[34]||(t[34]=p(" Slowest tests ",-1)),l(we,{topic:"project.slowest-tests"})]),t[35]||(t[35]=o("p",{class:"text-sm text-gray-600 mt-1"},"Top 20 slowest test cases across recent runs",-1))]),default:s(()=>[e(Ge)&&e(De)===null?(n(),k(zt,{key:0,text:"Loading…"})):e(De)&&e(De).length>0?(n(),k(Je,{key:1,data:e(De),columns:es,ui:{base:"table-fixed border-separate border-spacing-0",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"}},{"title-cell":s(({row:a})=>[o("div",null,[o("div",Oo,c(a.original.title),1),o("div",qo,[l(hs,{"file-path":a.original.filePath,"project-key":e(g),"project-name":e(u)?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"trend-cell":s(({row:a})=>[a.original.trend==="slower"?(n(),i("span",Ho,"▲ Slower")):a.original.trend==="faster"?(n(),i("span",Xo,"▼ Faster")):(n(),i("span",Go,"— Stable"))]),_:1},8,["data"])):e(gt)?(n(),i("div",Qo," Couldn't load the slowest tests — try refreshing. ")):(n(),i("div",Yo,"No slow test data available yet."))]),_:1}),l(Pe,null,{header:s(()=>[o("div",Jo,[o("div",null,[o("h2",Wo,[t[36]||(t[36]=p(" Run comparison ",-1)),l(we,{topic:"project.run-compare"})]),t[37]||(t[37]=o("p",{class:"text-sm text-gray-600 mt-1"},"Compare duration changes between two runs",-1))]),e(le).length>=2?(n(),k(ae,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Compare latest vs previous",onClick:Rt})):S("",!0)])]),default:s(()=>[o("div",Zo,[o("div",el,[o("div",null,[t[38]||(t[38]=o("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),l(We,{modelValue:e(te),"onUpdate:modelValue":t[8]||(t[8]=a=>G(te)?te.value=a:null),items:e(le),placeholder:"Select run A..."},null,8,["modelValue","items"])]),o("div",null,[t[39]||(t[39]=o("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),l(We,{modelValue:e(se),"onUpdate:modelValue":t[9]||(t[9]=a=>G(se)?se.value=a:null),items:e(le),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Qe)?(n(),i("div",tl,[l(yt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),t[40]||(t[40]=p(" Loading run data… ",-1))])):e(te)&&e(se)&&e(Ye).length>0?(n(),i("div",sl,[o("div",nl,[l(ne,{color:"success",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).improved)+" improved",1)]),_:1}),l(ne,{color:"error",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).regressed)+" regressed",1)]),_:1}),l(ne,{color:"neutral",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).unchanged)+" unchanged",1)]),_:1})]),l(Je,{data:e(Ye),columns:At,ui:{base:"table-fixed border-separate border-spacing-0",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"}},{"statusA-cell":s(({row:a})=>[a.original.statusA?(n(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(Ze))(a.original.statusA),class:"capitalize"},{default:s(()=>[p(c(a.original.statusA),1)]),_:2},1032,["color"])):(n(),i("span",al,"—"))]),"statusB-cell":s(({row:a})=>[a.original.statusB?(n(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(Ze))(a.original.statusB),class:"capitalize"},{default:s(()=>[p(c(a.original.statusB),1)]),_:2},1032,["color"])):(n(),i("span",ol,"—"))]),"durationA-cell":s(({row:a})=>[a.original.durationA!==null?(n(),i("span",ll,c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.durationA)),1)):(n(),i("span",rl,"—"))]),"durationB-cell":s(({row:a})=>[a.original.durationB!==null?(n(),i("span",il,c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.durationB)),1)):(n(),i("span",cl,"—"))]),"delta-cell":s(({row:a})=>[a.original.delta===null?(n(),i("span",ul,"—")):(n(),i("span",{key:1,class:re(a.original.delta>0?"text-red-600":a.original.delta<0?"text-green-600":"text-gray-500")},c(a.original.delta>0?"+":"")+c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.delta)),3))]),"percentChange-cell":s(({row:a})=>[a.original.percentChange===null?(n(),i("span",dl,"—")):(n(),i("span",{key:1,class:re(a.original.percentChange>10?"text-red-600 font-medium":a.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(a.original.percentChange>0?"+":"")+c(a.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(n(),i("div",ml," Select two runs to compare their performance. ")):(n(),i("div",pl," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":s(()=>[l(bs,{"project-id":e(g),"project-name":e(u)?.name,"sync-query":"",onTotal:t[10]||(t[10]=a=>Be.value=a)},null,8,["project-id","project-name"])]),compare:s(()=>[l(Pe,null,{header:s(()=>[o("div",gl,[o("p",fl,[t[41]||(t[41]=p(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),l(we,{topic:"project.compare"})]),e(le).length>=2?(n(),k(ae,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Latest vs previous",onClick:Rt})):S("",!0)])]),default:s(()=>[o("div",vl,[o("div",yl,[o("div",null,[t[42]||(t[42]=o("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),l(We,{modelValue:e(te),"onUpdate:modelValue":t[11]||(t[11]=a=>G(te)?te.value=a:null),items:e(le),placeholder:"Select run A..."},null,8,["modelValue","items"])]),o("div",null,[t[43]||(t[43]=o("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),l(We,{modelValue:e(se),"onUpdate:modelValue":t[12]||(t[12]=a=>G(se)?se.value=a:null),items:e(le),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Qe)?(n(),i("div",_l,[l(yt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),t[44]||(t[44]=p(" Loading run data… ",-1))])):e(te)&&e(se)&&e(Ye).length>0?(n(),i("div",hl,[o("div",bl,[o("div",xl,[t[45]||(t[45]=o("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(Q).newFailures>0?(n(),k(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).newFailures)+" new failure"+c(e(Q).newFailures>1?"s":""),1)]),_:1})):S("",!0),e(Q).recovered>0?(n(),k(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).recovered)+" recovered ",1)]),_:1})):S("",!0),e(Q).stillFailing>0?(n(),k(ne,{key:2,color:"warning",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).stillFailing)+" still failing ",1)]),_:1})):S("",!0),e(Q).newFailures===0&&e(Q).recovered===0&&e(Q).stillFailing===0?(n(),i("span",kl,"No status changes")):S("",!0)]),o("div",$l,[t[46]||(t[46]=o("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(Q).regressed>0?(n(),k(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).regressed)+" regressed ",1)]),_:1})):S("",!0),e(Q).improved>0?(n(),k(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).improved)+" improved ",1)]),_:1})):S("",!0),l(ne,{color:"neutral",variant:"soft",size:"lg"},{default:s(()=>[p(c(e(Q).unchanged)+" unchanged ",1)]),_:1})])]),l(Je,{data:e(Ye),columns:At,ui:{base:"table-fixed border-separate border-spacing-0",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"}},{"statusA-cell":s(({row:a})=>[a.original.statusA?(n(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(Ze))(a.original.statusA),class:"capitalize"},{default:s(()=>[p(c(a.original.statusA),1)]),_:2},1032,["color"])):(n(),i("span",Cl,"—"))]),"statusB-cell":s(({row:a})=>[a.original.statusB?(n(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(Ze))(a.original.statusB),class:"capitalize"},{default:s(()=>[p(c(a.original.statusB),1)]),_:2},1032,["color"])):(n(),i("span",Tl,"—"))]),"durationA-cell":s(({row:a})=>[a.original.durationA!==null?(n(),i("span",Sl,c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.durationA)),1)):(n(),i("span",Dl,"—"))]),"durationB-cell":s(({row:a})=>[a.original.durationB!==null?(n(),i("span",wl,c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.durationB)),1)):(n(),i("span",jl,"—"))]),"delta-cell":s(({row:a})=>[a.original.delta===null?(n(),i("span",Rl,"—")):(n(),i("span",{key:1,class:re(a.original.delta>0?"text-red-600":a.original.delta<0?"text-green-600":"text-gray-500")},c(a.original.delta>0?"+":"")+c(("formatDuration"in r?r.formatDuration:e(ke))(a.original.delta)),3))]),"percentChange-cell":s(({row:a})=>[a.original.percentChange===null?(n(),i("span",Al,"—")):(n(),i("span",{key:1,class:re(a.original.percentChange>10?"text-red-600 font-medium":a.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(a.original.percentChange>0?"+":"")+c(a.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(n(),i("div",Ul," Select two runs to compare test results. ")):(n(),i("div",zl," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":s(()=>[l(xs,{"project-id":String(e(g))},null,8,["project-id"])]),members:s(()=>[l(Pe,null,{header:s(()=>[o("div",Fl,[o("p",Ml,[t[47]||(t[47]=p(" Users with access to this project ",-1)),l(we,{topic:"project.members"})]),l(ae,{label:"Save changes",icon:"i-lucide-check",size:"sm",disabled:!e(_e),onClick:m},null,8,["disabled"])])]),default:s(()=>[e(P).length>0?(n(),i("div",Il,[(n(!0),i(Y,null,ie(e(P),a=>(n(),i("div",{key:a.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[o("div",null,[o("div",El,c(a.name||a.username),1),o("div",Vl,[o("span",null,"@"+c(a.username),1),l(ne,{color:a.role==="administrator"?"primary":a.role==="reporter"?"info":"neutral",variant:"subtle",size:"xs"},{default:s(()=>[p(c(a.role),1)]),_:2},1032,["color"]),a.global?(n(),i("span",Bl,"Global access")):S("",!0)])]),a.role!=="administrator"?(n(),k(ks,{key:0,"model-value":e(O).includes(a.id),disabled:a.global,title:a.global?"Has global access — remove global assignment first":"",onChange:xe=>he(a.id)},null,8,["model-value","disabled","title","onChange"])):(n(),i("span",Pl,"Admin"))]))),128))])):(n(),i("div",Nl,"Loading members…"))]),_:1})]),timeline:s(()=>[l($s,{"project-id":Number(e(g)),markers:e(C),environments:e(ze),"can-edit":e(ee),"focus-marker-id":e(Ee),onChanged:e(I),onClearFocus:t[13]||(t[13]=a=>Ee.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),l(Mt,null,{default:s(()=>[l(Ft,{open:e(f),title:"Delete project","onUpdate:open":t[17]||(t[17]=a=>{a||(f.value=!1)})},{body:s(()=>[o("div",Ll,[o("p",Kl,[t[48]||(t[48]=p(" This will permanently delete ",-1)),o("strong",null,c(e(u)?.label||e(u)?.name),1),t[49]||(t[49]=p(" and all its test runs, reports, traces, and failure clusters. This action cannot be undone. ",-1))]),o("div",null,[o("label",Ol,[t[50]||(t[50]=p(" Type the project key ",-1)),o("code",ql,c(e(u)?.name),1),t[51]||(t[51]=p(" to confirm: ",-1))]),l(_t,{modelValue:e(M),"onUpdate:modelValue":t[15]||(t[15]=a=>G(M)?M.value=a:null),placeholder:e(u)?.name,autofocus:"",onKeydown:zs($,["enter"])},null,8,["modelValue","placeholder"])])])]),footer:s(()=>[l(ae,{color:"neutral",variant:"ghost",label:"Cancel",onClick:t[16]||(t[16]=a=>f.value=!1)}),l(ae,{color:"error",label:"Delete project",icon:"i-lucide-trash-2",disabled:!e(x),loading:e(L),onClick:$},null,8,["disabled","loading"])]),_:1},8,["open"])]),_:1}),l(Mt,null,{default:s(()=>[l(Ft,{open:e(D)!==null,title:"Delete test run","onUpdate:open":t[20]||(t[20]=a=>{a||(D.value=null)})},{body:s(()=>[o("p",null,[t[52]||(t[52]=p(" Are you sure you want to delete ",-1)),o("strong",null,"Run #"+c(e(D)),1),t[53]||(t[53]=p("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:s(()=>[l(ae,{color:"neutral",variant:"ghost",label:"Cancel",onClick:t[18]||(t[18]=a=>D.value=null)}),l(ae,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(F)===e(D),onClick:t[19]||(t[19]=a=>d(e(D)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Gr as default};
|