@piwitests/server 0.20.0 → 0.21.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/{CXEH9OPk.js → 9ti9eNH9.js} +1 -1
- package/.output/public/_nuxt/{oAClCn_h.js → B-zdP-D4.js} +1 -1
- package/.output/public/_nuxt/{DsesNydr.js → B1RmmOsM.js} +1 -1
- package/.output/public/_nuxt/{C0_yH0N7.js → B3Fsod9X.js} +1 -1
- package/.output/public/_nuxt/{Cnsmicv2.js → B3rirOqU.js} +34 -34
- package/.output/public/_nuxt/B3zmIJYb.js +1 -0
- package/.output/public/_nuxt/{DuwtTfO8.js → BAKUqW95.js} +2 -2
- package/.output/public/_nuxt/BG0KKQiT.js +7 -0
- package/.output/public/_nuxt/BGL_V7Y4.js +1 -0
- package/.output/public/_nuxt/{Dpd16JVI.js → BGusFAvZ.js} +1 -1
- package/.output/public/_nuxt/{l5WKbU4h.js → BNurUTla.js} +3 -3
- package/.output/public/_nuxt/BR5cR2Ot.js +1 -0
- package/.output/public/_nuxt/BTCh_0zN.js +1 -0
- package/.output/public/_nuxt/{C8e1EbJI.js → BTVqMsA3.js} +1 -1
- package/.output/public/_nuxt/{DabzhQB1.js → B_13C0GF.js} +1 -1
- package/.output/public/_nuxt/BeDIjhoR.js +44 -0
- package/.output/public/_nuxt/{D5tke0B5.js → BerCW7Ug.js} +1 -1
- package/.output/public/_nuxt/{BicAJ6U8.js → BfTNbVc_.js} +1 -1
- package/.output/public/_nuxt/BnbSEpXX.js +1 -0
- package/.output/public/_nuxt/Bo_dxehb.js +1 -0
- package/.output/public/_nuxt/{C2hkrSey.js → BpBHls4-.js} +1 -1
- package/.output/public/_nuxt/{Bm62iDV5.js → BpM6ZPIG.js} +1 -1
- package/.output/public/_nuxt/{GPNI1ffD.js → BqGumsDo.js} +2 -2
- package/.output/public/_nuxt/{A1pj0VnG.js → BrxtP_cN.js} +1 -1
- package/.output/public/_nuxt/{KyA_4Ks-.js → C2hNxjjz.js} +1 -1
- package/.output/public/_nuxt/C5PSqfKi.js +2 -0
- package/.output/public/_nuxt/C5vsaU4G.js +1 -0
- package/.output/public/_nuxt/C9sdHaXd.js +1 -0
- package/.output/public/_nuxt/{Und3xXFc.js → CAxgBYIt.js} +2 -2
- package/.output/public/_nuxt/{BmUfSNMV.js → CES2i5Pl.js} +1 -1
- package/.output/public/_nuxt/{CNyV9YpI.js → CFEdRqaj.js} +1 -1
- package/.output/public/_nuxt/{Dy-TJ0Mt.js → CFTZwazK.js} +1 -1
- package/.output/public/_nuxt/CIBS7ye6.js +1 -0
- package/.output/public/_nuxt/CIEceDOw.js +1 -0
- package/.output/public/_nuxt/{bLcjFslv.js → CJBhojV6.js} +1 -1
- package/.output/public/_nuxt/{b-GYfcrQ.js → CKYddHa6.js} +1 -1
- package/.output/public/_nuxt/{BKkF4pPD.js → CLVWiCds.js} +1 -1
- package/.output/public/_nuxt/{CwGWJbiy.js → CMYAryzi.js} +1 -1
- package/.output/public/_nuxt/{CjPfj7ya.js → COhdybDy.js} +1 -1
- package/.output/public/_nuxt/{B7FTvFWq.js → CRBXM2d6.js} +2 -2
- package/.output/public/_nuxt/CTD_pJ_v.js +1 -0
- package/.output/public/_nuxt/{Cus22Ud3.js → CTP8Pw0-.js} +2 -2
- package/.output/public/_nuxt/{CeW8v31b.js → CV8iF2kG.js} +1 -1
- package/.output/public/_nuxt/{H94BMf3L.js → CWKmbYlT.js} +1 -1
- package/.output/public/_nuxt/C_NfGMTd.js +9 -0
- package/.output/public/_nuxt/Cejoebel.js +6 -0
- package/.output/public/_nuxt/{FaFoMVKo.js → Chpah_7l.js} +1 -1
- package/.output/public/_nuxt/Ci9d8YVV.js +1 -0
- package/.output/public/_nuxt/{CIrFl3MW.js → CifRHVaR.js} +1 -1
- package/.output/public/_nuxt/{DrfE8IY0.js → Ckgsh9AT.js} +1 -1
- package/.output/public/_nuxt/{-f7BAm1H.js → Cpsq-kYE.js} +1 -1
- package/.output/public/_nuxt/Cqc-DSTF.js +1 -0
- package/.output/public/_nuxt/{CAAwCT7H.js → CsHulb12.js} +1 -1
- package/.output/public/_nuxt/Ctb2CqUf.js +5 -0
- package/.output/public/_nuxt/CtstIQSh.js +1 -0
- package/.output/public/_nuxt/{DJxlKFGb.js → CvMzDKvu.js} +1 -1
- package/.output/public/_nuxt/{CTU1mrhq.js → D2pBhsH8.js} +1 -1
- package/.output/public/_nuxt/{B3obW6cw.js → D8gX1Jde.js} +2 -2
- package/.output/public/_nuxt/D9knOn6D.js +1 -0
- package/.output/public/_nuxt/DAPTVdvA.js +1 -0
- package/.output/public/_nuxt/{Du2W7Jne.js → DCFbQvIN.js} +42 -42
- package/.output/public/_nuxt/DCoJlz_q.js +1 -0
- package/.output/public/_nuxt/DGnQ69wW.js +64 -0
- package/.output/public/_nuxt/{hNh4CIL0.js → DHzij16p.js} +1 -1
- package/.output/public/_nuxt/DJMCXRuW.js +5 -0
- package/.output/public/_nuxt/DJXcGkJP.js +2 -0
- package/.output/public/_nuxt/{DPCxhHri.js → DKFXZdWZ.js} +1 -1
- package/.output/public/_nuxt/{Bnxf8nbZ.js → DL24AjfW.js} +1 -1
- package/.output/public/_nuxt/DON74Yh6.js +1 -0
- package/.output/public/_nuxt/{5A6ITZXj.js → DQM62mxB.js} +1 -1
- package/.output/public/_nuxt/DSe8DxMl.js +1 -0
- package/.output/public/_nuxt/DWwiVTZX.js +24 -0
- package/.output/public/_nuxt/DX4tAP78.js +1 -0
- package/.output/public/_nuxt/{C1gTN4Q8.js → D_eDAIsT.js} +1 -1
- package/.output/public/_nuxt/Da8A92cF.js +1 -0
- package/.output/public/_nuxt/{CzAPFPpL.js → DdH3op4b.js} +1 -1
- package/.output/public/_nuxt/DepFDZO3.js +1 -0
- package/.output/public/_nuxt/{BzRRzmwm.js → DfSBKzrC.js} +1 -1
- package/.output/public/_nuxt/{BdfhYr-u.js → DfnKh3dZ.js} +1 -1
- package/.output/public/_nuxt/{Bow4tTR0.js → DhpTfeip.js} +1 -1
- package/.output/public/_nuxt/{CAvY22RE.js → Dk9nD32g.js} +1 -1
- package/.output/public/_nuxt/{BrQEE053.js → DkT2nCqn.js} +1 -1
- package/.output/public/_nuxt/DlW85lQq.js +4 -0
- package/.output/public/_nuxt/DnNio-ut.js +1 -0
- package/.output/public/_nuxt/{DdwHkKfV.js → DnQv_hst.js} +1 -1
- package/.output/public/_nuxt/{B99fbi73.js → DqEOMteW.js} +1 -1
- package/.output/public/_nuxt/{4gYNA-d4.js → Dsvu7YJT.js} +1 -1
- package/.output/public/_nuxt/DvhCDBrR.js +2 -0
- package/.output/public/_nuxt/DwQaVMZR.js +1 -0
- package/.output/public/_nuxt/E-_n_6vi.js +1 -0
- package/.output/public/_nuxt/{BT3wGCTI.js → Ebw5l7n8.js} +1 -1
- package/.output/public/_nuxt/{CA9B2HE5.js → IPePdbzl.js} +1 -1
- package/.output/public/_nuxt/{DJmoLeVt.js → LHoUGrfi.js} +1 -1
- package/.output/public/_nuxt/{L3kAWB2a.js → NERLHpOL.js} +1 -1
- package/.output/public/_nuxt/{CeG9pBAD.js → RAdNGxcF.js} +1 -1
- package/.output/public/_nuxt/Vxyo_mU9.js +1 -0
- package/.output/public/_nuxt/{pQqGiNch.js → YE1kAkU9.js} +1 -1
- package/.output/public/_nuxt/{CsLojMwR.js → YmT5WiN5.js} +1 -1
- package/.output/public/_nuxt/ZcAfCxWE.js +17 -0
- package/.output/public/_nuxt/{CxyAzHr3.js → _rglcvXN.js} +1 -1
- package/.output/public/_nuxt/bFU9Y1Vw.js +10 -0
- package/.output/public/_nuxt/bfecIH89.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/31ca2be4-a949-4df6-9818-773fc085557a.json +1 -0
- package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
- package/.output/public/_nuxt/four-S1Y.js +1 -0
- package/.output/public/_nuxt/{CJFtzlQ4.js → gV2U_Gqd.js} +1 -1
- package/.output/public/_nuxt/{DeY2JkR2.js → lGC893pn.js} +1 -1
- package/.output/public/_nuxt/nOfj-ar8.js +1 -0
- package/.output/public/_nuxt/oKrbs1XK.js +1 -0
- package/.output/public/_nuxt/oSJFAC38.js +1 -0
- package/.output/public/_nuxt/rL4C0HV5.js +1 -0
- package/.output/public/_nuxt/{Dyeqn3aG.js → tQoyVPCE.js} +1 -1
- package/.output/public/_nuxt/{DfgOx_ou.js → uSPCvASp.js} +1 -1
- package/.output/public/_nuxt/{hC_z4G8p.js → wkz5-1SO.js} +1 -1
- package/.output/public/_nuxt/yYlVYKCz.js +34 -0
- package/.output/public/_nuxt/{AbmKWFQQ.js → zv8WdMx0.js} +1 -1
- package/.output/server/chunks/_/scope.mjs +43 -27
- package/.output/server/chunks/_/scope.mjs.map +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-3itRZ1uz.mjs} +2 -2
- package/.output/server/chunks/build/Breadcrumb-3itRZ1uz.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-GnjBvXuT.mjs} +2 -2
- package/.output/server/chunks/build/BreadcrumbNav-GnjBvXuT.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-MFvBwxmD.mjs → BrowserBadge-DQqJS9CV.mjs} +2 -2
- package/.output/server/chunks/build/BrowserBadge-DQqJS9CV.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-D0rzMf-N.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-D0rzMf-N.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-4Q5d0fa0.mjs → Checkbox-DmRKG-0s.mjs} +3 -3
- package/.output/server/chunks/build/Checkbox-DmRKG-0s.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-DGhKVFad.mjs} +4 -4
- package/.output/server/chunks/build/CodeBlock-DGhKVFad.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DCr10nxL.mjs} +2 -2
- package/.output/server/chunks/build/DashboardNavbar-DCr10nxL.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-8EpBhX0R.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-8EpBhX0R.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-rzS-pgCP.mjs} +5 -5
- package/.output/server/chunks/build/DataLocationCard-rzS-pgCP.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-CALyEmcJ.mjs → DiagnosisPanel-BWTpoCKy.mjs} +8 -7
- package/.output/server/chunks/build/DiagnosisPanel-BWTpoCKy.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-CxjMmDDY.mjs → DiagnosisResult-Br3qBLXe.mjs} +10 -32
- package/.output/server/chunks/build/DiagnosisResult-Br3qBLXe.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-CWKfjIF2.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-CWKfjIF2.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-BBHWssHH.mjs → EntityLinks-CF0xG3Y8.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-CF0xG3Y8.mjs.map +1 -0
- package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs +1 -1
- package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs +83 -0
- package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-e7OnSKPM.mjs} +2 -2
- package/.output/server/chunks/build/FormField-e7OnSKPM.mjs.map +1 -0
- package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs +510 -0
- package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-DjGrGFA7.mjs} +3 -3
- package/.output/server/chunks/build/HelpHint-DjGrGFA7.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-B8v1nWJt.mjs} +3 -3
- package/.output/server/chunks/build/LoadingState-B8v1nWJt.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DB5DvBh1.mjs → MetaStripGroup-dXXa_MzF.mjs} +242 -529
- package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs.map +1 -0
- package/.output/server/chunks/build/{MiniRunBars-CZMugDrh.mjs → MiniRunBars-fgLMgRUp.mjs} +2 -2
- package/.output/server/chunks/build/MiniRunBars-fgLMgRUp.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-DnQKacz8.mjs → NavigationMenu-cqpt11Ce.mjs} +5 -28
- package/.output/server/chunks/build/NavigationMenu-cqpt11Ce.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs → OpenInIdeLink-B9wvQkhy.mjs} +5 -5
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs.map → OpenInIdeLink-B9wvQkhy.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs → ProjectTestCasesTable-BwHEtZTz.mjs} +15 -15
- package/.output/server/chunks/build/ProjectTestCasesTable-BwHEtZTz.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-BDRIWn3o.mjs} +2 -2
- package/.output/server/chunks/build/RunReports-BDRIWn3o.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CuTDknRJ.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-CuTDknRJ.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-BW5Lynrr.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-BW5Lynrr.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-5DK9frQ7.mjs → Select-CVctwpib.mjs} +3 -3
- package/.output/server/chunks/build/Select-CVctwpib.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs → SelectMenu-XLVBEa11.mjs} +3 -3
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs.map → SelectMenu-XLVBEa11.mjs.map} +1 -1
- package/.output/server/chunks/build/{SettingsField-BZfx4ma1.mjs → SettingsField-DvtRvI6O.mjs} +3 -3
- package/.output/server/chunks/build/SettingsField-DvtRvI6O.mjs.map +1 -0
- package/.output/server/chunks/build/{StatTile-D61Vzo6e.mjs → StatTile-DpcVQFVI.mjs} +2 -26
- package/.output/server/chunks/build/StatTile-DpcVQFVI.mjs.map +1 -0
- package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs +30 -0
- package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-B5Fp8ULt.mjs → Switch-8zWfwI5B.mjs} +2 -2
- package/.output/server/chunks/build/Switch-8zWfwI5B.mjs.map +1 -0
- package/.output/server/chunks/build/Table-BRk04Hd2.mjs +1 -1
- package/.output/server/chunks/build/{TestCaseHistoryChart-CSi64vVA.mjs → TestCaseHistoryChart-C6t5RrCG.mjs} +2 -2
- package/.output/server/chunks/build/TestCaseHistoryChart-C6t5RrCG.mjs.map +1 -0
- package/.output/server/chunks/build/{TestMetaBadges-D5_yUtIP.mjs → TestMetaBadges-BlyKmfeP.mjs} +1 -1
- package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-DX3EhlyP.mjs → TestStatusBar-DhbrM_rQ.mjs} +3 -3
- package/.output/server/chunks/build/TestStatusBar-DhbrM_rQ.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-vkMKVQTJ.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-vkMKVQTJ.mjs.map +1 -0
- package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs +1 -1
- package/.output/server/chunks/build/{_id_-BdG37K7s.mjs → _id_-2PMH6rl8.mjs} +20 -19
- package/.output/server/chunks/build/_id_-2PMH6rl8.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BdJs7BJZ.mjs → _id_-8cGIgeg6.mjs} +1903 -1113
- package/.output/server/chunks/build/_id_-8cGIgeg6.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-C_uSBiyU.mjs → _id_-CUZ5S6y5.mjs} +29 -29
- package/.output/server/chunks/build/_id_-CUZ5S6y5.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BxA6IgWr.mjs → _id_-DMkgWSLZ.mjs} +885 -381
- package/.output/server/chunks/build/_id_-DMkgWSLZ.mjs.map +1 -0
- package/.output/server/chunks/build/{about-BE0UV-8-.mjs → about-D3WXTDro.mjs} +21 -453
- package/.output/server/chunks/build/about-D3WXTDro.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-BslDNCoo.mjs} +6 -6
- package/.output/server/chunks/build/account-BslDNCoo.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs → ai-C23R9l94.mjs} +14 -14
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs.map → ai-C23R9l94.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-Bo_B_jko.mjs → analytics-DQHeToK0.mjs} +104 -77
- package/.output/server/chunks/build/analytics-DQHeToK0.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/compare-RxHSOdsO.mjs +1 -0
- package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-D74DghqX.mjs} +38 -2
- package/.output/server/chunks/build/db.client-D74DghqX.mjs.map +1 -0
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs → default-CeyePZ5I.mjs} +32 -19
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs.map → default-CeyePZ5I.mjs.map} +1 -1
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs → docs-f_bnC75q.mjs} +14 -14
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs.map → docs-f_bnC75q.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-J0asTFg8.mjs → edit-BOC4zWuH.mjs} +11 -12
- package/.output/server/chunks/build/edit-BOC4zWuH.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-BQg_fhX0.mjs} +32 -4
- package/.output/server/chunks/build/fetch-BQg_fhX0.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CxuVbGWy.mjs} +4 -3
- package/.output/server/chunks/build/forgot-password-CxuVbGWy.mjs.map +1 -0
- package/.output/server/chunks/build/{import-CS9oylTN.mjs → import-CC27wEIu.mjs} +12 -12
- package/.output/server/chunks/build/import-CC27wEIu.mjs.map +1 -0
- package/.output/server/chunks/build/{index-e9skCi-V.mjs → index-B6PjfyTY.mjs} +39 -537
- package/.output/server/chunks/build/index-B6PjfyTY.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-BOK1aJk9.mjs} +2 -1
- package/.output/server/chunks/build/index-BOK1aJk9.mjs.map +1 -0
- package/.output/server/chunks/build/{index-hGHlmyxj.mjs → index-BhS1DuCr.mjs} +117 -76
- package/.output/server/chunks/build/index-BhS1DuCr.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DE45ycdZ.mjs → index-DUmjP3Gr.mjs} +12 -13
- package/.output/server/chunks/build/index-DUmjP3Gr.mjs.map +1 -0
- package/.output/server/chunks/build/index-jvF53f7_.mjs +91 -0
- package/.output/server/chunks/build/index-jvF53f7_.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
- package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-CdpOhiP8.mjs} +8 -7
- package/.output/server/chunks/build/login-CdpOhiP8.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-uhVCCwQM.mjs → mcp-WTeO5WRo.mjs} +193 -10
- package/.output/server/chunks/build/mcp-WTeO5WRo.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-fx_qnKGA.mjs → notifications-yY6ik-fi.mjs} +9 -9
- package/.output/server/chunks/build/notifications-yY6ik-fi.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-X6-70iF0.mjs → pr-feedback-Hv2Ydh_6.mjs} +7 -7
- package/.output/server/chunks/build/pr-feedback-Hv2Ydh_6.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-CFtO8A6n.mjs} +4 -3
- package/.output/server/chunks/build/reset-password-CFtO8A6n.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +51 -34
- package/.output/server/chunks/build/{settings-CCYe7rsc.mjs → settings-DIpvnY8_.mjs} +10 -8
- package/.output/server/chunks/build/settings-DIpvnY8_.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DRv9VveS.mjs} +32 -2
- package/.output/server/chunks/build/settings-metadata-DRv9VveS.mjs.map +1 -0
- package/.output/server/chunks/build/setup-Di0UMyWx.mjs +1116 -0
- package/.output/server/chunks/build/setup-Di0UMyWx.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-CJEmviCD.mjs → storage-gAbY1KbQ.mjs} +10 -10
- package/.output/server/chunks/build/storage-gAbY1KbQ.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-DJ80wCqt.mjs} +6 -7
- package/.output/server/chunks/build/tags-DJ80wCqt.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-thBbAykw.mjs → test-cases-YP83YlnL.mjs} +18 -18
- package/.output/server/chunks/build/test-cases-YP83YlnL.mjs.map +1 -0
- package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs +550 -0
- package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs.map +1 -0
- package/.output/server/chunks/build/{timeout-hygiene-CbnSaVbK.mjs → timeout-hygiene-RpXDjXTX.mjs} +6 -6
- package/.output/server/chunks/build/timeout-hygiene-RpXDjXTX.mjs.map +1 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs +9 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-RJKhWoyj.mjs → useCopyRich-Cd5Yj_Wy.mjs} +694 -242
- package/.output/server/chunks/build/useCopyRich-Cd5Yj_Wy.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopDownload-BepjqxOt.mjs → useDesktopDownload-BmR6ouz2.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-BmR6ouz2.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-BbTnPhFA.mjs → useOpenInIde-DolN3bZ5.mjs} +1 -1
- package/.output/server/chunks/build/useOpenInIde-DolN3bZ5.mjs.map +1 -0
- package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs +19 -0
- package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs.map +1 -0
- package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-I2K7HXS2.mjs} +6 -7
- package/.output/server/chunks/build/users-I2K7HXS2.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-BNTPIyrC.mjs → wasted-time-DyIk0olc.mjs} +9 -9
- package/.output/server/chunks/build/wasted-time-DyIk0olc.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1348 -675
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +2 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +1 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -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 +1 -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 +1 -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 +1 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -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 +1 -0
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -0
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +1 -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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -0
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +2 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -0
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +76 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +66 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +53 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +67 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +2 -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 +1 -0
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +2 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +2 -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 +2 -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 +1 -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 +2 -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 +1 -0
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/setup-status.get.mjs +99 -0
- package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +60 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +69 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +2 -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 +2 -1
- 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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- 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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +2 -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 +1 -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 +1 -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 +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +2 -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 +2 -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 +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +2 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +41 -11
- 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 +1 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +1 -0
- package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
- package/.output/server/database/migrations/0043_watery_dragon_lord.sql +22 -0
- package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
- package/.output/server/database/migrations/meta/_journal.json +7 -0
- package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
- package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
- package/.output/server/index.mjs +2 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/8PUUncmO.js +0 -44
- package/.output/public/_nuxt/B8zkOmwo.js +0 -1
- package/.output/public/_nuxt/B96M2gdj.js +0 -1
- package/.output/public/_nuxt/B9OLmp0f.js +0 -1
- package/.output/public/_nuxt/BUa0V0Ly.js +0 -1
- package/.output/public/_nuxt/BUkim3TM.js +0 -1
- package/.output/public/_nuxt/BVc14Ncz.js +0 -4
- package/.output/public/_nuxt/BY0HxR3t.js +0 -17
- package/.output/public/_nuxt/B_xAMWQS.js +0 -2
- package/.output/public/_nuxt/BdQoBaOv.js +0 -1
- package/.output/public/_nuxt/BgRu_3tT.js +0 -1
- package/.output/public/_nuxt/BiO7RBWb.js +0 -6
- package/.output/public/_nuxt/CEfS4-oS.js +0 -64
- package/.output/public/_nuxt/CIoSMkpp.js +0 -1
- package/.output/public/_nuxt/CSJ-eOQM.js +0 -1
- package/.output/public/_nuxt/CahpB9Z2.js +0 -5
- package/.output/public/_nuxt/Cbh--1MW.js +0 -1
- package/.output/public/_nuxt/Cx6gc2VW.js +0 -1
- package/.output/public/_nuxt/D--H4jLI.js +0 -1
- package/.output/public/_nuxt/D1POo6S4.js +0 -10
- package/.output/public/_nuxt/D8nkF-OO.js +0 -3
- package/.output/public/_nuxt/DA25RkyK.js +0 -1
- package/.output/public/_nuxt/DIB-5fUJ.js +0 -1
- package/.output/public/_nuxt/DMec-OLo.js +0 -1
- package/.output/public/_nuxt/DSqHUrvO.js +0 -1
- package/.output/public/_nuxt/DmkUdSS4.js +0 -1
- package/.output/public/_nuxt/DoIREDVb.js +0 -1
- package/.output/public/_nuxt/DpZ1r1HA.js +0 -1
- package/.output/public/_nuxt/DqcKngf3.js +0 -1
- package/.output/public/_nuxt/DtHJgCS8.js +0 -1
- package/.output/public/_nuxt/Dtd4rC58.js +0 -9
- package/.output/public/_nuxt/Dy86h-7P.js +0 -1
- package/.output/public/_nuxt/HPNQD6v3.js +0 -1
- package/.output/public/_nuxt/HXadJrHu.js +0 -2
- package/.output/public/_nuxt/McL25vkx.js +0 -34
- package/.output/public/_nuxt/Nn93e_Mz.js +0 -1
- package/.output/public/_nuxt/UdR3DBPS.js +0 -1
- package/.output/public/_nuxt/_mj6CfPa.js +0 -1
- package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +0 -1
- package/.output/public/_nuxt/entry.DmptwB51.css +0 -1
- package/.output/public/_nuxt/ryMzSDUj.js +0 -2
- package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +0 -1
- package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.mjs.map +0 -1
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +0 -1
- package/.output/server/chunks/build/LoadingState-C3pBSuOO.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-Bo61P5K1.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +0 -1
- package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +0 -1
- package/.output/server/chunks/build/StatTile-D61Vzo6e.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-B5Fp8ULt.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +0 -1
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BdJs7BJZ.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-C_uSBiyU.mjs.map +0 -1
- package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +0 -1
- package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +0 -1
- package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +0 -1
- package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +0 -1
- package/.output/server/chunks/build/import-CS9oylTN.mjs.map +0 -1
- package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +0 -1
- package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +0 -1
- package/.output/server/chunks/build/index-e9skCi-V.mjs.map +0 -1
- package/.output/server/chunks/build/index-hGHlmyxj.mjs.map +0 -1
- package/.output/server/chunks/build/index-tR6owKzj.mjs +0 -167
- package/.output/server/chunks/build/index-tR6owKzj.mjs.map +0 -1
- package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +0 -1
- package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +0 -1
- package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +0 -1
- package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +0 -1
- package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +0 -1
- package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +0 -1
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs +0 -33
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +0 -1
- package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-DnQKacz8.mjs.map +0 -1
- package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +0 -1
- package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as As}from"./CXEH9OPk.js";import{_ as Us}from"./DabzhQB1.js";import{b as we,A as jt,d as ie,N as Nt,w as be,H as ve,k as e,o as s,f,g as t,j as a,_ as $e,c as r,i as n,m as d,t as c,v as R,F as G,y as oe,p as Me,D as Fe,l as W,O as Bt,P as Vt,q as re,h as N,r as I,J as Is,s as Ce,Q as Ot,n as St,R as wt,I as Kt,L as Ms,u as Fs,a as Ps,e as Es,C as Lt,S as Bs,T as Vs}from"./Du2W7Jne.js";import{_ as Ls}from"./Dy-TJ0Mt.js";import{_ as He,a as Ns}from"./Bm62iDV5.js";import{_ as Pe}from"./A1pj0VnG.js";import{_ as qt}from"./AbmKWFQQ.js";import{u as Os}from"./CAAwCT7H.js";import{u as ke}from"./B8zkOmwo.js";import{_ as Ks}from"./CjPfj7ya.js";import{_ as qs,a as Hs}from"./5A6ITZXj.js";import{_ as Ht}from"./oAClCn_h.js";import{_ as it}from"./C0_yH0N7.js";import{u as Qs}from"./BicAJ6U8.js";import{_ as Qt}from"./C8e1EbJI.js";import{_ as Te}from"./C1gTN4Q8.js";import{C as Tt,w as Jt,O as lt,a as Gt,_ as Xt,u as Yt}from"./CwGWJbiy.js";import{N as Js}from"./l5WKbU4h.js";import{_ as Gs}from"./CNyV9YpI.js";import{_ as Xs}from"./Dpd16JVI.js";import{_ as Ys}from"./Bnxf8nbZ.js";import{_ as Wt}from"./BT3wGCTI.js";import{_ as Ws}from"./b-GYfcrQ.js";import{_ as Zs}from"./DqcKngf3.js";import{_ as en}from"./BzRRzmwm.js";import{_ as tn}from"./BKkF4pPD.js";import{_ as Ee}from"./Cus22Ud3.js";import{_ as Qe}from"./-f7BAm1H.js";import{_ as Je}from"./CJFtzlQ4.js";import{f as Rt,b as sn,c as nn,d as an,i as V,t as on,g as Zt,p as rt,j as nt}from"./DuwtTfO8.js";import{_ as es}from"./CA9B2HE5.js";import{_ as ct}from"./DJmoLeVt.js";import{_ as ut}from"./CzAPFPpL.js";import{_ as ln}from"./CeG9pBAD.js";import{_ as rn}from"./CTU1mrhq.js";import{_ as cn}from"./CAvY22RE.js";import{_ as un,a as dn}from"./DoIREDVb.js";import{_ as mn}from"./DrfE8IY0.js";import{_ as pn}from"./FaFoMVKo.js";import{_ as gn}from"./DsesNydr.js";import{_ as Dt}from"./BUkim3TM.js";import{M as fn,D as $t,g as Ct}from"./D7W_4Sqc.js";import{_ as _n}from"./CxyAzHr3.js";import{u as vn}from"./C2hkrSey.js";import{u as yn}from"./H94BMf3L.js";import"./KyA_4Ks-.js";import"./BjaRappk.js";import"./DSqHUrvO.js";import"./UdR3DBPS.js";import"./L3kAWB2a.js";import"./Nn93e_Mz.js";import"./DmkUdSS4.js";import"./D-c8ZSws.js";import"./B99fbi73.js";import"./4gYNA-d4.js";import"./BrQEE053.js";import"./DeY2JkR2.js";import"./DfgOx_ou.js";import"./pQqGiNch.js";const hn=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],at=new Map,ot=new Map;function xn(U,$){const k=[{event:"run.failed",scenario:{title:`Test run failed — ${U}`,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 — ${U}`,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 — ${U}`,description:"TimeoutError: locator.click: Timeout 30000ms exceeded",icon:"i-lucide-layers",color:"warning"}},{event:"flakiness.spike",scenario:{title:`Flakiness spike — ${U}`,description:"3 tests became flaky (8.3% rate)",icon:"i-lucide-shuffle",color:"warning"}},{event:"perf.regression",scenario:{title:`Performance regression — ${U}`,description:"p90 duration increased by 42% vs last week",icon:"i-lucide-trending-down",color:"warning"}},{event:"run.finished",scenario:{title:`Test run recovered — ${U}`,description:"All 12 tests passed on main",icon:"i-lucide-circle-check",color:"success"}},{event:"diagnosis.completed",scenario:{title:`Diagnosis complete — ${U}`,description:"Root cause: test bug — confidence: high",icon:"i-lucide-sparkles",color:"info"}}],C=k.filter(x=>$.length===0||$.includes(x.event)).map(x=>x.scenario);return C.length===0?[k[0].scenario,k[k.length-1].scenario]:C}function bn(){if(!jt().public.demoMode)return null;const $=we();function k(x,m,i){C(x);const M=xn(m,i);ot.set(x,0);function D(){const z=(ot.get(x)??0)%M.length;ot.set(x,z+1);const v=M[z];$.add({title:v.title,description:v.description,icon:v.icon,color:v.color,duration:7e3});const _=25e3+Math.random()*1e4;at.set(x,setTimeout(D,_))}at.set(x,setTimeout(D,8e3))}function C(x){const m=at.get(x);m!==void 0&&(clearTimeout(m),at.delete(x)),ot.delete(x)}return{scheduleFor:k,cancelFor:C}}const kn={key:0,class:"p-3 space-y-3"},$n={key:0,class:"text-xs text-gray-500"},Cn={key:1,class:"text-xs text-gray-500"},Tn={key:2,class:"text-xs text-gray-500"},jn={class:"space-y-1"},Sn=["checked","onChange"],wn={key:1,class:"p-3 space-y-3"},Rn={class:"flex items-center justify-between"},Dn={class:"font-medium text-sm inline-flex items-center gap-1"},zn={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},An={key:1,class:"text-xs text-muted text-center py-2"},Un={key:2,class:"space-y-1.5"},In={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},Mn={class:"space-y-1"},Fn=["value"],Pn={class:"flex gap-1.5 justify-end"},En={class:"flex-1 font-medium truncate"},Bn={key:3,class:"text-xs text-muted text-center py-1"},Vn={key:4,class:"space-y-2 border-t border-default pt-2"},Ln={class:"space-y-1"},Nn=["value"],On={class:"flex gap-1.5 justify-end"},Kn=ie({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(U){let $,k;const C=U,x=jt(),m=x.public.demoMode,i=N(()=>x.public.authEnabled),{authState:M}=Nt(),D=N(()=>M.value.authenticated),z=we(),v=I(!1),_=m?bn():null,b=!i.value&&!m?Os():null,A=I("default"),p=N(()=>"Notification"in window);"Notification"in window&&(A.value=Notification.permission);const y=N(()=>b?.getProject(C.projectId).events??[]),P=N(()=>b?.isSubscribed(C.projectId)??!1);async function O(){!p.value||A.value!=="default"||(A.value=await Notification.requestPermission())}function S(L){return y.value.includes(L)}function g(L){b?.toggleEvent(C.projectId,L)}const T=m||i.value&&D.value,Q=m?{server:!1}:{},{data:w,refresh:H}=([$,k]=be(()=>ke(`/api/subscriptions?projectId=${C.projectId}`,{immediate:T,...Q},"$5zp4moJ-7_")),$=await $,k(),$),B=N(()=>w.value?.subscriptions??[]),ue=N(()=>B.value.length>0),{data:ge}=([$,k]=be(()=>ke("/api/channels",{immediate:T,...Q},"$vFApQ6eA2X")),$=await $,k(),$),h=N(()=>ge.value?.channels??[]),j=I(!1),q=I(void 0),de=I(["run.failed"]),Re=I(!1),me=I(null),ye=I(void 0),pe=I([]),Be=I(!1);function ee(L){me.value=L,ye.value=L.channel.id,pe.value=[...L.events]}function dt(){me.value=null}async function mt(){if(!(!me.value||!ye.value||pe.value.length===0)){Be.value=!0;try{await $fetch(`/api/subscriptions/${me.value.id}`,{method:"PATCH",body:{channelId:ye.value,events:pe.value}}),await H(),me.value=null}catch(L){z.add({title:"Update failed",description:String(L?.message??L),color:"error"})}finally{Be.value=!1}}}const De=N(()=>h.value.map(L=>({label:L.type==="personal_email"?`${L.name} (${L.config.address})`:L.name,value:L.id}))),Ve=hn.map(L=>({label:L.replace(/\./g," › "),value:L}));ve(v,L=>{L?(T&&H(),h.value.length>0&&!q.value&&(q.value=h.value[0].id)):(j.value=!1,me.value=null)});async function ae(){if(!(!q.value||de.value.length===0)){Re.value=!0;try{await $fetch("/api/subscriptions",{method:"POST",body:{channelId:q.value,projectId:C.projectId,events:de.value,mode:"realtime"}}),await H(),j.value=!1,z.add({title:"Subscribed",color:"success"}),m&&_?.scheduleFor(C.projectId,C.projectLabel||"this project",de.value)}catch(L){z.add({title:"Subscribe failed",description:String(L?.message??L),color:"error"})}finally{Re.value=!1}}}async function he(L){try{await $fetch(`/api/subscriptions/${L}`,{method:"DELETE"}),await H(),z.add({title:"Unsubscribed",color:"success"}),m&&B.value.length===0&&_?.cancelFor(C.projectId)}catch(F){z.add({title:"Failed",description:String(F?.message??F),color:"error"})}}async function Le(L){const F=L.mutedUntil&&new Date(L.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${L.id}`,{method:"PATCH",body:{mutedUntil:F?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await H()}catch(X){z.add({title:"Failed",description:String(X?.message??X),color:"error"})}}function Ne(L){return L.mutedUntil&&new Date(L.mutedUntil)>new Date}function pt(L){return L==="personal_email"?"i-lucide-user-round":L==="email"?"i-lucide-mail":L==="slack"?"i-lucide-slack":"i-lucide-webhook"}const Oe=N(()=>m||i.value&&D.value||b!=null),Ke=N(()=>m||i.value?ue.value:P.value);return(L,F)=>{const X=$e,gt=Ls,Ge=He,ze=Me,Xe=Fe,Ye=Pe,Ae=qt,ft=Is;return e(Oe)?(s(),f(ft,{key:0,open:e(v),"onUpdate:open":F[6]||(F[6]=K=>W(v)?v.value=K:null),ui:{content:"w-72"}},{content:t(()=>[e(b)?(s(),r("div",kn,[F[9]||(F[9]=n("div",{class:"flex items-center justify-between"},[n("span",{class:"font-medium text-sm"},"Browser notifications")],-1)),e(p)&&e(A)==="default"?(s(),r("p",$n,[a(X,{variant:"link",size:"xs",class:"p-0",onClick:O},{default:t(()=>[...F[7]||(F[7]=[d(" Allow notifications ",-1)])]),_:1}),F[8]||(F[8]=d(" "+c(" ")+"in your browser to get alerts for this project. ",-1))])):e(p)&&e(A)==="denied"?(s(),r("p",Cn," Notifications are blocked. Check your browser settings to allow them. ")):e(p)?R("",!0):(s(),r("p",Tn,"Notifications are not supported in this browser.")),e(p)&&e(A)==="granted"?(s(),r(G,{key:3},[a(gt),n("div",jn,[(s(!0),r(G,null,oe(e(Ve),K=>(s(),r("label",{key:K.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[n("input",{type:"checkbox",checked:S(K.value),class:"accent-primary size-3",onChange:Y=>g(K.value)},null,40,Sn),d(" "+c(K.label),1)]))),128))])],64)):R("",!0)])):(s(),r("div",wn,[n("div",Rn,[n("span",Dn,[F[10]||(F[10]=d(" Notifications ",-1)),a(Ge,{topic:"notifications.subscribe"})]),e(j)?R("",!0):(s(),f(X,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(h).length===0,onClick:F[0]||(F[0]=K=>j.value=!0)},{default:t(()=>[...F[11]||(F[11]=[d(" Add ",-1)])]),_:1},8,["disabled"]))]),e(m)?(s(),r("div",zn,[a(ze,{name:"i-lucide-sparkles",class:"size-3 inline-block mr-1 text-primary"}),F[12]||(F[12]=d(" Demo — notifications will appear as toasts in ~8 s. ",-1))])):e(h).length===0?(s(),r("div",An,[F[14]||(F[14]=d(" No channels configured.",-1)),F[15]||(F[15]=n("br",null,null,-1)),a(Xe,{to:"/settings/notifications",class:"text-primary underline"},{default:t(()=>[...F[13]||(F[13]=[d("Add one in Settings",-1)])]),_:1})])):R("",!0),e(B).length>0?(s(),r("div",Un,[(s(!0),r(G,null,oe(e(B),K=>(s(),r(G,{key:K.id},[e(me)?.id===K.id?(s(),r("div",In,[a(Ae,{label:"Channel",size:"xs"},{default:t(()=>[a(Ye,{modelValue:e(ye),"onUpdate:modelValue":F[1]||(F[1]=Y=>W(ye)?ye.value=Y:null),items:e(De),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(Ae,{label:"Events",size:"xs"},{default:t(()=>[n("div",Mn,[(s(!0),r(G,null,oe(e(Ve),Y=>(s(),r("label",{key:Y.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Bt(n("input",{type:"checkbox",value:Y.value,"onUpdate:modelValue":F[2]||(F[2]=xe=>W(pe)?pe.value=xe:null),class:"accent-primary size-3"},null,8,Fn),[[Vt,e(pe)]]),d(" "+c(Y.label),1)]))),128))])]),_:1}),n("div",Pn,[a(X,{size:"xs",color:"neutral",variant:"ghost",onClick:dt},{default:t(()=>[...F[16]||(F[16]=[d("Cancel",-1)])]),_:1}),a(X,{size:"xs",color:"primary",loading:e(Be),disabled:!e(ye)||e(pe).length===0,onClick:mt},{default:t(()=>[...F[17]||(F[17]=[d(" Save ",-1)])]),_:1},8,["loading","disabled"])])])):(s(),r("div",{key:1,class:re(["flex items-center gap-2 rounded px-2 py-1.5 text-xs",Ne(K)?"opacity-60":""])},[a(ze,{name:pt(K.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),n("span",En,c(K.channel.name),1),a(X,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:Y=>ee(K)},null,8,["onClick"]),a(X,{icon:Ne(K)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:Ne(K)?"Unmute":"Mute 7 days",onClick:Y=>Le(K)},null,8,["icon","title","onClick"]),a(X,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:Y=>he(K.id)},null,8,["onClick"])],2))],64))),128))])):!e(j)&&e(h).length>0?(s(),r("div",Bn," Not subscribed to this project. ")):R("",!0),e(j)?(s(),r("div",Vn,[a(Ae,{label:"Channel",size:"xs"},{default:t(()=>[a(Ye,{modelValue:e(q),"onUpdate:modelValue":F[3]||(F[3]=K=>W(q)?q.value=K:null),items:e(De),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(Ae,{label:"Events",size:"xs"},{default:t(()=>[n("div",Ln,[(s(!0),r(G,null,oe(e(Ve),K=>(s(),r("label",{key:K.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Bt(n("input",{type:"checkbox",value:K.value,"onUpdate:modelValue":F[4]||(F[4]=Y=>W(de)?de.value=Y:null),class:"accent-primary size-3"},null,8,Nn),[[Vt,e(de)]]),d(" "+c(K.label),1)]))),128))])]),_:1}),n("div",On,[a(X,{size:"xs",color:"neutral",variant:"ghost",onClick:F[5]||(F[5]=K=>j.value=!1)},{default:t(()=>[...F[18]||(F[18]=[d("Cancel",-1)])]),_:1}),a(X,{size:"xs",color:"primary",loading:e(Re),disabled:!e(q)||e(de).length===0,onClick:ae},{default:t(()=>[...F[19]||(F[19]=[d(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):R("",!0)]))]),default:t(()=>[a(X,{icon:e(Ke)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Ke)?"primary":"neutral",variant:e(Ke)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):R("",!0)}}}),qn=Object.assign(Kn,{__name:"SubscribeBell"}),Hn={key:0,class:"flex items-center justify-between gap-3"},Qn={class:"flex items-center gap-2 min-w-0 text-sm"},Jn={class:"text-xs break-all"},Gn={class:"flex items-center gap-1.5 shrink-0"},Xn={key:1,class:"flex items-center justify-between gap-3"},Yn=ie({__name:"DesktopProjectLinkCard",props:{projectId:{}},setup(U){const $=U,{available:k,link:C,busy:x,pickAndLink:m,unlink:i}=Qs(()=>$.projectId);return(M,D)=>{const z=Me,v=Ce,_=$e,b=it;return e(k)?(s(),f(b,{key:0,icon:"i-lucide-folder-symlink",title:"Local folder"},{subtitle:t(()=>[...D[0]||(D[0]=[d(" Link this project to its checkout on this machine to retry failures from here and open files in your IDE. ",-1)])]),default:t(()=>[e(C)?(s(),r("div",Hn,[n("div",Qn,[a(z,{name:e(C).exists?"i-lucide-folder-check":"i-lucide-folder-x",class:re(["size-4 shrink-0",e(C).exists?"text-success":"text-warning"])},null,8,["name","class"]),n("code",Jn,c(e(C).path),1),e(C).exists?R("",!0):(s(),f(v,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:t(()=>[...D[1]||(D[1]=[d("missing",-1)])]),_:1}))]),n("div",Gn,[a(_,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-folder-search",loading:e(x),onClick:e(m)},{default:t(()=>[...D[2]||(D[2]=[d(" Change ",-1)])]),_:1},8,["loading","onClick"]),a(_,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-unlink",disabled:e(x),onClick:e(i)},{default:t(()=>[...D[3]||(D[3]=[d(" Unlink ",-1)])]),_:1},8,["disabled","onClick"])])])):(s(),r("div",Xn,[D[5]||(D[5]=n("p",{class:"text-sm text-muted"},"No folder linked yet.",-1)),a(_,{size:"xs",icon:"i-lucide-folder-plus",loading:e(x),onClick:e(m)},{default:t(()=>[...D[4]||(D[4]=[d("Choose folder…",-1)])]),_:1},8,["loading","onClick"])]))]),_:1})):R("",!0)}}}),Wn=Object.assign(Yn,{__name:"DesktopProjectLinkCard"}),Zn={class:"w-full relative"},ea={key:0},ta={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},sa={class:"font-semibold mb-1"},na={class:"capitalize mb-1"},aa={class:"space-y-0.5"},oa={class:"font-medium mt-1"},la=ie({__name:"TestRunsChart",props:{testRuns:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:$}){const k=U,C=$,x=N(()=>k.markers),m=N(()=>!k.testRuns||k.testRuns.length===0?[]:[...k.testRuns].sort((T,Q)=>new Date(T.startTime).getTime()-new Date(Q.startTime).getTime()).slice(-30).map(T=>({id:T.id,date:new Date(T.startTime),passed:T.passedTests||0,failed:T.failedTests||0,skipped:T.skippedTests||0,flaky:T.flakyTests||0,total:T.totalTests||0,status:T.status}))),i=g=>g.date,M=g=>g.passed,D=g=>g.failed,z=g=>g.skipped,v=g=>g.flaky,_=["rgb(34, 197, 94)","rgb(239, 68, 68)","rgb(245, 158, 11)","rgb(147, 51, 234)"],b=I(null),{tooltipData:A,tooltipPos:p,markerTooltip:y,markerTooltipPos:P,onRenderComplete:O}=Yt(b,m,{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=>St(`/test-runs/${g.id}`),markers:x,onMarkerClick:g=>C("marker-click",g.id)}),S=[{color:_[0],label:"Passed"},{color:_[1],label:"Failed"},{color:_[2],label:"Skipped"},{color:_[3],label:"Flaky"}];return(g,T)=>{const Q=Qt,w=Te,H=Xt;return s(),r("div",Zn,[e(m).length>0?(s(),r("div",ea,[a(e(Gt),{ref_key:"xyContainerRef",ref:b,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(O)},{default:t(()=>[a(e(Js),{x:i,y:[M,D,z,v],color:_,"curve-type":e(Tt).MonotoneX},null,8,["y","curve-type"]),a(e(Jt),{x:i,y:[M,D,z,v],color:_,"curve-type":e(Tt).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(lt),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),a(e(lt),{type:"y",label:"Tests","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(A)?(s(),r("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:Ot({left:`${e(p).x}px`,top:`${e(p).y}px`})},[n("div",ta,[n("div",sa,c(new Date(e(A).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",na,"Status: "+c(e(A).status),1),n("div",aa,[n("div",null,[T[0]||(T[0]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Passed: "+c(e(A).passed),1)]),n("div",null,[T[1]||(T[1]=n("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),d(" Failed: "+c(e(A).failed),1)]),n("div",null,[T[2]||(T[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" Skipped: "+c(e(A).skipped),1)]),n("div",null,[T[3]||(T[3]=n("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),d(" Flaky: "+c(e(A).flaky),1)]),n("div",oa,"Total: "+c(e(A).total),1)]),T[4]||(T[4]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):R("",!0),a(Q,{marker:e(y),pos:e(P)},null,8,["marker","pos"])])):(s(),f(w,{key:1,text:"No test run data available to display chart"})),a(H,{items:S})])}}}),ra=Object.assign(la,{__name:"TestRunsChart"}),ia={class:"space-y-3"},ca={class:"min-w-0 space-y-1"},ua={class:"flex items-center gap-2 flex-wrap text-sm"},da={key:0,class:"text-gray-500"},ma=["title"],pa=["title"],ga={key:0,class:"text-xs text-gray-500 italic"},fa={class:"flex items-center gap-2 shrink-0"},_a=ie({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(U,{emit:$}){const k=U,C=$,x=we(),m=I([]),i=I(null);async function M(){try{m.value=await $fetch(`/api/projects/${k.projectId}/cluster-merge-suggestions`)}catch{m.value=[]}}ve(()=>k.projectId,M,{immediate:!0});async function D(v,_){i.value=v;try{await $fetch(`/api/cluster-merge-suggestions/${v}/${_}`,{method:"POST"}),x.add({title:_==="approve"?"Clusters merged":"Suggestion dismissed",color:"success"}),await M(),_==="approve"&&C("merged")}catch(b){x.add({title:"Action failed",description:String(b?.message??b),color:"error"})}finally{i.value=null}}const z=v=>v==null?"":`${Math.round(v*100)}% similar`;return(v,_)=>{const b=Ce,A=$e,p=it;return e(m).length?(s(),f(p,{key:0,icon:"i-lucide-git-merge",title:"Suggested merges",count:e(m).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(()=>[n("div",ia,[(s(!0),r(G,null,oe(e(m),y=>(s(),r("div",{key:y.id,class:"rounded-lg border border-default p-3 flex items-start justify-between gap-4"},[n("div",ca,[n("div",ua,[a(b,{color:y.method==="llm"?"primary":"neutral",variant:"subtle",size:"sm"},{default:t(()=>[d(c(y.method==="llm"?`AI · ${y.llmConfidence??""}`:"similarity"),1)]),_:2},1032,["color"]),z(y.score)?(s(),r("span",da,c(z(y.score)),1)):R("",!0)]),n("p",{class:"text-sm truncate",title:y.clusterA?.signature||""},[_[1]||(_[1]=n("span",{class:"text-gray-400"},"A:",-1)),d(" "+c(y.clusterA?.signature||`#${y.id}`),1)],8,ma),n("p",{class:"text-sm truncate",title:y.clusterB?.signature||""},[_[2]||(_[2]=n("span",{class:"text-gray-400"},"B:",-1)),d(" "+c(y.clusterB?.signature||""),1)],8,pa),y.llmReason?(s(),r("p",ga,c(y.llmReason),1)):R("",!0)]),n("div",fa,[a(A,{size:"sm",color:"primary",icon:"i-lucide-git-merge",loading:e(i)===y.id,onClick:P=>D(y.id,"approve")},{default:t(()=>[..._[3]||(_[3]=[d(" Merge ",-1)])]),_:1},8,["loading","onClick"]),a(A,{size:"sm",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:e(i)===y.id,onClick:P=>D(y.id,"reject")},{default:t(()=>[..._[4]||(_[4]=[d(" Dismiss ",-1)])]),_:1},8,["disabled","onClick"])])]))),128))])]),_:1},8,["count"])):R("",!0)}}}),va=Object.assign(_a,{__name:"ClusterMergeSuggestions"}),ya={class:"flex items-center justify-between"},ha={class:"text-sm text-gray-500 inline-flex items-center gap-1"},xa={class:"min-w-0 space-y-0.5"},ba={key:0,class:"text-xs text-gray-500 italic truncate"},ka={key:1,class:"text-gray-400 text-xs"},$a={class:"space-y-1"},Ca={class:"text-sm tabular-nums"},Ta={class:"text-sm tabular-nums"},ja={key:1,class:"text-gray-400 text-xs"},Sa={class:"text-sm text-gray-500 whitespace-nowrap"},wa={key:0,class:"ml-1 text-xs text-gray-400"},Ra={class:"flex justify-end"},Da=ie({__name:"FailureClustersList",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(void 0),{data:m,pending:i}=([$,k]=be(()=>ke(()=>{const z=new URLSearchParams;x.value&&z.set("status",x.value);const v=z.toString();return`/api/projects/${C.projectId}/failure-clusters${v?`?${v}`:""}`},{lazy:!0,server:!1,watch:[x]},"$f7pDU1t-lL")),$=await $,k(),$),M=z=>an(z.fixVerification),D=[{accessorKey:"signature",header:V("Signature")},{accessorKey:"errorType",header:V("Type")},{accessorKey:"status",header:V("Status")},{accessorKey:"affectedTests",header:V("Tests")},{accessorKey:"occurrences",header:V("Occurrences")},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"lastSeenAt",header:V("Last seen")},{id:"actions",header:"Actions"}];return(z,v)=>{const _=He,b=Pe,A=Fe,p=Ce,y=Me,P=Wt,O=$e,S=Ee,g=Je,T=Te,Q=Qe;return s(),f(Q,null,{header:t(()=>[n("div",ya,[n("p",ha,[v[1]||(v[1]=d(" Ongoing failure signatures grouped by normalized error. ",-1)),a(_,{topic:"cluster.concept"})]),a(b,{modelValue:e(x),"onUpdate:modelValue":v[0]||(v[0]=w=>W(x)?x.value=w: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(()=>[a(g,{"min-width":"48rem",bleed:!1},{default:t(()=>[a(S,{data:e(m)??[],columns:D,loading:e(i)},{"actions-header":t(()=>[...v[2]||(v[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":t(({row:w})=>[n("div",xa,[a(A,{to:`/failure-clusters/${w.original.id}`,class:re(["text-sm text-primary hover:underline truncate block",w.original.title?"":"font-mono"]),title:w.original.signature},{default:t(()=>[d(c(w.original.title||w.original.signature),1)]),_:2},1032,["to","class","title"]),w.original.triageNote?(s(),r("p",ba,c(w.original.triageNote),1)):R("",!0)])]),"errorType-cell":t(({row:w})=>[w.original.errorType?(s(),f(p,{key:0,color:("clusterErrorTypeColor"in z?z.clusterErrorTypeColor:e(nn))(w.original.errorType),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.errorType),1)]),_:2},1032,["color"])):(s(),r("span",ka,"—"))]),"status-cell":t(({row:w})=>[n("div",$a,[a(p,{color:("clusterStatusColor"in z?z.clusterStatusColor:e(sn))(w.original.status),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.status),1)]),_:2},1032,["color"]),M(w.original)?(s(),f(P,{key:0,text:M(w.original).hint},{default:t(()=>[a(p,{color:M(w.original).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(y,{name:M(w.original).icon,class:"size-3"},null,8,["name"]),d(" "+c(M(w.original).label),1)]),_:2},1032,["color"])]),_:2},1032,["text"])):R("",!0)])]),"affectedTests-cell":t(({row:w})=>[n("span",Ca,c(w.original.affectedTests),1)]),"occurrences-cell":t(({row:w})=>[n("span",Ta,c(w.original.occurrences),1)]),"diagnosis-cell":t(({row:w})=>[w.original.diagnosis?.status==="completed"&&w.original.diagnosis.category?(s(),f(p,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(y,{name:"i-lucide-sparkles",class:"size-3"}),d(" "+c(w.original.diagnosis.category),1)]),_:2},1024)):(s(),r("span",ja,"—"))]),"lastSeenAt-cell":t(({row:w})=>[n("div",Sa,[a(A,{to:`/test-runs/${w.original.lastSeenRunId}`,class:"text-primary hover:underline"},{default:t(()=>[d(" run #"+c(w.original.lastSeenRunId),1)]),_:2},1032,["to"]),w.original.lastSeenAt?(s(),r("span",wa," ("+c(("formatRelativeTime"in z?z.formatRelativeTime:e(Rt))(w.original.lastSeenAt))+") ",1)):R("",!0)])]),"actions-cell":t(({row:w})=>[n("div",Ra,[a(O,{to:`/failure-clusters/${w.original.id}`,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(i)&&e(m)&&e(m).length===0?(s(),f(T,{key:0,text:"No failure clusters recorded for this project.",padded:!1,class:"py-4"})):R("",!0)]),_:1})}}}),za=Object.assign(Da,{__name:"FailureClustersList"}),Aa={class:"flex items-center justify-between"},Ua={class:"flex items-center gap-3"},Ia={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Ma={class:"flex items-center gap-1.5"},Fa={class:"min-w-0 space-y-0.5"},Pa={class:"flex items-center gap-2"},Ea={class:"text-sm tabular-nums"},Ba={class:"text-sm tabular-nums"},Va={key:1,class:"text-gray-400 text-xs"},La={key:1,class:"text-gray-400 text-xs"},Na={key:1,class:"text-gray-400 text-xs"},Oa={key:0,class:"text-sm text-gray-500"},Ka={key:1,class:"text-gray-400 text-xs"},qa={class:"flex justify-end"},Ha={key:0,class:"text-sm text-gray-500 py-4 text-center"},Qa=ie({__name:"FlakyTestsList",props:{projectId:{},environment:{},projectName:{}},async setup(U){let $,k;const C=U,x=I(50),m=I([]),{data:i,pending:M}=([$,k]=be(()=>ke(()=>{const p=new URLSearchParams({runs:String(x.value)});return C.environment&&p.set("environment",C.environment),`/api/projects/${C.projectId}/flaky-tests?${p.toString()}`},{lazy:!0,server:!1,watch:[x,()=>C.environment]},"$qKoEnbecbI")),$=await $,k(),$),D=N(()=>m.value.length===0?i.value??[]:(i.value??[]).filter(p=>m.value.includes(p.rootCause??"")));function z(p){return p>=60?"error":p>=30?"warning":"neutral"}function v(p){switch(p){case"timing":return"amber";case"network":return"red";case"assertion":return"blue";case"environment":return"purple";default:return"gray"}}function _(p){m.value.indexOf(p)>=0?m.value=m.value.filter(P=>P!==p):m.value=[...m.value,p]}const b=[{label:"Timing",value:"timing"},{label:"Network",value:"network"},{label:"Assertion",value:"assertion"},{label:"Environment",value:"environment"},{label:"Other",value:"other"}],A=[{accessorKey:"title",header:V("Test")},{accessorKey:"impact",header:V("Impact")},{accessorKey:"score",header:V("Score")},{accessorKey:"failureRate",header:V("Failure rate")},{accessorKey:"retryPassRuns",header:V("Retry passes")},{accessorKey:"alternations",header:V("Flips")},{accessorKey:"rootCause",header:"Root cause"},{accessorKey:"lastFlakeAt",header:V("Last flake")},{id:"actions",header:"Actions"}];return(p,y)=>{const P=He,O=Me,S=Ce,g=$e,T=Pe,Q=Fe,w=es,H=ct,B=Ht,ue=Ee,ge=Je,h=Qe;return s(),f(h,null,{header:t(()=>[n("div",Aa,[n("div",Ua,[n("p",Ia,[y[1]||(y[1]=d(" Tests that fail intermittently — detected by retry passes and status alternations ",-1)),a(P,{topic:"project.flaky-tests"})]),U.environment?(s(),f(S,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(O,{name:"i-lucide-layers",class:"size-3"}),d(" "+c(U.environment),1)]),_:1})):R("",!0),n("div",Ma,[(s(),r(G,null,oe(b,j=>a(g,{key:j.value,size:"xs",variant:e(m).includes(j.value)?"solid":"outline",color:(e(m).includes(j.value),"neutral"),onClick:q=>_(j.value)},{default:t(()=>[d(c(j.label),1)]),_:2},1032,["variant","color","onClick"])),64))])]),a(T,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=j=>W(x)?x.value=j: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(()=>[a(ge,{"min-width":"52rem",bleed:!1},{default:t(()=>[a(ue,{data:e(D),columns:A,loading:e(M),sticky:"",class:"max-h-[32rem]"},{"actions-header":t(()=>[...y[2]||(y[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"title-cell":t(({row:j})=>[n("div",Fa,[a(Q,{to:`/test-run-cases/${j.original.latestRunsCaseId}`,class:"text-sm font-medium text-primary hover:underline truncate block",title:j.original.title},{default:t(()=>[d(c(j.original.title),1)]),_:2},1032,["to","title"]),a(w,{tags:j.original.tags,meta:{owner:j.original.owner??void 0,priority:("toTestPriority"in p?p.toTestPriority:e(on))(j.original.priority)},"max-tags":3},null,8,["tags","meta"]),a(H,{"file-path":j.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])])]),"impact-cell":t(({row:j})=>[n("div",Pa,[n("span",{class:re(["inline-block w-2 h-2 rounded-full shrink-0",{"bg-red-500":j.original.wastedCiMinutes>=30,"bg-amber-500":j.original.wastedCiMinutes>=5&&j.original.wastedCiMinutes<30,"bg-green-500":j.original.wastedCiMinutes>=0&&j.original.wastedCiMinutes<5}])},null,2),n("span",Ea,c(Math.round(j.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":t(({row:j})=>[a(S,{color:z(j.original.score),variant:"subtle",size:"sm"},{default:t(()=>[d(c(j.original.score),1)]),_:2},1032,["color"])]),"failureRate-cell":t(({row:j})=>[n("span",Ba,c(Math.round(j.original.failureRate*100))+"%",1)]),"retryPassRuns-cell":t(({row:j})=>[j.original.retryPassRuns?(s(),f(S,{key:0,color:"warning",variant:"outline",size:"sm"},{default:t(()=>[d(c(j.original.retryPassRuns)+" run"+c(j.original.retryPassRuns===1?"":"s"),1)]),_:2},1024)):(s(),r("span",Va,"—"))]),"alternations-cell":t(({row:j})=>[j.original.alternations>=2?(s(),f(S,{key:0,color:"neutral",variant:"outline",size:"sm"},{default:t(()=>[d(c(j.original.alternations),1)]),_:2},1024)):(s(),r("span",La,"—"))]),"rootCause-cell":t(({row:j})=>[j.original.rootCause?(s(),f(B,{key:0,text:j.original.rootCause,color:v(j.original.rootCause)},null,8,["text","color"])):(s(),r("span",Na,"—"))]),"lastFlakeAt-cell":t(({row:j})=>[j.original.lastFlakeAt?(s(),r("span",Oa,c(("formatRelativeTime"in p?p.formatRelativeTime:e(Rt))(j.original.lastFlakeAt)),1)):(s(),r("span",Ka,"—"))]),"actions-cell":t(({row:j})=>[n("div",qa,[a(g,{to:`/test-run-cases/${j.original.latestRunsCaseId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...y[3]||(y[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(M)&&e(D).length===0?(s(),r("p",Ha," No flaky tests detected in the last "+c(e(x))+" runs. ",1)):R("",!0)]),_:1})}}}),Ja=Object.assign(Qa,{__name:"FlakyTestsList"}),Ga={class:"w-full relative"},Xa={key:0},Ya={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Wa={class:"font-semibold mb-1"},Za={class:"capitalize mb-1"},eo={class:"space-y-0.5"},to={class:"mt-1"},so={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},no=ie({__name:"PerformanceTrendChart",props:{data:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:$}){const k=U,C=$,x=N(()=>k.markers),m=N(()=>!k.data||k.data.length===0?[]:k.data.map(S=>({id:S.id,date:new Date(S.startTime),duration:S.duration?Math.round(S.duration/1e3):null,avgTestDuration:S.avgTestDuration?Math.round(S.avgTestDuration/1e3):null,p90TestDuration:S.p90TestDuration?Math.round(S.p90TestDuration/1e3):null,commit:S.commit?S.commit.substring(0,7):null,status:S.status,totalTests:S.totalTests}))),i=S=>S.date,M=S=>S.duration??void 0,D=S=>S.avgTestDuration??void 0,z=S=>S.p90TestDuration??void 0,v=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],_=I(null),{tooltipData:b,tooltipPos:A,markerTooltip:p,markerTooltipPos:y,onRenderComplete:P}=Yt(_,m,{x:S=>S.date,series:[{y:S=>S.duration,color:v[0]},{y:S=>S.avgTestDuration,color:v[1]},{y:S=>S.p90TestDuration,color:v[2]}],onClick:S=>St(`/test-runs/${S.id}`),markers:x,onMarkerClick:S=>C("marker-click",S.id)}),O=[{color:v[0],label:"Total Duration"},{color:v[1],label:"Avg Test Duration"},{color:v[2],label:"P90 Test Duration"}];return(S,g)=>{const T=Qt,Q=Te,w=Xt;return s(),r("div",Ga,[e(m).length>0?(s(),r("div",Xa,[a(e(Gt),{ref_key:"xyContainerRef",ref:_,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(P)},{default:t(()=>[a(e(Jt),{x:i,y:[M,D,z],color:v,"curve-type":e(Tt).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(lt),{type:"x","tick-format":H=>new Date(H).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),a(e(lt),{type:"y",label:"Duration (s)","tick-format":H=>`${H}s`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(b)?(s(),r("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:Ot({left:`${e(A).x}px`,top:`${e(A).y}px`})},[n("div",Ya,[n("div",Wa,c(new Date(e(b).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",Za,"Status: "+c(e(b).status),1),n("div",eo,[n("div",null,[g[0]||(g[0]=n("span",{class:"text-blue-500 dark:text-blue-400"},"●",-1)),d(" Total: "+c(e(b).duration??"-")+"s ",1)]),n("div",null,[g[1]||(g[1]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Avg: "+c(e(b).avgTestDuration??"-")+"s ",1)]),n("div",null,[g[2]||(g[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" P90: "+c(e(b).p90TestDuration??"-")+"s ",1)]),n("div",to,"Tests: "+c(e(b).totalTests),1),e(b).commit?(s(),r("div",so," Commit: "+c(e(b).commit),1)):R("",!0)]),g[3]||(g[3]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):R("",!0),a(T,{marker:e(p),pos:e(y)},null,8,["marker","pos"])])):(s(),f(Q,{key:1,text:"No performance data available to display chart"})),a(w,{items:O})])}}}),ao=Object.assign(no,{__name:"PerformanceTrendChart"}),oo={class:"min-w-0"},lo={class:"mt-1"},ro={class:"tabular-nums"},io={key:0,class:"ml-1 text-xs text-gray-500",title:"timeout ÷ p95"},co={class:"tabular-nums text-gray-500"},uo={key:0,class:"text-sm"},mo={key:1,class:"tabular-nums"},po={class:"tabular-nums font-medium text-green-600 dark:text-green-400"},go={class:"tabular-nums text-gray-500"},fo=ie({__name:"TimeoutOpportunitiesTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,{data:x,pending:m}=([$,k]=be(()=>ke(()=>`/api/projects/${C.projectId}/timeout-opportunities`,{lazy:!0,server:!1},"$tMBJjTyDol")),$=await $,k(),$),i=N(()=>x.value??[]);function M(z){return z==null?"—":z<1e3?`${z}ms`:`${(z/1e3).toFixed(1)}s`}const D=[{accessorKey:"title",header:V("Test case")},{accessorKey:"kind",header:"Type"},{accessorKey:"timeout",header:V("Timeout")},{accessorKey:"p95",header:V("p95")},{accessorKey:"recommendedTimeout",header:"Recommendation"},{accessorKey:"estimatedSavingMs",header:V("Est. saving / failure")},{accessorKey:"runCount",header:V("Runs")}];return(z,v)=>{const _=ut,b=Te,A=Fe,p=ct,y=Ce,P=Ee,O=Je,S=Qe;return s(),f(S,null,{header:t(()=>[...v[0]||(v[0]=[n("h2",{class:"text-xl font-semibold"},"Timeout opportunities",-1),n("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 "),n("code",{class:"text-xs"},"test.slow()"),d(" mark — tightening these makes failures surface sooner. ")],-1)])]),default:t(()=>[e(m)?(s(),f(_,{key:0})):e(i).length===0?(s(),f(b,{key:1,text:"No timeout opportunities",description:"No oversized timeouts or stale test.slow() marks were found for this project."})):(s(),f(O,{key:2,"min-width":"52rem",bleed:!1},{default:t(()=>[a(P,{data:e(i),columns:D,sticky:"",class:"max-h-[32rem]"},{"title-cell":t(({row:g})=>[n("div",oo,[a(A,{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"]),n("div",lo,[a(p,{"file-path":g.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"kind-cell":t(({row:g})=>[a(y,{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})=>[n("span",ro,c(M(g.original.timeout)),1),g.original.headroomRatio!=null?(s(),r("span",io," ("+c(g.original.headroomRatio)+"×) ",1)):R("",!0)]),"p95-cell":t(({row:g})=>[n("span",co,c(M(g.original.p95)),1)]),"recommendedTimeout-cell":t(({row:g})=>[g.original.kind==="stale-slow"?(s(),r("span",uo,[...v[1]||(v[1]=[d("Remove ",-1),n("code",{class:"text-xs"},"test.slow()",-1)])])):(s(),r("span",mo,"Lower to ~"+c(M(g.original.recommendedTimeout)),1))]),"estimatedSavingMs-cell":t(({row:g})=>[n("span",po,c(M(g.original.estimatedSavingMs)),1)]),"runCount-cell":t(({row:g})=>[n("span",go,c(g.original.runCount),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),_o=Object.assign(fo,{__name:"TimeoutOpportunitiesTable"}),vo={class:"flex items-center justify-between"},yo={class:"text-sm text-gray-500 inline-flex items-center gap-1"},ho={class:"truncate font-mono text-xs"},xo={class:"tabular-nums"},bo={class:"tabular-nums text-gray-500"},ko={class:"tabular-nums text-gray-500"},$o=ie({__name:"SpecHealthTable",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(30),{data:m,pending:i}=([$,k]=be(()=>ke(()=>`/api/projects/${C.projectId}/spec-health?days=${x.value}`,{lazy:!0,server:!1,watch:[x]},"$QL0nEFEG1b")),$=await $,k(),$),M=N(()=>m.value?.specs??[]);function D(p){return p>=.9?"bg-green-500":p>=.7?"bg-amber-500":p>0?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function z(p){return p>=.9?"text-green-600 dark:text-green-400":p>=.7?"text-amber-600 dark:text-amber-400":p>0?"text-red-600 dark:text-red-400":"text-gray-500"}function v(p){return`${Math.round(p*100)}%`}function _(p){return p<1e3?`${p}ms`:`${(p/1e3).toFixed(1)}s`}const b=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],A=[{accessorKey:"prefix",header:V("Spec prefix")},{accessorKey:"passRate",header:V("Pass rate")},{accessorKey:"flakyRate",header:V("Flaky")},{accessorKey:"failureCount",header:V("Failures")},{accessorKey:"testCount",header:V("Tests")},{accessorKey:"avgDuration",header:V("Avg time")}];return(p,y)=>{const P=He,O=Pe,S=ut,g=Te,T=Fe,Q=Ee,w=Je,H=Qe;return s(),f(H,null,{header:t(()=>[n("div",vo,[n("p",yo,[y[1]||(y[1]=d(" Spec-file health overview — pass rate, flaky rate, and failure count per spec prefix ",-1)),a(P,{topic:"project.spec-health"})]),a(O,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=B=>W(x)?x.value=B:null),items:b,size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[e(i)?(s(),f(S,{key:0})):e(M).length===0?(s(),f(g,{key:1,text:"No data",description:"No spec health data available for the selected period."})):(s(),f(w,{key:2,"min-width":"46rem",bleed:!1},{default:t(()=>[a(Q,{data:e(M),columns:A,sticky:"",class:"max-h-[32rem]"},{"prefix-cell":t(({row:B})=>[a(T,{to:`/projects/${U.projectId}/test-cases?file=${encodeURIComponent(B.original.prefix)}`,class:"flex items-center gap-2 min-w-0 text-primary hover:underline",title:B.original.prefix},{default:t(()=>[n("span",{class:re(["inline-block size-3 rounded shrink-0",D(B.original.passRate)])},null,2),n("span",ho,c(B.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":t(({row:B})=>[n("span",{class:re(["font-medium tabular-nums",z(B.original.passRate)])},c(v(B.original.passRate)),3)]),"flakyRate-cell":t(({row:B})=>[n("span",xo,c(Math.round(B.original.flakyRate*100))+"%",1)]),"failureCount-cell":t(({row:B})=>[n("span",{class:re(["tabular-nums",B.original.failureCount>0?"text-red-600 dark:text-red-400":""])},c(B.original.failureCount),3)]),"testCount-cell":t(({row:B})=>[n("span",bo,c(B.original.testCount),1)]),"avgDuration-cell":t(({row:B})=>[n("span",ko,c(_(B.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),Co=Object.assign($o,{__name:"SpecHealthTable"}),To={class:"space-y-6"},jo={class:"w-full text-sm"},So={class:"px-3 py-2 min-w-0"},wo={class:"text-xs text-muted"},Ro={class:"px-3 py-2 text-muted"},Do={class:"px-3 py-2 whitespace-nowrap"},zo={key:1,class:"text-xs text-muted"},Ao={key:2,class:"text-xs"},Uo={class:"px-3 py-2 whitespace-nowrap text-muted"},Io={class:"px-3 py-2 text-right"},Mo={class:"w-full text-sm"},Fo={class:"px-3 py-2 min-w-0"},Po={class:"text-xs text-muted"},Eo={class:"px-3 py-2 text-right whitespace-nowrap"},Bo=ie({__name:"QuarantineTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,x=we(),m=I(null),{data:i,status:M,error:D,refresh:z}=([$,k]=be(()=>ke(()=>`/api/projects/${C.projectId}/quarantine`,"$9P2J7SsiYf")),$=await $,k(),$);function v(A){const p=Math.round(A/36e5);return p<48?`${Math.max(1,p)}h`:`${Math.round(p/24)}d`}async function _(A,p){m.value=A;try{await $fetch(`/api/projects/${C.projectId}/quarantine`,{method:"POST",body:{testCaseId:A,reason:p,source:"proposed"}}),x.add({title:"Quarantined",color:"success"}),await z()}catch{x.add({title:"Could not quarantine that test",color:"error"})}finally{m.value=null}}async function b(A){m.value=A;try{await $fetch(`/api/projects/${C.projectId}/quarantine/${A}`,{method:"DELETE"}),x.add({title:"Released",color:"success"}),await z()}catch{x.add({title:"Could not release that test",color:"error"})}finally{m.value=null}}return(A,p)=>{const y=ut,P=cn,O=dn,S=un,g=Te,T=Fe,Q=es,w=ct,H=Ce,B=$e,ue=Je,ge=it;return s(),r("div",To,[a(ge,{title:"Quarantine",icon:"i-lucide-shield-alert",count:e(i)?.debt.active,help:"project.quarantine"},{subtitle:t(()=>[...p[0]||(p[0]=[d(" A quarantined test keeps running and keeps reporting — it is excluded from the CI gate's verdict and nothing else. That is what lets it earn its way back out. ",-1)])]),default:t(()=>[e(M)==="pending"?(s(),f(y,{key:0})):e(D)?(s(),f(P,{key:1,text:String(e(D))},null,8,["text"])):(s(),r(G,{key:2},[e(i)&&e(i).debt.active>0?(s(),f(S,{key:0,class:"mb-4"},{default:t(()=>[a(O,{label:"Quarantined",value:e(i).debt.active},null,8,["value"]),a(O,{label:"Ready to release",value:e(i).debt.readyToRelease,"value-class":e(i).debt.readyToRelease>0?"text-green-600 dark:text-green-400":"",hint:"earned their way out"},null,8,["value","value-class"]),a(O,{label:"Still failing",value:e(i).debt.stillFailing,hint:"no passing streak"},null,8,["value"]),a(O,{label:"Oldest",value:v(e(i).debt.oldestAgeMs),size:"sm"},null,8,["value"])]),_:1})):R("",!0),!e(i)||e(i).entries.length===0?(s(),f(g,{key:1,icon:"i-lucide-shield-check",text:"Nothing quarantined. Tests you quarantine appear here with their progress back out."})):(s(),f(ue,{key:2},{default:t(()=>[n("table",jo,[p[2]||(p[2]=n("thead",{class:"text-left text-xs text-muted"},[n("tr",null,[n("th",{class:"px-3 py-2"},"Test"),n("th",{class:"px-3 py-2"},"Reason"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Streak"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Age"),n("th",{class:"px-3 py-2 text-right"},"Actions")])],-1)),n("tbody",null,[(s(!0),r(G,null,oe(e(i).entries,h=>(s(),r("tr",{key:h.id,class:"border-t border-default"},[n("td",So,[a(T,{to:`/test-cases/${h.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(c(h.title),1)]),_:2},1032,["to"]),a(Q,{tags:h.tags,meta:{owner:h.owner??void 0},"max-tags":3,class:"ml-1"},null,8,["tags","meta"]),n("div",wo,[a(w,{"file-path":h.filePath,"project-key":U.projectId,"project-name":U.projectName},null,8,["file-path","project-key","project-name"])])]),n("td",Ro,c(h.reason||"—"),1),n("td",Do,[h.releaseProposed?(s(),f(H,{key:0,color:"success",variant:"soft",size:"xs"},{default:t(()=>[d(c(h.consecutivePasses)+" green — ready ",1)]),_:2},1024)):h.runsSinceQuarantine===0?(s(),r("span",zo,"not run yet")):(s(),r("span",Ao,c(h.consecutivePasses)+" / "+c(e(i).releaseAfterConsecutivePasses),1))]),n("td",Uo,c(v(h.ageMs)),1),n("td",Io,[a(B,{size:"xs",color:h.releaseProposed?"primary":"neutral",variant:"soft",loading:e(m)===h.testCaseId,onClick:j=>b(h.testCaseId)},{default:t(()=>[...p[1]||(p[1]=[d(" Release ",-1)])]),_:1},8,["color","loading","onClick"])])]))),128))])])]),_:1}))],64))]),_:1},8,["count"]),e(i)&&e(i).candidates.length>0?(s(),f(ge,{key:0,title:"Worth quarantining",icon:"i-lucide-lightbulb",count:e(i).candidates.length},{subtitle:t(()=>[...p[3]||(p[3]=[d(" Ranked by the CI minutes their flakiness wastes, not by how often they flake — a test that flakes constantly but finishes instantly costs nothing. ",-1)])]),default:t(()=>[a(ue,null,{default:t(()=>[n("table",Mo,[n("tbody",null,[(s(!0),r(G,null,oe(e(i).candidates,h=>(s(),r("tr",{key:h.testCaseId,class:"border-t border-default"},[n("td",Fo,[a(T,{to:`/test-cases/${h.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(c(h.title),1)]),_:2},1032,["to"]),n("div",Po,c(h.rationale),1)]),n("td",Eo,[a(B,{size:"xs",color:"neutral",variant:"soft",loading:e(m)===h.testCaseId,onClick:j=>_(h.testCaseId,h.rationale)},{default:t(()=>[...p[4]||(p[4]=[d(" Quarantine ",-1)])]),_:1},8,["loading","onClick"])])]))),128))])])]),_:1})]),_:1},8,["count"])):R("",!0)])}}}),Vo=Object.assign(Bo,{__name:"QuarantineTable"}),Lo={class:"space-y-4"},No={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},Oo={id:"marker-environments"},Ko=["value"],qo=ie({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(U,{emit:$}){const k=U,C=$,x=we(),m=fn.map(_=>({label:_.label,value:_.id,icon:_.icon})),i=Ms({label:"",occurredAt:"",category:$t,environment:"",description:""}),M=N(()=>!!k.marker),D=I(!1);function z(_){const b=new Date(_),A=p=>String(p).padStart(2,"0");return`${b.getFullYear()}-${A(b.getMonth()+1)}-${A(b.getDate())}T${A(b.getHours())}:${A(b.getMinutes())}`}ve(()=>k.open,_=>{_&&(k.marker?(i.label=k.marker.label,i.occurredAt=z(k.marker.occurredAt),i.category=k.marker.category||$t,i.environment=k.marker.environment??"",i.description=k.marker.description??""):(i.label="",i.occurredAt=z(new Date),i.category=$t,i.environment="",i.description=""))});async function v(){if(!i.label.trim()){x.add({title:"Label is required",color:"error"});return}if(!i.occurredAt){x.add({title:"Date is required",color:"error"});return}D.value=!0;const _={label:i.label.trim(),occurredAt:new Date(i.occurredAt).toISOString(),category:i.category,environment:i.environment.trim()||null,description:i.description.trim()||null};try{k.marker?(await $fetch(`/api/markers/${k.marker.id}`,{method:"PUT",body:_}),x.add({title:"Marker updated",color:"success"})):(await $fetch(`/api/projects/${k.projectId}/markers`,{method:"POST",body:_}),x.add({title:"Marker created",color:"success"})),C("update:open",!1),C("saved")}catch(b){x.add({title:M.value?"Failed to update marker":"Failed to create marker",description:Zt(b),color:"error"})}finally{D.value=!1}}return(_,b)=>{const A=Kt,p=qt,y=Pe,P=gn,O=$e,S=Dt,g=wt;return s(),f(g,null,{default:t(()=>[a(S,{open:U.open,title:e(M)?"Edit marker":"Add marker","onUpdate:open":b[6]||(b[6]=T=>C("update:open",T))},{body:t(()=>[n("div",Lo,[a(p,{label:"Label",name:"label",required:""},{default:t(()=>[a(A,{modelValue:e(i).label,"onUpdate:modelValue":b[0]||(b[0]=T=>e(i).label=T),placeholder:"e.g. Migrated CI to new runners",class:"w-full"},null,8,["modelValue"])]),_:1}),n("div",No,[a(p,{label:"Date & time",name:"occurredAt",required:""},{default:t(()=>[a(A,{modelValue:e(i).occurredAt,"onUpdate:modelValue":b[1]||(b[1]=T=>e(i).occurredAt=T),type:"datetime-local",class:"w-full"},null,8,["modelValue"])]),_:1}),a(p,{label:"Category",name:"category"},{default:t(()=>[a(y,{modelValue:e(i).category,"onUpdate:modelValue":b[2]||(b[2]=T=>e(i).category=T),items:e(m),class:"w-full"},null,8,["modelValue","items"])]),_:1})]),a(p,{label:"Environment",name:"environment",help:"Optional. Leave empty to apply to all environments."},{default:t(()=>[a(A,{modelValue:e(i).environment,"onUpdate:modelValue":b[3]||(b[3]=T=>e(i).environment=T),list:"marker-environments",placeholder:"e.g. production",class:"w-full"},null,8,["modelValue"]),n("datalist",Oo,[(s(!0),r(G,null,oe(U.environments||[],T=>(s(),r("option",{key:T,value:T},null,8,Ko))),128))])]),_:1}),a(p,{label:"Description",name:"description"},{default:t(()=>[a(P,{modelValue:e(i).description,"onUpdate:modelValue":b[4]||(b[4]=T=>e(i).description=T),rows:3,placeholder:"Optional details",class:"w-full"},null,8,["modelValue"])]),_:1})])]),footer:t(()=>[a(O,{color:"neutral",variant:"ghost",label:"Cancel",onClick:b[5]||(b[5]=T=>C("update:open",!1))}),a(O,{label:e(M)?"Save changes":"Add marker",icon:e(M)?"i-lucide-check":"i-lucide-plus",loading:e(D),onClick:v},null,8,["label","icon","loading"])]),_:1},8,["open","title"])]),_:1})}}}),Ho=Object.assign(qo,{__name:"MarkerFormModal"}),Qo={class:"md:hidden space-y-3"},Jo={class:"flex items-start justify-between gap-2"},Go={key:0,class:"flex gap-1 shrink-0"},Xo={class:"text-sm text-muted"},Yo={key:0,class:"text-xs"},Wo={key:1,class:"text-sm text-muted"},Zo={class:"whitespace-nowrap"},el={class:"text-sm"},tl={class:"text-xs text-muted"},sl={class:"font-medium flex items-center gap-1"},nl={key:0,class:"text-xs text-muted line-clamp-1"},al={key:1,class:"text-xs text-muted"},ol={key:0,class:"flex gap-1 justify-end"},ll=ie({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(U,{emit:$}){const k=U,C=$,x=we(),m=N(()=>[...k.markers].sort((y,P)=>+new Date(P.occurredAt)-+new Date(y.occurredAt))),i=[{accessorKey:"occurredAt",header:"When"},{accessorKey:"category",header:"Category"},{accessorKey:"label",header:"Label"},{accessorKey:"environment",header:"Environment"},{accessorKey:"actions",header:""}],M=I(!1),D=I(null);function z(){D.value=null,M.value=!0}function v(y){D.value=y,M.value=!0}ve(()=>k.focusMarkerId,y=>{if(y==null)return;const P=k.markers.find(O=>O.id===y);P&&v(P),C("clear-focus")},{immediate:!0});const _=I(!1),b=I(null);function A(y){b.value=y,_.value=!0}async function p(){const y=b.value;if(_.value=!1,b.value=null,!!y)try{await $fetch(`/api/markers/${y.id}`,{method:"DELETE"}),x.add({title:"Marker deleted",color:"success"}),C("changed")}catch(P){x.add({title:"Failed to delete marker",description:Zt(P),color:"error"})}}return(y,P)=>{const O=$e,S=Te,g=pn,T=Ce,Q=Me,w=Ee,H=Ho,B=Dt,ue=wt,ge=it;return s(),f(ge,{title:"Timeline markers",count:U.markers.length,icon:"i-lucide-milestone",help:"project.timeline",subtitle:"Dated events overlaid on the analytics charts"},{actions:t(()=>[U.canEdit?(s(),f(O,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:z})):R("",!0)]),default:t(()=>[U.markers.length===0?(s(),f(S,{key:0,icon:"i-lucide-milestone",text:"No markers yet. Add a deploy, config change, or incident to see it on the charts."})):(s(),r(G,{key:1},[n("div",Qo,[(s(!0),r(G,null,oe(e(m),h=>(s(),r("div",{key:h.id,class:"rounded-lg border border-default p-3 space-y-2"},[n("div",Jo,[a(g,{marker:h},null,8,["marker"]),U.canEdit?(s(),r("div",Go,[a(O,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:j=>v(h)},null,8,["onClick"]),a(O,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:j=>A(h)},null,8,["onClick"])])):R("",!0)]),n("div",Xo,c(("prettyDateFormat"in y?y.prettyDateFormat:e(rt))(h.occurredAt)),1),h.environment?(s(),r("div",Yo,[a(T,{color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.environment),1)]),_:2},1024)])):R("",!0),h.description?(s(),r("p",Wo,c(h.description),1)):R("",!0)]))),128))]),a(w,{data:e(m),columns:i,class:"hidden md:block"},{"occurredAt-cell":t(({row:h})=>[n("div",Zo,[n("div",el,c(("prettyDateFormat"in y?y.prettyDateFormat:e(rt))(h.original.occurredAt)),1),n("div",tl,c(("formatRelativeTime"in y?y.formatRelativeTime:e(Rt))(h.original.occurredAt)),1)])]),"category-cell":t(({row:h})=>[a(T,{color:e(Ct)(h.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(Q,{name:e(Ct)(h.original.category).icon,class:"size-3"},null,8,["name"]),d(" "+c(e(Ct)(h.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":t(({row:h})=>[n("div",null,[n("div",sl,[d(c(h.original.label)+" ",1),h.original.source==="auto"?(s(),f(Q,{key:0,name:"i-lucide-sparkles",class:"size-3 text-muted",title:"Automatically detected"})):R("",!0)]),h.original.description?(s(),r("div",nl,c(h.original.description),1)):R("",!0)])]),"environment-cell":t(({row:h})=>[h.original.environment?(s(),f(T,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.original.environment),1)]),_:2},1024)):(s(),r("span",al,"All"))]),"actions-cell":t(({row:h})=>[U.canEdit?(s(),r("div",ol,[a(O,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:j=>v(h.original)},null,8,["onClick"]),a(O,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:j=>A(h.original)},null,8,["onClick"])])):R("",!0)]),_:1},8,["data"])],64)),a(H,{open:e(M),"onUpdate:open":P[0]||(P[0]=h=>W(M)?M.value=h:null),"project-id":U.projectId,marker:e(D),environments:U.environments,onSaved:P[1]||(P[1]=h=>C("changed"))},null,8,["open","project-id","marker","environments"]),a(ue,null,{default:t(()=>[a(B,{open:e(_),title:"Delete marker","onUpdate:open":P[3]||(P[3]=h=>_.value=h)},{body:t(()=>[n("p",null,[P[4]||(P[4]=d(" Delete marker ",-1)),e(b)?(s(),f(g,{key:0,marker:e(b),class:"inline-flex align-middle"},null,8,["marker"])):R("",!0),P[5]||(P[5]=d("? This can't be undone. ",-1))])]),footer:t(()=>[a(O,{color:"neutral",variant:"ghost",label:"Cancel",onClick:P[2]||(P[2]=h=>_.value=!1)}),a(O,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:p})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),rl=Object.assign(ll,{__name:"ProjectTimeline"}),il={class:"flex flex-col h-full overflow-y-auto gap-4"},cl={key:0,class:"pb-0 space-y-4"},ul={key:0,class:"text-gray-600"},dl={key:1,class:"flex flex-wrap gap-1 mt-2"},ml={class:"flex flex-wrap items-center gap-3 mb-4"},pl={class:"inline-flex items-center gap-1"},gl=["onClick"],fl={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"},_l={class:"text-sm text-primary-700 dark:text-primary-300"},vl={key:1,class:"text-xs text-primary-500"},yl=["checked","onClick"],hl={class:"flex items-center gap-2"},xl=["href","onClick"],bl={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},kl={class:"inline-flex items-center gap-1"},$l={key:0,class:"flex items-center gap-1"},Cl={class:"text-xs text-gray-600"},Tl={key:0,class:"flex items-center gap-1 flex-wrap"},jl={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Sl={key:1,class:"text-xs text-gray-500"},wl={class:"space-y-1"},Rl={class:"flex justify-end gap-2"},Dl={key:2,class:"text-center py-8 text-gray-500"},zl={class:"text-xs text-gray-400 max-w-sm"},Al={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Ul={class:"flex flex-wrap items-center gap-3"},Il={class:"text-xl font-semibold inline-flex items-center gap-1"},Ml={class:"font-medium"},Fl={class:"mt-1"},Pl={key:0,class:"text-red-600 font-medium"},El={key:1,class:"text-green-600 font-medium"},Bl={key:2,class:"text-gray-500"},Vl={key:2,class:"text-center py-8 text-red-500"},Ll={key:3,class:"text-center py-8 text-gray-500"},Nl={class:"flex items-center justify-between"},Ol={class:"text-xl font-semibold inline-flex items-center gap-1"},Kl={class:"space-y-4"},ql={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Hl={key:0,class:"text-center py-4 text-gray-500"},Ql={key:1,class:"space-y-4"},Jl={class:"flex gap-4 text-sm"},Gl={key:0,class:"text-gray-400"},Xl={key:0,class:"text-gray-400"},Yl={key:1,class:"text-gray-400"},Wl={key:1,class:"text-gray-400"},Zl={key:0,class:"text-gray-400"},er={key:0,class:"text-gray-400"},tr={key:2,class:"text-center py-8 text-gray-500"},sr={key:3,class:"text-center py-8 text-gray-500"},nr={class:"flex items-center justify-between"},ar={class:"text-sm text-gray-600 inline-flex items-center gap-1"},or={class:"space-y-4"},lr={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},rr={key:0,class:"text-center py-8 text-gray-500"},ir={key:1,class:"space-y-4"},cr={class:"space-y-2"},ur={class:"flex flex-wrap gap-4 text-sm"},dr={key:3,class:"text-sm text-gray-500"},mr={class:"flex flex-wrap gap-4 text-sm"},pr={key:0,class:"text-gray-400"},gr={key:0,class:"text-gray-400"},fr={key:1,class:"text-gray-400"},_r={key:1,class:"text-gray-400"},vr={key:0,class:"text-gray-400"},yr={key:0,class:"text-gray-400"},hr={key:2,class:"text-center py-8 text-gray-500"},xr={key:3,class:"text-center py-8 text-gray-500"},br={class:"flex items-center justify-between"},kr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},$r={key:0,class:"space-y-2"},Cr={class:"font-medium text-sm"},Tr={class:"text-xs text-muted flex items-center gap-2"},jr={key:0,class:"italic"},Sr={key:1,class:"text-xs text-muted italic"},wr={key:1,class:"text-center py-8 text-muted text-sm"},Rr={class:"space-y-4"},Dr={class:"text-sm text-gray-600 dark:text-gray-400"},zr={class:"block text-sm font-medium mb-1"},Ar={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Ei=ie({__name:"index",async setup(U){let $,k;const C=Fs(),x=Ps(),m=C.params.id,{data:i,refresh:M}=([$,k]=be(()=>ke(`/api/projects/${m}`,"$NX9Zy2qnH1")),$=await $,k(),$);Es(N(()=>({title:`${i.value?.label||i.value?.name||"Project"} — Piwi Dashboard`})));const D=we(),z=I(null),v=I(null),{isAdmin:_,isReporter:b}=Nt(),A=jt(),p=N(()=>!A.public.authEnabled||_.value),y=p,P=I(!1),O=I(""),S=I(!1),g=N(()=>O.value===i.value?.name);async function T(){if(g.value){S.value=!0;try{await $fetch(`/api/projects/${m}`,{method:"DELETE"}),D.add({title:"Project deleted",color:"success"}),await Vs(),await x.push("/")}catch(u){const o=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;D.add({title:"Delete failed",description:o||"An error occurred",color:"error"}),S.value=!1}}}yn(M);async function Q(u){v.value=null,z.value=u;try{await $fetch(`/api/test-runs/${u}`,{method:"DELETE"}),D.add({title:"Test run deleted",color:"success"}),await M()}catch(o){const E=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;D.add({title:"Delete failed",description:E||"An error occurred",color:"error"})}finally{z.value=null}}const w=I([]),H=I([]),B=I([]),ue=N(()=>{const u=new Map(w.value.map(E=>[E.id,E])),o=[];for(const E of H.value){if(E.role==="administrator")continue;const J=u.get(E.id);o.push({id:E.id,username:E.username,name:E.name??null,role:E.role,global:J?.global??!1,hasAccess:!!J})}for(const E of w.value)E.role==="administrator"&&o.push({...E,hasAccess:!0});return o}),ge=N(()=>{const u=w.value.filter(E=>E.role!=="administrator"&&!E.global).map(E=>E.id).sort(),o=[...B.value].sort();return JSON.stringify(u)!==JSON.stringify(o)});ve(()=>i.value?.id,async u=>{if(!(!u||!_.value))try{const[o,E]=await Promise.all([$fetch(`/api/projects/${m}/members`),$fetch("/api/users")]);w.value=o.users,H.value=E.users,B.value=o.users.filter(J=>J.role!=="administrator"&&!J.global).map(J=>J.id)}catch{w.value=[],H.value=[],B.value=[]}},{immediate:!0});function h(u){const o=B.value.indexOf(u);o>=0?B.value.splice(o,1):B.value.push(u)}async function j(){try{await $fetch(`/api/projects/${m}/members`,{method:"PUT",body:{userIds:B.value}}),D.add({title:"Members updated",color:"success"});const u=await $fetch(`/api/projects/${m}/members`);w.value=u.users}catch(u){const o=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;D.add({title:"Update failed",description:o||"An error occurred",color:"error"})}}const q=I("test-runs"),de=I(0),Re=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","quarantine","timeline","members"],me=C.query.tab;typeof me=="string"&&Re.includes(me)&&(q.value=me),ve(q,u=>{C.query.tab!==u&&Re.includes(u)&&x.replace({query:{...C.query,tab:u}})});const ye=N(()=>i.value?.testRuns?.some(u=>u.failedTests>0)??!1),pe=N(()=>[{label:`Test runs (${Oe.value.length})`,icon:"i-lucide-play-circle",value:"test-runs",slot:"test-runs"},...ye.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${K.value!=null?` (${K.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:"Quarantine",icon:"i-lucide-shield-alert",value:"quarantine",slot:"quarantine"},{label:`Timeline${X.value.length?` (${X.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"},..._.value?[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]:[]]),Be=N(()=>pe.value.find(u=>u.value===q.value)?.icon),ee=I([]),dt=u=>ee.value.includes(u);function mt(u){const o=ee.value.indexOf(u);if(o>=0)ee.value.splice(o,1);else{if(ee.value.length>=2){D.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}ee.value.push(u)}}const De=I(null);function Ve(){ee.value.length===2&&(De.value=[ee.value[0],ee.value[1]],q.value="compare")}const ae=I([]),he=I(!0),Le=N(()=>{const u=new Set;for(const o of i.value?.testRuns||[])o.environment&&u.add(o.environment);return[...u].sort()});function Ne(u){const o=ae.value.indexOf(u);o===-1?ae.value.push(u):ae.value.splice(o,1)}function pt(u){return ae.value.includes(u)}const Oe=N(()=>{let u=i.value?.testRuns||[];return he.value&&(u=u.filter(o=>o.isFullRun!==!1)),ae.value.length===0?u:u.filter(o=>o.environment&&ae.value.includes(o.environment))}),Ke=N(()=>ae.value.length===1?ae.value[0]:void 0),{data:L,refresh:F}=([$,k]=be(()=>ke(`/api/projects/${m}/markers`,{default:()=>({markers:[]})},"$3gm0grYTFL")),$=await $,k(),$),X=N(()=>L.value?.markers??[]),gt=N(()=>!A.public.authEnabled||_.value||b.value),Ge=N(()=>ae.value.length===0?X.value:X.value.filter(u=>u.environment==null||ae.value.includes(u.environment))),ze=I(null);function Xe(u){ze.value=u,q.value="timeline"}const Ye=N(()=>{const u=i.value?.testRuns||[];return he.value?u.filter(o=>o.isFullRun!==!1):u});function Ae(u){if(u.isFullRun!==!1)return"Full run — the complete test suite ran";const o=[],E=u.filterDetails?.grep?.trim(),J=u.filterDetails?.grepInvert?.trim(),fe=u.filterDetails?.files;return E&&E!==".*"&&o.push(`grep: ${E}`),J&&o.push(`grep-invert: ${J}`),fe?.length&&o.push(`files: ${fe.join(", ")}`),o.length?`Partial run — ${o.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const ft=[{accessorKey:"select",header:""},{accessorKey:"id",header:V("Run")},{accessorKey:"status",header:V("Status")},{accessorKey:"isFullRun",header:"Scope"},{id:"browsers",accessorFn:u=>u.browsers,header:""},{accessorKey:"startTime",header:V("Started")},{accessorKey:"environment",header:V("Environment")},{accessorKey:"metadata",header:"Branch / Commit"},{accessorKey:"duration",header:V("Test status / Dur.")},{accessorKey:"reports",header:"Reports"},{id:"actions",header:"Actions"}],K=I(null),Y=I(""),xe=I(""),ts=N(()=>{const u={};return Y.value&&(u.from=Y.value),xe.value&&(u.to=xe.value),u}),_t=I(null),vt=I(!1),Ue=I(null),yt=I(!1),We=I(!1),ss=N(()=>vt.value&&_t.value===null);ve([q,ts,he],async([u,o])=>{if(u!=="performance")return;vt.value=!0,Ue.value||(We.value=!0);const E=new URLSearchParams(o).toString(),J=he.value?`${E?"&":""}fullRunsOnly=true`:"",fe=E||J?`?${E}${J}`:"";_t.value=await $fetch(`/api/projects/${m}/performance${fe}`).catch(_e=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",_e),null)),vt.value=!1,We.value&&(yt.value=!1,Ue.value=await $fetch(`/api/projects/${m}/slow-tests`).catch(_e=>(yt.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",_e),null)),We.value=!1)},{immediate:!0});const ns=[{accessorKey:"title",header:V("Test case")},{accessorKey:"avgDuration",header:V("Avg duration")},{accessorKey:"maxDuration",header:V("Max")},{accessorKey:"minDuration",header:V("Min")},{accessorKey:"latestDuration",header:V("Latest")},{accessorKey:"trend",header:V("Trend")},{accessorKey:"runCount",header:V("Runs")}];function as(u){const o=rt(u.startTime,{dateOnly:!0}),E=u.metadata?.scm?.commit?` (${u.metadata.scm.commit.substring(0,7)})`:"";return`Run #${u.id} — ${o}${E}`}const ce=N(()=>i.value?.testRuns?[...i.value.testRuns].reverse().map(u=>({label:as(u),value:u.id})):[]),te=I(void 0),se=I(void 0),zt=N(()=>C.query.runA?Number(C.query.runA):null),At=N(()=>C.query.runB?Number(C.query.runB):null);ve(ce,u=>{if(zt.value){const o=u.find(E=>E.value===zt.value);o&&(te.value=o)}if(At.value){const o=u.find(E=>E.value===At.value);o&&(se.value=o)}},{immediate:!0}),ve(De,u=>{if(u){const o=ce.value.find(J=>J.value===u[0]),E=ce.value.find(J=>J.value===u[1]);o&&(te.value=o),E&&(se.value=E),De.value=null}});function Ut(){ce.value.length>=2&&(te.value=ce.value[1],se.value=ce.value[0])}const ht=I(null),xt=I(null),Ze=I(!1);async function os(){const u=te.value,o=se.value;if(!(!u?.value&&!o?.value)){Ze.value=!0;try{const E=[];u?.value&&E.push(u.value),o?.value&&E.push(o.value);const J=await Promise.all(E.map(_e=>$fetch(`/api/test-runs/${_e}/summary`))),fe=new Map;for(const _e of J)fe.set(_e.id,_e);ht.value=u?.value?fe.get(u.value)??null:null,xt.value=o?.value?fe.get(o.value)??null:null}catch{ht.value=null,xt.value=null}finally{Ze.value=!1}}}ve([te,se],()=>{os()});const{comparisonData:et,comparisonSummary:Z}=vn(ht,xt),It=[{accessorKey:"title",header:V("Test case")},{accessorKey:"statusA",header:V("Status A")},{accessorKey:"statusB",header:V("Status B")},{accessorKey:"durationA",header:V("Duration A")},{accessorKey:"durationB",header:V("Duration B")},{accessorKey:"delta",header:V("Delta")},{accessorKey:"percentChange",header:V("Change")}];return(u,o)=>{const E=As,J=Us,fe=qn,_e=Ks,ls=Hs,rs=Ht,is=Wn,cs=Pe,us=ra,Mt=Gs,ds=Xs,Ie=He,le=$e,ms=Ys,bt=Me,ps=Wt,gs=Ws,ne=Ce,fs=Zs,je=en,_s=tn,tt=Ee,vs=Ns,ys=Te,qe=Qe,hs=va,xs=za,bs=Ja,kt=Kt,Ft=ut,ks=ao,$s=ct,Cs=_o,st=ln,Ts=rn,js=Co,Ss=Vo,ws=mn,Rs=rl,Ds=_n,zs=qs,Pt=Dt,Et=wt;return s(),r(G,null,[a(zs,{id:"project-detail"},{header:t(()=>[a(ls,null,{leading:t(()=>[a(E),a(J,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(i)?.label||e(i)?.name||"Project"}]},null,8,["items"])]),right:t(()=>[a(_e,{size:"sm",actions:[...e(p)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{O.value="",P.value=!0}}]:[],...e(y)?[{label:"Import",icon:"i-lucide-import",variant:"outline",to:`/projects/${e(m)}/import`}]:[],{label:"Edit",icon:"i-lucide-pencil",variant:"outline",to:`/projects/${e(m)}/edit`},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>e(M)()}]},{leading:t(()=>[a(fe,{"project-id":parseInt(e(m)),"project-label":e(i)?.label||e(i)?.name},null,8,["project-id","project-label"])]),_:1},8,["actions"])]),_:1})]),body:t(()=>[n("div",il,[e(i)?.description||e(i)?.tags&&e(i).tags.length>0?(s(),r("div",cl,[e(i)?.description?(s(),r("p",ul,c(e(i).description),1)):R("",!0),e(i)?.tags&&e(i).tags.length>0?(s(),r("div",dl,[(s(!0),r(G,null,oe(e(i).tags,l=>(s(),f(rs,{key:l.id,text:l.text,color:l.color},null,8,["text","color"]))),128))])):R("",!0)])):R("",!0),a(is,{"project-id":e(m)},null,8,["project-id"]),a(cs,{modelValue:e(q),"onUpdate:modelValue":o[0]||(o[0]=l=>W(q)?q.value=l:null),items:e(pe),icon:e(Be),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),a(Ds,{modelValue:e(q),"onUpdate:modelValue":o[14]||(o[14]=l=>W(q)?q.value=l:null),items:e(pe),size:"sm",class:"p-1",ui:{list:"max-sm:hidden overflow-x-auto",trigger:"shrink-0"}},{"test-runs":t(()=>[e(i)?.testRuns&&e(i).testRuns.length>0?(s(),f(Mt,{key:0,title:"Run trend",subtitle:`Test run statistics over time for ${e(i)?.label||e(i)?.name}`,help:"project.runs-trend"},{default:t(()=>[a(us,{"test-runs":e(Ye),height:200,markers:e(Ge),onMarkerClick:Xe},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):R("",!0),a(qe,{class:"mt-4"},{default:t(()=>[n("div",ml,[n("div",pl,[a(ds,{modelValue:e(he),"onUpdate:modelValue":o[1]||(o[1]=l=>W(he)?he.value=l:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),a(Ie,{topic:"project.run-scope"})]),e(Le).length>0?(s(),r(G,{key:0},[o[21]||(o[21]=n("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(s(!0),r(G,null,oe(e(Le),l=>(s(),r("button",{key:l,type:"button",class:re(["text-xs font-medium px-2 py-1 rounded border cursor-pointer focus:outline-none transition-colors",pt(l)?"bg-blue-100 text-blue-700 border-blue-300 dark:bg-blue-900/40 dark:text-blue-300 dark:border-blue-700":"bg-zinc-100 text-zinc-500 border-zinc-200 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-400 dark:border-zinc-700 dark:hover:bg-zinc-700"]),onClick:Se=>Ne(l)},c(l),11,gl))),128)),e(ae).length>0?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filter",onClick:o[2]||(o[2]=l=>ae.value=[])})):R("",!0)],64)):R("",!0)]),e(ee).length>0?(s(),r("div",fl,[n("span",_l,c(e(ee).length)+" run"+c(e(ee).length>1?"s":"")+" selected ",1),e(ee).length===2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:Ve})):(s(),r("span",vl," Select another run to compare ")),a(le,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[3]||(o[3]=l=>ee.value=[])})])):R("",!0),e(Oe).length>0?(s(),f(tt,{key:1,data:e(Oe),columns:ft,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:l})=>[n("input",{type:"checkbox",checked:dt(l.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Lt(Se=>mt(l.original.id),["stop"])},null,8,yl)]),"id-cell":t(({row:l})=>[n("div",hl,[n("a",{href:`/test-runs/${l.original.id}`,class:"text-primary hover:underline font-medium",onClick:Lt(Se=>("navigateTo"in u?u.navigateTo:e(St))(`/test-runs/${l.original.id}`),["prevent"])}," Run #"+c(l.original.id),9,xl),l.original.label?(s(),r("span",bl,c(l.original.label),1)):R("",!0)])]),"status-cell":t(({row:l})=>[a(ms,{status:l.original.status},null,8,["status"])]),"isFullRun-header":t(()=>[n("span",kl,[o[22]||(o[22]=d("Scope ",-1)),a(Ie,{topic:"run.partial"})])]),"isFullRun-cell":t(({row:l})=>[a(ps,{text:Ae(l.original)},{default:t(()=>[a(bt,{name:l.original.isFullRun===!1?"i-lucide-list-filter":"i-lucide-list-checks",class:re(["size-4 shrink-0 cursor-help",l.original.isFullRun===!1?"text-amber-500":"text-green-500"])},null,8,["name","class"])]),_:2},1032,["text"])]),"browsers-cell":t(({row:l})=>[l.original.browsers?.length?(s(),r("div",$l,[(s(!0),r(G,null,oe(l.original.browsers,Se=>(s(),f(gs,{key:Se,browser:{projectName:Se},size:"sm"},null,8,["browser"]))),128))])):R("",!0)]),"startTime-cell":t(({row:l})=>[n("span",Cl,c(("prettyDateFormat"in u?u.prettyDateFormat:e(rt))(l.original.startTime)),1)]),"environment-cell":t(({row:l})=>[l.original.environment?(s(),f(ne,{key:0,color:"info",variant:"subtle",size:"sm"},{default:t(()=>[d(c(l.original.environment),1)]),_:2},1024)):R("",!0)]),"metadata-cell":t(({row:l})=>[l.original.metadata?.scm?(s(),r("div",Tl,[l.original.metadata.scm.branch?(s(),r("span",jl,c(l.original.metadata.scm.branch),1)):R("",!0),l.original.metadata.scm.commit?(s(),r("code",Sl,c(l.original.metadata.scm.commit.substring(0,7)),1)):R("",!0)])):R("",!0)]),"duration-cell":t(({row:l})=>[n("div",wl,[a(fs,{passed:l.original.passedTests,failed:l.original.failedTests,skipped:l.original.skippedTests,flaky:l.original.flakyTests,"did-not-run":l.original.didNotRunTests??0,total:l.original.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),a(je,{ms:l.original.duration,class:"text-xs text-gray-500"},null,8,["ms"])])]),"reports-cell":t(({row:l})=>[a(_s,{reports:l.original.reports},null,8,["reports"])]),"actions-header":t(()=>[...o[23]||(o[23]=[n("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":t(({row:l})=>[n("div",Rl,[a(le,{to:`/test-runs/${l.original.id}`,size:"sm",variant:"outline"},{default:t(()=>[...o[24]||(o[24]=[d(" View ",-1)])]),_:1},8,["to"]),a(le,{size:"sm",color:"error",variant:"soft",icon:"i-lucide-trash-2",loading:e(z)===l.original.id,onClick:Se=>v.value=l.original.id},{default:t(()=>[...o[25]||(o[25]=[d(" Delete ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data"])):e(i)?.testRuns&&e(i).testRuns.length>0?(s(),r("div",Dl," No test runs match the selected environment filter. ")):(s(),f(ys,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:t(()=>[n("p",zl,[o[27]||(o[27]=d(" Point the reporter's ",-1)),o[28]||(o[28]=n("code",{class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},"projectName",-1)),o[29]||(o[29]=d(" at ",-1)),n("code",Al,c(e(i)?.name),1),o[30]||(o[30]=d(" to send results here — see the ",-1)),a(vs,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:t(()=>[...o[26]||(o[26]=[d("reporter docs",-1)])]),_:1}),o[31]||(o[31]=d(" for setup instructions. ",-1))])]),_:1}))]),_:1})]),"failure-clusters":t(()=>[e(q)==="failure-clusters"?(s(),r(G,{key:0},[(s(),f(hs,{key:`sug-${e(de)}`,"project-id":String(e(m)),onMerged:o[4]||(o[4]=l=>de.value++)},null,8,["project-id"])),(s(),f(xs,{key:e(de),"project-id":String(e(m))},null,8,["project-id"]))],64)):R("",!0)]),"flaky-tests":t(()=>[e(q)==="flaky-tests"?(s(),f(bs,{key:0,"project-id":String(e(m)),environment:e(Ke),"project-name":e(i)?.name},null,8,["project-id","environment","project-name"])):R("",!0)]),performance:t(()=>[n("div",Ul,[o[32]||(o[32]=n("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),a(kt,{modelValue:e(Y),"onUpdate:modelValue":o[5]||(o[5]=l=>W(Y)?Y.value=l:null),type:"date",size:"sm",placeholder:"From",class:"w-40"},null,8,["modelValue"]),o[33]||(o[33]=n("span",{class:"text-sm text-muted"},"to",-1)),a(kt,{modelValue:e(xe),"onUpdate:modelValue":o[6]||(o[6]=l=>W(xe)?xe.value=l:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(Y)||e(xe)?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[7]||(o[7]=l=>{Y.value="",xe.value=""})})):R("",!0)]),a(Mt,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:t(()=>[e(ss)?(s(),f(Ft,{key:0,text:"Loading chart…"})):(s(),f(ks,{key:1,data:e(_t)||[],height:350,markers:e(Ge),onMarkerClick:Xe},null,8,["data","markers"]))]),_:1}),a(qe,null,{header:t(()=>[n("h2",Il,[o[34]||(o[34]=d(" Slowest tests ",-1)),a(Ie,{topic:"project.slowest-tests"})]),o[35]||(o[35]=n("p",{class:"text-sm text-gray-600 mt-1"},"Top 20 slowest test cases across recent runs",-1))]),default:t(()=>[e(We)&&e(Ue)===null?(s(),f(Ft,{key:0,text:"Loading…"})):e(Ue)&&e(Ue).length>0?(s(),f(tt,{key:1,data:e(Ue),columns:ns,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:l})=>[n("div",null,[n("div",Ml,c(l.original.title),1),n("div",Fl,[a($s,{"file-path":l.original.filePath,"project-key":e(m),"project-name":e(i)?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"trend-cell":t(({row:l})=>[l.original.trend==="slower"?(s(),r("span",Pl,"▲ Slower")):l.original.trend==="faster"?(s(),r("span",El,"▼ Faster")):(s(),r("span",Bl,"— Stable"))]),_:1},8,["data"])):e(yt)?(s(),r("div",Vl," Couldn't load the slowest tests — try refreshing. ")):(s(),r("div",Ll,"No slow test data available yet."))]),_:1}),a(Cs,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"]),a(qe,null,{header:t(()=>[n("div",Nl,[n("div",null,[n("h2",Ol,[o[36]||(o[36]=d(" Run comparison ",-1)),a(Ie,{topic:"project.run-compare"})]),o[37]||(o[37]=n("p",{class:"text-sm text-gray-600 mt-1"},"Compare duration changes between two runs",-1))]),e(ce).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Compare latest vs previous",onClick:Ut})):R("",!0)])]),default:t(()=>[n("div",Kl,[n("div",ql,[n("div",null,[o[38]||(o[38]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),a(st,{modelValue:e(te),"onUpdate:modelValue":o[8]||(o[8]=l=>W(te)?te.value=l:null),items:e(ce),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[o[39]||(o[39]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),a(st,{modelValue:e(se),"onUpdate:modelValue":o[9]||(o[9]=l=>W(se)?se.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Ze)?(s(),r("div",Hl,[a(bt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[40]||(o[40]=d(" Loading run data… ",-1))])):e(te)&&e(se)&&e(et).length>0?(s(),r("div",Ql,[n("div",Jl,[a(ne,{color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).improved)+" improved",1)]),_:1}),a(ne,{color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).regressed)+" regressed",1)]),_:1}),a(ne,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).unchanged)+" unchanged",1)]),_:1})]),a(tt,{data:e(et),columns:It,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:l})=>[l.original.statusA?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",Gl,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",Xl,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(je,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",Yl,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(je,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",Wl,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",Zl,"—")):(s(),r("span",{key:1,class:re(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(c(l.original.delta>0?"+":""),1),a(je,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",er,"—")):(s(),r("span",{key:1,class:re(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(l.original.percentChange>0?"+":"")+c(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(s(),r("div",tr," Select two runs to compare their performance. ")):(s(),r("div",sr," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":t(()=>[a(Ts,{"project-id":e(m),"project-name":e(i)?.name,"sync-query":"",onTotal:o[10]||(o[10]=l=>K.value=l)},null,8,["project-id","project-name"])]),compare:t(()=>[a(qe,null,{header:t(()=>[n("div",nr,[n("p",ar,[o[41]||(o[41]=d(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),a(Ie,{topic:"project.compare"})]),e(ce).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Latest vs previous",onClick:Ut})):R("",!0)])]),default:t(()=>[n("div",or,[n("div",lr,[n("div",null,[o[42]||(o[42]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),a(st,{modelValue:e(te),"onUpdate:modelValue":o[11]||(o[11]=l=>W(te)?te.value=l:null),items:e(ce),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[o[43]||(o[43]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),a(st,{modelValue:e(se),"onUpdate:modelValue":o[12]||(o[12]=l=>W(se)?se.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Ze)?(s(),r("div",rr,[a(bt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[44]||(o[44]=d(" Loading run data… ",-1))])):e(te)&&e(se)&&e(et).length>0?(s(),r("div",ir,[n("div",cr,[n("div",ur,[o[45]||(o[45]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(Z).newFailures>0?(s(),f(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).newFailures)+" new failure"+c(e(Z).newFailures>1?"s":""),1)]),_:1})):R("",!0),e(Z).recovered>0?(s(),f(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).recovered)+" recovered ",1)]),_:1})):R("",!0),e(Z).stillFailing>0?(s(),f(ne,{key:2,color:"warning",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).stillFailing)+" still failing ",1)]),_:1})):R("",!0),e(Z).newFailures===0&&e(Z).recovered===0&&e(Z).stillFailing===0?(s(),r("span",dr,"No status changes")):R("",!0)]),n("div",mr,[o[46]||(o[46]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(Z).regressed>0?(s(),f(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).regressed)+" regressed ",1)]),_:1})):R("",!0),e(Z).improved>0?(s(),f(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).improved)+" improved ",1)]),_:1})):R("",!0),a(ne,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Z).unchanged)+" unchanged ",1)]),_:1})])]),a(tt,{data:e(et),columns:It,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:l})=>[l.original.statusA?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",pr,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",gr,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(je,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",fr,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(je,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",_r,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",vr,"—")):(s(),r("span",{key:1,class:re(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(c(l.original.delta>0?"+":""),1),a(je,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",yr,"—")):(s(),r("span",{key:1,class:re(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(l.original.percentChange>0?"+":"")+c(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(s(),r("div",hr," Select two runs to compare test results. ")):(s(),r("div",xr," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":t(()=>[a(js,{"project-id":String(e(m))},null,8,["project-id"])]),quarantine:t(()=>[a(Ss,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"])]),members:t(()=>[a(qe,null,{header:t(()=>[n("div",br,[n("p",kr,[o[47]||(o[47]=d(" Users with access to this project ",-1)),a(Ie,{topic:"project.members"})]),a(le,{label:"Save changes",icon:"i-lucide-check",size:"sm",disabled:!e(ge),onClick:j},null,8,["disabled"])])]),default:t(()=>[e(ue).length>0?(s(),r("div",$r,[(s(!0),r(G,null,oe(e(ue),l=>(s(),r("div",{key:l.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[n("div",null,[n("div",Cr,c(l.name||l.username),1),n("div",Tr,[n("span",null,"@"+c(l.username),1),a(ne,{color:l.role==="administrator"?"primary":l.role==="reporter"?"info":"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(l.role),1)]),_:2},1032,["color"]),l.global?(s(),r("span",jr,"Global access")):R("",!0)])]),l.role!=="administrator"?(s(),f(ws,{key:0,"model-value":e(B).includes(l.id),disabled:l.global,title:l.global?"Has global access — remove global assignment first":"",onChange:Se=>h(l.id)},null,8,["model-value","disabled","title","onChange"])):(s(),r("span",Sr,"Admin"))]))),128))])):(s(),r("div",wr,"Loading members…"))]),_:1})]),timeline:t(()=>[a(Rs,{"project-id":Number(e(m)),markers:e(X),environments:e(Le),"can-edit":e(gt),"focus-marker-id":e(ze),onChanged:e(F),onClearFocus:o[13]||(o[13]=l=>ze.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),a(Et,null,{default:t(()=>[a(Pt,{open:e(P),title:"Delete project","onUpdate:open":o[17]||(o[17]=l=>{l||(P.value=!1)})},{body:t(()=>[n("div",Rr,[n("p",Dr,[o[48]||(o[48]=d(" This will permanently delete ",-1)),n("strong",null,c(e(i)?.label||e(i)?.name),1),o[49]||(o[49]=d(" and all its test runs, reports, traces, and failure clusters. This action cannot be undone. ",-1))]),n("div",null,[n("label",zr,[o[50]||(o[50]=d(" Type the project key ",-1)),n("code",Ar,c(e(i)?.name),1),o[51]||(o[51]=d(" to confirm: ",-1))]),a(kt,{modelValue:e(O),"onUpdate:modelValue":o[15]||(o[15]=l=>W(O)?O.value=l:null),placeholder:e(i)?.name,autofocus:"",onKeydown:Bs(T,["enter"])},null,8,["modelValue","placeholder"])])])]),footer:t(()=>[a(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:o[16]||(o[16]=l=>P.value=!1)}),a(le,{color:"error",label:"Delete project",icon:"i-lucide-trash-2",disabled:!e(g),loading:e(S),onClick:T},null,8,["disabled","loading"])]),_:1},8,["open"])]),_:1}),a(Et,null,{default:t(()=>[a(Pt,{open:e(v)!==null,title:"Delete test run","onUpdate:open":o[20]||(o[20]=l=>{l||(v.value=null)})},{body:t(()=>[n("p",null,[o[52]||(o[52]=d(" Are you sure you want to delete ",-1)),n("strong",null,"Run #"+c(e(v)),1),o[53]||(o[53]=d("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:t(()=>[a(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:o[18]||(o[18]=l=>v.value=null)}),a(le,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(z)===e(v),onClick:o[19]||(o[19]=l=>Q(e(v)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Ei as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as Qt}from"./CXEH9OPk.js";import{d as ge,b as gt,o as s,f as w,g as i,i as n,q,k as e,j as o,m as $,t as l,c as a,F as G,O as ut,l as Ie,ak as ct,p as he,v as k,s as ve,D as Ue,_ as Re,J as pt,y as ae,z as es,A as xt,h as D,r as K,K as De,Q as ye,C as Ne,n as He,E as Je,H as me,al as dt,I as ts,R as yt,G as ss,u as Le,w as Me,ah as ns,B as as,ad as ht,a as os,e as ls}from"./Du2W7Jne.js";import{_ as vt}from"./BT3wGCTI.js";import{_ as is}from"./DabzhQB1.js";import{_ as rs}from"./CjPfj7ya.js";import{_ as us,a as cs}from"./5A6ITZXj.js";import{_ as ds,e as ms,b as fs,a as gs,c as ps,d as xs}from"./ryMzSDUj.js";import{_ as ys}from"./DqcKngf3.js";import{_ as Ee}from"./BzRRzmwm.js";import{_ as je}from"./Bm62iDV5.js";import{_ as kt}from"./FaFoMVKo.js";import{_ as nt}from"./-f7BAm1H.js";import{_ as hs}from"./hC_z4G8p.js";import{u as vs,_ as ks}from"./Cnsmicv2.js";import{p as bt,y as bs,n as ws,a as _s,h as wt,m as $s,z as et,A as tt,k as Fe,B as _t,j as st,f as $t,b as Cs,c as Ts,i as ce}from"./DuwtTfO8.js";import{f as Ze}from"./D-c8ZSws.js";import{b as Ct}from"./BicAJ6U8.js";import{u as at}from"./DSqHUrvO.js";import{_ as Rs}from"./A1pj0VnG.js";import{_ as Tt}from"./DrfE8IY0.js";import{_ as zs}from"./4gYNA-d4.js";import{_ as Rt}from"./DJmoLeVt.js";import{_ as Is}from"./CA9B2HE5.js";import{_ as zt}from"./b-GYfcrQ.js";import{u as Ss}from"./DeY2JkR2.js";import{_ as Fs}from"./CAvY22RE.js";import{_ as It}from"./CzAPFPpL.js";import{_ as St}from"./C1gTN4Q8.js";import{_ as Ds}from"./C0_yH0N7.js";import{_ as ot}from"./Cus22Ud3.js";import{_ as Ft}from"./CJFtzlQ4.js";import{_ as js}from"./BY0HxR3t.js";import{_ as Dt}from"./BUkim3TM.js";import{u as Ae}from"./B8zkOmwo.js";import{_ as Ps}from"./CeG9pBAD.js";import{_ as Bs}from"./Bnxf8nbZ.js";import{_ as Ns}from"./BrQEE053.js";import{u as Ms}from"./C2hkrSey.js";import{u as As,s as Us}from"./H94BMf3L.js";import"./KyA_4Ks-.js";import"./AbmKWFQQ.js";import"./L3kAWB2a.js";import"./Dpd16JVI.js";import"./UdR3DBPS.js";import"./Nn93e_Mz.js";import"./DmkUdSS4.js";import"./B3obW6cw.js";import"./CxyAzHr3.js";import"./pQqGiNch.js";import"./BjaRappk.js";import"./D7W_4Sqc.js";import"./DsesNydr.js";import"./DfgOx_ou.js";import"./Dy-TJ0Mt.js";import"./B99fbi73.js";import"./CIrFl3MW.js";const Ls={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Es={class:"flex items-center gap-3 min-w-0"},Os={class:"text-sm font-semibold truncate flex items-center gap-1"},Ks={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Ws={class:"text-xs text-zinc-500 tabular-nums whitespace-nowrap"},Hs={class:"text-zinc-700 dark:text-zinc-300"},Vs={class:"text-xs text-emerald-600 dark:text-emerald-400 tabular-nums whitespace-nowrap"},Gs={class:"text-xs text-rose-600 dark:text-rose-400 tabular-nums whitespace-nowrap"},Xs={class:"text-xs text-zinc-500 tabular-nums whitespace-nowrap"},qs={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)"},Ys={class:"text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"},Js={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Zs={class:"space-y-3"},Qs={class:"flex items-start gap-3"},en={class:"flex items-center gap-2.5 min-w-0 flex-1"},tn={class:"min-w-0 flex-1"},sn={class:"flex items-center gap-2"},nn={class:"text-base font-bold shrink-0 flex items-center gap-1"},an={class:"text-xs text-zinc-500 ml-auto whitespace-nowrap"},on={class:"p-2 space-y-1 min-w-32"},ln=["onClick"],rn={class:"grid grid-cols-3 sm:grid-cols-5 gap-2"},un={class:"text-xl font-bold mt-0.5"},cn={class:"relative"},dn={class:"text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400"},mn={class:"text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400"},fn={class:"text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400"},gn={class:"text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"},pn={key:0,class:"flex items-center gap-3"},xn={class:"flex-1 max-w-md"},yn={class:"flex items-center gap-3 text-xs shrink-0"},hn={class:"flex items-center gap-1"},vn={key:0,class:"flex items-center gap-1"},kn={key:1,class:"flex items-center gap-1"},bn={key:2,class:"flex items-center gap-1"},wn={key:0,class:"flex items-center gap-3"},_n={class:"flex-1 min-w-0"},$n={key:1,class:"space-y-1.5 text-sm"},Cn={class:"text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0"},Tn={key:0,class:"flex items-center justify-between gap-2 min-w-0"},Rn={class:"truncate"},zn={class:"text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0"},In={class:"space-y-3 text-sm"},Sn={key:0},Fn={class:"flex flex-wrap gap-1.5"},Dn={key:1,class:"flex items-center gap-1"},jn={key:3},Pn={class:"bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"},Bn={class:"m-0"},Nn=ge({__name:"RunSummary",props:{testRun:{},displayProgress:{},allReports:{},showCustomData:{type:Boolean},finalizing:{type:Boolean},activeFilter:{},totalWastedTime:{}},emits:["update:showCustomData","filter-status","label-updated"],setup(t,{emit:h}){const C=t,F=h,R=gt(),c=xt(),_=D(()=>C.testRun?.storageStats),u=D(()=>!!(C.testRun?.metadata?.ci||C.testRun?.environment||C.testRun?.playwrightVersion||C.testRun?.reporterVersion)),T=D(()=>!!C.testRun?.metadata?.scm),E=D(()=>!!(_.value?.totalFiles||C.finalizing)),N=D(()=>!!(C.testRun?.metadata?.tags?.length||C.testRun?.metadata?.projectDescription||C.testRun?.metadata?.relatedIssue||C.testRun?.metadata?.customData||C.testRun?.links?.length)),{summaryColSpanClass:B,blockColSpanClass:S}=vs(()=>[u,T,E,N].filter(g=>g.value).length),{copy:P,copied:H}=at(),A=K("file-line"),m=K(!1),I=D(()=>C.testRun?.testCases?C.testRun.testCases.filter(g=>g.status==="failed"||g.status==="timedout").map(g=>({filePath:(g.filePath||g.location?.split(":")[0])??"",title:g.title,line:g.location&&parseInt(g.location.split(":")[1]??"",10)||null,projectName:g.browser?.projectName||null})):[]);function x(){return Ct(I.value,{mode:A.value})}async function d(){const g=x();g&&(m.value=!0,await P(g,{toast:"Retry command copied"}),setTimeout(()=>{m.value=!1},2e3))}const f=D(()=>m.value?"Copied!":wt(x()));function U(){const g=C.testRun;if(!g)return"";const z=g.status==="passed"?"✅":g.status==="failed"?"❌":g.status==="running"?"🔄":"⚠️",re=g.label?` — ${g.label}`:"",p=g.project?.label??g.project?.name??"",j=g.totalTests??0,Y=g.passedTests??0,oe=g.failedTests??0,Z=g.skippedTests??0,b=g.didNotRunTests??0,V=g.flakyTests??0,se=_s(g.duration),te=V>0?` · ${V} flaky`:"",xe=b>0?` · ${b} didn't run`:"";return[`*Run #${g.id}*${re}`,`Status: ${z} ${g.status} | Project: ${p}`,`Tests: ${j} total · ${Y} passed · ${oe} failed · ${Z} skipped${xe}${te}`,`Duration: ${se}`].join(`
|
|
2
|
-
`)}const v=K(""),M=K(!1),y=K(!1);let J=!1;const ee=K(null);function ne(){J=!1,v.value=C.testRun?.label??"",M.value=!0,De(()=>ee.value?.focus())}async function Q(){if(y.value)return;if(J){J=!1;return}const g=C.testRun;if(g){y.value=!0;try{await $fetch(`/api/test-runs/${g.id}`,{method:"PATCH",body:{label:v.value||null}}),M.value=!1,F("label-updated")}catch(z){const re=z&&typeof z=="object"&&"data"in z?z.data?.message:"Failed to save label";R.add({title:"Error",description:re||"Failed to save label",color:"error"})}finally{y.value=!1}}}function ie(){J=!0,M.value=!1}function O(g){g.key==="Enter"?Q():g.key==="Escape"&&ie()}return(g,z)=>{const re=ds,p=he,j=ve,Y=ys,oe=Ee,Z=je,b=kt,V=Ue,se=vt,te=Re,xe=pt,we=ms,le=nt,_e=fs,$e=gs,fe=es,ke=ps,be=hs,ze=ks;return s(),w(ze,{"storage-key":"test-run"},{folded:i(()=>[n("div",Ls,[n("div",Es,[o(re,{status:t.testRun?.status??"",size:"sm"},null,8,["status"]),n("span",Os,[$(" Run #"+l(t.testRun?.id)+" ",1),e(M)?(s(),a(G,{key:0},[ut(n("input",{ref_key:"labelInputRef",ref:ee,"onUpdate:modelValue":z[0]||(z[0]=r=>Ie(v)?v.value=r:null),type:"text",placeholder:"Add a label...",class:"inline-block w-40 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:O,onBlur:Q},null,544),[[ct,e(v)]]),e(y)?(s(),w(p,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-zinc-400 animate-spin shrink-0"})):k("",!0)],64)):(s(),a(G,{key:1},[t.testRun?.label?(s(),a("span",{key:0,class:"font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",onClick:ne},"— "+l(t.testRun.label),1)):(s(),a("button",{key:1,class:"text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1",title:"Add a label",onClick:ne}," + label "))],64))]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),w(j,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:i(()=>[o(p,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),$(" "+l(t.testRun.shardsFinished??0)+"/"+l(t.testRun.shardTotal),1)]),_:1},8,["title"])):k("",!0)]),n("div",Ks,[n("span",Ws,[z[12]||(z[12]=$(" T: ",-1)),n("strong",Hs,l(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)]),n("span",Vs,[z[13]||(z[13]=$(" P: ",-1)),n("strong",null,l(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)]),n("span",Gs,[z[14]||(z[14]=$(" F: ",-1)),n("strong",null,l(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)]),n("span",Xs,[z[15]||(z[15]=$(" S: ",-1)),n("strong",null,l(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)]),n("span",qs,[z[16]||(z[16]=$(" DNR: ",-1)),n("strong",null,l(t.testRun?.didNotRunTests??0),1)]),n("span",Ys,[z[17]||(z[17]=$(" Fl: ",-1)),n("strong",null,l(t.testRun?.flakyTests??0),1)]),o(Y,{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"]),o(oe,{ms:t.testRun?.duration,class:"text-xs text-zinc-400"},null,8,["ms"])])])]),default:i(()=>[n("div",Js,[n("div",{class:q(e(B))},[o(le,{class:"shadow-xs h-full"},{default:i(()=>[n("div",Zs,[n("div",Qs,[n("div",en,[o(re,{status:t.testRun?.status??"",size:"md"},null,8,["status"]),n("div",tn,[n("div",sn,[n("h2",nn,[$(" Run #"+l(t.testRun?.id)+" ",1),e(M)?(s(),a(G,{key:0},[ut(n("input",{ref_key:"labelInputRef",ref:ee,"onUpdate:modelValue":z[1]||(z[1]=r=>Ie(v)?v.value=r:null),type:"text",placeholder:"Add a label...",class:"inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:O,onBlur:Q},null,544),[[ct,e(v)]]),e(y)?(s(),w(p,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-zinc-400 animate-spin shrink-0"})):k("",!0)],64)):(s(),a(G,{key:1},[t.testRun?.label?(s(),a("span",{key:0,class:"font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",onClick:ne},"— "+l(t.testRun.label),1)):(s(),a("button",{key:1,class:"text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",title:"Add a label",onClick:ne}," + label "))],64)),o(Z,{topic:"run.summary"})]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),w(j,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:i(()=>[o(p,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),$(" "+l(t.testRun.shardsFinished??0)+"/"+l(t.testRun.shardTotal),1)]),_:1},8,["title"])):k("",!0),t.testRun?.precedingMarker?(s(),w(se,{key:1,text:`This run started after: ${t.testRun.precedingMarker.label}`},{default:i(()=>[o(V,{to:`/projects/${t.testRun.projectId}?tab=timeline`,class:"shrink-0 inline-flex items-center gap-1"},{default:i(()=>[z[18]||(z[18]=n("span",{class:"text-xs text-muted"},"After",-1)),o(b,{marker:t.testRun.precedingMarker,size:"xs"},null,8,["marker"])]),_:1},8,["to"])]),_:1},8,["text"])):k("",!0),n("span",an,l(t.testRun?.project?.label??t.testRun?.project?.name)+" · Started "+l(("prettyDateFormat"in g?g.prettyDateFormat:e(bt))(t.testRun?.startTime)),1),o(se,{text:e(H)?"Copied!":"Copy run summary"},{default:i(()=>[o(te,{size:"xs",variant:"ghost",color:"neutral",icon:e(H)?"i-lucide-check":"i-lucide-clipboard",class:"shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",onClick:z[2]||(z[2]=r=>e(P)(U(),{toast:"Run summary copied"}))},null,8,["icon"])]),_:1},8,["text"]),e(I).length>0?(s(),w(xe,{key:2},{content:i(()=>[n("div",on,[z[20]||(z[20]=n("p",{class:"text-xs font-medium text-zinc-500 px-2 py-1"},"Mode",-1)),(s(),a(G,null,ae(["file-line","grep","file"],r=>n("button",{key:r,class:q(["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800",e(A)===r?"bg-primary/10 text-primary":""]),onClick:Ce=>A.value=r},l(r==="file-line"?"File:line":r==="grep"?"Title (grep)":"File only"),11,ln)),64))])]),default:i(()=>[o(te,{size:"xs",color:"warning",variant:"subtle",icon:e(m)?"i-lucide-check":"i-lucide-play",title:e(f),onClick:z[3]||(z[3]=r=>d())},{default:i(()=>[...z[19]||(z[19]=[$(" Retry ",-1)])]),_:1},8,["icon","title"])]),_:1})):k("",!0),e(I).length>0?(s(),w(we,{key:3,"project-id":t.testRun?.project?.id,"project-label":t.testRun?.project?.label??t.testRun?.project?.name,cases:e(I)},null,8,["project-id","project-label","cases"])):k("",!0)])])])]),n("div",rn,[n("button",{class:q(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="all"?"bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500":"bg-elevated/60 hover:bg-elevated"]),onClick:z[4]||(z[4]=r=>F("filter-status","all"))},[z[21]||(z[21]=n("p",{class:"text-xs font-medium text-zinc-500 uppercase tracking-wider"},"Total",-1)),n("p",un,l(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)],2),n("div",cn,[n("button",{class:q(["rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",t.activeFilter==="passed"?"bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600":"bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"]),onClick:z[5]||(z[5]=r=>F("filter-status","passed"))},[z[22]||(z[22]=n("p",{class:"text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider"}," Passed ",-1)),n("p",dn,l(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)],2),(t.testRun?.flakyTests??0)>0?(s(),a("button",{key:0,class:q(["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:z[6]||(z[6]=r=>F("filter-status","flaky"))},[o(p,{name:"i-lucide-shuffle",class:"size-3"}),$(" "+l(t.testRun?.flakyTests??0),1)],2)):k("",!0)]),n("button",{class:q(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="failed"?"bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600":"bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"]),onClick:z[7]||(z[7]=r=>F("filter-status","failed"))},[z[23]||(z[23]=n("p",{class:"text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider"},"Failed",-1)),n("p",mn,l(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)],2),n("button",{class:q(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="skipped"?"bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500":"bg-elevated/60 hover:bg-elevated"]),onClick:z[8]||(z[8]=r=>F("filter-status","skipped"))},[z[24]||(z[24]=n("p",{class:"text-xs font-medium text-zinc-500 uppercase tracking-wider"},"Skipped",-1)),n("p",fn,l(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)],2),n("button",{class:q(["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:z[9]||(z[9]=r=>F("filter-status","didnotrun"))},[z[25]||(z[25]=n("p",{class:"text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"}," Didn't run ",-1)),n("p",gn,l(t.testRun?.didNotRunTests??0),1)],2)]),n("div",null,[t.testRun?(s(),a("div",pn,[n("div",xn,[o(Y,{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",yn,[n("div",hn,[o(p,{name:"i-lucide-clock",class:"size-3.5 text-zinc-400"}),o(oe,{ms:t.testRun?.duration,class:"font-medium"},null,8,["ms"])]),t.testRun?.avgTestDuration?(s(),a("div",vn,[o(p,{name:"i-lucide-gauge",class:"size-3.5 text-zinc-400"}),z[26]||(z[26]=n("span",{class:"text-zinc-500 hidden sm:inline"},"Avg",-1)),o(oe,{ms:t.testRun.avgTestDuration,class:"font-medium"},null,8,["ms"])])):k("",!0),t.testRun?.p90TestDuration?(s(),a("div",kn,[o(p,{name:"i-lucide-arrow-up-right",class:"size-3.5 text-orange-500"}),z[27]||(z[27]=n("span",{class:"text-zinc-500 hidden sm:inline"},"P90",-1)),o(oe,{ms:t.testRun.p90TestDuration,class:"font-medium text-orange-600 dark:text-orange-400","unit-class":"opacity-60"},null,8,["ms"])])):k("",!0),t.totalWastedTime&&t.totalWastedTime>0?(s(),a("div",bn,[o(p,{name:"i-lucide-clock",class:"size-3.5 text-amber-500"}),z[28]||(z[28]=n("span",{class:"text-zinc-500 hidden sm:inline"},"Wasted",-1)),o(oe,{ms:t.totalWastedTime,class:"font-medium text-amber-600 dark:text-amber-400","unit-class":"opacity-60"},null,8,["ms"])])):k("",!0)])])):k("",!0)])])]),_:1})],2),e(u)?(s(),w(_e,{key:0,ci:t.testRun?.metadata?.ci,environment:t.testRun?.environment,"playwright-version":t.testRun?.playwrightVersion,"reporter-version":t.testRun?.reporterVersion,class:q(e(S))},null,8,["ci","environment","playwright-version","reporter-version","class"])):k("",!0),e(T)?(s(),w($e,{key:1,scm:t.testRun.metadata.scm,class:q(e(S))},null,8,["scm","class"])):k("",!0),e(E)?(s(),w(ke,{key:2,class:q(e(S)),title:"Storage",icon:"i-lucide-database",help:"run.reports",subtitle:e(_)?.totalFiles?`${e(_).totalFiles} files · ${("formatBytes"in g?g.formatBytes:e(Ze))(e(_).totalSize)}`:void 0},{default:i(()=>[t.finalizing?(s(),a("div",wn,[o(p,{name:"i-lucide-upload",class:"size-5 text-info shrink-0 animate-pulse"}),n("div",_n,[z[29]||(z[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-zinc-500"},"Uploading reports & traces…")],-1)),o(fe,{value:null,size:"sm",color:"info",class:"rounded-full animate-pulse"})])])):k("",!0),e(_)?.totalFiles?(s(),a("div",$n,[(s(!0),a(G,null,ae(t.allReports,r=>(s(),a("div",{key:r.label,class:"flex items-center justify-between gap-2 min-w-0"},[o(te,{href:("fileApiUrl"in g?g.fileApiUrl:e(ws))(r.path,null,e(c).app?.baseURL),icon:("reportIcon"in g?g.reportIcon:e(bs))(r.type),target:"_blank",size:"xs",variant:"outline",class:"min-w-0",ui:{label:"truncate"}},{default:i(()=>[$(l(r.label),1)]),_:2},1032,["href","icon"]),n("span",Cn,l(("formatBytes"in g?g.formatBytes:e(Ze))(r.size)),1)]))),128)),e(_).testCaseFilesCount>0?(s(),a("div",Tn,[n("span",Rn,"Test files ("+l(e(_).testCaseFilesCount)+")",1),n("span",zn,l(("formatBytes"in g?g.formatBytes:e(Ze))(e(_).testCaseFilesSize)),1)])):k("",!0)])):k("",!0)]),_:1},8,["class","subtitle"])):k("",!0),e(N)?(s(),w(ke,{key:3,class:q(e(S)),title:"Other",icon:"i-lucide-tags",help:"run.metadata"},{default:i(()=>[n("div",In,[t.testRun.metadata.tags&&t.testRun.metadata.tags.length>0?(s(),a("div",Sn,[n("div",Fn,[(s(!0),a(G,null,ae(t.testRun.metadata.tags,r=>(s(),w(j,{key:r,color:"neutral",variant:"soft",size:"sm"},{default:i(()=>[$(l(r),1)]),_:2},1024))),128))])])):k("",!0),t.testRun.metadata.relatedIssue?(s(),a("p",Dn,[o(p,{name:"i-lucide-link",class:"w-3.5 h-3.5 text-zinc-400 shrink-0"}),n("span",null,l(t.testRun.metadata.relatedIssue),1)])):k("",!0),o(be,{"entity-type":"test_run","entity-id":t.testRun.id,links:t.testRun.links??null,onUpdated:z[10]||(z[10]=r=>g.$emit("label-updated"))},null,8,["entity-id","links"]),t.testRun.metadata.customData?(s(),w(te,{key:2,size:"xs",variant:"ghost",color:"neutral",icon:t.showCustomData?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:z[11]||(z[11]=r=>F("update:showCustomData",!t.showCustomData))},{default:i(()=>[...z[30]||(z[30]=[$(" Custom data ",-1)])]),_:1},8,["icon"])):k("",!0),t.showCustomData&&t.testRun.metadata.customData?(s(),a("div",jn,[n("div",Pn,[n("pre",Bn,l(JSON.stringify(t.testRun.metadata.customData,null,2)),1)])])):k("",!0)])]),_:1},8,["class"])):k("",!0)])]),_:1})}}}),Mn=Object.assign(Nn,{__name:"RunSummary"}),An={key:0,class:"inline-flex items-center gap-1 flex-wrap"},Un=ge({__name:"TestRowBadges",props:{mode:{default:null},isNewRegression:{type:[Boolean,null],default:!1},isNewFlaky:{type:[Boolean,null],default:!1},annotations:{default:null},tags:{default:null},meta:{default:null},maxTags:{default:0}},setup(t){const h=t;function C(T){return T==="fixme"||T==="slow"?"warning":T==="fail"?"error":T==="skip"?"neutral":T==="tag"?"primary":"info"}function F(T){switch(T){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 R(T){return T.type==="tag"?T.description??T.type:T.type}const c=D(()=>(h.annotations??[]).filter(T=>!$s(T.type))),_=D(()=>!!((h.tags?.length??0)>0||h.meta?.owner||h.meta?.priority||h.meta?.feature||h.meta?.link)),u=D(()=>h.mode==="parallel"||h.mode==="serial"||!!h.isNewRegression||!!h.isNewFlaky||c.value.length>0||_.value);return(T,E)=>{const N=ve,B=he,S=Is;return e(u)?(s(),a("div",An,[t.mode==="parallel"?(s(),w(N,{key:0,color:"success",variant:"soft",size:"xs",class:"shrink-0"},{default:i(()=>[...E[0]||(E[0]=[$("parallel",-1)])]),_:1})):k("",!0),t.mode==="serial"?(s(),w(N,{key:1,color:"warning",variant:"soft",size:"xs",class:"shrink-0"},{default:i(()=>[...E[1]||(E[1]=[$("serial",-1)])]),_:1})):k("",!0),t.isNewRegression?(s(),w(N,{key:2,color:"error",variant:"solid",size:"xs",class:"uppercase tracking-wider shrink-0",title:"First run in which this test failed"},{default:i(()=>[...E[2]||(E[2]=[$(" NEW ",-1)])]),_:1})):k("",!0),t.isNewFlaky?(s(),w(N,{key:3,color:"info",variant:"solid",size:"xs",class:"uppercase tracking-wider shrink-0",title:"First run in which this test was flaky"},{default:i(()=>[...E[3]||(E[3]=[$(" FLAKY ",-1)])]),_:1})):k("",!0),(s(!0),a(G,null,ae(e(c),P=>(s(),w(N,{key:`${P.type}:${P.description??""}`,color:C(P.type),variant:"soft",size:"xs",title:P.type!=="tag"?P.description??void 0:void 0,class:"shrink-0 gap-1"},{default:i(()=>[F(P.type)?(s(),w(B,{key:0,name:F(P.type),class:"size-2.5 shrink-0"},null,8,["name"])):k("",!0),$(" "+l(R(P)),1)]),_:2},1032,["color","title"]))),128)),o(S,{tags:t.tags,meta:t.meta,"max-tags":t.maxTags},null,8,["tags","meta","max-tags"])])):k("",!0)}}}),jt=Object.assign(Un,{__name:"TestRowBadges"}),Ln={class:"rounded-lg border border-default bg-default text-sm flex flex-col flex-1 min-h-0"},En={class:"flex items-center justify-end px-3 py-1.5 border-b border-default bg-elevated shrink-0"},On=["disabled","title"],Kn={class:"overflow-y-auto flex-1 min-h-0"},Wn=["onClick"],Hn={key:1,class:"font-medium truncate min-w-0 text-muted"},Vn={class:"flex items-center gap-1.5 sm:gap-2 shrink-0 tabular-nums"},Gn=["title"],Xn={class:"max-sm:sr-only"},qn=["href","title","onClick"],Yn={class:"truncate"},Jn={class:"flex items-center gap-1.5 sm:gap-2 shrink-0 ml-auto"},Zn={key:0,class:"text-xs text-info"},Qn={key:4,class:"inline-flex items-center gap-0.5 text-xs text-amber-600 dark:text-amber-400",title:"Wasted in fixed waits"},ea={key:0,class:"text-center py-8 text-muted"},ta=ge({__name:"TestCasesTree",props:{testCases:{},suites:{},hasFilter:{type:Boolean},highlightedCaseId:{},projectKey:{},projectName:{}},setup(t){const h=t,C=D(()=>{const m=new Map;for(const I of h.suites)m.set(`${I.filePath}${I.suitePath.join("")}`,I);return m});function F(m){return m==="timedOut"||m==="timedout"?"failed":m}const R=["failed","passed","skipped","didnotrun","running"];function c(m){return R.filter(I=>m[I]>0).map(I=>({key:I,count:m[I],label:Fe(I)}))}function _(m){const I={passed:0,failed:0,skipped:0,didnotrun:0,running:0,total:0};for(const x of m){const d=F(x.status);d in I&&I[d]++,I.total++}return I}const u=K(new Set),T=D(()=>u.value.size===0);function E(m){return h.hasFilter?!0:!u.value.has(m)}function N(m){if(h.hasFilter)return;const I=new Set(u.value);I.has(m)?I.delete(m):I.add(m),u.value=I}function B(){const m=[],I=new Map;for(const x of h.testCases){const d=x.filePath??"unknown";I.has(d)||I.set(d,[]),I.get(d).push(x)}for(const[x,d]of I){m.push(`file:${x}`);const f=new Set;for(const U of d){const v=U.suitePath??[];for(let M=1;M<=v.length;M++)f.add(`group:${x}${v.slice(0,M).join("")}`)}for(const U of f)m.push(U)}return m}function S(){u.value=new Set(B())}function P(){u.value=new Set}function H(m,I,x,d,f){const U=I.filter(y=>(y.suitePath??[]).length===d.length),v=I.filter(y=>(y.suitePath??[]).length>d.length),M=new Map;for(const y of v){const J=(y.suitePath??[])[d.length];M.has(J)||M.set(J,[]),M.get(J).push(y)}for(const[y,J]of M){const ee=[...d,y],ne=`group:${x}${ee.join("")}`,Q=C.value.get(`${x}${ee.join("")}`);m.push({kind:"group",depth:f,key:ne,label:y,stats:_(J),mode:Q?.mode??"default",annotations:Q?.annotations??[]}),E(ne)&&H(m,J,x,ee,f+1)}for(const y of U)m.push({kind:"test",depth:f,key:`test:${y.id}`,test:y})}const A=D(()=>{const m=[],I=new Map;for(const x of h.testCases){const d=x.filePath??"unknown";I.has(d)||I.set(d,[]),I.get(d).push(x)}for(const[x,d]of[...I.entries()].sort(([f],[U])=>f.localeCompare(U))){const f=`file:${x}`;m.push({kind:"group",depth:0,key:f,label:x,stats:_(d)}),E(f)&&H(m,d,x,[],1)}return m});return(m,I)=>{const x=he,d=Rt,f=jt,U=zt,v=Ee,M=ve;return s(),a("div",Ln,[n("div",En,[n("button",{class:q(["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":T.value?"Collapse all":"Expand all",onClick:I[0]||(I[0]=y=>T.value?S():P())},[o(x,{name:T.value?"i-lucide-fold-vertical":"i-lucide-unfold-vertical",class:"size-3.5"},null,8,["name"]),$(" "+l(T.value?"Collapse all":"Expand all"),1)],10,On)]),n("div",Kn,[(s(!0),a(G,null,ae(A.value,y=>(s(),a(G,{key:y.key},[y.kind==="group"?(s(),a("div",{key:0,class:q(["flex items-center gap-2 py-2 pr-4 border-b border-default last:border-b-0 select-none sticky",[y.depth===0?"bg-elevated":"bg-default",!t.hasFilter&&"cursor-pointer"]]),style:ye({paddingLeft:`${y.depth*20+12}px`,top:`${y.depth*36}px`,zIndex:20-y.depth}),onClick:J=>N(y.key)},[o(x,{name:E(y.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 text-muted shrink-0"},null,8,["name"]),o(x,{name:y.depth===0?"i-lucide-file-code-2":"i-lucide-folder-open",class:q(["size-4 shrink-0",y.depth===0?"text-blue-500":"text-amber-500"])},null,8,["name","class"]),y.depth===0?(s(),a("span",{key:0,class:"min-w-0",onClick:I[1]||(I[1]=Ne(()=>{},["stop"]))},[o(d,{"file-path":y.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",Hn,l(y.label),1)),y.depth>0?(s(),w(f,{key:2,mode:y.mode,annotations:y.annotations,class:"shrink-0"},null,8,["mode","annotations"])):k("",!0),I[2]||(I[2]=n("div",{class:"flex-1"},null,-1)),n("div",Vn,[(s(!0),a(G,null,ae(c(y.stats),J=>(s(),a("span",{key:J.key,class:q(["text-xs inline-flex items-center gap-0.5",[("getStatusTextClass"in m?m.getStatusTextClass:e(et))(J.key),J.key==="failed"?"font-medium":""]]),title:`${J.count} ${J.label}`},[o(x,{name:("getStatusIcon"in m?m.getStatusIcon:e(tt))(J.key),class:"size-3 shrink-0 sm:hidden"},null,8,["name"]),$(" "+l(J.count),1),n("span",Xn,l(J.label),1)],10,Gn))),128))])],14,Wn)):(s(),a("div",{key:1,class:q(["flex flex-wrap items-center gap-x-2 gap-y-1 pr-3 py-2 sm:py-1.5 border-b border-default last:border-b-0 hover:bg-zinc-50 dark:hover:bg-zinc-900/40 transition-colors",t.highlightedCaseId===y.test.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),style:ye({paddingLeft:`${y.depth*20+12}px`})},[o(U,{browser:y.test.browser,size:"sm"},null,8,["browser"]),o(x,{name:("getStatusIcon"in m?m.getStatusIcon:e(tt))(y.test.status),class:q(["size-4 shrink-0",[("getStatusTextClass"in m?m.getStatusTextClass:e(et))(y.test.status),("isStatusInFlight"in m?m.isStatusInFlight:e(_t))(y.test.status)?"animate-spin":""]]),role:"img","aria-label":`Status: ${("formatStatusLabel"in m?m.formatStatusLabel:e(Fe))(y.test.status)}`,title:("formatStatusLabel"in m?m.formatStatusLabel:e(Fe))(y.test.status)},null,8,["name","class","aria-label","title"]),n("a",{href:`/test-run-cases/${y.test.id}`,class:"text-highlighted hover:text-primary hover:underline min-w-32 self-stretch flex items-center",title:y.test.title,onClick:Ne(J=>("navigateTo"in m?m.navigateTo:e(He))(`/test-run-cases/${y.test.id}`),["prevent"])},[n("span",Yn,l(y.test.title),1)],8,qn),o(f,{"is-new-regression":!!y.test.isNewRegression,"is-new-flaky":!!y.test.isNewFlaky,annotations:y.test.testAnnotations,tags:y.test.tags,meta:y.test.testMeta,"max-tags":3,class:"shrink-0"},null,8,["is-new-regression","is-new-flaky","annotations","tags","meta"]),n("div",Jn,[y.test.status==="running"?(s(),a("span",Zn,"In progress...")):y.test.duration?(s(),w(v,{key:1,ms:y.test.duration,class:"text-xs text-muted"},null,8,["ms"])):k("",!0),y.test.workerIndex!=null?(s(),w(M,{key:2,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:`Worker ${y.test.workerIndex}`},{default:i(()=>[$(" w"+l(y.test.workerIndex),1)]),_:2},1032,["title"])):k("",!0),(y.test.retries??0)>0?(s(),w(M,{key:3,color:"warning",variant:"soft",size:"xs"},{default:i(()=>[$(l(y.test.retries)+"x ",1)]),_:2},1024)):k("",!0),y.test.wastedTimeMs?(s(),a("span",Qn,[o(x,{name:"i-lucide-hourglass",class:"size-3 shrink-0"}),o(v,{ms:y.test.wastedTimeMs,"unit-class":"opacity-60","no-title":""},null,8,["ms"])])):k("",!0)])],6))],64))),128)),A.value.length===0?(s(),a("div",ea,[o(x,{name:"i-lucide-search-x",class:"size-6 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"}),I[3]||(I[3]=n("p",{class:"text-sm"},"No test cases match your filters.",-1))])):k("",!0)])])}}}),sa=Object.assign(ta,{__name:"TestCasesTree"}),na={class:"flex flex-col min-h-0"},aa={class:"flex items-center rounded-md border border-default overflow-hidden"},oa={key:0,class:"text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"},la={key:1,class:"text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"},ia={class:"flex flex-wrap items-center gap-1"},ra=["onClick"],ua={key:2,class:"flex items-center gap-1 md:hidden"},ca={key:0,class:"flex-1 min-h-0 max-lg:h-[70dvh] md:overflow-x-auto overflow-y-hidden rounded-lg border border-default bg-default"},da=["aria-rowcount"],ma=["aria-sort","aria-label","title","onClick"],fa={key:1,class:"truncate"},ga={class:"flex items-start gap-2"},pa=["href","onClick"],xa={class:"pl-6 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted"},ya={key:0,class:"text-info"},ha={key:4,class:"inline-flex items-center gap-0.5 text-amber-600 dark:text-amber-400",title:"Wasted in fixed waits"},va={class:"px-3 py-2 flex items-center min-w-0",role:"cell"},ka={class:"px-3 py-2 min-w-0 space-y-0.5",role:"cell"},ba={class:"flex items-center gap-1.5 min-w-0"},wa=["href","title","onClick"],_a={class:"px-3 py-2 flex items-center",role:"cell"},$a={class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},Ca={key:0,class:"text-info text-xs"},Ta={class:"px-3 py-2 flex items-center",role:"cell"},Ra={class:"px-3 py-2 flex items-center tabular-nums",role:"cell"},za={key:0,class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},Ia={key:1,class:"text-zinc-400"},Sa={class:"flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-zinc-500"},Fa={key:1,class:"text-center py-10 text-zinc-500"},Da={key:2,class:"text-center py-10 text-zinc-500"},Ke="natural",ja=ge({__name:"TestCasesList",props:ss({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:h}){const{treeView:C,setTreeView:F}=Ss("test-cases"),R=t,c=Je(t,"search"),_=Je(t,"activeStatuses"),u=Je(t,"browserFilter"),T=K(!1),E=K(!1),N=[{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 B(p){_.value.indexOf(p)>=0?_.value=_.value.filter(Y=>Y!==p):_.value=[..._.value,p]}const S=D(()=>{const p=new Set;for(const Y of R.testCases){const oe=Y.browser?.projectName;oe&&p.add(oe)}const j=[{label:"All browsers",value:"all"}];for(const Y of[...p].sort())j.push({label:Y,value:Y});return j});function P(p,j){return j==="failed"?p.status==="failed"||p.status==="timedOut"||p.status==="timedout":j==="flaky"?(p.retries??0)>0:p.status===j}const H=D(()=>{let p=R.testCases;if(R.failureClusterFilter!=null&&(p=p.filter(j=>j.failureClusterId===R.failureClusterFilter)),_.value.length>0&&(p=p.filter(j=>_.value.some(Y=>P(j,Y)))),u.value!=="all"&&(p=p.filter(j=>j.browser?.projectName===u.value)),c.value){const j=c.value.toLowerCase();p=p.filter(Y=>Y.title.toLowerCase().includes(j)||Y.location&&Y.location.toLowerCase().includes(j))}return T.value&&(p=p.filter(j=>j.isNewRegression)),E.value&&(p=p.filter(j=>j.isNewFlaky)),p}),A=K(null),m=K("asc");function I(p){A.value!==p?(A.value=p,m.value="asc"):m.value==="asc"?m.value="desc":A.value=null}function x(p){return A.value!==p?"i-lucide-chevrons-up-down":m.value==="asc"?"i-lucide-chevron-up":"i-lucide-chevron-down"}function d(p,j){switch(j){case"browser":return p.browser?.projectName??"";case"title":return p.title??"";case"status":return p.status??"";case"duration":return p.duration??0;case"workerIndex":return p.workerIndex??-1;case"retries":return p.retries??0;case"wastedTimeMs":return p.wastedTimeMs??0;default:return""}}const f=D(()=>{const p=H.value,j=A.value;if(!j)return p;const Y=m.value==="asc"?1:-1;return[...p].sort((oe,Z)=>{const b=d(oe,j),V=d(Z,j);return typeof b=="number"&&typeof V=="number"?(b-V)*Y:String(b).localeCompare(String(V))*Y})}),U=D(()=>R.testCases.some(p=>(p.wastedTimeMs??0)>0)),v=D(()=>{const p=[{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 U.value&&p.push({key:"wastedTimeMs",label:"Wasted",sortable:!0,width:"6rem",align:"left"}),p}),M=D(()=>[{label:"Run order",value:Ke},...v.value.map(p=>({label:p.label,value:p.key}))]),y=D({get:()=>A.value??Ke,set:p=>{A.value=p===Ke?null:p,p!==Ke&&(m.value="asc")}}),J=D(()=>v.value.map(p=>p.width).join(" ")),ee=D(()=>U.value?"47.5rem":"41.5rem"),ne=D(()=>c.value!==""||_.value.length>0||u.value!=="all"||R.failureClusterFilter!=null),Q=K(null),ie=K(!1),O=K(null);function g(p){return p.scrollHeight-p.scrollTop-p.clientHeight<50}function z(p){const j=p.target;j&&(ie.value=!g(j))}me(()=>R.isLive,p=>{p||(ie.value=!1)}),me(()=>f.value.length,()=>{!R.isLive||ie.value||De(()=>Q.value?.scrollToBottom())});function re(p){F(!1),O.value=p;const j=()=>{const Y=f.value.findIndex(oe=>oe.id===p);Y>=0&&Q.value?.scrollToItem(Y,{behavior:"smooth"})};De(()=>{Q.value?j():setTimeout(j,60),setTimeout(()=>{O.value=null},3e3)})}return h({scrollToCase:re}),(p,j)=>{const Y=he,oe=je,Z=ts,b=Rs,V=Tt,se=Re,te=zs,xe=sa,we=zt,le=Rt,_e=jt,$e=Ee,fe=ve,ke=dt("DynamicScrollerItem"),be=dt("DynamicScroller"),ze=yt;return s(),a("div",na,[o(te,{class:"mb-4 shrink-0"},{start:i(()=>[n("div",aa,[n("button",{class:q(["px-2 py-1 text-xs transition-colors",e(C)?"text-muted hover:bg-elevated/60":"bg-primary text-white dark:text-white"]),title:"Flat list",onClick:j[0]||(j[0]=r=>e(F)(!1))},[o(Y,{name:"i-lucide-list",class:"size-3.5"})],2),n("button",{class:q(["px-2 py-1 text-xs transition-colors",e(C)?"bg-primary text-white dark:text-white":"text-muted hover:bg-elevated/60"]),title:"Tree view",onClick:j[1]||(j[1]=r=>e(F)(!0))},[o(Y,{name:"i-lucide-folder-tree",class:"size-3.5"})],2)]),t.isLive?(s(),a("span",oa,[$(l(t.testCases.length)+" completed ",1),o(oe,{topic:"run.live"})])):(s(),a("span",la,[$(l(f.value.length)+l(f.value.length!==t.testCases.length?` / ${t.testCases.length}`:"")+" cases ",1),o(oe,{topic:"run.test-cases"})]))]),default:i(()=>[o(Z,{modelValue:c.value,"onUpdate:modelValue":j[2]||(j[2]=r=>c.value=r),placeholder:"Search test cases...",icon:"i-lucide-search",size:"sm",class:"min-w-48 max-sm:flex-1"},null,8,["modelValue"]),n("div",ia,[(s(),a(G,null,ae(N,r=>n("button",{key:r.value,class:q(["inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap",_.value.includes(r.value)?r.color==="green"?"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400":r.color==="red"?"bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400":r.color==="orange"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-zinc-200 text-zinc-700 dark:bg-zinc-700 dark:text-zinc-300":"bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 hover:bg-zinc-200 dark:hover:bg-zinc-700"]),onClick:Ce=>B(r.value)},[n("span",{class:q(["size-2 rounded-full shrink-0",r.color==="green"?"bg-emerald-500":r.color==="red"?"bg-rose-500":r.color==="orange"?"bg-orange-500":"bg-zinc-400"])},null,2),$(" "+l(r.label),1)],10,ra)),64))]),o(b,{modelValue:u.value,"onUpdate:modelValue":j[3]||(j[3]=r=>u.value=r),items:S.value,size:"sm",class:"w-36"},null,8,["modelValue","items"]),t.isLive?k("",!0):(s(),w(V,{key:0,modelValue:T.value,"onUpdate:modelValue":j[4]||(j[4]=r=>T.value=r),label:"New regressions",size:"sm"},null,8,["modelValue"])),t.isLive?k("",!0):(s(),w(V,{key:1,modelValue:E.value,"onUpdate:modelValue":j[5]||(j[5]=r=>E.value=r),label:"New flaky",size:"sm"},null,8,["modelValue"])),e(C)?k("",!0):(s(),a("div",ua,[o(b,{modelValue:y.value,"onUpdate:modelValue":j[6]||(j[6]=r=>y.value=r),items:M.value,size:"sm",class:"w-32","aria-label":"Sort cases by"},null,8,["modelValue","items"]),o(se,{size:"sm",variant:"outline",color:"neutral",disabled:A.value===null,icon:m.value==="asc"?"i-lucide-arrow-up-narrow-wide":"i-lucide-arrow-down-wide-narrow",title:m.value==="asc"?"Sorted ascending":"Sorted descending","aria-label":m.value==="asc"?"Sorted ascending":"Sorted descending",onClick:j[7]||(j[7]=r=>m.value=m.value==="asc"?"desc":"asc")},null,8,["disabled","icon","title","aria-label"])]))]),_:1}),e(C)&&t.testCases.length>0?(s(),w(xe,{key:0,"test-cases":f.value,suites:t.suites,"has-filter":ne.value,"highlighted-case-id":O.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(C)?k("",!0):(s(),a(G,{key:1},[f.value.length>0?(s(),a("div",ca,[n("div",{class:"flex flex-col h-full md:min-w-(--grid-min-width)",role:"table","aria-label":"Test cases","aria-rowcount":f.value.length+1,style:ye({"--grid-min-width":ee.value})},[n("div",{class:"hidden md:grid shrink-0 bg-elevated/50 border-b border-default",role:"row",style:ye({gridTemplateColumns:J.value})},[(s(!0),a(G,null,ae(v.value,r=>(s(),a(G,{key:r.key},[r.sortable?(s(),a("button",{key:0,type:"button",role:"columnheader","aria-sort":A.value===r.key?m.value==="asc"?"ascending":"descending":"none","aria-label":r.icon?r.label:void 0,title:r.icon?r.label:void 0,class:q(["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",r.align==="right"?"justify-end":""]),onClick:Ce=>I(r.key)},[r.icon?(s(),w(Y,{key:0,name:r.icon,class:"shrink-0 size-4"},null,8,["name"])):(s(),a("span",fa,l(r.label),1)),o(Y,{name:x(r.key),class:q(["shrink-0 size-3.5",A.value===r.key?"":"opacity-40"])},null,8,["name","class"])],10,ma)):(s(),a("div",{key:1,role:"columnheader",class:q(["px-3 py-2 text-sm font-semibold",r.align==="right"?"text-right":""])},l(r.label),3))],64))),128))],4),o(ze,null,{fallback:i(()=>[n("div",Sa,[o(Y,{name:"i-lucide-loader-circle",class:"size-4 mr-2 animate-spin"}),j[8]||(j[8]=$(" Loading test cases… ",-1))])]),default:i(()=>[o(be,{ref_key:"scrollerRef",ref:Q,items:f.value,"min-item-size":44,"key-field":"id",role:"rowgroup",class:"flex-1 min-h-0",onScrollPassive:z},{default:i(({item:r,index:Ce,active:qe})=>[o(ke,{item:r,active:qe,"size-dependencies":[r.title,r.location,r.isNewRegression,r.isNewFlaky,r.testAnnotations,r.tags],"data-index":Ce},{default:i(()=>[n("div",{class:q(["md:hidden border-b border-default px-3 py-2.5 space-y-1.5 text-sm transition-colors",O.value===r.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),role:"row"},[n("div",ga,[o(Y,{name:("getStatusIcon"in p?p.getStatusIcon:e(tt))(r.status),class:q(["size-4 shrink-0 mt-0.5",[("getStatusTextClass"in p?p.getStatusTextClass:e(et))(r.status),("isStatusInFlight"in p?p.isStatusInFlight:e(_t))(r.status)?"animate-spin":""]]),role:"img","aria-label":`Status: ${("formatStatusLabel"in p?p.formatStatusLabel:e(Fe))(r.status)}`,title:("formatStatusLabel"in p?p.formatStatusLabel:e(Fe))(r.status)},null,8,["name","class","aria-label","title"]),n("a",{href:`/test-run-cases/${r.id}`,class:"text-highlighted hover:text-primary hover:underline font-medium flex-1 min-w-0",onClick:Ne(Oe=>("navigateTo"in p?p.navigateTo:e(He))(`/test-run-cases/${r.id}`),["prevent"])},l(r.title),9,pa),o(we,{browser:r.browser,size:"sm",class:"mt-0.5"},null,8,["browser"])]),r.location?(s(),w(le,{key:0,location:r.location,"project-key":t.projectKey,"project-name":t.projectName,class:"block pl-6 text-xs text-gray-400 dark:text-gray-500"},null,8,["location","project-key","project-name"])):k("",!0),o(_e,{"is-new-regression":!!r.isNewRegression,"is-new-flaky":!!r.isNewFlaky,annotations:r.testAnnotations,tags:r.tags,meta:r.testMeta,"max-tags":3,class:"pl-6"},null,8,["is-new-regression","is-new-flaky","annotations","tags","meta"]),n("div",xa,[r.status==="running"?(s(),a("span",ya,"In progress...")):r.duration?(s(),w($e,{key:1,ms:r.duration},null,8,["ms"])):k("",!0),r.workerIndex!=null?(s(),w(fe,{key:2,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:`Worker ${r.workerIndex}`},{default:i(()=>[$(" w"+l(r.workerIndex),1)]),_:2},1032,["title"])):k("",!0),(r.retries??0)>0?(s(),w(fe,{key:3,color:"warning",variant:"soft",size:"xs"},{default:i(()=>[$(l(r.retries)+"x ",1)]),_:2},1024)):k("",!0),r.wastedTimeMs?(s(),a("span",ha,[o(Y,{name:"i-lucide-hourglass",class:"size-3 shrink-0"}),o($e,{ms:r.wastedTimeMs,"unit-class":"opacity-60","no-title":""},null,8,["ms"])])):k("",!0)])],2),n("div",{class:q(["hidden md:grid items-center border-b border-default text-sm transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-900/50",O.value===r.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),role:"row",style:ye({gridTemplateColumns:J.value})},[n("div",va,[o(we,{browser:r.browser},null,8,["browser"])]),n("div",ka,[n("div",ba,[n("a",{href:`/test-run-cases/${r.id}`,class:"text-highlighted hover:text-primary hover:underline font-medium truncate",title:r.title,onClick:Ne(Oe=>("navigateTo"in p?p.navigateTo:e(He))(`/test-run-cases/${r.id}`),["prevent"])},l(r.title),9,wa),o(_e,{"is-new-regression":!!r.isNewRegression,"is-new-flaky":!!r.isNewFlaky,annotations:r.testAnnotations,tags:r.tags,meta:r.testMeta,"max-tags":3,class:"shrink-0"},null,8,["is-new-regression","is-new-flaky","annotations","tags","meta"])]),r.location?(s(),w(le,{key:0,location:r.location,"project-key":t.projectKey,"project-name":t.projectName,class:"text-xs text-zinc-400 dark:text-zinc-500"},null,8,["location","project-key","project-name"])):k("",!0)]),n("div",_a,[o(fe,{color:("getStatusColor"in p?p.getStatusColor:e(st))(r.status==="timedOut"||r.status==="timedout"?"failed":r.status),variant:"subtle",class:"capitalize"},{default:i(()=>[$(l(("formatStatusLabel"in p?p.formatStatusLabel:e(Fe))(r.status)),1)]),_:2},1032,["color"])]),n("div",$a,[r.status==="running"?(s(),a("span",Ca,"In progress...")):(s(),w($e,{key:1,ms:r.duration,fallback:""},null,8,["ms"]))]),n("div",Ta,[r.workerIndex!=null?(s(),w(fe,{key:0,color:"neutral",variant:"soft",class:"font-mono text-xs"},{default:i(()=>[$(l(r.workerIndex),1)]),_:2},1024)):k("",!0)]),n("div",Ra,l(r.retries&&r.retries>0?r.retries:""),1),U.value?(s(),a("div",za,[r.wastedTimeMs?(s(),w($e,{key:0,ms:r.wastedTimeMs,class:"text-amber-600 dark:text-amber-400","unit-class":"opacity-60"},null,8,["ms"])):(s(),a("span",Ia,"—"))])):k("",!0)],6)]),_:2},1032,["item","active","size-dependencies","data-index"])]),_:1},8,["items"])]),_:1})],12,da)])):t.testCases.length===0?(s(),a("div",Fa,[o(Y,{name:"i-lucide-beaker",class:"size-8 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"}),j[9]||(j[9]=n("p",null,"No test cases recorded for this run.",-1))])):(s(),a("div",Da,[o(Y,{name:"i-lucide-search-x",class:"size-8 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"}),j[10]||(j[10]=n("p",null,"No test cases match your filters.",-1))]))],64))])}}}),Pa=Object.assign(ja,{__name:"TestCasesList"}),Ba={key:2,class:"p-4"},Na={key:3,class:"p-4"},Ma={key:4,class:"p-4"},Aa={key:5,class:"space-y-6 p-4"},Ua={class:"flex items-center gap-1.5 text-sm text-muted"},La={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},Ea={class:"space-y-1"},Oa={class:"text-xl font-semibold"},Ka={key:0},Wa={key:1},Ha={class:"space-y-1"},Va={key:1,class:"text-xl font-semibold text-muted"},Ga={class:"space-y-1"},Xa={class:"space-y-0.5 text-sm"},qa={key:0,class:"text-red-500"},Ya={key:1,class:"text-green-600"},Ja={key:2,class:"text-purple-500"},Za={key:3,class:"text-muted"},Qa={class:"space-y-1"},eo={class:"font-medium text-primary hover:underline truncate"},to={class:"text-gray-400 text-xs ml-auto shrink-0"},so={class:"space-y-1"},no={class:"font-medium text-primary hover:underline truncate"},ao={class:"space-y-1"},oo={class:"font-medium text-primary hover:underline truncate"},lo={class:"space-y-1"},io={class:"font-medium text-primary hover:underline truncate"},ro={class:"text-gray-400 text-xs ml-auto shrink-0"},uo={class:"space-y-1"},co={class:"font-medium text-primary hover:underline truncate"},mo={class:"grid grid-cols-2 gap-4"},fo={key:0},go={class:"space-y-1"},po={class:"text-red-500 font-mono shrink-0"},xo={class:"truncate text-primary hover:underline"},yo={key:1},ho={class:"space-y-1"},vo={class:"text-green-500 font-mono shrink-0"},ko={class:"truncate text-primary hover:underline"},bo={class:"space-y-1"},wo={class:"flex-1 truncate text-primary hover:underline"},_o={class:"text-gray-500 font-mono text-xs shrink-0"},$o={class:"w-24 h-2 rounded-full bg-gray-100 shrink-0"},Co={key:0,class:"flex items-center gap-1.5 text-xs text-amber-600 mb-3"},To={class:"flex items-end gap-2 h-20"},Ro={class:"text-xs text-gray-500"},zo={class:"text-xs text-gray-400"},Io={class:"space-y-1"},So={class:"truncate"},Fo=ge({__name:"RunInsights",props:{testRunId:{},runStatus:{},refreshKey:{}},setup(t){const h=t,C=D(()=>{if(!c.value)return"";const B=c.value.passRateDelta;return B>0?"text-green-600":B<0?"text-red-600":"text-muted"}),F=D(()=>{if(!c.value)return"";const B=c.value.passRateDelta;return B>0?"i-lucide-trending-up":B<0?"i-lucide-trending-down":"i-lucide-minus"}),R=D(()=>c.value?.avgDurationDelta==null?"":c.value.avgDurationDelta>0?"text-red-600":"text-green-600"),c=K(null),_=K(!1),u=K(null),T=D(()=>h.runStatus==="running"||h.runStatus==="initialising"||h.runStatus==="finalizing");async function E(){if(!h.testRunId||T.value){c.value=null;return}_.value=!0,u.value=null;try{c.value=await $fetch(`/api/test-runs/${h.testRunId}/insights`)}catch(B){console.error("[RunInsights] failed to load",B),u.value=B?.data?.message||B?.message||"Failed to load insights"}finally{_.value=!1}}me(()=>h.testRunId,E,{immediate:!0}),me(()=>h.refreshKey,(B,S)=>{B!==S&&B!==void 0&&E()});function N(B){return B==null?"—":B<1e3?`${B}ms`:`${(B/1e3).toFixed(1)}s`}return(B,S)=>{const P=Re,H=Fs,A=It,m=St,I=he,x=je,d=Ds,f=ve,U=Ue;return e(u)?(s(),w(H,{key:0,text:e(u),padded:""},{action:i(()=>[o(P,{size:"sm",onClick:E},{default:i(()=>[...S[0]||(S[0]=[$("Retry",-1)])]),_:1})]),_:1},8,["text"])):e(_)?(s(),w(A,{key:1,padded:""})):e(T)?(s(),a("div",Ba,[o(m,{icon:"i-lucide-loader-circle",text:"Run in progress"},{default:i(()=>[...S[1]||(S[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(c)?e(c).hasBaseline?(s(),a("div",Aa,[n("div",Ua,[o(I,{name:"i-lucide-sparkles",class:"size-4 shrink-0 text-primary/70"}),S[3]||(S[3]=n("span",null,"Automatic highlights from this run",-1)),o(x,{topic:"run.insights"})]),o(d,{icon:"i-lucide-bar-chart-3","icon-class":"text-blue-500",title:"Run summary"},{default:i(()=>[n("div",La,[n("div",Ea,[S[4]||(S[4]=n("p",{class:"text-xs text-muted"},"Pass rate",-1)),n("p",Oa,l(e(c).passRate)+"%",1),n("div",{class:q(["flex items-center gap-1 text-xs",e(C)])},[o(I,{name:e(F),class:"size-3.5"},null,8,["name"]),e(c).passRateDelta!==0?(s(),a("span",Ka,l(e(c).passRateDelta>0?"+":"")+l(e(c).passRateDelta)+"pp vs baseline",1)):(s(),a("span",Wa,"Same as baseline"))],2)]),n("div",Ha,[S[5]||(S[5]=n("p",{class:"text-xs text-muted"},"Avg duration",-1)),e(c).avgDurationDelta!==null?(s(),a("p",{key:0,class:q(["text-xl font-semibold",e(R)])},l(e(c).avgDurationDelta>0?"+":"")+l(e(c).avgDurationDelta)+"% ",3)):(s(),a("p",Va,"—")),S[6]||(S[6]=n("p",{class:"text-xs text-muted"},"vs baseline (passing tests)",-1))]),n("div",Ga,[S[7]||(S[7]=n("p",{class:"text-xs text-muted"},"Changes",-1)),n("div",Xa,[e(c).newRegressions.length>0?(s(),a("p",qa," +"+l(e(c).newRegressions.length)+" regressed ",1)):k("",!0),e(c).recovered.length>0?(s(),a("p",Ya,"+"+l(e(c).recovered.length)+" fixed",1)):k("",!0),e(c).newFlaky.length>0?(s(),a("p",Ja,"+"+l(e(c).newFlaky.length)+" flaky",1)):k("",!0),!e(c).newRegressions.length&&!e(c).recovered.length&&!e(c).newFlaky.length?(s(),a("p",Za," No status changes ")):k("",!0)])])])]),_:1}),e(c).newRegressions.length>0?(s(),w(d,{key:0,icon:"i-lucide-alert-circle","icon-class":"text-red-500",title:"New regressions",count:e(c).newRegressions.length},{default:i(()=>[n("div",Qa,[(s(!0),a(G,null,ae(e(c).newRegressions,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[o(f,{color:"error",variant:"solid",size:"xs"},{default:i(()=>[...S[8]||(S[8]=[$("NEW",-1)])]),_:1}),n("span",eo,l(v.title),1),n("span",to,l(N(v.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(c).recurrences.length>0?(s(),w(d,{key:1,icon:"i-lucide-refresh-cw","icon-class":"text-amber-500",title:"Recurring failures",count:e(c).recurrences.length},{default:i(()=>[n("div",so,[(s(!0),a(G,null,ae(e(c).recurrences,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[o(f,{color:"warning",variant:"solid",size:"xs"},{default:i(()=>[...S[9]||(S[9]=[$("RECURRING",-1)])]),_:1}),n("span",no,l(v.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(c).recovered.length>0?(s(),w(d,{key:2,icon:"i-lucide-check-circle","icon-class":"text-green-500",title:"Fixed tests",count:e(c).recovered.length},{default:i(()=>[n("div",ao,[(s(!0),a(G,null,ae(e(c).recovered,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[o(f,{color:"success",variant:"solid",size:"xs"},{default:i(()=>[...S[10]||(S[10]=[$("FIXED",-1)])]),_:1}),n("span",oo,l(v.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(c).newFlaky.length>0?(s(),w(d,{key:3,icon:"i-lucide-flask","icon-class":"text-purple-500",title:"New flaky tests",count:e(c).newFlaky.length},{default:i(()=>[n("div",lo,[(s(!0),a(G,null,ae(e(c).newFlaky,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[o(f,{color:"info",variant:"solid",size:"xs"},{default:i(()=>[...S[11]||(S[11]=[$("FLAKY",-1)])]),_:1}),n("span",io,l(v.title),1),n("span",ro,l(N(v.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(c).flakyOnRetry.length>0?(s(),w(d,{key:4,icon:"i-lucide-repeat","icon-class":"text-orange-500",title:"Passed on retry",count:e(c).flakyOnRetry.length,subtitle:"Tests that passed but needed one or more retries"},{default:i(()=>[n("div",uo,[(s(!0),a(G,null,ae(e(c).flakyOnRetry,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[o(f,{color:"warning",variant:"subtle",size:"xs"},{default:i(()=>[$("×"+l(v.retries),1)]),_:2},1024),n("span",co,l(v.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(c).mostRegressed.length>0||e(c).mostImproved.length>0?(s(),w(d,{key:5,icon:"i-lucide-trending-up","icon-class":"text-blue-500",title:"Performance changes"},{default:i(()=>[n("div",mo,[e(c).mostRegressed.length>0?(s(),a("div",fo,[S[12]||(S[12]=n("p",{class:"text-xs font-medium text-red-500 mb-2"},"Most regressed",-1)),n("div",go,[(s(!0),a(G,null,ae(e(c).mostRegressed,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[n("span",po,"+"+l(v.pctChange)+"%",1),n("span",xo,l(v.title),1)]),_:2},1032,["to"]))),128))])])):k("",!0),e(c).mostImproved.length>0?(s(),a("div",yo,[S[13]||(S[13]=n("p",{class:"text-xs font-medium text-green-500 mb-2"},"Most improved",-1)),n("div",ho,[(s(!0),a(G,null,ae(e(c).mostImproved,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[n("span",vo,l(v.pctChange)+"%",1),n("span",ko,l(v.title),1)]),_:2},1032,["to"]))),128))])])):k("",!0)])]),_:1})):k("",!0),e(c).slowestTests.length>0?(s(),w(d,{key:6,icon:"i-lucide-clock","icon-class":"text-amber-500",title:"Slowest tests"},{default:i(()=>[n("div",bo,[(s(!0),a(G,null,ae(e(c).slowestTests,v=>(s(),w(U,{key:v.testRunsCaseId,to:`/test-run-cases/${v.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:i(()=>[n("div",wo,l(v.title),1),n("div",_o,l(N(v.duration)),1),n("div",$o,[n("div",{class:"h-full rounded-full bg-amber-400",style:ye({width:Math.min(100,v.duration/(e(c).slowestTests[0]?.duration||1)*100)+"%"})},null,4)])]),_:2},1032,["to"]))),128))])]),_:1})):k("",!0),e(c).workerImbalance.length>1?(s(),w(d,{key:7,icon:"i-lucide-users","icon-class":"text-gray-500",title:"Worker distribution"},{default:i(()=>[e(c).workerImbalanceWarning?(s(),a("div",Co,[o(I,{name:"i-lucide-alert-triangle",class:"size-3.5 shrink-0"}),n("span",null,l(e(c).workerImbalanceWarning),1)])):k("",!0),n("div",To,[(s(!0),a(G,null,ae(e(c).workerImbalance,v=>(s(),a("div",{key:v.workerIndex,class:"flex-1 flex flex-col items-center gap-1"},[n("span",Ro,l(v.count),1),n("div",{class:"w-full bg-blue-400 rounded-t",style:ye({height:Math.max(4,v.count/Math.max(...e(c).workerImbalance.map(M=>M.count))*60)+"px"})},null,4),n("span",zo,"W"+l(v.workerIndex),1)]))),128))])]),_:1})):k("",!0),e(c).clusterNew.length>0?(s(),w(d,{key:8,icon:"i-lucide-layers","icon-class":"text-purple-500",title:"New failure clusters",count:e(c).clusterNew.length},{default:i(()=>[n("div",Io,[(s(!0),a(G,null,ae(e(c).clusterNew,v=>(s(),w(U,{key:v.clusterId,to:`/failure-clusters/${v.clusterId}`,class:"flex items-center gap-2 text-sm text-primary hover:underline"},{default:i(()=>[n("span",So,l(v.signature),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0)])):(s(),a("div",Ma,[o(m,{icon:"i-lucide-git-compare-arrows",text:"No baseline run found"},{default:i(()=>[...S[2]||(S[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",Na,[o(m,{text:"No insights yet"})]))}}}),Do=Object.assign(Fo,{__name:"RunInsights"}),jo=ge({__name:"ClusterDiagnosis",props:{clusterId:{}},setup(t){return(h,C)=>{const F=js;return s(),w(F,{"cluster-id":t.clusterId},null,8,["cluster-id"])}}}),Po=Object.assign(jo,{__name:"ClusterDiagnosis"}),Bo={class:"pt-4 space-y-3"},No={key:0,class:"flex items-center justify-center py-8 text-gray-500 gap-2"},Mo={class:"flex items-center justify-between gap-3"},Ao={class:"text-sm text-gray-500 dark:text-gray-400 inline-flex items-center gap-1"},Uo={class:"min-w-0 space-y-0.5"},Lo=["title"],Eo={key:0,class:"text-xs text-gray-500 truncate block"},Oo={class:"font-mono"},Ko={key:1,class:"text-gray-400 text-xs"},Wo={key:1,class:"text-gray-400 text-xs"},Ho={class:"text-sm tabular-nums"},Vo={key:0,class:"flex flex-wrap gap-1"},Go={key:1,class:"text-gray-400 text-xs"},Xo={key:0,class:"flex items-center gap-1 text-xs text-gray-500"},qo={key:2,class:"text-gray-400 text-xs"},Yo={key:0,class:"text-xs font-medium text-warning-500"},Jo={key:1,class:"text-sm text-gray-500 whitespace-nowrap"},Zo={key:0,class:"ml-1 text-xs text-gray-400"},Qo={class:"flex justify-end gap-2"},el={key:2,class:"flex flex-col items-center justify-center py-8 text-gray-500 gap-2"},tl=ge({__name:"FailureGroups",props:{refreshKey:{}},emits:["selectCluster"],async setup(t,{emit:h}){let C,F;const R=h,c=t,u=Le().params.id,{data:T,pending:E,refresh:N}=([C,F]=Me(()=>Ae(`/api/test-runs/${u}/failure-groups`,{lazy:!0,server:!1},"$qddF1IOQ64")),C=await C,F(),C);me(()=>c.refreshKey,(d,f)=>{d!==f&&d!==void 0&&N()});const B=K(null),{copy:S,copied:P}=at(),H=D(()=>T.value?T.value.flatMap(d=>d.cases.filter(f=>!f.passedOnRetry).map(f=>({filePath:f.filePath,title:f.title,line:null,projectName:null}))):[]),A=D(()=>Ct(H.value));function m(){const d=A.value;d&&S(d,{toast:"Retry command copied"})}const I=[{accessorKey:"signature",header:ce("Signature")},{accessorKey:"errorType",header:ce("Type")},{accessorKey:"status",header:ce("Status")},{accessorKey:"caseCount",header:ce("Tests")},{accessorKey:"signals",header:"Signals"},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"firstSeenRunId",header:ce("Known since")},{id:"actions",header:"Actions"}],x=D(()=>T.value?.reduce((d,f)=>d+f.caseCount,0)??0);return(d,f)=>{const U=he,v=je,M=Re,y=ve,J=Ue,ee=ot,ne=Ft,Q=nt,ie=Po,O=Dt;return s(),a(G,null,[n("div",Bo,[e(E)?(s(),a("div",No,[o(U,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),f[2]||(f[2]=n("span",null,"Grouping failures...",-1))])):e(T)&&e(T).length?(s(),a(G,{key:1},[n("div",Mo,[n("p",Ao,[$(l(e(x))+" failing "+l(e(x)===1?"test":"tests")+" across "+l(e(T).length)+" "+l(e(T).length===1?"group":"groups")+" ",1),o(v,{topic:"cluster.concept"})]),e(H).length>0?(s(),w(M,{key:0,size:"xs",variant:"outline",color:"neutral",icon:e(P)?"i-lucide-check":"i-lucide-play",title:e(P)?"Copied!":("copyPreview"in d?d.copyPreview:e(wt))(e(A)),onClick:f[0]||(f[0]=g=>m())},{default:i(()=>[...f[3]||(f[3]=[$(" Copy retry command ",-1)])]),_:1},8,["icon","title"])):k("",!0)]),o(Q,{ui:{body:"p-0 sm:p-0"}},{default:i(()=>[o(ne,{"min-width":"46rem",bleed:!1},{default:i(()=>[o(ee,{data:e(T),columns:I},{"actions-header":i(()=>[...f[4]||(f[4]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":i(({row:g})=>[n("div",Uo,[n("span",{class:q(["text-sm block truncate",g.original.title?"":"font-mono"]),title:g.original.signature},l(g.original.title||g.original.signature),11,Lo),g.original.selector?(s(),a("span",Eo,[f[5]||(f[5]=$(" Locator: ",-1)),n("code",Oo,l(g.original.selector),1)])):k("",!0)])]),"errorType-cell":i(({row:g})=>[g.original.errorType?(s(),w(y,{key:0,color:("clusterErrorTypeColor"in d?d.clusterErrorTypeColor:e(Ts))(g.original.errorType),variant:"subtle",size:"sm"},{default:i(()=>[$(l(g.original.errorType),1)]),_:2},1032,["color"])):(s(),a("span",Ko,"—"))]),"status-cell":i(({row:g})=>[g.original.status?(s(),w(y,{key:0,color:("clusterStatusColor"in d?d.clusterStatusColor:e(Cs))(g.original.status),variant:"subtle",size:"sm"},{default:i(()=>[$(l(g.original.status),1)]),_:2},1032,["color"])):(s(),a("span",Wo,"—"))]),"caseCount-cell":i(({row:g})=>[n("span",Ho,l(g.original.caseCount),1)]),"signals-cell":i(({row:g})=>[g.original.isNew||g.original.flaky||g.original.workerCorrelated||g.original.locatorHealing?(s(),a("div",Vo,[g.original.isNew?(s(),w(y,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:i(()=>[...f[6]||(f[6]=[$(" New ",-1)])]),_:1})):k("",!0),g.original.flaky?(s(),w(y,{key:1,color:"warning",variant:"outline",size:"sm"},{default:i(()=>[...f[7]||(f[7]=[$(" Flaky ",-1)])]),_:1})):k("",!0),g.original.workerCorrelated?(s(),w(y,{key:2,color:"info",variant:"outline",size:"sm",title:"All failures ran on the same worker"},{default:i(()=>[...f[8]||(f[8]=[$(" Same worker ",-1)])]),_:1})):k("",!0),g.original.locatorHealing?.healed?(s(),w(y,{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:i(()=>[...f[9]||(f[9]=[$(" Healed ",-1)])]),_:1})):g.original.locatorHealing?(s(),w(y,{key:4,color:"success",variant:"outline",size:"sm",icon:"i-lucide-bandage",title:`Locator fix available: ${g.original.locatorHealing.recommended} — open the cluster to apply it`},{default:i(()=>[...f[10]||(f[10]=[$(" Locator fix ",-1)])]),_:1},8,["title"])):k("",!0)])):(s(),a("span",Go,"—"))]),"diagnosis-cell":i(({row:g})=>[g.original.diagnosis?.status==="running"?(s(),a("div",Xo,[o(U,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),f[11]||(f[11]=$(" Running ",-1))])):g.original.diagnosis?.status==="completed"&&g.original.diagnosis.category?(s(),w(y,{key:1,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:i(()=>[o(U,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+l(g.original.diagnosis.category),1)]),_:2},1024)):(s(),a("span",qo,"—"))]),"firstSeenRunId-cell":i(({row:g})=>[g.original.isNew?(s(),a("span",Yo,"New in this run")):(s(),a("div",Jo,[o(J,{to:`/test-runs/${g.original.firstSeenRunId}`,class:"text-primary hover:underline"},{default:i(()=>[$(" run #"+l(g.original.firstSeenRunId),1)]),_:2},1032,["to"]),g.original.firstSeenAt?(s(),a("span",Zo," ("+l(("formatRelativeTime"in d?d.formatRelativeTime:e($t))(g.original.firstSeenAt))+") ",1)):k("",!0)]))]),"actions-cell":i(({row:g})=>[n("div",Qo,[o(M,{size:"sm",color:"primary",variant:"soft",onClick:z=>R("selectCluster",g.original.clusterId)},{default:i(()=>[...f[12]||(f[12]=[$(" Filter ",-1)])]),_:1},8,["onClick"]),o(M,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-sparkles",onClick:z=>B.value=g.original.clusterId},{default:i(()=>[...f[13]||(f[13]=[$(" Diagnose ",-1)])]),_:1},8,["onClick"]),o(M,{to:`/failure-clusters/${g.original.clusterId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:i(()=>[...f[14]||(f[14]=[$(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data"])]),_:1})]),_:1})],64)):(s(),a("div",el,[o(U,{name:"i-lucide-party-popper",class:"size-6"}),f[15]||(f[15]=n("span",null,"No failure groups — failed tests without error details are not grouped",-1))]))]),o(O,{open:e(B)!==null,title:"AI Diagnosis",ui:{content:"max-w-2xl"},"onUpdate:open":f[1]||(f[1]=g=>{g||(B.value=null)})},{body:i(()=>[e(B)!==null?(s(),w(ie,{key:0,"cluster-id":e(B)},null,8,["cluster-id"])):k("",!0)]),_:1},8,["open"])],64)}}}),sl=Object.assign(tl,{__name:"FailureGroups"}),nl={class:"pt-4"},al={key:2,class:"space-y-4"},ol={class:"flex flex-wrap items-center gap-2 text-sm"},ll={class:"text-gray-500 inline-flex items-center gap-1"},il={key:0,class:"text-gray-400"},rl={key:0,class:"flex flex-wrap items-center gap-2"},ul={class:"text-sm text-gray-500"},cl={key:1,class:"flex items-center gap-2"},dl={class:"text-sm text-gray-500"},ml={class:"space-y-3"},fl={class:"flex items-center gap-2 text-sm font-medium"},gl={class:"flex flex-wrap items-center gap-2 text-sm font-mono"},pl={key:0,class:"text-xs text-gray-400 font-sans"},xl={class:"flex flex-wrap items-center gap-2"},yl={class:"flex items-center gap-1.5 flex-1 min-w-0"},hl={class:"flex-1 text-xs bg-gray-100 dark:bg-gray-800 px-3 py-1.5 rounded font-mono truncate select-all"},vl={key:3,class:"text-sm text-gray-500 flex items-center gap-2"},kl={class:"px-4 py-3 text-sm font-medium flex items-center gap-2 border-b border-default"},bl={class:"overflow-x-auto"},wl={class:"w-full min-w-[36rem] text-sm"},_l={class:"px-4 py-2 text-gray-500"},$l={class:"px-4 py-2 font-mono text-xs"},Cl={key:0,class:"text-green-700 dark:text-green-400"},Tl={key:1,class:"text-gray-400"},Rl={class:"px-4 py-2 font-mono text-xs"},zl={key:0,class:"text-red-700 dark:text-red-400"},Il={key:1,class:"text-gray-400"},Sl=ge({__name:"RegressionContext",props:{refreshKey:{}},async setup(t){let h,C;const R=Le().params.id,c=t,{data:_,pending:u,refresh:T}=([h,C]=Me(()=>Ae(`/api/test-runs/${R}/regression-context`,{lazy:!0,server:!1},"$AcrCJopY1M")),h=await h,C(),h);me(()=>c.refreshKey,(S,P)=>{S!==P&&S!==void 0&&T()});const{copy:E,copied:N}=at();function B(){E(_.value?.commitRange?.gitCommand)}return(S,P)=>{const H=It,A=St,m=he,I=je,x=Ue,d=ve,f=Re,U=nt;return s(),a("div",nl,[e(u)?(s(),w(H,{key:0,text:"Looking for last passing run…"})):e(_)?.hasGreen?(s(),a("div",al,[n("div",ol,[o(m,{name:"i-lucide-circle-check",class:"size-4 text-green-500 shrink-0"}),n("span",ll,[P[0]||(P[0]=$("Last passing run: ",-1)),o(I,{topic:"run.regression"})]),o(x,{to:`/test-runs/${e(_).lastGreenRunId}`,class:"font-medium text-primary hover:underline"},{default:i(()=>[$(" Run #"+l(e(_).lastGreenRunId),1)]),_:1},8,["to"]),e(_).lastGreenRunAt?(s(),a("span",il," ("+l(("formatRelativeTime"in S?S.formatRelativeTime:e($t))(e(_).lastGreenRunAt))+") ",1)):k("",!0)]),(e(_).newFailures??0)>0?(s(),a("div",rl,[o(d,{color:"error",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(_).newFailures)+" new "+l(e(_).newFailures===1?"failure":"failures"),1)]),_:1}),n("span",ul,l(e(_).newFailures===1?"test":"tests")+" that "+l((e(_).newFailures===1,"passed"))+" in run #"+l(e(_).lastGreenRunId)+" but "+l(e(_).newFailures===1?"fails":"fail")+" here ",1)])):(s(),a("div",cl,[o(d,{color:"warning",variant:"soft",size:"lg"},{default:i(()=>[...P[1]||(P[1]=[$(" No new regressions ",-1)])]),_:1}),n("span",dl,"All failing tests were also failing before run #"+l(e(_).lastGreenRunId),1)])),e(_).commitRange?(s(),w(U,{key:2,ui:{body:"p-4 sm:p-4"}},{default:i(()=>[n("div",ml,[n("div",fl,[o(m,{name:"i-lucide-git-commit-horizontal",class:"size-4"}),P[2]||(P[2]=$(" Commits introduced since last passing run ",-1))]),n("div",gl,[o(d,{color:"success",variant:"soft",size:"sm"},{default:i(()=>[$(l(e(_).commitRange.fromShort),1)]),_:1}),o(m,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),o(d,{color:"error",variant:"soft",size:"sm"},{default:i(()=>[$(l(e(_).commitRange.toShort),1)]),_:1}),e(_).currentBranch||e(_).lastGreenBranch?(s(),a("span",pl," on "+l(e(_).currentBranch||e(_).lastGreenBranch),1)):k("",!0)]),n("div",xl,[e(_).commitRange.compareUrl?(s(),w(f,{key:0,to:e(_).commitRange.compareUrl,target:"_blank",external:"",icon:"i-lucide-external-link",size:"sm",variant:"soft",color:"primary"},{default:i(()=>[...P[3]||(P[3]=[$(" View commits ",-1)])]),_:1},8,["to"])):k("",!0),n("div",yl,[n("code",hl,l(e(_).commitRange.gitCommand),1),o(f,{icon:e(N)?"i-lucide-check":"i-lucide-clipboard",size:"xs",color:"neutral",variant:"ghost",title:e(N)?"Copied!":"Copy git command",onClick:B},null,8,["icon","title"])])])])]),_:1})):!e(_).currentCommit||!e(_).lastGreenCommit?(s(),a("div",vl,[o(m,{name:"i-lucide-git-branch",class:"size-4 shrink-0"}),P[4]||(P[4]=$(" No commit info available — enable ",-1)),P[5]||(P[5]=n("code",{class:"font-mono text-xs"},"collectScmInfo: true",-1)),P[6]||(P[6]=$(" in the reporter to see commit ranges ",-1))])):k("",!0),e(_).metadataDiff&&e(_).metadataDiff.length>0?(s(),w(U,{key:4,ui:{body:"p-0 sm:p-0"}},{default:i(()=>[n("div",kl,[o(m,{name:"i-lucide-sliders-horizontal",class:"size-4"}),P[7]||(P[7]=$(" What changed between runs ",-1))]),n("div",bl,[n("table",wl,[P[8]||(P[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(G,null,ae(e(_).metadataDiff,v=>(s(),a("tr",{key:v.key,class:"border-b last:border-b-0 border-default"},[n("td",_l,l(v.label),1),n("td",$l,[v.before?(s(),a("span",Cl,l(v.before),1)):(s(),a("span",Tl,"—"))]),n("td",Rl,[v.after?(s(),a("span",zl,l(v.after),1)):(s(),a("span",Il,"—"))])]))),128))])])])]),_:1})):k("",!0)])):(s(),w(A,{key:1,icon:"i-lucide-history",text:"No previous passing run found for this project"}))])}}}),Fl=Object.assign(Sl,{__name:"RegressionContext"}),Dl={class:"flex items-center justify-between mb-2"},jl={class:"text-xs text-gray-500 inline-flex items-center gap-1"},Pl={class:"flex items-center gap-1"},Bl={class:"p-2 flex flex-col gap-2 min-w-56"},Nl=ge({__name:"TimelineHeader",props:{workerCount:{},shardTotal:{},testCount:{},hookCount:{},waitCount:{},spanTypes:{},live:{type:Boolean}},emits:["reset","toggleSpan"],setup(t){return(h,C)=>{const F=je,R=Re,c=Tt,_=pt;return s(),a("div",Dl,[n("span",jl,[n("span",null,[$(l(t.workerCount)+" worker"+l(t.workerCount>1?"s":"")+" ",1),t.shardTotal&&t.shardTotal>1?(s(),a(G,{key:0},[$(" · "+l(t.shardTotal)+" shard"+l(t.shardTotal>1?"s":""),1)],64)):k("",!0),$(" · "+l(t.testCount)+" tests ",1),t.hookCount>0?(s(),a(G,{key:1},[$(" · "+l(t.hookCount)+" hooks ",1)],64)):k("",!0),t.waitCount>0?(s(),a(G,{key:2},[$(" · "+l(t.waitCount)+" waits ",1)],64)):k("",!0)]),o(F,{topic:"run.timeline"})]),n("div",Pl,[t.spanTypes.length>1?(s(),w(_,{key:0,content:{align:"end"}},{content:i(()=>[n("div",Bl,[(s(!0),a(G,null,ae(t.spanTypes,u=>(s(),w(c,{key:u.key,"model-value":u.checked,label:u.label,"onUpdate:modelValue":T=>h.$emit("toggleSpan",u.key,T===!0)},null,8,["model-value","label","onUpdate:modelValue"]))),128))])]),default:i(()=>[o(R,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list-filter","trailing-icon":"i-lucide-chevron-down",title:"Show or hide span types"},{default:i(()=>[...C[1]||(C[1]=[$(" Span types ",-1)])]),_:1})]),_:1})):k("",!0),t.live?k("",!0):(s(),w(R,{key:1,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-rotate-ccw",onClick:C[0]||(C[0]=u=>h.$emit("reset"))},{default:i(()=>[...C[2]||(C[2]=[$(" Reset view ",-1)])]),_:1}))])])}}}),Ml=Object.assign(Nl,{__name:"TimelineHeader"}),Ve={barHeight:24,rowGap:8,labelWidth:80,sidePadding:16,axisHeight:28,get rowHeight(){return this.barHeight+this.rowGap}},Al={passed:"#16a34a",failed:"#dc2626",timedOut:"#ea580c",running:"#2563eb",initialising:"#2563eb",skipped:"#9ca3af",cancelled:"#a1a1aa",interrupted:"#ea580c",flaky:"#ca8a04"},Se={fill:"#facc15",stroke:"#ca8a04",swatch:"#f59e0b"};function Xe(t){return Al[t]||"#a1a1aa"}function Pt(t){return Xe(t)+"66"}function Bt(t){return Xe(t)}function Ge(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 Ul=["y","width","height"],Ll=["y1","x2","y2"],El=["x1","y1","x2","y2"],Ol=["x1","y1","x2","y2"],Kl=["x","y"],Wl=["y"],Hl=ge({__name:"TimelineGrid",props:{workerRows:{},shardGroups:{},tickMarks:{},contentWidth:{},shardTotal:{}},setup(t){const{barHeight:h,rowGap:C,axisHeight:F,rowHeight:R}=Ve;return(c,_)=>(s(),a("g",null,[(s(!0),a(G,null,ae(t.workerRows,(u,T)=>(s(),a("rect",{key:"bg-"+T,x:0,y:T*e(R)+e(F),width:t.contentWidth,height:e(R),class:q(T%2===1?"fill-black/[0.03] dark:fill-white/[0.03]":"fill-transparent")},null,10,Ul))),128)),(s(!0),a(G,null,ae(t.shardGroups.slice(1),u=>(s(),a("line",{key:"shard-sep-"+u.rowRange[0],x1:0,y1:u.rowRange[0]*e(R)+e(F)-e(C)/2,x2:t.contentWidth,y2:u.rowRange[0]*e(R)+e(F)-e(C)/2,stroke:"currentColor","stroke-dasharray":"4,3",class:"stroke-gray-400 dark:stroke-gray-500"},null,8,Ll))),128)),n("line",{x1:e(Ve).labelWidth,y1:e(F),x2:t.contentWidth,y2:e(F),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,El),(s(!0),a(G,null,ae(t.tickMarks,u=>(s(),a("g",{key:u.ms},[n("line",{x1:u.x,y1:e(F)-4,x2:u.x,y2:e(F),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,Ol),n("text",{x:u.x,y:e(F)-8,"text-anchor":"middle",class:"fill-gray-400 text-[10px]"},l(u.label),9,Kl)]))),128)),(s(!0),a(G,null,ae(t.workerRows,(u,T)=>(s(),a("text",{key:"label-"+T,x:6,y:T*e(R)+e(F)+e(h)/2+4,class:"fill-gray-500 text-[11px] font-medium"},l(u.shardIndex!=null&&t.shardTotal&&t.shardTotal>1?`S${u.shardIndex} W${u.workerIndex}`:`Worker ${u.workerIndex}`),9,Wl))),128))]))}}),Vl=Object.assign(Hl,{__name:"TimelineGrid"}),Gl=["x","y","width","height","fill","stroke"],Xl=["x","y"],ql=["x","y","width","height","fill","stroke"],Yl=["x1","y1","x2","y2","stroke"],Jl=["x1","y1","x2","y2","stroke"],Zl=["x","y"],Ql=["cx","cy"],ei=["cx","cy"],ti=["x","y","width","height","fill"],si=["x","y"],ni=ge({__name:"TimelineBar",props:{item:{},x:{},y:{},width:{}},emits:["select","hover","move","leave"],setup(t,{emit:h}){const C=t,F=h,{barHeight:R}=Ve,c=D(()=>["setup","hook","fixture"].includes(C.item.kind)),_=D(()=>C.item.testCaseId!=null),u=D(()=>_.value?"cursor-pointer":"cursor-default");function T(){C.item.testCaseId!=null&&F("select",C.item.testCaseId)}return(E,N)=>(s(),a("g",{class:"timeline-bar-group",onMouseenter:N[0]||(N[0]=B=>F("hover",t.item,B)),onMousemove:N[1]||(N[1]=B=>F("move",B)),onMouseleave:N[2]||(N[2]=B=>F("leave"))},[c.value?(s(),a(G,{key:0},[n("rect",{x:t.x,y:t.y,width:t.width,height:e(R),rx:3,ry:3,fill:e(Pt)(t.item.status),stroke:e(Bt)(t.item.status),"stroke-width":"1","stroke-dasharray":"3,2",class:q(["timeline-bar-shape transition-opacity duration-100 opacity-80",u.value]),onClick:T},null,10,Gl),t.width>60?(s(),a("text",{key:0,x:t.x+4,y:t.y+e(R)/2+4,class:"fill-gray-600 dark:fill-gray-300 text-[9px] font-medium pointer-events-none"},l(t.item.title),9,Xl)):k("",!0)],64)):t.item.kind==="wait"?(s(),a(G,{key:1},[n("rect",{x:t.x,y:t.y-3,width:t.width,height:e(R)+6,rx:2,ry:2,fill:e(Se).fill,"fill-opacity":"0.28",stroke:e(Se).stroke,"stroke-width":"1.5",class:q(["timeline-bar-shape transition-opacity duration-100 opacity-90",u.value]),onClick:T},null,10,ql),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(R)+3,stroke:e(Se).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,Yl)):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(R)+3,stroke:e(Se).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,Jl)):k("",!0),t.width>50?(s(),a("text",{key:2,x:t.x+4,y:t.y+e(R)/2+4,class:"fill-yellow-800 dark:fill-yellow-200 text-[9px] font-bold pointer-events-none"}," wasted "+l(e(Ge)(t.item.duration)),9,Zl)):k("",!0)],64)):t.item.status==="running"?(s(),a(G,{key:2},[n("circle",{cx:t.x+6,cy:t.y+e(R)/2,r:"3",fill:"#2563eb",filter:"url(#glow)",class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:T},null,8,Ql),n("circle",{cx:t.x+6,cy:t.y+e(R)/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:T},null,8,ei)],64)):(s(),a(G,{key:3},[n("rect",{x:t.x,y:t.y,width:t.width,height:e(R),rx:3,ry:3,fill:e(Xe)(t.item.status),class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:T},null,8,ti),t.width>40?(s(),a("text",{key:0,x:t.x+4,y:t.y+e(R)/2+4,class:"fill-white text-[10px] font-medium pointer-events-none"},l(e(Ge)(t.item.duration)),9,si)):k("",!0)],64))],32))}}),ai=Object.assign(ni,{__name:"TimelineBar"}),oi={class:"flex items-center gap-2 mb-1"},li={class:"font-medium text-gray-900 dark:text-white max-w-64 truncate"},ii={class:"flex items-center gap-3 text-gray-500"},ri={class:"capitalize"},ui={key:0,class:"italic truncate max-w-48"},ci=340,di=ge({__name:"TimelineTooltip",props:{item:{},pos:{}},setup(t){const h=t,C=D(()=>{const R=h.item;return R?R.kind==="test"?{backgroundColor:Xe(R.status)}:R.kind==="wait"?{backgroundColor:Se.swatch+"66",borderColor:Se.swatch}:{backgroundColor:Pt(R.status),borderColor:Bt(R.status)}:{}}),F=D(()=>{const{x:R,y:c}=h.pos;if(typeof window>"u")return{left:`${R+12}px`,top:`${c-10}px`};const _=R+12+ci>window.innerWidth,u=c+90>window.innerHeight;return{left:_?void 0:`${R+12}px`,right:_?`${window.innerWidth-R+12}px`:void 0,top:u?void 0:`${c-10}px`,bottom:u?`${window.innerHeight-c+10}px`:void 0}});return(R,c)=>(s(),w(ns,{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:ye(F.value)},[n("div",oi,[n("span",{class:q(["inline-block size-2.5 rounded-full shrink-0",{"border border-dashed":t.item.kind!=="test"}]),style:ye(C.value)},null,6),n("span",li,[t.item.kind!=="test"?(s(),a("span",{key:0,class:q(["uppercase text-[10px] tracking-wider mr-1",t.item.kind==="wait"?"text-amber-500":"text-gray-500"])},l(t.item.kind),3)):k("",!0),$(" "+l(t.item.title),1)])]),n("div",ii,[n("span",ri,l(t.item.status),1),n("span",null,l(e(Ge)(t.item.duration)),1),n("span",null,"Worker "+l(t.item.workerIndex),1),t.item.parentTitle?(s(),a("span",ui," for "+l(t.item.parentTitle),1)):k("",!0)])],4)):k("",!0)]))}}),mi=Object.assign(di,{__name:"TimelineTooltip"}),fi=["Wait for timeout*","*waitForTimeout*"];function gi(t){const h=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${h}$`,"i")}const mt=new Map;function pi(t){let h=mt.get(t);return h||(h=gi(t),mt.set(t,h)),h}function xi(t,h){if(!h||h.length===0)return!1;const C=t.title??"",F=t.location??"";for(const R of h){const c=pi(R);if(c.test(C)||F&&c.test(F))return!0}return!1}function yi(t){const h=new Map;for(const C of t){const F=C.workerIndex;if(F==null||F<0)continue;const R=C.shardIndex??null,c=`${R??"null"}|${F}`;let _=h.get(c);_||(_={shardIndex:R,workerIndex:F,cases:[]},h.set(c,_)),_.cases.push(C)}return[...h.values()].sort((C,F)=>{const R=C.shardIndex??1/0,c=F.shardIndex??1/0;return R!==c?R-c:C.workerIndex-F.workerIndex})}function We(t){if(t==null)return null;if(typeof t=="number")return Number.isFinite(t)?t:null;if(t instanceof Date)return t.getTime();const h=new Date(t).getTime();return Number.isNaN(h)?null:h}function hi(t,h){return t.category==="wait"?xi(t,h)?"wait":null:t.category==="hook"||t.category==="fixture"?t.category:null}function vi(t){const h=D(()=>t.wastedPatterns&&t.wastedPatterns.length>0?t.wastedPatterns:fi),C=D(()=>yi(t.testCases)),F=D(()=>{const u=C.value,T=h.value;let E=1/0;for(const H of u)for(const A of H.cases){const m=We(A.startedAt);m!=null&&m>0&&(E=Math.min(E,m))}const N=Number.isFinite(E),B=H=>Math.max(0,(We(H)??E)-E),S=[],P=new Map;if(u.forEach((H,A)=>{const m=[],I=N?H.cases:[...H.cases].sort((d,f)=>(We(d.startedAt)??0)-(We(f.startedAt)??0));let x=0;for(const d of I){const f=d.duration??1e3,U=N?B(d.startedAt):x;m.push({key:`t${d.id}`,kind:"test",testCaseId:d.id,title:d.title,status:d.status,workerIndex:H.workerIndex,start:U,duration:f,rowIndex:A}),x=U+f,(d.stepEvents??[]).forEach((M,y)=>{const J=hi(M,T);if(!J)return;const ee=M.duration||0,ne=N?B(M.startedAt):x;m.push({key:`s${d.id}:${y}`,kind:J,testCaseId:d.id,title:M.title,status:M.status||"passed",workerIndex:H.workerIndex,start:ne,duration:ee,rowIndex:A,parentTitle:d.title}),x=ne+ee})}m.sort((d,f)=>d.start-f.start),S.push(...m),P.has(H.workerIndex)||P.set(H.workerIndex,x)}),t.setupSteps&&t.setupSteps.length>0){const H=new Map;u.forEach((A,m)=>{H.has(A.workerIndex)||H.set(A.workerIndex,m)}),t.setupSteps.forEach((A,m)=>{const I=A.workerIndex;if(I==null||I<0)return;const x=H.get(I);if(x==null)return;const d=A.duration||0;let f;N?f=B(A.startedAt):(f=P.get(I)??0,P.set(I,f+d)),S.push({key:`setup${I}:${m}`,kind:"setup",testCaseId:null,title:`[Setup] ${A.title}`,status:A.status||"passed",workerIndex:I,start:f,duration:d,rowIndex:x,parentTitle:null})})}return S}),R=D(()=>C.value.map(u=>({shardIndex:u.shardIndex,workerIndex:u.workerIndex}))),c=D(()=>{const u=[];for(let T=0;T<R.value.length;T++){const E=R.value[T],N=u[u.length-1];!N||N.shardIndex!==E.shardIndex?u.push({shardIndex:E.shardIndex,rowRange:[T,T]}):N.rowRange[1]=T}return u}),_=D(()=>{let u=0;for(const T of F.value)u=Math.max(u,T.start+T.duration);return u||6e4});return{timelineData:F,workerRows:R,shardGroups:c,maxTime:_}}const ft=1.12,ki=10,bi=100,Qe=[10,20,50,100,200,500,1e3,2e3,5e3,1e4,15e3,3e4,6e4,12e4,3e5,6e5,9e5,18e5,36e5];function wi(t){const{containerRef:h,maxTime:C,rowCount:F,hasData:R,live:c}=t,{labelWidth:_,sidePadding:u,axisHeight:T,rowHeight:E}=Ve,N=K(1),B=K(0),S=K(!1),P=K(0),H=K(0),A=D(()=>.5*N.value),m=D(()=>C.value*A.value+_+u),I=D(()=>F.value*E+T);function x(b){return b.start*A.value+_}function d(b){return Math.max(b.duration*A.value,3)}function f(b){return b.rowIndex*E+T}function U(){const b=h.value?.clientWidth;if(!b||C.value<=0)return 1;const V=(b-_)/C.value;return Math.min(1,V/.5)}function v(){const b=U();b>0&&(N.value=b,B.value=0)}function M(b){if(!h.value)return b;const V=h.value.clientWidth;return m.value<=V?0:Math.max(V-m.value,Math.min(0,b))}function y(b,V){const se=Math.max(U(),Math.min(ki,b)),te=se/N.value;N.value=se,B.value=M(V-(V-B.value)*te)}const J=D(()=>{const b=bi/A.value;let V=Qe.find(te=>te>=b)??Qe[Qe.length-1];for(;C.value/V>1e3;)V*=2;const se=[];for(let te=0;te<=C.value;te+=V)se.push({ms:te,x:te*A.value+_,label:Ge(te)});return se});function ee(b){if(c())return;const V=b.deltaY>0?1/ft:ft,se=h.value?.getBoundingClientRect();y(N.value*V,se?b.clientX-se.left:0)}const ne=4,Q=new Map;let ie=null,O=0,g=1,z=0;function re(b,V){ie=b,P.value=V,H.value=B.value}function p(b){if(!c()&&!(b.pointerType==="mouse"&&b.button!==0)){if(Q.set(b.pointerId,{x:b.clientX,y:b.clientY}),Q.size===1)re(b.pointerId,b.clientX);else if(Q.size===2){ie=null,S.value=!1;for(const xe of Q.keys())h.value?.setPointerCapture?.(xe);const[V,se]=[...Q.values()];O=Math.hypot(V.x-se.x,V.y-se.y)||1,g=N.value;const te=h.value?.getBoundingClientRect();z=(V.x+se.x)/2-(te?.left??0)}b.preventDefault()}}function j(b){if(!(c()||!Q.has(b.pointerId))){if(Q.set(b.pointerId,{x:b.clientX,y:b.clientY}),Q.size>=2){const[V,se]=[...Q.values()],te=Math.hypot(V.x-se.x,V.y-se.y)||1;y(g*(te/O),z);return}S.value?B.value=M(H.value+(b.clientX-P.value)):ie===b.pointerId&&Math.abs(b.clientX-P.value)>ne&&(h.value?.setPointerCapture?.(b.pointerId),S.value=!0,B.value=M(H.value+(b.clientX-P.value)))}}function Y(b){if(Q.delete(b.pointerId),ie===b.pointerId&&(ie=null),h.value?.releasePointerCapture?.(b.pointerId),Q.size===1){const[V]=[...Q.entries()];re(V[0],V[1].x)}else Q.size===0&&(S.value=!1)}function oe(){v()}let Z=null;return as(()=>{De(v),h.value&&(Z=new ResizeObserver(()=>v()),Z.observe(h.value))}),ht(()=>{Z?.disconnect()}),me(()=>[c(),R.value,C.value,F.value],([b,V])=>{b&&V&&De(v)}),{panX:B,isPanning:S,pxPerMs:A,contentWidth:m,contentHeight:I,getBarX:x,getBarWidth:d,getBarTop:f,tickMarks:J,onWheel:ee,onPointerDown:p,onPointerMove:j,onPointerUp:Y,resetView:oe}}const _i={key:0,class:"relative select-none"},$i=["width","height"],Ci={key:1,class:"text-center py-10 text-gray-500"},Ti=ge({__name:"WorkersTimeline",props:{testCases:{},setupSteps:{},shardTotal:{},live:{type:Boolean},wastedPatterns:{}},emits:["selectTestCase"],setup(t,{emit:h}){const C=t,F=h,{timelineData:R,workerRows:c,shardGroups:_,maxTime:u}=vi(C),T=K(null),E=D(()=>c.value.length),N=D(()=>R.value.length>0),{panX:B,isPanning:S,contentWidth:P,contentHeight:H,getBarX:A,getBarWidth:m,getBarTop:I,tickMarks:x,onWheel:d,onPointerDown:f,onPointerMove:U,onPointerUp:v,resetView:M}=wi({containerRef:T,maxTime:u,rowCount:E,hasData:N,live:()=>C.live}),y=D(()=>R.value.filter(Z=>Z.kind==="test").length),J=D(()=>R.value.filter(Z=>Z.kind!=="test"&&Z.kind!=="wait").length),ee=D(()=>R.value.filter(Z=>Z.kind==="wait").length),ne=["test","setup","hook","fixture","wait"],Q={test:"Tests",setup:"Setup (beforeAll/afterAll)",hook:"Hooks",fixture:"Fixtures",wait:"Wasted waits"},ie=K({}),O=D(()=>R.value.filter(Z=>!ie.value[Z.kind])),g=D(()=>{const Z=new Set(R.value.map(b=>b.kind));return ne.filter(b=>Z.has(b)).map(b=>({key:b,label:Q[b],checked:!ie.value[b]}))});function z(Z,b){ie.value={...ie.value,[Z]:!b}}const re=K(null),p=K({x:0,y:0});me(O,Z=>{re.value&&(re.value=Z.find(b=>b.key===re.value.key)??null)});function j(Z,b){re.value=Z,p.value={x:b.clientX,y:b.clientY}}function Y(Z){p.value={x:Z.clientX,y:Z.clientY}}function oe(){re.value=null}return(Z,b)=>{const V=Ml,se=Vl,te=ai,xe=mi,we=he;return e(R).length>0?(s(),a("div",_i,[o(V,{"worker-count":e(c).length,"shard-total":t.shardTotal,"test-count":y.value,"hook-count":J.value,"wait-count":ee.value,"span-types":g.value,live:t.live,onToggleSpan:z,onReset:e(M)},null,8,["worker-count","shard-total","test-count","hook-count","wait-count","span-types","live","onReset"]),n("div",{ref_key:"containerRef",ref:T,class:q(["relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 touch-pan-y",{"cursor-grab":!e(S),"cursor-grabbing":e(S)}]),style:ye({height:e(H)+"px"}),onWheel:b[1]||(b[1]=Ne((...le)=>e(d)&&e(d)(...le),["prevent"])),onPointerdown:b[2]||(b[2]=(...le)=>e(f)&&e(f)(...le)),onPointermove:b[3]||(b[3]=(...le)=>e(U)&&e(U)(...le)),onPointerup:b[4]||(b[4]=(...le)=>e(v)&&e(v)(...le)),onPointercancel:b[5]||(b[5]=(...le)=>e(v)&&e(v)(...le)),onPointerleave:b[6]||(b[6]=(...le)=>e(v)&&e(v)(...le))},[(s(),a("svg",{class:"overflow-visible",style:ye({transform:`translateX(${e(B)}px)`}),width:e(P),height:e(H)},[b[7]||(b[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)),o(se,{"worker-rows":e(c),"shard-groups":e(_),"tick-marks":e(x),"content-width":e(P),"shard-total":t.shardTotal},null,8,["worker-rows","shard-groups","tick-marks","content-width","shard-total"]),(s(!0),a(G,null,ae(O.value,le=>(s(),w(te,{key:le.key,item:le,x:e(A)(le),y:e(I)(le),width:e(m)(le),onSelect:b[0]||(b[0]=_e=>F("selectTestCase",_e)),onHover:j,onMove:Y,onLeave:oe},null,8,["item","x","y","width"]))),128))],12,$i))],38),o(xe,{item:re.value,pos:p.value},null,8,["item","pos"])])):(s(),a("div",Ci,[o(we,{name:"i-lucide-rows-3",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),b[8]||(b[8]=n("p",null,"No worker data available for this run.",-1))]))}}}),Ri=Object.assign(Ti,{__name:"WorkersTimeline"}),zi={key:0,class:"space-y-4"},Ii={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Si={class:"flex items-center gap-2 py-1.5"},Fi={class:"font-medium"},Di={key:0,class:"flex"},ji={key:1,class:"flex items-center justify-center py-6 text-gray-500 gap-2"},Pi={class:"flex flex-wrap gap-2 mt-1"},Bi={class:"flex flex-wrap gap-4 text-sm"},Ni={key:3,class:"text-sm text-gray-500"},Mi={class:"flex flex-wrap gap-4 text-sm"},Ai={key:0,class:"text-gray-400"},Ui={key:0,class:"text-gray-400"},Li={key:1,class:"text-gray-400"},Ei={key:1,class:"text-gray-400"},Oi={key:0,class:"text-gray-400"},Ki={key:0,class:"text-gray-400"},Wi={key:4,class:"text-center py-8 text-gray-500"},Hi={key:5,class:"text-center py-8 text-gray-500"},Vi={key:1,class:"text-center py-10 text-gray-500"},Gi=ge({__name:"RunCompare",props:{testRun:{}},setup(t){const h=t,F=Le().params.id,R=K(null),c=K([]),_=D(()=>h.testRun?.status==="running"||h.testRun?.status==="finalizing");me(()=>h.testRun?.projectId,async x=>{if(!(!x||_.value)){try{R.value=await $fetch(`/api/projects/${x}`)}catch(d){console.error("Failed to fetch project for RunCompare",d)}try{const d=await $fetch(`/api/projects/${x}/markers`);c.value=d.markers??[]}catch{}}},{immediate:!0});const u=D(()=>{if(!B.value||!h.testRun)return[];const x=new Date(B.value.startTime).getTime(),d=new Date(h.testRun.startTime).getTime(),f=Math.min(x,d),U=Math.max(x,d),v=new Set([B.value.environment,h.testRun.environment].filter(M=>M!=null));return c.value.filter(M=>{const y=new Date(M.occurredAt).getTime();return y<=f||y>=U?!1:M.environment==null||v.has(M.environment)})}),T=D(()=>R.value?.testRuns?R.value.testRuns.filter(x=>x.id!==Number(F)).slice(0,50).map(x=>({label:`Run #${x.id} — ${bt(x.startTime,{dateOnly:!0})} (${x.status})`,value:x.id})):[]),E=D(()=>{if(!R.value?.testRuns)return null;const x=[...R.value.testRuns].sort((f,U)=>new Date(U.startTime).getTime()-new Date(f.startTime).getTime()),d=x.findIndex(f=>f.id===Number(F));return d>=0&&d<x.length-1?x[d+1].id:null}),N=K(void 0),B=K(null),S=K(!1);me(N,async x=>{if(!x?.value){B.value=null;return}S.value=!0;try{B.value=await $fetch(`/api/test-runs/${x.value}`)}catch{}finally{S.value=!1}});function P(){if(E.value){const x=T.value.find(d=>d.value===E.value);x&&(N.value=x)}}const H=D(()=>h.testRun??null),{comparisonData:A,comparisonSummary:m}=Ms(B,H),I=[{accessorKey:"title",header:ce("Test case")},{accessorKey:"statusA",header:ce("Status A")},{accessorKey:"statusB",header:ce("Status B")},{accessorKey:"durationA",header:ce("Duration A")},{accessorKey:"durationB",header:ce("Duration B")},{accessorKey:"delta",header:ce("Delta")},{accessorKey:"percentChange",header:ce("Change")}];return(x,d)=>{const f=Ps,U=Bs,v=Re,M=he,y=kt,J=Ns,ee=ve,ne=Ee,Q=ot,ie=Ft;return s(),a("div",null,[t.testRun&&!_.value?(s(),a("div",zi,[n("div",Ii,[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)),o(f,{modelValue:N.value,"onUpdate:modelValue":d[0]||(d[0]=O=>N.value=O),items:T.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",Si,[o(U,{status:t.testRun.status},null,8,["status"]),n("span",Fi,"#"+l(t.testRun.id),1)])])]),E.value?(s(),a("div",Di,[o(v,{icon:"i-lucide-arrow-left-right",size:"sm",variant:"outline",label:"Compare with previous run",onClick:P})])):k("",!0),S.value?(s(),a("div",ji,[o(M,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),d[3]||(d[3]=n("span",null,"Loading baseline data...",-1))])):u.value.length>0?(s(),w(J,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-milestone",title:`${u.value.length} timeline marker${u.value.length>1?"s":""} between these runs`},{description:i(()=>[n("div",Pi,[(s(!0),a(G,null,ae(u.value,O=>(s(),w(y,{key:O.id,marker:O,size:"sm"},null,8,["marker"]))),128))])]),_:1},8,["title"])):B.value&&e(A).length>0?(s(),a(G,{key:3},[n("div",Bi,[d[4]||(d[4]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status",-1)),e(m).newFailures>0?(s(),w(ee,{key:0,color:"error",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(m).newFailures)+" new failure"+l(e(m).newFailures>1?"s":""),1)]),_:1})):k("",!0),e(m).recovered>0?(s(),w(ee,{key:1,color:"success",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(m).recovered)+" recovered ",1)]),_:1})):k("",!0),e(m).stillFailing>0?(s(),w(ee,{key:2,color:"warning",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(m).stillFailing)+" still failing ",1)]),_:1})):k("",!0),e(m).newFailures===0&&e(m).recovered===0&&e(m).stillFailing===0?(s(),a("span",Ni,"No status changes")):k("",!0)]),n("div",Mi,[d[5]||(d[5]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(m).regressed>0?(s(),w(ee,{key:0,color:"error",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(m).regressed)+" regressed ",1)]),_:1})):k("",!0),e(m).improved>0?(s(),w(ee,{key:1,color:"success",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(m).improved)+" improved ",1)]),_:1})):k("",!0),o(ee,{color:"neutral",variant:"soft",size:"lg"},{default:i(()=>[$(l(e(m).unchanged)+" unchanged ",1)]),_:1})]),o(ie,{"min-width":"48rem",bleed:!1},{default:i(()=>[o(Q,{data:e(A),columns:I,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":i(({row:O})=>[O.original.statusA?(s(),w(ee,{key:1,color:("getStatusColor"in x?x.getStatusColor:e(st))(O.original.statusA),variant:"subtle",class:"capitalize"},{default:i(()=>[$(l(O.original.statusA),1)]),_:2},1032,["color"])):(s(),a("span",Ai,"—"))]),"statusB-cell":i(({row:O})=>[O.original.statusB?(s(),w(ee,{key:1,color:("getStatusColor"in x?x.getStatusColor:e(st))(O.original.statusB),variant:"subtle",class:"capitalize"},{default:i(()=>[$(l(O.original.statusB),1)]),_:2},1032,["color"])):(s(),a("span",Ui,"—"))]),"durationA-cell":i(({row:O})=>[O.original.durationA!==null?(s(),w(ne,{key:0,ms:O.original.durationA},null,8,["ms"])):(s(),a("span",Li,"—"))]),"durationB-cell":i(({row:O})=>[O.original.durationB!==null?(s(),w(ne,{key:0,ms:O.original.durationB},null,8,["ms"])):(s(),a("span",Ei,"—"))]),"delta-cell":i(({row:O})=>[O.original.delta===null?(s(),a("span",Oi,"—")):(s(),a("span",{key:1,class:q(O.original.delta>0?"text-red-600":O.original.delta<0?"text-green-600":"text-gray-500")},[$(l(O.original.delta>0?"+":""),1),o(ne,{ms:O.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":i(({row:O})=>[O.original.percentChange===null?(s(),a("span",Ki,"—")):(s(),a("span",{key:1,class:q(O.original.percentChange>10?"text-red-600 font-medium":O.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},l(O.original.percentChange>0?"+":"")+l(O.original.percentChange)+"% ",3))]),_:1},8,["data"])]),_:1})],64)):N.value&&!S.value?(s(),a("div",Wi,[o(M,{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",Hi,[o(M,{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))]))])):_.value?(s(),a("div",Vi,[o(M,{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)])}}}),Xi=Object.assign(Gi,{__name:"RunCompare"}),qi={class:"flex flex-col overflow-hidden"},Yi={key:0,class:"flex-1 flex items-center justify-center text-gray-500 gap-2"},Ji={class:"text-xs font-mono break-all"},Zi={key:0,class:"text-gray-400"},Qi={key:1,class:"text-red-600 font-medium"},er={key:2,class:"flex-1 flex items-center justify-center text-center text-gray-500"},tr=ge({__name:"SlowEndpoints",props:{refreshKey:{}},emits:["endpointsCount"],async setup(t,{emit:h}){let C,F;const c=Le().params.id,_=t,u=h,{data:T,pending:E,refresh:N}=([C,F]=Me(()=>Ae(`/api/test-runs/${c}/network-requests`,{lazy:!0,server:!1},"$DE3r8oSbIq")),C=await C,F(),C);me(T,S=>{u("endpointsCount",S?.length??0)}),me(()=>_.refreshKey,(S,P)=>{S!==P&&S!==void 0&&N()});const B=[{accessorKey:"method",header:ce("Method")},{accessorKey:"route",header:ce("Route")},{accessorKey:"count",header:ce("Calls")},{accessorKey:"avgDuration",header:ce("Avg")},{accessorKey:"p90Duration",header:ce("P90")},{accessorKey:"maxDuration",header:ce("Max")},{accessorKey:"errorRate",header:ce("Errors")}];return(S,P)=>{const H=he,A=ve,m=Ee,I=ot;return s(),a("div",qi,[e(E)?(s(),a("div",Yi,[o(H,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),P[0]||(P[0]=n("span",null,"Loading network data...",-1))])):e(T)&&e(T).length>0?(s(),w(I,{key:1,sticky:"",data:e(T),columns:B,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":i(({row:x})=>[o(A,{color:x.original.method==="GET"?"info":x.original.method==="POST"?"success":x.original.method==="PUT"||x.original.method==="PATCH"?"warning":x.original.method==="DELETE"?"error":"neutral",variant:"soft",class:"font-mono text-xs"},{default:i(()=>[$(l(x.original.method),1)]),_:2},1032,["color"])]),"route-cell":i(({row:x})=>[n("code",Ji,l(x.original.route),1)]),"avgDuration-cell":i(({row:x})=>[n("span",{class:q(x.original.avgDuration>1e3?"text-red-600 font-medium":x.original.avgDuration>500?"text-orange-500 font-medium":"")},[o(m,{ms:x.original.avgDuration,"unit-class":"opacity-60"},null,8,["ms"])],2)]),"p90Duration-cell":i(({row:x})=>[n("span",{class:q(x.original.p90Duration>2e3?"text-red-600 font-medium":x.original.p90Duration>1e3?"text-orange-500":"")},[o(m,{ms:x.original.p90Duration,"unit-class":"opacity-60"},null,8,["ms"])],2)]),"errorRate-cell":i(({row:x})=>[x.original.errorRate===0?(s(),a("span",Zi,"0%")):(s(),a("span",Qi,l(x.original.errorRate)+"%",1))]),_:1},8,["data"])):(s(),a("div",er,[o(H,{name:"i-lucide-wifi-off",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),P[1]||(P[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))]))])}}}),sr=Object.assign(tr,{__name:"SlowEndpoints"}),nr={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"},ar={key:0,class:"flex items-center gap-2 mb-3 shrink-0"},iu=ge({__name:"[id]",async setup(t){let h,C;const F=Le(),R=os(),c=F.params.id,_=!!xt().public.demoMode,{data:u,refresh:T}=([h,C]=Me(()=>Ae(`/api/test-runs/${c}`,"$D01RBpMFGT")),h=await h,C(),h),E=u.value?.projectId,{data:N,refresh:B}=E?([h,C]=Me(()=>Ae(`/api/projects/${E}/latest-run`,{key:`latest-run-${E}`},"$e4OLHgXNMR")),h=await h,C(),h):{data:K(null),refresh:async()=>{}};As(B);const S=D(()=>N.value?.id??u.value?.project?.latestRunId??null),P=D(()=>N.value?.status??u.value?.project?.latestRunStatus??null),H=D(()=>P.value==="running"||P.value==="finalizing");ls(D(()=>({title:`Test run #${c}${u.value?.project?` — ${u.value.project.name}`:""} — Piwi Dashboard`})));const A=gt(),m=K(!1),I=K(!1),x=D(()=>u.value?.status==="running"||u.value?.status==="finalizing"),d=K(!1),f=K([]),U=new Map,v=K(null);let M=null;const y=K([]);me([x,u],()=>{x.value&&f.value.length>0?y.value=[...f.value]:u.value?.testCases?y.value=u.value.testCases:y.value=[]},{immediate:!0});function J(L){for(const W of L){const ue=`${W.title}@@${W.location}@@${JSON.stringify(W.browser)}`;U.has(ue)||(U.set(ue,!0),f.value=[...f.value,W])}y.value=[...f.value]}let ee=[],ne=null;function Q(){if(ee.length===0)return;const L=ee;ee=[];for(const W of L){const ue=W.data;if(W.type==="init")v.value={totalTests:ue.totalTests,passedTests:ue.passedTests,failedTests:ue.failedTests,skippedTests:ue.skippedTests};else if(W.type==="test-begin"){const X=ue;if(X.stepCategory)continue;const Te=`${X.title}@@${X.location}@@${JSON.stringify(X.browser)}`;U.has(Te)||(U.set(Te,!0),f.value=[...f.value,{id:f.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}],y.value=[...f.value])}else if(W.type==="test-completed"){const X=ue;if(X.stepCategory)continue;const Te=`${X.title}@@${X.location}@@${JSON.stringify(X.browser)}`;if(U.has(Te)){const Pe=f.value.findIndex(pe=>`${pe.title}@@${pe.location}@@${JSON.stringify(pe.browser)}`===Te);if(Pe>=0){const pe=f.value[Pe],Be=[...f.value];Be[Pe]={...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},f.value=Be,y.value=[...Be]}}else U.set(Te,!0),f.value=[...f.value,{id:f.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}],y.value=[...f.value]}else W.type==="run-progress"?v.value=ue:W.type==="run-finalizing"?(d.value=!0,v.value=ue):W.type==="run-finished"&&(d.value=!1,p(),T(),be.value++,ie())}}function ie(L=0){_||L>=5||setTimeout(async()=>{await T(),ie(L+1)},1500*(L+1))}function O(L){ee.push(L),ne&&clearTimeout(ne),ne=setTimeout(Q,200)}let g=null;function z(){g||(u.value?.testCases?.length&&J(u.value.testCases),g=Us(L=>{L.scope==="run"&&L.runId===Number(c)?O(L.event):L.scope==="global"&&L.event.runId===Number(c)&&L.event.type==="run-started"&&T()}))}function re(){if(_){z();return}M||x.value&&(u.value?.testCases?.length&&J(u.value.testCases),M=new EventSource(`/api/test-runs/${c}/stream`),M.onmessage=L=>{try{O(JSON.parse(L.data))}catch{}},M.onerror=()=>{})}function p(){M&&(M.close(),M=null),g&&(g(),g=null)}const j=D(()=>x.value||_&&u.value?.status==="initialising");me(j,L=>{L?re():p()},{immediate:!0}),ht(()=>{p()});let Y=null;const oe=K([]);me(y,L=>{Y===null&&(Y=requestAnimationFrame(()=>{oe.value=L,Y=null}))},{immediate:!0});const Z=D(()=>x.value&&v.value?v.value:u.value?{totalTests:u.value.totalTests,passedTests:u.value.passedTests,failedTests:u.value.failedTests,skippedTests:u.value.skippedTests}:null);async function b(){m.value=!1,I.value=!0;try{await $fetch(`/api/test-runs/${c}`,{method:"DELETE"}),A.add({title:"Test run deleted",color:"success"}),await He(`/projects/${u.value?.project?.id}`)}catch(L){const W=L&&typeof L=="object"&&"data"in L?L.data?.message:void 0;A.add({title:"Delete failed",description:W||"An error occurred",color:"error"})}finally{I.value=!1}}const V=K(!1),se=K(""),te=K([]),xe=K("all"),we=D(()=>te.value.length===1?te.value[0]:"all");function le(L){te.value=!L||L==="all"?[]:[L]}const _e=D(()=>u.value?.reports||[]),$e=D(()=>{const L=y.value;return L?L.reduce((W,ue)=>W+(ue.wastedTimeMs??0),0):0}),fe=K("test-cases"),ke=K(null),be=K(0),ze=K(0);function r(){ke.value=null}const Ce=D(()=>u.value&&u.value.failedTests>0),qe=D(()=>{if(!u.value?.testCases)return 0;const L=new Set;for(const W of u.value.testCases)W.failureClusterId!=null&&L.add(W.failureClusterId);return L.size}),Oe=D(()=>{const L=x.value?y.value:u.value?.testCases;if(!L||L.length===0)return 0;const W=new Set;for(const ue of L)ue.workerIndex!=null&&ue.workerIndex>=0&&W.add(ue.workerIndex);return W.size}),lt=D(()=>[{label:`Test cases (${y.value.length})`,icon:"i-lucide-beaker",value:"test-cases",slot:"test-cases"},{label:"Insights",icon:"i-lucide-sparkles",value:"insights",slot:"insights"},{label:Ce.value?`Failure groups (${qe.value})`:"Failure groups",icon:"i-lucide-layers",value:"failure-groups",slot:"failure-groups",disabled:!Ce.value},{label:"Regression",icon:"i-lucide-git-pull-request-arrow",value:"regression",slot:"regression",disabled:!Ce.value},{label:`Timeline${Oe.value>0?` (${Oe.value})`:""}`,icon:"i-lucide-timeline",value:"workers",slot:"workers"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"},{label:`Slow endpoints${ze.value>0?` (${ze.value})`:""}`,icon:"i-lucide-network",value:"endpoints",slot:"endpoints"}]),Nt={"test-cases":"overflow-hidden flex flex-col",endpoints:"overflow-hidden flex flex-col"},it=D(()=>lt.value.filter(L=>!L.disabled).map(L=>L.value));typeof F.query.tab=="string"&&it.value.includes(F.query.tab)&&(fe.value=F.query.tab),me(it,L=>{L.includes(fe.value)||(fe.value="test-cases")}),me(fe,L=>{F.query.tab!==L&&R.replace({query:{...F.query,tab:L}})});const rt=K(null);function Mt(L){fe.value="test-cases",De(()=>{rt.value?.scrollToCase(L)})}function At(L){ke.value=L,fe.value="test-cases"}return(L,W)=>{const ue=Qt,X=Ue,Te=he,Pe=vt,pe=is,Be=rs,Ut=cs,Lt=Mn,Et=ve,Ye=Re,Ot=Pa,Kt=Do,Wt=sl,Ht=Fl,Vt=Ri,Gt=Xi,Xt=sr,qt=xs,Yt=us,Jt=Dt,Zt=yt;return s(),a(G,null,[o(Yt,{id:"test-run-detail"},{header:i(()=>[o(Ut,null,{leading:i(()=>[o(ue),o(pe,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...e(u)?.project?.id?[{label:e(u).project.label||e(u).project.name||"Project",to:`/projects/${e(u).project.id}`,slot:"project"}]:[{label:"Project"}],{label:`Run #${e(c)}`+(e(u)?.label?` — ${e(u).label}`:"")}]},{project:i(({item:de})=>[o(X,{to:de?.to,class:"text-sm font-medium text-[var(--ui-text-muted)] hover:text-[var(--ui-text)] transition-colors"},{default:i(()=>[$(l(de?.label),1)]),_:2},1032,["to"]),S.value&&S.value!==Number(e(c))?(s(),w(Pe,{key:0,text:H.value?"Go to running run":"Go to latest run"},{default:i(()=>[o(X,{to:`/test-runs/${S.value}`},{default:i(()=>[n("span",nr,[o(Te,{name:"i-lucide-circle-play",class:q(["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:i(()=>[o(Be,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>e(T)()},{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:e(I),onClick:()=>m.value=!0}]},null,8,["actions"])]),_:1})]),body:i(()=>[o(qt,{modelValue:e(fe),"onUpdate:modelValue":W[5]||(W[5]=de=>Ie(fe)?fe.value=de:null),"tab-items":lt.value,"tab-panel-class":Nt},{summary:i(()=>[e(u)?(s(),w(Lt,{key:0,"test-run":e(u),"display-progress":Z.value,"all-reports":_e.value,"show-custom-data":e(V),finalizing:e(d),"active-filter":we.value,"total-wasted-time":$e.value,"onUpdate:showCustomData":W[0]||(W[0]=de=>V.value=de),onFilterStatus:le,onLabelUpdated:e(T)},null,8,["test-run","display-progress","all-reports","show-custom-data","finalizing","active-filter","total-wasted-time","onLabelUpdated"])):k("",!0)]),"tab-test-cases":i(()=>[e(ke)!=null?(s(),a("div",ar,[o(Et,{color:"info",variant:"subtle",size:"sm"},{default:i(()=>[...W[8]||(W[8]=[$(" Filtered by failure group ",-1)])]),_:1}),o(Ye,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",label:"Clear filter",onClick:r})])):k("",!0),o(Ot,{ref_key:"testCasesListRef",ref:rt,search:e(se),"onUpdate:search":W[1]||(W[1]=de=>Ie(se)?se.value=de:null),"active-statuses":e(te),"onUpdate:activeStatuses":W[2]||(W[2]=de=>Ie(te)?te.value=de:null),"browser-filter":e(xe),"onUpdate:browserFilter":W[3]||(W[3]=de=>Ie(xe)?xe.value=de:null),"test-cases":e(y),suites:e(u)?.suites??[],"is-live":x.value,"failure-cluster-filter":e(ke),"project-key":e(u)?.projectId,"project-name":e(u)?.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":i(()=>[o(Kt,{"test-run-id":Number(e(c)),"run-status":e(u)?.status??"","refresh-key":e(be),class:"flex-1 min-h-0 p-4"},null,8,["test-run-id","run-status","refresh-key"])]),"tab-failure-groups":i(()=>[o(Wt,{"refresh-key":e(be),onSelectCluster:At},null,8,["refresh-key"])]),"tab-regression":i(()=>[o(Ht,{"refresh-key":e(be)},null,8,["refresh-key"])]),"tab-workers":i(()=>[o(Vt,{"test-cases":e(oe),"setup-steps":e(u)?.setupSteps??null,"shard-total":e(u)?.shardTotal??null,live:x.value,"wasted-patterns":e(u)?.wastedWaitPatterns??null,onSelectTestCase:Mt},null,8,["test-cases","setup-steps","shard-total","live","wasted-patterns"])]),"tab-compare":i(()=>[o(Gt,{"test-run":e(u)},null,8,["test-run"])]),"tab-endpoints":i(()=>[o(Xt,{"refresh-key":e(be),class:"flex-1 min-h-0",onEndpointsCount:W[4]||(W[4]=de=>ze.value=de)},null,8,["refresh-key"])]),_:1},8,["modelValue","tab-items"])]),_:1}),o(Zt,null,{default:i(()=>[o(Jt,{open:e(m),title:"Delete test run","onUpdate:open":W[7]||(W[7]=de=>m.value=de)},{body:i(()=>[n("p",null,[W[9]||(W[9]=$(" Are you sure you want to delete ",-1)),n("strong",null,"Test Run #"+l(e(u)?.id),1),W[10]||(W[10]=$("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:i(()=>[o(Ye,{color:"neutral",variant:"ghost",label:"Cancel",onClick:W[6]||(W[6]=de=>m.value=!1)}),o(Ye,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(I),onClick:b},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{iu as default};
|