@piwitests/server 0.20.0 → 0.22.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/2VtBYkNh.js +1 -0
- package/.output/public/_nuxt/{BmUfSNMV.js → 3xlGO1qT.js} +1 -1
- package/.output/public/_nuxt/{DeY2JkR2.js → 4yvOL9PC.js} +1 -1
- package/.output/public/_nuxt/6-ivqM_I.js +17 -0
- package/.output/public/_nuxt/{BrQEE053.js → 9N6hSApy.js} +1 -1
- package/.output/public/_nuxt/{hC_z4G8p.js → 9P8iHISX.js} +1 -1
- package/.output/public/_nuxt/B-6GGrhr.js +1 -0
- package/.output/public/_nuxt/B09ddw9C.js +1 -0
- package/.output/public/_nuxt/{Dpd16JVI.js → B0hK-xDF.js} +1 -1
- package/.output/public/_nuxt/{BdfhYr-u.js → B2a-Phk3.js} +1 -1
- package/.output/public/_nuxt/{B99fbi73.js → B6s20NbT.js} +1 -1
- package/.output/public/_nuxt/B9FSuKdA.js +1 -0
- package/.output/public/_nuxt/B9kt7ySS.js +5 -0
- package/.output/public/_nuxt/BDQCwxpX.js +1 -0
- package/.output/public/_nuxt/{oAClCn_h.js → BFcdtAzg.js} +1 -1
- package/.output/public/_nuxt/{CeG9pBAD.js → BH-ym1CI.js} +1 -1
- package/.output/public/_nuxt/{AbmKWFQQ.js → BKJetfRH.js} +1 -1
- package/.output/public/_nuxt/BNAHBHbY.js +1 -0
- package/.output/public/_nuxt/BQOWm9mQ.js +1 -0
- package/.output/public/_nuxt/{DJxlKFGb.js → BQzG26t0.js} +1 -1
- package/.output/public/_nuxt/{DabzhQB1.js → BTvE9qca.js} +1 -1
- package/.output/public/_nuxt/{C2hkrSey.js → BUMoU50-.js} +1 -1
- package/.output/public/_nuxt/{C1gTN4Q8.js → BVN50jIb.js} +1 -1
- package/.output/public/_nuxt/BYB8NVJZ.js +1 -0
- package/.output/public/_nuxt/{BicAJ6U8.js → BZnfiR67.js} +1 -1
- package/.output/public/_nuxt/{5A6ITZXj.js → B_mN5eMV.js} +1 -1
- package/.output/public/_nuxt/BaDhDBCV.js +1 -0
- package/.output/public/_nuxt/Bb7Uckln.js +5 -0
- package/.output/public/_nuxt/Be4c943G.js +2 -0
- package/.output/public/_nuxt/{CsLojMwR.js → BfS8BZTO.js} +1 -1
- package/.output/public/_nuxt/{KyA_4Ks-.js → BhH0TNTi.js} +1 -1
- package/.output/public/_nuxt/BjU3HZuS.js +1 -0
- package/.output/public/_nuxt/{DrfE8IY0.js → BlRWlfdD.js} +1 -1
- package/.output/public/_nuxt/BmJUhCIO.js +6 -0
- package/.output/public/_nuxt/BpUXqOVj.js +2 -0
- package/.output/public/_nuxt/BqCiYSVY.js +1 -0
- package/.output/public/_nuxt/Bt4FLbe0.js +1 -0
- package/.output/public/_nuxt/{Bm62iDV5.js → BtSJxOdh.js} +1 -1
- package/.output/public/_nuxt/{Und3xXFc.js → BtaTvcz6.js} +2 -2
- package/.output/public/_nuxt/{hNh4CIL0.js → By5qkOq8.js} +1 -1
- package/.output/public/_nuxt/{Bnxf8nbZ.js → C0v6l4pr.js} +1 -1
- package/.output/public/_nuxt/{CXEH9OPk.js → C9p0YCAi.js} +1 -1
- package/.output/public/_nuxt/{Dyeqn3aG.js → CAZpjzvB.js} +1 -1
- package/.output/public/_nuxt/{CjPfj7ya.js → CBZD8ym8.js} +1 -1
- package/.output/public/_nuxt/CCP6Tyle.js +1 -0
- package/.output/public/_nuxt/{DuwtTfO8.js → CD3R-ggS.js} +2 -2
- package/.output/public/_nuxt/{CxyAzHr3.js → CDh_Qt7h.js} +1 -1
- package/.output/public/_nuxt/CI_q0F1O.js +9 -0
- package/.output/public/_nuxt/CJEp4i0N.js +1 -0
- package/.output/public/_nuxt/{l5WKbU4h.js → CMhK1PvI.js} +3 -3
- package/.output/public/_nuxt/{H94BMf3L.js → CNcu4khZ.js} +1 -1
- package/.output/public/_nuxt/COP3KBCA.js +9 -0
- package/.output/public/_nuxt/{BT3wGCTI.js → CRPt9SfB.js} +1 -1
- package/.output/public/_nuxt/{DsesNydr.js → CScusXhF.js} +1 -1
- package/.output/public/_nuxt/{-f7BAm1H.js → CWoSSKhQ.js} +1 -1
- package/.output/public/_nuxt/{CAvY22RE.js → CWw9WGlv.js} +1 -1
- package/.output/public/_nuxt/{DdwHkKfV.js → CZ9ThISn.js} +1 -1
- package/.output/public/_nuxt/Cd8r0xk5.js +1 -0
- package/.output/public/_nuxt/Cf52zHyB.js +1 -0
- package/.output/public/_nuxt/{GPNI1ffD.js → CkKCKAYp.js} +2 -2
- package/.output/public/_nuxt/CkyMZI-0.js +1 -0
- package/.output/public/_nuxt/CoPntblj.js +1 -0
- package/.output/public/_nuxt/CobveFaj.js +1 -0
- package/.output/public/_nuxt/Cot8fIp5.js +2 -0
- package/.output/public/_nuxt/{D5tke0B5.js → CrOA9onF.js} +1 -1
- package/.output/public/_nuxt/{FaFoMVKo.js → Cwwe5bRS.js} +1 -1
- package/.output/public/_nuxt/D0ROfwV0.js +1 -0
- package/.output/public/_nuxt/{L3kAWB2a.js → D4UlSVir.js} +1 -1
- package/.output/public/_nuxt/D4oheDIm.js +4 -0
- package/.output/public/_nuxt/{CAAwCT7H.js → D6Mo5HeX.js} +1 -1
- package/.output/public/_nuxt/{Cnsmicv2.js → DBhdObsO.js} +34 -34
- package/.output/public/_nuxt/{A1pj0VnG.js → DDN2tt0a.js} +1 -1
- package/.output/public/_nuxt/DGnQ69wW.js +64 -0
- package/.output/public/_nuxt/{Cus22Ud3.js → DGyGmFem.js} +2 -2
- package/.output/public/_nuxt/{CzAPFPpL.js → DHUT-BKj.js} +1 -1
- package/.output/public/_nuxt/DK7xciFW.js +7 -0
- package/.output/public/_nuxt/{C0_yH0N7.js → DLNNAYfu.js} +1 -1
- package/.output/public/_nuxt/DLn-VPtK.js +34 -0
- package/.output/public/_nuxt/{CA9B2HE5.js → DOBSrxzY.js} +1 -1
- package/.output/public/_nuxt/{Dy-TJ0Mt.js → DOLeth7M.js} +1 -1
- package/.output/public/_nuxt/{CNyV9YpI.js → DQnsFoJn.js} +1 -1
- package/.output/public/_nuxt/DS2ANCQh.js +1 -0
- package/.output/public/_nuxt/{bLcjFslv.js → DSvBQHzW.js} +1 -1
- package/.output/public/_nuxt/{BzRRzmwm.js → DWEkQ7bl.js} +1 -1
- package/.output/public/_nuxt/DWwiVTZX.js +24 -0
- package/.output/public/_nuxt/DXXnDejN.js +1 -0
- package/.output/public/_nuxt/{B3obW6cw.js → Dj-TetcW.js} +2 -2
- package/.output/public/_nuxt/DpalT0nH.js +1 -0
- package/.output/public/_nuxt/{Bow4tTR0.js → DsX5CCb5.js} +1 -1
- package/.output/public/_nuxt/DslnXfcH.js +1 -0
- package/.output/public/_nuxt/DtSn2Q9-.js +1 -0
- package/.output/public/_nuxt/DwyFnMoY.js +44 -0
- package/.output/public/_nuxt/{CJFtzlQ4.js → DzM9oeLa.js} +1 -1
- package/.output/public/_nuxt/{BKkF4pPD.js → Gik813Ek.js} +1 -1
- package/.output/public/_nuxt/{pQqGiNch.js → Hot1UcKY.js} +1 -1
- package/.output/public/_nuxt/{DPCxhHri.js → HwFFbACq.js} +1 -1
- package/.output/public/_nuxt/{DJmoLeVt.js → PdEEuEsg.js} +1 -1
- package/.output/public/_nuxt/SBmMTKQb.js +1 -0
- package/.output/public/_nuxt/{C8e1EbJI.js → Sgis3xif.js} +1 -1
- package/.output/public/_nuxt/{CTU1mrhq.js → _VzR8bwc.js} +1 -1
- package/.output/public/_nuxt/{CeW8v31b.js → b_yFgp5S.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/5f1ebc7c-d690-4f02-847f-a3249653f75f.json +1 -0
- package/.output/public/_nuxt/{b-GYfcrQ.js → cSeAgciy.js} +1 -1
- package/.output/public/_nuxt/{CwGWJbiy.js → czXrP7NB.js} +1 -1
- package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
- package/.output/public/_nuxt/{Du2W7Jne.js → h49q_GXF.js} +42 -42
- package/.output/public/_nuxt/hzsG6cAc.js +1 -0
- package/.output/public/_nuxt/iubpj2qv.js +1 -0
- package/.output/public/_nuxt/jjOqY9Tv.js +1 -0
- package/.output/public/_nuxt/kfFeu9tK.js +1 -0
- package/.output/public/_nuxt/nANaAHCd.js +5 -0
- package/.output/public/_nuxt/{CIrFl3MW.js → t-juTK3X.js} +1 -1
- package/.output/public/_nuxt/{4gYNA-d4.js → x8YSyy4c.js} +1 -1
- package/.output/public/_nuxt/{DfgOx_ou.js → x8w_1_rn.js} +1 -1
- package/.output/public/_nuxt/xbO0VmDX.js +1 -0
- package/.output/server/chunks/_/collect.mjs +1 -1
- package/.output/server/chunks/_/error-500.mjs.map +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +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/{Alert-C4xq8lao.mjs → Alert-DAb8nKVs.mjs} +2 -2
- package/.output/server/chunks/build/Alert-DAb8nKVs.mjs.map +1 -0
- package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-DJp5WvUM.mjs} +5 -5
- package/.output/server/chunks/build/Breadcrumb-DJp5WvUM.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-BrQwfL8G.mjs} +2 -2
- package/.output/server/chunks/build/BreadcrumbNav-BrQwfL8G.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-MFvBwxmD.mjs → BrowserBadge-Djw_e_I9.mjs} +3 -3
- package/.output/server/chunks/build/BrowserBadge-Djw_e_I9.mjs.map +1 -0
- package/.output/server/chunks/build/{Card-BQP_oZkQ.mjs → Card--Ike7sYc.mjs} +2 -2
- package/.output/server/chunks/build/Card--Ike7sYc.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-B2gd_8HP.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-B2gd_8HP.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartMarkerTooltip-0DcMfD_6.mjs → ChartMarkerTooltip-u_1DUHh-.mjs} +2 -2
- package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-4Q5d0fa0.mjs → Checkbox-C1khEdTh.mjs} +4 -4
- package/.output/server/chunks/build/Checkbox-C1khEdTh.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-CjnDrO3Y.mjs} +4 -4
- package/.output/server/chunks/build/CodeBlock-CjnDrO3Y.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DYtmVlhy.mjs} +5 -5
- package/.output/server/chunks/build/DashboardNavbar-DYtmVlhy.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-BPNxODwj.mjs} +5 -5
- package/.output/server/chunks/build/DashboardSidebarToggle-BPNxODwj.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-2B-sVSMr.mjs} +5 -5
- package/.output/server/chunks/build/DataLocationCard-2B-sVSMr.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-CALyEmcJ.mjs → DiagnosisPanel-D6QO30FQ.mjs} +9 -8
- package/.output/server/chunks/build/DiagnosisPanel-D6QO30FQ.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-CxjMmDDY.mjs → DiagnosisResult-ujB5Lt2A.mjs} +12 -34
- package/.output/server/chunks/build/DiagnosisResult-ujB5Lt2A.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-UX9uajQJ.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-BBHWssHH.mjs → EntityLinks-F8_kC-IH.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-F8_kC-IH.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-UwD2b9v2.mjs → EnvManagedBadge-D6e-10M9.mjs} +3 -3
- package/.output/server/chunks/build/EnvManagedBadge-D6e-10M9.mjs.map +1 -0
- package/.output/server/chunks/build/FeatureUnavailable-BMw4euTk.mjs +83 -0
- package/.output/server/chunks/build/FeatureUnavailable-BMw4euTk.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-QptK0rPg.mjs} +3 -3
- package/.output/server/chunks/build/FormField-QptK0rPg.mjs.map +1 -0
- package/.output/server/chunks/build/GetStartedWizard-DxT8T14Y.mjs +510 -0
- package/.output/server/chunks/build/GetStartedWizard-DxT8T14Y.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-C5Ru8BCc.mjs} +3 -3
- package/.output/server/chunks/build/HelpHint-C5Ru8BCc.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-CwpfmI0W.mjs} +3 -3
- package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +1 -0
- package/.output/server/chunks/build/{MarkerBadge-D7meXy4u.mjs → MarkerBadge-Biz5--h2.mjs} +1 -1
- package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DB5DvBh1.mjs → MetaStripGroup-BBByVvpR.mjs} +242 -529
- package/.output/server/chunks/build/MetaStripGroup-BBByVvpR.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/{Modal-pSDlXzT3.mjs → Modal-BacZmQCX.mjs} +3 -3
- package/.output/server/chunks/build/Modal-BacZmQCX.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-DnQKacz8.mjs → NavigationMenu-sTiKSWDm.mjs} +7 -30
- package/.output/server/chunks/build/NavigationMenu-sTiKSWDm.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs → OpenInIdeLink-Crc8y0Yx.mjs} +6 -6
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs.map → OpenInIdeLink-Crc8y0Yx.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs → ProjectTestCasesTable-DwjqZ2i5.mjs} +17 -17
- package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs.map → ProjectTestCasesTable-DwjqZ2i5.mjs.map} +1 -1
- package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-nuLb-Nm3.mjs} +3 -3
- package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CvWmcFYM.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-C753B3Yo.mjs} +3 -3
- package/.output/server/chunks/build/SectionCard-C753B3Yo.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-5DK9frQ7.mjs → Select-BAyYwPuo.mjs} +4 -4
- package/.output/server/chunks/build/Select-BAyYwPuo.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs → SelectMenu-zE_AhMX8.mjs} +4 -4
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs.map → SelectMenu-zE_AhMX8.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-CR4WcEKD.mjs → Separator-BbgCfKKJ.mjs} +3 -3
- package/.output/server/chunks/build/Separator-BbgCfKKJ.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-BZfx4ma1.mjs → SettingsField-D-VriK9X.mjs} +5 -5
- package/.output/server/chunks/build/SettingsField-D-VriK9X.mjs.map +1 -0
- package/.output/server/chunks/build/{Skeleton-CEHuuKVh.mjs → Skeleton-DAp_WMEe.mjs} +2 -2
- package/.output/server/chunks/build/Skeleton-DAp_WMEe.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-D270EZZD.mjs → Slideover-CNbGvbUF.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-CNbGvbUF.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-DdkA3Fii.mjs} +3 -3
- package/.output/server/chunks/build/Switch-DdkA3Fii.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-BRk04Hd2.mjs → Table-CfDVAuUJ.mjs} +4 -4
- package/.output/server/chunks/build/Table-CfDVAuUJ.mjs.map +1 -0
- package/.output/server/chunks/build/{Tabs-BkSOnbaB.mjs → Tabs-BCOhHEB9.mjs} +2 -2
- package/.output/server/chunks/build/Tabs-BCOhHEB9.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-CSi64vVA.mjs → TestCaseHistoryChart-CKDXQ2GI.mjs} +4 -4
- package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.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-wquHQqtp.mjs} +4 -4
- package/.output/server/chunks/build/TestStatusBar-wquHQqtp.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-Ohs6QTXf.mjs} +3 -3
- package/.output/server/chunks/build/Textarea-Ohs6QTXf.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-Dv4htNP6.mjs → Tooltip-BRBnl4pE.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-BRBnl4pE.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BxA6IgWr.mjs → _id_-BesWjK_d.mjs} +900 -394
- package/.output/server/chunks/build/_id_-BesWjK_d.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-C_uSBiyU.mjs → _id_-CGs0u8Fr.mjs} +38 -36
- package/.output/server/chunks/build/_id_-CGs0u8Fr.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BdG37K7s.mjs → _id_-CQ0lolEK.mjs} +31 -28
- package/.output/server/chunks/build/_id_-CQ0lolEK.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BdJs7BJZ.mjs → _id_-D1-06Fcl.mjs} +1913 -1121
- package/.output/server/chunks/build/_id_-D1-06Fcl.mjs.map +1 -0
- package/.output/server/chunks/build/{about-BE0UV-8-.mjs → about-DdyOj-dj.mjs} +25 -455
- package/.output/server/chunks/build/about-DdyOj-dj.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-7aVMKekZ.mjs} +11 -9
- package/.output/server/chunks/build/account-7aVMKekZ.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs → ai-zw3T9b5u.mjs} +24 -22
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs.map → ai-zw3T9b5u.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-Bo_B_jko.mjs → analytics-CeCzKwEX.mjs} +105 -76
- package/.output/server/chunks/build/analytics-CeCzKwEX.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{compare-RxHSOdsO.mjs → compare-B2OB3zdd.mjs} +4 -1
- package/.output/server/chunks/build/compare-B2OB3zdd.mjs.map +1 -0
- package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-Bdqk_eYQ.mjs} +40 -2
- package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +1 -0
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs → default-CkyAx_Mu.mjs} +48 -33
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs.map → default-CkyAx_Mu.mjs.map} +1 -1
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs → docs-Dhj-wEks.mjs} +18 -16
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs.map → docs-Dhj-wEks.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-J0asTFg8.mjs → edit-CVz_gdoe.mjs} +17 -16
- package/.output/server/chunks/build/edit-CVz_gdoe.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-Be-j7hF1.mjs} +32 -4
- package/.output/server/chunks/build/fetch-Be-j7hF1.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CwdjL7BO.mjs} +8 -5
- package/.output/server/chunks/build/forgot-password-CwdjL7BO.mjs.map +1 -0
- package/.output/server/chunks/build/{import-CS9oylTN.mjs → import-DyQEw4V3.mjs} +17 -15
- package/.output/server/chunks/build/import-DyQEw4V3.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-ByWTzqF6.mjs} +2 -1
- package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DE45ycdZ.mjs → index-D7Bmj6bq.mjs} +19 -18
- package/.output/server/chunks/build/index-D7Bmj6bq.mjs.map +1 -0
- package/.output/server/chunks/build/{index-e9skCi-V.mjs → index-DcnICCZU.mjs} +43 -539
- package/.output/server/chunks/build/index-DcnICCZU.mjs.map +1 -0
- package/.output/server/chunks/build/{index-hGHlmyxj.mjs → index-DghAFpNR.mjs} +132 -89
- package/.output/server/chunks/build/{index-hGHlmyxj.mjs.map → index-DghAFpNR.mjs.map} +1 -1
- package/.output/server/chunks/build/index-ID913tUa.mjs +93 -0
- package/.output/server/chunks/build/index-ID913tUa.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
- package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-rXKF63j6.mjs} +12 -9
- package/.output/server/chunks/build/login-rXKF63j6.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-uhVCCwQM.mjs → mcp-ByNvFy4o.mjs} +254 -22
- package/.output/server/chunks/build/mcp-ByNvFy4o.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-fx_qnKGA.mjs → notifications-CbLAZnKJ.mjs} +18 -16
- package/.output/server/chunks/build/notifications-CbLAZnKJ.mjs.map +1 -0
- package/.output/server/chunks/build/performance-C93MEPaZ.mjs +581 -0
- package/.output/server/chunks/build/performance-C93MEPaZ.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-X6-70iF0.mjs → pr-feedback-DKCB0bDE.mjs} +12 -10
- package/.output/server/chunks/build/pr-feedback-DKCB0bDE.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-BBoHKMqD.mjs} +8 -5
- package/.output/server/chunks/build/reset-password-BBoHKMqD.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +86 -72
- package/.output/server/chunks/build/server.mjs.map +1 -1
- package/.output/server/chunks/build/{settings-CCYe7rsc.mjs → settings-DiG0JjzC.mjs} +18 -26
- package/.output/server/chunks/build/settings-DiG0JjzC.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DnAK4Rzg.mjs} +40 -18
- package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +1 -0
- package/.output/server/chunks/build/setup-0-1O6Hjz.mjs +1065 -0
- package/.output/server/chunks/build/setup-0-1O6Hjz.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-CJEmviCD.mjs → storage-3JiFJ843.mjs} +18 -16
- package/.output/server/chunks/build/storage-3JiFJ843.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-CqYcp7js.mjs} +11 -10
- package/.output/server/chunks/build/tags-CqYcp7js.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-thBbAykw.mjs → test-cases-y1HSgPX2.mjs} +26 -24
- package/.output/server/chunks/build/test-cases-y1HSgPX2.mjs.map +1 -0
- package/.output/server/chunks/build/test-functions-D2ju95Ly.mjs +552 -0
- package/.output/server/chunks/build/test-functions-D2ju95Ly.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/{useChartMarkers-C89e_VLV.mjs → useChartMarkers-C0wSO0xk.mjs} +1 -1
- package/.output/server/chunks/build/useChartMarkers-C0wSO0xk.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-RJKhWoyj.mjs → useCopyRich-CVFeYfkG.mjs} +699 -247
- package/.output/server/chunks/build/useCopyRich-CVFeYfkG.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopDownload-BepjqxOt.mjs → useDesktopDownload-Dyf0fR47.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-BbTnPhFA.mjs → useOpenInIde--6Me0WlL.mjs} +1 -1
- package/.output/server/chunks/build/useOpenInIde--6Me0WlL.mjs.map +1 -0
- package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs +19 -0
- package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +1 -0
- package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-IdmY9JZV.mjs} +12 -11
- package/.output/server/chunks/build/users-IdmY9JZV.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +2336 -1581
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +4 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +3 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +3 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +3 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +3 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +10 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +3 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +16 -2
- package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +4 -1
- 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 +4 -1
- 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 +4 -1
- 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 +11 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +9 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +7 -1
- 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 +4 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +30 -12
- package/.output/server/chunks/routes/api/auth/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +4 -1
- 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 +6 -3
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +4 -1
- 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 +4 -1
- 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 +4 -1
- 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 +4 -1
- 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 +3 -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 +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +4 -1
- 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 +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +4 -1
- 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 +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +23 -4
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +4 -1
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +12 -5
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +9 -3
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +4 -1
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +4 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +4 -1
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +6 -2
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +14 -1
- package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post6.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +5 -3
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +5 -3
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +4 -3
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +33 -16
- 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 +4 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +4 -1
- 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 +4 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +3 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +3 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +4 -1
- 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 +4 -1
- 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 +4 -1
- 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 +4 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +4 -1
- 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 +78 -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 +68 -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 +55 -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 +69 -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 +4 -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 +4 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +4 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +4 -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 +4 -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 +3 -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 +4 -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 +4 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +4 -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 +4 -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 +4 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +3 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +101 -0
- package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs +8 -2
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +3 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +4 -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 +4 -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 +4 -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 +62 -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 +71 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +7 -4
- 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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -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 +4 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +6 -3
- 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 +4 -1
- 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 +4 -1
- 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 +3 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +4 -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 +4 -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 +3 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +7 -2
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +4 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +43 -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/routes/renderer.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep.mjs +3 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +3 -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/0044_panoramic_eddie_brock.sql +1 -0
- package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
- package/.output/server/database/migrations/meta/0044_snapshot.json +3772 -0
- package/.output/server/database/migrations/meta/_journal.json +14 -0
- package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
- package/.output/server/database/migrations-pg/0045_loose_runaways.sql +1 -0
- package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
- package/.output/server/database/migrations-pg/meta/0045_snapshot.json +4480 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +14 -0
- package/.output/server/index.mjs +4 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/bin/piwi-server.mjs +10 -0
- package/package.json +1 -1
- package/.output/public/_nuxt/8PUUncmO.js +0 -44
- package/.output/public/_nuxt/B7FTvFWq.js +0 -5
- 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/public/trace-viewer/assets/codeMirrorModule-LEHpjmcn.js +0 -32
- package/.output/public/trace-viewer/assets/defaultSettingsView-BNmKHKpQ.js +0 -264
- package/.output/public/trace-viewer/assets/urlMatch-BYQrIQwR.js +0 -1
- package/.output/public/trace-viewer/assets/xtermModule-CsJ4vdCR.js +0 -9
- package/.output/public/trace-viewer/codeMirrorModule.DYBRYzYX.css +0 -1
- package/.output/public/trace-viewer/codicon.DCmgc-ay.ttf +0 -0
- package/.output/public/trace-viewer/defaultSettingsView.CjdS-WJx.css +0 -1
- package/.output/public/trace-viewer/index.CzXZzn5A.css +0 -1
- package/.output/public/trace-viewer/index.DMMX1gXU.js +0 -2
- package/.output/public/trace-viewer/index.html +0 -44
- package/.output/public/trace-viewer/manifest.webmanifest +0 -16
- package/.output/public/trace-viewer/playwright-logo.svg +0 -9
- package/.output/public/trace-viewer/snapshot.html +0 -10
- package/.output/public/trace-viewer/snapshot.v8KI4P3m.js +0 -2
- package/.output/public/trace-viewer/sw.bundle.js +0 -5
- package/.output/public/trace-viewer/uiMode.BZQ54Kgt.css +0 -1
- package/.output/public/trace-viewer/uiMode.Ut8wwJNp.js +0 -6
- package/.output/public/trace-viewer/uiMode.html +0 -18
- package/.output/public/trace-viewer/xtermModule.DYP7pi_n.css +0 -32
- package/.output/server/chunks/build/Alert-C4xq8lao.mjs.map +0 -1
- 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/Card-BQP_oZkQ.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +0 -1
- package/.output/server/chunks/build/ChartMarkerTooltip-0DcMfD_6.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/EnvManagedBadge-UwD2b9v2.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/MarkerBadge-D7meXy4u.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-pSDlXzT3.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/Separator-CR4WcEKD.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +0 -1
- package/.output/server/chunks/build/Skeleton-CEHuuKVh.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-D270EZZD.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/Table-BRk04Hd2.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-BkSOnbaB.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/Tooltip-Dv4htNP6.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/compare-RxHSOdsO.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-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 +0 -330
- 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/useChartMarkers-C89e_VLV.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 +0 -301
- package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as Is}from"./C9p0YCAi.js";import{_ as Ms}from"./BTvE9qca.js";import{b as Ae,A as wt,d as ie,O as Ot,w as xe,J as ye,k as e,o as s,f,g as t,j as a,_ as ke,c as r,i as n,m as d,t as c,v as R,F as X,y as ae,p as Pe,G as Ee,l as J,P as Lt,Q as Nt,q as re,h as N,r as I,K as Fs,s as $e,R as qt,n as Rt,D as Dt,E as Ht,M as Ps,u as Es,a as Bs,e as Vs,C as Kt,S as Ls,T as Ns}from"./h49q_GXF.js";import{_ as Ks}from"./DOLeth7M.js";import{_ as Qe,a as Os}from"./BtSJxOdh.js";import{_ as Be}from"./DDN2tt0a.js";import{_ as Qt}from"./BKJetfRH.js";import{u as qs}from"./D6Mo5HeX.js";import{u as be}from"./Cd8r0xk5.js";import{_ as Hs}from"./CBZD8ym8.js";import{_ as Qs,a as Gs}from"./B_mN5eMV.js";import{_ as Gt}from"./BFcdtAzg.js";import{_ as ct}from"./DLNNAYfu.js";import{u as Xs}from"./BZnfiR67.js";import{_ as Xt}from"./Sgis3xif.js";import{_ as Ce}from"./BVN50jIb.js";import{C as St,w as Jt,O as rt,a as Wt,_ as Yt,u as Zt}from"./czXrP7NB.js";import{N as Js}from"./CMhK1PvI.js";import{_ as Ws}from"./DQnsFoJn.js";import{_ as Ys}from"./B0hK-xDF.js";import{_ as Zs}from"./C0v6l4pr.js";import{_ as es}from"./CRPt9SfB.js";import{_ as en}from"./cSeAgciy.js";import{_ as tn}from"./CJEp4i0N.js";import{_ as sn}from"./DWEkQ7bl.js";import{_ as nn}from"./Gik813Ek.js";import{_ as Ve}from"./DGyGmFem.js";import{_ as Ge}from"./CWoSSKhQ.js";import{_ as Xe}from"./DzM9oeLa.js";import{f as At,b as an,c as on,d as ln,i as V,t as rn,e as ts,p as it,j as at}from"./CD3R-ggS.js";import{_ as ss}from"./DOBSrxzY.js";import{_ as ut}from"./PdEEuEsg.js";import{_ as dt}from"./DHUT-BKj.js";import{_ as cn}from"./BH-ym1CI.js";import{_ as un}from"./_VzR8bwc.js";import{_ as dn}from"./CWw9WGlv.js";import{_ as mn}from"./CkyMZI-0.js";import{_ as pn}from"./DtSn2Q9-.js";import{_ as gn}from"./BlRWlfdD.js";import{_ as fn}from"./Cwwe5bRS.js";import{_ as _n}from"./CScusXhF.js";import{_ as zt}from"./jjOqY9Tv.js";import{M as vn,D as Tt,g as jt}from"./D7W_4Sqc.js";import{_ as yn}from"./CDh_Qt7h.js";import{u as hn}from"./BUMoU50-.js";import{u as xn}from"./CNcu4khZ.js";import"./BhH0TNTi.js";import"./BjaRappk.js";import"./xbO0VmDX.js";import"./D4UlSVir.js";import"./B9FSuKdA.js";import"./BNAHBHbY.js";import"./D-c8ZSws.js";import"./B6s20NbT.js";import"./x8YSyy4c.js";import"./9N6hSApy.js";import"./4yvOL9PC.js";import"./x8w_1_rn.js";import"./Hot1UcKY.js";const bn=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],ot=new Map,lt=new Map;function kn(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 $n(){if(!wt().public.demoMode)return null;const $=Ae();function k(x,m,i){C(x);const M=kn(m,i);lt.set(x,0);function D(){const A=(lt.get(x)??0)%M.length;lt.set(x,A+1);const v=M[A];$.add({title:v.title,description:v.description,icon:v.icon,color:v.color,duration:7e3});const _=25e3+Math.random()*1e4;ot.set(x,setTimeout(D,_))}ot.set(x,setTimeout(D,8e3))}function C(x){const m=ot.get(x);m!==void 0&&(clearTimeout(m),ot.delete(x)),lt.delete(x)}return{scheduleFor:k,cancelFor:C}}const Cn={key:0,class:"p-3 space-y-3"},Tn={key:0,class:"text-xs text-gray-500"},jn={key:1,class:"text-xs text-gray-500"},Sn={key:2,class:"text-xs text-gray-500"},wn={class:"space-y-1"},Rn=["checked","onChange"],Dn={key:1,class:"p-3 space-y-3"},An={class:"flex items-center justify-between"},zn={class:"font-medium text-sm inline-flex items-center gap-1"},Un={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},In={key:1,class:"text-xs text-muted text-center py-2"},Mn={key:2,class:"space-y-1.5"},Fn={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},Pn={class:"space-y-1"},En=["value"],Bn={class:"flex gap-1.5 justify-end"},Vn={class:"flex-1 font-medium truncate"},Ln={key:3,class:"text-xs text-muted text-center py-1"},Nn={key:4,class:"space-y-2 border-t border-default pt-2"},Kn={class:"space-y-1"},On=["value"],qn={class:"flex gap-1.5 justify-end"},Hn=ie({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(U){let $,k;const C=U,x=wt(),m=x.public.demoMode,i=N(()=>x.public.authEnabled),{authState:M}=Ot(),D=N(()=>M.value.authenticated),A=Ae(),v=I(!1),_=m?$n():null,b=!i.value&&!m?qs():null,z=I("default"),p=N(()=>"Notification"in window);"Notification"in window&&(z.value=Notification.permission);const y=N(()=>b?.getProject(C.projectId).events??[]),P=N(()=>b?.isSubscribed(C.projectId)??!1);async function K(){!p.value||z.value!=="default"||(z.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]=xe(()=>be(`/api/subscriptions?projectId=${C.projectId}`,{immediate:T,...Q},"$APDuK86tlj")),$=await $,k(),$),B=N(()=>w.value?.subscriptions??[]),ue=N(()=>B.value.length>0),{data:ge}=([$,k]=xe(()=>be("/api/channels",{immediate:T,...Q},"$uK3f0xlELn")),$=await $,k(),$),h=N(()=>ge.value?.channels??[]),j=I(!1),q=I(void 0),de=I(["run.failed"]),ze=I(!1),me=I(null),he=I(void 0),fe=I([]),Ue=I(!1);function mt(L){me.value=L,he.value=L.channel.id,fe.value=[...L.events]}function pt(){me.value=null}async function Y(){if(!(!me.value||!he.value||fe.value.length===0)){Ue.value=!0;try{await $fetch(`/api/subscriptions/${me.value.id}`,{method:"PATCH",body:{channelId:he.value,events:fe.value}}),await H(),me.value=null}catch(L){A.add({title:"Update failed",description:String(L?.message??L),color:"error"})}finally{Ue.value=!1}}}const Je=N(()=>h.value.map(L=>({label:L.type==="personal_email"?`${L.name} (${L.config.address})`:L.name,value:L.id}))),Le=bn.map(L=>({label:L.replace(/\./g," › "),value:L}));ye(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 Ne(){if(!(!q.value||de.value.length===0)){ze.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,A.add({title:"Subscribed",color:"success"}),m&&_?.scheduleFor(C.projectId,C.projectLabel||"this project",de.value)}catch(L){A.add({title:"Subscribe failed",description:String(L?.message??L),color:"error"})}finally{ze.value=!1}}}async function gt(L){try{await $fetch(`/api/subscriptions/${L}`,{method:"DELETE"}),await H(),A.add({title:"Unsubscribed",color:"success"}),m&&B.value.length===0&&_?.cancelFor(C.projectId)}catch(F){A.add({title:"Failed",description:String(F?.message??F),color:"error"})}}async function ne(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(Z){A.add({title:"Failed",description:String(Z?.message??Z),color:"error"})}}function pe(L){return L.mutedUntil&&new Date(L.mutedUntil)>new Date}function Ke(L){return L==="personal_email"?"i-lucide-user-round":L==="email"?"i-lucide-mail":L==="slack"?"i-lucide-slack":"i-lucide-webhook"}const ft=N(()=>m||i.value&&D.value||b!=null),Oe=N(()=>m||i.value?ue.value:P.value);return(L,F)=>{const Z=ke,_t=Ks,Te=Qe,We=Pe,Ye=Ee,Ie=Be,je=Qt,vt=Fs;return e(ft)?(s(),f(vt,{key:0,open:e(v),"onUpdate:open":F[6]||(F[6]=O=>J(v)?v.value=O:null),ui:{content:"w-72"}},{content:t(()=>[e(b)?(s(),r("div",Cn,[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(z)==="default"?(s(),r("p",Tn,[a(Z,{variant:"link",size:"xs",class:"p-0",onClick:K},{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(z)==="denied"?(s(),r("p",jn," Notifications are blocked. Check your browser settings to allow them. ")):e(p)?R("",!0):(s(),r("p",Sn,"Notifications are not supported in this browser.")),e(p)&&e(z)==="granted"?(s(),r(X,{key:3},[a(_t),n("div",wn,[(s(!0),r(X,null,ae(e(Le),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[n("input",{type:"checkbox",checked:S(O.value),class:"accent-primary size-3",onChange:oe=>g(O.value)},null,40,Rn),d(" "+c(O.label),1)]))),128))])],64)):R("",!0)])):(s(),r("div",Dn,[n("div",An,[n("span",zn,[F[10]||(F[10]=d(" Notifications ",-1)),a(Te,{topic:"notifications.subscribe"})]),e(j)?R("",!0):(s(),f(Z,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(h).length===0,onClick:F[0]||(F[0]=O=>j.value=!0)},{default:t(()=>[...F[11]||(F[11]=[d(" Add ",-1)])]),_:1},8,["disabled"]))]),e(m)?(s(),r("div",Un,[a(We,{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",In,[F[14]||(F[14]=d(" No channels configured.",-1)),F[15]||(F[15]=n("br",null,null,-1)),a(Ye,{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",Mn,[(s(!0),r(X,null,ae(e(B),O=>(s(),r(X,{key:O.id},[e(me)?.id===O.id?(s(),r("div",Fn,[a(je,{label:"Channel",size:"xs"},{default:t(()=>[a(Ie,{modelValue:e(he),"onUpdate:modelValue":F[1]||(F[1]=oe=>J(he)?he.value=oe:null),items:e(Je),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(je,{label:"Events",size:"xs"},{default:t(()=>[n("div",Pn,[(s(!0),r(X,null,ae(e(Le),oe=>(s(),r("label",{key:oe.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Lt(n("input",{type:"checkbox",value:oe.value,"onUpdate:modelValue":F[2]||(F[2]=qe=>J(fe)?fe.value=qe:null),class:"accent-primary size-3"},null,8,En),[[Nt,e(fe)]]),d(" "+c(oe.label),1)]))),128))])]),_:1}),n("div",Bn,[a(Z,{size:"xs",color:"neutral",variant:"ghost",onClick:pt},{default:t(()=>[...F[16]||(F[16]=[d("Cancel",-1)])]),_:1}),a(Z,{size:"xs",color:"primary",loading:e(Ue),disabled:!e(he)||e(fe).length===0,onClick:Y},{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",pe(O)?"opacity-60":""])},[a(We,{name:Ke(O.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),n("span",Vn,c(O.channel.name),1),a(Z,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:oe=>mt(O)},null,8,["onClick"]),a(Z,{icon:pe(O)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:pe(O)?"Unmute":"Mute 7 days",onClick:oe=>ne(O)},null,8,["icon","title","onClick"]),a(Z,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:oe=>gt(O.id)},null,8,["onClick"])],2))],64))),128))])):!e(j)&&e(h).length>0?(s(),r("div",Ln," Not subscribed to this project. ")):R("",!0),e(j)?(s(),r("div",Nn,[a(je,{label:"Channel",size:"xs"},{default:t(()=>[a(Ie,{modelValue:e(q),"onUpdate:modelValue":F[3]||(F[3]=O=>J(q)?q.value=O:null),items:e(Je),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(je,{label:"Events",size:"xs"},{default:t(()=>[n("div",Kn,[(s(!0),r(X,null,ae(e(Le),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Lt(n("input",{type:"checkbox",value:O.value,"onUpdate:modelValue":F[4]||(F[4]=oe=>J(de)?de.value=oe:null),class:"accent-primary size-3"},null,8,On),[[Nt,e(de)]]),d(" "+c(O.label),1)]))),128))])]),_:1}),n("div",qn,[a(Z,{size:"xs",color:"neutral",variant:"ghost",onClick:F[5]||(F[5]=O=>j.value=!1)},{default:t(()=>[...F[18]||(F[18]=[d("Cancel",-1)])]),_:1}),a(Z,{size:"xs",color:"primary",loading:e(ze),disabled:!e(q)||e(de).length===0,onClick:Ne},{default:t(()=>[...F[19]||(F[19]=[d(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):R("",!0)]))]),default:t(()=>[a(Z,{icon:e(Oe)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Oe)?"primary":"neutral",variant:e(Oe)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):R("",!0)}}}),Qn=Object.assign(Hn,{__name:"SubscribeBell"}),Gn={key:0,class:"flex items-center justify-between gap-3"},Xn={class:"flex items-center gap-2 min-w-0 text-sm"},Jn={class:"text-xs break-all"},Wn={class:"flex items-center gap-1.5 shrink-0"},Yn={key:1,class:"flex items-center justify-between gap-3"},Zn=ie({__name:"DesktopProjectLinkCard",props:{projectId:{}},setup(U){const $=U,{available:k,link:C,busy:x,pickAndLink:m,unlink:i}=Xs(()=>$.projectId);return(M,D)=>{const A=Pe,v=$e,_=ke,b=ct;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",Gn,[n("div",Xn,[a(A,{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",Wn,[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",Yn,[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)}}}),ea=Object.assign(Zn,{__name:"DesktopProjectLinkCard"}),ta={class:"w-full relative"},sa={key:0},na={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},aa={class:"font-semibold mb-1"},oa={class:"capitalize mb-1"},la={class:"space-y-0.5"},ra={class:"font-medium mt-1"},ia=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,A=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:z,tooltipPos:p,markerTooltip:y,markerTooltipPos:P,onRenderComplete:K}=Zt(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=>Rt(`/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=Xt,w=Ce,H=Yt;return s(),r("div",ta,[e(m).length>0?(s(),r("div",sa,[a(e(Wt),{ref_key:"xyContainerRef",ref:b,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(K)},{default:t(()=>[a(e(Js),{x:i,y:[M,D,A,v],color:_,"curve-type":e(St).MonotoneX},null,8,["y","curve-type"]),a(e(Jt),{x:i,y:[M,D,A,v],color:_,"curve-type":e(St).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(rt),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),a(e(rt),{type:"y",label:"Tests","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(z)?(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:qt({left:`${e(p).x}px`,top:`${e(p).y}px`})},[n("div",na,[n("div",aa,c(new Date(e(z).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",oa,"Status: "+c(e(z).status),1),n("div",la,[n("div",null,[T[0]||(T[0]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Passed: "+c(e(z).passed),1)]),n("div",null,[T[1]||(T[1]=n("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),d(" Failed: "+c(e(z).failed),1)]),n("div",null,[T[2]||(T[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" Skipped: "+c(e(z).skipped),1)]),n("div",null,[T[3]||(T[3]=n("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),d(" Flaky: "+c(e(z).flaky),1)]),n("div",ra,"Total: "+c(e(z).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})])}}}),ca=Object.assign(ia,{__name:"TestRunsChart"}),ua={class:"space-y-3"},da={class:"min-w-0 space-y-1"},ma={class:"flex items-center gap-2 flex-wrap text-sm"},pa={key:0,class:"text-gray-500"},ga=["title"],fa=["title"],_a={key:0,class:"text-xs text-gray-500 italic"},va={class:"flex items-center gap-2 shrink-0"},ya=ie({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=I([]),i=I(null);async function M(){try{m.value=await $fetch(`/api/projects/${k.projectId}/cluster-merge-suggestions`)}catch{m.value=[]}}ye(()=>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 A=v=>v==null?"":`${Math.round(v*100)}% similar`;return(v,_)=>{const b=$e,z=ke,p=ct;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",ua,[(s(!0),r(X,null,ae(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",da,[n("div",ma,[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"]),A(y.score)?(s(),r("span",pa,c(A(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,ga),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,fa),y.llmReason?(s(),r("p",_a,c(y.llmReason),1)):R("",!0)]),n("div",va,[a(z,{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(z,{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)}}}),ha=Object.assign(ya,{__name:"ClusterMergeSuggestions"}),xa={class:"flex items-center justify-between"},ba={class:"text-sm text-gray-500 inline-flex items-center gap-1"},ka={class:"min-w-0 space-y-0.5"},$a={key:0,class:"text-xs text-gray-500 italic truncate"},Ca={key:1,class:"text-gray-400 text-xs"},Ta={class:"space-y-1"},ja={class:"text-sm tabular-nums"},Sa={class:"text-sm tabular-nums"},wa={key:1,class:"text-gray-400 text-xs"},Ra={class:"text-sm text-gray-500 whitespace-nowrap"},Da={key:0,class:"ml-1 text-xs text-gray-400"},Aa={class:"flex justify-end"},za=ie({__name:"FailureClustersList",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(void 0),{data:m,pending:i}=([$,k]=xe(()=>be(()=>{const A=new URLSearchParams;x.value&&A.set("status",x.value);const v=A.toString();return`/api/projects/${C.projectId}/failure-clusters${v?`?${v}`:""}`},{lazy:!0,server:!1,watch:[x]},"$fqv4nq7Mtw")),$=await $,k(),$),M=A=>ln(A.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(A,v)=>{const _=Qe,b=Be,z=Ee,p=$e,y=Pe,P=es,K=ke,S=Ve,g=Xe,T=Ce,Q=Ge;return s(),f(Q,null,{header:t(()=>[n("div",xa,[n("p",ba,[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=>J(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",ka,[a(z,{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",$a,c(w.original.triageNote),1)):R("",!0)])]),"errorType-cell":t(({row:w})=>[w.original.errorType?(s(),f(p,{key:0,color:("clusterErrorTypeColor"in A?A.clusterErrorTypeColor:e(on))(w.original.errorType),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.errorType),1)]),_:2},1032,["color"])):(s(),r("span",Ca,"—"))]),"status-cell":t(({row:w})=>[n("div",Ta,[a(p,{color:("clusterStatusColor"in A?A.clusterStatusColor:e(an))(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",ja,c(w.original.affectedTests),1)]),"occurrences-cell":t(({row:w})=>[n("span",Sa,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",wa,"—"))]),"lastSeenAt-cell":t(({row:w})=>[n("div",Ra,[a(z,{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",Da," ("+c(("formatRelativeTime"in A?A.formatRelativeTime:e(At))(w.original.lastSeenAt))+") ",1)):R("",!0)])]),"actions-cell":t(({row:w})=>[n("div",Aa,[a(K,{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})}}}),Ua=Object.assign(za,{__name:"FailureClustersList"}),Ia={class:"flex items-center justify-between"},Ma={class:"flex items-center gap-3"},Fa={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Pa={class:"flex items-center gap-1.5"},Ea={class:"min-w-0 space-y-0.5"},Ba={class:"flex items-center gap-2"},Va={class:"text-sm tabular-nums"},La={class:"text-sm tabular-nums"},Na={key:1,class:"text-gray-400 text-xs"},Ka={key:1,class:"text-gray-400 text-xs"},Oa={key:1,class:"text-gray-400 text-xs"},qa={key:0,class:"text-sm text-gray-500"},Ha={key:1,class:"text-gray-400 text-xs"},Qa={class:"flex justify-end"},Ga={key:0,class:"text-sm text-gray-500 py-4 text-center"},Xa=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]=xe(()=>be(()=>{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]},"$BbmtLKIPAB")),$=await $,k(),$),D=N(()=>m.value.length===0?i.value??[]:(i.value??[]).filter(p=>m.value.includes(p.rootCause??"")));function A(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"}],z=[{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=Qe,K=Pe,S=$e,g=ke,T=Be,Q=Ee,w=ss,H=ut,B=Gt,ue=Ve,ge=Xe,h=Ge;return s(),f(h,null,{header:t(()=>[n("div",Ia,[n("div",Ma,[n("p",Fa,[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(K,{name:"i-lucide-layers",class:"size-3"}),d(" "+c(U.environment),1)]),_:1})):R("",!0),n("div",Pa,[(s(),r(X,null,ae(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=>J(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:z,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",Ea,[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(rn))(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",Ba,[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",Va,c(Math.round(j.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":t(({row:j})=>[a(S,{color:A(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",La,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",Na,"—"))]),"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",Ka,"—"))]),"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",Oa,"—"))]),"lastFlakeAt-cell":t(({row:j})=>[j.original.lastFlakeAt?(s(),r("span",qa,c(("formatRelativeTime"in p?p.formatRelativeTime:e(At))(j.original.lastFlakeAt)),1)):(s(),r("span",Ha,"—"))]),"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",Ga," No flaky tests detected in the last "+c(e(x))+" runs. ",1)):R("",!0)]),_:1})}}}),Ja=Object.assign(Xa,{__name:"FlakyTestsList"}),Wa={class:"w-full relative"},Ya={key:0},Za={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},eo={class:"font-semibold mb-1"},to={class:"capitalize mb-1"},so={class:"space-y-0.5"},no={class:"mt-1"},ao={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},oo=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,A=S=>S.p90TestDuration??void 0,v=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],_=I(null),{tooltipData:b,tooltipPos:z,markerTooltip:p,markerTooltipPos:y,onRenderComplete:P}=Zt(_,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=>Rt(`/test-runs/${S.id}`),markers:x,onMarkerClick:S=>C("marker-click",S.id)}),K=[{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=Xt,Q=Ce,w=Yt;return s(),r("div",Wa,[e(m).length>0?(s(),r("div",Ya,[a(e(Wt),{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,A],color:v,"curve-type":e(St).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(rt),{type:"x","tick-format":H=>new Date(H).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),a(e(rt),{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:qt({left:`${e(z).x}px`,top:`${e(z).y}px`})},[n("div",Za,[n("div",eo,c(new Date(e(b).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",to,"Status: "+c(e(b).status),1),n("div",so,[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",no,"Tests: "+c(e(b).totalTests),1),e(b).commit?(s(),r("div",ao," 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:K})])}}}),lo=Object.assign(oo,{__name:"PerformanceTrendChart"}),ro={class:"min-w-0"},io={class:"mt-1"},co={class:"tabular-nums"},uo={key:0,class:"ml-1 text-xs text-gray-500",title:"timeout ÷ p95"},mo={class:"tabular-nums text-gray-500"},po={key:0,class:"text-sm"},go={key:1,class:"tabular-nums"},fo={class:"tabular-nums font-medium text-green-600 dark:text-green-400"},_o={class:"tabular-nums text-gray-500"},vo=ie({__name:"TimeoutOpportunitiesTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,{data:x,pending:m}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/timeout-opportunities`,{lazy:!0,server:!1},"$zikJNhkkxJ")),$=await $,k(),$),i=N(()=>x.value??[]);function M(A){return A==null?"—":A<1e3?`${A}ms`:`${(A/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(A,v)=>{const _=dt,b=Ce,z=Ee,p=ut,y=$e,P=Ve,K=Xe,S=Ge;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(K,{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",ro,[a(z,{to:`/test-cases/${g.original.testCaseId}`,class:"font-medium truncate block hover:text-primary hover:underline"},{default:t(()=>[d(c(g.original.title),1)]),_:2},1032,["to"]),n("div",io,[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",co,c(M(g.original.timeout)),1),g.original.headroomRatio!=null?(s(),r("span",uo," ("+c(g.original.headroomRatio)+"×) ",1)):R("",!0)]),"p95-cell":t(({row:g})=>[n("span",mo,c(M(g.original.p95)),1)]),"recommendedTimeout-cell":t(({row:g})=>[g.original.kind==="stale-slow"?(s(),r("span",po,[...v[1]||(v[1]=[d("Remove ",-1),n("code",{class:"text-xs"},"test.slow()",-1)])])):(s(),r("span",go,"Lower to ~"+c(M(g.original.recommendedTimeout)),1))]),"estimatedSavingMs-cell":t(({row:g})=>[n("span",fo,c(M(g.original.estimatedSavingMs)),1)]),"runCount-cell":t(({row:g})=>[n("span",_o,c(g.original.runCount),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),yo=Object.assign(vo,{__name:"TimeoutOpportunitiesTable"}),ho={class:"flex items-center justify-between"},xo={class:"text-sm text-gray-500 inline-flex items-center gap-1"},bo={class:"truncate font-mono text-xs"},ko={class:"tabular-nums"},$o={class:"tabular-nums text-gray-500"},Co={class:"tabular-nums text-gray-500"},To=ie({__name:"SpecHealthTable",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(30),{data:m,pending:i}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/spec-health?days=${x.value}`,{lazy:!0,server:!1,watch:[x]},"$SX5aqvhtuX")),$=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 A(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}],z=[{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=Qe,K=Be,S=dt,g=Ce,T=Ee,Q=Ve,w=Xe,H=Ge;return s(),f(H,null,{header:t(()=>[n("div",ho,[n("p",xo,[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(K,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=B=>J(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:z,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",bo,c(B.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":t(({row:B})=>[n("span",{class:re(["font-medium tabular-nums",A(B.original.passRate)])},c(v(B.original.passRate)),3)]),"flakyRate-cell":t(({row:B})=>[n("span",ko,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",$o,c(B.original.testCount),1)]),"avgDuration-cell":t(({row:B})=>[n("span",Co,c(_(B.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),jo=Object.assign(To,{__name:"SpecHealthTable"}),So={class:"space-y-6"},wo={class:"w-full text-sm"},Ro={class:"px-3 py-2 min-w-0"},Do={class:"text-xs text-muted"},Ao={class:"px-3 py-2 text-muted"},zo={class:"px-3 py-2 whitespace-nowrap"},Uo={key:1,class:"text-xs text-muted"},Io={key:2,class:"text-xs"},Mo={class:"px-3 py-2 whitespace-nowrap text-muted"},Fo={class:"px-3 py-2 text-right"},Po={class:"w-full text-sm"},Eo={class:"px-3 py-2 min-w-0"},Bo={class:"text-xs text-muted"},Vo={class:"px-3 py-2 text-right whitespace-nowrap"},Lo=ie({__name:"QuarantineTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,x=Ae(),m=I(null),{data:i,status:M,error:D,refresh:A}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/quarantine`,"$BSyDdCMaDx")),$=await $,k(),$);function v(z){const p=Math.round(z/36e5);return p<48?`${Math.max(1,p)}h`:`${Math.round(p/24)}d`}async function _(z,p){m.value=z;try{await $fetch(`/api/projects/${C.projectId}/quarantine`,{method:"POST",body:{testCaseId:z,reason:p,source:"proposed"}}),x.add({title:"Quarantined",color:"success"}),await A()}catch{x.add({title:"Could not quarantine that test",color:"error"})}finally{m.value=null}}async function b(z){m.value=z;try{await $fetch(`/api/projects/${C.projectId}/quarantine/${z}`,{method:"DELETE"}),x.add({title:"Released",color:"success"}),await A()}catch{x.add({title:"Could not release that test",color:"error"})}finally{m.value=null}}return(z,p)=>{const y=dt,P=dn,K=mn,S=pn,g=Ce,T=Ee,Q=ss,w=ut,H=$e,B=ke,ue=Xe,ge=ct;return s(),r("div",So,[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(X,{key:2},[e(i)&&e(i).debt.active>0?(s(),f(S,{key:0,class:"mb-4"},{default:t(()=>[a(K,{label:"Quarantined",value:e(i).debt.active},null,8,["value"]),a(K,{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(K,{label:"Still failing",value:e(i).debt.stillFailing,hint:"no passing streak"},null,8,["value"]),a(K,{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",wo,[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(X,null,ae(e(i).entries,h=>(s(),r("tr",{key:h.id,class:"border-t border-default"},[n("td",Ro,[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",Do,[a(w,{"file-path":h.filePath,"project-key":U.projectId,"project-name":U.projectName},null,8,["file-path","project-key","project-name"])])]),n("td",Ao,c(h.reason||"—"),1),n("td",zo,[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",Uo,"not run yet")):(s(),r("span",Io,c(h.consecutivePasses)+" / "+c(e(i).releaseAfterConsecutivePasses),1))]),n("td",Mo,c(v(h.ageMs)),1),n("td",Fo,[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",Po,[n("tbody",null,[(s(!0),r(X,null,ae(e(i).candidates,h=>(s(),r("tr",{key:h.testCaseId,class:"border-t border-default"},[n("td",Eo,[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",Bo,c(h.rationale),1)]),n("td",Vo,[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)])}}}),No=Object.assign(Lo,{__name:"QuarantineTable"}),Ko={class:"space-y-4"},Oo={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},qo={id:"marker-environments"},Ho=["value"],Qo=ie({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=vn.map(_=>({label:_.label,value:_.id,icon:_.icon})),i=Ps({label:"",occurredAt:"",category:Tt,environment:"",description:""}),M=N(()=>!!k.marker),D=I(!1);function A(_){const b=new Date(_),z=p=>String(p).padStart(2,"0");return`${b.getFullYear()}-${z(b.getMonth()+1)}-${z(b.getDate())}T${z(b.getHours())}:${z(b.getMinutes())}`}ye(()=>k.open,_=>{_&&(k.marker?(i.label=k.marker.label,i.occurredAt=A(k.marker.occurredAt),i.category=k.marker.category||Tt,i.environment=k.marker.environment??"",i.description=k.marker.description??""):(i.label="",i.occurredAt=A(new Date),i.category=Tt,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:ts(b),color:"error"})}finally{D.value=!1}}return(_,b)=>{const z=Ht,p=Qt,y=Be,P=_n,K=ke,S=zt,g=Dt;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",Ko,[a(p,{label:"Label",name:"label",required:""},{default:t(()=>[a(z,{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",Oo,[a(p,{label:"Date & time",name:"occurredAt",required:""},{default:t(()=>[a(z,{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(z,{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",qo,[(s(!0),r(X,null,ae(U.environments||[],T=>(s(),r("option",{key:T,value:T},null,8,Ho))),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(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:b[5]||(b[5]=T=>C("update:open",!1))}),a(K,{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})}}}),Go=Object.assign(Qo,{__name:"MarkerFormModal"}),Xo={class:"md:hidden space-y-3"},Jo={class:"flex items-start justify-between gap-2"},Wo={key:0,class:"flex gap-1 shrink-0"},Yo={class:"text-sm text-muted"},Zo={key:0,class:"text-xs"},el={key:1,class:"text-sm text-muted"},tl={class:"whitespace-nowrap"},sl={class:"text-sm"},nl={class:"text-xs text-muted"},al={class:"font-medium flex items-center gap-1"},ol={key:0,class:"text-xs text-muted line-clamp-1"},ll={key:1,class:"text-xs text-muted"},rl={key:0,class:"flex gap-1 justify-end"},il=ie({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),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 A(){D.value=null,M.value=!0}function v(y){D.value=y,M.value=!0}ye(()=>k.focusMarkerId,y=>{if(y==null)return;const P=k.markers.find(K=>K.id===y);P&&v(P),C("clear-focus")},{immediate:!0});const _=I(!1),b=I(null);function z(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:ts(P),color:"error"})}}return(y,P)=>{const K=ke,S=Ce,g=fn,T=$e,Q=Pe,w=Ve,H=Go,B=zt,ue=Dt,ge=ct;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(K,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:A})):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(X,{key:1},[n("div",Xo,[(s(!0),r(X,null,ae(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",Wo,[a(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:j=>v(h)},null,8,["onClick"]),a(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:j=>z(h)},null,8,["onClick"])])):R("",!0)]),n("div",Yo,c(("prettyDateFormat"in y?y.prettyDateFormat:e(it))(h.occurredAt)),1),h.environment?(s(),r("div",Zo,[a(T,{color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.environment),1)]),_:2},1024)])):R("",!0),h.description?(s(),r("p",el,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",tl,[n("div",sl,c(("prettyDateFormat"in y?y.prettyDateFormat:e(it))(h.original.occurredAt)),1),n("div",nl,c(("formatRelativeTime"in y?y.formatRelativeTime:e(At))(h.original.occurredAt)),1)])]),"category-cell":t(({row:h})=>[a(T,{color:e(jt)(h.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(Q,{name:e(jt)(h.original.category).icon,class:"size-3"},null,8,["name"]),d(" "+c(e(jt)(h.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":t(({row:h})=>[n("div",null,[n("div",al,[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",ol,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",ll,"All"))]),"actions-cell":t(({row:h})=>[U.canEdit?(s(),r("div",rl,[a(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:j=>v(h.original)},null,8,["onClick"]),a(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:j=>z(h.original)},null,8,["onClick"])])):R("",!0)]),_:1},8,["data"])],64)),a(H,{open:e(M),"onUpdate:open":P[0]||(P[0]=h=>J(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(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:P[2]||(P[2]=h=>_.value=!1)}),a(K,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:p})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),cl=Object.assign(il,{__name:"ProjectTimeline"}),ul={class:"flex flex-col h-full overflow-y-auto gap-4"},dl={key:0,class:"pb-0 space-y-4"},ml={key:0,class:"text-gray-600"},pl={key:1,class:"flex flex-wrap gap-1 mt-2"},gl={class:"flex flex-wrap items-center gap-3 mb-4"},fl={class:"inline-flex items-center gap-1"},_l=["onClick"],vl={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"},yl={class:"text-sm text-primary-700 dark:text-primary-300"},hl={key:1,class:"text-xs text-primary-500"},xl=["checked","onClick"],bl={class:"flex items-center gap-2"},kl=["href","onClick"],$l={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},Cl={class:"inline-flex items-center gap-1"},Tl={key:0,class:"flex items-center gap-1"},jl={class:"text-xs text-gray-600"},Sl={key:0,class:"flex items-center gap-1 flex-wrap"},wl={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Rl={key:1,class:"text-xs text-gray-500"},Dl={class:"space-y-1"},Al={class:"flex justify-end gap-2"},zl={key:2,class:"text-center py-8 text-gray-500"},Ul={class:"text-xs text-gray-400 max-w-sm"},Il={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Ml={class:"flex flex-wrap items-center gap-3"},Fl={class:"text-xl font-semibold inline-flex items-center gap-1"},Pl={class:"font-medium"},El={class:"mt-1"},Bl={key:0,class:"text-red-600 font-medium"},Vl={key:1,class:"text-green-600 font-medium"},Ll={key:2,class:"text-gray-500"},Nl={key:2,class:"text-center py-8 text-red-500"},Kl={key:3,class:"text-center py-8 text-gray-500"},Ol={class:"flex items-center justify-between"},ql={class:"text-xl font-semibold inline-flex items-center gap-1"},Hl={class:"space-y-4"},Ql={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Gl={key:0,class:"text-center py-4 text-gray-500"},Xl={key:1,class:"space-y-4"},Jl={class:"flex gap-4 text-sm"},Wl={key:0,class:"text-gray-400"},Yl={key:0,class:"text-gray-400"},Zl={key:1,class:"text-gray-400"},er={key:1,class:"text-gray-400"},tr={key:0,class:"text-gray-400"},sr={key:0,class:"text-gray-400"},nr={key:2,class:"text-center py-8 text-gray-500"},ar={key:3,class:"text-center py-8 text-gray-500"},or={class:"flex items-center justify-between"},lr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},rr={class:"space-y-4"},ir={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},cr={key:0,class:"text-center py-8 text-gray-500"},ur={key:1,class:"space-y-4"},dr={class:"space-y-2"},mr={class:"flex flex-wrap gap-4 text-sm"},pr={key:3,class:"text-sm text-gray-500"},gr={class:"flex flex-wrap gap-4 text-sm"},fr={key:0,class:"text-gray-400"},_r={key:0,class:"text-gray-400"},vr={key:1,class:"text-gray-400"},yr={key:1,class:"text-gray-400"},hr={key:0,class:"text-gray-400"},xr={key:0,class:"text-gray-400"},br={key:2,class:"text-center py-8 text-gray-500"},kr={key:3,class:"text-center py-8 text-gray-500"},$r={class:"flex items-center justify-between"},Cr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},Tr={key:0,class:"space-y-2"},jr={class:"font-medium text-sm"},Sr={class:"text-xs text-muted flex items-center gap-2"},wr={key:0,class:"italic"},Rr={key:1,class:"text-xs text-muted italic"},Dr={key:1,class:"text-center py-8 text-muted text-sm"},Ar={class:"space-y-4"},zr={class:"text-sm text-gray-600 dark:text-gray-400"},Ur={class:"block text-sm font-medium mb-1"},Ir={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Vi=ie({__name:"index",async setup(U){let $,k;const C=Es(),x=Bs(),m=C.params.id,{data:i,refresh:M}=([$,k]=xe(()=>be(`/api/projects/${m}`,"$F60FKvNOBL")),$=await $,k(),$);Vs(N(()=>({title:`${i.value?.label||i.value?.name||"Project"} — Piwi Dashboard`})));const D=Ae(),A=I(null),v=I(null),{isAdmin:_,isReporter:b}=Ot(),z=wt(),p=N(()=>!z.public.authEnabled||_.value),y=p,P=I(!1),K=I(""),S=I(!1),g=N(()=>K.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 Ns(),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}}}xn(M);async function Q(u){v.value=null,A.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{A.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 G=u.get(E.id);o.push({id:E.id,username:E.username,name:E.name??null,role:E.role,global:G?.global??!1,hasAccess:!!G})}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)});ye(()=>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(G=>G.role!=="administrator"&&!G.global).map(G=>G.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),ze=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","quarantine","timeline","members"],me=C.query.tab;typeof me=="string"&&ze.includes(me)&&(q.value=me),ye(q,u=>{C.query.tab!==u&&ze.includes(u)&&x.replace({query:{...C.query,tab:u}})});const he=N(()=>i.value?.testRuns?.some(u=>u.failedTests>0)??!1),fe=N(()=>[{label:"Results",items:[{label:`Test runs (${L.value.length})`,icon:"i-lucide-play-circle",value:"test-runs",slot:"test-runs"},{label:`Test cases${qe.value!=null?` (${qe.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:"Failures",items:[...he.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:"Quarantine",icon:"i-lucide-shield-alert",value:"quarantine",slot:"quarantine"}]},{label:"Health",items:[{label:"Spec health",icon:"i-lucide-table-2",value:"spec-health",slot:"spec-health"},{label:"Performance",icon:"i-lucide-trending-up",value:"performance",slot:"performance"},{label:`Timeline${Te.value.length?` (${Te.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"}]},..._.value?[{label:"Admin",items:[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]}]:[]]),Ue=N(()=>fe.value.flatMap(u=>u.items)),mt=N(()=>fe.value.map(u=>u.items).filter(u=>u.length>0)),pt=N(()=>Ue.value.find(u=>u.value===q.value)?.icon),Y=I([]),Je=u=>Y.value.includes(u);function Le(u){const o=Y.value.indexOf(u);if(o>=0)Y.value.splice(o,1);else{if(Y.value.length>=2){D.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}Y.value.push(u)}}const Ne=I(null);function gt(){Y.value.length===2&&(Ne.value=[Y.value[0],Y.value[1]],q.value="compare")}const ne=I([]),pe=I(!0),Ke=N(()=>{const u=new Set;for(const o of i.value?.testRuns||[])o.environment&&u.add(o.environment);return[...u].sort()});function ft(u){const o=ne.value.indexOf(u);o===-1?ne.value.push(u):ne.value.splice(o,1)}function Oe(u){return ne.value.includes(u)}const L=N(()=>{let u=i.value?.testRuns||[];return pe.value&&(u=u.filter(o=>o.isFullRun!==!1)),ne.value.length===0?u:u.filter(o=>o.environment&&ne.value.includes(o.environment))}),F=N(()=>ne.value.length===1?ne.value[0]:void 0),{data:Z,refresh:_t}=([$,k]=xe(()=>be(`/api/projects/${m}/markers`,{default:()=>({markers:[]})},"$jubPXy8o3y")),$=await $,k(),$),Te=N(()=>Z.value?.markers??[]),We=N(()=>!z.public.authEnabled||_.value||b.value),Ye=N(()=>ne.value.length===0?Te.value:Te.value.filter(u=>u.environment==null||ne.value.includes(u.environment))),Ie=I(null);function je(u){Ie.value=u,q.value="timeline"}const vt=N(()=>{const u=i.value?.testRuns||[];return pe.value?u.filter(o=>o.isFullRun!==!1):u});function O(u){if(u.isFullRun!==!1)return"Full run — the complete test suite ran";const o=[],E=u.filterDetails?.grep?.trim(),G=u.filterDetails?.grepInvert?.trim(),_e=u.filterDetails?.files;return E&&E!==".*"&&o.push(`grep: ${E}`),G&&o.push(`grep-invert: ${G}`),_e?.length&&o.push(`files: ${_e.join(", ")}`),o.length?`Partial run — ${o.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const oe=[{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"}],qe=I(null),Se=I(""),we=I(""),ns=N(()=>{const u={};return Se.value&&(u.from=Se.value),we.value&&(u.to=we.value),u}),yt=I(null),ht=I(!1),Me=I(null),xt=I(!1),Ze=I(!1),as=N(()=>ht.value&&yt.value===null);ye([q,ns,pe],async([u,o])=>{if(u!=="performance")return;ht.value=!0,Me.value||(Ze.value=!0);const E=new URLSearchParams(o).toString(),G=pe.value?`${E?"&":""}fullRunsOnly=true`:"",_e=E||G?`?${E}${G}`:"";yt.value=await $fetch(`/api/projects/${m}/performance${_e}`).catch(ve=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",ve),null)),ht.value=!1,Ze.value&&(xt.value=!1,Me.value=await $fetch(`/api/projects/${m}/slow-tests`).catch(ve=>(xt.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",ve),null)),Ze.value=!1)},{immediate:!0});const os=[{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 ls(u){const o=it(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:ls(u),value:u.id})):[]),ee=I(void 0),te=I(void 0),Ut=N(()=>C.query.runA?Number(C.query.runA):null),It=N(()=>C.query.runB?Number(C.query.runB):null);ye(ce,u=>{if(Ut.value){const o=u.find(E=>E.value===Ut.value);o&&(ee.value=o)}if(It.value){const o=u.find(E=>E.value===It.value);o&&(te.value=o)}},{immediate:!0}),ye(Ne,u=>{if(u){const o=ce.value.find(G=>G.value===u[0]),E=ce.value.find(G=>G.value===u[1]);o&&(ee.value=o),E&&(te.value=E),Ne.value=null}});function Mt(){ce.value.length>=2&&(ee.value=ce.value[1],te.value=ce.value[0])}const bt=I(null),kt=I(null),et=I(!1);async function rs(){const u=ee.value,o=te.value;if(!(!u?.value&&!o?.value)){et.value=!0;try{const E=[];u?.value&&E.push(u.value),o?.value&&E.push(o.value);const G=await Promise.all(E.map(ve=>$fetch(`/api/test-runs/${ve}/summary`))),_e=new Map;for(const ve of G)_e.set(ve.id,ve);bt.value=u?.value?_e.get(u.value)??null:null,kt.value=o?.value?_e.get(o.value)??null:null}catch{bt.value=null,kt.value=null}finally{et.value=!1}}}ye([ee,te],()=>{rs()});const{comparisonData:tt,comparisonSummary:W}=hn(bt,kt),Ft=[{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=Is,G=Ms,_e=Qn,ve=Hs,is=Gs,cs=Gt,us=ea,ds=Be,ms=ca,Pt=Ws,ps=Ys,Fe=Qe,le=ke,gs=Zs,$t=Pe,fs=es,_s=en,se=$e,vs=tn,Re=sn,ys=nn,st=Ve,hs=Os,xs=Ce,He=Ge,bs=ha,ks=Ua,$s=Ja,Ct=Ht,Et=dt,Cs=lo,Ts=ut,js=yo,nt=cn,Ss=un,ws=jo,Rs=No,Ds=gn,As=cl,zs=yn,Us=Qs,Bt=zt,Vt=Dt;return s(),r(X,null,[a(Us,{id:"project-detail"},{header:t(()=>[a(is,null,{leading:t(()=>[a(E),a(G,{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(ve,{size:"sm",actions:[...e(p)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{K.value="",P.value=!0}}]:[],...e(y)?[{label:"Import",icon:"i-lucide-import",variant:"outline",to:`/projects/${e(m)}/import`}]:[],{label:"Test functions",icon:"i-lucide-function-square",variant:"outline",to:`/projects/${e(m)}/test-functions`},{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(_e,{"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",ul,[e(i)?.description||e(i)?.tags&&e(i).tags.length>0?(s(),r("div",dl,[e(i)?.description?(s(),r("p",ml,c(e(i).description),1)):R("",!0),e(i)?.tags&&e(i).tags.length>0?(s(),r("div",pl,[(s(!0),r(X,null,ae(e(i).tags,l=>(s(),f(cs,{key:l.id,text:l.text,color:l.color},null,8,["text","color"]))),128))])):R("",!0)])):R("",!0),a(us,{"project-id":e(m)},null,8,["project-id"]),a(ds,{modelValue:e(q),"onUpdate:modelValue":o[0]||(o[0]=l=>J(q)?q.value=l:null),items:e(mt),icon:e(pt),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),a(zs,{modelValue:e(q),"onUpdate:modelValue":o[14]||(o[14]=l=>J(q)?q.value=l:null),items:e(Ue),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(Pt,{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(ms,{"test-runs":e(vt),height:200,markers:e(Ye),onMarkerClick:je},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):R("",!0),a(He,{class:"mt-4"},{default:t(()=>[n("div",gl,[n("div",fl,[a(ps,{modelValue:e(pe),"onUpdate:modelValue":o[1]||(o[1]=l=>J(pe)?pe.value=l:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),a(Fe,{topic:"project.run-scope"})]),e(Ke).length>0?(s(),r(X,{key:0},[o[21]||(o[21]=n("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(s(!0),r(X,null,ae(e(Ke),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",Oe(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:De=>ft(l)},c(l),11,_l))),128)),e(ne).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=>ne.value=[])})):R("",!0)],64)):R("",!0)]),e(Y).length>0?(s(),r("div",vl,[n("span",yl,c(e(Y).length)+" run"+c(e(Y).length>1?"s":"")+" selected ",1),e(Y).length===2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:gt})):(s(),r("span",hl," 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=>Y.value=[])})])):R("",!0),e(L).length>0?(s(),f(st,{key:1,data:e(L),columns:oe,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:Je(l.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Kt(De=>Le(l.original.id),["stop"])},null,8,xl)]),"id-cell":t(({row:l})=>[n("div",bl,[n("a",{href:`/test-runs/${l.original.id}`,class:"text-primary hover:underline font-medium",onClick:Kt(De=>("navigateTo"in u?u.navigateTo:e(Rt))(`/test-runs/${l.original.id}`),["prevent"])}," Run #"+c(l.original.id),9,kl),l.original.label?(s(),r("span",$l,c(l.original.label),1)):R("",!0)])]),"status-cell":t(({row:l})=>[a(gs,{status:l.original.status},null,8,["status"])]),"isFullRun-header":t(()=>[n("span",Cl,[o[22]||(o[22]=d("Scope ",-1)),a(Fe,{topic:"run.partial"})])]),"isFullRun-cell":t(({row:l})=>[a(fs,{text:O(l.original)},{default:t(()=>[a($t,{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",Tl,[(s(!0),r(X,null,ae(l.original.browsers,De=>(s(),f(_s,{key:De,browser:{projectName:De},size:"sm"},null,8,["browser"]))),128))])):R("",!0)]),"startTime-cell":t(({row:l})=>[n("span",jl,c(("prettyDateFormat"in u?u.prettyDateFormat:e(it))(l.original.startTime)),1)]),"environment-cell":t(({row:l})=>[l.original.environment?(s(),f(se,{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",Sl,[l.original.metadata.scm.branch?(s(),r("span",wl,c(l.original.metadata.scm.branch),1)):R("",!0),l.original.metadata.scm.commit?(s(),r("code",Rl,c(l.original.metadata.scm.commit.substring(0,7)),1)):R("",!0)])):R("",!0)]),"duration-cell":t(({row:l})=>[n("div",Dl,[a(vs,{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(Re,{ms:l.original.duration,class:"text-xs text-gray-500"},null,8,["ms"])])]),"reports-cell":t(({row:l})=>[a(ys,{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",Al,[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(A)===l.original.id,onClick:De=>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",zl," No test runs match the selected environment filter. ")):(s(),f(xs,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:t(()=>[n("p",Ul,[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",Il,c(e(i)?.name),1),o[30]||(o[30]=d(" to send results here — see the ",-1)),a(hs,{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(X,{key:0},[(s(),f(bs,{key:`sug-${e(de)}`,"project-id":String(e(m)),onMerged:o[4]||(o[4]=l=>de.value++)},null,8,["project-id"])),(s(),f(ks,{key:e(de),"project-id":String(e(m))},null,8,["project-id"]))],64)):R("",!0)]),"flaky-tests":t(()=>[e(q)==="flaky-tests"?(s(),f($s,{key:0,"project-id":String(e(m)),environment:e(F),"project-name":e(i)?.name},null,8,["project-id","environment","project-name"])):R("",!0)]),performance:t(()=>[n("div",Ml,[o[32]||(o[32]=n("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),a(Ct,{modelValue:e(Se),"onUpdate:modelValue":o[5]||(o[5]=l=>J(Se)?Se.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(Ct,{modelValue:e(we),"onUpdate:modelValue":o[6]||(o[6]=l=>J(we)?we.value=l:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(Se)||e(we)?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[7]||(o[7]=l=>{Se.value="",we.value=""})})):R("",!0)]),a(Pt,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:t(()=>[e(as)?(s(),f(Et,{key:0,text:"Loading chart…"})):(s(),f(Cs,{key:1,data:e(yt)||[],height:350,markers:e(Ye),onMarkerClick:je},null,8,["data","markers"]))]),_:1}),a(He,null,{header:t(()=>[n("h2",Fl,[o[34]||(o[34]=d(" Slowest tests ",-1)),a(Fe,{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(Ze)&&e(Me)===null?(s(),f(Et,{key:0,text:"Loading…"})):e(Me)&&e(Me).length>0?(s(),f(st,{key:1,data:e(Me),columns:os,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",Pl,c(l.original.title),1),n("div",El,[a(Ts,{"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",Bl,"▲ Slower")):l.original.trend==="faster"?(s(),r("span",Vl,"▼ Faster")):(s(),r("span",Ll,"— Stable"))]),_:1},8,["data"])):e(xt)?(s(),r("div",Nl," Couldn't load the slowest tests — try refreshing. ")):(s(),r("div",Kl,"No slow test data available yet."))]),_:1}),a(js,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"]),a(He,null,{header:t(()=>[n("div",Ol,[n("div",null,[n("h2",ql,[o[36]||(o[36]=d(" Run comparison ",-1)),a(Fe,{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:Mt})):R("",!0)])]),default:t(()=>[n("div",Hl,[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(nt,{modelValue:e(ee),"onUpdate:modelValue":o[8]||(o[8]=l=>J(ee)?ee.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(nt,{modelValue:e(te),"onUpdate:modelValue":o[9]||(o[9]=l=>J(te)?te.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(et)?(s(),r("div",Gl,[a($t,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[40]||(o[40]=d(" Loading run data… ",-1))])):e(ee)&&e(te)&&e(tt).length>0?(s(),r("div",Xl,[n("div",Jl,[a(se,{color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).improved)+" improved",1)]),_:1}),a(se,{color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).regressed)+" regressed",1)]),_:1}),a(se,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).unchanged)+" unchanged",1)]),_:1})]),a(st,{data:e(tt),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"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",Wl,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",Yl,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Re,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",Zl,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Re,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",er,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",tr,"—")):(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(Re,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",sr,"—")):(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(ee)||!e(te)?(s(),r("div",nr," Select two runs to compare their performance. ")):(s(),r("div",ar," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":t(()=>[a(Ss,{"project-id":e(m),"project-name":e(i)?.name,"sync-query":"",onTotal:o[10]||(o[10]=l=>qe.value=l)},null,8,["project-id","project-name"])]),compare:t(()=>[a(He,null,{header:t(()=>[n("div",or,[n("p",lr,[o[41]||(o[41]=d(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),a(Fe,{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:Mt})):R("",!0)])]),default:t(()=>[n("div",rr,[n("div",ir,[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(nt,{modelValue:e(ee),"onUpdate:modelValue":o[11]||(o[11]=l=>J(ee)?ee.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(nt,{modelValue:e(te),"onUpdate:modelValue":o[12]||(o[12]=l=>J(te)?te.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(et)?(s(),r("div",cr,[a($t,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[44]||(o[44]=d(" Loading run data… ",-1))])):e(ee)&&e(te)&&e(tt).length>0?(s(),r("div",ur,[n("div",dr,[n("div",mr,[o[45]||(o[45]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(W).newFailures>0?(s(),f(se,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).newFailures)+" new failure"+c(e(W).newFailures>1?"s":""),1)]),_:1})):R("",!0),e(W).recovered>0?(s(),f(se,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).recovered)+" recovered ",1)]),_:1})):R("",!0),e(W).stillFailing>0?(s(),f(se,{key:2,color:"warning",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).stillFailing)+" still failing ",1)]),_:1})):R("",!0),e(W).newFailures===0&&e(W).recovered===0&&e(W).stillFailing===0?(s(),r("span",pr,"No status changes")):R("",!0)]),n("div",gr,[o[46]||(o[46]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(W).regressed>0?(s(),f(se,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).regressed)+" regressed ",1)]),_:1})):R("",!0),e(W).improved>0?(s(),f(se,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).improved)+" improved ",1)]),_:1})):R("",!0),a(se,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).unchanged)+" unchanged ",1)]),_:1})])]),a(st,{data:e(tt),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"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",fr,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",_r,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Re,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",vr,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Re,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",yr,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",hr,"—")):(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(Re,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",xr,"—")):(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(ee)||!e(te)?(s(),r("div",br," Select two runs to compare test results. ")):(s(),r("div",kr," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":t(()=>[a(ws,{"project-id":String(e(m))},null,8,["project-id"])]),quarantine:t(()=>[a(Rs,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"])]),members:t(()=>[a(He,null,{header:t(()=>[n("div",$r,[n("p",Cr,[o[47]||(o[47]=d(" Users with access to this project ",-1)),a(Fe,{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",Tr,[(s(!0),r(X,null,ae(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",jr,c(l.name||l.username),1),n("div",Sr,[n("span",null,"@"+c(l.username),1),a(se,{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",wr,"Global access")):R("",!0)])]),l.role!=="administrator"?(s(),f(Ds,{key:0,"model-value":e(B).includes(l.id),disabled:l.global,title:l.global?"Has global access — remove global assignment first":"",onChange:De=>h(l.id)},null,8,["model-value","disabled","title","onChange"])):(s(),r("span",Rr,"Admin"))]))),128))])):(s(),r("div",Dr,"Loading members…"))]),_:1})]),timeline:t(()=>[a(As,{"project-id":Number(e(m)),markers:e(Te),environments:e(Ke),"can-edit":e(We),"focus-marker-id":e(Ie),onChanged:e(_t),onClearFocus:o[13]||(o[13]=l=>Ie.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),a(Vt,null,{default:t(()=>[a(Bt,{open:e(P),title:"Delete project","onUpdate:open":o[17]||(o[17]=l=>{l||(P.value=!1)})},{body:t(()=>[n("div",Ar,[n("p",zr,[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",Ur,[o[50]||(o[50]=d(" Type the project key ",-1)),n("code",Ir,c(e(i)?.name),1),o[51]||(o[51]=d(" to confirm: ",-1))]),a(Ct,{modelValue:e(K),"onUpdate:modelValue":o[15]||(o[15]=l=>J(K)?K.value=l:null),placeholder:e(i)?.name,autofocus:"",onKeydown:Ls(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(Vt,null,{default:t(()=>[a(Bt,{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(A)===e(v),onClick:o[19]||(o[19]=l=>Q(e(v)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Vi as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as l,U as o,o as u,f as p,g as d,V as f,W as n,k as i,X as _}from"./
|
|
1
|
+
import{d as l,U as o,o as u,f as p,g as d,V as f,W as n,k as i,X as _}from"./h49q_GXF.js";var m=l({__name:"Label",props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"label"}},setup(r){const t=r;return o(),(s,a)=>(u(),p(i(_),n(t,{onMousedown:a[0]||(a[0]=e=>{!e.defaultPrevented&&e.detail>1&&e.preventDefault()})}),{default:d(()=>[f(s.$slots,"default")]),_:3},16))}}),b=m;export{b as L};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{_ as Le}from"./C9p0YCAi.js";import{_ as Pe}from"./BTvE9qca.js";import{_ as _e,a as De,b as Oe,c as He,d as qe,e as Ke,f as Ge,g as ke,u as We,h as Je,i as Qe,j as Ze,k as Xe,l as Ye,m as et}from"./Bb7Uckln.js";import{d as ee,o as s,f as S,g as p,i as t,j as r,c as l,t as o,v as d,s as ce,k as e,m as b,p as te,G as be,F as B,y as Z,_ as ie,h as D,H as tt,q as Y,I as st,r as x,J as ae,B as nt,l as Q,E as $e,K as at,L as ot,C as fe,M as lt,b as rt,u as it,w as ct,e as ut,N as dt}from"./h49q_GXF.js";import{_ as Ce}from"./CRPt9SfB.js";import{_ as mt,a as ft}from"./B_mN5eMV.js";import{_ as ge}from"./BtSJxOdh.js";import{_ as pt}from"./C0v6l4pr.js";import{_ as gt}from"./DLNNAYfu.js";import{_ as we}from"./CScusXhF.js";import{_ as xt,a as vt,i as ht,b as yt,s as ve,c as _t}from"./DBhdObsO.js";import{c as he,f as re,a as kt,b as bt,d as $t,g as Se,s as pe,e as de,r as ye,h as Ct}from"./CD3R-ggS.js";import{_ as xe}from"./PdEEuEsg.js";import{_ as wt}from"./CDh_Qt7h.js";import{_ as St}from"./BH-ym1CI.js";import{_ as Tt}from"./DHUT-BKj.js";import{_ as It}from"./CWw9WGlv.js";import{_ as Te}from"./jjOqY9Tv.js";import{u as jt,p as Rt,_ as zt}from"./6-ivqM_I.js";import{b as Ut}from"./BZnfiR67.js";import{a as Et,u as Vt}from"./Cd8r0xk5.js";import"./BhH0TNTi.js";import"./DOLeth7M.js";import"./BDQCwxpX.js";import"./BaDhDBCV.js";import"./9N6hSApy.js";import"./Dj-TetcW.js";import"./D-c8ZSws.js";import"./CWoSSKhQ.js";import"./BjaRappk.js";import"./Hot1UcKY.js";import"./xbO0VmDX.js";import"./BNAHBHbY.js";import"./B6s20NbT.js";import"./Cf52zHyB.js";import"./t-juTK3X.js";const At={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Mt={class:"flex items-center gap-3 min-w-0"},Nt={class:"font-mono text-sm truncate text-gray-600 dark:text-gray-400 min-w-0"},Ft={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Bt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Lt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Pt={key:1,class:"text-xs text-gray-400 whitespace-nowrap"},Dt={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ot={class:"lg:col-span-9"},Ht={class:"space-y-3"},qt={key:0,class:"text-sm font-medium break-words text-gray-500 dark:text-gray-400"},Kt={class:"flex flex-wrap gap-2"},Gt={class:"text-sm text-gray-500"},Wt={key:1,class:"rounded-md border border-default p-3 space-y-1.5"},Jt={class:"flex items-center gap-2 flex-wrap"},Qt={key:0,class:"text-xs text-gray-500"},Zt={class:"text-xs text-gray-500"},Xt={class:"text-sm text-gray-500"},Yt={class:"font-mono text-xs"},es={class:"flex items-start gap-3"},ts={class:"flex flex-col gap-1 shrink-0"},ss={class:"flex-1 min-w-0 space-y-1.5"},ns={class:"flex justify-end"},as=ee({__name:"ClusterSummary",props:{cluster:{},triageStatus:{},triageNote:{},triageSaving:{type:Boolean},triageChanged:{type:Boolean}},emits:["update:triageStatus","update:triageNote","save-triage"],setup(a,{emit:j}){const f=a,$=j,m=D(()=>$t(f.cluster.fixVerification)),C=[{label:"Open",value:"open",color:"warning"},{label:"Resolved",value:"resolved",color:"success"},{label:"Ignored",value:"ignored",color:"neutral"}];return(n,u)=>{const y=ce,U=te,E=ge,R=be,T=pt,h=gt,I=ie,v=we,A=xt;return s(),S(A,{"storage-key":"failure-cluster"},{folded:p(()=>[t("div",At,[t("div",Mt,[r(y,{color:("clusterStatusColor"in n?n.clusterStatusColor:e(bt))(a.cluster.status),variant:"solid",size:"sm",class:"shrink-0 capitalize"},{default:p(()=>[b(o(a.cluster.status),1)]),_:1},8,["color"]),t("span",Nt,o(a.cluster.signature),1),a.cluster.errorType?(s(),S(y,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(he))(a.cluster.errorType),variant:"subtle",size:"sm"},{default:p(()=>[b(o(a.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),e(m)?(s(),S(y,{key:1,color:e(m).color,variant:"subtle",size:"sm",class:"gap-1 shrink-0"},{default:p(()=>[r(U,{name:e(m).icon,class:"size-3"},null,8,["name"]),b(" "+o(e(m).label),1)]),_:1},8,["color"])):d("",!0)]),t("div",Ft,[t("span",Bt,o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1),t("span",Lt,o(a.cluster.affectedTests)+" "+o(a.cluster.affectedTests===1?"test":"tests"),1),a.cluster.diagnosis?.status==="completed"&&a.cluster.diagnosis?.category?(s(),S(y,{key:0,color:"neutral",variant:"outline",size:"sm",class:"gap-1 whitespace-nowrap"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),b(" "+o(a.cluster.diagnosis.category),1)]),_:1})):d("",!0),a.cluster.lastSeenAt?(s(),l("span",Pt," last seen "+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.lastSeenAt)),1)):d("",!0)])])]),default:p(()=>[t("div",Dt,[t("div",Ot,[r(h,{title:a.cluster.signature},{default:p(()=>[t("div",Ht,[a.cluster.title?(s(),l("p",qt,o(a.cluster.title),1)):d("",!0),t("div",Kt,[a.cluster.errorType?(s(),S(y,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(he))(a.cluster.errorType),variant:"subtle"},{default:p(()=>[b(o(a.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),r(y,{color:"neutral",variant:"subtle"},{default:p(()=>[b(o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1)]),_:1}),r(y,{color:"neutral",variant:"subtle"},{default:p(()=>[b(o(a.cluster.affectedTests)+" "+o(a.cluster.affectedTests===1?"test":"tests")+" affected ",1)]),_:1}),a.cluster.diagnosis?.status==="completed"&&a.cluster.diagnosis?.category?(s(),S(y,{key:1,color:"neutral",variant:"outline",class:"gap-1"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),b(" "+o(a.cluster.diagnosis.category),1)]),_:1})):d("",!0),r(E,{topic:"cluster.concept"})]),t("p",Gt,[u[2]||(u[2]=b(" First seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[b(" run #"+o(a.cluster.firstSeenRunId),1)]),_:1},8,["to"]),a.cluster.firstSeenAt?(s(),l(B,{key:0},[b(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.firstSeenAt))+") ",1)],64)):d("",!0),u[3]||(u[3]=b(" · Last seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.lastSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[b(" run #"+o(a.cluster.lastSeenRunId),1)]),_:1},8,["to"]),a.cluster.lastSeenAt?(s(),l(B,{key:1},[b(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.lastSeenAt))+") ",1)],64)):d("",!0),a.cluster.lastSeenRunStatus?(s(),S(T,{key:2,status:a.cluster.lastSeenRunStatus,size:"sm",class:"ml-1 align-middle"},null,8,["status"])):d("",!0)]),e(m)?(s(),l("div",Wt,[t("div",Jt,[r(y,{color:e(m).color,variant:"subtle",class:"gap-1"},{default:p(()=>[r(U,{name:e(m).icon,class:"size-3"},null,8,["name"]),b(" "+o(e(m).label),1)]),_:1},8,["color"]),a.cluster.timeToResolutionMs!=null?(s(),l("span",Qt," open for "+o(("formatDuration"in n?n.formatDuration:e(kt))(a.cluster.timeToResolutionMs)),1)):d("",!0),r(E,{topic:"cluster.resolution"})]),t("p",Zt,o(e(m).hint),1),t("p",Xt,[a.cluster.fixLandedRunId?(s(),l(B,{key:0},[u[4]||(u[4]=b(" Fix landed in ",-1)),r(R,{to:`/test-runs/${a.cluster.fixLandedRunId}`,class:"text-primary hover:underline"},{default:p(()=>[b(" run #"+o(a.cluster.fixLandedRunId),1)]),_:1},8,["to"])],64)):d("",!0),a.cluster.fixLandedAt?(s(),l(B,{key:1},[b(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.fixLandedAt))+")",1)],64)):d("",!0),a.cluster.fixCommit?(s(),l(B,{key:2},[u[5]||(u[5]=b(" · commit ",-1)),t("code",Yt,o(a.cluster.fixCommit.slice(0,8)),1)],64)):d("",!0)])])):d("",!0)])]),_:1},8,["title"])]),r(h,{class:"lg:col-span-3",icon:"i-lucide-triangle-alert","icon-class":"text-amber-500",title:"Triage",help:"cluster.triage"},{default:p(()=>[t("div",es,[t("div",ts,[(s(),l(B,null,Z(C,M=>r(I,{key:M.value,size:"xs",class:"justify-start",color:a.triageStatus===M.value?M.color:"neutral",variant:a.triageStatus===M.value?"solid":"outline",onClick:O=>$("update:triageStatus",M.value)},{default:p(()=>[b(o(M.label),1)]),_:2},1032,["color","variant","onClick"])),64))]),t("div",ss,[r(v,{"model-value":a.triageNote,placeholder:"Optional note…",rows:3,class:"text-sm w-full","onUpdate:modelValue":u[0]||(u[0]=M=>$("update:triageNote",M))},null,8,["model-value"]),t("div",ns,[a.triageChanged?(s(),S(I,{key:0,size:"xs",icon:"i-lucide-check",loading:a.triageSaving,onClick:u[1]||(u[1]=M=>$("save-triage"))},{default:p(()=>[...u[6]||(u[6]=[b(" Save ",-1)])]),_:1},8,["loading"])):d("",!0)])])])]),_:1})])]),_:1})}}}),os=Object.assign(as,{__name:"ClusterSummary"}),ls={class:"divide-y divide-default"},rs={class:"text-xs font-mono text-gray-700 dark:text-gray-300 break-all whitespace-pre-wrap"},is={class:"text-xs font-mono text-gray-600 dark:text-gray-400 truncate"},cs=ee({__name:"TestEvidenceSignals",props:st({consoleLogs:{},networkRequests:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(a){const j=a,f=D(()=>Array.isArray(j.consoleLogs)?j.consoleLogs.filter(u=>u.type==="error"||u.type==="warning"):[]),$=D(()=>Array.isArray(j.networkRequests)?j.networkRequests.filter(u=>u.status&&u.status>=400):[]),m=D(()=>f.value.length>0||$.value.length>0),C=D(()=>{const u=[];return f.value.length&&u.push(`${f.value.length} console`),$.value.length&&u.push(`${$.value.length} network`),u.join(", ")}),n=tt(a,"open");return(u,y)=>{const U=te,E=ce,R=_e;return e(m)?(s(),S(R,{key:0,icon:"i-lucide-triangle-alert",label:`Signals (${e(C)})`,open:n.value,"onUpdate:open":y[0]||(y[0]=T=>n.value=T)},{default:p(()=>[t("div",ls,[e(f).length>0?(s(),l(B,{key:0},[y[1]||(y[1]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Console")],-1)),(s(!0),l(B,null,Z(e(f),(T,h)=>(s(),l("div",{key:"log-"+h,class:"px-3 py-1.5 flex items-start gap-2"},[r(U,{name:T.type==="error"?"i-lucide-x-circle":"i-lucide-alert-triangle",class:Y(["size-3.5 mt-0.5 shrink-0",T.type==="error"?"text-red-500":"text-yellow-500"])},null,8,["name","class"]),t("p",rs,o(T.text),1)]))),128))],64)):d("",!0),e($).length>0?(s(),l(B,{key:1},[y[2]||(y[2]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Network")],-1)),(s(!0),l(B,null,Z(e($),(T,h)=>(s(),l("div",{key:"req-"+h,class:"px-3 py-1.5 flex items-center gap-2"},[r(E,{color:T.status>=500?"error":"warning",variant:"subtle",size:"sm",class:"shrink-0 font-mono"},{default:p(()=>[b(o(T.status),1)]),_:2},1032,["color"]),t("p",is,o(T.url),1)]))),128))],64)):d("",!0)])]),_:1},8,["label","open"])):d("",!0)}}}),us=Object.assign(cs,{__name:"TestEvidenceSignals"}),ds={class:"space-y-3"},ms={key:0,class:"flex gap-0 border-b border-default overflow-x-auto"},fs=["title","onClick"],ps={key:0,class:"opacity-60 ml-1"},gs={key:1,class:"flex items-start justify-between gap-2 flex-wrap"},xs={class:"min-w-0"},vs={class:"text-sm font-medium break-words"},hs={key:2,class:"flex items-center justify-center py-10"},ys={key:0,class:"flex flex-wrap gap-1.5"},_s={class:"divide-y divide-default"},ks={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},bs={key:0,class:"text-xs font-mono text-red-500 whitespace-pre-wrap break-all"},$s={class:"overflow-x-auto max-h-72"},Cs={class:"max-h-64 overflow-auto"},ws=ee({__name:"ClusterTestEvidence",props:{affectedTestCases:{},projectKey:{},projectName:{}},setup(a){const j=a,f=x(j.affectedTestCases[0]?.recentTestRunsCaseId??null),$=D(()=>j.affectedTestCases.find(i=>i.recentTestRunsCaseId===f.value)),m=x(null),C=x([]),n=x(!1),u=x(!1),y=x(!1),U=x(!1),E=x(!1),R=x(!1),T=x(!1),h=new Map;function I(){y.value=!1,U.value=!1,E.value=!1,R.value=!1,T.value=!1}async function v(i){I();const w=h.get(i);if(w){m.value=w.detail,C.value=w.traces,n.value=!1,u.value=!1;return}n.value=!0,u.value=!0,m.value=null,C.value=[];const[P,q]=await Promise.allSettled([$fetch(`/api/test-run-cases/${i}`),$fetch(`/api/test-run-cases/${i}/traces`)]);P.status==="fulfilled"&&(m.value=P.value),n.value=!1,q.status==="fulfilled"&&(C.value=q.value),u.value=!1,P.status==="fulfilled"&&q.status==="fulfilled"&&h.set(i,{detail:P.value,traces:q.value})}const A=new Map,M=x(null),O=x("trace"),N=D(()=>M.value?.frames??[]);async function H(i){if(M.value=A.get(i)??null,A.has(i)||C.value.length===0)return;const w=m.value?.testRun?.id;if(w)try{const P=await $fetch(`/api/test-runs/${w}/cases/${i}/trace-stacks`),q=P.status==="ok"&&P.frames?.length?P:null;A.set(i,q),f.value===i&&(M.value=q)}catch{A.set(i,null)}}ae([m,C],()=>{O.value="trace",f.value&&H(f.value)}),ae(f,i=>{i&&v(i)}),nt(()=>{f.value&&v(f.value)});const V=D(()=>{const i=m.value?.steps;return Array.isArray(i)?i.filter(w=>w.error):[]}),L=D(()=>m.value?.testSource?m.value.testSource.split(`
|
|
2
|
+
`).length:0),z=D(()=>{const i=m.value;if(!i)return[];const w=i.attachments.filter(_=>ht(_.path,_.contentType)).length,P=i.attachments.filter(_=>yt(_.path,_.contentType)).length,q=Array.isArray(i.consoleLogs)?i.consoleLogs.filter(_=>_.type==="error"||_.type==="warning").length:0,X=Array.isArray(i.networkRequests)?i.networkRequests.filter(_=>(_.status??0)>=400).length:0;return[{icon:"i-lucide-image",label:"screenshots",count:w},{icon:"i-lucide-video",label:"videos",count:P},{icon:"i-lucide-bug-play",label:"traces",count:C.value.length},{icon:"i-lucide-list-checks",label:"failing steps",count:V.value.length},{icon:"i-lucide-triangle-alert",label:"signals",count:q+X},{icon:"i-lucide-code",label:"source",count:i.testSourceFrames?.length||(i.testSource?1:0)},{icon:"i-lucide-accessibility",label:"ARIA",count:i.ariaSnapshot?1:0}].filter(_=>_.count>0)});return(i,w)=>{const P=xe,q=ie,X=te,_=ce,c=De,k=Oe,F=He,K=_e,G=us,W=wt,J=qe,se=Ke,ne=vt,ue=Ge;return s(),l("div",ds,[a.affectedTestCases.length>1?(s(),l("div",ms,[(s(!0),l(B,null,Z(a.affectedTestCases,g=>(s(),l("button",{key:g.recentTestRunsCaseId,class:Y(["px-3 py-1.5 text-xs whitespace-nowrap border-b-2 -mb-px transition-colors",e(f)===g.recentTestRunsCaseId?"border-primary text-primary font-medium":"border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"]),title:g.title,onClick:oe=>f.value=g.recentTestRunsCaseId},[b(o(g.title.split(" › ").pop())+" ",1),g.runCount>1?(s(),l("span",ps,o(g.runCount)+"×",1)):d("",!0)],10,fs))),128))])):d("",!0),e($)?(s(),l("div",gs,[t("div",xs,[t("p",vs,o(e($).title),1),r(P,{"file-path":e($).filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])]),r(q,{to:`/test-run-cases/${e($).recentTestRunsCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:p(()=>[...w[6]||(w[6]=[b(" Open execution ",-1)])]),_:1},8,["to"])])):d("",!0),e(n)?(s(),l("div",hs,[r(X,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(m)?(s(),l(B,{key:3},[e(z).length?(s(),l("div",ys,[(s(!0),l(B,null,Z(e(z),g=>(s(),S(_,{key:g.label,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:p(()=>[r(X,{name:g.icon,class:"size-3"},null,8,["name"]),b(" "+o(g.count)+" "+o(g.label),1)]),_:2},1024))),128))])):d("",!0),r(c,{attachments:e(m).attachments},null,8,["attachments"]),r(k,{attachments:e(m).attachments},null,8,["attachments"]),r(F,{traces:e(C),loading:e(u)},null,8,["traces","loading"]),e(V).length>0?(s(),S(K,{key:1,icon:"i-lucide-list-checks",label:"Failing steps",count:e(V).length,open:e(y),"onUpdate:open":w[0]||(w[0]=g=>Q(y)?y.value=g:null)},{default:p(()=>[t("div",_s,[(s(!0),l(B,null,Z(e(V),(g,oe)=>(s(),l("div",{key:oe,class:"px-3 py-2 space-y-0.5"},[t("p",ks,o(oe+1)+". "+o(g.title),1),g.error?.message?(s(),l("p",bs,o(g.error.message),1)):d("",!0)]))),128))])]),_:1},8,["count","open"])):d("",!0),r(G,{"console-logs":e(m).consoleLogs,"network-requests":e(m).networkRequests,open:e(U),"onUpdate:open":w[1]||(w[1]=g=>Q(U)?U.value=g:null)},null,8,["console-logs","network-requests","open"]),e(m).testSourceFrames?.length||e(m).testSource||e(N).length?(s(),S(K,{key:2,icon:"i-lucide-code",label:"Test source",count:e(N).length||e(m).testSourceFrames?.length||e(L),open:e(E),"onUpdate:open":w[3]||(w[3]=g=>Q(E)?E.value=g:null)},{default:p(()=>[e(N).length&&(e(m).testSourceFrames?.length||e(m).testSource)?(s(),S(W,{key:0,modelValue:e(O),"onUpdate:modelValue":w[2]||(w[2]=g=>Q(O)?O.value=g:null),items:[{label:`Full stack (${e(N).length})`,value:"trace"},{label:`Captured (${e(m).testSourceFrames?.length||1})`,value:"captured"}],size:"xs",variant:"link",class:"mb-1.5",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"])):d("",!0),t("div",$s,[e(O)==="trace"&&e(N).length?(s(),S(J,{key:0,frames:e(N),"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(m).testSourceFrames?.length?(s(),S(se,{key:1,frames:e(m).testSourceFrames,"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(m).testSource?(s(),S(ne,{key:2,text:"```typescript\n"+e(m).testSource+"\n```"},null,8,["text"])):d("",!0)])]),_:1},8,["count","open"])):d("",!0),e(m).ariaSnapshot?(s(),S(K,{key:3,icon:"i-lucide-accessibility",label:"ARIA snapshot",open:e(R),"onUpdate:open":w[4]||(w[4]=g=>Q(R)?R.value=g:null)},{default:p(()=>[t("div",Cs,[r(ne,{text:"```yaml\n"+e(m).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},8,["open"])):d("",!0),e(m).pageState?(s(),S(K,{key:4,icon:"i-lucide-database",label:"App state",open:e(T),"onUpdate:open":w[5]||(w[5]=g=>Q(T)?T.value=g:null)},{default:p(()=>[r(ue,{"page-state":e(m).pageState,plain:""},null,8,["page-state"])]),_:1},8,["open"])):d("",!0)],64)):d("",!0)])}}}),Ss=Object.assign(ws,{__name:"ClusterTestEvidence"}),Ts={key:0,class:"flex items-center gap-1.5 overflow-hidden min-w-0"},Is={class:"text-primary shrink-0"},js={class:"text-gray-500 truncate text-xs font-sans"},Rs={key:1,class:"text-primary text-xs"},zs={key:2,class:"text-gray-400 font-sans text-xs"},Us={class:"w-96 p-2 space-y-2"},Es={class:"flex items-center gap-1"},Vs={class:"flex items-center gap-1"},As={key:0,class:"flex items-center gap-2 px-2 py-1.5 text-xs rounded-md bg-primary/5 text-gray-600 dark:text-gray-300"},Ms={class:"font-medium text-green-600 dark:text-green-400"},Ns={class:"font-medium text-red-600 dark:text-red-400"},Fs={class:"text-gray-400"},Bs={key:1,class:"flex items-center justify-center gap-2 py-6 text-gray-400"},Ls={key:2,class:"py-4 text-center text-sm text-red-500"},Ps={key:3,class:"flex items-start gap-2 px-2 py-2 text-xs text-amber-700 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 rounded-md"},Ds={key:4,class:"max-h-80 overflow-y-auto space-y-px"},Os={class:"text-xs text-primary"},Hs={key:1,class:"py-4 text-center text-sm text-gray-400"},qs=["onClick"],Ks={class:"text-xs text-primary shrink-0 w-14 pt-px"},Gs={class:"flex-1 min-w-0"},Ws={class:"text-xs font-medium leading-snug truncate"},Js={class:"text-xs text-gray-400 leading-snug truncate"},Qs=ee({__name:"CommitPicker",props:{modelValue:{},clusterId:{}},emits:["update:modelValue"],setup(a,{emit:j}){const f=a,$=j,m=x(!1),C=x(""),n=x([]),u=x(null),y=x(null),U=x(!1),E=x(!1),R=x(null),T=x(null),h=x([]),I=x(!1),v=x(void 0),A=D(()=>{if(!f.modelValue)return null;const z=f.modelValue.trim();return n.value.find(w=>w.sha===z||w.sha.startsWith(z))??{sha:z,shortSha:z.slice(0,7),message:"",author:"",date:""}});async function M(){if(!h.value.length){I.value=!0;try{const z=await $fetch(`/api/failure-clusters/${f.clusterId}/branches`);h.value=z.branches}catch{}finally{I.value=!1}}}async function O(){const z=f.modelValue||"";U.value=!0,E.value=!1,T.value=null;try{const i={};z&&(i.baseline=z),v.value&&(i.branch=v.value);const w=await $fetch(`/api/failure-clusters/${f.clusterId}/commits`,{query:i});n.value=w.commits,y.value=w.aggregate,u.value=w.error??null,T.value=z}catch{E.value=!0}finally{U.value=!1}}ae(v,()=>{n.value=[],T.value=null,O()}),ae(m,async z=>{if(z){await Promise.all([M(),O()]),await ot();const i=R.value?.$el?.querySelector("input")??R.value?.$el;i instanceof HTMLElement&&i.focus()}else C.value=""});const N=D(()=>Se(n.value,C.value)),H=D(()=>{const z=C.value.trim();return!/^[0-9a-f]{7,40}$/i.test(z)||N.value.some(i=>i.sha.startsWith(z.toLowerCase()))?null:z});function V(z){$("update:modelValue",z),m.value=!1}function L(z){z.stopPropagation(),u.value=null,y.value=null,$("update:modelValue",""),m.value=!1}return(z,i)=>{const w=ie,P=te,q=St,X=$e,_=at;return s(),S(_,{open:e(m),"onUpdate:open":i[4]||(i[4]=c=>Q(m)?m.value=c:null)},{content:p(()=>[t("div",Us,[t("div",Es,[r(P,{name:"i-lucide-git-branch",class:"size-3.5 text-gray-400 shrink-0"}),r(q,{modelValue:e(v),"onUpdate:modelValue":i[0]||(i[0]=c=>Q(v)?v.value=c:null),items:e(h),placeholder:"Default branch",size:"xs",class:"flex-1",loading:e(I),disabled:e(I)},null,8,["modelValue","items","loading","disabled"])]),t("div",Vs,[r(X,{ref_key:"searchInputRef",ref:R,modelValue:e(C),"onUpdate:modelValue":i[1]||(i[1]=c=>Q(C)?C.value=c:null),placeholder:"Search message, author, SHA…",size:"xs",icon:"i-lucide-search",class:"flex-1"},null,8,["modelValue"]),a.modelValue?(s(),S(w,{key:0,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Clear baseline",onClick:i[2]||(i[2]=c=>L(c))})):d("",!0)]),e(y)&&a.modelValue&&!e(U)?(s(),l("div",As,[r(P,{name:"i-lucide-git-compare-arrows",class:"size-3.5 shrink-0 text-primary"}),i[5]||(i[5]=t("span",null,"Since baseline:",-1)),t("span",Ms,"+"+o(e(y).linesAdded),1),t("span",Ns,"-"+o(e(y).linesRemoved),1),t("span",Fs,"across "+o(e(y).filesChanged)+" file"+o(e(y).filesChanged===1?"":"s"),1)])):d("",!0),e(U)?(s(),l("div",Bs,[r(P,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),i[6]||(i[6]=t("span",{class:"text-sm"},"Loading commits…",-1))])):e(E)?(s(),l("div",Ls," Failed to load commits — check your SCM token in Settings → AI ")):e(u)&&!e(U)&&e(n).length===0?(s(),l("div",Ps,[r(P,{name:"i-lucide-triangle-alert",class:"size-3.5 shrink-0 mt-0.5"}),t("span",null,o(e(u)),1)])):(s(),l("div",Ds,[e(H)?(s(),l("button",{key:0,class:"w-full text-left px-2 py-1.5 rounded flex items-center gap-2 hover:bg-elevated transition-colors border border-dashed border-default",onClick:i[3]||(i[3]=c=>V(e(H)))},[r(P,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),i[7]||(i[7]=t("span",{class:"text-xs text-gray-500"},"Use commit",-1)),t("code",Os,o(e(H).slice(0,7)),1)])):d("",!0),e(N).length===0&&!e(H)?(s(),l("div",Hs,o(e(C)?"No commits match":"No commits available"),1)):d("",!0),(s(!0),l(B,null,Z(e(N),c=>(s(),l("button",{key:c.sha,class:Y(["w-full text-left px-2 py-1.5 rounded flex items-start gap-2 hover:bg-elevated transition-colors",a.modelValue===c.sha?"bg-primary/10 ring-1 ring-inset ring-primary/30":""]),onClick:k=>V(c.sha)},[t("code",Ks,o(c.shortSha),1),t("div",Gs,[t("p",Ws,o(c.message),1),t("p",Js,[b(o(c.author),1),c.date?(s(),l(B,{key:0},[b(" · "+o(e(re)(c.date)),1)],64)):d("",!0)])]),a.modelValue===c.sha?(s(),S(P,{key:0,name:"i-lucide-check",class:"size-3.5 text-primary shrink-0 mt-0.5"})):d("",!0)],10,qs))),128))]))])]),default:p(()=>[r(w,{size:"xs",color:"neutral",variant:"outline",icon:a.modelValue?"i-lucide-git-branch-plus":"i-lucide-git-branch","trailing-icon":"i-lucide-chevron-down",class:"min-w-36 max-w-48 font-mono"},{default:p(()=>[e(A)?.message?(s(),l("span",Ts,[t("code",Is,o(e(A).shortSha),1),t("span",js,o(e(A).message),1)])):a.modelValue?(s(),l("span",Rs,o(a.modelValue.slice(0,7))+"…",1)):(s(),l("span",zs,"baseline commit…"))]),_:1},8,["icon"])]),_:1},8,["open"])}}}),Zs=Object.assign(Qs,{__name:"CommitPicker"}),Xs={class:"space-y-3"},Ys={key:0,class:"space-y-1"},en={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},tn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},sn={class:"text-xs text-gray-400 shrink-0"},nn={class:"text-xs text-gray-700 dark:text-gray-300 truncate"},an={class:"space-y-1"},on={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},ln={key:0,class:"text-yellow-500 font-normal normal-case"},rn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},cn=["onClick"],un={class:"text-xs font-mono flex-1 truncate text-gray-700 dark:text-gray-300"},dn={class:"text-xs text-gray-400 shrink-0 tabular-nums"},mn={key:0,class:"text-green-500"},fn={key:1,class:"text-gray-300 mx-0.5"},pn={key:2,class:"text-red-500"},gn={key:0,class:"border-t border-default overflow-x-auto max-h-96"},xn=ee({__name:"ScmChangesView",props:{changes:{}},setup(a){const j=x(new Set);function f($){const m=new Set(j.value);m.has($)?m.delete($):m.add($),j.value=m}return($,m)=>{const C=te,n=ke;return s(),l("div",Xs,[a.changes.commits.length>0?(s(),l("div",Ys,[t("p",en,o(a.changes.commits.length)+" commit"+o(a.changes.commits.length===1?"":"s"),1),t("div",tn,[(s(!0),l(B,null,Z(a.changes.commits,u=>(s(),l("div",{key:u.sha,class:"flex items-center gap-2 px-3 py-1.5"},[r(C,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),t("code",sn,o(u.sha.slice(0,7)),1),t("span",nn,o(u.message),1)]))),128))])])):d("",!0),t("div",an,[t("p",on,[b(o(a.changes.files.length)+" file"+o(a.changes.files.length===1?"":"s")+" changed ",1),a.changes.patchesOmitted?(s(),l("span",ln," — diff too large, file names only ")):d("",!0)]),t("div",rn,[(s(!0),l(B,null,Z(a.changes.files,u=>(s(),l("div",{key:u.filename},[t("button",{class:Y(["w-full flex items-center gap-2 px-3 py-1.5 text-left hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",u.patch?"cursor-pointer":"cursor-default"]),onClick:y=>u.patch&&f(u.filename)},[r(C,{name:("scmFileStatusMeta"in $?$.scmFileStatusMeta:e(pe))(u.status).icon,class:Y(["size-3.5 shrink-0",("scmFileStatusMeta"in $?$.scmFileStatusMeta:e(pe))(u.status).color])},null,8,["name","class"]),t("span",un,o(u.filename),1),t("span",dn,[u.additions?(s(),l("span",mn,"+"+o(u.additions),1)):d("",!0),u.additions&&u.deletions?(s(),l("span",fn,"/")):d("",!0),u.deletions?(s(),l("span",pn,"-"+o(u.deletions),1)):d("",!0)]),u.patch?(s(),S(C,{key:0,name:e(j).has(u.filename)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400 shrink-0"},null,8,["name"])):d("",!0)],10,cn),u.patch&&e(j).has(u.filename)?(s(),l("div",gn,[r(n,{patch:u.patch},null,8,["patch"])])):d("",!0)]))),128))])])])}}}),vn=Object.assign(xn,{__name:"ScmChangesView"}),hn={class:"border border-default rounded-lg overflow-clip text-xs font-mono"},yn={class:"sticky top-0 z-10 flex items-center justify-between px-3 py-1.5 bg-elevated border-b border-default text-gray-600 dark:text-gray-300"},_n={class:"font-medium truncate"},kn={class:"shrink-0 flex items-center gap-1.5 ml-2 text-[11px]"},bn={key:0,class:"text-green-600 dark:text-green-400"},$n={key:1,class:"text-red-600 dark:text-red-400"},Cn={key:1,class:"px-3 py-2 text-gray-400 text-[11px]"},wn=ee({__name:"DiffFile",props:{file:{}},setup(a){return(j,f)=>{const $=ce,m=ke;return s(),l("div",hn,[t("div",yn,[t("span",_n,o(a.file.filename),1),t("span",kn,[a.file.additions?(s(),l("span",bn,"+"+o(a.file.additions),1)):d("",!0),a.file.deletions?(s(),l("span",$n,"-"+o(a.file.deletions),1)):d("",!0),r($,{label:a.file.status,size:"xs",variant:"subtle",color:("scmFileStatusMeta"in j?j.scmFileStatusMeta:e(pe))(a.file.status).badgeColor},null,8,["label","color"])])]),a.file.patch?(s(),S(m,{key:0,patch:a.file.patch},null,8,["patch"])):(s(),l("div",Cn,"No patch available"))])}}}),Sn=Object.assign(wn,{__name:"DiffFile"}),Tn={class:"inline-flex items-center gap-1"},In={class:"flex h-[72vh] overflow-hidden"},jn={class:"w-72 shrink-0 border-r border-default flex flex-col"},Rn={class:"p-2 border-b border-default space-y-2 shrink-0"},zn={class:"flex items-center gap-2 text-xs text-gray-500"},Un={class:"ml-auto"},En={key:2,class:"flex-1 overflow-y-auto flex flex-col"},Vn={key:0,class:"py-6 text-center text-sm text-gray-400 flex-1"},An=["onClick"],Mn=["checked","onChange"],Nn={class:"flex-1 min-w-0"},Fn={class:"text-xs font-medium leading-snug truncate"},Bn={class:"text-[10px] text-gray-400 leading-snug mt-0.5 flex items-center gap-1 min-w-0"},Ln={class:"text-primary shrink-0"},Pn={class:"truncate"},Dn={key:0,class:"shrink-0"},On={key:1,class:"p-2 shrink-0 space-y-1.5"},Hn={key:0,class:"flex items-center gap-1.5 text-xs text-red-500 px-1"},qn={class:"flex-1 overflow-y-auto flex flex-col min-w-0"},Kn={key:0,class:"flex-1 flex items-center justify-center text-gray-400 text-sm"},Gn={key:2,class:"flex-1 p-4 space-y-3"},Wn={key:0,class:"space-y-0.5 pb-3 border-b border-default"},Jn={class:"flex items-center gap-2"},Qn={class:"text-xs font-mono text-primary"},Zn={class:"text-xs text-gray-400"},Xn={class:"text-sm font-semibold"},Yn={key:1,class:"text-sm text-gray-400 pt-2"},ea={key:4,class:"flex-1 flex items-center justify-center text-sm text-gray-400"},ta={class:"flex items-center gap-3 w-full"},sa={class:"flex-1 flex items-center gap-2 text-sm text-gray-500 min-w-0"},na={class:"font-medium text-gray-700 dark:text-gray-200 shrink-0"},aa={class:"shrink-0"},oa={class:"text-green-600 dark:text-green-400 shrink-0 font-medium"},la={class:"text-red-600 dark:text-red-400 shrink-0 font-medium"},ra={key:1,class:"text-gray-400 text-xs shrink-0"},ia={key:1},me=50,ca=ee({__name:"CommitBrowserModal",props:{open:{type:Boolean},clusterId:{},initialSelected:{},autoSelectedShas:{}},emits:["update:open","confirm"],setup(a,{emit:j}){const f=a,$=D(()=>new Set(f.autoSelectedShas??[])),m=j,C=x(""),n=x([]),u=x(me),y=x(!1),U=x(!1),E=x(!1),R=x(null),T=x(null),h=x(new Set),I=x(null),v=lt({}),A=x(null),M=x(!1),O=x(null),N=D(()=>n.value.find(_=>_.sha===I.value)??null),H=D(()=>Se(n.value,C.value)),V=D(()=>{let _=0,c=0,k=0,F=0;for(const K of h.value){if(!(K in v)){F++;continue}const G=v[K];G&&(_+=G.files.length,c+=G.files.reduce((W,J)=>W+J.additions,0),k+=G.files.reduce((W,J)=>W+J.deletions,0))}return{files:_,linesAdded:c,linesRemoved:k,unreviewed:F}});async function L(_){_?(U.value=!0,R.value=null):(E.value=!0,T.value=null);try{const c=await $fetch(`/api/failure-clusters/${f.clusterId}/commits`,{query:{limit:u.value}});n.value=c.commits,y.value=c.hasMore??!1,c.error&&!c.commits.length&&(_?R.value=c.error:T.value=c.error),_&&c.commits[0]&&i(c.commits[0].sha)}catch(c){_?R.value=de(c):T.value=de(c)}finally{U.value=!1,E.value=!1}}async function z(){u.value+=me,await L(!1)}ae(()=>f.open,async _=>{if(_){if(h.value=new Set(f.initialSelected??[]),n.value.length){!I.value&&n.value[0]&&i(n.value[0].sha);return}u.value=me,await L(!0)}});async function i(_){if(I.value!==_){if(I.value=_,O.value=null,_ in v){A.value=v[_],M.value=!1;return}A.value=null,M.value=!0;try{const c=await $fetch(`/api/failure-clusters/${f.clusterId}/commit-diff`,{query:{sha:_}});v[_]=c,I.value===_&&(A.value=c)}catch(c){I.value===_&&(O.value=de(c))}finally{I.value===_&&(M.value=!1)}}}function w(_){const c=new Set(h.value);c.has(_)?c.delete(_):c.add(_),h.value=c}function P(){h.value=new Set(H.value.map(_=>_.sha))}function q(){h.value=new Set}function X(){m("confirm",[...h.value]),m("update:open",!1)}return(_,c)=>{const k=ge,F=$e,K=Tt,G=ie,W=It,J=ce,se=te,ne=Sn,ue=Te;return s(),S(ue,{open:a.open,title:"Browse commits",ui:{content:"max-w-6xl",body:"p-0 overflow-hidden"},"onUpdate:open":c[4]||(c[4]=g=>m("update:open",g))},{title:p(()=>[t("span",Tn,[c[5]||(c[5]=b("Browse commits ",-1)),r(k,{topic:"cluster.commit-browser"})])]),body:p(()=>[t("div",In,[t("div",jn,[t("div",Rn,[r(F,{modelValue:e(C),"onUpdate:modelValue":c[0]||(c[0]=g=>Q(C)?C.value=g:null),placeholder:"Search commits…",size:"xs",icon:"i-lucide-search"},null,8,["modelValue"]),t("div",zn,[t("button",{class:"hover:text-primary transition-colors",onClick:P},"All"),c[6]||(c[6]=t("span",null,"·",-1)),t("button",{class:"hover:text-primary transition-colors",onClick:q},"None"),t("span",Un,o(e(h).size>0?`${e(h).size} selected`:"none selected"),1)])]),e(U)?(s(),S(K,{key:0,text:"Loading…",padded:!1,class:"flex-1"})):e(R)?(s(),S(W,{key:1,text:e(R),padded:!1,class:"flex-1 p-4"},{action:p(()=>[r(G,{size:"xs",color:"neutral",variant:"outline",onClick:c[1]||(c[1]=g=>L(!0))},{default:p(()=>[...c[7]||(c[7]=[b(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):(s(),l("div",En,[e(H).length===0?(s(),l("div",Vn,o(e(C)?"No commits match":"No commits"),1)):d("",!0),(s(!0),l(B,null,Z(e(H),g=>(s(),l("button",{key:g.sha,class:Y(["w-full text-left px-2.5 py-2 flex items-start gap-2.5 hover:bg-elevated transition-colors border-b border-default/50 last:border-0 shrink-0",e(I)===g.sha?"bg-elevated":""]),onClick:oe=>i(g.sha)},[t("input",{type:"checkbox",checked:e(h).has(g.sha),class:"mt-0.5 shrink-0 cursor-pointer accent-primary",onClick:c[2]||(c[2]=fe(()=>{},["stop"])),onChange:oe=>w(g.sha)},null,40,Mn),t("div",Nn,[t("p",Fn,o(g.message||"(no message)"),1),t("p",Bn,[t("code",Ln,o(g.shortSha),1),t("span",Pn,o(g.author),1),g.date?(s(),l("span",Dn,"· "+o(e(re)(g.date)),1)):d("",!0),e($).has(g.sha)?(s(),S(J,{key:1,size:"xs",color:"info",variant:"soft",class:"shrink-0"},{default:p(()=>[...c[8]||(c[8]=[b(" auto ",-1)])]),_:1})):d("",!0)])])],10,An))),128)),e(y)&&!e(C)?(s(),l("div",On,[e(T)?(s(),l("p",Hn,[r(se,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),b(" "+o(e(T)),1)])):d("",!0),r(G,{size:"xs",color:"neutral",variant:"outline",block:"",loading:e(E),onClick:z},{default:p(()=>[...c[9]||(c[9]=[b(" Load more ",-1)])]),_:1},8,["loading"])])):d("",!0)]))]),t("div",qn,[e(I)?e(M)?(s(),S(K,{key:1,text:"Loading diff…",padded:!1,class:"flex-1"})):e(A)?(s(),l("div",Gn,[e(N)?(s(),l("div",Wn,[t("div",Jn,[t("code",Qn,o(e(N).shortSha),1),t("span",Zn,[b(o(e(N).author),1),e(N).date?(s(),l(B,{key:0},[b(" · "+o(e(re)(e(N).date)),1)],64)):d("",!0)])]),t("p",Xn,o(e(N).message),1)])):d("",!0),e(A).files.length===0?(s(),l("div",Yn,"No file changes in this commit")):d("",!0),(s(!0),l(B,null,Z(e(A).files,g=>(s(),S(ne,{key:g.filename,file:g},null,8,["file"]))),128))])):e(O)?(s(),S(W,{key:3,text:e(O),padded:!1,class:"flex-1 p-6"},{action:p(()=>[...c[10]||(c[10]=[t("p",{class:"text-xs text-gray-400"},"Click the commit again to retry",-1)])]),_:1},8,["text"])):(s(),l("div",ea," Diff not available for this commit ")):(s(),l("div",Kn," Select a commit to view its diff "))])])]),footer:p(()=>[t("div",ta,[t("div",sa,[e(h).size>0?(s(),l(B,{key:0},[t("span",na,o(e(h).size)+" commit"+o(e(h).size===1?"":"s"),1),e(V).files>0||e(V).linesAdded>0||e(V).linesRemoved>0?(s(),l(B,{key:0},[c[11]||(c[11]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("span",aa,o(e(V).files)+" file"+o(e(V).files===1?"":"s"),1),t("span",oa,"+"+o(e(V).linesAdded),1),t("span",la,"-"+o(e(V).linesRemoved),1)],64)):d("",!0),e(V).unreviewed>0?(s(),l("span",ra," ("+o(e(V).unreviewed)+" unreviewed) ",1)):d("",!0)],64)):(s(),l("span",ia,"No commits selected"))]),r(G,{color:"neutral",variant:"ghost",onClick:c[3]||(c[3]=g=>m("update:open",!1))},{default:p(()=>[...c[12]||(c[12]=[b(" Cancel ",-1)])]),_:1}),r(G,{color:"primary",disabled:e(h).size===0,onClick:X},{default:p(()=>[...c[13]||(c[13]=[b(" Add to context ",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),ua=Object.assign(ca,{__name:"CommitBrowserModal"});function Ie(a){return{scmStatus:D(()=>{const f=a.value?.scm;if(!f)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"Git context unavailable",detail:""};if(f.baseCommitUsed){if(f.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${f.baseCommitUsed.slice(0,7)} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};const C=f.patchesOmitted?", no patches (diff too large)":f.patchesTruncated?`, ${f.patchedFilesCount} with patches (some cut)`:`, ${f.patchedFilesCount} with patches`;return{color:"text-blue-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${f.baseCommitUsed.slice(0,7)} · ${f.filesCount} files${C}`,detail:f.hasLastGreen?"overrides last passing run baseline":"no last passing run"}}if(!f.hasLastGreen)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No last passing run",detail:"enter a baseline commit below to enable diff"};if(!f.hasCommitRange)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No commit range",detail:"reporter did not send SCM metadata"};if(!f.provider)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:"Unsupported SCM host",detail:"only GitHub, GitLab and Bitbucket are supported"};if(f.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${f.provider} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};if(f.patchesOmitted)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${f.provider} · ${f.filesCount} files`,detail:"diff too large — file list only, no patches"};const $=f.patchesTruncated?", some patches cut (budget)":"",m=f.commitsCount>0?` · ${f.commitsCount} commit${f.commitsCount>1?"s":""}`:"";return{color:"text-green-500",icon:"i-lucide-git-branch",text:`${f.provider} · ${f.filesCount} files · ${f.patchedFilesCount} with patches${$}${m}`,detail:""}})}}const da={class:"space-y-3"},ma={class:"pb-2 border-b border-default"},fa={class:"flex items-center gap-2 flex-wrap"},pa={class:"text-xs text-gray-500 font-medium shrink-0 inline-flex items-center gap-1"},ga={class:"flex items-center gap-1.5 ml-auto"},xa={key:0,class:"flex items-center gap-1 px-2 py-0.5 rounded-full bg-primary/10 text-primary text-xs font-medium"},va={key:0,class:"flex items-start gap-1.5 text-xs px-2 py-1.5 rounded-md bg-elevated border border-default"},ha={key:0,class:"text-gray-400 ml-1"},ya={key:1,class:"flex items-center justify-center py-6"},_a={key:3,class:"text-xs text-gray-400 text-center py-4"},ka=ee({__name:"ClusterInvestigation",setup(a){const{clusterId:j,baseCommit:f,selectedCommitShas:$,autoSelectedCommits:m,baseCommitIsPinned:C,coverage:n,scmChanges:u,contextLoading:y,refreshContext:U}=jt(),E=x(!1),{scmStatus:R}=Ie(n);return(T,h)=>{const I=ge,v=Zs,A=te,M=Ce,O=ie,N=vn,H=ua;return s(),l(B,null,[t("div",da,[t("div",ma,[t("div",fa,[t("span",pa,[h[5]||(h[5]=b(" Baseline ",-1)),r(I,{topic:"cluster.baseline"})]),r(v,{modelValue:e(f),"onUpdate:modelValue":h[0]||(h[0]=V=>Q(f)?f.value=V:null),"cluster-id":e(j)},null,8,["modelValue","cluster-id"]),e(C)?(s(),S(M,{key:0,text:"Baseline commit pinned for this cluster"},{default:p(()=>[r(A,{name:"i-lucide-pin",class:"size-3.5 text-primary shrink-0"})]),_:1})):d("",!0),t("div",ga,[e($).length?(s(),l("div",xa,[r(A,{name:"i-lucide-git-commit-horizontal",class:"size-3"}),t("span",null,o(e($).length)+" commit"+o(e($).length===1?"":"s"),1),t("button",{class:"ml-0.5 hover:opacity-70 transition-opacity",onClick:h[1]||(h[1]=V=>$.value=[])},[r(A,{name:"i-lucide-x",class:"size-3"})])])):d("",!0),r(O,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list",onClick:h[2]||(h[2]=V=>E.value=!0)},{default:p(()=>[...h[6]||(h[6]=[b(" Browse ",-1)])]),_:1}),r(O,{icon:"i-lucide-refresh-cw",size:"xs",color:"neutral",variant:"outline",loading:e(y),onClick:e(U)},null,8,["loading","onClick"])])])]),e(n)?(s(),l("div",va,[r(A,{name:e(R).icon,class:Y(["size-3.5 mt-0.5 shrink-0",e(R).color])},null,8,["name","class"]),t("div",null,[t("span",{class:Y(e(R).color)},o(e(R).text),3),e(R).detail?(s(),l("span",ha,"— "+o(e(R).detail),1)):d("",!0)])])):d("",!0),e(y)&&!e(u)?(s(),l("div",ya,[r(A,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):e(u)?(s(),S(N,{key:2,changes:e(u)},null,8,["changes"])):e(n)&&!e(y)&&!e(u)?(s(),l("p",_a," No changes found in this range. ")):d("",!0)]),r(H,{open:e(E),"onUpdate:open":h[3]||(h[3]=V=>Q(E)?E.value=V:null),"cluster-id":e(j),"initial-selected":e($),"auto-selected-shas":e(m),onConfirm:h[4]||(h[4]=V=>$.value=V)},null,8,["open","cluster-id","initial-selected","auto-selected-shas"])],64)}}}),ba=Object.assign(ka,{__name:"ClusterInvestigation"}),$a={class:"flex flex-col h-[60vh]"},Ca={class:"flex items-center gap-3 px-4 py-2.5 border-b border-default text-sm shrink-0"},wa={key:0,class:"ml-auto text-xs text-gray-500"},Sa={class:"flex-1 overflow-y-auto"},Ta={class:"w-full text-sm"},Ia=["onClick"],ja={class:"px-4 py-2.5"},Ra=["checked","onChange"],za={class:"px-2 py-2.5 min-w-0"},Ua={class:"truncate font-medium text-gray-800 dark:text-gray-200 max-w-[24rem]"},Ea={class:"px-2 py-2.5 text-gray-500 text-xs max-w-[16rem] hidden sm:table-cell"},Va={class:"px-2 py-2.5 text-right text-gray-500 text-xs"},Aa={key:0},Ma={class:"shrink-0 border-t border-default px-4 py-3 space-y-1.5"},Na={key:0,class:"shrink-0 px-4 pb-3 flex items-center gap-1.5 text-xs text-red-500"},Fa={class:"flex items-center gap-3 w-full"},Ba=ee({__name:"ClusterExtractCasesModal",props:{open:{type:Boolean},clusterId:{},affectedTestCases:{},projectKey:{},projectName:{}},emits:["update:open","extracted"],setup(a,{emit:j}){const f=a,$=j,m=rt(),C=x(new Set),n=x(""),u=x(!1),y=x(null);function U(){C.value=new Set(f.affectedTestCases.map(I=>I.testCaseId))}function E(){C.value=new Set}function R(I){const v=new Set(C.value);v.has(I)?v.delete(I):v.add(I),C.value=v}ae(()=>f.open,I=>{I&&(E(),n.value="",y.value=null)});const T=D(()=>C.value.size);async function h(){if(T.value!==0){u.value=!0,y.value=null;try{await $fetch(`/api/failure-clusters/${f.clusterId}/extract-cases`,{method:"POST",body:{testCaseIds:[...C.value],triageNote:n.value.trim()||void 0}}),m.add({title:`Extracted ${T.value} test ${T.value===1?"case":"cases"}`,color:"success"}),$("extracted"),$("update:open",!1)}catch(I){y.value=de(I)}finally{u.value=!1}}}return(I,v)=>{const A=be,M=xe,O=we,N=te,H=ie,V=Te;return s(),S(V,{open:a.open,title:"Extract test cases",ui:{content:"max-w-4xl",body:"p-0 flex flex-col overflow-hidden"},"onUpdate:open":v[4]||(v[4]=L=>$("update:open",L))},{body:p(()=>[t("div",$a,[t("div",Ca,[t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:U},"Select all"),v[5]||(v[5]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:E},"Deselect all"),e(T)>0?(s(),l("span",wa,o(e(T))+" selected ",1)):d("",!0)]),t("div",Sa,[t("table",Ta,[v[8]||(v[8]=t("thead",{class:"sticky top-0 bg-gray-50 dark:bg-gray-800 border-b border-default"},[t("tr",null,[t("th",{class:"w-10 px-4 py-2.5"}),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide"},"Test"),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide hidden sm:table-cell"}," File "),t("th",{class:"text-right px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide w-20"}," Occurrences ")])],-1)),t("tbody",null,[(s(!0),l(B,null,Z(a.affectedTestCases,L=>(s(),l("tr",{key:L.testCaseId,class:"border-b border-default/50 hover:bg-elevated transition-colors cursor-pointer",onClick:z=>R(L.testCaseId)},[t("td",ja,[t("input",{type:"checkbox",checked:e(C).has(L.testCaseId),class:"shrink-0 cursor-pointer accent-primary",onClick:v[0]||(v[0]=fe(()=>{},["stop"])),onChange:z=>R(L.testCaseId)},null,40,Ra)]),t("td",za,[t("p",Ua,o(L.title),1),r(A,{to:`/test-cases/${L.testCaseId}`,class:"text-[10px] text-primary hover:underline mt-0.5 inline-block",onClick:v[1]||(v[1]=fe(()=>{},["stop"]))},{default:p(()=>[...v[6]||(v[6]=[b(" View details ",-1)])]),_:1},8,["to"])]),t("td",Ea,[r(M,{"file-path":L.filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"max-w-full"},null,8,["file-path","project-key","project-name"])]),t("td",Va,o(L.runCount),1)],8,Ia))),128)),a.affectedTestCases.length===0?(s(),l("tr",Aa,[...v[7]||(v[7]=[t("td",{colspan:"4",class:"px-4 py-8 text-center text-gray-400 text-sm"},"No test cases in this cluster.",-1)])])):d("",!0)])])]),t("div",Ma,[v[9]||(v[9]=t("label",{class:"text-xs font-medium text-gray-500 uppercase tracking-wide"},"Triage note (optional)",-1)),r(O,{modelValue:e(n),"onUpdate:modelValue":v[2]||(v[2]=L=>Q(n)?n.value=L:null),placeholder:"Add a note explaining why these tests were extracted…",rows:2,class:"text-sm w-full"},null,8,["modelValue"])]),e(y)?(s(),l("p",Na,[r(N,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),b(" "+o(e(y)),1)])):d("",!0)])]),footer:p(()=>[t("div",Fa,[v[11]||(v[11]=t("div",{class:"flex-1"},null,-1)),r(H,{color:"neutral",variant:"ghost",disabled:e(u),onClick:v[3]||(v[3]=L=>$("update:open",!1))},{default:p(()=>[...v[10]||(v[10]=[b(" Cancel ",-1)])]),_:1},8,["disabled"]),r(H,{color:"warning",disabled:e(T)===0,loading:e(u),onClick:h},{default:p(()=>[b(" Extract"+o(e(T)>0?` ${e(T)}`:""),1)]),_:1},8,["disabled","loading"])])]),_:1},8,["open"])}}}),La=Object.assign(Ba,{__name:"ClusterExtractCasesModal"}),Pa={key:0,class:"flex flex-col h-full min-h-0 max-xl:overflow-y-auto xl:overflow-hidden"},Da={class:"border-b border-default shrink-0"},Oa={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4 p-1 xl:flex-1 xl:min-h-0 xl:overflow-hidden"},Ha={class:"space-y-4 xl:overflow-y-auto"},qa={class:"font-mono text-xs"},Ka=["innerHTML"],Ga={class:"inline-flex items-center gap-1.5"},Wa={class:"xl:overflow-y-auto"},Ja={key:1,class:"flex items-center justify-center h-64 text-gray-500"},Eo=ee({__name:"[id]",async setup(a){let j,f;const $=it(),m=parseInt(String($.params.id)),C=Rt(m),{data:n,refresh:u}=([j,f]=ct(()=>Vt(`/api/failure-clusters/${m}`,"$Io0yQjh0TH")),j=await j,f(),j);ut(D(()=>({title:`${n.value?.signature??"Failure cluster"} — Piwi Dashboard`})));const y=x(n.value?.status??"open"),U=x(n.value?.triageNote??""),E=x(!1);ae(()=>n.value?.status,k=>{k&&(y.value=k)}),ae(()=>n.value?.triageNote,k=>{U.value=k??""});const R=D(()=>y.value!==(n.value?.status??"open")||U.value.trim()!==(n.value?.triageNote??""));async function T(){E.value=!0;try{await $fetch(`/api/failure-clusters/${m}/status`,{method:"PATCH",body:{status:y.value,triageNote:U.value.trim()||null}}),u()}finally{E.value=!1}}const h=x(!1);function I(){h.value=!1,u()}const{copyRich:v,copied:A}=We();function M(){const k=n.value;if(!k)return;const F=window.location.href,K=ne=>ne.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),G=[k.errorType,`${k.occurrences} occurrence${k.occurrences===1?"":"s"}`,`${k.affectedTests} test${k.affectedTests===1?"":"s"} affected`,k.status!=="open"?k.status:null].filter(Boolean).join(" · "),W=k.diagnosis?.status==="completed"&&k.diagnosis.summary?`AI diagnosis (${k.diagnosis.category??"unknown"}, ${k.diagnosis.confidence??"?"} confidence): ${k.diagnosis.summary}`:null,J=[`❌ Failure cluster: ${k.signature}`,G,"",...k.sampleError?["Sample error:",ve(k.sampleError),""]:[],...W?[W,""]:[],`Cluster: ${F}`].join(`
|
|
3
|
+
`),se=[`<p><strong>❌ Failure cluster</strong>: <code>${K(k.signature)}</code></p>`,`<p><em>${K(G)}</em></p>`,k.sampleError?`<p><strong>Sample error:</strong></p><pre>${ye(k.sampleError)}</pre>`:"",W?`<p><strong>AI diagnosis</strong> (${K(k.diagnosis?.category??"unknown")}, ${K(k.diagnosis?.confidence??"?")} confidence):<br>${K(k.diagnosis.summary)}</p>`:"",`<p>🔗 <a href="${F}">View failure cluster</a></p>`].join("");v(J,se,{toast:"Failure cluster copied"})}const O=D(()=>{const k=n.value?.sampleError;return k?ve(k).split(`
|
|
4
|
+
`).find(F=>F.trim())??"":""}),{scmStatus:N}=Ie(C.coverage),H=D(()=>Ut((n.value?.affectedTestCases??[]).map(k=>({filePath:k.filePath,title:k.title,line:null,projectName:null})))),{copy:V,copied:L}=Et(),z=x(null),i=x(null),w=x(null),P=x(null),q=x(null),X=x(null),_={sampleError:()=>z.value,executionError:()=>z.value,environmentDiff:()=>P.value,visualDiff:()=>q.value,domSnapshot:()=>X.value,scmInvestigation:()=>w.value,selectedCommits:()=>w.value,topSuspectedCommit:()=>w.value,failingAction:()=>w.value,affectedTests:()=>i.value,testSource:()=>i.value,sourceFiles:()=>i.value,steps:()=>i.value,failingSteps:()=>i.value,console:()=>i.value,networkRequests:()=>i.value,serverTraces:()=>i.value,ariaSnapshot:()=>i.value,screenshots:()=>i.value,tracePointers:()=>i.value,artifacts:()=>i.value};dt(_t,{canLocate:k=>k in _,open:k=>_[k]?.()?.reveal()});const c=D(()=>[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...n.value?.project?[{label:n.value.project.label||n.value.project.name||"Project",to:`/projects/${n.value.project.id}?tab=failure-clusters`}]:[{label:"Project"}],{label:`Failure cluster #${m}`}]);return(k,F)=>{const K=Le,G=Pe,W=et,J=ie,se=Ce,ne=ft,ue=os,g=Je,oe=Qe,je=Ze,Re=Xe,ze=Ye,Ue=xe,Ee=ce,Ve=Ss,Ae=te,Me=ba,Ne=zt,Fe=mt,Be=La;return s(),l(B,null,[r(Fe,{id:"failure-cluster-detail"},{header:p(()=>[r(ne,null,{leading:p(()=>[r(K),r(G,{items:e(c)},null,8,["items"])]),right:p(()=>[e(n)?(s(),S(W,{key:0,endpoint:`/api/failure-clusters/${e(n).id}/export`,"base-name":`piwi-cluster-${e(n).id}`},null,8,["endpoint","base-name"])):d("",!0),e(n)?(s(),S(se,{key:1,text:e(A)?"Copied!":"Copy failure cluster"},{default:p(()=>[r(J,{size:"sm",variant:"ghost",color:"neutral",icon:e(A)?"i-lucide-check":"i-lucide-clipboard",onClick:M},null,8,["icon"])]),_:1},8,["text"])):d("",!0)]),_:1})]),body:p(()=>[e(n)?(s(),l("div",Pa,[t("div",Da,[r(ue,{cluster:e(n),"triage-status":e(y),"triage-note":e(U),"triage-saving":e(E),"triage-changed":e(R),"onUpdate:triageStatus":F[0]||(F[0]=le=>y.value=le),"onUpdate:triageNote":F[1]||(F[1]=le=>U.value=le),onSaveTriage:T},null,8,["cluster","triage-status","triage-note","triage-saving","triage-changed"])]),t("div",Oa,[t("div",Ha,[e(n).sampleError?(s(),S(g,{key:0,ref_key:"errorSection",ref:z,"storage-key":"cluster-error",icon:"i-lucide-circle-x","icon-class":"text-red-500",title:"Error message"},{folded:p(()=>[t("span",qa,o(e(O)),1)]),default:p(()=>[t("div",{class:"text-xs font-mono overflow-x-auto whitespace-pre-wrap",innerHTML:e(ye)(e(n).sampleError)},null,8,Ka)]),_:1},512)):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(oe,{key:1,ref:"locatorSection","storage-key":"cluster-locators","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId,"affected-count":e(n).affectedTestCases.length},null,8,["run-id","test-runs-case-id","affected-count"])):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(je,{key:2,ref_key:"envDiffSection",ref:P,"storage-key":"cluster-env-diff","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Re,{key:3,ref_key:"visualDiffSection",ref:q,"storage-key":"cluster-visual-diff","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(ze,{key:4,ref_key:"domSnapshotSection",ref:X,"storage-key":"cluster-dom-snapshot","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(n).affectedTestCases?.length?(s(),S(g,{key:5,ref_key:"evidenceSection",ref:i,"storage-key":"cluster-evidence",icon:"i-lucide-flask-conical",title:"Test evidence",help:"cluster.evidence"},{folded:p(()=>[b(o(e(n).affectedTests)+" "+o(e(n).affectedTests===1?"test":"tests")+" · "+o(e(n).occurrences)+" occurrence"+o(e(n).occurrences===1?"":"s")+" · ",1),e(n).affectedTestCases[0]?.filePath?(s(),S(Ue,{key:0,"file-path":e(n).affectedTestCases[0].filePath,"project-key":e(n).project?.id,"project-name":e(n).project?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])):d("",!0)]),actions:p(()=>[r(Ee,{color:"neutral",variant:"subtle",size:"sm"},{default:p(()=>[b(o(e(n).affectedTestCases.length)+" "+o(e(n).affectedTestCases.length===1?"test":"tests"),1)]),_:1}),r(J,{size:"xs",variant:"outline",color:"neutral",icon:e(L)?"i-lucide-check":"i-lucide-play",title:e(L)?"Copied!":("copyPreview"in k?k.copyPreview:e(Ct))(e(H)),onClick:F[2]||(F[2]=le=>e(V)(e(H),{toast:"Retry command copied"}))},{default:p(()=>[...F[5]||(F[5]=[b(" Copy retry command ",-1)])]),_:1},8,["icon","title"]),r(se,{text:"Unlink incorrectly clustered test cases from this group"},{default:p(()=>[r(J,{size:"xs",color:"warning",variant:"outline",icon:"i-lucide-arrow-up-from-line",onClick:F[3]||(F[3]=le=>h.value=!0)},{default:p(()=>[...F[6]||(F[6]=[b(" Extract ",-1)])]),_:1})]),_:1})]),default:p(()=>[r(Ve,{"affected-test-cases":e(n).affectedTestCases,"project-key":e(n).project?.id,"project-name":e(n).project?.name},null,8,["affected-test-cases","project-key","project-name"])]),_:1},512)):d("",!0),r(g,{ref_key:"scmSection",ref:w,"storage-key":"cluster-scm",icon:"i-lucide-git-compare-arrows",title:"What changed",help:"cluster.scm"},{folded:p(()=>[t("span",Ga,[r(Ae,{name:e(N).icon,class:Y(["size-3.5 shrink-0",e(N).color])},null,8,["name","class"]),t("span",{class:Y(e(N).color)},o(e(N).text),3)])]),default:p(()=>[r(Me)]),_:1},512)]),t("div",Wa,[r(Ne,{"cluster-id":e(m),"last-seen-run-id":e(n)?.lastSeenRunId,"affected-test-cases":e(n)?.affectedTestCases??[]},null,8,["cluster-id","last-seen-run-id","affected-test-cases"])])])])):(s(),l("div",Ja,"Cluster not found."))]),_:1}),e(n)?(s(),S(Be,{key:0,open:e(h),"cluster-id":e(m),"affected-test-cases":e(n).affectedTestCases??[],"project-key":e(n).project?.id,"project-name":e(n).project?.name,"onUpdate:open":F[4]||(F[4]=le=>h.value=le),onExtracted:I},null,8,["open","cluster-id","affected-test-cases","project-key","project-name"])):d("",!0)],64)}}});export{Eo as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as
|
|
1
|
+
import{u as j}from"./BhH0TNTi.js";import{h as b,c6 as m}from"./h49q_GXF.js";const g="piwi-browser-notify";function a(){return{projects:{}}}function y(e){try{const n=JSON.parse(e);if(typeof n!="object"||n===null)return a();const c={};if(n.projects&&typeof n.projects=="object")for(const[i,r]of Object.entries(n.projects)){const u=Number(i);Number.isNaN(u)||r&&typeof r=="object"&&Array.isArray(r.events)&&(c[u]={events:r.events.filter(f=>typeof f=="string")})}return{projects:c}}catch{return a()}}const h=m(!0);let l=null,p=null;function S(){p||h.run(()=>{l=j(g,{default:()=>"",maxAge:3600*24*365,sameSite:"lax",path:"/",secure:location.protocol==="https:",encode:e=>encodeURIComponent(e),decode:e=>decodeURIComponent(e)}),p=b({get:()=>{const e=l.value;return e?y(e):a()},set:e=>{l.value=JSON.stringify(e)}})})}function O(){S();const e=p;function n(t){return e.value.projects[t]??{events:[]}}function c(t,o){if(o.length===0){const s={...e.value};delete s.projects[t],e.value=s}else e.value={...e.value,projects:{...e.value.projects,[t]:{events:o}}}}function i(t,o){const s=n(t).events,v=s.includes(o)?s.filter(d=>d!==o):[...s,o];c(t,v)}function r(t){return n(t).events.length>0}function u(t,o){return n(t).events.includes(o)}function f(){return Object.values(e.value.projects).some(t=>t.events.length>0)}return{getProject:n,setEvents:c,toggleEvent:i,isSubscribed:r,isEventSubscribed:u,hasAnySubscription:f,stored:e}}export{O as u};
|