@piwitests/server 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{DZECGgZm.js → 5nOoVJzL.js} +1 -1
- package/.output/public/_nuxt/6DSY_93j.js +1 -0
- package/.output/public/_nuxt/7vRR5W2L.js +1 -0
- package/.output/public/_nuxt/{CC8wk-N0.js → 9Dtlg-K4.js} +1 -1
- package/.output/public/_nuxt/9Yziijlb.js +1 -0
- package/.output/public/_nuxt/{DAhv9aNg.js → B-onBCAB.js} +1 -1
- package/.output/public/_nuxt/B2bK5uNR.js +1 -0
- package/.output/public/_nuxt/{B2L0-Lzp.js → B63B19Iv.js} +2 -2
- package/.output/public/_nuxt/{oSLbl-p0.js → B77w1Eib.js} +1 -1
- package/.output/public/_nuxt/{pZbe82l5.js → BC5bqlfM.js} +1 -1
- package/.output/public/_nuxt/{jR2xm3_t.js → BF5JDf9_.js} +1 -1
- package/.output/public/_nuxt/BFVrl1ss.js +1 -0
- package/.output/public/_nuxt/{Bj_v57Zu.js → BIHMeNW-.js} +1 -1
- package/.output/public/_nuxt/BKqOGcst.js +1 -0
- package/.output/public/_nuxt/{Bsc11YIJ.js → BLqooxh5.js} +1 -1
- package/.output/public/_nuxt/{Ce_j5NtN.js → BMfTUMYy.js} +1 -1
- package/.output/public/_nuxt/{CmTzxoQt.js → BOrnSpTA.js} +1 -1
- package/.output/public/_nuxt/{Bq4_kqIp.js → BPQNVV4M.js} +1 -1
- package/.output/public/_nuxt/{FJTsZ5Aa.js → BSKLNgre.js} +1 -1
- package/.output/public/_nuxt/BTCWUyBX.js +1 -0
- package/.output/public/_nuxt/BUYmGTVP.js +1 -0
- package/.output/public/_nuxt/{mi22nGUC.js → BWddBCom.js} +1 -1
- package/.output/public/_nuxt/{axj2iIDK.js → BYQ9lXQb.js} +1 -1
- package/.output/public/_nuxt/BYWQ47QQ.js +5 -0
- package/.output/public/_nuxt/{Bag08cIY.js → BYnqoVCE.js} +1 -1
- package/.output/public/_nuxt/{Clg2Qx0r.js → BaU2hm4B.js} +1 -1
- package/.output/public/_nuxt/{roaTZkYi.js → BbXvpkBp.js} +1 -1
- package/.output/public/_nuxt/Bb_925DD.js +1 -0
- package/.output/public/_nuxt/BcHU1KNK.js +1 -0
- package/.output/public/_nuxt/BdUGUwvE.js +1 -0
- package/.output/public/_nuxt/{D1Ucra3E.js → BeQq85yJ.js} +2 -2
- package/.output/public/_nuxt/Bg8yOdSf.js +1 -0
- package/.output/public/_nuxt/BhzfJaPC.js +1 -0
- package/.output/public/_nuxt/{499RbBSX.js → Bkb-0yS0.js} +4 -4
- package/.output/public/_nuxt/BmweLu9g.js +2 -0
- package/.output/public/_nuxt/Boyv6hLW.js +1 -0
- package/.output/public/_nuxt/{DXkFgrsT.js → Bq4xEWLF.js} +4 -4
- package/.output/public/_nuxt/{7_9fts7T.js → BraJd4EA.js} +1 -1
- package/.output/public/_nuxt/BvXrhZ8k.js +1 -0
- package/.output/public/_nuxt/{DNKZmhbX.js → Bw4oIhct.js} +1 -1
- package/.output/public/_nuxt/BxSrScjV.js +1 -0
- package/.output/public/_nuxt/Byqt8JHG.js +1 -0
- package/.output/public/_nuxt/{CNu3kken.js → BzBaMPgu.js} +4 -4
- package/.output/public/_nuxt/{PDSNX4Te.js → C1-8_6cB.js} +1 -1
- package/.output/public/_nuxt/{Ce89VyHE.js → C7SG50jD.js} +1 -1
- package/.output/public/_nuxt/{CBJFORiZ.js → C8WgBDU1.js} +1 -1
- package/.output/public/_nuxt/C8uZoJVq.js +1 -0
- package/.output/public/_nuxt/{D3SJGdl4.js → CBQXv4bU.js} +2 -2
- package/.output/public/_nuxt/CDEmotIt.js +1 -0
- package/.output/public/_nuxt/CIBOv3Ge.js +2 -0
- package/.output/public/_nuxt/CO7j4p5r.js +1 -0
- package/.output/public/_nuxt/COMhp7lz.js +1 -0
- package/.output/public/_nuxt/{jxc14CqP.js → CPiLUjjx.js} +1 -1
- package/.output/public/_nuxt/{DZ-KbUZi.js → CTYlay1H.js} +1 -1
- package/.output/public/_nuxt/{5QBnDbs_.js → CVEk4D8I.js} +1 -1
- package/.output/public/_nuxt/{LTMoFvEY.js → CbuK1HIv.js} +1 -1
- package/.output/public/_nuxt/{2yLW7WU0.js → CdLqOMvN.js} +1 -1
- package/.output/public/_nuxt/CdM2qNYM.js +2 -0
- package/.output/public/_nuxt/Ch8sGLqE.js +1 -0
- package/.output/public/_nuxt/CkdznmkX.js +1 -0
- package/.output/public/_nuxt/{DJzFYrBt.js → Cmuwgbf4.js} +1 -1
- package/.output/public/_nuxt/{C9I1Dp3S.js → CnRNwiuE.js} +1 -1
- package/.output/public/_nuxt/{Bb2mDqKr.js → CnsaoeEq.js} +1 -1
- package/.output/public/_nuxt/{DgEa6_av.js → Cp0V2FeW.js} +1 -1
- package/.output/public/_nuxt/Cvw4EFTy.js +17 -0
- package/.output/public/_nuxt/CwDej2Lz.js +1 -0
- package/.output/public/_nuxt/D-wlhH6J.js +1 -0
- package/.output/public/_nuxt/D5Mhpp98.js +1 -0
- package/.output/public/_nuxt/{CTTmX4gy.js → D8ixf-ZR.js} +5 -5
- package/.output/public/_nuxt/{HbnAkiyK.js → DBvdRbTA.js} +2 -2
- package/.output/public/_nuxt/DDho3MJD.js +1 -0
- package/.output/public/_nuxt/DEGHW4pO.js +1 -0
- package/.output/public/_nuxt/{C77tM5Hz.js → DHSYRMJp.js} +1 -1
- package/.output/public/_nuxt/DH_LEqhd.js +2 -0
- package/.output/public/_nuxt/{CUOS6S13.js → DIqik40e.js} +1 -1
- package/.output/public/_nuxt/DLwuL-qR.js +1 -0
- package/.output/public/_nuxt/{AQ86C4c2.js → DPDFGVb_.js} +2 -2
- package/.output/public/_nuxt/DRNHuVn4.js +2 -0
- package/.output/public/_nuxt/{B_MVJP17.js → DUtYU4Sb.js} +1 -1
- package/.output/public/_nuxt/{CAoQUDI4.js → DWl73MJR.js} +1 -1
- package/.output/public/_nuxt/{BZFiz2UB.js → DWz_bHNP.js} +1 -1
- package/.output/public/_nuxt/{CGDPUNcO.js → D_SCB-z2.js} +1 -1
- package/.output/public/_nuxt/{Ce47NgZw.js → D_j436ND.js} +1 -1
- package/.output/public/_nuxt/DamzjN7l.js +1 -0
- package/.output/public/_nuxt/Db5xe__T.js +1 -0
- package/.output/public/_nuxt/{BuGAn4f7.js → DcUBmKKE.js} +1 -1
- package/.output/public/_nuxt/DiP18sFE.js +1 -0
- package/.output/public/_nuxt/Die1200X.js +1 -0
- package/.output/public/_nuxt/DihSeDlY.js +9 -0
- package/.output/public/_nuxt/{BAbrtVp3.js → DkGXOZRW.js} +1 -1
- package/.output/public/_nuxt/{ZLfZolDM.js → DnOtRv65.js} +1 -1
- package/.output/public/_nuxt/DnV-BkUA.js +1 -0
- package/.output/public/_nuxt/DpeRrg68.js +1 -0
- package/.output/public/_nuxt/Dq6_-84R.js +1 -0
- package/.output/public/_nuxt/DqKFKS1b.js +1 -0
- package/.output/public/_nuxt/DrbO0dl5.js +6 -0
- package/.output/public/_nuxt/{B3G-TIoP.js → Ds8_6Fzl.js} +1 -1
- package/.output/public/_nuxt/{QZYo3ErV.js → DvewDI9t.js} +1 -1
- package/.output/public/_nuxt/E26Y1NWH.js +1 -0
- package/.output/public/_nuxt/Hp-_W7z4.js +1 -0
- package/.output/public/_nuxt/OanUGF_v.js +1 -0
- package/.output/public/_nuxt/{9_aJhhcm.js → RSS6R9Te.js} +12 -12
- package/.output/public/_nuxt/{BfcMJBTf.js → VqLetC2g.js} +1 -1
- package/.output/public/_nuxt/WCZdf9Ln.js +1 -0
- package/.output/public/_nuxt/{DBWM_xs-.js → Yl6iqHwK.js} +4 -4
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/03f2d81b-8c58-4ea8-9a9d-7553c8ca4af6.json +1 -0
- package/.output/public/_nuxt/entry.DVKh2Fd6.css +1 -0
- package/.output/public/_nuxt/iUf7K_JR.js +1 -0
- package/.output/public/_nuxt/{B_JSV0yG.js → kDEwM7SQ.js} +1 -1
- package/.output/public/_nuxt/{BDUfBn3i.js → knaDbxMJ.js} +1 -1
- package/.output/public/_nuxt/lnpLc047.js +1 -0
- package/.output/public/_nuxt/{C2_7XZo0.js → mhvG7mu8.js} +1 -1
- package/.output/public/_nuxt/{Ck_fTH5z.js → qUaN2ZW8.js} +4 -4
- package/.output/public/_nuxt/qeqzb80l.js +1 -0
- package/.output/public/_nuxt/{BwwfasRt.js → uj92NYTx.js} +2 -2
- package/.output/public/_nuxt/vOZZ2cLi.js +1 -0
- package/.output/public/_nuxt/{CLWMETf9.js → zAFiz2Mg.js} +1 -1
- package/.output/public/demo/seed.version.json +2 -2
- package/.output/server/chunks/_/collect.mjs +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Alert-He-UxEt6.mjs → Alert-BhTWQzM5.mjs} +2 -2
- package/.output/server/chunks/build/Alert-BhTWQzM5.mjs.map +1 -0
- package/.output/server/chunks/build/{Breadcrumb-DEP2dVCZ.mjs → Breadcrumb-BJnPB2AW.mjs} +3 -3
- package/.output/server/chunks/build/Breadcrumb-BJnPB2AW.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-y6nMDYcR.mjs → BreadcrumbNav-C6Cun6tF.mjs} +3 -3
- package/.output/server/chunks/build/BreadcrumbNav-C6Cun6tF.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-DIASU8Gf.mjs → BrowserBadge-T1KRMIXA.mjs} +4 -4
- package/.output/server/chunks/build/BrowserBadge-T1KRMIXA.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-ZTsCvItQ.mjs → ChartCard-D_asI_WF.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-D_asI_WF.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartMarkerTooltip-u_1DUHh-.mjs → ChartMarkerTooltip-DscESDg7.mjs} +3 -3
- package/.output/server/chunks/build/ChartMarkerTooltip-DscESDg7.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-BisdHf8n.mjs → Checkbox-Y9ZiIRkJ.mjs} +7 -7
- package/.output/server/chunks/build/Checkbox-Y9ZiIRkJ.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-B8BNtZAe.mjs → CodeBlock-Bnn_ps9O.mjs} +5 -5
- package/.output/server/chunks/build/CodeBlock-Bnn_ps9O.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-D7-3zBUU.mjs → DashboardNavbar-D37dPEtR.mjs} +3 -3
- package/.output/server/chunks/build/DashboardNavbar-D37dPEtR.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-C3HdHvlE.mjs → DashboardSidebarToggle-DzwsZHVx.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-DzwsZHVx.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-CC2-lHiP.mjs → DataLocationCard-CUXgZQEs.mjs} +4 -4
- package/.output/server/chunks/build/DataLocationCard-CUXgZQEs.mjs.map +1 -0
- package/.output/server/chunks/build/{DesktopRunLocallyButton-iNzrDsEs.mjs → DesktopRunLocallyButton-BCmQklj6.mjs} +15 -76
- package/.output/server/chunks/build/DesktopRunLocallyButton-BCmQklj6.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-BVb2LgHu.mjs → DiagnosisPanel-haHS2azn.mjs} +8 -8
- package/.output/server/chunks/build/DiagnosisPanel-haHS2azn.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisResult-xVgZlfKK.mjs → DiagnosisResult-DqTIOelM.mjs} +11 -11
- package/.output/server/chunks/build/DiagnosisResult-DqTIOelM.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-UX9uajQJ.mjs → DurationValue-D6fQEi5S.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-D6fQEi5S.mjs.map +1 -0
- package/.output/server/chunks/build/{EmptyState-DC2q_7TD.mjs → EmptyState-C-mCzGhO.mjs} +2 -2
- package/.output/server/chunks/build/EmptyState-C-mCzGhO.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-Dzn73fbq.mjs → EntityLinks-CRJQM9Vy.mjs} +4 -4
- package/.output/server/chunks/build/EntityLinks-CRJQM9Vy.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-C-agmABK.mjs → EnvManagedBadge-hyelwXrw.mjs} +4 -4
- package/.output/server/chunks/build/EnvManagedBadge-hyelwXrw.mjs.map +1 -0
- package/.output/server/chunks/build/{ErrorState-CktYyeEZ.mjs → ErrorState-9UPssp7w.mjs} +2 -2
- package/.output/server/chunks/build/ErrorState-9UPssp7w.mjs.map +1 -0
- package/.output/server/chunks/build/{FeatureUnavailable-DHFkwI7t.mjs → FeatureUnavailable-CDw3__eq.mjs} +3 -3
- package/.output/server/chunks/build/FeatureUnavailable-CDw3__eq.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-GYHKiSI6.mjs → FormField-8vSc-3mb.mjs} +2 -2
- package/.output/server/chunks/build/FormField-8vSc-3mb.mjs.map +1 -0
- package/.output/server/chunks/build/{GetStartedWizard-BpcGYsm2.mjs → GetStartedWizard-Dp_tjhry.mjs} +4 -4
- package/.output/server/chunks/build/GetStartedWizard-Dp_tjhry.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-plioHKA0.mjs → HelpHint-Bfyo3ar6.mjs} +31 -4
- package/.output/server/chunks/build/HelpHint-Bfyo3ar6.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-CwpfmI0W.mjs → LoadingState-CxfFwac9.mjs} +2 -2
- package/.output/server/chunks/build/LoadingState-CxfFwac9.mjs.map +1 -0
- package/.output/server/chunks/build/{MarkerBadge-Biz5--h2.mjs → MarkerBadge-DmubzeuF.mjs} +2 -2
- package/.output/server/chunks/build/MarkerBadge-DmubzeuF.mjs.map +1 -0
- package/.output/server/chunks/build/{MetaStripGroup-A0a72vt5.mjs → MetaStripGroup-C-cNBfC9.mjs} +6 -6
- package/.output/server/chunks/build/MetaStripGroup-C-cNBfC9.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-hKLvVFNp.mjs → Modal-DcNzjvnm.mjs} +2 -2
- package/.output/server/chunks/build/Modal-DcNzjvnm.mjs.map +1 -0
- package/.output/server/chunks/build/{NavbarActions-_YjrSUat.mjs → NavbarActions-VCHW0u67.mjs} +2 -2
- package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +1 -0
- package/.output/server/chunks/build/{NavigationMenu-RfBOyS32.mjs → NavigationMenu-DG6V0R9Y.mjs} +5 -5
- package/.output/server/chunks/build/NavigationMenu-DG6V0R9Y.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs → OpenInIdeLink-CLj2cTkc.mjs} +6 -6
- package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs.map → OpenInIdeLink-CLj2cTkc.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs → ProjectTestCasesTable-BNd5Fn_G.mjs} +15 -15
- package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs.map → ProjectTestCasesTable-BNd5Fn_G.mjs.map} +1 -1
- package/.output/server/chunks/build/{RovingFocusItem-BOSx1Z9Z.mjs → RovingFocusItem-DkZadRuK.mjs} +2 -2
- package/.output/server/chunks/build/RovingFocusItem-DkZadRuK.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-nuLb-Nm3.mjs → RunReports-CnyGcU8K.mjs} +4 -4
- package/.output/server/chunks/build/RunReports-CnyGcU8K.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-CvWmcFYM.mjs → RunStatusBadge-DTqX18X-.mjs} +3 -3
- package/.output/server/chunks/build/RunStatusBadge-DTqX18X-.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-DHAFvJxm.mjs → SectionCard-taTpPtua.mjs} +3 -3
- package/.output/server/chunks/build/SectionCard-taTpPtua.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-CEyw7HGK.mjs → Select-BChKOOsc.mjs} +4 -4
- package/.output/server/chunks/build/Select-BChKOOsc.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs → SelectMenu-DLkMyBsW.mjs} +5 -5
- package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs.map → SelectMenu-DLkMyBsW.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-lrN70ODV.mjs → Separator-Dn-4PN3P.mjs} +2 -2
- package/.output/server/chunks/build/Separator-Dn-4PN3P.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-tRmytcEJ.mjs → SettingsField-BLO1C7uY.mjs} +6 -6
- package/.output/server/chunks/build/SettingsField-BLO1C7uY.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-D6cRIqch.mjs → Slideover-BiDJaQrt.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-BiDJaQrt.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-R2n82ncQ.mjs → Switch-Ca3fYrSH.mjs} +4 -4
- package/.output/server/chunks/build/Switch-Ca3fYrSH.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-qZdnm9t2.mjs → Table-DQb34a0A.mjs} +3 -3
- package/.output/server/chunks/build/Table-DQb34a0A.mjs.map +1 -0
- package/.output/server/chunks/build/{Tabs-BDP7MWl4.mjs → Tabs-_ALhm_oG.mjs} +3 -3
- package/.output/server/chunks/build/Tabs-_ALhm_oG.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-CKDXQ2GI.mjs → TestCaseHistoryChart-D-TEUsZ8.mjs} +3 -3
- package/.output/server/chunks/build/TestCaseHistoryChart-D-TEUsZ8.mjs.map +1 -0
- package/.output/server/chunks/build/{TestMetaBadges-BlyKmfeP.mjs → TestMetaBadges-G2dAHnT-.mjs} +2 -2
- package/.output/server/chunks/build/TestMetaBadges-G2dAHnT-.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-CvsmKJ4D.mjs → TestStatusBar-CseETAdn.mjs} +2 -2
- package/.output/server/chunks/build/TestStatusBar-CseETAdn.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-DpmpM-lN.mjs → Textarea-CXOoRq7y.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-CXOoRq7y.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-BI3WQErw.mjs → Tooltip-trltUr5c.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-trltUr5c.mjs.map +1 -0
- package/.output/server/chunks/build/{VisuallyHiddenInput-D4E5aJCQ.mjs → VisuallyHiddenInput-CGURvg3N.mjs} +2 -2
- package/.output/server/chunks/build/VisuallyHiddenInput-CGURvg3N.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs → _id_-B-G4eG5U.mjs} +40 -40
- package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs.map → _id_-B-G4eG5U.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-T965GKYC.mjs → _id_-Cnzg8n21.mjs} +41 -38
- package/.output/server/chunks/build/_id_-Cnzg8n21.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-wiULjAVc.mjs → _id_-Dp_d6gT7.mjs} +63 -55
- package/.output/server/chunks/build/{_id_-wiULjAVc.mjs.map → _id_-Dp_d6gT7.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs → _id_-t2AWaYuK.mjs} +59 -52
- package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs.map → _id_-t2AWaYuK.mjs.map} +1 -1
- package/.output/server/chunks/build/{about-B3V_OEiu.mjs → about-BFsHkJwE.mjs} +8 -8
- package/.output/server/chunks/build/about-BFsHkJwE.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DpBdYE46.mjs → account-CZAq8kVg.mjs} +8 -8
- package/.output/server/chunks/build/account-CZAq8kVg.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-DYhpzbqp.mjs → ai-BGP3GcCR.mjs} +21 -21
- package/.output/server/chunks/build/{ai-DYhpzbqp.mjs.map → ai-BGP3GcCR.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-CZJEU0an.mjs → analytics-CXl5OWV-.mjs} +25 -25
- package/.output/server/chunks/build/{analytics-CZJEU0an.mjs.map → analytics-CXl5OWV-.mjs.map} +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{db.client-Bdqk_eYQ.mjs → db.client-DijpEH6i.mjs} +3 -1
- package/.output/server/chunks/build/db.client-DijpEH6i.mjs.map +1 -0
- package/.output/server/chunks/build/{default-DO1izI2V.mjs → default-4ixAePum.mjs} +209 -77
- package/.output/server/chunks/build/default-4ixAePum.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-C8bndVXg.mjs → docs-Cgsd01H9.mjs} +16 -16
- package/.output/server/chunks/build/{docs-C8bndVXg.mjs.map → docs-Cgsd01H9.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-BdfF9er2.mjs → edit-BEQ-ozj9.mjs} +436 -40
- package/.output/server/chunks/build/edit-BEQ-ozj9.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-tkz5_OA-.mjs → fetch-B5TVXZ1s.mjs} +3 -3
- package/.output/server/chunks/build/fetch-B5TVXZ1s.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-swZRcvXE.mjs → forgot-password-mqE1mpDI.mjs} +4 -4
- package/.output/server/chunks/build/forgot-password-mqE1mpDI.mjs.map +1 -0
- package/.output/server/chunks/build/{help-content-C876a9WD.mjs → help-content-Bc99BajS.mjs} +6 -1
- package/.output/server/chunks/build/help-content-Bc99BajS.mjs.map +1 -0
- package/.output/server/chunks/build/{import-B27Sv7h5.mjs → import-DqDDTcSc.mjs} +15 -15
- package/.output/server/chunks/build/import-DqDDTcSc.mjs.map +1 -0
- package/.output/server/chunks/build/{index-ID913tUa.mjs → index-Bpdj6TXV.mjs} +5 -5
- package/.output/server/chunks/build/index-Bpdj6TXV.mjs.map +1 -0
- package/.output/server/chunks/build/{index-vRwzDXLs.mjs → index-DBFsIsjA.mjs} +534 -262
- package/.output/server/chunks/build/index-DBFsIsjA.mjs.map +1 -0
- package/.output/server/chunks/build/{index-C7m32bRI.mjs → index-DSufXCZq.mjs} +22 -18
- package/.output/server/chunks/build/index-DSufXCZq.mjs.map +1 -0
- package/.output/server/chunks/build/{index-BdZmxLtC.mjs → index-WXE60AXk.mjs} +24 -24
- package/.output/server/chunks/build/{index-BdZmxLtC.mjs.map → index-WXE60AXk.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-ByWTzqF6.mjs → index-okKjrRhL.mjs} +15 -4
- package/.output/server/chunks/build/index-okKjrRhL.mjs.map +1 -0
- package/.output/server/chunks/build/{isValueEqualOrExist-D4lZ8uRY.mjs → isValueEqualOrExist-C-9DzL4K.mjs} +3 -3
- package/.output/server/chunks/build/isValueEqualOrExist-C-9DzL4K.mjs.map +1 -0
- package/.output/server/chunks/build/{login-hxCF06JT.mjs → login-eQ88UoBW.mjs} +7 -7
- package/.output/server/chunks/build/login-eQ88UoBW.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-BVW1llyW.mjs → mcp-frcSP2Zg.mjs} +14 -14
- package/.output/server/chunks/build/mcp-frcSP2Zg.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-Dn-evqXM.mjs → notifications-DAtRd5V6.mjs} +14 -14
- package/.output/server/chunks/build/notifications-DAtRd5V6.mjs.map +1 -0
- package/.output/server/chunks/build/{performance-CV8qm94u.mjs → performance-BcQzGXE7.mjs} +13 -13
- package/.output/server/chunks/build/performance-BcQzGXE7.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-gKDz8LyA.mjs → pr-feedback-BHtgvegy.mjs} +11 -11
- package/.output/server/chunks/build/pr-feedback-BHtgvegy.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-DtEISa1I.mjs → reset-password-DMHrp14-.mjs} +4 -4
- package/.output/server/chunks/build/reset-password-DMHrp14-.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +34 -34
- package/.output/server/chunks/build/{settings-BJDnuLpc.mjs → settings-Bo5OETop.mjs} +11 -11
- package/.output/server/chunks/build/settings-Bo5OETop.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DnAK4Rzg.mjs → settings-metadata-BHbsWQ2g.mjs} +3 -3
- package/.output/server/chunks/build/settings-metadata-BHbsWQ2g.mjs.map +1 -0
- package/.output/server/chunks/build/{setup-BO9tXa_G.mjs → setup-DAXcxuNY.mjs} +18 -18
- package/.output/server/chunks/build/{setup-BO9tXa_G.mjs.map → setup-DAXcxuNY.mjs.map} +1 -1
- package/.output/server/chunks/build/{storage-zN92cA9q.mjs → storage-BPK0fVwx.mjs} +13 -13
- package/.output/server/chunks/build/storage-BPK0fVwx.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-CJFnoyQc.mjs → tags-CoxErA5m.mjs} +8 -8
- package/.output/server/chunks/build/tags-CoxErA5m.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-0Q6rT73d.mjs → test-cases-D8rn-0le.mjs} +27 -27
- package/.output/server/chunks/build/test-cases-D8rn-0le.mjs.map +1 -0
- package/.output/server/chunks/build/{test-functions-DVRJgiWo.mjs → test-functions-pWs9mhbJ.mjs} +13 -13
- package/.output/server/chunks/build/test-functions-pWs9mhbJ.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs → useCopyRich-BqVfhnoH.mjs} +90 -33
- package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs.map → useCopyRich-BqVfhnoH.mjs.map} +1 -1
- package/.output/server/chunks/build/{useDesktopDownload-Dyf0fR47.mjs → useDesktopDownload-l80DQJ9e.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-l80DQJ9e.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopLocalRuns-k7Gw3Fv3.mjs → useDesktopLocalRuns-Dil3YzyU.mjs} +68 -6
- package/.output/server/chunks/build/useDesktopLocalRuns-Dil3YzyU.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopProjectLink-WwLte59P.mjs → useDesktopProjectLink-BnIONB--.mjs} +21 -4
- package/.output/server/chunks/build/useDesktopProjectLink-BnIONB--.mjs.map +1 -0
- package/.output/server/chunks/build/{useFormControl-8skMOTIf.mjs → useFormControl-CXKztoWk.mjs} +2 -2
- package/.output/server/chunks/build/useFormControl-CXKztoWk.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-D74FmDNg.mjs → useOpenInIde-CbbYW3pd.mjs} +2 -2
- package/.output/server/chunks/build/useOpenInIde-CbbYW3pd.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-BLTHducV.mjs → useSettingsNav-C6NpD4Ab.mjs} +2 -2
- package/.output/server/chunks/build/useSettingsNav-C6NpD4Ab.mjs.map +1 -0
- package/.output/server/chunks/build/{users-C9bjOBde.mjs → users-C2MuCf5G.mjs} +9 -9
- package/.output/server/chunks/build/users-C2MuCf5G.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1032 -721
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
- package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs +88 -0
- package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs +63 -0
- package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/setup-status.get.mjs +1 -1
- package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/database/migrations/0045_productive_stingray.sql +1 -0
- package/.output/server/database/migrations/meta/0045_snapshot.json +3779 -0
- package/.output/server/database/migrations/meta/_journal.json +7 -0
- package/.output/server/database/migrations-pg/0046_gorgeous_hercules.sql +1 -0
- package/.output/server/database/migrations-pg/meta/0046_snapshot.json +4486 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/5SkLJHl8.js +0 -1
- package/.output/public/_nuxt/6sA-GK37.js +0 -1
- package/.output/public/_nuxt/6vX5JdHr.js +0 -1
- package/.output/public/_nuxt/B070fjS-.js +0 -1
- package/.output/public/_nuxt/B0tmRAhY.js +0 -1
- package/.output/public/_nuxt/B3AG2m76.js +0 -1
- package/.output/public/_nuxt/B4mZElvM.js +0 -1
- package/.output/public/_nuxt/B7tiBVLW.js +0 -1
- package/.output/public/_nuxt/BFYkWpPx.js +0 -1
- package/.output/public/_nuxt/BM5BPKlc.js +0 -1
- package/.output/public/_nuxt/BNyTWIad.js +0 -9
- package/.output/public/_nuxt/BOvtXn3m.js +0 -1
- package/.output/public/_nuxt/BVyjw9Bi.js +0 -1
- package/.output/public/_nuxt/BZOykMLD.js +0 -1
- package/.output/public/_nuxt/BjMo2tKC.js +0 -6
- package/.output/public/_nuxt/BjOFxi54.js +0 -1
- package/.output/public/_nuxt/BjaRappk.js +0 -1
- package/.output/public/_nuxt/BtZNYmZO.js +0 -1
- package/.output/public/_nuxt/C6t4kxaa.js +0 -1
- package/.output/public/_nuxt/CEai-PWF.js +0 -1
- package/.output/public/_nuxt/CF_eDZHu.js +0 -1
- package/.output/public/_nuxt/CIQeRUSy.js +0 -17
- package/.output/public/_nuxt/CPQRQqXU.js +0 -1
- package/.output/public/_nuxt/CYhm2FBS.js +0 -5
- package/.output/public/_nuxt/CdEzDaDI.js +0 -1
- package/.output/public/_nuxt/CfhOanaF.js +0 -1
- package/.output/public/_nuxt/CvVbKrcH.js +0 -1
- package/.output/public/_nuxt/Cz7SCzdW.js +0 -1
- package/.output/public/_nuxt/D7fxV-UA.js +0 -1
- package/.output/public/_nuxt/D7t0Dn3h.js +0 -1
- package/.output/public/_nuxt/DCE2_MKD.js +0 -2
- package/.output/public/_nuxt/DFfqRQxk.js +0 -1
- package/.output/public/_nuxt/DNqm5cWU.js +0 -1
- package/.output/public/_nuxt/DTrPCv7R.js +0 -1
- package/.output/public/_nuxt/DYjxDsYC.js +0 -1
- package/.output/public/_nuxt/Dbf8eT28.js +0 -1
- package/.output/public/_nuxt/DeewM3Wg.js +0 -2
- package/.output/public/_nuxt/DiWxW-w3.js +0 -2
- package/.output/public/_nuxt/DmqCquDx.js +0 -1
- package/.output/public/_nuxt/DnxrNGE_.js +0 -1
- package/.output/public/_nuxt/DprkT7rM.js +0 -1
- package/.output/public/_nuxt/DuBtaw3j.js +0 -1
- package/.output/public/_nuxt/DylyATWU.js +0 -2
- package/.output/public/_nuxt/HIGGZ_c-.js +0 -1
- package/.output/public/_nuxt/RkNtgoTD.js +0 -1
- package/.output/public/_nuxt/Wk7ZKG4B.js +0 -1
- package/.output/public/_nuxt/Ya8ZzWuY.js +0 -1
- package/.output/public/_nuxt/a8Z6VC7V.js +0 -2
- package/.output/public/_nuxt/builds/meta/6d1766a0-0aba-46b8-9d97-7dd174130359.json +0 -1
- package/.output/public/_nuxt/dUPMBJ4f.js +0 -1
- package/.output/public/_nuxt/eT2oObCh.js +0 -1
- package/.output/public/_nuxt/entry.D_eWXrnD.css +0 -1
- package/.output/public/_nuxt/kWnH8yJq.js +0 -1
- package/.output/public/_nuxt/sqqg4oXL.js +0 -1
- package/.output/public/_nuxt/xZQGtnVA.js +0 -1
- package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +0 -1
- package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +0 -1
- package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +0 -1
- package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +0 -1
- package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +0 -1
- package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +0 -1
- package/.output/server/chunks/build/ErrorState-CktYyeEZ.mjs.map +0 -1
- package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +0 -1
- package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +0 -1
- package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +0 -1
- package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +0 -1
- package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +0 -1
- package/.output/server/chunks/build/NavbarActions-_YjrSUat.mjs.map +0 -1
- package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +0 -1
- package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +0 -1
- package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +0 -1
- package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +0 -1
- package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.mjs.map +0 -1
- package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +0 -1
- package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +0 -1
- package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +0 -1
- package/.output/server/chunks/build/account-DpBdYE46.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +0 -1
- package/.output/server/chunks/build/default-DO1izI2V.mjs.map +0 -1
- package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +0 -1
- package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +0 -1
- package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +0 -1
- package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +0 -1
- package/.output/server/chunks/build/index-C7m32bRI.mjs.map +0 -1
- package/.output/server/chunks/build/index-ID913tUa.mjs.map +0 -1
- package/.output/server/chunks/build/index-vRwzDXLs.mjs.map +0 -1
- package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +0 -1
- package/.output/server/chunks/build/login-hxCF06JT.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +0 -1
- package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +0 -1
- package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +0 -1
- package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +0 -1
- package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +0 -1
- package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +0 -1
- package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +0 -1
- package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +0 -1
- package/.output/server/chunks/build/users-C9bjOBde.mjs.map +0 -1
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{b as ie,J as H,B as ye,an as he,r as x,h as K,ao as be,N as Ve,d as _e,k as e,o as m,c as h,j as u,p as ke,m as C,i as a,t as $,g as B,_ as Ce,F as J,y as oe,q as Q,v as T,A as qe,f as X,l as He,G as We,L as Ye}from"./CNu3kken.js";import{_ as Ge}from"./CfhOanaF.js";import{i as Xe,g as Je,f as Ke,d as Qe,e as Ze,h as et}from"./9_aJhhcm.js";import{_ as tt}from"./B0tmRAhY.js";import{f as we,n as st}from"./DeewM3Wg.js";import{_ as nt}from"./Ya8ZzWuY.js";import{f as at}from"./D-c8ZSws.js";import{u as ot}from"./CLWMETf9.js";import{u as it}from"./CAoQUDI4.js";const rt=globalThis.setInterval,re=Symbol("cluster-diagnosis");function lt(g){const b=ie(),o=x(""),r=x(""),k=x([]),S=x([]),_=K(()=>!!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()),k.value.length&&(n.selectedCommitShas=k.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()),k.value.length&&(F.selectedCommitShas=k.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(k,()=>{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)&&(k.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:k,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"},kt={class:"px-1 py-0.5 bg-elevated space-y-0.5"},Ct=["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,k=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(!Xe(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,k.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=K(()=>_.value.filter(s=>s.selected).length);return ye(P),(s,i)=>{const c=ke,f=Ce;return e(R)?(m(),h("div",dt,[u(c,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),i[0]||(i[0]=C(" Loading screenshots from test evidence… ",-1))])):e(_).length?(m(),h("div",ft,[a("div",mt,[a("span",gt,[i[1]||(i[1]=C(" 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]=[C("All",-1)])]),_:1}),u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:l},{default:B(()=>[...i[3]||(i[3]=[C("None",-1)])]),_:1})])]),a("div",xt,[(m(!0),h(J,null,oe(e(_),(d,z)=>(m(),h("div",{key:z,class:Q(["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:Q(["size-3.5 drop-shadow",d.selected?"text-primary":"text-gray-300"])},null,8,["name","class"])])]),a("div",kt,[a("p",{class:"text-[9px] text-gray-700 dark:text-gray-300 truncate font-medium leading-tight",title:d.caseTitle},$(d.caseTitle),9,Ct),a("div",wt,[a("span",{class:Q(["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"),k=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",k.value=null,S.value=null}async function E(l={}){b.value="",o.value=null,S.value=null,k.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")k.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"?(k.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")k.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:k,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 k=r.result.split(",")[1];k!==void 0?b(k):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 k(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&&k(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:k,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},Gt={class:"flex items-center gap-2 px-3 pb-2 pt-1 border-t border-default"},Xt={key:0,class:"text-xs text-primary"},Jt={key:1,class:"text-xs text-gray-400"},Kt={key:0,class:"flex flex-wrap gap-2"},Qt={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:k,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(K(()=>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=K(()=>[...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=K(()=>{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=ke,ae=Ge,Be=Je,M=Ce,Pe=Qe,Ue=Ke,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]=C(" — ",-1)),u(A,{name:"i-lucide-triangle-alert",class:"size-3 shrink-0 inline"}),t[16]||(t[16]=C(" 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(()=>[C($(e(V)?"Hide context":"Show context"),1)]),_:1},8,["icon","loading"]),e(o)&&e(o).status==="completed"?(m(),X(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]=[C(" 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:Q(["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(()=>[C($(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]=[C("Enable",-1)])]),_:1},8,["onClick"])])):T("",!0),e(s)?.configured?(m(),X(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(J,{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]=C(" 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:Q(["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",Gt,[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]=[C(" Attach files ",-1)])]),_:1}),e(le)?(m(),h("span",Xt,"Drop files here\\u2026")):(m(),h("span",Jt,"or drag & drop text files and images"))])],34)])):T("",!0)]),e(w).length?(m(),h("div",Kt,[(m(!0),h(J,null,oe(e(w),(y,G)=>(m(),h("div",{key:G,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",Qt,$(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)(G)},[u(A,{name:"i-lucide-x",class:"size-3"})],8,es)]))),128))])):T("",!0),e(F).length?(m(),h("div",ts,[(m(!0),h(J,null,oe(e(F),(y,G)=>(m(),h("div",{key:G,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)(G)},[u(A,{name:"i-lucide-x",class:"size-4"})],8,as)]),a("p",os,$(y.name),1)]))),128))])):T("",!0),g.affectedTestCases?.length?(m(),X(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]=[C(" 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"}),C(" "+$(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(J,{key:0},[C($(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]=[C(" 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]=[C(" Dismiss ",-1)])]),_:1},8,["loading"])]),a("p",vs,"Started "+$(e(we)(e(o).updatedAt)),1)])):T("",!0),e(j)?(m(),X(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]=[C(" Retry (fallback) ",-1)])]),_:1})]),_:1},8,["description"])):T("",!0),Ie()?(m(),X(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]=C(" 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]=[C(" Configure in Settings ",-1)])]),_:1}),t[33]||(t[33]=a("p",{class:"text-xs text-gray-400 mt-4 max-w-xs"},[C(" Use the "),a("strong",null,"Show context"),C(" 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]=C(" 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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as V}from"./DTrPCv7R.js";import{_ as H}from"./B3G-TIoP.js";import{_ as A,a as J}from"./2yLW7WU0.js";import{_ as O}from"./B070fjS-.js";import{d as Z,u as q,a as z,b as G,w as k,e as K,r as g,f as L,g as i,h as f,o as M,i as l,j as r,k as o,l as Q,_ as W,m as b,t as X}from"./CNu3kken.js";import{_ as Y}from"./Wk7ZKG4B.js";import{_ as tt}from"./B_JSV0yG.js";import{u as h}from"./DprkT7rM.js";import{o as ot,s as u}from"./DGnQ69wW.js";import"./BZFiz2UB.js";import"./CF_eDZHu.js";import"./DZ-KbUZi.js";import"./B0tmRAhY.js";import"./CfhOanaF.js";import"./BjaRappk.js";import"./Ce89VyHE.js";import"./BM5BPKlc.js";import"./BVyjw9Bi.js";import"./B3AG2m76.js";import"./CmTzxoQt.js";import"./DeewM3Wg.js";const st={class:"p-4 space-y-4"},et={class:"text-sm text-gray-600 mt-1"},at={class:"font-medium"},nt={class:"flex justify-end gap-2 pt-2"},Pt=Z({__name:"edit",async setup(it){let n,p;const $=q(),v=z(),j=G(),c=$.params.id,{data:e}=([n,p]=k(()=>h(`/api/projects/${c}`,"$CprFePJ4Up")),n=await n,p(),n),{data:y,refresh:x}=([n,p]=k(()=>h("/api/tags","$vxtZOtP06T")),n=await n,p(),n);K(f(()=>({title:`Edit ${e.value?.label||e.value?.name||"Project"} — Piwi Dashboard`})));const U=f(()=>y.value?.tags||[]),I=f(()=>!!e.value?.hasScmToken),s=g({label:e.value?.label||"",description:e.value?.description||"",diagnosisInstructions:e.value?.diagnosisInstructions||"",scmToken:""}),d=g(e.value?.tags||[]),P=ot({label:u().optional(),description:u().optional(),diagnosisInstructions:u().optional(),scmToken:u().optional()}),_=g(!1);async function C(){try{_.value=!0,await $fetch(`/api/projects/${c}`,{method:"PUT",body:{label:s.value.label||null,description:s.value.description||null,diagnosisInstructions:s.value.diagnosisInstructions||null,scmToken:s.value.scmToken||null,tagIds:d.value.map(m=>m.id)}}),j.add({title:"Project updated",description:"Project settings have been saved successfully",color:"success"}),await v.push(`/projects/${c}`)}catch(m){console.error("Error updating project:",m),j.add({title:"Error",description:"Failed to update project",color:"error"})}finally{_.value=!1}}function w(){v.push(`/projects/${c}`)}return(m,t)=>{const N=V,B=H,D=J,F=O,T=W,E=Y,S=tt,R=A;return M(),L(R,{id:"project-edit"},{header:i(()=>[r(D,null,{leading:i(()=>[r(N),r(B,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(e)?.label||o(e)?.name||"Project",to:`/projects/${o(c)}`},{label:"Edit"}]},null,8,["items"])]),_:1})]),body:i(()=>[l("div",st,[r(S,null,{header:i(()=>[t[7]||(t[7]=l("h2",null,"Edit project settings",-1)),l("p",et,[t[6]||(t[6]=b(" Project Name: ",-1)),l("span",at,X(o(e)?.name),1)]),t[8]||(t[8]=l("p",{class:"text-xs text-gray-500 mt-1"}," Note: The project name is used to match test results from the reporter and cannot be changed. ",-1))]),default:i(()=>[r(E,{schema:o(P),state:o(s),class:"space-y-5",onSubmit:C},{default:i(()=>[r(F,{mode:"edit","has-token":o(I),label:o(s).label,"onUpdate:label":t[0]||(t[0]=a=>o(s).label=a),description:o(s).description,"onUpdate:description":t[1]||(t[1]=a=>o(s).description=a),diagnosisInstructions:o(s).diagnosisInstructions,"onUpdate:diagnosisInstructions":t[2]||(t[2]=a=>o(s).diagnosisInstructions=a),scmToken:o(s).scmToken,"onUpdate:scmToken":t[3]||(t[3]=a=>o(s).scmToken=a),tags:o(d),"onUpdate:tags":t[4]||(t[4]=a=>Q(d)?d.value=a:null),"all-tags":o(U),onTagCreated:t[5]||(t[5]=a=>o(x)())},null,8,["has-token","label","description","diagnosisInstructions","scmToken","tags","all-tags"]),l("div",nt,[r(T,{variant:"ghost",color:"neutral",onClick:w},{default:i(()=>[...t[9]||(t[9]=[b(" Cancel ",-1)])]),_:1}),r(T,{type:"submit",icon:"i-lucide-check",loading:o(_)},{default:i(()=>[...t[10]||(t[10]=[b(" Save changes ",-1)])]),_:1},8,["loading"])])]),_:1},8,["schema","state"])]),_:1})])]),_:1})}}});export{Pt as default};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{d as ue,b as Je,o,f as q,g as A,j as _,_ as Ie,m as E,i as p,k as t,l as Le,r as Y,K as vt,h as I,A as ze,c as u,P as xt,V as Oe,ae as bt,S as ke,C as _e,p as $e,q as pe,v as T,t as $,F as ee,L as kt,y as fe,s as Pe,H as at,J as Ee,af as Ae,B as rt,E as _t,R as et,I as We,ac as Re,G as $t,W as Ne,ag as Se,T as wt,ad as Ct,ah as Tt,ai as St,aj as At,a0 as Lt,a1 as Rt}from"./CNu3kken.js";import{_ as it,a as It}from"./CfhOanaF.js";import{_ as zt}from"./BjOFxi54.js";import{u as Pt}from"./jxc14CqP.js";import{a as He,u as Ue}from"./DprkT7rM.js";import{e as lt,u as Bt,v as Et,f as Ye,w as ct,n as Me,x as Ot}from"./DeewM3Wg.js";import{_ as Ge}from"./Ya8ZzWuY.js";import{_ as je}from"./Ce47NgZw.js";import{_ as Mt}from"./roaTZkYi.js";import{_ as Nt}from"./DNqm5cWU.js";import{_ as Ut}from"./FJTsZ5Aa.js";import{_ as jt}from"./DJzFYrBt.js";import{u as Dt,i as Kt,b as Vt}from"./9_aJhhcm.js";import{f as Ht}from"./D-c8ZSws.js";import{_ as ut}from"./Ce_j5NtN.js";import{_ as Ft}from"./B_JSV0yG.js";const qt={class:"w-64 p-1 space-y-0.5"},Zt={class:"flex items-center justify-between px-2 pt-1 pb-1"},Wt=ue({__name:"ExportMenu",props:{endpoint:{},baseName:{}},setup(e){const r=e,{download:a}=Pt(),{copy:c}=He(),n=Je(),s=Y(!1),l=Y(""),f=I(()=>(ze().app?.baseURL??"/").replace(/\/$/,""));function i(C){return`${f.value}${C}`}async function h(C){s.value=!1,await a(i(`${r.endpoint}?format=${C}`),`${r.baseName}.${C}`,{binary:C==="zip"})}function v(){s.value=!1,window.open(i(`${r.endpoint}?format=html&print=1`),"_blank")}async function L(C,w,S){l.value=w;try{const D=await fetch(i(C));if(!D.ok)throw new Error(`Request failed (${D.status})`);const U=await D.text();c(S?S(U):U,{toast:`${w} copied`}),s.value=!1}catch(D){n.add({title:`Could not copy ${w.toLowerCase()}`,description:lt(D),color:"error"})}finally{l.value=""}}function y(){return L(`${r.endpoint}?format=md`,"Report")}return(C,w)=>{const S=Ie,D=it,U=zt,V=vt;return o(),q(V,{open:t(s),"onUpdate:open":w[4]||(w[4]=B=>Le(s)?s.value=B:null)},{content:A(()=>[p("div",qt,[p("div",Zt,[w[6]||(w[6]=p("p",{class:"text-xs font-medium text-gray-500"},"Download",-1)),_(D,{topic:"export.offline"})]),_(S,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-code",title:"One self-contained HTML file with screenshots and video embedded",onClick:w[0]||(w[0]=B=>h("html"))},{default:A(()=>[...w[7]||(w[7]=[E(" HTML — single file ",-1)])]),_:1}),_(S,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-archive",title:"Report plus the raw artifacts, including trace archives and data.json",onClick:w[1]||(w[1]=B=>h("zip"))},{default:A(()=>[...w[8]||(w[8]=[E(" ZIP — with all evidence ",-1)])]),_:1}),_(S,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-printer",title:"Opens the report with your browser's print dialog, for Save as PDF",onClick:v},{default:A(()=>[...w[9]||(w[9]=[E(" PDF — via print ",-1)])]),_:1}),_(S,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-text",title:"The Markdown report as a file",onClick:w[2]||(w[2]=B=>h("md"))},{default:A(()=>[...w[10]||(w[10]=[E(" Markdown ",-1)])]),_:1}),_(S,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-file-json",title:"Everything the report contains, machine-readable",onClick:w[3]||(w[3]=B=>h("json"))},{default:A(()=>[...w[11]||(w[11]=[E(" JSON ",-1)])]),_:1}),_(U,{class:"my-1"}),w[13]||(w[13]=p("p",{class:"text-xs font-medium text-gray-500 px-2 pt-1 pb-1"},"Copy to clipboard",-1)),_(S,{block:"",size:"sm",color:"neutral",variant:"ghost",class:"justify-start",icon:"i-lucide-clipboard-list",loading:t(l)==="Report",title:"The whole investigation as Markdown, for an issue or a chat",onClick:y},{default:A(()=>[...w[12]||(w[12]=[E(" Report (Markdown) ",-1)])]),_:1},8,["loading"])])]),default:A(()=>[_(S,{icon:"i-lucide-share",size:"xs",color:"neutral",variant:"outline",title:"Take this investigation away"},{default:A(()=>[...w[5]||(w[5]=[E(" Export ",-1)])]),_:1})]),_:1},8,["open"])}}}),Oa=Object.assign(Wt,{__name:"ExportMenu"}),Jt={class:"flex items-center justify-between gap-2"},Yt=["aria-expanded","title"],Gt={class:"text-lg font-medium inline-flex items-center gap-1 shrink-0"},Qt={key:2,class:"min-w-0 flex-1 truncate text-sm text-gray-500 dark:text-gray-400"},Xt={key:0,class:"flex items-center gap-1 shrink-0"},en={key:0,class:"text-sm text-gray-500 mt-1 ml-11"},tn=ue({__name:"CollapsibleSectionCard",props:{title:{},icon:{},subtitle:{},count:{},iconClass:{default:"text-primary"},help:{},storageKey:{},defaultFolded:{type:Boolean,default:!0}},setup(e,{expose:r}){const a=e,{folded:c,toggle:n,setFolded:s}=Dt(`piwi-section-fold-${a.storageKey}`,a.defaultFolded),l=Y(null);function f(){s(!1),kt(()=>l.value?.scrollIntoView({behavior:"smooth",block:"start"}))}return r({setFolded:s,reveal:f}),(i,h)=>{const v=$e,L=it,y=Ft;return o(),u("div",{ref_key:"rootEl",ref:l,class:"scroll-mt-4"},[_(y,{ui:{header:"p-3 sm:px-4 sm:py-3",body:t(c)?"p-0 sm:p-0":""},class:pe(t(c)&&"divide-y-0")},{header:A(()=>[p("div",Jt,[p("div",{class:"flex items-center gap-2 min-w-0 flex-1 cursor-pointer select-none rounded-sm outline-none focus-visible:outline-2 focus-visible:outline-primary",role:"button",tabindex:"0","aria-expanded":!t(c),title:t(c)?"Expand section":"Collapse section",onClick:h[1]||(h[1]=(...C)=>t(n)&&t(n)(...C)),onKeydown:[h[2]||(h[2]=ke((...C)=>t(n)&&t(n)(...C),["enter"])),h[3]||(h[3]=ke(_e((...C)=>t(n)&&t(n)(...C),["prevent"]),["space"]))]},[_(v,{name:t(c)?"i-lucide-chevron-right":"i-lucide-chevron-down",class:"size-4 shrink-0 text-gray-400"},null,8,["name"]),e.icon?(o(),q(v,{key:0,name:e.icon,class:pe(["size-5 shrink-0",e.iconClass])},null,8,["name","class"])):T("",!0),p("h3",Gt,[E($(e.title),1),e.count!=null?(o(),u(ee,{key:0},[E(" ("+$(e.count)+")",1)],64)):T("",!0)]),e.help?(o(),u("span",{key:1,onClick:h[0]||(h[0]=_e(()=>{},["stop"]))},[_(L,{topic:e.help},null,8,["topic"])])):T("",!0),t(c)&&i.$slots.folded?(o(),u("span",Qt,[Oe(i.$slots,"folded")])):T("",!0)],40,Yt),i.$slots.actions?(o(),u("div",Xt,[Oe(i.$slots,"actions")])):T("",!0)]),!t(c)&&(e.subtitle||i.$slots.subtitle)?(o(),u("p",en,[Oe(i.$slots,"subtitle",{},()=>[E($(e.subtitle),1)])])):T("",!0)]),default:A(()=>[xt(p("div",null,[Oe(i.$slots,"default")],512),[[bt,!t(c)]])]),_:3},8,["ui","class"])],512)}}}),De=Object.assign(tn,{__name:"CollapsibleSectionCard"}),nn=/('(?:\\.|[^'])*'|"(?:\\.|[^"])*")|([A-Za-z_$][\w$]*)(?=\s*\()|([A-Za-z_$][\w$]*)(?=\s*:)|(true|false|null|\d+)|([{}(),.])/g;function on(e){const r=[],a=new RegExp(nn.source,"g");let c=0,n;for(;(n=a.exec(e))!==null;){n.index>c&&r.push({kind:"plain",text:e.slice(c,n.index)});const s=n[1]?"string":n[2]?"method":n[3]?"option":n[4]?"literal":"punctuation";r.push({kind:s,text:n[0]}),c=a.lastIndex}return c<e.length&&r.push({kind:"plain",text:e.slice(c)}),r}const sn=["title"],an=ue({__name:"LocatorCode",props:{locator:{},truncate:{type:Boolean,default:!1}},setup(e){const r=e,a={method:"text-violet-700 dark:text-violet-300",string:"text-green-700 dark:text-green-300",option:"text-blue-700 dark:text-blue-300",literal:"text-amber-700 dark:text-amber-300",punctuation:"text-gray-500 dark:text-gray-400",plain:""},c=I(()=>on(r.locator));return(n,s)=>(o(),u("code",{class:pe(["font-mono",e.truncate?"block truncate":"break-words"]),title:e.locator},[(o(!0),u(ee,null,fe(t(c),(l,f)=>(o(),u("span",{key:f,class:pe(a[l.kind])},$(l.text),3))),128))],10,sn))}}),Qe=Object.assign(an,{__name:"LocatorCode"}),rn={class:"overflow-x-auto text-xs font-mono"},ln=ue({__name:"DiffPatch",props:{patch:{}},setup(e){return(r,a)=>(o(),u("div",rn,[(o(!0),u(ee,null,fe(("parsePatchLines"in r?r.parsePatchLines:t(Et))(e.patch),(c,n)=>(o(),u("div",{key:n,class:pe(["px-3 py-px whitespace-pre leading-5 min-w-0",("patchLineClass"in r?r.patchLineClass:t(Bt))[c.type]])},$(c.text||" "),3))),128))]))}}),cn=Object.assign(ln,{__name:"DiffPatch"}),un=["role","aria-checked","tabindex"],dn={class:"flex-1 min-w-0"},pn={key:0,class:"text-[11px] leading-4 text-gray-500 truncate"},fn=ue({__name:"LocatorAlternativeRow",props:{alt:{},note:{default:void 0},copied:{type:Boolean,default:!1},dense:{type:Boolean,default:!1},selectable:{type:Boolean,default:!1},selected:{type:Boolean,default:!1}},emits:["copy","select"],setup(e){const r=e;function a(s){return s>=80?"success":s>=50?"warning":"error"}function c(s){const{method:l,score:f,args:i}=s;return i&&(i.anchorTestId||i.anchorSelector||i.anchorRole)?"scoped to a stable ancestor — survives renames":f>=100?"most stable — purpose-built for testing":l==="getByRole"&&i&&!("name"in i)?"name-free role — survives renames":l==="getByRole"?"browser ARIA tree — semantic and stable":l==="getByLabel"?"associated <label> element":l==="getByPlaceholder"?"input placeholder":l==="getByText"?"visible text":l==="getByAltText"?"image alt text":l==="getByTitle"?"title attribute":l==="locator"&&f>=50?"stable selector":l==="locator"?"CSS class — may be fragile":""}const n=I(()=>r.note??c(r.alt));return(s,l)=>{const f=Pe,i=Qe,h=$e,v=Ie;return o(),u("div",{class:pe(["flex items-center gap-2 rounded border",[e.dense?"py-1 px-2":"py-1.5 px-2.5",e.selectable?"cursor-pointer hover:bg-elevated transition-colors focus-visible:outline-2 focus-visible:outline-primary":"",e.selectable&&e.selected?"border-primary/60 ring-1 ring-primary/50":"border-default/50"]]),role:e.selectable?"radio":void 0,"aria-checked":e.selectable?e.selected:void 0,tabindex:e.selectable?0:void 0,onClick:l[1]||(l[1]=L=>e.selectable&&s.$emit("select")),onKeydown:[l[2]||(l[2]=ke(_e(L=>e.selectable&&s.$emit("select"),["prevent"]),["enter"])),l[3]||(l[3]=ke(_e(L=>e.selectable&&s.$emit("select"),["prevent"]),["space"]))]},[_(f,{size:"xs",color:a(e.alt.score),variant:"subtle",class:pe(["shrink-0 font-mono tabular-nums cursor-default text-center",e.dense?"min-w-[2.25rem]":"min-w-[2.5rem]"]),title:`Stability score: ${e.alt.score}/100`},{default:A(()=>[E($(e.alt.score),1)]),_:1},8,["color","class","title"]),p("div",dn,[_(i,{locator:e.alt.locator,truncate:"",class:"text-xs"},null,8,["locator"]),t(n)?(o(),u("p",pn,$(t(n)),1)):T("",!0)]),e.alt.pickedByUser&&e.dense?(o(),q(h,{key:0,name:"i-lucide-user-check",class:"size-3.5 text-primary shrink-0",title:"Confirmed with the locator picker"})):e.alt.pickedByUser?(o(),q(f,{key:1,size:"xs",color:"primary",variant:"subtle",icon:"i-lucide-user-check",class:"shrink-0",title:"Confirmed with the locator picker on the failing page"})):T("",!0),_(v,{size:"xs",variant:"ghost",color:"neutral",icon:e.copied?"i-lucide-check":"i-lucide-copy",title:e.copied?"Copied!":"Copy",class:"shrink-0",onClick:l[0]||(l[0]=_e(L=>s.$emit("copy"),["stop"]))},null,8,["icon","title"])],42,un)}}}),dt=Object.assign(fn,{__name:"LocatorAlternativeRow"}),tt={getByTestId:"testid",getByRole:"semantic",getByLabel:"label",getByPlaceholder:"label",getByText:"text",getByAltText:"text",getByTitle:"text",locator:"css","page.locator":"css"},mn=50;function pt(e,r,a=mn){const c=r[0]??null;if(!c)return{recommended:null,durable:null,preservesConvention:!1,hasDurableAlternative:!1,suggestAddTestId:!1};const n=e?tt[e]:void 0,s=(e?r.find(i=>i.method===e&&i.score>=a):void 0)??(n?r.find(i=>tt[i.method]===n&&i.score>=a):void 0),f=r.find(i=>i.pickedByUser)??s??c;return{recommended:f,durable:c,preservesConvention:!!s&&f===s,hasDurableAlternative:f.locator!==c.locator,suggestAddTestId:c.score<a}}const ft={a:"link",button:"button",nav:"navigation",main:"main",article:"article",section:"region",form:"form",img:"img",figure:"figure",figcaption:"caption",blockquote:"blockquote",table:"table",caption:"caption",thead:"rowgroup",tbody:"rowgroup",tfoot:"rowgroup",tr:"row",td:"cell",ul:"list",ol:"list",li:"listitem",dialog:"dialog",output:"status",progress:"progressbar",meter:"meter",textarea:"textbox",h1:"heading",h2:"heading",h3:"heading",h4:"heading",h5:"heading",h6:"heading",details:"group",summary:"button",search:"search"},gn={button:"button",submit:"button",reset:"button",image:"button",checkbox:"checkbox",radio:"radio",range:"slider",search:"searchbox",number:"spinbutton",text:"textbox",email:"textbox",tel:"textbox",url:"textbox",password:"textbox"},hn=["id","class","name","data-testid","placeholder","alt","title","aria-label","aria-level","role","type","href","multiple"];function yn(e){const r=e.attributes.role;if(r)return r;const a=e.tagName;if(!a)return null;if(a==="input"){const c=(e.attributes.type??"text").toLowerCase();return gn[c]??"textbox"}return a==="select"?e.attributes.multiple!=null?"listbox":"combobox":a==="a"?e.attributes.href!=null?"link":null:ft[a]??null}function vn(e,r){if(r!=="heading")return null;const a=e.tagName.match(/^h([1-6])$/);if(a)return Number(a[1]);const c=e.attributes["aria-level"];return c&&/^\d+$/.test(c)?Number(c):null}const Ce=(e,r)=>e.attributes[r]||null,ve=e=>e.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),Ve=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),nt=e=>/^[A-Za-z][A-Za-z0-9_-]*$/.test(e);function xn(e){return/[a-f0-9]{8,}/i.test(e)?10:/^(?:css|sc|emotion|styled)-/i.test(e)?15:/^(bg|text|border|shadow|opacity|font|w-|h-|m[tblrxy]?-|p[tblrxy]?-|flex|grid|gap|rounded|absolute|relative|fixed|sticky|block|inline|hidden|overflow|z-|top-|right-|bottom-|left-|inset-|justify-|items-|self-|content-|order-|col-|row-)/.test(e)?25:/__/.test(e)||/--/.test(e)?35:/^[a-z]+(-[a-z]+)+$/.test(e)||/^[a-z]+[A-Z][a-zA-Z]+$/.test(e)?40:(e.includes("_")||/^[a-z]+-[a-z0-9]{5,}$/.test(e)&&/[0-9]/.test(e),15)}function ot(e){return!!(/^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/i.test(e)||/^[a-f0-9]{8,}$/i.test(e)||/^[a-z]+-\d{4,}$/.test(e)||/^(tab|panel|input|select|option|dialog|modal|popup|tooltip|menu|listbox|combobox|checkbox|radio|textarea|button|field|label|accordion|collapse|step|slider|toggle|switch|dropdown|overlay|portal|layer)-\d+$/i.test(e)||/^(emotion-|styled-|css-|sc-)/.test(e)||e.startsWith("ng-")||/^(radix-|headlessui-|mui-|mantine-|chakra-)/i.test(e)||/^:r[0-9a-z]+:$/i.test(e)||/^«r[0-9a-z]+»$/i.test(e))}const bn=new Set(["data-test","data-test-id","data-qa","data-qa-id","data-cy","data-e2e"]);function kn(e){const r=[],a=new Set,c=x=>{a.has(x.locator)||(a.add(x.locator),r.push(x))},{accessibleName:n}=e,s=e.tagName,l=yn(e),f=e.selectorCounts,i=x=>x==null||x<=1,h=x=>x!=null&&x>1?45:0,v=e.textContent?e.textContent.replace(/\s+/g," ").trim():null,L=Ce(e,"data-testid");L&&i(f?.testId)&&c({locator:`getByTestId('${ve(L)}')`,method:"getByTestId",args:{testId:L},score:100});const y=vn(e,l),C=y!=null?`, level: ${y}`:"",w=x=>y!=null?{...x,level:y}:x;l&&n&&c({locator:`getByRole('${l}', { name: '${ve(n)}'${C} })`,method:"getByRole",args:w({role:l,name:n}),score:90-h(f?.roleName)});const S=Ce(e,"aria-label");if(l&&S&&S!==n&&c({locator:`getByRole('${l}', { name: '${ve(S)}'${C} })`,method:"getByRole",args:w({role:l,name:S}),score:85-h(f?.roleName)}),n&&["input","select","textarea"].includes(s)){const x=Ce(e,"aria-label");(e.hasLabel===void 0||e.hasLabel===!0||x===n)&&c({locator:`getByLabel('${ve(n)}')`,method:"getByLabel",args:{label:n},score:85})}const D=Ce(e,"placeholder");D&&c({locator:`getByPlaceholder('${ve(D)}')`,method:"getByPlaceholder",args:{placeholder:D},score:80-h(f?.placeholder)}),v&&v.length<80&&c({locator:`getByText('${ve(v)}')`,method:"getByText",args:{text:v},score:75-h(f?.text)});const U=Ce(e,"id");if(U&&!ot(U)&&i(f?.id)){const x=nt(U)?`#${U}`:`[id="${Ve(U)}"]`;c({locator:`locator('${ve(x)}')`,method:"locator",args:{selector:x},score:65})}const V=Ce(e,"name");if(V&&i(f?.name)){const x=`[name="${Ve(V)}"]`;c({locator:`locator('${ve(x)}')`,method:"locator",args:{selector:x},score:60})}const B=Ce(e,"alt");B&&c({locator:`getByAltText('${ve(B)}')`,method:"getByAltText",args:{text:B},score:60-h(f?.alt)});const Q=Ce(e,"title");Q&&c({locator:`getByTitle('${ve(Q)}')`,method:"getByTitle",args:{title:Q},score:50-h(f?.title)});const X=!!(L&&i(f?.testId)),m=(x,K,P)=>{let j=!1,ne=!1,me=!1,ge=!1,he=!1;for(const Z of e.ancestors??[]){if(K(Z)!==1)continue;if(!j&&Z.testId&&Z.testIdCount===1&&(j=!0,c({locator:`getByTestId('${ve(Z.testId)}').${x.expr}`,method:x.method,args:{...x.args,anchorTestId:Z.testId},score:P.testId})),!ne&&Z.id&&!ot(Z.id)&&Z.idCount===1){ne=!0;const k=nt(Z.id)?`#${Z.id}`:`[id="${Ve(Z.id)}"]`;c({locator:`locator('${ve(k)}').${x.expr}`,method:x.method,args:{...x.args,anchorSelector:k},score:P.id})}if(!ge&&Z.dataAttr&&Z.dataAttrCount===1){ge=!0;const{name:k,value:d}=Z.dataAttr,O=`[${k}="${Ve(d)}"]`;c({locator:`locator('${ve(O)}').${x.expr}`,method:x.method,args:{...x.args,anchorSelector:O},score:bn.has(k)?P.testData:P.data})}const ce=Z.role||ft[Z.tag]||null;!me&&ce&&ce!==x.role&&Z.roleCount===1&&(me=!0,c({locator:`getByRole('${ve(ce)}').${x.expr}`,method:x.method,args:{...x.args,anchorRole:ce},score:P.role})),!he&&ce&&Z.filterText&&Z.filterRoleCount===1&&(he=!0,c({locator:`getByRole('${ve(ce)}').filter({ hasText: '${ve(Z.filterText)}' }).${x.expr}`,method:x.method,args:{...x.args,anchorRole:ce,anchorHasText:Z.filterText},score:P.filter}))}};if(l&&!X){const x=y!=null?`'${l}', { level: ${y} }`:`'${l}'`,K=w({role:l});m({expr:`getByRole(${x})`,method:"getByRole",args:K,role:l},j=>j.scopedRoleCount,{testId:72,testData:70,id:64,data:60,role:55,filter:53});const P=e.rolePosition;P&&P.role===l&&(P.count===1||y!=null&&P.levelCount===1)&&c({locator:`getByRole(${x})`,method:"getByRole",args:K,score:58})}else!l&&v&&v.length<80&&!X&&m({expr:`getByText('${ve(v)}')`,method:"getByText",args:{text:v},role:null},x=>x.scopedTextCount,{testId:68,testData:66,id:60,data:56,role:51,filter:49});const M=Ce(e,"class");if(M){const x=f?.classes,K=M.split(/\s+/).filter(P=>P.length>1&&/^[A-Za-z_-][A-Za-z0-9_-]*$/.test(P)&&i(x?.[P])).map(P=>({cls:P,score:xn(P)})).sort((P,j)=>j.score-P.score).slice(0,3);for(const{cls:P,score:j}of K)c({locator:`locator('.${ve(P)}')`,method:"locator",args:{selector:`.${P}`},score:j})}return r.sort((x,K)=>K.score-x.score)}function _n(e){const r=e.attributes,a=r["aria-label"];if(a)return a;if(e.textContent)return e.textContent;const c=r.title;if(c)return c;const n=r.placeholder;return n||null}function $n(e,r){const{keep:a,tagRoles:c,inputRoles:n,roleSources:s,includeStructural:l,includeLabelText:f}=r,i={};for(const S of a){const D=e.getAttribute(S)??e[S];i[S]=typeof D=="string"?D.slice(0,200):D?String(D).slice(0,200):null}const h=e.getBoundingClientRect(),v={};try{const S=e.ownerDocument,D=B=>S.defaultView.CSS.escape(B),U=B=>{try{return S.querySelectorAll(B).length}catch{return}};i["data-testid"]&&(v.testId=U(`[data-testid=${JSON.stringify(i["data-testid"])}]`)),i.id&&(v.id=U(`#${D(i.id)}`)),i.name&&(v.name=U(`[name=${JSON.stringify(i.name)}]`)),i.placeholder&&(v.placeholder=U(`[placeholder=${JSON.stringify(i.placeholder)}]`)),i.alt&&(v.alt=U(`[alt=${JSON.stringify(i.alt)}]`)),i.title&&(v.title=U(`[title=${JSON.stringify(i.title)}]`));const V=(i.class||"").split(/\s+/).filter(B=>B.length>1).slice(0,10);if(V.length>0){const B={};for(const Q of V){const X=U(`.${D(Q)}`);X!==void 0&&(B[Q]=X)}v.classes=B}}catch{}let L=null;const y=[];if(l&&c&&n&&s)try{const S=e.ownerDocument,D=k=>S.defaultView.CSS.escape(k),U=k=>{try{return S.querySelectorAll(k).length}catch{return}},V=new Map,B=new Map,Q=k=>{const d=V.get(k);if(d!==void 0)return d;let O;const G=k.getAttribute("role");if(G)O=G;else{const se=(k.tagName||"").toLowerCase();se==="input"?O=n[(k.getAttribute("type")||"text").toLowerCase()]??"textbox":se==="select"?O=k.getAttribute("multiple")!=null?"listbox":"combobox":se==="a"?O=k.getAttribute("href")!=null?"link":null:O=c[se]??null}return V.set(k,O),O},X=k=>{const d=/^h([1-6])$/.exec((k.tagName||"").toLowerCase());if(d)return Number(d[1]);const O=k.getAttribute("aria-level");return O&&/^\d+$/.test(O)?Number(O):null},m=Q(e),M=m==="heading"?X(e):null,x=k=>{const d=k.getAttribute("aria-label");if(d)return d;const O=(k.textContent||"").replace(/\s+/g," ").trim();return O||k.getAttribute("title")||k.getAttribute("placeholder")||null},K=x(e),P=(e.textContent||"").replace(/\s+/g," ").trim(),j=P?P.toLowerCase():null,ne=k=>{const d=B.get(k);if(d!==void 0)return d;const O=(k.textContent||"").replace(/\s+/g," ").trim().toLowerCase();return B.set(k,O),O},me=2,ge=(k,d)=>{if(!j)return-1;const O=k.querySelectorAll("*");if(O.length>d)return-1;let G=0;for(let se=0;se<O.length;se++){const re=O[se];if(ne(re).indexOf(j)===-1)continue;let g=!1;const z=re.children;for(let H=0;H<z.length;H++)if(ne(z[H]).indexOf(j)!==-1){g=!0;break}if(g||G++,G>=me)return G}return G},he=S.querySelectorAll(s),Z=he.length<=4e3,ce=!!m&&Z;if(ce){let k=0,d=-1,O=0,G=0;for(let se=0;se<he.length;se++){const re=he[se];Q(re)===m&&(re===e&&(d=k),k++,M!=null&&X(re)===M&&O++,K!=null&&x(re)===K&&G++)}K!=null&&(v.roleName=G),d!==-1&&(L={role:m,count:k,index:d,...M!=null?{levelCount:O}:{}})}if(j){const k=ge(S.body||S.documentElement,4e3);k>=0&&(v.text=k)}if(ce||j){const k=["form","nav","main","article","section","dialog","table","li","tr"],d=/^data-(v-[0-9a-f]+|reactid|react-checksum|svelte-\w+|ng-\w+|ember\w*)$/i,O=/^data-(index|idx|i|key|row|rownum|col|column|position|pos|order|sort|offset|page)$/i,G=["data-test","data-test-id","data-qa","data-qa-id","data-cy","data-e2e"],se=(W,oe)=>!W||W.slice(0,5)!=="data-"||W==="data-testid"||d.test(W)||O.test(W)?!1:!!oe&&oe.length<=120,re=W=>{const oe=W.attributes;if(!oe)return null;let ie=null;for(let de=0;de<oe.length;de++){const le=oe[de].name,ye=oe[de].value;if(se(le,ye)){if(G.indexOf(le.toLowerCase())!==-1)return{name:le,value:ye};ie||(ie={name:le,value:ye})}}return ie},g=W=>{let oe=0;for(let ie=0;ie<he.length;ie++)Q(he[ie])===W&&oe++;return oe},z=W=>(W.textContent||"").replace(/\s+/g," ").trim(),H=W=>{const oe=W.replace(/[^A-Za-z]/g,"").length;return oe<2?!1:W.replace(/[^0-9]/g,"").length<=oe},F=W=>!!W&&W.length<=60&&W!==P&&H(W),te=W=>{const oe=W.querySelector('h1,h2,h3,h4,h5,h6,[role="heading"]');if(oe){const de=z(oe);if(F(de))return de}const ie=W.querySelectorAll("*");if(ie.length>200)return null;for(let de=0;de<ie.length;de++){const le=ie[de];if(le===e||le.children.length>0)continue;const ye=z(le);if(F(ye))return ye}return null},N=(W,oe)=>{const ie=oe.toLowerCase();let de=0;for(let le=0;le<he.length;le++)Q(he[le])===W&&ne(he[le]).indexOf(ie)!==-1&&de++;return de};let J=e.parentElement,we=0;for(;J&&we<12&&y.length<4;){we++;const W=(J.tagName||"").toLowerCase();if(W==="body"||W==="html")break;const oe=J.getAttribute("data-testid"),ie=J.getAttribute("id"),de=J.getAttribute("role"),le=J.getAttribute("aria-label"),ye=de||(k.includes(W)?c[W]:null)||null,Te=re(J);if(oe||ie||ye||le||Te){let R=-1;if(ce){const xe=J.querySelectorAll(s);if(xe.length<=2e3){R=0;for(let Be=0;Be<xe.length;Be++){const Ke=xe[Be];Q(Ke)===m&&(M!=null&&X(Ke)!==M||R++)}}}const b=ge(J,2e3);let ae=null;try{ye&&Z&&(ae=te(J))}catch{ae=null}y.push({tag:W,depth:we,testId:oe||null,id:ie||null,role:de||null,ariaLabel:le||null,...R>=0?{scopedRoleCount:R}:{},...b>=0?{scopedTextCount:b}:{},...oe?{testIdCount:U(`[data-testid=${JSON.stringify(oe)}]`)}:{},...ie?{idCount:U(`#${D(ie)}`)}:{},...ye&&Z?{roleCount:g(ye)}:{},...ae?{filterText:ae,filterRoleCount:N(ye,ae)}:{},...Te?{dataAttr:Te,dataAttrCount:U(`[${Te.name}=${JSON.stringify(Te.value)}]`)}:{}})}J=J.parentElement}}}catch{}const C=!!(e.labels&&e.labels.length>0),w=f?C&&(e.labels[0].textContent||"").replace(/\s+/g," ").trim().slice(0,120)||null:void 0;return{tagName:e.tagName?.toLowerCase?.()??"unknown",attributes:i,textContent:(e.textContent||"").replace(/\s+/g," ").trim().slice(0,80),center:{x:Math.round(h.x+h.width/2),y:Math.round(h.y+h.height/2)},hasLabel:C,...f?{labelText:w}:{},selectorCounts:v,...l?{rolePosition:L,ancestors:y}:{}}}function wn(e){const r=globalThis,a=r.document;if(!a||!a.body){e.transport==="postMessage"?r.parent.postMessage({type:"pickerClosed"},"*"):r.__piwiPickState="skipped";return}const c=2147483600,n=a.createElement("div");n.id="__piwi_picker_highlight",n.style.cssText=`position:fixed;pointer-events:none;z-index:${c};display:none;box-sizing:border-box;border:2px solid #a855f7;background:rgba(168,85,247,.14);border-radius:4px;box-shadow:0 0 0 1px rgba(255,255,255,.9),0 0 0 3px rgba(59,7,100,.55),inset 0 0 0 1px rgba(255,255,255,.5);`;const s=a.createElement("div");s.id="__piwi_picker_banner",s.style.cssText=`position:fixed;top:12px;left:50%;transform:translateX(-50%);z-index:${c+2};background:#111827;color:#f9fafb;font:13px/1.5 system-ui,sans-serif;border:1px solid #312e81;padding:10px 16px;border-radius:10px;box-shadow:0 4px 24px rgba(0,0,0,.5);max-width:min(680px,86vw);`;const l=g=>{const z=J=>J.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),H=/('(?:\\.|[^'])*'|"(?:\\.|[^"])*")|([A-Za-z_$][\w$]*)(?=\s*\()|([A-Za-z_$][\w$]*)(?=\s*:)|(true|false|null|\d+)|([{}(),.])/g;let F="",te=0,N;for(;(N=H.exec(g))!==null;){N.index>te&&(F+=z(g.slice(te,N.index)));const J=N[1]?"#86efac":N[2]?"#d8b4fe":N[3]?"#93c5fd":N[4]?"#fcd34d":"#9ca3af";F+=`<span style="color:${J}">${z(N[0])}</span>`,te=H.lastIndex}return te<g.length&&(F+=z(g.slice(te))),F},f="ui-monospace,SFMono-Regular,Menlo,Consolas,monospace",i=g=>`<code style="font-family:${f}">${l(g)}</code>`,h=a.createElement("div");h.innerHTML=e.transport==="postMessage"?"Click an element to generate locators":e.failing?`Piwi locator picker — click the element that should replace ${i(e.failing)}`:"Piwi inspector — click any element to generate locators for it";const v=a.createElement("div");v.id="__piwi_picker_locator",v.style.cssText=`display:none;margin-top:7px;padding:5px 9px;border-radius:7px;background:#0b1120;border:1px solid #4c1d95;font:13.5px/1.55 ${f};word-break:break-word;overflow-wrap:anywhere;`;const L=a.createElement("div");L.id="__piwi_picker_foot",L.style.cssText="color:#9ca3af;margin-top:6px;font-size:12px;",L.textContent="↑ parent · ↓ child · Esc skip",s.appendChild(h),s.appendChild(v),s.appendChild(L);const y=a.createElement("div");y.id="__piwi_picker_label",y.style.cssText=`position:fixed;pointer-events:none;z-index:${c+1};display:none;box-sizing:border-box;max-width:min(620px,92vw);background:#0b1120;color:#f9fafb;border:1px solid #7c3aed;border-radius:7px;padding:4px 8px;font:12.5px/1.45 ${f};white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-shadow:0 4px 18px rgba(0,0,0,.5);`,a.body.appendChild(n),a.body.appendChild(y),a.body.appendChild(s);const C=g=>g.replace(/\\/g,"\\\\").replace(/'/g,"\\'"),w=g=>{const z=(g.tagName||"?").toLowerCase(),H=g.getAttribute&&g.getAttribute("data-testid");if(H)return`getByTestId('${C(H)}')`;if(g.labels&&g.labels.length>0){const W=(g.labels[0].textContent||"").replace(/\s+/g," ").trim().slice(0,80);if(W)return`getByLabel('${C(W)}')`}const F=g.getAttribute&&g.getAttribute("aria-label");if(F)return`getByLabel('${C(F)}')`;const te=g.getAttribute&&g.getAttribute("placeholder");if(te)return`getByPlaceholder('${C(te)}')`;const N=g.getAttribute&&g.getAttribute("alt");if(N)return`getByAltText('${C(N)}')`;const J=g.getAttribute&&g.getAttribute("title");if(J)return`getByTitle('${C(J)}')`;if(g.id)return`locator('#${C(g.id)}')`;const we=(g.getAttribute&&g.getAttribute("class")||"").split(/\s+/).find(W=>W.length>1);return we?`locator('.${C(we)}')`:z},S=g=>{const z=[];let H=g;for(;H&&z.length<15;){const F=(H.tagName||"").toLowerCase();if(F==="body"||F==="html")break;z.push(H),H=H.parentElement}return z.length?z:[g]},D=["button","a","input","select","textarea","summary","option"],U=g=>{for(let z=0;z<Math.min(g.length,4);z++){const H=g[z],F=(H.tagName||"").toLowerCase();if(D.includes(F)||H.getAttribute&&(H.getAttribute("role")||H.getAttribute("data-testid")))return z}return 0},V=g=>{const z=r.__piwiDescribeElement;if(typeof z=="function")try{const H=z(g);if(typeof H=="string"&&H)return H}catch{}return w(g)};let B=[],Q=0,X=null,m=null;const M=g=>{y.style.display="block";const z=y.getBoundingClientRect(),H=r.innerWidth||a.documentElement.clientWidth||0,F=r.innerHeight||a.documentElement.clientHeight||0;let te=g.top-z.height-6;te<4&&(te=g.bottom+6),te+z.height>F-4&&(te=Math.max(4,F-z.height-4));let N=g.left;N+z.width>H-6&&(N=H-z.width-6),N<6&&(N=6),y.style.left=N+"px",y.style.top=te+"px"},x=()=>B[Q]??null,K=()=>{const g=x();if(!g){n.style.display="none",y.style.display="none";return}const z=g.getBoundingClientRect();if(n.style.display="block",n.style.left=z.left+"px",n.style.top=z.top+"px",n.style.width=z.width+"px",n.style.height=z.height+"px",g!==m){m=g;const H=(g.tagName||"?").toLowerCase(),F=l(V(g));y.innerHTML=`<span style="color:#c4b5fd"><${H}></span> ${F}`,v.innerHTML=F,v.style.display="block"}M(z),L.textContent="click to pick · ↑ parent · ↓ child · Esc skip"},P=g=>{g.preventDefault(),g.stopImmediatePropagation()},j=g=>g===s||g===n||g===y||s.contains&&s.contains(g)||!!(g&&g.__piwiHint);let ne="top";const me=g=>{ne!==g&&(ne=g,g==="bottom"?(s.style.top="auto",s.style.bottom="12px"):(s.style.top="12px",s.style.bottom="auto"))},ge=g=>{const z=g.target;if(!z||j(z)){n.style.display="none",y.style.display="none";return}z!==X&&(X=z,B=S(z),Q=U(B)),K();const H=x();if(H){const F=H.getBoundingClientRect(),te=s.getBoundingClientRect(),N=8;F.left<te.right+N&&F.right>te.left-N&&F.top<te.bottom+N&&F.bottom>te.top-N&&me(ne==="top"?"bottom":"top")}},he=["mousedown","mouseup","pointerdown","pointerup","auxclick","dblclick"],Z=()=>{a.removeEventListener("mousemove",ge,!0),a.removeEventListener("click",G,!0),a.removeEventListener("keydown",se,!0),e.transport==="postMessage"&&r.removeEventListener("message",re,!1)},ce=()=>{for(const g of he)a.removeEventListener(g,P,!0)},k=()=>{n.remove(),y.remove(),s.remove()},d=g=>{if(Z(),n.style.display="none",y.style.display="none",e.transport==="postMessage"){const z=r.__piwiProbe,H=typeof z=="function"?z(g,e.probeArg):null;r.__piwiSnapshotExtras?.onPick?.(),a.addEventListener("click",P,!0),a.addEventListener("keydown",P,!0),L.textContent="Analyzing element…",r.parent.postMessage({type:"elementPicked",attrs:H},"*")}else ce(),r.__piwiPickedElement=g,r.__piwiPickState="picked",L.textContent="Analyzing element…"},O=()=>{Z(),e.transport==="postMessage"?(a.removeEventListener("click",P,!0),a.removeEventListener("keydown",P,!0),ce(),r.__piwiSnapshotExtras?.onClose?.(),k(),r.parent.postMessage({type:"pickerClosed"},"*")):(ce(),r.__piwiPickState="skipped",k())},G=g=>{P(g);const z=x();!z||j(g.target)||d(z)},se=g=>{if(g.key==="Escape"){P(g),O();return}(g.key==="ArrowUp"||g.key==="ArrowDown")&&(P(g),g.key==="ArrowUp"?Q=Math.min(Q+1,B.length-1):Q=Math.max(Q-1,0),K())},re=g=>{const z=g.data;!z||typeof z.type!="string"||z.type!=="piwiPickerKey"||typeof z.key!="string"||se({key:z.key,preventDefault(){},stopImmediatePropagation(){}})};r.__piwiPickCleanup=k,a.addEventListener("mousemove",ge,!0),a.addEventListener("click",G,!0),a.addEventListener("keydown",se,!0);for(const g of he)a.addEventListener(g,P,!0);e.transport==="postMessage"&&(r.addEventListener("message",re,!1),r.parent.postMessage({type:"pickerReady"},"*"))}function Cn(){var e=document,r=window,a=2147483600,c=[];function n(){for(var m=0;m<c.length;m++)c[m].parentNode&&c[m].parentNode.removeChild(c[m]);c=[]}function s(m){return(m||"").replace(/\s+/g," ").trim().toLowerCase()}function l(m){var M=s(m);if(M.length<2)return[];for(var x=e.querySelectorAll("button,a,[role],h1,h2,h3,h4,h5,h6,label,summary,input,textarea,select,option,span,li,td,th,p"),K=[],P=[],j=0;j<x.length;j++){var ne=x[j],me=s(ne.textContent);if(!me){var ge=s(ne.getAttribute&&(ne.getAttribute("placeholder")||ne.getAttribute("aria-label"))||"");ge&&(ge===M||ge.indexOf(M)!==-1)&&K.push(ne);continue}me.length>120||(me===M?K.push(ne):me.indexOf(M)!==-1&&me.length<M.length+30&&P.push(ne))}return K.concat(P)}function f(m,M){var x=m.getBoundingClientRect();if(x.width===0&&x.height===0)return null;var K=e.createElement("div");return K.__piwiHint=!0,K.style.cssText="position:fixed;pointer-events:none;z-index:"+(a+1)+";box-sizing:border-box;border-radius:3px;transition:opacity .3s;border:2px solid "+M+";box-shadow:0 0 0 3px "+M+"55;left:"+x.left+"px;top:"+x.top+"px;width:"+x.width+"px;height:"+x.height+"px;",e.body.appendChild(K),c.push(K),K}function i(m){var M=m.getBoundingClientRect();r.parent.postMessage({type:"piwiScrollTo",y:M.top},"*")}function h(m){if(n(),!(!m||!m.length)){for(var M=null,x=0;x<m.length;x++)for(var K=m[x],P=l(K&&K.text),j=0;j<Math.min(P.length,3);j++)f(P[j],"#f59e0b"),M||(M=P[j]);M&&i(M),setTimeout(function(){for(var ne=0;ne<c.length;ne++)c[ne].style.opacity="0"},2600),setTimeout(n,3e3)}}var v=[],L=0;function y(){r.parent.postMessage({type:"piwiSearchResult",count:v.length,index:v.length?L:-1},"*")}function C(){n();var m=v[L];m&&(f(m,"#7c3aed"),i(m),y())}function w(m){if(v=l(m),L=0,!v.length){n(),y();return}C()}function S(){v.length&&(L=(L+1)%v.length,C())}function D(m){var M=m.data;if(!(!M||typeof M.type!="string")){if(M.type==="piwiHighlight")try{h(M.hints)}catch{}else if(M.type==="piwiSearch")try{w(M.q)}catch{}else if(M.type==="piwiSearchNext")try{S()}catch{}else if(M.type==="piwiClearHints")try{n()}catch{}}}r.addEventListener("message",D,!1);function U(m){m.preventDefault(),m.stopImmediatePropagation()}for(var V=["mousedown","mouseup","pointerdown","pointerup","auxclick","dblclick","contextmenu","submit","beforeinput","input","change","paste","cut","drop","dragstart","keypress","keyup","touchstart","touchend"],B=0;B<V.length;B++)e.addEventListener(V[B],U,!0);r.__piwiSnapshotExtras={onPick:function(){n()},onClose:function(){n(),r.removeEventListener("message",D,!1);for(var m=0;m<V.length;m++)e.removeEventListener(V[m],U,!0)}};function Q(){var m=Math.max(e.documentElement?e.documentElement.scrollHeight:0,e.body?e.body.scrollHeight:0);m>0&&r.parent.postMessage({type:"piwiContentHeight",height:m},"*")}Q();try{if(r.ResizeObserver){var X=new r.ResizeObserver(Q);e.documentElement&&X.observe(e.documentElement),e.body&&X.observe(e.body)}}catch{}}function Tn(e){const r=[],a=new Set,c=s=>{if(typeof s!="string")return;const l=s.trim();if(l.length<2||l.length>80)return;const f=l.toLowerCase();a.has(f)||(a.add(f),r.push({text:l}))},n=s=>s&&(s.name??s.text??s.label??s.placeholder??s.alt??s.title);c(n(e.failingLocator?.args));for(const s of e.fromElementMatch??[])c(n(s.args));for(const s of e.fromAriaSnapshot??[])c(n(s.args));return r.slice(0,6)}const qe=e=>e.replace(/<\/(script)/gi,"<\\/$1");function Sn(e){const a={transport:"postMessage",probeArg:{keep:e.probedAttrs,includeStructural:!1,includeLabelText:!0}},c=qe(String($n)),n=qe(String(Cn)),s=qe(String(wn));return`<script>globalThis.__piwiProbe = (${c});(${n})();(${s})(${JSON.stringify(a)});<\/script>`}function An(e){return e.replace(/<base\b[^>]*>/gi,"")}function Ln(e,r){return An(e)+Sn(r)}const Rn={key:0,class:"flex items-center justify-center py-20"},In={key:1,class:"py-8 text-center"},zn={class:"text-xs text-gray-400 mt-1"},Pn={key:2,class:"py-8 text-center"},Bn={class:"mb-2 flex items-center gap-2 flex-wrap"},En={key:1,class:"ml-auto inline-flex rounded-md border border-default overflow-hidden text-xs"},On={key:0,class:"flex items-center gap-1 mb-1.5 text-xs text-gray-500"},Mn={class:"tabular-nums w-11 text-center select-none"},Nn={class:"ml-auto text-gray-400 tabular-nums"},Un={key:1,class:"flex items-center gap-2 mb-1.5"},jn={key:0,class:"text-xs text-gray-500 tabular-nums"},Dn={key:1,class:"text-xs text-gray-400"},Kn={key:0,class:"absolute inset-0 flex items-center justify-center bg-white dark:bg-gray-900 z-10"},Vn=["src"],Hn={key:2,class:"mt-4 space-y-3"},Fn={class:"flex items-center gap-3 bg-elevated rounded-lg p-3"},qn={class:"flex-1 min-w-0"},Zn={class:"text-sm font-medium"},Wn={class:"text-xs"},Jn={key:0,class:"text-xs text-gray-400 ml-1"},Yn={key:0,class:"text-xs text-gray-500 mt-0.5 truncate"},Gn={class:"space-y-1",role:"radiogroup","aria-label":"Alternative locators"},Qn={class:"flex-1 min-w-0"},Xn={class:"text-xs font-medium text-primary"},eo={class:"flex justify-between w-full"},to={key:1},no={class:"flex gap-2"},oo=ue({__name:"SnapshotLocatorPicker",props:We({runId:{},testRunsCaseId:{},failingLocator:{},healing:{}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:We(["close","confirmed"],["update:open"]),setup(e,{emit:r}){const a=e,c=r,n=at(e,"open"),s=Y(!1),l=Y(null),f=Y(null),i=Y(void 0);async function h(){s.value=!0,f.value=null;try{const R=new URLSearchParams({inlineStyles:"1"});i.value&&R.set("source",i.value);const b=`?${R.toString()}`;l.value=await $fetch(`/api/test-runs/${a.runId}/cases/${a.testRunsCaseId}/dom-snapshot${b}`),l.value?.source&&(i.value=l.value.source)}catch(R){f.value=R instanceof Error?R.message:"Unknown error"}finally{s.value=!1}}const v=I(()=>l.value?.availableSources??[]);function L(R){R===i.value||s.value||(i.value=R,w.value=!1,y.value="pick-element",X.value=0,M.value=!1,S.value=null,D.value=[],F.value=null,O.value="",G.value=0,se.value=-1,h())}Ee(n,R=>{R&&(l.value=null,w.value=!1,y.value="pick-element",X.value=0,M.value=!1,i.value=void 0,S.value=null,D.value=[],F.value=null,O.value="",G.value=0,se.value=-1,h())});const y=Y("pick-element"),C=Y(null),w=Y(!1),S=Y(null),D=Y([]),U=Y(void 0);function V(R){return URL.createObjectURL(new Blob([Ln(R,{probedAttrs:hn})],{type:"text/html"}))}Ee(()=>l.value?.html,R=>{U.value&&(URL.revokeObjectURL(U.value),U.value=void 0),R&&(U.value=V(R))},{immediate:!0});const B=Y(null),Q=Y(0),X=Y(0),m=Y(1),M=Y(!1),x=I(()=>l.value?.viewport??null),K=I(()=>{const R=x.value;return!R?.width||!Q.value?1:Math.min(Q.value/R.width,1)}),P=I(()=>{const R=x.value;if(!R)return{width:"100%",height:X.value?`${X.value}px`:"100%"};const b=X.value||R.height;return{width:`${Math.round(R.width*m.value)}px`,height:`${Math.round(b*m.value)}px`}}),j=I(()=>{const R=x.value;if(!R)return{width:"100%",height:X.value?`${X.value}px`:"100%",border:"0"};const b=X.value||R.height;return{width:`${R.width}px`,height:`${b}px`,transform:`scale(${m.value})`,transformOrigin:"top left",border:"0"}}),ne=I(()=>Math.round(m.value*100)),me=R=>Math.min(4,Math.max(.1,R));function ge(R){M.value=!0,m.value=me(m.value*R)}function he(){M.value=!1,m.value=K.value}Ee([K,x],()=>{M.value||(m.value=K.value)});let Z=null;Ee(B,R=>{Z?.disconnect(),R&&(Q.value=R.clientWidth,Z=new ResizeObserver(b=>{for(const ae of b)Q.value=ae.contentRect.width}),Z.observe(R))}),Ae(()=>{Z?.disconnect()}),Ae(()=>{U.value&&URL.revokeObjectURL(U.value)});function ce(R){if(!C.value||R.source!==C.value.contentWindow)return;const b=R.data;if(b?.type==="pickerReady"){w.value=!0,d();return}if(b?.type==="piwiContentHeight"&&typeof b.height=="number"){X.value=Math.max(b.height,x.value?.height??0);return}if(b?.type==="piwiScrollTo"&&typeof b.y=="number"){const ae=B.value;ae&&ae.scrollTo({top:Math.max(0,b.y*m.value-80),behavior:"smooth"});return}if(b?.type==="piwiSearchResult"){G.value=typeof b.count=="number"?b.count:0,se.value=typeof b.index=="number"?b.index:-1;return}if(b?.type==="elementPicked"&&b.attrs){const{labelText:ae,...xe}=b.attrs;S.value={...xe,accessibleName:ae??_n(xe)},D.value=kn(S.value),F.value=null,y.value="review"}b?.type==="pickerClosed"&&oe()}function k(R){C.value?.contentWindow?.postMessage(R,"*")}function d(){const R=Tn({failingLocator:a.failingLocator,fromElementMatch:a.healing?.fromElementMatch??null,fromAriaSnapshot:a.healing?.fromAriaSnapshot??null});R.length&&k({type:"piwiHighlight",hints:R})}const O=Y(""),G=Y(0),se=Y(-1);let re=null;Ee(O,R=>{re&&clearTimeout(re),re=setTimeout(()=>k({type:"piwiSearch",q:R}),180)});function g(){k({type:"piwiSearchNext"})}Ae(()=>{re&&clearTimeout(re)});function z(R){if(!n.value||y.value!=="pick-element"||!w.value||R.key!=="ArrowUp"&&R.key!=="ArrowDown")return;const b=(document.activeElement?.tagName??"").toLowerCase();if(b==="input"||b==="textarea")return;const ae=C.value?.contentWindow;ae&&(R.preventDefault(),ae.postMessage({type:"piwiPickerKey",key:R.key},"*"))}function H(){C.value&&(C.value.src="about:blank")}rt(()=>{window.addEventListener("message",ce),window.addEventListener("keydown",z,!0)}),Ae(()=>{window.removeEventListener("message",ce),window.removeEventListener("keydown",z,!0)});const F=Y(null),te=Y(!1);function N(R){F.value=R}const J=I(()=>pt(a.failingLocator.method,D.value)),we=Je();async function W(){if(F.value){te.value=!0;try{(await $fetch(`/api/test-runs/${a.runId}/cases/${a.testRunsCaseId}/locator-pick`,{method:"POST",body:{failingLocator:a.failingLocator,pickedLocator:F.value,element:S.value}})).status==="ok"?c("confirmed",F.value):we.add({title:"Pick not saved",description:"This failure has no call-site or locator signature to attach the pick to.",color:"warning",icon:"i-lucide-alert-triangle"}),n.value=!1}catch(R){we.add({title:"Could not save the pick",description:lt(R),color:"error",icon:"i-lucide-alert-triangle"})}finally{te.value=!1}}}function oe(){H(),n.value=!1}function ie(){S.value=null,D.value=[],F.value=null,y.value="pick-element",w.value=!1,O.value="",G.value=0,se.value=-1;const R=l.value?.html;R&&(U.value&&URL.revokeObjectURL(U.value),U.value=V(R))}const{copy:de}=He(),le=Y(null);let ye=null;function Te(R,b){de(R,{toast:"Locator copied"}),le.value=b,ye&&clearTimeout(ye),ye=setTimeout(()=>{le.value=null},2e3)}return Ae(()=>{ye&&clearTimeout(ye)}),(R,b)=>{const ae=$e,xe=Ie,Be=_t,Ke=Pe,gt=Qe,ht=Mt;return o(),q(ht,{open:n.value,"onUpdate:open":b[8]||(b[8]=be=>n.value=be),ui:{content:"max-w-6xl w-[95vw]"},onAfterLeave:oe},{header:A(()=>[...b[9]||(b[9]=[p("div",null,[p("h3",{class:"text-lg font-medium"},"Pick a locator from the DOM snapshot"),p("p",{class:"text-sm text-gray-500 mt-0.5"}," Click the element the failing locator should target. Use ↑↓ to walk the DOM tree. ")],-1)])]),body:A(()=>[t(s)?(o(),u("div",Rn,[_(ae,{name:"i-lucide-loader",class:"size-6 animate-spin text-gray-400"}),b[10]||(b[10]=p("span",{class:"ml-2 text-sm text-gray-500"},"Loading DOM snapshot...",-1))])):t(f)?(o(),u("div",In,[_(ae,{name:"i-lucide-alert-triangle",class:"size-8 text-red-300 mx-auto mb-2"}),b[12]||(b[12]=p("p",{class:"text-sm text-red-500"},"Failed to load snapshot",-1)),p("p",zn,$(t(f)),1),_(xe,{size:"xs",variant:"outline",color:"neutral",class:"mt-3",onClick:h},{default:A(()=>[...b[11]||(b[11]=[E("Retry",-1)])]),_:1})])):t(l)?.status!=="ok"||!t(l).html?(o(),u("div",Pn,[_(ae,{name:"i-lucide-file-x",class:"size-8 text-gray-300 mx-auto mb-2"}),b[13]||(b[13]=p("p",{class:"text-sm text-gray-500"},"No DOM snapshot or ARIA data available for this execution",-1)),b[14]||(b[14]=p("p",{class:"text-xs text-gray-400 mt-1"},"This test run has no stored trace or ARIA snapshot to pick from.",-1))])):(o(),u(ee,{key:3},[p("div",Bn,[t(l).source?(o(),u("div",{key:0,class:pe(["text-xs flex items-center gap-1",t(l).source==="aria"?"text-amber-600 dark:text-amber-400":"text-green-600 dark:text-green-400"])},[_(ae,{name:t(l).source==="aria"?"i-lucide-accessibility":"i-lucide-check",class:"size-3.5 shrink-0"},null,8,["name"]),t(l).source==="aria"?(o(),u(ee,{key:0},[E(" Accessibility tree from the failure-time ARIA snapshot — element styles are approximate ")],64)):(o(),u(ee,{key:1},[E(" Rendered from the failure-time DOM snapshot ")],64))],2)):T("",!0),t(v).length>1?(o(),u("div",En,[p("button",{type:"button",class:pe(["px-2 py-1 flex items-center gap-1 transition-colors",t(i)==="dom"?"bg-primary/10 text-primary font-medium":"text-gray-500 hover:bg-elevated"]),title:"Rendered page from the trace",onClick:b[0]||(b[0]=be=>L("dom"))},[_(ae,{name:"i-lucide-layout-panel-top",class:"size-3.5"}),b[15]||(b[15]=E(" DOM ",-1))],2),p("button",{type:"button",class:pe(["px-2 py-1 flex items-center gap-1 border-l border-default transition-colors",t(i)==="aria"?"bg-primary/10 text-primary font-medium":"text-gray-500 hover:bg-elevated"]),title:"Accessibility tree from the ARIA snapshot",onClick:b[1]||(b[1]=be=>L("aria"))},[_(ae,{name:"i-lucide-accessibility",class:"size-3.5"}),b[16]||(b[16]=E(" Tree ",-1))],2)])):T("",!0)]),t(x)?(o(),u("div",On,[_(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-zoom-out",title:"Zoom out",onClick:b[2]||(b[2]=be=>ge(1/1.25))}),p("span",Mn,$(t(ne))+"%",1),_(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-zoom-in",title:"Zoom in",onClick:b[3]||(b[3]=be=>ge(1.25))}),_(xe,{size:"xs",variant:"outline",color:"neutral",class:"ml-1",onClick:he},{default:A(()=>[...b[17]||(b[17]=[E("Fit",-1)])]),_:1}),p("span",Nn,$(t(x).width)+"×"+$(t(x).height),1)])):T("",!0),t(y)==="pick-element"?(o(),u("div",Un,[_(Be,{modelValue:t(O),"onUpdate:modelValue":b[4]||(b[4]=be=>Le(O)?O.value=be:null),size:"xs",icon:"i-lucide-search",placeholder:"Find an element by its text…",class:"max-w-xs",onKeydown:ke(_e(g,["prevent"]),["enter"])},null,8,["modelValue","onKeydown"]),t(O)&&t(G)>0?(o(),u("span",jn,$(t(se)+1)+"/"+$(t(G)),1)):t(O)?(o(),u("span",Dn,"no matches")):T("",!0),t(G)>1?(o(),q(xe,{key:2,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-chevron-down",title:"Next match (Enter)",onClick:g})):T("",!0)])):T("",!0),p("div",{ref_key:"stageRef",ref:B,class:pe(["relative border border-default rounded-lg overflow-auto",[t(y)==="pick-element"?"h-[75vh]":"h-80",t(x)?"bg-gray-100 dark:bg-gray-800":""]])},[t(w)?T("",!0):(o(),u("div",Kn,[_(ae,{name:"i-lucide-loader",class:"size-5 animate-spin text-gray-400"}),b[18]||(b[18]=p("span",{class:"ml-2 text-sm text-gray-500"},"Initializing picker...",-1))])),p("div",{style:et(t(P))},[p("iframe",{ref_key:"iframeRef",ref:C,src:t(U),style:et(t(j)),class:"bg-white",sandbox:"allow-scripts",title:"DOM snapshot"},null,12,Vn)],4)],2),t(y)==="review"&&t(S)?(o(),u("div",Hn,[p("div",Fn,[_(ae,{name:"i-lucide-crosshair",class:"size-5 text-primary shrink-0"}),p("div",qn,[p("p",Zn,[b[19]||(b[19]=E(" Picked: ",-1)),p("code",Wn,$(t(S).tagName),1),t(S).attributes.id?(o(),u("code",Jn,"#"+$(t(S).attributes.id),1)):T("",!0),t(S).attributes["data-testid"]?(o(),q(Ke,{key:1,size:"xs",color:"primary",variant:"subtle",class:"ml-1"},{default:A(()=>[E($(t(S).attributes["data-testid"]),1)]),_:1})):T("",!0)]),t(S).textContent?(o(),u("p",Yn,' "'+$(t(S).textContent)+'" ',1)):T("",!0)]),_(xe,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-rotate-ccw",title:"Pick a different element",onClick:ie})]),p("div",Gn,[(o(!0),u(ee,null,fe(t(D),(be,Fe)=>(o(),q(dt,{key:Fe,alt:be,copied:t(le)===`picked-${Fe}`,dense:!0,selectable:!0,selected:t(F)?.locator===be.locator,onCopy:yt=>Te(be.locator,`picked-${Fe}`),onSelect:yt=>N(be)},null,8,["alt","copied","selected","onCopy","onSelect"]))),128))]),t(J).recommended?(o(),u("div",{key:0,class:"rounded-lg border border-primary/40 bg-primary/5 p-3 flex items-center gap-3 cursor-pointer",role:"button",tabindex:"0",title:"Select this locator for Confirm",onClick:b[6]||(b[6]=be=>N(t(J).recommended)),onKeydown:b[7]||(b[7]=ke(_e(be=>N(t(J).recommended),["prevent"]),["enter"]))},[_(ae,{name:"i-lucide-star",class:"size-5 text-primary shrink-0"}),p("div",Qn,[p("p",Xn," Recommended (score: "+$(t(J).recommended.score)+") ",1),_(gt,{locator:t(J).recommended.locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"])]),_(xe,{size:"sm",color:"primary",variant:"solid","trailing-icon":t(le)==="rec"?"i-lucide-check":"i-lucide-copy",onClick:b[5]||(b[5]=_e(be=>Te(t(J).recommended.locator,"rec"),["stop"]))},{default:A(()=>[...b[20]||(b[20]=[E(" Copy ",-1)])]),_:1},8,["trailing-icon"])],32)):T("",!0)])):T("",!0)],64))]),footer:A(()=>[p("div",eo,[t(y)==="review"?(o(),q(xe,{key:0,size:"sm",variant:"outline",color:"neutral",icon:"i-lucide-rotate-ccw",onClick:ie},{default:A(()=>[...b[21]||(b[21]=[E(" Pick a different element ",-1)])]),_:1})):(o(),u("div",to)),p("div",no,[_(xe,{size:"sm",variant:"outline",color:"neutral",onClick:oe},{default:A(()=>[...b[22]||(b[22]=[E("Cancel",-1)])]),_:1}),t(y)==="review"?(o(),q(xe,{key:0,size:"sm",color:"primary",loading:t(te),disabled:!t(F),onClick:W},{default:A(()=>[...b[23]||(b[23]=[E(" Confirm pick ",-1)])]),_:1},8,["loading","disabled"])):T("",!0)])])]),_:1},8,["open"])}}}),so=Object.assign(oo,{__name:"SnapshotLocatorPicker"});function ao(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ro(e,r){let a=0,c=null;for(let n=r;n<e.length;n++){const s=e[n];if(c){if(s==="\\"){n++;continue}s===c&&(c=null);continue}if(s==="'"||s==='"'||s==="`"){c=s;continue}if(s==="(")a++;else if(s===")"&&(a--,a===0))return n}return-1}function io(e,r,a){if(!e||!r||!a)return null;const c=new RegExp(`${ao(r)}\\s*\\(`,"g");let n;for(;(n=c.exec(e))!==null;){const s=n.index,l=s>0?e[s-1]:"";if(l&&/[A-Za-z0-9_$]/.test(l))continue;const f=s+n[0].lastIndexOf("("),i=ro(e,f);if(i===-1)return null;const h=e.slice(0,s)+a+e.slice(i+1);return h===e?null:{old:e,new:h}}return null}function lo(e,r){return`${r?`@@ ${r} @@
|
|
2
|
-
`:""}-${e.old.trimEnd()}
|
|
3
|
-
+${e.new.trimEnd()}`}function co(e,r){const a=e??{},c=r??{},n=l=>l==null?null:typeof l=="string"?l:JSON.stringify(l),s=[];for(const l of new Set([...Object.keys(a),...Object.keys(c)])){const f=n(a[l]),i=n(c[l]);f!==i&&s.push({key:l,from:f,to:i})}return s}function uo(e){const a=[`In ${e.location??(e.sourceLine?`line ${e.sourceLine.line}`:"the failing test")}, the Playwright locator \`${e.failing}\` no longer matches its element.`,`Replace it with \`${e.recommended}\`.`];return e.sourceLine&&a.push("","Current line:",e.sourceLine.text.trim()),a.join(`
|
|
4
|
-
`)}const po={key:1},fo={class:"flex items-center gap-1"},mo={key:1,class:"rounded-lg border border-primary/50 bg-primary/10 p-3 mb-3 flex items-center gap-3"},go={class:"flex-1 min-w-0"},ho={class:"text-xs font-medium text-primary flex items-center gap-1.5"},yo={key:2,class:"flex items-center gap-2 bg-elevated rounded p-2 mb-3 border border-red-200 dark:border-red-800"},vo={class:"text-xs font-mono text-red-600 dark:text-red-400 flex-1 truncate"},xo={key:4,class:"rounded-lg border border-primary/40 bg-primary/5 p-3 mb-3 space-y-2"},bo={class:"flex items-center gap-2 min-w-0"},ko={key:0,class:"text-[11px] text-gray-500 truncate min-w-0"},_o={key:0,class:"rounded border border-default overflow-hidden bg-default"},$o={key:0,class:"text-xs flex flex-wrap items-center gap-x-1.5 gap-y-0.5"},wo={class:"font-mono text-gray-500"},Co={key:0,class:"font-mono text-red-500 line-through"},To={key:1,class:"text-gray-400"},So={key:2,class:"font-mono text-green-600 dark:text-green-400"},Ao={key:3,class:"text-gray-400"},Lo={key:2,class:"text-xs text-gray-500"},Ro={key:3,class:"text-xs text-primary/90 flex items-center gap-1"},Io={class:"flex items-center gap-2"},zo={key:5,class:"rounded-lg border border-default bg-elevated p-3 mb-3 flex items-center gap-3"},Po={class:"flex-1 min-w-0"},Bo={class:"text-xs font-medium text-success-600 dark:text-success-400"},Eo={class:"space-y-2"},Oo={key:6,class:"mt-3"},Mo={class:"space-y-2"},No={class:"flex items-center gap-1"},st=3,Uo=ue({__name:"LocatorHealingPanel",props:{runId:{},testRunsCaseId:{},storageKey:{},affectedCount:{}},setup(e){const r=e,a=I(()=>r.storageKey?De:je),c=I(()=>r.storageKey?{storageKey:r.storageKey}:{}),{data:n,pending:s,error:l}=Ue(()=>`/api/test-runs/${r.runId}/cases/${r.testRunsCaseId}/locator-healing`,{lazy:!0},"$Zgad3xb7ix"),f=I(()=>!!n.value&&n.value.source!=="none"&&!!(n.value.fromElementMatch?.length||n.value.fromPriorSuccess?.length||n.value.fromAriaSnapshot?.length)),i=I(()=>n.value?n.value.fromElementMatch??n.value.fromPriorSuccess??n.value.fromAriaSnapshot??[]:[]),h=I(()=>i.value.find(k=>k.pickedByUser)??null),v=I(()=>n.value?.recommendation?n.value.recommendation:n.value?.priorNameMayBeStale||!i.value.length?null:pt(n.value?.failingLocator?.method,i.value)),L=I(()=>n.value?.priorNameMayBeStale&&n.value.fromPriorSuccess?.length?n.value.fromAriaSnapshot??[]:[]),y=I(()=>{const k=v.value;return k?.recommended?k.recommended.pickedByUser?"Confirmed with the locator picker on the failing page":k.preservesConvention?"Keeps your original locator style — minimal, idiomatic edit":k.suggestAddTestId?"Most stable available, but still fragile":"Most stable available — a sturdier style than the original":""}),C=I(()=>{const k=n.value?.priorNameMayBeStale,d=(()=>{switch(n.value?.source){case"prior-run":return k?"Pre-captured from the last passing run — the element looks changed since":"Pre-captured from the last passing run — highest confidence";case"element-match":return"The element looks renamed or moved — these are fresh locators for its current identity on the failing page";case"fingerprint":return"Matched by locator signature (line numbers shifted)";case"cross-test":return"Captured by another test in this project that uses the same locator";case"aria-snapshot":return"Generated from the failure-time ARIA snapshot — limited, no HTML attributes";default:return""}})(),O=n.value?.capturedAt;return O?`${d} · captured ${Ye(O)}`:d}),w=I(()=>{if(n.value?.priorNameMayBeStale)return"text-warning-600 dark:text-warning-400";switch(n.value?.source){case"prior-run":case"fingerprint":case"cross-test":return"text-success-600 dark:text-success-400";case"element-match":return"text-primary-600 dark:text-primary-400";default:return"text-warning-600 dark:text-warning-400"}}),S=I(()=>{const k=n.value?.failingLocator;return k?`${k.method}(${JSON.stringify(k.args)})`:""}),D=ze(),{data:U}=Ue(()=>`/api/test-run-cases/${r.testRunsCaseId}/traces`,{lazy:!0},"$eLKRphd7VZ"),V=I(()=>{const k=U.value?.[0];if(!k)return null;const d=!!D.public.demoMode&&k.filePath.startsWith("demo/");return ct(k.filePath,D.app?.baseURL,d)}),B=Y(!1);async function Q(){await wt(`/api/test-runs/${r.runId}/cases/${r.testRunsCaseId}/locator-healing`)}const{copy:X}=He(),m=Y(null);let M=null;function x(k,d,O){X(k,{toast:O}),m.value=d,M&&clearTimeout(M),M=setTimeout(()=>{m.value=null},2e3)}function K(k,d){x(k,d,"Locator copied")}Ae(()=>{M&&clearTimeout(M)});const P=I(()=>v.value?.recommended??null),j=I(()=>r.affectedCount&&r.affectedCount>1&&P.value?`Same break affects ${r.affectedCount} tests in this cluster — one fix`:""),ne=I(()=>{if(P.value?.pickedByUser)return"your confirmed pick";switch(n.value?.source){case"prior-run":return"from the last passing run";case"fingerprint":return"from a prior run (line shifted)";case"cross-test":return"from another test in this project";case"element-match":return"from the current failing page";case"aria-snapshot":return"from the ARIA snapshot";default:return""}}),me=I(()=>{const k=n.value?.sourceLine,d=P.value;if(!k||!d)return null;const O=io(k.text,n.value?.failingLocator?.method,d.locator);return O?{edit:O,patch:lo(O,n.value?.location??null)}:null}),ge=I(()=>{if(me.value)return[];const k=n.value?.failingLocator,d=P.value;return!k||!d||d.method!==k.method?[]:co(k.args,d.args)});function he(){const k=P.value;!k||!n.value||x(uo({location:n.value.location??null,sourceLine:n.value.sourceLine??null,failing:S.value,recommended:k.locator}),"fix-prompt","Fix prompt copied")}const Z=Y(!1),ce=I(()=>Z.value?i.value:i.value.slice(0,st));return(k,d)=>{const O=Qe,G=Ie,se=$t,re=Ge,g=$e,z=Pe,H=cn,F=dt,te=It;return o(),u(ee,null,[!t(s)&&!t(l)&&t(f)?(o(),q(Se(t(a)),Ne({key:0},t(c),{icon:"i-lucide-bandage",title:"Alternative locators",count:t(i).length,help:"locator-healing"}),Re({subtitle:A(()=>[p("span",{class:pe(t(w))},$(t(C)),3)]),default:A(()=>[t(n)?.healedInRunId?(o(),q(re,{key:0,class:"mb-3",color:"success",icon:"i-lucide-circle-check",variant:"subtle",title:"Locator healed"},{description:A(()=>[d[11]||(d[11]=E(" The recommended locator now passes at this call site — ",-1)),_(se,{to:`/test-runs/${t(n).healedInRunId}`,class:"underline font-medium"},{default:A(()=>[E(" see run #"+$(t(n).healedInRunId),1)]),_:1},8,["to"]),d[12]||(d[12]=E(". ",-1))]),_:1})):T("",!0),t(h)?(o(),u("div",mo,[_(g,{name:"i-lucide-user-check",class:"size-5 text-primary shrink-0"}),p("div",go,[p("p",ho,[d[14]||(d[14]=E(" Your pick ",-1)),_(z,{size:"sm",color:"primary",variant:"subtle"},{default:A(()=>[...d[13]||(d[13]=[E("confirmed on the failing page",-1)])]),_:1})]),_(O,{locator:t(h).locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"])]),_(G,{size:"sm",color:"primary",variant:"solid","trailing-icon":t(m)==="user-pick"?"i-lucide-check":"i-lucide-copy",onClick:d[1]||(d[1]=N=>K(t(h).locator,"user-pick"))},{default:A(()=>[...d[15]||(d[15]=[E(" Copy ",-1)])]),_:1},8,["trailing-icon"])])):T("",!0),t(n)?.failingLocator?(o(),u("div",yo,[_(g,{name:"i-lucide-x-circle",class:"size-4 text-red-500 shrink-0"}),p("code",vo,$(t(S)),1),_(G,{size:"xs",variant:"ghost",color:"neutral",icon:t(m)==="failing"?"i-lucide-check":"i-lucide-copy",title:t(m)==="failing"?"Copied!":"Copy",onClick:d[2]||(d[2]=N=>K(t(S),"failing"))},null,8,["icon","title"])])):T("",!0),t(n)?.priorNameMayBeStale?(o(),q(re,{key:3,class:"mb-3",color:"warning",icon:"i-lucide-alert-triangle",variant:"subtle",title:"The element's name looks changed",description:"The captured accessible name no longer appears on the failing page, so name-based alternatives (and the failing locator itself) probably no longer match. Prefer the structural options, or the failing-page candidates below."})):T("",!0),t(P)?(o(),u("div",xo,[p("div",bo,[_(g,{name:"i-lucide-star",class:"size-4 text-primary shrink-0"}),d[16]||(d[16]=p("p",{class:"text-xs font-medium text-primary shrink-0"},"Recommended fix",-1)),t(ne)?(o(),u("span",ko," · "+$(t(ne)),1)):T("",!0),d[17]||(d[17]=p("span",{class:"flex-1"},null,-1)),_(z,{size:"xs",color:"primary",variant:"subtle",class:"font-mono tabular-nums shrink-0"},{default:A(()=>[E($(t(P).score),1)]),_:1})]),t(me)?(o(),u("div",_o,[_(H,{patch:t(me).patch},null,8,["patch"])])):(o(),u(ee,{key:1},[_(O,{locator:t(P).locator,truncate:"",class:"text-sm"},null,8,["locator"]),t(ge).length?(o(),u("p",$o,[(o(!0),u(ee,null,fe(t(ge),(N,J)=>(o(),u(ee,{key:J},[p("span",wo,$(N.key)+":",1),N.from?(o(),u("span",Co,$(N.from),1)):(o(),u("span",To,"—")),_(g,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),N.to?(o(),u("span",So,$(N.to),1)):(o(),u("span",Ao,"removed"))],64))),128))])):T("",!0)],64)),t(y)?(o(),u("p",Lo,$(t(y)),1)):T("",!0),t(j)?(o(),u("p",Ro,[_(g,{name:"i-lucide-layers",class:"size-3 shrink-0"}),E($(t(j)),1)])):T("",!0),p("div",Io,[_(G,{size:"xs",color:"primary",variant:"solid","trailing-icon":t(m)==="top"?"i-lucide-check":"i-lucide-copy",onClick:d[3]||(d[3]=N=>K(t(P).locator,"top"))},{default:A(()=>[...d[18]||(d[18]=[E(" Copy locator ",-1)])]),_:1},8,["trailing-icon"]),_(G,{size:"xs",color:"neutral",variant:"outline",icon:t(m)==="fix-prompt"?"i-lucide-check":"i-lucide-sparkles",title:"Copy an instruction an AI coding agent can apply directly to the test",onClick:he},{default:A(()=>[...d[19]||(d[19]=[E(" Copy fix prompt ",-1)])]),_:1},8,["icon"])])])):T("",!0),t(v)?.hasDurableAlternative&&t(v).durable?(o(),u("div",zo,[_(g,{name:"i-lucide-shield-check",class:"size-5 text-success shrink-0"}),p("div",Po,[p("p",Bo," Most stable option (score: "+$(t(v).durable.score)+") ",1),_(O,{locator:t(v).durable.locator,truncate:"",class:"text-sm mt-0.5"},null,8,["locator"]),d[20]||(d[20]=p("p",{class:"text-xs text-gray-500 mt-0.5"},"Sturdier, but changes the locator style",-1))]),_(G,{size:"sm",color:"neutral",variant:"outline","trailing-icon":t(m)==="durable"?"i-lucide-check":"i-lucide-copy",onClick:d[4]||(d[4]=N=>K(t(v).durable.locator,"durable"))},{default:A(()=>[...d[21]||(d[21]=[E(" Copy ",-1)])]),_:1},8,["trailing-icon"])])):T("",!0),p("div",Eo,[d[22]||(d[22]=p("p",{class:"text-xs font-medium text-gray-500"},"All alternatives",-1)),(o(!0),u(ee,null,fe(t(ce),(N,J)=>(o(),q(F,{key:J,alt:N,copied:t(m)===`alt-${J}`,onCopy:we=>K(N.locator,`alt-${J}`)},null,8,["alt","copied","onCopy"]))),128)),t(i).length>st?(o(),q(G,{key:0,size:"xs",variant:"ghost",color:"neutral",block:"",icon:t(Z)?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:d[5]||(d[5]=N=>Z.value=!t(Z))},{default:A(()=>[E($(t(Z)?"Show fewer":`Show all ${t(i).length} alternatives`),1)]),_:1},8,["icon"])):T("",!0)]),t(L).length?(o(),u("div",Oo,[d[23]||(d[23]=p("p",{class:"text-xs font-medium text-gray-500 mb-2"},"From the failing page",-1)),p("div",Mo,[(o(!0),u(ee,null,fe(t(L),(N,J)=>(o(),q(F,{key:J,alt:N,note:"candidate from the failure-time ARIA snapshot",copied:t(m)===`supp-${J}`,onCopy:we=>K(N.locator,`supp-${J}`)},null,8,["alt","copied","onCopy"]))),128))])])):T("",!0),t(v)?.suggestAddTestId?(o(),q(re,{key:7,class:"mt-3",color:"warning",icon:"i-lucide-info",variant:"subtle",title:"All alternatives are fragile",description:"Every captured locator scores below 50. Add a stable data-testid attribute to this element in the app for a durable fix."})):T("",!0),t(n)?.source==="aria-snapshot"?(o(),q(re,{key:8,class:"mt-3",color:"info",icon:"i-lucide-info",variant:"subtle"},{description:A(()=>[d[25]||(d[25]=E(" No HTML attributes were available. ",-1)),_(te,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:A(()=>[...d[24]||(d[24]=[E("Enable Piwi fixture capture",-1)])]),_:1}),d[26]||(d[26]=E(" for full alternatives including data-testid and CSS selectors. ",-1))]),_:1})):T("",!0)]),_:2},[e.storageKey?{name:"folded",fn:A(()=>[t(v)?.recommended?(o(),q(O,{key:0,locator:t(v).recommended.locator,class:"text-xs"},null,8,["locator"])):(o(),u("span",po,$(t(i).length)+" alternative"+$(t(i).length===1?"":"s"),1))]),key:"0"}:void 0,t(V)||t(n)?.failingLocator?{name:"actions",fn:A(()=>[p("div",fo,[t(n)?.failingLocator?(o(),q(G,{key:0,size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-mouse-pointer",title:"Open the failure-time DOM snapshot and click the element to pick a locator",onClick:d[0]||(d[0]=N=>B.value=!0)},{default:A(()=>[...d[9]||(d[9]=[E(" Pick from snapshot ",-1)])]),_:1})):T("",!0),t(V)?(o(),q(G,{key:1,to:t(V),target:"_blank",size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-crosshair",title:"Open the failure trace in the trace viewer — its Pick locator tool works on the recorded page snapshots"},{default:A(()=>[...d[10]||(d[10]=[E(" Pick from trace ",-1)])]),_:1},8,["to"])):T("",!0)])]),key:"1"}:void 0]),1040,["count"])):!t(s)&&!t(l)&&!t(f)?(o(),q(Se(t(a)),Ne({key:1},t(c),{icon:"i-lucide-bandage",title:"Alternative locators",subtitle:"No alternatives available",help:"locator-healing"}),Re({default:A(()=>[_(re,{color:"neutral",icon:"i-lucide-info",variant:"subtle"},{description:A(()=>[d[31]||(d[31]=E(" No pre-captured alternatives — this locator has never passed in a previous run. ",-1)),_(te,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:A(()=>[...d[30]||(d[30]=[E("Enable Piwi dashboard fixtures",-1)])]),_:1}),d[32]||(d[32]=E(" to capture element attributes at test time, or use “Pick from snapshot” above to choose a locator by hand on the failure-time page. ",-1))]),_:1})]),_:2},[e.storageKey?{name:"folded",fn:A(()=>[d[27]||(d[27]=p("span",null,"No alternatives available",-1))]),key:"0"}:void 0,t(V)||t(n)?.failingLocator?{name:"actions",fn:A(()=>[p("div",No,[t(n)?.failingLocator?(o(),q(G,{key:0,size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-mouse-pointer",title:"Open the failure-time DOM snapshot and click the element to pick a locator",onClick:d[6]||(d[6]=N=>B.value=!0)},{default:A(()=>[...d[28]||(d[28]=[E(" Pick from snapshot ",-1)])]),_:1})):T("",!0),t(V)?(o(),q(G,{key:1,to:t(V),target:"_blank",size:"xs",color:"neutral",variant:"outline",icon:"i-lucide-crosshair",title:"Open the failure trace in the trace viewer — its Pick locator tool works on the recorded page snapshots"},{default:A(()=>[...d[29]||(d[29]=[E(" Pick from trace ",-1)])]),_:1},8,["to"])):T("",!0)])]),key:"1"}:void 0]),1040)):T("",!0),t(n)?.failingLocator?(o(),q(so,{key:2,open:t(B),"onUpdate:open":d[7]||(d[7]=N=>Le(B)?B.value=N:null),"run-id":e.runId,"test-runs-case-id":e.testRunsCaseId,"failing-locator":t(n).failingLocator,healing:t(n),onConfirmed:Q,onClose:d[8]||(d[8]=N=>B.value=!1)},null,8,["open","run-id","test-runs-case-id","failing-locator","healing"])):T("",!0)],64)}}}),Ma=Object.assign(Uo,{__name:"LocatorHealingPanel"}),jo={key:1,class:"space-y-2"},Do={class:"text-xs font-medium text-gray-500 dark:text-gray-400 sm:w-40 shrink-0"},Ko={class:"flex flex-wrap items-center gap-1.5 min-w-0 text-xs font-mono"},Vo={class:"rounded bg-red-50 px-1.5 py-0.5 text-red-700 dark:bg-red-950/30 dark:text-red-400 break-all"},Ho={class:"rounded bg-green-50 px-1.5 py-0.5 text-green-700 dark:bg-green-950/30 dark:text-green-400 break-all"},Fo={key:0,class:"text-xs text-gray-400 dark:text-gray-500"},qo={key:0},Zo=ue({__name:"EnvironmentDiffCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:r}){const a=e,c=I(()=>a.storageKey?De:je),n=I(()=>a.storageKey?{storageKey:a.storageKey}:{}),{data:s,pending:l,error:f}=Ue(()=>`/api/test-runs/${a.runId}/cases/${a.testRunsCaseId}/environment-diff`,{lazy:!0},"$0pD8W6UYqF"),i=I(()=>s.value?.entries??[]),h=I(()=>i.value.filter(w=>!w.informational)),v=I(()=>i.value.filter(w=>w.informational)),L=I(()=>{const w=s.value?.baseline;if(!w)return"";const S=w.startTime?` · ${Ye(new Date(w.startTime))}`:"";return`vs last pass in run #${w.runId}${S}`}),y=I(()=>{if(s.value?.status!=="ok")return"No passing baseline to compare against";const w=h.value.length;return w===0?"Identical to last pass — no environment drift":`${w} change${w===1?"":"s"}: ${h.value.map(S=>S.label).join(", ")}`}),C=Y(null);return r({reveal:()=>C.value?.reveal?.()}),(w,S)=>{const D=Ge,U=$e;return!t(l)&&!t(f)&&t(s)?.status==="ok"?(o(),q(Se(t(c)),Ne({key:0,ref_key:"card",ref:C},t(n),{icon:"i-lucide-git-compare-arrows",title:"Environment diff",count:t(h).length||void 0,help:"environment-diff",subtitle:t(L)}),Re({default:A(()=>[t(i).length===0?(o(),q(D,{key:0,color:"success",icon:"i-lucide-check-circle",variant:"subtle",description:"The environment is identical to the last passing run — environment drift is unlikely to explain this failure."})):(o(),u("div",jo,[(o(!0),u(ee,null,fe(t(h),V=>(o(),u("div",{key:V.key,class:"rounded-lg border border-default p-3 flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3"},[p("span",Do,$(V.label),1),p("div",Ko,[p("code",Vo,$(V.failing??"(unset)"),1),_(U,{name:"i-lucide-arrow-left",class:"size-3 shrink-0 text-gray-400"}),p("code",Ho,$(V.baseline??"(unset)"),1)])]))),128)),t(v).length>0?(o(),u("p",Fo,[S[0]||(S[0]=E(" Also changed (varies naturally between runs): ",-1)),(o(!0),u(ee,null,fe(t(v),(V,B)=>(o(),u("span",{key:V.key},[E($(V.label.toLowerCase())+" "+$(V.baseline??"—")+" → "+$(V.failing??"—"),1),B<t(v).length-1?(o(),u("span",qo,", ")):T("",!0)]))),128))])):T("",!0)]))]),_:2},[e.storageKey?{name:"folded",fn:A(()=>[p("span",null,$(t(y)),1)]),key:"0"}:void 0]),1040,["count","subtitle"])):T("",!0)}}}),Na=Object.assign(Zo,{__name:"EnvironmentDiffCard"}),Wo={class:"absolute top-4 left-4 text-white/70 text-sm font-medium"},Jo=["src","alt"],Yo=ue({__name:"ScreenshotLightbox",props:{images:{},modelValue:{}},emits:["update:modelValue"],setup(e,{emit:r}){const a=e,c=r,n=I(()=>a.modelValue!==null);function s(){c("update:modelValue",null)}function l(){a.modelValue!==null&&a.modelValue>0&&c("update:modelValue",a.modelValue-1)}function f(){a.modelValue!==null&&a.modelValue<a.images.length-1&&c("update:modelValue",a.modelValue+1)}const i=I(()=>a.modelValue===null?null:a.images[a.modelValue]??null);function h(v){n.value&&(v.key==="Escape"&&s(),v.key==="ArrowLeft"&&l(),v.key==="ArrowRight"&&f())}return rt(()=>window.addEventListener("keydown",h)),Ct(()=>window.removeEventListener("keydown",h)),(v,L)=>{const y=$e;return o(),q(Tt,{to:"body"},[_(St,{name:"lightbox"},{default:A(()=>[n.value?(o(),u("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/90",onClick:_e(s,["self"])},[p("button",{class:"absolute top-4 right-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:s},[_(y,{name:"i-lucide-x",class:"size-6"})]),p("div",Wo,$((e.modelValue??0)+1)+" / "+$(e.images.length),1),e.images.length>1&&(e.modelValue??0)>0?(o(),u("button",{key:0,class:"absolute left-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:l},[_(y,{name:"i-lucide-chevron-left",class:"size-6"})])):T("",!0),i.value?(o(),u("img",{key:1,src:i.value.src,alt:i.value.name,class:"max-h-[90vh] max-w-[90vw] object-contain rounded-lg",onClick:L[0]||(L[0]=_e(()=>{},["stop"]))},null,8,Jo)):T("",!0),e.images.length>1&&(e.modelValue??0)<e.images.length-1?(o(),u("button",{key:2,class:"absolute right-4 size-10 flex items-center justify-center rounded-full bg-white/10 text-white hover:bg-white/20 transition-colors",onClick:f},[_(y,{name:"i-lucide-chevron-right",class:"size-6"})])):T("",!0)])):T("",!0)]),_:1})])}}}),mt=Object.assign(At(Yo,[["__scopeId","data-v-c02b1e9b"]]),{__name:"ScreenshotLightbox"}),Go={class:"flex justify-end mb-2"},Qo={key:1,class:"rounded overflow-hidden border border-default bg-gray-50 dark:bg-gray-900"},Xo=["src"],es={key:2,class:"grid grid-cols-1 sm:grid-cols-2 gap-2"},ts={class:"rounded overflow-hidden border border-red-200 dark:border-red-900 bg-gray-50 dark:bg-gray-900"},ns=["src"],os={class:"rounded overflow-hidden border border-green-200 dark:border-green-900 bg-gray-50 dark:bg-gray-900"},ss={class:"px-2 py-1 text-[10px] font-medium text-green-600 dark:text-green-400"},as=["src"],rs=ue({__name:"VisualDiffCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:r}){const a=e,c=I(()=>a.storageKey?De:je),n=I(()=>a.storageKey?{storageKey:a.storageKey}:{}),s=ze(),{data:l,pending:f,error:i}=Ue(()=>`/api/test-runs/${a.runId}/cases/${a.testRunsCaseId}/visual-diff`,{lazy:!0},"$QAhY8Q5pJg"),h=I(()=>l.value?.status==="ok"?l.value.diff??null:null),v=Y("overlay"),L=[{label:"Overlay",value:"overlay"},{label:"Side by side",value:"side-by-side"}],y=I(()=>h.value?Me(h.value.path,"image/png",s.app?.baseURL):""),C=I(()=>h.value?Me(h.value.failingPath,null,s.app?.baseURL):""),w=I(()=>h.value?Me(h.value.baselinePath,null,s.app?.baseURL):""),S=I(()=>h.value?(h.value.changedPixelRatio*100).toFixed(2):"0"),D=I(()=>{const X=h.value?.changedPixelRatio??0;return X>.1?"error":X>.01?"warning":"success"}),U=I(()=>h.value?h.value.dimensionMismatch?`${S.value}% changed — dimensions differ, unreliable`:`${S.value}% of pixels changed vs last pass`:"No comparable screenshots"),V=I(()=>h.value?[{src:C.value,name:"Failing screenshot"},{src:w.value,name:"Last passing screenshot"},{src:y.value,name:"Diff overlay"}]:[]),B=Y(null),Q=Y(null);return r({reveal:()=>Q.value?.reveal?.()}),(X,m)=>{const M=Pe,x=Ge,K=Nt,P=mt;return!t(f)&&!t(i)&&t(h)?(o(),q(Se(t(c)),Ne({key:0,ref_key:"card",ref:Q},t(n),{icon:"i-lucide-images",title:"Visual diff",help:"visual-diff"}),Re({subtitle:A(()=>[p("span",null,"vs last pass in run #"+$(t(h).baselineRunId),1)]),actions:A(()=>[_(M,{color:t(D),variant:"subtle",size:"sm",class:"font-mono tabular-nums"},{default:A(()=>[E($(t(S))+"% changed ",1)]),_:1},8,["color"])]),default:A(()=>[t(h).dimensionMismatch?(o(),q(x,{key:0,class:"mb-3",color:"warning",icon:"i-lucide-alert-triangle",variant:"subtle",title:"Screenshot dimensions differ",description:"The failing and passing screenshots have different sizes (viewport change?). They are compared on a padded canvas, so the changed-pixel ratio is inflated and unreliable."})):T("",!0),p("div",Go,[_(K,{modelValue:t(v),"onUpdate:modelValue":m[0]||(m[0]=j=>Le(v)?v.value=j:null),items:L,size:"xs",content:!1,ui:{list:"overflow-x-auto",trigger:"shrink-0"}},null,8,["modelValue"])]),t(v)==="overlay"?(o(),u("div",Qo,[p("img",{src:t(y),alt:"Diff overlay (red = changed pixels)",class:"w-full max-h-96 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open diff overlay in lightbox",onClick:m[1]||(m[1]=j=>B.value=2),onKeydown:[m[2]||(m[2]=ke(j=>B.value=2,["enter"])),m[3]||(m[3]=ke(_e(j=>B.value=2,["prevent"]),["space"]))]},null,40,Xo),m[11]||(m[11]=p("p",{class:"px-2 py-1 text-[10px] text-gray-500"},"Red pixels mark differences against the last passing run",-1))])):(o(),u("div",es,[p("div",ts,[m[12]||(m[12]=p("p",{class:"px-2 py-1 text-[10px] font-medium text-red-600 dark:text-red-400"},"Failing",-1)),p("img",{src:t(C),alt:"Failing screenshot",class:"w-full max-h-80 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open failing screenshot in lightbox",onClick:m[4]||(m[4]=j=>B.value=0),onKeydown:[m[5]||(m[5]=ke(j=>B.value=0,["enter"])),m[6]||(m[6]=ke(_e(j=>B.value=0,["prevent"]),["space"]))]},null,40,ns)]),p("div",os,[p("p",ss," Last pass (run #"+$(t(h).baselineRunId)+") ",1),p("img",{src:t(w),alt:"Last passing screenshot",class:"w-full max-h-80 object-contain cursor-zoom-in outline-none focus-visible:outline-2 focus-visible:outline-primary",loading:"lazy",role:"button",tabindex:"0","aria-label":"Open last passing screenshot in lightbox",onClick:m[7]||(m[7]=j=>B.value=1),onKeydown:[m[8]||(m[8]=ke(j=>B.value=1,["enter"])),m[9]||(m[9]=ke(_e(j=>B.value=1,["prevent"]),["space"]))]},null,40,as)])])),_(P,{modelValue:t(B),"onUpdate:modelValue":m[10]||(m[10]=j=>Le(B)?B.value=j:null),images:t(V)},null,8,["modelValue","images"])]),_:2},[e.storageKey?{name:"folded",fn:A(()=>[p("span",null,$(t(U)),1)]),key:"0"}:void 0]),1040)):T("",!0)}}}),Ua=Object.assign(rs,{__name:"VisualDiffCard"}),is={class:"max-h-96 overflow-y-auto"},ls={key:0,class:"mt-2 text-xs text-gray-400 dark:text-gray-500"},Ze=2e4,cs=ue({__name:"DomSnapshotCard",props:{runId:{},testRunsCaseId:{},storageKey:{}},setup(e,{expose:r}){const a=e,c=I(()=>a.storageKey?De:je),n=I(()=>a.storageKey?{storageKey:a.storageKey}:{}),{data:s,pending:l,error:f}=Ue(()=>`/api/test-runs/${a.runId}/cases/${a.testRunsCaseId}/dom-snapshot`,{lazy:!0},"$rAu-vOWv77"),i=I(()=>(s.value?.html??"").slice(0,Ze)),h=I(()=>(s.value?.html?.length??0)>Ze),v=I(()=>{const w=s.value;return!w||w.status!=="ok"?"":`${Math.round((w.html?.length??0)/1024)} KB · rendered from the uploaded trace${w.snapshotName?` (${w.snapshotName})`:""}`}),{copy:L,copied:y}=He(),C=Y(null);return r({reveal:()=>C.value?.reveal?.()}),(w,S)=>{const D=Ie,U=Ut,V=jt;return!t(l)&&!t(f)&&t(s)?.status==="ok"&&t(s).html?(o(),q(Se(t(c)),Ne({key:0,ref_key:"card",ref:C},t(n),{icon:"i-lucide-file-code",title:"DOM snapshot",help:"dom-snapshot",subtitle:t(v)}),Re({actions:A(()=>[_(U,{text:t(y)?"Copied!":"Copy full HTML"},{default:A(()=>[_(D,{size:"xs",variant:"ghost",color:"neutral",icon:t(y)?"i-lucide-check":"i-lucide-clipboard",onClick:S[0]||(S[0]=B=>t(L)(t(s).html))},null,8,["icon"])]),_:1},8,["text"])]),default:A(()=>[p("div",is,[_(V,{code:t(i),lang:"xml"},null,8,["code"])]),t(h)||t(s).truncated?(o(),u("p",ls,[t(h)?(o(),u(ee,{key:0},[E("Showing the first "+$(Math.round(Ze/1e3))+"k characters — use Copy for the full document.",1)],64)):(o(),u(ee,{key:1},[E("The snapshot was truncated to its size cap.")],64))])):T("",!0)]),_:2},[e.storageKey?{name:"folded",fn:A(()=>[p("span",null,"Failure-time HTML extracted from the trace — "+$(Math.round((t(s).html.length??0)/1024))+" KB",1)]),key:"0"}:void 0]),1040,["subtitle"])):T("",!0)}}}),ja=Object.assign(cs,{__name:"DomSnapshotCard"}),us={class:"rounded-md border border-default overflow-hidden"},ds={class:"text-xs font-semibold text-gray-600 dark:text-gray-300 flex-1"},ps={key:0,class:"text-gray-400 font-normal ml-1"},fs={key:0},ms=ue({__name:"TestEvidenceSection",props:We({icon:{},label:{},count:{},collapsible:{type:Boolean}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(e){const r=e,a=at(e,"open"),c=I(()=>r.collapsible===!1||a.value);return(n,s)=>{const l=$e;return o(),u("div",us,[(o(),q(Se(e.collapsible===!1?"div":"button"),{class:pe(["w-full flex items-center gap-1.5 px-3 py-2 bg-elevated border-b border-default text-left",e.collapsible!==!1&&"hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors cursor-pointer"]),onClick:s[0]||(s[0]=f=>e.collapsible!==!1&&(a.value=!a.value))},{default:A(()=>[_(l,{name:e.icon,class:"size-3.5 shrink-0 text-primary/70"},null,8,["name"]),p("span",ds,[E($(e.label),1),e.count!=null?(o(),u("span",ps,"("+$(e.count)+")",1)):T("",!0)]),e.collapsible!==!1?(o(),q(l,{key:0,name:a.value?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400"},null,8,["name"])):T("",!0)]),_:1},8,["class"])),t(c)?(o(),u("div",fs,[Oe(n.$slots,"default")])):T("",!0)])}}}),Xe=Object.assign(ms,{__name:"TestEvidenceSection"}),gs={class:"grid grid-cols-2 gap-2 p-2 bg-gray-50 dark:bg-gray-900"},hs=["aria-label","onClick","onKeydown"],ys=["src","alt"],vs={class:"absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-black/30"},xs={class:"absolute bottom-0 inset-x-0 px-1.5 py-0.5 text-[10px] text-white bg-black/50 truncate"},bs=ue({__name:"TestEvidenceScreenshots",props:{attachments:{}},setup(e){const r=e,a=ze();function c(l){return l.split("/").pop()||l}const n=I(()=>r.attachments.filter(l=>Kt(l.path,l.contentType)).map(l=>({src:Me(l.path,l.contentType,a.app?.baseURL),name:l.name||c(l.path)}))),s=Y(null);return(l,f)=>{const i=$e,h=mt,v=Xe;return t(n).length>0?(o(),q(v,{key:0,icon:"i-lucide-image",label:"Screenshots",count:t(n).length,collapsible:!1},{default:A(()=>[p("div",gs,[(o(!0),u(ee,null,fe(t(n),(L,y)=>(o(),u("div",{key:L.src,class:"relative group cursor-pointer rounded overflow-hidden border border-default outline-none focus-visible:outline-2 focus-visible:outline-primary",role:"button",tabindex:"0","aria-label":`View screenshot ${L.name}`,onClick:C=>s.value=y,onKeydown:[ke(C=>s.value=y,["enter"]),ke(_e(C=>s.value=y,["prevent"]),["space"])]},[p("img",{src:L.src,alt:L.name,class:"w-full h-28 object-cover object-top transition-opacity group-hover:opacity-80",loading:"lazy"},null,8,ys),p("div",vs,[_(i,{name:"i-lucide-zoom-in",class:"size-5 text-white"})]),p("p",xs,$(L.name),1)],40,hs))),128))]),_(h,{modelValue:t(s),"onUpdate:modelValue":f[0]||(f[0]=L=>Le(s)?s.value=L:null),images:t(n)},null,8,["modelValue","images"])]),_:1},8,["count"])):T("",!0)}}}),Da=Object.assign(bs,{__name:"TestEvidenceScreenshots"}),ks={class:"m-0"},_s={class:"bg-black rounded overflow-hidden"},$s=["src"],ws=["title"],Cs=ue({__name:"VideoPlayer",props:{src:{},label:{}},setup(e){return(r,a)=>(o(),u("figure",ks,[p("div",_s,[p("video",{src:e.src,controls:"",preload:"metadata",class:"w-full max-h-96"}," Your browser does not support the video tag. ",8,$s)]),e.label?(o(),u("figcaption",{key:0,class:"mt-1 text-xs text-gray-400 truncate",title:e.label},$(e.label),9,ws)):T("",!0)]))}}),Ts=Object.assign(Cs,{__name:"VideoPlayer"}),Ss={class:"space-y-2 p-2 bg-gray-50 dark:bg-gray-900"},As=ue({__name:"TestEvidenceVideos",props:{attachments:{}},setup(e){const r=e,a=ze();function c(s){return s.split("/").pop()||s}const n=I(()=>r.attachments.filter(s=>Vt(s.path,s.contentType)).map(s=>({src:Me(s.path,s.contentType,a.app?.baseURL),name:s.name||c(s.path)})));return(s,l)=>{const f=Ts,i=Xe;return t(n).length>0?(o(),q(i,{key:0,icon:"i-lucide-video",label:"Videos",count:t(n).length,collapsible:!1},{default:A(()=>[p("div",Ss,[(o(!0),u(ee,null,fe(t(n),h=>(o(),q(f,{key:h.src,src:h.src,label:h.name},null,8,["src","label"]))),128))])]),_:1},8,["count"])):T("",!0)}}}),Ka=Object.assign(As,{__name:"TestEvidenceVideos"}),Ls={class:"flex items-center justify-between gap-2"},Rs={class:"flex items-center gap-2 min-w-0"},Is={class:"text-sm truncate"},zs={key:0,class:"text-xs text-gray-400 shrink-0"},Ps={key:1,class:"text-xs text-gray-400 shrink-0"},Bs={class:"flex items-center gap-1.5 shrink-0"},Es=ue({__name:"TraceListItem",props:{trace:{},showTime:{type:Boolean,default:!0}},setup(e){const r=e,a=ze(),c=I(()=>(a.app?.baseURL??"/").replace(/\/$/,"")),n=I(()=>!!a.public.demoMode&&r.trace.filePath.startsWith("demo/")),s=I(()=>r.trace.filePath.split("/").pop()||r.trace.filePath),l=I(()=>ct(r.trace.filePath,a.app?.baseURL,n.value)),f=I(()=>n.value?`${c.value}/${r.trace.filePath}`:`${c.value}/api/files/${Ot(r.trace.filePath)}`);return(i,h)=>{const v=$e,L=Ie;return o(),u("div",Ls,[p("div",Rs,[_(v,{name:"i-lucide-file-archive",class:"size-4 text-gray-400 shrink-0"}),p("span",Is,$(t(s)),1),e.trace.size?(o(),u("span",zs,$(("formatBytes"in i?i.formatBytes:t(Ht))(e.trace.size)),1)):T("",!0),e.showTime?(o(),u("span",Ps,$(("formatRelativeTime"in i?i.formatRelativeTime:t(Ye))(e.trace.createdAt)),1)):T("",!0)]),p("div",Bs,[_(L,{to:t(l),target:"_blank",icon:"i-lucide-bug-play",size:"xs",label:"View trace"},null,8,["to"]),_(L,{to:t(f),target:"_blank",icon:"i-lucide-download",size:"xs",color:"neutral",variant:"soft",label:"Download"},null,8,["to"])])])}}}),Os=Object.assign(Es,{__name:"TraceListItem"}),Ms={key:0,class:"flex items-center justify-center py-4"},Ns={key:1,class:"divide-y divide-default"},Us=ue({__name:"TestEvidenceTraces",props:{traces:{},loading:{type:Boolean}},setup(e){return(r,a)=>{const c=$e,n=Os,s=Xe;return e.loading||e.traces.length>0?(o(),q(s,{key:0,icon:"i-lucide-bug-play",label:"Traces",count:e.traces.length||null,collapsible:!1},{default:A(()=>[e.loading&&!e.traces.length?(o(),u("div",Ms,[_(c,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):(o(),u("div",Ns,[(o(!0),u(ee,null,fe(e.traces,l=>(o(),q(n,{key:l.id,trace:l,class:"px-3 py-2"},null,8,["trace"]))),128))]))]),_:1},8,["count"])):T("",!0)}}}),Va=Object.assign(Us,{__name:"TestEvidenceTraces"}),js={class:"space-y-2"},Ds={key:0,class:"rounded-lg border border-default overflow-hidden"},Ks=["title"],Vs={key:2,class:"truncate text-gray-400 dark:text-gray-500"},Hs={class:"font-mono"},Fs={key:0,class:"overflow-x-auto text-xs font-mono leading-relaxed py-1"},qs={class:"min-w-max"},Zs={key:1,class:"rounded-lg border border-dashed border-default"},Ws=["onClick"],Js={key:0,class:"px-3 pb-2 space-y-1"},Ys=["title"],Gs={key:0,class:"truncate font-mono shrink-0"},Qs=ue({__name:"TraceCallStack",props:{frames:{},projectKey:{},projectName:{}},setup(e){const r=e,a=I(()=>{if(!r.frames.some(L=>L.inProject))return r.frames.map((L,y)=>({kind:"frame",frame:L,frameIndex:y}));const i=[];let h=[];const v=()=>{h.length!==0&&(i.push({kind:"group",frames:h,key:`group-${i.length}`}),h=[])};return r.frames.forEach((L,y)=>{L.inProject?(v(),i.push({kind:"frame",frame:L,frameIndex:y})):h.push(L)}),v(),i}),c=I(()=>{const f=r.frames.findIndex(i=>i.inProject);return f>=0?f:0}),n=Y(new Set);function s(f){const i=new Set(n.value);i.has(f)?i.delete(f):i.add(f),n.value=i}function l(f){return f.source?f.source.lines.map((i,h)=>{const v=f.source.startLine+h;return{lineNo:v,text:i,failing:v===f.line}}):[]}return(f,i)=>{const h=$e,v=ut,L=Pe;return o(),u("div",js,[(o(!0),u(ee,null,fe(t(a),y=>(o(),u(ee,{key:y.kind==="frame"?`f-${y.frameIndex}`:y.key},[y.kind==="frame"?(o(),u("div",Ds,[p("div",{class:pe(["flex items-center gap-2 px-3 py-1.5 bg-elevated/40 text-xs",y.frame.source?"border-b border-default":""])},[_(h,{name:y.frameIndex===t(c)?"i-lucide-circle-x":"i-lucide-corner-left-up",class:pe([y.frameIndex===t(c)?"text-red-500":"text-gray-400","size-3.5 shrink-0"])},null,8,["name","class"]),y.frame.inProject?(o(),q(v,{key:0,"file-path":y.frame.file,line:y.frame.line,column:y.frame.column,"project-key":e.projectKey,"project-name":e.projectName,class:"min-w-0"},null,8,["file-path","line","column","project-key","project-name"])):(o(),u("code",{key:1,class:"truncate text-gray-500 dark:text-gray-400",title:y.frame.absFile||y.frame.file},$(y.frame.file)+":"+$(y.frame.line),9,Ks)),y.frame.functionName?(o(),u("span",Vs,[i[0]||(i[0]=E(" in ",-1)),p("span",Hs,$(y.frame.functionName),1)])):T("",!0),_(L,{color:y.frameIndex===t(c)?"error":"neutral",variant:"subtle",size:"xs",class:"ml-auto shrink-0"},{default:A(()=>[E($(y.frameIndex===t(c)?"Failed here":"Caller"),1)]),_:2},1032,["color"])],2),y.frame.source?(o(),u("div",Fs,[p("div",qs,[(o(!0),u(ee,null,fe(l(y.frame),C=>(o(),u("div",{key:C.lineNo,class:pe(["px-3 whitespace-pre flex",C.failing?"bg-red-50 dark:bg-red-950/30 text-red-700 dark:text-red-300 font-medium":"text-gray-600 dark:text-gray-400"])},[p("span",{class:pe(["w-10 shrink-0 text-right pr-3 tabular-nums select-none",C.failing?"text-red-400 dark:text-red-500":"text-gray-300 dark:text-gray-600"])},$(C.lineNo),3),p("span",null,$(C.text),1)],2))),128))])])):T("",!0)])):(o(),u("div",Zs,[p("button",{type:"button",class:"w-full flex items-center gap-2 px-3 py-1.5 text-xs text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300",onClick:C=>s(y.key)},[_(h,{name:t(n).has(y.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 shrink-0"},null,8,["name"]),E(" "+$(y.frames.length)+" frame"+$(y.frames.length===1?"":"s")+" in dependencies ",1)],8,Ws),t(n).has(y.key)?(o(),u("div",Js,[(o(!0),u(ee,null,fe(y.frames,(C,w)=>(o(),u("div",{key:w,class:"flex items-center gap-2 text-xs text-gray-400 dark:text-gray-500 min-w-0"},[_(h,{name:"i-lucide-corner-left-up",class:"size-3 shrink-0"}),p("code",{class:"truncate",title:C.absFile||C.file},$(C.file)+":"+$(C.line),9,Ys),C.functionName?(o(),u("span",Gs,$(C.functionName),1)):T("",!0)]))),128))])):T("",!0)]))],64))),128))])}}}),Ha=Object.assign(Qs,{__name:"TraceCallStack"}),Xs={class:"space-y-2"},ea={class:"flex items-center gap-2 px-3 py-1.5 bg-elevated/40 border-b border-default text-xs"},ta={class:"overflow-x-auto text-xs font-mono leading-relaxed py-1"},na={class:"min-w-max"},oa=ue({__name:"TestSourceStack",props:{frames:{},projectKey:{},projectName:{}},setup(e){function r(a){return a.split(`
|
|
5
|
-
`).map(c=>({text:c,failing:c.startsWith(">")}))}return(a,c)=>{const n=$e,s=ut,l=Pe;return o(),u("div",Xs,[(o(!0),u(ee,null,fe(e.frames,(f,i)=>(o(),u("div",{key:`${f.file}:${f.line}:${i}`,class:"rounded-lg border border-default overflow-hidden"},[p("div",ea,[_(n,{name:i===0?"i-lucide-circle-x":"i-lucide-corner-left-up",class:pe([i===0?"text-red-500":"text-gray-400","size-3.5 shrink-0"])},null,8,["name","class"]),_(s,{"file-path":f.file,line:f.line,"project-key":e.projectKey,"project-name":e.projectName,class:"min-w-0"},null,8,["file-path","line","project-key","project-name"]),_(l,{color:i===0?"error":"neutral",variant:"subtle",size:"xs",class:"ml-auto shrink-0"},{default:A(()=>[E($(i===0?"Failed here":"Caller"),1)]),_:2},1032,["color"])]),p("div",ta,[p("div",na,[(o(!0),u(ee,null,fe(r(f.snippet),(h,v)=>(o(),u("div",{key:v,class:pe(["px-3 whitespace-pre",h.failing?"bg-red-50 dark:bg-red-950/30 text-red-700 dark:text-red-300 font-medium":"text-gray-600 dark:text-gray-400"])},$(h.text),3))),128))])])]))),128))])}}}),Fa=Object.assign(oa,{__name:"TestSourceStack"}),sa={class:"space-y-3 text-sm"},aa={key:0,class:"flex flex-col gap-0.5"},ra={class:"text-xs font-mono break-all"},ia={key:1,class:"flex flex-col gap-0.5"},la={class:"text-xs font-mono break-all"},ca={class:"grid grid-cols-1 gap-3 sm:grid-cols-2"},ua={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},da={key:0,class:"text-xs text-gray-400"},pa={key:1,class:"mt-1 space-y-0.5"},fa={class:"text-gray-400"},ma={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},ga={key:0,class:"text-xs text-gray-400"},ha={key:1,class:"mt-1 space-y-0.5"},ya={key:0,class:"text-gray-400"},va={class:"text-gray-400"},xa=ue({__name:"PageStateCard",props:{pageState:{},storageKey:{},plain:{type:Boolean}},setup(e){const r=e,a=I(()=>r.plain?"div":r.storageKey?De:je),c=I(()=>r.plain?{}:{icon:"i-lucide-database",title:"App state at test end",help:"page-state",...r.storageKey?{storageKey:r.storageKey}:{}}),n=l=>[l.httpOnly?"HttpOnly":null,l.secure?"Secure":null,l.sameSite??null].filter(Boolean).join(", "),s=I(()=>{const l=r.pageState;return[`${l.localStorage.length} localStorage`,`${l.sessionStorage.length} sessionStorage`,`${l.cookies.length} cookie${l.cookies.length===1?"":"s"}`].join(" · ")});return(l,f)=>(o(),q(Se(t(a)),Lt(Rt(t(c))),Re({default:A(()=>[p("div",sa,[e.pageState.url?(o(),u("div",aa,[f[0]||(f[0]=p("span",{class:"text-xs font-medium text-gray-500 dark:text-gray-400"},"URL",-1)),p("code",ra,$(e.pageState.url)+$(e.pageState.hash??""),1)])):T("",!0),e.pageState.historyState?(o(),u("div",ia,[f[1]||(f[1]=p("span",{class:"text-xs font-medium text-gray-500 dark:text-gray-400"},"History state",-1)),p("code",la,$(e.pageState.historyState),1)])):T("",!0),p("div",ca,[(o(!0),u(ee,null,fe({localStorage:e.pageState.localStorage,sessionStorage:e.pageState.sessionStorage},(i,h)=>(o(),u("div",{key:h},[p("span",ua,$(h)+" ("+$(i.length)+")",1),i.length===0?(o(),u("p",da,"empty")):(o(),u("ul",pa,[(o(!0),u(ee,null,fe(i,v=>(o(),u("li",{key:v.key,class:"text-xs font-mono truncate"},[E($(v.key)+" ",1),p("span",fa,"("+$(v.length)+" ch)",1)]))),128))]))]))),128))]),p("div",null,[p("span",ma,"Cookies ("+$(e.pageState.cookies.length)+")",1),e.pageState.cookies.length===0?(o(),u("p",ga,"none")):(o(),u("ul",ha,[(o(!0),u(ee,null,fe(e.pageState.cookies,i=>(o(),u("li",{key:i.name+i.domain,class:"text-xs font-mono truncate"},[E($(i.name)+" ",1),n(i)?(o(),u("span",ya,"["+$(n(i))+"]",1)):T("",!0),p("span",va,"· "+$(i.domain),1)]))),128))]))]),f[2]||(f[2]=p("p",{class:"text-[11px] text-gray-400 dark:text-gray-500"}," Storage values and cookie values are never captured — key names, lengths and flags only. ",-1))])]),_:2},[e.storageKey&&!e.plain?{name:"folded",fn:A(()=>[p("span",null,$(t(s)),1)]),key:"0"}:void 0]),1040))}}),qa=Object.assign(xa,{__name:"PageStateCard"});function Za(e={}){const r=Y(!1),a=Je();let c=null;async function n(s,l,f={}){try{typeof ClipboardItem<"u"?await navigator.clipboard.write([new ClipboardItem({"text/plain":new Blob([s],{type:"text/plain"}),"text/html":new Blob([l],{type:"text/html"})})]):await navigator.clipboard.writeText(s),r.value=!0,c&&clearTimeout(c),c=setTimeout(()=>{r.value=!1,c=null},e.duration??2e3),f.toast&&a.add({title:typeof f.toast=="string"?f.toast:"Copied to clipboard",icon:"i-lucide-check",color:"success",duration:2e3})}catch{}}return{copyRich:n,copied:r}}export{Xe as _,Da as a,Ka as b,Va as c,Ha as d,Fa as e,qa as f,cn as g,De as h,Ma as i,Na as j,Ua as k,ja as l,Oa as m,Os as n,Ts as o,mt as p,Za as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{G as m,a as p}from"./DeewM3Wg.js";import{d,o as n,c as o,k as t,F as r,m as i,t as l,i as f,q as _,h as c}from"./CNu3kken.js";const k=["title"],x=d({__name:"DurationValue",props:{ms:{default:null},fallback:{default:"—"},unitClass:{default:"text-gray-400/70 dark:text-gray-500/70"},noTitle:{type:Boolean,default:!1}},setup(e){const a=e,s=c(()=>m(a.ms)),u=c(()=>a.noTitle||a.ms===null||a.ms===void 0?void 0:p(a.ms));return(y,g)=>(n(),o("span",{class:"tabular-nums whitespace-nowrap",title:t(u)},[t(s)?(n(),o(r,{key:0},[i(l(t(s).value),1),f("span",{class:_(e.unitClass)},l(t(s).unit),3)],64)):(n(),o(r,{key:1},[i(l(e.fallback),1)],64))],8,k))}}),h=Object.assign(x,{__name:"DurationValue"});export{h as _};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as W,o as r,f as m,x,k as e,g as u,V as M,p as v,v as s,h as o,m as y,K as L,l as D,j as C,c as _,t as p,i as E,F as N,y as k,r as U,_ as H}from"./CNu3kken.js";import{H as w}from"./BjaRappk.js";import{a as G}from"./DprkT7rM.js";const B="https://piwitests.github.io";function X(t){return`${B}/${t.replace(/^\//,"")}`}const Y=W({__name:"DocLink",props:{to:{},noIcon:{type:Boolean}},setup(t){const a=t,h=o(()=>X(a.to));return(c,n)=>{const g=v,I=x;return r(),m(I,{to:e(h),target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:u(()=>[M(c.$slots,"default",{},()=>[n[0]||(n[0]=y("Learn more",-1))]),t.noIcon?s("",!0):(r(),m(g,{key:0,name:"i-lucide-external-link",class:"w-3.5 h-3.5 shrink-0"}))]),_:3},8,["to"])}}}),V=Object.assign(Y,{__name:"DocLink"}),P={PIWI_SITE_URL:{description:"Public base URL of the instance (e.g. https://piwi.example.com). Used to build links in emails.",category:"general",type:"url",example:"https://piwi.example.com",notes:"When unset, links in emails point to http://localhost:3000 and OAuth callback URLs are inferred from the request host — set it when running behind a reverse proxy."},PIWI_SECRET_KEY:{description:"Master key for AES-256-GCM encryption of secrets stored in the database (AI API keys, webhook/SCM secrets). Strongly recommended in production.",category:"general",secret:!0,example:"a 64-char random hex string",notes:"Falls back to an insecure built-in development key (with a startup warning in production). Generate one with `node -e \"console.log(require('node:crypto').randomBytes(32).toString('hex'))\"`."},PIWI_BUILD_DIR:{description:"Overrides the Nuxt build output directory. Used by the test harness to isolate parallel builds.",category:"build",runtimeOnly:!0,type:"path"},PIWI_BUILD_SHA:{description:"Commit SHA baked into the build for provenance. Shown on Settings → About. Set as a build-time arg.",category:"build",runtimeOnly:!0},PIWI_DESKTOP_TOKEN:{description:"Per-install access token the desktop (Tauri) app injects to gate its local server. Set automatically by the desktop shell — not user-configurable. Absent on the server build.",category:"desktop",secret:!0,runtimeOnly:!0,since:"0.16.0"},PIWI_DATABASE_PATH:{description:"Path to the SQLite database file (used when PIWI_DATABASE_URL is not set).",category:"database",type:"path",default:".data/piwi.db",relevantWhen:{PIWI_DATABASE_URL:""}},PIWI_DATABASE_URL:{description:"PostgreSQL connection string. When set, PostgreSQL is used instead of SQLite and migrations run automatically on startup.",category:"database",secret:!0,example:"postgres://piwi:piwi@db:5432/piwi",docs:"deployment#docker-compose-with-postgresql"},PIWI_RETENTION_DAYS:{description:"Days of test-run history the nightly retention sweep keeps. Unset or 0 disables automatic run pruning (the default — pruning is opt-in).",category:"database",type:"number",min:0,docs:"storage#data-retention"},PIWI_RETENTION_NOTIFICATION_DAYS:{description:"Days to keep sent/failed notification outbox rows before the nightly sweep prunes them (default 30; 0 keeps them forever).",category:"database",type:"number",default:"30",min:0},PIWI_RETENTION_DIAGNOSIS_VERSIONS:{description:"AI-diagnosis history versions kept per diagnosis by the nightly sweep (default 20; 0 disables capping).",category:"database",type:"number",default:"20",min:0},PIWI_STORAGE_TYPE:{description:'Storage backend for test artifacts (HTML reports, traces, attachments): "local" or "s3".',category:"storage",type:"enum",enum:["local","s3"],default:"local",notes:"Only the exact value `s3` selects S3; any other value falls back to local storage."},PIWI_STORAGE_PATH:{description:'Directory for local file storage (when PIWI_STORAGE_TYPE is "local").',category:"storage",type:"path",default:".data/storage",relevantWhen:{PIWI_STORAGE_TYPE:"local"}},PIWI_S3_BUCKET:{description:'S3 bucket name for artifact storage (when PIWI_STORAGE_TYPE is "s3").',category:"storage",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"},docs:"storage#s3-compatible-storage"},PIWI_S3_REGION:{description:'S3 bucket region (when PIWI_STORAGE_TYPE is "s3").',category:"storage",example:"us-east-1",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_ACCESS_KEY_ID:{description:"S3 access key id with write access to the bucket.",category:"storage",secret:!0,relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_SECRET_ACCESS_KEY:{description:"S3 secret access key.",category:"storage",secret:!0,relevantWhen:{PIWI_STORAGE_TYPE:"s3"},requiredWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_ENDPOINT:{description:"Custom endpoint for S3-compatible services (MinIO, R2, Spaces).",category:"storage",type:"url",example:"https://minio.example.com",relevantWhen:{PIWI_STORAGE_TYPE:"s3"}},PIWI_S3_FORCE_PATH_STYLE:{description:"Use path-style addressing (required by some S3-compatible services).",category:"storage",type:"boolean",relevantWhen:{PIWI_STORAGE_TYPE:"s3"},notes:"Defaults to on when a custom endpoint is set, off otherwise; only the exact value `false` turns it off explicitly."},PIWI_AUTH_ENABLED:{description:'Set to "true" to enable role-based access control and API keys. Off by default.',category:"auth",type:"boolean",default:"false"},PIWI_AUTH_SECRET:{description:"Secret used to sign/encrypt session cookies. Required when PIWI_AUTH_ENABLED is true.",category:"auth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_AUTH_ENABLED:"true"},notes:"The server refuses to start when auth is enabled and this is unset."},PIWI_OAUTH_GOOGLE_CLIENT_ID:{description:"Google OAuth client id (optional single sign-on).",category:"oauth",relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GOOGLE_CLIENT_SECRET:"*"},docs:"authentication#oauth-google-github"},PIWI_OAUTH_GOOGLE_CLIENT_SECRET:{description:"Google OAuth client secret.",category:"oauth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GOOGLE_CLIENT_ID:"*"}},PIWI_OAUTH_GITHUB_CLIENT_ID:{description:"GitHub OAuth client id (optional single sign-on).",category:"oauth",relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GITHUB_CLIENT_SECRET:"*"},docs:"authentication#oauth-google-github"},PIWI_OAUTH_GITHUB_CLIENT_SECRET:{description:"GitHub OAuth client secret.",category:"oauth",secret:!0,relevantWhen:{PIWI_AUTH_ENABLED:"true"},requiredWhen:{PIWI_OAUTH_GITHUB_CLIENT_ID:"*"}},PIWI_OAUTH_ALLOWED_DOMAINS:{description:"Comma-separated verified email domains allowed to sign in via OAuth (all providers).",category:"oauth",type:"list",example:"example.com,corp.example.com",relevantWhen:{PIWI_AUTH_ENABLED:"true"},notes:"Only verified emails in these domains are accepted. Empty means no domain restriction."},PIWI_OAUTH_GITHUB_ALLOWED_ORGS:{description:"Comma-separated GitHub org logins a user must belong to (requests read:org scope).",category:"oauth",type:"list",relevantWhen:{PIWI_OAUTH_GITHUB_CLIENT_ID:"*"}},PIWI_AI_PROVIDER:{description:'AI provider for failure diagnosis: "anthropic" or "openai" (OpenAI-compatible).',category:"ai",type:"enum",enum:["anthropic","openai"]},PIWI_AI_API_KEY:{description:"API key for the diagnosis provider. Takes precedence over the DB-stored key.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"anthropic"},notes:"Optional for OpenAI-compatible providers that need no key (e.g. a local model)."},PIWI_AI_MODEL:{description:"Diagnosis model name (default: claude-opus-4-8 for Anthropic).",category:"ai",example:"claude-opus-4-8",relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"openai"}},PIWI_AI_BASE_URL:{description:"Base URL for OpenAI-compatible providers (e.g. http://localhost:11434/v1).",category:"ai",type:"url",example:"http://localhost:11434/v1",relevantWhen:{PIWI_AI_PROVIDER:"*"},requiredWhen:{PIWI_AI_PROVIDER:"openai"}},PIWI_AI_AUTO_DIAGNOSE:{description:'Set to "true" to auto-diagnose new failure clusters when a run finishes.',category:"ai",type:"boolean",default:"false",relevantWhen:{PIWI_AI_PROVIDER:"*"}},PIWI_AI_AUTO_DIAGNOSE_MAX:{description:"Max clusters auto-diagnosed per finished run (budget cap; default 3).",category:"ai",type:"number",default:"3",min:1,relevantWhen:{PIWI_AI_AUTO_DIAGNOSE:"true"}},PIWI_AI_RESEARCH_PROVIDER:{description:"Provider for the optional research (pre-analysis) stage. Falls back to PIWI_AI_PROVIDER.",category:"ai",type:"enum",enum:["anthropic","openai"],relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_RESEARCH_MODEL:{description:"Cheaper/faster model for the research stage. Empty disables the two-stage pipeline.",category:"ai",relevantWhen:{PIWI_AI_PROVIDER:"*"}},PIWI_AI_RESEARCH_BASE_URL:{description:"Base URL for the research-stage provider. Falls back to PIWI_AI_BASE_URL.",category:"ai",type:"url",relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_RESEARCH_API_KEY:{description:"API key for the research-stage provider. Falls back to PIWI_AI_API_KEY.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_RESEARCH_MODEL:"*"}},PIWI_AI_EMBEDDING_PROVIDER:{description:"Provider for embeddings (semantic failure clustering). Falls back to PIWI_AI_PROVIDER.",category:"ai",type:"enum",enum:["openai"],relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:'Must resolve to an OpenAI-compatible provider — Anthropic has no embeddings API — so the fallback only helps when the main provider is "openai".'},PIWI_AI_EMBEDDING_MODEL:{description:"Embedding model name (e.g. text-embedding-3-small).",category:"ai",example:"text-embedding-3-small",relevantWhen:{PIWI_AI_PROVIDER:"*"},notes:"Empty disables semantic clustering (and the embedding fallbacks)."},PIWI_AI_EMBEDDING_BASE_URL:{description:"Base URL for the embedding provider. Falls back to PIWI_AI_BASE_URL.",category:"ai",type:"url",relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"}},PIWI_AI_EMBEDDING_API_KEY:{description:"API key for the embedding provider. Falls back to PIWI_AI_API_KEY.",category:"ai",secret:!0,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"}},PIWI_AI_MAX_SAMPLE_ERROR_CHARS:{description:"Max characters of raw error text (per error block).",category:"ai-limits",type:"number",default:"10000",min:200,max:5e4},PIWI_AI_MAX_SCM_PATCH_BUDGET:{description:"Total characters of diff patches across changed files.",category:"ai-limits",type:"number",default:"15000",min:0,max:5e4},PIWI_AI_MAX_AFFECTED_TESTS:{description:"Max affected tests listed in the diagnosis context.",category:"ai-limits",type:"number",default:"30",min:1,max:200},PIWI_AI_MAX_STEPS:{description:"Max recent test steps included.",category:"ai-limits",type:"number",default:"50",min:1,max:200},PIWI_AI_MAX_CONSOLE_ENTRIES:{description:"Max console error/warning entries included.",category:"ai-limits",type:"number",default:"30",min:0,max:200},PIWI_AI_MAX_CONSOLE_ENTRY_CHARS:{description:"Max characters per console entry.",category:"ai-limits",type:"number",default:"1000",min:50,max:5e3},PIWI_AI_MAX_NETWORK_REQUESTS:{description:"Max failed network requests included.",category:"ai-limits",type:"number",default:"25",min:0,max:200},PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS:{description:"Max characters of the page ARIA snapshot.",category:"ai-limits",type:"number",default:"12000",min:0,max:5e4},PIWI_AI_MAX_TEST_SOURCE_CHARS:{description:"Max characters of the test source snippet.",category:"ai-limits",type:"number",default:"8000",min:0,max:5e4},PIWI_AI_MAX_SOURCE_FILES:{description:"Max full source files fetched from SCM to ground patches (0 disables).",category:"ai-limits",type:"number",default:"4",min:0,max:20},PIWI_AI_MAX_SOURCE_FILE_CHARS:{description:"Max characters per fetched full source file.",category:"ai-limits",type:"number",default:"12000",min:0,max:5e4},PIWI_AI_MAX_SERVER_LOG_ENTRIES:{description:"Max backend server log entries (from X-Piwi-Logs header) included.",category:"ai-limits",type:"number",default:"50",min:0,max:200},PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS:{description:"Max characters per backend server log entry.",category:"ai-limits",type:"number",default:"1000",min:50,max:5e3},PIWI_AI_MAX_SERVER_TRACE_SPANS:{description:"Max backend server spans (from X-Piwi-Trace header) included in AI diagnosis (0 disables).",category:"ai-limits",type:"number",default:"40",min:0,max:500,since:"0.16.0"},PIWI_AI_MAX_IMAGES:{description:"Max screenshots auto-included in the diagnosis context.",category:"ai-limits",type:"number",default:"5",min:0,max:20},PIWI_AI_MAX_PASSED_PEERS:{description:"Max peer tests in the same file listed when they passed.",category:"ai-limits",type:"number",default:"20",min:0,max:100},PIWI_AI_MAX_CONSOLE_WINDOW:{description:"Max console entries of any type in the window before failure.",category:"ai-limits",type:"number",default:"50",min:0,max:200},PIWI_AI_SLOW_REQUEST_MS:{description:"Network request duration (ms) threshold for flagging as slow.",category:"ai-limits",type:"number",default:"1500",min:100,max:3e4},PIWI_AI_MAX_TRACE_ACTIONS:{description:"Max actions extracted from trace ZIP for failing-action context (0 disables).",category:"ai-limits",type:"number",default:"10",min:0,max:50},PIWI_AI_TRACE_DOM_CHARS:{description:"Max characters for the trace-derived DOM/ARIA excerpt in failing-action context.",category:"ai-limits",type:"number",default:"6000",min:0,max:2e4},PIWI_AI_MAX_TRACE_STACK_FRAMES:{description:"Max call-stack frames (with source windows) from the trace call-stack section (0 disables).",category:"ai-limits",type:"number",default:"10",min:0,max:50},PIWI_AI_MAX_TRACE_NETWORK_REQUESTS:{description:"Max requests included from the trace network stream (0 disables).",category:"ai-limits",type:"number",default:"20",min:0,max:200},PIWI_AI_MAX_DOM_SNAPSHOT_CHARS:{description:"Max characters of the failure-time DOM snapshot rendered from the trace (0 disables).",category:"ai-limits",type:"number",default:"8000",min:0,max:5e4},PIWI_AI_IMAGE_MAX_EDGE:{description:"Screenshots are downscaled to at most this many pixels on the long edge before being sent.",category:"ai-limits",type:"number",default:"1920",min:512,max:8192},PIWI_INGEST_MAX_CONSOLE_ENTRIES:{description:"Max console entries stored per test execution.",category:"ingest",type:"number",default:"200",min:10,max:5e3},PIWI_IMPORT_MAX_BYTES:{description:"Max size of a single multipart upload (report upload or blob-report import), in bytes. Lower it to match a reverse proxy that rejects large bodies, so the import page rejects an oversized archive before uploading it.",category:"ingest",type:"number",default:String(500*1024*1024),min:1024*1024,max:5*1024*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_INLINE_BYTES:{description:"Max size of a single evidence file embedded as a data: URI in an HTML export, in bytes. Larger files are left out of the single-file HTML (and listed as omitted); the ZIP export still carries them at full size.",category:"export",type:"number",default:String(8*1024*1024),min:64*1024,max:512*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_BYTES:{description:"Max total size of one export, in bytes. Evidence is added largest-last until the budget is reached; the rest is listed as omitted. The archive is built in memory, so this also bounds what a single export costs the server.",category:"export",type:"number",default:String(500*1024*1024),min:1024*1024,max:4*1024*1024*1024,since:"0.19.0"},PIWI_EXPORT_MAX_CASES:{description:"Max member executions carrying full evidence in a failure-cluster export. Remaining affected tests are listed by name without their evidence.",category:"export",type:"number",default:"25",min:1,max:200,since:"0.19.0"},PIWI_INGEST_MAX_CONSOLE_ENTRY_CHARS:{description:"Max characters stored per console entry.",category:"ingest",type:"number",default:"2000",min:200,max:2e4},PIWI_INGEST_MAX_STEPS:{description:"Max test steps stored per execution.",category:"ingest",type:"number",default:"500",min:20,max:5e3},PIWI_INGEST_MAX_STEP_EVENTS:{description:"Max step events stored per execution.",category:"ingest",type:"number",default:"1000",min:20,max:1e4},PIWI_INGEST_MAX_ARIA_CHARS:{description:"Max characters of the ARIA snapshot stored per failing execution.",category:"ingest",type:"number",default:"100000",min:1e3,max:1e6},PIWI_INGEST_MAX_ERROR_CHARS:{description:"Max characters of error text stored per execution (head and tail are kept).",category:"ingest",type:"number",default:"20000",min:1e3,max:1e5},PIWI_INGEST_MAX_SAMPLE_ERROR_CHARS:{description:"Max characters of the sample error stored per failure cluster.",category:"ingest",type:"number",default:"50000",min:1e3,max:2e5},PIWI_INGEST_MAX_TEST_SOURCE_CHARS:{description:"Max characters of the test source snippet stored per failing execution.",category:"ingest",type:"number",default:"50000",min:1e3,max:2e5},PIWI_INGEST_MAX_SOURCE_FRAMES:{description:"Max source stack frames stored per failing execution.",category:"ingest",type:"number",default:"8",min:1,max:32},PIWI_INGEST_MAX_SOURCE_FRAME_CHARS:{description:"Max characters per stored source frame snippet.",category:"ingest",type:"number",default:"4000",min:500,max:2e4},PIWI_AUTO_MARKERS:{description:"Automatically create a timeline marker when a run’s environment, Playwright version, or reporter version changes from the previous run (default: enabled). Set to false to disable.",category:"markers",type:"boolean",default:"true",docs:"timeline-markers",notes:"Only the exact value `false` disables auto-markers."},PIWI_TEST_LOGS_DISABLED:{description:"Disable X-Piwi-Logs response header emission (default: auto-disabled in production, enabled in development).",category:"testing",type:"boolean",docs:"backend-logs",notes:"Unset: capture is on in development and off in production builds; `true` forces it off everywhere, `false` forces it on even in production."},PIWI_CLUSTER_SIMILARITY_THRESHOLD:{description:"Cosine similarity (0–1) above which two failure embeddings merge into one cluster.",category:"clustering",type:"number",default:"0.92",min:0,max:1,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:"Must be greater than 0 and at most 1; invalid values fall back to the default."},PIWI_CLUSTER_SUGGEST_THRESHOLD:{description:"Similarity at which a failure is suggested (not auto-merged) as related to a cluster.",category:"clustering",type:"number",default:"0.80",min:0,max:1,relevantWhen:{PIWI_AI_EMBEDDING_MODEL:"*"},notes:"Capped at the merge threshold."},PIWI_SMTP_HOST:{description:"SMTP server hostname for outbound email.",category:"smtp",example:"smtp.example.com"},PIWI_SMTP_PORT:{description:"SMTP port (default 587; 465 for implicit TLS).",category:"smtp",type:"number",default:"587",min:1,max:65535,relevantWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_USER:{description:"SMTP username.",category:"smtp",relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_PASS:{description:"SMTP password. Never returned by the API.",category:"smtp",secret:!0,relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_FROM:{description:"From address for outbound email (e.g. noreply@example.com).",category:"smtp",example:"noreply@example.com",relevantWhen:{PIWI_SMTP_HOST:"*"},requiredWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_FROM_NAME:{description:"Display name for the from address (optional).",category:"smtp",default:"Piwi Dashboard",relevantWhen:{PIWI_SMTP_HOST:"*"}},PIWI_SMTP_SECURE:{description:'Set to "true" for implicit TLS on port 465 (default false → STARTTLS/plain).',category:"smtp",type:"boolean",relevantWhen:{PIWI_SMTP_HOST:"*"},notes:"Defaults to on when the port is 465, off otherwise."},PIWI_WASTED_WAIT_PATTERNS:{description:"Glob patterns (comma or newline separated) defining which wait steps count as wasted time. Locks the UI when set.",category:"wasted-time",type:"list",default:"Wait for timeout*,*waitForTimeout*",notes:"Case-insensitive globs (`*` and `?`) matched against a wait step’s title or source location. Use `*` to count every wait."},PIWI_DEMO_MODE:{description:'Set to "true" to build the standalone client-side demo SPA (no server).',category:"demo",runtimeOnly:!0,type:"boolean"},PIWI_BASE_URL:{description:"Base URL the metadata test spec targets (defaults to http://localhost:3000).",category:"test",runtimeOnly:!0},PIWI_POSTGRES_TEST_URL:{description:"PostgreSQL connection string used by the Postgres test suite.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_BUCKET:{description:"S3 bucket for the storage integration tests.",category:"test",runtimeOnly:!0},PIWI_S3_TEST_REGION:{description:"Region for the S3 storage integration tests.",category:"test",runtimeOnly:!0},PIWI_S3_TEST_ACCESS_KEY_ID:{description:"Access key id for the S3 storage integration tests.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_SECRET_ACCESS_KEY:{description:"Secret access key for the S3 storage integration tests.",category:"test",runtimeOnly:!0,secret:!0},PIWI_S3_TEST_ENDPOINT:{description:"Custom endpoint for the S3 storage integration tests.",category:"test",runtimeOnly:!0},PIWI_MAILPIT_URL:{description:"Mailpit base URL; when set, the email/notification E2E tests run against it.",category:"test",runtimeOnly:!0},PIWI_MAILPIT_SMTP_PORT:{description:"SMTP port the email E2E tests send to (Mailpit).",category:"test",runtimeOnly:!0},PIWI_EMAIL_SERVER_URL:{description:"Base URL the email test spec targets.",category:"test",runtimeOnly:!0},PIWI_TEST_CLEANUP_ENABLED:{description:"Allow the E2E cleanup endpoint (`DELETE /api/tests/cleanup`) on a production build, which CI needs because it runs the suite against one. Never set it on a real deployment.",category:"test",runtimeOnly:!0,type:"boolean",since:"0.19.0"}};function T(t){return P[t]}function ne(t){return Object.keys(P).filter(a=>P[a].category===t)}const q={key:0,class:"font-medium mb-1"},F={class:"text-muted"},K={key:1,class:"mt-2 space-y-1"},$={class:"text-muted text-xs"},z={class:"flex flex-col gap-1.5"},Q=["title","onClick"],j={class:"block font-mono text-xs bg-elevated rounded px-1.5 py-0.5 select-all cursor-pointer group-hover:ring-1 ring-default"},Z={key:0,class:"block text-muted text-[11px] mt-0.5"},J={key:2,class:"mt-2 flex flex-col gap-1"},ee=W({__name:"HelpHint",props:{topic:{},title:{},text:{},doc:{},envVars:{},size:{}},setup(t){const a=t,{copy:h}=G(),c=o(()=>a.topic?w[a.topic]:null),n=o(()=>a.title??c.value?.title),g=o(()=>a.text??c.value?.text??""),I=o(()=>a.doc??c.value?.doc),d=o(()=>a.envVars??c.value?.envVars),A=U(!1),S=o(()=>n.value?`Help: ${n.value}`:"Help"),b=o(()=>({side:"bottom","aria-label":S.value}));return(te,l)=>{const R=H,f=V,O=L;return r(),m(O,{open:e(A),"onUpdate:open":l[0]||(l[0]=i=>D(A)?A.value=i:null),content:e(b),ui:{content:"max-w-xs p-3 text-sm"}},{content:u(()=>[e(n)?(r(),_("p",q,p(e(n)),1)):s("",!0),E("p",F,p(e(g)),1),e(d)?.length?(r(),_("div",K,[E("p",$,"Environment variable"+p(e(d).length>1?"s":"")+":",1),E("div",z,[(r(!0),_(N,null,k(e(d),i=>(r(),_("button",{key:i,type:"button",class:"group text-left",title:`Click to copy ${i}`,onClick:re=>e(h)(i,{toast:`Copied ${i}`})},[E("code",j,p(i),1),e(T)(i).description?(r(),_("span",Z,p(e(T)(i).description),1)):s("",!0)],8,Q))),128))])])):s("",!0),e(I)||e(d)?.length?(r(),_("div",J,[e(I)?(r(),m(f,{key:0,to:e(I)},{default:u(()=>[...l[1]||(l[1]=[y("Learn more",-1)])]),_:1},8,["to"])):s("",!0),e(d)?.length?(r(),m(f,{key:1,to:"configuration"},{default:u(()=>[...l[2]||(l[2]=[y("Configuration reference",-1)])]),_:1})):s("",!0)])):s("",!0)]),default:u(()=>[C(R,{size:t.size??"xs",variant:"ghost",color:"neutral",icon:"i-lucide-circle-help","aria-label":e(S),title:"What is this?",class:"text-muted hover:text-default align-middle"},null,8,["size","aria-label"])]),_:1},8,["open","content"])}}}),se=Object.assign(ee,{__name:"HelpHint"});export{se as _,V as a,X as d,ne as e,T as g};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as T,o as r,c as x,j as p,k as a,p as U,t as E,v as b,i as k,f as _,g as y,m as L,_ as j,h as w,s as N,r as h,J as O,F as S,y as Z,C as D,E as R,l as I,K as J}from"./CNu3kken.js";import{a as K}from"./DprkT7rM.js";const M=[{provider:"jira",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/browse\//i,/^https:\/\/[^/]+\/jira\/software\/c\/projects\//i,/^https:\/\/[^/]+\/.+\/browse\//i],keyExtract:/\/([A-Z][A-Z0-9_]+-\d+)(?:\?|$|#)/i},{provider:"github-issue",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"github-pr",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\//i],keyExtract:/\/pull\/(\d+)/},{provider:"gitlab-issue",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"gitlab-mr",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/merge_requests\//i],keyExtract:/\/merge_requests\/(\d+)/},{provider:"bitbucket",tests:[/^https:\/\/bitbucket\.org\/[^/]+\/[^/]+\/pull-requests\//i],keyExtract:/\/pull-requests\/(\d+)/},{provider:"confluence",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/wiki\//i]},{provider:"slack",tests:[/^https:\/\/[^/]+\.slack\.com\//i]},{provider:"linear",tests:[/^https:\/\/linear\.app\//i],keyExtract:/\/([A-Za-z]+-\d+)(?:\/|\?|$|#)/},{provider:"notion",tests:[/^https:\/\/(www\.)?notion\.so\//i]}];function G(t){for(const c of M)if(c.tests.some(e=>e.test(t)))return c.provider;return"generic"}function z(t){return{jira:"i-simple-icons-jira","github-issue":"i-simple-icons-github","github-pr":"i-simple-icons-github","gitlab-issue":"i-simple-icons-gitlab","gitlab-mr":"i-simple-icons-gitlab",bitbucket:"i-simple-icons-bitbucket",confluence:"i-simple-icons-confluence",slack:"i-simple-icons-slack",linear:"i-simple-icons-linear",notion:"i-simple-icons-notion",generic:"i-lucide-link"}[t]}const H={class:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 group hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"},Q={key:0,class:"font-mono text-primary font-medium"},W=["title"],X=T({__name:"LinkChip",props:{link:{},removable:{type:Boolean}},emits:["remove"],setup(t,{emit:c}){const e=t,v=c,g=w(()=>e.link.title||e.link.key||e.link.url.replace(/^https?:\/\//,"").slice(0,50)),o=w(()=>z(e.link.provider));return(s,l)=>{const d=U,f=N,m=j;return r(),x("span",H,[p(d,{name:a(o),class:"w-3.5 h-3.5 shrink-0"},null,8,["name"]),t.link.key?(r(),x("span",Q,E(t.link.key),1)):b("",!0),k("span",{class:"max-w-48 truncate",title:t.link.title||t.link.url},E(a(g)),9,W),t.link.statusText?(r(),_(f,{key:1,color:t.link.statusColor||"neutral",variant:"subtle",size:"xs"},{default:y(()=>[L(E(t.link.statusText),1)]),_:1},8,["color"])):b("",!0),p(m,{to:t.link.url,target:"_blank",size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-external-link",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1"},null,8,["to"]),t.removable?(r(),_(m,{key:2,size:"xs",variant:"ghost",color:"error",icon:"i-lucide-x",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1",onClick:l[0]||(l[0]=C=>v("remove",t.link.id))})):b("",!0)])}}}),Y=Object.assign(X,{__name:"LinkChip"}),tt={class:"flex flex-wrap items-center gap-1.5"},et={class:"relative"},it={class:"flex justify-end gap-2"},st=T({__name:"EntityLinks",props:{entityType:{},entityId:{},links:{}},emits:["updated"],setup(t,{emit:c}){const e=t,v=c,{copy:g}=K(),o=h(e.links??[]),s=h(""),l=h(!1),d=h(!1),f=w(()=>{try{return s.value?G(s.value):null}catch{return null}}),m=w(()=>f.value?z(f.value):null);async function C(){const n=await $fetch("/api/links",{params:{entityType:e.entityType,entityId:e.entityId}});o.value=n.links}async function B(){if(!(!s.value||d.value)){d.value=!0;try{const n=await $fetch("/api/links",{method:"POST",body:{entityType:e.entityType,entityId:e.entityId,url:s.value}});o.value.push(n.link),s.value="",l.value=!1,v("updated")}catch(n){g(n?.data?.message||"Failed to add link",{toast:!0})}finally{d.value=!1}}}async function V(n){try{await $fetch(`/api/links/${n}`,{method:"DELETE"}),o.value=o.value.filter(i=>i.id!==n),v("updated")}catch{g("Failed to remove link",{toast:!0})}}return O(()=>[e.entityType,e.entityId],()=>{e.links?o.value=e.links:C()},{immediate:!0}),(n,i)=>{const A=Y,$=j,P=R,q=U,F=J;return r(),x("div",tt,[(r(!0),x(S,null,Z(a(o),u=>(r(),_(A,{key:u.id,link:u,removable:"",onRemove:V},null,8,["link"]))),128)),p(F,{open:a(l),"onUpdate:open":i[2]||(i[2]=u=>I(l)?l.value=u:null)},{content:y(()=>[k("form",{class:"p-3 space-y-3 min-w-72",onSubmit:D(B,["prevent"])},[i[5]||(i[5]=k("p",{class:"text-sm font-medium"},"Add link",-1)),k("div",et,[p(P,{modelValue:a(s),"onUpdate:modelValue":i[0]||(i[0]=u=>I(s)?s.value=u:null),placeholder:"https://...",size:"sm",class:"w-full",autofocus:""},null,8,["modelValue"]),a(m)?(r(),_(q,{key:0,name:a(m),class:"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"},null,8,["name"])):b("",!0)]),k("div",it,[p($,{size:"xs",variant:"ghost",color:"neutral",onClick:i[1]||(i[1]=u=>l.value=!1)},{default:y(()=>[...i[3]||(i[3]=[L(" Cancel ",-1)])]),_:1}),p($,{size:"xs",color:"primary",type:"submit",loading:a(d),disabled:!a(s).trim()},{default:y(()=>[...i[4]||(i[4]=[L(" Add ",-1)])]),_:1},8,["loading","disabled"])])],32)]),default:y(()=>[p($,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-plus",class:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",title:"Add link"})]),_:1},8,["open"])])}}}),ot=Object.assign(st,{__name:"EntityLinks"});export{ot as _};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as o}from"./BfcMJBTf.js";import{O as a,h as i,ab as n}from"./CNu3kken.js";import{u}from"./DFfqRQxk.js";function p(s){const{canSeeAdmin:t}=a(),e=u();return i(()=>o({canSeeAdmin:t.value,isDesktop:e,envManaged:s?n(s):void 0}))}export{p as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{e as H,t as j}from"./D7t0Dn3h.js";import{ap as $,b as J,a as K,ak as b,h as X,aM as Y}from"./CNu3kken.js";import{e as V}from"./DeewM3Wg.js";const z={normal:[],headed:["--headed"],debug:["--debug"],ui:["--ui"]};function Q(n){const i=new Map;for(const r of n){const u=r.projectName||"";i.has(u)||i.set(u,[]),i.get(u).push(r)}return i}function W(n,i){if(i==="grep"){const a=n.map(c=>H(c.title));return["--grep",a.length===1?a[0]:`(${a.join("|")})`]}const r=new Set,u=[];for(const a of n){const c=i==="file-line"&&a.line?`${j(a.filePath)}:${a.line}`:j(a.filePath);r.has(c)||(r.add(c),u.push(c))}return u}function Z(n){return/[\s"'()|]/.test(n)?`"${n.replace(/"/g,'\\"')}"`:n}function ee(n,i={}){if(n.length===0)return[];const r=i.mode??"file-line",u=i.runMode??"normal",a=Math.min(1e3,Math.max(1,Math.floor(i.repeatEach??1))),c=[];for(const[h,g]of Q(n)){const d=W(g,r);h&&d.push(`--project=${h}`),d.push(...z[u]),i.trace&&d.push("--trace=on"),a>1&&d.push(`--repeat-each=${a}`),c.push({args:d,display:["playwright","test",...d.map(Z)].join(" ")})}return c}function re(n){return n.progressTotal?`Running ${n.progressDone}/${n.progressTotal}…`:n.steps.length>1?`Running ${n.stepIndex+1}/${n.steps.length}…`:"Running…"}const te={mode:"file-line",runMode:"normal",trace:!1,repeatEach:1},ce=[{label:"Headless",value:"normal",icon:"i-lucide-square-terminal"},{label:"Headed",value:"headed",icon:"i-lucide-app-window"},{label:"Debug (inspector)",value:"debug",icon:"i-lucide-bug"},{label:"UI mode",value:"ui",icon:"i-lucide-layout-grid"}],ue=[{label:"File:line",value:"file-line"},{label:"Title (grep)",value:"grep"},{label:"File only",value:"file"}],S=2e3,k=15,_="piwi:desktop-local-run-options";let se=1,E=null,w=0,v=[];const y=new Map,R=new Map;let I=null,O=null,x=!1;const ne=/^Running (\d+) tests? using \d+ workers?$/,oe=/^\s{1,6}(?:✓|✘|✗|x|ok|-)\s+\d+\s/;function de(){const n=$("desktop-local-runs",()=>[]),i=$("desktop-local-runs-tray",()=>!1),r=$("desktop-local-run-options",()=>({}));I=J(),O=K();const u=X(()=>n.value.filter(e=>e.status==="running").length);function a(){if(!x){x=!0;try{const e=localStorage.getItem(_);e&&(r.value=JSON.parse(e))}catch{}}}function c(e){return a(),{...te,...r.value[String(e)]}}function h(e,t){a();const s={...c(e),...t};r.value={...r.value,[String(e)]:s};try{localStorage.setItem(_,JSON.stringify(r.value))}catch{}}function g(e,t,s){if(e.lines.push({text:t,error:s}),e.lines.length>S&&e.lines.splice(0,e.lines.length-S),s)return;const o=ne.exec(t);o?e.progressTotal=(e.progressTotal??0)+Number(o[1]):oe.test(t)&&(e.progressDone=Math.min(e.progressDone+1,e.progressTotal??e.progressDone+1))}function d(e,t){if(t.kind==="exit"){R.get(t.id)?.(t.code);return}g(e,t.line??"",t.kind!=="stdout")}async function M(){if(E)return;const e=Y();if(!e)throw new Error("The desktop bridge is unavailable.");E=await e.listen("piwi:local-run",({payload:t})=>{const s=y.get(t.id);s?d(s,t):w>0&&v.push(t)})}async function T(e,t){const s=b();if(!s)throw new Error("The desktop bridge is unavailable.");w+=1;let o;try{o=await s.invoke("desktop_run_local_tests",{projectId:e.projectId,args:t.args})}catch(p){throw w-=1,p}const l=new Promise(p=>R.set(o,p));y.set(o,e),e.shellId=o;const f=v.filter(p=>p.id===o);v=w>1?v.filter(p=>p.id!==o):[],w-=1;for(const p of f)d(e,p);const m=await l;return y.delete(o),R.delete(o),e.shellId=null,m}async function A(e){try{await M();let t=0;for(const[s,o]of e.steps.entries()){if(e.stopRequested)break;e.stepIndex=s,e.steps.length>1&&g(e,`$ ${o.display}`,!1);const l=await T(e,o);if(e.stopRequested)break;l!==0&&(t=l??1)}e.stopRequested?e.status="stopped":(e.exitCode=typeof t=="number"?t:1,e.status=t===0?"passed":"failed")}catch(t){g(e,V(t),!0),e.status="error"}finally{e.finishedAt=Date.now(),P(e),N()}}function P(e){if(e.status==="stopped")return;const t=e.projectLabel||"Local run",s=`${e.cases.length} test${e.cases.length===1?"":"s"}`,o=Math.max(1,Math.round(((e.finishedAt??Date.now())-e.startedAt)/1e3));D(e,t,s,o);const l={label:"View output",color:"neutral",variant:"outline",onClick:()=>{i.value=!0}},f=e.piwiRunId==null?[]:[{label:`Open run #${e.piwiRunId}`,color:"neutral",variant:"outline",onClick:()=>{O?.push(`/test-runs/${e.piwiRunId}`)}}];e.status==="passed"?I?.add({title:"Local run passed",description:`${t} — ${s} in ${o}s`,icon:"i-lucide-check",color:"success",actions:[l,...f]}):e.status==="failed"?I?.add({title:"Local run failed",description:`${t} — exit ${e.exitCode??1} after ${o}s`,icon:"i-lucide-x",color:"error",actions:[l,...f]}):I?.add({title:"Local run could not start",description:e.lines.findLast(m=>m.error)?.text,icon:"i-lucide-triangle-alert",color:"error",actions:[l]})}function D(e,t,s,o){if(typeof Notification>"u"||Notification.permission!=="granted"||!document.hidden&&document.hasFocus())return;const l=e.status==="passed"?"Local run passed":e.status==="failed"?"Local run failed":"Local run could not start",f=e.status==="failed"?`${t} — exit ${e.exitCode??1} after ${o}s`:`${t} — ${s} in ${o}s`;try{new Notification(l,{body:f})}catch{}}function N(){const e=n.value.filter(s=>s.status!=="running");if(e.length<=k)return;const t=new Set(e.slice(k).map(s=>s.key));n.value=n.value.filter(s=>!t.has(s.key))}function L(e){if(!b()||e.cases.length===0)return null;const t={...c(e.projectId),...e.options},s=ee(e.cases,t);if(s.length===0)return null;e.persistOptions!==!1&&h(e.projectId,t);const o={key:se++,projectId:String(e.projectId),projectLabel:e.projectLabel??null,cases:e.cases.map(f=>({...f})),options:t,steps:s,stepIndex:0,status:"running",lines:[],exitCode:null,startedAt:Date.now(),finishedAt:null,shellId:null,stopRequested:!1,progressTotal:null,progressDone:0,piwiRunId:null,piwiRunBaseline:null};n.value=[o,...n.value];const l=n.value[0];return i.value=!0,C(l),A(l),l}async function C(e){try{const t=await $fetch(`/api/projects/${e.projectId}/latest-run`);e.piwiRunBaseline=t?.id??0}catch{}}async function F(){const e=Date.now()-12e4;for(const t of n.value)if(!(t.piwiRunId!=null||t.piwiRunBaseline==null)&&!(t.status!=="running"&&(t.finishedAt??0)<e))try{const s=await $fetch(`/api/projects/${t.projectId}/latest-run`);s&&s.id>t.piwiRunBaseline&&(t.piwiRunId=s.id)}catch{}}function B(e){return L({projectId:e.projectId,projectLabel:e.projectLabel,cases:e.cases,options:e.options,persistOptions:!1})}async function U(e){if(e.status!=="running")return;e.stopRequested=!0;const t=b(),s=e.shellId;if(t&&s!=null){try{await t.invoke("desktop_stop_local_tests",{runId:s})}catch{}R.get(s)?.(null)}}function q(){n.value=n.value.filter(e=>e.status==="running")}function G(e){if(e==null)return;const t=String(e);return n.value.find(s=>s.projectId===t)}return{runs:n,trayOpen:i,activeCount:u,startRun:L,rerun:B,stopRun:U,clearFinished:q,latestForProject:G,getProjectOptions:c,saveProjectOptions:h,correlatePiwiRuns:F}}export{ce as L,ue as R,ee as b,re as l,de as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ak as $,b as H,B as L,J as T,r as R,ab as y,az as K,ap as O,h as M}from"./CNu3kken.js";import{e as U}from"./DeewM3Wg.js";const J=4096;function F(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function k(e){return'"'+e.replace(/"/g,'\\"')+'"'}function m(e){return e.replace(/\\/g,"/")}function G(e){const n=new Map;for(const o of e){const i=o.projectName||"";n.has(i)||n.set(i,[]),n.get(i).push(o)}return n}function z(e){const n=new Set;return e.filter(o=>{const i=o.filePath;return n.has(i)?!1:(n.add(i),!0)}).map(o=>o.filePath)}function V(e,n){const o=n?.mode??"file-line",l=`${n?.pkgRunner??"npx"} playwright test`;if(e.length===0)return"";const f=G(e),j=[];for(const[u,c]of f){let s;if(o==="file"){const d=z(c).map(t=>k(m(t))).join(" ");s=`${l} ${d}`}else if(o==="file-line"){const p=new Set,d=c.filter(t=>{const r=t.filePath+":"+t.line;return t.line&&p.has(r)?!1:(t.line&&p.add(r),!0)}).map(t=>t.line?k(`${m(t.filePath)}:${t.line}`):k(m(t.filePath))).join(" ");s=`${l} ${d}`}else{const p=c.map(t=>F(t.title)),d=p.length===1?p[0]:`(${p.join("|")})`;s=`${l} --grep ${k(d)}`}u&&(s+=` --project=${k(u)}`),j.push(s)}let v=j.join(" && ");if(v.length>J){if(o==="grep")return V(e,{...n,mode:"file-line"});if(o==="file-line")return V(e,{...n,mode:"file"});const c=W(e).map(p=>k(m(p))).join(" ");let s=`${l} ${c}`;return s.length>J&&(s=s.slice(0,J-3)+"..."),s}return v}function W(e){const n=new Set;return e.reduce((o,i)=>(n.has(i.filePath)||(n.add(i.filePath),o.push(i.filePath)),o),[])}function _(e,n){return e==null?"":n==null?`:${e}`:`:${e}:${n}`}function E(e){return e.replace(/%/g,"%25").replace(/ /g,"%20").replace(/#/g,"%23").replace(/\?/g,"%3F")}function S(e,n){const o=m(e).replace(/\/+$/,""),i=m(n).replace(/^\.?\/+/,"");return o?`${o}/${i}`:i}function q(e){const n=E(m(e.absPath)),o=n.startsWith("/")?n:`/${n}`;return`${e.scheme}://file${o}${_(e.line,e.column)}`}function X(e){const n=E(m(e.relPath))+_(e.line,e.column);return`jetbrains://${e.product}/navigate/reference?project=${encodeURIComponent(e.projectName)}&path=${n}`}function Y(e){const n=E(m(e.path));return`http://localhost:${e.port}/api/file/${n}${_(e.line,e.column)}`}async function I(e){const n=$();if(!n||e==null||e==="")return null;try{return await n.invoke("desktop_get_project_link",{projectId:String(e)})}catch{return null}}function re(e){const n=H(),o=R(!1),i=R(null),l=R(!1);async function f(){i.value=await I(y(e))}L(()=>{o.value=!!$(),o.value&&f()}),T(()=>y(e),()=>{o.value&&f()});async function j(){const u=$(),c=y(e);if(!u||c==null||c==="")return!1;l.value=!0;try{const s=await u.invoke("desktop_pick_folder");return s?(await u.invoke("desktop_set_project_link",{projectId:String(c),path:s}),await f(),!0):!1}catch(s){return n.add({title:"Could not link the folder",description:U(s),color:"error"}),!1}finally{l.value=!1}}async function v(){const u=$(),c=y(e);if(!(!u||c==null||c==="")){l.value=!0;try{await u.invoke("desktop_set_project_link",{projectId:String(c),path:null}),i.value=null}catch(s){n.add({title:"Could not unlink the folder",description:U(s),color:"error"})}finally{l.value=!1}}}return{available:o,link:i,busy:l,refresh:f,pickAndLink:j,unlink:v}}const Q="piwi-ide-prefs",Z={method:"auto",vscodeScheme:"vscode",jetbrainsProduct:"idea",jetbrainsPort:63342,jetbrainsHttpUsesRelativePath:!1,defaultRoot:"",projectRoots:{},jetbrainsProjectNames:{}},ee={vscode:"VS Code","vscode-insiders":"VS Code Insiders",vscodium:"VSCodium",cursor:"Cursor"},ie={auto:"Auto (try all)",vscode:"VS Code","jetbrains-url":"JetBrains (URL)","jetbrains-http":"JetBrains (local server)"},se=["idea","webstorm","pycharm","phpstorm","goland","rubymine","clion","rider","rustrover"];function ae(){const e=K(Q,Z,{mergeDefaults:!0}),n=H(),o=O("piwi-ide-settings-open",()=>!1),i=O("piwi-ide-settings-context",()=>({}));function l(t){return t==null||t===""?null:String(t)}function f(t={}){i.value={projectKey:t.projectKey??null,projectName:t.projectName??null},o.value=!0}function j(t){const r=l(t);return((r?e.value.projectRoots[r]:void 0)||e.value.defaultRoot||"").trim()}function v(t,r){const a=l(t);return((a?e.value.jetbrainsProjectNames[a]:void 0)||r||"").trim()}function u(t,r){const a=j(r);return a?S(a,t):null}const c=M(()=>!!e.value.defaultRoot?.trim()||Object.keys(e.value.projectRoots).length>0||Object.keys(e.value.jetbrainsProjectNames).length>0);function s(t){try{const r=document.createElement("iframe");r.style.display="none",r.src=t,document.body.appendChild(r),setTimeout(()=>r.remove(),1e3)}catch{const r=document.createElement("a");r.href=t,r.style.display="none",document.body.appendChild(r),r.click(),setTimeout(()=>r.remove(),1e3)}}async function p(t,r,a){const b=Y({port:e.value.jetbrainsPort,path:t,line:r,column:a});try{return await fetch(b,{mode:"no-cors",signal:AbortSignal.timeout(1200)}),!0}catch{return!1}}async function d(t){const r=t.method??e.value.method,a=t.filePath,b=t.line??null,P=t.column??null;let h=j(t.projectKey);if(!h){const g=await I(t.projectKey);g?.exists&&(h=g.path)}const w=v(t.projectKey,t.projectName),x={projectKey:l(t.projectKey),projectName:t.projectName??null},C={label:"Configure",color:"info",onClick:()=>f(x)},N=()=>h?(s(q({scheme:e.value.vscodeScheme,absPath:S(h,a),line:b,column:P})),n.add({title:`Opening ${ee[e.value.vscodeScheme]}…`,description:"If nothing opens, the editor may not be installed or the workspace root is wrong.",color:"neutral",icon:"i-lucide-external-link"}),!0):(n.add({title:"Set a workspace root",description:"VS Code needs the local folder that contains this file.",color:"info",icon:"i-lucide-folder-cog",actions:[C]}),!1),A=()=>w?(s(X({product:e.value.jetbrainsProduct,projectName:w,relPath:a,line:b,column:P})),n.add({title:"Opening JetBrains…",description:"If nothing opens, JetBrains Toolbox may not be installed or the project is not open.",color:"neutral",icon:"i-lucide-external-link"}),!0):(n.add({title:"Set a JetBrains project name",description:"The jetbrains:// link needs the open IDE project name.",color:"info",icon:"i-lucide-folder-cog",actions:[C]}),!1),D=async()=>{const g=e.value.jetbrainsHttpUsesRelativePath?a:h?S(h,a):a,B=await p(g,b,P);return n.add(B?{title:"Opened in JetBrains",color:"success",icon:"i-lucide-check"}:{title:"JetBrains not reachable",description:`Nothing responded on localhost:${e.value.jetbrainsPort}. Start the IDE with the Remote Control plugin (and "Allow unsigned requests").`,color:"error",icon:"i-lucide-plug-zap"}),B};if(r==="vscode"){N();return}if(r==="jetbrains-url"){A();return}if(r==="jetbrains-http"){await D();return}if(e.value.jetbrainsHttpUsesRelativePath||!!h){const g=e.value.jetbrainsHttpUsesRelativePath?a:S(h,a);if(await p(g,b,P)){n.add({title:"Opened in JetBrains",color:"success",icon:"i-lucide-check"});return}}if(h){N();return}if(w){A();return}n.add({title:'Set up "Open in IDE"',description:"Add your local workspace folder (for VS Code) or a JetBrains project name to open files from here.",color:"info",icon:"i-lucide-folder-cog",actions:[C]})}return{prefs:e,isConfigured:c,openInIde:d,openInVscode:t=>d({...t,method:"vscode"}),openViaJetbrainsUrl:t=>d({...t,method:"jetbrains-url"}),openViaJetbrainsHttp:t=>d({...t,method:"jetbrains-http"}),resolveRoot:j,resolveJbProjectName:v,resolveAbsPath:u,settingsOpen:o,settingsContext:i,openSettings:f}}export{ie as I,se as J,ee as V,ae as a,V as b,F as e,m as t,re as u};
|