@piwitests/server 0.23.0 → 0.25.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/{DZECGgZm.js → 5nOoVJzL.js} +1 -1
- package/.output/public/_nuxt/6DSY_93j.js +1 -0
- package/.output/public/_nuxt/7vRR5W2L.js +1 -0
- package/.output/public/_nuxt/{CC8wk-N0.js → 9Dtlg-K4.js} +1 -1
- package/.output/public/_nuxt/9Yziijlb.js +1 -0
- package/.output/public/_nuxt/{DAhv9aNg.js → B-onBCAB.js} +1 -1
- package/.output/public/_nuxt/B2bK5uNR.js +1 -0
- package/.output/public/_nuxt/{B2L0-Lzp.js → B63B19Iv.js} +2 -2
- package/.output/public/_nuxt/{oSLbl-p0.js → B77w1Eib.js} +1 -1
- package/.output/public/_nuxt/{pZbe82l5.js → BC5bqlfM.js} +1 -1
- package/.output/public/_nuxt/{jR2xm3_t.js → BF5JDf9_.js} +1 -1
- package/.output/public/_nuxt/BFVrl1ss.js +1 -0
- package/.output/public/_nuxt/{Bj_v57Zu.js → BIHMeNW-.js} +1 -1
- package/.output/public/_nuxt/BKqOGcst.js +1 -0
- package/.output/public/_nuxt/{Bsc11YIJ.js → BLqooxh5.js} +1 -1
- package/.output/public/_nuxt/{Ce_j5NtN.js → BMfTUMYy.js} +1 -1
- package/.output/public/_nuxt/{CmTzxoQt.js → BOrnSpTA.js} +1 -1
- package/.output/public/_nuxt/{Bq4_kqIp.js → BPQNVV4M.js} +1 -1
- package/.output/public/_nuxt/{FJTsZ5Aa.js → BSKLNgre.js} +1 -1
- package/.output/public/_nuxt/BTCWUyBX.js +1 -0
- package/.output/public/_nuxt/BUYmGTVP.js +1 -0
- package/.output/public/_nuxt/{mi22nGUC.js → BWddBCom.js} +1 -1
- package/.output/public/_nuxt/{axj2iIDK.js → BYQ9lXQb.js} +1 -1
- package/.output/public/_nuxt/BYWQ47QQ.js +5 -0
- package/.output/public/_nuxt/{Bag08cIY.js → BYnqoVCE.js} +1 -1
- package/.output/public/_nuxt/{Clg2Qx0r.js → BaU2hm4B.js} +1 -1
- package/.output/public/_nuxt/{roaTZkYi.js → BbXvpkBp.js} +1 -1
- package/.output/public/_nuxt/Bb_925DD.js +1 -0
- package/.output/public/_nuxt/BcHU1KNK.js +1 -0
- package/.output/public/_nuxt/BdUGUwvE.js +1 -0
- package/.output/public/_nuxt/{D1Ucra3E.js → BeQq85yJ.js} +2 -2
- package/.output/public/_nuxt/Bg8yOdSf.js +1 -0
- package/.output/public/_nuxt/BhzfJaPC.js +1 -0
- package/.output/public/_nuxt/{499RbBSX.js → Bkb-0yS0.js} +4 -4
- package/.output/public/_nuxt/BmweLu9g.js +2 -0
- package/.output/public/_nuxt/Boyv6hLW.js +1 -0
- package/.output/public/_nuxt/{DXkFgrsT.js → Bq4xEWLF.js} +4 -4
- package/.output/public/_nuxt/{7_9fts7T.js → BraJd4EA.js} +1 -1
- package/.output/public/_nuxt/BvXrhZ8k.js +1 -0
- package/.output/public/_nuxt/{DNKZmhbX.js → Bw4oIhct.js} +1 -1
- package/.output/public/_nuxt/BxSrScjV.js +1 -0
- package/.output/public/_nuxt/Byqt8JHG.js +1 -0
- package/.output/public/_nuxt/{CNu3kken.js → BzBaMPgu.js} +4 -4
- package/.output/public/_nuxt/{PDSNX4Te.js → C1-8_6cB.js} +1 -1
- package/.output/public/_nuxt/{Ce89VyHE.js → C7SG50jD.js} +1 -1
- package/.output/public/_nuxt/{CBJFORiZ.js → C8WgBDU1.js} +1 -1
- package/.output/public/_nuxt/C8uZoJVq.js +1 -0
- package/.output/public/_nuxt/{D3SJGdl4.js → CBQXv4bU.js} +2 -2
- package/.output/public/_nuxt/CDEmotIt.js +1 -0
- package/.output/public/_nuxt/CIBOv3Ge.js +2 -0
- package/.output/public/_nuxt/CO7j4p5r.js +1 -0
- package/.output/public/_nuxt/COMhp7lz.js +1 -0
- package/.output/public/_nuxt/{jxc14CqP.js → CPiLUjjx.js} +1 -1
- package/.output/public/_nuxt/{DZ-KbUZi.js → CTYlay1H.js} +1 -1
- package/.output/public/_nuxt/{5QBnDbs_.js → CVEk4D8I.js} +1 -1
- package/.output/public/_nuxt/{LTMoFvEY.js → CbuK1HIv.js} +1 -1
- package/.output/public/_nuxt/{2yLW7WU0.js → CdLqOMvN.js} +1 -1
- package/.output/public/_nuxt/CdM2qNYM.js +2 -0
- package/.output/public/_nuxt/Ch8sGLqE.js +1 -0
- package/.output/public/_nuxt/CkdznmkX.js +1 -0
- package/.output/public/_nuxt/{DJzFYrBt.js → Cmuwgbf4.js} +1 -1
- package/.output/public/_nuxt/{C9I1Dp3S.js → CnRNwiuE.js} +1 -1
- package/.output/public/_nuxt/{Bb2mDqKr.js → CnsaoeEq.js} +1 -1
- package/.output/public/_nuxt/{DgEa6_av.js → Cp0V2FeW.js} +1 -1
- package/.output/public/_nuxt/Cvw4EFTy.js +17 -0
- package/.output/public/_nuxt/CwDej2Lz.js +1 -0
- package/.output/public/_nuxt/D-wlhH6J.js +1 -0
- package/.output/public/_nuxt/D5Mhpp98.js +1 -0
- package/.output/public/_nuxt/{CTTmX4gy.js → D8ixf-ZR.js} +5 -5
- package/.output/public/_nuxt/{HbnAkiyK.js → DBvdRbTA.js} +2 -2
- package/.output/public/_nuxt/DDho3MJD.js +1 -0
- package/.output/public/_nuxt/DEGHW4pO.js +1 -0
- package/.output/public/_nuxt/{C77tM5Hz.js → DHSYRMJp.js} +1 -1
- package/.output/public/_nuxt/DH_LEqhd.js +2 -0
- package/.output/public/_nuxt/{CUOS6S13.js → DIqik40e.js} +1 -1
- package/.output/public/_nuxt/DLwuL-qR.js +1 -0
- package/.output/public/_nuxt/{AQ86C4c2.js → DPDFGVb_.js} +2 -2
- package/.output/public/_nuxt/DRNHuVn4.js +2 -0
- package/.output/public/_nuxt/{B_MVJP17.js → DUtYU4Sb.js} +1 -1
- package/.output/public/_nuxt/{CAoQUDI4.js → DWl73MJR.js} +1 -1
- package/.output/public/_nuxt/{BZFiz2UB.js → DWz_bHNP.js} +1 -1
- package/.output/public/_nuxt/{CGDPUNcO.js → D_SCB-z2.js} +1 -1
- package/.output/public/_nuxt/{Ce47NgZw.js → D_j436ND.js} +1 -1
- package/.output/public/_nuxt/DamzjN7l.js +1 -0
- package/.output/public/_nuxt/Db5xe__T.js +1 -0
- package/.output/public/_nuxt/{BuGAn4f7.js → DcUBmKKE.js} +1 -1
- package/.output/public/_nuxt/DiP18sFE.js +1 -0
- package/.output/public/_nuxt/Die1200X.js +1 -0
- package/.output/public/_nuxt/DihSeDlY.js +9 -0
- package/.output/public/_nuxt/{BAbrtVp3.js → DkGXOZRW.js} +1 -1
- package/.output/public/_nuxt/{ZLfZolDM.js → DnOtRv65.js} +1 -1
- package/.output/public/_nuxt/DnV-BkUA.js +1 -0
- package/.output/public/_nuxt/DpeRrg68.js +1 -0
- package/.output/public/_nuxt/Dq6_-84R.js +1 -0
- package/.output/public/_nuxt/DqKFKS1b.js +1 -0
- package/.output/public/_nuxt/DrbO0dl5.js +6 -0
- package/.output/public/_nuxt/{B3G-TIoP.js → Ds8_6Fzl.js} +1 -1
- package/.output/public/_nuxt/{QZYo3ErV.js → DvewDI9t.js} +1 -1
- package/.output/public/_nuxt/E26Y1NWH.js +1 -0
- package/.output/public/_nuxt/Hp-_W7z4.js +1 -0
- package/.output/public/_nuxt/OanUGF_v.js +1 -0
- package/.output/public/_nuxt/{9_aJhhcm.js → RSS6R9Te.js} +12 -12
- package/.output/public/_nuxt/{BfcMJBTf.js → VqLetC2g.js} +1 -1
- package/.output/public/_nuxt/WCZdf9Ln.js +1 -0
- package/.output/public/_nuxt/{DBWM_xs-.js → Yl6iqHwK.js} +4 -4
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/03f2d81b-8c58-4ea8-9a9d-7553c8ca4af6.json +1 -0
- package/.output/public/_nuxt/entry.DVKh2Fd6.css +1 -0
- package/.output/public/_nuxt/iUf7K_JR.js +1 -0
- package/.output/public/_nuxt/{B_JSV0yG.js → kDEwM7SQ.js} +1 -1
- package/.output/public/_nuxt/{BDUfBn3i.js → knaDbxMJ.js} +1 -1
- package/.output/public/_nuxt/lnpLc047.js +1 -0
- package/.output/public/_nuxt/{C2_7XZo0.js → mhvG7mu8.js} +1 -1
- package/.output/public/_nuxt/{Ck_fTH5z.js → qUaN2ZW8.js} +4 -4
- package/.output/public/_nuxt/qeqzb80l.js +1 -0
- package/.output/public/_nuxt/{BwwfasRt.js → uj92NYTx.js} +2 -2
- package/.output/public/_nuxt/vOZZ2cLi.js +1 -0
- package/.output/public/_nuxt/{CLWMETf9.js → zAFiz2Mg.js} +1 -1
- package/.output/public/demo/seed.version.json +2 -2
- package/.output/server/chunks/_/collect.mjs +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Alert-He-UxEt6.mjs → Alert-BhTWQzM5.mjs} +2 -2
- package/.output/server/chunks/build/Alert-BhTWQzM5.mjs.map +1 -0
- package/.output/server/chunks/build/{Breadcrumb-DEP2dVCZ.mjs → Breadcrumb-BJnPB2AW.mjs} +3 -3
- package/.output/server/chunks/build/Breadcrumb-BJnPB2AW.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-y6nMDYcR.mjs → BreadcrumbNav-C6Cun6tF.mjs} +3 -3
- package/.output/server/chunks/build/BreadcrumbNav-C6Cun6tF.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-DIASU8Gf.mjs → BrowserBadge-T1KRMIXA.mjs} +4 -4
- package/.output/server/chunks/build/BrowserBadge-T1KRMIXA.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-ZTsCvItQ.mjs → ChartCard-D_asI_WF.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-D_asI_WF.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartMarkerTooltip-u_1DUHh-.mjs → ChartMarkerTooltip-DscESDg7.mjs} +3 -3
- package/.output/server/chunks/build/ChartMarkerTooltip-DscESDg7.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-BisdHf8n.mjs → Checkbox-Y9ZiIRkJ.mjs} +7 -7
- package/.output/server/chunks/build/Checkbox-Y9ZiIRkJ.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-B8BNtZAe.mjs → CodeBlock-Bnn_ps9O.mjs} +5 -5
- package/.output/server/chunks/build/CodeBlock-Bnn_ps9O.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-D7-3zBUU.mjs → DashboardNavbar-D37dPEtR.mjs} +3 -3
- package/.output/server/chunks/build/DashboardNavbar-D37dPEtR.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-C3HdHvlE.mjs → DashboardSidebarToggle-DzwsZHVx.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-DzwsZHVx.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-CC2-lHiP.mjs → DataLocationCard-CUXgZQEs.mjs} +4 -4
- package/.output/server/chunks/build/DataLocationCard-CUXgZQEs.mjs.map +1 -0
- package/.output/server/chunks/build/{DesktopRunLocallyButton-iNzrDsEs.mjs → DesktopRunLocallyButton-BCmQklj6.mjs} +15 -76
- package/.output/server/chunks/build/DesktopRunLocallyButton-BCmQklj6.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-BVb2LgHu.mjs → DiagnosisPanel-haHS2azn.mjs} +8 -8
- package/.output/server/chunks/build/DiagnosisPanel-haHS2azn.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisResult-xVgZlfKK.mjs → DiagnosisResult-DqTIOelM.mjs} +11 -11
- package/.output/server/chunks/build/DiagnosisResult-DqTIOelM.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-UX9uajQJ.mjs → DurationValue-D6fQEi5S.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-D6fQEi5S.mjs.map +1 -0
- package/.output/server/chunks/build/{EmptyState-DC2q_7TD.mjs → EmptyState-C-mCzGhO.mjs} +2 -2
- package/.output/server/chunks/build/EmptyState-C-mCzGhO.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-Dzn73fbq.mjs → EntityLinks-CRJQM9Vy.mjs} +4 -4
- package/.output/server/chunks/build/EntityLinks-CRJQM9Vy.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-C-agmABK.mjs → EnvManagedBadge-hyelwXrw.mjs} +4 -4
- package/.output/server/chunks/build/EnvManagedBadge-hyelwXrw.mjs.map +1 -0
- package/.output/server/chunks/build/{ErrorState-CktYyeEZ.mjs → ErrorState-9UPssp7w.mjs} +2 -2
- package/.output/server/chunks/build/ErrorState-9UPssp7w.mjs.map +1 -0
- package/.output/server/chunks/build/{FeatureUnavailable-DHFkwI7t.mjs → FeatureUnavailable-CDw3__eq.mjs} +3 -3
- package/.output/server/chunks/build/FeatureUnavailable-CDw3__eq.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-GYHKiSI6.mjs → FormField-8vSc-3mb.mjs} +2 -2
- package/.output/server/chunks/build/FormField-8vSc-3mb.mjs.map +1 -0
- package/.output/server/chunks/build/{GetStartedWizard-BpcGYsm2.mjs → GetStartedWizard-Dp_tjhry.mjs} +4 -4
- package/.output/server/chunks/build/GetStartedWizard-Dp_tjhry.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-plioHKA0.mjs → HelpHint-Bfyo3ar6.mjs} +31 -4
- package/.output/server/chunks/build/HelpHint-Bfyo3ar6.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-CwpfmI0W.mjs → LoadingState-CxfFwac9.mjs} +2 -2
- package/.output/server/chunks/build/LoadingState-CxfFwac9.mjs.map +1 -0
- package/.output/server/chunks/build/{MarkerBadge-Biz5--h2.mjs → MarkerBadge-DmubzeuF.mjs} +2 -2
- package/.output/server/chunks/build/MarkerBadge-DmubzeuF.mjs.map +1 -0
- package/.output/server/chunks/build/{MetaStripGroup-A0a72vt5.mjs → MetaStripGroup-C-cNBfC9.mjs} +6 -6
- package/.output/server/chunks/build/MetaStripGroup-C-cNBfC9.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-hKLvVFNp.mjs → Modal-DcNzjvnm.mjs} +2 -2
- package/.output/server/chunks/build/Modal-DcNzjvnm.mjs.map +1 -0
- package/.output/server/chunks/build/{NavbarActions-_YjrSUat.mjs → NavbarActions-VCHW0u67.mjs} +2 -2
- package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +1 -0
- package/.output/server/chunks/build/{NavigationMenu-RfBOyS32.mjs → NavigationMenu-DG6V0R9Y.mjs} +5 -5
- package/.output/server/chunks/build/NavigationMenu-DG6V0R9Y.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs → OpenInIdeLink-CLj2cTkc.mjs} +6 -6
- package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs.map → OpenInIdeLink-CLj2cTkc.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs → ProjectTestCasesTable-BNd5Fn_G.mjs} +15 -15
- package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs.map → ProjectTestCasesTable-BNd5Fn_G.mjs.map} +1 -1
- package/.output/server/chunks/build/{RovingFocusItem-BOSx1Z9Z.mjs → RovingFocusItem-DkZadRuK.mjs} +2 -2
- package/.output/server/chunks/build/RovingFocusItem-DkZadRuK.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-nuLb-Nm3.mjs → RunReports-CnyGcU8K.mjs} +4 -4
- package/.output/server/chunks/build/RunReports-CnyGcU8K.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-CvWmcFYM.mjs → RunStatusBadge-DTqX18X-.mjs} +3 -3
- package/.output/server/chunks/build/RunStatusBadge-DTqX18X-.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-DHAFvJxm.mjs → SectionCard-taTpPtua.mjs} +3 -3
- package/.output/server/chunks/build/SectionCard-taTpPtua.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-CEyw7HGK.mjs → Select-BChKOOsc.mjs} +4 -4
- package/.output/server/chunks/build/Select-BChKOOsc.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs → SelectMenu-DLkMyBsW.mjs} +5 -5
- package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs.map → SelectMenu-DLkMyBsW.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-lrN70ODV.mjs → Separator-Dn-4PN3P.mjs} +2 -2
- package/.output/server/chunks/build/Separator-Dn-4PN3P.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-tRmytcEJ.mjs → SettingsField-BLO1C7uY.mjs} +6 -6
- package/.output/server/chunks/build/SettingsField-BLO1C7uY.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-D6cRIqch.mjs → Slideover-BiDJaQrt.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-BiDJaQrt.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-R2n82ncQ.mjs → Switch-Ca3fYrSH.mjs} +4 -4
- package/.output/server/chunks/build/Switch-Ca3fYrSH.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-qZdnm9t2.mjs → Table-DQb34a0A.mjs} +3 -3
- package/.output/server/chunks/build/Table-DQb34a0A.mjs.map +1 -0
- package/.output/server/chunks/build/{Tabs-BDP7MWl4.mjs → Tabs-_ALhm_oG.mjs} +3 -3
- package/.output/server/chunks/build/Tabs-_ALhm_oG.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-CKDXQ2GI.mjs → TestCaseHistoryChart-D-TEUsZ8.mjs} +3 -3
- package/.output/server/chunks/build/TestCaseHistoryChart-D-TEUsZ8.mjs.map +1 -0
- package/.output/server/chunks/build/{TestMetaBadges-BlyKmfeP.mjs → TestMetaBadges-G2dAHnT-.mjs} +2 -2
- package/.output/server/chunks/build/TestMetaBadges-G2dAHnT-.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-CvsmKJ4D.mjs → TestStatusBar-CseETAdn.mjs} +2 -2
- package/.output/server/chunks/build/TestStatusBar-CseETAdn.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-DpmpM-lN.mjs → Textarea-CXOoRq7y.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-CXOoRq7y.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-BI3WQErw.mjs → Tooltip-trltUr5c.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-trltUr5c.mjs.map +1 -0
- package/.output/server/chunks/build/{VisuallyHiddenInput-D4E5aJCQ.mjs → VisuallyHiddenInput-CGURvg3N.mjs} +2 -2
- package/.output/server/chunks/build/VisuallyHiddenInput-CGURvg3N.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs → _id_-B-G4eG5U.mjs} +40 -40
- package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs.map → _id_-B-G4eG5U.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-T965GKYC.mjs → _id_-Cnzg8n21.mjs} +41 -38
- package/.output/server/chunks/build/_id_-Cnzg8n21.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-wiULjAVc.mjs → _id_-Dp_d6gT7.mjs} +63 -55
- package/.output/server/chunks/build/{_id_-wiULjAVc.mjs.map → _id_-Dp_d6gT7.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs → _id_-t2AWaYuK.mjs} +59 -52
- package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs.map → _id_-t2AWaYuK.mjs.map} +1 -1
- package/.output/server/chunks/build/{about-B3V_OEiu.mjs → about-BFsHkJwE.mjs} +8 -8
- package/.output/server/chunks/build/about-BFsHkJwE.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DpBdYE46.mjs → account-CZAq8kVg.mjs} +8 -8
- package/.output/server/chunks/build/account-CZAq8kVg.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-DYhpzbqp.mjs → ai-BGP3GcCR.mjs} +21 -21
- package/.output/server/chunks/build/{ai-DYhpzbqp.mjs.map → ai-BGP3GcCR.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-CZJEU0an.mjs → analytics-CXl5OWV-.mjs} +25 -25
- package/.output/server/chunks/build/{analytics-CZJEU0an.mjs.map → analytics-CXl5OWV-.mjs.map} +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{db.client-Bdqk_eYQ.mjs → db.client-DijpEH6i.mjs} +3 -1
- package/.output/server/chunks/build/db.client-DijpEH6i.mjs.map +1 -0
- package/.output/server/chunks/build/{default-DO1izI2V.mjs → default-4ixAePum.mjs} +209 -77
- package/.output/server/chunks/build/default-4ixAePum.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-C8bndVXg.mjs → docs-Cgsd01H9.mjs} +16 -16
- package/.output/server/chunks/build/{docs-C8bndVXg.mjs.map → docs-Cgsd01H9.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-BdfF9er2.mjs → edit-BEQ-ozj9.mjs} +436 -40
- package/.output/server/chunks/build/edit-BEQ-ozj9.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-tkz5_OA-.mjs → fetch-B5TVXZ1s.mjs} +3 -3
- package/.output/server/chunks/build/fetch-B5TVXZ1s.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-swZRcvXE.mjs → forgot-password-mqE1mpDI.mjs} +4 -4
- package/.output/server/chunks/build/forgot-password-mqE1mpDI.mjs.map +1 -0
- package/.output/server/chunks/build/{help-content-C876a9WD.mjs → help-content-Bc99BajS.mjs} +6 -1
- package/.output/server/chunks/build/help-content-Bc99BajS.mjs.map +1 -0
- package/.output/server/chunks/build/{import-B27Sv7h5.mjs → import-DqDDTcSc.mjs} +15 -15
- package/.output/server/chunks/build/import-DqDDTcSc.mjs.map +1 -0
- package/.output/server/chunks/build/{index-ID913tUa.mjs → index-Bpdj6TXV.mjs} +5 -5
- package/.output/server/chunks/build/index-Bpdj6TXV.mjs.map +1 -0
- package/.output/server/chunks/build/{index-vRwzDXLs.mjs → index-DBFsIsjA.mjs} +534 -262
- package/.output/server/chunks/build/index-DBFsIsjA.mjs.map +1 -0
- package/.output/server/chunks/build/{index-C7m32bRI.mjs → index-DSufXCZq.mjs} +22 -18
- package/.output/server/chunks/build/index-DSufXCZq.mjs.map +1 -0
- package/.output/server/chunks/build/{index-BdZmxLtC.mjs → index-WXE60AXk.mjs} +24 -24
- package/.output/server/chunks/build/{index-BdZmxLtC.mjs.map → index-WXE60AXk.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-ByWTzqF6.mjs → index-okKjrRhL.mjs} +15 -4
- package/.output/server/chunks/build/index-okKjrRhL.mjs.map +1 -0
- package/.output/server/chunks/build/{isValueEqualOrExist-D4lZ8uRY.mjs → isValueEqualOrExist-C-9DzL4K.mjs} +3 -3
- package/.output/server/chunks/build/isValueEqualOrExist-C-9DzL4K.mjs.map +1 -0
- package/.output/server/chunks/build/{login-hxCF06JT.mjs → login-eQ88UoBW.mjs} +7 -7
- package/.output/server/chunks/build/login-eQ88UoBW.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-BVW1llyW.mjs → mcp-frcSP2Zg.mjs} +14 -14
- package/.output/server/chunks/build/mcp-frcSP2Zg.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-Dn-evqXM.mjs → notifications-DAtRd5V6.mjs} +14 -14
- package/.output/server/chunks/build/notifications-DAtRd5V6.mjs.map +1 -0
- package/.output/server/chunks/build/{performance-CV8qm94u.mjs → performance-BcQzGXE7.mjs} +13 -13
- package/.output/server/chunks/build/performance-BcQzGXE7.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-gKDz8LyA.mjs → pr-feedback-BHtgvegy.mjs} +11 -11
- package/.output/server/chunks/build/pr-feedback-BHtgvegy.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-DtEISa1I.mjs → reset-password-DMHrp14-.mjs} +4 -4
- package/.output/server/chunks/build/reset-password-DMHrp14-.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +34 -34
- package/.output/server/chunks/build/{settings-BJDnuLpc.mjs → settings-Bo5OETop.mjs} +11 -11
- package/.output/server/chunks/build/settings-Bo5OETop.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DnAK4Rzg.mjs → settings-metadata-BHbsWQ2g.mjs} +3 -3
- package/.output/server/chunks/build/settings-metadata-BHbsWQ2g.mjs.map +1 -0
- package/.output/server/chunks/build/{setup-BO9tXa_G.mjs → setup-DAXcxuNY.mjs} +18 -18
- package/.output/server/chunks/build/{setup-BO9tXa_G.mjs.map → setup-DAXcxuNY.mjs.map} +1 -1
- package/.output/server/chunks/build/{storage-zN92cA9q.mjs → storage-BPK0fVwx.mjs} +13 -13
- package/.output/server/chunks/build/storage-BPK0fVwx.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-CJFnoyQc.mjs → tags-CoxErA5m.mjs} +8 -8
- package/.output/server/chunks/build/tags-CoxErA5m.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-0Q6rT73d.mjs → test-cases-D8rn-0le.mjs} +27 -27
- package/.output/server/chunks/build/test-cases-D8rn-0le.mjs.map +1 -0
- package/.output/server/chunks/build/{test-functions-DVRJgiWo.mjs → test-functions-pWs9mhbJ.mjs} +13 -13
- package/.output/server/chunks/build/test-functions-pWs9mhbJ.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs → useCopyRich-BqVfhnoH.mjs} +90 -33
- package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs.map → useCopyRich-BqVfhnoH.mjs.map} +1 -1
- package/.output/server/chunks/build/{useDesktopDownload-Dyf0fR47.mjs → useDesktopDownload-l80DQJ9e.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-l80DQJ9e.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopLocalRuns-k7Gw3Fv3.mjs → useDesktopLocalRuns-Dil3YzyU.mjs} +68 -6
- package/.output/server/chunks/build/useDesktopLocalRuns-Dil3YzyU.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopProjectLink-WwLte59P.mjs → useDesktopProjectLink-BnIONB--.mjs} +21 -4
- package/.output/server/chunks/build/useDesktopProjectLink-BnIONB--.mjs.map +1 -0
- package/.output/server/chunks/build/{useFormControl-8skMOTIf.mjs → useFormControl-CXKztoWk.mjs} +2 -2
- package/.output/server/chunks/build/useFormControl-CXKztoWk.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-D74FmDNg.mjs → useOpenInIde-CbbYW3pd.mjs} +2 -2
- package/.output/server/chunks/build/useOpenInIde-CbbYW3pd.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-BLTHducV.mjs → useSettingsNav-C6NpD4Ab.mjs} +2 -2
- package/.output/server/chunks/build/useSettingsNav-C6NpD4Ab.mjs.map +1 -0
- package/.output/server/chunks/build/{users-C9bjOBde.mjs → users-C2MuCf5G.mjs} +9 -9
- package/.output/server/chunks/build/users-C2MuCf5G.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1032 -721
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
- package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs +88 -0
- package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs +63 -0
- package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/setup-status.get.mjs +1 -1
- package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/database/migrations/0045_productive_stingray.sql +1 -0
- package/.output/server/database/migrations/meta/0045_snapshot.json +3779 -0
- package/.output/server/database/migrations/meta/_journal.json +7 -0
- package/.output/server/database/migrations-pg/0046_gorgeous_hercules.sql +1 -0
- package/.output/server/database/migrations-pg/meta/0046_snapshot.json +4486 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/5SkLJHl8.js +0 -1
- package/.output/public/_nuxt/6sA-GK37.js +0 -1
- package/.output/public/_nuxt/6vX5JdHr.js +0 -1
- package/.output/public/_nuxt/B070fjS-.js +0 -1
- package/.output/public/_nuxt/B0tmRAhY.js +0 -1
- package/.output/public/_nuxt/B3AG2m76.js +0 -1
- package/.output/public/_nuxt/B4mZElvM.js +0 -1
- package/.output/public/_nuxt/B7tiBVLW.js +0 -1
- package/.output/public/_nuxt/BFYkWpPx.js +0 -1
- package/.output/public/_nuxt/BM5BPKlc.js +0 -1
- package/.output/public/_nuxt/BNyTWIad.js +0 -9
- package/.output/public/_nuxt/BOvtXn3m.js +0 -1
- package/.output/public/_nuxt/BVyjw9Bi.js +0 -1
- package/.output/public/_nuxt/BZOykMLD.js +0 -1
- package/.output/public/_nuxt/BjMo2tKC.js +0 -6
- package/.output/public/_nuxt/BjOFxi54.js +0 -1
- package/.output/public/_nuxt/BjaRappk.js +0 -1
- package/.output/public/_nuxt/BtZNYmZO.js +0 -1
- package/.output/public/_nuxt/C6t4kxaa.js +0 -1
- package/.output/public/_nuxt/CEai-PWF.js +0 -1
- package/.output/public/_nuxt/CF_eDZHu.js +0 -1
- package/.output/public/_nuxt/CIQeRUSy.js +0 -17
- package/.output/public/_nuxt/CPQRQqXU.js +0 -1
- package/.output/public/_nuxt/CYhm2FBS.js +0 -5
- package/.output/public/_nuxt/CdEzDaDI.js +0 -1
- package/.output/public/_nuxt/CfhOanaF.js +0 -1
- package/.output/public/_nuxt/CvVbKrcH.js +0 -1
- package/.output/public/_nuxt/Cz7SCzdW.js +0 -1
- package/.output/public/_nuxt/D7fxV-UA.js +0 -1
- package/.output/public/_nuxt/D7t0Dn3h.js +0 -1
- package/.output/public/_nuxt/DCE2_MKD.js +0 -2
- package/.output/public/_nuxt/DFfqRQxk.js +0 -1
- package/.output/public/_nuxt/DNqm5cWU.js +0 -1
- package/.output/public/_nuxt/DTrPCv7R.js +0 -1
- package/.output/public/_nuxt/DYjxDsYC.js +0 -1
- package/.output/public/_nuxt/Dbf8eT28.js +0 -1
- package/.output/public/_nuxt/DeewM3Wg.js +0 -2
- package/.output/public/_nuxt/DiWxW-w3.js +0 -2
- package/.output/public/_nuxt/DmqCquDx.js +0 -1
- package/.output/public/_nuxt/DnxrNGE_.js +0 -1
- package/.output/public/_nuxt/DprkT7rM.js +0 -1
- package/.output/public/_nuxt/DuBtaw3j.js +0 -1
- package/.output/public/_nuxt/DylyATWU.js +0 -2
- package/.output/public/_nuxt/HIGGZ_c-.js +0 -1
- package/.output/public/_nuxt/RkNtgoTD.js +0 -1
- package/.output/public/_nuxt/Wk7ZKG4B.js +0 -1
- package/.output/public/_nuxt/Ya8ZzWuY.js +0 -1
- package/.output/public/_nuxt/a8Z6VC7V.js +0 -2
- package/.output/public/_nuxt/builds/meta/6d1766a0-0aba-46b8-9d97-7dd174130359.json +0 -1
- package/.output/public/_nuxt/dUPMBJ4f.js +0 -1
- package/.output/public/_nuxt/eT2oObCh.js +0 -1
- package/.output/public/_nuxt/entry.D_eWXrnD.css +0 -1
- package/.output/public/_nuxt/kWnH8yJq.js +0 -1
- package/.output/public/_nuxt/sqqg4oXL.js +0 -1
- package/.output/public/_nuxt/xZQGtnVA.js +0 -1
- package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +0 -1
- package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +0 -1
- package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +0 -1
- package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +0 -1
- package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +0 -1
- package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +0 -1
- package/.output/server/chunks/build/ErrorState-CktYyeEZ.mjs.map +0 -1
- package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +0 -1
- package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +0 -1
- package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +0 -1
- package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +0 -1
- package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +0 -1
- package/.output/server/chunks/build/NavbarActions-_YjrSUat.mjs.map +0 -1
- package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +0 -1
- package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +0 -1
- package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +0 -1
- package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +0 -1
- package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.mjs.map +0 -1
- package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +0 -1
- package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +0 -1
- package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +0 -1
- package/.output/server/chunks/build/account-DpBdYE46.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +0 -1
- package/.output/server/chunks/build/default-DO1izI2V.mjs.map +0 -1
- package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +0 -1
- package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +0 -1
- package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +0 -1
- package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +0 -1
- package/.output/server/chunks/build/index-C7m32bRI.mjs.map +0 -1
- package/.output/server/chunks/build/index-ID913tUa.mjs.map +0 -1
- package/.output/server/chunks/build/index-vRwzDXLs.mjs.map +0 -1
- package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +0 -1
- package/.output/server/chunks/build/login-hxCF06JT.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +0 -1
- package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +0 -1
- package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +0 -1
- package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +0 -1
- package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +0 -1
- package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +0 -1
- package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +0 -1
- package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +0 -1
- package/.output/server/chunks/build/users-C9bjOBde.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as De}from"./DTrPCv7R.js";import{_ as Oe}from"./B3G-TIoP.js";import{_ as _e,a as He,b as qe,c as Ke,d as Ge,e as We,f as Je,g as ke,u as Qe,h as Ze,i as Xe,j as Ye,k as et,l as tt,m as st}from"./CYhm2FBS.js";import{d as Y,o as s,f as S,g as p,i as t,j as r,c as l,t as o,v as u,s as ue,k as e,m as $,p as ae,G as be,F as L,y as Q,_ as ce,h as P,H as nt,q as X,I as at,r as g,J as oe,B as ot,l as J,E as $e,K as lt,L as rt,C as fe,M as it,b as ct,u as ut,w as dt,e as mt,N as ft}from"./CNu3kken.js";import{_ as Ce}from"./FJTsZ5Aa.js";import{_ as pt,a as gt}from"./2yLW7WU0.js";import{_ as ge}from"./CfhOanaF.js";import{_ as xt}from"./6vX5JdHr.js";import{_ as vt}from"./Ce47NgZw.js";import{_ as we}from"./B0tmRAhY.js";import{_ as yt,a as ht,i as _t,b as kt,s as ve,c as bt}from"./9_aJhhcm.js";import{c as ye,f as ie,a as $t,b as Ct,d as wt,g as Se,s as pe,e as de,r as he,h as St}from"./DeewM3Wg.js";import{_ as xe}from"./Ce_j5NtN.js";import{_ as Tt}from"./DylyATWU.js";import{_ as jt}from"./DNqm5cWU.js";import{_ as It}from"./BM5BPKlc.js";import{_ as Rt}from"./HIGGZ_c-.js";import{_ as zt}from"./B_MVJP17.js";import{_ as Te}from"./roaTZkYi.js";import{u as Ut,p as Et,_ as Vt}from"./CIQeRUSy.js";import{b as At}from"./D7t0Dn3h.js";import{a as Mt,u as Nt}from"./DprkT7rM.js";import"./BZFiz2UB.js";import"./BjOFxi54.js";import"./jxc14CqP.js";import"./DFfqRQxk.js";import"./Ya8ZzWuY.js";import"./DJzFYrBt.js";import"./D-c8ZSws.js";import"./B_JSV0yG.js";import"./BjaRappk.js";import"./C9I1Dp3S.js";import"./BVyjw9Bi.js";import"./CF_eDZHu.js";import"./DZ-KbUZi.js";import"./DYjxDsYC.js";import"./BZOykMLD.js";import"./B3AG2m76.js";import"./D7fxV-UA.js";import"./Bq4_kqIp.js";import"./CmTzxoQt.js";import"./CLWMETf9.js";import"./CAoQUDI4.js";const Bt={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Ft={class:"flex items-center gap-3 min-w-0"},Lt={class:"font-mono text-sm truncate text-gray-600 dark:text-gray-400 min-w-0"},Pt={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Dt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ot={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ht={key:1,class:"text-xs text-gray-400 whitespace-nowrap"},qt={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Kt={class:"lg:col-span-9"},Gt={class:"space-y-3"},Wt={key:0,class:"text-sm font-medium break-words text-gray-500 dark:text-gray-400"},Jt={class:"flex flex-wrap gap-2"},Qt={class:"text-sm text-gray-500"},Zt={key:1,class:"rounded-md border border-default p-3 space-y-1.5"},Xt={class:"flex items-center gap-2 flex-wrap"},Yt={key:0,class:"text-xs text-gray-500"},es={class:"text-xs text-gray-500"},ts={class:"text-sm text-gray-500"},ss={class:"font-mono text-xs"},ns={class:"flex items-start gap-3"},as={class:"flex flex-col gap-1 shrink-0"},os={class:"flex-1 min-w-0 space-y-1.5"},ls={class:"flex justify-end"},rs=Y({__name:"ClusterSummary",props:{cluster:{},triageStatus:{},triageNote:{},triageSaving:{type:Boolean},triageChanged:{type:Boolean}},emits:["update:triageStatus","update:triageNote","save-triage"],setup(a,{emit:I}){const m=a,C=I,d=P(()=>wt(m.cluster.fixVerification)),w=[{label:"Open",value:"open",color:"warning"},{label:"Resolved",value:"resolved",color:"success"},{label:"Ignored",value:"ignored",color:"neutral"}];return(n,c)=>{const _=ue,z=ae,A=ge,R=be,T=xt,h=vt,j=ce,x=we,M=yt;return s(),S(M,{"storage-key":"failure-cluster"},{folded:p(()=>[t("div",Bt,[t("div",Ft,[r(_,{color:("clusterStatusColor"in n?n.clusterStatusColor:e(Ct))(a.cluster.status),variant:"solid",size:"sm",class:"shrink-0 capitalize"},{default:p(()=>[$(o(a.cluster.status),1)]),_:1},8,["color"]),t("span",Lt,o(a.cluster.signature),1),a.cluster.errorType?(s(),S(_,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(ye))(a.cluster.errorType),variant:"subtle",size:"sm"},{default:p(()=>[$(o(a.cluster.errorType),1)]),_:1},8,["color"])):u("",!0),e(d)?(s(),S(_,{key:1,color:e(d).color,variant:"subtle",size:"sm",class:"gap-1 shrink-0"},{default:p(()=>[r(z,{name:e(d).icon,class:"size-3"},null,8,["name"]),$(" "+o(e(d).label),1)]),_:1},8,["color"])):u("",!0)]),t("div",Pt,[t("span",Dt,o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1),t("span",Ot,o(a.cluster.affectedTests)+" "+o(a.cluster.affectedTests===1?"test":"tests"),1),a.cluster.diagnosis?.status==="completed"&&a.cluster.diagnosis?.category?(s(),S(_,{key:0,color:"neutral",variant:"outline",size:"sm",class:"gap-1 whitespace-nowrap"},{default:p(()=>[r(z,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+o(a.cluster.diagnosis.category),1)]),_:1})):u("",!0),a.cluster.lastSeenAt?(s(),l("span",Ht," last seen "+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.lastSeenAt)),1)):u("",!0)])])]),default:p(()=>[t("div",qt,[t("div",Kt,[r(h,{title:a.cluster.signature},{default:p(()=>[t("div",Gt,[a.cluster.title?(s(),l("p",Wt,o(a.cluster.title),1)):u("",!0),t("div",Jt,[a.cluster.errorType?(s(),S(_,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(ye))(a.cluster.errorType),variant:"subtle"},{default:p(()=>[$(o(a.cluster.errorType),1)]),_:1},8,["color"])):u("",!0),r(_,{color:"neutral",variant:"subtle"},{default:p(()=>[$(o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1)]),_:1}),r(_,{color:"neutral",variant:"subtle"},{default:p(()=>[$(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(_,{key:1,color:"neutral",variant:"outline",class:"gap-1"},{default:p(()=>[r(z,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+o(a.cluster.diagnosis.category),1)]),_:1})):u("",!0),r(A,{topic:"cluster.concept"})]),t("p",Qt,[c[2]||(c[2]=$(" First seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+o(a.cluster.firstSeenRunId),1)]),_:1},8,["to"]),a.cluster.firstSeenAt?(s(),l(L,{key:0},[$(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.firstSeenAt))+") ",1)],64)):u("",!0),c[3]||(c[3]=$(" · Last seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.lastSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+o(a.cluster.lastSeenRunId),1)]),_:1},8,["to"]),a.cluster.lastSeenAt?(s(),l(L,{key:1},[$(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.lastSeenAt))+") ",1)],64)):u("",!0),a.cluster.lastSeenRunStatus?(s(),S(T,{key:2,status:a.cluster.lastSeenRunStatus,size:"sm",class:"ml-1 align-middle"},null,8,["status"])):u("",!0)]),e(d)?(s(),l("div",Zt,[t("div",Xt,[r(_,{color:e(d).color,variant:"subtle",class:"gap-1"},{default:p(()=>[r(z,{name:e(d).icon,class:"size-3"},null,8,["name"]),$(" "+o(e(d).label),1)]),_:1},8,["color"]),a.cluster.timeToResolutionMs!=null?(s(),l("span",Yt," open for "+o(("formatDuration"in n?n.formatDuration:e($t))(a.cluster.timeToResolutionMs)),1)):u("",!0),r(A,{topic:"cluster.resolution"})]),t("p",es,o(e(d).hint),1),t("p",ts,[a.cluster.fixLandedRunId?(s(),l(L,{key:0},[c[4]||(c[4]=$(" Fix landed in ",-1)),r(R,{to:`/test-runs/${a.cluster.fixLandedRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+o(a.cluster.fixLandedRunId),1)]),_:1},8,["to"])],64)):u("",!0),a.cluster.fixLandedAt?(s(),l(L,{key:1},[$(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.fixLandedAt))+")",1)],64)):u("",!0),a.cluster.fixCommit?(s(),l(L,{key:2},[c[5]||(c[5]=$(" · commit ",-1)),t("code",ss,o(a.cluster.fixCommit.slice(0,8)),1)],64)):u("",!0)])])):u("",!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",ns,[t("div",as,[(s(),l(L,null,Q(w,B=>r(j,{key:B.value,size:"xs",class:"justify-start",color:a.triageStatus===B.value?B.color:"neutral",variant:a.triageStatus===B.value?"solid":"outline",onClick:O=>C("update:triageStatus",B.value)},{default:p(()=>[$(o(B.label),1)]),_:2},1032,["color","variant","onClick"])),64))]),t("div",os,[r(x,{"model-value":a.triageNote,placeholder:"Optional note…",rows:3,class:"text-sm w-full","onUpdate:modelValue":c[0]||(c[0]=B=>C("update:triageNote",B))},null,8,["model-value"]),t("div",ls,[a.triageChanged?(s(),S(j,{key:0,size:"xs",icon:"i-lucide-check",loading:a.triageSaving,onClick:c[1]||(c[1]=B=>C("save-triage"))},{default:p(()=>[...c[6]||(c[6]=[$(" Save ",-1)])]),_:1},8,["loading"])):u("",!0)])])])]),_:1})])]),_:1})}}}),is=Object.assign(rs,{__name:"ClusterSummary"}),cs={class:"divide-y divide-default"},us={class:"text-xs font-mono text-gray-700 dark:text-gray-300 break-all whitespace-pre-wrap"},ds={class:"text-xs font-mono text-gray-600 dark:text-gray-400 truncate"},ms=Y({__name:"TestEvidenceSignals",props:at({consoleLogs:{},networkRequests:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(a){const I=a,m=P(()=>Array.isArray(I.consoleLogs)?I.consoleLogs.filter(c=>c.type==="error"||c.type==="warning"):[]),C=P(()=>Array.isArray(I.networkRequests)?I.networkRequests.filter(c=>c.status&&c.status>=400):[]),d=P(()=>m.value.length>0||C.value.length>0),w=P(()=>{const c=[];return m.value.length&&c.push(`${m.value.length} console`),C.value.length&&c.push(`${C.value.length} network`),c.join(", ")}),n=nt(a,"open");return(c,_)=>{const z=ae,A=ue,R=_e;return e(d)?(s(),S(R,{key:0,icon:"i-lucide-triangle-alert",label:`Signals (${e(w)})`,open:n.value,"onUpdate:open":_[0]||(_[0]=T=>n.value=T)},{default:p(()=>[t("div",cs,[e(m).length>0?(s(),l(L,{key:0},[_[1]||(_[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(L,null,Q(e(m),(T,h)=>(s(),l("div",{key:"log-"+h,class:"px-3 py-1.5 flex items-start gap-2"},[r(z,{name:T.type==="error"?"i-lucide-x-circle":"i-lucide-alert-triangle",class:X(["size-3.5 mt-0.5 shrink-0",T.type==="error"?"text-red-500":"text-yellow-500"])},null,8,["name","class"]),t("p",us,o(T.text),1)]))),128))],64)):u("",!0),e(C).length>0?(s(),l(L,{key:1},[_[2]||(_[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(L,null,Q(e(C),(T,h)=>(s(),l("div",{key:"req-"+h,class:"px-3 py-1.5 flex items-center gap-2"},[r(A,{color:T.status>=500?"error":"warning",variant:"subtle",size:"sm",class:"shrink-0 font-mono"},{default:p(()=>[$(o(T.status),1)]),_:2},1032,["color"]),t("p",ds,o(T.url),1)]))),128))],64)):u("",!0)])]),_:1},8,["label","open"])):u("",!0)}}}),fs=Object.assign(ms,{__name:"TestEvidenceSignals"}),ps={class:"space-y-3"},gs={key:0,class:"flex gap-0 border-b border-default overflow-x-auto"},xs=["title","onClick"],vs={key:0,class:"opacity-60 ml-1"},ys={key:1,class:"flex items-start justify-between gap-2 flex-wrap"},hs={class:"min-w-0"},_s={class:"text-sm font-medium break-words"},ks={key:2,class:"flex items-center justify-center py-10"},bs={key:0,class:"flex flex-wrap gap-1.5"},$s={class:"divide-y divide-default"},Cs={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},ws={key:0,class:"text-xs font-mono text-red-500 whitespace-pre-wrap break-all"},Ss={class:"overflow-x-auto max-h-72"},Ts={class:"max-h-64 overflow-auto"},js=Y({__name:"ClusterTestEvidence",props:{affectedTestCases:{},projectKey:{},projectName:{}},setup(a){const I=a,m=g(I.affectedTestCases[0]?.recentTestRunsCaseId??null),C=P(()=>I.affectedTestCases.find(f=>f.recentTestRunsCaseId===m.value)),d=g(null),w=g([]),n=g(!1),c=g(!1),_=g(!1),z=g(!1),A=g(!1),R=g(!1),T=g(!1),h=new Map;function j(){_.value=!1,z.value=!1,A.value=!1,R.value=!1,T.value=!1}async function x(f){j();const v=h.get(f);if(v){d.value=v.detail,w.value=v.traces,n.value=!1,c.value=!1;return}n.value=!0,c.value=!0,d.value=null,w.value=[];const[N,K]=await Promise.allSettled([$fetch(`/api/test-run-cases/${f}`),$fetch(`/api/test-run-cases/${f}/traces`)]);N.status==="fulfilled"&&(d.value=N.value),n.value=!1,K.status==="fulfilled"&&(w.value=K.value),c.value=!1,N.status==="fulfilled"&&K.status==="fulfilled"&&h.set(f,{detail:N.value,traces:K.value})}const M=new Map,B=g(null),O=g("trace"),F=P(()=>B.value?.frames??[]);async function q(f){if(B.value=M.get(f)??null,M.has(f)||w.value.length===0)return;const v=d.value?.testRun?.id;if(v)try{const N=await $fetch(`/api/test-runs/${v}/cases/${f}/trace-stacks`),K=N.status==="ok"&&N.frames?.length?N:null;M.set(f,K),m.value===f&&(B.value=K)}catch{M.set(f,null)}}oe([d,w],()=>{O.value="trace",m.value&&q(m.value)}),oe(m,f=>{f&&x(f)}),ot(()=>{m.value&&x(m.value)});const E=P(()=>{const f=d.value?.steps;return Array.isArray(f)?f.filter(v=>v.error):[]}),D=P(()=>d.value?.testSource?d.value.testSource.split(`
|
|
2
|
-
`).length:0),U=P(()=>{const f=d.value;if(!f)return[];const v=f.attachments.filter(k=>_t(k.path,k.contentType)).length,N=f.attachments.filter(k=>kt(k.path,k.contentType)).length,K=Array.isArray(f.consoleLogs)?f.consoleLogs.filter(k=>k.type==="error"||k.type==="warning").length:0,Z=Array.isArray(f.networkRequests)?f.networkRequests.filter(k=>(k.status??0)>=400).length:0;return[{icon:"i-lucide-image",label:"screenshots",count:v},{icon:"i-lucide-video",label:"videos",count:N},{icon:"i-lucide-bug-play",label:"traces",count:w.value.length},{icon:"i-lucide-list-checks",label:"failing steps",count:E.value.length},{icon:"i-lucide-triangle-alert",label:"signals",count:K+Z},{icon:"i-lucide-code",label:"source",count:f.testSourceFrames?.length||(f.testSource?1:0)},{icon:"i-lucide-accessibility",label:"ARIA",count:f.ariaSnapshot?1:0}].filter(k=>k.count>0)});return(f,v)=>{const N=xe,K=ce,Z=ae,k=ue,i=He,ee=qe,b=Ke,V=_e,H=fs,G=jt,W=Ge,te=We,se=ht,le=Je;return s(),l("div",ps,[a.affectedTestCases.length>1?(s(),l("div",gs,[(s(!0),l(L,null,Q(a.affectedTestCases,y=>(s(),l("button",{key:y.recentTestRunsCaseId,class:X(["px-3 py-1.5 text-xs whitespace-nowrap border-b-2 -mb-px transition-colors",e(m)===y.recentTestRunsCaseId?"border-primary text-primary font-medium":"border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"]),title:y.title,onClick:ne=>m.value=y.recentTestRunsCaseId},[$(o(y.title.split(" › ").pop())+" ",1),y.runCount>1?(s(),l("span",vs,o(y.runCount)+"×",1)):u("",!0)],10,xs))),128))])):u("",!0),e(C)?(s(),l("div",ys,[t("div",hs,[t("p",_s,o(e(C).title),1),r(N,{"file-path":e(C).filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])]),r(K,{to:`/test-run-cases/${e(C).recentTestRunsCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:p(()=>[...v[6]||(v[6]=[$(" Open execution ",-1)])]),_:1},8,["to"])])):u("",!0),e(n)?(s(),l("div",ks,[r(Z,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(d)?(s(),l(L,{key:3},[e(U).length?(s(),l("div",bs,[(s(!0),l(L,null,Q(e(U),y=>(s(),S(k,{key:y.label,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:p(()=>[r(Z,{name:y.icon,class:"size-3"},null,8,["name"]),$(" "+o(y.count)+" "+o(y.label),1)]),_:2},1024))),128))])):u("",!0),r(i,{attachments:e(d).attachments},null,8,["attachments"]),r(ee,{attachments:e(d).attachments},null,8,["attachments"]),r(b,{traces:e(w),loading:e(c)},null,8,["traces","loading"]),e(E).length>0?(s(),S(V,{key:1,icon:"i-lucide-list-checks",label:"Failing steps",count:e(E).length,open:e(_),"onUpdate:open":v[0]||(v[0]=y=>J(_)?_.value=y:null)},{default:p(()=>[t("div",$s,[(s(!0),l(L,null,Q(e(E),(y,ne)=>(s(),l("div",{key:ne,class:"px-3 py-2 space-y-0.5"},[t("p",Cs,o(ne+1)+". "+o(y.title),1),y.error?.message?(s(),l("p",ws,o(y.error.message),1)):u("",!0)]))),128))])]),_:1},8,["count","open"])):u("",!0),r(H,{"console-logs":e(d).consoleLogs,"network-requests":e(d).networkRequests,open:e(z),"onUpdate:open":v[1]||(v[1]=y=>J(z)?z.value=y:null)},null,8,["console-logs","network-requests","open"]),e(d).testSourceFrames?.length||e(d).testSource||e(F).length?(s(),S(V,{key:2,icon:"i-lucide-code",label:"Test source",count:e(F).length||e(d).testSourceFrames?.length||e(D),open:e(A),"onUpdate:open":v[3]||(v[3]=y=>J(A)?A.value=y:null)},{default:p(()=>[e(F).length&&(e(d).testSourceFrames?.length||e(d).testSource)?(s(),S(G,{key:0,modelValue:e(O),"onUpdate:modelValue":v[2]||(v[2]=y=>J(O)?O.value=y:null),items:[{label:`Full stack (${e(F).length})`,value:"trace"},{label:`Captured (${e(d).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"])):u("",!0),t("div",Ss,[e(O)==="trace"&&e(F).length?(s(),S(W,{key:0,frames:e(F),"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(d).testSourceFrames?.length?(s(),S(te,{key:1,frames:e(d).testSourceFrames,"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(d).testSource?(s(),S(se,{key:2,text:"```typescript\n"+e(d).testSource+"\n```"},null,8,["text"])):u("",!0)])]),_:1},8,["count","open"])):u("",!0),e(d).ariaSnapshot?(s(),S(V,{key:3,icon:"i-lucide-accessibility",label:"ARIA snapshot",open:e(R),"onUpdate:open":v[4]||(v[4]=y=>J(R)?R.value=y:null)},{default:p(()=>[t("div",Ts,[r(se,{text:"```yaml\n"+e(d).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},8,["open"])):u("",!0),e(d).pageState?(s(),S(V,{key:4,icon:"i-lucide-database",label:"App state",open:e(T),"onUpdate:open":v[5]||(v[5]=y=>J(T)?T.value=y:null)},{default:p(()=>[r(le,{"page-state":e(d).pageState,plain:""},null,8,["page-state"])]),_:1},8,["open"])):u("",!0)],64)):u("",!0)])}}}),Is=Object.assign(js,{__name:"ClusterTestEvidence"}),Rs={key:0,class:"flex items-center gap-1.5 overflow-hidden min-w-0"},zs={class:"text-primary shrink-0"},Us={class:"text-gray-500 truncate text-xs font-sans"},Es={key:1,class:"text-primary text-xs"},Vs={key:2,class:"text-gray-400 font-sans text-xs"},As={class:"w-96 p-2 space-y-2"},Ms={class:"flex items-center gap-1"},Ns={class:"flex items-center gap-1"},Bs={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"},Fs={class:"font-medium text-green-600 dark:text-green-400"},Ls={class:"font-medium text-red-600 dark:text-red-400"},Ps={class:"text-gray-400"},Ds={key:1,class:"flex items-center justify-center gap-2 py-6 text-gray-400"},Os={key:2,class:"py-4 text-center text-sm text-red-500"},Hs={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"},qs={key:4,class:"max-h-80 overflow-y-auto space-y-px"},Ks={class:"text-xs text-primary"},Gs={key:1,class:"py-4 text-center text-sm text-gray-400"},Ws=["onClick"],Js={class:"text-xs text-primary shrink-0 w-14 pt-px"},Qs={class:"flex-1 min-w-0"},Zs={class:"text-xs font-medium leading-snug truncate"},Xs={class:"text-xs text-gray-400 leading-snug truncate"},Ys=Y({__name:"CommitPicker",props:{modelValue:{},clusterId:{}},emits:["update:modelValue"],setup(a,{emit:I}){const m=a,C=I,d=g(!1),w=g(""),n=g([]),c=g(null),_=g(null),z=g(!1),A=g(!1),R=g(null),T=g(null),h=g([]),j=g(!1),x=g(void 0),M=P(()=>{if(!m.modelValue)return null;const U=m.modelValue.trim();return n.value.find(v=>v.sha===U||v.sha.startsWith(U))??{sha:U,shortSha:U.slice(0,7),message:"",author:"",date:""}});async function B(){if(!h.value.length){j.value=!0;try{const U=await $fetch(`/api/failure-clusters/${m.clusterId}/branches`);h.value=U.branches}catch{}finally{j.value=!1}}}async function O(){const U=m.modelValue||"";z.value=!0,A.value=!1,T.value=null;try{const f={};U&&(f.baseline=U),x.value&&(f.branch=x.value);const v=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:f});n.value=v.commits,_.value=v.aggregate,c.value=v.error??null,T.value=U}catch{A.value=!0}finally{z.value=!1}}oe(x,()=>{n.value=[],T.value=null,O()}),oe(d,async U=>{if(U){await Promise.all([B(),O()]),await rt();const f=R.value?.$el?.querySelector("input")??R.value?.$el;f instanceof HTMLElement&&f.focus()}else w.value=""});const F=P(()=>Se(n.value,w.value)),q=P(()=>{const U=w.value.trim();return!/^[0-9a-f]{7,40}$/i.test(U)||F.value.some(f=>f.sha.startsWith(U.toLowerCase()))?null:U});function E(U){C("update:modelValue",U),d.value=!1}function D(U){U.stopPropagation(),c.value=null,_.value=null,C("update:modelValue",""),d.value=!1}return(U,f)=>{const v=ce,N=ae,K=It,Z=$e,k=lt;return s(),S(k,{open:e(d),"onUpdate:open":f[4]||(f[4]=i=>J(d)?d.value=i:null)},{content:p(()=>[t("div",As,[t("div",Ms,[r(N,{name:"i-lucide-git-branch",class:"size-3.5 text-gray-400 shrink-0"}),r(K,{modelValue:e(x),"onUpdate:modelValue":f[0]||(f[0]=i=>J(x)?x.value=i:null),items:e(h),placeholder:"Default branch",size:"xs",class:"flex-1",loading:e(j),disabled:e(j)},null,8,["modelValue","items","loading","disabled"])]),t("div",Ns,[r(Z,{ref_key:"searchInputRef",ref:R,modelValue:e(w),"onUpdate:modelValue":f[1]||(f[1]=i=>J(w)?w.value=i:null),placeholder:"Search message, author, SHA…",size:"xs",icon:"i-lucide-search",class:"flex-1"},null,8,["modelValue"]),a.modelValue?(s(),S(v,{key:0,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Clear baseline",onClick:f[2]||(f[2]=i=>D(i))})):u("",!0)]),e(_)&&a.modelValue&&!e(z)?(s(),l("div",Bs,[r(N,{name:"i-lucide-git-compare-arrows",class:"size-3.5 shrink-0 text-primary"}),f[5]||(f[5]=t("span",null,"Since baseline:",-1)),t("span",Fs,"+"+o(e(_).linesAdded),1),t("span",Ls,"-"+o(e(_).linesRemoved),1),t("span",Ps,"across "+o(e(_).filesChanged)+" file"+o(e(_).filesChanged===1?"":"s"),1)])):u("",!0),e(z)?(s(),l("div",Ds,[r(N,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),f[6]||(f[6]=t("span",{class:"text-sm"},"Loading commits…",-1))])):e(A)?(s(),l("div",Os," Failed to load commits — check your SCM token in Settings → AI ")):e(c)&&!e(z)&&e(n).length===0?(s(),l("div",Hs,[r(N,{name:"i-lucide-triangle-alert",class:"size-3.5 shrink-0 mt-0.5"}),t("span",null,o(e(c)),1)])):(s(),l("div",qs,[e(q)?(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:f[3]||(f[3]=i=>E(e(q)))},[r(N,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),f[7]||(f[7]=t("span",{class:"text-xs text-gray-500"},"Use commit",-1)),t("code",Ks,o(e(q).slice(0,7)),1)])):u("",!0),e(F).length===0&&!e(q)?(s(),l("div",Gs,o(e(w)?"No commits match":"No commits available"),1)):u("",!0),(s(!0),l(L,null,Q(e(F),i=>(s(),l("button",{key:i.sha,class:X(["w-full text-left px-2 py-1.5 rounded flex items-start gap-2 hover:bg-elevated transition-colors",a.modelValue===i.sha?"bg-primary/10 ring-1 ring-inset ring-primary/30":""]),onClick:ee=>E(i.sha)},[t("code",Js,o(i.shortSha),1),t("div",Qs,[t("p",Zs,o(i.message),1),t("p",Xs,[$(o(i.author),1),i.date?(s(),l(L,{key:0},[$(" · "+o(e(ie)(i.date)),1)],64)):u("",!0)])]),a.modelValue===i.sha?(s(),S(N,{key:0,name:"i-lucide-check",class:"size-3.5 text-primary shrink-0 mt-0.5"})):u("",!0)],10,Ws))),128))]))])]),default:p(()=>[r(v,{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(M)?.message?(s(),l("span",Rs,[t("code",zs,o(e(M).shortSha),1),t("span",Us,o(e(M).message),1)])):a.modelValue?(s(),l("span",Es,o(a.modelValue.slice(0,7))+"…",1)):(s(),l("span",Vs,"baseline commit…"))]),_:1},8,["icon"])]),_:1},8,["open"])}}}),en=Object.assign(Ys,{__name:"CommitPicker"}),tn={class:"space-y-3"},sn={key:0,class:"space-y-1"},nn={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},an={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},on={class:"text-xs text-gray-400 shrink-0"},ln={class:"text-xs text-gray-700 dark:text-gray-300 truncate"},rn={class:"space-y-1"},cn={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},un={key:0,class:"text-yellow-500 font-normal normal-case"},dn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},mn=["onClick"],fn={class:"text-xs font-mono flex-1 truncate text-gray-700 dark:text-gray-300"},pn={class:"text-xs text-gray-400 shrink-0 tabular-nums"},gn={key:0,class:"text-green-500"},xn={key:1,class:"text-gray-300 mx-0.5"},vn={key:2,class:"text-red-500"},yn={key:0,class:"border-t border-default overflow-x-auto max-h-96"},hn=Y({__name:"ScmChangesView",props:{changes:{}},setup(a){const I=g(new Set);function m(C){const d=new Set(I.value);d.has(C)?d.delete(C):d.add(C),I.value=d}return(C,d)=>{const w=ae,n=ke;return s(),l("div",tn,[a.changes.commits.length>0?(s(),l("div",sn,[t("p",nn,o(a.changes.commits.length)+" commit"+o(a.changes.commits.length===1?"":"s"),1),t("div",an,[(s(!0),l(L,null,Q(a.changes.commits,c=>(s(),l("div",{key:c.sha,class:"flex items-center gap-2 px-3 py-1.5"},[r(w,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),t("code",on,o(c.sha.slice(0,7)),1),t("span",ln,o(c.message),1)]))),128))])])):u("",!0),t("div",rn,[t("p",cn,[$(o(a.changes.files.length)+" file"+o(a.changes.files.length===1?"":"s")+" changed ",1),a.changes.patchesOmitted?(s(),l("span",un," — diff too large, file names only ")):u("",!0)]),t("div",dn,[(s(!0),l(L,null,Q(a.changes.files,c=>(s(),l("div",{key:c.filename},[t("button",{class:X(["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",c.patch?"cursor-pointer":"cursor-default"]),onClick:_=>c.patch&&m(c.filename)},[r(w,{name:("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(c.status).icon,class:X(["size-3.5 shrink-0",("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(c.status).color])},null,8,["name","class"]),t("span",fn,o(c.filename),1),t("span",pn,[c.additions?(s(),l("span",gn,"+"+o(c.additions),1)):u("",!0),c.additions&&c.deletions?(s(),l("span",xn,"/")):u("",!0),c.deletions?(s(),l("span",vn,"-"+o(c.deletions),1)):u("",!0)]),c.patch?(s(),S(w,{key:0,name:e(I).has(c.filename)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400 shrink-0"},null,8,["name"])):u("",!0)],10,mn),c.patch&&e(I).has(c.filename)?(s(),l("div",yn,[r(n,{patch:c.patch},null,8,["patch"])])):u("",!0)]))),128))])])])}}}),_n=Object.assign(hn,{__name:"ScmChangesView"}),kn={class:"border border-default rounded-lg overflow-clip text-xs font-mono"},bn={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"},Cn={class:"shrink-0 flex items-center gap-1.5 ml-2 text-[11px]"},wn={key:0,class:"text-green-600 dark:text-green-400"},Sn={key:1,class:"text-red-600 dark:text-red-400"},Tn={key:1,class:"px-3 py-2 text-gray-400 text-[11px]"},jn=Y({__name:"DiffFile",props:{file:{}},setup(a){return(I,m)=>{const C=ue,d=ke;return s(),l("div",kn,[t("div",bn,[t("span",$n,o(a.file.filename),1),t("span",Cn,[a.file.additions?(s(),l("span",wn,"+"+o(a.file.additions),1)):u("",!0),a.file.deletions?(s(),l("span",Sn,"-"+o(a.file.deletions),1)):u("",!0),r(C,{label:a.file.status,size:"xs",variant:"subtle",color:("scmFileStatusMeta"in I?I.scmFileStatusMeta:e(pe))(a.file.status).badgeColor},null,8,["label","color"])])]),a.file.patch?(s(),S(d,{key:0,patch:a.file.patch},null,8,["patch"])):(s(),l("div",Tn,"No patch available"))])}}}),In=Object.assign(jn,{__name:"DiffFile"}),Rn={class:"inline-flex items-center gap-1"},zn={class:"flex h-[72vh] overflow-hidden"},Un={class:"w-72 shrink-0 border-r border-default flex flex-col"},En={class:"p-2 border-b border-default space-y-2 shrink-0"},Vn={class:"flex items-center gap-2 text-xs text-gray-500"},An={class:"ml-auto"},Mn={key:2,class:"flex-1 overflow-y-auto flex flex-col"},Nn={key:0,class:"py-6 text-center text-sm text-gray-400 flex-1"},Bn=["onClick"],Fn=["checked","onChange"],Ln={class:"flex-1 min-w-0"},Pn={class:"text-xs font-medium leading-snug truncate"},Dn={class:"text-[10px] text-gray-400 leading-snug mt-0.5 flex items-center gap-1 min-w-0"},On={class:"text-primary shrink-0"},Hn={class:"truncate"},qn={key:0,class:"shrink-0"},Kn={key:1,class:"p-2 shrink-0 space-y-1.5"},Gn={key:0,class:"flex items-center gap-1.5 text-xs text-red-500 px-1"},Wn={class:"flex-1 overflow-y-auto flex flex-col min-w-0"},Jn={key:0,class:"flex-1 flex items-center justify-center text-gray-400 text-sm"},Qn={key:2,class:"flex-1 p-4 space-y-3"},Zn={key:0,class:"space-y-0.5 pb-3 border-b border-default"},Xn={class:"flex items-center gap-2"},Yn={class:"text-xs font-mono text-primary"},ea={class:"text-xs text-gray-400"},ta={class:"text-sm font-semibold"},sa={key:1,class:"text-sm text-gray-400 pt-2"},na={key:4,class:"flex-1 flex items-center justify-center text-sm text-gray-400"},aa={class:"flex items-center gap-3 w-full"},oa={class:"flex-1 flex items-center gap-2 text-sm text-gray-500 min-w-0"},la={class:"font-medium text-gray-700 dark:text-gray-200 shrink-0"},ra={class:"shrink-0"},ia={class:"text-green-600 dark:text-green-400 shrink-0 font-medium"},ca={class:"text-red-600 dark:text-red-400 shrink-0 font-medium"},ua={key:1,class:"text-gray-400 text-xs shrink-0"},da={key:1},me=50,ma=Y({__name:"CommitBrowserModal",props:{open:{type:Boolean},clusterId:{},initialSelected:{},autoSelectedShas:{}},emits:["update:open","confirm"],setup(a,{emit:I}){const m=a,C=P(()=>new Set(m.autoSelectedShas??[])),d=I,w=g(""),n=g([]),c=g(me),_=g(!1),z=g(!1),A=g(!1),R=g(null),T=g(null),h=g(new Set),j=g(null),x=it({}),M=g(null),B=g(!1),O=g(null),F=P(()=>n.value.find(k=>k.sha===j.value)??null),q=P(()=>Se(n.value,w.value)),E=P(()=>{let k=0,i=0,ee=0,b=0;for(const V of h.value){if(!(V in x)){b++;continue}const H=x[V];H&&(k+=H.files.length,i+=H.files.reduce((G,W)=>G+W.additions,0),ee+=H.files.reduce((G,W)=>G+W.deletions,0))}return{files:k,linesAdded:i,linesRemoved:ee,unreviewed:b}});async function D(k){k?(z.value=!0,R.value=null):(A.value=!0,T.value=null);try{const i=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:{limit:c.value}});n.value=i.commits,_.value=i.hasMore??!1,i.error&&!i.commits.length&&(k?R.value=i.error:T.value=i.error),k&&i.commits[0]&&f(i.commits[0].sha)}catch(i){k?R.value=de(i):T.value=de(i)}finally{z.value=!1,A.value=!1}}async function U(){c.value+=me,await D(!1)}oe(()=>m.open,async k=>{if(k){if(h.value=new Set(m.initialSelected??[]),n.value.length){!j.value&&n.value[0]&&f(n.value[0].sha);return}c.value=me,await D(!0)}});async function f(k){if(j.value!==k){if(j.value=k,O.value=null,k in x){M.value=x[k],B.value=!1;return}M.value=null,B.value=!0;try{const i=await $fetch(`/api/failure-clusters/${m.clusterId}/commit-diff`,{query:{sha:k}});x[k]=i,j.value===k&&(M.value=i)}catch(i){j.value===k&&(O.value=de(i))}finally{j.value===k&&(B.value=!1)}}}function v(k){const i=new Set(h.value);i.has(k)?i.delete(k):i.add(k),h.value=i}function N(){h.value=new Set(q.value.map(k=>k.sha))}function K(){h.value=new Set}function Z(){d("confirm",[...h.value]),d("update:open",!1)}return(k,i)=>{const ee=ge,b=$e,V=Rt,H=ce,G=zt,W=ue,te=ae,se=In,le=Te;return s(),S(le,{open:a.open,title:"Browse commits",ui:{content:"max-w-6xl",body:"p-0 overflow-hidden"},"onUpdate:open":i[4]||(i[4]=y=>d("update:open",y))},{title:p(()=>[t("span",Rn,[i[5]||(i[5]=$("Browse commits ",-1)),r(ee,{topic:"cluster.commit-browser"})])]),body:p(()=>[t("div",zn,[t("div",Un,[t("div",En,[r(b,{modelValue:e(w),"onUpdate:modelValue":i[0]||(i[0]=y=>J(w)?w.value=y:null),placeholder:"Search commits…",size:"xs",icon:"i-lucide-search"},null,8,["modelValue"]),t("div",Vn,[t("button",{class:"hover:text-primary transition-colors",onClick:N},"All"),i[6]||(i[6]=t("span",null,"·",-1)),t("button",{class:"hover:text-primary transition-colors",onClick:K},"None"),t("span",An,o(e(h).size>0?`${e(h).size} selected`:"none selected"),1)])]),e(z)?(s(),S(V,{key:0,text:"Loading…",padded:!1,class:"flex-1"})):e(R)?(s(),S(G,{key:1,text:e(R),padded:!1,class:"flex-1 p-4"},{action:p(()=>[r(H,{size:"xs",color:"neutral",variant:"outline",onClick:i[1]||(i[1]=y=>D(!0))},{default:p(()=>[...i[7]||(i[7]=[$(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):(s(),l("div",Mn,[e(q).length===0?(s(),l("div",Nn,o(e(w)?"No commits match":"No commits"),1)):u("",!0),(s(!0),l(L,null,Q(e(q),y=>(s(),l("button",{key:y.sha,class:X(["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(j)===y.sha?"bg-elevated":""]),onClick:ne=>f(y.sha)},[t("input",{type:"checkbox",checked:e(h).has(y.sha),class:"mt-0.5 shrink-0 cursor-pointer accent-primary",onClick:i[2]||(i[2]=fe(()=>{},["stop"])),onChange:ne=>v(y.sha)},null,40,Fn),t("div",Ln,[t("p",Pn,o(y.message||"(no message)"),1),t("p",Dn,[t("code",On,o(y.shortSha),1),t("span",Hn,o(y.author),1),y.date?(s(),l("span",qn,"· "+o(e(ie)(y.date)),1)):u("",!0),e(C).has(y.sha)?(s(),S(W,{key:1,size:"xs",color:"info",variant:"soft",class:"shrink-0"},{default:p(()=>[...i[8]||(i[8]=[$(" auto ",-1)])]),_:1})):u("",!0)])])],10,Bn))),128)),e(_)&&!e(w)?(s(),l("div",Kn,[e(T)?(s(),l("p",Gn,[r(te,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+o(e(T)),1)])):u("",!0),r(H,{size:"xs",color:"neutral",variant:"outline",block:"",loading:e(A),onClick:U},{default:p(()=>[...i[9]||(i[9]=[$(" Load more ",-1)])]),_:1},8,["loading"])])):u("",!0)]))]),t("div",Wn,[e(j)?e(B)?(s(),S(V,{key:1,text:"Loading diff…",padded:!1,class:"flex-1"})):e(M)?(s(),l("div",Qn,[e(F)?(s(),l("div",Zn,[t("div",Xn,[t("code",Yn,o(e(F).shortSha),1),t("span",ea,[$(o(e(F).author),1),e(F).date?(s(),l(L,{key:0},[$(" · "+o(e(ie)(e(F).date)),1)],64)):u("",!0)])]),t("p",ta,o(e(F).message),1)])):u("",!0),e(M).files.length===0?(s(),l("div",sa,"No file changes in this commit")):u("",!0),(s(!0),l(L,null,Q(e(M).files,y=>(s(),S(se,{key:y.filename,file:y},null,8,["file"]))),128))])):e(O)?(s(),S(G,{key:3,text:e(O),padded:!1,class:"flex-1 p-6"},{action:p(()=>[...i[10]||(i[10]=[t("p",{class:"text-xs text-gray-400"},"Click the commit again to retry",-1)])]),_:1},8,["text"])):(s(),l("div",na," Diff not available for this commit ")):(s(),l("div",Jn," Select a commit to view its diff "))])])]),footer:p(()=>[t("div",aa,[t("div",oa,[e(h).size>0?(s(),l(L,{key:0},[t("span",la,o(e(h).size)+" commit"+o(e(h).size===1?"":"s"),1),e(E).files>0||e(E).linesAdded>0||e(E).linesRemoved>0?(s(),l(L,{key:0},[i[11]||(i[11]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("span",ra,o(e(E).files)+" file"+o(e(E).files===1?"":"s"),1),t("span",ia,"+"+o(e(E).linesAdded),1),t("span",ca,"-"+o(e(E).linesRemoved),1)],64)):u("",!0),e(E).unreviewed>0?(s(),l("span",ua," ("+o(e(E).unreviewed)+" unreviewed) ",1)):u("",!0)],64)):(s(),l("span",da,"No commits selected"))]),r(H,{color:"neutral",variant:"ghost",onClick:i[3]||(i[3]=y=>d("update:open",!1))},{default:p(()=>[...i[12]||(i[12]=[$(" Cancel ",-1)])]),_:1}),r(H,{color:"primary",disabled:e(h).size===0,onClick:Z},{default:p(()=>[...i[13]||(i[13]=[$(" Add to context ",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),fa=Object.assign(ma,{__name:"CommitBrowserModal"});function je(a){return{scmStatus:P(()=>{const m=a.value?.scm;if(!m)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"Git context unavailable",detail:""};if(m.baseCommitUsed){if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};const w=m.patchesOmitted?", no patches (diff too large)":m.patchesTruncated?`, ${m.patchedFilesCount} with patches (some cut)`:`, ${m.patchedFilesCount} with patches`;return{color:"text-blue-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · ${m.filesCount} files${w}`,detail:m.hasLastGreen?"overrides last passing run baseline":"no last passing run"}}if(!m.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(!m.hasCommitRange)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No commit range",detail:"reporter did not send SCM metadata"};if(!m.provider)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:"Unsupported SCM host",detail:"only GitHub, GitLab and Bitbucket are supported"};if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};if(m.patchesOmitted)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files`,detail:"diff too large — file list only, no patches"};const C=m.patchesTruncated?", some patches cut (budget)":"",d=m.commitsCount>0?` · ${m.commitsCount} commit${m.commitsCount>1?"s":""}`:"";return{color:"text-green-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files · ${m.patchedFilesCount} with patches${C}${d}`,detail:""}})}}const pa={class:"space-y-3"},ga={class:"pb-2 border-b border-default"},xa={class:"flex items-center gap-2 flex-wrap"},va={class:"text-xs text-gray-500 font-medium shrink-0 inline-flex items-center gap-1"},ya={class:"flex items-center gap-1.5 ml-auto"},ha={key:0,class:"flex items-center gap-1 px-2 py-0.5 rounded-full bg-primary/10 text-primary text-xs font-medium"},_a={key:0,class:"flex items-start gap-1.5 text-xs px-2 py-1.5 rounded-md bg-elevated border border-default"},ka={key:0,class:"text-gray-400 ml-1"},ba={key:1,class:"flex items-center justify-center py-6"},$a={key:3,class:"text-xs text-gray-400 text-center py-4"},Ca=Y({__name:"ClusterInvestigation",setup(a){const{clusterId:I,baseCommit:m,selectedCommitShas:C,autoSelectedCommits:d,baseCommitIsPinned:w,coverage:n,scmChanges:c,contextLoading:_,refreshContext:z}=Ut(),A=g(!1),{scmStatus:R}=je(n);return(T,h)=>{const j=ge,x=en,M=ae,B=Ce,O=ce,F=_n,q=fa;return s(),l(L,null,[t("div",pa,[t("div",ga,[t("div",xa,[t("span",va,[h[5]||(h[5]=$(" Baseline ",-1)),r(j,{topic:"cluster.baseline"})]),r(x,{modelValue:e(m),"onUpdate:modelValue":h[0]||(h[0]=E=>J(m)?m.value=E:null),"cluster-id":e(I)},null,8,["modelValue","cluster-id"]),e(w)?(s(),S(B,{key:0,text:"Baseline commit pinned for this cluster"},{default:p(()=>[r(M,{name:"i-lucide-pin",class:"size-3.5 text-primary shrink-0"})]),_:1})):u("",!0),t("div",ya,[e(C).length?(s(),l("div",ha,[r(M,{name:"i-lucide-git-commit-horizontal",class:"size-3"}),t("span",null,o(e(C).length)+" commit"+o(e(C).length===1?"":"s"),1),t("button",{class:"ml-0.5 hover:opacity-70 transition-opacity",onClick:h[1]||(h[1]=E=>C.value=[])},[r(M,{name:"i-lucide-x",class:"size-3"})])])):u("",!0),r(O,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list",onClick:h[2]||(h[2]=E=>A.value=!0)},{default:p(()=>[...h[6]||(h[6]=[$(" Browse ",-1)])]),_:1}),r(O,{icon:"i-lucide-refresh-cw",size:"xs",color:"neutral",variant:"outline",loading:e(_),onClick:e(z)},null,8,["loading","onClick"])])])]),e(n)?(s(),l("div",_a,[r(M,{name:e(R).icon,class:X(["size-3.5 mt-0.5 shrink-0",e(R).color])},null,8,["name","class"]),t("div",null,[t("span",{class:X(e(R).color)},o(e(R).text),3),e(R).detail?(s(),l("span",ka,"— "+o(e(R).detail),1)):u("",!0)])])):u("",!0),e(_)&&!e(c)?(s(),l("div",ba,[r(M,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):e(c)?(s(),S(F,{key:2,changes:e(c)},null,8,["changes"])):e(n)&&!e(_)&&!e(c)?(s(),l("p",$a," No changes found in this range. ")):u("",!0)]),r(q,{open:e(A),"onUpdate:open":h[3]||(h[3]=E=>J(A)?A.value=E:null),"cluster-id":e(I),"initial-selected":e(C),"auto-selected-shas":e(d),onConfirm:h[4]||(h[4]=E=>C.value=E)},null,8,["open","cluster-id","initial-selected","auto-selected-shas"])],64)}}}),wa=Object.assign(Ca,{__name:"ClusterInvestigation"}),Sa={class:"flex flex-col h-[60vh]"},Ta={class:"flex items-center gap-3 px-4 py-2.5 border-b border-default text-sm shrink-0"},ja={key:0,class:"ml-auto text-xs text-gray-500"},Ia={class:"flex-1 overflow-y-auto"},Ra={class:"w-full text-sm"},za=["onClick"],Ua={class:"px-4 py-2.5"},Ea=["checked","onChange"],Va={class:"px-2 py-2.5 min-w-0"},Aa={class:"truncate font-medium text-gray-800 dark:text-gray-200 max-w-[24rem]"},Ma={class:"px-2 py-2.5 text-gray-500 text-xs max-w-[16rem] hidden sm:table-cell"},Na={class:"px-2 py-2.5 text-right text-gray-500 text-xs"},Ba={key:0},Fa={class:"shrink-0 border-t border-default px-4 py-3 space-y-1.5"},La={key:0,class:"shrink-0 px-4 pb-3 flex items-center gap-1.5 text-xs text-red-500"},Pa={class:"flex items-center gap-3 w-full"},Da=Y({__name:"ClusterExtractCasesModal",props:{open:{type:Boolean},clusterId:{},affectedTestCases:{},projectKey:{},projectName:{}},emits:["update:open","extracted"],setup(a,{emit:I}){const m=a,C=I,d=ct(),w=g(new Set),n=g(""),c=g(!1),_=g(null);function z(){w.value=new Set(m.affectedTestCases.map(j=>j.testCaseId))}function A(){w.value=new Set}function R(j){const x=new Set(w.value);x.has(j)?x.delete(j):x.add(j),w.value=x}oe(()=>m.open,j=>{j&&(A(),n.value="",_.value=null)});const T=P(()=>w.value.size);async function h(){if(T.value!==0){c.value=!0,_.value=null;try{await $fetch(`/api/failure-clusters/${m.clusterId}/extract-cases`,{method:"POST",body:{testCaseIds:[...w.value],triageNote:n.value.trim()||void 0}}),d.add({title:`Extracted ${T.value} test ${T.value===1?"case":"cases"}`,color:"success"}),C("extracted"),C("update:open",!1)}catch(j){_.value=de(j)}finally{c.value=!1}}}return(j,x)=>{const M=be,B=xe,O=we,F=ae,q=ce,E=Te;return s(),S(E,{open:a.open,title:"Extract test cases",ui:{content:"max-w-4xl",body:"p-0 flex flex-col overflow-hidden"},"onUpdate:open":x[4]||(x[4]=D=>C("update:open",D))},{body:p(()=>[t("div",Sa,[t("div",Ta,[t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:z},"Select all"),x[5]||(x[5]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:A},"Deselect all"),e(T)>0?(s(),l("span",ja,o(e(T))+" selected ",1)):u("",!0)]),t("div",Ia,[t("table",Ra,[x[8]||(x[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(L,null,Q(a.affectedTestCases,D=>(s(),l("tr",{key:D.testCaseId,class:"border-b border-default/50 hover:bg-elevated transition-colors cursor-pointer",onClick:U=>R(D.testCaseId)},[t("td",Ua,[t("input",{type:"checkbox",checked:e(w).has(D.testCaseId),class:"shrink-0 cursor-pointer accent-primary",onClick:x[0]||(x[0]=fe(()=>{},["stop"])),onChange:U=>R(D.testCaseId)},null,40,Ea)]),t("td",Va,[t("p",Aa,o(D.title),1),r(M,{to:`/test-cases/${D.testCaseId}`,class:"text-[10px] text-primary hover:underline mt-0.5 inline-block",onClick:x[1]||(x[1]=fe(()=>{},["stop"]))},{default:p(()=>[...x[6]||(x[6]=[$(" View details ",-1)])]),_:1},8,["to"])]),t("td",Ma,[r(B,{"file-path":D.filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"max-w-full"},null,8,["file-path","project-key","project-name"])]),t("td",Na,o(D.runCount),1)],8,za))),128)),a.affectedTestCases.length===0?(s(),l("tr",Ba,[...x[7]||(x[7]=[t("td",{colspan:"4",class:"px-4 py-8 text-center text-gray-400 text-sm"},"No test cases in this cluster.",-1)])])):u("",!0)])])]),t("div",Fa,[x[9]||(x[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":x[2]||(x[2]=D=>J(n)?n.value=D:null),placeholder:"Add a note explaining why these tests were extracted…",rows:2,class:"text-sm w-full"},null,8,["modelValue"])]),e(_)?(s(),l("p",La,[r(F,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+o(e(_)),1)])):u("",!0)])]),footer:p(()=>[t("div",Pa,[x[11]||(x[11]=t("div",{class:"flex-1"},null,-1)),r(q,{color:"neutral",variant:"ghost",disabled:e(c),onClick:x[3]||(x[3]=D=>C("update:open",!1))},{default:p(()=>[...x[10]||(x[10]=[$(" Cancel ",-1)])]),_:1},8,["disabled"]),r(q,{color:"warning",disabled:e(T)===0,loading:e(c),onClick:h},{default:p(()=>[$(" Extract"+o(e(T)>0?` ${e(T)}`:""),1)]),_:1},8,["disabled","loading"])])]),_:1},8,["open"])}}}),Oa=Object.assign(Da,{__name:"ClusterExtractCasesModal"}),Ha={key:0,class:"flex flex-col h-full min-h-0 max-xl:overflow-y-auto xl:overflow-hidden"},qa={class:"border-b border-default shrink-0"},Ka={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4 p-1 xl:flex-1 xl:min-h-0 xl:overflow-hidden"},Ga={class:"space-y-4 xl:overflow-y-auto"},Wa={class:"font-mono text-xs"},Ja=["innerHTML"],Qa={class:"inline-flex items-center gap-1.5"},Za={class:"xl:overflow-y-auto"},Xa={key:1,class:"flex items-center justify-center h-64 text-gray-500"},Oo=Y({__name:"[id]",async setup(a){let I,m;const C=ut(),d=parseInt(String(C.params.id)),w=Et(d),{data:n,refresh:c}=([I,m]=dt(()=>Nt(`/api/failure-clusters/${d}`,"$Io0yQjh0TH")),I=await I,m(),I);mt(P(()=>({title:`${n.value?.signature??"Failure cluster"} — Piwi Dashboard`})));const _=g(n.value?.status??"open"),z=g(n.value?.triageNote??""),A=g(!1);oe(()=>n.value?.status,b=>{b&&(_.value=b)}),oe(()=>n.value?.triageNote,b=>{z.value=b??""});const R=P(()=>_.value!==(n.value?.status??"open")||z.value.trim()!==(n.value?.triageNote??""));async function T(){A.value=!0;try{await $fetch(`/api/failure-clusters/${d}/status`,{method:"PATCH",body:{status:_.value,triageNote:z.value.trim()||null}}),c()}finally{A.value=!1}}const h=g(!1);function j(){h.value=!1,c()}const{copyRich:x,copied:M}=Qe();function B(){const b=n.value;if(!b)return;const V=window.location.href,H=le=>le.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),G=[b.errorType,`${b.occurrences} occurrence${b.occurrences===1?"":"s"}`,`${b.affectedTests} test${b.affectedTests===1?"":"s"} affected`,b.status!=="open"?b.status:null].filter(Boolean).join(" · "),W=b.diagnosis?.status==="completed"&&b.diagnosis.summary?`AI diagnosis (${b.diagnosis.category??"unknown"}, ${b.diagnosis.confidence??"?"} confidence): ${b.diagnosis.summary}`:null,te=[`❌ Failure cluster: ${b.signature}`,G,"",...b.sampleError?["Sample error:",ve(b.sampleError),""]:[],...W?[W,""]:[],`Cluster: ${V}`].join(`
|
|
3
|
-
`),se=[`<p><strong>❌ Failure cluster</strong>: <code>${H(b.signature)}</code></p>`,`<p><em>${H(G)}</em></p>`,b.sampleError?`<p><strong>Sample error:</strong></p><pre>${
|
|
4
|
-
`).find(
|
|
1
|
+
import{_ as Pe}from"./D5Mhpp98.js";import{_ as Oe}from"./Ds8_6Fzl.js";import{_ as _e,a as He,b as qe,c as Ke,d as Ge,e as We,f as Je,g as ke,u as Qe,h as Ze,i as Xe,j as Ye,k as et,l as tt,m as st}from"./BYWQ47QQ.js";import{d as Y,o as s,e as S,f as p,g as t,h as r,c as l,t as o,l as u,m as ue,b as e,k as $,_ as ae,H as be,F as B,z as Q,j as ce,v as D,I as nt,i as X,J as at,r as g,a as oe,C as ot,x as J,G as $e,K as lt,L as rt,D as fe,M as it,q as ct,u as ut,w as dt,s as mt,N as ft}from"./BzBaMPgu.js";import{_ as Ce}from"./BSKLNgre.js";import{_ as pt,a as gt}from"./CdLqOMvN.js";import{_ as ge}from"./qeqzb80l.js";import{_ as xt}from"./BvXrhZ8k.js";import{_ as vt}from"./D_j436ND.js";import{_ as we}from"./Die1200X.js";import{_ as ht,a as yt,i as _t,b as kt,s as ve,c as bt}from"./RSS6R9Te.js";import{c as he,f as ie,a as $t,b as Ct,d as wt,g as Se,s as pe,e as de,r as ye,h as St}from"./CdM2qNYM.js";import{_ as xe}from"./BMfTUMYy.js";import{_ as Tt}from"./DH_LEqhd.js";import{_ as jt}from"./Dq6_-84R.js";import{_ as It}from"./BUYmGTVP.js";import{_ as Rt}from"./Hp-_W7z4.js";import{_ as zt}from"./DUtYU4Sb.js";import{_ as Te}from"./BbXvpkBp.js";import{u as Ut,p as Vt,_ as At}from"./Cvw4EFTy.js";import{b as Et}from"./7vRR5W2L.js";import{a as Mt,u as Lt}from"./CDEmotIt.js";import"./DWz_bHNP.js";import"./BTCWUyBX.js";import"./CPiLUjjx.js";import"./E26Y1NWH.js";import"./Db5xe__T.js";import"./Cmuwgbf4.js";import"./D-c8ZSws.js";import"./kDEwM7SQ.js";import"./BcHU1KNK.js";import"./BFVrl1ss.js";import"./CnRNwiuE.js";import"./DDho3MJD.js";import"./Bg8yOdSf.js";import"./CTYlay1H.js";import"./C8uZoJVq.js";import"./WCZdf9Ln.js";import"./Boyv6hLW.js";import"./vOZZ2cLi.js";import"./BPQNVV4M.js";import"./BOrnSpTA.js";import"./zAFiz2Mg.js";import"./DWl73MJR.js";const Nt={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Ft={class:"flex items-center gap-3 min-w-0"},Bt={class:"font-mono text-sm truncate text-gray-600 dark:text-gray-400 min-w-0"},Dt={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Pt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ot={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ht={key:1,class:"text-xs text-gray-400 whitespace-nowrap"},qt={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Kt={class:"lg:col-span-9"},Gt={class:"space-y-3"},Wt={key:0,class:"text-sm font-medium break-words text-gray-500 dark:text-gray-400"},Jt={class:"flex flex-wrap gap-2"},Qt={class:"text-sm text-gray-500"},Zt={key:1,class:"rounded-md border border-default p-3 space-y-1.5"},Xt={class:"flex items-center gap-2 flex-wrap"},Yt={key:0,class:"text-xs text-gray-500"},es={class:"text-xs text-gray-500"},ts={class:"text-sm text-gray-500"},ss={class:"font-mono text-xs"},ns={class:"flex items-start gap-3"},as={class:"flex flex-col gap-1 shrink-0"},os={class:"flex-1 min-w-0 space-y-1.5"},ls={class:"flex justify-end"},rs=Y({__name:"ClusterSummary",props:{cluster:{},triageStatus:{},triageNote:{},triageSaving:{type:Boolean},triageChanged:{type:Boolean}},emits:["update:triageStatus","update:triageNote","save-triage"],setup(a,{emit:I}){const m=a,C=I,d=D(()=>wt(m.cluster.fixVerification)),w=[{label:"Open",value:"open",color:"warning"},{label:"Resolved",value:"resolved",color:"success"},{label:"Ignored",value:"ignored",color:"neutral"}];return(n,c)=>{const _=ue,z=ae,E=ge,R=be,T=xt,y=vt,j=ce,x=we,M=ht;return s(),S(M,{"storage-key":"failure-cluster"},{folded:p(()=>[t("div",Nt,[t("div",Ft,[r(_,{color:("clusterStatusColor"in n?n.clusterStatusColor:e(Ct))(a.cluster.status),variant:"solid",size:"sm",class:"shrink-0 capitalize"},{default:p(()=>[$(o(a.cluster.status),1)]),_:1},8,["color"]),t("span",Bt,o(a.cluster.signature),1),a.cluster.errorType?(s(),S(_,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(he))(a.cluster.errorType),variant:"subtle",size:"sm"},{default:p(()=>[$(o(a.cluster.errorType),1)]),_:1},8,["color"])):u("",!0),e(d)?(s(),S(_,{key:1,color:e(d).color,variant:"subtle",size:"sm",class:"gap-1 shrink-0"},{default:p(()=>[r(z,{name:e(d).icon,class:"size-3"},null,8,["name"]),$(" "+o(e(d).label),1)]),_:1},8,["color"])):u("",!0)]),t("div",Dt,[t("span",Pt,o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1),t("span",Ot,o(a.cluster.affectedTests)+" "+o(a.cluster.affectedTests===1?"test":"tests"),1),a.cluster.diagnosis?.status==="completed"&&a.cluster.diagnosis?.category?(s(),S(_,{key:0,color:"neutral",variant:"outline",size:"sm",class:"gap-1 whitespace-nowrap"},{default:p(()=>[r(z,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+o(a.cluster.diagnosis.category),1)]),_:1})):u("",!0),a.cluster.lastSeenAt?(s(),l("span",Ht," last seen "+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.lastSeenAt)),1)):u("",!0)])])]),default:p(()=>[t("div",qt,[t("div",Kt,[r(y,{title:a.cluster.signature},{default:p(()=>[t("div",Gt,[a.cluster.title?(s(),l("p",Wt,o(a.cluster.title),1)):u("",!0),t("div",Jt,[a.cluster.errorType?(s(),S(_,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(he))(a.cluster.errorType),variant:"subtle"},{default:p(()=>[$(o(a.cluster.errorType),1)]),_:1},8,["color"])):u("",!0),r(_,{color:"neutral",variant:"subtle"},{default:p(()=>[$(o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1)]),_:1}),r(_,{color:"neutral",variant:"subtle"},{default:p(()=>[$(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(_,{key:1,color:"neutral",variant:"outline",class:"gap-1"},{default:p(()=>[r(z,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+o(a.cluster.diagnosis.category),1)]),_:1})):u("",!0),r(E,{topic:"cluster.concept"})]),t("p",Qt,[c[2]||(c[2]=$(" First seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+o(a.cluster.firstSeenRunId),1)]),_:1},8,["to"]),a.cluster.firstSeenAt?(s(),l(B,{key:0},[$(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.firstSeenAt))+") ",1)],64)):u("",!0),c[3]||(c[3]=$(" · Last seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.lastSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+o(a.cluster.lastSeenRunId),1)]),_:1},8,["to"]),a.cluster.lastSeenAt?(s(),l(B,{key:1},[$(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.lastSeenAt))+") ",1)],64)):u("",!0),a.cluster.lastSeenRunStatus?(s(),S(T,{key:2,status:a.cluster.lastSeenRunStatus,size:"sm",class:"ml-1 align-middle"},null,8,["status"])):u("",!0)]),e(d)?(s(),l("div",Zt,[t("div",Xt,[r(_,{color:e(d).color,variant:"subtle",class:"gap-1"},{default:p(()=>[r(z,{name:e(d).icon,class:"size-3"},null,8,["name"]),$(" "+o(e(d).label),1)]),_:1},8,["color"]),a.cluster.timeToResolutionMs!=null?(s(),l("span",Yt," open for "+o(("formatLongDuration"in n?n.formatLongDuration:e($t))(a.cluster.timeToResolutionMs)),1)):u("",!0),r(E,{topic:"cluster.resolution"})]),t("p",es,o(e(d).hint),1),t("p",ts,[a.cluster.fixLandedRunId?(s(),l(B,{key:0},[c[4]||(c[4]=$(" Fix landed in ",-1)),r(R,{to:`/test-runs/${a.cluster.fixLandedRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+o(a.cluster.fixLandedRunId),1)]),_:1},8,["to"])],64)):u("",!0),a.cluster.fixLandedAt?(s(),l(B,{key:1},[$(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(ie))(a.cluster.fixLandedAt))+")",1)],64)):u("",!0),a.cluster.fixCommit?(s(),l(B,{key:2},[c[5]||(c[5]=$(" · commit ",-1)),t("code",ss,o(a.cluster.fixCommit.slice(0,8)),1)],64)):u("",!0)])])):u("",!0)])]),_:1},8,["title"])]),r(y,{class:"lg:col-span-3",icon:"i-lucide-triangle-alert","icon-class":"text-amber-500",title:"Triage",help:"cluster.triage"},{default:p(()=>[t("div",ns,[t("div",as,[(s(),l(B,null,Q(w,N=>r(j,{key:N.value,size:"xs",class:"justify-start",color:a.triageStatus===N.value?N.color:"neutral",variant:a.triageStatus===N.value?"solid":"outline",onClick:O=>C("update:triageStatus",N.value)},{default:p(()=>[$(o(N.label),1)]),_:2},1032,["color","variant","onClick"])),64))]),t("div",os,[r(x,{"model-value":a.triageNote,placeholder:"Optional note…",rows:3,class:"text-sm w-full","onUpdate:modelValue":c[0]||(c[0]=N=>C("update:triageNote",N))},null,8,["model-value"]),t("div",ls,[a.triageChanged?(s(),S(j,{key:0,size:"xs",icon:"i-lucide-check",loading:a.triageSaving,onClick:c[1]||(c[1]=N=>C("save-triage"))},{default:p(()=>[...c[6]||(c[6]=[$(" Save ",-1)])]),_:1},8,["loading"])):u("",!0)])])])]),_:1})])]),_:1})}}}),is=Object.assign(rs,{__name:"ClusterSummary"}),cs={class:"divide-y divide-default"},us={class:"text-xs font-mono text-gray-700 dark:text-gray-300 break-all whitespace-pre-wrap"},ds={class:"text-xs font-mono text-gray-600 dark:text-gray-400 truncate"},ms=Y({__name:"TestEvidenceSignals",props:at({consoleLogs:{},networkRequests:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(a){const I=a,m=D(()=>Array.isArray(I.consoleLogs)?I.consoleLogs.filter(c=>c.type==="error"||c.type==="warning"):[]),C=D(()=>Array.isArray(I.networkRequests)?I.networkRequests.filter(c=>c.status&&c.status>=400):[]),d=D(()=>m.value.length>0||C.value.length>0),w=D(()=>{const c=[];return m.value.length&&c.push(`${m.value.length} console`),C.value.length&&c.push(`${C.value.length} network`),c.join(", ")}),n=nt(a,"open");return(c,_)=>{const z=ae,E=ue,R=_e;return e(d)?(s(),S(R,{key:0,icon:"i-lucide-triangle-alert",label:`Signals (${e(w)})`,open:n.value,"onUpdate:open":_[0]||(_[0]=T=>n.value=T)},{default:p(()=>[t("div",cs,[e(m).length>0?(s(),l(B,{key:0},[_[1]||(_[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,Q(e(m),(T,y)=>(s(),l("div",{key:"log-"+y,class:"px-3 py-1.5 flex items-start gap-2"},[r(z,{name:T.type==="error"?"i-lucide-x-circle":"i-lucide-alert-triangle",class:X(["size-3.5 mt-0.5 shrink-0",T.type==="error"?"text-red-500":"text-yellow-500"])},null,8,["name","class"]),t("p",us,o(T.text),1)]))),128))],64)):u("",!0),e(C).length>0?(s(),l(B,{key:1},[_[2]||(_[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,Q(e(C),(T,y)=>(s(),l("div",{key:"req-"+y,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(()=>[$(o(T.status),1)]),_:2},1032,["color"]),t("p",ds,o(T.url),1)]))),128))],64)):u("",!0)])]),_:1},8,["label","open"])):u("",!0)}}}),fs=Object.assign(ms,{__name:"TestEvidenceSignals"}),ps={class:"space-y-3"},gs={key:0,class:"flex gap-0 border-b border-default overflow-x-auto"},xs=["title","onClick"],vs={key:0,class:"opacity-60 ml-1"},hs={key:1,class:"flex items-start justify-between gap-2 flex-wrap"},ys={class:"min-w-0"},_s={class:"text-sm font-medium break-words"},ks={key:2,class:"flex items-center justify-center py-10"},bs={key:0,class:"flex flex-wrap gap-1.5"},$s={class:"divide-y divide-default"},Cs={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},ws={key:0,class:"text-xs font-mono text-red-500 whitespace-pre-wrap break-all"},Ss={class:"overflow-x-auto max-h-72"},Ts={class:"max-h-64 overflow-auto"},js=Y({__name:"ClusterTestEvidence",props:{affectedTestCases:{},projectKey:{},projectName:{}},setup(a){const I=a,m=g(I.affectedTestCases[0]?.recentTestRunsCaseId??null),C=D(()=>I.affectedTestCases.find(f=>f.recentTestRunsCaseId===m.value)),d=g(null),w=g([]),n=g(!1),c=g(!1),_=g(!1),z=g(!1),E=g(!1),R=g(!1),T=g(!1),y=new Map;function j(){_.value=!1,z.value=!1,E.value=!1,R.value=!1,T.value=!1}async function x(f){j();const v=y.get(f);if(v){d.value=v.detail,w.value=v.traces,n.value=!1,c.value=!1;return}n.value=!0,c.value=!0,d.value=null,w.value=[];const[L,K]=await Promise.allSettled([$fetch(`/api/test-run-cases/${f}`),$fetch(`/api/test-run-cases/${f}/traces`)]);L.status==="fulfilled"&&(d.value=L.value),n.value=!1,K.status==="fulfilled"&&(w.value=K.value),c.value=!1,L.status==="fulfilled"&&K.status==="fulfilled"&&y.set(f,{detail:L.value,traces:K.value})}const M=new Map,N=g(null),O=g("trace"),F=D(()=>N.value?.frames??[]);async function q(f){if(N.value=M.get(f)??null,M.has(f)||w.value.length===0)return;const v=d.value?.testRun?.id;if(v)try{const L=await $fetch(`/api/test-runs/${v}/cases/${f}/trace-stacks`),K=L.status==="ok"&&L.frames?.length?L:null;M.set(f,K),m.value===f&&(N.value=K)}catch{M.set(f,null)}}oe([d,w],()=>{O.value="trace",m.value&&q(m.value)}),oe(m,f=>{f&&x(f)}),ot(()=>{m.value&&x(m.value)});const V=D(()=>{const f=d.value?.steps;return Array.isArray(f)?f.filter(v=>v.error):[]}),P=D(()=>d.value?.testSource?d.value.testSource.split(`
|
|
2
|
+
`).length:0),U=D(()=>{const f=d.value;if(!f)return[];const v=f.attachments.filter(k=>_t(k.path,k.contentType)).length,L=f.attachments.filter(k=>kt(k.path,k.contentType)).length,K=Array.isArray(f.consoleLogs)?f.consoleLogs.filter(k=>k.type==="error"||k.type==="warning").length:0,Z=Array.isArray(f.networkRequests)?f.networkRequests.filter(k=>(k.status??0)>=400).length:0;return[{icon:"i-lucide-image",label:"screenshots",count:v},{icon:"i-lucide-video",label:"videos",count:L},{icon:"i-lucide-bug-play",label:"traces",count:w.value.length},{icon:"i-lucide-list-checks",label:"failing steps",count:V.value.length},{icon:"i-lucide-triangle-alert",label:"signals",count:K+Z},{icon:"i-lucide-code",label:"source",count:f.testSourceFrames?.length||(f.testSource?1:0)},{icon:"i-lucide-accessibility",label:"ARIA",count:f.ariaSnapshot?1:0}].filter(k=>k.count>0)});return(f,v)=>{const L=xe,K=ce,Z=ae,k=ue,i=He,ee=qe,b=Ke,A=_e,H=fs,G=jt,W=Ge,te=We,se=yt,le=Je;return s(),l("div",ps,[a.affectedTestCases.length>1?(s(),l("div",gs,[(s(!0),l(B,null,Q(a.affectedTestCases,h=>(s(),l("button",{key:h.recentTestRunsCaseId,class:X(["px-3 py-1.5 text-xs whitespace-nowrap border-b-2 -mb-px transition-colors",e(m)===h.recentTestRunsCaseId?"border-primary text-primary font-medium":"border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"]),title:h.title,onClick:ne=>m.value=h.recentTestRunsCaseId},[$(o(h.title.split(" › ").pop())+" ",1),h.runCount>1?(s(),l("span",vs,o(h.runCount)+"×",1)):u("",!0)],10,xs))),128))])):u("",!0),e(C)?(s(),l("div",hs,[t("div",ys,[t("p",_s,o(e(C).title),1),r(L,{"file-path":e(C).filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])]),r(K,{to:`/test-run-cases/${e(C).recentTestRunsCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:p(()=>[...v[6]||(v[6]=[$(" Open execution ",-1)])]),_:1},8,["to"])])):u("",!0),e(n)?(s(),l("div",ks,[r(Z,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(d)?(s(),l(B,{key:3},[e(U).length?(s(),l("div",bs,[(s(!0),l(B,null,Q(e(U),h=>(s(),S(k,{key:h.label,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:p(()=>[r(Z,{name:h.icon,class:"size-3"},null,8,["name"]),$(" "+o(h.count)+" "+o(h.label),1)]),_:2},1024))),128))])):u("",!0),r(i,{attachments:e(d).attachments},null,8,["attachments"]),r(ee,{attachments:e(d).attachments},null,8,["attachments"]),r(b,{traces:e(w),loading:e(c)},null,8,["traces","loading"]),e(V).length>0?(s(),S(A,{key:1,icon:"i-lucide-list-checks",label:"Failing steps",count:e(V).length,open:e(_),"onUpdate:open":v[0]||(v[0]=h=>J(_)?_.value=h:null)},{default:p(()=>[t("div",$s,[(s(!0),l(B,null,Q(e(V),(h,ne)=>(s(),l("div",{key:ne,class:"px-3 py-2 space-y-0.5"},[t("p",Cs,o(ne+1)+". "+o(h.title),1),h.error?.message?(s(),l("p",ws,o(h.error.message),1)):u("",!0)]))),128))])]),_:1},8,["count","open"])):u("",!0),r(H,{"console-logs":e(d).consoleLogs,"network-requests":e(d).networkRequests,open:e(z),"onUpdate:open":v[1]||(v[1]=h=>J(z)?z.value=h:null)},null,8,["console-logs","network-requests","open"]),e(d).testSourceFrames?.length||e(d).testSource||e(F).length?(s(),S(A,{key:2,icon:"i-lucide-code",label:"Test source",count:e(F).length||e(d).testSourceFrames?.length||e(P),open:e(E),"onUpdate:open":v[3]||(v[3]=h=>J(E)?E.value=h:null)},{default:p(()=>[e(F).length&&(e(d).testSourceFrames?.length||e(d).testSource)?(s(),S(G,{key:0,modelValue:e(O),"onUpdate:modelValue":v[2]||(v[2]=h=>J(O)?O.value=h:null),items:[{label:`Full stack (${e(F).length})`,value:"trace"},{label:`Captured (${e(d).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"])):u("",!0),t("div",Ss,[e(O)==="trace"&&e(F).length?(s(),S(W,{key:0,frames:e(F),"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(d).testSourceFrames?.length?(s(),S(te,{key:1,frames:e(d).testSourceFrames,"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(d).testSource?(s(),S(se,{key:2,text:"```typescript\n"+e(d).testSource+"\n```"},null,8,["text"])):u("",!0)])]),_:1},8,["count","open"])):u("",!0),e(d).ariaSnapshot?(s(),S(A,{key:3,icon:"i-lucide-accessibility",label:"ARIA snapshot",open:e(R),"onUpdate:open":v[4]||(v[4]=h=>J(R)?R.value=h:null)},{default:p(()=>[t("div",Ts,[r(se,{text:"```yaml\n"+e(d).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},8,["open"])):u("",!0),e(d).pageState?(s(),S(A,{key:4,icon:"i-lucide-database",label:"App state",open:e(T),"onUpdate:open":v[5]||(v[5]=h=>J(T)?T.value=h:null)},{default:p(()=>[r(le,{"page-state":e(d).pageState,plain:""},null,8,["page-state"])]),_:1},8,["open"])):u("",!0)],64)):u("",!0)])}}}),Is=Object.assign(js,{__name:"ClusterTestEvidence"}),Rs={key:0,class:"flex items-center gap-1.5 overflow-hidden min-w-0"},zs={class:"text-primary shrink-0"},Us={class:"text-gray-500 truncate text-xs font-sans"},Vs={key:1,class:"text-primary text-xs"},As={key:2,class:"text-gray-400 font-sans text-xs"},Es={class:"w-96 p-2 space-y-2"},Ms={class:"flex items-center gap-1"},Ls={class:"flex items-center gap-1"},Ns={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"},Fs={class:"font-medium text-green-600 dark:text-green-400"},Bs={class:"font-medium text-red-600 dark:text-red-400"},Ds={class:"text-gray-400"},Ps={key:1,class:"flex items-center justify-center gap-2 py-6 text-gray-400"},Os={key:2,class:"py-4 text-center text-sm text-red-500"},Hs={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"},qs={key:4,class:"max-h-80 overflow-y-auto space-y-px"},Ks={class:"text-xs text-primary"},Gs={key:1,class:"py-4 text-center text-sm text-gray-400"},Ws=["onClick"],Js={class:"text-xs text-primary shrink-0 w-14 pt-px"},Qs={class:"flex-1 min-w-0"},Zs={class:"text-xs font-medium leading-snug truncate"},Xs={class:"text-xs text-gray-400 leading-snug truncate"},Ys=Y({__name:"CommitPicker",props:{modelValue:{},clusterId:{}},emits:["update:modelValue"],setup(a,{emit:I}){const m=a,C=I,d=g(!1),w=g(""),n=g([]),c=g(null),_=g(null),z=g(!1),E=g(!1),R=g(null),T=g(null),y=g([]),j=g(!1),x=g(void 0),M=D(()=>{if(!m.modelValue)return null;const U=m.modelValue.trim();return n.value.find(v=>v.sha===U||v.sha.startsWith(U))??{sha:U,shortSha:U.slice(0,7),message:"",author:"",date:""}});async function N(){if(!y.value.length){j.value=!0;try{const U=await $fetch(`/api/failure-clusters/${m.clusterId}/branches`);y.value=U.branches}catch{}finally{j.value=!1}}}async function O(){const U=m.modelValue||"";z.value=!0,E.value=!1,T.value=null;try{const f={};U&&(f.baseline=U),x.value&&(f.branch=x.value);const v=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:f});n.value=v.commits,_.value=v.aggregate,c.value=v.error??null,T.value=U}catch{E.value=!0}finally{z.value=!1}}oe(x,()=>{n.value=[],T.value=null,O()}),oe(d,async U=>{if(U){await Promise.all([N(),O()]),await rt();const f=R.value?.$el?.querySelector("input")??R.value?.$el;f instanceof HTMLElement&&f.focus()}else w.value=""});const F=D(()=>Se(n.value,w.value)),q=D(()=>{const U=w.value.trim();return!/^[0-9a-f]{7,40}$/i.test(U)||F.value.some(f=>f.sha.startsWith(U.toLowerCase()))?null:U});function V(U){C("update:modelValue",U),d.value=!1}function P(U){U.stopPropagation(),c.value=null,_.value=null,C("update:modelValue",""),d.value=!1}return(U,f)=>{const v=ce,L=ae,K=It,Z=$e,k=lt;return s(),S(k,{open:e(d),"onUpdate:open":f[4]||(f[4]=i=>J(d)?d.value=i:null)},{content:p(()=>[t("div",Es,[t("div",Ms,[r(L,{name:"i-lucide-git-branch",class:"size-3.5 text-gray-400 shrink-0"}),r(K,{modelValue:e(x),"onUpdate:modelValue":f[0]||(f[0]=i=>J(x)?x.value=i:null),items:e(y),placeholder:"Default branch",size:"xs",class:"flex-1",loading:e(j),disabled:e(j)},null,8,["modelValue","items","loading","disabled"])]),t("div",Ls,[r(Z,{ref_key:"searchInputRef",ref:R,modelValue:e(w),"onUpdate:modelValue":f[1]||(f[1]=i=>J(w)?w.value=i:null),placeholder:"Search message, author, SHA…",size:"xs",icon:"i-lucide-search",class:"flex-1"},null,8,["modelValue"]),a.modelValue?(s(),S(v,{key:0,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Clear baseline",onClick:f[2]||(f[2]=i=>P(i))})):u("",!0)]),e(_)&&a.modelValue&&!e(z)?(s(),l("div",Ns,[r(L,{name:"i-lucide-git-compare-arrows",class:"size-3.5 shrink-0 text-primary"}),f[5]||(f[5]=t("span",null,"Since baseline:",-1)),t("span",Fs,"+"+o(e(_).linesAdded),1),t("span",Bs,"-"+o(e(_).linesRemoved),1),t("span",Ds,"across "+o(e(_).filesChanged)+" file"+o(e(_).filesChanged===1?"":"s"),1)])):u("",!0),e(z)?(s(),l("div",Ps,[r(L,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),f[6]||(f[6]=t("span",{class:"text-sm"},"Loading commits…",-1))])):e(E)?(s(),l("div",Os," Failed to load commits — check your SCM token in Settings → AI ")):e(c)&&!e(z)&&e(n).length===0?(s(),l("div",Hs,[r(L,{name:"i-lucide-triangle-alert",class:"size-3.5 shrink-0 mt-0.5"}),t("span",null,o(e(c)),1)])):(s(),l("div",qs,[e(q)?(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:f[3]||(f[3]=i=>V(e(q)))},[r(L,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),f[7]||(f[7]=t("span",{class:"text-xs text-gray-500"},"Use commit",-1)),t("code",Ks,o(e(q).slice(0,7)),1)])):u("",!0),e(F).length===0&&!e(q)?(s(),l("div",Gs,o(e(w)?"No commits match":"No commits available"),1)):u("",!0),(s(!0),l(B,null,Q(e(F),i=>(s(),l("button",{key:i.sha,class:X(["w-full text-left px-2 py-1.5 rounded flex items-start gap-2 hover:bg-elevated transition-colors",a.modelValue===i.sha?"bg-primary/10 ring-1 ring-inset ring-primary/30":""]),onClick:ee=>V(i.sha)},[t("code",Js,o(i.shortSha),1),t("div",Qs,[t("p",Zs,o(i.message),1),t("p",Xs,[$(o(i.author),1),i.date?(s(),l(B,{key:0},[$(" · "+o(e(ie)(i.date)),1)],64)):u("",!0)])]),a.modelValue===i.sha?(s(),S(L,{key:0,name:"i-lucide-check",class:"size-3.5 text-primary shrink-0 mt-0.5"})):u("",!0)],10,Ws))),128))]))])]),default:p(()=>[r(v,{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(M)?.message?(s(),l("span",Rs,[t("code",zs,o(e(M).shortSha),1),t("span",Us,o(e(M).message),1)])):a.modelValue?(s(),l("span",Vs,o(a.modelValue.slice(0,7))+"…",1)):(s(),l("span",As,"baseline commit…"))]),_:1},8,["icon"])]),_:1},8,["open"])}}}),en=Object.assign(Ys,{__name:"CommitPicker"}),tn={class:"space-y-3"},sn={key:0,class:"space-y-1"},nn={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},an={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},on={class:"text-xs text-gray-400 shrink-0"},ln={class:"text-xs text-gray-700 dark:text-gray-300 truncate"},rn={class:"space-y-1"},cn={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},un={key:0,class:"text-yellow-500 font-normal normal-case"},dn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},mn=["onClick"],fn={class:"text-xs font-mono flex-1 truncate text-gray-700 dark:text-gray-300"},pn={class:"text-xs text-gray-400 shrink-0 tabular-nums"},gn={key:0,class:"text-green-500"},xn={key:1,class:"text-gray-300 mx-0.5"},vn={key:2,class:"text-red-500"},hn={key:0,class:"border-t border-default overflow-x-auto max-h-96"},yn=Y({__name:"ScmChangesView",props:{changes:{}},setup(a){const I=g(new Set);function m(C){const d=new Set(I.value);d.has(C)?d.delete(C):d.add(C),I.value=d}return(C,d)=>{const w=ae,n=ke;return s(),l("div",tn,[a.changes.commits.length>0?(s(),l("div",sn,[t("p",nn,o(a.changes.commits.length)+" commit"+o(a.changes.commits.length===1?"":"s"),1),t("div",an,[(s(!0),l(B,null,Q(a.changes.commits,c=>(s(),l("div",{key:c.sha,class:"flex items-center gap-2 px-3 py-1.5"},[r(w,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),t("code",on,o(c.sha.slice(0,7)),1),t("span",ln,o(c.message),1)]))),128))])])):u("",!0),t("div",rn,[t("p",cn,[$(o(a.changes.files.length)+" file"+o(a.changes.files.length===1?"":"s")+" changed ",1),a.changes.patchesOmitted?(s(),l("span",un," — diff too large, file names only ")):u("",!0)]),t("div",dn,[(s(!0),l(B,null,Q(a.changes.files,c=>(s(),l("div",{key:c.filename},[t("button",{class:X(["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",c.patch?"cursor-pointer":"cursor-default"]),onClick:_=>c.patch&&m(c.filename)},[r(w,{name:("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(c.status).icon,class:X(["size-3.5 shrink-0",("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(c.status).color])},null,8,["name","class"]),t("span",fn,o(c.filename),1),t("span",pn,[c.additions?(s(),l("span",gn,"+"+o(c.additions),1)):u("",!0),c.additions&&c.deletions?(s(),l("span",xn,"/")):u("",!0),c.deletions?(s(),l("span",vn,"-"+o(c.deletions),1)):u("",!0)]),c.patch?(s(),S(w,{key:0,name:e(I).has(c.filename)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400 shrink-0"},null,8,["name"])):u("",!0)],10,mn),c.patch&&e(I).has(c.filename)?(s(),l("div",hn,[r(n,{patch:c.patch},null,8,["patch"])])):u("",!0)]))),128))])])])}}}),_n=Object.assign(yn,{__name:"ScmChangesView"}),kn={class:"border border-default rounded-lg overflow-clip text-xs font-mono"},bn={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"},Cn={class:"shrink-0 flex items-center gap-1.5 ml-2 text-[11px]"},wn={key:0,class:"text-green-600 dark:text-green-400"},Sn={key:1,class:"text-red-600 dark:text-red-400"},Tn={key:1,class:"px-3 py-2 text-gray-400 text-[11px]"},jn=Y({__name:"DiffFile",props:{file:{}},setup(a){return(I,m)=>{const C=ue,d=ke;return s(),l("div",kn,[t("div",bn,[t("span",$n,o(a.file.filename),1),t("span",Cn,[a.file.additions?(s(),l("span",wn,"+"+o(a.file.additions),1)):u("",!0),a.file.deletions?(s(),l("span",Sn,"-"+o(a.file.deletions),1)):u("",!0),r(C,{label:a.file.status,size:"xs",variant:"subtle",color:("scmFileStatusMeta"in I?I.scmFileStatusMeta:e(pe))(a.file.status).badgeColor},null,8,["label","color"])])]),a.file.patch?(s(),S(d,{key:0,patch:a.file.patch},null,8,["patch"])):(s(),l("div",Tn,"No patch available"))])}}}),In=Object.assign(jn,{__name:"DiffFile"}),Rn={class:"inline-flex items-center gap-1"},zn={class:"flex h-[72vh] overflow-hidden"},Un={class:"w-72 shrink-0 border-r border-default flex flex-col"},Vn={class:"p-2 border-b border-default space-y-2 shrink-0"},An={class:"flex items-center gap-2 text-xs text-gray-500"},En={class:"ml-auto"},Mn={key:2,class:"flex-1 overflow-y-auto flex flex-col"},Ln={key:0,class:"py-6 text-center text-sm text-gray-400 flex-1"},Nn=["onClick"],Fn=["checked","onChange"],Bn={class:"flex-1 min-w-0"},Dn={class:"text-xs font-medium leading-snug truncate"},Pn={class:"text-[10px] text-gray-400 leading-snug mt-0.5 flex items-center gap-1 min-w-0"},On={class:"text-primary shrink-0"},Hn={class:"truncate"},qn={key:0,class:"shrink-0"},Kn={key:1,class:"p-2 shrink-0 space-y-1.5"},Gn={key:0,class:"flex items-center gap-1.5 text-xs text-red-500 px-1"},Wn={class:"flex-1 overflow-y-auto flex flex-col min-w-0"},Jn={key:0,class:"flex-1 flex items-center justify-center text-gray-400 text-sm"},Qn={key:2,class:"flex-1 p-4 space-y-3"},Zn={key:0,class:"space-y-0.5 pb-3 border-b border-default"},Xn={class:"flex items-center gap-2"},Yn={class:"text-xs font-mono text-primary"},ea={class:"text-xs text-gray-400"},ta={class:"text-sm font-semibold"},sa={key:1,class:"text-sm text-gray-400 pt-2"},na={key:4,class:"flex-1 flex items-center justify-center text-sm text-gray-400"},aa={class:"flex items-center gap-3 w-full"},oa={class:"flex-1 flex items-center gap-2 text-sm text-gray-500 min-w-0"},la={class:"font-medium text-gray-700 dark:text-gray-200 shrink-0"},ra={class:"shrink-0"},ia={class:"text-green-600 dark:text-green-400 shrink-0 font-medium"},ca={class:"text-red-600 dark:text-red-400 shrink-0 font-medium"},ua={key:1,class:"text-gray-400 text-xs shrink-0"},da={key:1},me=50,ma=Y({__name:"CommitBrowserModal",props:{open:{type:Boolean},clusterId:{},initialSelected:{},autoSelectedShas:{}},emits:["update:open","confirm"],setup(a,{emit:I}){const m=a,C=D(()=>new Set(m.autoSelectedShas??[])),d=I,w=g(""),n=g([]),c=g(me),_=g(!1),z=g(!1),E=g(!1),R=g(null),T=g(null),y=g(new Set),j=g(null),x=it({}),M=g(null),N=g(!1),O=g(null),F=D(()=>n.value.find(k=>k.sha===j.value)??null),q=D(()=>Se(n.value,w.value)),V=D(()=>{let k=0,i=0,ee=0,b=0;for(const A of y.value){if(!(A in x)){b++;continue}const H=x[A];H&&(k+=H.files.length,i+=H.files.reduce((G,W)=>G+W.additions,0),ee+=H.files.reduce((G,W)=>G+W.deletions,0))}return{files:k,linesAdded:i,linesRemoved:ee,unreviewed:b}});async function P(k){k?(z.value=!0,R.value=null):(E.value=!0,T.value=null);try{const i=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:{limit:c.value}});n.value=i.commits,_.value=i.hasMore??!1,i.error&&!i.commits.length&&(k?R.value=i.error:T.value=i.error),k&&i.commits[0]&&f(i.commits[0].sha)}catch(i){k?R.value=de(i):T.value=de(i)}finally{z.value=!1,E.value=!1}}async function U(){c.value+=me,await P(!1)}oe(()=>m.open,async k=>{if(k){if(y.value=new Set(m.initialSelected??[]),n.value.length){!j.value&&n.value[0]&&f(n.value[0].sha);return}c.value=me,await P(!0)}});async function f(k){if(j.value!==k){if(j.value=k,O.value=null,k in x){M.value=x[k],N.value=!1;return}M.value=null,N.value=!0;try{const i=await $fetch(`/api/failure-clusters/${m.clusterId}/commit-diff`,{query:{sha:k}});x[k]=i,j.value===k&&(M.value=i)}catch(i){j.value===k&&(O.value=de(i))}finally{j.value===k&&(N.value=!1)}}}function v(k){const i=new Set(y.value);i.has(k)?i.delete(k):i.add(k),y.value=i}function L(){y.value=new Set(q.value.map(k=>k.sha))}function K(){y.value=new Set}function Z(){d("confirm",[...y.value]),d("update:open",!1)}return(k,i)=>{const ee=ge,b=$e,A=Rt,H=ce,G=zt,W=ue,te=ae,se=In,le=Te;return s(),S(le,{open:a.open,title:"Browse commits",ui:{content:"max-w-6xl",body:"p-0 overflow-hidden"},"onUpdate:open":i[4]||(i[4]=h=>d("update:open",h))},{title:p(()=>[t("span",Rn,[i[5]||(i[5]=$("Browse commits ",-1)),r(ee,{topic:"cluster.commit-browser"})])]),body:p(()=>[t("div",zn,[t("div",Un,[t("div",Vn,[r(b,{modelValue:e(w),"onUpdate:modelValue":i[0]||(i[0]=h=>J(w)?w.value=h:null),placeholder:"Search commits…",size:"xs",icon:"i-lucide-search"},null,8,["modelValue"]),t("div",An,[t("button",{class:"hover:text-primary transition-colors",onClick:L},"All"),i[6]||(i[6]=t("span",null,"·",-1)),t("button",{class:"hover:text-primary transition-colors",onClick:K},"None"),t("span",En,o(e(y).size>0?`${e(y).size} selected`:"none selected"),1)])]),e(z)?(s(),S(A,{key:0,text:"Loading…",padded:!1,class:"flex-1"})):e(R)?(s(),S(G,{key:1,text:e(R),padded:!1,class:"flex-1 p-4"},{action:p(()=>[r(H,{size:"xs",color:"neutral",variant:"outline",onClick:i[1]||(i[1]=h=>P(!0))},{default:p(()=>[...i[7]||(i[7]=[$(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):(s(),l("div",Mn,[e(q).length===0?(s(),l("div",Ln,o(e(w)?"No commits match":"No commits"),1)):u("",!0),(s(!0),l(B,null,Q(e(q),h=>(s(),l("button",{key:h.sha,class:X(["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(j)===h.sha?"bg-elevated":""]),onClick:ne=>f(h.sha)},[t("input",{type:"checkbox",checked:e(y).has(h.sha),class:"mt-0.5 shrink-0 cursor-pointer accent-primary",onClick:i[2]||(i[2]=fe(()=>{},["stop"])),onChange:ne=>v(h.sha)},null,40,Fn),t("div",Bn,[t("p",Dn,o(h.message||"(no message)"),1),t("p",Pn,[t("code",On,o(h.shortSha),1),t("span",Hn,o(h.author),1),h.date?(s(),l("span",qn,"· "+o(e(ie)(h.date)),1)):u("",!0),e(C).has(h.sha)?(s(),S(W,{key:1,size:"xs",color:"info",variant:"soft",class:"shrink-0"},{default:p(()=>[...i[8]||(i[8]=[$(" auto ",-1)])]),_:1})):u("",!0)])])],10,Nn))),128)),e(_)&&!e(w)?(s(),l("div",Kn,[e(T)?(s(),l("p",Gn,[r(te,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+o(e(T)),1)])):u("",!0),r(H,{size:"xs",color:"neutral",variant:"outline",block:"",loading:e(E),onClick:U},{default:p(()=>[...i[9]||(i[9]=[$(" Load more ",-1)])]),_:1},8,["loading"])])):u("",!0)]))]),t("div",Wn,[e(j)?e(N)?(s(),S(A,{key:1,text:"Loading diff…",padded:!1,class:"flex-1"})):e(M)?(s(),l("div",Qn,[e(F)?(s(),l("div",Zn,[t("div",Xn,[t("code",Yn,o(e(F).shortSha),1),t("span",ea,[$(o(e(F).author),1),e(F).date?(s(),l(B,{key:0},[$(" · "+o(e(ie)(e(F).date)),1)],64)):u("",!0)])]),t("p",ta,o(e(F).message),1)])):u("",!0),e(M).files.length===0?(s(),l("div",sa,"No file changes in this commit")):u("",!0),(s(!0),l(B,null,Q(e(M).files,h=>(s(),S(se,{key:h.filename,file:h},null,8,["file"]))),128))])):e(O)?(s(),S(G,{key:3,text:e(O),padded:!1,class:"flex-1 p-6"},{action:p(()=>[...i[10]||(i[10]=[t("p",{class:"text-xs text-gray-400"},"Click the commit again to retry",-1)])]),_:1},8,["text"])):(s(),l("div",na," Diff not available for this commit ")):(s(),l("div",Jn," Select a commit to view its diff "))])])]),footer:p(()=>[t("div",aa,[t("div",oa,[e(y).size>0?(s(),l(B,{key:0},[t("span",la,o(e(y).size)+" commit"+o(e(y).size===1?"":"s"),1),e(V).files>0||e(V).linesAdded>0||e(V).linesRemoved>0?(s(),l(B,{key:0},[i[11]||(i[11]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("span",ra,o(e(V).files)+" file"+o(e(V).files===1?"":"s"),1),t("span",ia,"+"+o(e(V).linesAdded),1),t("span",ca,"-"+o(e(V).linesRemoved),1)],64)):u("",!0),e(V).unreviewed>0?(s(),l("span",ua," ("+o(e(V).unreviewed)+" unreviewed) ",1)):u("",!0)],64)):(s(),l("span",da,"No commits selected"))]),r(H,{color:"neutral",variant:"ghost",onClick:i[3]||(i[3]=h=>d("update:open",!1))},{default:p(()=>[...i[12]||(i[12]=[$(" Cancel ",-1)])]),_:1}),r(H,{color:"primary",disabled:e(y).size===0,onClick:Z},{default:p(()=>[...i[13]||(i[13]=[$(" Add to context ",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),fa=Object.assign(ma,{__name:"CommitBrowserModal"});function je(a){return{scmStatus:D(()=>{const m=a.value?.scm;if(!m)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"Git context unavailable",detail:""};if(m.baseCommitUsed){if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};const w=m.patchesOmitted?", no patches (diff too large)":m.patchesTruncated?`, ${m.patchedFilesCount} with patches (some cut)`:`, ${m.patchedFilesCount} with patches`;return{color:"text-blue-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · ${m.filesCount} files${w}`,detail:m.hasLastGreen?"overrides last passing run baseline":"no last passing run"}}if(!m.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(!m.hasCommitRange)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No commit range",detail:"reporter did not send SCM metadata"};if(!m.provider)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:"Unsupported SCM host",detail:"only GitHub, GitLab and Bitbucket are supported"};if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};if(m.patchesOmitted)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files`,detail:"diff too large — file list only, no patches"};const C=m.patchesTruncated?", some patches cut (budget)":"",d=m.commitsCount>0?` · ${m.commitsCount} commit${m.commitsCount>1?"s":""}`:"";return{color:"text-green-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files · ${m.patchedFilesCount} with patches${C}${d}`,detail:""}})}}const pa={class:"space-y-3"},ga={class:"pb-2 border-b border-default"},xa={class:"flex items-center gap-2 flex-wrap"},va={class:"text-xs text-gray-500 font-medium shrink-0 inline-flex items-center gap-1"},ha={class:"flex items-center gap-1.5 ml-auto"},ya={key:0,class:"flex items-center gap-1 px-2 py-0.5 rounded-full bg-primary/10 text-primary text-xs font-medium"},_a={key:0,class:"flex items-start gap-1.5 text-xs px-2 py-1.5 rounded-md bg-elevated border border-default"},ka={key:0,class:"text-gray-400 ml-1"},ba={key:1,class:"flex items-center justify-center py-6"},$a={key:3,class:"text-xs text-gray-400 text-center py-4"},Ca=Y({__name:"ClusterInvestigation",setup(a){const{clusterId:I,baseCommit:m,selectedCommitShas:C,autoSelectedCommits:d,baseCommitIsPinned:w,coverage:n,scmChanges:c,contextLoading:_,refreshContext:z}=Ut(),E=g(!1),{scmStatus:R}=je(n);return(T,y)=>{const j=ge,x=en,M=ae,N=Ce,O=ce,F=_n,q=fa;return s(),l(B,null,[t("div",pa,[t("div",ga,[t("div",xa,[t("span",va,[y[5]||(y[5]=$(" Baseline ",-1)),r(j,{topic:"cluster.baseline"})]),r(x,{modelValue:e(m),"onUpdate:modelValue":y[0]||(y[0]=V=>J(m)?m.value=V:null),"cluster-id":e(I)},null,8,["modelValue","cluster-id"]),e(w)?(s(),S(N,{key:0,text:"Baseline commit pinned for this cluster"},{default:p(()=>[r(M,{name:"i-lucide-pin",class:"size-3.5 text-primary shrink-0"})]),_:1})):u("",!0),t("div",ha,[e(C).length?(s(),l("div",ya,[r(M,{name:"i-lucide-git-commit-horizontal",class:"size-3"}),t("span",null,o(e(C).length)+" commit"+o(e(C).length===1?"":"s"),1),t("button",{class:"ml-0.5 hover:opacity-70 transition-opacity",onClick:y[1]||(y[1]=V=>C.value=[])},[r(M,{name:"i-lucide-x",class:"size-3"})])])):u("",!0),r(O,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list",onClick:y[2]||(y[2]=V=>E.value=!0)},{default:p(()=>[...y[6]||(y[6]=[$(" Browse ",-1)])]),_:1}),r(O,{icon:"i-lucide-refresh-cw",size:"xs",color:"neutral",variant:"outline",loading:e(_),onClick:e(z)},null,8,["loading","onClick"])])])]),e(n)?(s(),l("div",_a,[r(M,{name:e(R).icon,class:X(["size-3.5 mt-0.5 shrink-0",e(R).color])},null,8,["name","class"]),t("div",null,[t("span",{class:X(e(R).color)},o(e(R).text),3),e(R).detail?(s(),l("span",ka,"— "+o(e(R).detail),1)):u("",!0)])])):u("",!0),e(_)&&!e(c)?(s(),l("div",ba,[r(M,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):e(c)?(s(),S(F,{key:2,changes:e(c)},null,8,["changes"])):e(n)&&!e(_)&&!e(c)?(s(),l("p",$a," No changes found in this range. ")):u("",!0)]),r(q,{open:e(E),"onUpdate:open":y[3]||(y[3]=V=>J(E)?E.value=V:null),"cluster-id":e(I),"initial-selected":e(C),"auto-selected-shas":e(d),onConfirm:y[4]||(y[4]=V=>C.value=V)},null,8,["open","cluster-id","initial-selected","auto-selected-shas"])],64)}}}),wa=Object.assign(Ca,{__name:"ClusterInvestigation"}),Sa={class:"flex flex-col h-[60vh]"},Ta={class:"flex items-center gap-3 px-4 py-2.5 border-b border-default text-sm shrink-0"},ja={key:0,class:"ml-auto text-xs text-gray-500"},Ia={class:"flex-1 overflow-y-auto"},Ra={class:"w-full text-sm"},za=["onClick"],Ua={class:"px-4 py-2.5"},Va=["checked","onChange"],Aa={class:"px-2 py-2.5 min-w-0"},Ea={class:"truncate font-medium text-gray-800 dark:text-gray-200 max-w-[24rem]"},Ma={class:"px-2 py-2.5 text-gray-500 text-xs max-w-[16rem] hidden sm:table-cell"},La={class:"px-2 py-2.5 text-right text-gray-500 text-xs"},Na={key:0},Fa={class:"shrink-0 border-t border-default px-4 py-3 space-y-1.5"},Ba={key:0,class:"shrink-0 px-4 pb-3 flex items-center gap-1.5 text-xs text-red-500"},Da={class:"flex items-center gap-3 w-full"},Pa=Y({__name:"ClusterExtractCasesModal",props:{open:{type:Boolean},clusterId:{},affectedTestCases:{},projectKey:{},projectName:{}},emits:["update:open","extracted"],setup(a,{emit:I}){const m=a,C=I,d=ct(),w=g(new Set),n=g(""),c=g(!1),_=g(null);function z(){w.value=new Set(m.affectedTestCases.map(j=>j.testCaseId))}function E(){w.value=new Set}function R(j){const x=new Set(w.value);x.has(j)?x.delete(j):x.add(j),w.value=x}oe(()=>m.open,j=>{j&&(E(),n.value="",_.value=null)});const T=D(()=>w.value.size);async function y(){if(T.value!==0){c.value=!0,_.value=null;try{await $fetch(`/api/failure-clusters/${m.clusterId}/extract-cases`,{method:"POST",body:{testCaseIds:[...w.value],triageNote:n.value.trim()||void 0}}),d.add({title:`Extracted ${T.value} test ${T.value===1?"case":"cases"}`,color:"success"}),C("extracted"),C("update:open",!1)}catch(j){_.value=de(j)}finally{c.value=!1}}}return(j,x)=>{const M=be,N=xe,O=we,F=ae,q=ce,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":x[4]||(x[4]=P=>C("update:open",P))},{body:p(()=>[t("div",Sa,[t("div",Ta,[t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:z},"Select all"),x[5]||(x[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",ja,o(e(T))+" selected ",1)):u("",!0)]),t("div",Ia,[t("table",Ra,[x[8]||(x[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,Q(a.affectedTestCases,P=>(s(),l("tr",{key:P.testCaseId,class:"border-b border-default/50 hover:bg-elevated transition-colors cursor-pointer",onClick:U=>R(P.testCaseId)},[t("td",Ua,[t("input",{type:"checkbox",checked:e(w).has(P.testCaseId),class:"shrink-0 cursor-pointer accent-primary",onClick:x[0]||(x[0]=fe(()=>{},["stop"])),onChange:U=>R(P.testCaseId)},null,40,Va)]),t("td",Aa,[t("p",Ea,o(P.title),1),r(M,{to:`/test-cases/${P.testCaseId}`,class:"text-[10px] text-primary hover:underline mt-0.5 inline-block",onClick:x[1]||(x[1]=fe(()=>{},["stop"]))},{default:p(()=>[...x[6]||(x[6]=[$(" View details ",-1)])]),_:1},8,["to"])]),t("td",Ma,[r(N,{"file-path":P.filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"max-w-full"},null,8,["file-path","project-key","project-name"])]),t("td",La,o(P.runCount),1)],8,za))),128)),a.affectedTestCases.length===0?(s(),l("tr",Na,[...x[7]||(x[7]=[t("td",{colspan:"4",class:"px-4 py-8 text-center text-gray-400 text-sm"},"No test cases in this cluster.",-1)])])):u("",!0)])])]),t("div",Fa,[x[9]||(x[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":x[2]||(x[2]=P=>J(n)?n.value=P:null),placeholder:"Add a note explaining why these tests were extracted…",rows:2,class:"text-sm w-full"},null,8,["modelValue"])]),e(_)?(s(),l("p",Ba,[r(F,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+o(e(_)),1)])):u("",!0)])]),footer:p(()=>[t("div",Da,[x[11]||(x[11]=t("div",{class:"flex-1"},null,-1)),r(q,{color:"neutral",variant:"ghost",disabled:e(c),onClick:x[3]||(x[3]=P=>C("update:open",!1))},{default:p(()=>[...x[10]||(x[10]=[$(" Cancel ",-1)])]),_:1},8,["disabled"]),r(q,{color:"warning",disabled:e(T)===0,loading:e(c),onClick:y},{default:p(()=>[$(" Extract"+o(e(T)>0?` ${e(T)}`:""),1)]),_:1},8,["disabled","loading"])])]),_:1},8,["open"])}}}),Oa=Object.assign(Pa,{__name:"ClusterExtractCasesModal"}),Ha={key:0,class:"flex flex-col h-full min-h-0 max-xl:overflow-y-auto xl:overflow-hidden"},qa={class:"border-b border-default shrink-0"},Ka={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4 p-1 xl:flex-1 xl:min-h-0 xl:overflow-hidden"},Ga={class:"space-y-4 xl:overflow-y-auto"},Wa={class:"font-mono text-xs"},Ja=["innerHTML"],Qa={class:"inline-flex items-center gap-1.5"},Za={class:"xl:overflow-y-auto"},Xa={key:1,class:"flex items-center justify-center h-64 text-gray-500"},Ho=Y({__name:"[id]",async setup(a){let I,m;const C=ut(),d=parseInt(String(C.params.id)),w=Vt(d),{data:n,refresh:c}=([I,m]=dt(()=>Lt(`/api/failure-clusters/${d}`,"$Io0yQjh0TH")),I=await I,m(),I);mt(D(()=>({title:`${n.value?.signature??"Failure cluster"} — Piwi Dashboard`})));const _=g(n.value?.status??"open"),z=g(n.value?.triageNote??""),E=g(!1);oe(()=>n.value?.status,b=>{b&&(_.value=b)}),oe(()=>n.value?.triageNote,b=>{z.value=b??""});const R=D(()=>_.value!==(n.value?.status??"open")||z.value.trim()!==(n.value?.triageNote??""));async function T(){E.value=!0;try{await $fetch(`/api/failure-clusters/${d}/status`,{method:"PATCH",body:{status:_.value,triageNote:z.value.trim()||null}}),c()}finally{E.value=!1}}const y=g(!1);function j(){y.value=!1,c()}const{copyRich:x,copied:M}=Qe();function N(){const b=n.value;if(!b)return;const A=window.location.href,H=le=>le.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),G=[b.errorType,`${b.occurrences} occurrence${b.occurrences===1?"":"s"}`,`${b.affectedTests} test${b.affectedTests===1?"":"s"} affected`,b.status!=="open"?b.status:null].filter(Boolean).join(" · "),W=b.diagnosis?.status==="completed"&&b.diagnosis.summary?`AI diagnosis (${b.diagnosis.category??"unknown"}, ${b.diagnosis.confidence??"?"} confidence): ${b.diagnosis.summary}`:null,te=[`❌ Failure cluster: ${b.signature}`,G,"",...b.sampleError?["Sample error:",ve(b.sampleError),""]:[],...W?[W,""]:[],`Cluster: ${A}`].join(`
|
|
3
|
+
`),se=[`<p><strong>❌ Failure cluster</strong>: <code>${H(b.signature)}</code></p>`,`<p><em>${H(G)}</em></p>`,b.sampleError?`<p><strong>Sample error:</strong></p><pre>${ye(b.sampleError)}</pre>`:"",W?`<p><strong>AI diagnosis</strong> (${H(b.diagnosis?.category??"unknown")}, ${H(b.diagnosis?.confidence??"?")} confidence):<br>${H(b.diagnosis.summary)}</p>`:"",`<p>🔗 <a href="${A}">View failure cluster</a></p>`].join("");x(te,se,{toast:"Failure cluster copied"})}const O=D(()=>{const b=n.value?.sampleError;return b?ve(b).split(`
|
|
4
|
+
`).find(A=>A.trim())??"":""}),{scmStatus:F}=je(w.coverage),q=D(()=>(n.value?.affectedTestCases??[]).map(b=>({filePath:b.filePath,title:b.title,line:null,projectName:null}))),V=D(()=>Et(q.value)),{copy:P,copied:U}=Mt(),f=g(null),v=g(null),L=g(null),K=g(null),Z=g(null),k=g(null),i={sampleError:()=>f.value,executionError:()=>f.value,environmentDiff:()=>K.value,visualDiff:()=>Z.value,domSnapshot:()=>k.value,scmInvestigation:()=>L.value,selectedCommits:()=>L.value,topSuspectedCommit:()=>L.value,failingAction:()=>L.value,affectedTests:()=>v.value,testSource:()=>v.value,sourceFiles:()=>v.value,steps:()=>v.value,failingSteps:()=>v.value,console:()=>v.value,networkRequests:()=>v.value,serverTraces:()=>v.value,ariaSnapshot:()=>v.value,screenshots:()=>v.value,tracePointers:()=>v.value,artifacts:()=>v.value};ft(bt,{canLocate:b=>b in i,open:b=>i[b]?.()?.reveal()});const ee=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 #${d}`}]);return(b,A)=>{const H=Pe,G=Oe,W=st,te=ce,se=Ce,le=gt,h=is,ne=Ze,Ie=Xe,Re=Ye,ze=et,Ue=tt,Ve=xe,Ae=ue,Ee=Tt,Me=Is,Le=ae,Ne=wa,Fe=At,Be=pt,De=Oa;return s(),l(B,null,[r(Be,{id:"failure-cluster-detail"},{header:p(()=>[r(le,null,{leading:p(()=>[r(H),r(G,{items:e(ee)},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"])):u("",!0),e(n)?(s(),S(se,{key:1,text:e(M)?"Copied!":"Copy failure cluster"},{default:p(()=>[r(te,{size:"sm",variant:"ghost",color:"neutral",icon:e(M)?"i-lucide-check":"i-lucide-clipboard",onClick:N},null,8,["icon"])]),_:1},8,["text"])):u("",!0)]),_:1})]),body:p(()=>[e(n)?(s(),l("div",Ha,[t("div",qa,[r(h,{cluster:e(n),"triage-status":e(_),"triage-note":e(z),"triage-saving":e(E),"triage-changed":e(R),"onUpdate:triageStatus":A[0]||(A[0]=re=>_.value=re),"onUpdate:triageNote":A[1]||(A[1]=re=>z.value=re),onSaveTriage:T},null,8,["cluster","triage-status","triage-note","triage-saving","triage-changed"])]),t("div",Ka,[t("div",Ga,[e(n).sampleError?(s(),S(ne,{key:0,ref_key:"errorSection",ref:f,"storage-key":"cluster-error",icon:"i-lucide-circle-x","icon-class":"text-red-500",title:"Error message"},{folded:p(()=>[t("span",Wa,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,Ja)]),_:1},512)):u("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Ie,{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"])):u("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Re,{key:2,ref_key:"envDiffSection",ref:K,"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"])):u("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(ze,{key:3,ref_key:"visualDiffSection",ref:Z,"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"])):u("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Ue,{key:4,ref_key:"domSnapshotSection",ref:k,"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"])):u("",!0),e(n).affectedTestCases?.length?(s(),S(ne,{key:5,ref_key:"evidenceSection",ref:v,"storage-key":"cluster-evidence",icon:"i-lucide-flask-conical",title:"Test evidence",help:"cluster.evidence"},{folded:p(()=>[$(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(Ve,{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"])):u("",!0)]),actions:p(()=>[r(Ae,{color:"neutral",variant:"subtle",size:"sm"},{default:p(()=>[$(o(e(n).affectedTestCases.length)+" "+o(e(n).affectedTestCases.length===1?"test":"tests"),1)]),_:1}),r(te,{size:"xs",variant:"outline",color:"neutral",icon:e(U)?"i-lucide-check":"i-lucide-play",title:e(U)?"Copied!":("copyPreview"in b?b.copyPreview:e(St))(e(V)),onClick:A[2]||(A[2]=re=>e(P)(e(V),{toast:"Retry command copied"}))},{default:p(()=>[...A[5]||(A[5]=[$(" Copy retry command ",-1)])]),_:1},8,["icon","title"]),r(Ee,{"project-id":e(n).project?.id,"project-label":e(n).project?.name,cases:e(q),label:"Run affected locally","preset-options":{mode:"grep"}},null,8,["project-id","project-label","cases"]),r(se,{text:"Unlink incorrectly clustered test cases from this group"},{default:p(()=>[r(te,{size:"xs",color:"warning",variant:"outline",icon:"i-lucide-arrow-up-from-line",onClick:A[3]||(A[3]=re=>y.value=!0)},{default:p(()=>[...A[6]||(A[6]=[$(" Extract ",-1)])]),_:1})]),_:1})]),default:p(()=>[r(Me,{"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)):u("",!0),r(ne,{ref_key:"scmSection",ref:L,"storage-key":"cluster-scm",icon:"i-lucide-git-compare-arrows",title:"What changed",help:"cluster.scm"},{folded:p(()=>[t("span",Qa,[r(Le,{name:e(F).icon,class:X(["size-3.5 shrink-0",e(F).color])},null,8,["name","class"]),t("span",{class:X(e(F).color)},o(e(F).text),3)])]),default:p(()=>[r(Ne)]),_:1},512)]),t("div",Za,[r(Fe,{"cluster-id":e(d),"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",Xa,"Cluster not found."))]),_:1}),e(n)?(s(),S(De,{key:0,open:e(y),"cluster-id":e(d),"affected-test-cases":e(n).affectedTestCases??[],"project-key":e(n).project?.id,"project-name":e(n).project?.name,"onUpdate:open":A[4]||(A[4]=re=>y.value=re),onExtracted:j},null,8,["open","cluster-id","affected-test-cases","project-key","project-name"])):u("",!0)],64)}}});export{Ho as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as W,o as a,e as m,y as x,b as e,f as u,V as M,_ as v,l as s,v as n,k as y,K as L,x as D,h as C,c as _,t as p,g as E,F as N,z as U,r as k,j as H}from"./BzBaMPgu.js";import{H as w}from"./BcHU1KNK.js";import{a as G}from"./CDEmotIt.js";const B="https://piwitests.github.io";function X(t){return`${B}/${t.replace(/^\//,"")}`}const Y=W({__name:"DocLink",props:{to:{},noIcon:{type:Boolean}},setup(t){const r=t,h=n(()=>X(r.to));return(c,o)=>{const g=v,I=x;return a(),m(I,{to:e(h),target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:u(()=>[M(c.$slots,"default",{},()=>[o[0]||(o[0]=y("Learn more",-1))]),t.noIcon?s("",!0):(a(),m(g,{key:0,name:"i-lucide-external-link",class:"w-3.5 h-3.5 shrink-0"}))]),_:3},8,["to"])}}}),V=Object.assign(Y,{__name:"DocLink"}),P={PIWI_SITE_URL:{description:"Public base URL of the instance (e.g. https://piwi.example.com). Used to build links in emails.",category:"general",type:"url",example:"https://piwi.example.com",notes:"When unset, links in emails point to http://localhost:3000 and OAuth callback URLs are inferred from the request host — set it when running behind a reverse proxy."},PIWI_SECRET_KEY:{description:"Master key for AES-256-GCM encryption of secrets stored in the database (AI API keys, webhook/SCM secrets). Strongly recommended in production.",category:"general",secret:!0,example:"a 64-char random hex string",notes:"Falls back to an insecure built-in development key (with a startup warning in production). Generate one with `node -e \"console.log(require('node:crypto').randomBytes(32).toString('hex'))\"`."},PIWI_BUILD_DIR:{description:"Overrides the Nuxt build output directory. Used by the test harness to isolate parallel builds.",category:"build",runtimeOnly:!0,type:"path"},PIWI_BUILD_SHA:{description:"Commit SHA baked into the build for provenance. Shown on Settings → About. Set as a build-time arg.",category:"build",runtimeOnly:!0},PIWI_DESKTOP_TOKEN:{description:"Per-install access token the desktop (Tauri) app injects to gate its local server. Set automatically by the desktop shell — not user-configurable. Absent on the server build.",category:"desktop",secret:!0,runtimeOnly:!0,since:"0.16.0"},PIWI_DATABASE_PATH:{description:"Path to the SQLite database file (used when PIWI_DATABASE_URL is not set).",category:"database",type:"path",default:".data/piwi.db",relevantWhen:{PIWI_DATABASE_URL:""}},PIWI_DATABASE_URL:{description:"PostgreSQL connection string. When set, PostgreSQL is used instead of SQLite and migrations run automatically on startup.",category:"database",secret:!0,example:"postgres://piwi:piwi@db:5432/piwi",docs:"deployment#docker-compose-with-postgresql"},PIWI_RETENTION_DAYS:{description:"Days of test-run history the nightly retention sweep keeps. Unset or 0 disables automatic run pruning (the default — pruning is opt-in).",category:"database",type:"number",min:0,docs:"storage#data-retention"},PIWI_RETENTION_NOTIFICATION_DAYS:{description:"Days to keep sent/failed notification outbox rows before the nightly sweep prunes them (default 30; 0 keeps them forever).",category:"database",type:"number",default:"30",min:0},PIWI_RETENTION_DIAGNOSIS_VERSIONS:{description:"AI-diagnosis history versions kept per diagnosis by the nightly sweep (default 20; 0 disables capping).",category:"database",type:"number",default:"20",min:0},PIWI_STORAGE_TYPE:{description:'Storage backend for test artifacts (HTML reports, traces, attachments): "local" or "s3".',category:"storage",type:"enum",enum:["local","s3"],default:"local",notes:"Only the exact value `s3` selects S3; any other value falls back to local storage."},PIWI_STORAGE_PATH:{description:'Directory for local file storage (when PIWI_STORAGE_TYPE is "local").',category:"storage",type:"path",default:".data/storage",relevantWhen:{PIWI_STORAGE_TYPE:"local"}},PIWI_S3_BUCKET:{description:'S3 bucket name for artifact storage (when PIWI_STORAGE_TYPE is "s3").',category:"storage",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"},docs:"storage#s3-compatible-storage"},PIWI_S3_REGION:{description:'S3 bucket region (when PIWI_STORAGE_TYPE is "s3").',category:"storage",example:"us-east-1",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_ACCESS_KEY_ID:{description:"S3 access key id with write access to the bucket.",category:"storage",secret:!0,relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_SECRET_ACCESS_KEY:{description:"S3 secret access key.",category:"storage",secret:!0,relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_ENDPOINT:{description:"Custom endpoint for S3-compatible services (MinIO, R2, Spaces).",category:"storage",type:"url",example:"https://minio.example.com",relevantWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_FORCE_PATH_STYLE:{description:"Use path-style addressing (required by some S3-compatible services).",category:"storage",type:"boolean",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},notes:"Defaults to on when a custom endpoint is set, off otherwise; only the exact value `false` turns it off explicitly."},PIWI_AUTH_ENABLED:{description:'Set to "true" to enable role-based access control and API keys. Off by default.',category:"auth",type:"boolean",default:"false"},PIWI_AUTH_SECRET:{description:"Secret used to sign/encrypt session cookies. Required when PIWI_AUTH_ENABLED is true.",category:"auth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_AUTH_ENABLED:"true"},notes:"The server refuses to start when auth is enabled and this is unset."},PIWI_OAUTH_GOOGLE_CLIENT_ID:{description:"Google OAuth client id (optional single sign-on).",category:"oauth",relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GOOGLE_CLIENT_SECRET:"*"},docs:"authentication#oauth-google-github"},PIWI_OAUTH_GOOGLE_CLIENT_SECRET:{description:"Google OAuth client secret.",category:"oauth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GOOGLE_CLIENT_ID:"*"}},PIWI_OAUTH_GITHUB_CLIENT_ID:{description:"GitHub OAuth client id (optional single sign-on).",category:"oauth",relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GITHUB_CLIENT_SECRET:"*"},docs:"authentication#oauth-google-github"},PIWI_OAUTH_GITHUB_CLIENT_SECRET:{description:"GitHub OAuth client secret.",category:"oauth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GITHUB_CLIENT_ID:"*"}},PIWI_OAUTH_ALLOWED_DOMAINS:{description:"Comma-separated verified email domains allowed to sign in via OAuth (all providers).",category:"oauth",type:"list",example:"example.com,corp.example.com",relevantWhen:{PIWI_AUTH_ENABLED:"true"},notes:"Only verified emails in these domains are accepted. Empty means no domain restriction."},PIWI_OAUTH_GITHUB_ALLOWED_ORGS:{description:"Comma-separated GitHub org logins a user must belong to (requests read:org scope).",category:"oauth",type:"list",relevantWhen:{PIWI_OAUTH_GITHUB_CLIENT_ID:"*"}},PIWI_AI_PROVIDER:{description:'AI provider for failure diagnosis: "anthropic" or "openai" (OpenAI-compatible).',category:"ai",type:"enum",enum:["anthropic","openai"]},PIWI_AI_API_KEY:{description:"API key for the diagnosis provider. Takes precedence over the DB-stored key.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"anthropic"},notes:"Optional for OpenAI-compatible providers that need no key (e.g. a local model)."},PIWI_AI_MODEL:{description:"Diagnosis model name (default: claude-opus-4-8 for Anthropic).",category:"ai",example:"claude-opus-4-8",relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"openai"}},PIWI_AI_BASE_URL:{description:"Base URL for OpenAI-compatible providers (e.g. http://localhost:11434/v1).",category:"ai",type:"url",example:"http://localhost:11434/v1",relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"openai"}},PIWI_AI_AUTO_DIAGNOSE:{description:'Set to "true" to auto-diagnose new failure clusters when a run finishes.',category:"ai",type:"boolean",default:"false",relevantWhen:{PIWI_AI_PROVIDER:"*"}},PIWI_AI_AUTO_DIAGNOSE_MAX:{description:"Max clusters auto-diagnosed per finished run (budget cap; default 3).",category:"ai",type:"number",default:"3",min:1,relevantWhen:{PIWI_AI_AUTO_DIAGNOSE:"true"}},PIWI_AI_RESEARCH_PROVIDER:{description:"Provider for the optional research (pre-analysis) stage. Falls back to PIWI_AI_PROVIDER.",category:"ai",type:"enum",enum:["anthropic","openai"],relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_RESEARCH_MODEL:{description:"Cheaper/faster model for the research stage. Empty disables the two-stage pipeline.",category:"ai",relevantWhen:{PIWI_AI_PROVIDER:"*"}},PIWI_AI_RESEARCH_BASE_URL:{description:"Base URL for the research-stage provider. Falls back to PIWI_AI_BASE_URL.",category:"ai",type:"url",relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_RESEARCH_API_KEY:{description:"API key for the research-stage provider. Falls back to PIWI_AI_API_KEY.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_EMBEDDING_PROVIDER:{description:"Provider for embeddings (semantic failure clustering). Falls back to PIWI_AI_PROVIDER.",category:"ai",type:"enum",enum:["openai"],relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:'Must resolve to an OpenAI-compatible provider — Anthropic has no embeddings API — so the fallback only helps when the main provider is "openai".'},PIWI_AI_EMBEDDING_MODEL:{description:"Embedding model name (e.g. text-embedding-3-small).",category:"ai",example:"text-embedding-3-small",relevantWhen:{PIWI_AI_PROVIDER:"*"},notes:"Empty disables semantic clustering (and the embedding fallbacks)."},PIWI_AI_EMBEDDING_BASE_URL:{description:"Base URL for the embedding provider. Falls back to PIWI_AI_BASE_URL.",category:"ai",type:"url",relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"}},PIWI_AI_EMBEDDING_API_KEY:{description:"API key for the embedding provider. Falls back to PIWI_AI_API_KEY.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"}},PIWI_AI_MAX_SAMPLE_ERROR_CHARS:{description:"Max characters of raw error text (per error block).",category:"ai-limits",type:"number",default:"10000",min:200,max:5e4},PIWI_AI_MAX_SCM_PATCH_BUDGET:{description:"Total characters of diff patches across changed files.",category:"ai-limits",type:"number",default:"15000",min:0,max:5e4},PIWI_AI_MAX_AFFECTED_TESTS:{description:"Max affected tests listed in the diagnosis context.",category:"ai-limits",type:"number",default:"30",min:1,max:200},PIWI_AI_MAX_STEPS:{description:"Max recent test steps included.",category:"ai-limits",type:"number",default:"50",min:1,max:200},PIWI_AI_MAX_CONSOLE_ENTRIES:{description:"Max console error/warning entries included.",category:"ai-limits",type:"number",default:"30",min:0,max:200},PIWI_AI_MAX_CONSOLE_ENTRY_CHARS:{description:"Max characters per console entry.",category:"ai-limits",type:"number",default:"1000",min:50,max:5e3},PIWI_AI_MAX_NETWORK_REQUESTS:{description:"Max failed network requests included.",category:"ai-limits",type:"number",default:"25",min:0,max:200},PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS:{description:"Max characters of the page ARIA snapshot.",category:"ai-limits",type:"number",default:"12000",min:0,max:5e4},PIWI_AI_MAX_TEST_SOURCE_CHARS:{description:"Max characters of the test source snippet.",category:"ai-limits",type:"number",default:"8000",min:0,max:5e4},PIWI_AI_MAX_SOURCE_FILES:{description:"Max full source files fetched from SCM to ground patches (0 disables).",category:"ai-limits",type:"number",default:"4",min:0,max:20},PIWI_AI_MAX_SOURCE_FILE_CHARS:{description:"Max characters per fetched full source file.",category:"ai-limits",type:"number",default:"12000",min:0,max:5e4},PIWI_AI_MAX_SERVER_LOG_ENTRIES:{description:"Max backend server log entries (from X-Piwi-Logs header) included.",category:"ai-limits",type:"number",default:"50",min:0,max:200},PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS:{description:"Max characters per backend server log entry.",category:"ai-limits",type:"number",default:"1000",min:50,max:5e3},PIWI_AI_MAX_SERVER_TRACE_SPANS:{description:"Max backend server spans (from X-Piwi-Trace header) included in AI diagnosis (0 disables).",category:"ai-limits",type:"number",default:"40",min:0,max:500,since:"0.16.0"},PIWI_AI_MAX_STEP_INTENTS:{description:"Max AI-step intent mappings (natural-language prompt → compiled locator) included in a diagnosis (0 disables the section).",category:"ai-limits",type:"number",default:"20",min:0,max:100,since:"0.24.0"},PIWI_AI_STEP_MAX_SNAPSHOT_CHARS:{description:"Max characters of the page ARIA snapshot the reporter sends per AI-step authoring iteration.",category:"ai-steps",type:"number",default:"24000",min:0,max:1e5,since:"0.24.0"},PIWI_AI_STEP_MAX_OUTPUT_TOKENS:{description:"Max output tokens the model may return per AI-step authoring iteration. Reasoning models count hidden chain-of-thought against this, so raise it (up to 8192) when authoring with one.",category:"ai-steps",type:"number",default:"1024",min:256,max:8192,since:"0.24.0"},PIWI_AI_MAX_IMAGES:{description:"Max screenshots auto-included in the diagnosis context.",category:"ai-limits",type:"number",default:"5",min:0,max:20},PIWI_AI_MAX_PASSED_PEERS:{description:"Max peer tests in the same file listed when they passed.",category:"ai-limits",type:"number",default:"20",min:0,max:100},PIWI_AI_MAX_CONSOLE_WINDOW:{description:"Max console entries of any type in the window before failure.",category:"ai-limits",type:"number",default:"50",min:0,max:200},PIWI_AI_SLOW_REQUEST_MS:{description:"Network request duration (ms) threshold for flagging as slow.",category:"ai-limits",type:"number",default:"1500",min:100,max:3e4},PIWI_AI_MAX_TRACE_ACTIONS:{description:"Max actions extracted from trace ZIP for failing-action context (0 disables).",category:"ai-limits",type:"number",default:"10",min:0,max:50},PIWI_AI_TRACE_DOM_CHARS:{description:"Max characters for the trace-derived DOM/ARIA excerpt in failing-action context.",category:"ai-limits",type:"number",default:"6000",min:0,max:2e4},PIWI_AI_MAX_TRACE_STACK_FRAMES:{description:"Max call-stack frames (with source windows) from the trace call-stack section (0 disables).",category:"ai-limits",type:"number",default:"10",min:0,max:50},PIWI_AI_MAX_TRACE_NETWORK_REQUESTS:{description:"Max requests included from the trace network stream (0 disables).",category:"ai-limits",type:"number",default:"20",min:0,max:200},PIWI_AI_MAX_DOM_SNAPSHOT_CHARS:{description:"Max characters of the failure-time DOM snapshot rendered from the trace (0 disables).",category:"ai-limits",type:"number",default:"8000",min:0,max:5e4},PIWI_AI_IMAGE_MAX_EDGE:{description:"Screenshots are downscaled to at most this many pixels on the long edge before being sent.",category:"ai-limits",type:"number",default:"1920",min:512,max:8192},PIWI_INGEST_MAX_CONSOLE_ENTRIES:{description:"Max console entries stored per test execution.",category:"ingest",type:"number",default:"200",min:10,max:5e3},PIWI_IMPORT_MAX_BYTES:{description:"Max size of a single multipart upload (report upload or blob-report import), in bytes. Lower it to match a reverse proxy that rejects large bodies, so the import page rejects an oversized archive before uploading it.",category:"ingest",type:"number",default:String(500*1024*1024),min:1024*1024,max:5*1024*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_INLINE_BYTES:{description:"Max size of a single evidence file embedded as a data: URI in an HTML export, in bytes. Larger files are left out of the single-file HTML (and listed as omitted); the ZIP export still carries them at full size.",category:"export",type:"number",default:String(8*1024*1024),min:64*1024,max:512*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_BYTES:{description:"Max total size of one export, in bytes. Evidence is added largest-last until the budget is reached; the rest is listed as omitted. The archive is built in memory, so this also bounds what a single export costs the server.",category:"export",type:"number",default:String(500*1024*1024),min:1024*1024,max:4*1024*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_CASES:{description:"Max member executions carrying full evidence in a failure-cluster export. Remaining affected tests are listed by name without their evidence.",category:"export",type:"number",default:"25",min:1,max:200,since:"0.19.0"},PIWI_INGEST_MAX_CONSOLE_ENTRY_CHARS:{description:"Max characters stored per console entry.",category:"ingest",type:"number",default:"2000",min:200,max:2e4},PIWI_INGEST_MAX_STEPS:{description:"Max test steps stored per execution.",category:"ingest",type:"number",default:"500",min:20,max:5e3},PIWI_INGEST_MAX_STEP_EVENTS:{description:"Max step events stored per execution.",category:"ingest",type:"number",default:"1000",min:20,max:1e4},PIWI_INGEST_MAX_ARIA_CHARS:{description:"Max characters of the ARIA snapshot stored per failing execution.",category:"ingest",type:"number",default:"100000",min:1e3,max:1e6},PIWI_INGEST_MAX_ERROR_CHARS:{description:"Max characters of error text stored per execution (head and tail are kept).",category:"ingest",type:"number",default:"20000",min:1e3,max:1e5},PIWI_INGEST_MAX_SAMPLE_ERROR_CHARS:{description:"Max characters of the sample error stored per failure cluster.",category:"ingest",type:"number",default:"50000",min:1e3,max:2e5},PIWI_INGEST_MAX_TEST_SOURCE_CHARS:{description:"Max characters of the test source snippet stored per failing execution.",category:"ingest",type:"number",default:"50000",min:1e3,max:2e5},PIWI_INGEST_MAX_SOURCE_FRAMES:{description:"Max source stack frames stored per failing execution.",category:"ingest",type:"number",default:"8",min:1,max:32},PIWI_INGEST_MAX_SOURCE_FRAME_CHARS:{description:"Max characters per stored source frame snippet.",category:"ingest",type:"number",default:"4000",min:500,max:2e4},PIWI_AUTO_MARKERS:{description:"Automatically create a timeline marker when a run’s environment, Playwright version, or reporter version changes from the previous run (default: enabled). Set to false to disable.",category:"markers",type:"boolean",default:"true",docs:"timeline-markers",notes:"Only the exact value `false` disables auto-markers."},PIWI_TEST_LOGS_DISABLED:{description:"Disable X-Piwi-Logs response header emission (default: auto-disabled in production, enabled in development).",category:"testing",type:"boolean",docs:"backend-logs",notes:"Unset: capture is on in development and off in production builds; `true` forces it off everywhere, `false` forces it on even in production."},PIWI_CLUSTER_SIMILARITY_THRESHOLD:{description:"Cosine similarity (0–1) above which two failure embeddings merge into one cluster.",category:"clustering",type:"number",default:"0.92",min:0,max:1,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:"Must be greater than 0 and at most 1; invalid values fall back to the default."},PIWI_CLUSTER_SUGGEST_THRESHOLD:{description:"Similarity at which a failure is suggested (not auto-merged) as related to a cluster.",category:"clustering",type:"number",default:"0.80",min:0,max:1,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:"Capped at the merge threshold."},PIWI_SMTP_HOST:{description:"SMTP server hostname for outbound email.",category:"smtp",example:"smtp.example.com"},PIWI_SMTP_PORT:{description:"SMTP port (default 587; 465 for implicit TLS).",category:"smtp",type:"number",default:"587",min:1,max:65535,relevantWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_USER:{description:"SMTP username.",category:"smtp",relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_PASS:{description:"SMTP password. Never returned by the API.",category:"smtp",secret:!0,relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_FROM:{description:"From address for outbound email (e.g. noreply@example.com).",category:"smtp",example:"noreply@example.com",relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_FROM_NAME:{description:"Display name for the from address (optional).",category:"smtp",default:"Piwi Dashboard",relevantWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_SECURE:{description:'Set to "true" for implicit TLS on port 465 (default false → STARTTLS/plain).',category:"smtp",type:"boolean",relevantWhen:{PIWI_SMTP_HOST:"*"},notes:"Defaults to on when the port is 465, off otherwise."},PIWI_WASTED_WAIT_PATTERNS:{description:"Glob patterns (comma or newline separated) defining which wait steps count as wasted time. Locks the UI when set.",category:"wasted-time",type:"list",default:"Wait for timeout*,*waitForTimeout*",notes:"Case-insensitive globs (`*` and `?`) matched against a wait step’s title or source location. Use `*` to count every wait."},PIWI_DEMO_MODE:{description:'Set to "true" to build the standalone client-side demo SPA (no server).',category:"demo",runtimeOnly:!0,type:"boolean"},PIWI_BASE_URL:{description:"Base URL the metadata test spec targets (defaults to http://localhost:3000).",category:"test",runtimeOnly:!0},PIWI_POSTGRES_TEST_URL:{description:"PostgreSQL connection string used by the Postgres test suite.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_BUCKET:{description:"S3 bucket for the storage integration tests.",category:"test",runtimeOnly:!0},PIWI_S3_TEST_REGION:{description:"Region for the S3 storage integration tests.",category:"test",runtimeOnly:!0},PIWI_S3_TEST_ACCESS_KEY_ID:{description:"Access key id for the S3 storage integration tests.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_SECRET_ACCESS_KEY:{description:"Secret access key for the S3 storage integration tests.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_ENDPOINT:{description:"Custom endpoint for the S3 storage integration tests.",category:"test",runtimeOnly:!0},PIWI_MAILPIT_URL:{description:"Mailpit base URL; when set, the email/notification E2E tests run against it.",category:"test",runtimeOnly:!0},PIWI_MAILPIT_SMTP_PORT:{description:"SMTP port the email E2E tests send to (Mailpit).",category:"test",runtimeOnly:!0},PIWI_EMAIL_SERVER_URL:{description:"Base URL the email test spec targets.",category:"test",runtimeOnly:!0},PIWI_TEST_CLEANUP_ENABLED:{description:"Allow the E2E cleanup endpoint (`DELETE /api/tests/cleanup`) on a production build, which CI needs because it runs the suite against one. Never set it on a real deployment.",category:"test",runtimeOnly:!0,type:"boolean",since:"0.19.0"}};function T(t){return P[t]}function oe(t){return Object.keys(P).filter(r=>P[r].category===t)}const q={key:0,class:"font-medium mb-1"},F={class:"text-muted"},K={key:1,class:"mt-2 space-y-1"},$={class:"text-muted text-xs"},z={class:"flex flex-col gap-1.5"},Q=["title","onClick"],j={class:"block font-mono text-xs bg-elevated rounded px-1.5 py-0.5 select-all cursor-pointer group-hover:ring-1 ring-default"},Z={key:0,class:"block text-muted text-[11px] mt-0.5"},J={key:2,class:"mt-2 flex flex-col gap-1"},ee=W({__name:"HelpHint",props:{topic:{},title:{},text:{},doc:{},envVars:{},size:{}},setup(t){const r=t,{copy:h}=G(),c=n(()=>r.topic?w[r.topic]:null),o=n(()=>r.title??c.value?.title),g=n(()=>r.text??c.value?.text??""),I=n(()=>r.doc??c.value?.doc),d=n(()=>r.envVars??c.value?.envVars),A=k(!1),S=n(()=>o.value?`Help: ${o.value}`:"Help"),b=n(()=>({side:"bottom","aria-label":S.value}));return(te,l)=>{const R=H,f=V,O=L;return a(),m(O,{open:e(A),"onUpdate:open":l[0]||(l[0]=i=>D(A)?A.value=i:null),content:e(b),ui:{content:"max-w-xs p-3 text-sm"}},{content:u(()=>[e(o)?(a(),_("p",q,p(e(o)),1)):s("",!0),E("p",F,p(e(g)),1),e(d)?.length?(a(),_("div",K,[E("p",$,"Environment variable"+p(e(d).length>1?"s":"")+":",1),E("div",z,[(a(!0),_(N,null,U(e(d),i=>(a(),_("button",{key:i,type:"button",class:"group text-left",title:`Click to copy ${i}`,onClick:ae=>e(h)(i,{toast:`Copied ${i}`})},[E("code",j,p(i),1),e(T)(i).description?(a(),_("span",Z,p(e(T)(i).description),1)):s("",!0)],8,Q))),128))])])):s("",!0),e(I)||e(d)?.length?(a(),_("div",J,[e(I)?(a(),m(f,{key:0,to:e(I)},{default:u(()=>[...l[1]||(l[1]=[y("Learn more",-1)])]),_:1},8,["to"])):s("",!0),e(d)?.length?(a(),m(f,{key:1,to:"configuration"},{default:u(()=>[...l[2]||(l[2]=[y("Configuration reference",-1)])]),_:1})):s("",!0)])):s("",!0)]),default:u(()=>[C(R,{size:t.size??"xs",variant:"ghost",color:"neutral",icon:"i-lucide-circle-help","aria-label":e(S),title:"What is this?",class:"text-muted hover:text-default align-middle"},null,8,["size","aria-label"])]),_:1},8,["open","content"])}}}),se=Object.assign(ee,{__name:"HelpHint"});export{se as _,V as a,X as d,oe as e,T as g};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as Z,a as H}from"./
|
|
1
|
+
import{_ as Z,a as H}from"./D5Mhpp98.js";import{_ as J,a as X}from"./CdLqOMvN.js";import{_ as tt}from"./Cmuwgbf4.js";import{_ as et}from"./BTCWUyBX.js";import{d as U,o as n,e as m,f as l,g as t,h as c,k as o,t as v,j as B,b as i,v as $,q as st,C as ot,c as y,_ as N,r as S,ak as j,s as at,w as I,F as T,l as k,z as nt,i as it,m as rt}from"./BzBaMPgu.js";import{_ as D}from"./D_j436ND.js";import{a as lt,u as P}from"./CDEmotIt.js";import{_ as ct}from"./CkdznmkX.js";import{_ as dt}from"./C8uZoJVq.js";import{_ as ut}from"./D8ixf-ZR.js";import{_ as pt}from"./Hp-_W7z4.js";import{a as mt}from"./qeqzb80l.js";import{_ as _t}from"./kDEwM7SQ.js";import{u as gt}from"./E26Y1NWH.js";import"./DWz_bHNP.js";import"./CdM2qNYM.js";import"./CTYlay1H.js";import"./DDho3MJD.js";import"./WCZdf9Ln.js";import"./Boyv6hLW.js";import"./BcHU1KNK.js";const ft={class:"space-y-4 text-sm"},ht={class:"space-y-1"},yt={class:"space-y-3"},kt={class:"space-y-1"},vt={class:"flex items-start gap-2"},bt={class:"text-xs break-all flex-1"},xt={class:"space-y-1"},wt=`reporter: [
|
|
2
2
|
['@piwitests/reporter', { projectName: 'my-project' }],
|
|
3
3
|
],`,Ct=U({__name:"DesktopReporterCard",props:{url:{},token:{}},setup(x){const r=x,{copy:p}=lt(),g=$(()=>`reporter: [
|
|
4
4
|
['@piwitests/reporter', {
|
|
@@ -6,4 +6,4 @@ import{_ as Z,a as H}from"./DTrPCv7R.js";import{_ as J,a as X}from"./2yLW7WU0.js
|
|
|
6
6
|
projectName: 'my-project',
|
|
7
7
|
apiKey: '${r.token}',
|
|
8
8
|
}],
|
|
9
|
-
],`);return(_,e)=>{const h=tt,w=et,C=T,b=D;return n(),m(b,{icon:"i-lucide-upload",title:"Send results to this app"},{subtitle:l(()=>[...e[1]||(e[1]=[o(" While this app is running, the Playwright reporter finds it on its own — no URL and no token in your config. ",-1)])]),default:l(()=>[t("div",ft,[t("div",ht,[e[2]||(e[2]=t("div",{class:"text-muted"},"playwright.config.ts",-1)),c(h,{code:wt,lang:"typescript"}),e[3]||(e[3]=t("p",{class:"text-muted text-xs"},[o(" The app publishes its address and token to "),t("code",null,"~/.piwi/desktop.json"),o(" while it runs. The reporter reads that file only when your config and environment set no "),t("code",null,"serverUrl"),o(" and no "),t("code",null,"apiKey"),o(", so a project already pointed at another dashboard is never redirected here. ")],-1))]),c(w),t("div",yt,[e[6]||(e[6]=t("p",{class:"text-muted"},[o(" Configure it by hand when discovery cannot apply — tests running as another user, in a container, or with a config that already sets "),t("code",null,"serverUrl"),o(". The token is a local secret: prefer the "),t("code",null,"PIWI_API_KEY"),o(" env var over committing it. ")],-1)),t("div",kt,[e[4]||(e[4]=t("div",{class:"text-muted"},"Access token",-1)),t("div",vt,[t("code",bt,v(x.token),1),c(C,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy access token",onClick:e[0]||(e[0]=u=>i(p)(x.token,{toast:!0}))})])]),t("div",xt,[e[5]||(e[5]=t("div",{class:"text-muted"},"playwright.config.ts",-1)),c(h,{code:i(g),lang:"typescript"},null,8,["code"])])])])]),_:1})}}}),St=Object.assign(Ct,{__name:"DesktopReporterCard"}),$t={key:0,class:"flex items-center gap-2 text-sm text-muted"},At={key:1,class:"space-y-4"},Lt={class:"flex items-start justify-between gap-4"},jt={class:"flex items-start justify-between gap-4"},It={key:2,class:"space-y-1 text-sm text-muted"},Pt=U({__name:"DesktopServiceCard",setup(x){const r=st(),p=S(!0),g=S(!1),_=S(!1),e=S(!1),h=S(!1);async function w(){const u=j();if(!u){g.value=!1,p.value=!1;return}try{const s=await u.invoke("desktop_get_service_settings");e.value=!!s.run_in_background,h.value=!!s.start_on_login,g.value=!0}catch{g.value=!1}finally{p.value=!1}}ot(w);async function C(u){const s=j();if(s){_.value=!0;try{await s.invoke("desktop_set_run_in_background",{enabled:u}),e.value=u}catch{r.add({title:'Could not update "Run in background"',color:"error"})}finally{_.value=!1}}}async function b(u){const s=j();if(s){_.value=!0;try{await s.invoke("desktop_set_start_on_login",{enabled:u}),h.value=u}catch{r.add({title:'Could not update "Start on login"',color:"error"})}finally{_.value=!1}}}return(u,s)=>{const f=N,a=dt,L=D;return n(),m(L,{icon:"i-lucide-monitor-cog",title:"Desktop app"},{subtitle:l(()=>[...s[0]||(s[0]=[o(" Keep Piwi running in the background and start it automatically when you log in. ",-1)])]),default:l(()=>[i(p)?(n(),y("div",$t,[c(f,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),s[1]||(s[1]=o(" Checking… ",-1))])):i(g)?(n(),y("div",At,[t("div",Lt,[s[2]||(s[2]=t("div",{class:"space-y-0.5"},[t("p",{class:"text-sm font-medium"},"Run in background"),t("p",{class:"text-xs text-muted"},"Closing the window keeps the server running in the tray instead of quitting.")],-1)),c(a,{"model-value":i(e),disabled:i(_),"onUpdate:modelValue":C},null,8,["model-value","disabled"])]),t("div",jt,[s[3]||(s[3]=t("div",{class:"space-y-0.5"},[t("p",{class:"text-sm font-medium"},"Start on login"),t("p",{class:"text-xs text-muted"}," Launch Piwi automatically (hidden in the tray) when you sign in to your computer. ")],-1)),c(a,{"model-value":i(h),disabled:i(_),"onUpdate:modelValue":b},null,8,["model-value","disabled"])])])):(n(),y("div",It,[...s[4]||(s[4]=[t("p",null,"Manage these from the Piwi tray icon:",-1),t("p",{class:"text-xs"},[o(" Right-click the Piwi icon in your system tray for "),t("strong",null,"Run in background"),o(" and "),t("strong",null,"Start on login"),o(". On Windows the icon may be hidden under the “show hidden icons” arrow (▲) next to the clock — drag it onto the taskbar to keep it in view. ")],-1)])]))]),_:1})}}}),Ut=Object.assign(Pt,{__name:"DesktopServiceCard"}),Dt=[{id:"reporter",title:"Results arriving",summary:"Your Playwright runs are reaching this dashboard and their history is being kept.",how:"Follow the four steps above to add the reporter to your Playwright config.",icon:"i-lucide-antenna",doc:"reporter"},{id:"fixtures",title:"Capture fixtures",summary:"Network timing, Web Vitals, console errors and ARIA snapshots, captured per test. Powers slow endpoints, performance trends and the richer AI diagnosis context.",how:'Extend your Playwright `test` with `piwiFixtures` — see "Go further" above.',icon:"i-lucide-radio",doc:"capture-fixtures"},{id:"locator-healing",title:"Locator healing",summary:"When a selector breaks, ranked replacement locators captured from the last passing run — with a recommended fix.",how:"Comes with the capture fixtures; enable those and healing data starts accumulating on passing runs.",icon:"i-lucide-bandage",doc:"capture-fixtures"},{id:"clustering",title:"Failure clustering",summary:"Forty red tests collapsed into the three root causes behind them, each triaged once.",how:"Automatic — clusters form as soon as failures with a shared error fingerprint arrive.",icon:"i-lucide-layers",doc:"ai-diagnosis"},{id:"ai",title:"AI diagnosis",summary:"An LLM you configure explains a cluster against your actual git diff, with its suggested patch validated against your source before you see it.",how:"Configure a provider in Settings — Anthropic, OpenAI, or any OpenAI-compatible endpoint including local models.",icon:"i-lucide-sparkles",doc:"ai-diagnosis",to:"/settings/ai",toLabel:"Configure AI",optional:!0},{id:"scm",title:"Source control",summary:"The commits behind a failure, CODEOWNERS-derived ownership, and pull-request feedback on the branch that broke.",how:"Add a repository access token on the project, or globally in Settings.",icon:"i-lucide-git-branch",doc:"ai-diagnosis",to:"/settings/ai",toLabel:"Add a token",optional:!0},{id:"notifications",title:"Notifications",summary:"Email, Slack, webhook and browser channels, with per-project subscriptions and digests.",how:"Add a channel in Settings, then subscribe the projects you care about.",icon:"i-lucide-bell",doc:"notifications",to:"/settings/notifications",toLabel:"Add a channel",optional:!0},{id:"quarantine",title:"Quarantine",summary:"A known-bad test keeps running and reporting, but stops failing the CI gate — and earns its way out on a passing streak.",how:"Quarantine a test from its test-case page, or from the project's Quarantine tab.",icon:"i-lucide-shield-alert",doc:"flaky-tests",optional:!0},{id:"tags",title:"Tags & ownership",summary:"Playwright's own test tags plus `piwi:owner` / `priority` / `feature` annotations, filterable across the catalog and the flaky leaderboard.",how:"Tag tests in your specs, or define project tags in Settings.",icon:"i-lucide-tags",doc:"reporter",to:"/settings/tags",toLabel:"Manage tags",optional:!0},{id:"markers",title:"Timeline markers",summary:"Your deploys and infrastructure changes overlaid on the trend charts, so a step change has a cause.",how:"Add a marker from a project's Timeline tab.",icon:"i-lucide-git-commit-horizontal",doc:"timeline-markers",optional:!0}],zt={class:"flex flex-col gap-6 w-full lg:max-w-4xl mx-auto"},Bt={class:"flex items-center justify-between gap-3"},Rt={class:"flex items-center gap-3"},Tt={class:"p-2 bg-primary/10 rounded-lg shrink-0"},Nt={key:1,class:"divide-y divide-default"},Ot={class:"flex-1 min-w-0"},Wt={class:"flex items-center gap-2 flex-wrap mb-1"},Mt={class:"font-medium"},Vt={class:"text-sm text-gray-600 dark:text-gray-400"},Et={key:0,class:"text-sm text-dimmed mt-1"},Ft={class:"flex items-center gap-3 mt-2 text-sm"},pe=U({__name:"setup",async setup(x){let r,p;at({title:"Setup — Piwi Dashboard"});const g=gt(),{data:_}=([r,p]=I(()=>P("/api/admin/stats",{immediate:g,default:()=>null},"$euzZjV7JAx")),r=await r,p(),r),{data:e}=([r,p]=I(()=>P("/api/desktop/reporter-config",{immediate:g,default:()=>null},"$8hZyiK3RAW")),r=await r,p(),r),{data:h,status:w}=([r,p]=I(()=>P("/api/setup-status",{lazy:!0,default:()=>({capabilities:[]})},"$f9suaFnWiV")),r=await r,p(),r),C=$(()=>{const f=new Map;for(const a of h.value?.capabilities??[])f.set(a.id,a.active);return f}),b=$(()=>w.value==="pending"&&!h.value?.capabilities.length),u=$(()=>Dt.map(f=>({...f,active:C.value.get(f.id)??!1}))),s=$(()=>u.value.filter(f=>f.active).length);return(f,a)=>{const L=Z,O=H,W=X,M=St,z=T,V=D,E=ct,F=Ut,q=ut,B=N,A=rt,K=pt,Q=mt,Y=_t,G=J;return n(),m(G,{id:"setup"},{header:l(()=>[c(W,null,{leading:l(()=>[c(L),c(O,{items:[{label:"Setup",icon:"i-lucide-rocket",to:"/setup"}]})]),_:1})]),body:l(()=>[t("div",zt,[i(g)?(n(),y(R,{key:0},[i(e)?(n(),m(M,{key:0,url:i(e).url,token:i(e).token},null,8,["url","token"])):k("",!0),c(V,{icon:"i-lucide-plug",title:"Connect an AI assistant (MCP)"},{subtitle:l(()=>[...a[0]||(a[0]=[o(" This app exposes a local MCP endpoint so agents like Claude can query your test results. The MCP server page has the URL and access token for this instance already baked into one-click setup for every client. ",-1)])]),default:l(()=>[c(z,{to:"/mcp",color:"neutral",variant:"soft","trailing-icon":"i-lucide-arrow-right"},{default:l(()=>[...a[1]||(a[1]=[o(" Open MCP setup ",-1)])]),_:1})]),_:1}),i(_)?(n(),m(E,{key:1,database:i(_).databaseLocation,storage:i(_).storageLocation},null,8,["database","storage"])):k("",!0),c(F)],64)):k("",!0),c(q),c(Y,null,{header:l(()=>[t("div",Bt,[t("div",Rt,[t("div",Tt,[c(B,{name:"i-lucide-list-checks",class:"size-5 text-primary"})]),a[2]||(a[2]=t("div",null,[t("h2",{class:"text-xl font-semibold"},"What's switched on"),t("p",{class:"text-sm text-gray-500 dark:text-gray-400"}," Detected from your data, not your config — a capability reads as active once this instance has actually used it. ")],-1))]),i(b)?k("",!0):(n(),m(A,{key:0,color:"neutral",variant:"subtle",class:"shrink-0 max-sm:hidden"},{default:l(()=>[o(v(i(s))+" / "+v(i(u).length),1)]),_:1}))])]),default:l(()=>[i(b)?(n(),m(K,{key:0})):(n(),y("ul",Nt,[(n(!0),y(R,null,nt(i(u),d=>(n(),y("li",{key:d.id,class:"flex gap-4 py-4 first:pt-0 last:pb-0"},[t("div",{class:it(["flex size-9 shrink-0 items-center justify-center rounded-lg",d.active?"bg-success/10 text-success":"bg-elevated text-dimmed"])},[c(B,{name:d.icon,class:"size-5"},null,8,["name"])],2),t("div",Ot,[t("div",Wt,[t("h3",Mt,v(d.title),1),d.active?(n(),m(A,{key:0,color:"success",variant:"subtle",size:"xs"},{default:l(()=>[...a[3]||(a[3]=[o("Active",-1)])]),_:1})):d.optional?(n(),m(A,{key:1,color:"neutral",variant:"subtle",size:"xs"},{default:l(()=>[...a[4]||(a[4]=[o("Optional",-1)])]),_:1})):(n(),m(A,{key:2,color:"warning",variant:"subtle",size:"xs"},{default:l(()=>[...a[5]||(a[5]=[o("Not set up",-1)])]),_:1}))]),t("p",Vt,v(d.summary),1),d.active?k("",!0):(n(),y("p",Et,v(d.how),1)),t("div",Ft,[d.to&&!d.active?(n(),m(z,{key:0,to:d.to,size:"xs",variant:"soft",icon:"i-lucide-settings"},{default:l(()=>[o(v(d.toLabel??"Configure"),1)]),_:2},1032,["to"])):k("",!0),d.doc?(n(),m(Q,{key:1,to:d.doc,class:"text-sm"},{default:l(()=>[...a[6]||(a[6]=[o("Docs",-1)])]),_:1},8,["to"])):k("",!0)])])]))),128))]))]),_:1})])]),_:1})}}});export{pe as default};
|
|
9
|
+
],`);return(_,e)=>{const h=tt,w=et,C=B,b=D;return n(),m(b,{icon:"i-lucide-upload",title:"Send results to this app"},{subtitle:l(()=>[...e[1]||(e[1]=[o(" While this app is running, the Playwright reporter finds it on its own — no URL and no token in your config. ",-1)])]),default:l(()=>[t("div",ft,[t("div",ht,[e[2]||(e[2]=t("div",{class:"text-muted"},"playwright.config.ts",-1)),c(h,{code:wt,lang:"typescript"}),e[3]||(e[3]=t("p",{class:"text-muted text-xs"},[o(" The app publishes its address and token to "),t("code",null,"~/.piwi/desktop.json"),o(" while it runs. The reporter reads that file only when your config and environment set no "),t("code",null,"serverUrl"),o(" and no "),t("code",null,"apiKey"),o(", so a project already pointed at another dashboard is never redirected here. ")],-1))]),c(w),t("div",yt,[e[6]||(e[6]=t("p",{class:"text-muted"},[o(" Configure it by hand when discovery cannot apply — tests running as another user, in a container, or with a config that already sets "),t("code",null,"serverUrl"),o(". The token is a local secret: prefer the "),t("code",null,"PIWI_API_KEY"),o(" env var over committing it. ")],-1)),t("div",kt,[e[4]||(e[4]=t("div",{class:"text-muted"},"Access token",-1)),t("div",vt,[t("code",bt,v(x.token),1),c(C,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy access token",onClick:e[0]||(e[0]=u=>i(p)(x.token,{toast:!0}))})])]),t("div",xt,[e[5]||(e[5]=t("div",{class:"text-muted"},"playwright.config.ts",-1)),c(h,{code:i(g),lang:"typescript"},null,8,["code"])])])])]),_:1})}}}),St=Object.assign(Ct,{__name:"DesktopReporterCard"}),$t={key:0,class:"flex items-center gap-2 text-sm text-muted"},At={key:1,class:"space-y-4"},Lt={class:"flex items-start justify-between gap-4"},jt={class:"flex items-start justify-between gap-4"},It={key:2,class:"space-y-1 text-sm text-muted"},Pt=U({__name:"DesktopServiceCard",setup(x){const r=st(),p=S(!0),g=S(!1),_=S(!1),e=S(!1),h=S(!1);async function w(){const u=j();if(!u){g.value=!1,p.value=!1;return}try{const s=await u.invoke("desktop_get_service_settings");e.value=!!s.run_in_background,h.value=!!s.start_on_login,g.value=!0}catch{g.value=!1}finally{p.value=!1}}ot(w);async function C(u){const s=j();if(s){_.value=!0;try{await s.invoke("desktop_set_run_in_background",{enabled:u}),e.value=u}catch{r.add({title:'Could not update "Run in background"',color:"error"})}finally{_.value=!1}}}async function b(u){const s=j();if(s){_.value=!0;try{await s.invoke("desktop_set_start_on_login",{enabled:u}),h.value=u}catch{r.add({title:'Could not update "Start on login"',color:"error"})}finally{_.value=!1}}}return(u,s)=>{const f=N,a=dt,L=D;return n(),m(L,{icon:"i-lucide-monitor-cog",title:"Desktop app"},{subtitle:l(()=>[...s[0]||(s[0]=[o(" Keep Piwi running in the background and start it automatically when you log in. ",-1)])]),default:l(()=>[i(p)?(n(),y("div",$t,[c(f,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),s[1]||(s[1]=o(" Checking… ",-1))])):i(g)?(n(),y("div",At,[t("div",Lt,[s[2]||(s[2]=t("div",{class:"space-y-0.5"},[t("p",{class:"text-sm font-medium"},"Run in background"),t("p",{class:"text-xs text-muted"},"Closing the window keeps the server running in the tray instead of quitting.")],-1)),c(a,{"model-value":i(e),disabled:i(_),"onUpdate:modelValue":C},null,8,["model-value","disabled"])]),t("div",jt,[s[3]||(s[3]=t("div",{class:"space-y-0.5"},[t("p",{class:"text-sm font-medium"},"Start on login"),t("p",{class:"text-xs text-muted"}," Launch Piwi automatically (hidden in the tray) when you sign in to your computer. ")],-1)),c(a,{"model-value":i(h),disabled:i(_),"onUpdate:modelValue":b},null,8,["model-value","disabled"])])])):(n(),y("div",It,[...s[4]||(s[4]=[t("p",null,"Manage these from the Piwi tray icon:",-1),t("p",{class:"text-xs"},[o(" Right-click the Piwi icon in your system tray for "),t("strong",null,"Run in background"),o(" and "),t("strong",null,"Start on login"),o(". On Windows the icon may be hidden under the “show hidden icons” arrow (▲) next to the clock — drag it onto the taskbar to keep it in view. ")],-1)])]))]),_:1})}}}),Ut=Object.assign(Pt,{__name:"DesktopServiceCard"}),Dt=[{id:"reporter",title:"Results arriving",summary:"Your Playwright runs are reaching this dashboard and their history is being kept.",how:"Follow the four steps above to add the reporter to your Playwright config.",icon:"i-lucide-antenna",doc:"reporter"},{id:"fixtures",title:"Capture fixtures",summary:"Network timing, Web Vitals, console errors and ARIA snapshots, captured per test. Powers slow endpoints, performance trends and the richer AI diagnosis context.",how:'Extend your Playwright `test` with `piwiFixtures` — see "Go further" above.',icon:"i-lucide-radio",doc:"capture-fixtures"},{id:"locator-healing",title:"Locator healing",summary:"When a selector breaks, ranked replacement locators captured from the last passing run — with a recommended fix.",how:"Comes with the capture fixtures; enable those and healing data starts accumulating on passing runs.",icon:"i-lucide-bandage",doc:"capture-fixtures"},{id:"clustering",title:"Failure clustering",summary:"Forty red tests collapsed into the three root causes behind them, each triaged once.",how:"Automatic — clusters form as soon as failures with a shared error fingerprint arrive.",icon:"i-lucide-layers",doc:"ai-diagnosis"},{id:"ai",title:"AI diagnosis",summary:"An LLM you configure explains a cluster against your actual git diff, with its suggested patch validated against your source before you see it.",how:"Configure a provider in Settings — Anthropic, OpenAI, or any OpenAI-compatible endpoint including local models.",icon:"i-lucide-sparkles",doc:"ai-diagnosis",to:"/settings/ai",toLabel:"Configure AI",optional:!0},{id:"scm",title:"Source control",summary:"The commits behind a failure, CODEOWNERS-derived ownership, and pull-request feedback on the branch that broke.",how:"Add a repository access token on the project, or globally in Settings.",icon:"i-lucide-git-branch",doc:"ai-diagnosis",to:"/settings/ai",toLabel:"Add a token",optional:!0},{id:"notifications",title:"Notifications",summary:"Email, Slack, webhook and browser channels, with per-project subscriptions and digests.",how:"Add a channel in Settings, then subscribe the projects you care about.",icon:"i-lucide-bell",doc:"notifications",to:"/settings/notifications",toLabel:"Add a channel",optional:!0},{id:"quarantine",title:"Quarantine",summary:"A known-bad test keeps running and reporting, but stops failing the CI gate — and earns its way out on a passing streak.",how:"Quarantine a test from its test-case page, or from the project's Quarantine tab.",icon:"i-lucide-shield-alert",doc:"flaky-tests",optional:!0},{id:"tags",title:"Tags & ownership",summary:"Playwright's own test tags plus `piwi:owner` / `priority` / `feature` annotations, filterable across the catalog and the flaky leaderboard.",how:"Tag tests in your specs, or define project tags in Settings.",icon:"i-lucide-tags",doc:"reporter",to:"/settings/tags",toLabel:"Manage tags",optional:!0},{id:"markers",title:"Timeline markers",summary:"Your deploys and infrastructure changes overlaid on the trend charts, so a step change has a cause.",how:"Add a marker from a project's Timeline tab.",icon:"i-lucide-git-commit-horizontal",doc:"timeline-markers",optional:!0}],zt={class:"flex flex-col gap-6 w-full lg:max-w-4xl mx-auto"},Rt={class:"flex items-center justify-between gap-3"},Tt={class:"flex items-center gap-3"},Bt={class:"p-2 bg-primary/10 rounded-lg shrink-0"},Nt={key:1,class:"divide-y divide-default"},Ot={class:"flex-1 min-w-0"},Wt={class:"flex items-center gap-2 flex-wrap mb-1"},Mt={class:"font-medium"},Vt={class:"text-sm text-gray-600 dark:text-gray-400"},Et={key:0,class:"text-sm text-dimmed mt-1"},Ft={class:"flex items-center gap-3 mt-2 text-sm"},pe=U({__name:"setup",async setup(x){let r,p;at({title:"Setup — Piwi Dashboard"});const g=gt(),{data:_}=([r,p]=I(()=>P("/api/admin/stats",{immediate:g,default:()=>null},"$euzZjV7JAx")),r=await r,p(),r),{data:e}=([r,p]=I(()=>P("/api/desktop/reporter-config",{immediate:g,default:()=>null},"$8hZyiK3RAW")),r=await r,p(),r),{data:h,status:w}=([r,p]=I(()=>P("/api/setup-status",{lazy:!0,default:()=>({capabilities:[]})},"$f9suaFnWiV")),r=await r,p(),r),C=$(()=>{const f=new Map;for(const a of h.value?.capabilities??[])f.set(a.id,a.active);return f}),b=$(()=>w.value==="pending"&&!h.value?.capabilities.length),u=$(()=>Dt.map(f=>({...f,active:C.value.get(f.id)??!1}))),s=$(()=>u.value.filter(f=>f.active).length);return(f,a)=>{const L=Z,O=H,W=X,M=St,z=B,V=D,E=ct,F=Ut,q=ut,R=N,A=rt,K=pt,Q=mt,Y=_t,G=J;return n(),m(G,{id:"setup"},{header:l(()=>[c(W,null,{leading:l(()=>[c(L),c(O,{items:[{label:"Setup",icon:"i-lucide-rocket",to:"/setup"}]})]),_:1})]),body:l(()=>[t("div",zt,[i(g)?(n(),y(T,{key:0},[i(e)?(n(),m(M,{key:0,url:i(e).url,token:i(e).token},null,8,["url","token"])):k("",!0),c(V,{icon:"i-lucide-plug",title:"Connect an AI assistant (MCP)"},{subtitle:l(()=>[...a[0]||(a[0]=[o(" This app exposes a local MCP endpoint so agents like Claude can query your test results. The MCP server page has the URL and access token for this instance already baked into one-click setup for every client. ",-1)])]),default:l(()=>[c(z,{to:"/mcp",color:"neutral",variant:"soft","trailing-icon":"i-lucide-arrow-right"},{default:l(()=>[...a[1]||(a[1]=[o(" Open MCP setup ",-1)])]),_:1})]),_:1}),i(_)?(n(),m(E,{key:1,database:i(_).databaseLocation,storage:i(_).storageLocation},null,8,["database","storage"])):k("",!0),c(F)],64)):k("",!0),c(q),c(Y,null,{header:l(()=>[t("div",Rt,[t("div",Tt,[t("div",Bt,[c(R,{name:"i-lucide-list-checks",class:"size-5 text-primary"})]),a[2]||(a[2]=t("div",null,[t("h2",{class:"text-xl font-semibold"},"What's switched on"),t("p",{class:"text-sm text-gray-500 dark:text-gray-400"}," Detected from your data, not your config — a capability reads as active once this instance has actually used it. ")],-1))]),i(b)?k("",!0):(n(),m(A,{key:0,color:"neutral",variant:"subtle",class:"shrink-0 max-sm:hidden"},{default:l(()=>[o(v(i(s))+" / "+v(i(u).length),1)]),_:1}))])]),default:l(()=>[i(b)?(n(),m(K,{key:0})):(n(),y("ul",Nt,[(n(!0),y(T,null,nt(i(u),d=>(n(),y("li",{key:d.id,class:"flex gap-4 py-4 first:pt-0 last:pb-0"},[t("div",{class:it(["flex size-9 shrink-0 items-center justify-center rounded-lg",d.active?"bg-success/10 text-success":"bg-elevated text-dimmed"])},[c(R,{name:d.icon,class:"size-5"},null,8,["name"])],2),t("div",Ot,[t("div",Wt,[t("h3",Mt,v(d.title),1),d.active?(n(),m(A,{key:0,color:"success",variant:"subtle",size:"xs"},{default:l(()=>[...a[3]||(a[3]=[o("Active",-1)])]),_:1})):d.optional?(n(),m(A,{key:1,color:"neutral",variant:"subtle",size:"xs"},{default:l(()=>[...a[4]||(a[4]=[o("Optional",-1)])]),_:1})):(n(),m(A,{key:2,color:"warning",variant:"subtle",size:"xs"},{default:l(()=>[...a[5]||(a[5]=[o("Not set up",-1)])]),_:1}))]),t("p",Vt,v(d.summary),1),d.active?k("",!0):(n(),y("p",Et,v(d.how),1)),t("div",Ft,[d.to&&!d.active?(n(),m(z,{key:0,to:d.to,size:"xs",variant:"soft",icon:"i-lucide-settings"},{default:l(()=>[o(v(d.toLabel??"Configure"),1)]),_:2},1032,["to"])):k("",!0),d.doc?(n(),m(Q,{key:1,to:d.doc,class:"text-sm"},{default:l(()=>[...a[6]||(a[6]=[o("Docs",-1)])]),_:1},8,["to"])):k("",!0)])])]))),128))]))]),_:1})])]),_:1})}}});export{pe as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ak as o,q as v,C as y,a as _,r as f,ab as u}from"./BzBaMPgu.js";import{e as k}from"./CdM2qNYM.js";async function w(){const t=o();return t?await t.invoke("desktop_pick_folder"):null}async function C(t){const e=o();if(!e||!t)return null;try{return await e.invoke("desktop_inspect_folder",{path:t})}catch{return null}}function D(t){return!!t&&t.exists&&t.playwrightConfig!=null&&t.playwrightInstalled&&t.reporterInstalled&&t.reporterConfigured}async function h(t){const e=o();if(!e||t==null||t==="")return null;try{return await e.invoke("desktop_get_project_link",{projectId:String(t)})}catch{return null}}async function m(t,e){const r=o();if(!r)throw new Error("not running inside the desktop shell");await r.invoke("desktop_set_project_link",{projectId:String(t),path:e})}function L(t){const e=v(),r=f(!1),c=f(null),l=f(!1);async function s(){c.value=await h(u(t))}y(()=>{r.value=!!o(),r.value&&s()}),_(()=>u(t),()=>{r.value&&s()});async function d(){const i=o(),n=u(t);if(!i||n==null||n==="")return!1;l.value=!0;try{const a=await w();return a?(await i.invoke("desktop_set_project_link",{projectId:String(n),path:a}),await s(),!0):!1}catch(a){return e.add({title:"Could not link the folder",description:k(a),color:"error"}),!1}finally{l.value=!1}}async function p(){const i=o(),n=u(t);if(!(!i||n==null||n==="")){l.value=!0;try{await i.invoke("desktop_set_project_link",{projectId:String(n),path:null}),c.value=null}catch(a){e.add({title:"Could not unlink the folder",description:k(a),color:"error"})}finally{l.value=!1}}}return{available:r,link:c,busy:l,refresh:s,pickAndLink:d,unlink:p}}export{C as a,h as g,D as i,w as p,m as s,L as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ap as s}from"./
|
|
1
|
+
import{ap as s}from"./BzBaMPgu.js";let a=null;function i(){const t=s("ai-status",()=>null);async function u(){t.value===null&&(a||(a=$fetch("/api/ai/status").catch(()=>({configured:!1}))),t.value=await a)}return u(),{aiStatus:t}}export{i as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { al as getFailureCluster, aB as getClusterDiagnosis, aH as getTestRunCase, aI as getTestRunCaseTraces, aJ as getExecutionDiagnosis, aK as classifyEvidenceFile, aL as contentTypeForPath } from '../nitro/nitro.mjs';
|
|
2
2
|
|
|
3
3
|
function caseSlug(title, executionId) {
|
|
4
4
|
const base = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b4 as markers, t as testRuns } from '../nitro/nitro.mjs';
|
|
2
2
|
import { eq, asc, and, lt, desc } from 'drizzle-orm';
|
|
3
3
|
import { D as DEFAULT_MARKER_CATEGORY, M as MARKER_CATEGORY_IDS } from './marker-categories.mjs';
|
|
4
4
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { eq, and, isNull, asc, desc, inArray, gt, sql } from 'drizzle-orm';
|
|
2
|
-
import {
|
|
2
|
+
import { bg as testCases, bq as quarantinedTests, t as testRuns, x as testRunsCases } from '../nitro/nitro.mjs';
|
|
3
3
|
|
|
4
4
|
const RELEASE_AFTER_CONSECUTIVE_PASSES = 5;
|
|
5
5
|
const STREAK_SCAN_LIMIT = 30;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useSlots, computed, unref, mergeProps, withCtx, renderSlot, openBlock, createBlock, createCommentVNode, createVNode, createTextVNode, toDisplayString, Fragment, renderList, useSSRContext } from 'vue';
|
|
2
2
|
import { ssrRenderComponent, ssrRenderSlot, ssrRenderClass, ssrInterpolate, ssrRenderList } from 'vue/server-renderer';
|
|
3
|
-
import { a as useComponentProps, C as useLocale, b as useAppConfig, t as tv, P as Primitive,
|
|
3
|
+
import { a as useComponentProps, C as useLocale, b as useAppConfig, t as tv, P as Primitive, W as _sfc_main$n, k as _sfc_main$p, l as _sfc_main$k } from './server.mjs';
|
|
4
4
|
|
|
5
5
|
const theme = {
|
|
6
6
|
"slots": {
|
|
@@ -476,4 +476,4 @@ _sfc_main.setup = (props, ctx) => {
|
|
|
476
476
|
};
|
|
477
477
|
|
|
478
478
|
export { _sfc_main as _ };
|
|
479
|
-
//# sourceMappingURL=Alert-
|
|
479
|
+
//# sourceMappingURL=Alert-BhTWQzM5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Alert-BhTWQzM5.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Alert-BhTWQzM5.js"],"names":["_sfc_main$1","_sfc_main$2","_sfc_main$3"],"mappings":"","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, computed, mergeProps, unref, useSlots, withCtx, renderSlot, openBlock, createBlock, createCommentVNode, createTextVNode, toDisplayString, createVNode, Fragment, renderList, useSSRContext } from 'vue';
|
|
2
2
|
import { ssrRenderComponent, ssrRenderClass, ssrRenderList, ssrRenderSlot, ssrInterpolate } from 'vue/server-renderer';
|
|
3
|
-
import { a as useComponentProps, D as useForwardProps,
|
|
4
|
-
import { u as useDashboard } from './DashboardSidebarToggle-
|
|
3
|
+
import { a as useComponentProps, D as useForwardProps, a1 as reactiveOmit, C as useLocale, b as useAppConfig, t as tv, l as _sfc_main$k, P as Primitive, q as _sfc_main$l, a2 as pickLinkProps, a3 as _sfc_main$m, k as _sfc_main$p, W as _sfc_main$n, V as get } from './server.mjs';
|
|
4
|
+
import { u as useDashboard } from './DashboardSidebarToggle-DzwsZHVx.mjs';
|
|
5
5
|
|
|
6
6
|
const theme$1 = {
|
|
7
7
|
"base": "hidden lg:flex",
|
|
@@ -519,4 +519,4 @@ _sfc_main.setup = (props, ctx) => {
|
|
|
519
519
|
};
|
|
520
520
|
|
|
521
521
|
export { _sfc_main$1 as _, _sfc_main as a };
|
|
522
|
-
//# sourceMappingURL=Breadcrumb-
|
|
522
|
+
//# sourceMappingURL=Breadcrumb-BJnPB2AW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb-BJnPB2AW.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/Breadcrumb-BJnPB2AW.js"],"names":["_sfc_main$2","_sfc_main$3","_sfc_main$4","_sfc_main$5","_sfc_main$6"],"mappings":"","x_google_ignoreList":[0]}
|
package/.output/server/chunks/build/{BreadcrumbNav-y6nMDYcR.mjs → BreadcrumbNav-C6Cun6tF.mjs}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as _sfc_main$1 } from './Breadcrumb-
|
|
2
|
-
import {
|
|
1
|
+
import { a as _sfc_main$1 } from './Breadcrumb-BJnPB2AW.mjs';
|
|
2
|
+
import { L as _sfc_main$a, l as _sfc_main$k, k as _sfc_main$p } from './server.mjs';
|
|
3
3
|
import { defineComponent, computed, createSlots, renderList, withCtx, renderSlot, unref, createVNode, useSSRContext } from 'vue';
|
|
4
4
|
import { ssrRenderComponent, ssrRenderSlot, ssrInterpolate } from 'vue/server-renderer';
|
|
5
5
|
|
|
@@ -108,4 +108,4 @@ _sfc_main.setup = (props, ctx) => {
|
|
|
108
108
|
const __nuxt_component_3 = Object.assign(_sfc_main, { __name: "BreadcrumbNav" });
|
|
109
109
|
|
|
110
110
|
export { __nuxt_component_3 as _ };
|
|
111
|
-
//# sourceMappingURL=BreadcrumbNav-
|
|
111
|
+
//# sourceMappingURL=BreadcrumbNav-C6Cun6tF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbNav-C6Cun6tF.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/BreadcrumbNav-C6Cun6tF.js"],"names":["_sfc_main$2","_sfc_main$3","_sfc_main$4"],"mappings":"","x_google_ignoreList":[0]}
|