@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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{q as ie,a as H,C as ye,an as he,r as x,v as Q,ao as be,N as Ve,d as _e,b as e,o as m,c as h,h as u,_ as Ce,k,g as a,t as $,f as B,j as ke,F as K,z as oe,i as J,l as T,B as qe,e as G,x as He,H as We,L as Ye}from"./BzBaMPgu.js";import{_ as Xe}from"./qeqzb80l.js";import{i as Ge,g as Ke,f as Qe,d as Je,e as Ze,h as et}from"./RSS6R9Te.js";import{_ as tt}from"./Die1200X.js";import{f as we,n as st}from"./CdM2qNYM.js";import{_ as nt}from"./Db5xe__T.js";import{f as at}from"./D-c8ZSws.js";import{u as ot}from"./zAFiz2Mg.js";import{u as it}from"./DWl73MJR.js";const rt=globalThis.setInterval,re=Symbol("cluster-diagnosis");function lt(g){const b=ie(),o=x(""),r=x(""),C=x([]),S=x([]),_=Q(()=>!!r.value),R=x(null),P=x([]),E=x(0),U=x(0),O=x(null),l=x(null),p=x(!1),s=x(null),i=x(!1);let c=null,f=null,d=!0;function z(){const n={};return o.value.trim()&&(n.baseCommit=o.value.trim()),C.value.length&&(n.selectedCommitShas=C.value),n}async function D(){p.value=!0;try{const n=await $fetch(`/api/failure-clusters/${g}/context`,{query:{...z(),format:"json"}});R.value=n.text,P.value=n.sections,E.value=n.tokenEstimate,U.value=n.imageTokenEstimate??0,O.value=n.coverage,l.value=n.scmChanges??null}catch{R.value="(failed to load context)",P.value=[],E.value=0,U.value=0,O.value=null,l.value=null}finally{p.value=!1}}async function I(n){try{await $fetch(`/api/failure-clusters/${g}/base-commit`,{method:"PATCH",body:{commit:n||null}}),r.value=n}catch{}}function L(){c&&(clearInterval(c),c=null)}function j(){if(c)return;let n=0;c=rt(async()=>{n+=3e3,await q(),(!s.value||s.value.status!=="running"||n>=12e4)&&L()},3e3)}async function q(){try{const n=await $fetch(`/api/failure-clusters/${g}/diagnosis`);s.value=n.diagnosis}catch{}}async function W(n={}){i.value=!0;try{const w=n.force?`/api/failure-clusters/${g}/diagnose?force=true`:`/api/failure-clusters/${g}/diagnose`,F={};n.additionalContext&&(F.additionalContext=n.additionalContext),o.value.trim()&&(F.baseCommit=o.value.trim()),C.value.length&&(F.selectedCommitShas=C.value),n.images?.length&&(F.images=n.images),s.value=await $fetch(w,{method:"POST",body:Object.keys(F).length?F:void 0}),s.value?.status==="running"&&j()}catch(w){w?.statusCode===409?j():b.add({title:"Diagnosis failed",description:String(w?.message??w),color:"error"})}finally{i.value=!1}}return H(o,n=>{d||(f&&clearTimeout(f),f=setTimeout(()=>D(),900),n!==r.value&&I(n))}),H(C,()=>{d||D()},{deep:!0}),H(s,n=>{n?.status==="running"?j():L()}),ye(async()=>{try{const n=await $fetch(`/api/failure-clusters/${g}/diagnosis`);s.value=n.diagnosis,n.manualBaseCommit&&(r.value=n.manualBaseCommit,o.value=n.manualBaseCommit);const w=n.diagnosis?.details;w?.selectedCommitShas&&Array.isArray(w.selectedCommitShas)&&(C.value=w.selectedCommitShas),w?.autoSelectedCommits&&Array.isArray(w.autoSelectedCommits)&&(S.value=w.autoSelectedCommits)}catch{}d=!1,D(),s.value?.status==="running"&&j()}),he(()=>{L(),f&&clearTimeout(f)}),{clusterId:g,baseCommit:o,savedBaseCommit:r,selectedCommitShas:C,autoSelectedCommits:S,baseCommitIsPinned:_,contextText:R,contextSections:P,tokenEstimate:E,imageTokenEstimate:U,coverage:O,scmChanges:l,contextLoading:p,refreshContext:D,diagnosis:s,posting:i,runDiagnosis:W}}function ct(g){const b=lt(g);return Ve(re,b),b}function zs(){const g=be(re);if(!g)throw new Error("useClusterDiagnosis() must be used under a page that called provideClusterDiagnosis()");return g}function ut(g){const b=be(re,null);if(b)return b;if(g==null)throw new Error("useOrProvideClusterDiagnosis() requires a clusterId when used outside provideClusterDiagnosis()");return ct(g)}const dt={key:0,class:"flex items-center gap-1.5 text-xs text-gray-400 py-1"},ft={key:1,class:"space-y-1.5"},mt={class:"flex items-center justify-between"},gt={class:"text-xs font-medium text-gray-500"},pt={class:"text-gray-400 font-normal"},vt={class:"flex gap-0.5"},xt={class:"grid grid-cols-4 gap-1.5"},yt=["onClick"],ht={class:"relative"},bt=["src","alt"],_t={class:"absolute top-0.5 right-0.5"},Ct={class:"px-1 py-0.5 bg-elevated space-y-0.5"},kt=["title"],wt={class:"flex items-center gap-1 flex-wrap"},St={key:0,class:"text-[8px] text-gray-400 leading-tight"},Tt={key:1,class:"text-[8px] text-gray-400 leading-tight truncate"},$t={key:2,class:"text-[8px] text-gray-400 leading-tight ml-auto"},xe=8,Dt=_e({__name:"DiagnosisScreenshots",props:{affectedTestCases:{}},emits:["update:images"],setup(g,{emit:b}){const o=g,r=b,C=qe();async function S(s){const i=(s.type||"image/webp").split(";")[0].trim();return new Promise((c,f)=>{const d=new FileReader;d.onload=()=>{const z=d.result.split(",")[1];z!=null?c({data:z,mediaType:i}):f(new Error("Failed to read blob"))},d.onerror=f,d.readAsDataURL(s)})}const _=x([]),R=x(!1);async function P(){if(!o.affectedTestCases.length)return;R.value=!0,_.value=[];const s=[];for(const i of o.affectedTestCases){if(s.length>=xe)break;try{const c=await $fetch(`/api/test-run-cases/${i.recentTestRunsCaseId}`);for(const f of c.attachments??[]){if(!Ge(f.path,f.contentType))continue;if(s.length>=xe)break;const d=f.name||f.path.split("/").pop()||"screenshot",z=st(f.path,f.contentType,C.app?.baseURL,!0);try{const D=await fetch(z);if(!D.ok)continue;const I=await D.blob(),{data:L,mediaType:j}=await S(I);s.push({src:`data:${j};base64,${L}`,data:L,mediaType:j,name:d,selected:!0,caseTitle:i.title,status:c.status,retries:c.retries,browser:c.browser,startTime:c.testRun?.startTime??null})}catch{}}}catch{}}_.value=s,R.value=!1,E()}function E(){r("update:images",_.value.filter(s=>s.selected).map(({name:s,mediaType:i,data:c})=>({name:s,mediaType:i,data:c})))}function U(s){_.value[s].selected=!_.value[s].selected,E()}function O(){_.value.forEach(s=>s.selected=!0),E()}function l(){_.value.forEach(s=>s.selected=!1),E()}const p=Q(()=>_.value.filter(s=>s.selected).length);return ye(P),(s,i)=>{const c=Ce,f=ke;return e(R)?(m(),h("div",dt,[u(c,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),i[0]||(i[0]=k(" Loading screenshots from test evidence… ",-1))])):e(_).length?(m(),h("div",ft,[a("div",mt,[a("span",gt,[i[1]||(i[1]=k(" Test screenshots ",-1)),a("span",pt,"("+$(e(p))+"/"+$(e(_).length)+" will be sent to AI)",1)]),a("div",vt,[u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:O},{default:B(()=>[...i[2]||(i[2]=[k("All",-1)])]),_:1}),u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:l},{default:B(()=>[...i[3]||(i[3]=[k("None",-1)])]),_:1})])]),a("div",xt,[(m(!0),h(K,null,oe(e(_),(d,z)=>(m(),h("div",{key:z,class:J(["cursor-pointer rounded overflow-hidden border-2 transition-all",d.selected?"border-primary":"border-default opacity-50"]),onClick:D=>U(z)},[a("div",ht,[a("img",{src:d.src,alt:d.name,class:"w-full h-14 object-cover object-top"},null,8,bt),a("div",_t,[u(c,{name:d.selected?"i-lucide-check-circle-2":"i-lucide-circle",class:J(["size-3.5 drop-shadow",d.selected?"text-primary":"text-gray-300"])},null,8,["name","class"])])]),a("div",Ct,[a("p",{class:"text-[9px] text-gray-700 dark:text-gray-300 truncate font-medium leading-tight",title:d.caseTitle},$(d.caseTitle),9,kt),a("div",wt,[a("span",{class:J(["text-[8px] px-1 rounded leading-tight font-medium",d.status==="passed"?"bg-success/15 text-success":d.status==="failed"?"bg-error/15 text-error":"bg-neutral/15 text-gray-500"])},$(d.status),3),d.retries>0?(m(),h("span",St,"retry "+$(d.retries),1)):T("",!0),d.browser?(m(),h("span",Tt,$(d.browser),1)):T("",!0),d.startTime?(m(),h("span",$t,$(e(we)(d.startTime)),1)):T("",!0)])])],10,yt))),128))])])):T("",!0)}}}),At=Object.assign(Dt,{__name:"DiagnosisScreenshots"});function zt(g){const b=x(""),o=x(null),r=x("idle"),C=x(null),S=x(null);let _=null;function R(){_&&(_.abort(),_=null),r.value==="streaming"&&(r.value="cancelled")}function P(){R(),b.value="",o.value=null,r.value="idle",C.value=null,S.value=null}async function E(l={}){b.value="",o.value=null,S.value=null,C.value=null,r.value="streaming";const p=e(g);_=new AbortController;const s=new URLSearchParams;l.force&&s.set("force","true");const i=`/api/failure-clusters/${p}/diagnose/stream${s.toString()?"?"+s.toString():""}`;try{const c=await $fetch.raw(i,{method:"POST",body:{additionalContext:l.additionalContext,images:l.images,baseCommit:l.baseCommit,selectedCommitShas:l.selectedCommitShas,scope:l.scope,testRunsCaseId:l.testRunsCaseId},responseType:"stream",signal:_.signal,ignoreResponseError:!0}),f=c._data??c.body;if(!f)throw new Error("No response body from streaming endpoint");let d;if(f instanceof ReadableStream)d=f.getReader();else if(f instanceof Uint8Array||f instanceof ArrayBuffer){const L=new TextDecoder().decode(f instanceof ArrayBuffer?new Uint8Array(f):f);O(L),r.value==="streaming"&&(r.value="error",S.value="Stream ended without a result event");return}else if(typeof f?.getReader=="function")d=f.getReader();else if(f?.pipeThrough)d=f.getReader();else throw new Error("Unsupported stream response format");const z=new TextDecoder;let D="";for(;;){const{done:I,value:L}=await d.read();if(I)break;D+=z.decode(L,{stream:!0});const j=D.split(`
|
|
2
|
+
|
|
3
|
+
`);D=j.pop()||"";let q=!1;for(const W of j){const n=U(W);if(n){if(n.event==="result")C.value=n.data,r.value="complete",q=!0;else if(n.event==="thinking"){const w=n.data;b.value+=w.text}else if(n.event==="stage")o.value=n.data.stage;else if(n.event==="error"){const w=n.data;S.value=w.message,r.value="error"}}}if(q)break}if(D.trim()){const I=U(D.trim());I&&(I.event==="result"?(C.value=I.data,r.value="complete"):I.event==="error"&&(S.value=I.data.message,r.value="error"))}r.value==="streaming"&&(S.value||(r.value="complete"))}catch(c){if(c?.name==="AbortError"){r.value="cancelled";return}S.value=String(c?.message??c),r.value="error"}finally{_=null}}function U(l){if(!l.trim())return null;const p=l.split(`
|
|
4
|
+
`);let s="message",i="";for(const c of p)c.startsWith("event: ")?s=c.slice(7).trim():c.startsWith("data: ")?i+=c.slice(6):c.startsWith(":");if(!i)return null;try{return{event:s,data:JSON.parse(i)}}catch{return{event:s,data:i}}}function O(l){const p=l.split(`
|
|
5
|
+
|
|
6
|
+
`);for(const s of p){const i=U(s);if(i)if(i.event==="result")C.value=i.data,r.value="complete";else if(i.event==="thinking"){const c=i.data;b.value+=c.text}else i.event==="stage"?o.value=i.data.stage:i.event==="error"&&(S.value=i.data.message,r.value="error")}}return he(()=>{R()}),{thinkingText:b,stage:o,status:r,result:C,error:S,startStream:E,cancel:R,reset:P}}const Rt=200*1024,Et=5*1024*1024,It=["image/jpeg","image/png","image/gif","image/webp"];function Bt(g){return new Promise((b,o)=>{const r=new FileReader;r.onload=()=>{const C=r.result.split(",")[1];C!==void 0?b(C):o(new Error("Failed to read file"))},r.onerror=o,r.readAsDataURL(g)})}function Pt(){const g=ie(),b=x([]),o=x([]),r=x(!1);async function C(l){for(const p of Array.from(l))if(It.includes(p.type)){if(p.size>Et){g.add({title:"Image too large",description:`${p.name} exceeds 5 MB`,color:"error"});continue}const s=await Bt(p),i=`data:${p.type};base64,${s}`;o.value.push({name:p.name,mediaType:p.type,data:s,preview:i,size:p.size})}else{if(p.size>Rt){g.add({title:"File too large",description:`${p.name} exceeds 200 KB`,color:"error"});continue}const s=await p.text();b.value.push({name:p.name,content:s,size:p.size})}}function S(l){l.preventDefault(),r.value=!0}function _(l){l.currentTarget?.contains(l.relatedTarget)||(r.value=!1)}function R(l){l.preventDefault(),r.value=!1,l.dataTransfer?.files?.length&&C(l.dataTransfer.files)}function P(l){b.value.splice(l,1)}function E(l){o.value.splice(l,1)}function U(){return b.value.length?`## Attached Files
|
|
7
|
+
|
|
8
|
+
${b.value.map(p=>`### ${p.name}
|
|
9
|
+
\`\`\`
|
|
10
|
+
${p.content}
|
|
11
|
+
\`\`\``).join(`
|
|
12
|
+
|
|
13
|
+
`)}`:""}function O(){return o.value.map(l=>({name:l.name,mediaType:l.mediaType,data:l.data}))}return{files:b,images:o,dragOver:r,processFiles:C,onDragOver:S,onDragLeave:_,onDrop:R,removeFile:P,removeImage:E,filesMarkdown:U,imagesPayload:O}}const Ut={class:"space-y-4"},jt={class:"pb-2 border-b border-default"},Ft={class:"flex items-center justify-between gap-2"},Ot={class:"flex items-center gap-1.5"},Lt={class:"text-xs text-gray-400"},Nt={class:"flex items-center gap-1.5"},Mt={key:0,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-elevated/50 border border-default text-xs"},Vt={class:"text-gray-500"},qt={key:1,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-elevated/50 border border-default text-xs"},Ht={class:"flex items-center gap-1 mb-1"},Wt={key:0,class:"text-primary"},Yt={key:0},Xt={class:"flex items-center gap-2 px-3 pb-2 pt-1 border-t border-default"},Gt={key:0,class:"text-xs text-primary"},Kt={key:1,class:"text-xs text-gray-400"},Qt={key:0,class:"flex flex-wrap gap-2"},Jt={class:"max-w-40 truncate"},Zt={class:"text-gray-400"},es=["onClick"],ts={key:1,class:"flex flex-wrap gap-2"},ss=["src","alt"],ns={class:"absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity rounded-lg flex items-center justify-center"},as=["onClick"],os={class:"text-xs text-gray-500 text-center mt-0.5 w-16 truncate"},is={key:3,class:"pt-1"},rs={key:4,class:"rounded-lg border border-default overflow-hidden"},ls={class:"flex items-center justify-between gap-2 px-3 py-2 bg-elevated/30 border-b border-default"},cs={class:"flex items-center gap-2 text-sm text-gray-500"},us={key:0,class:"inline-flex items-center gap-1 text-xs text-gray-400"},ds={key:1,class:"text-gray-400 italic"},fs={class:"px-3 py-1.5 border-t border-default text-xs text-gray-400 flex items-center gap-2"},ms={key:5,class:"rounded-lg border border-warning/40 bg-warning/5 p-3 space-y-2"},gs={class:"flex items-center gap-2 text-sm"},ps={class:"flex items-center gap-2 pt-1"},vs={class:"text-xs text-gray-400"},xs={key:4,class:"flex flex-col items-center justify-center p-8 text-center text-gray-400 border border-dashed border-default rounded-lg"},ys={class:"text-sm inline-flex items-center gap-1"},hs={class:"pt-1 text-center"},bs=_e({__name:"DiagnosisPanel",props:{clusterId:{},lastSeenRunId:{},affectedTestCases:{}},setup(g){const b=g,{diagnosis:o,posting:r,contextText:C,contextSections:S,tokenEstimate:_,imageTokenEstimate:R,contextLoading:P,coverage:E,baseCommit:U,selectedCommitShas:O,refreshContext:l,runDiagnosis:p}=ut(b.clusterId),{aiStatus:s}=ot();ie();const{permission:i,active:c,requestPermission:f,toggleEnabled:d}=it(),{thinkingText:z,stage:D,status:I,result:L,error:j,startStream:q,cancel:W}=zt(Q(()=>b.clusterId??0)),n=Pt(),{files:w,images:F,dragOver:le,processFiles:Se,onDragOver:ce,onDragLeave:ue,onDrop:de,removeFile:Te,removeImage:$e}=n,N=x(""),fe=x(null),me=x([]),Z=Q(()=>[...me.value,...F.value.length?n.imagesPayload():[]]),V=x(!1),Y=x(!1),se=x(null),ee=x(null);function ge(v){se.value=v,V.value=!0}const De=Q(()=>{const v=o.value?.details;if(!v)return[];const t=[];if(Array.isArray(v.evidence)&&t.push(...v.evidence),Array.isArray(v.hypotheses))for(const A of v.hypotheses)Array.isArray(A?.evidence)&&t.push(...A.evidence);return et(t)});H(z,()=>{Ye(()=>{ee.value&&(ee.value.scrollTop=ee.value.scrollHeight)})}),H(L,v=>{v&&(o.value=v)}),H(()=>o.value?.details,v=>{if(!v)return;const t=v;typeof t.additionalContext=="string"&&t.additionalContext.trim()&&!N.value&&(N.value=t.additionalContext)},{immediate:!0});function Ae(v){N.value=N.value?`${N.value}
|
|
14
|
+
|
|
15
|
+
${v}`:v,Y.value=!0}function pe(){const v=[];N.value.trim()&&v.push(N.value.trim());const t=n.filesMarkdown();return t&&v.push(t),v.join(`
|
|
16
|
+
|
|
17
|
+
`)}async function ne(v=!1){await q({force:v,additionalContext:pe()||void 0,baseCommit:U.value.trim()||void 0,selectedCommitShas:O.value.length?[...O.value]:void 0,images:Z.value.length?Z.value:void 0})}async function ze(v=!1){await p({force:v,additionalContext:pe()||void 0,images:Z.value.length?Z.value:void 0})}function Re(){o.value=null}function ve(v){return v.status==="running"&&Date.now()-new Date(v.updatedAt).getTime()>300*1e3}function te(){return I.value==="streaming"}function Ee(){return!te()&&(!o.value||o.value.status==="failed"||ve(o.value))}function Ie(){return!te()&&o.value&&(o.value.status==="completed"||o.value.status==="failed")}return(v,t)=>{const A=Ce,ae=Xe,Be=Ke,M=ke,Pe=Je,Ue=Qe,je=tt,Fe=At,Oe=nt,Le=Ze,Ne=We;return m(),h("div",Ut,[a("div",jt,[a("div",Ft,[a("div",Ot,[u(A,{name:"i-lucide-sparkles",class:"size-4 text-primary shrink-0"}),t[17]||(t[17]=a("span",{class:"text-sm font-semibold"},"Diagnosis",-1)),u(ae,{topic:"cluster.diagnosis"}),a("span",Lt,[t[15]||(t[15]=k(" — ",-1)),u(A,{name:"i-lucide-triangle-alert",class:"size-3 shrink-0 inline"}),t[16]||(t[16]=k(" AI-generated, verify before applying ",-1))])]),a("div",Nt,[u(Be,{"context-endpoint":`/api/failure-clusters/${g.clusterId}/context`},null,8,["context-endpoint"]),u(M,{icon:e(V)?"i-lucide-eye-off":"i-lucide-eye",size:"xs",color:"neutral",variant:"outline",loading:e(P),onClick:t[0]||(t[0]=y=>V.value=!e(V))},{default:B(()=>[k($(e(V)?"Hide context":"Show context"),1)]),_:1},8,["icon","loading"]),e(o)&&e(o).status==="completed"?(m(),G(M,{key:0,icon:"i-lucide-refresh-cw",size:"xs",color:"primary",variant:"soft",loading:e(r),onClick:t[1]||(t[1]=y=>ne(!0))},{default:B(()=>[...t[18]||(t[18]=[k(" Re-diagnose ",-1)])]),_:1},8,["loading"])):T("",!0)])])]),e(i)==="granted"&&e(s)?.configured?(m(),h("div",Mt,[u(A,{name:"i-lucide-bell",class:J(["size-3.5 shrink-0",e(c)?"text-primary":"text-gray-400"])},null,8,["class"]),a("span",Vt,$(e(c)?"Diagnosis notifications on":"Diagnosis notifications off"),1),u(M,{size:"xs",color:e(c)?"neutral":"primary",variant:"outline",onClick:e(d)},{default:B(()=>[k($(e(c)?"Disable":"Enable"),1)]),_:1},8,["color","onClick"])])):e(i)==="default"&&e(s)?.configured?(m(),h("div",qt,[u(A,{name:"i-lucide-bell",class:"size-3.5 text-gray-400 shrink-0"}),t[20]||(t[20]=a("span",{class:"text-gray-500"},"Notify when diagnosis completes?",-1)),u(M,{size:"xs",color:"neutral",variant:"outline",onClick:e(f)},{default:B(()=>[...t[19]||(t[19]=[k("Enable",-1)])]),_:1},8,["onClick"])])):T("",!0),e(s)?.configured?(m(),G(Pe,{key:2,sections:e(S),"not-applicable":e(E)?.notApplicable,"token-estimate":e(_),loading:e(P),onViewSection:ge,onOpen:t[2]||(t[2]=y=>V.value=!0)},null,8,["sections","not-applicable","token-estimate","loading"])):T("",!0),u(Ue,{open:e(V),sections:e(S),"token-estimate":e(_),"image-token-estimate":e(R),loading:e(P),"focus-section":e(se),"cited-sections":e(De),"not-applicable-sections":e(E)?.notApplicable,"onUpdate:open":t[3]||(t[3]=y=>{V.value=y,y||(se.value=null)}),onRefresh:e(l)},null,8,["open","sections","token-estimate","image-token-estimate","loading","focus-section","cited-sections","not-applicable-sections","onRefresh"]),e(s)?.configured?(m(),h(K,{key:3},[a("div",null,[a("div",Ht,[a("button",{class:"flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 text-left",onClick:t[4]||(t[4]=y=>Y.value=!e(Y))},[u(A,{name:e(Y)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5"},null,8,["name"]),t[21]||(t[21]=k(" Additional context ",-1)),e(w).length||e(F).length||e(N).trim()?(m(),h("span",Wt," ("+$(e(w).length+e(F).length+(e(N).trim()?1:0))+") ",1)):T("",!0)]),u(ae,{topic:"cluster.context-input"})]),e(Y)?(m(),h("div",Yt,[a("div",{class:J(["rounded-lg border-2 transition-colors",e(le)?"border-primary bg-primary/5 border-solid":"border-dashed border-default"]),onDragover:t[8]||(t[8]=(...y)=>e(ce)&&e(ce)(...y)),onDragleave:t[9]||(t[9]=(...y)=>e(ue)&&e(ue)(...y)),onDrop:t[10]||(t[10]=(...y)=>e(de)&&e(de)(...y))},[u(je,{modelValue:e(N),"onUpdate:modelValue":t[5]||(t[5]=y=>He(N)?N.value=y:null),placeholder:"e.g. We deployed a new auth middleware yesterday\\u2026",rows:3,class:"w-full text-sm border-0 bg-transparent focus:ring-0"},null,8,["modelValue"]),a("div",Xt,[a("input",{ref_key:"fileInputRef",ref:fe,type:"file",multiple:"",class:"hidden",accept:".txt,.log,.md,.json,.ts,.js,.py,.sql,.xml,.yaml,.yml,.html,.css,.env,image/*",onChange:t[6]||(t[6]=y=>e(Se)(y.target.files))},null,544),u(M,{icon:"i-lucide-paperclip",size:"xs",color:"neutral",variant:"ghost",onClick:t[7]||(t[7]=y=>e(fe)?.click())},{default:B(()=>[...t[22]||(t[22]=[k(" Attach files ",-1)])]),_:1}),e(le)?(m(),h("span",Gt,"Drop files here\\u2026")):(m(),h("span",Kt,"or drag & drop text files and images"))])],34)])):T("",!0)]),e(w).length?(m(),h("div",Qt,[(m(!0),h(K,null,oe(e(w),(y,X)=>(m(),h("div",{key:X,class:"flex items-center gap-1.5 bg-elevated rounded-full px-2.5 py-1 text-xs border border-default"},[u(A,{name:"i-lucide-file-text",class:"size-3 text-gray-500 shrink-0"}),a("span",Jt,$(y.name),1),a("span",Zt,$(("formatBytes"in v?v.formatBytes:e(at))(y.size)),1),a("button",{class:"text-gray-400 hover:text-error ml-0.5",onClick:Me=>e(Te)(X)},[u(A,{name:"i-lucide-x",class:"size-3"})],8,es)]))),128))])):T("",!0),e(F).length?(m(),h("div",ts,[(m(!0),h(K,null,oe(e(F),(y,X)=>(m(),h("div",{key:X,class:"relative group"},[a("img",{src:y.preview,alt:y.name,class:"h-16 w-16 object-cover rounded-lg border border-default"},null,8,ss),a("div",ns,[a("button",{class:"text-white",onClick:Me=>e($e)(X)},[u(A,{name:"i-lucide-x",class:"size-4"})],8,as)]),a("p",os,$(y.name),1)]))),128))])):T("",!0),g.affectedTestCases?.length?(m(),G(Fe,{key:2,"affected-test-cases":g.affectedTestCases,"onUpdate:images":t[11]||(t[11]=y=>me.value=y)},null,8,["affected-test-cases"])):T("",!0),Ee()?(m(),h("div",is,[u(M,{icon:"i-lucide-sparkles",size:"sm",color:"primary",variant:"solid",loading:e(r),onClick:t[12]||(t[12]=y=>ne())},{default:B(()=>[...t[23]||(t[23]=[k(" Diagnose with AI ",-1)])]),_:1},8,["loading"])])):T("",!0),te()?(m(),h("div",rs,[a("div",ls,[a("div",cs,[u(A,{name:"i-lucide-loader-2",class:"size-4 animate-spin text-primary"}),t[24]||(t[24]=a("span",null,"Analyzing failure cluster",-1)),e(D)?(m(),h("span",us,[u(A,{name:"i-lucide-workflow",class:"size-3"}),k(" "+$(e(D)==="research"?"Researching patterns":"Diagnosing root cause"),1)])):T("",!0)]),u(M,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Cancel diagnosis",onClick:e(W)},null,8,["onClick"])]),a("div",{ref_key:"thinkingContainer",ref:ee,class:"max-h-64 overflow-y-auto p-3 text-xs font-mono leading-relaxed whitespace-pre-wrap break-words text-gray-600 dark:text-gray-400 bg-elevated/10"},[e(z)?(m(),h(K,{key:0},[k($(e(z))+" ",1),t[25]||(t[25]=a("span",{class:"inline-block w-2 h-4 bg-primary/60 animate-pulse ml-0.5 align-text-bottom"},null,-1))],64)):(m(),h("span",ds,"Waiting for model response\\u2026"))],512),a("div",fs,[u(A,{name:"i-lucide-file-text",class:"size-3"}),a("span",null,$(e(z).length.toLocaleString())+" characters received",1)])])):T("",!0),e(o)?.status==="running"&&!ve(e(o))&&!te()?(m(),h("div",ms,[a("div",gs,[u(A,{name:"i-lucide-alert-triangle",class:"size-4 text-warning shrink-0"}),t[26]||(t[26]=a("span",{class:"font-medium text-warning-700 dark:text-warning-400"},"Diagnosis was interrupted",-1))]),t[29]||(t[29]=a("p",{class:"text-xs text-gray-500"}," A previous diagnosis started but never completed — the server may have restarted. You can restart it below. ",-1)),a("div",ps,[u(M,{icon:"i-lucide-refresh-cw",size:"xs",color:"warning",variant:"solid",loading:e(r),onClick:t[13]||(t[13]=y=>ne(!0))},{default:B(()=>[...t[27]||(t[27]=[k(" Restart diagnosis ",-1)])]),_:1},8,["loading"]),u(M,{size:"xs",color:"neutral",variant:"ghost",loading:e(r),onClick:Re},{default:B(()=>[...t[28]||(t[28]=[k(" Dismiss ",-1)])]),_:1},8,["loading"])]),a("p",vs,"Started "+$(e(we)(e(o).updatedAt)),1)])):T("",!0),e(j)?(m(),G(Oe,{key:6,color:"error",icon:"i-lucide-alert-circle",title:"Streaming diagnosis failed",description:e(j),class:"mt-2"},{actions:B(()=>[u(M,{size:"xs",color:"neutral",variant:"outline",onClick:t[14]||(t[14]=y=>ze(!0))},{default:B(()=>[...t[30]||(t[30]=[k(" Retry (fallback) ",-1)])]),_:1})]),_:1},8,["description"])):T("",!0),Ie()?(m(),G(Le,{key:7,diagnosis:e(o),"last-seen-run-id":g.lastSeenRunId,onViewSection:ge,onPrefillContext:Ae},null,8,["diagnosis","last-seen-run-id"])):T("",!0)],64)):(m(),h("div",xs,[u(A,{name:"i-lucide-sparkles",class:"size-8 mb-2 opacity-30"}),a("p",ys,[t[31]||(t[31]=k(" AI diagnosis is not configured ",-1)),u(ae,{topic:"cluster.ai-setup"})]),u(M,{to:"/settings/ai",size:"xs",color:"neutral",variant:"outline",class:"mt-3"},{default:B(()=>[...t[32]||(t[32]=[k(" Configure in Settings ",-1)])]),_:1}),t[33]||(t[33]=a("p",{class:"text-xs text-gray-400 mt-4 max-w-xs"},[k(" Use the "),a("strong",null,"Show context"),k(" button above to inspect the full diagnosis context and copy it for use with your own AI tool. ")],-1))])),a("div",hs,[u(Ne,{to:"/mcp",class:"inline-flex items-center gap-1 text-xs text-gray-400 hover:text-primary transition-colors"},{default:B(()=>[u(A,{name:"i-lucide-bot",class:"size-3"}),t[34]||(t[34]=k(" Query this cluster from your AI agent via the MCP server ",-1))]),_:1})])])}}}),Rs=Object.assign(bs,{__name:"DiagnosisPanel"});export{Rs as _,ct as p,zs as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as T,q as N,o as i,e as C,f as c,g as f,R as A,c as u,F as I,z as F,I as y,h as s,G as B,l as w,k as V,J as P,i as M,_ as D,t as h,b,j as z,v}from"./BzBaMPgu.js";import{_ as L}from"./Bg8yOdSf.js";import{_ as O}from"./Die1200X.js";import{_ as H,a as q}from"./qeqzb80l.js";import{_ as E}from"./C7SG50jD.js";import{_ as G}from"./BUYmGTVP.js";import{F as R}from"./CdM2qNYM.js";import{a as J}from"./CDEmotIt.js";const K={key:0,class:"flex flex-wrap gap-1 py-0.5"},Q={key:1,class:"text-[var(--ui-text-muted)]"},W=T({__name:"TagsSelect",props:{modelValue:{},allTags:{}},emits:["update:modelValue","tagCreated"],setup(o,{emit:g}){const p=o,m=g,_=N();async function x(l){const t=l.trim();if(!t)return;const d=p.allTags.find(n=>n.text.toLowerCase()===t.toLowerCase());if(d){p.modelValue.some(n=>n.id===d.id)||m("update:modelValue",[...p.modelValue,d]);return}try{const n=await $fetch("/api/tags",{method:"POST",body:{text:t,color:R()}});m("tagCreated",n.tag),m("update:modelValue",[...p.modelValue,n.tag])}catch(n){const e=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;_.add({title:"Failed to create tag",description:e||"An error occurred",color:"error"})}}return(l,t)=>{const d=E,n=G;return i(),C(n,{"model-value":o.modelValue,items:o.allTags,multiple:"","create-item":"always","label-key":"text",by:"id",placeholder:"Select or create tags…",class:"w-full","onUpdate:modelValue":t[0]||(t[0]=e=>m("update:modelValue",e)),onCreate:x},{default:c(({modelValue:e})=>[e.length?(i(),u("div",K,[(i(!0),u(I,null,F(e,a=>(i(),C(d,{key:a.id,text:a.text,color:a.color},null,8,["text","color"]))),128))])):(i(),u("span",Q,"Select or create tags…"))]),"item-leading":c(({item:e})=>[f("span",{class:"inline-block size-2 rounded-full shrink-0",style:A({backgroundColor:e.color})},null,4)]),_:1},8,["model-value","items"])}}}),X=Object.assign(W,{__name:"TagsSelect"}),Y={class:"space-y-5"},Z={class:"inline-flex items-center gap-1"},ee={class:"inline-flex items-center gap-1"},te=T({__name:"ProjectFormFields",props:P({mode:{},allTags:{},hasToken:{type:Boolean,default:!1}},{name:{default:""},nameModifiers:{},label:{default:""},labelModifiers:{},description:{default:""},descriptionModifiers:{},diagnosisInstructions:{default:""},diagnosisInstructionsModifiers:{},scmToken:{default:""},scmTokenModifiers:{},tags:{default:()=>[]},tagsModifiers:{}}),emits:P(["tag-created"],["update:name","update:label","update:description","update:diagnosisInstructions","update:scmToken","update:tags"]),setup(o,{emit:g}){const p=g,m=y(o,"name"),_=y(o,"label"),x=y(o,"description"),l=y(o,"diagnosisInstructions"),t=y(o,"scmToken"),d=y(o,"tags");return(n,e)=>{const a=B,k=L,$=O,j=H,U=X;return i(),u("div",Y,[o.mode==="create"?(i(),C(k,{key:0,label:"Project name",name:"name",required:"",description:"A unique identifier used to match test results from the reporter."},{default:c(()=>[s(a,{modelValue:m.value,"onUpdate:modelValue":e[0]||(e[0]=r=>m.value=r),placeholder:"e.g. my-app",class:"w-full"},null,8,["modelValue"])]),_:1})):w("",!0),s(k,{label:"Display label",name:"label",description:"A friendly name shown in the UI (defaults to project name if not set)."},{default:c(()=>[s(a,{modelValue:_.value,"onUpdate:modelValue":e[1]||(e[1]=r=>_.value=r),placeholder:"e.g. My Application",class:"w-full"},null,8,["modelValue"])]),_:1}),s(k,{label:"Description",name:"description",description:"Optional description of this project."},{default:c(()=>[s($,{modelValue:x.value,"onUpdate:modelValue":e[2]||(e[2]=r=>x.value=r),placeholder:"Enter project description",rows:3,class:"w-full"},null,8,["modelValue"])]),_:1}),o.mode==="edit"?(i(),u(I,{key:1},[s(k,{name:"diagnosisInstructions",description:"Combined with the global instructions from Settings → AI."},{label:c(()=>[f("span",Z,[e[7]||(e[7]=V(" AI diagnosis instructions ",-1)),s(j,{topic:"project.ai-instructions"})])]),default:c(()=>[s($,{modelValue:l.value,"onUpdate:modelValue":e[3]||(e[3]=r=>l.value=r),placeholder:"e.g. This project tests the payment checkout flow. The backend uses Stripe for payments and the payment API is at /api/v2/payments. Database errors are usually caused by connection pool exhaustion under load.",rows:5,class:"w-full font-mono text-sm"},null,8,["modelValue"])]),_:1}),s(k,{name:"scmToken",description:o.hasToken?"Leave empty to keep the stored token, enter a new value to replace it, or save empty to remove it":"For GitHub, GitLab, or Bitbucket. Falls back to the global SCM token if not set."},{label:c(()=>[f("span",ee,[e[8]||(e[8]=V("SCM token ",-1)),s(j,{topic:"project.scm-token"})])]),default:c(()=>[s(a,{modelValue:t.value,"onUpdate:modelValue":e[4]||(e[4]=r=>t.value=r),type:"password",placeholder:o.hasToken?"•••••••• (unchanged)":"ghp_..., glpat-..., or bitbucket token",class:"w-full font-mono"},null,8,["modelValue","placeholder"])]),_:1},8,["description"])],64)):w("",!0),s(k,{label:"Tags",name:"tags",description:"Select existing tags or type a new name and press Enter to create one."},{default:c(()=>[s(U,{modelValue:d.value,"onUpdate:modelValue":e[5]||(e[5]=r=>d.value=r),"all-tags":o.allTags,class:"w-full",onTagCreated:e[6]||(e[6]=r=>p("tag-created"))},null,8,["modelValue","all-tags"])]),_:1})])}}}),xe=Object.assign(te,{__name:"ProjectFormFields"}),oe={class:"space-y-2"},ae={class:"space-y-1.5"},se=["title"],le={key:0,class:"flex flex-wrap items-center gap-1.5 text-xs text-muted"},ne={class:"inline-flex items-center gap-0.5"},ie={key:1,class:"flex items-center gap-1.5 text-xs text-muted"},S="npx @piwitests/reporter init",re=T({__name:"DesktopFolderChecklist",props:{inspection:{}},setup(o){const g=o,{copy:p}=J(),m=v(()=>{const l=g.inspection;return[l.playwrightConfig?{ok:!0,label:"Playwright config found",detail:l.playwrightConfig}:{ok:!1,label:"No Playwright config at the folder root"},l.playwrightInstalled?{ok:!0,label:"Playwright is installed"}:{ok:!1,label:"Playwright is not installed",detail:"run your package manager’s install first"},l.reporterInstalled?{ok:!0,label:"Piwi reporter is installed",detail:"@piwitests/reporter"}:{ok:!1,label:"Piwi reporter is not installed"},l.reporterConfigured?{ok:!0,label:"Config sends results to Piwi",detail:l.configuredProjectName?`projectName: ${l.configuredProjectName}`:void 0}:{ok:!1,label:"Config does not use the Piwi reporter"}]}),_=v(()=>m.value.every(l=>l.ok)),x=v(()=>!g.inspection.reporterInstalled||!g.inspection.reporterConfigured);return(l,t)=>{const d=D,n=z,e=q;return i(),u("div",oe,[f("ul",ae,[(i(!0),u(I,null,F(b(m),a=>(i(),u("li",{key:a.label,class:"flex items-center gap-2 text-sm"},[s(d,{name:a.ok?"i-lucide-circle-check-big":"i-lucide-triangle-alert",class:M(["size-4 shrink-0",a.ok?"text-success":"text-warning"])},null,8,["name","class"]),f("span",{class:M(a.ok?"":"text-warning")},h(a.label),3),a.detail?(i(),u("span",{key:0,class:"text-xs text-muted truncate",title:a.detail},h(a.detail),9,se)):w("",!0)]))),128))]),b(x)?(i(),u("p",le,[t[2]||(t[2]=f("span",null,"Set it up from a terminal in that folder:",-1)),f("span",ne,[f("code",{class:"px-1.5 py-0.5 rounded bg-elevated font-mono"},h(S)),s(n,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy setup command",onClick:t[0]||(t[0]=a=>b(p)(S,{toast:!0}))})]),s(e,{to:"reporter",class:"text-xs"},{default:c(()=>[...t[1]||(t[1]=[V("Reporter docs",-1)])]),_:1})])):b(_)?(i(),u("p",ie,[s(d,{name:"i-lucide-sparkles",class:"size-3.5 text-success"}),t[3]||(t[3]=V(" Runs from this folder will report to Piwi. ",-1))])):w("",!0)])}}}),ke=Object.assign(re,{__name:"DesktopFolderChecklist"});export{ke as _,xe as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as f}from"./D5Mhpp98.js";import{_ as b}from"./Ds8_6Fzl.js";import{_ as h}from"./BC5bqlfM.js";import{_ as j,a as v}from"./CdLqOMvN.js";import{_ as x}from"./knaDbxMJ.js";import{d as $,u as w,w as y,s as C,e as P,f as a,v as B,o as N,g,h as e,b as o,r as k}from"./BzBaMPgu.js";import{u as D}from"./CDEmotIt.js";import"./DWz_bHNP.js";import"./CnRNwiuE.js";import"./DDho3MJD.js";import"./Bw4oIhct.js";import"./Hp-_W7z4.js";import"./DUtYU4Sb.js";import"./B77w1Eib.js";import"./Db5xe__T.js";import"./CVEk4D8I.js";import"./BSKLNgre.js";import"./Ch8sGLqE.js";import"./CdM2qNYM.js";import"./BraJd4EA.js";import"./BMfTUMYy.js";import"./BTCWUyBX.js";import"./7vRR5W2L.js";import"./vOZZ2cLi.js";import"./CBQXv4bU.js";import"./BOrnSpTA.js";import"./D_j436ND.js";import"./qeqzb80l.js";import"./BcHU1KNK.js";import"./kDEwM7SQ.js";import"./DkGXOZRW.js";const R={class:"p-4"},lo=$({__name:"test-cases",async setup(T){let r,n;const i=w(),s=String(i.params.id),{data:t}=([r,n]=y(()=>D(`/api/projects/${s}`,"$GBv2haQFFX")),r=await r,n(),r),c=k(null);return C(B(()=>({title:`${t.value?.label||t.value?.name||"Project"} — Test cases — Piwi Dashboard`}))),(F,U)=>{const m=f,p=b,_=h,l=v,u=x,d=j;return N(),P(d,{id:"project-test-cases"},{header:a(()=>[e(l,null,{leading:a(()=>[e(m),e(p,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(t)?.label||o(t)?.name||"Project",to:`/projects/${o(s)}`},{label:"Test cases"}]},null,8,["items"])]),right:a(()=>[e(_,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>o(c)?.refresh()}]},null,8,["actions"])]),_:1})]),body:a(()=>[g("div",R,[e(u,{ref_key:"tableRef",ref:c,"project-id":o(s),"project-name":o(t)?.name,"sync-query":""},null,8,["project-id","project-name"])])]),_:1})}}});export{lo as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a3 as S,a6 as V,ba as P,a4 as A,a5 as B,r as O,o as r,e as v,W as b,b as a,j,v as q,a8 as w,a2 as F,f as k,g as L,i as u,c as f,F as C,z as N,h as y,y as D,bb as K,bc as T,V as d,_ as $,aJ as U,l as m,aI as I,k as E,t as J,X as R}from"./BzBaMPgu.js";import{a as W}from"./DWz_bHNP.js";const X={base:"hidden lg:flex",variants:{side:{left:"",right:""}}},Q={__name:"UDashboardSidebarCollapse",props:{color:{type:null,required:!1,default:"neutral"},variant:{type:null,required:!1,default:"ghost"},side:{type:String,required:!1,default:"left"},ui:{type:Object,required:!1},label:{type:String,required:!1},activeColor:{type:null,required:!1},activeVariant:{type:null,required:!1},size:{type:null,required:!1},square:{type:Boolean,required:!1},block:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1},onClick:{type:[Function,Array],required:!1},class:{type:null,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},as:{type:null,required:!1},type:{type:null,required:!1},disabled:{type:Boolean,required:!1},exactActiveClass:{type:String,required:!1},viewTransition:{type:Boolean,required:!1}},setup(g){const i=S("dashboardSidebarCollapse",g),l=V(P(i,"icon","side","class")),{t:p}=A(),o=B(),{sidebarCollapsed:c,collapseSidebar:s}=W({sidebarCollapsed:O(!1),collapseSidebar:()=>{}}),n=q(()=>w({extend:X,...o.ui?.dashboardSidebarCollapse||{}}));return(_,e)=>(r(),v(j,b({...a(l),icon:a(i).icon||(a(c)?a(o).ui.icons.panelOpen:a(o).ui.icons.panelClose),"aria-label":a(c)?a(p)("dashboardSidebarCollapse.expand"):a(p)("dashboardSidebarCollapse.collapse"),..._.$attrs},{class:n.value({class:[a(i).ui?.base,a(i).class],side:a(i).side}),onClick:e[0]||(e[0]=t=>a(s)?.(!a(c)))}),null,16,["class"]))}},G={slots:{root:"relative min-w-0",list:"flex items-center gap-1.5",item:"flex min-w-0",link:"group relative flex items-center gap-1.5 text-sm min-w-0 rounded-md",linkLeadingIcon:"shrink-0 size-5",linkLeadingAvatar:"shrink-0",linkLeadingAvatarSize:"2xs",linkLabel:"truncate",separator:"flex",separatorIcon:"shrink-0 size-5 text-muted"},variants:{active:{true:{link:"font-semibold"},false:{link:"text-muted font-medium"}},disabled:{true:{link:"cursor-not-allowed opacity-75"}},to:{true:""},color:{primary:{link:"outline-primary/25 focus-visible:outline-3"},secondary:{link:"outline-secondary/25 focus-visible:outline-3"},success:{link:"outline-success/25 focus-visible:outline-3"},info:{link:"outline-info/25 focus-visible:outline-3"},warning:{link:"outline-warning/25 focus-visible:outline-3"},error:{link:"outline-error/25 focus-visible:outline-3"},neutral:{link:"outline-inverted/25 focus-visible:outline-3"}}},compoundVariants:[{disabled:!1,active:!1,to:!0,class:{link:["hover:text-default","transition-colors"]}},{color:"primary",active:!0,class:{link:"text-primary"}},{color:"secondary",active:!0,class:{link:"text-secondary"}},{color:"success",active:!0,class:{link:"text-success"}},{color:"info",active:!0,class:{link:"text-info"}},{color:"warning",active:!0,class:{link:"text-warning"}},{color:"error",active:!0,class:{link:"text-error"}},{color:"neutral",active:!0,class:{link:"text-highlighted"}}],defaultVariants:{color:"primary"}},Y={__name:"UBreadcrumb",props:{as:{type:null,required:!1,default:"nav"},items:{type:Array,required:!1},separatorIcon:{type:null,required:!1},color:{type:null,required:!1},labelKey:{type:null,required:!1,default:"label"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(g){const h=g,i=F(),l=S("breadcrumb",h),{dir:p}=A(),o=B(),c=q(()=>l.separatorIcon||(p.value==="rtl"?o.ui.icons.chevronLeft:o.ui.icons.chevronRight)),s=q(()=>w({extend:G,...o.ui?.breadcrumb||{}})({color:l.color}));return(n,_)=>(r(),v(a(R),{as:a(l).as,"aria-label":"breadcrumb","data-slot":"root",class:u(s.value.root({class:[a(l).ui?.root,a(l).class]}))},{default:k(()=>[L("ol",{"data-slot":"list",class:u(s.value.list({class:a(l).ui?.list}))},[(r(!0),f(C,null,N(a(l).items,(e,t)=>(r(),f(C,{key:t},[L("li",{"data-slot":"item",class:u(s.value.item({class:[a(l).ui?.item,e.ui?.item]}))},[y(D,b({ref_for:!0},a(K)(e),{custom:""}),{default:k(({active:x,...z})=>[y(T,b({ref_for:!0},z,{as:"span","aria-current":(e.active??x)&&t===a(l).items.length-1?"page":void 0,"data-slot":"link",class:s.value.link({class:[a(l).ui?.link,e.ui?.link,e.class],active:e.active??t===a(l).items.length-1,disabled:!!e.disabled,to:!!e.to})}),{default:k(()=>[d(n.$slots,e.slot||"item",{item:e,active:e.active??t===a(l).items.length-1,index:t,ui:s.value},()=>[d(n.$slots,e.slot?`${e.slot}-leading`:"item-leading",{item:e,active:e.active??t===a(l).items.length-1,index:t,ui:s.value},()=>[e.icon?(r(),v($,{key:0,name:e.icon,"data-slot":"linkLeadingIcon",class:u(s.value.linkLeadingIcon({class:[a(l).ui?.linkLeadingIcon,e.ui?.linkLeadingIcon],active:e.active??t===a(l).items.length-1}))},null,8,["name","class"])):e.avatar?(r(),v(U,b({key:1,size:a(l).ui?.linkLeadingAvatarSize||s.value.linkLeadingAvatarSize()},{ref_for:!0},e.avatar,{"data-slot":"linkLeadingAvatar",class:s.value.linkLeadingAvatar({class:[a(l).ui?.linkLeadingAvatar,e.ui?.linkLeadingAvatar],active:e.active??t===a(l).items.length-1})}),null,16,["size","class"])):m("",!0)]),a(I)(e,a(l).labelKey)||i[e.slot?`${e.slot}-label`:"item-label"]?(r(),f("span",{key:0,"data-slot":"linkLabel",class:u(s.value.linkLabel({class:[a(l).ui?.linkLabel,e.ui?.linkLabel]}))},[d(n.$slots,e.slot?`${e.slot}-label`:"item-label",{item:e,active:e.active??t===a(l).items.length-1,index:t},()=>[E(J(a(I)(e,a(l).labelKey)),1)])],2)):m("",!0),d(n.$slots,e.slot?`${e.slot}-trailing`:"item-trailing",{item:e,active:e.active??t===a(l).items.length-1,index:t})])]),_:2},1040,["aria-current","class"])]),_:2},1040)],2),t<a(l).items.length-1?(r(),f("li",{key:0,role:"presentation","aria-hidden":"true","data-slot":"separator",class:u(s.value.separator({class:[a(l).ui?.separator,e.ui?.separator]}))},[d(n.$slots,"separator",{ui:s.value},()=>[y($,{name:c.value,"data-slot":"separatorIcon",class:u(s.value.separatorIcon({class:[a(l).ui?.separatorIcon,e.ui?.separatorIcon]}))},null,8,["name","class"])])],2)):m("",!0)],64))),128))],2)]),_:3},8,["as","class"]))}};export{Q as _,Y as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as F,
|
|
1
|
+
import{d as F,C as W,o,e as u,f as n,g as e,c,F as E,z as N,b as a,i as C,_ as O,t as y,l as m,m as R,k as s,j as V,h as i,r as I,v as g,B as G}from"./BzBaMPgu.js";import{a as T,d as K,_ as L}from"./qeqzb80l.js";import{_ as Y}from"./Cmuwgbf4.js";import{_ as H}from"./kDEwM7SQ.js";import{u as q}from"./E26Y1NWH.js";const M={class:"flex items-center gap-3"},J={class:"p-2 bg-primary/10 rounded-lg shrink-0"},Q={class:"text-xl font-semibold inline-flex items-center gap-1"},X={class:"text-sm text-gray-500 dark:text-gray-400"},Z={class:"flex flex-col items-center shrink-0"},tt={key:1},et={key:0,class:"w-px flex-1 mt-2 min-h-6 bg-gray-200 dark:bg-gray-700"},st={class:"flex-1 pb-6"},rt={class:"flex items-center gap-2 mb-1"},ot={class:"font-medium"},it={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},nt={class:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-2"},at={key:0,class:"mt-4 space-y-6"},lt={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},dt={class:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400"},pt=`// tests/fixtures.ts
|
|
2
2
|
import { test as base, expect } from '@playwright/test'
|
|
3
3
|
import { piwiFixtures } from '@piwitests/reporter'
|
|
4
4
|
|
|
@@ -15,8 +15,8 @@ import { test as base } from '@playwright/test'
|
|
|
15
15
|
import { extendPiwiFixtures } from '@piwitests/reporter'
|
|
16
16
|
|
|
17
17
|
export const test = extendPiwiFixtures(base)
|
|
18
|
-
export { expect } from '@playwright/test'`,mt=F({__name:"GetStartedWizard",setup(gt){const P=G(),h=g(()=>!!P.public.authEnabled),b=
|
|
19
|
-
`)}const
|
|
18
|
+
export { expect } from '@playwright/test'`,mt=F({__name:"GetStartedWizard",setup(gt){const P=G(),h=g(()=>!!P.public.authEnabled),b=q(),_=I("http://localhost:3000");W(()=>{_.value=window.location.origin});function k(d){const t=["projectName: 'my-project',"];return b||(t.unshift(`serverUrl: '${_.value}',`),h.value&&t.push("apiKey: process.env.PIWI_API_KEY,")),t.map(l=>`${d}${l}`).join(`
|
|
19
|
+
`)}const z=g(()=>`import { defineConfig } from '@playwright/test'
|
|
20
20
|
|
|
21
21
|
export default defineConfig({
|
|
22
22
|
reporter: [
|
|
@@ -28,7 +28,7 @@ ${k(" ")}
|
|
|
28
28
|
use: {
|
|
29
29
|
trace: 'retain-on-failure',
|
|
30
30
|
},
|
|
31
|
-
})`),
|
|
31
|
+
})`),A=g(()=>`import { defineConfig } from '@playwright/test'
|
|
32
32
|
import PiwiDashboard from '@piwitests/reporter'
|
|
33
33
|
|
|
34
34
|
export default PiwiDashboard.wrapConfig(
|
|
@@ -41,4 +41,4 @@ export default PiwiDashboard.wrapConfig(
|
|
|
41
41
|
{
|
|
42
42
|
${k(" ")}
|
|
43
43
|
},
|
|
44
|
-
)`),x=g(()=>{const d=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return h.value&&d.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),d.push({title:"Configure Playwright",description:b?"Add the reporter to your playwright.config.ts. While this app is running it needs no URL or token — the reporter finds it automatically.":"Add the reporter to your playwright.config.ts.",code:
|
|
44
|
+
)`),x=g(()=>{const d=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return h.value&&d.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),d.push({title:"Configure Playwright",description:b?"Add the reporter to your playwright.config.ts. While this app is running it needs no URL or token — the reporter finds it automatically.":"Add the reporter to your playwright.config.ts.",code:z.value,lang:"typescript"},{title:"Run your tests",description:"Results appear in the dashboard automatically. The project is created on first submit.",code:"npx playwright test",lang:"bash"}),d.map((t,l)=>({id:l+1,...t}))}),S=["zero","one","two","three","four","five","six"],j=g(()=>S[x.value.length]??String(x.value.length)),f=I(!1);return(d,t)=>{const l=O,U=L,$=R,w=V,p=Y,v=T,B=H;return o(),u(B,null,{header:n(()=>[e("div",M,[e("div",J,[i(l,{name:"i-lucide-rocket",class:"size-5 text-primary"})]),e("div",null,[e("h2",Q,[t[1]||(t[1]=s(" Get started in 60 seconds ",-1)),i(U,{topic:"home.get-started"})]),e("p",X,"Send your first test run in "+y(a(j))+" steps",1)])])]),footer:n(()=>[e("div",dt,[e("span",null,[t[18]||(t[18]=s("Need more options? See the ",-1)),i(v,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[17]||(t[17]=[s("full reporter docs",-1)])]),_:1}),t[19]||(t[19]=s(".",-1))]),i(w,{to:a(K)("demo/"),target:"_blank",variant:"ghost",size:"sm",color:"neutral","trailing-icon":"i-lucide-external-link"},{default:n(()=>[...t[20]||(t[20]=[s(" View demo with sample data ",-1)])]),_:1},8,["to"])])]),default:n(()=>[e("div",null,[(o(!0),c(E,null,N(a(x),(r,D)=>(o(),c("div",{key:r.id,class:"flex gap-4"},[e("div",Z,[e("div",{class:C(["flex size-8 items-center justify-center rounded-full text-sm font-semibold",r.done?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-primary/10 text-primary"])},[r.done?(o(),u(l,{key:0,name:"i-lucide-check",class:"size-4"})):(o(),c("span",tt,y(r.id),1))],2),D<a(x).length-1?(o(),c("div",et)):m("",!0)]),e("div",st,[e("div",rt,[e("h3",ot,y(r.title),1),r.done?(o(),u($,{key:0,color:"success",variant:"subtle",size:"xs"},{default:n(()=>[...t[2]||(t[2]=[s("Done",-1)])]),_:1})):m("",!0)]),e("p",it,y(r.description),1),r.action==="create-api-key"?(o(),u(w,{key:0,to:"/settings/users",icon:"i-lucide-key-round",size:"sm",variant:"soft"},{default:n(()=>[...t[3]||(t[3]=[s(" Create an API key ",-1)])]),_:1})):m("",!0),r.code?(o(),u(p,{key:1,code:r.code,lang:r.lang},null,8,["code","lang"])):m("",!0)])]))),128)),e("div",nt,[e("button",{class:"flex items-center gap-2 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-primary dark:hover:text-primary transition-colors w-full text-left",onClick:t[0]||(t[0]=r=>f.value=!a(f))},[i(l,{name:"i-lucide-chevron-right",class:C(["size-4 transition-transform duration-200",a(f)?"rotate-90":""])},null,8,["class"]),t[4]||(t[4]=s(" Go further — simpler config & capture fixtures ",-1))]),a(f)?(o(),c("div",at,[e("div",null,[t[5]||(t[5]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Simpler config with "),e("code",{class:"text-primary text-xs"},"wrapConfig")],-1)),t[6]||(t[6]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},[s(" Instead of manually adding the reporter array entry, "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"wrapConfig"),s(" auto-injects the reporter and chains the global setup in one call. It also registers the run on the dashboard "),e("em",null,"before"),s(" your "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"globalSetup"),s(" runs, so the dashboard shows an initializing state during setup. ")],-1)),i(p,{code:a(A),lang:"typescript"},null,8,["code"])]),e("div",null,[t[14]||(t[14]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Capture fixtures — network, Web Vitals, console & locator healing with "),e("code",{class:"text-primary text-xs"},"piwiFixtures")],-1)),e("p",lt,[t[8]||(t[8]=s(" Extend your Playwright ",-1)),t[9]||(t[9]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"test",-1)),t[10]||(t[10]=s(" with ",-1)),t[11]||(t[11]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"piwiFixtures",-1)),t[12]||(t[12]=s(" to automatically capture network timing, browser Web Vitals, console errors, ARIA snapshots on failure, and the locator snapshots that power locator healing. See the ",-1)),i(v,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[7]||(t[7]=[s("capture fixtures guide",-1)])]),_:1}),t[13]||(t[13]=s(". ",-1))]),t[15]||(t[15]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option A — extend your existing fixtures ",-1)),i(p,{code:pt,lang:"typescript",class:"mb-3"}),i(p,{code:ut,lang:"typescript",class:"mb-4"}),t[16]||(t[16]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option B — one-line extend ",-1)),i(p,{code:ct,lang:"typescript"})])])):m("",!0)])])]),_:1})}}}),_t=Object.assign(mt,{__name:"GetStartedWizard"});export{_t as _};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as At,a as Lt}from"./
|
|
1
|
+
import{_ as At,a as Lt}from"./D5Mhpp98.js";import{_ as Ot,a as zt}from"./CdLqOMvN.js";import{_ as Bt}from"./CnRNwiuE.js";import{d as B,ao as Ut,C as Ft,L as qt,ad as Wt,a as vt,o as s,c as v,v as E,r as ft,h as $,x as at,b as t,e as k,f,g as a,_ as lt,i as A,t as h,l as P,k as D,j as q,w as F,F as N,z as L,ag as wt,H as Q,R as ot,m as Mt,s as Gt}from"./BzBaMPgu.js";import{_ as Ht}from"./BUYmGTVP.js";import{_ as Yt}from"./6DSY_93j.js";import{u as Xt}from"./DWz_bHNP.js";import{u as _t}from"./CDEmotIt.js";import{_ as Jt}from"./Bw4oIhct.js";import{_ as Qt}from"./Db5xe__T.js";import{e as W,f as it,c as Zt}from"./CdM2qNYM.js";import{_ as G}from"./Hp-_W7z4.js";import{_ as H}from"./DUtYU4Sb.js";import{_ as X}from"./B77w1Eib.js";import{_ as K}from"./D_j436ND.js";import{_ as Kt}from"./BxSrScjV.js";import{_ as Rt}from"./C7SG50jD.js";import{_ as te}from"./Ch8sGLqE.js";import{_ as ee}from"./BvXrhZ8k.js";import{_ as ct}from"./5nOoVJzL.js";import{X as se,b as Tt,c as dt,d as ae,i as ne,e as re,f as oe,g as et,m as mt,h as ie,j as kt,k as le,l as $t,s as st,n as St,o as ce,p as de,q as ue,r as me,t as pe,P as _e,v as ye,_ as bt,u as jt,a as xt,C as yt,w as he,O as Z}from"./CbuK1HIv.js";import{_ as ut}from"./C8WgBDU1.js";import{N as Dt}from"./Yl6iqHwK.js";import{_ as ge}from"./BF5JDf9_.js";import{_ as fe}from"./B-onBCAB.js";import{_ as be}from"./mhvG7mu8.js";import"./DDho3MJD.js";import"./Boyv6hLW.js";import"./BOrnSpTA.js";import"./DcUBmKKE.js";import"./WCZdf9Ln.js";import"./BPQNVV4M.js";import"./CTYlay1H.js";import"./qeqzb80l.js";import"./BcHU1KNK.js";import"./kDEwM7SQ.js";import"./D7W_4Sqc.js";function xe({x:C,y:e,w:i,h:_,tl:n=!1,tr:M=!1,bl:u=!1,br:R=!1,r:b=0}){let p;p=`M${C+b},${e}h${i-2*b}`;let r=M?b:0,l=M?0:b;return p+=`a${r},${r} 0 0 1 ${r},${r}`,p+=`h${l}v${l}`,p+=`v${_-2*b}`,r=R?b:0,l=R?0:b,p+=`a${r},${r} 0 0 1 ${-r},${r}`,p+=`v${l}h${-l}`,p+=`h${2*b-i}`,r=u?b:0,l=u?0:b,p+=`a${r},${r} 0 0 1 ${-r},${-r}`,p+=`h${-l}v${-l}`,p+=`v${2*b-_}`,r=n?b:0,l=n?0:b,p+=`a${r},${r} 0 0 1 ${r},${-r}`,p+=`v${-l}h${l}`,p+="z",p}const ve=Object.assign(Object.assign({},se),{color:void 0,barMaxWidth:void 0,barWidth:void 0,dataStep:void 0,barPadding:0,roundedCorners:2,cursor:null,barMinHeight1Px:!1,barMinHeightZeroValue:null,orientation:Tt.Vertical}),Et=dt`
|
|
2
2
|
label: stacked-bar-component;
|
|
3
3
|
`,ke=ne`
|
|
4
4
|
:root {
|
|
@@ -31,4 +31,4 @@ import{_ as At,a as Lt}from"./DTrPCv7R.js";import{_ as Ot,a as Bt}from"./2yLW7WU
|
|
|
31
31
|
label: barGroup;
|
|
32
32
|
`,Vt=dt`
|
|
33
33
|
label: barGroupExit;
|
|
34
|
-
`,$e=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:ht,barGroupExit:Vt,globalStyles:ke,root:Et},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=ve,this.config=this._defaultConfig,this.getAccessors=()=>oe(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],i=this.dataScale.domain(),_=this._getBarWidth()/2,n=this._barData.map((x,m)=>et(x,this.config.x,m)),M=mt(n),u=ie(n),R=this.dataScale(M),b=this.dataScale(u),p=this.dataScale.invert(R+(e?_:-_)),r=this.dataScale.invert(b+(e?-_:_)),l=p<=i[0]?this.dataScale(i[0])-this.dataScale(p):0,j=r>i[1]?this.dataScale(r)-this.dataScale(i[1]):0;return{top:this.isVertical()?0:e?-j:l,bottom:this.isVertical()?0:e?-l:j,left:this.isVertical()?l:0,right:this.isVertical()?j:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Tt.Vertical}_render(e){const{config:i}=this,_=kt(e)?e:i.duration,n=this.getAccessors(),M=le(this._barData,0,n,this._prevNegative);this._prevNegative=M.map(m=>!!m.isMostlyNegative);const u=this.g.selectAll(`.${ht}`).data(this._barData,(m,g)=>{var c;return`${(c=$t(m,i.id,g))!==null&&c!==void 0?c:g}`}),R=(m,g)=>{const c=this.dataScale(et(m,i.x,g)),S=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${S},${o})`},p=u.enter().append("g").attr("class",ht).attr("transform",R).style("opacity",1).merge(u);st(p,_).attr("transform",R).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,_).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),_).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const l=p.selectAll(`.${rt}`).data((m,g)=>{const c=M.map((S,o)=>({datum:m,index:g,stacked:S[g],stackIndex:o})).filter(S=>S.stacked[0]!==S.stacked[1]);return c.forEach((S,o)=>{S.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==S.stacked[1]}),c},m=>m.stackIndex),x=l.enter().append("path").attr("class",rt).attr("d",m=>this._getBarPath(m,!0)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).merge(l);st(x,_).attr("d",m=>this._getBarPath(m)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).style("cursor",m=>$t(m.datum,i.cursor,m.stackIndex)),st(l.exit(),_).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:i}}=this;if(ce(i))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const _=this.dataScale.bandwidth,n=this.dataScale.domain?this.dataScale.domain():[];let u=1+(_?n.length:n[1]-n[0])/e.dataStep||!_&&i.filter((p,r)=>{const l=et(p,e.x,r);return l>=n[0]&&l<=n[1]}).length||i.length;!_&&u>=2&&(u+=1);const b=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return mt([b,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:i}}=this,_=this._getBarWidth(),n=i.length<2?0:_/2,M=this.dataScale,u=Math.abs(M.invert(n)-M.invert(0));return i?.filter((b,p)=>{const r=et(b,e.x,p),l=M.domain(),j=+l[0],x=+l[1];return r>=j-u&&r<=x+u})}_getBarPath(e,i=!1){const{config:_}=this,n=this.getAccessors(),M=this._getBarWidth(),u=e.stacked[1]<0,R=e.isEnding,b=et(e.datum,n[e.stackIndex],e.index),p=i?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!i&&_.barMinHeight1Px&&p<1&&isFinite(b)&&b!==_.barMinHeightZeroValue?1:p,l=i?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(p<1&&_.barMinHeight1Px?1:0),j=-M/2,x=M,m=_.roundedCorners?kt(_.roundedCorners)?+_.roundedCorners:x/2:0,g=me(m,0,Math.min(p,x)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return xe({x:this.isVertical()?j:l-r,y:this.isVertical()?l+(c?0:-r):j,w:this.isVertical()?x:r,h:this.isVertical()?r:x,tl:R&&(this.isVertical()?!u&&c||u&&!c:u),tr:R&&(this.isVertical()?!u&&c||u&&!c:!u),br:R&&(this.isVertical()?u&&c||!u&&!c:!u),bl:R&&(this.isVertical()?u&&c||!u&&!c:u),r:g})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:i}=this,_=this.getAccessors(),n=e?this._getVisibleData():i.data;return de(n,..._)}getDataScaleExtent(){const{config:e,datamodel:i}=this;return ue(i.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=$e;const Se={"data-vis-component":""},Ce=z({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(C,{expose:e}){const i=Ut(pe),_=C,n=E(()=>i.data.value??_.data),M=_e(_),u=ft();return Ft(()=>{qt(()=>{u.value=new It(M.value),u.value?.setData(n.value),i.update(u.value)})}),Wt(()=>{u.value?.destroy(),i.destroy()}),vt(M,(R,b)=>{ye(R,b)||(u.value?.setConfig(M.value),u.value?.render())}),vt(n,()=>{u.value?.setData(n.value)}),e({component:u}),(R,b)=>(s(),v("div",Se))}}),we=30,gt=3650;function Me(C){const e={days:String(C.days)};return C.projectIds&&C.projectIds.length>0&&(e.projects=C.projectIds.join(",")),C.environment&&(e.environment=C.environment),C.fullRunsOnly||(e.fullRunsOnly="false"),e}const J={days:we,projectIds:[],environment:null,fullRunsOnly:!0};function Re(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:_=>JSON.stringify(_),decode:_=>{try{return _?{...J,...JSON.parse(_)}:{...J}}catch{return{...J}}}}),e=E(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),i=E(()=>Me(e.value));return{state:C,scope:e,scopeQuery:i}}function Y(C,e){return _t(`/api/analytics/${C}`,{query:E(e),lazy:!0,server:!1},"$UlG3SHNJJg")}const Te={class:"flex items-center gap-3 flex-wrap"},je={class:"flex items-center gap-1.5"},De={key:0,class:"text-gray-500"},Ee={key:1,class:"truncate"},Ve={key:2},Ie={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},pt="All environments",Ne=z({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const i=C,_=e,n=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:gt}],M=E({get:()=>i.modelValue.days,set:m=>_("update:modelValue",{...i.modelValue,days:m})}),u=E(()=>i.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),R=E({get:()=>i.modelValue.projectIds,set:m=>_("update:modelValue",{...i.modelValue,projectIds:m})});function b(m){return u.value.find(g=>g.value===m)?.label??`#${m}`}const p=E({get:()=>i.modelValue.environment??pt,set:m=>_("update:modelValue",{...i.modelValue,environment:m===pt?null:m})}),r=E(()=>[pt,...i.availableEnvironments]),l=E({get:()=>i.modelValue.fullRunsOnly,set:m=>_("update:modelValue",{...i.modelValue,fullRunsOnly:m})}),j=E(()=>i.modelValue.days===J.days&&i.modelValue.projectIds.length===0&&i.modelValue.environment===null&&i.modelValue.fullRunsOnly===J.fullRunsOnly);function x(){_("update:modelValue",{...J})}return(m,g)=>{const c=zt,S=lt,o=Ht,d=Yt,y=q;return s(),v("div",Te,[$(c,{modelValue:t(M),"onUpdate:modelValue":g[0]||(g[0]=T=>at(M)?M.value=T:null),items:n,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),k(o,{key:0,modelValue:t(R),"onUpdate:modelValue":g[1]||(g[1]=T=>at(R)?R.value=T:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:T})=>[a("div",je,[$(S,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",T.length?"text-primary":"text-gray-400"])},null,8,["class"]),T.length?T.length===1?(s(),v("span",Ee,h(b(T[0])),1)):(s(),v("span",Ve,h(T.length)+" projects",1)):(s(),v("span",De,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),k(c,{key:1,modelValue:t(p),"onUpdate:modelValue":g[2]||(g[2]=T=>at(p)?p.value=T:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),a("label",Ie,[$(d,{modelValue:t(l),"onUpdate:modelValue":g[3]||(g[3]=T=>at(l)?l.value=T:null),size:"sm"},null,8,["modelValue"]),g[4]||(g[4]=D(" Full runs only ",-1))]),t(j)?P("",!0):(s(),k(y,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:x},{default:f(()=>[...g[5]||(g[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ne,{__name:"AnalyticsScopeBar"}),Ae=[{id:"health",label:"Where things stand",description:"The state of every project right now."},{id:"pain",label:"Where the pain is",description:"What is costing you the most time and attention."},{id:"trends",label:"Which way it is going",description:"Movement over the selected period."},{id:"detail",label:"Detail",description:"Breakdowns to reach for once you know what you are chasing."}],Nt=[{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full",band:"health"},{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half",band:"health"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half",band:"health"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half",band:"pain"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half",band:"pain"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half",band:"pain"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half",band:"trends"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half",band:"trends"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half",band:"detail"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full",band:"detail"}];new Set(Nt.map(C=>C.id));const Le={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Oe={class:"min-w-0"},Be={class:"text-sm font-medium"},ze={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},Ue=z({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("insights",()=>_.query)),e=await e,i(),e),b=Q,p={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(r,l)=>{const j=G,x=q,m=H,g=X,c=lt,S=K;return s(),k(S,{icon:"i-lucide-lightbulb",title:"Insights",count:t(n)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=o=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Le,[(s(!0),v(N,null,L(t(n),o=>(s(),k(wt(o.to?t(b):"div"),{key:o.id,to:o.to,class:A(["flex items-start gap-3 py-3 pl-3 border-l-2",[p[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[$(c,{name:p[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",p[o.severity].class])},null,8,["name","class"]),a("div",Oe,[a("p",Be,h(o.message),1),o.detail?(s(),v("p",ze,h(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Fe=Object.assign(Ue,{__name:"InsightsFeed"}),qe={class:"md:hidden space-y-3"},We={class:"flex items-center justify-between gap-2"},Ge={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},He={key:0},Ye={class:"hidden md:block"},Xe={class:"w-full text-sm"},Je={class:"divide-y divide-gray-100 dark:divide-gray-800"},Qe={class:"py-2.5 pr-4"},Ze={class:"flex items-center gap-2 min-w-0"},Ke={class:"py-2.5 pr-4"},ts={class:"w-36"},es={class:"py-2.5 pr-4 text-right"},ss={class:"py-2.5 pr-4 text-right tabular-nums"},as={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ns={class:"py-2.5 text-right"},rs={class:"text-xs text-gray-500 dark:text-gray-400"},os={key:1,class:"text-xs text-gray-400"},is=z({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("portfolio",()=>_.query)),e=await e,i(),e);function b(r){return r===null?"text-gray-400":r>=90?"text-green-600 dark:text-green-400":r>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function p(r){return r===null||Math.abs(r)<1?null:r>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Q,S=Kt,o=Rt,d=lt,y=te,T=ee,V=ct,I=K;return s(),k(I,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(n)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=w=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No projects with runs in this period."})):(s(),v(N,{key:3},[a("div",qe,[(s(!0),v(N,null,L(t(n),w=>(s(),v("div",{key:w.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[a("div",We,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),a("span",{class:A(["tabular-nums font-semibold shrink-0",b(w.passRate)])},h(w.passRate!==null?`${w.passRate}%`:"—"),3)]),$(S,{runs:w.recentRuns,height:20},null,8,["runs"]),a("div",Ge,[a("span",null,h(w.runCount)+" runs · "+h(w.flakyTests)+" flaky · "+h(w.openClusters)+" open clusters",1),w.latestRun?(s(),v("span",He,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)):P("",!0)])]))),128))]),a("div",Ye,[$(V,{"min-width":"52rem"},{default:f(()=>[a("table",Xe,[l[2]||(l[2]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Project"),a("th",{class:"py-2 pr-4 font-medium"},"Trend"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),a("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),a("tbody",Je,[(s(!0),v(N,null,L(t(n),w=>(s(),v("tr",{key:w.projectId},[a("td",Qe,[a("div",Ze,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),(s(!0),v(N,null,L(w.tags.slice(0,2),U=>(s(),k(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),a("td",Ke,[a("div",ts,[$(S,{runs:w.recentRuns,height:22},null,8,["runs"])])]),a("td",es,[a("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(w.passRate)])},[D(h(w.passRate!==null?`${w.passRate}%`:"—")+" ",1),p(w.passRateDelta)?(s(),k(d,{key:0,name:p(w.passRateDelta).icon,class:A(["size-3.5",p(w.passRateDelta).class]),title:`${w.passRateDelta>0?"+":""}${w.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),a("td",ss,h(w.runCount),1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},h(w.flakyTests),3),a("td",as,[$(y,{ms:w.avgRunDurationMs},null,8,["ms"])]),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.openClusters>0?"text-red-600 dark:text-red-400":""])},h(w.openClusters),3),a("td",ns,[w.latestRun?(s(),k(c,{key:0,to:`/test-runs/${w.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[$(T,{status:w.latestRun.status},null,8,["status"]),a("span",rs,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",os,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ls=Object.assign(is,{__name:"PortfolioScorecard"}),cs={class:"space-y-1"},ds={class:"flex gap-px"},us=["title"],ms={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},ps={class:"relative h-4"},_s=z({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("pass-rate-heatmap",()=>_.query)),e=await e,i(),e);function b(c){return c===null?{}:c>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:c>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:c>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:c>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function p(c,S,o){const d=n.value?.buckets[S]??"",y=(n.value?.bucketDays??1)>1?` (${n.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${y}: ${o!==null?`${o}% passed`:"no runs"}`}const r=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],l=E(()=>{const c=n.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),j=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],x=E(()=>{const c=n.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function m(c){const[S,o,d]=c.split("-"),y=j[Number(o)-1];return x.value?`${y} ${S}`:`${y} ${Number(d)}`}const g=E(()=>{const c=n.value?.buckets??[],S=c.length;if(S===0)return[];const o=Math.min(x.value?4:5,S),d=new Set,y=[];for(let T=0;T<o;T++){const V=o===1?0:Math.round(T*(S-1)/(o-1));if(d.has(V))continue;d.add(V);const I=V===0?0:V===S-1?100:(V+.5)/S*100,w=V===0?"translateX(0)":V===S-1?"translateX(-100%)":"translateX(-50%)";y.push({index:V,label:m(c[V]),left:I,transform:w})}return y});return(c,S)=>{const o=G,d=q,y=H,T=X,V=Q,I=bt,w=ct,U=ut;return s(),k(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(l),help:"analytics.heatmap"},{default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:S[0]||(S[0]=O=>t(R)())},{default:f(()=>[...S[1]||(S[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(T,{key:2,text:"No runs in this period."})):(s(),k(w,{key:3,"min-width":"22rem"},{default:f(()=>[a("div",cs,[(s(!0),v(N,null,L(t(n).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[$(V,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(h(O.label||O.name),1)]),_:2},1032,["to","title"]),a("div",ds,[(s(!0),v(N,null,L(O.cells,(nt,tt)=>(s(),v("div",{key:tt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:ot(b(nt)),title:p(O,tt,nt)},null,12,us))),128))])]))),128)),a("div",ms,[S[2]||(S[2]=a("span",null,null,-1)),a("div",ps,[(s(!0),v(N,null,L(t(g),O=>(s(),v("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:ot({left:`${O.left}%`,transform:O.transform})},h(O.label),5))),128))])]),$(I,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ys=Object.assign(_s,{__name:"PassRateHeatmap"}),hs={key:3,class:"w-full relative"},gs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},fs={class:"font-semibold mb-1"},bs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",xs=z({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("ci-time-trend",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),p=E(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,l=o=>o.totalMinutes,j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const o=n.value.deltaPct;return{label:`${o>0?"+":""}${o}% vs previous period`,class:o>25?"text-red-600 dark:text-red-400":o<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),S=E(()=>{if(!n.value)return;const o=n.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${n.value.runCount} runs`});return(o,d)=>{const y=G,T=q,V=H,I=X,w=ut;return s(),k(w,{icon:"i-lucide-timer",title:"CI time",subtitle:t(S),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},h(t(c).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(y,{key:0})):t(u)?(s(),k(V,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(T,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(R)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",hs,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:l,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),$(t(he),{x:r,y:l,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),$(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",gs,[a("div",fs,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,h(t(x).totalMinutes)+" minutes",1),a("div",bs,h(t(x).runCount)+" runs",1)])],4)):P("",!0)])):(s(),k(I,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),vs=Object.assign(xs,{__name:"CiTimeTrendChart"}),ks={key:3,class:"w-full relative"},$s={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ss={class:"font-semibold mb-1"},Cs={key:1,class:"mt-4 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2.5 text-sm dark:border-amber-900/50 dark:bg-amber-950/30"},ws={class:"text-gray-700 dark:text-gray-300"},Ms={class:"font-semibold"},Rs={key:2,class:"mt-4 space-y-1"},Ts={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},js=z({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("wasted-time",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(y=>({date:new Date(y.date),waitMinutes:y.waitMinutes,failedExecMinutes:y.failedExecMinutes}))??[]),p=E(()=>b.value.some(y=>y.waitMinutes>0||y.failedExecMinutes>0)),r=y=>y.date,l=["rgb(245, 158, 11)","rgb(239, 68, 68)"],j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:y=>y.date,series:[{y:y=>y.waitMinutes,color:l[0]},{y:y=>y.failedExecMinutes,color:l[1]}]}),c=[{color:l[0],label:"Wait steps"},{color:l[1],label:"Failed attempts"}],S=E(()=>{if(!n.value)return;const y=n.value.totalWaitMinutes+n.value.totalFailedExecMinutes;return`${y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`} of CI time produced no signal`}),o=E(()=>n.value?.timeoutReclaimable??null),d=E(()=>{const y=o.value?.estimatedMinutes??0;return y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`});return(y,T)=>{const V=bt,I=G,w=q,U=H,O=X,nt=lt,tt=Q,Pt=ut;return s(),k(Pt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t(S),help:"analytics.wasted-time"},{legend:f(()=>[$(V,{items:c,dense:""})]),default:f(()=>[t(M)?(s(),k(I,{key:0})):t(u)?(s(),k(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in y?y.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:T[0]||(T[0]=B=>t(R)())},{default:f(()=>[...T[1]||(T[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",ks,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:[B=>B.waitMinutes,B=>B.failedExecMinutes],color:l,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),$(t(Z),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",$s,[a("div",Ss,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,[T[2]||(T[2]=a("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+h(t(x).waitMinutes)+" min",1)]),a("div",null,[T[3]||(T[3]=a("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+h(t(x).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",Cs,[$(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),a("div",ws,[T[5]||(T[5]=D(" Up to ",-1)),a("span",Ms,"≈"+h(t(d)),1),D(" of this is avoidable — "+h(t(o).oversizedCount)+" oversized "+h(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+h(t(o).staleSlowCount)+" stale ",1),T[6]||(T[6]=a("code",{class:"text-xs"},"test.slow()",-1)),D(" "+h(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),k(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...T[4]||(T[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(n)&&t(n).byProject.length>0?(s(),v("div",Rs,[(s(!0),v(N,null,L(t(n).byProject.slice(0,5),B=>(s(),v("div",{key:B.projectId,class:"flex items-center justify-between text-sm"},[$(tt,{to:`/projects/${B.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(h(B.label||B.name),1)]),_:2},1032,["to"]),a("span",Ts,h(Math.round(B.waitMinutes+B.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),k(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Ds=Object.assign(js,{__name:"WastedTimeChart"}),Es={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Vs={class:"flex-1 min-w-0"},Is={class:"text-sm font-medium truncate"},Ns={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ps={class:"text-right shrink-0"},As=z({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("flaky-leaderboard",()=>_.query)),e=await e,i(),e);function b(r){return r>=60?"text-red-600 dark:text-red-400":r>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function p(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Rt,S=Q,o=K;return s(),k(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(n)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",Es,[(s(!0),v(N,null,L(t(n),d=>(s(),k(S,{key:`${d.projectId}-${d.testCaseId}`,to:`/test-cases/${d.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},h(d.score),3),a("div",Vs,[a("p",Is,h(d.title),1),a("p",Ns,[D(h(d.projectLabel||d.projectName)+" · "+h(p(d))+" ",1),d.lastFlakeAt?(s(),v(N,{key:0},[D(" · last "+h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(d.lastFlakeAt)),1)],64)):P("",!0)])]),a("div",Ps,[a("p",{class:A(["text-sm tabular-nums",d.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":d.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},h(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),k(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ls=Object.assign(As,{__name:"GlobalFlakyLeaderboard"}),Os={key:3,class:"space-y-4"},Bs={key:0,class:"flex flex-wrap gap-1.5"},zs={class:"divide-y divide-gray-100 dark:divide-gray-800"},Us={class:"flex-1 min-w-0"},Fs={class:"text-sm font-medium truncate"},qs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ws={class:"text-right text-xs shrink-0"},Gs={class:"tabular-nums font-medium"},Hs=z({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("cluster-landscape",()=>_.query)),e=await e,i(),e);function b(p){return p>=30?"text-red-600 dark:text-red-400":p>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=ge,c=fe,S=Mt,o=Q,d=K;return s(),k(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load clusters: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=y=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).totalOpen===0&&t(n).resolvedInPeriod===0?(s(),k(m,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",Os,[$(c,null,{default:f(()=>[$(g,{label:"Open",value:t(n).totalOpen,"value-class":t(n).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),$(g,{label:"Resolved this period",value:t(n).resolvedInPeriod},null,8,["value"]),$(g,{label:"Oldest open",value:t(n).clusters.length>0?`${Math.max(...t(n).clusters.map(y=>y.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(n).byErrorType.length>0?(s(),v("div",Bs,[(s(!0),v(N,null,L(t(n).byErrorType,y=>(s(),k(S,{key:y.errorType,color:("clusterErrorTypeColor"in p?p.clusterErrorTypeColor:t(Zt))(y.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(h(y.errorType)+" · "+h(y.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),a("div",zs,[(s(!0),v(N,null,L(t(n).clusters.slice(0,8),y=>(s(),k(o,{key:y.id,to:`/failure-clusters/${y.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("div",Us,[a("p",Fs,h(y.title||y.signature),1),a("p",qs,[D(h(y.projectLabel||y.projectName)+" ",1),y.errorType?(s(),v(N,{key:0},[D(" · "+h(y.errorType),1)],64)):P("",!0)])]),a("div",Ws,[a("p",Gs,h(y.occurrences)+"×",1),a("p",{class:A(["tabular-nums",b(y.ageDays)])},h(y.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Ys=Object.assign(Hs,{__name:"ClusterLandscape"}),Xs={key:3,class:"w-full"},Js=z({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("regression-velocity",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(g=>({date:new Date(g.date),regressions:g.regressions,newFlaky:g.newFlaky}))??[]),p=E(()=>b.value.some(g=>g.regressions>0||g.newFlaky>0)),r=g=>g.date,l=["rgb(239, 68, 68)","rgb(147, 51, 234)"],j=[{color:l[0],label:"New regressions"},{color:l[1],label:"Newly flaky"}],x=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const g=n.value.deltaPct;return{label:`${g>0?"+":""}${g}% vs previous period`,class:g>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),m=E(()=>{if(n.value)return`${n.value.totalRegressions} new regressions, ${n.value.totalNewFlaky} newly flaky`});return(g,c)=>{const S=bt,o=G,d=q,y=H,T=X,V=ut;return s(),k(V,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(m),help:"analytics.regression-velocity"},{legend:f(()=>[$(S,{items:j,dense:""})]),actions:f(()=>[t(x)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(x).class])},h(t(x).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in g?g.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=I=>t(R)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",Xs,[$(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[$(t(Ce),{x:r,y:[I=>I.regressions,I=>I.newFlaky],color:l,"rounded-corners":2},null,8,["y"]),$(t(Z),{type:"x","tick-format":I=>new Date(I).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Count","tick-format":I=>I.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),k(T,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Qs=Object.assign(Js,{__name:"RegressionVelocityChart"}),Zs={class:"w-full text-sm border-separate border-spacing-1"},Ks={class:"pr-2 max-w-[12rem]"},ta=["title"],ea=z({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("browser-matrix",()=>_.query)),e=await e,i(),e);function b(p){return p===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":p>=99.5?"bg-green-500/85 text-white":p>=90?"bg-green-500/45":p>=75?"bg-amber-500/50":p>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=Q,c=ct,S=K;return s(),k(S,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(m,{key:2,text:"No runs with browser data in this period."})):(s(),k(c,{key:3,"min-width":"30rem"},{default:f(()=>[a("table",Zs,[a("thead",null,[a("tr",null,[r[2]||(r[2]=a("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(N,null,L(t(n).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},h(o),1))),128))])]),a("tbody",null,[(s(!0),v(N,null,L(t(n).rows,o=>(s(),v("tr",{key:o.projectId},[a("td",Ks,[$(g,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(h(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(N,null,L(o.cells,(d,y)=>(s(),v("td",{key:y,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(n).browsers[y]}: ${d!==null?`${d}% passed`:"no tests"}`},h(d!==null?`${Math.round(d)}%`:"—"),11,ta))),128))]))),128))])])]),_:1}))]),_:1})}}}),sa=Object.assign(ea,{__name:"BrowserMatrix"}),aa={class:"md:hidden space-y-3"},na={class:"flex items-center gap-2 min-w-0"},ra={class:"text-xs truncate"},oa={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ia={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},la={class:"hidden md:block"},ca={class:"w-full text-sm"},da={class:"divide-y divide-gray-100 dark:divide-gray-800"},ua={class:"py-2.5 pr-4"},ma={class:"flex items-center gap-2 min-w-0"},pa=["title"],_a={class:"py-2.5 pr-4 text-right tabular-nums"},ya={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ha={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ga={class:"py-2.5 text-right tabular-nums"},fa=z({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("slow-endpoints",()=>_.query)),e=await e,i(),e);function b(r){return r>=1e3?"text-red-600 dark:text-red-400":r>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function p(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,l)=>{const j=G,x=q,m=H,g=be,c=Mt,S=ct,o=K;return s(),k(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(n)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).endpoints.length===0?(s(),k(g,{key:2,icon:"i-lucide-network",title:"No network requests captured in this period",text:"Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",doc:"capture-fixtures"})):(s(),v(N,{key:3},[a("div",aa,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("div",{key:`${d.method} ${d.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[a("div",na,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",ra,h(d.route),1)]),a("div",oa,[a("span",null,[l[2]||(l[2]=D("p90 ",-1)),a("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms",3)]),a("span",null,h(d.requests)+" reqs · "+h(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ia,h(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),a("div",la,[$(S,{"min-width":"44rem"},{default:f(()=>[a("table",ca,[l[3]||(l[3]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),a("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),a("tbody",da,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[a("td",ua,[a("div",ma,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},h(d.route),9,pa)])]),a("td",_a,h(d.requests),1),a("td",ya,h(d.p50Ms)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms ",3),a("td",ha,h(d.maxMs)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",d.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},h(d.errorRate)+"% ",3),a("td",ga,h(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ba=Object.assign(fa,{__name:"SlowEndpointsTable"}),xa={class:"space-y-6"},va={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ka={class:"text-sm text-muted"},$a={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},ln=z({__name:"analytics",async setup(C){let e,i;Gt({title:"Analytics - Piwi Dashboard"});const{state:_,scopeQuery:n}=Re(),{data:M}=([e,i]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$sFpNat489G")),e=await e,i(),e),{data:u}=([e,i]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$QJEpX0hRMv")),e=await e,i(),e),R=E(()=>{const x=new Set;for(const m of u.value??[])m.environment&&x.add(m.environment);return[...x].sort()}),b=E(()=>{const x=u.value??[];return x.length===0?null:Math.max(...x.map(m=>new Date(m.startTime).getTime()))}),p=E(()=>{if(b.value===null||_.value.days>=gt)return!1;const x=Date.now()-_.value.days*24*60*60*1e3;return b.value<x});function r(){_.value={..._.value,days:gt}}const l={insights:Fe,portfolio:ls,"pass-rate-heatmap":ys,"ci-time-trend":vs,"wasted-time":Ds,"flaky-leaderboard":Ls,"cluster-landscape":Ys,"regression-velocity":Qs,"browser-matrix":sa,"slow-endpoints":ba},j=E(()=>Ae.map(x=>({...x,widgets:Nt.filter(m=>m.band===x.id)})).filter(x=>x.widgets.length>0));return(x,m)=>{const g=At,c=Lt,S=Bt,o=Pe,d=Jt,y=Qt,T=Ot;return s(),k(T,{id:"analytics"},{header:f(()=>[$(S,null,{leading:f(()=>[$(g),$(c,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[a("div",xa,[$(d,null,{default:f(()=>[$(o,{modelValue:t(_),"onUpdate:modelValue":m[0]||(m[0]=V=>at(_)?_.value=V:null),"available-projects":t(M),"available-environments":t(R)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(p)?(s(),k(y,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(_).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:t(it))(t(b))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:r}]},null,8,["title","description","actions"])):P("",!0),(s(!0),v(N,null,L(t(j),V=>(s(),v("section",{key:V.id,class:"space-y-3"},[a("div",null,[a("h2",va,h(V.label),1),a("p",ka,h(V.description),1)]),a("div",$a,[(s(!0),v(N,null,L(V.widgets,I=>(s(),v("div",{key:I.id,class:A(I.size==="full"?"xl:col-span-2":"")},[(s(),k(wt(l[I.id]),{query:t(n)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{ln as default};
|
|
34
|
+
`,$e=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:ht,barGroupExit:Vt,globalStyles:ke,root:Et},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=ve,this.config=this._defaultConfig,this.getAccessors=()=>oe(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],i=this.dataScale.domain(),_=this._getBarWidth()/2,n=this._barData.map((x,m)=>et(x,this.config.x,m)),M=mt(n),u=ie(n),R=this.dataScale(M),b=this.dataScale(u),p=this.dataScale.invert(R+(e?_:-_)),r=this.dataScale.invert(b+(e?-_:_)),l=p<=i[0]?this.dataScale(i[0])-this.dataScale(p):0,j=r>i[1]?this.dataScale(r)-this.dataScale(i[1]):0;return{top:this.isVertical()?0:e?-j:l,bottom:this.isVertical()?0:e?-l:j,left:this.isVertical()?l:0,right:this.isVertical()?j:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Tt.Vertical}_render(e){const{config:i}=this,_=kt(e)?e:i.duration,n=this.getAccessors(),M=le(this._barData,0,n,this._prevNegative);this._prevNegative=M.map(m=>!!m.isMostlyNegative);const u=this.g.selectAll(`.${ht}`).data(this._barData,(m,g)=>{var c;return`${(c=$t(m,i.id,g))!==null&&c!==void 0?c:g}`}),R=(m,g)=>{const c=this.dataScale(et(m,i.x,g)),S=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${S},${o})`},p=u.enter().append("g").attr("class",ht).attr("transform",R).style("opacity",1).merge(u);st(p,_).attr("transform",R).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,_).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),_).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const l=p.selectAll(`.${rt}`).data((m,g)=>{const c=M.map((S,o)=>({datum:m,index:g,stacked:S[g],stackIndex:o})).filter(S=>S.stacked[0]!==S.stacked[1]);return c.forEach((S,o)=>{S.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==S.stacked[1]}),c},m=>m.stackIndex),x=l.enter().append("path").attr("class",rt).attr("d",m=>this._getBarPath(m,!0)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).merge(l);st(x,_).attr("d",m=>this._getBarPath(m)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).style("cursor",m=>$t(m.datum,i.cursor,m.stackIndex)),st(l.exit(),_).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:i}}=this;if(ce(i))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const _=this.dataScale.bandwidth,n=this.dataScale.domain?this.dataScale.domain():[];let u=1+(_?n.length:n[1]-n[0])/e.dataStep||!_&&i.filter((p,r)=>{const l=et(p,e.x,r);return l>=n[0]&&l<=n[1]}).length||i.length;!_&&u>=2&&(u+=1);const b=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return mt([b,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:i}}=this,_=this._getBarWidth(),n=i.length<2?0:_/2,M=this.dataScale,u=Math.abs(M.invert(n)-M.invert(0));return i?.filter((b,p)=>{const r=et(b,e.x,p),l=M.domain(),j=+l[0],x=+l[1];return r>=j-u&&r<=x+u})}_getBarPath(e,i=!1){const{config:_}=this,n=this.getAccessors(),M=this._getBarWidth(),u=e.stacked[1]<0,R=e.isEnding,b=et(e.datum,n[e.stackIndex],e.index),p=i?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!i&&_.barMinHeight1Px&&p<1&&isFinite(b)&&b!==_.barMinHeightZeroValue?1:p,l=i?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(p<1&&_.barMinHeight1Px?1:0),j=-M/2,x=M,m=_.roundedCorners?kt(_.roundedCorners)?+_.roundedCorners:x/2:0,g=me(m,0,Math.min(p,x)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return xe({x:this.isVertical()?j:l-r,y:this.isVertical()?l+(c?0:-r):j,w:this.isVertical()?x:r,h:this.isVertical()?r:x,tl:R&&(this.isVertical()?!u&&c||u&&!c:u),tr:R&&(this.isVertical()?!u&&c||u&&!c:!u),br:R&&(this.isVertical()?u&&c||!u&&!c:!u),bl:R&&(this.isVertical()?u&&c||!u&&!c:u),r:g})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:i}=this,_=this.getAccessors(),n=e?this._getVisibleData():i.data;return de(n,..._)}getDataScaleExtent(){const{config:e,datamodel:i}=this;return ue(i.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=$e;const Se={"data-vis-component":""},Ce=B({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(C,{expose:e}){const i=Ut(pe),_=C,n=E(()=>i.data.value??_.data),M=_e(_),u=ft();return Ft(()=>{qt(()=>{u.value=new It(M.value),u.value?.setData(n.value),i.update(u.value)})}),Wt(()=>{u.value?.destroy(),i.destroy()}),vt(M,(R,b)=>{ye(R,b)||(u.value?.setConfig(M.value),u.value?.render())}),vt(n,()=>{u.value?.setData(n.value)}),e({component:u}),(R,b)=>(s(),v("div",Se))}}),we=30,gt=3650;function Me(C){const e={days:String(C.days)};return C.projectIds&&C.projectIds.length>0&&(e.projects=C.projectIds.join(",")),C.environment&&(e.environment=C.environment),C.fullRunsOnly||(e.fullRunsOnly="false"),e}const J={days:we,projectIds:[],environment:null,fullRunsOnly:!0};function Re(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:_=>JSON.stringify(_),decode:_=>{try{return _?{...J,...JSON.parse(_)}:{...J}}catch{return{...J}}}}),e=E(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),i=E(()=>Me(e.value));return{state:C,scope:e,scopeQuery:i}}function Y(C,e){return _t(`/api/analytics/${C}`,{query:E(e),lazy:!0,server:!1},"$UlG3SHNJJg")}const Te={class:"flex items-center gap-3 flex-wrap"},je={class:"flex items-center gap-1.5"},De={key:0,class:"text-gray-500"},Ee={key:1,class:"truncate"},Ve={key:2},Ie={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},pt="All environments",Ne=B({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const i=C,_=e,n=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:gt}],M=E({get:()=>i.modelValue.days,set:m=>_("update:modelValue",{...i.modelValue,days:m})}),u=E(()=>i.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),R=E({get:()=>i.modelValue.projectIds,set:m=>_("update:modelValue",{...i.modelValue,projectIds:m})});function b(m){return u.value.find(g=>g.value===m)?.label??`#${m}`}const p=E({get:()=>i.modelValue.environment??pt,set:m=>_("update:modelValue",{...i.modelValue,environment:m===pt?null:m})}),r=E(()=>[pt,...i.availableEnvironments]),l=E({get:()=>i.modelValue.fullRunsOnly,set:m=>_("update:modelValue",{...i.modelValue,fullRunsOnly:m})}),j=E(()=>i.modelValue.days===J.days&&i.modelValue.projectIds.length===0&&i.modelValue.environment===null&&i.modelValue.fullRunsOnly===J.fullRunsOnly);function x(){_("update:modelValue",{...J})}return(m,g)=>{const c=Bt,S=lt,o=Ht,d=Yt,y=q;return s(),v("div",Te,[$(c,{modelValue:t(M),"onUpdate:modelValue":g[0]||(g[0]=T=>at(M)?M.value=T:null),items:n,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),k(o,{key:0,modelValue:t(R),"onUpdate:modelValue":g[1]||(g[1]=T=>at(R)?R.value=T:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:T})=>[a("div",je,[$(S,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",T.length?"text-primary":"text-gray-400"])},null,8,["class"]),T.length?T.length===1?(s(),v("span",Ee,h(b(T[0])),1)):(s(),v("span",Ve,h(T.length)+" projects",1)):(s(),v("span",De,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),k(c,{key:1,modelValue:t(p),"onUpdate:modelValue":g[2]||(g[2]=T=>at(p)?p.value=T:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),a("label",Ie,[$(d,{modelValue:t(l),"onUpdate:modelValue":g[3]||(g[3]=T=>at(l)?l.value=T:null),size:"sm"},null,8,["modelValue"]),g[4]||(g[4]=D(" Full runs only ",-1))]),t(j)?P("",!0):(s(),k(y,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:x},{default:f(()=>[...g[5]||(g[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ne,{__name:"AnalyticsScopeBar"}),Ae=[{id:"health",label:"Where things stand",description:"The state of every project right now."},{id:"pain",label:"Where the pain is",description:"What is costing you the most time and attention."},{id:"trends",label:"Which way it is going",description:"Movement over the selected period."},{id:"detail",label:"Detail",description:"Breakdowns to reach for once you know what you are chasing."}],Nt=[{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full",band:"health"},{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half",band:"health"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half",band:"health"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half",band:"pain"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half",band:"pain"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half",band:"pain"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half",band:"trends"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half",band:"trends"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half",band:"detail"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full",band:"detail"}];new Set(Nt.map(C=>C.id));const Le={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Oe={class:"min-w-0"},ze={class:"text-sm font-medium"},Be={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},Ue=B({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("insights",()=>_.query)),e=await e,i(),e),b=Q,p={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(r,l)=>{const j=G,x=q,m=H,g=X,c=lt,S=K;return s(),k(S,{icon:"i-lucide-lightbulb",title:"Insights",count:t(n)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=o=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Le,[(s(!0),v(N,null,L(t(n),o=>(s(),k(wt(o.to?t(b):"div"),{key:o.id,to:o.to,class:A(["flex items-start gap-3 py-3 pl-3 border-l-2",[p[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[$(c,{name:p[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",p[o.severity].class])},null,8,["name","class"]),a("div",Oe,[a("p",ze,h(o.message),1),o.detail?(s(),v("p",Be,h(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Fe=Object.assign(Ue,{__name:"InsightsFeed"}),qe={class:"md:hidden space-y-3"},We={class:"flex items-center justify-between gap-2"},Ge={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},He={key:0},Ye={class:"hidden md:block"},Xe={class:"w-full text-sm"},Je={class:"divide-y divide-gray-100 dark:divide-gray-800"},Qe={class:"py-2.5 pr-4"},Ze={class:"flex items-center gap-2 min-w-0"},Ke={class:"py-2.5 pr-4"},ts={class:"w-36"},es={class:"py-2.5 pr-4 text-right"},ss={class:"py-2.5 pr-4 text-right tabular-nums"},as={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ns={class:"py-2.5 text-right"},rs={class:"text-xs text-gray-500 dark:text-gray-400"},os={key:1,class:"text-xs text-gray-400"},is=B({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("portfolio",()=>_.query)),e=await e,i(),e);function b(r){return r===null?"text-gray-400":r>=90?"text-green-600 dark:text-green-400":r>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function p(r){return r===null||Math.abs(r)<1?null:r>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Q,S=Kt,o=Rt,d=lt,y=te,T=ee,V=ct,I=K;return s(),k(I,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(n)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=w=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No projects with runs in this period."})):(s(),v(N,{key:3},[a("div",qe,[(s(!0),v(N,null,L(t(n),w=>(s(),v("div",{key:w.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[a("div",We,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),a("span",{class:A(["tabular-nums font-semibold shrink-0",b(w.passRate)])},h(w.passRate!==null?`${w.passRate}%`:"—"),3)]),$(S,{runs:w.recentRuns,height:20},null,8,["runs"]),a("div",Ge,[a("span",null,h(w.runCount)+" runs · "+h(w.flakyTests)+" flaky · "+h(w.openClusters)+" open clusters",1),w.latestRun?(s(),v("span",He,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)):P("",!0)])]))),128))]),a("div",Ye,[$(V,{"min-width":"52rem"},{default:f(()=>[a("table",Xe,[l[2]||(l[2]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Project"),a("th",{class:"py-2 pr-4 font-medium"},"Trend"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),a("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),a("tbody",Je,[(s(!0),v(N,null,L(t(n),w=>(s(),v("tr",{key:w.projectId},[a("td",Qe,[a("div",Ze,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),(s(!0),v(N,null,L(w.tags.slice(0,2),U=>(s(),k(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),a("td",Ke,[a("div",ts,[$(S,{runs:w.recentRuns,height:22},null,8,["runs"])])]),a("td",es,[a("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(w.passRate)])},[D(h(w.passRate!==null?`${w.passRate}%`:"—")+" ",1),p(w.passRateDelta)?(s(),k(d,{key:0,name:p(w.passRateDelta).icon,class:A(["size-3.5",p(w.passRateDelta).class]),title:`${w.passRateDelta>0?"+":""}${w.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),a("td",ss,h(w.runCount),1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},h(w.flakyTests),3),a("td",as,[$(y,{ms:w.avgRunDurationMs},null,8,["ms"])]),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.openClusters>0?"text-red-600 dark:text-red-400":""])},h(w.openClusters),3),a("td",ns,[w.latestRun?(s(),k(c,{key:0,to:`/test-runs/${w.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[$(T,{status:w.latestRun.status},null,8,["status"]),a("span",rs,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",os,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ls=Object.assign(is,{__name:"PortfolioScorecard"}),cs={class:"space-y-1"},ds={class:"flex gap-px"},us=["title"],ms={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},ps={class:"relative h-4"},_s=B({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("pass-rate-heatmap",()=>_.query)),e=await e,i(),e);function b(c){return c===null?{}:c>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:c>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:c>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:c>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function p(c,S,o){const d=n.value?.buckets[S]??"",y=(n.value?.bucketDays??1)>1?` (${n.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${y}: ${o!==null?`${o}% passed`:"no runs"}`}const r=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],l=E(()=>{const c=n.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),j=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],x=E(()=>{const c=n.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function m(c){const[S,o,d]=c.split("-"),y=j[Number(o)-1];return x.value?`${y} ${S}`:`${y} ${Number(d)}`}const g=E(()=>{const c=n.value?.buckets??[],S=c.length;if(S===0)return[];const o=Math.min(x.value?4:5,S),d=new Set,y=[];for(let T=0;T<o;T++){const V=o===1?0:Math.round(T*(S-1)/(o-1));if(d.has(V))continue;d.add(V);const I=V===0?0:V===S-1?100:(V+.5)/S*100,w=V===0?"translateX(0)":V===S-1?"translateX(-100%)":"translateX(-50%)";y.push({index:V,label:m(c[V]),left:I,transform:w})}return y});return(c,S)=>{const o=G,d=q,y=H,T=X,V=Q,I=bt,w=ct,U=ut;return s(),k(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(l),help:"analytics.heatmap"},{default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:S[0]||(S[0]=O=>t(R)())},{default:f(()=>[...S[1]||(S[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(T,{key:2,text:"No runs in this period."})):(s(),k(w,{key:3,"min-width":"22rem"},{default:f(()=>[a("div",cs,[(s(!0),v(N,null,L(t(n).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[$(V,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(h(O.label||O.name),1)]),_:2},1032,["to","title"]),a("div",ds,[(s(!0),v(N,null,L(O.cells,(nt,tt)=>(s(),v("div",{key:tt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:ot(b(nt)),title:p(O,tt,nt)},null,12,us))),128))])]))),128)),a("div",ms,[S[2]||(S[2]=a("span",null,null,-1)),a("div",ps,[(s(!0),v(N,null,L(t(g),O=>(s(),v("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:ot({left:`${O.left}%`,transform:O.transform})},h(O.label),5))),128))])]),$(I,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ys=Object.assign(_s,{__name:"PassRateHeatmap"}),hs={key:3,class:"w-full relative"},gs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},fs={class:"font-semibold mb-1"},bs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",xs=B({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("ci-time-trend",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),p=E(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,l=o=>o.totalMinutes,j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const o=n.value.deltaPct;return{label:`${o>0?"+":""}${o}% vs previous period`,class:o>25?"text-red-600 dark:text-red-400":o<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),S=E(()=>{if(!n.value)return;const o=n.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${n.value.runCount} runs`});return(o,d)=>{const y=G,T=q,V=H,I=X,w=ut;return s(),k(w,{icon:"i-lucide-timer",title:"CI time",subtitle:t(S),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},h(t(c).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(y,{key:0})):t(u)?(s(),k(V,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(T,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(R)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",hs,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:l,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),$(t(he),{x:r,y:l,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),$(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",gs,[a("div",fs,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,h(t(x).totalMinutes)+" minutes",1),a("div",bs,h(t(x).runCount)+" runs",1)])],4)):P("",!0)])):(s(),k(I,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),vs=Object.assign(xs,{__name:"CiTimeTrendChart"}),ks={key:3,class:"w-full relative"},$s={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ss={class:"font-semibold mb-1"},Cs={key:1,class:"mt-4 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2.5 text-sm dark:border-amber-900/50 dark:bg-amber-950/30"},ws={class:"text-gray-700 dark:text-gray-300"},Ms={class:"font-semibold"},Rs={key:2,class:"mt-4 space-y-1"},Ts={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},js=B({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("wasted-time",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(y=>({date:new Date(y.date),waitMinutes:y.waitMinutes,failedExecMinutes:y.failedExecMinutes}))??[]),p=E(()=>b.value.some(y=>y.waitMinutes>0||y.failedExecMinutes>0)),r=y=>y.date,l=["rgb(245, 158, 11)","rgb(239, 68, 68)"],j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:y=>y.date,series:[{y:y=>y.waitMinutes,color:l[0]},{y:y=>y.failedExecMinutes,color:l[1]}]}),c=[{color:l[0],label:"Wait steps"},{color:l[1],label:"Failed attempts"}],S=E(()=>{if(!n.value)return;const y=n.value.totalWaitMinutes+n.value.totalFailedExecMinutes;return`${y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`} of CI time produced no signal`}),o=E(()=>n.value?.timeoutReclaimable??null),d=E(()=>{const y=o.value?.estimatedMinutes??0;return y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`});return(y,T)=>{const V=bt,I=G,w=q,U=H,O=X,nt=lt,tt=Q,Pt=ut;return s(),k(Pt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t(S),help:"analytics.wasted-time"},{legend:f(()=>[$(V,{items:c,dense:""})]),default:f(()=>[t(M)?(s(),k(I,{key:0})):t(u)?(s(),k(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in y?y.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:T[0]||(T[0]=z=>t(R)())},{default:f(()=>[...T[1]||(T[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",ks,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:[z=>z.waitMinutes,z=>z.failedExecMinutes],color:l,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),$(t(Z),{type:"x","tick-format":z=>new Date(z).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":z=>z.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",$s,[a("div",Ss,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,[T[2]||(T[2]=a("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+h(t(x).waitMinutes)+" min",1)]),a("div",null,[T[3]||(T[3]=a("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+h(t(x).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",Cs,[$(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),a("div",ws,[T[5]||(T[5]=D(" Up to ",-1)),a("span",Ms,"≈"+h(t(d)),1),D(" of this is avoidable — "+h(t(o).oversizedCount)+" oversized "+h(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+h(t(o).staleSlowCount)+" stale ",1),T[6]||(T[6]=a("code",{class:"text-xs"},"test.slow()",-1)),D(" "+h(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),k(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...T[4]||(T[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(n)&&t(n).byProject.length>0?(s(),v("div",Rs,[(s(!0),v(N,null,L(t(n).byProject.slice(0,5),z=>(s(),v("div",{key:z.projectId,class:"flex items-center justify-between text-sm"},[$(tt,{to:`/projects/${z.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(h(z.label||z.name),1)]),_:2},1032,["to"]),a("span",Ts,h(Math.round(z.waitMinutes+z.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),k(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Ds=Object.assign(js,{__name:"WastedTimeChart"}),Es={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Vs={class:"flex-1 min-w-0"},Is={class:"text-sm font-medium truncate"},Ns={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ps={class:"text-right shrink-0"},As=B({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("flaky-leaderboard",()=>_.query)),e=await e,i(),e);function b(r){return r>=60?"text-red-600 dark:text-red-400":r>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function p(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Rt,S=Q,o=K;return s(),k(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(n)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",Es,[(s(!0),v(N,null,L(t(n),d=>(s(),k(S,{key:`${d.projectId}-${d.testCaseId}`,to:`/test-cases/${d.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},h(d.score),3),a("div",Vs,[a("p",Is,h(d.title),1),a("p",Ns,[D(h(d.projectLabel||d.projectName)+" · "+h(p(d))+" ",1),d.lastFlakeAt?(s(),v(N,{key:0},[D(" · last "+h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(d.lastFlakeAt)),1)],64)):P("",!0)])]),a("div",Ps,[a("p",{class:A(["text-sm tabular-nums",d.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":d.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},h(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),k(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ls=Object.assign(As,{__name:"GlobalFlakyLeaderboard"}),Os={key:3,class:"space-y-4"},zs={key:0,class:"flex flex-wrap gap-1.5"},Bs={class:"divide-y divide-gray-100 dark:divide-gray-800"},Us={class:"flex-1 min-w-0"},Fs={class:"text-sm font-medium truncate"},qs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ws={class:"text-right text-xs shrink-0"},Gs={class:"tabular-nums font-medium"},Hs=B({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("cluster-landscape",()=>_.query)),e=await e,i(),e);function b(p){return p>=30?"text-red-600 dark:text-red-400":p>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=ge,c=fe,S=Mt,o=Q,d=K;return s(),k(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load clusters: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=y=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).totalOpen===0&&t(n).resolvedInPeriod===0?(s(),k(m,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",Os,[$(c,null,{default:f(()=>[$(g,{label:"Open",value:t(n).totalOpen,"value-class":t(n).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),$(g,{label:"Resolved this period",value:t(n).resolvedInPeriod},null,8,["value"]),$(g,{label:"Oldest open",value:t(n).clusters.length>0?`${Math.max(...t(n).clusters.map(y=>y.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(n).byErrorType.length>0?(s(),v("div",zs,[(s(!0),v(N,null,L(t(n).byErrorType,y=>(s(),k(S,{key:y.errorType,color:("clusterErrorTypeColor"in p?p.clusterErrorTypeColor:t(Zt))(y.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(h(y.errorType)+" · "+h(y.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),a("div",Bs,[(s(!0),v(N,null,L(t(n).clusters.slice(0,8),y=>(s(),k(o,{key:y.id,to:`/failure-clusters/${y.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("div",Us,[a("p",Fs,h(y.title||y.signature),1),a("p",qs,[D(h(y.projectLabel||y.projectName)+" ",1),y.errorType?(s(),v(N,{key:0},[D(" · "+h(y.errorType),1)],64)):P("",!0)])]),a("div",Ws,[a("p",Gs,h(y.occurrences)+"×",1),a("p",{class:A(["tabular-nums",b(y.ageDays)])},h(y.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Ys=Object.assign(Hs,{__name:"ClusterLandscape"}),Xs={key:3,class:"w-full"},Js=B({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("regression-velocity",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(g=>({date:new Date(g.date),regressions:g.regressions,newFlaky:g.newFlaky}))??[]),p=E(()=>b.value.some(g=>g.regressions>0||g.newFlaky>0)),r=g=>g.date,l=["rgb(239, 68, 68)","rgb(147, 51, 234)"],j=[{color:l[0],label:"New regressions"},{color:l[1],label:"Newly flaky"}],x=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const g=n.value.deltaPct;return{label:`${g>0?"+":""}${g}% vs previous period`,class:g>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),m=E(()=>{if(n.value)return`${n.value.totalRegressions} new regressions, ${n.value.totalNewFlaky} newly flaky`});return(g,c)=>{const S=bt,o=G,d=q,y=H,T=X,V=ut;return s(),k(V,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(m),help:"analytics.regression-velocity"},{legend:f(()=>[$(S,{items:j,dense:""})]),actions:f(()=>[t(x)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(x).class])},h(t(x).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in g?g.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=I=>t(R)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",Xs,[$(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[$(t(Ce),{x:r,y:[I=>I.regressions,I=>I.newFlaky],color:l,"rounded-corners":2},null,8,["y"]),$(t(Z),{type:"x","tick-format":I=>new Date(I).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Count","tick-format":I=>I.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),k(T,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Qs=Object.assign(Js,{__name:"RegressionVelocityChart"}),Zs={class:"w-full text-sm border-separate border-spacing-1"},Ks={class:"pr-2 max-w-[12rem]"},ta=["title"],ea=B({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("browser-matrix",()=>_.query)),e=await e,i(),e);function b(p){return p===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":p>=99.5?"bg-green-500/85 text-white":p>=90?"bg-green-500/45":p>=75?"bg-amber-500/50":p>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=Q,c=ct,S=K;return s(),k(S,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(m,{key:2,text:"No runs with browser data in this period."})):(s(),k(c,{key:3,"min-width":"30rem"},{default:f(()=>[a("table",Zs,[a("thead",null,[a("tr",null,[r[2]||(r[2]=a("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(N,null,L(t(n).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},h(o),1))),128))])]),a("tbody",null,[(s(!0),v(N,null,L(t(n).rows,o=>(s(),v("tr",{key:o.projectId},[a("td",Ks,[$(g,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(h(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(N,null,L(o.cells,(d,y)=>(s(),v("td",{key:y,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(n).browsers[y]}: ${d!==null?`${d}% passed`:"no tests"}`},h(d!==null?`${Math.round(d)}%`:"—"),11,ta))),128))]))),128))])])]),_:1}))]),_:1})}}}),sa=Object.assign(ea,{__name:"BrowserMatrix"}),aa={class:"md:hidden space-y-3"},na={class:"flex items-center gap-2 min-w-0"},ra={class:"text-xs truncate"},oa={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ia={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},la={class:"hidden md:block"},ca={class:"w-full text-sm"},da={class:"divide-y divide-gray-100 dark:divide-gray-800"},ua={class:"py-2.5 pr-4"},ma={class:"flex items-center gap-2 min-w-0"},pa=["title"],_a={class:"py-2.5 pr-4 text-right tabular-nums"},ya={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ha={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ga={class:"py-2.5 text-right tabular-nums"},fa=B({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("slow-endpoints",()=>_.query)),e=await e,i(),e);function b(r){return r>=1e3?"text-red-600 dark:text-red-400":r>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function p(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,l)=>{const j=G,x=q,m=H,g=be,c=Mt,S=ct,o=K;return s(),k(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(n)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).endpoints.length===0?(s(),k(g,{key:2,icon:"i-lucide-network",title:"No network requests captured in this period",text:"Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",doc:"capture-fixtures"})):(s(),v(N,{key:3},[a("div",aa,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("div",{key:`${d.method} ${d.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[a("div",na,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",ra,h(d.route),1)]),a("div",oa,[a("span",null,[l[2]||(l[2]=D("p90 ",-1)),a("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms",3)]),a("span",null,h(d.requests)+" reqs · "+h(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ia,h(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),a("div",la,[$(S,{"min-width":"44rem"},{default:f(()=>[a("table",ca,[l[3]||(l[3]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),a("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),a("tbody",da,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[a("td",ua,[a("div",ma,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},h(d.route),9,pa)])]),a("td",_a,h(d.requests),1),a("td",ya,h(d.p50Ms)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms ",3),a("td",ha,h(d.maxMs)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",d.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},h(d.errorRate)+"% ",3),a("td",ga,h(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ba=Object.assign(fa,{__name:"SlowEndpointsTable"}),xa={class:"space-y-6"},va={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ka={class:"text-sm text-muted"},$a={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},ln=B({__name:"analytics",async setup(C){let e,i;Gt({title:"Analytics - Piwi Dashboard"});const{state:_,scopeQuery:n}=Re(),{data:M}=([e,i]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$sFpNat489G")),e=await e,i(),e),{data:u}=([e,i]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$QJEpX0hRMv")),e=await e,i(),e),R=E(()=>{const x=new Set;for(const m of u.value??[])m.environment&&x.add(m.environment);return[...x].sort()}),b=E(()=>{const x=u.value??[];return x.length===0?null:Math.max(...x.map(m=>new Date(m.startTime).getTime()))}),p=E(()=>{if(b.value===null||_.value.days>=gt)return!1;const x=Date.now()-_.value.days*24*60*60*1e3;return b.value<x});function r(){_.value={..._.value,days:gt}}const l={insights:Fe,portfolio:ls,"pass-rate-heatmap":ys,"ci-time-trend":vs,"wasted-time":Ds,"flaky-leaderboard":Ls,"cluster-landscape":Ys,"regression-velocity":Qs,"browser-matrix":sa,"slow-endpoints":ba},j=E(()=>Ae.map(x=>({...x,widgets:Nt.filter(m=>m.band===x.id)})).filter(x=>x.widgets.length>0));return(x,m)=>{const g=At,c=Lt,S=zt,o=Pe,d=Jt,y=Qt,T=Ot;return s(),k(T,{id:"analytics"},{header:f(()=>[$(S,null,{leading:f(()=>[$(g),$(c,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[a("div",xa,[$(d,null,{default:f(()=>[$(o,{modelValue:t(_),"onUpdate:modelValue":m[0]||(m[0]=V=>at(_)?_.value=V:null),"available-projects":t(M),"available-environments":t(R)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(p)?(s(),k(y,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(_).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:t(it))(t(b))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:r}]},null,8,["title","description","actions"])):P("",!0),(s(!0),v(N,null,L(t(j),V=>(s(),v("section",{key:V.id,class:"space-y-3"},[a("div",null,[a("h2",va,h(V.label),1),a("p",ka,h(V.description),1)]),a("div",$a,[(s(!0),v(N,null,L(V.widgets,I=>(s(),v("div",{key:I.id,class:A(I.size==="full"?"xl:col-span-2":"")},[(s(),k(wt(l[I.id]),{query:t(n)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{ln as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{v as e,ab as r,bW as t}from"./BzBaMPgu.js";function a(o){return e(()=>r(o)?!!t(o)?.closest("form"):!0)}export{a as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as be,a as he}from"./D5Mhpp98.js";import{_ as ke,a as je}from"./qeqzb80l.js";import{_ as $e}from"./BC5bqlfM.js";import{_ as Re,a as Ce}from"./CdLqOMvN.js";import{d as G,I as Pe,q as J,C as De,ak as Ne,a as Q,b as i,o,c as l,h as s,_ as we,g as r,f as n,k as m,j as Z,t as R,e as x,l as y,J as Te,r as v,s as Fe,F as S,E as Ue,G as Se,z as K,H as ze,v as M,M as Le,n as Be}from"./BzBaMPgu.js";import{_ as Ke}from"./C7SG50jD.js";import{_ as Me}from"./Ch8sGLqE.js";import{_ as Ve}from"./BvXrhZ8k.js";import{_ as Ie}from"./CVEk4D8I.js";import{_ as Ee}from"./9Yziijlb.js";import{_ as He}from"./CBQXv4bU.js";import{_ as Oe}from"./5nOoVJzL.js";import{_ as qe}from"./Cp0V2FeW.js";import{_ as Ae}from"./B77w1Eib.js";import{_ as Ge,a as Je}from"./CwDej2Lz.js";import{p as Qe,a as Ze,s as We}from"./vOZZ2cLi.js";import{e as W,p as Xe,i as D}from"./CdM2qNYM.js";import{_ as Ye}from"./Bb_925DD.js";import{_ as et}from"./BbXvpkBp.js";import{u as A}from"./CDEmotIt.js";import{o as tt,s as V}from"./DGnQ69wW.js";import"./DWz_bHNP.js";import"./BcHU1KNK.js";import"./BSKLNgre.js";import"./D-c8ZSws.js";import"./BOrnSpTA.js";import"./Bg8yOdSf.js";import"./CTYlay1H.js";import"./Die1200X.js";import"./BUYmGTVP.js";import"./DDho3MJD.js";import"./Boyv6hLW.js";const ot={key:0},st={key:0,class:"rounded-lg border border-dashed border-default p-3 flex flex-wrap items-center gap-3"},at={key:1,class:"rounded-lg border border-default p-3 space-y-3"},nt={class:"flex items-center justify-between gap-3"},lt={class:"flex items-center gap-2 min-w-0 text-sm"},rt={class:"text-xs break-all"},it={class:"flex items-center gap-1.5 shrink-0"},ct=G({__name:"DesktopNewProjectFolder",props:{folder:{default:null},folderModifiers:{}},emits:Te(["detected"],["update:folder"]),setup(I,{emit:k}){const b=Pe(I,"folder"),z=k,L=J(),N=v(!1);De(()=>{N.value=!!Ne()});const _=v(null),f=v(!1);async function w(){f.value=!0;try{const c=await Qe();c&&(b.value=c)}catch(c){L.add({title:"Could not open the folder picker",description:W(c),color:"error"})}finally{f.value=!1}}function j(){b.value=null}return Q(b,async c=>{_.value=c?await Ze(c):null,_.value&&z("detected",_.value)},{immediate:!0}),(c,u)=>{const T=we,C=Z,g=Ge;return i(N)?(o(),l("div",ot,[b.value?(o(),l("div",at,[r("div",nt,[r("div",lt,[s(T,{name:"i-lucide-folder-check",class:"size-4 shrink-0 text-primary"}),r("code",rt,R(b.value),1)]),r("div",it,[s(C,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-folder-search",loading:i(f),onClick:w},{default:n(()=>[...u[2]||(u[2]=[m(" Change ",-1)])]),_:1},8,["loading"]),s(C,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:i(f),onClick:j},{default:n(()=>[...u[3]||(u[3]=[m(" Clear ",-1)])]),_:1},8,["disabled"])])]),i(_)?(o(),x(g,{key:0,inspection:i(_)},null,8,["inspection"])):y("",!0),u[4]||(u[4]=r("p",{class:"text-xs text-muted"},"The folder is linked to the new project for local runs and IDE links.",-1))])):(o(),l("div",st,[s(T,{name:"i-lucide-folder-search",class:"size-5 shrink-0 text-muted"}),u[1]||(u[1]=r("div",{class:"min-w-0 flex-1 text-sm"},[r("p",{class:"font-medium"},"Start from a folder on this machine"),r("p",{class:"text-xs text-muted"},"Detects the project name and checks the Playwright + Piwi reporter setup.")],-1)),s(C,{color:"neutral",variant:"soft",size:"sm",icon:"i-lucide-folder-open",loading:i(f),onClick:w},{default:n(()=>[...u[0]||(u[0]=[m(" Choose folder… ",-1)])]),_:1},8,["loading"])]))])):y("",!0)}}}),dt=Object.assign(ct,{__name:"DesktopNewProjectFolder"}),ut={class:"flex flex-wrap items-center gap-3 mb-4"},pt={key:0,class:"flex flex-wrap items-center gap-2"},mt={class:"text-sm text-muted shrink-0 inline-flex items-center gap-1"},_t=["onClick"],ft={class:"flex flex-col gap-1"},gt={class:"flex items-center gap-2"},xt={key:0,class:"flex flex-wrap gap-1"},yt={key:0,class:"text-xs text-gray-600 italic"},vt={key:1},bt={key:0,class:"text-xs text-gray-600"},ht={key:1,class:"text-xs text-gray-600 italic"},kt={key:0,class:"flex items-center gap-1 flex-wrap"},jt={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},$t={key:1,class:"text-xs text-gray-500"},Rt={key:1,class:"text-xs text-gray-600 italic"},Ct={key:1,class:"text-xs text-gray-600 italic"},Pt={key:1,class:"text-xs text-gray-600 italic"},Dt={class:"flex justify-end gap-2"},Nt={key:1,class:"space-y-2","aria-busy":"true"},wt={key:2,class:"text-center py-12 text-gray-500"},Tt={class:"text-xs text-gray-400 max-w-sm"},Ft={class:"space-y-5"},Ut={class:"flex w-full justify-end gap-2"},mo=G({__name:"index",setup(I){Fe({title:"Projects — Piwi Dashboard"});const{data:k,refresh:b,status:z}=A("/api/projects",{key:"projects",lazy:!0,default:()=>[]},"$6DHNZL9pIE"),{data:L,refresh:N}=A("/api/tags",{lazy:!0},"$FLI1EBmEg_"),_=J(),f=M(()=>L.value?.tags||[]),w=M(()=>z.value==="pending"&&!k.value?.length),j=v(""),c=v([]),u=M(()=>{let a=k.value||[];if(j.value.trim()){const t=j.value.trim().toLowerCase();a=a.filter(p=>(p.label||p.name).toLowerCase().includes(t)||p.name.toLowerCase().includes(t))}return c.value.length>0&&(a=a.filter(t=>c.value.some(p=>(t.tags||[]).some(h=>h.id===p)))),a});function T(a){const t=c.value.indexOf(a);t===-1?c.value.push(a):c.value.splice(t,1)}function C(a){return c.value.includes(a)}const g=v(!1),X=tt({name:V().min(1,"Project name is required").max(100),label:V().optional(),description:V().optional()}),d=Le({name:"",label:"",description:""}),F=v([]),B=v(!1),P=v(null);function Y(a){a.suggestedName&&(d.name=a.suggestedName)}Q(g,a=>{a||(P.value=null)});function ee(){d.name="",d.label="",d.description="",F.value=[],P.value=null}async function te(){if(d.name?.trim())try{B.value=!0;const a=await $fetch("/api/projects",{method:"POST",body:{name:d.name.trim(),label:d.label?.trim()||null,description:d.description?.trim()||null,tagIds:F.value.map(h=>h.id)}}),t=P.value;let p=!1;if(t&&a?.project?.id!=null)try{await We(a.project.id,t),p=!0}catch(h){_.add({title:"Project created, but the folder could not be linked",description:W(h),color:"warning"})}if(_.add({title:"Project created",description:p?`Project "${d.name}" has been created and linked to its folder`:`Project "${d.name}" has been created`,color:"success"}),g.value=!1,ee(),p&&a?.project?.id!=null){await Be(`/projects/${a.project.id}`);return}await b()}catch(a){const t=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;_.add({title:"Failed to create project",description:t||"An error occurred",color:"error"})}finally{B.value=!1}}const oe=[{header:"Project",columns:[{accessorKey:"name",header:D("Name")},{accessorKey:"totalRuns",header:D("Runs")}]},{accessorKey:"latestRunData",header:"Latest run",columns:[{accessorKey:"latestRun",header:D("Date")},{accessorKey:"branch",header:"Branch"},{accessorKey:"duration",header:D("Duration")},{accessorKey:"status",header:D("Status")},{accessorKey:"testRatio",header:"Test status"},{accessorKey:"report",header:"Reports"}]},{accessorKey:"actions",header:"Project actions"}];return(a,t)=>{const p=be,h=he,E=ke,se=$e,ae=Ce,ne=Se,H=Ke,$=Z,O=ze,le=Me,re=Ve,ie=Ie,ce=Ee,de=He,ue=Oe,q=qe,pe=je,me=Ae,_e=Re,fe=dt,ge=Je,xe=Ye,ye=et,ve=Ue;return o(),l(S,null,[s(_e,{id:"projects"},{header:n(()=>[s(ae,null,{leading:n(()=>[s(p),s(h,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects"}]})]),right:n(()=>[s(se,{actions:[{label:"New project",icon:"i-lucide-plus",onClick:()=>g.value=!0},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>i(b)()}]},{leading:n(()=>[s(E,{topic:"projects.table",size:"sm"})]),_:1},8,["actions"])]),_:1})]),body:n(()=>[r("div",ut,[s(ne,{modelValue:j.value,"onUpdate:modelValue":t[0]||(t[0]=e=>j.value=e),icon:"i-lucide-search",placeholder:"Search projects by name...",class:"min-w-48 flex-1",ui:{base:"w-full"}},null,8,["modelValue"]),f.value.length>0?(o(),l("div",pt,[r("span",mt,[t[11]||(t[11]=m(" Filter by tag (any match): ",-1)),s(E,{topic:"projects.tag-filter"})]),(o(!0),l(S,null,K(f.value,e=>(o(),l("button",{key:e.id,type:"button",class:"cursor-pointer focus:outline-none",onClick:U=>T(e.id)},[s(H,{text:e.text,color:e.color,variant:C(e.id)?"solid":"outline"},null,8,["text","color","variant"])],8,_t))),128)),c.value.length>0?(o(),x($,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filters",onClick:t[1]||(t[1]=e=>c.value=[])})):y("",!0)])):y("",!0)]),u.value.length>0?(o(),x(ue,{key:0,"min-width":"60rem",bleed:!1},{default:n(()=>[s(de,{data:u.value,columns:oe,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"name-cell":n(({row:e})=>[r("div",ft,[r("div",gt,[s(O,{to:`/projects/${e.original.id}`,class:"text-primary hover:underline font-medium"},{default:n(()=>[m(R(e.original.label||e.original.name),1)]),_:2},1032,["to"])]),e.original.tags?.length?(o(),l("div",xt,[(o(!0),l(S,null,K(e.original.tags,U=>(o(),x(H,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])):y("",!0)])]),"totalRuns-cell":n(({row:e})=>[e.original.totalRuns===0?(o(),l("span",yt,"No data")):(o(),l("span",vt,R(e.original.totalRuns)+" runs",1))]),"latestRun-cell":n(({row:e})=>[e.original.latestRun?(o(),l("span",bt,R(("prettyDateFormat"in a?a.prettyDateFormat:i(Xe))(e.original.latestRun.startTime)),1)):(o(),l("span",ht,"No data"))]),"branch-cell":n(({row:e})=>[e.original.latestRun?.metadata?.scm?(o(),l("div",kt,[e.original.latestRun.metadata.scm.branch?(o(),l("span",jt,R(e.original.latestRun.metadata.scm.branch),1)):y("",!0),e.original.latestRun.metadata.scm.commit?(o(),l("code",$t,R(e.original.latestRun.metadata.scm.commit.substring(0,7)),1)):y("",!0)])):y("",!0)]),"duration-cell":n(({row:e})=>[e.original.latestRun?.duration!=null?(o(),x(le,{key:0,ms:e.original.latestRun.duration,class:"text-sm text-gray-600"},null,8,["ms"])):(o(),l("span",Rt,"No data"))]),"status-cell":n(({row:e})=>[e.original.latestRun?(o(),x(re,{key:0,status:e.original.latestRun.status},null,8,["status"])):(o(),l("span",Ct,"No data"))]),"testRatio-cell":n(({row:e})=>[e.original.latestRun?(o(),x(ie,{key:0,passed:e.original.latestRun.passedTests,failed:e.original.latestRun.failedTests,skipped:e.original.latestRun.skippedTests,flaky:e.original.latestRun.flakyTests,"did-not-run":e.original.latestRun.didNotRunTests??0,total:e.original.latestRun.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"])):(o(),l("span",Pt,"No data"))]),"report-cell":n(({row:e})=>[e.original.latestRun?(o(),x(ce,{key:0,reports:e.original.latestRun.reports},null,8,["reports"])):y("",!0)]),"actions-header":n(()=>[...t[12]||(t[12]=[r("div",{class:"text-right"},"Project actions",-1)])]),"actions-cell":n(({row:e})=>[r("div",Dt,[s($,{to:`/projects/${e.original.id}`,size:"sm",variant:"outline"},{default:n(()=>[...t[13]||(t[13]=[m("View details",-1)])]),_:1},8,["to"]),s($,{to:`/projects/${e.original.id}/edit`,size:"sm",variant:"ghost",icon:"i-lucide-pencil"},null,8,["to"])])]),_:1},8,["data"])]),_:1})):w.value?(o(),l("div",Nt,[t[14]||(t[14]=r("span",{class:"sr-only",role:"status"},"Loading projects…",-1)),s(q,{class:"h-10 w-full rounded-lg"}),(o(),l(S,null,K(6,e=>s(q,{key:e,class:"h-14 w-full rounded-lg"})),64))])):i(k)&&i(k).length>0?(o(),l("div",wt,[...t[15]||(t[15]=[r("p",{class:"text-lg mb-2"},"No projects match your search",-1),r("p",{class:"text-sm"},"Try adjusting your search or filters",-1)])])):(o(),x(me,{key:3,icon:"i-lucide-rocket",text:"No projects yet"},{default:n(()=>[r("p",Tt,[t[18]||(t[18]=m(" Projects are created automatically once the reporter submits its first run — see the ",-1)),s(O,{to:"/",class:"text-primary hover:underline"},{default:n(()=>[...t[16]||(t[16]=[m("home page",-1)])]),_:1}),t[19]||(t[19]=m(" for a copy-paste setup snippet, or the ",-1)),s(pe,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[17]||(t[17]=[m("reporter docs",-1)])]),_:1}),t[20]||(t[20]=m(". ",-1))]),s($,{icon:"i-lucide-plus",label:"New project",variant:"ghost",size:"sm",class:"mt-2",onClick:t[2]||(t[2]=e=>g.value=!0)})]),_:1}))]),_:1}),s(ve,null,{default:n(()=>[s(ye,{open:g.value,title:"Create new project","onUpdate:open":t[10]||(t[10]=e=>g.value=e)},{body:n(()=>[r("div",Ft,[s(fe,{folder:P.value,"onUpdate:folder":t[3]||(t[3]=e=>P.value=e),onDetected:Y},null,8,["folder"]),s(xe,{schema:i(X),state:i(d)},{default:n(()=>[s(ge,{mode:"create",name:i(d).name,"onUpdate:name":t[4]||(t[4]=e=>i(d).name=e),label:i(d).label,"onUpdate:label":t[5]||(t[5]=e=>i(d).label=e),description:i(d).description,"onUpdate:description":t[6]||(t[6]=e=>i(d).description=e),tags:F.value,"onUpdate:tags":t[7]||(t[7]=e=>F.value=e),"all-tags":f.value,onTagCreated:t[8]||(t[8]=e=>i(N)())},null,8,["name","label","description","tags","all-tags"])]),_:1},8,["schema","state"])])]),footer:n(()=>[r("div",Ut,[s($,{color:"neutral",variant:"ghost",label:"Cancel",onClick:t[9]||(t[9]=e=>g.value=!1)}),s($,{label:"Create project",icon:"i-lucide-plus",loading:B.value,onClick:te},null,8,["loading"])])]),_:1},8,["open"])]),_:1})],64)}}});export{mo as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as ee,w as te,
|
|
1
|
+
import{d as ee,w as te,q as oe,O as ae,c as A,g as n,b as t,e as u,f as s,h as a,F as le,E as se,o as d,j as ne,l as m,t as O,R as re,_ as ie,G as ce,P as S,al as q,k as M,v as B,r as v,M as P,B as de}from"./BzBaMPgu.js";import{_ as ue}from"./C7SG50jD.js";import{_ as me}from"./CBQXv4bU.js";import{_ as pe}from"./D_j436ND.js";import{_ as ge}from"./Bg8yOdSf.js";import{_ as fe}from"./Bb_925DD.js";import{_ as xe}from"./BbXvpkBp.js";import{p as _e}from"./CdM2qNYM.js";import{u as ve}from"./CDEmotIt.js";import{o as be,s as z}from"./DGnQ69wW.js";import"./BOrnSpTA.js";import"./qeqzb80l.js";import"./BcHU1KNK.js";import"./kDEwM7SQ.js";import"./CTYlay1H.js";const ye={class:"space-y-6"},Te={class:"flex items-center gap-2"},Ce={class:"text-sm font-mono text-muted"},ke={class:"text-sm text-muted"},he={class:"flex gap-1 justify-end"},$e={class:"text-center py-12"},Ve={class:"flex justify-center mb-4"},Ue={class:"flex items-center gap-3"},we={key:0,class:"mt-2"},Ae={class:"flex items-center gap-3"},De={key:0,class:"mt-2"},b="#6366f1",He=ee({__name:"tags",async setup(Fe){let y,D;const{data:N,refresh:V}=([y,D]=te(()=>ve("/api/tags","$F3fVqC3Sbv")),y=await y,D(),y),p=oe(),{authState:K}=ae(),I=de(),U=B(()=>N.value?.tags||[]),T=B(()=>I.public.authEnabled?K.value.user?.role==="administrator":!0),L=[{accessorKey:"text",header:"Tag"},{accessorKey:"color",header:"Color"},{accessorKey:"createdAt",header:"Created"},{accessorKey:"actions",header:""}],g=v(!1),F=be({text:z().min(1,"Tag text is required").max(50,"Tag text must be at most 50 characters"),color:z().min(1,"Color is required")}),r=P({text:"",color:b}),x=v(!1),C=v(null),i=P({text:"",color:b});function R(l){C.value=l,i.text=l.text,i.color=l.color,x.value=!0}async function G(){try{await $fetch("/api/tags",{method:"POST",body:r}),p.add({title:"Tag created",description:`Tag "${r.text}" has been created successfully`,color:"success"}),g.value=!1,r.text="",r.color=b,await V()}catch(l){const e=l&&typeof l=="object"&&"data"in l?l.data?.message:void 0;p.add({title:"Failed to create tag",description:e||"An error occurred",color:"error"})}}async function H(){if(C.value)try{await $fetch(`/api/tags/${C.value.id}`,{method:"PUT",body:{text:i.text,color:i.color}}),p.add({title:"Tag updated",description:"Tag has been updated successfully",color:"success"}),x.value=!1,C.value=null,await V()}catch(l){const e=l&&typeof l=="object"&&"data"in l?l.data?.message:void 0;p.add({title:"Failed to update tag",description:e||"An error occurred",color:"error"})}}const _=v(!1),f=v(null);function J(l){f.value=l,_.value=!0}async function Q(){const l=f.value;if(l){_.value=!1,f.value=null;try{await $fetch(`/api/tags/${l.id}`,{method:"DELETE"}),p.add({title:"Tag deleted",description:`Tag "${l.text}" has been deleted`,color:"success"}),await V()}catch(e){const c=e&&typeof e=="object"&&"data"in e?e.data?.message:void 0;p.add({title:"Failed to delete tag",description:c||"An error occurred",color:"error"})}}}return(l,e)=>{const c=ne,k=ue,W=me,E=pe,X=ie,h=ce,$=ge,j=fe,w=xe,Y=se;return d(),A(le,null,[n("div",ye,[t(U).length>0?(d(),u(E,{key:0,title:"Tags",count:t(U).length,help:"settings.tags"},{actions:s(()=>[t(T)?(d(),u(c,{key:0,label:"Add tag",icon:"i-lucide-tag",size:"sm",onClick:e[0]||(e[0]=o=>g.value=!0)})):m("",!0)]),default:s(()=>[a(W,{data:t(U),columns:L},{"text-cell":s(({row:o})=>[a(k,{text:o.original.text,color:o.original.color},null,8,["text","color"])]),"color-cell":s(({row:o})=>[n("div",Te,[n("span",{class:"inline-block w-4 h-4 rounded-full border border-black/10",style:re({backgroundColor:o.original.color})},null,4),n("span",Ce,O(o.original.color),1)])]),"createdAt-cell":s(({row:o})=>[n("span",ke,O(("prettyDateFormat"in l?l.prettyDateFormat:t(_e))(o.original.createdAt,{dateOnly:!0})),1)]),"actions-cell":s(({row:o})=>[n("div",he,[t(T)?(d(),u(c,{key:0,icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:Z=>R(o.original)},null,8,["onClick"])):m("",!0),t(T)?(d(),u(c,{key:1,icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:Z=>J(o.original)},null,8,["onClick"])):m("",!0)])]),_:1},8,["data"])]),_:1},8,["count"])):(d(),u(E,{key:1,title:"Tags",count:0,help:"settings.tags"},{default:s(()=>[n("div",$e,[n("div",Ve,[a(X,{name:"i-lucide-tags",class:"text-4xl text-muted"})]),e[14]||(e[14]=n("h3",{class:"text-lg font-semibold mb-2"},"No tags yet",-1)),e[15]||(e[15]=n("p",{class:"text-muted mb-4"},"Create tags to categorize and filter your projects",-1)),t(T)?(d(),u(c,{key:0,label:"Add tag",icon:"i-lucide-tag",onClick:e[1]||(e[1]=o=>g.value=!0)})):m("",!0)])]),_:1}))]),a(Y,null,{default:s(()=>[a(w,{open:t(g),title:"Add new tag","onUpdate:open":e[6]||(e[6]=o=>g.value=o)},{body:s(()=>[a(j,{schema:t(F),state:t(r)},{default:s(()=>[a($,{label:"Tag text",name:"text",required:"",class:"mb-4"},{default:s(()=>[a(h,{modelValue:t(r).text,"onUpdate:modelValue":e[2]||(e[2]=o=>t(r).text=o),placeholder:"Enter tag name"},null,8,["modelValue"])]),_:1}),a($,{label:"Color",name:"color",required:"",class:"mb-4"},{default:s(()=>[n("div",Ue,[S(n("input",{"onUpdate:modelValue":e[3]||(e[3]=o=>t(r).color=o),type:"color",class:"w-10 h-10 rounded cursor-pointer border border-default","aria-label":"Pick tag color"},null,512),[[q,t(r).color]]),a(h,{modelValue:t(r).color,"onUpdate:modelValue":e[4]||(e[4]=o=>t(r).color=o),class:"flex-1 font-mono",placeholder:"#6366f1"},null,8,["modelValue"])])]),_:1}),t(r).text?(d(),A("div",we,[e[16]||(e[16]=n("span",{class:"text-sm text-muted mr-2"},"Preview:",-1)),a(k,{text:t(r).text,color:t(r).color||b},null,8,["text","color"])])):m("",!0)]),_:1},8,["schema","state"])]),footer:s(()=>[a(c,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:e[5]||(e[5]=o=>g.value=!1)}),a(c,{type:"submit",label:"Create tag",icon:"i-lucide-tag",onClick:G})]),_:1},8,["open"]),a(w,{open:t(x),title:"Edit tag","onUpdate:open":e[11]||(e[11]=o=>x.value=o)},{body:s(()=>[a(j,{schema:t(F),state:t(i)},{default:s(()=>[a($,{label:"Tag text",name:"text",required:"",class:"mb-4"},{default:s(()=>[a(h,{modelValue:t(i).text,"onUpdate:modelValue":e[7]||(e[7]=o=>t(i).text=o),placeholder:"Enter tag name"},null,8,["modelValue"])]),_:1}),a($,{label:"Color",name:"color",required:"",class:"mb-4"},{default:s(()=>[n("div",Ae,[S(n("input",{"onUpdate:modelValue":e[8]||(e[8]=o=>t(i).color=o),type:"color",class:"w-10 h-10 rounded cursor-pointer border border-default","aria-label":"Pick tag color"},null,512),[[q,t(i).color]]),a(h,{modelValue:t(i).color,"onUpdate:modelValue":e[9]||(e[9]=o=>t(i).color=o),class:"flex-1 font-mono",placeholder:"#6366f1"},null,8,["modelValue"])])]),_:1}),t(i).text?(d(),A("div",De,[e[17]||(e[17]=n("span",{class:"text-sm text-muted mr-2"},"Preview:",-1)),a(k,{text:t(i).text,color:t(i).color||b},null,8,["text","color"])])):m("",!0)]),_:1},8,["schema","state"])]),footer:s(()=>[a(c,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:e[10]||(e[10]=o=>x.value=!1)}),a(c,{type:"submit",label:"Save changes",icon:"i-lucide-check",onClick:H})]),_:1},8,["open"]),a(w,{open:t(_),title:"Delete tag","onUpdate:open":e[13]||(e[13]=o=>_.value=o)},{body:s(()=>[n("p",null,[e[18]||(e[18]=M(" Are you sure you want to delete tag ",-1)),t(f)?(d(),u(k,{key:0,text:t(f).text,color:t(f).color,class:"inline-flex"},null,8,["text","color"])):m("",!0),e[19]||(e[19]=M("? It will be removed from all projects. ",-1))])]),footer:s(()=>[a(c,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[12]||(e[12]=o=>_.value=!1)}),a(c,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:Q})]),_:1},8,["open"])]),_:1})],64)}}});export{He as default};
|