@piwitests/server 0.18.2 → 0.20.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/{Dwws9U0D.js → -f7BAm1H.js} +1 -1
- package/.output/public/_nuxt/{BjCHB89N.js → 4gYNA-d4.js} +1 -1
- package/.output/public/_nuxt/5A6ITZXj.js +1 -0
- package/.output/public/_nuxt/8PUUncmO.js +44 -0
- package/.output/public/_nuxt/A1pj0VnG.js +1 -0
- package/.output/public/_nuxt/{DZ3Vfcpz.js → AbmKWFQQ.js} +1 -1
- package/.output/public/_nuxt/B3obW6cw.js +3 -0
- package/.output/public/_nuxt/{QmMoMxLM.js → B7FTvFWq.js} +3 -3
- package/.output/public/_nuxt/{DXbPFI1d.js → B8zkOmwo.js} +1 -1
- package/.output/public/_nuxt/B96M2gdj.js +1 -0
- package/.output/public/_nuxt/{BFP6M-20.js → B99fbi73.js} +1 -1
- package/.output/public/_nuxt/{DD5HpaW9.js → B9OLmp0f.js} +1 -1
- package/.output/public/_nuxt/BKkF4pPD.js +1 -0
- package/.output/public/_nuxt/BT3wGCTI.js +1 -0
- package/.output/public/_nuxt/BUa0V0Ly.js +1 -0
- package/.output/public/_nuxt/BUkim3TM.js +1 -0
- package/.output/public/_nuxt/BVc14Ncz.js +4 -0
- package/.output/public/_nuxt/BY0HxR3t.js +17 -0
- package/.output/public/_nuxt/B_xAMWQS.js +2 -0
- package/.output/public/_nuxt/BdQoBaOv.js +1 -0
- package/.output/public/_nuxt/{Cng9gj7q.js → BdfhYr-u.js} +1 -1
- package/.output/public/_nuxt/BgRu_3tT.js +1 -0
- package/.output/public/_nuxt/{BBK2-Krn.js → BiO7RBWb.js} +2 -2
- package/.output/public/_nuxt/BicAJ6U8.js +1 -0
- package/.output/public/_nuxt/BjaRappk.js +1 -0
- package/.output/public/_nuxt/Bm62iDV5.js +1 -0
- package/.output/public/_nuxt/{C9YzQCiq.js → BmUfSNMV.js} +1 -1
- package/.output/public/_nuxt/Bnxf8nbZ.js +1 -0
- package/.output/public/_nuxt/{CsUoYK75.js → Bow4tTR0.js} +1 -1
- package/.output/public/_nuxt/{B2oUeBbA.js → BrQEE053.js} +1 -1
- package/.output/public/_nuxt/BzRRzmwm.js +1 -0
- package/.output/public/_nuxt/{CN1mJlvD.js → C0_yH0N7.js} +1 -1
- package/.output/public/_nuxt/C1gTN4Q8.js +1 -0
- package/.output/public/_nuxt/{CNMoZYMv.js → C2hkrSey.js} +1 -1
- package/.output/public/_nuxt/{rTvJTef_.js → C8e1EbJI.js} +1 -1
- package/.output/public/_nuxt/CA9B2HE5.js +1 -0
- package/.output/public/_nuxt/{oFM1KLWA.js → CAAwCT7H.js} +1 -1
- package/.output/public/_nuxt/{qpI-_f9Q.js → CAvY22RE.js} +1 -1
- package/.output/public/_nuxt/{BLIRKrbM.js → CEfS4-oS.js} +4 -4
- package/.output/public/_nuxt/CIoSMkpp.js +1 -0
- package/.output/public/_nuxt/{hH1UFE3Z.js → CIrFl3MW.js} +1 -1
- package/.output/public/_nuxt/CJFtzlQ4.js +1 -0
- package/.output/public/_nuxt/{hgHc4teu.js → CNyV9YpI.js} +1 -1
- package/.output/public/_nuxt/CSJ-eOQM.js +1 -0
- package/.output/public/_nuxt/CTU1mrhq.js +1 -0
- package/.output/public/_nuxt/CXEH9OPk.js +1 -0
- package/.output/public/_nuxt/CahpB9Z2.js +5 -0
- package/.output/public/_nuxt/{C8OCrfDP.js → Cbh--1MW.js} +1 -1
- package/.output/public/_nuxt/CeG9pBAD.js +1 -0
- package/.output/public/_nuxt/{DBtBvrYc.js → CeW8v31b.js} +1 -1
- package/.output/public/_nuxt/{DZUgX70W.js → CjPfj7ya.js} +1 -1
- package/.output/public/_nuxt/Cnsmicv2.js +79 -0
- package/.output/public/_nuxt/CsLojMwR.js +1 -0
- package/.output/public/_nuxt/{BXY_PWcx.js → Cus22Ud3.js} +2 -2
- package/.output/public/_nuxt/{4TxgDGVa.js → CwGWJbiy.js} +1 -1
- package/.output/public/_nuxt/Cx6gc2VW.js +1 -0
- package/.output/public/_nuxt/{B1X__ilH.js → CxyAzHr3.js} +1 -1
- package/.output/public/_nuxt/{BJtlcTrb.js → CzAPFPpL.js} +1 -1
- package/.output/public/_nuxt/D--H4jLI.js +1 -0
- package/.output/public/_nuxt/D-c8ZSws.js +1 -0
- package/.output/public/_nuxt/D1POo6S4.js +10 -0
- package/.output/public/_nuxt/D5tke0B5.js +1 -0
- package/.output/public/_nuxt/D8nkF-OO.js +3 -0
- package/.output/public/_nuxt/DA25RkyK.js +1 -0
- package/.output/public/_nuxt/{DZ1zNBVM.js → DIB-5fUJ.js} +1 -1
- package/.output/public/_nuxt/DJmoLeVt.js +1 -0
- package/.output/public/_nuxt/DJxlKFGb.js +1 -0
- package/.output/public/_nuxt/DMec-OLo.js +1 -0
- package/.output/public/_nuxt/DPCxhHri.js +1 -0
- package/.output/public/_nuxt/{By4YL7mx.js → DSqHUrvO.js} +1 -1
- package/.output/public/_nuxt/DabzhQB1.js +1 -0
- package/.output/public/_nuxt/{D5oNv2cB.js → DdwHkKfV.js} +1 -1
- package/.output/public/_nuxt/{CfOLBbW9.js → DeY2JkR2.js} +1 -1
- package/.output/public/_nuxt/{CPLJeOCb.js → DfgOx_ou.js} +1 -1
- package/.output/public/_nuxt/DmkUdSS4.js +1 -0
- package/.output/public/_nuxt/{CUvGJXY3.js → DoIREDVb.js} +1 -1
- package/.output/public/_nuxt/DpZ1r1HA.js +1 -0
- package/.output/public/_nuxt/{BOCwBVnz.js → Dpd16JVI.js} +1 -1
- package/.output/public/_nuxt/DqcKngf3.js +1 -0
- package/.output/public/_nuxt/{xqiPI_FQ.js → DrfE8IY0.js} +1 -1
- package/.output/public/_nuxt/{BeFDVhpA.js → DsesNydr.js} +1 -1
- package/.output/public/_nuxt/{D0cnIs93.js → DtHJgCS8.js} +1 -1
- package/.output/public/_nuxt/Dtd4rC58.js +9 -0
- package/.output/public/_nuxt/Du2W7Jne.js +254 -0
- package/.output/public/_nuxt/DuwtTfO8.js +2 -0
- package/.output/public/_nuxt/Dy-TJ0Mt.js +1 -0
- package/.output/public/_nuxt/{BlnwU1OO.js → Dy86h-7P.js} +1 -1
- package/.output/public/_nuxt/{B-IcwqZ2.js → Dyeqn3aG.js} +1 -1
- package/.output/public/_nuxt/{BlA8mIS-.js → FaFoMVKo.js} +1 -1
- package/.output/public/_nuxt/GPNI1ffD.js +4 -0
- package/.output/public/_nuxt/{DWowvnwc.js → H94BMf3L.js} +1 -1
- package/.output/public/_nuxt/HPNQD6v3.js +1 -0
- package/.output/public/_nuxt/HXadJrHu.js +2 -0
- package/.output/public/_nuxt/KyA_4Ks-.js +1 -0
- package/.output/public/_nuxt/{e7zD3uJ0.js → L3kAWB2a.js} +1 -1
- package/.output/public/_nuxt/McL25vkx.js +34 -0
- package/.output/public/_nuxt/Nn93e_Mz.js +1 -0
- package/.output/public/_nuxt/TagBadge.By1E6r4y.css +1 -0
- package/.output/public/_nuxt/UdR3DBPS.js +1 -0
- package/.output/public/_nuxt/Und3xXFc.js +5 -0
- package/.output/public/_nuxt/_mj6CfPa.js +1 -0
- package/.output/public/_nuxt/b-GYfcrQ.js +1 -0
- package/.output/public/_nuxt/bLcjFslv.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +1 -0
- package/.output/public/_nuxt/entry.DmptwB51.css +1 -0
- package/.output/public/_nuxt/{wHnZ9OaL.js → hC_z4G8p.js} +1 -1
- package/.output/public/_nuxt/{DZOS7Fh7.js → hNh4CIL0.js} +1 -1
- package/.output/public/_nuxt/{kjYMoWWx.js → l5WKbU4h.js} +3 -3
- package/.output/public/_nuxt/oAClCn_h.js +1 -0
- package/.output/public/_nuxt/{gnCL8GjZ.js → pQqGiNch.js} +1 -1
- package/.output/public/_nuxt/ryMzSDUj.js +2 -0
- package/.output/public/demo/seed.version.json +2 -2
- package/.output/server/chunks/_/ai-prompt-preview.mjs +38 -0
- package/.output/server/chunks/_/ai-prompt-preview.mjs.map +1 -0
- package/.output/server/chunks/_/collect.mjs +122 -0
- package/.output/server/chunks/_/collect.mjs.map +1 -0
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +112 -0
- package/.output/server/chunks/_/quarantine.mjs.map +1 -0
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Alert-Bp1Wz_sq.mjs → Alert-C4xq8lao.mjs} +2 -2
- package/.output/server/chunks/build/Alert-C4xq8lao.mjs.map +1 -0
- package/.output/server/chunks/build/{Breadcrumb-C9ZPTLym.mjs → Breadcrumb-Ak2Lg3oM.mjs} +3 -3
- package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-C3y42Vun.mjs → BreadcrumbNav-DO7I_z-n.mjs} +3 -3
- package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-DNCp9pF-.mjs → BrowserBadge-MFvBwxmD.mjs} +67 -7
- package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Fr557IbV.mjs → ChartCard-Y1UKwMsf.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-cVOSIY93.mjs → Checkbox-4Q5d0fa0.mjs} +8 -8
- package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +1 -0
- package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs +1492 -0
- package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BGwNmJ8J.mjs → CodeBlock-BgE-NSmE.mjs} +7 -22
- package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-Bdp-OwTN.mjs → DashboardNavbar-BHmMSPX7.mjs} +3 -3
- package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-Ji6ADuqF.mjs → DashboardSidebarToggle-DCTnHiIv.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-D6xSOrme.mjs → DataLocationCard-B_YHdzSz.mjs} +3 -3
- package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-DV1xwGu4.mjs → DiagnosisPanel-CALyEmcJ.mjs} +17 -528
- package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.mjs.map +1 -0
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs +43 -0
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +1 -0
- package/.output/server/chunks/build/{EmptyState-DV3oT_xz.mjs → EmptyState-DC2q_7TD.mjs} +3 -3
- package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-DeOP13Kr.mjs → EntityLinks-BBHWssHH.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-Qpn58Nmr.mjs → EnvManagedBadge-UwD2b9v2.mjs} +3 -3
- package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B-GSn_VR.mjs → FormField-B0HKsdMd.mjs} +3 -3
- package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-YEMWtKu1.mjs → HelpHint-DrcIv-Oj.mjs} +53 -6
- package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +1 -0
- package/.output/server/chunks/build/{Label-DBvbHd3A.mjs → Label-DYDR1Oeh.mjs} +2 -2
- package/.output/server/chunks/build/Label-DYDR1Oeh.mjs.map +1 -0
- package/.output/server/chunks/build/{MiniRunBars-C3HG-EYm.mjs → MiniRunBars-CZMugDrh.mjs} +2 -2
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-CfA78Hm1.mjs → Modal-pSDlXzT3.mjs} +2 -2
- package/.output/server/chunks/build/Modal-pSDlXzT3.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs → OpenInIdeLink-CQWKKChd.mjs} +6 -6
- package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs.map → OpenInIdeLink-CQWKKChd.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-9Ia825h8.mjs → ProjectTestCasesTable-Bo61P5K1.mjs} +120 -45
- package/.output/server/chunks/build/ProjectTestCasesTable-Bo61P5K1.mjs.map +1 -0
- package/.output/server/chunks/build/{RovingFocusItem-CxhHdNGo.mjs → RovingFocusItem--OEHI2P3.mjs} +2 -2
- package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-BpJqLHY9.mjs → RunReports-DFLv51TX.mjs} +8 -6
- package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-BhmJ_RKM.mjs → RunStatusBadge-FfGb6bkW.mjs} +3 -2
- package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-COd9TuDq.mjs → SectionCard-CN-v0FZ_.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-ppPz926C.mjs → Select-5DK9frQ7.mjs} +4 -4
- package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs → SelectMenu-D-2FSqBU.mjs} +939 -7
- package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs.map → SelectMenu-D-2FSqBU.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-CxZdx8kw.mjs → Separator-CR4WcEKD.mjs} +2 -2
- package/.output/server/chunks/build/Separator-CR4WcEKD.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-DDD4oqys.mjs → SettingsField-BZfx4ma1.mjs} +6 -6
- package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-B95Rj237.mjs → Slideover-D270EZZD.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-D270EZZD.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-xQQ3_ME1.mjs → Switch-B5Fp8ULt.mjs} +5 -5
- package/.output/server/chunks/build/Switch-B5Fp8ULt.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-CPhhVzDv.mjs → Table-BRk04Hd2.mjs} +3 -3
- package/.output/server/chunks/build/Table-BRk04Hd2.mjs.map +1 -0
- package/.output/server/chunks/build/{Tabs-BV9XqjoO.mjs → Tabs-BkSOnbaB.mjs} +3 -3
- package/.output/server/chunks/build/Tabs-BkSOnbaB.mjs.map +1 -0
- package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs +31 -0
- package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs.map +1 -0
- package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs +8 -0
- package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-DMb-xSJa.mjs → TestCaseHistoryChart-CSi64vVA.mjs} +6 -6
- package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +1 -0
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs +200 -0
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-CEzt76wk.mjs → TestStatusBar-DX3EhlyP.mjs} +15 -15
- package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-DrrqQUVG.mjs → Textarea-Dv2-lOvW.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-7vwuDPrZ.mjs → Tooltip-Dv4htNP6.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs.map +1 -0
- package/.output/server/chunks/build/{VisuallyHiddenInput-C9eJVpPW.mjs → VisuallyHiddenInput-BHvzNumK.mjs} +2 -2
- package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CE0Gso6i.mjs → _id_-BdG37K7s.mjs} +91 -42
- package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-bWcP2xFl.mjs → _id_-BdJs7BJZ.mjs} +719 -448
- package/.output/server/chunks/build/_id_-BdJs7BJZ.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-B2yirIuA.mjs → _id_-BxA6IgWr.mjs} +831 -368
- package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-B4V5fop6.mjs → _id_-C_uSBiyU.mjs} +296 -60
- package/.output/server/chunks/build/{_id_-B4V5fop6.mjs.map → _id_-C_uSBiyU.mjs.map} +1 -1
- package/.output/server/chunks/build/{about-CoJjvUwM.mjs → about-BE0UV-8-.mjs} +456 -61
- package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +1 -0
- package/.output/server/chunks/build/{account-Cn-eZqXM.mjs → account-DAfvaD-F.mjs} +21 -9
- package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-7jdaPOmj.mjs → ai-Cn05ch0u.mjs} +45 -23
- package/.output/server/chunks/build/{ai-7jdaPOmj.mjs.map → ai-Cn05ch0u.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-B276WPeU.mjs → analytics-Bo_B_jko.mjs} +66 -41
- package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/compare-RxHSOdsO.mjs +12 -0
- package/.output/server/chunks/build/{db.client-aHcD0wyX.mjs → db.client-CQoVTYB9.mjs} +83 -5
- package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +1 -0
- package/.output/server/chunks/build/{default-BSzdkM_L.mjs → default-CbNHaFsy.mjs} +622 -78
- package/.output/server/chunks/build/default-CbNHaFsy.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-BN_x1OW3.mjs → docs-B_llWMxx.mjs} +30 -49
- package/.output/server/chunks/build/{docs-BN_x1OW3.mjs.map → docs-B_llWMxx.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-C9Z7oZeu.mjs → edit-J0asTFg8.mjs} +29 -18
- package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-8kznMtBM.mjs → fetch-B4FwBOzu.mjs} +3 -3
- package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-BqPF4Rxs.mjs → forgot-password-CC__1OnV.mjs} +17 -5
- package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +1 -0
- package/.output/server/chunks/build/{help-content-DmFnuhNu.mjs → help-content-C876a9WD.mjs} +37 -8
- package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +1 -0
- package/.output/server/chunks/build/import-CS9oylTN.mjs +1021 -0
- package/.output/server/chunks/build/import-CS9oylTN.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CULN3-en.mjs → index-CU2nZhAa.mjs} +113 -42
- package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +1 -0
- package/.output/server/chunks/build/{index-BR9hw6qk.mjs → index-DE45ycdZ.mjs} +51 -31
- package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +1 -0
- package/.output/server/chunks/build/{index-BK9PTRpd.mjs → index-e9skCi-V.mjs} +85 -69
- package/.output/server/chunks/build/{index-BK9PTRpd.mjs.map → index-e9skCi-V.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-DVUtBexc.mjs → index-hGHlmyxj.mjs} +1520 -288
- package/.output/server/chunks/build/index-hGHlmyxj.mjs.map +1 -0
- package/.output/server/chunks/build/{index-Ba-Fifra.mjs → index-tR6owKzj.mjs} +18 -6
- package/.output/server/chunks/build/index-tR6owKzj.mjs.map +1 -0
- package/.output/server/chunks/build/{isValueEqualOrExist-DBZjbD_3.mjs → isValueEqualOrExist-D2qw9YEr.mjs} +3 -3
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs.map +1 -0
- package/.output/server/chunks/build/{login-D2XZDuek.mjs → login-Da4u1IlW.mjs} +19 -7
- package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-_o6cMS6m.mjs → mcp-uhVCCwQM.mjs} +359 -24
- package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-Dzm9c0u_.mjs → notifications-fx_qnKGA.mjs} +27 -21
- package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +1 -0
- package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs +368 -0
- package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-gpFzIEDj.mjs → reset-password-BmrUS4ZD.mjs} +17 -5
- package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +238 -36
- package/.output/server/chunks/build/{settings-pNyPBXVa.mjs → settings-CCYe7rsc.mjs} +23 -10
- package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-B0wo5R-W.mjs → settings-metadata-DrEqWcW-.mjs} +11 -2
- package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-XelzuyPy.mjs → storage-CJEmviCD.mjs} +41 -31
- package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +1 -0
- package/.output/server/chunks/build/styles.mjs +1 -0
- package/.output/server/chunks/build/{tags-DrCQ7QSw.mjs → tags-DauTe_F-.mjs} +22 -10
- package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-pmOxi-AN.mjs → test-cases-thBbAykw.mjs} +38 -24
- package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +1 -0
- package/.output/server/chunks/build/{timeout-hygiene-CNs71Iah.mjs → timeout-hygiene-CbnSaVbK.mjs} +20 -8
- package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-ZO987RY7.mjs → useAiStatus-CxjMmDDY.mjs} +89 -89
- package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopy-BQQKcwlq.mjs → useCopy-CeKWgHyT.mjs} +2 -2
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +1 -0
- package/.output/server/chunks/build/{PageStateCard-Bwee6JTk.mjs → useCopyRich-RJKhWoyj.mjs} +472 -63
- package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +1 -0
- package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs +46 -0
- package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +1 -0
- package/.output/server/chunks/build/{useFormControl-BLpq1s4O.mjs → useFormControl-CZ9So7iX.mjs} +2 -2
- package/.output/server/chunks/build/useFormControl-CZ9So7iX.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-kMZ7Jw5c.mjs → useOpenInIde-BbTnPhFA.mjs} +3 -3
- package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-NjI2seBy.mjs → useSettingsNav-DnQKacz8.mjs} +6 -6
- package/.output/server/chunks/build/useSettingsNav-DnQKacz8.mjs.map +1 -0
- package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs +11 -0
- package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs.map +1 -0
- package/.output/server/chunks/build/{useTreeViewCookie-DVYpxW-p.mjs → useTreeViewCookie-CQjQdTkH.mjs} +2 -2
- package/.output/server/chunks/build/useTreeViewCookie-CQjQdTkH.mjs.map +1 -0
- package/.output/server/chunks/build/{users-NmAUZs3i.mjs → users-CTUqXyGh.mjs} +22 -10
- package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-CguAF9zc.mjs → wasted-time-BNTPIyrC.mjs} +26 -14
- package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +6438 -1964
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +13 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +12 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +12 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +12 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +12 -0
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +12 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +12 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +88 -0
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +12 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +24 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +64 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +56 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +13 -32
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +13 -1
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +12 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +13 -1
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +13 -1
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +13 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +12 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +12 -0
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +12 -0
- package/.output/server/chunks/routes/api/index.post6.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +13 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +13 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +13 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +22 -2
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +58 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +57 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +72 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +13 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +12 -0
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +57 -0
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +63 -0
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +12 -0
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/stream.get.mjs +13 -1
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +13 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +25 -3
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +60 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +17 -3
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +15 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +196 -0
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +77 -0
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +77 -0
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +32 -15
- 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 +21 -6
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +156 -3
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +13 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +13 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +13 -1
- package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/tasks/sweep.mjs +12 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +12 -0
- package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
- package/.output/server/database/migrations/0039_remarkable_jean_grey.sql +2 -0
- package/.output/server/database/migrations/0040_organic_phalanx.sql +8 -0
- package/.output/server/database/migrations/0041_tense_gravity.sql +5 -0
- package/.output/server/database/migrations/0042_burly_hemingway.sql +19 -0
- package/.output/server/database/migrations/meta/0039_snapshot.json +3403 -0
- package/.output/server/database/migrations/meta/0040_snapshot.json +3457 -0
- package/.output/server/database/migrations/meta/0041_snapshot.json +3492 -0
- package/.output/server/database/migrations/meta/0042_snapshot.json +3618 -0
- package/.output/server/database/migrations/meta/_journal.json +28 -0
- package/.output/server/database/migrations-pg/0040_lazy_layla_miller.sql +2 -0
- package/.output/server/database/migrations-pg/0041_light_screwball.sql +8 -0
- package/.output/server/database/migrations-pg/0042_serious_layla_miller.sql +5 -0
- package/.output/server/database/migrations-pg/0043_wonderful_mordo.sql +19 -0
- package/.output/server/database/migrations-pg/meta/0040_snapshot.json +4060 -0
- package/.output/server/database/migrations-pg/meta/0041_snapshot.json +4123 -0
- package/.output/server/database/migrations-pg/meta/0042_snapshot.json +4153 -0
- package/.output/server/database/migrations-pg/meta/0043_snapshot.json +4308 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +28 -0
- package/.output/server/index.mjs +13 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
- package/.output/server/node_modules/fflate/package.json +128 -0
- package/.output/server/node_modules/highlight.js/es/languages/yaml.js +213 -0
- package/.output/server/node_modules/marked/lib/marked.esm.js +72 -0
- package/.output/server/node_modules/marked/package.json +103 -0
- package/.output/server/package.json +3 -1
- package/package.json +2 -2
- package/.output/public/_nuxt/9-wVZMur.js +0 -4
- package/.output/public/_nuxt/B-5GukRk.js +0 -1
- package/.output/public/_nuxt/B1G3GGhQ.js +0 -1
- package/.output/public/_nuxt/B1zMFx24.js +0 -1
- package/.output/public/_nuxt/B4jvLMfS.js +0 -1
- package/.output/public/_nuxt/BBnX5xw4.js +0 -2
- package/.output/public/_nuxt/BHpUiv6j.js +0 -3
- package/.output/public/_nuxt/BLOUs6AE.js +0 -5
- package/.output/public/_nuxt/BT6p4Pgt.js +0 -2
- package/.output/public/_nuxt/BUXSUkJ_.js +0 -1
- package/.output/public/_nuxt/BVf6Yx9V.js +0 -26
- package/.output/public/_nuxt/BbS6Bwby.js +0 -1
- package/.output/public/_nuxt/Bd3HqPMF.js +0 -1
- package/.output/public/_nuxt/BeKvLsja.js +0 -2
- package/.output/public/_nuxt/BeUm5UNV.js +0 -1
- package/.output/public/_nuxt/BfV444H3.js +0 -3
- package/.output/public/_nuxt/BjKamgHq.js +0 -1
- package/.output/public/_nuxt/BoJdjCVl.js +0 -4
- package/.output/public/_nuxt/BreO2PiA.js +0 -1
- package/.output/public/_nuxt/BvIDC_R-.js +0 -1
- package/.output/public/_nuxt/ByuJWADR.js +0 -34
- package/.output/public/_nuxt/C1dyLp_j.js +0 -1
- package/.output/public/_nuxt/CAUgpKsF.js +0 -2
- package/.output/public/_nuxt/CL9-VLTJ.js +0 -1
- package/.output/public/_nuxt/CazDIG_m.js +0 -1
- package/.output/public/_nuxt/CcXaak_K.js +0 -1
- package/.output/public/_nuxt/CdMuck_X.js +0 -1
- package/.output/public/_nuxt/CfPSts5n.js +0 -1
- package/.output/public/_nuxt/CfROFPse.js +0 -1
- package/.output/public/_nuxt/Cnapl7lZ.js +0 -1
- package/.output/public/_nuxt/CscWZxCi.js +0 -1
- package/.output/public/_nuxt/CuicKV-B.js +0 -34
- package/.output/public/_nuxt/Cyiu1VQD.js +0 -1
- package/.output/public/_nuxt/D6PUPmRC.js +0 -1
- package/.output/public/_nuxt/DCl2yo4g.js +0 -8
- package/.output/public/_nuxt/DHXWp5yD.js +0 -1
- package/.output/public/_nuxt/DHltYerF.js +0 -114
- package/.output/public/_nuxt/DLXydYJb.js +0 -47
- package/.output/public/_nuxt/DRPSi76A.js +0 -1
- package/.output/public/_nuxt/DS53kyHJ.js +0 -1
- package/.output/public/_nuxt/DWhBqv_7.js +0 -1
- package/.output/public/_nuxt/Dd0kK5WH.js +0 -1
- package/.output/public/_nuxt/Df7kUO0m.js +0 -1
- package/.output/public/_nuxt/Dga3Av-m.js +0 -1
- package/.output/public/_nuxt/DgwTpwfB.js +0 -1
- package/.output/public/_nuxt/DkI145a5.js +0 -1
- package/.output/public/_nuxt/DoFBTaDR.js +0 -1
- package/.output/public/_nuxt/Dr_dI5hB.js +0 -1
- package/.output/public/_nuxt/EPZOxdgq.js +0 -1
- package/.output/public/_nuxt/R1nNqTru.js +0 -1
- package/.output/public/_nuxt/S5DLdEpg.js +0 -4
- package/.output/public/_nuxt/builds/meta/7caf3cb3-d272-4dbd-bb3f-1eeb64fab5d1.json +0 -1
- package/.output/public/_nuxt/entry.ChQMshd4.css +0 -1
- package/.output/public/_nuxt/gCELhaU9.js +0 -1
- package/.output/public/_nuxt/ipDzNHcs.js +0 -5
- package/.output/public/_nuxt/kS3boz40.js +0 -1
- package/.output/public/_nuxt/qH_j2A3a.js +0 -1
- package/.output/public/_nuxt/r3SBLxtE.js +0 -1
- package/.output/public/_nuxt/rsiRgrVM.js +0 -1
- package/.output/public/_nuxt/swrbBdtB.js +0 -1
- package/.output/public/sw.js +0 -1
- package/.output/public/workbox-2fbc6a65.js +0 -1
- package/.output/server/chunks/build/Alert-Bp1Wz_sq.mjs.map +0 -1
- package/.output/server/chunks/build/Breadcrumb-C9ZPTLym.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-C3y42Vun.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-DNCp9pF-.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-Fr557IbV.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-cVOSIY93.mjs.map +0 -1
- package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.mjs +0 -640
- package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-BGwNmJ8J.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-Bdp-OwTN.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-Ji6ADuqF.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-D6xSOrme.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-DV1xwGu4.mjs.map +0 -1
- package/.output/server/chunks/build/EmptyState-DV3oT_xz.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-DeOP13Kr.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-Qpn58Nmr.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-B-GSn_VR.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-YEMWtKu1.mjs.map +0 -1
- package/.output/server/chunks/build/Label-DBvbHd3A.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-C3HG-EYm.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-CfA78Hm1.mjs.map +0 -1
- package/.output/server/chunks/build/PageStateCard-Bwee6JTk.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-9Ia825h8.mjs.map +0 -1
- package/.output/server/chunks/build/RovingFocusItem-CxhHdNGo.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-BpJqLHY9.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-BhmJ_RKM.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-COd9TuDq.mjs.map +0 -1
- package/.output/server/chunks/build/Select-ppPz926C.mjs.map +0 -1
- package/.output/server/chunks/build/Separator-CxZdx8kw.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-DDD4oqys.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-B95Rj237.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-xQQ3_ME1.mjs.map +0 -1
- package/.output/server/chunks/build/Table-CPhhVzDv.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-BV9XqjoO.mjs.map +0 -1
- package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs +0 -47
- package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-DMb-xSJa.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-CEzt76wk.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-DrrqQUVG.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-7vwuDPrZ.mjs.map +0 -1
- package/.output/server/chunks/build/VisuallyHiddenInput-C9eJVpPW.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-B2yirIuA.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-CE0Gso6i.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-bWcP2xFl.mjs.map +0 -1
- package/.output/server/chunks/build/about-CoJjvUwM.mjs.map +0 -1
- package/.output/server/chunks/build/account-Cn-eZqXM.mjs.map +0 -1
- package/.output/server/chunks/build/analytics-B276WPeU.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-aHcD0wyX.mjs.map +0 -1
- package/.output/server/chunks/build/default-BSzdkM_L.mjs.map +0 -1
- package/.output/server/chunks/build/edit-C9Z7oZeu.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-8kznMtBM.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-BqPF4Rxs.mjs.map +0 -1
- package/.output/server/chunks/build/help-content-DmFnuhNu.mjs.map +0 -1
- package/.output/server/chunks/build/index-BR9hw6qk.mjs.map +0 -1
- package/.output/server/chunks/build/index-Ba-Fifra.mjs.map +0 -1
- package/.output/server/chunks/build/index-CULN3-en.mjs.map +0 -1
- package/.output/server/chunks/build/index-DVUtBexc.mjs.map +0 -1
- package/.output/server/chunks/build/isValueEqualOrExist-DBZjbD_3.mjs.map +0 -1
- package/.output/server/chunks/build/login-D2XZDuek.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-_o6cMS6m.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-Dzm9c0u_.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-gpFzIEDj.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-B0wo5R-W.mjs.map +0 -1
- package/.output/server/chunks/build/settings-pNyPBXVa.mjs.map +0 -1
- package/.output/server/chunks/build/storage-XelzuyPy.mjs.map +0 -1
- package/.output/server/chunks/build/tags-DrCQ7QSw.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-pmOxi-AN.mjs.map +0 -1
- package/.output/server/chunks/build/timeout-hygiene-CNs71Iah.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-ZO987RY7.mjs.map +0 -1
- package/.output/server/chunks/build/useCopy-BQQKcwlq.mjs.map +0 -1
- package/.output/server/chunks/build/useFormControl-BLpq1s4O.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-kMZ7Jw5c.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-NjI2seBy.mjs.map +0 -1
- package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +0 -7
- package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +0 -1
- package/.output/server/chunks/build/useTreeViewCookie-DVYpxW-p.mjs.map +0 -1
- package/.output/server/chunks/build/users-NmAUZs3i.mjs.map +0 -1
- package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs +0 -940
- package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs.map +0 -1
- package/.output/server/chunks/build/wasted-time-CguAF9zc.mjs.map +0 -1
- /package/.output/public/_nuxt/{PageStateCard.BrM5HWjY.css → useCopyRich.BrM5HWjY.css} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as Vt}from"./B4jvLMfS.js";import{d as fe,b as ut,o as s,f as R,g as r,i as n,p as J,k as e,j as u,m as _,t as o,c as a,F as V,M as at,l as Re,ai as ot,v as ke,q as k,s as be,x as Ne,_ as _e,E as dt,y as oe,aj as Gt,h as M,r as O,G as Ie,O as he,H as Ue,n as Xe,z as He,B as me,ak as rt,D as Xt,P as ct,A as qt,u as Ae,w as je,af as Yt,C as Jt,ab as mt,a as Zt,K as Qt,e as es}from"./DHltYerF.js";import{_ as ft}from"./D6PUPmRC.js";import{_ as ts}from"./rsiRgrVM.js";import{_ as ss}from"./DZUgX70W.js";import{_ as ns,a as as}from"./CdMuck_X.js";import{_ as os,b as rs,a as ls,c as is,d as us}from"./BeUm5UNV.js";import{_ as ds}from"./DoFBTaDR.js";import{_ as Se}from"./DHXWp5yD.js";import{_ as gt}from"./BlA8mIS-.js";import{_ as qe}from"./Dwws9U0D.js";import{_ as cs}from"./wHnZ9OaL.js";import{u as ms,_ as fs}from"./BVf6Yx9V.js";import{p as pt,h as xe,k as Ve,x as gs,w as ps,d as yt,j as xt,i as Le,f as ht,a as ys,c as xs,g as ie}from"./BeKvLsja.js";import{b as vt}from"./Df7kUO0m.js";import{u as Ye}from"./By4YL7mx.js";import{_ as hs}from"./B1zMFx24.js";import{_ as kt}from"./xqiPI_FQ.js";import{_ as vs}from"./BjCHB89N.js";import{_ as bt}from"./swrbBdtB.js";import{_ as ks}from"./CazDIG_m.js";import{u as bs}from"./CfOLBbW9.js";import{_ as _s}from"./qpI-_f9Q.js";import{_ as _t}from"./BJtlcTrb.js";import{_ as wt}from"./C1dyLp_j.js";import{_ as ws}from"./CN1mJlvD.js";import{_ as Je}from"./BXY_PWcx.js";import{_ as $t}from"./DWhBqv_7.js";import{_ as $s}from"./ByuJWADR.js";import{_ as Ct}from"./B-5GukRk.js";import{u as Me}from"./DXbPFI1d.js";import{_ as Cs}from"./EPZOxdgq.js";import{_ as Rs}from"./DS53kyHJ.js";import{_ as Ts}from"./B2oUeBbA.js";import{u as Is}from"./CNMoZYMv.js";import{u as Ss,s as zs}from"./DWowvnwc.js";import"./BbS6Bwby.js";import"./B1X__ilH.js";import"./gnCL8GjZ.js";import"./r3SBLxtE.js";import"./D7W_4Sqc.js";import"./BHpUiv6j.js";import"./BeFDVhpA.js";import"./qH_j2A3a.js";import"./CPLJeOCb.js";import"./DkI145a5.js";import"./CcXaak_K.js";import"./e7zD3uJ0.js";import"./BUXSUkJ_.js";import"./BFP6M-20.js";import"./hH1UFE3Z.js";import"./Bd3HqPMF.js";const Ds={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Fs={class:"flex items-center gap-3 min-w-0"},Ps={class:"text-sm font-semibold truncate flex items-center gap-1"},js={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Ms={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ns={class:"text-gray-700 dark:text-gray-300"},As={class:"text-xs text-green-600 dark:text-green-400 tabular-nums whitespace-nowrap"},Bs={class:"text-xs text-red-600 dark:text-red-400 tabular-nums whitespace-nowrap"},Us={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ls={class:"text-xs text-amber-600 dark:text-amber-400 tabular-nums whitespace-nowrap",title:"Tests that never ran (maxFailures cutoff or a serial-group failure)"},Es={class:"text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"},Os={class:"text-xs text-gray-400 tabular-nums whitespace-nowrap"},Ws={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ks={class:"space-y-3"},Hs={class:"flex items-start gap-3"},Vs={class:"flex items-center gap-2.5 min-w-0 flex-1"},Gs={class:"min-w-0 flex-1"},Xs={class:"flex items-center gap-2"},qs={class:"text-base font-bold shrink-0 flex items-center gap-1"},Ys={class:"text-xs text-gray-500 ml-auto whitespace-nowrap"},Js={class:"p-2 space-y-1 min-w-32"},Zs=["onClick"],Qs={class:"grid grid-cols-3 sm:grid-cols-5 gap-2"},en={class:"text-xl font-bold mt-0.5"},tn={class:"relative"},sn={class:"text-xl font-bold mt-0.5 text-green-600 dark:text-green-400"},nn={class:"text-xl font-bold mt-0.5 text-red-600 dark:text-red-400"},an={class:"text-xl font-bold mt-0.5 text-gray-600 dark:text-gray-400"},on={class:"text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"},rn={key:0,class:"flex items-center gap-3"},ln={class:"flex-1 max-w-md"},un={class:"flex items-center gap-3 text-xs shrink-0"},dn={class:"flex items-center gap-1"},cn={class:"font-medium tabular-nums"},mn={key:0,class:"flex items-center gap-1"},fn={class:"font-medium tabular-nums"},gn={key:1,class:"flex items-center gap-1"},pn={class:"font-medium tabular-nums text-orange-600 dark:text-orange-400"},yn={key:2,class:"flex items-center gap-1"},xn={class:"font-medium tabular-nums text-amber-600 dark:text-amber-400"},hn={key:0,class:"flex items-center gap-3"},vn={class:"flex-1 min-w-0"},kn={key:1,class:"space-y-1.5 text-sm"},bn={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"},_n={key:0,class:"flex items-center justify-between gap-2 min-w-0"},wn={class:"truncate"},$n={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"},Cn={class:"space-y-3 text-sm"},Rn={key:0},Tn={class:"flex flex-wrap gap-1.5"},In={key:1,class:"flex items-center gap-1"},Sn={key:3},zn={class:"bg-gray-50 dark:bg-gray-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"},Dn={class:"m-0"},Fn=fe({__name:"RunSummary",props:{testRun:{},displayProgress:{},allReports:{},showCustomData:{type:Boolean},finalizing:{type:Boolean},activeFilter:{},totalWastedTime:{}},emits:["update:showCustomData","filter-status","label-updated"],setup(t,{emit:b}){const w=t,F=b,$=ut(),l=M(()=>w.testRun?.storageStats),C=M(()=>!!(w.testRun?.metadata?.ci||w.testRun?.environment||w.testRun?.playwrightVersion||w.testRun?.reporterVersion)),m=M(()=>!!w.testRun?.metadata?.scm),D=M(()=>!!(l.value?.totalFiles||w.finalizing)),K=M(()=>!!(w.testRun?.metadata?.tags?.length||w.testRun?.metadata?.projectDescription||w.testRun?.metadata?.relatedIssue||w.testRun?.metadata?.customData||w.testRun?.links?.length)),{summaryColSpanClass:E,blockColSpanClass:N}=ms(()=>[C,m,D,K].filter(z=>z.value).length),{copy:I,copied:A}=Ye(),H=O("file-line"),U=O(!1),j=M(()=>w.testRun?.testCases?w.testRun.testCases.filter(z=>z.status==="failed"||z.status==="timedout").map(z=>({filePath:(z.filePath||z.location?.split(":")[0])??"",title:z.title,line:z.location&&parseInt(z.location.split(":")[1]??"",10)||null,projectName:z.browser?.projectName||null})):[]);function g(){return vt(j.value,{mode:H.value})}async function f(){const z=g();z&&(U.value=!0,await I(z,{toast:"Retry command copied"}),setTimeout(()=>{U.value=!1},2e3))}const d=M(()=>U.value?"Copied!":yt(g()));function c(){const z=w.testRun;if(!z)return"";const i=z.status==="passed"?"✅":z.status==="failed"?"❌":z.status==="running"?"🔄":"⚠️",ue=z.label?` — ${z.label}`:"",h=z.project?.label??z.project?.name??"",T=z.totalTests??0,G=z.passedTests??0,te=z.failedTests??0,de=z.skippedTests??0,Y=z.didNotRunTests??0,v=z.flakyTests??0,q=xe(z.duration),ae=v>0?` · ${v} flaky`:"",se=Y>0?` · ${Y} didn't run`:"";return[`*Run #${z.id}*${ue}`,`Status: ${i} ${z.status} | Project: ${h}`,`Tests: ${T} total · ${G} passed · ${te} failed · ${de} skipped${se}${ae}`,`Duration: ${q}`].join(`
|
|
2
|
-
`)}const S=O(""),y=O(!1),x=O(!1);let P=!1;const Q=O(null);function Z(){P=!1,S.value=w.testRun?.label??"",y.value=!0,Ie(()=>Q.value?.focus())}async function ne(){if(x.value)return;if(P){P=!1;return}const z=w.testRun;if(z){x.value=!0;try{await $fetch(`/api/test-runs/${z.id}`,{method:"PATCH",body:{label:S.value||null}}),y.value=!1,F("label-updated")}catch(i){const ue=i&&typeof i=="object"&&"data"in i?i.data?.message:"Failed to save label";$.add({title:"Error",description:ue||"Failed to save label",color:"error"})}finally{x.value=!1}}}function ee(){P=!0,y.value=!1}function B(z){z.key==="Enter"?ne():z.key==="Escape"&&ee()}return(z,i)=>{const ue=os,h=ke,T=be,G=ds,te=Se,de=gt,Y=Ne,v=ft,q=_e,ae=dt,se=qe,ge=rs,Ce=ls,re=Gt,we=is,ze=cs,ye=fs;return s(),R(ye,{"storage-key":"test-run"},{folded:r(()=>[n("div",Ds,[n("div",Fs,[u(ue,{status:t.testRun?.status??"",size:"sm"},null,8,["status"]),n("span",Ps,[_(" Run #"+o(t.testRun?.id)+" ",1),e(y)?(s(),a(V,{key:0},[at(n("input",{ref_key:"labelInputRef",ref:Q,"onUpdate:modelValue":i[0]||(i[0]=p=>Re(S)?S.value=p:null),type:"text",placeholder:"Add a label...",class:"inline-block w-40 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:B,onBlur:ne},null,544),[[ot,e(S)]]),e(x)?(s(),R(h,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-gray-400 animate-spin shrink-0"})):k("",!0)],64)):(s(),a(V,{key:1},[t.testRun?.label?(s(),a("span",{key:0,class:"font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",onClick:Z},"— "+o(t.testRun.label),1)):(s(),a("button",{key:1,class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1",title:"Add a label",onClick:Z}," + label "))],64))]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),R(T,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:r(()=>[u(h,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),_(" "+o(t.testRun.shardsFinished??0)+"/"+o(t.testRun.shardTotal),1)]),_:1},8,["title"])):k("",!0)]),n("div",js,[n("span",Ms,[i[12]||(i[12]=_(" T: ",-1)),n("strong",Ns,o(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)]),n("span",As,[i[13]||(i[13]=_(" P: ",-1)),n("strong",null,o(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)]),n("span",Bs,[i[14]||(i[14]=_(" F: ",-1)),n("strong",null,o(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)]),n("span",Us,[i[15]||(i[15]=_(" S: ",-1)),n("strong",null,o(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)]),n("span",Ls,[i[16]||(i[16]=_(" DNR: ",-1)),n("strong",null,o(t.testRun?.didNotRunTests??0),1)]),n("span",Es,[i[17]||(i[17]=_(" Fl: ",-1)),n("strong",null,o(t.testRun?.flakyTests??0),1)]),u(G,{passed:t.displayProgress?.passedTests??t.testRun?.passedTests??0,failed:t.displayProgress?.failedTests??t.testRun?.failedTests??0,skipped:t.displayProgress?.skippedTests??t.testRun?.skippedTests??0,flaky:t.testRun?.flakyTests??0,"did-not-run":t.testRun?.didNotRunTests??0,total:t.displayProgress?.totalTests??t.testRun?.totalTests??0},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),n("span",Os,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun?.duration)),1)])])]),default:r(()=>[n("div",Ws,[n("div",{class:J(e(E))},[u(se,{class:"shadow-xs h-full"},{default:r(()=>[n("div",Ks,[n("div",Hs,[n("div",Vs,[u(ue,{status:t.testRun?.status??"",size:"md"},null,8,["status"]),n("div",Gs,[n("div",Xs,[n("h2",qs,[_(" Run #"+o(t.testRun?.id)+" ",1),e(y)?(s(),a(V,{key:0},[at(n("input",{ref_key:"labelInputRef",ref:Q,"onUpdate:modelValue":i[1]||(i[1]=p=>Re(S)?S.value=p:null),type:"text",placeholder:"Add a label...",class:"inline-block w-48 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:B,onBlur:ne},null,544),[[ot,e(S)]]),e(x)?(s(),R(h,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-gray-400 animate-spin shrink-0"})):k("",!0)],64)):(s(),a(V,{key:1},[t.testRun?.label?(s(),a("span",{key:0,class:"font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",onClick:Z},"— "+o(t.testRun.label),1)):(s(),a("button",{key:1,class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1.5",title:"Add a label",onClick:Z}," + label "))],64)),u(te,{topic:"run.summary"})]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),R(T,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:r(()=>[u(h,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),_(" "+o(t.testRun.shardsFinished??0)+"/"+o(t.testRun.shardTotal),1)]),_:1},8,["title"])):k("",!0),t.testRun?.precedingMarker?(s(),R(v,{key:1,text:`This run started after: ${t.testRun.precedingMarker.label}`},{default:r(()=>[u(Y,{to:`/projects/${t.testRun.projectId}?tab=timeline`,class:"shrink-0 inline-flex items-center gap-1"},{default:r(()=>[i[18]||(i[18]=n("span",{class:"text-xs text-muted"},"After",-1)),u(de,{marker:t.testRun.precedingMarker,size:"xs"},null,8,["marker"])]),_:1},8,["to"])]),_:1},8,["text"])):k("",!0),n("span",Ys,o(t.testRun?.project?.label??t.testRun?.project?.name)+" · Started "+o(("prettyDateFormat"in z?z.prettyDateFormat:e(pt))(t.testRun?.startTime)),1),u(v,{text:e(A)?"Copied!":"Copy run summary"},{default:r(()=>[u(q,{size:"xs",variant:"ghost",color:"neutral",icon:e(A)?"i-lucide-check":"i-lucide-clipboard",class:"shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",onClick:i[2]||(i[2]=p=>e(I)(c(),{toast:"Run summary copied"}))},null,8,["icon"])]),_:1},8,["text"]),e(j).length>0?(s(),R(ae,{key:2},{content:r(()=>[n("div",Js,[i[20]||(i[20]=n("p",{class:"text-xs font-medium text-gray-500 px-2 py-1"},"Mode",-1)),(s(),a(V,null,oe(["file-line","grep","file"],p=>n("button",{key:p,class:J(["w-full text-left px-2 py-1 text-sm rounded hover:bg-gray-100 dark:hover:bg-gray-800",e(H)===p?"bg-primary/10 text-primary":""]),onClick:ve=>H.value=p},o(p==="file-line"?"File:line":p==="grep"?"Title (grep)":"File only"),11,Zs)),64))])]),default:r(()=>[u(q,{size:"xs",color:"warning",variant:"subtle",icon:e(U)?"i-lucide-check":"i-lucide-play",title:e(d),onClick:i[3]||(i[3]=p=>f())},{default:r(()=>[...i[19]||(i[19]=[_(" Retry ",-1)])]),_:1},8,["icon","title"])]),_:1})):k("",!0)])])])]),n("div",Qs,[n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="all"?"bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500":"bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"]),onClick:i[4]||(i[4]=p=>F("filter-status","all"))},[i[21]||(i[21]=n("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Total",-1)),n("p",en,o(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)],2),n("div",tn,[n("button",{class:J(["rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",t.activeFilter==="passed"?"bg-green-100 dark:bg-green-900/30 ring-2 ring-green-400 dark:ring-green-600":"bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30"]),onClick:i[5]||(i[5]=p=>F("filter-status","passed"))},[i[22]||(i[22]=n("p",{class:"text-xs font-medium text-green-700 dark:text-green-400 uppercase tracking-wider"},"Passed",-1)),n("p",sn,o(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)],2),(t.testRun?.flakyTests??0)>0?(s(),a("button",{key:0,class:J(["absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",t.activeFilter==="flaky"?"bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600":"bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"]),title:"Flaky — passed only after a retry (a subset of passed). Click to filter.",onClick:i[6]||(i[6]=p=>F("filter-status","flaky"))},[u(h,{name:"i-lucide-shuffle",class:"size-3"}),_(" "+o(t.testRun?.flakyTests??0),1)],2)):k("",!0)]),n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="failed"?"bg-red-100 dark:bg-red-900/30 ring-2 ring-red-400 dark:ring-red-600":"bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30"]),onClick:i[7]||(i[7]=p=>F("filter-status","failed"))},[i[23]||(i[23]=n("p",{class:"text-xs font-medium text-red-700 dark:text-red-400 uppercase tracking-wider"},"Failed",-1)),n("p",nn,o(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)],2),n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="skipped"?"bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500":"bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"]),onClick:i[8]||(i[8]=p=>F("filter-status","skipped"))},[i[24]||(i[24]=n("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Skipped",-1)),n("p",an,o(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)],2),n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="didnotrun"?"bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600":"bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"]),title:"Tests that never ran (maxFailures cutoff or a serial-group failure)",onClick:i[9]||(i[9]=p=>F("filter-status","didnotrun"))},[i[25]||(i[25]=n("p",{class:"text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"}," Didn't run ",-1)),n("p",on,o(t.testRun?.didNotRunTests??0),1)],2)]),n("div",null,[t.testRun?(s(),a("div",rn,[n("div",ln,[u(G,{passed:t.displayProgress?.passedTests??t.testRun?.passedTests??0,failed:t.displayProgress?.failedTests??t.testRun?.failedTests??0,skipped:t.displayProgress?.skippedTests??t.testRun?.skippedTests??0,flaky:t.testRun?.flakyTests??0,"did-not-run":t.testRun?.didNotRunTests??0,total:t.displayProgress?.totalTests??t.testRun?.totalTests??0},null,8,["passed","failed","skipped","flaky","did-not-run","total"])]),n("div",un,[n("div",dn,[u(h,{name:"i-lucide-clock",class:"size-3.5 text-gray-400"}),n("span",cn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun?.duration)),1)]),t.testRun?.avgTestDuration?(s(),a("div",mn,[u(h,{name:"i-lucide-gauge",class:"size-3.5 text-gray-400"}),i[26]||(i[26]=n("span",{class:"text-gray-500 hidden sm:inline"},"Avg",-1)),n("span",fn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun.avgTestDuration)),1)])):k("",!0),t.testRun?.p90TestDuration?(s(),a("div",gn,[u(h,{name:"i-lucide-arrow-up-right",class:"size-3.5 text-orange-500"}),i[27]||(i[27]=n("span",{class:"text-gray-500 hidden sm:inline"},"P90",-1)),n("span",pn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun.p90TestDuration)),1)])):k("",!0),t.totalWastedTime&&t.totalWastedTime>0?(s(),a("div",yn,[u(h,{name:"i-lucide-clock",class:"size-3.5 text-amber-500"}),i[28]||(i[28]=n("span",{class:"text-gray-500 hidden sm:inline"},"Wasted",-1)),n("span",xn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.totalWastedTime)),1)])):k("",!0)])])):k("",!0)])])]),_:1})],2),e(C)?(s(),R(ge,{key:0,ci:t.testRun?.metadata?.ci,environment:t.testRun?.environment,"playwright-version":t.testRun?.playwrightVersion,"reporter-version":t.testRun?.reporterVersion,class:J(e(N))},null,8,["ci","environment","playwright-version","reporter-version","class"])):k("",!0),e(m)?(s(),R(Ce,{key:1,scm:t.testRun.metadata.scm,class:J(e(N))},null,8,["scm","class"])):k("",!0),e(D)?(s(),R(we,{key:2,class:J(e(N)),title:"Storage",icon:"i-lucide-database",help:"run.reports",subtitle:e(l)?.totalFiles?`${e(l).totalFiles} files · ${("formatBytes"in z?z.formatBytes:e(Ve))(e(l).totalSize)}`:void 0},{default:r(()=>[t.finalizing?(s(),a("div",hn,[u(h,{name:"i-lucide-upload",class:"size-5 text-info shrink-0 animate-pulse"}),n("div",vn,[i[29]||(i[29]=n("div",{class:"flex items-center justify-between mb-1"},[n("span",{class:"text-sm font-medium"},"Finalizing test run"),n("span",{class:"text-xs text-gray-500"},"Uploading reports & traces…")],-1)),u(re,{value:null,size:"sm",color:"info",class:"rounded-full animate-pulse"})])])):k("",!0),e(l)?.totalFiles?(s(),a("div",kn,[(s(!0),a(V,null,oe(t.allReports,p=>(s(),a("div",{key:p.label,class:"flex items-center justify-between gap-2 min-w-0"},[u(q,{href:`/api/files/${("getFileApiPath"in z?z.getFileApiPath:e(ps))(p.path)}`,icon:("reportIcon"in z?z.reportIcon:e(gs))(p.type),target:"_blank",size:"xs",variant:"outline",class:"min-w-0",ui:{label:"truncate"}},{default:r(()=>[_(o(p.label),1)]),_:2},1032,["href","icon"]),n("span",bn,o(("formatBytes"in z?z.formatBytes:e(Ve))(p.size)),1)]))),128)),e(l).testCaseFilesCount>0?(s(),a("div",_n,[n("span",wn,"Test files ("+o(e(l).testCaseFilesCount)+")",1),n("span",$n,o(("formatBytes"in z?z.formatBytes:e(Ve))(e(l).testCaseFilesSize)),1)])):k("",!0)])):k("",!0)]),_:1},8,["class","subtitle"])):k("",!0),e(K)?(s(),R(we,{key:3,class:J(e(N)),title:"Other",icon:"i-lucide-tags",help:"run.metadata"},{default:r(()=>[n("div",Cn,[t.testRun.metadata.tags&&t.testRun.metadata.tags.length>0?(s(),a("div",Rn,[n("div",Tn,[(s(!0),a(V,null,oe(t.testRun.metadata.tags,p=>(s(),R(T,{key:p,color:"neutral",variant:"soft",size:"sm"},{default:r(()=>[_(o(p),1)]),_:2},1024))),128))])])):k("",!0),t.testRun.metadata.relatedIssue?(s(),a("p",In,[u(h,{name:"i-lucide-link",class:"w-3.5 h-3.5 text-gray-400 shrink-0"}),n("span",null,o(t.testRun.metadata.relatedIssue),1)])):k("",!0),u(ze,{"entity-type":"test_run","entity-id":t.testRun.id,links:t.testRun.links??null,onUpdated:i[10]||(i[10]=p=>z.$emit("label-updated"))},null,8,["entity-id","links"]),t.testRun.metadata.customData?(s(),R(q,{key:2,size:"xs",variant:"ghost",color:"neutral",icon:t.showCustomData?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:i[11]||(i[11]=p=>F("update:showCustomData",!t.showCustomData))},{default:r(()=>[...i[30]||(i[30]=[_(" Custom data ",-1)])]),_:1},8,["icon"])):k("",!0),t.showCustomData&&t.testRun.metadata.customData?(s(),a("div",Sn,[n("div",zn,[n("pre",Dn,o(JSON.stringify(t.testRun.metadata.customData,null,2)),1)])])):k("",!0)])]),_:1},8,["class"])):k("",!0)])]),_:1})}}}),Pn=Object.assign(Fn,{__name:"RunSummary"}),jn={class:"rounded-lg border border-default text-sm flex flex-col flex-1 min-h-0"},Mn={class:"flex items-center justify-end px-3 py-1.5 border-b border-default bg-elevated shrink-0"},Nn=["disabled","title"],An={class:"overflow-y-auto flex-1 min-h-0"},Bn=["onClick"],Un={key:1,class:"font-medium truncate min-w-0 text-muted"},Ln={key:2,class:"flex items-center gap-1 shrink-0"},En={class:"flex items-center gap-2 shrink-0 tabular-nums"},On={key:0,class:"text-xs text-red-600 dark:text-red-400 font-medium"},Wn={key:1,class:"text-xs text-green-600 dark:text-green-400"},Kn={key:2,class:"text-xs text-muted"},Hn={key:3,class:"text-xs text-amber-600 dark:text-amber-400"},Vn={key:4,class:"text-xs text-info"},Gn=["href","onClick"],Xn={class:"flex items-center gap-2 shrink-0"},qn={key:0,class:"text-xs text-info"},Yn={key:1,class:"text-xs text-muted tabular-nums"},Jn={key:0,class:"text-center py-8 text-muted"},Zn=fe({__name:"TestCasesTree",props:{testCases:{},suites:{},hasFilter:{type:Boolean},highlightedCaseId:{},projectKey:{},projectName:{}},setup(t){const b=t,w=M(()=>{const g=new Map;for(const f of b.suites)g.set(`${f.filePath}${f.suitePath.join("")}`,f);return g});function F(g){return g==="timedOut"||g==="timedout"?"failed":g}function $(g){return g==="fixme"||g==="slow"?"warning":g==="fail"?"error":g==="skip"?"neutral":g==="tag"?"primary":"info"}function l(g){switch(g){case"fixme":return"i-lucide-wrench";case"skip":return"i-lucide-skip-forward";case"slow":return"i-lucide-timer";case"fail":return"i-lucide-x-circle";case"tag":return"i-lucide-tag";default:return null}}function C(g){return g.type==="tag"?g.description??g.type:g.type}function m(g){const f={passed:0,failed:0,skipped:0,didnotrun:0,running:0,total:0};for(const d of g){const c=F(d.status);c in f&&f[c]++,f.total++}return f}const D=O(new Set),K=M(()=>D.value.size===0);function E(g){return b.hasFilter?!0:!D.value.has(g)}function N(g){if(b.hasFilter)return;const f=new Set(D.value);f.has(g)?f.delete(g):f.add(g),D.value=f}function I(){const g=[],f=new Map;for(const d of b.testCases){const c=d.filePath??"unknown";f.has(c)||f.set(c,[]),f.get(c).push(d)}for(const[d,c]of f){g.push(`file:${d}`);const S=new Set;for(const y of c){const x=y.suitePath??[];for(let P=1;P<=x.length;P++)S.add(`group:${d}${x.slice(0,P).join("")}`)}for(const y of S)g.push(y)}return g}function A(){D.value=new Set(I())}function H(){D.value=new Set}function U(g,f,d,c,S){const y=f.filter(Q=>(Q.suitePath??[]).length===c.length),x=f.filter(Q=>(Q.suitePath??[]).length>c.length),P=new Map;for(const Q of x){const Z=(Q.suitePath??[])[c.length];P.has(Z)||P.set(Z,[]),P.get(Z).push(Q)}for(const[Q,Z]of P){const ne=[...c,Q],ee=`group:${d}${ne.join("")}`,B=w.value.get(`${d}${ne.join("")}`);g.push({kind:"group",depth:S,key:ee,label:Q,stats:m(Z),mode:B?.mode??"default",annotations:B?.annotations??[]}),E(ee)&&U(g,Z,d,ne,S+1)}for(const Q of y)g.push({kind:"test",depth:S,key:`test:${Q.id}`,test:Q})}const j=M(()=>{const g=[],f=new Map;for(const d of b.testCases){const c=d.filePath??"unknown";f.has(c)||f.set(c,[]),f.get(c).push(d)}for(const[d,c]of[...f.entries()].sort(([S],[y])=>S.localeCompare(y))){const S=`file:${d}`;g.push({kind:"group",depth:0,key:S,label:d,stats:m(c)}),E(S)&&U(g,c,d,[],1)}return g});return(g,f)=>{const d=ke,c=bt,S=be,y=_e;return s(),a("div",jn,[n("div",Mn,[n("button",{class:J(["flex items-center gap-1 text-xs transition-colors",t.hasFilter?"text-muted cursor-not-allowed opacity-50":"text-muted hover:text-default"]),disabled:t.hasFilter,title:t.hasFilter?"Clear filters to collapse/expand":K.value?"Collapse all":"Expand all",onClick:f[0]||(f[0]=x=>K.value?A():H())},[u(d,{name:K.value?"i-lucide-fold-vertical":"i-lucide-unfold-vertical",class:"size-3.5"},null,8,["name"]),_(" "+o(K.value?"Collapse all":"Expand all"),1)],10,Nn)]),n("div",An,[(s(!0),a(V,null,oe(j.value,x=>(s(),a(V,{key:x.key},[x.kind==="group"?(s(),a("div",{key:0,class:J(["flex items-center gap-2 py-2 pr-4 border-b border-default last:border-b-0 select-none sticky",[x.depth===0?"bg-elevated":"bg-default",!t.hasFilter&&"cursor-pointer"]]),style:he({paddingLeft:`${x.depth*20+12}px`,top:`${x.depth*36}px`,zIndex:20-x.depth}),onClick:P=>N(x.key)},[u(d,{name:E(x.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 text-muted shrink-0"},null,8,["name"]),u(d,{name:x.depth===0?"i-lucide-file-code-2":"i-lucide-folder-open",class:J(["size-4 shrink-0",x.depth===0?"text-blue-500":"text-amber-500"])},null,8,["name","class"]),x.depth===0?(s(),a("span",{key:0,class:"min-w-0",onClick:f[1]||(f[1]=Ue(()=>{},["stop"]))},[u(c,{"file-path":x.label,"project-key":t.projectKey,"project-name":t.projectName,class:"font-medium text-default"},null,8,["file-path","project-key","project-name"])])):(s(),a("span",Un,o(x.label),1)),x.depth>0?(s(),a("div",Ln,[x.mode==="parallel"?(s(),R(S,{key:0,color:"success",variant:"soft",size:"xs"},{default:r(()=>[...f[2]||(f[2]=[_("parallel",-1)])]),_:1})):k("",!0),x.mode==="serial"?(s(),R(S,{key:1,color:"warning",variant:"soft",size:"xs"},{default:r(()=>[...f[3]||(f[3]=[_("serial",-1)])]),_:1})):k("",!0),(s(!0),a(V,null,oe(x.annotations,P=>(s(),R(S,{key:`${P.type}:${P.description??""}`,color:$(P.type),variant:"soft",size:"xs",title:P.type!=="tag"?P.description??void 0:void 0,class:"gap-1"},{default:r(()=>[l(P.type)?(s(),R(d,{key:0,name:l(P.type),class:"size-2.5 shrink-0"},null,8,["name"])):k("",!0),_(" "+o(C(P)),1)]),_:2},1032,["color","title"]))),128))])):k("",!0),f[4]||(f[4]=n("div",{class:"flex-1"},null,-1)),n("div",En,[x.stats.failed>0?(s(),a("span",On,o(x.stats.failed)+" failed ",1)):k("",!0),x.stats.passed>0?(s(),a("span",Wn,o(x.stats.passed)+" passed ",1)):k("",!0),x.stats.skipped>0?(s(),a("span",Kn,o(x.stats.skipped)+" skipped",1)):k("",!0),x.stats.didnotrun>0?(s(),a("span",Hn,o(x.stats.didnotrun)+" didn't run ",1)):k("",!0),x.stats.running>0?(s(),a("span",Vn,o(x.stats.running)+" running",1)):k("",!0)])],14,Bn)):(s(),a("div",{key:1,class:J(["flex items-center gap-2 pr-3 py-1.5 border-b border-default last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-900/40 transition-colors",t.highlightedCaseId===x.test.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),style:he({paddingLeft:`${x.depth*20+12}px`})},[u(d,{name:"i-lucide-flask-conical",class:"size-3.5 text-muted shrink-0"}),u(S,{color:("getStatusColor"in g?g.getStatusColor:e(Le))(x.test.status==="timedOut"||x.test.status==="timedout"?"failed":x.test.status),size:"xs",class:"capitalize shrink-0"},{default:r(()=>[_(o(("formatStatusLabel"in g?g.formatStatusLabel:e(xt))(x.test.status)),1)]),_:2},1032,["color"]),(s(!0),a(V,null,oe(x.test.testAnnotations??[],P=>(s(),R(S,{key:`${P.type}:${P.description??""}`,color:$(P.type),variant:"soft",size:"xs",title:P.type!=="tag"?P.description??void 0:void 0,class:"shrink-0 gap-1"},{default:r(()=>[l(P.type)?(s(),R(d,{key:0,name:l(P.type),class:"size-2.5 shrink-0"},null,8,["name"])):k("",!0),_(" "+o(C(P)),1)]),_:2},1032,["color","title"]))),128)),n("a",{href:`/test-run-cases/${x.test.id}`,class:"text-primary hover:underline truncate flex-1 min-w-0",onClick:Ue(P=>("navigateTo"in g?g.navigateTo:e(Xe))(`/test-run-cases/${x.test.id}`),["prevent"])},o(x.test.title),9,Gn),n("div",Xn,[x.test.status==="running"?(s(),a("span",qn,"In progress...")):x.test.duration?(s(),a("span",Yn,o(("formatDuration"in g?g.formatDuration:e(xe))(x.test.duration)),1)):k("",!0),x.test.workerIndex!=null?(s(),R(S,{key:2,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:`Worker ${x.test.workerIndex}`},{default:r(()=>[_(" w"+o(x.test.workerIndex),1)]),_:2},1032,["title"])):k("",!0),(x.test.retries??0)>0?(s(),R(S,{key:3,color:"warning",variant:"soft",size:"xs"},{default:r(()=>[_(o(x.test.retries)+"x ",1)]),_:2},1024)):k("",!0),u(y,{to:`/test-run-cases/${x.test.id}`,size:"xs",variant:"outline"},{default:r(()=>[...f[5]||(f[5]=[_(" View ",-1)])]),_:1},8,["to"])])],6))],64))),128)),j.value.length===0?(s(),a("div",Jn,[u(d,{name:"i-lucide-search-x",class:"size-6 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),f[6]||(f[6]=n("p",{class:"text-sm"},"No test cases match your filters.",-1))])):k("",!0)])])}}}),Qn=Object.assign(Zn,{__name:"TestCasesTree"}),ea={class:"flex flex-col min-h-0"},ta={class:"flex items-center rounded-md border border-default overflow-hidden"},sa={key:0,class:"text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"},na={key:1,class:"text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"},aa={class:"flex flex-wrap items-center gap-1"},oa=["onClick"],ra={key:0,class:"flex-1 min-h-0 max-lg:h-[70dvh] overflow-x-auto overflow-y-hidden rounded-lg border border-default"},la=["aria-rowcount"],ia=["aria-sort","aria-label","title","onClick"],ua={key:1,class:"truncate"},da={class:"px-3 py-2 flex items-center min-w-0",role:"cell"},ca={class:"px-3 py-2 min-w-0 space-y-0.5",role:"cell"},ma={class:"flex items-center gap-1.5 min-w-0"},fa=["href","title","onClick"],ga={class:"px-3 py-2 flex items-center",role:"cell"},pa={class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},ya={key:0,class:"text-info text-xs"},xa={key:1},ha={class:"px-3 py-2 flex items-center",role:"cell"},va={class:"px-3 py-2 flex items-center tabular-nums",role:"cell"},ka={key:0,class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},ba={key:0,class:"text-amber-600 dark:text-amber-400"},_a={key:1,class:"text-gray-400"},wa={class:"px-3 py-2 flex items-center justify-end",role:"cell"},$a={class:"flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-gray-500"},Ca={key:1,class:"text-center py-10 text-gray-500"},Ra={key:2,class:"text-center py-10 text-gray-500"},Ta=fe({__name:"TestCasesList",props:qt({testCases:{},suites:{},isLive:{type:Boolean},failureClusterFilter:{},projectKey:{},projectName:{}},{search:{default:""},searchModifiers:{},activeStatuses:{default:()=>[]},activeStatusesModifiers:{},browserFilter:{default:"all"},browserFilterModifiers:{}}),emits:["update:search","update:activeStatuses","update:browserFilter"],setup(t,{expose:b}){const{treeView:w,setTreeView:F}=bs("test-cases"),$=t,l=He(t,"search"),C=He(t,"activeStatuses"),m=He(t,"browserFilter"),D=O(!1),K=O(!1),E=[{label:"Passed",value:"passed",color:"green"},{label:"Failed",value:"failed",color:"red"},{label:"Skipped",value:"skipped",color:"gray"},{label:"Didn't run",value:"didnotrun",color:"amber"},{label:"Flaky",value:"flaky",color:"orange"}];function N(h){C.value.indexOf(h)>=0?C.value=C.value.filter(G=>G!==h):C.value=[...C.value,h]}const I=M(()=>{const h=new Set;for(const G of $.testCases){const te=G.browser?.projectName;te&&h.add(te)}const T=[{label:"All browsers",value:"all"}];for(const G of[...h].sort())T.push({label:G,value:G});return T});function A(h,T){return T==="failed"?h.status==="failed"||h.status==="timedOut"||h.status==="timedout":T==="flaky"?(h.retries??0)>0:h.status===T}const H=M(()=>{let h=$.testCases;if($.failureClusterFilter!=null&&(h=h.filter(T=>T.failureClusterId===$.failureClusterFilter)),C.value.length>0&&(h=h.filter(T=>C.value.some(G=>A(T,G)))),m.value!=="all"&&(h=h.filter(T=>T.browser?.projectName===m.value)),l.value){const T=l.value.toLowerCase();h=h.filter(G=>G.title.toLowerCase().includes(T)||G.location&&G.location.toLowerCase().includes(T))}return D.value&&(h=h.filter(T=>T.isNewRegression)),K.value&&(h=h.filter(T=>T.isNewFlaky)),h}),U=O(null),j=O("asc");function g(h){U.value!==h?(U.value=h,j.value="asc"):j.value==="asc"?j.value="desc":U.value=null}function f(h){return U.value!==h?"i-lucide-chevrons-up-down":j.value==="asc"?"i-lucide-chevron-up":"i-lucide-chevron-down"}function d(h,T){switch(T){case"browser":return h.browser?.projectName??"";case"title":return h.title??"";case"status":return h.status??"";case"duration":return h.duration??0;case"workerIndex":return h.workerIndex??-1;case"retries":return h.retries??0;case"wastedTimeMs":return h.wastedTimeMs??0;default:return""}}function c(h){if(h==null)return"";const T=Math.round(Math.abs(h));if(T===0)return"0s";const G=h<0?"−":"";if(T<1e3)return`${G}${T}ms`;const te=T/1e3;if(te<60)return`${G}${Number.isInteger(te)?te:te.toFixed(1)}s`;const de=Math.floor(te/60),Y=Math.round(te%60);return Y?`${G}${de}m ${Y}s`:`${G}${de}m`}const S=M(()=>{const h=H.value,T=U.value;if(!T)return h;const G=j.value==="asc"?1:-1;return[...h].sort((te,de)=>{const Y=d(te,T),v=d(de,T);return typeof Y=="number"&&typeof v=="number"?(Y-v)*G:String(Y).localeCompare(String(v))*G})}),y=M(()=>$.testCases.some(h=>(h.wastedTimeMs??0)>0)),x=M(()=>{const h=[{key:"browser",label:"Browser",sortable:!0,width:"3.25rem",align:"left",icon:"i-lucide-monitor"},{key:"title",label:"Test case",sortable:!0,width:"minmax(12rem, 3fr)",align:"left"},{key:"status",label:"Status",sortable:!0,width:"6rem",align:"left"},{key:"duration",label:"Duration",sortable:!0,width:"7rem",align:"left"},{key:"workerIndex",label:"Worker",sortable:!0,width:"6rem",align:"left"},{key:"retries",label:"Retries",sortable:!0,width:"6.5rem",align:"left"}];return y.value&&h.push({key:"wastedTimeMs",label:"Wasted",sortable:!0,width:"6rem",align:"left"}),h.push({key:"actions",label:"Actions",sortable:!1,width:"7.5rem",align:"right"}),h}),P=M(()=>x.value.map(h=>h.width).join(" ")),Q=M(()=>y.value?"55rem":"49rem"),Z=M(()=>l.value!==""||C.value.length>0||m.value!=="all"||$.failureClusterFilter!=null),ne=O(null),ee=O(!1),B=O(null);function z(h){return h.scrollHeight-h.scrollTop-h.clientHeight<50}function i(h){const T=h.target;T&&(ee.value=!z(T))}me(()=>$.isLive,h=>{h||(ee.value=!1)}),me(()=>S.value.length,()=>{!$.isLive||ee.value||Ie(()=>ne.value?.scrollToBottom())});function ue(h){F(!1),B.value=h;const T=()=>{const G=S.value.findIndex(te=>te.id===h);G>=0&&ne.value?.scrollToItem(G,{behavior:"smooth"})};Ie(()=>{ne.value?T():setTimeout(T,60),setTimeout(()=>{B.value=null},3e3)})}return b({scrollToCase:ue}),(h,T)=>{const G=ke,te=Se,de=Xt,Y=hs,v=kt,q=vs,ae=Qn,se=ks,ge=be,Ce=bt,re=_e,we=rt("DynamicScrollerItem"),ze=rt("DynamicScroller"),ye=ct;return s(),a("div",ea,[u(q,{class:"mb-4 shrink-0"},{start:r(()=>[n("div",ta,[n("button",{class:J(["px-2 py-1 text-xs transition-colors",e(w)?"text-muted hover:bg-elevated/60":"bg-primary text-white dark:text-white"]),title:"Flat list",onClick:T[0]||(T[0]=p=>e(F)(!1))},[u(G,{name:"i-lucide-list",class:"size-3.5"})],2),n("button",{class:J(["px-2 py-1 text-xs transition-colors",e(w)?"bg-primary text-white dark:text-white":"text-muted hover:bg-elevated/60"]),title:"Tree view",onClick:T[1]||(T[1]=p=>e(F)(!0))},[u(G,{name:"i-lucide-folder-tree",class:"size-3.5"})],2)]),t.isLive?(s(),a("span",sa,[_(o(t.testCases.length)+" completed ",1),u(te,{topic:"run.live"})])):(s(),a("span",na,[_(o(S.value.length)+o(S.value.length!==t.testCases.length?` / ${t.testCases.length}`:"")+" cases ",1),u(te,{topic:"run.test-cases"})]))]),default:r(()=>[u(de,{modelValue:l.value,"onUpdate:modelValue":T[2]||(T[2]=p=>l.value=p),placeholder:"Search test cases...",icon:"i-lucide-search",size:"sm",class:"min-w-48 max-sm:flex-1"},null,8,["modelValue"]),n("div",aa,[(s(),a(V,null,oe(E,p=>n("button",{key:p.value,class:J(["inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap",C.value.includes(p.value)?p.color==="green"?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":p.color==="red"?"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400":p.color==="orange"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300":"bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700"]),onClick:ve=>N(p.value)},[n("span",{class:J(["size-2 rounded-full shrink-0",p.color==="green"?"bg-green-500":p.color==="red"?"bg-red-500":p.color==="orange"?"bg-orange-500":"bg-gray-400"])},null,2),_(" "+o(p.label),1)],10,oa)),64))]),u(Y,{modelValue:m.value,"onUpdate:modelValue":T[3]||(T[3]=p=>m.value=p),items:I.value,size:"sm",class:"w-36"},null,8,["modelValue","items"]),t.isLive?k("",!0):(s(),R(v,{key:0,modelValue:D.value,"onUpdate:modelValue":T[4]||(T[4]=p=>D.value=p),label:"New regressions",size:"sm"},null,8,["modelValue"])),t.isLive?k("",!0):(s(),R(v,{key:1,modelValue:K.value,"onUpdate:modelValue":T[5]||(T[5]=p=>K.value=p),label:"New flaky",size:"sm"},null,8,["modelValue"]))]),_:1}),e(w)&&t.testCases.length>0?(s(),R(ae,{key:0,"test-cases":S.value,suites:t.suites,"has-filter":Z.value,"highlighted-case-id":B.value,"project-key":t.projectKey,"project-name":t.projectName,class:"flex-1 min-h-0"},null,8,["test-cases","suites","has-filter","highlighted-case-id","project-key","project-name"])):e(w)?k("",!0):(s(),a(V,{key:1},[S.value.length>0?(s(),a("div",ra,[n("div",{class:"flex flex-col h-full",role:"table","aria-label":"Test cases","aria-rowcount":S.value.length+1,style:he({minWidth:Q.value})},[n("div",{class:"grid shrink-0 bg-elevated/50 border-b border-default",role:"row",style:he({gridTemplateColumns:P.value})},[(s(!0),a(V,null,oe(x.value,p=>(s(),a(V,{key:p.key},[p.sortable?(s(),a("button",{key:0,type:"button",role:"columnheader","aria-sort":U.value===p.key?j.value==="asc"?"ascending":"descending":"none","aria-label":p.icon?p.label:void 0,title:p.icon?p.label:void 0,class:J(["flex items-center gap-1 min-w-0 px-3 py-2 text-sm font-semibold select-none cursor-pointer hover:text-highlighted transition-colors",p.align==="right"?"justify-end":""]),onClick:ve=>g(p.key)},[p.icon?(s(),R(G,{key:0,name:p.icon,class:"shrink-0 size-4"},null,8,["name"])):(s(),a("span",ua,o(p.label),1)),u(G,{name:f(p.key),class:J(["shrink-0 size-3.5",U.value===p.key?"":"opacity-40"])},null,8,["name","class"])],10,ia)):(s(),a("div",{key:1,role:"columnheader",class:J(["px-3 py-2 text-sm font-semibold",p.align==="right"?"text-right":""])},o(p.label),3))],64))),128))],4),u(ye,null,{fallback:r(()=>[n("div",$a,[u(G,{name:"i-lucide-loader-circle",class:"size-4 mr-2 animate-spin"}),T[9]||(T[9]=_(" Loading test cases… ",-1))])]),default:r(()=>[u(ze,{ref_key:"scrollerRef",ref:ne,items:S.value,"min-item-size":44,"key-field":"id",role:"rowgroup",class:"flex-1 min-h-0",onScrollPassive:i},{default:r(({item:p,index:ve,active:De})=>[u(we,{item:p,active:De,"size-dependencies":[p.title,p.location,p.isNewRegression,p.isNewFlaky],"data-index":ve},{default:r(()=>[n("div",{class:J(["grid items-center border-b border-default text-sm transition-colors hover:bg-gray-50 dark:hover:bg-gray-900/50",B.value===p.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),role:"row",style:he({gridTemplateColumns:P.value})},[n("div",da,[u(se,{browser:p.browser},null,8,["browser"])]),n("div",ca,[n("div",ma,[p.isNewRegression?(s(),R(ge,{key:0,color:"error",variant:"solid",size:"xs",class:"uppercase tracking-wider"},{default:r(()=>[...T[6]||(T[6]=[_(" NEW ",-1)])]),_:1})):k("",!0),p.isNewFlaky?(s(),R(ge,{key:1,color:"info",variant:"solid",size:"xs",class:"uppercase tracking-wider"},{default:r(()=>[...T[7]||(T[7]=[_(" FLAKY ",-1)])]),_:1})):k("",!0),n("a",{href:`/test-run-cases/${p.id}`,class:"text-primary hover:underline font-medium truncate",title:p.title,onClick:Ue(Ze=>("navigateTo"in h?h.navigateTo:e(Xe))(`/test-run-cases/${p.id}`),["prevent"])},o(p.title),9,fa)]),p.location?(s(),R(Ce,{key:0,location:p.location,"project-key":t.projectKey,"project-name":t.projectName,class:"text-xs text-gray-400 dark:text-gray-500"},null,8,["location","project-key","project-name"])):k("",!0)]),n("div",ga,[u(ge,{color:("getStatusColor"in h?h.getStatusColor:e(Le))(p.status==="timedOut"||p.status==="timedout"?"failed":p.status),class:"capitalize"},{default:r(()=>[_(o(("formatStatusLabel"in h?h.formatStatusLabel:e(xt))(p.status)),1)]),_:2},1032,["color"])]),n("div",pa,[p.status==="running"?(s(),a("span",ya,"In progress...")):(s(),a("span",xa,o(c(p.duration)),1))]),n("div",ha,[p.workerIndex!=null?(s(),R(ge,{key:0,color:"neutral",variant:"soft",class:"font-mono text-xs"},{default:r(()=>[_(o(p.workerIndex),1)]),_:2},1024)):k("",!0)]),n("div",va,o(p.retries&&p.retries>0?p.retries:""),1),y.value?(s(),a("div",ka,[p.wastedTimeMs?(s(),a("span",ba,o(c(p.wastedTimeMs)),1)):(s(),a("span",_a,"—"))])):k("",!0),n("div",wa,[u(re,{to:`/test-run-cases/${p.id}`,size:"sm",variant:"outline"},{default:r(()=>[...T[8]||(T[8]=[_(" View details ",-1)])]),_:1},8,["to"])])],6)]),_:2},1032,["item","active","size-dependencies","data-index"])]),_:1},8,["items"])]),_:1})],12,la)])):t.testCases.length===0?(s(),a("div",Ca,[u(G,{name:"i-lucide-beaker",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),T[10]||(T[10]=n("p",null,"No test cases recorded for this run.",-1))])):(s(),a("div",Ra,[u(G,{name:"i-lucide-search-x",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),T[11]||(T[11]=n("p",null,"No test cases match your filters.",-1))]))],64))])}}}),Ia=Object.assign(Ta,{__name:"TestCasesList"}),Sa={key:2,class:"p-4"},za={key:3,class:"p-4"},Da={key:4,class:"p-4"},Fa={key:5,class:"space-y-6 p-4"},Pa={class:"flex items-center gap-1.5 text-sm text-muted"},ja={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},Ma={class:"space-y-1"},Na={class:"text-xl font-semibold"},Aa={key:0},Ba={key:1},Ua={class:"space-y-1"},La={key:1,class:"text-xl font-semibold text-muted"},Ea={class:"space-y-1"},Oa={class:"space-y-0.5 text-sm"},Wa={key:0,class:"text-red-500"},Ka={key:1,class:"text-green-600"},Ha={key:2,class:"text-purple-500"},Va={key:3,class:"text-muted"},Ga={class:"space-y-1"},Xa={class:"font-medium text-primary hover:underline truncate"},qa={class:"text-gray-400 text-xs ml-auto shrink-0"},Ya={class:"space-y-1"},Ja={class:"font-medium text-primary hover:underline truncate"},Za={class:"space-y-1"},Qa={class:"font-medium text-primary hover:underline truncate"},eo={class:"space-y-1"},to={class:"font-medium text-primary hover:underline truncate"},so={class:"text-gray-400 text-xs ml-auto shrink-0"},no={class:"space-y-1"},ao={class:"font-medium text-primary hover:underline truncate"},oo={class:"grid grid-cols-2 gap-4"},ro={key:0},lo={class:"space-y-1"},io={class:"text-red-500 font-mono shrink-0"},uo={class:"truncate text-primary hover:underline"},co={key:1},mo={class:"space-y-1"},fo={class:"text-green-500 font-mono shrink-0"},go={class:"truncate text-primary hover:underline"},po={class:"space-y-1"},yo={class:"flex-1 truncate text-primary hover:underline"},xo={class:"text-gray-500 font-mono text-xs shrink-0"},ho={class:"w-24 h-2 rounded-full bg-gray-100 shrink-0"},vo={key:0,class:"flex items-center gap-1.5 text-xs text-amber-600 mb-3"},ko={class:"flex items-end gap-2 h-20"},bo={class:"text-xs text-gray-500"},_o={class:"text-xs text-gray-400"},wo={class:"space-y-1"},$o={class:"truncate"},Co=fe({__name:"RunInsights",props:{testRunId:{},runStatus:{},refreshKey:{}},setup(t){const b=t,w=M(()=>{if(!l.value)return"";const N=l.value.passRateDelta;return N>0?"text-green-600":N<0?"text-red-600":"text-muted"}),F=M(()=>{if(!l.value)return"";const N=l.value.passRateDelta;return N>0?"i-lucide-trending-up":N<0?"i-lucide-trending-down":"i-lucide-minus"}),$=M(()=>l.value?.avgDurationDelta==null?"":l.value.avgDurationDelta>0?"text-red-600":"text-green-600"),l=O(null),C=O(!1),m=O(null),D=M(()=>b.runStatus==="running"||b.runStatus==="initialising"||b.runStatus==="finalizing");async function K(){if(!b.testRunId||D.value){l.value=null;return}C.value=!0,m.value=null;try{l.value=await $fetch(`/api/test-runs/${b.testRunId}/insights`)}catch(N){console.error("[RunInsights] failed to load",N),m.value=N?.data?.message||N?.message||"Failed to load insights"}finally{C.value=!1}}me(()=>b.testRunId,K,{immediate:!0}),me(()=>b.refreshKey,(N,I)=>{N!==I&&N!==void 0&&K()});function E(N){return N==null?"—":N<1e3?`${N}ms`:`${(N/1e3).toFixed(1)}s`}return(N,I)=>{const A=_e,H=_s,U=_t,j=wt,g=ke,f=Se,d=ws,c=be,S=Ne;return e(m)?(s(),R(H,{key:0,text:e(m),padded:""},{action:r(()=>[u(A,{size:"sm",onClick:K},{default:r(()=>[...I[0]||(I[0]=[_("Retry",-1)])]),_:1})]),_:1},8,["text"])):e(C)?(s(),R(U,{key:1,padded:""})):e(D)?(s(),a("div",Sa,[u(j,{icon:"i-lucide-loader-circle",text:"Run in progress"},{default:r(()=>[...I[1]||(I[1]=[n("p",{class:"text-sm text-muted max-w-sm text-center"}," Insights are computed once the run finishes. Switch back here when the run completes. ",-1)])]),_:1})])):e(l)?e(l).hasBaseline?(s(),a("div",Fa,[n("div",Pa,[u(g,{name:"i-lucide-sparkles",class:"size-4 shrink-0 text-primary/70"}),I[3]||(I[3]=n("span",null,"Automatic highlights from this run",-1)),u(f,{topic:"run.insights"})]),u(d,{icon:"i-lucide-bar-chart-3","icon-class":"text-blue-500",title:"Run summary"},{default:r(()=>[n("div",ja,[n("div",Ma,[I[4]||(I[4]=n("p",{class:"text-xs text-muted"},"Pass rate",-1)),n("p",Na,o(e(l).passRate)+"%",1),n("div",{class:J(["flex items-center gap-1 text-xs",e(w)])},[u(g,{name:e(F),class:"size-3.5"},null,8,["name"]),e(l).passRateDelta!==0?(s(),a("span",Aa,o(e(l).passRateDelta>0?"+":"")+o(e(l).passRateDelta)+"pp vs baseline",1)):(s(),a("span",Ba,"Same as baseline"))],2)]),n("div",Ua,[I[5]||(I[5]=n("p",{class:"text-xs text-muted"},"Avg duration",-1)),e(l).avgDurationDelta!==null?(s(),a("p",{key:0,class:J(["text-xl font-semibold",e($)])},o(e(l).avgDurationDelta>0?"+":"")+o(e(l).avgDurationDelta)+"% ",3)):(s(),a("p",La,"—")),I[6]||(I[6]=n("p",{class:"text-xs text-muted"},"vs baseline (passing tests)",-1))]),n("div",Ea,[I[7]||(I[7]=n("p",{class:"text-xs text-muted"},"Changes",-1)),n("div",Oa,[e(l).newRegressions.length>0?(s(),a("p",Wa," +"+o(e(l).newRegressions.length)+" regressed ",1)):k("",!0),e(l).recovered.length>0?(s(),a("p",Ka,"+"+o(e(l).recovered.length)+" fixed",1)):k("",!0),e(l).newFlaky.length>0?(s(),a("p",Ha,"+"+o(e(l).newFlaky.length)+" flaky",1)):k("",!0),!e(l).newRegressions.length&&!e(l).recovered.length&&!e(l).newFlaky.length?(s(),a("p",Va," No status changes ")):k("",!0)])])])]),_:1}),e(l).newRegressions.length>0?(s(),R(d,{key:0,icon:"i-lucide-alert-circle","icon-class":"text-red-500",title:"New regressions",count:e(l).newRegressions.length},{default:r(()=>[n("div",Ga,[(s(!0),a(V,null,oe(e(l).newRegressions,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}`,class:"flex items-center gap-2 text-sm hover:bg-red-50 dark:hover:bg-red-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[u(c,{color:"error",variant:"solid",size:"xs"},{default:r(()=>[...I[8]||(I[8]=[_("NEW",-1)])]),_:1}),n("span",Xa,o(y.title),1),n("span",qa,o(E(y.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).recurrences.length>0?(s(),R(d,{key:1,icon:"i-lucide-refresh-cw","icon-class":"text-amber-500",title:"Recurring failures",count:e(l).recurrences.length},{default:r(()=>[n("div",Ya,[(s(!0),a(V,null,oe(e(l).recurrences,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}`,class:"flex items-center gap-2 text-sm hover:bg-amber-50 dark:hover:bg-amber-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[u(c,{color:"warning",variant:"solid",size:"xs"},{default:r(()=>[...I[9]||(I[9]=[_("RECURRING",-1)])]),_:1}),n("span",Ja,o(y.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).recovered.length>0?(s(),R(d,{key:2,icon:"i-lucide-check-circle","icon-class":"text-green-500",title:"Fixed tests",count:e(l).recovered.length},{default:r(()=>[n("div",Za,[(s(!0),a(V,null,oe(e(l).recovered,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}`,class:"flex items-center gap-2 text-sm hover:bg-green-50 dark:hover:bg-green-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[u(c,{color:"success",variant:"solid",size:"xs"},{default:r(()=>[...I[10]||(I[10]=[_("FIXED",-1)])]),_:1}),n("span",Qa,o(y.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).newFlaky.length>0?(s(),R(d,{key:3,icon:"i-lucide-flask","icon-class":"text-purple-500",title:"New flaky tests",count:e(l).newFlaky.length},{default:r(()=>[n("div",eo,[(s(!0),a(V,null,oe(e(l).newFlaky,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}?tab=history`,class:"flex items-center gap-2 text-sm hover:bg-purple-50 dark:hover:bg-purple-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[u(c,{color:"info",variant:"solid",size:"xs"},{default:r(()=>[...I[11]||(I[11]=[_("FLAKY",-1)])]),_:1}),n("span",to,o(y.title),1),n("span",so,o(E(y.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).flakyOnRetry.length>0?(s(),R(d,{key:4,icon:"i-lucide-repeat","icon-class":"text-orange-500",title:"Passed on retry",count:e(l).flakyOnRetry.length,subtitle:"Tests that passed but needed one or more retries"},{default:r(()=>[n("div",no,[(s(!0),a(V,null,oe(e(l).flakyOnRetry,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}?tab=history`,class:"flex items-center gap-2 text-sm hover:bg-orange-50 dark:hover:bg-orange-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[u(c,{color:"warning",variant:"subtle",size:"xs"},{default:r(()=>[_("×"+o(y.retries),1)]),_:2},1024),n("span",ao,o(y.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).mostRegressed.length>0||e(l).mostImproved.length>0?(s(),R(d,{key:5,icon:"i-lucide-trending-up","icon-class":"text-blue-500",title:"Performance changes"},{default:r(()=>[n("div",oo,[e(l).mostRegressed.length>0?(s(),a("div",ro,[I[12]||(I[12]=n("p",{class:"text-xs font-medium text-red-500 mb-2"},"Most regressed",-1)),n("div",lo,[(s(!0),a(V,null,oe(e(l).mostRegressed,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}?tab=performance`,class:"flex items-center gap-2 text-sm hover:bg-red-50 dark:hover:bg-red-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[n("span",io,"+"+o(y.pctChange)+"%",1),n("span",uo,o(y.title),1)]),_:2},1032,["to"]))),128))])])):k("",!0),e(l).mostImproved.length>0?(s(),a("div",co,[I[13]||(I[13]=n("p",{class:"text-xs font-medium text-green-500 mb-2"},"Most improved",-1)),n("div",mo,[(s(!0),a(V,null,oe(e(l).mostImproved,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}?tab=performance`,class:"flex items-center gap-2 text-sm hover:bg-green-50 dark:hover:bg-green-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[n("span",fo,o(y.pctChange)+"%",1),n("span",go,o(y.title),1)]),_:2},1032,["to"]))),128))])])):k("",!0)])]),_:1})):k("",!0),e(l).slowestTests.length>0?(s(),R(d,{key:6,icon:"i-lucide-clock","icon-class":"text-amber-500",title:"Slowest tests"},{default:r(()=>[n("div",po,[(s(!0),a(V,null,oe(e(l).slowestTests,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.testRunsCaseId}?tab=performance`,class:"flex items-center gap-2 text-sm hover:bg-amber-50 dark:hover:bg-amber-900/10 rounded px-1 -mx-1 transition-colors"},{default:r(()=>[n("div",yo,o(y.title),1),n("div",xo,o(E(y.duration)),1),n("div",ho,[n("div",{class:"h-full rounded-full bg-amber-400",style:he({width:Math.min(100,y.duration/(e(l).slowestTests[0]?.duration||1)*100)+"%"})},null,4)])]),_:2},1032,["to"]))),128))])]),_:1})):k("",!0),e(l).workerImbalance.length>1?(s(),R(d,{key:7,icon:"i-lucide-users","icon-class":"text-gray-500",title:"Worker distribution"},{default:r(()=>[e(l).workerImbalanceWarning?(s(),a("div",vo,[u(g,{name:"i-lucide-alert-triangle",class:"size-3.5 shrink-0"}),n("span",null,o(e(l).workerImbalanceWarning),1)])):k("",!0),n("div",ko,[(s(!0),a(V,null,oe(e(l).workerImbalance,y=>(s(),a("div",{key:y.workerIndex,class:"flex-1 flex flex-col items-center gap-1"},[n("span",bo,o(y.count),1),n("div",{class:"w-full bg-blue-400 rounded-t",style:he({height:Math.max(4,y.count/Math.max(...e(l).workerImbalance.map(x=>x.count))*60)+"px"})},null,4),n("span",_o,"W"+o(y.workerIndex),1)]))),128))])]),_:1})):k("",!0),e(l).clusterNew.length>0?(s(),R(d,{key:8,icon:"i-lucide-layers","icon-class":"text-purple-500",title:"New failure clusters",count:e(l).clusterNew.length},{default:r(()=>[n("div",wo,[(s(!0),a(V,null,oe(e(l).clusterNew,y=>(s(),R(S,{key:y.clusterId,to:`/failure-clusters/${y.clusterId}`,class:"flex items-center gap-2 text-sm text-primary hover:underline"},{default:r(()=>[n("span",$o,o(y.signature),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0)])):(s(),a("div",Da,[u(j,{icon:"i-lucide-git-compare-arrows",text:"No baseline run found"},{default:r(()=>[...I[2]||(I[2]=[n("p",{class:"text-sm text-muted max-w-sm text-center"}," Insights compare this run against the most recent passing run in the same project. No previous passing run exists yet — once you have at least two completed runs, comparisons will appear here automatically. ",-1)])]),_:1})])):(s(),a("div",za,[u(j,{text:"No insights yet"})]))}}}),Ro=Object.assign(Co,{__name:"RunInsights"}),To=fe({__name:"ClusterDiagnosis",props:{clusterId:{}},setup(t){return(b,w)=>{const F=$s;return s(),R(F,{"cluster-id":t.clusterId},null,8,["cluster-id"])}}}),Io=Object.assign(To,{__name:"ClusterDiagnosis"}),So={class:"pt-4 space-y-3"},zo={key:0,class:"flex items-center justify-center py-8 text-gray-500 gap-2"},Do={class:"flex items-center justify-between gap-3"},Fo={class:"text-sm text-gray-500 dark:text-gray-400 inline-flex items-center gap-1"},Po={class:"min-w-0 space-y-0.5"},jo=["title"],Mo={key:0,class:"text-xs text-gray-500 truncate block"},No={class:"font-mono"},Ao={key:1,class:"text-gray-400 text-xs"},Bo={key:1,class:"text-gray-400 text-xs"},Uo={class:"text-sm tabular-nums"},Lo={key:0,class:"flex flex-wrap gap-1"},Eo={key:1,class:"text-gray-400 text-xs"},Oo={key:0,class:"flex items-center gap-1 text-xs text-gray-500"},Wo={key:2,class:"text-gray-400 text-xs"},Ko={key:0,class:"text-xs font-medium text-warning-500"},Ho={key:1,class:"text-sm text-gray-500 whitespace-nowrap"},Vo={key:0,class:"ml-1 text-xs text-gray-400"},Go={class:"flex justify-end gap-2"},Xo={key:2,class:"flex flex-col items-center justify-center py-8 text-gray-500 gap-2"},qo=fe({__name:"FailureGroups",props:{refreshKey:{}},emits:["selectCluster"],async setup(t,{emit:b}){let w,F;const $=b,l=t,m=Ae().params.id,{data:D,pending:K,refresh:E}=([w,F]=je(()=>Me(`/api/test-runs/${m}/failure-groups`,{lazy:!0,server:!1},"$qddF1IOQ64")),w=await w,F(),w);me(()=>l.refreshKey,(d,c)=>{d!==c&&d!==void 0&&E()});const N=O(null),{copy:I,copied:A}=Ye(),H=M(()=>D.value?D.value.flatMap(d=>d.cases.filter(c=>!c.passedOnRetry).map(c=>({filePath:c.filePath,title:c.title,line:null,projectName:null}))):[]),U=M(()=>vt(H.value));function j(){const d=U.value;d&&I(d,{toast:"Retry command copied"})}const g=[{accessorKey:"signature",header:ie("Signature")},{accessorKey:"errorType",header:ie("Type")},{accessorKey:"status",header:ie("Status")},{accessorKey:"caseCount",header:ie("Tests")},{accessorKey:"signals",header:"Signals"},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"firstSeenRunId",header:ie("Known since")},{id:"actions",header:"Actions"}],f=M(()=>D.value?.reduce((d,c)=>d+c.caseCount,0)??0);return(d,c)=>{const S=ke,y=Se,x=_e,P=be,Q=Ne,Z=Je,ne=$t,ee=qe,B=Io,z=Ct;return s(),a(V,null,[n("div",So,[e(K)?(s(),a("div",zo,[u(S,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),c[2]||(c[2]=n("span",null,"Grouping failures...",-1))])):e(D)&&e(D).length?(s(),a(V,{key:1},[n("div",Do,[n("p",Fo,[_(o(e(f))+" failing "+o(e(f)===1?"test":"tests")+" across "+o(e(D).length)+" "+o(e(D).length===1?"group":"groups")+" ",1),u(y,{topic:"cluster.concept"})]),e(H).length>0?(s(),R(x,{key:0,size:"xs",variant:"outline",color:"neutral",icon:e(A)?"i-lucide-check":"i-lucide-play",title:e(A)?"Copied!":("copyPreview"in d?d.copyPreview:e(yt))(e(U)),onClick:c[0]||(c[0]=i=>j())},{default:r(()=>[...c[3]||(c[3]=[_(" Copy retry command ",-1)])]),_:1},8,["icon","title"])):k("",!0)]),u(ee,{ui:{body:"p-0 sm:p-0"}},{default:r(()=>[u(ne,{"min-width":"46rem",bleed:!1},{default:r(()=>[u(Z,{data:e(D),columns:g},{"actions-header":r(()=>[...c[4]||(c[4]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":r(({row:i})=>[n("div",Po,[n("span",{class:J(["text-sm block truncate",i.original.title?"":"font-mono"]),title:i.original.signature},o(i.original.title||i.original.signature),11,jo),i.original.selector?(s(),a("span",Mo,[c[5]||(c[5]=_(" Locator: ",-1)),n("code",No,o(i.original.selector),1)])):k("",!0)])]),"errorType-cell":r(({row:i})=>[i.original.errorType?(s(),R(P,{key:0,color:("clusterErrorTypeColor"in d?d.clusterErrorTypeColor:e(xs))(i.original.errorType),variant:"subtle",size:"sm"},{default:r(()=>[_(o(i.original.errorType),1)]),_:2},1032,["color"])):(s(),a("span",Ao,"—"))]),"status-cell":r(({row:i})=>[i.original.status?(s(),R(P,{key:0,color:("clusterStatusColor"in d?d.clusterStatusColor:e(ys))(i.original.status),variant:"subtle",size:"sm"},{default:r(()=>[_(o(i.original.status),1)]),_:2},1032,["color"])):(s(),a("span",Bo,"—"))]),"caseCount-cell":r(({row:i})=>[n("span",Uo,o(i.original.caseCount),1)]),"signals-cell":r(({row:i})=>[i.original.isNew||i.original.flaky||i.original.workerCorrelated||i.original.locatorHealing?(s(),a("div",Lo,[i.original.isNew?(s(),R(P,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:r(()=>[...c[6]||(c[6]=[_(" New ",-1)])]),_:1})):k("",!0),i.original.flaky?(s(),R(P,{key:1,color:"warning",variant:"outline",size:"sm"},{default:r(()=>[...c[7]||(c[7]=[_(" Flaky ",-1)])]),_:1})):k("",!0),i.original.workerCorrelated?(s(),R(P,{key:2,color:"info",variant:"outline",size:"sm",title:"All failures ran on the same worker"},{default:r(()=>[...c[8]||(c[8]=[_(" Same worker ",-1)])]),_:1})):k("",!0),i.original.locatorHealing?.healed?(s(),R(P,{key:3,color:"success",variant:"subtle",size:"sm",icon:"i-lucide-circle-check",title:"The recommended locator already passes at this call site in a later run"},{default:r(()=>[...c[9]||(c[9]=[_(" Healed ",-1)])]),_:1})):i.original.locatorHealing?(s(),R(P,{key:4,color:"success",variant:"outline",size:"sm",icon:"i-lucide-bandage",title:`Locator fix available: ${i.original.locatorHealing.recommended} — open the cluster to apply it`},{default:r(()=>[...c[10]||(c[10]=[_(" Locator fix ",-1)])]),_:1},8,["title"])):k("",!0)])):(s(),a("span",Eo,"—"))]),"diagnosis-cell":r(({row:i})=>[i.original.diagnosis?.status==="running"?(s(),a("div",Oo,[u(S,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),c[11]||(c[11]=_(" Running ",-1))])):i.original.diagnosis?.status==="completed"&&i.original.diagnosis.category?(s(),R(P,{key:1,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:r(()=>[u(S,{name:"i-lucide-sparkles",class:"size-3"}),_(" "+o(i.original.diagnosis.category),1)]),_:2},1024)):(s(),a("span",Wo,"—"))]),"firstSeenRunId-cell":r(({row:i})=>[i.original.isNew?(s(),a("span",Ko,"New in this run")):(s(),a("div",Ho,[u(Q,{to:`/test-runs/${i.original.firstSeenRunId}`,class:"text-primary hover:underline"},{default:r(()=>[_(" run #"+o(i.original.firstSeenRunId),1)]),_:2},1032,["to"]),i.original.firstSeenAt?(s(),a("span",Vo," ("+o(("formatRelativeTime"in d?d.formatRelativeTime:e(ht))(i.original.firstSeenAt))+") ",1)):k("",!0)]))]),"actions-cell":r(({row:i})=>[n("div",Go,[u(x,{size:"sm",color:"primary",variant:"soft",onClick:ue=>$("selectCluster",i.original.clusterId)},{default:r(()=>[...c[12]||(c[12]=[_(" Filter ",-1)])]),_:1},8,["onClick"]),u(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-sparkles",onClick:ue=>N.value=i.original.clusterId},{default:r(()=>[...c[13]||(c[13]=[_(" Diagnose ",-1)])]),_:1},8,["onClick"]),u(x,{to:`/failure-clusters/${i.original.clusterId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:r(()=>[...c[14]||(c[14]=[_(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data"])]),_:1})]),_:1})],64)):(s(),a("div",Xo,[u(S,{name:"i-lucide-party-popper",class:"size-6"}),c[15]||(c[15]=n("span",null,"No failure groups — failed tests without error details are not grouped",-1))]))]),u(z,{open:e(N)!==null,title:"AI Diagnosis",ui:{content:"max-w-2xl"},"onUpdate:open":c[1]||(c[1]=i=>{i||(N.value=null)})},{body:r(()=>[e(N)!==null?(s(),R(B,{key:0,"cluster-id":e(N)},null,8,["cluster-id"])):k("",!0)]),_:1},8,["open"])],64)}}}),Yo=Object.assign(qo,{__name:"FailureGroups"}),Jo={class:"pt-4"},Zo={key:2,class:"space-y-4"},Qo={class:"flex flex-wrap items-center gap-2 text-sm"},er={class:"text-gray-500 inline-flex items-center gap-1"},tr={key:0,class:"text-gray-400"},sr={key:0,class:"flex flex-wrap items-center gap-2"},nr={class:"text-sm text-gray-500"},ar={key:1,class:"flex items-center gap-2"},or={class:"text-sm text-gray-500"},rr={class:"space-y-3"},lr={class:"flex items-center gap-2 text-sm font-medium"},ir={class:"flex flex-wrap items-center gap-2 text-sm font-mono"},ur={key:0,class:"text-xs text-gray-400 font-sans"},dr={class:"flex flex-wrap items-center gap-2"},cr={class:"flex items-center gap-1.5 flex-1 min-w-0"},mr={class:"flex-1 text-xs bg-gray-100 dark:bg-gray-800 px-3 py-1.5 rounded font-mono truncate select-all"},fr={key:3,class:"text-sm text-gray-500 flex items-center gap-2"},gr={class:"px-4 py-3 text-sm font-medium flex items-center gap-2 border-b border-default"},pr={class:"overflow-x-auto"},yr={class:"w-full min-w-[36rem] text-sm"},xr={class:"px-4 py-2 text-gray-500"},hr={class:"px-4 py-2 font-mono text-xs"},vr={key:0,class:"text-green-700 dark:text-green-400"},kr={key:1,class:"text-gray-400"},br={class:"px-4 py-2 font-mono text-xs"},_r={key:0,class:"text-red-700 dark:text-red-400"},wr={key:1,class:"text-gray-400"},$r=fe({__name:"RegressionContext",props:{refreshKey:{}},async setup(t){let b,w;const $=Ae().params.id,l=t,{data:C,pending:m,refresh:D}=([b,w]=je(()=>Me(`/api/test-runs/${$}/regression-context`,{lazy:!0,server:!1},"$AcrCJopY1M")),b=await b,w(),b);me(()=>l.refreshKey,(I,A)=>{I!==A&&I!==void 0&&D()});const{copy:K,copied:E}=Ye();function N(){K(C.value?.commitRange?.gitCommand)}return(I,A)=>{const H=_t,U=wt,j=ke,g=Se,f=Ne,d=be,c=_e,S=qe;return s(),a("div",Jo,[e(m)?(s(),R(H,{key:0,text:"Looking for last passing run…"})):e(C)?.hasGreen?(s(),a("div",Zo,[n("div",Qo,[u(j,{name:"i-lucide-circle-check",class:"size-4 text-green-500 shrink-0"}),n("span",er,[A[0]||(A[0]=_("Last passing run: ",-1)),u(g,{topic:"run.regression"})]),u(f,{to:`/test-runs/${e(C).lastGreenRunId}`,class:"font-medium text-primary hover:underline"},{default:r(()=>[_(" Run #"+o(e(C).lastGreenRunId),1)]),_:1},8,["to"]),e(C).lastGreenRunAt?(s(),a("span",tr," ("+o(("formatRelativeTime"in I?I.formatRelativeTime:e(ht))(e(C).lastGreenRunAt))+") ",1)):k("",!0)]),(e(C).newFailures??0)>0?(s(),a("div",sr,[u(d,{color:"error",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(C).newFailures)+" new "+o(e(C).newFailures===1?"failure":"failures"),1)]),_:1}),n("span",nr,o(e(C).newFailures===1?"test":"tests")+" that "+o((e(C).newFailures===1,"passed"))+" in run #"+o(e(C).lastGreenRunId)+" but "+o(e(C).newFailures===1?"fails":"fail")+" here ",1)])):(s(),a("div",ar,[u(d,{color:"warning",variant:"soft",size:"lg"},{default:r(()=>[...A[1]||(A[1]=[_(" No new regressions ",-1)])]),_:1}),n("span",or,"All failing tests were also failing before run #"+o(e(C).lastGreenRunId),1)])),e(C).commitRange?(s(),R(S,{key:2,ui:{body:"p-4 sm:p-4"}},{default:r(()=>[n("div",rr,[n("div",lr,[u(j,{name:"i-lucide-git-commit-horizontal",class:"size-4"}),A[2]||(A[2]=_(" Commits introduced since last passing run ",-1))]),n("div",ir,[u(d,{color:"success",variant:"soft",size:"sm"},{default:r(()=>[_(o(e(C).commitRange.fromShort),1)]),_:1}),u(j,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),u(d,{color:"error",variant:"soft",size:"sm"},{default:r(()=>[_(o(e(C).commitRange.toShort),1)]),_:1}),e(C).currentBranch||e(C).lastGreenBranch?(s(),a("span",ur," on "+o(e(C).currentBranch||e(C).lastGreenBranch),1)):k("",!0)]),n("div",dr,[e(C).commitRange.compareUrl?(s(),R(c,{key:0,to:e(C).commitRange.compareUrl,target:"_blank",external:"",icon:"i-lucide-external-link",size:"sm",variant:"soft",color:"primary"},{default:r(()=>[...A[3]||(A[3]=[_(" View commits ",-1)])]),_:1},8,["to"])):k("",!0),n("div",cr,[n("code",mr,o(e(C).commitRange.gitCommand),1),u(c,{icon:e(E)?"i-lucide-check":"i-lucide-clipboard",size:"xs",color:"neutral",variant:"ghost",title:e(E)?"Copied!":"Copy git command",onClick:N},null,8,["icon","title"])])])])]),_:1})):!e(C).currentCommit||!e(C).lastGreenCommit?(s(),a("div",fr,[u(j,{name:"i-lucide-git-branch",class:"size-4 shrink-0"}),A[4]||(A[4]=_(" No commit info available — enable ",-1)),A[5]||(A[5]=n("code",{class:"font-mono text-xs"},"collectScmInfo: true",-1)),A[6]||(A[6]=_(" in the reporter to see commit ranges ",-1))])):k("",!0),e(C).metadataDiff&&e(C).metadataDiff.length>0?(s(),R(S,{key:4,ui:{body:"p-0 sm:p-0"}},{default:r(()=>[n("div",gr,[u(j,{name:"i-lucide-sliders-horizontal",class:"size-4"}),A[7]||(A[7]=_(" What changed between runs ",-1))]),n("div",pr,[n("table",yr,[A[8]||(A[8]=n("thead",null,[n("tr",{class:"text-xs text-gray-500 uppercase tracking-wider border-b border-default"},[n("th",{class:"text-left px-4 py-2 font-medium w-32"},"Field"),n("th",{class:"text-left px-4 py-2 font-medium"},"Last passing"),n("th",{class:"text-left px-4 py-2 font-medium"},"This run")])],-1)),n("tbody",null,[(s(!0),a(V,null,oe(e(C).metadataDiff,y=>(s(),a("tr",{key:y.key,class:"border-b last:border-b-0 border-default"},[n("td",xr,o(y.label),1),n("td",hr,[y.before?(s(),a("span",vr,o(y.before),1)):(s(),a("span",kr,"—"))]),n("td",br,[y.after?(s(),a("span",_r,o(y.after),1)):(s(),a("span",wr,"—"))])]))),128))])])])]),_:1})):k("",!0)])):(s(),R(U,{key:1,icon:"i-lucide-history",text:"No previous passing run found for this project"}))])}}}),Cr=Object.assign($r,{__name:"RegressionContext"}),Rr={class:"flex items-center justify-between mb-2"},Tr={class:"text-xs text-gray-500 inline-flex items-center gap-1"},Ir={class:"flex items-center gap-1"},Sr={class:"p-2 flex flex-col gap-2 min-w-56"},zr=fe({__name:"TimelineHeader",props:{workerCount:{},shardTotal:{},testCount:{},hookCount:{},waitCount:{},spanTypes:{},live:{type:Boolean}},emits:["reset","toggleSpan"],setup(t){return(b,w)=>{const F=Se,$=_e,l=kt,C=dt;return s(),a("div",Rr,[n("span",Tr,[n("span",null,[_(o(t.workerCount)+" worker"+o(t.workerCount>1?"s":"")+" ",1),t.shardTotal&&t.shardTotal>1?(s(),a(V,{key:0},[_(" · "+o(t.shardTotal)+" shard"+o(t.shardTotal>1?"s":""),1)],64)):k("",!0),_(" · "+o(t.testCount)+" tests ",1),t.hookCount>0?(s(),a(V,{key:1},[_(" · "+o(t.hookCount)+" hooks ",1)],64)):k("",!0),t.waitCount>0?(s(),a(V,{key:2},[_(" · "+o(t.waitCount)+" waits ",1)],64)):k("",!0)]),u(F,{topic:"run.timeline"})]),n("div",Ir,[t.spanTypes.length>1?(s(),R(C,{key:0,content:{align:"end"}},{content:r(()=>[n("div",Sr,[(s(!0),a(V,null,oe(t.spanTypes,m=>(s(),R(l,{key:m.key,"model-value":m.checked,label:m.label,"onUpdate:modelValue":D=>b.$emit("toggleSpan",m.key,D===!0)},null,8,["model-value","label","onUpdate:modelValue"]))),128))])]),default:r(()=>[u($,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list-filter","trailing-icon":"i-lucide-chevron-down",title:"Show or hide span types"},{default:r(()=>[...w[1]||(w[1]=[_(" Span types ",-1)])]),_:1})]),_:1})):k("",!0),t.live?k("",!0):(s(),R($,{key:1,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-rotate-ccw",onClick:w[0]||(w[0]=m=>b.$emit("reset"))},{default:r(()=>[...w[2]||(w[2]=[_(" Reset view ",-1)])]),_:1}))])])}}}),Dr=Object.assign(zr,{__name:"TimelineHeader"}),Ee={barHeight:24,rowGap:8,labelWidth:80,sidePadding:16,axisHeight:28,get rowHeight(){return this.barHeight+this.rowGap}},Fr={passed:"#16a34a",failed:"#dc2626",timedOut:"#ea580c",running:"#2563eb",initialising:"#2563eb",skipped:"#9ca3af",cancelled:"#a1a1aa",interrupted:"#ea580c",flaky:"#ca8a04"},Te={fill:"#facc15",stroke:"#ca8a04",swatch:"#f59e0b"};function We(t){return Fr[t]||"#a1a1aa"}function Rt(t){return We(t)+"66"}function Tt(t){return We(t)}function Oe(t){return t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${Math.floor(t/6e4)}m ${Math.floor(t%6e4/1e3)}s`}const Pr=["y","width","height"],jr=["y1","x2","y2"],Mr=["x1","y1","x2","y2"],Nr=["x1","y1","x2","y2"],Ar=["x","y"],Br=["y"],Ur=fe({__name:"TimelineGrid",props:{workerRows:{},shardGroups:{},tickMarks:{},contentWidth:{},shardTotal:{}},setup(t){const{barHeight:b,rowGap:w,axisHeight:F,rowHeight:$}=Ee;return(l,C)=>(s(),a("g",null,[(s(!0),a(V,null,oe(t.workerRows,(m,D)=>(s(),a("rect",{key:"bg-"+D,x:0,y:D*e($)+e(F),width:t.contentWidth,height:e($),class:J(D%2===1?"fill-black/[0.03] dark:fill-white/[0.03]":"fill-transparent")},null,10,Pr))),128)),(s(!0),a(V,null,oe(t.shardGroups.slice(1),m=>(s(),a("line",{key:"shard-sep-"+m.rowRange[0],x1:0,y1:m.rowRange[0]*e($)+e(F)-e(w)/2,x2:t.contentWidth,y2:m.rowRange[0]*e($)+e(F)-e(w)/2,stroke:"currentColor","stroke-dasharray":"4,3",class:"stroke-gray-400 dark:stroke-gray-500"},null,8,jr))),128)),n("line",{x1:e(Ee).labelWidth,y1:e(F),x2:t.contentWidth,y2:e(F),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,Mr),(s(!0),a(V,null,oe(t.tickMarks,m=>(s(),a("g",{key:m.ms},[n("line",{x1:m.x,y1:e(F)-4,x2:m.x,y2:e(F),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,Nr),n("text",{x:m.x,y:e(F)-8,"text-anchor":"middle",class:"fill-gray-400 text-[10px]"},o(m.label),9,Ar)]))),128)),(s(!0),a(V,null,oe(t.workerRows,(m,D)=>(s(),a("text",{key:"label-"+D,x:6,y:D*e($)+e(F)+e(b)/2+4,class:"fill-gray-500 text-[11px] font-medium"},o(m.shardIndex!=null&&t.shardTotal&&t.shardTotal>1?`S${m.shardIndex} W${m.workerIndex}`:`Worker ${m.workerIndex}`),9,Br))),128))]))}}),Lr=Object.assign(Ur,{__name:"TimelineGrid"}),Er=["x","y","width","height","fill","stroke"],Or=["x","y"],Wr=["x","y","width","height","fill","stroke"],Kr=["x1","y1","x2","y2","stroke"],Hr=["x1","y1","x2","y2","stroke"],Vr=["x","y"],Gr=["cx","cy"],Xr=["cx","cy"],qr=["x","y","width","height","fill"],Yr=["x","y"],Jr=fe({__name:"TimelineBar",props:{item:{},x:{},y:{},width:{}},emits:["select","hover","move","leave"],setup(t,{emit:b}){const w=t,F=b,{barHeight:$}=Ee,l=M(()=>["setup","hook","fixture"].includes(w.item.kind)),C=M(()=>w.item.testCaseId!=null),m=M(()=>C.value?"cursor-pointer":"cursor-default");function D(){w.item.testCaseId!=null&&F("select",w.item.testCaseId)}return(K,E)=>(s(),a("g",{class:"timeline-bar-group",onMouseenter:E[0]||(E[0]=N=>F("hover",t.item,N)),onMousemove:E[1]||(E[1]=N=>F("move",N)),onMouseleave:E[2]||(E[2]=N=>F("leave"))},[l.value?(s(),a(V,{key:0},[n("rect",{x:t.x,y:t.y,width:t.width,height:e($),rx:3,ry:3,fill:e(Rt)(t.item.status),stroke:e(Tt)(t.item.status),"stroke-width":"1","stroke-dasharray":"3,2",class:J(["timeline-bar-shape transition-opacity duration-100 opacity-80",m.value]),onClick:D},null,10,Er),t.width>60?(s(),a("text",{key:0,x:t.x+4,y:t.y+e($)/2+4,class:"fill-gray-600 dark:fill-gray-300 text-[9px] font-medium pointer-events-none"},o(t.item.title),9,Or)):k("",!0)],64)):t.item.kind==="wait"?(s(),a(V,{key:1},[n("rect",{x:t.x,y:t.y-3,width:t.width,height:e($)+6,rx:2,ry:2,fill:e(Te).fill,"fill-opacity":"0.28",stroke:e(Te).stroke,"stroke-width":"1.5",class:J(["timeline-bar-shape transition-opacity duration-100 opacity-90",m.value]),onClick:D},null,10,Wr),t.width>4?(s(),a("line",{key:0,x1:t.x+1,y1:t.y-3,x2:t.x+t.width-1,y2:t.y+e($)+3,stroke:e(Te).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,Kr)):k("",!0),t.width>4?(s(),a("line",{key:1,x1:t.x+t.width-1,y1:t.y-3,x2:t.x+1,y2:t.y+e($)+3,stroke:e(Te).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,Hr)):k("",!0),t.width>50?(s(),a("text",{key:2,x:t.x+4,y:t.y+e($)/2+4,class:"fill-yellow-800 dark:fill-yellow-200 text-[9px] font-bold pointer-events-none"}," wasted "+o(e(Oe)(t.item.duration)),9,Vr)):k("",!0)],64)):t.item.status==="running"?(s(),a(V,{key:2},[n("circle",{cx:t.x+6,cy:t.y+e($)/2,r:"3",fill:"#2563eb",filter:"url(#glow)",class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:D},null,8,Gr),n("circle",{cx:t.x+6,cy:t.y+e($)/2,r:"5",fill:"none",stroke:"#2563eb","stroke-width":"1.5","stroke-opacity":"0.4",filter:"url(#glow)",class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:D},null,8,Xr)],64)):(s(),a(V,{key:3},[n("rect",{x:t.x,y:t.y,width:t.width,height:e($),rx:3,ry:3,fill:e(We)(t.item.status),class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:D},null,8,qr),t.width>40?(s(),a("text",{key:0,x:t.x+4,y:t.y+e($)/2+4,class:"fill-white text-[10px] font-medium pointer-events-none"},o(e(Oe)(t.item.duration)),9,Yr)):k("",!0)],64))],32))}}),Zr=Object.assign(Jr,{__name:"TimelineBar"}),Qr={class:"flex items-center gap-2 mb-1"},el={class:"font-medium text-gray-900 dark:text-white max-w-64 truncate"},tl={class:"flex items-center gap-3 text-gray-500"},sl={class:"capitalize"},nl={key:0,class:"italic truncate max-w-48"},al=340,ol=fe({__name:"TimelineTooltip",props:{item:{},pos:{}},setup(t){const b=t,w=M(()=>{const $=b.item;return $?$.kind==="test"?{backgroundColor:We($.status)}:$.kind==="wait"?{backgroundColor:Te.swatch+"66",borderColor:Te.swatch}:{backgroundColor:Rt($.status),borderColor:Tt($.status)}:{}}),F=M(()=>{const{x:$,y:l}=b.pos;if(typeof window>"u")return{left:`${$+12}px`,top:`${l-10}px`};const C=$+12+al>window.innerWidth,m=l+90>window.innerHeight;return{left:C?void 0:`${$+12}px`,right:C?`${window.innerWidth-$+12}px`:void 0,top:m?void 0:`${l-10}px`,bottom:m?`${window.innerHeight-l+10}px`:void 0}});return($,l)=>(s(),R(Yt,{to:"body"},[t.item?(s(),a("div",{key:0,class:"fixed z-[9999] pointer-events-none rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 px-3 py-2 text-xs shadow-lg",style:he(F.value)},[n("div",Qr,[n("span",{class:J(["inline-block size-2.5 rounded-full shrink-0",{"border border-dashed":t.item.kind!=="test"}]),style:he(w.value)},null,6),n("span",el,[t.item.kind!=="test"?(s(),a("span",{key:0,class:J(["uppercase text-[10px] tracking-wider mr-1",t.item.kind==="wait"?"text-amber-500":"text-gray-500"])},o(t.item.kind),3)):k("",!0),_(" "+o(t.item.title),1)])]),n("div",tl,[n("span",sl,o(t.item.status),1),n("span",null,o(e(Oe)(t.item.duration)),1),n("span",null,"Worker "+o(t.item.workerIndex),1),t.item.parentTitle?(s(),a("span",nl," for "+o(t.item.parentTitle),1)):k("",!0)])],4)):k("",!0)]))}}),rl=Object.assign(ol,{__name:"TimelineTooltip"}),ll=["Wait for timeout*","*waitForTimeout*"];function il(t){const b=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${b}$`,"i")}const lt=new Map;function ul(t){let b=lt.get(t);return b||(b=il(t),lt.set(t,b)),b}function dl(t,b){if(!b||b.length===0)return!1;const w=t.title??"",F=t.location??"";for(const $ of b){const l=ul($);if(l.test(w)||F&&l.test(F))return!0}return!1}function cl(t){const b=new Map;for(const w of t){const F=w.workerIndex;if(F==null||F<0)continue;const $=w.shardIndex??null,l=`${$??"null"}|${F}`;let C=b.get(l);C||(C={shardIndex:$,workerIndex:F,cases:[]},b.set(l,C)),C.cases.push(w)}return[...b.values()].sort((w,F)=>{const $=w.shardIndex??1/0,l=F.shardIndex??1/0;return $!==l?$-l:w.workerIndex-F.workerIndex})}function Be(t){if(t==null)return null;if(typeof t=="number")return Number.isFinite(t)?t:null;if(t instanceof Date)return t.getTime();const b=new Date(t).getTime();return Number.isNaN(b)?null:b}function ml(t,b){return t.category==="wait"?dl(t,b)?"wait":null:t.category==="hook"||t.category==="fixture"?t.category:null}function fl(t){const b=M(()=>t.wastedPatterns&&t.wastedPatterns.length>0?t.wastedPatterns:ll),w=M(()=>cl(t.testCases)),F=M(()=>{const m=w.value,D=b.value;let K=1/0;for(const H of m)for(const U of H.cases){const j=Be(U.startedAt);j!=null&&j>0&&(K=Math.min(K,j))}const E=Number.isFinite(K),N=H=>Math.max(0,(Be(H)??K)-K),I=[],A=new Map;if(m.forEach((H,U)=>{const j=[],g=E?H.cases:[...H.cases].sort((d,c)=>(Be(d.startedAt)??0)-(Be(c.startedAt)??0));let f=0;for(const d of g){const c=d.duration??1e3,S=E?N(d.startedAt):f;j.push({key:`t${d.id}`,kind:"test",testCaseId:d.id,title:d.title,status:d.status,workerIndex:H.workerIndex,start:S,duration:c,rowIndex:U}),f=S+c,(d.stepEvents??[]).forEach((x,P)=>{const Q=ml(x,D);if(!Q)return;const Z=x.duration||0,ne=E?N(x.startedAt):f;j.push({key:`s${d.id}:${P}`,kind:Q,testCaseId:d.id,title:x.title,status:x.status||"passed",workerIndex:H.workerIndex,start:ne,duration:Z,rowIndex:U,parentTitle:d.title}),f=ne+Z})}j.sort((d,c)=>d.start-c.start),I.push(...j),A.has(H.workerIndex)||A.set(H.workerIndex,f)}),t.setupSteps&&t.setupSteps.length>0){const H=new Map;m.forEach((U,j)=>{H.has(U.workerIndex)||H.set(U.workerIndex,j)}),t.setupSteps.forEach((U,j)=>{const g=U.workerIndex;if(g==null||g<0)return;const f=H.get(g);if(f==null)return;const d=U.duration||0;let c;E?c=N(U.startedAt):(c=A.get(g)??0,A.set(g,c+d)),I.push({key:`setup${g}:${j}`,kind:"setup",testCaseId:null,title:`[Setup] ${U.title}`,status:U.status||"passed",workerIndex:g,start:c,duration:d,rowIndex:f,parentTitle:null})})}return I}),$=M(()=>w.value.map(m=>({shardIndex:m.shardIndex,workerIndex:m.workerIndex}))),l=M(()=>{const m=[];for(let D=0;D<$.value.length;D++){const K=$.value[D],E=m[m.length-1];!E||E.shardIndex!==K.shardIndex?m.push({shardIndex:K.shardIndex,rowRange:[D,D]}):E.rowRange[1]=D}return m}),C=M(()=>{let m=0;for(const D of F.value)m=Math.max(m,D.start+D.duration);return m||6e4});return{timelineData:F,workerRows:$,shardGroups:l,maxTime:C}}const it=1.12,gl=10,pl=100,Ge=[10,20,50,100,200,500,1e3,2e3,5e3,1e4,15e3,3e4,6e4,12e4,3e5,6e5,9e5,18e5,36e5];function yl(t){const{containerRef:b,maxTime:w,rowCount:F,hasData:$,live:l}=t,{labelWidth:C,sidePadding:m,axisHeight:D,rowHeight:K}=Ee,E=O(1),N=O(0),I=O(!1),A=O(0),H=O(0),U=M(()=>.5*E.value),j=M(()=>w.value*U.value+C+m),g=M(()=>F.value*K+D);function f(v){return v.start*U.value+C}function d(v){return Math.max(v.duration*U.value,3)}function c(v){return v.rowIndex*K+D}function S(){const v=b.value?.clientWidth;if(!v||w.value<=0)return 1;const q=(v-C)/w.value;return Math.min(1,q/.5)}function y(){const v=S();v>0&&(E.value=v,N.value=0)}function x(v){if(!b.value)return v;const q=b.value.clientWidth;return j.value<=q?0:Math.max(q-j.value,Math.min(0,v))}function P(v,q){const ae=Math.max(S(),Math.min(gl,v)),se=ae/E.value;E.value=ae,N.value=x(q-(q-N.value)*se)}const Q=M(()=>{const v=pl/U.value;let q=Ge.find(se=>se>=v)??Ge[Ge.length-1];for(;w.value/q>1e3;)q*=2;const ae=[];for(let se=0;se<=w.value;se+=q)ae.push({ms:se,x:se*U.value+C,label:Oe(se)});return ae});function Z(v){if(l())return;const q=v.deltaY>0?1/it:it,ae=b.value?.getBoundingClientRect();P(E.value*q,ae?v.clientX-ae.left:0)}const ne=4,ee=new Map;let B=null,z=0,i=1,ue=0;function h(v,q){B=v,A.value=q,H.value=N.value}function T(v){if(!l()&&!(v.pointerType==="mouse"&&v.button!==0)){if(ee.set(v.pointerId,{x:v.clientX,y:v.clientY}),ee.size===1)h(v.pointerId,v.clientX);else if(ee.size===2){B=null,I.value=!1;for(const ge of ee.keys())b.value?.setPointerCapture?.(ge);const[q,ae]=[...ee.values()];z=Math.hypot(q.x-ae.x,q.y-ae.y)||1,i=E.value;const se=b.value?.getBoundingClientRect();ue=(q.x+ae.x)/2-(se?.left??0)}v.preventDefault()}}function G(v){if(!(l()||!ee.has(v.pointerId))){if(ee.set(v.pointerId,{x:v.clientX,y:v.clientY}),ee.size>=2){const[q,ae]=[...ee.values()],se=Math.hypot(q.x-ae.x,q.y-ae.y)||1;P(i*(se/z),ue);return}I.value?N.value=x(H.value+(v.clientX-A.value)):B===v.pointerId&&Math.abs(v.clientX-A.value)>ne&&(b.value?.setPointerCapture?.(v.pointerId),I.value=!0,N.value=x(H.value+(v.clientX-A.value)))}}function te(v){if(ee.delete(v.pointerId),B===v.pointerId&&(B=null),b.value?.releasePointerCapture?.(v.pointerId),ee.size===1){const[q]=[...ee.entries()];h(q[0],q[1].x)}else ee.size===0&&(I.value=!1)}function de(){y()}let Y=null;return Jt(()=>{Ie(y),b.value&&(Y=new ResizeObserver(()=>y()),Y.observe(b.value))}),mt(()=>{Y?.disconnect()}),me(()=>[l(),$.value,w.value,F.value],([v,q])=>{v&&q&&Ie(y)}),{panX:N,isPanning:I,pxPerMs:U,contentWidth:j,contentHeight:g,getBarX:f,getBarWidth:d,getBarTop:c,tickMarks:Q,onWheel:Z,onPointerDown:T,onPointerMove:G,onPointerUp:te,resetView:de}}const xl={key:0,class:"relative select-none"},hl=["width","height"],vl={key:1,class:"text-center py-10 text-gray-500"},kl=fe({__name:"WorkersTimeline",props:{testCases:{},setupSteps:{},shardTotal:{},live:{type:Boolean},wastedPatterns:{}},emits:["selectTestCase"],setup(t,{emit:b}){const w=t,F=b,{timelineData:$,workerRows:l,shardGroups:C,maxTime:m}=fl(w),D=O(null),K=M(()=>l.value.length),E=M(()=>$.value.length>0),{panX:N,isPanning:I,contentWidth:A,contentHeight:H,getBarX:U,getBarWidth:j,getBarTop:g,tickMarks:f,onWheel:d,onPointerDown:c,onPointerMove:S,onPointerUp:y,resetView:x}=yl({containerRef:D,maxTime:m,rowCount:K,hasData:E,live:()=>w.live}),P=M(()=>$.value.filter(Y=>Y.kind==="test").length),Q=M(()=>$.value.filter(Y=>Y.kind!=="test"&&Y.kind!=="wait").length),Z=M(()=>$.value.filter(Y=>Y.kind==="wait").length),ne=["test","setup","hook","fixture","wait"],ee={test:"Tests",setup:"Setup (beforeAll/afterAll)",hook:"Hooks",fixture:"Fixtures",wait:"Wasted waits"},B=O({}),z=M(()=>$.value.filter(Y=>!B.value[Y.kind])),i=M(()=>{const Y=new Set($.value.map(v=>v.kind));return ne.filter(v=>Y.has(v)).map(v=>({key:v,label:ee[v],checked:!B.value[v]}))});function ue(Y,v){B.value={...B.value,[Y]:!v}}const h=O(null),T=O({x:0,y:0});me(z,Y=>{h.value&&(h.value=Y.find(v=>v.key===h.value.key)??null)});function G(Y,v){h.value=Y,T.value={x:v.clientX,y:v.clientY}}function te(Y){T.value={x:Y.clientX,y:Y.clientY}}function de(){h.value=null}return(Y,v)=>{const q=Dr,ae=Lr,se=Zr,ge=rl,Ce=ke;return e($).length>0?(s(),a("div",xl,[u(q,{"worker-count":e(l).length,"shard-total":t.shardTotal,"test-count":P.value,"hook-count":Q.value,"wait-count":Z.value,"span-types":i.value,live:t.live,onToggleSpan:ue,onReset:e(x)},null,8,["worker-count","shard-total","test-count","hook-count","wait-count","span-types","live","onReset"]),n("div",{ref_key:"containerRef",ref:D,class:J(["relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 touch-pan-y",{"cursor-grab":!e(I),"cursor-grabbing":e(I)}]),style:he({height:e(H)+"px"}),onWheel:v[1]||(v[1]=Ue((...re)=>e(d)&&e(d)(...re),["prevent"])),onPointerdown:v[2]||(v[2]=(...re)=>e(c)&&e(c)(...re)),onPointermove:v[3]||(v[3]=(...re)=>e(S)&&e(S)(...re)),onPointerup:v[4]||(v[4]=(...re)=>e(y)&&e(y)(...re)),onPointercancel:v[5]||(v[5]=(...re)=>e(y)&&e(y)(...re)),onPointerleave:v[6]||(v[6]=(...re)=>e(y)&&e(y)(...re))},[(s(),a("svg",{class:"overflow-visible",style:he({transform:`translateX(${e(N)}px)`}),width:e(A),height:e(H)},[v[7]||(v[7]=n("defs",null,[n("filter",{id:"glow"},[n("feGaussianBlur",{stdDeviation:"2.5",result:"blur"}),n("feMerge",null,[n("feMergeNode",{in:"blur"}),n("feMergeNode",{in:"SourceGraphic"})])])],-1)),u(ae,{"worker-rows":e(l),"shard-groups":e(C),"tick-marks":e(f),"content-width":e(A),"shard-total":t.shardTotal},null,8,["worker-rows","shard-groups","tick-marks","content-width","shard-total"]),(s(!0),a(V,null,oe(z.value,re=>(s(),R(se,{key:re.key,item:re,x:e(U)(re),y:e(g)(re),width:e(j)(re),onSelect:v[0]||(v[0]=we=>F("selectTestCase",we)),onHover:G,onMove:te,onLeave:de},null,8,["item","x","y","width"]))),128))],12,hl))],38),u(ge,{item:h.value,pos:T.value},null,8,["item","pos"])])):(s(),a("div",vl,[u(Ce,{name:"i-lucide-rows-3",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),v[8]||(v[8]=n("p",null,"No worker data available for this run.",-1))]))}}}),bl=Object.assign(kl,{__name:"WorkersTimeline"}),_l={key:0,class:"space-y-4"},wl={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},$l={class:"flex items-center gap-2 py-1.5"},Cl={class:"font-medium"},Rl={key:0,class:"flex"},Tl={key:1,class:"flex items-center justify-center py-6 text-gray-500 gap-2"},Il={class:"flex flex-wrap gap-2 mt-1"},Sl={class:"flex flex-wrap gap-4 text-sm"},zl={key:3,class:"text-sm text-gray-500"},Dl={class:"flex flex-wrap gap-4 text-sm"},Fl={key:0,class:"text-gray-400"},Pl={key:0,class:"text-gray-400"},jl={key:0},Ml={key:1,class:"text-gray-400"},Nl={key:0},Al={key:1,class:"text-gray-400"},Bl={key:0,class:"text-gray-400"},Ul={key:0,class:"text-gray-400"},Ll={key:4,class:"text-center py-8 text-gray-500"},El={key:5,class:"text-center py-8 text-gray-500"},Ol={key:1,class:"text-center py-10 text-gray-500"},Wl=fe({__name:"RunCompare",props:{testRun:{}},setup(t){const b=t,F=Ae().params.id,$=O(null),l=O([]),C=M(()=>b.testRun?.status==="running"||b.testRun?.status==="finalizing");me(()=>b.testRun?.projectId,async f=>{if(!(!f||C.value)){try{$.value=await $fetch(`/api/projects/${f}`)}catch(d){console.error("Failed to fetch project for RunCompare",d)}try{const d=await $fetch(`/api/projects/${f}/markers`);l.value=d.markers??[]}catch{}}},{immediate:!0});const m=M(()=>{if(!N.value||!b.testRun)return[];const f=new Date(N.value.startTime).getTime(),d=new Date(b.testRun.startTime).getTime(),c=Math.min(f,d),S=Math.max(f,d),y=new Set([N.value.environment,b.testRun.environment].filter(x=>x!=null));return l.value.filter(x=>{const P=new Date(x.occurredAt).getTime();return P<=c||P>=S?!1:x.environment==null||y.has(x.environment)})}),D=M(()=>$.value?.testRuns?$.value.testRuns.filter(f=>f.id!==Number(F)).slice(0,50).map(f=>({label:`Run #${f.id} — ${pt(f.startTime,{dateOnly:!0})} (${f.status})`,value:f.id})):[]),K=M(()=>{if(!$.value?.testRuns)return null;const f=[...$.value.testRuns].sort((c,S)=>new Date(S.startTime).getTime()-new Date(c.startTime).getTime()),d=f.findIndex(c=>c.id===Number(F));return d>=0&&d<f.length-1?f[d+1].id:null}),E=O(void 0),N=O(null),I=O(!1);me(E,async f=>{if(!f?.value){N.value=null;return}I.value=!0;try{N.value=await $fetch(`/api/test-runs/${f.value}`)}catch{}finally{I.value=!1}});function A(){if(K.value){const f=D.value.find(d=>d.value===K.value);f&&(E.value=f)}}const H=M(()=>b.testRun??null),{comparisonData:U,comparisonSummary:j}=Is(N,H),g=[{accessorKey:"title",header:ie("Test case")},{accessorKey:"statusA",header:ie("Status A")},{accessorKey:"statusB",header:ie("Status B")},{accessorKey:"durationA",header:ie("Duration A")},{accessorKey:"durationB",header:ie("Duration B")},{accessorKey:"delta",header:ie("Delta")},{accessorKey:"percentChange",header:ie("Change")}];return(f,d)=>{const c=Cs,S=Rs,y=_e,x=ke,P=gt,Q=Ts,Z=be,ne=Je,ee=$t;return s(),a("div",null,[t.testRun&&!C.value?(s(),a("div",_l,[n("div",wl,[n("div",null,[d[1]||(d[1]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),u(c,{modelValue:E.value,"onUpdate:modelValue":d[0]||(d[0]=B=>E.value=B),items:D.value,placeholder:"Select a baseline run..."},null,8,["modelValue","items"])]),n("div",null,[d[2]||(d[2]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (this run)",-1)),n("div",$l,[u(S,{status:t.testRun.status},null,8,["status"]),n("span",Cl,"#"+o(t.testRun.id),1)])])]),K.value?(s(),a("div",Rl,[u(y,{icon:"i-lucide-arrow-left-right",size:"sm",variant:"outline",label:"Compare with previous run",onClick:A})])):k("",!0),I.value?(s(),a("div",Tl,[u(x,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),d[3]||(d[3]=n("span",null,"Loading baseline data...",-1))])):m.value.length>0?(s(),R(Q,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-milestone",title:`${m.value.length} timeline marker${m.value.length>1?"s":""} between these runs`},{description:r(()=>[n("div",Il,[(s(!0),a(V,null,oe(m.value,B=>(s(),R(P,{key:B.id,marker:B,size:"sm"},null,8,["marker"]))),128))])]),_:1},8,["title"])):N.value&&e(U).length>0?(s(),a(V,{key:3},[n("div",Sl,[d[4]||(d[4]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status",-1)),e(j).newFailures>0?(s(),R(Z,{key:0,color:"error",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).newFailures)+" new failure"+o(e(j).newFailures>1?"s":""),1)]),_:1})):k("",!0),e(j).recovered>0?(s(),R(Z,{key:1,color:"success",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).recovered)+" recovered ",1)]),_:1})):k("",!0),e(j).stillFailing>0?(s(),R(Z,{key:2,color:"warning",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).stillFailing)+" still failing ",1)]),_:1})):k("",!0),e(j).newFailures===0&&e(j).recovered===0&&e(j).stillFailing===0?(s(),a("span",zl,"No status changes")):k("",!0)]),n("div",Dl,[d[5]||(d[5]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(j).regressed>0?(s(),R(Z,{key:0,color:"error",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).regressed)+" regressed ",1)]),_:1})):k("",!0),e(j).improved>0?(s(),R(Z,{key:1,color:"success",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).improved)+" improved ",1)]),_:1})):k("",!0),u(Z,{color:"neutral",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).unchanged)+" unchanged ",1)]),_:1})]),u(ee,{"min-width":"48rem",bleed:!1},{default:r(()=>[u(ne,{data:e(U),columns:g,ui:{base:"table-fixed border-separate border-spacing-0 min-w-[48rem]",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":r(({row:B})=>[B.original.statusA?(s(),R(Z,{key:1,color:("getStatusColor"in f?f.getStatusColor:e(Le))(B.original.statusA),class:"capitalize"},{default:r(()=>[_(o(B.original.statusA),1)]),_:2},1032,["color"])):(s(),a("span",Fl,"—"))]),"statusB-cell":r(({row:B})=>[B.original.statusB?(s(),R(Z,{key:1,color:("getStatusColor"in f?f.getStatusColor:e(Le))(B.original.statusB),class:"capitalize"},{default:r(()=>[_(o(B.original.statusB),1)]),_:2},1032,["color"])):(s(),a("span",Pl,"—"))]),"durationA-cell":r(({row:B})=>[B.original.durationA!==null?(s(),a("span",jl,o(("formatDuration"in f?f.formatDuration:e(xe))(B.original.durationA)),1)):(s(),a("span",Ml,"—"))]),"durationB-cell":r(({row:B})=>[B.original.durationB!==null?(s(),a("span",Nl,o(("formatDuration"in f?f.formatDuration:e(xe))(B.original.durationB)),1)):(s(),a("span",Al,"—"))]),"delta-cell":r(({row:B})=>[B.original.delta===null?(s(),a("span",Bl,"—")):(s(),a("span",{key:1,class:J(B.original.delta>0?"text-red-600":B.original.delta<0?"text-green-600":"text-gray-500")},o(B.original.delta>0?"+":"")+o(("formatDuration"in f?f.formatDuration:e(xe))(B.original.delta)),3))]),"percentChange-cell":r(({row:B})=>[B.original.percentChange===null?(s(),a("span",Ul,"—")):(s(),a("span",{key:1,class:J(B.original.percentChange>10?"text-red-600 font-medium":B.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},o(B.original.percentChange>0?"+":"")+o(B.original.percentChange)+"% ",3))]),_:1},8,["data"])]),_:1})],64)):E.value&&!I.value?(s(),a("div",Ll,[u(x,{name:"i-lucide-git-compare-arrows",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),d[6]||(d[6]=n("p",null,"No comparison data available.",-1))])):(s(),a("div",El,[u(x,{name:"i-lucide-arrow-left-right",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),d[7]||(d[7]=n("p",null,"Select a baseline run to compare.",-1))]))])):C.value?(s(),a("div",Ol,[u(x,{name:"i-lucide-git-compare-arrows",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),d[8]||(d[8]=n("p",null,"Comparison is available after the run finishes.",-1))])):k("",!0)])}}}),Kl=Object.assign(Wl,{__name:"RunCompare"}),Hl={class:"flex flex-col overflow-hidden"},Vl={key:0,class:"flex-1 flex items-center justify-center text-gray-500 gap-2"},Gl={class:"text-xs font-mono break-all"},Xl={key:0,class:"text-gray-400"},ql={key:1,class:"text-red-600 font-medium"},Yl={key:2,class:"flex-1 flex items-center justify-center text-center text-gray-500"},Jl=fe({__name:"SlowEndpoints",props:{refreshKey:{}},emits:["endpointsCount"],async setup(t,{emit:b}){let w,F;const l=Ae().params.id,C=t,m=b,{data:D,pending:K,refresh:E}=([w,F]=je(()=>Me(`/api/test-runs/${l}/network-requests`,{lazy:!0,server:!1},"$DE3r8oSbIq")),w=await w,F(),w);me(D,I=>{m("endpointsCount",I?.length??0)}),me(()=>C.refreshKey,(I,A)=>{I!==A&&I!==void 0&&E()});const N=[{accessorKey:"method",header:ie("Method")},{accessorKey:"route",header:ie("Route")},{accessorKey:"count",header:ie("Calls")},{accessorKey:"avgDuration",header:ie("Avg")},{accessorKey:"p90Duration",header:ie("P90")},{accessorKey:"maxDuration",header:ie("Max")},{accessorKey:"errorRate",header:ie("Errors")}];return(I,A)=>{const H=ke,U=be,j=Je;return s(),a("div",Hl,[e(K)?(s(),a("div",Vl,[u(H,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),A[0]||(A[0]=n("span",null,"Loading network data...",-1))])):e(D)&&e(D).length>0?(s(),R(j,{key:1,sticky:"",data:e(D),columns:N,class:"flex-1 min-h-0",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 [&>tr]:hover:bg-gray-50 dark:[&>tr]:hover:bg-gray-900/50",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"method-cell":r(({row:g})=>[u(U,{color:g.original.method==="GET"?"info":g.original.method==="POST"?"success":g.original.method==="PUT"||g.original.method==="PATCH"?"warning":g.original.method==="DELETE"?"error":"neutral",variant:"soft",class:"font-mono text-xs"},{default:r(()=>[_(o(g.original.method),1)]),_:2},1032,["color"])]),"route-cell":r(({row:g})=>[n("code",Gl,o(g.original.route),1)]),"avgDuration-cell":r(({row:g})=>[n("span",{class:J(g.original.avgDuration>1e3?"text-red-600 font-medium":g.original.avgDuration>500?"text-orange-500 font-medium":"")},o(("formatDuration"in I?I.formatDuration:e(xe))(g.original.avgDuration)),3)]),"p90Duration-cell":r(({row:g})=>[n("span",{class:J(g.original.p90Duration>2e3?"text-red-600 font-medium":g.original.p90Duration>1e3?"text-orange-500":"")},o(("formatDuration"in I?I.formatDuration:e(xe))(g.original.p90Duration)),3)]),"errorRate-cell":r(({row:g})=>[g.original.errorRate===0?(s(),a("span",Xl,"0%")):(s(),a("span",ql,o(g.original.errorRate)+"%",1))]),_:1},8,["data"])):(s(),a("div",Yl,[u(H,{name:"i-lucide-wifi-off",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),A[1]||(A[1]=n("p",null,[_(" No network request data. Add the "),n("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 rounded font-mono"},"@piwitests/reporter"),_(" fixtures to your test setup. ")],-1))]))])}}}),Zl=Object.assign(Jl,{__name:"SlowEndpoints"}),Ql={class:"inline-flex items-center justify-center w-5 h-5 rounded-full bg-blue-500/10 hover:bg-blue-500/20 transition-colors ml-1"},ei={key:0,class:"flex items-center gap-2 mb-3 shrink-0"},Qi=fe({__name:"[id]",async setup(t){let b,w;const F=Ae(),$=Zt(),l=F.params.id,C=!!Qt().public.demoMode,{data:m,refresh:D}=([b,w]=je(()=>Me(`/api/test-runs/${l}`,"$D01RBpMFGT")),b=await b,w(),b),K=m.value?.projectId,{data:E,refresh:N}=K?([b,w]=je(()=>Me(`/api/projects/${K}/latest-run`,{key:`latest-run-${K}`},"$e4OLHgXNMR")),b=await b,w(),b):{data:O(null),refresh:async()=>{}};Ss(N);const I=M(()=>E.value?.id??m.value?.project?.latestRunId??null),A=M(()=>E.value?.status??m.value?.project?.latestRunStatus??null),H=M(()=>A.value==="running"||A.value==="finalizing");es(M(()=>({title:`Test run #${l}${m.value?.project?` — ${m.value.project.name}`:""} — Piwi Dashboard`})));const U=ut(),j=O(!1),g=O(!1),f=M(()=>m.value?.status==="running"||m.value?.status==="finalizing"),d=O(!1),c=O([]),S=new Map,y=O(null);let x=null;const P=O([]);me([f,m],()=>{f.value&&c.value.length>0?P.value=[...c.value]:m.value?.testCases?P.value=m.value.testCases:P.value=[]},{immediate:!0});function Q(L){for(const W of L){const le=`${W.title}@@${W.location}@@${JSON.stringify(W.browser)}`;S.has(le)||(S.set(le,!0),c.value=[...c.value,W])}P.value=[...c.value]}let Z=[],ne=null;function ee(){if(Z.length===0)return;const L=Z;Z=[];for(const W of L){const le=W.data;if(W.type==="init")y.value={totalTests:le.totalTests,passedTests:le.passedTests,failedTests:le.failedTests,skippedTests:le.skippedTests};else if(W.type==="test-begin"){const X=le;if(X.stepCategory)continue;const $e=`${X.title}@@${X.location}@@${JSON.stringify(X.browser)}`;S.has($e)||(S.set($e,!0),c.value=[...c.value,{id:c.value.length+1,title:X.title,filePath:X.filePath,suitePath:X.suitePath??void 0,status:"running",location:X.location,workerIndex:X.workerIndex??null,startedAt:X.startedAt??Date.now(),browser:X.browser??null}],P.value=[...c.value])}else if(W.type==="test-completed"){const X=le;if(X.stepCategory)continue;const $e=`${X.title}@@${X.location}@@${JSON.stringify(X.browser)}`;if(S.has($e)){const Fe=c.value.findIndex(pe=>`${pe.title}@@${pe.location}@@${JSON.stringify(pe.browser)}`===$e);if(Fe>=0){const pe=c.value[Fe],Pe=[...c.value];Pe[Fe]={...pe,filePath:X.filePath??pe.filePath,suitePath:X.suitePath??pe.suitePath,status:X.status,duration:X.duration,error:X.error,stepEvents:X.stepEvents??pe.stepEvents,wastedTimeMs:X.wastedTimeMs??pe.wastedTimeMs,workerIndex:X.workerIndex??pe.workerIndex,startedAt:X.startedAt?X.startedAt:pe.startedAt,browser:X.browser??pe.browser},c.value=Pe,P.value=[...Pe]}}else S.set($e,!0),c.value=[...c.value,{id:c.value.length+1,title:X.title,filePath:X.filePath,suitePath:X.suitePath??void 0,status:X.status,duration:X.duration,location:X.location,error:X.error,stepEvents:X.stepEvents??null,wastedTimeMs:X.wastedTimeMs??null,workerIndex:X.workerIndex??null,startedAt:X.startedAt??void 0,browser:X.browser??null}],P.value=[...c.value]}else W.type==="run-progress"?y.value=le:W.type==="run-finalizing"?(d.value=!0,y.value=le):W.type==="run-finished"&&(d.value=!1,T(),D(),ve.value++,B())}}function B(L=0){C||L>=5||setTimeout(async()=>{await D(),B(L+1)},1500*(L+1))}function z(L){Z.push(L),ne&&clearTimeout(ne),ne=setTimeout(ee,200)}let i=null;function ue(){i||(m.value?.testCases?.length&&Q(m.value.testCases),i=zs(L=>{L.scope==="run"&&L.runId===Number(l)?z(L.event):L.scope==="global"&&L.event.runId===Number(l)&&L.event.type==="run-started"&&D()}))}function h(){if(C){ue();return}x||f.value&&(m.value?.testCases?.length&&Q(m.value.testCases),x=new EventSource(`/api/test-runs/${l}/stream`),x.onmessage=L=>{try{z(JSON.parse(L.data))}catch{}},x.onerror=()=>{})}function T(){x&&(x.close(),x=null),i&&(i(),i=null)}const G=M(()=>f.value||C&&m.value?.status==="initialising");me(G,L=>{L?h():T()},{immediate:!0}),mt(()=>{T()});let te=null;const de=O([]);me(P,L=>{te===null&&(te=requestAnimationFrame(()=>{de.value=L,te=null}))},{immediate:!0});const Y=M(()=>f.value&&y.value?y.value:m.value?{totalTests:m.value.totalTests,passedTests:m.value.passedTests,failedTests:m.value.failedTests,skippedTests:m.value.skippedTests}:null);async function v(){j.value=!1,g.value=!0;try{await $fetch(`/api/test-runs/${l}`,{method:"DELETE"}),U.add({title:"Test run deleted",color:"success"}),await Xe(`/projects/${m.value?.project?.id}`)}catch(L){const W=L&&typeof L=="object"&&"data"in L?L.data?.message:void 0;U.add({title:"Delete failed",description:W||"An error occurred",color:"error"})}finally{g.value=!1}}const q=O(!1),ae=O(""),se=O([]),ge=O("all"),Ce=M(()=>se.value.length===1?se.value[0]:"all");function re(L){se.value=!L||L==="all"?[]:[L]}const we=M(()=>m.value?.reports||[]),ze=M(()=>{const L=P.value;return L?L.reduce((W,le)=>W+(le.wastedTimeMs??0),0):0}),ye=O("test-cases"),p=O(null),ve=O(0),De=O(0);function Ze(){p.value=null}const Qe=M(()=>m.value&&m.value.failedTests>0),It=M(()=>{if(!m.value?.testCases)return 0;const L=new Set;for(const W of m.value.testCases)W.failureClusterId!=null&&L.add(W.failureClusterId);return L.size}),et=M(()=>{const L=f.value?P.value:m.value?.testCases;if(!L||L.length===0)return 0;const W=new Set;for(const le of L)le.workerIndex!=null&&le.workerIndex>=0&&W.add(le.workerIndex);return W.size}),tt=M(()=>[{label:`Test cases (${P.value.length})`,icon:"i-lucide-beaker",value:"test-cases",slot:"test-cases"},{label:"Insights",icon:"i-lucide-sparkles",value:"insights",slot:"insights"},...Qe.value?[{label:`Failure groups (${It.value})`,icon:"i-lucide-layers",value:"failure-groups",slot:"failure-groups"}]:[],...Qe.value?[{label:"Regression",icon:"i-lucide-git-pull-request-arrow",value:"regression",slot:"regression"}]:[],{label:`Timeline${et.value>0?` (${et.value})`:""}`,icon:"i-lucide-timeline",value:"workers",slot:"workers"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"},{label:`Slow endpoints${De.value>0?` (${De.value})`:""}`,icon:"i-lucide-network",value:"endpoints",slot:"endpoints"}]),St={"test-cases":"overflow-hidden flex flex-col",endpoints:"overflow-hidden flex flex-col"},st=M(()=>tt.value.map(L=>L.value));typeof F.query.tab=="string"&&st.value.includes(F.query.tab)&&(ye.value=F.query.tab),me(st,L=>{L.includes(ye.value)||(ye.value="test-cases")}),me(ye,L=>{F.query.tab!==L&&$.replace({query:{...F.query,tab:L}})});const nt=O(null);function zt(L){ye.value="test-cases",Ie(()=>{nt.value?.scrollToCase(L)})}function Dt(L){p.value=L,ye.value="test-cases"}return(L,W)=>{const le=Vt,X=Ne,$e=ke,Fe=ft,pe=ts,Pe=ss,Ft=as,Pt=Pn,jt=be,Ke=_e,Mt=Ia,Nt=Ro,At=Yo,Bt=Cr,Ut=bl,Lt=Kl,Et=Zl,Ot=us,Wt=ns,Kt=Ct,Ht=ct;return s(),a(V,null,[u(Wt,{id:"test-run-detail"},{header:r(()=>[u(Ft,null,{leading:r(()=>[u(le),u(pe,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...e(m)?.project?.id?[{label:e(m).project.label||e(m).project.name||"Project",to:`/projects/${e(m).project.id}`,slot:"project"}]:[{label:"Project"}],{label:`Run #${e(l)}`+(e(m)?.label?` — ${e(m).label}`:"")}]},{project:r(({item:ce})=>[u(X,{to:ce?.to,class:"text-sm font-medium text-[var(--ui-text-muted)] hover:text-[var(--ui-text)] transition-colors"},{default:r(()=>[_(o(ce?.label),1)]),_:2},1032,["to"]),I.value&&I.value!==Number(e(l))?(s(),R(Fe,{key:0,text:H.value?"Go to running run":"Go to latest run"},{default:r(()=>[u(X,{to:`/test-runs/${I.value}`},{default:r(()=>[n("span",Ql,[u($e,{name:"i-lucide-circle-play",class:J(["w-3.5 h-3.5 text-blue-500",{"animate-pulse":H.value}])},null,8,["class"])])]),_:1},8,["to"])]),_:1},8,["text"])):k("",!0)]),_:1},8,["items"])]),right:r(()=>[u(Pe,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>e(D)()},{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:e(g),onClick:()=>j.value=!0}]},null,8,["actions"])]),_:1})]),body:r(()=>[u(Ot,{modelValue:e(ye),"onUpdate:modelValue":W[5]||(W[5]=ce=>Re(ye)?ye.value=ce:null),"tab-items":tt.value,"tab-panel-class":St},{summary:r(()=>[e(m)?(s(),R(Pt,{key:0,"test-run":e(m),"display-progress":Y.value,"all-reports":we.value,"show-custom-data":e(q),finalizing:e(d),"active-filter":Ce.value,"total-wasted-time":ze.value,"onUpdate:showCustomData":W[0]||(W[0]=ce=>q.value=ce),onFilterStatus:re,onLabelUpdated:e(D)},null,8,["test-run","display-progress","all-reports","show-custom-data","finalizing","active-filter","total-wasted-time","onLabelUpdated"])):k("",!0)]),"tab-test-cases":r(()=>[e(p)!=null?(s(),a("div",ei,[u(jt,{color:"info",variant:"subtle",size:"sm"},{default:r(()=>[...W[8]||(W[8]=[_(" Filtered by failure group ",-1)])]),_:1}),u(Ke,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",label:"Clear filter",onClick:Ze})])):k("",!0),u(Mt,{ref_key:"testCasesListRef",ref:nt,search:e(ae),"onUpdate:search":W[1]||(W[1]=ce=>Re(ae)?ae.value=ce:null),"active-statuses":e(se),"onUpdate:activeStatuses":W[2]||(W[2]=ce=>Re(se)?se.value=ce:null),"browser-filter":e(ge),"onUpdate:browserFilter":W[3]||(W[3]=ce=>Re(ge)?ge.value=ce:null),"test-cases":e(P),suites:e(m)?.suites??[],"is-live":f.value,"failure-cluster-filter":e(p),"project-key":e(m)?.projectId,"project-name":e(m)?.project?.name,class:"flex-1 min-h-0"},null,8,["search","active-statuses","browser-filter","test-cases","suites","is-live","failure-cluster-filter","project-key","project-name"])]),"tab-insights":r(()=>[u(Nt,{"test-run-id":Number(e(l)),"run-status":e(m)?.status??"","refresh-key":e(ve),class:"flex-1 min-h-0 p-4"},null,8,["test-run-id","run-status","refresh-key"])]),"tab-failure-groups":r(()=>[u(At,{"refresh-key":e(ve),onSelectCluster:Dt},null,8,["refresh-key"])]),"tab-regression":r(()=>[u(Bt,{"refresh-key":e(ve)},null,8,["refresh-key"])]),"tab-workers":r(()=>[u(Ut,{"test-cases":e(de),"setup-steps":e(m)?.setupSteps??null,"shard-total":e(m)?.shardTotal??null,live:f.value,"wasted-patterns":e(m)?.wastedWaitPatterns??null,onSelectTestCase:zt},null,8,["test-cases","setup-steps","shard-total","live","wasted-patterns"])]),"tab-compare":r(()=>[u(Lt,{"test-run":e(m)},null,8,["test-run"])]),"tab-endpoints":r(()=>[u(Et,{"refresh-key":e(ve),class:"flex-1 min-h-0",onEndpointsCount:W[4]||(W[4]=ce=>De.value=ce)},null,8,["refresh-key"])]),_:1},8,["modelValue","tab-items"])]),_:1}),u(Ht,null,{default:r(()=>[u(Kt,{open:e(j),title:"Delete test run","onUpdate:open":W[7]||(W[7]=ce=>j.value=ce)},{body:r(()=>[n("p",null,[W[9]||(W[9]=_(" Are you sure you want to delete ",-1)),n("strong",null,"Test Run #"+o(e(m)?.id),1),W[10]||(W[10]=_("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:r(()=>[u(Ke,{color:"neutral",variant:"ghost",label:"Cancel",onClick:W[6]||(W[6]=ce=>j.value=!1)}),u(Ke,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(g),onClick:v},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Qi as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as js}from"./B4jvLMfS.js";import{_ as ws}from"./rsiRgrVM.js";import{b as Re,K as $t,d as ue,L as Nt,w as ye,B as ge,k as e,o as s,f as k,g as t,j as l,_ as Te,c as i,i as a,m as d,t as c,q as S,F as Q,y as ie,v as Le,x as Oe,l as G,M as Vt,N as Bt,p as re,h as B,r as w,E as Ds,O as Kt,n as Ct,s as Ae,P as Tt,D as Lt,I as Rs,u as As,a as Us,e as zs,H as Pt,Q as Ms,R as Fs}from"./DHltYerF.js";import{_ as Is}from"./BUXSUkJ_.js";import{_ as qe,a as Es}from"./DHXWp5yD.js";import{_ as Ue}from"./B1zMFx24.js";import{_ as Ot}from"./DZ3Vfcpz.js";import{u as Vs}from"./oFM1KLWA.js";import{u as he}from"./DXbPFI1d.js";import{_ as Bs}from"./DZUgX70W.js";import{_ as Ps,a as Ns}from"./CdMuck_X.js";import{_ as qt}from"./Dga3Av-m.js";import{_ as Ht}from"./rTvJTef_.js";import{_ as Se}from"./C1dyLp_j.js";import{C as kt,w as Xt,O as at,a as Gt,_ as Jt,u as Qt}from"./4TxgDGVa.js";import{N as Ks}from"./kjYMoWWx.js";import{_ as Ls}from"./hgHc4teu.js";import{_ as Os}from"./BOCwBVnz.js";import{_ as qs}from"./DS53kyHJ.js";import{_ as Hs}from"./D6PUPmRC.js";import{_ as Xs}from"./CazDIG_m.js";import{_ as Gs}from"./DoFBTaDR.js";import{_ as Js}from"./CfROFPse.js";import{_ as ze}from"./BXY_PWcx.js";import{_ as He}from"./Dwws9U0D.js";import{_ as Yt}from"./CN1mJlvD.js";import{_ as lt}from"./DWhBqv_7.js";import{f as St,a as Qs,c as Ys,g as I,e as Wt,p as ot,h as Ce,i as tt}from"./BeKvLsja.js";import{_ as jt}from"./swrbBdtB.js";import{_ as wt}from"./BJtlcTrb.js";import{_ as Ws}from"./EPZOxdgq.js";import{_ as Zs}from"./BvIDC_R-.js";import{_ as en}from"./xqiPI_FQ.js";import{_ as tn}from"./BlA8mIS-.js";import{_ as sn}from"./BeFDVhpA.js";import{_ as Dt}from"./B-5GukRk.js";import{M as nn,D as bt,g as xt}from"./D7W_4Sqc.js";import{_ as an}from"./B1X__ilH.js";import{u as on}from"./CNMoZYMv.js";import{u as ln}from"./DWowvnwc.js";import"./BbS6Bwby.js";import"./r3SBLxtE.js";import"./By4YL7mx.js";import"./qH_j2A3a.js";import"./e7zD3uJ0.js";import"./DkI145a5.js";import"./CcXaak_K.js";import"./BFP6M-20.js";import"./Df7kUO0m.js";import"./Bd3HqPMF.js";import"./BjCHB89N.js";import"./qpI-_f9Q.js";import"./B2oUeBbA.js";import"./CfOLBbW9.js";import"./CPLJeOCb.js";import"./gnCL8GjZ.js";const rn=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],st=new Map,nt=new Map;function cn(A,T){const x=[{event:"run.failed",scenario:{title:`Test run failed — ${A}`,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 — ${A}`,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 — ${A}`,description:"TimeoutError: locator.click: Timeout 30000ms exceeded",icon:"i-lucide-layers",color:"warning"}},{event:"flakiness.spike",scenario:{title:`Flakiness spike — ${A}`,description:"3 tests became flaky (8.3% rate)",icon:"i-lucide-shuffle",color:"warning"}},{event:"perf.regression",scenario:{title:`Performance regression — ${A}`,description:"p90 duration increased by 42% vs last week",icon:"i-lucide-trending-down",color:"warning"}},{event:"run.finished",scenario:{title:`Test run recovered — ${A}`,description:"All 12 tests passed on main",icon:"i-lucide-circle-check",color:"success"}},{event:"diagnosis.completed",scenario:{title:`Diagnosis complete — ${A}`,description:"Root cause: test bug — confidence: high",icon:"i-lucide-sparkles",color:"info"}}],D=x.filter(b=>T.length===0||T.includes(b.event)).map(b=>b.scenario);return D.length===0?[x[0].scenario,x[x.length-1].scenario]:D}function un(){if(!$t().public.demoMode)return null;const T=Re();function x(b,f,u){D(b);const E=cn(f,u);nt.set(b,0);function U(){const R=(nt.get(b)??0)%E.length;nt.set(b,R+1);const C=E[R];T.add({title:C.title,description:C.description,icon:C.icon,color:C.color,duration:7e3});const _=25e3+Math.random()*1e4;st.set(b,setTimeout(U,_))}st.set(b,setTimeout(U,8e3))}function D(b){const f=st.get(b);f!==void 0&&(clearTimeout(f),st.delete(b)),nt.delete(b)}return{scheduleFor:x,cancelFor:D}}const dn={key:0,class:"p-3 space-y-3"},mn={key:0,class:"text-xs text-gray-500"},pn={key:1,class:"text-xs text-gray-500"},gn={key:2,class:"text-xs text-gray-500"},fn={class:"space-y-1"},vn=["checked","onChange"],_n={key:1,class:"p-3 space-y-3"},yn={class:"flex items-center justify-between"},hn={class:"font-medium text-sm inline-flex items-center gap-1"},bn={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},xn={key:1,class:"text-xs text-muted text-center py-2"},kn={key:2,class:"space-y-1.5"},$n={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},Cn={class:"space-y-1"},Tn=["value"],Sn={class:"flex gap-1.5 justify-end"},jn={class:"flex-1 font-medium truncate"},wn={key:3,class:"text-xs text-muted text-center py-1"},Dn={key:4,class:"space-y-2 border-t border-default pt-2"},Rn={class:"space-y-1"},An=["value"],Un={class:"flex gap-1.5 justify-end"},zn=ue({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(A){let T,x;const D=A,b=$t(),f=b.public.demoMode,u=B(()=>b.public.authEnabled),{authState:E}=Nt(),U=B(()=>E.value.authenticated),R=Re(),C=w(!1),_=f?un():null,y=!u.value&&!f?Vs():null,z=w("default"),h=B(()=>"Notification"in window);"Notification"in window&&(z.value=Notification.permission);const v=B(()=>y?.getProject(D.projectId).events??[]),M=B(()=>y?.isSubscribed(D.projectId)??!1);async function K(){!h.value||z.value!=="default"||(z.value=await Notification.requestPermission())}function $(V){return v.value.includes(V)}function g(V){y?.toggleEvent(D.projectId,V)}const m=f||u.value&&U.value,q=f?{server:!1}:{},{data:Z,refresh:O}=([T,x]=ye(()=>he(`/api/subscriptions?projectId=${D.projectId}`,{immediate:m,...q},"$5zp4moJ-7_")),T=await T,x(),T),P=B(()=>Z.value?.subscriptions??[]),be=B(()=>P.value.length>0),{data:xe}=([T,x]=ye(()=>he("/api/channels",{immediate:m,...q},"$vFApQ6eA2X")),T=await T,x(),T),p=B(()=>xe.value?.channels??[]),L=w(!1),oe=w(void 0),de=w(["run.failed"]),ke=w(!1),fe=w(null),ce=w(void 0),ve=w([]),Y=w(!1);function rt(V){fe.value=V,ce.value=V.channel.id,ve.value=[...V.events]}function it(){fe.value=null}async function Me(){if(!(!fe.value||!ce.value||ve.value.length===0)){Y.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(V){R.add({title:"Update failed",description:String(V?.message??V),color:"error"})}finally{Y.value=!1}}}const Xe=B(()=>p.value.map(V=>({label:V.type==="personal_email"?`${V.name} (${V.config.address})`:V.name,value:V.id}))),W=rn.map(V=>({label:V.replace(/\./g," › "),value:V}));ge(C,V=>{V?(m&&O(),p.value.length>0&&!oe.value&&(oe.value=p.value[0].id)):(L.value=!1,fe.value=null)});async function _e(){if(!(!oe.value||de.value.length===0)){ke.value=!0;try{await $fetch("/api/subscriptions",{method:"POST",body:{channelId:oe.value,projectId:D.projectId,events:de.value,mode:"realtime"}}),await O(),L.value=!1,R.add({title:"Subscribed",color:"success"}),f&&_?.scheduleFor(D.projectId,D.projectLabel||"this project",de.value)}catch(V){R.add({title:"Subscribe failed",description:String(V?.message??V),color:"error"})}finally{ke.value=!1}}}async function Fe(V){try{await $fetch(`/api/subscriptions/${V}`,{method:"DELETE"}),await O(),R.add({title:"Unsubscribed",color:"success"}),f&&P.value.length===0&&_?.cancelFor(D.projectId)}catch(j){R.add({title:"Failed",description:String(j?.message??j),color:"error"})}}async function ct(V){const j=V.mutedUntil&&new Date(V.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${V.id}`,{method:"PATCH",body:{mutedUntil:j?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await O()}catch(ee){R.add({title:"Failed",description:String(ee?.message??ee),color:"error"})}}function Ie(V){return V.mutedUntil&&new Date(V.mutedUntil)>new Date}function Ee(V){return V==="personal_email"?"i-lucide-user-round":V==="email"?"i-lucide-mail":V==="slack"?"i-lucide-slack":"i-lucide-webhook"}const ut=B(()=>f||u.value&&U.value||y!=null),Ve=B(()=>f||u.value?be.value:M.value);return(V,j)=>{const ee=Te,Ge=Is,Be=qe,Pe=Le,dt=Oe,Je=Ue,je=Ot,Ne=Ds;return e(ut)?(s(),k(Ne,{key:0,open:e(C),"onUpdate:open":j[6]||(j[6]=N=>G(C)?C.value=N:null),ui:{content:"w-72"}},{content:t(()=>[e(y)?(s(),i("div",dn,[j[9]||(j[9]=a("div",{class:"flex items-center justify-between"},[a("span",{class:"font-medium text-sm"},"Browser notifications")],-1)),e(h)&&e(z)==="default"?(s(),i("p",mn,[l(ee,{variant:"link",size:"xs",class:"p-0",onClick:K},{default:t(()=>[...j[7]||(j[7]=[d(" Allow notifications ",-1)])]),_:1}),j[8]||(j[8]=d(" "+c(" ")+"in your browser to get alerts for this project. ",-1))])):e(h)&&e(z)==="denied"?(s(),i("p",pn," Notifications are blocked. Check your browser settings to allow them. ")):e(h)?S("",!0):(s(),i("p",gn,"Notifications are not supported in this browser.")),e(h)&&e(z)==="granted"?(s(),i(Q,{key:3},[l(Ge),a("div",fn,[(s(!0),i(Q,null,ie(e(W),N=>(s(),i("label",{key:N.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[a("input",{type:"checkbox",checked:$(N.value),class:"accent-primary size-3",onChange:X=>g(N.value)},null,40,vn),d(" "+c(N.label),1)]))),128))])],64)):S("",!0)])):(s(),i("div",_n,[a("div",yn,[a("span",hn,[j[10]||(j[10]=d(" Notifications ",-1)),l(Be,{topic:"notifications.subscribe"})]),e(L)?S("",!0):(s(),k(ee,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(p).length===0,onClick:j[0]||(j[0]=N=>L.value=!0)},{default:t(()=>[...j[11]||(j[11]=[d(" Add ",-1)])]),_:1},8,["disabled"]))]),e(f)?(s(),i("div",bn,[l(Pe,{name:"i-lucide-sparkles",class:"size-3 inline-block mr-1 text-primary"}),j[12]||(j[12]=d(" Demo — notifications will appear as toasts in ~8 s. ",-1))])):e(p).length===0?(s(),i("div",xn,[j[14]||(j[14]=d(" No channels configured.",-1)),j[15]||(j[15]=a("br",null,null,-1)),l(dt,{to:"/settings/notifications",class:"text-primary underline"},{default:t(()=>[...j[13]||(j[13]=[d("Add one in Settings",-1)])]),_:1})])):S("",!0),e(P).length>0?(s(),i("div",kn,[(s(!0),i(Q,null,ie(e(P),N=>(s(),i(Q,{key:N.id},[e(fe)?.id===N.id?(s(),i("div",$n,[l(je,{label:"Channel",size:"xs"},{default:t(()=>[l(Je,{modelValue:e(ce),"onUpdate:modelValue":j[1]||(j[1]=X=>G(ce)?ce.value=X:null),items:e(Xe),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),l(je,{label:"Events",size:"xs"},{default:t(()=>[a("div",Cn,[(s(!0),i(Q,null,ie(e(W),X=>(s(),i("label",{key:X.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Vt(a("input",{type:"checkbox",value:X.value,"onUpdate:modelValue":j[2]||(j[2]=mt=>G(ve)?ve.value=mt:null),class:"accent-primary size-3"},null,8,Tn),[[Bt,e(ve)]]),d(" "+c(X.label),1)]))),128))])]),_:1}),a("div",Sn,[l(ee,{size:"xs",color:"neutral",variant:"ghost",onClick:it},{default:t(()=>[...j[16]||(j[16]=[d("Cancel",-1)])]),_:1}),l(ee,{size:"xs",color:"primary",loading:e(Y),disabled:!e(ce)||e(ve).length===0,onClick:Me},{default:t(()=>[...j[17]||(j[17]=[d(" Save ",-1)])]),_:1},8,["loading","disabled"])])])):(s(),i("div",{key:1,class:re(["flex items-center gap-2 rounded px-2 py-1.5 text-xs",Ie(N)?"opacity-60":""])},[l(Pe,{name:Ee(N.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),a("span",jn,c(N.channel.name),1),l(ee,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:X=>rt(N)},null,8,["onClick"]),l(ee,{icon:Ie(N)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:Ie(N)?"Unmute":"Mute 7 days",onClick:X=>ct(N)},null,8,["icon","title","onClick"]),l(ee,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:X=>Fe(N.id)},null,8,["onClick"])],2))],64))),128))])):!e(L)&&e(p).length>0?(s(),i("div",wn," Not subscribed to this project. ")):S("",!0),e(L)?(s(),i("div",Dn,[l(je,{label:"Channel",size:"xs"},{default:t(()=>[l(Je,{modelValue:e(oe),"onUpdate:modelValue":j[3]||(j[3]=N=>G(oe)?oe.value=N:null),items:e(Xe),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),l(je,{label:"Events",size:"xs"},{default:t(()=>[a("div",Rn,[(s(!0),i(Q,null,ie(e(W),N=>(s(),i("label",{key:N.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Vt(a("input",{type:"checkbox",value:N.value,"onUpdate:modelValue":j[4]||(j[4]=X=>G(de)?de.value=X:null),class:"accent-primary size-3"},null,8,An),[[Bt,e(de)]]),d(" "+c(N.label),1)]))),128))])]),_:1}),a("div",Un,[l(ee,{size:"xs",color:"neutral",variant:"ghost",onClick:j[5]||(j[5]=N=>L.value=!1)},{default:t(()=>[...j[18]||(j[18]=[d("Cancel",-1)])]),_:1}),l(ee,{size:"xs",color:"primary",loading:e(ke),disabled:!e(oe)||e(de).length===0,onClick:_e},{default:t(()=>[...j[19]||(j[19]=[d(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):S("",!0)]))]),default:t(()=>[l(ee,{icon:e(Ve)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Ve)?"primary":"neutral",variant:e(Ve)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):S("",!0)}}}),Mn=Object.assign(zn,{__name:"SubscribeBell"}),Fn={class:"w-full relative"},In={key:0},En={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Vn={class:"font-semibold mb-1"},Bn={class:"capitalize mb-1"},Pn={class:"space-y-0.5"},Nn={class:"font-medium mt-1"},Kn=ue({__name:"TestRunsChart",props:{testRuns:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(A,{emit:T}){const x=A,D=T,b=B(()=>x.markers),f=B(()=>!x.testRuns||x.testRuns.length===0?[]:[...x.testRuns].sort((m,q)=>new Date(m.startTime).getTime()-new Date(q.startTime).getTime()).slice(-30).map(m=>({id:m.id,date:new Date(m.startTime),passed:m.passedTests||0,failed:m.failedTests||0,skipped:m.skippedTests||0,flaky:m.flakyTests||0,total:m.totalTests||0,status:m.status}))),u=g=>g.date,E=g=>g.passed,U=g=>g.failed,R=g=>g.skipped,C=g=>g.flaky,_=["rgb(34, 197, 94)","rgb(239, 68, 68)","rgb(245, 158, 11)","rgb(147, 51, 234)"],y=w(null),{tooltipData:z,tooltipPos:h,markerTooltip:v,markerTooltipPos:M,onRenderComplete:K}=Qt(y,f,{x:g=>g.date,series:[{y:g=>g.passed,color:_[0]},{y:g=>g.failed,color:_[1]},{y:g=>g.skipped,color:_[2]},{y:g=>g.flaky,color:_[3]}],onClick:g=>Ct(`/test-runs/${g.id}`),markers:b,onMarkerClick:g=>D("marker-click",g.id)}),$=[{color:_[0],label:"Passed"},{color:_[1],label:"Failed"},{color:_[2],label:"Skipped"},{color:_[3],label:"Flaky"}];return(g,m)=>{const q=Ht,Z=Se,O=Jt;return s(),i("div",Fn,[e(f).length>0?(s(),i("div",In,[l(e(Gt),{ref_key:"xyContainerRef",ref:y,data:e(f),height:A.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(K)},{default:t(()=>[l(e(Ks),{x:u,y:[E,U,R,C],color:_,"curve-type":e(kt).MonotoneX},null,8,["y","curve-type"]),l(e(Xt),{x:u,y:[E,U,R,C],color:_,"curve-type":e(kt).MonotoneX,"line-width":2},null,8,["y","curve-type"]),l(e(at),{type:"x","tick-format":P=>new Date(P).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),l(e(at),{type:"y",label:"Tests","tick-format":P=>P.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(z)?(s(),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:Kt({left:`${e(h).x}px`,top:`${e(h).y}px`})},[a("div",En,[a("div",Vn,c(new Date(e(z).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),a("div",Bn,"Status: "+c(e(z).status),1),a("div",Pn,[a("div",null,[m[0]||(m[0]=a("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Passed: "+c(e(z).passed),1)]),a("div",null,[m[1]||(m[1]=a("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),d(" Failed: "+c(e(z).failed),1)]),a("div",null,[m[2]||(m[2]=a("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" Skipped: "+c(e(z).skipped),1)]),a("div",null,[m[3]||(m[3]=a("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),d(" Flaky: "+c(e(z).flaky),1)]),a("div",Nn,"Total: "+c(e(z).total),1)]),m[4]||(m[4]=a("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(v),pos:e(M)},null,8,["marker","pos"])])):(s(),k(Z,{key:1,text:"No test run data available to display chart"})),l(O,{items:$})])}}}),Ln=Object.assign(Kn,{__name:"TestRunsChart"}),On={class:"space-y-3"},qn={class:"min-w-0 space-y-1"},Hn={class:"flex items-center gap-2 flex-wrap text-sm"},Xn={key:0,class:"text-gray-500"},Gn=["title"],Jn=["title"],Qn={key:0,class:"text-xs text-gray-500 italic"},Yn={class:"flex items-center gap-2 shrink-0"},Wn=ue({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(A,{emit:T}){const x=A,D=T,b=Re(),f=w([]),u=w(null);async function E(){try{f.value=await $fetch(`/api/projects/${x.projectId}/cluster-merge-suggestions`)}catch{f.value=[]}}ge(()=>x.projectId,E,{immediate:!0});async function U(C,_){u.value=C;try{await $fetch(`/api/cluster-merge-suggestions/${C}/${_}`,{method:"POST"}),b.add({title:_==="approve"?"Clusters merged":"Suggestion dismissed",color:"success"}),await E(),_==="approve"&&D("merged")}catch(y){b.add({title:"Action failed",description:String(y?.message??y),color:"error"})}finally{u.value=null}}const R=C=>C==null?"":`${Math.round(C*100)}% similar`;return(C,_)=>{const y=Ae,z=Te,h=Yt;return e(f).length?(s(),k(h,{key:0,icon:"i-lucide-git-merge",title:"Suggested merges",count:e(f).length,class:"mb-4"},{subtitle:t(()=>[..._[0]||(_[0]=[d(" Likely-duplicate clusters found by semantic analysis. Approving merges them into the older cluster. ",-1)])]),default:t(()=>[a("div",On,[(s(!0),i(Q,null,ie(e(f),v=>(s(),i("div",{key:v.id,class:"rounded-lg border border-default p-3 flex items-start justify-between gap-4"},[a("div",qn,[a("div",Hn,[l(y,{color:v.method==="llm"?"primary":"neutral",variant:"subtle",size:"sm"},{default:t(()=>[d(c(v.method==="llm"?`AI · ${v.llmConfidence??""}`:"similarity"),1)]),_:2},1032,["color"]),R(v.score)?(s(),i("span",Xn,c(R(v.score)),1)):S("",!0)]),a("p",{class:"text-sm truncate",title:v.clusterA?.signature||""},[_[1]||(_[1]=a("span",{class:"text-gray-400"},"A:",-1)),d(" "+c(v.clusterA?.signature||`#${v.id}`),1)],8,Gn),a("p",{class:"text-sm truncate",title:v.clusterB?.signature||""},[_[2]||(_[2]=a("span",{class:"text-gray-400"},"B:",-1)),d(" "+c(v.clusterB?.signature||""),1)],8,Jn),v.llmReason?(s(),i("p",Qn,c(v.llmReason),1)):S("",!0)]),a("div",Yn,[l(z,{size:"sm",color:"primary",icon:"i-lucide-git-merge",loading:e(u)===v.id,onClick:M=>U(v.id,"approve")},{default:t(()=>[..._[3]||(_[3]=[d(" Merge ",-1)])]),_:1},8,["loading","onClick"]),l(z,{size:"sm",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:e(u)===v.id,onClick:M=>U(v.id,"reject")},{default:t(()=>[..._[4]||(_[4]=[d(" Dismiss ",-1)])]),_:1},8,["disabled","onClick"])])]))),128))])]),_:1},8,["count"])):S("",!0)}}}),Zn=Object.assign(Wn,{__name:"ClusterMergeSuggestions"}),ea={class:"flex items-center justify-between"},ta={class:"text-sm text-gray-500 inline-flex items-center gap-1"},sa={class:"min-w-0 space-y-0.5"},na={key:0,class:"text-xs text-gray-500 italic truncate"},aa={key:1,class:"text-gray-400 text-xs"},oa={class:"text-sm tabular-nums"},la={class:"text-sm tabular-nums"},ra={key:1,class:"text-gray-400 text-xs"},ia={class:"text-sm text-gray-500 whitespace-nowrap"},ca={key:0,class:"ml-1 text-xs text-gray-400"},ua={class:"flex justify-end"},da=ue({__name:"FailureClustersList",props:{projectId:{}},async setup(A){let T,x;const D=A,b=w(void 0),{data:f,pending:u}=([T,x]=ye(()=>he(()=>{const U=new URLSearchParams;b.value&&U.set("status",b.value);const R=U.toString();return`/api/projects/${D.projectId}/failure-clusters${R?`?${R}`:""}`},{lazy:!0,server:!1,watch:[b]},"$f7pDU1t-lL")),T=await T,x(),T),E=[{accessorKey:"signature",header:I("Signature")},{accessorKey:"errorType",header:I("Type")},{accessorKey:"status",header:I("Status")},{accessorKey:"affectedTests",header:I("Tests")},{accessorKey:"occurrences",header:I("Occurrences")},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"lastSeenAt",header:I("Last seen")},{id:"actions",header:"Actions"}];return(U,R)=>{const C=qe,_=Ue,y=Oe,z=Ae,h=Le,v=Te,M=ze,K=lt,$=Se,g=He;return s(),k(g,null,{header:t(()=>[a("div",ea,[a("p",ta,[R[1]||(R[1]=d(" Ongoing failure signatures grouped by normalized error. ",-1)),l(C,{topic:"cluster.concept"})]),l(_,{modelValue:e(b),"onUpdate:modelValue":R[0]||(R[0]=m=>G(b)?b.value=m: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:t(()=>[l(K,{"min-width":"48rem",bleed:!1},{default:t(()=>[l(M,{data:e(f)??[],columns:E,loading:e(u)},{"actions-header":t(()=>[...R[2]||(R[2]=[a("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":t(({row:m})=>[a("div",sa,[l(y,{to:`/failure-clusters/${m.original.id}`,class:re(["text-sm text-primary hover:underline truncate block",m.original.title?"":"font-mono"]),title:m.original.signature},{default:t(()=>[d(c(m.original.title||m.original.signature),1)]),_:2},1032,["to","class","title"]),m.original.triageNote?(s(),i("p",na,c(m.original.triageNote),1)):S("",!0)])]),"errorType-cell":t(({row:m})=>[m.original.errorType?(s(),k(z,{key:0,color:("clusterErrorTypeColor"in U?U.clusterErrorTypeColor:e(Ys))(m.original.errorType),variant:"subtle",size:"sm"},{default:t(()=>[d(c(m.original.errorType),1)]),_:2},1032,["color"])):(s(),i("span",aa,"—"))]),"status-cell":t(({row:m})=>[l(z,{color:("clusterStatusColor"in U?U.clusterStatusColor:e(Qs))(m.original.status),variant:"subtle",size:"sm"},{default:t(()=>[d(c(m.original.status),1)]),_:2},1032,["color"])]),"affectedTests-cell":t(({row:m})=>[a("span",oa,c(m.original.affectedTests),1)]),"occurrences-cell":t(({row:m})=>[a("span",la,c(m.original.occurrences),1)]),"diagnosis-cell":t(({row:m})=>[m.original.diagnosis?.status==="completed"&&m.original.diagnosis.category?(s(),k(z,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[l(h,{name:"i-lucide-sparkles",class:"size-3"}),d(" "+c(m.original.diagnosis.category),1)]),_:2},1024)):(s(),i("span",ra,"—"))]),"lastSeenAt-cell":t(({row:m})=>[a("div",ia,[l(y,{to:`/test-runs/${m.original.lastSeenRunId}`,class:"text-primary hover:underline"},{default:t(()=>[d(" run #"+c(m.original.lastSeenRunId),1)]),_:2},1032,["to"]),m.original.lastSeenAt?(s(),i("span",ca," ("+c(("formatRelativeTime"in U?U.formatRelativeTime:e(St))(m.original.lastSeenAt))+") ",1)):S("",!0)])]),"actions-cell":t(({row:m})=>[a("div",ua,[l(v,{to:`/failure-clusters/${m.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...R[3]||(R[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(u)&&e(f)&&e(f).length===0?(s(),k($,{key:0,text:"No failure clusters recorded for this project.",padded:!1,class:"py-4"})):S("",!0)]),_:1})}}}),ma=Object.assign(da,{__name:"FailureClustersList"}),pa={class:"flex items-center justify-between"},ga={class:"flex items-center gap-3"},fa={class:"text-sm text-gray-500 inline-flex items-center gap-1"},va={class:"flex items-center gap-1.5"},_a={class:"min-w-0 space-y-0.5"},ya={class:"flex items-center gap-2"},ha={class:"text-sm tabular-nums"},ba={class:"text-sm tabular-nums"},xa={key:1,class:"text-gray-400 text-xs"},ka={key:1,class:"text-gray-400 text-xs"},$a={key:1,class:"text-gray-400 text-xs"},Ca={key:0,class:"text-sm text-gray-500"},Ta={key:1,class:"text-gray-400 text-xs"},Sa={class:"flex justify-end"},ja={key:0,class:"text-sm text-gray-500 py-4 text-center"},wa=ue({__name:"FlakyTestsList",props:{projectId:{},environment:{},projectName:{}},async setup(A){let T,x;const D=A,b=w(50),f=w([]),{data:u,pending:E}=([T,x]=ye(()=>he(()=>{const h=new URLSearchParams({runs:String(b.value)});return D.environment&&h.set("environment",D.environment),`/api/projects/${D.projectId}/flaky-tests?${h.toString()}`},{lazy:!0,server:!1,watch:[b,()=>D.environment]},"$qKoEnbecbI")),T=await T,x(),T),U=B(()=>f.value.length===0?u.value??[]:(u.value??[]).filter(h=>f.value.includes(h.rootCause??"")));function R(h){return h>=60?"error":h>=30?"warning":"neutral"}function C(h){switch(h){case"timing":return"amber";case"network":return"red";case"assertion":return"blue";case"environment":return"purple";default:return"gray"}}function _(h){f.value.indexOf(h)>=0?f.value=f.value.filter(M=>M!==h):f.value=[...f.value,h]}const y=[{label:"Timing",value:"timing"},{label:"Network",value:"network"},{label:"Assertion",value:"assertion"},{label:"Environment",value:"environment"},{label:"Other",value:"other"}],z=[{accessorKey:"title",header:I("Test")},{accessorKey:"impact",header:I("Impact")},{accessorKey:"score",header:I("Score")},{accessorKey:"failureRate",header:I("Failure rate")},{accessorKey:"retryPassRuns",header:I("Retry passes")},{accessorKey:"alternations",header:I("Flips")},{accessorKey:"rootCause",header:"Root cause"},{accessorKey:"lastFlakeAt",header:I("Last flake")},{id:"actions",header:"Actions"}];return(h,v)=>{const M=qe,K=Le,$=Ae,g=Te,m=Ue,q=Oe,Z=jt,O=qt,P=ze,be=lt,xe=He;return s(),k(xe,null,{header:t(()=>[a("div",pa,[a("div",ga,[a("p",fa,[v[1]||(v[1]=d(" Tests that fail intermittently — detected by retry passes and status alternations ",-1)),l(M,{topic:"project.flaky-tests"})]),A.environment?(s(),k($,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[l(K,{name:"i-lucide-layers",class:"size-3"}),d(" "+c(A.environment),1)]),_:1})):S("",!0),a("div",va,[(s(),i(Q,null,ie(y,p=>l(g,{key:p.value,size:"xs",variant:e(f).includes(p.value)?"solid":"outline",color:(e(f).includes(p.value),"neutral"),onClick:L=>_(p.value)},{default:t(()=>[d(c(p.label),1)]),_:2},1032,["variant","color","onClick"])),64))])]),l(m,{modelValue:e(b),"onUpdate:modelValue":v[0]||(v[0]=p=>G(b)?b.value=p: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:t(()=>[l(be,{"min-width":"52rem",bleed:!1},{default:t(()=>[l(P,{data:e(U),columns:z,loading:e(E),sticky:"",class:"max-h-[32rem]"},{"actions-header":t(()=>[...v[2]||(v[2]=[a("div",{class:"text-right"},"Actions",-1)])]),"title-cell":t(({row:p})=>[a("div",_a,[l(q,{to:`/test-run-cases/${p.original.latestRunsCaseId}`,class:"text-sm font-medium text-primary hover:underline truncate block",title:p.original.title},{default:t(()=>[d(c(p.original.title),1)]),_:2},1032,["to","title"]),l(Z,{"file-path":p.original.filePath,"project-key":A.projectId,"project-name":A.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])])]),"impact-cell":t(({row:p})=>[a("div",ya,[a("span",{class:re(["inline-block w-2 h-2 rounded-full shrink-0",{"bg-red-500":p.original.wastedCiMinutes>=30,"bg-amber-500":p.original.wastedCiMinutes>=5&&p.original.wastedCiMinutes<30,"bg-green-500":p.original.wastedCiMinutes>=0&&p.original.wastedCiMinutes<5}])},null,2),a("span",ha,c(Math.round(p.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":t(({row:p})=>[l($,{color:R(p.original.score),variant:"subtle",size:"sm"},{default:t(()=>[d(c(p.original.score),1)]),_:2},1032,["color"])]),"failureRate-cell":t(({row:p})=>[a("span",ba,c(Math.round(p.original.failureRate*100))+"%",1)]),"retryPassRuns-cell":t(({row:p})=>[p.original.retryPassRuns?(s(),k($,{key:0,color:"warning",variant:"outline",size:"sm"},{default:t(()=>[d(c(p.original.retryPassRuns)+" run"+c(p.original.retryPassRuns===1?"":"s"),1)]),_:2},1024)):(s(),i("span",xa,"—"))]),"alternations-cell":t(({row:p})=>[p.original.alternations>=2?(s(),k($,{key:0,color:"neutral",variant:"outline",size:"sm"},{default:t(()=>[d(c(p.original.alternations),1)]),_:2},1024)):(s(),i("span",ka,"—"))]),"rootCause-cell":t(({row:p})=>[p.original.rootCause?(s(),k(O,{key:0,text:p.original.rootCause,color:C(p.original.rootCause)},null,8,["text","color"])):(s(),i("span",$a,"—"))]),"lastFlakeAt-cell":t(({row:p})=>[p.original.lastFlakeAt?(s(),i("span",Ca,c(("formatRelativeTime"in h?h.formatRelativeTime:e(St))(p.original.lastFlakeAt)),1)):(s(),i("span",Ta,"—"))]),"actions-cell":t(({row:p})=>[a("div",Sa,[l(g,{to:`/test-run-cases/${p.original.latestRunsCaseId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...v[3]||(v[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(E)&&e(U).length===0?(s(),i("p",ja," No flaky tests detected in the last "+c(e(b))+" runs. ",1)):S("",!0)]),_:1})}}}),Da=Object.assign(wa,{__name:"FlakyTestsList"}),Ra={class:"w-full relative"},Aa={key:0},Ua={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},za={class:"font-semibold mb-1"},Ma={class:"capitalize mb-1"},Fa={class:"space-y-0.5"},Ia={class:"mt-1"},Ea={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},Va=ue({__name:"PerformanceTrendChart",props:{data:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(A,{emit:T}){const x=A,D=T,b=B(()=>x.markers),f=B(()=>!x.data||x.data.length===0?[]:x.data.map($=>({id:$.id,date:new Date($.startTime),duration:$.duration?Math.round($.duration/1e3):null,avgTestDuration:$.avgTestDuration?Math.round($.avgTestDuration/1e3):null,p90TestDuration:$.p90TestDuration?Math.round($.p90TestDuration/1e3):null,commit:$.commit?$.commit.substring(0,7):null,status:$.status,totalTests:$.totalTests}))),u=$=>$.date,E=$=>$.duration??void 0,U=$=>$.avgTestDuration??void 0,R=$=>$.p90TestDuration??void 0,C=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],_=w(null),{tooltipData:y,tooltipPos:z,markerTooltip:h,markerTooltipPos:v,onRenderComplete:M}=Qt(_,f,{x:$=>$.date,series:[{y:$=>$.duration,color:C[0]},{y:$=>$.avgTestDuration,color:C[1]},{y:$=>$.p90TestDuration,color:C[2]}],onClick:$=>Ct(`/test-runs/${$.id}`),markers:b,onMarkerClick:$=>D("marker-click",$.id)}),K=[{color:C[0],label:"Total Duration"},{color:C[1],label:"Avg Test Duration"},{color:C[2],label:"P90 Test Duration"}];return($,g)=>{const m=Ht,q=Se,Z=Jt;return s(),i("div",Ra,[e(f).length>0?(s(),i("div",Aa,[l(e(Gt),{ref_key:"xyContainerRef",ref:_,data:e(f),height:A.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(M)},{default:t(()=>[l(e(Xt),{x:u,y:[E,U,R],color:C,"curve-type":e(kt).MonotoneX,"line-width":2},null,8,["y","curve-type"]),l(e(at),{type:"x","tick-format":O=>new Date(O).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),l(e(at),{type:"y",label:"Duration (s)","tick-format":O=>`${O}s`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(y)?(s(),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:Kt({left:`${e(z).x}px`,top:`${e(z).y}px`})},[a("div",Ua,[a("div",za,c(new Date(e(y).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),a("div",Ma,"Status: "+c(e(y).status),1),a("div",Fa,[a("div",null,[g[0]||(g[0]=a("span",{class:"text-blue-500 dark:text-blue-400"},"●",-1)),d(" Total: "+c(e(y).duration??"-")+"s ",1)]),a("div",null,[g[1]||(g[1]=a("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Avg: "+c(e(y).avgTestDuration??"-")+"s ",1)]),a("div",null,[g[2]||(g[2]=a("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" P90: "+c(e(y).p90TestDuration??"-")+"s ",1)]),a("div",Ia,"Tests: "+c(e(y).totalTests),1),e(y).commit?(s(),i("div",Ea," Commit: "+c(e(y).commit),1)):S("",!0)]),g[3]||(g[3]=a("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):S("",!0),l(m,{marker:e(h),pos:e(v)},null,8,["marker","pos"])])):(s(),k(q,{key:1,text:"No performance data available to display chart"})),l(Z,{items:K})])}}}),Ba=Object.assign(Va,{__name:"PerformanceTrendChart"}),Pa={class:"min-w-0"},Na={class:"mt-1"},Ka={class:"tabular-nums"},La={key:0,class:"ml-1 text-xs text-gray-500",title:"timeout ÷ p95"},Oa={class:"tabular-nums text-gray-500"},qa={key:0,class:"text-sm"},Ha={key:1,class:"tabular-nums"},Xa={class:"tabular-nums font-medium text-green-600 dark:text-green-400"},Ga={class:"tabular-nums text-gray-500"},Ja=ue({__name:"TimeoutOpportunitiesTable",props:{projectId:{},projectName:{}},async setup(A){let T,x;const D=A,{data:b,pending:f}=([T,x]=ye(()=>he(()=>`/api/projects/${D.projectId}/timeout-opportunities`,{lazy:!0,server:!1},"$tMBJjTyDol")),T=await T,x(),T),u=B(()=>b.value??[]);function E(R){return R==null?"—":R<1e3?`${R}ms`:`${(R/1e3).toFixed(1)}s`}const U=[{accessorKey:"title",header:I("Test case")},{accessorKey:"kind",header:"Type"},{accessorKey:"timeout",header:I("Timeout")},{accessorKey:"p95",header:I("p95")},{accessorKey:"recommendedTimeout",header:"Recommendation"},{accessorKey:"estimatedSavingMs",header:I("Est. saving / failure")},{accessorKey:"runCount",header:I("Runs")}];return(R,C)=>{const _=wt,y=Se,z=Oe,h=jt,v=Ae,M=ze,K=lt,$=He;return s(),k($,null,{header:t(()=>[...C[0]||(C[0]=[a("h2",{class:"text-xl font-semibold"},"Timeout opportunities",-1),a("p",{class:"text-sm text-gray-600 mt-1"},[d(" Tests whose configured timeout far exceeds their real duration, or that still carry a stale "),a("code",{class:"text-xs"},"test.slow()"),d(" mark — tightening these makes failures surface sooner. ")],-1)])]),default:t(()=>[e(f)?(s(),k(_,{key:0})):e(u).length===0?(s(),k(y,{key:1,text:"No timeout opportunities",description:"No oversized timeouts or stale test.slow() marks were found for this project."})):(s(),k(K,{key:2,"min-width":"52rem",bleed:!1},{default:t(()=>[l(M,{data:e(u),columns:U,sticky:"",class:"max-h-[32rem]"},{"title-cell":t(({row:g})=>[a("div",Pa,[l(z,{to:`/test-cases/${g.original.testCaseId}`,class:"font-medium truncate block hover:text-primary hover:underline"},{default:t(()=>[d(c(g.original.title),1)]),_:2},1032,["to"]),a("div",Na,[l(h,{"file-path":g.original.filePath,"project-key":A.projectId,"project-name":A.projectName,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"kind-cell":t(({row:g})=>[l(v,{color:g.original.kind==="oversized-timeout"?"warning":"info",variant:"subtle",size:"sm"},{default:t(()=>[d(c(g.original.kind==="oversized-timeout"?"Oversized timeout":"Stale test.slow()"),1)]),_:2},1032,["color"])]),"timeout-cell":t(({row:g})=>[a("span",Ka,c(E(g.original.timeout)),1),g.original.headroomRatio!=null?(s(),i("span",La," ("+c(g.original.headroomRatio)+"×) ",1)):S("",!0)]),"p95-cell":t(({row:g})=>[a("span",Oa,c(E(g.original.p95)),1)]),"recommendedTimeout-cell":t(({row:g})=>[g.original.kind==="stale-slow"?(s(),i("span",qa,[...C[1]||(C[1]=[d("Remove ",-1),a("code",{class:"text-xs"},"test.slow()",-1)])])):(s(),i("span",Ha,"Lower to ~"+c(E(g.original.recommendedTimeout)),1))]),"estimatedSavingMs-cell":t(({row:g})=>[a("span",Xa,c(E(g.original.estimatedSavingMs)),1)]),"runCount-cell":t(({row:g})=>[a("span",Ga,c(g.original.runCount),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),Qa=Object.assign(Ja,{__name:"TimeoutOpportunitiesTable"}),Ya={class:"flex items-center justify-between"},Wa={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Za={class:"truncate font-mono text-xs"},eo={class:"tabular-nums"},to={class:"tabular-nums text-gray-500"},so={class:"tabular-nums text-gray-500"},no=ue({__name:"SpecHealthTable",props:{projectId:{}},async setup(A){let T,x;const D=A,b=w(30),{data:f,pending:u}=([T,x]=ye(()=>he(()=>`/api/projects/${D.projectId}/spec-health?days=${b.value}`,{lazy:!0,server:!1,watch:[b]},"$QL0nEFEG1b")),T=await T,x(),T),E=B(()=>f.value?.specs??[]);function U(h){return h>=.9?"bg-green-500":h>=.7?"bg-amber-500":h>0?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function R(h){return h>=.9?"text-green-600 dark:text-green-400":h>=.7?"text-amber-600 dark:text-amber-400":h>0?"text-red-600 dark:text-red-400":"text-gray-500"}function C(h){return`${Math.round(h*100)}%`}function _(h){return h<1e3?`${h}ms`:`${(h/1e3).toFixed(1)}s`}const y=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],z=[{accessorKey:"prefix",header:I("Spec prefix")},{accessorKey:"passRate",header:I("Pass rate")},{accessorKey:"flakyRate",header:I("Flaky")},{accessorKey:"failureCount",header:I("Failures")},{accessorKey:"testCount",header:I("Tests")},{accessorKey:"avgDuration",header:I("Avg time")}];return(h,v)=>{const M=qe,K=Ue,$=wt,g=Se,m=Oe,q=ze,Z=lt,O=He;return s(),k(O,null,{header:t(()=>[a("div",Ya,[a("p",Wa,[v[1]||(v[1]=d(" Spec-file health overview — pass rate, flaky rate, and failure count per spec prefix ",-1)),l(M,{topic:"project.spec-health"})]),l(K,{modelValue:e(b),"onUpdate:modelValue":v[0]||(v[0]=P=>G(b)?b.value=P:null),items:y,size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[e(u)?(s(),k($,{key:0})):e(E).length===0?(s(),k(g,{key:1,text:"No data",description:"No spec health data available for the selected period."})):(s(),k(Z,{key:2,"min-width":"46rem",bleed:!1},{default:t(()=>[l(q,{data:e(E),columns:z,sticky:"",class:"max-h-[32rem]"},{"prefix-cell":t(({row:P})=>[l(m,{to:`/projects/${A.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:t(()=>[a("span",{class:re(["inline-block size-3 rounded shrink-0",U(P.original.passRate)])},null,2),a("span",Za,c(P.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":t(({row:P})=>[a("span",{class:re(["font-medium tabular-nums",R(P.original.passRate)])},c(C(P.original.passRate)),3)]),"flakyRate-cell":t(({row:P})=>[a("span",eo,c(Math.round(P.original.flakyRate*100))+"%",1)]),"failureCount-cell":t(({row:P})=>[a("span",{class:re(["tabular-nums",P.original.failureCount>0?"text-red-600 dark:text-red-400":""])},c(P.original.failureCount),3)]),"testCount-cell":t(({row:P})=>[a("span",to,c(P.original.testCount),1)]),"avgDuration-cell":t(({row:P})=>[a("span",so,c(_(P.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),ao=Object.assign(no,{__name:"SpecHealthTable"}),oo={class:"space-y-4"},lo={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},ro={id:"marker-environments"},io=["value"],co=ue({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(A,{emit:T}){const x=A,D=T,b=Re(),f=nn.map(_=>({label:_.label,value:_.id,icon:_.icon})),u=Rs({label:"",occurredAt:"",category:bt,environment:"",description:""}),E=B(()=>!!x.marker),U=w(!1);function R(_){const y=new Date(_),z=h=>String(h).padStart(2,"0");return`${y.getFullYear()}-${z(y.getMonth()+1)}-${z(y.getDate())}T${z(y.getHours())}:${z(y.getMinutes())}`}ge(()=>x.open,_=>{_&&(x.marker?(u.label=x.marker.label,u.occurredAt=R(x.marker.occurredAt),u.category=x.marker.category||bt,u.environment=x.marker.environment??"",u.description=x.marker.description??""):(u.label="",u.occurredAt=R(new Date),u.category=bt,u.environment="",u.description=""))});async function C(){if(!u.label.trim()){b.add({title:"Label is required",color:"error"});return}if(!u.occurredAt){b.add({title:"Date is required",color:"error"});return}U.value=!0;const _={label:u.label.trim(),occurredAt:new Date(u.occurredAt).toISOString(),category:u.category,environment:u.environment.trim()||null,description:u.description.trim()||null};try{x.marker?(await $fetch(`/api/markers/${x.marker.id}`,{method:"PUT",body:_}),b.add({title:"Marker updated",color:"success"})):(await $fetch(`/api/projects/${x.projectId}/markers`,{method:"POST",body:_}),b.add({title:"Marker created",color:"success"})),D("update:open",!1),D("saved")}catch(y){b.add({title:E.value?"Failed to update marker":"Failed to create marker",description:Wt(y),color:"error"})}finally{U.value=!1}}return(_,y)=>{const z=Lt,h=Ot,v=Ue,M=sn,K=Te,$=Dt,g=Tt;return s(),k(g,null,{default:t(()=>[l($,{open:A.open,title:e(E)?"Edit marker":"Add marker","onUpdate:open":y[6]||(y[6]=m=>D("update:open",m))},{body:t(()=>[a("div",oo,[l(h,{label:"Label",name:"label",required:""},{default:t(()=>[l(z,{modelValue:e(u).label,"onUpdate:modelValue":y[0]||(y[0]=m=>e(u).label=m),placeholder:"e.g. Migrated CI to new runners",class:"w-full"},null,8,["modelValue"])]),_:1}),a("div",lo,[l(h,{label:"Date & time",name:"occurredAt",required:""},{default:t(()=>[l(z,{modelValue:e(u).occurredAt,"onUpdate:modelValue":y[1]||(y[1]=m=>e(u).occurredAt=m),type:"datetime-local",class:"w-full"},null,8,["modelValue"])]),_:1}),l(h,{label:"Category",name:"category"},{default:t(()=>[l(v,{modelValue:e(u).category,"onUpdate:modelValue":y[2]||(y[2]=m=>e(u).category=m),items:e(f),class:"w-full"},null,8,["modelValue","items"])]),_:1})]),l(h,{label:"Environment",name:"environment",help:"Optional. Leave empty to apply to all environments."},{default:t(()=>[l(z,{modelValue:e(u).environment,"onUpdate:modelValue":y[3]||(y[3]=m=>e(u).environment=m),list:"marker-environments",placeholder:"e.g. production",class:"w-full"},null,8,["modelValue"]),a("datalist",ro,[(s(!0),i(Q,null,ie(A.environments||[],m=>(s(),i("option",{key:m,value:m},null,8,io))),128))])]),_:1}),l(h,{label:"Description",name:"description"},{default:t(()=>[l(M,{modelValue:e(u).description,"onUpdate:modelValue":y[4]||(y[4]=m=>e(u).description=m),rows:3,placeholder:"Optional details",class:"w-full"},null,8,["modelValue"])]),_:1})])]),footer:t(()=>[l(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:y[5]||(y[5]=m=>D("update:open",!1))}),l(K,{label:e(E)?"Save changes":"Add marker",icon:e(E)?"i-lucide-check":"i-lucide-plus",loading:e(U),onClick:C},null,8,["label","icon","loading"])]),_:1},8,["open","title"])]),_:1})}}}),uo=Object.assign(co,{__name:"MarkerFormModal"}),mo={class:"md:hidden space-y-3"},po={class:"flex items-start justify-between gap-2"},go={key:0,class:"flex gap-1 shrink-0"},fo={class:"text-sm text-muted"},vo={key:0,class:"text-xs"},_o={key:1,class:"text-sm text-muted"},yo={class:"whitespace-nowrap"},ho={class:"text-sm"},bo={class:"text-xs text-muted"},xo={class:"font-medium flex items-center gap-1"},ko={key:0,class:"text-xs text-muted line-clamp-1"},$o={key:1,class:"text-xs text-muted"},Co={key:0,class:"flex gap-1 justify-end"},To=ue({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(A,{emit:T}){const x=A,D=T,b=Re(),f=B(()=>[...x.markers].sort((v,M)=>+new Date(M.occurredAt)-+new Date(v.occurredAt))),u=[{accessorKey:"occurredAt",header:"When"},{accessorKey:"category",header:"Category"},{accessorKey:"label",header:"Label"},{accessorKey:"environment",header:"Environment"},{accessorKey:"actions",header:""}],E=w(!1),U=w(null);function R(){U.value=null,E.value=!0}function C(v){U.value=v,E.value=!0}ge(()=>x.focusMarkerId,v=>{if(v==null)return;const M=x.markers.find(K=>K.id===v);M&&C(M),D("clear-focus")},{immediate:!0});const _=w(!1),y=w(null);function z(v){y.value=v,_.value=!0}async function h(){const v=y.value;if(_.value=!1,y.value=null,!!v)try{await $fetch(`/api/markers/${v.id}`,{method:"DELETE"}),b.add({title:"Marker deleted",color:"success"}),D("changed")}catch(M){b.add({title:"Failed to delete marker",description:Wt(M),color:"error"})}}return(v,M)=>{const K=Te,$=Se,g=tn,m=Ae,q=Le,Z=ze,O=uo,P=Dt,be=Tt,xe=Yt;return s(),k(xe,{title:"Timeline markers",count:A.markers.length,icon:"i-lucide-milestone",help:"project.timeline",subtitle:"Dated events overlaid on the analytics charts"},{actions:t(()=>[A.canEdit?(s(),k(K,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:R})):S("",!0)]),default:t(()=>[A.markers.length===0?(s(),k($,{key:0,icon:"i-lucide-milestone",text:"No markers yet. Add a deploy, config change, or incident to see it on the charts."})):(s(),i(Q,{key:1},[a("div",mo,[(s(!0),i(Q,null,ie(e(f),p=>(s(),i("div",{key:p.id,class:"rounded-lg border border-default p-3 space-y-2"},[a("div",po,[l(g,{marker:p},null,8,["marker"]),A.canEdit?(s(),i("div",go,[l(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:L=>C(p)},null,8,["onClick"]),l(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:L=>z(p)},null,8,["onClick"])])):S("",!0)]),a("div",fo,c(("prettyDateFormat"in v?v.prettyDateFormat:e(ot))(p.occurredAt)),1),p.environment?(s(),i("div",vo,[l(m,{color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(p.environment),1)]),_:2},1024)])):S("",!0),p.description?(s(),i("p",_o,c(p.description),1)):S("",!0)]))),128))]),l(Z,{data:e(f),columns:u,class:"hidden md:block"},{"occurredAt-cell":t(({row:p})=>[a("div",yo,[a("div",ho,c(("prettyDateFormat"in v?v.prettyDateFormat:e(ot))(p.original.occurredAt)),1),a("div",bo,c(("formatRelativeTime"in v?v.formatRelativeTime:e(St))(p.original.occurredAt)),1)])]),"category-cell":t(({row:p})=>[l(m,{color:e(xt)(p.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[l(q,{name:e(xt)(p.original.category).icon,class:"size-3"},null,8,["name"]),d(" "+c(e(xt)(p.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":t(({row:p})=>[a("div",null,[a("div",xo,[d(c(p.original.label)+" ",1),p.original.source==="auto"?(s(),k(q,{key:0,name:"i-lucide-sparkles",class:"size-3 text-muted",title:"Automatically detected"})):S("",!0)]),p.original.description?(s(),i("div",ko,c(p.original.description),1)):S("",!0)])]),"environment-cell":t(({row:p})=>[p.original.environment?(s(),k(m,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(p.original.environment),1)]),_:2},1024)):(s(),i("span",$o,"All"))]),"actions-cell":t(({row:p})=>[A.canEdit?(s(),i("div",Co,[l(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:L=>C(p.original)},null,8,["onClick"]),l(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:L=>z(p.original)},null,8,["onClick"])])):S("",!0)]),_:1},8,["data"])],64)),l(O,{open:e(E),"onUpdate:open":M[0]||(M[0]=p=>G(E)?E.value=p:null),"project-id":A.projectId,marker:e(U),environments:A.environments,onSaved:M[1]||(M[1]=p=>D("changed"))},null,8,["open","project-id","marker","environments"]),l(be,null,{default:t(()=>[l(P,{open:e(_),title:"Delete marker","onUpdate:open":M[3]||(M[3]=p=>_.value=p)},{body:t(()=>[a("p",null,[M[4]||(M[4]=d(" Delete marker ",-1)),e(y)?(s(),k(g,{key:0,marker:e(y),class:"inline-flex align-middle"},null,8,["marker"])):S("",!0),M[5]||(M[5]=d("? This can't be undone. ",-1))])]),footer:t(()=>[l(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:M[2]||(M[2]=p=>_.value=!1)}),l(K,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:h})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),So=Object.assign(To,{__name:"ProjectTimeline"}),jo={class:"flex flex-col h-full overflow-y-auto gap-4"},wo={key:0,class:"pb-0 space-y-4"},Do={key:0,class:"text-gray-600"},Ro={key:1,class:"flex flex-wrap gap-1 mt-2"},Ao={class:"flex flex-wrap items-center gap-3 mb-4"},Uo={class:"inline-flex items-center gap-1"},zo=["onClick"],Mo={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"},Fo={class:"text-sm text-primary-700 dark:text-primary-300"},Io={key:1,class:"text-xs text-primary-500"},Eo=["checked","onClick"],Vo={class:"flex items-center gap-2"},Bo=["href","onClick"],Po={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},No={class:"inline-flex items-center gap-1"},Ko={key:0,class:"flex items-center gap-1"},Lo={class:"text-xs text-gray-600"},Oo={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"},qo={key:0,class:"flex items-center gap-1 flex-wrap"},Ho={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Xo={key:1,class:"text-xs text-gray-500"},Go={class:"space-y-1"},Jo={class:"text-xs text-gray-500"},Qo={class:"flex justify-end gap-2"},Yo={key:2,class:"text-center py-8 text-gray-500"},Wo={class:"text-xs text-gray-400 max-w-sm"},Zo={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},el={class:"flex flex-wrap items-center gap-3"},tl={class:"text-xl font-semibold inline-flex items-center gap-1"},sl={class:"font-medium"},nl={class:"mt-1"},al={key:0,class:"text-red-600 font-medium"},ol={key:1,class:"text-green-600 font-medium"},ll={key:2,class:"text-gray-500"},rl={key:2,class:"text-center py-8 text-red-500"},il={key:3,class:"text-center py-8 text-gray-500"},cl={class:"flex items-center justify-between"},ul={class:"text-xl font-semibold inline-flex items-center gap-1"},dl={class:"space-y-4"},ml={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},pl={key:0,class:"text-center py-4 text-gray-500"},gl={key:1,class:"space-y-4"},fl={class:"flex gap-4 text-sm"},vl={key:0,class:"text-gray-400"},_l={key:0,class:"text-gray-400"},yl={key:0},hl={key:1,class:"text-gray-400"},bl={key:0},xl={key:1,class:"text-gray-400"},kl={key:0,class:"text-gray-400"},$l={key:0,class:"text-gray-400"},Cl={key:2,class:"text-center py-8 text-gray-500"},Tl={key:3,class:"text-center py-8 text-gray-500"},Sl={class:"flex items-center justify-between"},jl={class:"text-sm text-gray-600 inline-flex items-center gap-1"},wl={class:"space-y-4"},Dl={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Rl={key:0,class:"text-center py-8 text-gray-500"},Al={key:1,class:"space-y-4"},Ul={class:"space-y-2"},zl={class:"flex flex-wrap gap-4 text-sm"},Ml={key:3,class:"text-sm text-gray-500"},Fl={class:"flex flex-wrap gap-4 text-sm"},Il={key:0,class:"text-gray-400"},El={key:0,class:"text-gray-400"},Vl={key:0},Bl={key:1,class:"text-gray-400"},Pl={key:0},Nl={key:1,class:"text-gray-400"},Kl={key:0,class:"text-gray-400"},Ll={key:0,class:"text-gray-400"},Ol={key:2,class:"text-center py-8 text-gray-500"},ql={key:3,class:"text-center py-8 text-gray-500"},Hl={class:"flex items-center justify-between"},Xl={class:"text-sm text-gray-600 inline-flex items-center gap-1"},Gl={key:0,class:"space-y-2"},Jl={class:"font-medium text-sm"},Ql={class:"text-xs text-muted flex items-center gap-2"},Yl={key:0,class:"italic"},Wl={key:1,class:"text-xs text-muted italic"},Zl={key:1,class:"text-center py-8 text-muted text-sm"},er={class:"space-y-4"},tr={class:"text-sm text-gray-600 dark:text-gray-400"},sr={class:"block text-sm font-medium mb-1"},nr={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},li=ue({__name:"index",async setup(A){let T,x;const D=As(),b=Us(),f=D.params.id,{data:u,refresh:E}=([T,x]=ye(()=>he(`/api/projects/${f}`,"$NX9Zy2qnH1")),T=await T,x(),T);zs(B(()=>({title:`${u.value?.label||u.value?.name||"Project"} — Piwi Dashboard`})));const U=Re(),R=w(null),C=w(null),{isAdmin:_,isReporter:y}=Nt(),z=$t(),h=B(()=>!z.public.authEnabled||_.value),v=w(!1),M=w(""),K=w(!1),$=B(()=>M.value===u.value?.name);async function g(){if($.value){K.value=!0;try{await $fetch(`/api/projects/${f}`,{method:"DELETE"}),U.add({title:"Project deleted",color:"success"}),await Fs(),await b.push("/")}catch(r){const n=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;U.add({title:"Delete failed",description:n||"An error occurred",color:"error"}),K.value=!1}}}ln(E);async function m(r){C.value=null,R.value=r;try{await $fetch(`/api/test-runs/${r}`,{method:"DELETE"}),U.add({title:"Test run deleted",color:"success"}),await E()}catch(n){const F=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;U.add({title:"Delete failed",description:F||"An error occurred",color:"error"})}finally{R.value=null}}const q=w([]),Z=w([]),O=w([]),P=B(()=>{const r=new Map(q.value.map(F=>[F.id,F])),n=[];for(const F of Z.value){if(F.role==="administrator")continue;const H=r.get(F.id);n.push({id:F.id,username:F.username,name:F.name??null,role:F.role,global:H?.global??!1,hasAccess:!!H})}for(const F of q.value)F.role==="administrator"&&n.push({...F,hasAccess:!0});return n}),be=B(()=>{const r=q.value.filter(F=>F.role!=="administrator"&&!F.global).map(F=>F.id).sort(),n=[...O.value].sort();return JSON.stringify(r)!==JSON.stringify(n)});ge(()=>u.value?.id,async r=>{if(!(!r||!_.value))try{const[n,F]=await Promise.all([$fetch(`/api/projects/${f}/members`),$fetch("/api/users")]);q.value=n.users,Z.value=F.users,O.value=n.users.filter(H=>H.role!=="administrator"&&!H.global).map(H=>H.id)}catch{q.value=[],Z.value=[],O.value=[]}},{immediate:!0});function xe(r){const n=O.value.indexOf(r);n>=0?O.value.splice(n,1):O.value.push(r)}async function p(){try{await $fetch(`/api/projects/${f}/members`,{method:"PUT",body:{userIds:O.value}}),U.add({title:"Members updated",color:"success"});const r=await $fetch(`/api/projects/${f}/members`);q.value=r.users}catch(r){const n=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;U.add({title:"Update failed",description:n||"An error occurred",color:"error"})}}const L=w("test-runs"),oe=w(0),de=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","timeline","members"],ke=D.query.tab;typeof ke=="string"&&de.includes(ke)&&(L.value=ke),ge(L,r=>{D.query.tab!==r&&de.includes(r)&&b.replace({query:{...D.query,tab:r}})});const fe=B(()=>u.value?.testRuns?.some(r=>r.failedTests>0)??!1),ce=B(()=>[{label:`Test runs (${Ee.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${Ne.value!=null?` (${Ne.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${j.value.length?` (${j.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"},..._.value?[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]:[]]),ve=B(()=>ce.value.find(r=>r.value===L.value)?.icon),Y=w([]),rt=r=>Y.value.includes(r);function it(r){const n=Y.value.indexOf(r);if(n>=0)Y.value.splice(n,1);else{if(Y.value.length>=2){U.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}Y.value.push(r)}}const Me=w(null);function Xe(){Y.value.length===2&&(Me.value=[Y.value[0],Y.value[1]],L.value="compare")}const W=w([]),_e=w(!0),Fe=B(()=>{const r=new Set;for(const n of u.value?.testRuns||[])n.environment&&r.add(n.environment);return[...r].sort()});function ct(r){const n=W.value.indexOf(r);n===-1?W.value.push(r):W.value.splice(n,1)}function Ie(r){return W.value.includes(r)}const Ee=B(()=>{let r=u.value?.testRuns||[];return _e.value&&(r=r.filter(n=>n.isFullRun!==!1)),W.value.length===0?r:r.filter(n=>n.environment&&W.value.includes(n.environment))}),ut=B(()=>W.value.length===1?W.value[0]:void 0),{data:Ve,refresh:V}=([T,x]=ye(()=>he(`/api/projects/${f}/markers`,{default:()=>({markers:[]})},"$3gm0grYTFL")),T=await T,x(),T),j=B(()=>Ve.value?.markers??[]),ee=B(()=>!z.public.authEnabled||_.value||y.value),Ge=B(()=>W.value.length===0?j.value:j.value.filter(r=>r.environment==null||W.value.includes(r.environment))),Be=w(null);function Pe(r){Be.value=r,L.value="timeline"}const dt=B(()=>{const r=u.value?.testRuns||[];return _e.value?r.filter(n=>n.isFullRun!==!1):r});function Je(r){if(r.isFullRun!==!1)return"Full run — the complete test suite ran";const n=[],F=r.filterDetails?.grep?.trim(),H=r.filterDetails?.grepInvert?.trim(),me=r.filterDetails?.files;return F&&F!==".*"&&n.push(`grep: ${F}`),H&&n.push(`grep-invert: ${H}`),me?.length&&n.push(`files: ${me.join(", ")}`),n.length?`Partial run — ${n.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const je=[{accessorKey:"select",header:""},{accessorKey:"id",header:I("Run")},{accessorKey:"status",header:I("Status")},{accessorKey:"isFullRun",header:"Scope"},{id:"browsers",accessorFn:r=>r.browsers,header:""},{accessorKey:"startTime",header:I("Started")},{accessorKey:"environment",header:I("Environment")},{accessorKey:"metadata",header:"Branch / Commit"},{accessorKey:"duration",header:I("Test status / Dur.")},{accessorKey:"reports",header:"Reports"},{id:"actions",header:"Actions"}],Ne=w(null),N=w(""),X=w(""),mt=B(()=>{const r={};return N.value&&(r.from=N.value),X.value&&(r.to=X.value),r}),pt=w(null),gt=w(!1),we=w(null),ft=w(!1),Qe=w(!1),Zt=B(()=>gt.value&&pt.value===null);ge([L,mt,_e],async([r,n])=>{if(r!=="performance")return;gt.value=!0,we.value||(Qe.value=!0);const F=new URLSearchParams(n).toString(),H=_e.value?`${F?"&":""}fullRunsOnly=true`:"",me=F||H?`?${F}${H}`:"";pt.value=await $fetch(`/api/projects/${f}/performance${me}`).catch(pe=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",pe),null)),gt.value=!1,Qe.value&&(ft.value=!1,we.value=await $fetch(`/api/projects/${f}/slow-tests`).catch(pe=>(ft.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",pe),null)),Qe.value=!1)},{immediate:!0});const es=[{accessorKey:"title",header:I("Test case")},{accessorKey:"avgDuration",header:I("Avg duration")},{accessorKey:"maxDuration",header:I("Max")},{accessorKey:"minDuration",header:I("Min")},{accessorKey:"latestDuration",header:I("Latest")},{accessorKey:"trend",header:I("Trend")},{accessorKey:"runCount",header:I("Runs")}];function ts(r){const n=ot(r.startTime,{dateOnly:!0}),F=r.metadata?.scm?.commit?` (${r.metadata.scm.commit.substring(0,7)})`:"";return`Run #${r.id} — ${n}${F}`}const le=B(()=>u.value?.testRuns?[...u.value.testRuns].reverse().map(r=>({label:ts(r),value:r.id})):[]),te=w(void 0),se=w(void 0),Rt=B(()=>D.query.runA?Number(D.query.runA):null),At=B(()=>D.query.runB?Number(D.query.runB):null);ge(le,r=>{if(Rt.value){const n=r.find(F=>F.value===Rt.value);n&&(te.value=n)}if(At.value){const n=r.find(F=>F.value===At.value);n&&(se.value=n)}},{immediate:!0}),ge(Me,r=>{if(r){const n=le.value.find(H=>H.value===r[0]),F=le.value.find(H=>H.value===r[1]);n&&(te.value=n),F&&(se.value=F),Me.value=null}});function Ut(){le.value.length>=2&&(te.value=le.value[1],se.value=le.value[0])}const vt=w(null),_t=w(null),Ye=w(!1);async function ss(){const r=te.value,n=se.value;if(!(!r?.value&&!n?.value)){Ye.value=!0;try{const F=[];r?.value&&F.push(r.value),n?.value&&F.push(n.value);const H=await Promise.all(F.map(pe=>$fetch(`/api/test-runs/${pe}/summary`))),me=new Map;for(const pe of H)me.set(pe.id,pe);vt.value=r?.value?me.get(r.value)??null:null,_t.value=n?.value?me.get(n.value)??null:null}catch{vt.value=null,_t.value=null}finally{Ye.value=!1}}}ge([te,se],()=>{ss()});const{comparisonData:We,comparisonSummary:J}=on(vt,_t),zt=[{accessorKey:"title",header:I("Test case")},{accessorKey:"statusA",header:I("Status A")},{accessorKey:"statusB",header:I("Status B")},{accessorKey:"durationA",header:I("Duration A")},{accessorKey:"durationB",header:I("Duration B")},{accessorKey:"delta",header:I("Delta")},{accessorKey:"percentChange",header:I("Change")}];return(r,n)=>{const F=js,H=ws,me=Mn,pe=Bs,ns=Ns,as=qt,os=Ue,ls=Ln,Mt=Ls,rs=Os,De=qe,ae=Te,is=qs,yt=Le,cs=Hs,us=Xs,ds=Gs,ms=Js,Ze=ze,ps=Es,gs=Se,Ke=He,fs=Zn,vs=ma,_s=Da,ht=Lt,Ft=wt,ys=Ba,hs=jt,bs=Qa,et=Ws,ne=Ae,xs=Zs,ks=ao,$s=en,Cs=So,Ts=an,Ss=Ps,It=Dt,Et=Tt;return s(),i(Q,null,[l(Ss,{id:"project-detail"},{header:t(()=>[l(ns,null,{leading:t(()=>[l(F),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:t(()=>[l(pe,{size:"sm",actions:[...e(h)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{M.value="",v.value=!0}}]:[],{label:"Edit",icon:"i-lucide-pencil",variant:"outline",to:`/projects/${e(f)}/edit`},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>e(E)()}]},{leading:t(()=>[l(me,{"project-id":parseInt(e(f)),"project-label":e(u)?.label||e(u)?.name},null,8,["project-id","project-label"])]),_:1},8,["actions"])]),_:1})]),body:t(()=>[a("div",jo,[e(u)?.description||e(u)?.tags&&e(u).tags.length>0?(s(),i("div",wo,[e(u)?.description?(s(),i("p",Do,c(e(u).description),1)):S("",!0),e(u)?.tags&&e(u).tags.length>0?(s(),i("div",Ro,[(s(!0),i(Q,null,ie(e(u).tags,o=>(s(),k(as,{key:o.id,text:o.text,color:o.color},null,8,["text","color"]))),128))])):S("",!0)])):S("",!0),l(os,{modelValue:e(L),"onUpdate:modelValue":n[0]||(n[0]=o=>G(L)?L.value=o:null),items:e(ce),icon:e(ve),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),l(Ts,{modelValue:e(L),"onUpdate:modelValue":n[14]||(n[14]=o=>G(L)?L.value=o:null),items:e(ce),size:"sm",class:"p-1",ui:{list:"max-sm:hidden overflow-x-auto",trigger:"shrink-0"}},{"test-runs":t(()=>[e(u)?.testRuns&&e(u).testRuns.length>0?(s(),k(Mt,{key:0,title:"Run trend",subtitle:`Test run statistics over time for ${e(u)?.label||e(u)?.name}`,help:"project.runs-trend"},{default:t(()=>[l(ls,{"test-runs":e(dt),height:200,markers:e(Ge),onMarkerClick:Pe},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):S("",!0),l(Ke,{class:"mt-4"},{default:t(()=>[a("div",Ao,[a("div",Uo,[l(rs,{modelValue:e(_e),"onUpdate:modelValue":n[1]||(n[1]=o=>G(_e)?_e.value=o:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),l(De,{topic:"project.run-scope"})]),e(Fe).length>0?(s(),i(Q,{key:0},[n[21]||(n[21]=a("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(s(!0),i(Q,null,ie(e(Fe),o=>(s(),i("button",{key:o,type:"button",class:re(["text-xs font-medium px-2 py-1 rounded border cursor-pointer focus:outline-none transition-colors",Ie(o)?"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:$e=>ct(o)},c(o),11,zo))),128)),e(W).length>0?(s(),k(ae,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filter",onClick:n[2]||(n[2]=o=>W.value=[])})):S("",!0)],64)):S("",!0)]),e(Y).length>0?(s(),i("div",Mo,[a("span",Fo,c(e(Y).length)+" run"+c(e(Y).length>1?"s":"")+" selected ",1),e(Y).length===2?(s(),k(ae,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:Xe})):(s(),i("span",Io," Select another run to compare ")),l(ae,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:n[3]||(n[3]=o=>Y.value=[])})])):S("",!0),e(Ee).length>0?(s(),k(Ze,{key:1,data:e(Ee),columns:je,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":t(({row:o})=>[a("input",{type:"checkbox",checked:rt(o.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Pt($e=>it(o.original.id),["stop"])},null,8,Eo)]),"id-cell":t(({row:o})=>[a("div",Vo,[a("a",{href:`/test-runs/${o.original.id}`,class:"text-primary hover:underline font-medium",onClick:Pt($e=>("navigateTo"in r?r.navigateTo:e(Ct))(`/test-runs/${o.original.id}`),["prevent"])}," Run #"+c(o.original.id),9,Bo),o.original.label?(s(),i("span",Po,c(o.original.label),1)):S("",!0)])]),"status-cell":t(({row:o})=>[l(is,{status:o.original.status},null,8,["status"])]),"isFullRun-header":t(()=>[a("span",No,[n[22]||(n[22]=d("Scope ",-1)),l(De,{topic:"run.partial"})])]),"isFullRun-cell":t(({row:o})=>[l(cs,{text:Je(o.original)},{default:t(()=>[l(yt,{name:o.original.isFullRun===!1?"i-lucide-list-filter":"i-lucide-list-checks",class:re(["size-4 shrink-0 cursor-help",o.original.isFullRun===!1?"text-amber-500":"text-green-500"])},null,8,["name","class"])]),_:2},1032,["text"])]),"browsers-cell":t(({row:o})=>[o.original.browsers?.length?(s(),i("div",Ko,[(s(!0),i(Q,null,ie(o.original.browsers,$e=>(s(),k(us,{key:$e,browser:{projectName:$e},size:"sm"},null,8,["browser"]))),128))])):S("",!0)]),"startTime-cell":t(({row:o})=>[a("span",Lo,c(("prettyDateFormat"in r?r.prettyDateFormat:e(ot))(o.original.startTime)),1)]),"environment-cell":t(({row:o})=>[o.original.environment?(s(),i("span",Oo,c(o.original.environment),1)):S("",!0)]),"metadata-cell":t(({row:o})=>[o.original.metadata?.scm?(s(),i("div",qo,[o.original.metadata.scm.branch?(s(),i("span",Ho,c(o.original.metadata.scm.branch),1)):S("",!0),o.original.metadata.scm.commit?(s(),i("code",Xo,c(o.original.metadata.scm.commit.substring(0,7)),1)):S("",!0)])):S("",!0)]),"duration-cell":t(({row:o})=>[a("div",Go,[l(ds,{passed:o.original.passedTests,failed:o.original.failedTests,skipped:o.original.skippedTests,flaky:o.original.flakyTests,"did-not-run":o.original.didNotRunTests??0,total:o.original.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),a("span",Jo,c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.duration)),1)])]),"reports-cell":t(({row:o})=>[l(ms,{reports:o.original.reports},null,8,["reports"])]),"actions-header":t(()=>[...n[23]||(n[23]=[a("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":t(({row:o})=>[a("div",Qo,[l(ae,{to:`/test-runs/${o.original.id}`,size:"sm",variant:"outline"},{default:t(()=>[...n[24]||(n[24]=[d(" View ",-1)])]),_:1},8,["to"]),l(ae,{size:"sm",color:"error",variant:"soft",icon:"i-lucide-trash-2",loading:e(R)===o.original.id,onClick:$e=>C.value=o.original.id},{default:t(()=>[...n[25]||(n[25]=[d(" Delete ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data"])):e(u)?.testRuns&&e(u).testRuns.length>0?(s(),i("div",Yo," No test runs match the selected environment filter. ")):(s(),k(gs,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:t(()=>[a("p",Wo,[n[27]||(n[27]=d(" Point the reporter's ",-1)),n[28]||(n[28]=a("code",{class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},"projectName",-1)),n[29]||(n[29]=d(" at ",-1)),a("code",Zo,c(e(u)?.name),1),n[30]||(n[30]=d(" to send results here — see the ",-1)),l(ps,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:t(()=>[...n[26]||(n[26]=[d("reporter docs",-1)])]),_:1}),n[31]||(n[31]=d(" for setup instructions. ",-1))])]),_:1}))]),_:1})]),"failure-clusters":t(()=>[e(L)==="failure-clusters"?(s(),i(Q,{key:0},[(s(),k(fs,{key:`sug-${e(oe)}`,"project-id":String(e(f)),onMerged:n[4]||(n[4]=o=>oe.value++)},null,8,["project-id"])),(s(),k(vs,{key:e(oe),"project-id":String(e(f))},null,8,["project-id"]))],64)):S("",!0)]),"flaky-tests":t(()=>[e(L)==="flaky-tests"?(s(),k(_s,{key:0,"project-id":String(e(f)),environment:e(ut),"project-name":e(u)?.name},null,8,["project-id","environment","project-name"])):S("",!0)]),performance:t(()=>[a("div",el,[n[32]||(n[32]=a("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),l(ht,{modelValue:e(N),"onUpdate:modelValue":n[5]||(n[5]=o=>G(N)?N.value=o:null),type:"date",size:"sm",placeholder:"From",class:"w-40"},null,8,["modelValue"]),n[33]||(n[33]=a("span",{class:"text-sm text-muted"},"to",-1)),l(ht,{modelValue:e(X),"onUpdate:modelValue":n[6]||(n[6]=o=>G(X)?X.value=o:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(N)||e(X)?(s(),k(ae,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:n[7]||(n[7]=o=>{N.value="",X.value=""})})):S("",!0)]),l(Mt,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:t(()=>[e(Zt)?(s(),k(Ft,{key:0,text:"Loading chart…"})):(s(),k(ys,{key:1,data:e(pt)||[],height:350,markers:e(Ge),onMarkerClick:Pe},null,8,["data","markers"]))]),_:1}),l(Ke,null,{header:t(()=>[a("h2",tl,[n[34]||(n[34]=d(" Slowest tests ",-1)),l(De,{topic:"project.slowest-tests"})]),n[35]||(n[35]=a("p",{class:"text-sm text-gray-600 mt-1"},"Top 20 slowest test cases across recent runs",-1))]),default:t(()=>[e(Qe)&&e(we)===null?(s(),k(Ft,{key:0,text:"Loading…"})):e(we)&&e(we).length>0?(s(),k(Ze,{key:1,data:e(we),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":t(({row:o})=>[a("div",null,[a("div",sl,c(o.original.title),1),a("div",nl,[l(hs,{"file-path":o.original.filePath,"project-key":e(f),"project-name":e(u)?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"trend-cell":t(({row:o})=>[o.original.trend==="slower"?(s(),i("span",al,"▲ Slower")):o.original.trend==="faster"?(s(),i("span",ol,"▼ Faster")):(s(),i("span",ll,"— Stable"))]),_:1},8,["data"])):e(ft)?(s(),i("div",rl," Couldn't load the slowest tests — try refreshing. ")):(s(),i("div",il,"No slow test data available yet."))]),_:1}),l(bs,{"project-id":String(e(f)),"project-name":e(u)?.name},null,8,["project-id","project-name"]),l(Ke,null,{header:t(()=>[a("div",cl,[a("div",null,[a("h2",ul,[n[36]||(n[36]=d(" Run comparison ",-1)),l(De,{topic:"project.run-compare"})]),n[37]||(n[37]=a("p",{class:"text-sm text-gray-600 mt-1"},"Compare duration changes between two runs",-1))]),e(le).length>=2?(s(),k(ae,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Compare latest vs previous",onClick:Ut})):S("",!0)])]),default:t(()=>[a("div",dl,[a("div",ml,[a("div",null,[n[38]||(n[38]=a("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),l(et,{modelValue:e(te),"onUpdate:modelValue":n[8]||(n[8]=o=>G(te)?te.value=o:null),items:e(le),placeholder:"Select run A..."},null,8,["modelValue","items"])]),a("div",null,[n[39]||(n[39]=a("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),l(et,{modelValue:e(se),"onUpdate:modelValue":n[9]||(n[9]=o=>G(se)?se.value=o:null),items:e(le),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Ye)?(s(),i("div",pl,[l(yt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),n[40]||(n[40]=d(" Loading run data… ",-1))])):e(te)&&e(se)&&e(We).length>0?(s(),i("div",gl,[a("div",fl,[l(ne,{color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).improved)+" improved",1)]),_:1}),l(ne,{color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).regressed)+" regressed",1)]),_:1}),l(ne,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).unchanged)+" unchanged",1)]),_:1})]),l(Ze,{data:e(We),columns:zt,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":t(({row:o})=>[o.original.statusA?(s(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(tt))(o.original.statusA),class:"capitalize"},{default:t(()=>[d(c(o.original.statusA),1)]),_:2},1032,["color"])):(s(),i("span",vl,"—"))]),"statusB-cell":t(({row:o})=>[o.original.statusB?(s(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(tt))(o.original.statusB),class:"capitalize"},{default:t(()=>[d(c(o.original.statusB),1)]),_:2},1032,["color"])):(s(),i("span",_l,"—"))]),"durationA-cell":t(({row:o})=>[o.original.durationA!==null?(s(),i("span",yl,c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.durationA)),1)):(s(),i("span",hl,"—"))]),"durationB-cell":t(({row:o})=>[o.original.durationB!==null?(s(),i("span",bl,c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.durationB)),1)):(s(),i("span",xl,"—"))]),"delta-cell":t(({row:o})=>[o.original.delta===null?(s(),i("span",kl,"—")):(s(),i("span",{key:1,class:re(o.original.delta>0?"text-red-600":o.original.delta<0?"text-green-600":"text-gray-500")},c(o.original.delta>0?"+":"")+c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.delta)),3))]),"percentChange-cell":t(({row:o})=>[o.original.percentChange===null?(s(),i("span",$l,"—")):(s(),i("span",{key:1,class:re(o.original.percentChange>10?"text-red-600 font-medium":o.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(o.original.percentChange>0?"+":"")+c(o.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(s(),i("div",Cl," Select two runs to compare their performance. ")):(s(),i("div",Tl," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":t(()=>[l(xs,{"project-id":e(f),"project-name":e(u)?.name,"sync-query":"",onTotal:n[10]||(n[10]=o=>Ne.value=o)},null,8,["project-id","project-name"])]),compare:t(()=>[l(Ke,null,{header:t(()=>[a("div",Sl,[a("p",jl,[n[41]||(n[41]=d(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),l(De,{topic:"project.compare"})]),e(le).length>=2?(s(),k(ae,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Latest vs previous",onClick:Ut})):S("",!0)])]),default:t(()=>[a("div",wl,[a("div",Dl,[a("div",null,[n[42]||(n[42]=a("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),l(et,{modelValue:e(te),"onUpdate:modelValue":n[11]||(n[11]=o=>G(te)?te.value=o:null),items:e(le),placeholder:"Select run A..."},null,8,["modelValue","items"])]),a("div",null,[n[43]||(n[43]=a("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),l(et,{modelValue:e(se),"onUpdate:modelValue":n[12]||(n[12]=o=>G(se)?se.value=o:null),items:e(le),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Ye)?(s(),i("div",Rl,[l(yt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),n[44]||(n[44]=d(" Loading run data… ",-1))])):e(te)&&e(se)&&e(We).length>0?(s(),i("div",Al,[a("div",Ul,[a("div",zl,[n[45]||(n[45]=a("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(J).newFailures>0?(s(),k(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).newFailures)+" new failure"+c(e(J).newFailures>1?"s":""),1)]),_:1})):S("",!0),e(J).recovered>0?(s(),k(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).recovered)+" recovered ",1)]),_:1})):S("",!0),e(J).stillFailing>0?(s(),k(ne,{key:2,color:"warning",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).stillFailing)+" still failing ",1)]),_:1})):S("",!0),e(J).newFailures===0&&e(J).recovered===0&&e(J).stillFailing===0?(s(),i("span",Ml,"No status changes")):S("",!0)]),a("div",Fl,[n[46]||(n[46]=a("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(J).regressed>0?(s(),k(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).regressed)+" regressed ",1)]),_:1})):S("",!0),e(J).improved>0?(s(),k(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).improved)+" improved ",1)]),_:1})):S("",!0),l(ne,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(J).unchanged)+" unchanged ",1)]),_:1})])]),l(Ze,{data:e(We),columns:zt,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":t(({row:o})=>[o.original.statusA?(s(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(tt))(o.original.statusA),class:"capitalize"},{default:t(()=>[d(c(o.original.statusA),1)]),_:2},1032,["color"])):(s(),i("span",Il,"—"))]),"statusB-cell":t(({row:o})=>[o.original.statusB?(s(),k(ne,{key:1,color:("getStatusColor"in r?r.getStatusColor:e(tt))(o.original.statusB),class:"capitalize"},{default:t(()=>[d(c(o.original.statusB),1)]),_:2},1032,["color"])):(s(),i("span",El,"—"))]),"durationA-cell":t(({row:o})=>[o.original.durationA!==null?(s(),i("span",Vl,c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.durationA)),1)):(s(),i("span",Bl,"—"))]),"durationB-cell":t(({row:o})=>[o.original.durationB!==null?(s(),i("span",Pl,c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.durationB)),1)):(s(),i("span",Nl,"—"))]),"delta-cell":t(({row:o})=>[o.original.delta===null?(s(),i("span",Kl,"—")):(s(),i("span",{key:1,class:re(o.original.delta>0?"text-red-600":o.original.delta<0?"text-green-600":"text-gray-500")},c(o.original.delta>0?"+":"")+c(("formatDuration"in r?r.formatDuration:e(Ce))(o.original.delta)),3))]),"percentChange-cell":t(({row:o})=>[o.original.percentChange===null?(s(),i("span",Ll,"—")):(s(),i("span",{key:1,class:re(o.original.percentChange>10?"text-red-600 font-medium":o.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(o.original.percentChange>0?"+":"")+c(o.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(s(),i("div",Ol," Select two runs to compare test results. ")):(s(),i("div",ql," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":t(()=>[l(ks,{"project-id":String(e(f))},null,8,["project-id"])]),members:t(()=>[l(Ke,null,{header:t(()=>[a("div",Hl,[a("p",Xl,[n[47]||(n[47]=d(" Users with access to this project ",-1)),l(De,{topic:"project.members"})]),l(ae,{label:"Save changes",icon:"i-lucide-check",size:"sm",disabled:!e(be),onClick:p},null,8,["disabled"])])]),default:t(()=>[e(P).length>0?(s(),i("div",Gl,[(s(!0),i(Q,null,ie(e(P),o=>(s(),i("div",{key:o.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[a("div",null,[a("div",Jl,c(o.name||o.username),1),a("div",Ql,[a("span",null,"@"+c(o.username),1),l(ne,{color:o.role==="administrator"?"primary":o.role==="reporter"?"info":"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(o.role),1)]),_:2},1032,["color"]),o.global?(s(),i("span",Yl,"Global access")):S("",!0)])]),o.role!=="administrator"?(s(),k($s,{key:0,"model-value":e(O).includes(o.id),disabled:o.global,title:o.global?"Has global access — remove global assignment first":"",onChange:$e=>xe(o.id)},null,8,["model-value","disabled","title","onChange"])):(s(),i("span",Wl,"Admin"))]))),128))])):(s(),i("div",Zl,"Loading members…"))]),_:1})]),timeline:t(()=>[l(Cs,{"project-id":Number(e(f)),markers:e(j),environments:e(Fe),"can-edit":e(ee),"focus-marker-id":e(Be),onChanged:e(V),onClearFocus:n[13]||(n[13]=o=>Be.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),l(Et,null,{default:t(()=>[l(It,{open:e(v),title:"Delete project","onUpdate:open":n[17]||(n[17]=o=>{o||(v.value=!1)})},{body:t(()=>[a("div",er,[a("p",tr,[n[48]||(n[48]=d(" This will permanently delete ",-1)),a("strong",null,c(e(u)?.label||e(u)?.name),1),n[49]||(n[49]=d(" and all its test runs, reports, traces, and failure clusters. This action cannot be undone. ",-1))]),a("div",null,[a("label",sr,[n[50]||(n[50]=d(" Type the project key ",-1)),a("code",nr,c(e(u)?.name),1),n[51]||(n[51]=d(" to confirm: ",-1))]),l(ht,{modelValue:e(M),"onUpdate:modelValue":n[15]||(n[15]=o=>G(M)?M.value=o:null),placeholder:e(u)?.name,autofocus:"",onKeydown:Ms(g,["enter"])},null,8,["modelValue","placeholder"])])])]),footer:t(()=>[l(ae,{color:"neutral",variant:"ghost",label:"Cancel",onClick:n[16]||(n[16]=o=>v.value=!1)}),l(ae,{color:"error",label:"Delete project",icon:"i-lucide-trash-2",disabled:!e($),loading:e(K),onClick:g},null,8,["disabled","loading"])]),_:1},8,["open"])]),_:1}),l(Et,null,{default:t(()=>[l(It,{open:e(C)!==null,title:"Delete test run","onUpdate:open":n[20]||(n[20]=o=>{o||(C.value=null)})},{body:t(()=>[a("p",null,[n[52]||(n[52]=d(" Are you sure you want to delete ",-1)),a("strong",null,"Run #"+c(e(C)),1),n[53]||(n[53]=d("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:t(()=>[l(ae,{color:"neutral",variant:"ghost",label:"Cancel",onClick:n[18]||(n[18]=o=>C.value=null)}),l(ae,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(R)===e(C),onClick:n[19]||(n[19]=o=>m(e(C)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{li 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"./DHltYerF.js";import{_ as S}from"./D6PUPmRC.js";import{y as C,z}from"./BeKvLsja.js";const k={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(()=>z(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",k,"—"))}}}),A=Object.assign(y,{__name:"BrowserBadge"});export{A as _};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as m,B as h,o as n,f as o,U as p,bH as g,bb as B,h as d,c as f,q as E,F as y,y as V}from"./DHltYerF.js";var k=m({inheritAttrs:!1,__name:"VisuallyHiddenInputBubble",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,{primitiveElement:s,currentElement:l}=B(),t=d(()=>e.checked??e.value);return h(t,(r,a)=>{if(!l.value)return;const u=l.value,b=window.HTMLInputElement.prototype,v=Object.getOwnPropertyDescriptor(b,"value").set;if(v&&r!==a){const _=new Event("input",{bubbles:!0}),q=new Event("change",{bubbles:!0});v.call(u,r),u.dispatchEvent(_),u.dispatchEvent(q)}}),(r,a)=>(n(),o(g,p({ref_key:"primitiveElement",ref:s},{...e,...r.$attrs},{as:"input"}),null,16))}}),c=k,A=m({inheritAttrs:!1,__name:"VisuallyHiddenInput",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,s=d(()=>typeof e.value=="object"&&Array.isArray(e.value)&&e.value.length===0&&e.required),l=d(()=>typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"||e.value===null||e.value===void 0?[{name:e.name,value:e.value}]:typeof e.value=="object"&&Array.isArray(e.value)?e.value.flatMap((t,r)=>typeof t=="object"?Object.entries(t).map(([a,u])=>({name:`${e.name}[${r}][${a}]`,value:u})):{name:`${e.name}[${r}]`,value:t}):e.value!==null&&typeof e.value=="object"&&!Array.isArray(e.value)?Object.entries(e.value).map(([t,r])=>({name:`${e.name}[${t}]`,value:r})):[]);return(t,r)=>(n(),f(y,null,[E(" We render single input if it's required "),s.value?(n(),o(c,p({key:t.name},{...e,...t.$attrs},{name:t.name,value:t.value}),null,16,["name","value"])):(n(!0),f(y,{key:1},V(l.value,a=>(n(),o(c,p({key:a.name},{ref_for:!0},{...e,...t.$attrs},{name:a.name,value:a.value}),null,16,["name","value"]))),128))],2112))}}),I=A;export{I as V};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a0 as P,a1 as D,a3 as C,b3 as B,o as i,c as k,j as w,g as z,T as a,Z as c,$ as g,k as e,f as h,U as S,q as f,i as m,p as n,v as O,m as R,t as V,V as M,F as T,h as x,a6 as N,aO as A,b4 as U}from"./DHltYerF.js";import{a as j,_ as F,b as K,c as E}from"./BbS6Bwby.js";const I={slots:{root:"h-(--ui-header-height) shrink-0 flex items-center justify-between border-b border-default px-4 sm:px-6 gap-1.5",left:"flex items-center gap-1.5 min-w-0",icon:"shrink-0 size-5 self-center me-1.5",title:"flex items-center gap-1.5 font-semibold text-highlighted truncate",center:"hidden lg:flex",right:"flex items-center shrink-0 gap-1.5",toggle:""},variants:{toggleSide:{left:{toggle:""},right:{toggle:""}}}},Q=Object.assign({inheritAttrs:!1},{__name:"UDashboardNavbar",props:{as:{type:null,required:!1},icon:{type:null,required:!1},title:{type:String,required:!1},toggle:{type:[Boolean,Object],required:!1,default:!0},toggleSide:{type:String,required:!1,default:"left"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(b){const q=b,r=P(),s=D("dashboardNavbar",q),p=C(),o=j({}),[y,u]=B(),t=x(()=>N({extend:I,...p.ui?.dashboardNavbar||{}})());return(l,v)=>(i(),k(T,null,[w(e(y),null,{default:z(()=>[a(l.$slots,"toggle",c(g({...e(o),ui:t.value})),()=>[e(s).toggle?(i(),h(F,S({key:0},typeof e(s).toggle=="object"?e(s).toggle:{},{side:e(s).toggleSide,"data-slot":"toggle",class:t.value.toggle({class:e(s).ui?.toggle,toggleSide:e(s).toggleSide})}),null,16,["side","class"])):f("",!0)])]),_:3}),w(e(M),S({as:e(s).as,"data-slot":"root"},l.$attrs,{class:t.value.root({class:[e(s).ui?.root,e(s).class]})}),{default:z(()=>[m("div",{"data-slot":"left",class:n(t.value.left({class:e(s).ui?.left}))},[e(s).toggleSide==="left"?(i(),h(e(u),{key:0})):f("",!0),a(l.$slots,"left",c(g(e(o))),()=>[a(l.$slots,"leading",c(g({...e(o),ui:t.value})),()=>[e(s).icon?(i(),h(O,{key:0,name:e(s).icon,"data-slot":"icon",class:n(t.value.icon({class:e(s).ui?.icon}))},null,8,["name","class"])):f("",!0)]),m("h1",{"data-slot":"title",class:n(t.value.title({class:e(s).ui?.title}))},[a(l.$slots,"title",{},()=>[R(V(e(s).title),1)])],2),a(l.$slots,"trailing",c(g({...e(o),ui:t.value})))])],2),r.default?(i(),k("div",{key:0,"data-slot":"center",class:n(t.value.center({class:e(s).ui?.center}))},[a(l.$slots,"default",c(g(e(o))))],2)):f("",!0),m("div",{"data-slot":"right",class:n(t.value.right({class:e(s).ui?.right}))},[a(l.$slots,"right",c(g(e(o)))),e(s).toggleSide==="right"?(i(),h(e(u),{key:0})):f("",!0)],2)]),_:3},16,["as","class"])],64))}}),Z={slots:{root:"relative flex flex-col min-w-0 min-h-svh lg:not-last:border-e lg:not-last:border-default shrink-0",body:"flex flex-col gap-4 sm:gap-6 flex-1 overflow-y-auto p-4 sm:p-6",handle:""},variants:{size:{true:{root:"w-full lg:w-(--width)"},false:{root:"flex-1"}}}},G=["data-dragging"],W=Object.assign({inheritAttrs:!1},{__name:"UDashboardPanel",props:{class:{type:null,required:!1},ui:{type:Object,required:!1},id:{type:String,required:!1},minSize:{type:Number,required:!1,default:15},maxSize:{type:Number,required:!1},defaultSize:{type:Number,required:!1},resizable:{type:Boolean,required:!1,default:!1}},setup(b){const r=D("dashboardPanel",b),s=C(),p=j({storageKey:"dashboard",unit:"%"}),o=`${p.storageKey}-panel-${r.id||A()}`,{el:y,size:u,isDragging:t,onMouseDown:l,onTouchStart:v,onDoubleClick:_}=K(o,U(()=>({...p,...r}))),$=x(()=>N({extend:Z,...s.ui?.dashboardPanel||{}})({size:!!u.value}));return(d,H)=>(i(),k(T,null,[m("div",S({id:o,ref_key:"el",ref:y,"data-slot":"root"},d.$attrs,{"data-dragging":e(t),class:$.value.root({class:[e(r).ui?.root,e(r).class]}),style:[e(u)?{"--width":`${e(u)}${e(p).unit}`}:void 0]}),[a(d.$slots,"default",{},()=>[a(d.$slots,"header"),m("div",{"data-slot":"body",class:n($.value.body({class:e(r).ui?.body}))},[a(d.$slots,"body")],2),a(d.$slots,"footer")])],16,G),a(d.$slots,"resize-handle",{onMouseDown:e(l),onTouchStart:e(v),onDoubleClick:e(_)},()=>[e(r).resizable?(i(),h(E,{key:0,"aria-controls":o,"data-slot":"handle",class:n($.value.handle({class:e(r).ui?.handle})),onMousedown:e(l),onTouchstart:e(v),onDblclick:e(_)},null,8,["class","onMousedown","onTouchstart","onDblclick"])):f("",!0)])],64))}});export{W as _,Q as a};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as p,a_ as f,f as r,g as n,K as _,o as s,k as o,c as m,i as t,m as a,_ as g,q as h}from"./DHltYerF.js";import{_ as x}from"./CN1mJlvD.js";import"./DHXWp5yD.js";import"./r3SBLxtE.js";import"./By4YL7mx.js";import"./Dwws9U0D.js";const b={key:0,class:"flex max-sm:flex-col justify-between items-start gap-4"},k={key:1,class:"text-sm text-muted"},N=p({__name:"index",setup(v){const i=_().public.demoMode,{isResetting:d,resetDemo:c}=f();return(C,e)=>{const l=g,u=x;return s(),r(u,{icon:"i-lucide-settings",title:"General settings",help:"settings.general"},{actions:n(()=>[o(i)?(s(),r(l,{key:0,color:"error",variant:"soft",icon:"i-lucide-refresh-cw",loading:o(d),onClick:o(c)},{default:n(()=>[...e[0]||(e[0]=[a(" Reset demo ",-1)])]),_:1},8,["loading","onClick"])):h("",!0)]),default:n(()=>[o(i)?(s(),m("div",b,[...e[1]||(e[1]=[t("div",null,[t("p",{class:"font-medium text-sm"},"Reset demo data"),t("p",{class:"text-sm text-muted"}," Wipe the in-browser database and reload with fresh sample data dated to the current moment. All changes made during this demo session will be lost. ")],-1)])])):(s(),m("div",k,[...e[2]||(e[2]=[t("p",null," Appearance and theme are in the top bar. Use the sidebar to manage your account, users, AI diagnosis, notifications, storage, and tags. ",-1),t("p",{class:"mt-2"},[a(" Settings that can be overridden by "),t("code",{class:"font-mono text-xs"},"PIWI_*"),a(" environment variables show a lock badge with the variable name — hover the help icon on any card to see which env var backs a setting. ")],-1)])]))]),_:1})}}});export{N as default};
|