@piwitests/server 0.18.2 → 0.19.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/{BlnwU1OO.js → -09h6CA9.js} +1 -1
- package/.output/public/_nuxt/279D2RYp.js +1 -0
- package/.output/public/_nuxt/81InBX9v.js +1 -0
- package/.output/public/_nuxt/{CUvGJXY3.js → Ar3IelOY.js} +1 -1
- package/.output/public/_nuxt/B33iXw77.js +1 -0
- package/.output/public/_nuxt/B3B9Ii2A.js +1 -0
- package/.output/public/_nuxt/B3HO8kuh.js +1 -0
- package/.output/public/_nuxt/B44A4LSJ.js +1 -0
- package/.output/public/_nuxt/{C8OCrfDP.js → B7NBP1C-.js} +1 -1
- package/.output/public/_nuxt/{DZ3Vfcpz.js → B9WhzpKO.js} +1 -1
- package/.output/public/_nuxt/{DWowvnwc.js → BCMuIgP5.js} +1 -1
- package/.output/public/_nuxt/BDicZ1gQ.js +1 -0
- package/.output/public/_nuxt/BJ0XQElc.js +1 -0
- package/.output/public/_nuxt/{xqiPI_FQ.js → BMvCSA6h.js} +1 -1
- package/.output/public/_nuxt/BPQoBGg5.js +1 -0
- package/.output/public/_nuxt/BPRffDuo.js +1 -0
- package/.output/public/_nuxt/BSIxhGsh.js +1 -0
- package/.output/public/_nuxt/BVaxh6Nl.js +4 -0
- package/.output/public/_nuxt/{hgHc4teu.js → BX9ZXe98.js} +1 -1
- package/.output/public/_nuxt/{CcXaak_K.js → BYDaY0Z7.js} +1 -1
- package/.output/public/_nuxt/{S5DLdEpg.js → Bc8mOoz9.js} +2 -2
- package/.output/public/_nuxt/BccXfBfI.js +1 -0
- package/.output/public/_nuxt/{Bd3HqPMF.js → BeLWlVK0.js} +1 -1
- package/.output/public/_nuxt/{D5oNv2cB.js → BfTuX0wq.js} +1 -1
- package/.output/public/_nuxt/BjaRappk.js +1 -0
- package/.output/public/_nuxt/{By4YL7mx.js → Bn0YQDyy.js} +1 -1
- package/.output/public/_nuxt/Bp5ELvx9.js +1 -0
- package/.output/public/_nuxt/BpUaY9nH.js +2 -0
- package/.output/public/_nuxt/BqV0l12c.js +1 -0
- package/.output/public/_nuxt/{BjCHB89N.js → Bti38m-M.js} +1 -1
- package/.output/public/_nuxt/{QmMoMxLM.js → Bu2aaVIY.js} +3 -3
- package/.output/public/_nuxt/{DZUgX70W.js → BuMC3WjZ.js} +1 -1
- package/.output/public/_nuxt/{BJtlcTrb.js → BxCKKeYs.js} +1 -1
- package/.output/public/_nuxt/{CfOLBbW9.js → C-elpgyr.js} +1 -1
- package/.output/public/_nuxt/C2_3mdPC.js +1 -0
- package/.output/public/_nuxt/{BLIRKrbM.js → C5iG7O4O.js} +4 -4
- package/.output/public/_nuxt/C7P1UCO2.js +1 -0
- package/.output/public/_nuxt/{hH1UFE3Z.js → C95YAaJq.js} +1 -1
- package/.output/public/_nuxt/{BXY_PWcx.js → C9_jrmk9.js} +2 -2
- package/.output/public/_nuxt/CDk0q2hV.js +2 -0
- package/.output/public/_nuxt/{kjYMoWWx.js → CGNkHojN.js} +3 -3
- package/.output/public/_nuxt/CHEFCN8Q.js +1 -0
- package/.output/public/_nuxt/CHNwfU1y.js +1 -0
- package/.output/public/_nuxt/CK_2LZBS.js +1 -0
- package/.output/public/_nuxt/CNFYDQmj.js +1 -0
- package/.output/public/_nuxt/{DZOS7Fh7.js → CTxDO9fB.js} +1 -1
- package/.output/public/_nuxt/{kS3boz40.js → CU5S9GCh.js} +1 -1
- package/.output/public/_nuxt/{DZ1zNBVM.js → CUtJobDm.js} +1 -1
- package/.output/public/_nuxt/CV9-fTmY.js +1 -0
- package/.output/public/_nuxt/{e7zD3uJ0.js → CYsTqbBS.js} +1 -1
- package/.output/public/_nuxt/{C9YzQCiq.js → CZfMdzfk.js} +1 -1
- package/.output/public/_nuxt/{B-IcwqZ2.js → Cdff9XNh.js} +1 -1
- package/.output/public/_nuxt/{CNMoZYMv.js → ClOqkAcc.js} +1 -1
- package/.output/public/_nuxt/{DXbPFI1d.js → CpjgB2aY.js} +1 -1
- package/.output/public/_nuxt/CrwJAwhk.js +1 -0
- package/.output/public/_nuxt/CtQBsNUb.js +1 -0
- package/.output/public/_nuxt/CuSVQEkS.js +3 -0
- package/.output/public/_nuxt/{Df7kUO0m.js → CylWPruw.js} +1 -1
- package/.output/public/_nuxt/CzGyac8q.js +1 -0
- package/.output/public/_nuxt/D-c8ZSws.js +1 -0
- package/.output/public/_nuxt/{B2oUeBbA.js → D0HNloZ9.js} +1 -1
- package/.output/public/_nuxt/{DBtBvrYc.js → D55D4EYo.js} +1 -1
- package/.output/public/_nuxt/{CfPSts5n.js → DDDpCFpF.js} +1 -1
- package/.output/public/_nuxt/{CPLJeOCb.js → DEFEpYzn.js} +1 -1
- package/.output/public/_nuxt/DGfAxLHV.js +1 -0
- package/.output/public/_nuxt/DHDtnj7p.js +1 -0
- package/.output/public/_nuxt/DLSrtpsA.js +1 -0
- package/.output/public/_nuxt/DP8hfJ9h.js +1 -0
- package/.output/public/_nuxt/DS636elg.js +1 -0
- package/.output/public/_nuxt/{Cng9gj7q.js → DT53RWbC.js} +1 -1
- package/.output/public/_nuxt/DVDXJYq2.js +2 -0
- package/.output/public/_nuxt/DW0xl3I6.js +17 -0
- package/.output/public/_nuxt/{4TxgDGVa.js → DX-MDGb3.js} +1 -1
- package/.output/public/_nuxt/DcmZRa_F.js +1 -0
- package/.output/public/_nuxt/DgE2YE3R.js +1 -0
- package/.output/public/_nuxt/Dgf5N4Ng.js +1 -0
- package/.output/public/_nuxt/DiOLdHBC.js +1 -0
- package/.output/public/_nuxt/DiZyJYez.js +1 -0
- package/.output/public/_nuxt/Dk9fwOCm.js +34 -0
- package/.output/public/_nuxt/{BlA8mIS-.js → Dnpkl-1q.js} +1 -1
- package/.output/public/_nuxt/DoUy4UHi.js +44 -0
- package/.output/public/_nuxt/{CN1mJlvD.js → DprVVyUQ.js} +1 -1
- package/.output/public/_nuxt/{DD5HpaW9.js → DslPMqfa.js} +1 -1
- package/.output/public/_nuxt/{BFP6M-20.js → FUXhyidq.js} +1 -1
- package/.output/public/_nuxt/HXerICAi.js +79 -0
- package/.output/public/_nuxt/{gnCL8GjZ.js → IvQlbZk6.js} +1 -1
- package/.output/public/_nuxt/{BOCwBVnz.js → Jo8kRmHz.js} +1 -1
- package/.output/public/_nuxt/{oFM1KLWA.js → KnfsST6Y.js} +1 -1
- package/.output/public/_nuxt/NQikbhmK.js +253 -0
- package/.output/public/_nuxt/OSduWzyz.js +1 -0
- package/.output/public/_nuxt/SfMRXW25.js +5 -0
- package/.output/public/_nuxt/{BBK2-Krn.js → SlIRLREZ.js} +2 -2
- package/.output/public/_nuxt/TagBadge.By1E6r4y.css +1 -0
- package/.output/public/_nuxt/WsxFTEFq.js +10 -0
- package/.output/public/_nuxt/YVN7WG7q.js +1 -0
- package/.output/public/_nuxt/{rTvJTef_.js → ZFiQCMUB.js} +1 -1
- package/.output/public/_nuxt/aQgs_c6e.js +9 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/ab473028-4b37-4884-b243-b8f6e5046e5e.json +1 -0
- package/.output/public/_nuxt/{B1X__ilH.js → cHAnlQbv.js} +1 -1
- package/.output/public/_nuxt/dYCKgE-3.js +5 -0
- package/.output/public/_nuxt/{BeFDVhpA.js → eaVkJRSa.js} +1 -1
- package/.output/public/_nuxt/entry.CPhW41mh.css +1 -0
- package/.output/public/_nuxt/{Dwws9U0D.js → eptP4pGv.js} +1 -1
- package/.output/public/_nuxt/fVcG504p.js +1 -0
- package/.output/public/_nuxt/g26aVPxc.js +1 -0
- package/.output/public/_nuxt/{CsUoYK75.js → ndShiWE8.js} +1 -1
- package/.output/public/_nuxt/nv9-6vBK.js +1 -0
- package/.output/public/_nuxt/rWNTSFD6.js +3 -0
- package/.output/public/_nuxt/tvgqrYDd.js +1 -0
- package/.output/public/_nuxt/{wHnZ9OaL.js → y17lMTFy.js} +1 -1
- package/.output/public/_nuxt/{qpI-_f9Q.js → ybDYeNxd.js} +1 -1
- package/.output/public/_nuxt/{D0cnIs93.js → zQyPuvV1.js} +1 -1
- package/.output/public/demo/seed.version.json +2 -2
- package/.output/server/chunks/_/ai-prompt-preview.mjs +38 -0
- package/.output/server/chunks/_/ai-prompt-preview.mjs.map +1 -0
- package/.output/server/chunks/_/collect.mjs +122 -0
- package/.output/server/chunks/_/collect.mjs.map +1 -0
- package/.output/server/chunks/_/import-runs.mjs +351 -0
- package/.output/server/chunks/_/import-runs.mjs.map +1 -0
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +112 -0
- package/.output/server/chunks/_/quarantine.mjs.map +1 -0
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Alert-Bp1Wz_sq.mjs → Alert-C4xq8lao.mjs} +2 -2
- package/.output/server/chunks/build/Alert-C4xq8lao.mjs.map +1 -0
- package/.output/server/chunks/build/{Breadcrumb-C9ZPTLym.mjs → Breadcrumb-Ak2Lg3oM.mjs} +3 -3
- package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-C3y42Vun.mjs → BreadcrumbNav-DO7I_z-n.mjs} +3 -3
- package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-DNCp9pF-.mjs → BrowserBadge-D33lqUcj.mjs} +5 -5
- package/.output/server/chunks/build/BrowserBadge-D33lqUcj.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Fr557IbV.mjs → ChartCard-Y1UKwMsf.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-cVOSIY93.mjs → Checkbox-DvUBGagc.mjs} +8 -8
- package/.output/server/chunks/build/Checkbox-DvUBGagc.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DXPOhdSG.mjs → CiEnvCard-CrjOM17n.mjs} +25 -34
- package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BGwNmJ8J.mjs → CodeBlock-BgE-NSmE.mjs} +7 -22
- package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-Bdp-OwTN.mjs → DashboardNavbar-BHmMSPX7.mjs} +3 -3
- package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-Ji6ADuqF.mjs → DashboardSidebarToggle-DCTnHiIv.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-D6xSOrme.mjs → DataLocationCard-B_YHdzSz.mjs} +3 -3
- package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-DV1xwGu4.mjs → DiagnosisPanel-B646dK4p.mjs} +17 -528
- package/.output/server/chunks/build/DiagnosisPanel-B646dK4p.mjs.map +1 -0
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs +43 -0
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +1 -0
- package/.output/server/chunks/build/{EmptyState-DV3oT_xz.mjs → EmptyState-Dtlab7S9.mjs} +3 -3
- package/.output/server/chunks/build/EmptyState-Dtlab7S9.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-DeOP13Kr.mjs → EntityLinks-D3fp57pR.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-D3fp57pR.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-Qpn58Nmr.mjs → EnvManagedBadge-Bg3FSiU1.mjs} +3 -3
- package/.output/server/chunks/build/EnvManagedBadge-Bg3FSiU1.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B-GSn_VR.mjs → FormField-B0HKsdMd.mjs} +3 -3
- package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-YEMWtKu1.mjs → HelpHint-DrcIv-Oj.mjs} +53 -6
- package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +1 -0
- package/.output/server/chunks/build/{Label-DBvbHd3A.mjs → Label-DYDR1Oeh.mjs} +2 -2
- package/.output/server/chunks/build/Label-DYDR1Oeh.mjs.map +1 -0
- package/.output/server/chunks/build/{MiniRunBars-C3HG-EYm.mjs → MiniRunBars-CZMugDrh.mjs} +2 -2
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-CfA78Hm1.mjs → Modal-Ck2XLt8d.mjs} +2 -2
- package/.output/server/chunks/build/Modal-Ck2XLt8d.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs → OpenInIdeLink-C4MXA8ya.mjs} +6 -6
- package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs.map → OpenInIdeLink-C4MXA8ya.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-9Ia825h8.mjs → ProjectTestCasesTable-CxfQ5wtN.mjs} +120 -45
- package/.output/server/chunks/build/ProjectTestCasesTable-CxfQ5wtN.mjs.map +1 -0
- package/.output/server/chunks/build/{RovingFocusItem-CxhHdNGo.mjs → RovingFocusItem-BJSzTBjy.mjs} +2 -2
- package/.output/server/chunks/build/RovingFocusItem-BJSzTBjy.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-BpJqLHY9.mjs → RunReports-DFLv51TX.mjs} +8 -6
- package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-BhmJ_RKM.mjs → RunStatusBadge-FfGb6bkW.mjs} +3 -2
- package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-COd9TuDq.mjs → SectionCard-CN-v0FZ_.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-ppPz926C.mjs → Select-CUqj50wi.mjs} +4 -4
- package/.output/server/chunks/build/Select-CUqj50wi.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs → SelectMenu-Db7osY7J.mjs} +4 -4
- package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs.map → SelectMenu-Db7osY7J.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-CxZdx8kw.mjs → Separator-CR4WcEKD.mjs} +2 -2
- package/.output/server/chunks/build/Separator-CR4WcEKD.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-DDD4oqys.mjs → SettingsField-D6iEYbEc.mjs} +6 -6
- package/.output/server/chunks/build/SettingsField-D6iEYbEc.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-B95Rj237.mjs → Slideover-DgCa80mf.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-DgCa80mf.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-xQQ3_ME1.mjs → Switch-CgUioOYB.mjs} +5 -5
- package/.output/server/chunks/build/Switch-CgUioOYB.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-CPhhVzDv.mjs → Table-BRk04Hd2.mjs} +3 -3
- package/.output/server/chunks/build/Table-BRk04Hd2.mjs.map +1 -0
- package/.output/server/chunks/build/{Tabs-BV9XqjoO.mjs → Tabs-Bbsg9wag.mjs} +3 -3
- package/.output/server/chunks/build/Tabs-Bbsg9wag.mjs.map +1 -0
- package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs +31 -0
- package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs.map +1 -0
- package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs +8 -0
- package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-DMb-xSJa.mjs → TestCaseHistoryChart-nMLPhdvD.mjs} +6 -6
- package/.output/server/chunks/build/TestCaseHistoryChart-nMLPhdvD.mjs.map +1 -0
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs +200 -0
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-CEzt76wk.mjs → TestStatusBar-j6h2Jp6A.mjs} +15 -15
- package/.output/server/chunks/build/TestStatusBar-j6h2Jp6A.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-DrrqQUVG.mjs → Textarea-Dv2-lOvW.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-7vwuDPrZ.mjs → Tooltip-BOazooWP.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-BOazooWP.mjs.map +1 -0
- package/.output/server/chunks/build/{VisuallyHiddenInput-C9eJVpPW.mjs → VisuallyHiddenInput-D6kBJxVd.mjs} +2 -2
- package/.output/server/chunks/build/VisuallyHiddenInput-D6kBJxVd.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-B2yirIuA.mjs → _id_-B78ky13D.mjs} +798 -358
- package/.output/server/chunks/build/_id_-B78ky13D.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-bWcP2xFl.mjs → _id_-BHh65pfg.mjs} +690 -443
- package/.output/server/chunks/build/_id_-BHh65pfg.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-B4V5fop6.mjs → _id_-Rzkqx55x.mjs} +297 -60
- package/.output/server/chunks/build/{_id_-B4V5fop6.mjs.map → _id_-Rzkqx55x.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-CE0Gso6i.mjs → _id_-z5N6HPyC.mjs} +89 -40
- package/.output/server/chunks/build/_id_-z5N6HPyC.mjs.map +1 -0
- package/.output/server/chunks/build/{about-CoJjvUwM.mjs → about-CvSP73Ug.mjs} +100 -52
- package/.output/server/chunks/build/about-CvSP73Ug.mjs.map +1 -0
- package/.output/server/chunks/build/{account-Cn-eZqXM.mjs → account-DAfvaD-F.mjs} +21 -9
- package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-7jdaPOmj.mjs → ai-B4VJ9K1K.mjs} +45 -23
- package/.output/server/chunks/build/{ai-7jdaPOmj.mjs.map → ai-B4VJ9K1K.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-B276WPeU.mjs → analytics-CJPC6t4L.mjs} +65 -39
- package/.output/server/chunks/build/{analytics-B276WPeU.mjs.map → analytics-CJPC6t4L.mjs.map} +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/compare-RxHSOdsO.mjs +12 -0
- package/.output/server/chunks/build/{db.client-aHcD0wyX.mjs → db.client-CQoVTYB9.mjs} +83 -5
- package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +1 -0
- package/.output/server/chunks/build/{default-BSzdkM_L.mjs → default-zvbFgDJG.mjs} +36 -24
- package/.output/server/chunks/build/default-zvbFgDJG.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-BN_x1OW3.mjs → docs-DyuVEgtB.mjs} +30 -49
- package/.output/server/chunks/build/{docs-BN_x1OW3.mjs.map → docs-DyuVEgtB.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-C9Z7oZeu.mjs → edit-CFR5g2Qf.mjs} +30 -18
- package/.output/server/chunks/build/edit-CFR5g2Qf.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-8kznMtBM.mjs → fetch-B4FwBOzu.mjs} +3 -3
- package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-BqPF4Rxs.mjs → forgot-password-CC__1OnV.mjs} +17 -5
- package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +1 -0
- package/.output/server/chunks/build/{help-content-DmFnuhNu.mjs → help-content-C876a9WD.mjs} +37 -8
- package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +1 -0
- package/.output/server/chunks/build/import-CZo3djDi.mjs +1021 -0
- package/.output/server/chunks/build/import-CZo3djDi.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CULN3-en.mjs → index-CU2nZhAa.mjs} +113 -42
- package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DVUtBexc.mjs → index-D7fe97l3.mjs} +1305 -281
- package/.output/server/chunks/build/index-D7fe97l3.mjs.map +1 -0
- package/.output/server/chunks/build/{index-BR9hw6qk.mjs → index-Stqw0dEI.mjs} +50 -30
- package/.output/server/chunks/build/index-Stqw0dEI.mjs.map +1 -0
- package/.output/server/chunks/build/{index-BK9PTRpd.mjs → index-gCw_y4ZJ.mjs} +87 -70
- package/.output/server/chunks/build/{index-BK9PTRpd.mjs.map → index-gCw_y4ZJ.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-Ba-Fifra.mjs → index-tR6owKzj.mjs} +18 -6
- package/.output/server/chunks/build/index-tR6owKzj.mjs.map +1 -0
- package/.output/server/chunks/build/{isValueEqualOrExist-DBZjbD_3.mjs → isValueEqualOrExist-D2qw9YEr.mjs} +3 -3
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs.map +1 -0
- package/.output/server/chunks/build/{login-D2XZDuek.mjs → login-Da4u1IlW.mjs} +19 -7
- package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-_o6cMS6m.mjs → mcp-B3IUvRgD.mjs} +27 -21
- package/.output/server/chunks/build/mcp-B3IUvRgD.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-Dzm9c0u_.mjs → notifications-abDv0id8.mjs} +27 -21
- package/.output/server/chunks/build/notifications-abDv0id8.mjs.map +1 -0
- package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs +368 -0
- package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-gpFzIEDj.mjs → reset-password-BmrUS4ZD.mjs} +17 -5
- package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +238 -36
- package/.output/server/chunks/build/{settings-pNyPBXVa.mjs → settings-Du7YqF8i.mjs} +23 -10
- package/.output/server/chunks/build/settings-Du7YqF8i.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-B0wo5R-W.mjs → settings-metadata-DrEqWcW-.mjs} +11 -2
- package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-XelzuyPy.mjs → storage-B4vzxd8G.mjs} +41 -31
- package/.output/server/chunks/build/storage-B4vzxd8G.mjs.map +1 -0
- package/.output/server/chunks/build/styles.mjs +1 -0
- package/.output/server/chunks/build/{tags-DrCQ7QSw.mjs → tags-DauTe_F-.mjs} +22 -10
- package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-pmOxi-AN.mjs → test-cases-DUvaO1He.mjs} +38 -24
- package/.output/server/chunks/build/test-cases-DUvaO1He.mjs.map +1 -0
- package/.output/server/chunks/build/{timeout-hygiene-CNs71Iah.mjs → timeout-hygiene-CbnSaVbK.mjs} +20 -8
- package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-ZO987RY7.mjs → useAiStatus-CWvIo32Q.mjs} +89 -89
- package/.output/server/chunks/build/useAiStatus-CWvIo32Q.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopy-BQQKcwlq.mjs → useCopy-CeKWgHyT.mjs} +2 -2
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +1 -0
- package/.output/server/chunks/build/{PageStateCard-Bwee6JTk.mjs → useCopyRich-BemRsKgv.mjs} +418 -39
- package/.output/server/chunks/build/useCopyRich-BemRsKgv.mjs.map +1 -0
- package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs +46 -0
- package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs.map +1 -0
- package/.output/server/chunks/build/{useFormControl-BLpq1s4O.mjs → useFormControl-CZ9So7iX.mjs} +2 -2
- package/.output/server/chunks/build/useFormControl-CZ9So7iX.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-kMZ7Jw5c.mjs → useOpenInIde-4GFf-kdi.mjs} +2 -2
- package/.output/server/chunks/build/useOpenInIde-4GFf-kdi.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-NjI2seBy.mjs → useSettingsNav-C3O866KC.mjs} +6 -6
- package/.output/server/chunks/build/useSettingsNav-C3O866KC.mjs.map +1 -0
- package/.output/server/chunks/build/{useTreeViewCookie-DVYpxW-p.mjs → useTreeViewCookie-CQjQdTkH.mjs} +2 -2
- package/.output/server/chunks/build/useTreeViewCookie-CQjQdTkH.mjs.map +1 -0
- package/.output/server/chunks/build/{users-NmAUZs3i.mjs → users-CTUqXyGh.mjs} +22 -10
- package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +1 -0
- package/.output/server/chunks/build/{virtualizer-ZaqK4guJ.mjs → virtualizer-Cd1hhlxC.mjs} +5 -5
- package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-CguAF9zc.mjs → wasted-time-lYkx5YO4.mjs} +26 -14
- package/.output/server/chunks/build/wasted-time-lYkx5YO4.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +4960 -1155
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +13 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +12 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +12 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +12 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +12 -0
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +12 -0
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +12 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +12 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +12 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +12 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +12 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +12 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +12 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +24 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +64 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +56 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +12 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +13 -32
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +13 -1
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +12 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +13 -1
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +13 -1
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +13 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +12 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +12 -0
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +13 -1
- package/.output/server/chunks/routes/api/index.post5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +12 -0
- package/.output/server/chunks/routes/api/index.post6.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +13 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +13 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +13 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +22 -2
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +58 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +57 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +72 -0
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +13 -1
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +13 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +12 -0
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +57 -0
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +63 -0
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +12 -0
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +13 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/stream.get.mjs +13 -1
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +13 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +25 -3
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +60 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +15 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +196 -0
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +78 -0
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +201 -0
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +13 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +32 -15
- 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 +21 -6
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +154 -3
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +13 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +13 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +12 -0
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +13 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +13 -1
- package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/tasks/sweep.mjs +12 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +12 -0
- package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
- package/.output/server/database/migrations/0039_remarkable_jean_grey.sql +2 -0
- package/.output/server/database/migrations/0040_organic_phalanx.sql +8 -0
- package/.output/server/database/migrations/0041_tense_gravity.sql +5 -0
- package/.output/server/database/migrations/0042_burly_hemingway.sql +19 -0
- package/.output/server/database/migrations/meta/0039_snapshot.json +3403 -0
- package/.output/server/database/migrations/meta/0040_snapshot.json +3457 -0
- package/.output/server/database/migrations/meta/0041_snapshot.json +3492 -0
- package/.output/server/database/migrations/meta/0042_snapshot.json +3618 -0
- package/.output/server/database/migrations/meta/_journal.json +28 -0
- package/.output/server/database/migrations-pg/0040_lazy_layla_miller.sql +2 -0
- package/.output/server/database/migrations-pg/0041_light_screwball.sql +8 -0
- package/.output/server/database/migrations-pg/0042_serious_layla_miller.sql +5 -0
- package/.output/server/database/migrations-pg/0043_wonderful_mordo.sql +19 -0
- package/.output/server/database/migrations-pg/meta/0040_snapshot.json +4060 -0
- package/.output/server/database/migrations-pg/meta/0041_snapshot.json +4123 -0
- package/.output/server/database/migrations-pg/meta/0042_snapshot.json +4153 -0
- package/.output/server/database/migrations-pg/meta/0043_snapshot.json +4308 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +28 -0
- package/.output/server/index.mjs +13 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
- package/.output/server/node_modules/fflate/package.json +128 -0
- package/.output/server/node_modules/highlight.js/es/languages/yaml.js +213 -0
- package/.output/server/node_modules/marked/lib/marked.esm.js +72 -0
- package/.output/server/node_modules/marked/package.json +103 -0
- package/.output/server/package.json +3 -1
- package/package.json +2 -2
- package/.output/public/_nuxt/9-wVZMur.js +0 -4
- package/.output/public/_nuxt/B-5GukRk.js +0 -1
- package/.output/public/_nuxt/B1G3GGhQ.js +0 -1
- package/.output/public/_nuxt/B1zMFx24.js +0 -1
- package/.output/public/_nuxt/B4jvLMfS.js +0 -1
- package/.output/public/_nuxt/BBnX5xw4.js +0 -2
- package/.output/public/_nuxt/BHpUiv6j.js +0 -3
- package/.output/public/_nuxt/BLOUs6AE.js +0 -5
- package/.output/public/_nuxt/BT6p4Pgt.js +0 -2
- package/.output/public/_nuxt/BUXSUkJ_.js +0 -1
- package/.output/public/_nuxt/BVf6Yx9V.js +0 -26
- package/.output/public/_nuxt/BbS6Bwby.js +0 -1
- package/.output/public/_nuxt/BeKvLsja.js +0 -2
- package/.output/public/_nuxt/BeUm5UNV.js +0 -1
- package/.output/public/_nuxt/BfV444H3.js +0 -3
- package/.output/public/_nuxt/BjKamgHq.js +0 -1
- package/.output/public/_nuxt/BoJdjCVl.js +0 -4
- package/.output/public/_nuxt/BreO2PiA.js +0 -1
- package/.output/public/_nuxt/BvIDC_R-.js +0 -1
- package/.output/public/_nuxt/ByuJWADR.js +0 -34
- package/.output/public/_nuxt/C1dyLp_j.js +0 -1
- package/.output/public/_nuxt/CAUgpKsF.js +0 -2
- package/.output/public/_nuxt/CL9-VLTJ.js +0 -1
- package/.output/public/_nuxt/CazDIG_m.js +0 -1
- package/.output/public/_nuxt/CdMuck_X.js +0 -1
- package/.output/public/_nuxt/CfROFPse.js +0 -1
- package/.output/public/_nuxt/Cnapl7lZ.js +0 -1
- package/.output/public/_nuxt/CscWZxCi.js +0 -1
- package/.output/public/_nuxt/CuicKV-B.js +0 -34
- package/.output/public/_nuxt/Cyiu1VQD.js +0 -1
- package/.output/public/_nuxt/D6PUPmRC.js +0 -1
- package/.output/public/_nuxt/DCl2yo4g.js +0 -8
- package/.output/public/_nuxt/DHXWp5yD.js +0 -1
- package/.output/public/_nuxt/DHltYerF.js +0 -114
- package/.output/public/_nuxt/DLXydYJb.js +0 -47
- package/.output/public/_nuxt/DRPSi76A.js +0 -1
- package/.output/public/_nuxt/DS53kyHJ.js +0 -1
- package/.output/public/_nuxt/DWhBqv_7.js +0 -1
- package/.output/public/_nuxt/Dd0kK5WH.js +0 -1
- package/.output/public/_nuxt/Dga3Av-m.js +0 -1
- package/.output/public/_nuxt/DgwTpwfB.js +0 -1
- package/.output/public/_nuxt/DkI145a5.js +0 -1
- package/.output/public/_nuxt/DoFBTaDR.js +0 -1
- package/.output/public/_nuxt/Dr_dI5hB.js +0 -1
- package/.output/public/_nuxt/EPZOxdgq.js +0 -1
- package/.output/public/_nuxt/R1nNqTru.js +0 -1
- package/.output/public/_nuxt/builds/meta/7caf3cb3-d272-4dbd-bb3f-1eeb64fab5d1.json +0 -1
- package/.output/public/_nuxt/entry.ChQMshd4.css +0 -1
- package/.output/public/_nuxt/gCELhaU9.js +0 -1
- package/.output/public/_nuxt/ipDzNHcs.js +0 -5
- package/.output/public/_nuxt/qH_j2A3a.js +0 -1
- package/.output/public/_nuxt/r3SBLxtE.js +0 -1
- package/.output/public/_nuxt/rsiRgrVM.js +0 -1
- package/.output/public/_nuxt/swrbBdtB.js +0 -1
- package/.output/public/sw.js +0 -1
- package/.output/public/workbox-2fbc6a65.js +0 -1
- package/.output/server/chunks/build/Alert-Bp1Wz_sq.mjs.map +0 -1
- package/.output/server/chunks/build/Breadcrumb-C9ZPTLym.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-C3y42Vun.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-DNCp9pF-.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-Fr557IbV.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-cVOSIY93.mjs.map +0 -1
- package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-BGwNmJ8J.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-Bdp-OwTN.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-Ji6ADuqF.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-D6xSOrme.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-DV1xwGu4.mjs.map +0 -1
- package/.output/server/chunks/build/EmptyState-DV3oT_xz.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-DeOP13Kr.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-Qpn58Nmr.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-B-GSn_VR.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-YEMWtKu1.mjs.map +0 -1
- package/.output/server/chunks/build/Label-DBvbHd3A.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-C3HG-EYm.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-CfA78Hm1.mjs.map +0 -1
- package/.output/server/chunks/build/PageStateCard-Bwee6JTk.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-9Ia825h8.mjs.map +0 -1
- package/.output/server/chunks/build/RovingFocusItem-CxhHdNGo.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-BpJqLHY9.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-BhmJ_RKM.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-COd9TuDq.mjs.map +0 -1
- package/.output/server/chunks/build/Select-ppPz926C.mjs.map +0 -1
- package/.output/server/chunks/build/Separator-CxZdx8kw.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-DDD4oqys.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-B95Rj237.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-xQQ3_ME1.mjs.map +0 -1
- package/.output/server/chunks/build/Table-CPhhVzDv.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-BV9XqjoO.mjs.map +0 -1
- package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs +0 -47
- package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-DMb-xSJa.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-CEzt76wk.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-DrrqQUVG.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-7vwuDPrZ.mjs.map +0 -1
- package/.output/server/chunks/build/VisuallyHiddenInput-C9eJVpPW.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-B2yirIuA.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-CE0Gso6i.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-bWcP2xFl.mjs.map +0 -1
- package/.output/server/chunks/build/about-CoJjvUwM.mjs.map +0 -1
- package/.output/server/chunks/build/account-Cn-eZqXM.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-aHcD0wyX.mjs.map +0 -1
- package/.output/server/chunks/build/default-BSzdkM_L.mjs.map +0 -1
- package/.output/server/chunks/build/edit-C9Z7oZeu.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-8kznMtBM.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-BqPF4Rxs.mjs.map +0 -1
- package/.output/server/chunks/build/help-content-DmFnuhNu.mjs.map +0 -1
- package/.output/server/chunks/build/index-BR9hw6qk.mjs.map +0 -1
- package/.output/server/chunks/build/index-Ba-Fifra.mjs.map +0 -1
- package/.output/server/chunks/build/index-CULN3-en.mjs.map +0 -1
- package/.output/server/chunks/build/index-DVUtBexc.mjs.map +0 -1
- package/.output/server/chunks/build/isValueEqualOrExist-DBZjbD_3.mjs.map +0 -1
- package/.output/server/chunks/build/login-D2XZDuek.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-_o6cMS6m.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-Dzm9c0u_.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-gpFzIEDj.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-B0wo5R-W.mjs.map +0 -1
- package/.output/server/chunks/build/settings-pNyPBXVa.mjs.map +0 -1
- package/.output/server/chunks/build/storage-XelzuyPy.mjs.map +0 -1
- package/.output/server/chunks/build/tags-DrCQ7QSw.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-pmOxi-AN.mjs.map +0 -1
- package/.output/server/chunks/build/timeout-hygiene-CNs71Iah.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-ZO987RY7.mjs.map +0 -1
- package/.output/server/chunks/build/useCopy-BQQKcwlq.mjs.map +0 -1
- package/.output/server/chunks/build/useFormControl-BLpq1s4O.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-kMZ7Jw5c.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-NjI2seBy.mjs.map +0 -1
- package/.output/server/chunks/build/useTreeViewCookie-DVYpxW-p.mjs.map +0 -1
- package/.output/server/chunks/build/users-NmAUZs3i.mjs.map +0 -1
- package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs.map +0 -1
- package/.output/server/chunks/build/wasted-time-CguAF9zc.mjs.map +0 -1
- /package/.output/public/_nuxt/{PageStateCard.BrM5HWjY.css → useCopyRich.BrM5HWjY.css} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{G as m,a as p}from"./CDk0q2hV.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"./NQikbhmK.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 +1 @@
|
|
|
1
|
-
import{d as l,
|
|
1
|
+
import{d as l,U as o,o as u,f as p,g as d,V as f,W as n,k as i,X as _}from"./NQikbhmK.js";var m=l({__name:"Label",props:{for:{type:String,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"label"}},setup(r){const t=r;return o(),(s,a)=>(u(),p(i(_),n(t,{onMousedown:a[0]||(a[0]=e=>{!e.defaultPrevented&&e.detail>1&&e.preventDefault()})}),{default:d(()=>[f(s.$slots,"default")]),_:3},16))}}),b=m;export{b as L};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as _,o as l,f as p,g as u,j as d,
|
|
1
|
+
import{d as _,o as l,f as p,g as u,j as d,p as f,q as g,k as a,h as o}from"./NQikbhmK.js";import{_ as v}from"./DP8hfJ9h.js";import{g as x}from"./C7P1UCO2.js";const h=_({__name:"EnvManagedBadge",props:{envVars:{},size:{default:"sm"}},setup(r){const s=r,c=o(()=>{switch(s.size){case"xs":return"size-3";case"md":return"size-4";default:return"size-3.5"}}),i=o(()=>{if(!s.envVars?.length)return"Managed by environment variable";const e=s.envVars.map(n=>{const t=x(n).description;return t?`${n} — ${t}`:n});return e.length===1?`Set via ${e[0]}`:["Set via environment variables:",...e].join(`
|
|
2
2
|
`)});return(e,n)=>{const t=f,m=v;return l(),p(m,{text:a(i),ui:{content:"whitespace-pre-line max-w-sm"}},{default:u(()=>[d(t,{name:"i-lucide-lock",class:g(["text-gray-400",a(c)])},null,8,["class"])]),_:1},8,["text"])}}}),b=Object.assign(h,{__name:"EnvManagedBadge"});export{b as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a3 as r,a5 as n,o as p,f as i,g as u,V as c,q as d,k as e,X as f,h as m,a8 as _}from"./NQikbhmK.js";const b={base:"animate-pulse rounded-md bg-elevated"},C={__name:"USkeleton",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(a){const s=r("skeleton",a),t=n(),l=m(()=>_({extend:b,...t.ui?.skeleton||{}}));return(o,g)=>(p(),i(e(f),{as:e(s).as,"aria-busy":"true","aria-label":"loading","aria-live":"polite",role:"alert",class:d(l.value({class:[e(s).ui?.base,e(s).class]}))},{default:u(()=>[c(o.$slots,"default")]),_:3},8,["as","class"]))}};export{C as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h}from"./
|
|
1
|
+
import{h}from"./NQikbhmK.js";function r(s){if(!s.location)return s.title;const o=s.location.match(/^(.*):(\d+):(\d+)$/);return`${o?o[1]:s.location}::${s.title}`}function C(s,o){const c=h(()=>{if(!s.value?.testCases||!o.value?.testCases)return[];const d=new Map;for(const t of s.value.testCases)d.set(r(t),t);const u=[];for(const t of o.value.testCases){const a=d.get(r(t)),l=a?.duration??null,n=t.duration??null;let e=null,f=null;l!==null&&n!==null&&(e=n-l,f=l>0?Math.round((n-l)/l*100):null),u.push({title:t.title,location:t.location??null,statusA:a?.status??null,statusB:t.status,durationA:l,durationB:n,delta:e,percentChange:f})}const i=new Set(o.value.testCases.map(r));for(const t of s.value.testCases)i.has(r(t))||u.push({title:t.title,location:t.location??null,statusA:t.status,statusB:null,durationA:t.duration??null,durationB:null,delta:null,percentChange:null});return u.sort((t,a)=>Math.abs(a.delta??0)-Math.abs(t.delta??0))}),p=h(()=>{let u=0,i=0,t=0,a=0,l=0,n=0;for(const e of c.value)e.statusA==="passed"&&e.statusB==="failed"?a++:e.statusA==="failed"&&e.statusB==="passed"?l++:e.statusA==="failed"&&e.statusB==="failed"&&n++,e.percentChange!==null&&(e.percentChange<-10?u++:e.percentChange>10?i++:t++);return{improved:u,regressed:i,unchanged:t,newFailures:a,recovered:l,stillFailing:n}});return{comparisonData:c,comparisonSummary:p}}export{C as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cd as
|
|
1
|
+
import{cd as L,L as m,ce as z,cf as E,h as d,ab as o,cg as i,ch as q}from"./NQikbhmK.js";function A(t){const s=[o(t.method)?.toUpperCase()||"GET",o(t.baseURL)];for(const e of[t.query||t.params]){const a=o(e);if(!a)continue;const n={};for(const[f,c]of Object.entries(a))n[o(f)]=o(c);s.push(n)}if(t.body){const e=o(t.body);if(!e)s.push(i(e));else if(e instanceof ArrayBuffer)s.push(i(Object.fromEntries([...new Uint8Array(e).entries()].map(([a,n])=>[a,n.toString()]))));else if(e instanceof FormData){const a=[];for(const n of e.entries()){const[f,c]=n;a.push([f,c instanceof File?`${c.name}:${c.size}:${c.lastModified}`:c])}s.push(i(a))}else if(q(e))s.push(i(m(e)));else try{s.push(i(e))}catch{console.warn("[useFetch] Failed to hash body",e)}}return s}const _=L({name:"createUseFetch",factory(t={}){function s(e,a,n){const[f={},c]=typeof a=="string"?[{},a]:[a,n],y=typeof t=="function"?t(f):t,{server:b,lazy:F,default:v,transform:g,pick:w,watch:h,immediate:O,getCachedData:$,deep:D,dedupe:U,timeout:k,...r}={...typeof t=="function"?{}:y,...f,...typeof t=="function"?y:{}},u=d(()=>o(e)),j=d(()=>o(r.key)||"$f"+i([c,typeof u.value=="string"?u.value:"",...A(r)]));if(!r.baseURL&&typeof u.value=="string"&&u.value[0]==="/"&&u.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const l=m({...z,...r,cache:typeof r.cache=="boolean"?void 0:r.cache}),p={server:b,lazy:F,default:v,transform:g,pick:w,immediate:O,getCachedData:$,deep:D,dedupe:U,timeout:k,watch:h===!1?[]:[...h||[],l]};return h===!1&&(p._keyTriggersExecute=!1),E(j,(S,{signal:x})=>(r.$fetch||globalThis.$fetch)(u.value,{signal:x,...l}),p)}return s}}),K=_.__nuxt_factory();_.__nuxt_factory({lazy:!0,_functionName:"useLazyFetch"});export{K as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as As}from"./279D2RYp.js";import{_ as zs}from"./BqV0l12c.js";import{b as je,A as Tt,d as ce,N as Lt,w as be,H as ve,k as e,o as s,f,g as t,j as o,_ as $e,c as r,i as n,m as d,t as i,v as w,F as G,y as oe,p as qe,D as Me,l as W,O as Vt,P as Bt,q as ie,h as L,r as z,J as Us,Q as Kt,n as St,s as we,R as jt,I as Ot,L as Is,u as Ms,a as Fs,e as Es,C as Nt,S as Ps,T as Vs}from"./NQikbhmK.js";import{_ as Bs}from"./B44A4LSJ.js";import{_ as He,a as Ns}from"./C7P1UCO2.js";import{_ as Fe}from"./DS636elg.js";import{_ as qt}from"./B9WhzpKO.js";import{u as Ls}from"./KnfsST6Y.js";import{u as ke}from"./CpjgB2aY.js";import{_ as Ks}from"./BuMC3WjZ.js";import{_ as Os,a as qs}from"./CHEFCN8Q.js";import{_ as Ht}from"./DcmZRa_F.js";import{_ as Qt}from"./ZFiQCMUB.js";import{_ as Ce}from"./DLSrtpsA.js";import{C as Ct,w as Jt,O as lt,a as Gt,_ as Xt,u as Yt}from"./DX-MDGb3.js";import{N as Hs}from"./CGNkHojN.js";import{_ as Qs}from"./BX9ZXe98.js";import{_ as Js}from"./Jo8kRmHz.js";import{_ as Gs}from"./tvgqrYDd.js";import{_ as Wt}from"./DP8hfJ9h.js";import{_ as Xs}from"./BPQoBGg5.js";import{_ as Ys}from"./BSIxhGsh.js";import{_ as Ws}from"./CV9-fTmY.js";import{_ as Zs}from"./BccXfBfI.js";import{_ as Ee}from"./C9_jrmk9.js";import{_ as Qe}from"./eptP4pGv.js";import{_ as wt}from"./DprVVyUQ.js";import{_ as Je}from"./DiOLdHBC.js";import{f as Rt,b as en,c as tn,d as sn,i as V,t as nn,g as Zt,p as rt,j as nt}from"./CDk0q2hV.js";import{_ as es}from"./nv9-6vBK.js";import{_ as it}from"./BPRffDuo.js";import{_ as ct}from"./BxCKKeYs.js";import{_ as an}from"./DiZyJYez.js";import{_ as on}from"./fVcG504p.js";import{_ as ln}from"./ybDYeNxd.js";import{_ as rn,a as cn}from"./Ar3IelOY.js";import{_ as un}from"./BMvCSA6h.js";import{_ as dn}from"./Dnpkl-1q.js";import{_ as mn}from"./eaVkJRSa.js";import{_ as Dt}from"./B3HO8kuh.js";import{M as pn,D as kt,g as $t}from"./D7W_4Sqc.js";import{_ as gn}from"./cHAnlQbv.js";import{u as fn}from"./ClOqkAcc.js";import{u as _n}from"./BCMuIgP5.js";import"./YVN7WG7q.js";import"./BjaRappk.js";import"./Bn0YQDyy.js";import"./g26aVPxc.js";import"./CYsTqbBS.js";import"./CNFYDQmj.js";import"./BYDaY0Z7.js";import"./D-c8ZSws.js";import"./FUXhyidq.js";import"./CylWPruw.js";import"./BeLWlVK0.js";import"./Bti38m-M.js";import"./D0HNloZ9.js";import"./C-elpgyr.js";import"./DEFEpYzn.js";import"./IvQlbZk6.js";const vn=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],at=new Map,ot=new Map;function yn(U,S){const k=[{event:"run.failed",scenario:{title:`Test run failed — ${U}`,description:"3 of 12 tests failed on main — checkout › applies discount code +2 more",icon:"i-lucide-circle-x",color:"error"}},{event:"run.failed.default_branch",scenario:{title:`Test run failed on main — ${U}`,description:"2 of 12 tests failed · main — auth › logs in with valid credentials +1 more",icon:"i-lucide-circle-x",color:"error"}},{event:"cluster.new",scenario:{title:`New failure cluster — ${U}`,description:"TimeoutError: locator.click: Timeout 30000ms exceeded",icon:"i-lucide-layers",color:"warning"}},{event:"flakiness.spike",scenario:{title:`Flakiness spike — ${U}`,description:"3 tests became flaky (8.3% rate)",icon:"i-lucide-shuffle",color:"warning"}},{event:"perf.regression",scenario:{title:`Performance regression — ${U}`,description:"p90 duration increased by 42% vs last week",icon:"i-lucide-trending-down",color:"warning"}},{event:"run.finished",scenario:{title:`Test run recovered — ${U}`,description:"All 12 tests passed on main",icon:"i-lucide-circle-check",color:"success"}},{event:"diagnosis.completed",scenario:{title:`Diagnosis complete — ${U}`,description:"Root cause: test bug — confidence: high",icon:"i-lucide-sparkles",color:"info"}}],D=k.filter(b=>S.length===0||S.includes(b.event)).map(b=>b.scenario);return D.length===0?[k[0].scenario,k[k.length-1].scenario]:D}function hn(){if(!Tt().public.demoMode)return null;const S=je();function k(b,p,c){D(b);const M=yn(p,c);ot.set(b,0);function B(){const A=(ot.get(b)??0)%M.length;ot.set(b,A+1);const y=M[A];S.add({title:y.title,description:y.description,icon:y.icon,color:y.color,duration:7e3});const h=25e3+Math.random()*1e4;at.set(b,setTimeout(B,h))}at.set(b,setTimeout(B,8e3))}function D(b){const p=at.get(b);p!==void 0&&(clearTimeout(p),at.delete(b)),ot.delete(b)}return{scheduleFor:k,cancelFor:D}}const xn={key:0,class:"p-3 space-y-3"},bn={key:0,class:"text-xs text-gray-500"},kn={key:1,class:"text-xs text-gray-500"},$n={key:2,class:"text-xs text-gray-500"},Cn={class:"space-y-1"},Tn=["checked","onChange"],Sn={key:1,class:"p-3 space-y-3"},jn={class:"flex items-center justify-between"},wn={class:"font-medium text-sm inline-flex items-center gap-1"},Rn={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},Dn={key:1,class:"text-xs text-muted text-center py-2"},An={key:2,class:"space-y-1.5"},zn={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},Un={class:"space-y-1"},In=["value"],Mn={class:"flex gap-1.5 justify-end"},Fn={class:"flex-1 font-medium truncate"},En={key:3,class:"text-xs text-muted text-center py-1"},Pn={key:4,class:"space-y-2 border-t border-default pt-2"},Vn={class:"space-y-1"},Bn=["value"],Nn={class:"flex gap-1.5 justify-end"},Ln=ce({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(U){let S,k;const D=U,b=Tt(),p=b.public.demoMode,c=L(()=>b.public.authEnabled),{authState:M}=Lt(),B=L(()=>M.value.authenticated),A=je(),y=z(!1),h=p?hn():null,x=!c.value&&!p?Ls():null,R=z("default"),m=L(()=>"Notification"in window);"Notification"in window&&(R.value=Notification.permission);const _=L(()=>x?.getProject(D.projectId).events??[]),F=L(()=>x?.isSubscribed(D.projectId)??!1);async function K(){!m.value||R.value!=="default"||(R.value=await Notification.requestPermission())}function T(N){return _.value.includes(N)}function g(N){x?.toggleEvent(D.projectId,N)}const $=p||c.value&&B.value,Q=p?{server:!1}:{},{data:j,refresh:H}=([S,k]=be(()=>ke(`/api/subscriptions?projectId=${D.projectId}`,{immediate:$,...Q},"$5zp4moJ-7_")),S=await S,k(),S),P=L(()=>j.value?.subscriptions??[]),ue=L(()=>P.value.length>0),{data:ge}=([S,k]=be(()=>ke("/api/channels",{immediate:$,...Q},"$vFApQ6eA2X")),S=await S,k(),S),v=L(()=>ge.value?.channels??[]),C=z(!1),q=z(void 0),de=z(["run.failed"]),Re=z(!1),me=z(null),ye=z(void 0),pe=z([]),Pe=z(!1);function ee(N){me.value=N,ye.value=N.channel.id,pe.value=[...N.events]}function ut(){me.value=null}async function dt(){if(!(!me.value||!ye.value||pe.value.length===0)){Pe.value=!0;try{await $fetch(`/api/subscriptions/${me.value.id}`,{method:"PATCH",body:{channelId:ye.value,events:pe.value}}),await H(),me.value=null}catch(N){A.add({title:"Update failed",description:String(N?.message??N),color:"error"})}finally{Pe.value=!1}}}const De=L(()=>v.value.map(N=>({label:N.type==="personal_email"?`${N.name} (${N.config.address})`:N.name,value:N.id}))),Ve=vn.map(N=>({label:N.replace(/\./g," › "),value:N}));ve(y,N=>{N?($&&H(),v.value.length>0&&!q.value&&(q.value=v.value[0].id)):(C.value=!1,me.value=null)});async function ae(){if(!(!q.value||de.value.length===0)){Re.value=!0;try{await $fetch("/api/subscriptions",{method:"POST",body:{channelId:q.value,projectId:D.projectId,events:de.value,mode:"realtime"}}),await H(),C.value=!1,A.add({title:"Subscribed",color:"success"}),p&&h?.scheduleFor(D.projectId,D.projectLabel||"this project",de.value)}catch(N){A.add({title:"Subscribe failed",description:String(N?.message??N),color:"error"})}finally{Re.value=!1}}}async function he(N){try{await $fetch(`/api/subscriptions/${N}`,{method:"DELETE"}),await H(),A.add({title:"Unsubscribed",color:"success"}),p&&P.value.length===0&&h?.cancelFor(D.projectId)}catch(I){A.add({title:"Failed",description:String(I?.message??I),color:"error"})}}async function Be(N){const I=N.mutedUntil&&new Date(N.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${N.id}`,{method:"PATCH",body:{mutedUntil:I?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await H()}catch(X){A.add({title:"Failed",description:String(X?.message??X),color:"error"})}}function Ne(N){return N.mutedUntil&&new Date(N.mutedUntil)>new Date}function mt(N){return N==="personal_email"?"i-lucide-user-round":N==="email"?"i-lucide-mail":N==="slack"?"i-lucide-slack":"i-lucide-webhook"}const Le=L(()=>p||c.value&&B.value||x!=null),Ke=L(()=>p||c.value?ue.value:F.value);return(N,I)=>{const X=$e,pt=Bs,Ge=He,Ae=qe,Xe=Me,Ye=Fe,ze=qt,gt=Us;return e(Le)?(s(),f(gt,{key:0,open:e(y),"onUpdate:open":I[6]||(I[6]=O=>W(y)?y.value=O:null),ui:{content:"w-72"}},{content:t(()=>[e(x)?(s(),r("div",xn,[I[9]||(I[9]=n("div",{class:"flex items-center justify-between"},[n("span",{class:"font-medium text-sm"},"Browser notifications")],-1)),e(m)&&e(R)==="default"?(s(),r("p",bn,[o(X,{variant:"link",size:"xs",class:"p-0",onClick:K},{default:t(()=>[...I[7]||(I[7]=[d(" Allow notifications ",-1)])]),_:1}),I[8]||(I[8]=d(" "+i(" ")+"in your browser to get alerts for this project. ",-1))])):e(m)&&e(R)==="denied"?(s(),r("p",kn," Notifications are blocked. Check your browser settings to allow them. ")):e(m)?w("",!0):(s(),r("p",$n,"Notifications are not supported in this browser.")),e(m)&&e(R)==="granted"?(s(),r(G,{key:3},[o(pt),n("div",Cn,[(s(!0),r(G,null,oe(e(Ve),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[n("input",{type:"checkbox",checked:T(O.value),class:"accent-primary size-3",onChange:Y=>g(O.value)},null,40,Tn),d(" "+i(O.label),1)]))),128))])],64)):w("",!0)])):(s(),r("div",Sn,[n("div",jn,[n("span",wn,[I[10]||(I[10]=d(" Notifications ",-1)),o(Ge,{topic:"notifications.subscribe"})]),e(C)?w("",!0):(s(),f(X,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(v).length===0,onClick:I[0]||(I[0]=O=>C.value=!0)},{default:t(()=>[...I[11]||(I[11]=[d(" Add ",-1)])]),_:1},8,["disabled"]))]),e(p)?(s(),r("div",Rn,[o(Ae,{name:"i-lucide-sparkles",class:"size-3 inline-block mr-1 text-primary"}),I[12]||(I[12]=d(" Demo — notifications will appear as toasts in ~8 s. ",-1))])):e(v).length===0?(s(),r("div",Dn,[I[14]||(I[14]=d(" No channels configured.",-1)),I[15]||(I[15]=n("br",null,null,-1)),o(Xe,{to:"/settings/notifications",class:"text-primary underline"},{default:t(()=>[...I[13]||(I[13]=[d("Add one in Settings",-1)])]),_:1})])):w("",!0),e(P).length>0?(s(),r("div",An,[(s(!0),r(G,null,oe(e(P),O=>(s(),r(G,{key:O.id},[e(me)?.id===O.id?(s(),r("div",zn,[o(ze,{label:"Channel",size:"xs"},{default:t(()=>[o(Ye,{modelValue:e(ye),"onUpdate:modelValue":I[1]||(I[1]=Y=>W(ye)?ye.value=Y:null),items:e(De),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),o(ze,{label:"Events",size:"xs"},{default:t(()=>[n("div",Un,[(s(!0),r(G,null,oe(e(Ve),Y=>(s(),r("label",{key:Y.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Vt(n("input",{type:"checkbox",value:Y.value,"onUpdate:modelValue":I[2]||(I[2]=xe=>W(pe)?pe.value=xe:null),class:"accent-primary size-3"},null,8,In),[[Bt,e(pe)]]),d(" "+i(Y.label),1)]))),128))])]),_:1}),n("div",Mn,[o(X,{size:"xs",color:"neutral",variant:"ghost",onClick:ut},{default:t(()=>[...I[16]||(I[16]=[d("Cancel",-1)])]),_:1}),o(X,{size:"xs",color:"primary",loading:e(Pe),disabled:!e(ye)||e(pe).length===0,onClick:dt},{default:t(()=>[...I[17]||(I[17]=[d(" Save ",-1)])]),_:1},8,["loading","disabled"])])])):(s(),r("div",{key:1,class:ie(["flex items-center gap-2 rounded px-2 py-1.5 text-xs",Ne(O)?"opacity-60":""])},[o(Ae,{name:mt(O.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),n("span",Fn,i(O.channel.name),1),o(X,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:Y=>ee(O)},null,8,["onClick"]),o(X,{icon:Ne(O)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:Ne(O)?"Unmute":"Mute 7 days",onClick:Y=>Be(O)},null,8,["icon","title","onClick"]),o(X,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:Y=>he(O.id)},null,8,["onClick"])],2))],64))),128))])):!e(C)&&e(v).length>0?(s(),r("div",En," Not subscribed to this project. ")):w("",!0),e(C)?(s(),r("div",Pn,[o(ze,{label:"Channel",size:"xs"},{default:t(()=>[o(Ye,{modelValue:e(q),"onUpdate:modelValue":I[3]||(I[3]=O=>W(q)?q.value=O:null),items:e(De),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),o(ze,{label:"Events",size:"xs"},{default:t(()=>[n("div",Vn,[(s(!0),r(G,null,oe(e(Ve),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Vt(n("input",{type:"checkbox",value:O.value,"onUpdate:modelValue":I[4]||(I[4]=Y=>W(de)?de.value=Y:null),class:"accent-primary size-3"},null,8,Bn),[[Bt,e(de)]]),d(" "+i(O.label),1)]))),128))])]),_:1}),n("div",Nn,[o(X,{size:"xs",color:"neutral",variant:"ghost",onClick:I[5]||(I[5]=O=>C.value=!1)},{default:t(()=>[...I[18]||(I[18]=[d("Cancel",-1)])]),_:1}),o(X,{size:"xs",color:"primary",loading:e(Re),disabled:!e(q)||e(de).length===0,onClick:ae},{default:t(()=>[...I[19]||(I[19]=[d(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):w("",!0)]))]),default:t(()=>[o(X,{icon:e(Ke)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Ke)?"primary":"neutral",variant:e(Ke)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):w("",!0)}}}),Kn=Object.assign(Ln,{__name:"SubscribeBell"}),On={class:"w-full relative"},qn={key:0},Hn={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Qn={class:"font-semibold mb-1"},Jn={class:"capitalize mb-1"},Gn={class:"space-y-0.5"},Xn={class:"font-medium mt-1"},Yn=ce({__name:"TestRunsChart",props:{testRuns:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:S}){const k=U,D=S,b=L(()=>k.markers),p=L(()=>!k.testRuns||k.testRuns.length===0?[]:[...k.testRuns].sort(($,Q)=>new Date($.startTime).getTime()-new Date(Q.startTime).getTime()).slice(-30).map($=>({id:$.id,date:new Date($.startTime),passed:$.passedTests||0,failed:$.failedTests||0,skipped:$.skippedTests||0,flaky:$.flakyTests||0,total:$.totalTests||0,status:$.status}))),c=g=>g.date,M=g=>g.passed,B=g=>g.failed,A=g=>g.skipped,y=g=>g.flaky,h=["rgb(34, 197, 94)","rgb(239, 68, 68)","rgb(245, 158, 11)","rgb(147, 51, 234)"],x=z(null),{tooltipData:R,tooltipPos:m,markerTooltip:_,markerTooltipPos:F,onRenderComplete:K}=Yt(x,p,{x:g=>g.date,series:[{y:g=>g.passed,color:h[0]},{y:g=>g.failed,color:h[1]},{y:g=>g.skipped,color:h[2]},{y:g=>g.flaky,color:h[3]}],onClick:g=>St(`/test-runs/${g.id}`),markers:b,onMarkerClick:g=>D("marker-click",g.id)}),T=[{color:h[0],label:"Passed"},{color:h[1],label:"Failed"},{color:h[2],label:"Skipped"},{color:h[3],label:"Flaky"}];return(g,$)=>{const Q=Qt,j=Ce,H=Xt;return s(),r("div",On,[e(p).length>0?(s(),r("div",qn,[o(e(Gt),{ref_key:"xyContainerRef",ref:x,data:e(p),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(K)},{default:t(()=>[o(e(Hs),{x:c,y:[M,B,A,y],color:h,"curve-type":e(Ct).MonotoneX},null,8,["y","curve-type"]),o(e(Jt),{x:c,y:[M,B,A,y],color:h,"curve-type":e(Ct).MonotoneX,"line-width":2},null,8,["y","curve-type"]),o(e(lt),{type:"x","tick-format":P=>new Date(P).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),o(e(lt),{type:"y",label:"Tests","tick-format":P=>P.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(R)?(s(),r("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[260px]",style:Kt({left:`${e(m).x}px`,top:`${e(m).y}px`})},[n("div",Hn,[n("div",Qn,i(new Date(e(R).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",Jn,"Status: "+i(e(R).status),1),n("div",Gn,[n("div",null,[$[0]||($[0]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Passed: "+i(e(R).passed),1)]),n("div",null,[$[1]||($[1]=n("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),d(" Failed: "+i(e(R).failed),1)]),n("div",null,[$[2]||($[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" Skipped: "+i(e(R).skipped),1)]),n("div",null,[$[3]||($[3]=n("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),d(" Flaky: "+i(e(R).flaky),1)]),n("div",Xn,"Total: "+i(e(R).total),1)]),$[4]||($[4]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):w("",!0),o(Q,{marker:e(_),pos:e(F)},null,8,["marker","pos"])])):(s(),f(j,{key:1,text:"No test run data available to display chart"})),o(H,{items:T})])}}}),Wn=Object.assign(Yn,{__name:"TestRunsChart"}),Zn={class:"space-y-3"},ea={class:"min-w-0 space-y-1"},ta={class:"flex items-center gap-2 flex-wrap text-sm"},sa={key:0,class:"text-gray-500"},na=["title"],aa=["title"],oa={key:0,class:"text-xs text-gray-500 italic"},la={class:"flex items-center gap-2 shrink-0"},ra=ce({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(U,{emit:S}){const k=U,D=S,b=je(),p=z([]),c=z(null);async function M(){try{p.value=await $fetch(`/api/projects/${k.projectId}/cluster-merge-suggestions`)}catch{p.value=[]}}ve(()=>k.projectId,M,{immediate:!0});async function B(y,h){c.value=y;try{await $fetch(`/api/cluster-merge-suggestions/${y}/${h}`,{method:"POST"}),b.add({title:h==="approve"?"Clusters merged":"Suggestion dismissed",color:"success"}),await M(),h==="approve"&&D("merged")}catch(x){b.add({title:"Action failed",description:String(x?.message??x),color:"error"})}finally{c.value=null}}const A=y=>y==null?"":`${Math.round(y*100)}% similar`;return(y,h)=>{const x=we,R=$e,m=wt;return e(p).length?(s(),f(m,{key:0,icon:"i-lucide-git-merge",title:"Suggested merges",count:e(p).length,class:"mb-4"},{subtitle:t(()=>[...h[0]||(h[0]=[d(" Likely-duplicate clusters found by semantic analysis. Approving merges them into the older cluster. ",-1)])]),default:t(()=>[n("div",Zn,[(s(!0),r(G,null,oe(e(p),_=>(s(),r("div",{key:_.id,class:"rounded-lg border border-default p-3 flex items-start justify-between gap-4"},[n("div",ea,[n("div",ta,[o(x,{color:_.method==="llm"?"primary":"neutral",variant:"subtle",size:"sm"},{default:t(()=>[d(i(_.method==="llm"?`AI · ${_.llmConfidence??""}`:"similarity"),1)]),_:2},1032,["color"]),A(_.score)?(s(),r("span",sa,i(A(_.score)),1)):w("",!0)]),n("p",{class:"text-sm truncate",title:_.clusterA?.signature||""},[h[1]||(h[1]=n("span",{class:"text-gray-400"},"A:",-1)),d(" "+i(_.clusterA?.signature||`#${_.id}`),1)],8,na),n("p",{class:"text-sm truncate",title:_.clusterB?.signature||""},[h[2]||(h[2]=n("span",{class:"text-gray-400"},"B:",-1)),d(" "+i(_.clusterB?.signature||""),1)],8,aa),_.llmReason?(s(),r("p",oa,i(_.llmReason),1)):w("",!0)]),n("div",la,[o(R,{size:"sm",color:"primary",icon:"i-lucide-git-merge",loading:e(c)===_.id,onClick:F=>B(_.id,"approve")},{default:t(()=>[...h[3]||(h[3]=[d(" Merge ",-1)])]),_:1},8,["loading","onClick"]),o(R,{size:"sm",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:e(c)===_.id,onClick:F=>B(_.id,"reject")},{default:t(()=>[...h[4]||(h[4]=[d(" Dismiss ",-1)])]),_:1},8,["disabled","onClick"])])]))),128))])]),_:1},8,["count"])):w("",!0)}}}),ia=Object.assign(ra,{__name:"ClusterMergeSuggestions"}),ca={class:"flex items-center justify-between"},ua={class:"text-sm text-gray-500 inline-flex items-center gap-1"},da={class:"min-w-0 space-y-0.5"},ma={key:0,class:"text-xs text-gray-500 italic truncate"},pa={key:1,class:"text-gray-400 text-xs"},ga={class:"space-y-1"},fa={class:"text-sm tabular-nums"},_a={class:"text-sm tabular-nums"},va={key:1,class:"text-gray-400 text-xs"},ya={class:"text-sm text-gray-500 whitespace-nowrap"},ha={key:0,class:"ml-1 text-xs text-gray-400"},xa={class:"flex justify-end"},ba=ce({__name:"FailureClustersList",props:{projectId:{}},async setup(U){let S,k;const D=U,b=z(void 0),{data:p,pending:c}=([S,k]=be(()=>ke(()=>{const A=new URLSearchParams;b.value&&A.set("status",b.value);const y=A.toString();return`/api/projects/${D.projectId}/failure-clusters${y?`?${y}`:""}`},{lazy:!0,server:!1,watch:[b]},"$f7pDU1t-lL")),S=await S,k(),S),M=A=>sn(A.fixVerification),B=[{accessorKey:"signature",header:V("Signature")},{accessorKey:"errorType",header:V("Type")},{accessorKey:"status",header:V("Status")},{accessorKey:"affectedTests",header:V("Tests")},{accessorKey:"occurrences",header:V("Occurrences")},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"lastSeenAt",header:V("Last seen")},{id:"actions",header:"Actions"}];return(A,y)=>{const h=He,x=Fe,R=Me,m=we,_=qe,F=Wt,K=$e,T=Ee,g=Je,$=Ce,Q=Qe;return s(),f(Q,null,{header:t(()=>[n("div",ca,[n("p",ua,[y[1]||(y[1]=d(" Ongoing failure signatures grouped by normalized error. ",-1)),o(h,{topic:"cluster.concept"})]),o(x,{modelValue:e(b),"onUpdate:modelValue":y[0]||(y[0]=j=>W(b)?b.value=j:null),items:[{label:"All",value:void 0},{label:"Open",value:"open"},{label:"Resolved",value:"resolved"},{label:"Ignored",value:"ignored"}],size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[o(g,{"min-width":"48rem",bleed:!1},{default:t(()=>[o(T,{data:e(p)??[],columns:B,loading:e(c)},{"actions-header":t(()=>[...y[2]||(y[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":t(({row:j})=>[n("div",da,[o(R,{to:`/failure-clusters/${j.original.id}`,class:ie(["text-sm text-primary hover:underline truncate block",j.original.title?"":"font-mono"]),title:j.original.signature},{default:t(()=>[d(i(j.original.title||j.original.signature),1)]),_:2},1032,["to","class","title"]),j.original.triageNote?(s(),r("p",ma,i(j.original.triageNote),1)):w("",!0)])]),"errorType-cell":t(({row:j})=>[j.original.errorType?(s(),f(m,{key:0,color:("clusterErrorTypeColor"in A?A.clusterErrorTypeColor:e(tn))(j.original.errorType),variant:"subtle",size:"sm"},{default:t(()=>[d(i(j.original.errorType),1)]),_:2},1032,["color"])):(s(),r("span",pa,"—"))]),"status-cell":t(({row:j})=>[n("div",ga,[o(m,{color:("clusterStatusColor"in A?A.clusterStatusColor:e(en))(j.original.status),variant:"subtle",size:"sm"},{default:t(()=>[d(i(j.original.status),1)]),_:2},1032,["color"]),M(j.original)?(s(),f(F,{key:0,text:M(j.original).hint},{default:t(()=>[o(m,{color:M(j.original).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[o(_,{name:M(j.original).icon,class:"size-3"},null,8,["name"]),d(" "+i(M(j.original).label),1)]),_:2},1032,["color"])]),_:2},1032,["text"])):w("",!0)])]),"affectedTests-cell":t(({row:j})=>[n("span",fa,i(j.original.affectedTests),1)]),"occurrences-cell":t(({row:j})=>[n("span",_a,i(j.original.occurrences),1)]),"diagnosis-cell":t(({row:j})=>[j.original.diagnosis?.status==="completed"&&j.original.diagnosis.category?(s(),f(m,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[o(_,{name:"i-lucide-sparkles",class:"size-3"}),d(" "+i(j.original.diagnosis.category),1)]),_:2},1024)):(s(),r("span",va,"—"))]),"lastSeenAt-cell":t(({row:j})=>[n("div",ya,[o(R,{to:`/test-runs/${j.original.lastSeenRunId}`,class:"text-primary hover:underline"},{default:t(()=>[d(" run #"+i(j.original.lastSeenRunId),1)]),_:2},1032,["to"]),j.original.lastSeenAt?(s(),r("span",ha," ("+i(("formatRelativeTime"in A?A.formatRelativeTime:e(Rt))(j.original.lastSeenAt))+") ",1)):w("",!0)])]),"actions-cell":t(({row:j})=>[n("div",xa,[o(K,{to:`/failure-clusters/${j.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...y[3]||(y[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(c)&&e(p)&&e(p).length===0?(s(),f($,{key:0,text:"No failure clusters recorded for this project.",padded:!1,class:"py-4"})):w("",!0)]),_:1})}}}),ka=Object.assign(ba,{__name:"FailureClustersList"}),$a={class:"flex items-center justify-between"},Ca={class:"flex items-center gap-3"},Ta={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Sa={class:"flex items-center gap-1.5"},ja={class:"min-w-0 space-y-0.5"},wa={class:"flex items-center gap-2"},Ra={class:"text-sm tabular-nums"},Da={class:"text-sm tabular-nums"},Aa={key:1,class:"text-gray-400 text-xs"},za={key:1,class:"text-gray-400 text-xs"},Ua={key:1,class:"text-gray-400 text-xs"},Ia={key:0,class:"text-sm text-gray-500"},Ma={key:1,class:"text-gray-400 text-xs"},Fa={class:"flex justify-end"},Ea={key:0,class:"text-sm text-gray-500 py-4 text-center"},Pa=ce({__name:"FlakyTestsList",props:{projectId:{},environment:{},projectName:{}},async setup(U){let S,k;const D=U,b=z(50),p=z([]),{data:c,pending:M}=([S,k]=be(()=>ke(()=>{const m=new URLSearchParams({runs:String(b.value)});return D.environment&&m.set("environment",D.environment),`/api/projects/${D.projectId}/flaky-tests?${m.toString()}`},{lazy:!0,server:!1,watch:[b,()=>D.environment]},"$qKoEnbecbI")),S=await S,k(),S),B=L(()=>p.value.length===0?c.value??[]:(c.value??[]).filter(m=>p.value.includes(m.rootCause??"")));function A(m){return m>=60?"error":m>=30?"warning":"neutral"}function y(m){switch(m){case"timing":return"amber";case"network":return"red";case"assertion":return"blue";case"environment":return"purple";default:return"gray"}}function h(m){p.value.indexOf(m)>=0?p.value=p.value.filter(F=>F!==m):p.value=[...p.value,m]}const x=[{label:"Timing",value:"timing"},{label:"Network",value:"network"},{label:"Assertion",value:"assertion"},{label:"Environment",value:"environment"},{label:"Other",value:"other"}],R=[{accessorKey:"title",header:V("Test")},{accessorKey:"impact",header:V("Impact")},{accessorKey:"score",header:V("Score")},{accessorKey:"failureRate",header:V("Failure rate")},{accessorKey:"retryPassRuns",header:V("Retry passes")},{accessorKey:"alternations",header:V("Flips")},{accessorKey:"rootCause",header:"Root cause"},{accessorKey:"lastFlakeAt",header:V("Last flake")},{id:"actions",header:"Actions"}];return(m,_)=>{const F=He,K=qe,T=we,g=$e,$=Fe,Q=Me,j=es,H=it,P=Ht,ue=Ee,ge=Je,v=Qe;return s(),f(v,null,{header:t(()=>[n("div",$a,[n("div",Ca,[n("p",Ta,[_[1]||(_[1]=d(" Tests that fail intermittently — detected by retry passes and status alternations ",-1)),o(F,{topic:"project.flaky-tests"})]),U.environment?(s(),f(T,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[o(K,{name:"i-lucide-layers",class:"size-3"}),d(" "+i(U.environment),1)]),_:1})):w("",!0),n("div",Sa,[(s(),r(G,null,oe(x,C=>o(g,{key:C.value,size:"xs",variant:e(p).includes(C.value)?"solid":"outline",color:(e(p).includes(C.value),"neutral"),onClick:q=>h(C.value)},{default:t(()=>[d(i(C.label),1)]),_:2},1032,["variant","color","onClick"])),64))])]),o($,{modelValue:e(b),"onUpdate:modelValue":_[0]||(_[0]=C=>W(b)?b.value=C:null),items:[{label:"Last 20 runs",value:20},{label:"Last 50 runs",value:50},{label:"Last 100 runs",value:100}],size:"xs",class:"w-36"},null,8,["modelValue"])])]),default:t(()=>[o(ge,{"min-width":"52rem",bleed:!1},{default:t(()=>[o(ue,{data:e(B),columns:R,loading:e(M),sticky:"",class:"max-h-[32rem]"},{"actions-header":t(()=>[..._[2]||(_[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"title-cell":t(({row:C})=>[n("div",ja,[o(Q,{to:`/test-run-cases/${C.original.latestRunsCaseId}`,class:"text-sm font-medium text-primary hover:underline truncate block",title:C.original.title},{default:t(()=>[d(i(C.original.title),1)]),_:2},1032,["to","title"]),o(j,{tags:C.original.tags,meta:{owner:C.original.owner??void 0,priority:("toTestPriority"in m?m.toTestPriority:e(nn))(C.original.priority)},"max-tags":3},null,8,["tags","meta"]),o(H,{"file-path":C.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])])]),"impact-cell":t(({row:C})=>[n("div",wa,[n("span",{class:ie(["inline-block w-2 h-2 rounded-full shrink-0",{"bg-red-500":C.original.wastedCiMinutes>=30,"bg-amber-500":C.original.wastedCiMinutes>=5&&C.original.wastedCiMinutes<30,"bg-green-500":C.original.wastedCiMinutes>=0&&C.original.wastedCiMinutes<5}])},null,2),n("span",Ra,i(Math.round(C.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":t(({row:C})=>[o(T,{color:A(C.original.score),variant:"subtle",size:"sm"},{default:t(()=>[d(i(C.original.score),1)]),_:2},1032,["color"])]),"failureRate-cell":t(({row:C})=>[n("span",Da,i(Math.round(C.original.failureRate*100))+"%",1)]),"retryPassRuns-cell":t(({row:C})=>[C.original.retryPassRuns?(s(),f(T,{key:0,color:"warning",variant:"outline",size:"sm"},{default:t(()=>[d(i(C.original.retryPassRuns)+" run"+i(C.original.retryPassRuns===1?"":"s"),1)]),_:2},1024)):(s(),r("span",Aa,"—"))]),"alternations-cell":t(({row:C})=>[C.original.alternations>=2?(s(),f(T,{key:0,color:"neutral",variant:"outline",size:"sm"},{default:t(()=>[d(i(C.original.alternations),1)]),_:2},1024)):(s(),r("span",za,"—"))]),"rootCause-cell":t(({row:C})=>[C.original.rootCause?(s(),f(P,{key:0,text:C.original.rootCause,color:y(C.original.rootCause)},null,8,["text","color"])):(s(),r("span",Ua,"—"))]),"lastFlakeAt-cell":t(({row:C})=>[C.original.lastFlakeAt?(s(),r("span",Ia,i(("formatRelativeTime"in m?m.formatRelativeTime:e(Rt))(C.original.lastFlakeAt)),1)):(s(),r("span",Ma,"—"))]),"actions-cell":t(({row:C})=>[n("div",Fa,[o(g,{to:`/test-run-cases/${C.original.latestRunsCaseId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[..._[3]||(_[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(M)&&e(B).length===0?(s(),r("p",Ea," No flaky tests detected in the last "+i(e(b))+" runs. ",1)):w("",!0)]),_:1})}}}),Va=Object.assign(Pa,{__name:"FlakyTestsList"}),Ba={class:"w-full relative"},Na={key:0},La={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ka={class:"font-semibold mb-1"},Oa={class:"capitalize mb-1"},qa={class:"space-y-0.5"},Ha={class:"mt-1"},Qa={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},Ja=ce({__name:"PerformanceTrendChart",props:{data:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:S}){const k=U,D=S,b=L(()=>k.markers),p=L(()=>!k.data||k.data.length===0?[]:k.data.map(T=>({id:T.id,date:new Date(T.startTime),duration:T.duration?Math.round(T.duration/1e3):null,avgTestDuration:T.avgTestDuration?Math.round(T.avgTestDuration/1e3):null,p90TestDuration:T.p90TestDuration?Math.round(T.p90TestDuration/1e3):null,commit:T.commit?T.commit.substring(0,7):null,status:T.status,totalTests:T.totalTests}))),c=T=>T.date,M=T=>T.duration??void 0,B=T=>T.avgTestDuration??void 0,A=T=>T.p90TestDuration??void 0,y=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],h=z(null),{tooltipData:x,tooltipPos:R,markerTooltip:m,markerTooltipPos:_,onRenderComplete:F}=Yt(h,p,{x:T=>T.date,series:[{y:T=>T.duration,color:y[0]},{y:T=>T.avgTestDuration,color:y[1]},{y:T=>T.p90TestDuration,color:y[2]}],onClick:T=>St(`/test-runs/${T.id}`),markers:b,onMarkerClick:T=>D("marker-click",T.id)}),K=[{color:y[0],label:"Total Duration"},{color:y[1],label:"Avg Test Duration"},{color:y[2],label:"P90 Test Duration"}];return(T,g)=>{const $=Qt,Q=Ce,j=Xt;return s(),r("div",Ba,[e(p).length>0?(s(),r("div",Na,[o(e(Gt),{ref_key:"xyContainerRef",ref:h,data:e(p),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(F)},{default:t(()=>[o(e(Jt),{x:c,y:[M,B,A],color:y,"curve-type":e(Ct).MonotoneX,"line-width":2},null,8,["y","curve-type"]),o(e(lt),{type:"x","tick-format":H=>new Date(H).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),o(e(lt),{type:"y",label:"Duration (s)","tick-format":H=>`${H}s`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(x)?(s(),r("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[260px]",style:Kt({left:`${e(R).x}px`,top:`${e(R).y}px`})},[n("div",La,[n("div",Ka,i(new Date(e(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",Oa,"Status: "+i(e(x).status),1),n("div",qa,[n("div",null,[g[0]||(g[0]=n("span",{class:"text-blue-500 dark:text-blue-400"},"●",-1)),d(" Total: "+i(e(x).duration??"-")+"s ",1)]),n("div",null,[g[1]||(g[1]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Avg: "+i(e(x).avgTestDuration??"-")+"s ",1)]),n("div",null,[g[2]||(g[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" P90: "+i(e(x).p90TestDuration??"-")+"s ",1)]),n("div",Ha,"Tests: "+i(e(x).totalTests),1),e(x).commit?(s(),r("div",Qa," Commit: "+i(e(x).commit),1)):w("",!0)]),g[3]||(g[3]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):w("",!0),o($,{marker:e(m),pos:e(_)},null,8,["marker","pos"])])):(s(),f(Q,{key:1,text:"No performance data available to display chart"})),o(j,{items:K})])}}}),Ga=Object.assign(Ja,{__name:"PerformanceTrendChart"}),Xa={class:"min-w-0"},Ya={class:"mt-1"},Wa={class:"tabular-nums"},Za={key:0,class:"ml-1 text-xs text-gray-500",title:"timeout ÷ p95"},eo={class:"tabular-nums text-gray-500"},to={key:0,class:"text-sm"},so={key:1,class:"tabular-nums"},no={class:"tabular-nums font-medium text-green-600 dark:text-green-400"},ao={class:"tabular-nums text-gray-500"},oo=ce({__name:"TimeoutOpportunitiesTable",props:{projectId:{},projectName:{}},async setup(U){let S,k;const D=U,{data:b,pending:p}=([S,k]=be(()=>ke(()=>`/api/projects/${D.projectId}/timeout-opportunities`,{lazy:!0,server:!1},"$tMBJjTyDol")),S=await S,k(),S),c=L(()=>b.value??[]);function M(A){return A==null?"—":A<1e3?`${A}ms`:`${(A/1e3).toFixed(1)}s`}const B=[{accessorKey:"title",header:V("Test case")},{accessorKey:"kind",header:"Type"},{accessorKey:"timeout",header:V("Timeout")},{accessorKey:"p95",header:V("p95")},{accessorKey:"recommendedTimeout",header:"Recommendation"},{accessorKey:"estimatedSavingMs",header:V("Est. saving / failure")},{accessorKey:"runCount",header:V("Runs")}];return(A,y)=>{const h=ct,x=Ce,R=Me,m=it,_=we,F=Ee,K=Je,T=Qe;return s(),f(T,null,{header:t(()=>[...y[0]||(y[0]=[n("h2",{class:"text-xl font-semibold"},"Timeout opportunities",-1),n("p",{class:"text-sm text-gray-600 mt-1"},[d(" Tests whose configured timeout far exceeds their real duration, or that still carry a stale "),n("code",{class:"text-xs"},"test.slow()"),d(" mark — tightening these makes failures surface sooner. ")],-1)])]),default:t(()=>[e(p)?(s(),f(h,{key:0})):e(c).length===0?(s(),f(x,{key:1,text:"No timeout opportunities",description:"No oversized timeouts or stale test.slow() marks were found for this project."})):(s(),f(K,{key:2,"min-width":"52rem",bleed:!1},{default:t(()=>[o(F,{data:e(c),columns:B,sticky:"",class:"max-h-[32rem]"},{"title-cell":t(({row:g})=>[n("div",Xa,[o(R,{to:`/test-cases/${g.original.testCaseId}`,class:"font-medium truncate block hover:text-primary hover:underline"},{default:t(()=>[d(i(g.original.title),1)]),_:2},1032,["to"]),n("div",Ya,[o(m,{"file-path":g.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"kind-cell":t(({row:g})=>[o(_,{color:g.original.kind==="oversized-timeout"?"warning":"info",variant:"subtle",size:"sm"},{default:t(()=>[d(i(g.original.kind==="oversized-timeout"?"Oversized timeout":"Stale test.slow()"),1)]),_:2},1032,["color"])]),"timeout-cell":t(({row:g})=>[n("span",Wa,i(M(g.original.timeout)),1),g.original.headroomRatio!=null?(s(),r("span",Za," ("+i(g.original.headroomRatio)+"×) ",1)):w("",!0)]),"p95-cell":t(({row:g})=>[n("span",eo,i(M(g.original.p95)),1)]),"recommendedTimeout-cell":t(({row:g})=>[g.original.kind==="stale-slow"?(s(),r("span",to,[...y[1]||(y[1]=[d("Remove ",-1),n("code",{class:"text-xs"},"test.slow()",-1)])])):(s(),r("span",so,"Lower to ~"+i(M(g.original.recommendedTimeout)),1))]),"estimatedSavingMs-cell":t(({row:g})=>[n("span",no,i(M(g.original.estimatedSavingMs)),1)]),"runCount-cell":t(({row:g})=>[n("span",ao,i(g.original.runCount),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),lo=Object.assign(oo,{__name:"TimeoutOpportunitiesTable"}),ro={class:"flex items-center justify-between"},io={class:"text-sm text-gray-500 inline-flex items-center gap-1"},co={class:"truncate font-mono text-xs"},uo={class:"tabular-nums"},mo={class:"tabular-nums text-gray-500"},po={class:"tabular-nums text-gray-500"},go=ce({__name:"SpecHealthTable",props:{projectId:{}},async setup(U){let S,k;const D=U,b=z(30),{data:p,pending:c}=([S,k]=be(()=>ke(()=>`/api/projects/${D.projectId}/spec-health?days=${b.value}`,{lazy:!0,server:!1,watch:[b]},"$QL0nEFEG1b")),S=await S,k(),S),M=L(()=>p.value?.specs??[]);function B(m){return m>=.9?"bg-green-500":m>=.7?"bg-amber-500":m>0?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function A(m){return m>=.9?"text-green-600 dark:text-green-400":m>=.7?"text-amber-600 dark:text-amber-400":m>0?"text-red-600 dark:text-red-400":"text-gray-500"}function y(m){return`${Math.round(m*100)}%`}function h(m){return m<1e3?`${m}ms`:`${(m/1e3).toFixed(1)}s`}const x=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],R=[{accessorKey:"prefix",header:V("Spec prefix")},{accessorKey:"passRate",header:V("Pass rate")},{accessorKey:"flakyRate",header:V("Flaky")},{accessorKey:"failureCount",header:V("Failures")},{accessorKey:"testCount",header:V("Tests")},{accessorKey:"avgDuration",header:V("Avg time")}];return(m,_)=>{const F=He,K=Fe,T=ct,g=Ce,$=Me,Q=Ee,j=Je,H=Qe;return s(),f(H,null,{header:t(()=>[n("div",ro,[n("p",io,[_[1]||(_[1]=d(" Spec-file health overview — pass rate, flaky rate, and failure count per spec prefix ",-1)),o(F,{topic:"project.spec-health"})]),o(K,{modelValue:e(b),"onUpdate:modelValue":_[0]||(_[0]=P=>W(b)?b.value=P:null),items:x,size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[e(c)?(s(),f(T,{key:0})):e(M).length===0?(s(),f(g,{key:1,text:"No data",description:"No spec health data available for the selected period."})):(s(),f(j,{key:2,"min-width":"46rem",bleed:!1},{default:t(()=>[o(Q,{data:e(M),columns:R,sticky:"",class:"max-h-[32rem]"},{"prefix-cell":t(({row:P})=>[o($,{to:`/projects/${U.projectId}/test-cases?file=${encodeURIComponent(P.original.prefix)}`,class:"flex items-center gap-2 min-w-0 text-primary hover:underline",title:P.original.prefix},{default:t(()=>[n("span",{class:ie(["inline-block size-3 rounded shrink-0",B(P.original.passRate)])},null,2),n("span",co,i(P.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":t(({row:P})=>[n("span",{class:ie(["font-medium tabular-nums",A(P.original.passRate)])},i(y(P.original.passRate)),3)]),"flakyRate-cell":t(({row:P})=>[n("span",uo,i(Math.round(P.original.flakyRate*100))+"%",1)]),"failureCount-cell":t(({row:P})=>[n("span",{class:ie(["tabular-nums",P.original.failureCount>0?"text-red-600 dark:text-red-400":""])},i(P.original.failureCount),3)]),"testCount-cell":t(({row:P})=>[n("span",mo,i(P.original.testCount),1)]),"avgDuration-cell":t(({row:P})=>[n("span",po,i(h(P.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),fo=Object.assign(go,{__name:"SpecHealthTable"}),_o={class:"space-y-6"},vo={class:"w-full text-sm"},yo={class:"px-3 py-2 min-w-0"},ho={class:"text-xs text-muted"},xo={class:"px-3 py-2 text-muted"},bo={class:"px-3 py-2 whitespace-nowrap"},ko={key:1,class:"text-xs text-muted"},$o={key:2,class:"text-xs"},Co={class:"px-3 py-2 whitespace-nowrap text-muted"},To={class:"px-3 py-2 text-right"},So={class:"w-full text-sm"},jo={class:"px-3 py-2 min-w-0"},wo={class:"text-xs text-muted"},Ro={class:"px-3 py-2 text-right whitespace-nowrap"},Do=ce({__name:"QuarantineTable",props:{projectId:{},projectName:{}},async setup(U){let S,k;const D=U,b=je(),p=z(null),{data:c,status:M,error:B,refresh:A}=([S,k]=be(()=>ke(()=>`/api/projects/${D.projectId}/quarantine`,"$9P2J7SsiYf")),S=await S,k(),S);function y(R){const m=Math.round(R/36e5);return m<48?`${Math.max(1,m)}h`:`${Math.round(m/24)}d`}async function h(R,m){p.value=R;try{await $fetch(`/api/projects/${D.projectId}/quarantine`,{method:"POST",body:{testCaseId:R,reason:m,source:"proposed"}}),b.add({title:"Quarantined",color:"success"}),await A()}catch{b.add({title:"Could not quarantine that test",color:"error"})}finally{p.value=null}}async function x(R){p.value=R;try{await $fetch(`/api/projects/${D.projectId}/quarantine/${R}`,{method:"DELETE"}),b.add({title:"Released",color:"success"}),await A()}catch{b.add({title:"Could not release that test",color:"error"})}finally{p.value=null}}return(R,m)=>{const _=ct,F=ln,K=cn,T=rn,g=Ce,$=Me,Q=es,j=it,H=we,P=$e,ue=Je,ge=wt;return s(),r("div",_o,[o(ge,{title:"Quarantine",icon:"i-lucide-shield-alert",count:e(c)?.debt.active,help:"project.quarantine"},{subtitle:t(()=>[...m[0]||(m[0]=[d(" A quarantined test keeps running and keeps reporting — it is excluded from the CI gate's verdict and nothing else. That is what lets it earn its way back out. ",-1)])]),default:t(()=>[e(M)==="pending"?(s(),f(_,{key:0})):e(B)?(s(),f(F,{key:1,text:String(e(B))},null,8,["text"])):(s(),r(G,{key:2},[e(c)&&e(c).debt.active>0?(s(),f(T,{key:0,class:"mb-4"},{default:t(()=>[o(K,{label:"Quarantined",value:e(c).debt.active},null,8,["value"]),o(K,{label:"Ready to release",value:e(c).debt.readyToRelease,"value-class":e(c).debt.readyToRelease>0?"text-green-600 dark:text-green-400":"",hint:"earned their way out"},null,8,["value","value-class"]),o(K,{label:"Still failing",value:e(c).debt.stillFailing,hint:"no passing streak"},null,8,["value"]),o(K,{label:"Oldest",value:y(e(c).debt.oldestAgeMs),size:"sm"},null,8,["value"])]),_:1})):w("",!0),!e(c)||e(c).entries.length===0?(s(),f(g,{key:1,icon:"i-lucide-shield-check",text:"Nothing quarantined. Tests you quarantine appear here with their progress back out."})):(s(),f(ue,{key:2},{default:t(()=>[n("table",vo,[m[2]||(m[2]=n("thead",{class:"text-left text-xs text-muted"},[n("tr",null,[n("th",{class:"px-3 py-2"},"Test"),n("th",{class:"px-3 py-2"},"Reason"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Streak"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Age"),n("th",{class:"px-3 py-2 text-right"},"Actions")])],-1)),n("tbody",null,[(s(!0),r(G,null,oe(e(c).entries,v=>(s(),r("tr",{key:v.id,class:"border-t border-default"},[n("td",yo,[o($,{to:`/test-cases/${v.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(i(v.title),1)]),_:2},1032,["to"]),o(Q,{tags:v.tags,meta:{owner:v.owner??void 0},"max-tags":3,class:"ml-1"},null,8,["tags","meta"]),n("div",ho,[o(j,{"file-path":v.filePath,"project-key":U.projectId,"project-name":U.projectName},null,8,["file-path","project-key","project-name"])])]),n("td",xo,i(v.reason||"—"),1),n("td",bo,[v.releaseProposed?(s(),f(H,{key:0,color:"success",variant:"soft",size:"xs"},{default:t(()=>[d(i(v.consecutivePasses)+" green — ready ",1)]),_:2},1024)):v.runsSinceQuarantine===0?(s(),r("span",ko,"not run yet")):(s(),r("span",$o,i(v.consecutivePasses)+" / "+i(e(c).releaseAfterConsecutivePasses),1))]),n("td",Co,i(y(v.ageMs)),1),n("td",To,[o(P,{size:"xs",color:v.releaseProposed?"primary":"neutral",variant:"soft",loading:e(p)===v.testCaseId,onClick:C=>x(v.testCaseId)},{default:t(()=>[...m[1]||(m[1]=[d(" Release ",-1)])]),_:1},8,["color","loading","onClick"])])]))),128))])])]),_:1}))],64))]),_:1},8,["count"]),e(c)&&e(c).candidates.length>0?(s(),f(ge,{key:0,title:"Worth quarantining",icon:"i-lucide-lightbulb",count:e(c).candidates.length},{subtitle:t(()=>[...m[3]||(m[3]=[d(" Ranked by the CI minutes their flakiness wastes, not by how often they flake — a test that flakes constantly but finishes instantly costs nothing. ",-1)])]),default:t(()=>[o(ue,null,{default:t(()=>[n("table",So,[n("tbody",null,[(s(!0),r(G,null,oe(e(c).candidates,v=>(s(),r("tr",{key:v.testCaseId,class:"border-t border-default"},[n("td",jo,[o($,{to:`/test-cases/${v.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(i(v.title),1)]),_:2},1032,["to"]),n("div",wo,i(v.rationale),1)]),n("td",Ro,[o(P,{size:"xs",color:"neutral",variant:"soft",loading:e(p)===v.testCaseId,onClick:C=>h(v.testCaseId,v.rationale)},{default:t(()=>[...m[4]||(m[4]=[d(" Quarantine ",-1)])]),_:1},8,["loading","onClick"])])]))),128))])])]),_:1})]),_:1},8,["count"])):w("",!0)])}}}),Ao=Object.assign(Do,{__name:"QuarantineTable"}),zo={class:"space-y-4"},Uo={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},Io={id:"marker-environments"},Mo=["value"],Fo=ce({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(U,{emit:S}){const k=U,D=S,b=je(),p=pn.map(h=>({label:h.label,value:h.id,icon:h.icon})),c=Is({label:"",occurredAt:"",category:kt,environment:"",description:""}),M=L(()=>!!k.marker),B=z(!1);function A(h){const x=new Date(h),R=m=>String(m).padStart(2,"0");return`${x.getFullYear()}-${R(x.getMonth()+1)}-${R(x.getDate())}T${R(x.getHours())}:${R(x.getMinutes())}`}ve(()=>k.open,h=>{h&&(k.marker?(c.label=k.marker.label,c.occurredAt=A(k.marker.occurredAt),c.category=k.marker.category||kt,c.environment=k.marker.environment??"",c.description=k.marker.description??""):(c.label="",c.occurredAt=A(new Date),c.category=kt,c.environment="",c.description=""))});async function y(){if(!c.label.trim()){b.add({title:"Label is required",color:"error"});return}if(!c.occurredAt){b.add({title:"Date is required",color:"error"});return}B.value=!0;const h={label:c.label.trim(),occurredAt:new Date(c.occurredAt).toISOString(),category:c.category,environment:c.environment.trim()||null,description:c.description.trim()||null};try{k.marker?(await $fetch(`/api/markers/${k.marker.id}`,{method:"PUT",body:h}),b.add({title:"Marker updated",color:"success"})):(await $fetch(`/api/projects/${k.projectId}/markers`,{method:"POST",body:h}),b.add({title:"Marker created",color:"success"})),D("update:open",!1),D("saved")}catch(x){b.add({title:M.value?"Failed to update marker":"Failed to create marker",description:Zt(x),color:"error"})}finally{B.value=!1}}return(h,x)=>{const R=Ot,m=qt,_=Fe,F=mn,K=$e,T=Dt,g=jt;return s(),f(g,null,{default:t(()=>[o(T,{open:U.open,title:e(M)?"Edit marker":"Add marker","onUpdate:open":x[6]||(x[6]=$=>D("update:open",$))},{body:t(()=>[n("div",zo,[o(m,{label:"Label",name:"label",required:""},{default:t(()=>[o(R,{modelValue:e(c).label,"onUpdate:modelValue":x[0]||(x[0]=$=>e(c).label=$),placeholder:"e.g. Migrated CI to new runners",class:"w-full"},null,8,["modelValue"])]),_:1}),n("div",Uo,[o(m,{label:"Date & time",name:"occurredAt",required:""},{default:t(()=>[o(R,{modelValue:e(c).occurredAt,"onUpdate:modelValue":x[1]||(x[1]=$=>e(c).occurredAt=$),type:"datetime-local",class:"w-full"},null,8,["modelValue"])]),_:1}),o(m,{label:"Category",name:"category"},{default:t(()=>[o(_,{modelValue:e(c).category,"onUpdate:modelValue":x[2]||(x[2]=$=>e(c).category=$),items:e(p),class:"w-full"},null,8,["modelValue","items"])]),_:1})]),o(m,{label:"Environment",name:"environment",help:"Optional. Leave empty to apply to all environments."},{default:t(()=>[o(R,{modelValue:e(c).environment,"onUpdate:modelValue":x[3]||(x[3]=$=>e(c).environment=$),list:"marker-environments",placeholder:"e.g. production",class:"w-full"},null,8,["modelValue"]),n("datalist",Io,[(s(!0),r(G,null,oe(U.environments||[],$=>(s(),r("option",{key:$,value:$},null,8,Mo))),128))])]),_:1}),o(m,{label:"Description",name:"description"},{default:t(()=>[o(F,{modelValue:e(c).description,"onUpdate:modelValue":x[4]||(x[4]=$=>e(c).description=$),rows:3,placeholder:"Optional details",class:"w-full"},null,8,["modelValue"])]),_:1})])]),footer:t(()=>[o(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:x[5]||(x[5]=$=>D("update:open",!1))}),o(K,{label:e(M)?"Save changes":"Add marker",icon:e(M)?"i-lucide-check":"i-lucide-plus",loading:e(B),onClick:y},null,8,["label","icon","loading"])]),_:1},8,["open","title"])]),_:1})}}}),Eo=Object.assign(Fo,{__name:"MarkerFormModal"}),Po={class:"md:hidden space-y-3"},Vo={class:"flex items-start justify-between gap-2"},Bo={key:0,class:"flex gap-1 shrink-0"},No={class:"text-sm text-muted"},Lo={key:0,class:"text-xs"},Ko={key:1,class:"text-sm text-muted"},Oo={class:"whitespace-nowrap"},qo={class:"text-sm"},Ho={class:"text-xs text-muted"},Qo={class:"font-medium flex items-center gap-1"},Jo={key:0,class:"text-xs text-muted line-clamp-1"},Go={key:1,class:"text-xs text-muted"},Xo={key:0,class:"flex gap-1 justify-end"},Yo=ce({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(U,{emit:S}){const k=U,D=S,b=je(),p=L(()=>[...k.markers].sort((_,F)=>+new Date(F.occurredAt)-+new Date(_.occurredAt))),c=[{accessorKey:"occurredAt",header:"When"},{accessorKey:"category",header:"Category"},{accessorKey:"label",header:"Label"},{accessorKey:"environment",header:"Environment"},{accessorKey:"actions",header:""}],M=z(!1),B=z(null);function A(){B.value=null,M.value=!0}function y(_){B.value=_,M.value=!0}ve(()=>k.focusMarkerId,_=>{if(_==null)return;const F=k.markers.find(K=>K.id===_);F&&y(F),D("clear-focus")},{immediate:!0});const h=z(!1),x=z(null);function R(_){x.value=_,h.value=!0}async function m(){const _=x.value;if(h.value=!1,x.value=null,!!_)try{await $fetch(`/api/markers/${_.id}`,{method:"DELETE"}),b.add({title:"Marker deleted",color:"success"}),D("changed")}catch(F){b.add({title:"Failed to delete marker",description:Zt(F),color:"error"})}}return(_,F)=>{const K=$e,T=Ce,g=dn,$=we,Q=qe,j=Ee,H=Eo,P=Dt,ue=jt,ge=wt;return s(),f(ge,{title:"Timeline markers",count:U.markers.length,icon:"i-lucide-milestone",help:"project.timeline",subtitle:"Dated events overlaid on the analytics charts"},{actions:t(()=>[U.canEdit?(s(),f(K,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:A})):w("",!0)]),default:t(()=>[U.markers.length===0?(s(),f(T,{key:0,icon:"i-lucide-milestone",text:"No markers yet. Add a deploy, config change, or incident to see it on the charts."})):(s(),r(G,{key:1},[n("div",Po,[(s(!0),r(G,null,oe(e(p),v=>(s(),r("div",{key:v.id,class:"rounded-lg border border-default p-3 space-y-2"},[n("div",Vo,[o(g,{marker:v},null,8,["marker"]),U.canEdit?(s(),r("div",Bo,[o(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:C=>y(v)},null,8,["onClick"]),o(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:C=>R(v)},null,8,["onClick"])])):w("",!0)]),n("div",No,i(("prettyDateFormat"in _?_.prettyDateFormat:e(rt))(v.occurredAt)),1),v.environment?(s(),r("div",Lo,[o($,{color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(i(v.environment),1)]),_:2},1024)])):w("",!0),v.description?(s(),r("p",Ko,i(v.description),1)):w("",!0)]))),128))]),o(j,{data:e(p),columns:c,class:"hidden md:block"},{"occurredAt-cell":t(({row:v})=>[n("div",Oo,[n("div",qo,i(("prettyDateFormat"in _?_.prettyDateFormat:e(rt))(v.original.occurredAt)),1),n("div",Ho,i(("formatRelativeTime"in _?_.formatRelativeTime:e(Rt))(v.original.occurredAt)),1)])]),"category-cell":t(({row:v})=>[o($,{color:e($t)(v.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[o(Q,{name:e($t)(v.original.category).icon,class:"size-3"},null,8,["name"]),d(" "+i(e($t)(v.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":t(({row:v})=>[n("div",null,[n("div",Qo,[d(i(v.original.label)+" ",1),v.original.source==="auto"?(s(),f(Q,{key:0,name:"i-lucide-sparkles",class:"size-3 text-muted",title:"Automatically detected"})):w("",!0)]),v.original.description?(s(),r("div",Jo,i(v.original.description),1)):w("",!0)])]),"environment-cell":t(({row:v})=>[v.original.environment?(s(),f($,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(i(v.original.environment),1)]),_:2},1024)):(s(),r("span",Go,"All"))]),"actions-cell":t(({row:v})=>[U.canEdit?(s(),r("div",Xo,[o(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:C=>y(v.original)},null,8,["onClick"]),o(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:C=>R(v.original)},null,8,["onClick"])])):w("",!0)]),_:1},8,["data"])],64)),o(H,{open:e(M),"onUpdate:open":F[0]||(F[0]=v=>W(M)?M.value=v:null),"project-id":U.projectId,marker:e(B),environments:U.environments,onSaved:F[1]||(F[1]=v=>D("changed"))},null,8,["open","project-id","marker","environments"]),o(ue,null,{default:t(()=>[o(P,{open:e(h),title:"Delete marker","onUpdate:open":F[3]||(F[3]=v=>h.value=v)},{body:t(()=>[n("p",null,[F[4]||(F[4]=d(" Delete marker ",-1)),e(x)?(s(),f(g,{key:0,marker:e(x),class:"inline-flex align-middle"},null,8,["marker"])):w("",!0),F[5]||(F[5]=d("? This can't be undone. ",-1))])]),footer:t(()=>[o(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:F[2]||(F[2]=v=>h.value=!1)}),o(K,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:m})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),Wo=Object.assign(Yo,{__name:"ProjectTimeline"}),Zo={class:"flex flex-col h-full overflow-y-auto gap-4"},el={key:0,class:"pb-0 space-y-4"},tl={key:0,class:"text-gray-600"},sl={key:1,class:"flex flex-wrap gap-1 mt-2"},nl={class:"flex flex-wrap items-center gap-3 mb-4"},al={class:"inline-flex items-center gap-1"},ol=["onClick"],ll={key:0,class:"flex items-center gap-3 px-3 py-2 mb-3 rounded-lg bg-primary-50 dark:bg-primary-900/20 border border-primary-200 dark:border-primary-800"},rl={class:"text-sm text-primary-700 dark:text-primary-300"},il={key:1,class:"text-xs text-primary-500"},cl=["checked","onClick"],ul={class:"flex items-center gap-2"},dl=["href","onClick"],ml={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},pl={class:"inline-flex items-center gap-1"},gl={key:0,class:"flex items-center gap-1"},fl={class:"text-xs text-gray-600"},_l={key:0,class:"flex items-center gap-1 flex-wrap"},vl={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},yl={key:1,class:"text-xs text-gray-500"},hl={class:"space-y-1"},xl={class:"flex justify-end gap-2"},bl={key:2,class:"text-center py-8 text-gray-500"},kl={class:"text-xs text-gray-400 max-w-sm"},$l={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Cl={class:"flex flex-wrap items-center gap-3"},Tl={class:"text-xl font-semibold inline-flex items-center gap-1"},Sl={class:"font-medium"},jl={class:"mt-1"},wl={key:0,class:"text-red-600 font-medium"},Rl={key:1,class:"text-green-600 font-medium"},Dl={key:2,class:"text-gray-500"},Al={key:2,class:"text-center py-8 text-red-500"},zl={key:3,class:"text-center py-8 text-gray-500"},Ul={class:"flex items-center justify-between"},Il={class:"text-xl font-semibold inline-flex items-center gap-1"},Ml={class:"space-y-4"},Fl={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},El={key:0,class:"text-center py-4 text-gray-500"},Pl={key:1,class:"space-y-4"},Vl={class:"flex gap-4 text-sm"},Bl={key:0,class:"text-gray-400"},Nl={key:0,class:"text-gray-400"},Ll={key:1,class:"text-gray-400"},Kl={key:1,class:"text-gray-400"},Ol={key:0,class:"text-gray-400"},ql={key:0,class:"text-gray-400"},Hl={key:2,class:"text-center py-8 text-gray-500"},Ql={key:3,class:"text-center py-8 text-gray-500"},Jl={class:"flex items-center justify-between"},Gl={class:"text-sm text-gray-600 inline-flex items-center gap-1"},Xl={class:"space-y-4"},Yl={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Wl={key:0,class:"text-center py-8 text-gray-500"},Zl={key:1,class:"space-y-4"},er={class:"space-y-2"},tr={class:"flex flex-wrap gap-4 text-sm"},sr={key:3,class:"text-sm text-gray-500"},nr={class:"flex flex-wrap gap-4 text-sm"},ar={key:0,class:"text-gray-400"},or={key:0,class:"text-gray-400"},lr={key:1,class:"text-gray-400"},rr={key:1,class:"text-gray-400"},ir={key:0,class:"text-gray-400"},cr={key:0,class:"text-gray-400"},ur={key:2,class:"text-center py-8 text-gray-500"},dr={key:3,class:"text-center py-8 text-gray-500"},mr={class:"flex items-center justify-between"},pr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},gr={key:0,class:"space-y-2"},fr={class:"font-medium text-sm"},_r={class:"text-xs text-muted flex items-center gap-2"},vr={key:0,class:"italic"},yr={key:1,class:"text-xs text-muted italic"},hr={key:1,class:"text-center py-8 text-muted text-sm"},xr={class:"space-y-4"},br={class:"text-sm text-gray-600 dark:text-gray-400"},kr={class:"block text-sm font-medium mb-1"},$r={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Di=ce({__name:"index",async setup(U){let S,k;const D=Ms(),b=Fs(),p=D.params.id,{data:c,refresh:M}=([S,k]=be(()=>ke(`/api/projects/${p}`,"$NX9Zy2qnH1")),S=await S,k(),S);Es(L(()=>({title:`${c.value?.label||c.value?.name||"Project"} — Piwi Dashboard`})));const B=je(),A=z(null),y=z(null),{isAdmin:h,isReporter:x}=Lt(),R=Tt(),m=L(()=>!R.public.authEnabled||h.value),_=m,F=z(!1),K=z(""),T=z(!1),g=L(()=>K.value===c.value?.name);async function $(){if(g.value){T.value=!0;try{await $fetch(`/api/projects/${p}`,{method:"DELETE"}),B.add({title:"Project deleted",color:"success"}),await Vs(),await b.push("/")}catch(u){const a=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;B.add({title:"Delete failed",description:a||"An error occurred",color:"error"}),T.value=!1}}}_n(M);async function Q(u){y.value=null,A.value=u;try{await $fetch(`/api/test-runs/${u}`,{method:"DELETE"}),B.add({title:"Test run deleted",color:"success"}),await M()}catch(a){const E=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;B.add({title:"Delete failed",description:E||"An error occurred",color:"error"})}finally{A.value=null}}const j=z([]),H=z([]),P=z([]),ue=L(()=>{const u=new Map(j.value.map(E=>[E.id,E])),a=[];for(const E of H.value){if(E.role==="administrator")continue;const J=u.get(E.id);a.push({id:E.id,username:E.username,name:E.name??null,role:E.role,global:J?.global??!1,hasAccess:!!J})}for(const E of j.value)E.role==="administrator"&&a.push({...E,hasAccess:!0});return a}),ge=L(()=>{const u=j.value.filter(E=>E.role!=="administrator"&&!E.global).map(E=>E.id).sort(),a=[...P.value].sort();return JSON.stringify(u)!==JSON.stringify(a)});ve(()=>c.value?.id,async u=>{if(!(!u||!h.value))try{const[a,E]=await Promise.all([$fetch(`/api/projects/${p}/members`),$fetch("/api/users")]);j.value=a.users,H.value=E.users,P.value=a.users.filter(J=>J.role!=="administrator"&&!J.global).map(J=>J.id)}catch{j.value=[],H.value=[],P.value=[]}},{immediate:!0});function v(u){const a=P.value.indexOf(u);a>=0?P.value.splice(a,1):P.value.push(u)}async function C(){try{await $fetch(`/api/projects/${p}/members`,{method:"PUT",body:{userIds:P.value}}),B.add({title:"Members updated",color:"success"});const u=await $fetch(`/api/projects/${p}/members`);j.value=u.users}catch(u){const a=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;B.add({title:"Update failed",description:a||"An error occurred",color:"error"})}}const q=z("test-runs"),de=z(0),Re=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","quarantine","timeline","members"],me=D.query.tab;typeof me=="string"&&Re.includes(me)&&(q.value=me),ve(q,u=>{D.query.tab!==u&&Re.includes(u)&&b.replace({query:{...D.query,tab:u}})});const ye=L(()=>c.value?.testRuns?.some(u=>u.failedTests>0)??!1),pe=L(()=>[{label:`Test runs (${Le.value.length})`,icon:"i-lucide-play-circle",value:"test-runs",slot:"test-runs"},...ye.value?[{label:"Failure clusters",icon:"i-lucide-layers",value:"failure-clusters",slot:"failure-clusters"}]:[],{label:"Flaky tests",icon:"i-lucide-shuffle",value:"flaky-tests",slot:"flaky-tests"},{label:"Performance",icon:"i-lucide-trending-up",value:"performance",slot:"performance"},{label:`Test cases${O.value!=null?` (${O.value})`:""}`,icon:"i-lucide-list-checks",value:"test-cases",slot:"test-cases"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"},{label:"Spec health",icon:"i-lucide-table-2",value:"spec-health",slot:"spec-health"},{label:"Quarantine",icon:"i-lucide-shield-alert",value:"quarantine",slot:"quarantine"},{label:`Timeline${X.value.length?` (${X.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"},...h.value?[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]:[]]),Pe=L(()=>pe.value.find(u=>u.value===q.value)?.icon),ee=z([]),ut=u=>ee.value.includes(u);function dt(u){const a=ee.value.indexOf(u);if(a>=0)ee.value.splice(a,1);else{if(ee.value.length>=2){B.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}ee.value.push(u)}}const De=z(null);function Ve(){ee.value.length===2&&(De.value=[ee.value[0],ee.value[1]],q.value="compare")}const ae=z([]),he=z(!0),Be=L(()=>{const u=new Set;for(const a of c.value?.testRuns||[])a.environment&&u.add(a.environment);return[...u].sort()});function Ne(u){const a=ae.value.indexOf(u);a===-1?ae.value.push(u):ae.value.splice(a,1)}function mt(u){return ae.value.includes(u)}const Le=L(()=>{let u=c.value?.testRuns||[];return he.value&&(u=u.filter(a=>a.isFullRun!==!1)),ae.value.length===0?u:u.filter(a=>a.environment&&ae.value.includes(a.environment))}),Ke=L(()=>ae.value.length===1?ae.value[0]:void 0),{data:N,refresh:I}=([S,k]=be(()=>ke(`/api/projects/${p}/markers`,{default:()=>({markers:[]})},"$3gm0grYTFL")),S=await S,k(),S),X=L(()=>N.value?.markers??[]),pt=L(()=>!R.public.authEnabled||h.value||x.value),Ge=L(()=>ae.value.length===0?X.value:X.value.filter(u=>u.environment==null||ae.value.includes(u.environment))),Ae=z(null);function Xe(u){Ae.value=u,q.value="timeline"}const Ye=L(()=>{const u=c.value?.testRuns||[];return he.value?u.filter(a=>a.isFullRun!==!1):u});function ze(u){if(u.isFullRun!==!1)return"Full run — the complete test suite ran";const a=[],E=u.filterDetails?.grep?.trim(),J=u.filterDetails?.grepInvert?.trim(),fe=u.filterDetails?.files;return E&&E!==".*"&&a.push(`grep: ${E}`),J&&a.push(`grep-invert: ${J}`),fe?.length&&a.push(`files: ${fe.join(", ")}`),a.length?`Partial run — ${a.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const gt=[{accessorKey:"select",header:""},{accessorKey:"id",header:V("Run")},{accessorKey:"status",header:V("Status")},{accessorKey:"isFullRun",header:"Scope"},{id:"browsers",accessorFn:u=>u.browsers,header:""},{accessorKey:"startTime",header:V("Started")},{accessorKey:"environment",header:V("Environment")},{accessorKey:"metadata",header:"Branch / Commit"},{accessorKey:"duration",header:V("Test status / Dur.")},{accessorKey:"reports",header:"Reports"},{id:"actions",header:"Actions"}],O=z(null),Y=z(""),xe=z(""),ts=L(()=>{const u={};return Y.value&&(u.from=Y.value),xe.value&&(u.to=xe.value),u}),ft=z(null),_t=z(!1),Ue=z(null),vt=z(!1),We=z(!1),ss=L(()=>_t.value&&ft.value===null);ve([q,ts,he],async([u,a])=>{if(u!=="performance")return;_t.value=!0,Ue.value||(We.value=!0);const E=new URLSearchParams(a).toString(),J=he.value?`${E?"&":""}fullRunsOnly=true`:"",fe=E||J?`?${E}${J}`:"";ft.value=await $fetch(`/api/projects/${p}/performance${fe}`).catch(_e=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",_e),null)),_t.value=!1,We.value&&(vt.value=!1,Ue.value=await $fetch(`/api/projects/${p}/slow-tests`).catch(_e=>(vt.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",_e),null)),We.value=!1)},{immediate:!0});const ns=[{accessorKey:"title",header:V("Test case")},{accessorKey:"avgDuration",header:V("Avg duration")},{accessorKey:"maxDuration",header:V("Max")},{accessorKey:"minDuration",header:V("Min")},{accessorKey:"latestDuration",header:V("Latest")},{accessorKey:"trend",header:V("Trend")},{accessorKey:"runCount",header:V("Runs")}];function as(u){const a=rt(u.startTime,{dateOnly:!0}),E=u.metadata?.scm?.commit?` (${u.metadata.scm.commit.substring(0,7)})`:"";return`Run #${u.id} — ${a}${E}`}const re=L(()=>c.value?.testRuns?[...c.value.testRuns].reverse().map(u=>({label:as(u),value:u.id})):[]),te=z(void 0),se=z(void 0),At=L(()=>D.query.runA?Number(D.query.runA):null),zt=L(()=>D.query.runB?Number(D.query.runB):null);ve(re,u=>{if(At.value){const a=u.find(E=>E.value===At.value);a&&(te.value=a)}if(zt.value){const a=u.find(E=>E.value===zt.value);a&&(se.value=a)}},{immediate:!0}),ve(De,u=>{if(u){const a=re.value.find(J=>J.value===u[0]),E=re.value.find(J=>J.value===u[1]);a&&(te.value=a),E&&(se.value=E),De.value=null}});function Ut(){re.value.length>=2&&(te.value=re.value[1],se.value=re.value[0])}const yt=z(null),ht=z(null),Ze=z(!1);async function os(){const u=te.value,a=se.value;if(!(!u?.value&&!a?.value)){Ze.value=!0;try{const E=[];u?.value&&E.push(u.value),a?.value&&E.push(a.value);const J=await Promise.all(E.map(_e=>$fetch(`/api/test-runs/${_e}/summary`))),fe=new Map;for(const _e of J)fe.set(_e.id,_e);yt.value=u?.value?fe.get(u.value)??null:null,ht.value=a?.value?fe.get(a.value)??null:null}catch{yt.value=null,ht.value=null}finally{Ze.value=!1}}}ve([te,se],()=>{os()});const{comparisonData:et,comparisonSummary:Z}=fn(yt,ht),It=[{accessorKey:"title",header:V("Test case")},{accessorKey:"statusA",header:V("Status A")},{accessorKey:"statusB",header:V("Status B")},{accessorKey:"durationA",header:V("Duration A")},{accessorKey:"durationB",header:V("Duration B")},{accessorKey:"delta",header:V("Delta")},{accessorKey:"percentChange",header:V("Change")}];return(u,a)=>{const E=As,J=zs,fe=Kn,_e=Ks,ls=qs,rs=Ht,is=Fe,cs=Wn,Mt=Qs,us=Js,Ie=He,le=$e,ds=Gs,xt=qe,ms=Wt,ps=Xs,ne=we,gs=Ys,Te=Ws,fs=Zs,tt=Ee,_s=Ns,vs=Ce,Oe=Qe,ys=ia,hs=ka,xs=Va,bt=Ot,Ft=ct,bs=Ga,ks=it,$s=lo,st=an,Cs=on,Ts=fo,Ss=Ao,js=un,ws=Wo,Rs=gn,Ds=Os,Et=Dt,Pt=jt;return s(),r(G,null,[o(Ds,{id:"project-detail"},{header:t(()=>[o(ls,null,{leading:t(()=>[o(E),o(J,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(c)?.label||e(c)?.name||"Project"}]},null,8,["items"])]),right:t(()=>[o(_e,{size:"sm",actions:[...e(m)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{K.value="",F.value=!0}}]:[],...e(_)?[{label:"Import",icon:"i-lucide-import",variant:"outline",to:`/projects/${e(p)}/import`}]:[],{label:"Edit",icon:"i-lucide-pencil",variant:"outline",to:`/projects/${e(p)}/edit`},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>e(M)()}]},{leading:t(()=>[o(fe,{"project-id":parseInt(e(p)),"project-label":e(c)?.label||e(c)?.name},null,8,["project-id","project-label"])]),_:1},8,["actions"])]),_:1})]),body:t(()=>[n("div",Zo,[e(c)?.description||e(c)?.tags&&e(c).tags.length>0?(s(),r("div",el,[e(c)?.description?(s(),r("p",tl,i(e(c).description),1)):w("",!0),e(c)?.tags&&e(c).tags.length>0?(s(),r("div",sl,[(s(!0),r(G,null,oe(e(c).tags,l=>(s(),f(rs,{key:l.id,text:l.text,color:l.color},null,8,["text","color"]))),128))])):w("",!0)])):w("",!0),o(is,{modelValue:e(q),"onUpdate:modelValue":a[0]||(a[0]=l=>W(q)?q.value=l:null),items:e(pe),icon:e(Pe),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),o(Rs,{modelValue:e(q),"onUpdate:modelValue":a[14]||(a[14]=l=>W(q)?q.value=l:null),items:e(pe),size:"sm",class:"p-1",ui:{list:"max-sm:hidden overflow-x-auto",trigger:"shrink-0"}},{"test-runs":t(()=>[e(c)?.testRuns&&e(c).testRuns.length>0?(s(),f(Mt,{key:0,title:"Run trend",subtitle:`Test run statistics over time for ${e(c)?.label||e(c)?.name}`,help:"project.runs-trend"},{default:t(()=>[o(cs,{"test-runs":e(Ye),height:200,markers:e(Ge),onMarkerClick:Xe},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):w("",!0),o(Oe,{class:"mt-4"},{default:t(()=>[n("div",nl,[n("div",al,[o(us,{modelValue:e(he),"onUpdate:modelValue":a[1]||(a[1]=l=>W(he)?he.value=l:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),o(Ie,{topic:"project.run-scope"})]),e(Be).length>0?(s(),r(G,{key:0},[a[21]||(a[21]=n("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(s(!0),r(G,null,oe(e(Be),l=>(s(),r("button",{key:l,type:"button",class:ie(["text-xs font-medium px-2 py-1 rounded border cursor-pointer focus:outline-none transition-colors",mt(l)?"bg-blue-100 text-blue-700 border-blue-300 dark:bg-blue-900/40 dark:text-blue-300 dark:border-blue-700":"bg-zinc-100 text-zinc-500 border-zinc-200 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-400 dark:border-zinc-700 dark:hover:bg-zinc-700"]),onClick:Se=>Ne(l)},i(l),11,ol))),128)),e(ae).length>0?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filter",onClick:a[2]||(a[2]=l=>ae.value=[])})):w("",!0)],64)):w("",!0)]),e(ee).length>0?(s(),r("div",ll,[n("span",rl,i(e(ee).length)+" run"+i(e(ee).length>1?"s":"")+" selected ",1),e(ee).length===2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:Ve})):(s(),r("span",il," Select another run to compare ")),o(le,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:a[3]||(a[3]=l=>ee.value=[])})])):w("",!0),e(Le).length>0?(s(),f(tt,{key:1,data:e(Le),columns:gt,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"select-cell":t(({row:l})=>[n("input",{type:"checkbox",checked:ut(l.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Nt(Se=>dt(l.original.id),["stop"])},null,8,cl)]),"id-cell":t(({row:l})=>[n("div",ul,[n("a",{href:`/test-runs/${l.original.id}`,class:"text-primary hover:underline font-medium",onClick:Nt(Se=>("navigateTo"in u?u.navigateTo:e(St))(`/test-runs/${l.original.id}`),["prevent"])}," Run #"+i(l.original.id),9,dl),l.original.label?(s(),r("span",ml,i(l.original.label),1)):w("",!0)])]),"status-cell":t(({row:l})=>[o(ds,{status:l.original.status},null,8,["status"])]),"isFullRun-header":t(()=>[n("span",pl,[a[22]||(a[22]=d("Scope ",-1)),o(Ie,{topic:"run.partial"})])]),"isFullRun-cell":t(({row:l})=>[o(ms,{text:ze(l.original)},{default:t(()=>[o(xt,{name:l.original.isFullRun===!1?"i-lucide-list-filter":"i-lucide-list-checks",class:ie(["size-4 shrink-0 cursor-help",l.original.isFullRun===!1?"text-amber-500":"text-green-500"])},null,8,["name","class"])]),_:2},1032,["text"])]),"browsers-cell":t(({row:l})=>[l.original.browsers?.length?(s(),r("div",gl,[(s(!0),r(G,null,oe(l.original.browsers,Se=>(s(),f(ps,{key:Se,browser:{projectName:Se},size:"sm"},null,8,["browser"]))),128))])):w("",!0)]),"startTime-cell":t(({row:l})=>[n("span",fl,i(("prettyDateFormat"in u?u.prettyDateFormat:e(rt))(l.original.startTime)),1)]),"environment-cell":t(({row:l})=>[l.original.environment?(s(),f(ne,{key:0,color:"info",variant:"subtle",size:"sm"},{default:t(()=>[d(i(l.original.environment),1)]),_:2},1024)):w("",!0)]),"metadata-cell":t(({row:l})=>[l.original.metadata?.scm?(s(),r("div",_l,[l.original.metadata.scm.branch?(s(),r("span",vl,i(l.original.metadata.scm.branch),1)):w("",!0),l.original.metadata.scm.commit?(s(),r("code",yl,i(l.original.metadata.scm.commit.substring(0,7)),1)):w("",!0)])):w("",!0)]),"duration-cell":t(({row:l})=>[n("div",hl,[o(gs,{passed:l.original.passedTests,failed:l.original.failedTests,skipped:l.original.skippedTests,flaky:l.original.flakyTests,"did-not-run":l.original.didNotRunTests??0,total:l.original.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),o(Te,{ms:l.original.duration,class:"text-xs text-gray-500"},null,8,["ms"])])]),"reports-cell":t(({row:l})=>[o(fs,{reports:l.original.reports},null,8,["reports"])]),"actions-header":t(()=>[...a[23]||(a[23]=[n("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":t(({row:l})=>[n("div",xl,[o(le,{to:`/test-runs/${l.original.id}`,size:"sm",variant:"outline"},{default:t(()=>[...a[24]||(a[24]=[d(" View ",-1)])]),_:1},8,["to"]),o(le,{size:"sm",color:"error",variant:"soft",icon:"i-lucide-trash-2",loading:e(A)===l.original.id,onClick:Se=>y.value=l.original.id},{default:t(()=>[...a[25]||(a[25]=[d(" Delete ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data"])):e(c)?.testRuns&&e(c).testRuns.length>0?(s(),r("div",bl," No test runs match the selected environment filter. ")):(s(),f(vs,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:t(()=>[n("p",kl,[a[27]||(a[27]=d(" Point the reporter's ",-1)),a[28]||(a[28]=n("code",{class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},"projectName",-1)),a[29]||(a[29]=d(" at ",-1)),n("code",$l,i(e(c)?.name),1),a[30]||(a[30]=d(" to send results here — see the ",-1)),o(_s,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:t(()=>[...a[26]||(a[26]=[d("reporter docs",-1)])]),_:1}),a[31]||(a[31]=d(" for setup instructions. ",-1))])]),_:1}))]),_:1})]),"failure-clusters":t(()=>[e(q)==="failure-clusters"?(s(),r(G,{key:0},[(s(),f(ys,{key:`sug-${e(de)}`,"project-id":String(e(p)),onMerged:a[4]||(a[4]=l=>de.value++)},null,8,["project-id"])),(s(),f(hs,{key:e(de),"project-id":String(e(p))},null,8,["project-id"]))],64)):w("",!0)]),"flaky-tests":t(()=>[e(q)==="flaky-tests"?(s(),f(xs,{key:0,"project-id":String(e(p)),environment:e(Ke),"project-name":e(c)?.name},null,8,["project-id","environment","project-name"])):w("",!0)]),performance:t(()=>[n("div",Cl,[a[32]||(a[32]=n("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),o(bt,{modelValue:e(Y),"onUpdate:modelValue":a[5]||(a[5]=l=>W(Y)?Y.value=l:null),type:"date",size:"sm",placeholder:"From",class:"w-40"},null,8,["modelValue"]),a[33]||(a[33]=n("span",{class:"text-sm text-muted"},"to",-1)),o(bt,{modelValue:e(xe),"onUpdate:modelValue":a[6]||(a[6]=l=>W(xe)?xe.value=l:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(Y)||e(xe)?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:a[7]||(a[7]=l=>{Y.value="",xe.value=""})})):w("",!0)]),o(Mt,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:t(()=>[e(ss)?(s(),f(Ft,{key:0,text:"Loading chart…"})):(s(),f(bs,{key:1,data:e(ft)||[],height:350,markers:e(Ge),onMarkerClick:Xe},null,8,["data","markers"]))]),_:1}),o(Oe,null,{header:t(()=>[n("h2",Tl,[a[34]||(a[34]=d(" Slowest tests ",-1)),o(Ie,{topic:"project.slowest-tests"})]),a[35]||(a[35]=n("p",{class:"text-sm text-gray-600 mt-1"},"Top 20 slowest test cases across recent runs",-1))]),default:t(()=>[e(We)&&e(Ue)===null?(s(),f(Ft,{key:0,text:"Loading…"})):e(Ue)&&e(Ue).length>0?(s(),f(tt,{key:1,data:e(Ue),columns:ns,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"title-cell":t(({row:l})=>[n("div",null,[n("div",Sl,i(l.original.title),1),n("div",jl,[o(ks,{"file-path":l.original.filePath,"project-key":e(p),"project-name":e(c)?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"trend-cell":t(({row:l})=>[l.original.trend==="slower"?(s(),r("span",wl,"▲ Slower")):l.original.trend==="faster"?(s(),r("span",Rl,"▼ Faster")):(s(),r("span",Dl,"— Stable"))]),_:1},8,["data"])):e(vt)?(s(),r("div",Al," Couldn't load the slowest tests — try refreshing. ")):(s(),r("div",zl,"No slow test data available yet."))]),_:1}),o($s,{"project-id":String(e(p)),"project-name":e(c)?.name},null,8,["project-id","project-name"]),o(Oe,null,{header:t(()=>[n("div",Ul,[n("div",null,[n("h2",Il,[a[36]||(a[36]=d(" Run comparison ",-1)),o(Ie,{topic:"project.run-compare"})]),a[37]||(a[37]=n("p",{class:"text-sm text-gray-600 mt-1"},"Compare duration changes between two runs",-1))]),e(re).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Compare latest vs previous",onClick:Ut})):w("",!0)])]),default:t(()=>[n("div",Ml,[n("div",Fl,[n("div",null,[a[38]||(a[38]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),o(st,{modelValue:e(te),"onUpdate:modelValue":a[8]||(a[8]=l=>W(te)?te.value=l:null),items:e(re),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[a[39]||(a[39]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),o(st,{modelValue:e(se),"onUpdate:modelValue":a[9]||(a[9]=l=>W(se)?se.value=l:null),items:e(re),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Ze)?(s(),r("div",El,[o(xt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),a[40]||(a[40]=d(" Loading run data… ",-1))])):e(te)&&e(se)&&e(et).length>0?(s(),r("div",Pl,[n("div",Vl,[o(ne,{color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).improved)+" improved",1)]),_:1}),o(ne,{color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).regressed)+" regressed",1)]),_:1}),o(ne,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).unchanged)+" unchanged",1)]),_:1})]),o(tt,{data:e(et),columns:It,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(i(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",Bl,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(i(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",Nl,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Te,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",Ll,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Te,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",Kl,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",Ol,"—")):(s(),r("span",{key:1,class:ie(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(i(l.original.delta>0?"+":""),1),o(Te,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",ql,"—")):(s(),r("span",{key:1,class:ie(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},i(l.original.percentChange>0?"+":"")+i(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(s(),r("div",Hl," Select two runs to compare their performance. ")):(s(),r("div",Ql," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":t(()=>[o(Cs,{"project-id":e(p),"project-name":e(c)?.name,"sync-query":"",onTotal:a[10]||(a[10]=l=>O.value=l)},null,8,["project-id","project-name"])]),compare:t(()=>[o(Oe,null,{header:t(()=>[n("div",Jl,[n("p",Gl,[a[41]||(a[41]=d(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),o(Ie,{topic:"project.compare"})]),e(re).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Latest vs previous",onClick:Ut})):w("",!0)])]),default:t(()=>[n("div",Xl,[n("div",Yl,[n("div",null,[a[42]||(a[42]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),o(st,{modelValue:e(te),"onUpdate:modelValue":a[11]||(a[11]=l=>W(te)?te.value=l:null),items:e(re),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[a[43]||(a[43]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),o(st,{modelValue:e(se),"onUpdate:modelValue":a[12]||(a[12]=l=>W(se)?se.value=l:null),items:e(re),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(Ze)?(s(),r("div",Wl,[o(xt,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),a[44]||(a[44]=d(" Loading run data… ",-1))])):e(te)&&e(se)&&e(et).length>0?(s(),r("div",Zl,[n("div",er,[n("div",tr,[a[45]||(a[45]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(Z).newFailures>0?(s(),f(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).newFailures)+" new failure"+i(e(Z).newFailures>1?"s":""),1)]),_:1})):w("",!0),e(Z).recovered>0?(s(),f(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).recovered)+" recovered ",1)]),_:1})):w("",!0),e(Z).stillFailing>0?(s(),f(ne,{key:2,color:"warning",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).stillFailing)+" still failing ",1)]),_:1})):w("",!0),e(Z).newFailures===0&&e(Z).recovered===0&&e(Z).stillFailing===0?(s(),r("span",sr,"No status changes")):w("",!0)]),n("div",nr,[a[46]||(a[46]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(Z).regressed>0?(s(),f(ne,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).regressed)+" regressed ",1)]),_:1})):w("",!0),e(Z).improved>0?(s(),f(ne,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).improved)+" improved ",1)]),_:1})):w("",!0),o(ne,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(i(e(Z).unchanged)+" unchanged ",1)]),_:1})])]),o(tt,{data:e(et),columns:It,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(i(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",ar,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(ne,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(nt))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(i(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",or,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Te,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",lr,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Te,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",rr,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",ir,"—")):(s(),r("span",{key:1,class:ie(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(i(l.original.delta>0?"+":""),1),o(Te,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",cr,"—")):(s(),r("span",{key:1,class:ie(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},i(l.original.percentChange>0?"+":"")+i(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(te)||!e(se)?(s(),r("div",ur," Select two runs to compare test results. ")):(s(),r("div",dr," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":t(()=>[o(Ts,{"project-id":String(e(p))},null,8,["project-id"])]),quarantine:t(()=>[o(Ss,{"project-id":String(e(p)),"project-name":e(c)?.name},null,8,["project-id","project-name"])]),members:t(()=>[o(Oe,null,{header:t(()=>[n("div",mr,[n("p",pr,[a[47]||(a[47]=d(" Users with access to this project ",-1)),o(Ie,{topic:"project.members"})]),o(le,{label:"Save changes",icon:"i-lucide-check",size:"sm",disabled:!e(ge),onClick:C},null,8,["disabled"])])]),default:t(()=>[e(ue).length>0?(s(),r("div",gr,[(s(!0),r(G,null,oe(e(ue),l=>(s(),r("div",{key:l.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[n("div",null,[n("div",fr,i(l.name||l.username),1),n("div",_r,[n("span",null,"@"+i(l.username),1),o(ne,{color:l.role==="administrator"?"primary":l.role==="reporter"?"info":"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(i(l.role),1)]),_:2},1032,["color"]),l.global?(s(),r("span",vr,"Global access")):w("",!0)])]),l.role!=="administrator"?(s(),f(js,{key:0,"model-value":e(P).includes(l.id),disabled:l.global,title:l.global?"Has global access — remove global assignment first":"",onChange:Se=>v(l.id)},null,8,["model-value","disabled","title","onChange"])):(s(),r("span",yr,"Admin"))]))),128))])):(s(),r("div",hr,"Loading members…"))]),_:1})]),timeline:t(()=>[o(ws,{"project-id":Number(e(p)),markers:e(X),environments:e(Be),"can-edit":e(pt),"focus-marker-id":e(Ae),onChanged:e(I),onClearFocus:a[13]||(a[13]=l=>Ae.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),o(Pt,null,{default:t(()=>[o(Et,{open:e(F),title:"Delete project","onUpdate:open":a[17]||(a[17]=l=>{l||(F.value=!1)})},{body:t(()=>[n("div",xr,[n("p",br,[a[48]||(a[48]=d(" This will permanently delete ",-1)),n("strong",null,i(e(c)?.label||e(c)?.name),1),a[49]||(a[49]=d(" and all its test runs, reports, traces, and failure clusters. This action cannot be undone. ",-1))]),n("div",null,[n("label",kr,[a[50]||(a[50]=d(" Type the project key ",-1)),n("code",$r,i(e(c)?.name),1),a[51]||(a[51]=d(" to confirm: ",-1))]),o(bt,{modelValue:e(K),"onUpdate:modelValue":a[15]||(a[15]=l=>W(K)?K.value=l:null),placeholder:e(c)?.name,autofocus:"",onKeydown:Ps($,["enter"])},null,8,["modelValue","placeholder"])])])]),footer:t(()=>[o(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[16]||(a[16]=l=>F.value=!1)}),o(le,{color:"error",label:"Delete project",icon:"i-lucide-trash-2",disabled:!e(g),loading:e(T),onClick:$},null,8,["disabled","loading"])]),_:1},8,["open"])]),_:1}),o(Pt,null,{default:t(()=>[o(Et,{open:e(y)!==null,title:"Delete test run","onUpdate:open":a[20]||(a[20]=l=>{l||(y.value=null)})},{body:t(()=>[n("p",null,[a[52]||(a[52]=d(" Are you sure you want to delete ",-1)),n("strong",null,"Run #"+i(e(y)),1),a[53]||(a[53]=d("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:t(()=>[o(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[18]||(a[18]=l=>y.value=null)}),o(le,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(A)===e(y),onClick:a[19]||(a[19]=l=>Q(e(y)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Di as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u}from"./CHNwfU1y.js";import{b as l,ax as f}from"./NQikbhmK.js";import{g as w}from"./CDk0q2hV.js";function p(a){let r="";for(let o=0;o<a.length;o+=32768)r+=String.fromCharCode(...a.subarray(o,o+32768));return btoa(r)}function y(){const a=u(),r=l();async function e(o,i,n={}){const s=f();if(!s){window.open(o,"_blank");return}try{const t=await fetch(o,{credentials:"include"});if(!t.ok)throw new Error(`Request failed (${t.status})`);const c=n.binary?p(new Uint8Array(await t.arrayBuffer())):await t.text(),d=await s.invoke("desktop_save_download",{filename:i,contents:c,encoding:n.binary?"base64":"utf8"});r.add({title:"Saved to Downloads",description:d,color:"success",icon:"i-lucide-download"})}catch(t){r.add({title:"Download failed",description:w(t),color:"error"})}}return{isDesktop:a,download:e}}export{y as u};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{_ as $,a as G}from"./CHEFCN8Q.js";import{_ as F}from"./D0HNloZ9.js";import{d as H,w as W,e as V,f as k,g as o,A as Y,o as n,i as t,k as r,v as j,j as i,c as a,t as m,_ as J,m as s,F as g,y as K,p as Q,h as d}from"./NQikbhmK.js";import{_ as X}from"./rWNTSFD6.js";import{_ as Z}from"./cHAnlQbv.js";import{_ as ee}from"./DprVVyUQ.js";import{u as te}from"./CHNwfU1y.js";import{u as se}from"./Bn0YQDyy.js";import{u as re}from"./CpjgB2aY.js";import"./YVN7WG7q.js";import"./CDk0q2hV.js";import"./IvQlbZk6.js";import"./C7P1UCO2.js";import"./BjaRappk.js";import"./eptP4pGv.js";const ie=[{name:"list_projects",description:"List all projects with stats: total runs, test cases, latest run status and branch. Use this first to discover available projects and their IDs.",inputSchema:{type:"object",properties:{}}},{name:"get_project",description:"Get project details and its recent test runs with pass/fail counts. Results are paginated — use pageSize and cursor for the runs list.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Project ID from list_projects"},pageSize:{type:"number",description:"Runs per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of runs"}},required:["id"]}},{name:"list_runs",description:"List test runs for a project with filters.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["passed","failed","running","initialising","aborted"],description:"Filter by status"},branch:{type:"string",description:"Filter by branch name (exact match against SCM metadata)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_run",description:"Get a test run summary plus its test cases (paginated), with status, truncated error text, and failure cluster IDs. Filter by status and page with pageSize/cursor.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"},status_filter:{type:"string",enum:["failed","flaky","all"],description:'Which test cases to include (default: "failed" — only failed+timedOut; "flaky" — only flaky; "all" — every case)'},pageSize:{type:"number",description:"Cases per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response for the next page of cases"}},required:["id"]}},{name:"list_failed_cases",description:"List failed and timed-out test cases across recent runs for a project.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"},runId:{type:"number",description:"Optional: restrict to a specific run"}},required:["projectId"]}},{name:"list_flaky_tests",description:"List flaky tests for a project with flakiness scores.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Number of recent runs to analyze (default 50, max 200)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response. Cursor is the flakyScore value (descending)."}},required:["projectId"]}},{name:"get_test_case",description:"Get test case details including aggregated pass/fail stats, flakiness metrics, and recent executions (paginated). Use testCaseId (stable identity), not the per-run caseId.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test case ID (testCaseId from list_failed_cases or list_flaky_tests)"},pageSize:{type:"number",description:"Executions per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of executions"}},required:["id"]}},{name:"list_clusters",description:"List failure clusters for a project. Each cluster groups similar failures by error fingerprint.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"Filter by triage status (default: all statuses)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_cluster",description:"Get full details for a failure cluster including all affected test cases, a compact diagnosis summary, and locator healing suggestions for up to 5 affected cases. Each healing entry includes the failing locator, the recommended fix, and the number of alternatives available. Use get_cluster_diagnosis for the full diagnosis text, or get_cluster_context for the raw AI evidence.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID from list_clusters"}},required:["id"]}},{name:"get_fix_plan",description:"Everything needed to fix one failure cluster, in a single answer: the diagnosis and its validated patch, ranked locator replacements with the exact file and line to edit, the failing tests, the owning team, and the command that verifies the work. `verify.expectation` states what the dashboard records once those tests pass, so you can confirm the fix landed rather than guessing. Prefer this over assembling get_cluster + get_cluster_diagnosis + get_locator_healing yourself.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID from list_clusters or list_open_clusters"}},required:["clusterId"]}},{name:"get_cluster_diagnosis",description:"Get the stored AI diagnosis for a failure cluster. Returns category, confidence, root cause, evidence, and suggested fix. Returns null if no diagnosis has been run yet.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"}},required:["id"]}},{name:"get_test_case_context",description:"Get the AI evidence context for a specific test-run-case (execution scope). Use this when debugging a single test failure — it provides the execution-scoped evidence including steps, console, network, and SCM diff.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run case ID"}},required:["id"]}},{name:"get_case_screenshots",description:"Get screenshots for a test-run-case. By default returns metadata only (name, type, size). Set content=true to include base64-encoded image data (max 3, capped at ~100 KB each). Call metadata-only first to discover what exists, then request content for the ones you need.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID"},content:{type:"boolean",description:"Include base64 image data (default false — metadata only)"}},required:["testRunsCaseId"]}},{name:"get_cluster_context",description:"Get the full AI evidence context for a failure cluster — the same data sent to the diagnosis AI. Includes error samples, stack traces, test steps, console logs, network failures, ARIA snapshots, SCM diff (changed files since last green run), and a per-section breakdown with char counts and truncation flags. This is the richest available evidence for debugging a failure.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},baseCommit:{type:"string",description:"Optional: override the baseline commit SHA for SCM diff comparison"},selectedCommitShas:{type:"array",items:{type:"string"},description:"Optional: specific commit SHAs to include in the diff context (max 10)"}},required:["id"]}},{name:"search_test_cases",description:"Search test cases by title or file path within a project. Accepts a free-text query and returns matching test cases with basic stats. Use this to find a test case when you don't know its ID.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},q:{type:"string",description:"Search query — matched against title and file path (case-insensitive)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId","q"]}},{name:"get_test_run_case",description:"Get a single test-run-case execution record with full (untruncated) error text plus steps, console logs, web vitals, and ARIA snapshot. Use include to fetch only the blobs you need. The ID is the executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run case ID (executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases)"},include:{type:"array",items:{type:"string",enum:["steps","console","webVitals","aria","source"]},description:"Optional: which heavy blobs to include (default: all). The error, status, and summary are always returned."}},required:["id"]}},{name:"list_recent_activity",description:"List the most recent test runs across all projects. No projectId required — returns a cross-project view of recent CI activity. Paginated by startTime descending.",inputSchema:{type:"object",properties:{pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_repo_commits",description:"List recent commits for a project's repository. Requires SCM token configuration (per-project or global). Returns commit details (SHA, message, author, date).",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},branch:{type:"string",description:"Branch name (default: repository default branch)"},limit:{type:"number",description:"Max commits (default 20, max 100)"}},required:["projectId"]}},{name:"get_repo_diff",description:"Get the diff (changed files with patches) for a single commit in a project's repository. Requires SCM token configuration (per-project or global). Useful for inspecting what code changed in a specific commit suspected of causing a failure.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},sha:{type:"string",description:"Full commit SHA"}},required:["projectId","sha"]}},{name:"get_run_insights",description:'Compare a run to its last green baseline: pass-rate delta, new regressions, recurrences, recovered tests, new flaky tests, biggest perf improvements/regressions, worker imbalance, and newly opened clusters. Use this to answer "what changed?" and "did my fix work?".',inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"}},required:["id"]}},{name:"get_spec_health",description:"Per-spec-file health for a project: pass rate, flaky rate, failure count, test count, and average duration grouped by spec-file prefix over the last N days. Use to find which areas of the suite are unhealthy.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},days:{type:"number",description:"Lookback window in days (default 30, max 90)"}},required:["projectId"]}},{name:"get_slow_tests",description:"Slowest test cases in a project by average duration, with max/min and trend direction across recent runs. Use to target performance work.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Recent runs to analyze (default 50, max 100)"}},required:["projectId"]}},{name:"get_performance_trend",description:'Time series of run duration, average test duration, and p90 test duration for a project. Use to answer "is the suite getting slower?".',inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},limit:{type:"number",description:"Number of recent runs (default 30, max 100)"}},required:["projectId"]}},{name:"get_test_stability_trend",description:'Time-series stability for a single test case: flaky rate, pass rate, and average duration bucketed over its recent execution history. Use to answer "is this test getting flakier?".',inputSchema:{type:"object",properties:{id:{type:"number",description:"Test case ID (stable testCaseId)"},buckets:{type:"number",description:"Number of time buckets (default 20, 5–50)"}},required:["id"]}},{name:"get_network_requests",description:"A run's network requests aggregated by method + normalized route, sorted by average duration, with status codes and captured backend server logs. Use to pin a UI failure on a slow or failing endpoint.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"}},required:["id"]}},{name:"get_failure_groups",description:"One run's failures grouped by failure cluster, with per-group affected cases and worker correlation. Run-scoped counterpart to list_clusters.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"}},required:["id"]}},{name:"get_locator_healing",description:"Ranked alternative locators for a failing test-run-case: the failing locator, the recommended durable fix, and the full alternative lists (from prior success, element match, and ARIA snapshot). Use when fixing a broken selector.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID (executionId)"}},required:["testRunsCaseId"]}},{name:"search",description:"Global search across all in-scope projects, runs (by label or numeric id), and test cases (by title). Use to find a run by its label or locate an entity across projects.",inputSchema:{type:"object",properties:{q:{type:"string",description:"Search query (min 2 chars)"}},required:["q"]}},{name:"list_case_traces",description:"List Playwright trace files for a test-run-case, with a download path for each. Fetch the bytes via GET /api/files/<path>.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID (executionId)"}},required:["testRunsCaseId"]}},{name:"list_links",description:"List external entity links (Jira, GitHub PR/issue, etc.) attached to a run, test-run-case, or test case, with provider and unfurled status.",inputSchema:{type:"object",properties:{entityType:{type:"string",enum:["test_run","test_runs_case","test_case"],description:"Which entity the links are attached to"},id:{type:"number",description:"The entity ID matching entityType"}},required:["entityType","id"]}},{name:"list_tags",description:"List the project tag catalog (id, text, color).",inputSchema:{type:"object",properties:{}}},{name:"get_project_test_catalog",description:"The full test-case catalog for a project with aggregated pass/fail/flaky counts, average duration, and last status per test. Offset-paginated bulk companion to get_test_case.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},offset:{type:"number",description:"Row offset for paging (default 0)"},query:{type:"string",description:"Optional case-insensitive substring filter on title or file path"},tags:{type:"string",description:"Comma-separated tags; a test must carry every one of them. A leading @ is optional."},owner:{type:"string",description:"Exact owner declared via the piwi:owner annotation"},priority:{type:"string",enum:["critical","high","medium","low"],description:"Priority declared via the piwi:priority annotation"}},required:["projectId"]}},{name:"list_open_clusters",description:"Open failure clusters across all in-scope projects, ranked by occurrences — a cross-project triage queue. Filter by status; paginate with pageSize/cursor.",inputSchema:{type:"object",properties:{status:{type:"string",enum:["open","resolved","ignored"],description:"Triage status (default: open)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_instance_stats",description:"Instance-wide counts (projects, runs, test cases, executions, files) and total storage size. Admin only.",inputSchema:{type:"object",properties:{}}},{name:"explain_failure",description:"One-call evidence bundle for a single failing execution: error, steps, console, ARIA snapshot, the recommended locator fix, a screenshot count, and the AI diagnosis context. Prefer this over chaining get_test_run_case + get_locator_healing + get_test_case_context.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID (executionId)"}},required:["testRunsCaseId"]}},{name:"set_cluster_status",description:"Triage a failure cluster: set its status to open, resolved, or ignored with an optional note. Requires reporter or admin access. Use after fixing the underlying issue.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"New triage status"},triageNote:{type:"string",description:"Optional note explaining the status change"}},required:["id","status"]}},{name:"set_cluster_base_commit",description:'Pin the baseline commit SHA a cluster uses for its SCM-diff diagnosis context, so "what changed since green" is accurate. Requires reporter or admin access.',inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},commit:{type:"string",description:"Baseline commit SHA (empty to clear)"}},required:["id","commit"]}},{name:"submit_diagnosis_feedback",description:"Record thumbs up/down feedback on a stored diagnosis, with an optional note. Requires reporter or admin access.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Diagnosis ID"},feedback:{type:"string",enum:["up","down"],description:"Rating (omit to clear)"},feedbackNote:{type:"string",description:"Optional note"}},required:["id"]}},{name:"run_cluster_diagnosis",description:"Trigger an AI diagnosis for a failure cluster and return the result (category, confidence, root cause, suggested fix). Returns the existing completed diagnosis unless force is set. Requires reporter or admin access and a configured AI provider.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},force:{type:"boolean",description:"Re-run even if a completed diagnosis exists (default false)"},baseCommit:{type:"string",description:"Optional baseline commit SHA for SCM-diff context"}},required:["id"]}}];function oe(S){return new URL(globalThis.location.href)}const ne={class:"max-w-3xl mx-auto p-6 space-y-6"},ae={key:0,class:"mb-4 space-y-3 rounded-md border border-default bg-elevated/50 p-3"},ce={class:"space-y-1"},pe={class:"flex items-start gap-2"},de={class:"text-xs break-all flex-1"},ue={class:"space-y-1"},le={class:"flex items-start gap-2"},me={class:"text-xs break-all flex-1"},ge={class:"text-sm text-gray-500 dark:text-gray-400 mb-4"},fe={class:"space-y-3"},ye={class:"space-y-3"},he={class:"space-y-3"},be={class:"space-y-3"},xe={class:"space-y-3"},_e={class:"space-y-3"},ve={class:"flex flex-col gap-1.5"},Ie={class:"min-w-0"},we={class:"text-sm font-mono font-semibold text-foreground"},ke={class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},je={class:"space-y-3 text-sm text-gray-600 dark:text-gray-400"},Se={key:0},Ce={key:1},qe={key:2,class:"text-xs text-gray-400"},Re={key:3,class:"text-xs text-gray-400"},Ae={class:"space-y-2"},Pe={class:"flex items-center gap-2"},De={class:"flex-1 px-3 py-2 bg-muted rounded-md text-sm font-mono break-all"},Te={class:"text-xs text-gray-400"},Ue="pd_YOUR_API_KEY",Ke=H({__name:"mcp",async setup(S){let f,_;const v=Y(),I=v.public.demoMode,y=te(),{copy:w}=se(),{data:h}=([f,_]=W(()=>re("/api/desktop/reporter-config",{immediate:y,default:()=>null},"$fdl6kilREP")),f=await f,_(),f),p=d(()=>h.value?.token??Ue),C=oe(),c=d(()=>`${h.value?.url??v.public.siteUrl??C.origin}/mcp`);V({title:"MCP server — Piwi Dashboard"});const q=ie,R=[{label:"Claude Code",slot:"claude-code"},{label:"Cursor",slot:"cursor"},{label:"VS Code",slot:"vscode"},{label:"Claude Desktop",slot:"claude-desktop"},{label:"Gemini CLI",slot:"gemini"},{label:"Windsurf / Continue",slot:"windsurf"}],A=d(()=>`claude mcp add --transport http piwi ${c.value} \\
|
|
2
|
+
--header "Authorization: Bearer ${p.value}"`),P=d(()=>JSON.stringify({mcpServers:{piwi:{url:c.value,headers:{Authorization:`Bearer ${p.value}`}}}},null,2)),D=d(()=>JSON.stringify({servers:{piwi:{type:"http",url:c.value,headers:{Authorization:`Bearer ${p.value}`}}}},null,2)),T=d(()=>JSON.stringify({mcpServers:{piwi:{type:"http",url:c.value,headers:{Authorization:`Bearer ${p.value}`}}}},null,2)),U=d(()=>`gemini mcp add --transport http piwi ${c.value} \\
|
|
3
|
+
--header "Authorization: Bearer ${p.value}"`),O=d(()=>JSON.stringify({mcpServers:{piwi:{serverUrl:c.value,headers:{Authorization:`Bearer ${p.value}`}}}},null,2));return(z,e)=>{const L=G,M=F,x=J,u=X,B=Z,b=ee,N=Q,E=$;return n(),k(E,null,{header:o(()=>[i(L,{title:"MCP server"})]),body:o(()=>[t("div",ne,[r(I)?(n(),k(M,{key:0,color:"info",icon:"i-lucide-bot",title:"Feature preview",description:"The MCP endpoint is not active in this demo — it requires a real Piwi backend. The tools and client setup shown below reflect what your own deployment exposes."})):j("",!0),i(b,{icon:"i-lucide-settings-2",title:"Client setup",help:"mcp.client-setup"},{default:o(()=>[r(h)?(n(),a("div",ae,[t("div",ce,[e[2]||(e[2]=t("div",{class:"text-xs text-muted"},"MCP URL",-1)),t("div",pe,[t("code",de,m(r(c)),1),i(x,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy MCP URL",onClick:e[0]||(e[0]=l=>r(w)(r(c),{toast:!0}))})])]),t("div",ue,[e[3]||(e[3]=t("div",{class:"text-xs text-muted"},"Access token",-1)),t("div",le,[t("code",me,m(r(p)),1),i(x,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy access token",onClick:e[1]||(e[1]=l=>r(w)(r(p),{toast:!0}))})])]),e[4]||(e[4]=t("p",{class:"text-xs text-muted"},[s(" This app authenticates with a local access token even though sign-in is off — it is the "),t("code",{class:"font-mono"},"Bearer"),s(" value, already filled into the snippets below. ")],-1))])):j("",!0),t("p",ge,[r(h)?(n(),a(g,{key:0},[s("Pick your client below — the URL and access token above are already baked into each snippet.")],64)):(n(),a(g,{key:1},[e[5]||(e[5]=s("Replace ",-1)),e[6]||(e[6]=t("code",{class:"px-1 py-0.5 bg-muted rounded text-xs font-mono"},"pd_YOUR_API_KEY",-1)),e[7]||(e[7]=s(" with your actual API key. The MCP URL shown in the snippets is auto-detected from your current browser origin.",-1))],64))]),i(B,{items:R,ui:{list:"mb-4"}},{"claude-code":o(()=>[t("div",fe,[e[8]||(e[8]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"}," Run once in any terminal. Claude Code stores the server in your global MCP config. ",-1)),i(u,{code:r(A),lang:"sh"},null,8,["code"]),e[9]||(e[9]=t("p",{class:"text-xs text-gray-400"},[s(" After adding, restart Claude Code and use "),t("code",{class:"font-mono"},"/mcp"),s(" to verify "),t("strong",null,"piwi"),s(" is connected. Claude will call the tools automatically when you ask about test results or failures. ")],-1))])]),cursor:o(()=>[t("div",ye,[e[10]||(e[10]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to "),t("code",{class:"font-mono text-xs"},"~/.cursor/mcp.json"),s(" (global) or "),t("code",{class:"font-mono text-xs"},".cursor/mcp.json"),s(" in your project root: ")],-1)),i(u,{code:r(P),lang:"json"},null,8,["code"]),e[11]||(e[11]=t("p",{class:"text-xs text-gray-400"}," Restart Cursor, then enable the MCP server in Cursor Settings → MCP. ",-1))])]),vscode:o(()=>[t("div",he,[e[12]||(e[12]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to "),t("code",{class:"font-mono text-xs"},".vscode/mcp.json"),s(" in your workspace (VS Code Copilot agent mode, version 1.99+): ")],-1)),i(u,{code:r(D),lang:"json"},null,8,["code"]),e[13]||(e[13]=t("p",{class:"text-xs text-gray-400"}," The server appears in the Copilot chat agent drop-down once the file is saved. ",-1))])]),"claude-desktop":o(()=>[t("div",be,[e[14]||(e[14]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Add to your Claude Desktop config file:",-1)),e[15]||(e[15]=t("ul",{class:"text-xs text-gray-400 space-y-0.5 mb-2"},[t("li",null,[t("strong",null,"macOS:"),t("code",{class:"font-mono"},"~/Library/Application Support/Claude/claude_desktop_config.json")]),t("li",null,[t("strong",null,"Windows:"),t("code",{class:"font-mono"},"%APPDATA%\\Claude\\claude_desktop_config.json")])],-1)),i(u,{code:r(T),lang:"json"},null,8,["code"]),e[16]||(e[16]=t("p",{class:"text-xs text-gray-400"}," Requires Claude Desktop with remote MCP support (released early 2025). Restart the app after saving. ",-1))])]),gemini:o(()=>[t("div",xe,[e[17]||(e[17]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Run once to register the server with Gemini CLI:",-1)),i(u,{code:r(U),lang:"sh"},null,8,["code"]),e[18]||(e[18]=t("p",{class:"text-xs text-gray-400"}," Gemini CLI fetches the tool list on startup and makes them available in agent mode. ",-1))])]),windsurf:o(()=>[t("div",_e,[e[19]||(e[19]=t("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to your Windsurf or Continue MCP config. For Windsurf: "),t("code",{class:"font-mono text-xs"},"~/.codeium/windsurf/mcp_config.json"),s(". For Continue: "),t("code",{class:"font-mono text-xs"},"~/.continue/config.json"),s(" under "),t("code",{class:"font-mono text-xs"},"mcpServers"),s(". ")],-1)),i(u,{code:r(O),lang:"json"},null,8,["code"])])]),_:1})]),_:1}),i(b,{icon:"i-lucide-bot",title:"What it provides",help:"mcp.tools"},{default:o(()=>[t("div",ve,[(n(!0),a(g,null,K(r(q),l=>(n(),a("div",{key:l.name,class:"flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"},[i(N,{name:"i-lucide-wrench",class:"size-4 mt-0.5 shrink-0 text-primary"}),t("div",Ie,[t("p",we,m(l.name),1),t("p",ke,m(l.description),1)])]))),128))])]),_:1}),i(b,{icon:"i-lucide-key",title:"Authentication",help:"mcp.auth"},{default:o(()=>[t("div",je,[e[24]||(e[24]=t("p",null,[s(" MCP requests are authenticated with the same API keys used by the REST API. API keys start with "),t("code",{class:"px-1 py-0.5 bg-muted rounded text-xs font-mono"},"pd_"),s(". ")],-1)),r(y)?(n(),a("p",Ce,[...e[21]||(e[21]=[s(" This app provides a local access token automatically — shown in ",-1),t("strong",null,"Client setup",-1),s(" above and already filled into every snippet, so there is nothing to replace. ",-1)])])):(n(),a("p",Se,[...e[20]||(e[20]=[s(" Generate a key in ",-1),t("strong",null,"Settings → Users → [your account] → API keys",-1),s(", then replace ",-1),t("code",{class:"px-1 py-0.5 bg-muted rounded text-xs font-mono"},"pd_YOUR_API_KEY",-1),s(" in the snippets above. ",-1)])])),r(y)?(n(),a("p",Re,[...e[23]||(e[23]=[s(" This desktop app keeps sign-in off but still requires its own local access token on every request — it is the ",-1),t("code",{class:"font-mono"},"Bearer",-1),s(" value. The endpoint is not open. ",-1)])])):(n(),a("p",qe,[...e[22]||(e[22]=[s(" When authentication is disabled (",-1),t("code",{class:"font-mono"},"PIWI_AUTH_ENABLED",-1),s(" not set), any request is accepted without a key. ",-1)])]))])]),_:1}),i(b,{icon:"i-lucide-link",title:"Server URL"},{default:o(()=>[t("div",Ae,[t("div",Pe,[t("code",De,m(r(c)),1),i(x,{icon:"i-lucide-external-link",size:"sm",color:"neutral",variant:"outline",title:"Open API docs",to:"/docs",external:!r(I)},{default:o(()=>[...e[25]||(e[25]=[s(" REST API docs ",-1)])]),_:1},8,["external"])]),t("p",Te,[e[32]||(e[32]=s(" This is your Piwi instance's MCP endpoint. It is also the server URL to paste into client configs above. ",-1)),r(y)?(n(),a(g,{key:0},[e[26]||(e[26]=s("This desktop app requires its local access token as the ",-1)),e[27]||(e[27]=t("code",{class:"font-mono"},"Bearer",-1)),e[28]||(e[28]=s(" value on every request.",-1))],64)):(n(),a(g,{key:1},[e[29]||(e[29]=s("The server requires a valid Bearer token (or no auth if ",-1)),e[30]||(e[30]=t("code",{class:"font-mono"},"PIWI_AUTH_ENABLED",-1)),e[31]||(e[31]=s(" is not set).",-1))],64))])])]),_:1})])]),_:1})}}});export{Ke as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{aw as B,b as H,ao as I,h as V}from"./NQikbhmK.js";const k=4096;function x(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function j(e){return'"'+e.replace(/"/g,'\\"')+'"'}function u(e){return e.replace(/\\/g,"/")}function T(e){const n=new Map;for(const r of e){const i=r.projectName||"";n.has(i)||n.set(i,[]),n.get(i).push(r)}return n}function D(e){const n=new Set;return e.filter(r=>{const i=r.filePath;return n.has(i)?!1:(n.add(i),!0)}).map(r=>r.filePath)}function A(e,n){const r=n?.mode??"file-line",p=`${n?.pkgRunner??"npx"} playwright test`;if(e.length===0)return"";const v=T(e),m=[];for(const[g,d]of v){let c;if(r==="file"){const l=D(d).map(t=>j(u(t))).join(" ");c=`${p} ${l}`}else if(r==="file-line"){const a=new Set,l=d.filter(t=>{const o=t.filePath+":"+t.line;return t.line&&a.has(o)?!1:(t.line&&a.add(o),!0)}).map(t=>t.line?j(`${u(t.filePath)}:${t.line}`):j(u(t.filePath))).join(" ");c=`${p} ${l}`}else{const a=d.map(t=>x(t.title)),l=a.length===1?a[0]:`(${a.join("|")})`;c=`${p} --grep ${j(l)}`}g&&(c+=` --project=${j(g)}`),m.push(c)}let b=m.join(" && ");if(b.length>k){if(r==="grep")return A(e,{...n,mode:"file-line"});if(r==="file-line")return A(e,{...n,mode:"file"});const d=_(e).map(a=>j(u(a))).join(" ");let c=`${p} ${d}`;return c.length>k&&(c=c.slice(0,k-3)+"..."),c}return b}function _(e){const n=new Set;return e.reduce((r,i)=>(n.has(i.filePath)||(n.add(i.filePath),r.push(i.filePath)),r),[])}function C(e,n){return e==null?"":n==null?`:${e}`:`:${e}:${n}`}function w(e){return e.replace(/%/g,"%25").replace(/ /g,"%20").replace(/#/g,"%23").replace(/\?/g,"%3F")}function S(e,n){const r=u(e).replace(/\/+$/,""),i=u(n).replace(/^\.?\/+/,"");return r?`${r}/${i}`:i}function L(e){const n=w(u(e.absPath)),r=n.startsWith("/")?n:`/${n}`;return`${e.scheme}://file${r}${C(e.line,e.column)}`}function F(e){const n=w(u(e.relPath))+C(e.line,e.column);return`jetbrains://${e.product}/navigate/reference?project=${encodeURIComponent(e.projectName)}&path=${n}`}function K(e){const n=w(u(e.path));return`http://localhost:${e.port}/api/file/${n}${C(e.line,e.column)}`}const M="piwi-ide-prefs",G={method:"auto",vscodeScheme:"vscode",jetbrainsProduct:"idea",jetbrainsPort:63342,jetbrainsHttpUsesRelativePath:!1,defaultRoot:"",projectRoots:{},jetbrainsProjectNames:{}},W={vscode:"VS Code","vscode-insiders":"VS Code Insiders",vscodium:"VSCodium",cursor:"Cursor"},X={auto:"Auto (try all)",vscode:"VS Code","jetbrains-url":"JetBrains (URL)","jetbrains-http":"JetBrains (local server)"},Y=["idea","webstorm","pycharm","phpstorm","goland","rubymine","clion","rider","rustrover"];function Q(){const e=B(M,G,{mergeDefaults:!0}),n=H(),r=I("piwi-ide-settings-open",()=>!1),i=I("piwi-ide-settings-context",()=>({}));function p(t){return t==null||t===""?null:String(t)}function v(t={}){i.value={projectKey:t.projectKey??null,projectName:t.projectName??null},r.value=!0}function m(t){const o=p(t);return((o?e.value.projectRoots[o]:void 0)||e.value.defaultRoot||"").trim()}function b(t,o){const s=p(t);return((s?e.value.jetbrainsProjectNames[s]:void 0)||o||"").trim()}function g(t,o){const s=m(o);return s?S(s,t):null}const d=V(()=>!!e.value.defaultRoot?.trim()||Object.keys(e.value.projectRoots).length>0||Object.keys(e.value.jetbrainsProjectNames).length>0);function c(t){try{const o=document.createElement("iframe");o.style.display="none",o.src=t,document.body.appendChild(o),setTimeout(()=>o.remove(),1e3)}catch{const o=document.createElement("a");o.href=t,o.style.display="none",document.body.appendChild(o),o.click(),setTimeout(()=>o.remove(),1e3)}}async function a(t,o,s){const f=K({port:e.value.jetbrainsPort,path:t,line:o,column:s});try{return await fetch(f,{mode:"no-cors",signal:AbortSignal.timeout(1200)}),!0}catch{return!1}}async function l(t){const o=t.method??e.value.method,s=t.filePath,f=t.line??null,P=t.column??null,h=m(t.projectKey),$=b(t.projectKey,t.projectName),O={projectKey:p(t.projectKey),projectName:t.projectName??null},y={label:"Configure",color:"info",onClick:()=>v(O)},J=()=>h?(c(L({scheme:e.value.vscodeScheme,absPath:S(h,s),line:f,column:P})),n.add({title:`Opening ${W[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:[y]}),!1),E=()=>$?(c(F({product:e.value.jetbrainsProduct,projectName:$,relPath:s,line:f,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:[y]}),!1),U=async()=>{const R=e.value.jetbrainsHttpUsesRelativePath?s:h?S(h,s):s,N=await a(R,f,P);return n.add(N?{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"}),N};if(o==="vscode"){J();return}if(o==="jetbrains-url"){E();return}if(o==="jetbrains-http"){await U();return}if(e.value.jetbrainsHttpUsesRelativePath||!!h){const R=e.value.jetbrainsHttpUsesRelativePath?s:S(h,s);if(await a(R,f,P)){n.add({title:"Opened in JetBrains",color:"success",icon:"i-lucide-check"});return}}if(h){J();return}if($){E();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:[y]})}return{prefs:e,isConfigured:d,openInIde:l,openInVscode:t=>l({...t,method:"vscode"}),openViaJetbrainsUrl:t=>l({...t,method:"jetbrains-url"}),openViaJetbrainsHttp:t=>l({...t,method:"jetbrains-http"}),resolveRoot:m,resolveJbProjectName:b,resolveAbsPath:g,settingsOpen:r,settingsContext:i,openSettings:v}}export{X as I,Y as J,W as V,A as b,Q as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as $,a as k}from"./279D2RYp.js";import{_ as y,a as B}from"./CHEFCN8Q.js";import{u as C,_ as D}from"./Bp5ELvx9.js";import{a3 as M,a5 as S,o as m,f as d,g as i,V as c,i as p,q as u,k as s,X as U,h as _,a8 as N,B as P,r as q,d as T,e as j,j as o,aJ as V}from"./NQikbhmK.js";import"./YVN7WG7q.js";import"./DEFEpYzn.js";import"./DP8hfJ9h.js";import"./B7NBP1C-.js";import"./BjaRappk.js";import"./CHNwfU1y.js";const H={slots:{root:"shrink-0 flex items-center justify-between border-b border-default px-4 sm:px-6 gap-1.5 overflow-x-auto min-h-[49px]",left:"flex items-center gap-1.5",right:"flex items-center gap-1.5"}},z={__name:"UDashboardToolbar",props:{as:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(t){const e=M("dashboardToolbar",t),a=S(),l=_(()=>N({extend:H,...a.ui?.dashboardToolbar||{}})());return(r,f)=>(m(),d(s(U),{as:s(e).as,"data-slot":"root",class:u(l.value.root({class:[s(e).ui?.root,s(e).class]}))},{default:i(()=>[c(r.$slots,"default",{},()=>[p("div",{"data-slot":"left",class:u(l.value.left({class:[s(e).ui?.left]}))},[c(r.$slots,"left")],2),p("div",{"data-slot":"right",class:u(l.value.right({class:[s(e).ui?.right]}))},[c(r.$slots,"right")],2)])]),_:3},8,["as","class"]))}};function A(){const t=q({account:!1,users:!1,notifications:!1,tags:!1,storage:!1,"wasted-time":!1,"timeout-hygiene":!1,"pr-feedback":!1,ai:!1,about:!1});async function n(){const e=[];e.push($fetch("/api/settings/ai").then(a=>{t.value.ai=!!a.envManaged}).catch(()=>{})),e.push($fetch("/api/settings/wasted-waits").then(a=>{t.value["wasted-time"]=!!a.envManaged}).catch(()=>{})),e.push($fetch("/api/settings/smtp").then(a=>{t.value.notifications=!!(a.envManaged&&a.configured)}).catch(()=>{})),await Promise.all(e)}return P(()=>{n()}),{envManaged:t,refresh:n}}const E={class:"flex flex-col gap-4 sm:gap-6 lg:gap-12 w-full lg:max-w-4xl mx-auto"},W=T({__name:"settings",setup(t){j({title:"Settings — Piwi Dashboard"});const{envManaged:n}=A(),e=C(n),a=_(()=>[e.value,[{label:"Documentation",icon:"i-lucide-book-open",to:"https://github.com/piwitests/platform",target:"_blank"}]]);return(l,r)=>{const f=$,g=k,h=B,b=D,v=z,x=V,w=y;return m(),d(w,{id:"settings",ui:{body:"lg:py-12"}},{header:i(()=>[o(h,null,{leading:i(()=>[o(f),o(g,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Settings"}]})]),_:1}),o(v,null,{default:i(()=>[o(b,{items:s(a),highlight:"",class:"-mx-1 flex-1",ui:{list:"overflow-x-auto",root:"min-w-0"}},null,8,["items"])]),_:1})]),body:i(()=>[p("div",E,[o(x)])]),_:1})}}});export{W as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function r(t){if(!t||t===0)return"0 B";const o=1024,n=["B","KB","MB","GB","TB"],a=Math.min(n.length-1,Math.floor(Math.log(t)/Math.log(o)));return`${(t/Math.pow(o,a)).toFixed(2)} ${n[a]}`}export{r as f};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a2 as $,a3 as S,a4 as C,a5 as V,o as a,f as l,g as B,V as c,k as r,aI as j,W as d,p as A,q as s,v as o,i as I,c as u,m,t as x,F as b,y as h,_ as p,X as N,h as O,a8 as P}from"./NQikbhmK.js";const F={slots:{root:"relative overflow-hidden w-full rounded-lg p-4 flex gap-2.5",wrapper:"min-w-0 flex-1 flex flex-col",title:"text-sm font-medium",description:"text-sm opacity-90",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xl",actions:"flex flex-wrap gap-1.5 shrink-0",close:"p-0"},variants:{color:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""},variant:{solid:"",outline:"",soft:"",subtle:""},orientation:{horizontal:{root:"items-center",actions:"items-center"},vertical:{root:"items-start",actions:"items-start mt-2.5"}},title:{true:{description:"mt-1"}}},compoundVariants:[{color:"primary",variant:"solid",class:{root:"bg-primary text-inverted"}},{color:"secondary",variant:"solid",class:{root:"bg-secondary text-inverted"}},{color:"success",variant:"solid",class:{root:"bg-success text-inverted"}},{color:"info",variant:"solid",class:{root:"bg-info text-inverted"}},{color:"warning",variant:"solid",class:{root:"bg-warning text-inverted"}},{color:"error",variant:"solid",class:{root:"bg-error text-inverted"}},{color:"primary",variant:"outline",class:{root:"text-primary ring ring-inset ring-primary/25"}},{color:"secondary",variant:"outline",class:{root:"text-secondary ring ring-inset ring-secondary/25"}},{color:"success",variant:"outline",class:{root:"text-success ring ring-inset ring-success/25"}},{color:"info",variant:"outline",class:{root:"text-info ring ring-inset ring-info/25"}},{color:"warning",variant:"outline",class:{root:"text-warning ring ring-inset ring-warning/25"}},{color:"error",variant:"outline",class:{root:"text-error ring ring-inset ring-error/25"}},{color:"primary",variant:"soft",class:{root:"bg-primary/10 text-primary"}},{color:"secondary",variant:"soft",class:{root:"bg-secondary/10 text-secondary"}},{color:"success",variant:"soft",class:{root:"bg-success/10 text-success"}},{color:"info",variant:"soft",class:{root:"bg-info/10 text-info"}},{color:"warning",variant:"soft",class:{root:"bg-warning/10 text-warning"}},{color:"error",variant:"soft",class:{root:"bg-error/10 text-error"}},{color:"primary",variant:"subtle",class:{root:"bg-primary/10 text-primary ring ring-inset ring-primary/25"}},{color:"secondary",variant:"subtle",class:{root:"bg-secondary/10 text-secondary ring ring-inset ring-secondary/25"}},{color:"success",variant:"subtle",class:{root:"bg-success/10 text-success ring ring-inset ring-success/25"}},{color:"info",variant:"subtle",class:{root:"bg-info/10 text-info ring ring-inset ring-info/25"}},{color:"warning",variant:"subtle",class:{root:"bg-warning/10 text-warning ring ring-inset ring-warning/25"}},{color:"error",variant:"subtle",class:{root:"bg-error/10 text-error ring ring-inset ring-error/25"}},{color:"neutral",variant:"solid",class:{root:"text-inverted bg-inverted"}},{color:"neutral",variant:"outline",class:{root:"text-highlighted bg-default ring ring-inset ring-default"}},{color:"neutral",variant:"soft",class:{root:"text-highlighted bg-elevated/50"}},{color:"neutral",variant:"subtle",class:{root:"text-highlighted bg-elevated/50 ring ring-inset ring-accented"}}],defaultVariants:{color:"primary",variant:"solid"}},D={__name:"UAlert",props:{as:{type:null,required:!1},title:{type:String,required:!1},description:{type:String,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},variant:{type:null,required:!1},orientation:{type:null,required:!1,default:"vertical"},actions:{type:Array,required:!1},close:{type:[Boolean,Object],required:!1},closeIcon:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1}},emits:["update:open"],setup(w,{emit:k}){const q=w,z=k,i=$(),t=S("alert",q),{t:_}=C(),f=V(),e=O(()=>P({extend:F,...f.ui?.alert||{}})({color:t.color,variant:t.variant,orientation:t.orientation,title:!!t.title||!!i.title}));return(n,y)=>(a(),l(r(N),{as:r(t).as,"data-orientation":r(t).orientation,"data-slot":"root",class:s(e.value.root({class:[r(t).ui?.root,r(t).class]}))},{default:B(()=>[c(n.$slots,"leading",{ui:e.value},()=>[r(t).avatar?(a(),l(j,d({key:0,size:r(t).ui?.avatarSize||e.value.avatarSize()},r(t).avatar,{"data-slot":"avatar",class:e.value.avatar({class:r(t).ui?.avatar})}),null,16,["size","class"])):r(t).icon?(a(),l(A,{key:1,name:r(t).icon,"data-slot":"icon",class:s(e.value.icon({class:r(t).ui?.icon}))},null,8,["name","class"])):o("",!0)]),I("div",{"data-slot":"wrapper",class:s(e.value.wrapper({class:r(t).ui?.wrapper}))},[r(t).title||i.title?(a(),u("div",{key:0,"data-slot":"title",class:s(e.value.title({class:r(t).ui?.title}))},[c(n.$slots,"title",{},()=>[m(x(r(t).title),1)])],2)):o("",!0),r(t).description||i.description?(a(),u("div",{key:1,"data-slot":"description",class:s(e.value.description({class:r(t).ui?.description}))},[c(n.$slots,"description",{},()=>[m(x(r(t).description),1)])],2)):o("",!0),r(t).orientation==="vertical"&&(r(t).actions?.length||i.actions)?(a(),u("div",{key:2,"data-slot":"actions",class:s(e.value.actions({class:r(t).ui?.actions}))},[c(n.$slots,"actions",{},()=>[(a(!0),u(b,null,h(r(t).actions,(g,v)=>(a(),l(p,d({key:v,size:"xs"},{ref_for:!0},g),null,16))),128))])],2)):o("",!0)],2),r(t).orientation==="horizontal"&&(r(t).actions?.length||i.actions)||r(t).close?(a(),u("div",{key:0,"data-slot":"actions",class:s(e.value.actions({class:r(t).ui?.actions,orientation:"horizontal"}))},[r(t).orientation==="horizontal"&&(r(t).actions?.length||i.actions)?c(n.$slots,"actions",{key:0},()=>[(a(!0),u(b,null,h(r(t).actions,(g,v)=>(a(),l(p,d({key:v,size:"xs"},{ref_for:!0},g),null,16))),128))]):o("",!0),c(n.$slots,"close",{ui:e.value},()=>[r(t).close?(a(),l(p,d({key:0,icon:r(t).closeIcon||r(f).ui.icons.close,color:"neutral",variant:"link","aria-label":r(_)("alert.close")},typeof r(t).close=="object"?r(t).close:{},{"data-slot":"close",class:e.value.close({class:r(t).ui?.close}),onClick:y[0]||(y[0]=g=>z("update:open",!1))}),null,16,["icon","aria-label","class"])):o("",!0)])],2)):o("",!0)]),_:3},8,["as","data-orientation","class"]))}};export{D as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as
|
|
1
|
+
import{_ as O}from"./ZFiQCMUB.js";import{_ as z}from"./DLSrtpsA.js";import{u as B,w as I,C as M,O as k,a as V,_ as L}from"./DX-MDGb3.js";import{d as P,n as j,o as n,c as d,k as t,j as s,g as E,Q as H,i as o,t as l,m as U,q as W,v as h,f as q,h as y,r as F}from"./NQikbhmK.js";const Q={class:"w-full relative"},X={key:0},A={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},G={class:"font-semibold mb-1"},J={class:"space-y-0.5"},K={key:0,class:"text-gray-400 text-xs"},Y="rgb(148, 163, 184)",Z=P({__name:"TestCaseHistoryChart",props:{data:{},height:{default:200},markers:{default:()=>[]}},emits:["marker-click"],setup(p,{emit:f}){const i=p,x=f,v=y(()=>i.markers),c=y(()=>!i.data||i.data.length===0?[]:[...i.data].sort((a,m)=>new Date(a.startTime).getTime()-new Date(m.startTime).getTime()).map(a=>({id:a.id,runId:a.runId,date:new Date(a.startTime),duration:a.duration??void 0,status:a.status,runStatus:a.runStatus}))),b=e=>e.date,C=e=>e.duration,S=e=>e==="passed"?"rgb(34, 197, 94)":e==="failed"||e==="timedOut"?"rgb(239, 68, 68)":"rgb(156, 163, 175)",_=F(null),{tooltipData:r,tooltipPos:g,markerTooltip:T,markerTooltipPos:w,onRenderComplete:D}=B(_,c,{x:e=>e.date,series:[{y:e=>e.duration,color:e=>S(e.status)}],radius:5,hoverRadius:8,strokeWidth:2,hoverStrokeWidth:3,onClick:e=>j(`/test-runs/${e.runId}`),markers:v,onMarkerClick:e=>x("marker-click",e.id)}),R=[{color:"rgb(34, 197, 94)",label:"Passed"},{color:"rgb(239, 68, 68)",label:"Failed"},{color:"rgb(156, 163, 175)",label:"Skipped"}];return(e,a)=>{const m=O,$=z,N=L;return n(),d("div",Q,[t(c).length>0?(n(),d("div",X,[s(t(V),{ref_key:"xyContainerRef",ref:_,data:t(c),height:p.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(D)},{default:E(()=>[s(t(I),{x:b,y:C,color:[Y],"curve-type":t(M).MonotoneX,"line-width":1.5},null,8,["color","curve-type"]),s(t(k),{type:"x","tick-format":u=>new Date(u).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),s(t(k),{type:"y",label:"Duration (ms)","tick-format":u=>`${u}ms`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),t(r)?(n(),d("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700",style:H({left:`${t(g).x}px`,top:`${t(g).y}px`})},[o("div",A,[o("div",G,l(new Date(t(r).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),o("div",J,[o("div",null,[a[0]||(a[0]=U(" Status: ",-1)),o("span",{class:W(["font-medium capitalize",t(r).status==="passed"?"text-green-600":t(r).status==="failed"||t(r).status==="timedOut"?"text-red-600":""])},l(t(r).status),3)]),o("div",null,"Duration: "+l(t(r).duration)+"ms",1),t(r).runStatus?(n(),d("div",K," Run status: "+l(t(r).runStatus),1)):h("",!0)]),a[1]||(a[1]=o("div",{class:"text-gray-400 text-xs mt-1"},"Click to view run details",-1))])],4)):h("",!0),s(m,{marker:t(T),pos:t(w)},null,8,["marker","pos"])])):(n(),q($,{key:1,text:"No history data available to display chart"})),s(N,{items:R,dense:""})])}}}),ot=Object.assign(Z,{__name:"TestCaseHistoryChart"});export{ot as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as p,a_ as f,f as r,g as n,
|
|
1
|
+
import{d as p,a_ as f,f as r,g as n,A as _,o as s,k as o,c as m,i as t,m as a,_ as g,v as h}from"./NQikbhmK.js";import{_ as x}from"./DprVVyUQ.js";import"./C7P1UCO2.js";import"./BjaRappk.js";import"./Bn0YQDyy.js";import"./eptP4pGv.js";const b={key:0,class:"flex max-sm:flex-col justify-between items-start gap-4"},v={key:1,class:"text-sm text-muted"},N=p({__name:"index",setup(k){const i=_().public.demoMode,{isResetting:d,resetDemo:c}=f();return(C,e)=>{const l=g,u=x;return s(),r(u,{icon:"i-lucide-settings",title:"General settings",help:"settings.general"},{actions:n(()=>[o(i)?(s(),r(l,{key:0,color:"error",variant:"soft",icon:"i-lucide-refresh-cw",loading:o(d),onClick:o(c)},{default:n(()=>[...e[0]||(e[0]=[a(" Reset demo ",-1)])]),_:1},8,["loading","onClick"])):h("",!0)]),default:n(()=>[o(i)?(s(),m("div",b,[...e[1]||(e[1]=[t("div",null,[t("p",{class:"font-medium text-sm"},"Reset demo data"),t("p",{class:"text-sm text-muted"}," Wipe the in-browser database and reload with fresh sample data dated to the current moment. All changes made during this demo session will be lost. ")],-1)])])):(s(),m("div",v,[...e[2]||(e[2]=[t("p",null," Appearance and theme are in the top bar. Use the sidebar to manage your account, users, AI diagnosis, notifications, storage, and tags. ",-1),t("p",{class:"mt-2"},[a(" Settings that can be overridden by "),t("code",{class:"font-mono text-xs"},"PIWI_*"),a(" environment variables show a lock badge with the variable name — hover the help icon on any card to see which env var backs a setting. ")],-1)])]))]),_:1})}}});export{N as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a$ as l,aM as s}from"./
|
|
1
|
+
import{a$ as l,aM as s}from"./NQikbhmK.js";function t(r,i){return l(r)?!1:Array.isArray(r)?r.some(a=>s(a,i)):s(r,i)}export{t as i};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as j,d as E,D as N,a as R,e as b,f as _,g as A,b as I}from"./B3HO8kuh.js";import{a2 as L,a3 as T,a4 as z,a5 as F,a6 as G,a7 as K,bs as U,o as a,f as l,g as r,k as e,q as c,V as d,v as i,j as h,W as k,bv as W,bG as J,bH as M,m,t as v,c as q,_ as Q,i as X,a0 as Y,a1 as Z,h as $,b4 as B,bI as ee,a8 as te}from"./NQikbhmK.js";const se={slots:{overlay:"fixed inset-0 bg-elevated/75",content:"fixed bg-default divide-y divide-default sm:ring ring-default sm:shadow-lg flex flex-col focus:outline-none",header:"flex items-center gap-1.5 p-4 sm:px-6 min-h-(--ui-header-height)",wrapper:"",body:"flex-1 overflow-y-auto p-4 sm:p-6",footer:"flex items-center gap-1.5 p-4 sm:px-6",title:"text-highlighted font-semibold",description:"mt-1 text-muted text-sm",close:"absolute top-4 end-4"},variants:{side:{top:{content:""},right:{content:"max-w-md"},bottom:{content:""},left:{content:"max-w-md"}},inset:{true:{content:"rounded-lg"}},transition:{true:{overlay:"data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]"}}},compoundVariants:[{side:"top",inset:!0,class:{content:"max-h-[calc(100%-2rem)] inset-x-4 top-4"}},{side:"top",inset:!1,class:{content:"max-h-full inset-x-0 top-0"}},{side:"right",inset:!0,class:{content:"w-[calc(100%-2rem)] inset-y-4 right-4"}},{side:"right",inset:!1,class:{content:"w-full inset-y-0 right-0"}},{side:"bottom",inset:!0,class:{content:"max-h-[calc(100%-2rem)] inset-x-4 bottom-4"}},{side:"bottom",inset:!1,class:{content:"max-h-full inset-x-0 bottom-0"}},{side:"left",inset:!0,class:{content:"w-[calc(100%-2rem)] inset-y-4 left-4"}},{side:"left",inset:!1,class:{content:"w-full inset-y-0 left-0"}},{transition:!0,side:"top",class:{content:"data-[state=open]:animate-[slide-in-from-top_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-top_200ms_ease-in-out]"}},{transition:!0,side:"right",class:{content:"data-[state=open]:animate-[slide-in-from-right_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-right_200ms_ease-in-out]"}},{transition:!0,side:"bottom",class:{content:"data-[state=open]:animate-[slide-in-from-bottom_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-bottom_200ms_ease-in-out]"}},{transition:!0,side:"left",class:{content:"data-[state=open]:animate-[slide-in-from-left_200ms_ease-in-out] data-[state=closed]:animate-[slide-out-to-left_200ms_ease-in-out]"}}]},le={__name:"USlideover",props:{title:{type:String,required:!1},description:{type:String,required:!1},content:{type:Object,required:!1},overlay:{type:Boolean,required:!1,default:!0},transition:{type:Boolean,required:!1,default:!0},side:{type:null,required:!1,default:"right"},inset:{type:Boolean,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},dismissible:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},open:{type:Boolean,required:!1},defaultOpen:{type:Boolean,required:!1},modal:{type:Boolean,required:!1,default:!0},unmountOnHide:{type:Boolean,required:!1}},emits:["leave","after:leave","enter","after:enter","close:prevent","update:open"],setup(D,{emit:O}){const P=D,f=O,s=L(),t=T("slideover",P),{t:C}=z(),w=F(),S=G(K(t,"open","defaultOpen","modal","unmountOnHide"),f),x=U(B(()=>t.portal)),V=B(()=>t.content),H=$(()=>t.dismissible?{pointerDownOutside:ee}:["interactOutside","escapeKeyDown"].reduce((n,y)=>(n[y]=p=>{p.preventDefault(),f("close:prevent")},n),{})),u=$(()=>te({extend:se,...w.ui?.slideover||{}})({transition:t.transition,side:t.side,inset:t.inset}));return(o,n)=>(a(),l(e(I),Y(Z(e(S))),{default:r(({open:y,close:p})=>[s.default?(a(),l(e(j),{key:0,"as-child":"",class:c(e(t).class)},{default:r(()=>[d(o.$slots,"default",{open:y})]),_:2},1032,["class"])):i("",!0),h(e(E),k(e(x),{"force-mount":e(x).disabled&&e(t).unmountOnHide===!1||void 0}),{default:r(()=>[h(e(W),null,{default:r(()=>[e(t).overlay?(a(),l(e(N),{key:0,"data-slot":"overlay",class:c(u.value.overlay({class:e(t).ui?.overlay}))},null,8,["class"])):i("",!0),h(e(R),k({"data-side":e(t).side,"data-slot":"content",class:u.value.content({class:[!s.default&&e(t).class,e(t).ui?.content]})},V.value,{onEnter:n[0]||(n[0]=g=>f("enter")),onAfterEnter:n[1]||(n[1]=g=>f("after:enter")),onLeave:n[2]||(n[2]=g=>f("leave")),onAfterLeave:n[3]||(n[3]=g=>f("after:leave"))},J(H.value)),{default:r(()=>[!e(t).title&&!s.title||!e(t).description&&!s.description||s.content?(a(),l(e(M),{key:0},{default:r(()=>[!e(t).title&&!s.title?(a(),l(e(b),{key:0})):s.content?(a(),l(e(b),{key:1},{default:r(()=>[d(o.$slots,"title",{},()=>[m(v(e(t).title),1)])]),_:3})):i("",!0),!e(t).description&&!s.description?(a(),l(e(_),{key:2})):s.content?(a(),l(e(_),{key:3},{default:r(()=>[d(o.$slots,"description",{},()=>[m(v(e(t).description),1)])]),_:3})):i("",!0)]),_:3})):i("",!0),d(o.$slots,"content",{close:p},()=>[s.header||e(t).title||s.title||e(t).description||s.description||e(t).close||s.close?(a(),q("div",{key:0,"data-slot":"header",class:c(u.value.header({class:e(t).ui?.header}))},[d(o.$slots,"header",{close:p},()=>[e(t).title||s.title||e(t).description||s.description?(a(),q("div",{key:0,"data-slot":"wrapper",class:c(u.value.wrapper({class:e(t).ui?.wrapper}))},[e(t).title||s.title?(a(),l(e(b),{key:0,"data-slot":"title",class:c(u.value.title({class:e(t).ui?.title}))},{default:r(()=>[d(o.$slots,"title",{},()=>[m(v(e(t).title),1)])]),_:3},8,["class"])):i("",!0),e(t).description||s.description?(a(),l(e(_),{key:1,"data-slot":"description",class:c(u.value.description({class:e(t).ui?.description}))},{default:r(()=>[d(o.$slots,"description",{},()=>[m(v(e(t).description),1)])]),_:3},8,["class"])):i("",!0)],2)):i("",!0),d(o.$slots,"actions"),e(t).close||s.close?(a(),l(e(A),{key:1,"as-child":""},{default:r(()=>[d(o.$slots,"close",{ui:u.value},()=>[e(t).close?(a(),l(Q,k({key:0,icon:e(t).closeIcon||e(w).ui.icons.close,color:"neutral",variant:"ghost","aria-label":e(C)("slideover.close")},typeof e(t).close=="object"?e(t).close:{},{"data-slot":"close",class:u.value.close({class:e(t).ui?.close})}),null,16,["icon","aria-label","class"])):i("",!0)])]),_:2},1024)):i("",!0)])],2)):i("",!0),X("div",{"data-slot":"body",class:c(u.value.body({class:e(t).ui?.body}))},[d(o.$slots,"body",{close:p})],2),s.footer?(a(),q("div",{key:1,"data-slot":"footer",class:c(u.value.footer({class:e(t).ui?.footer}))},[d(o.$slots,"footer",{close:p})],2)):i("",!0)])]),_:2},1040,["data-side","class"])]),_:2},1024)]),_:2},1040,["force-mount"])]),_:3},16))}};export{le as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as g,o as s,c as a,F as l,y as o,f,D as p,q as b,k as y,Q as k,h as _}from"./NQikbhmK.js";const h=g({__name:"MiniRunBars",props:{runs:{},height:{default:28},maxBars:{default:20}},setup(n){const i=n;function u(t){return["running","initialising","finalizing"].includes(t.status)?"bg-blue-400 dark:bg-blue-500":t.flakyTests>0&&t.status==="passed"?"bg-amber-400 dark:bg-amber-400":t.status==="passed"?"bg-green-500":["failed","timedout","interrupted"].includes(t.status)?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function c(t){const r=[`Run #${t.id}`,`Status: ${t.status}`,`${t.passedTests}/${t.totalTests} passed`];return t.flakyTests>0&&r.push(`${t.flakyTests} flaky`),r.join(" · ")}const d=_(()=>Math.max(0,i.maxBars-i.runs.length));return(t,r)=>{const m=p;return s(),a("div",{class:"flex items-stretch gap-px",style:k({height:`${n.height}px`})},[(s(!0),a(l,null,o(n.runs,e=>(s(),f(m,{key:e.id,to:`/test-runs/${e.id}`,title:c(e),class:b(["flex-1 rounded-sm transition-opacity hover:opacity-70 min-w-0",u(e)])},null,8,["to","title","class"]))),128)),(s(!0),a(l,null,o(y(d),e=>(s(),a("div",{key:`empty-${e}`,class:"flex-1 rounded-sm bg-gray-100 dark:bg-gray-800 min-w-0"}))),128))],4)}}}),$=Object.assign(h,{__name:"MiniRunBars"});export{$ as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as s,o as t,c as o,f as c,v as l,i as m,t as r,V as i,q as d,p}from"./NQikbhmK.js";const _={class:"text-sm"},f=s({__name:"EmptyState",props:{text:{},icon:{},padded:{type:Boolean,default:!0}},setup(e){return(a,u)=>{const n=p;return t(),o("div",{class:d(["flex flex-col items-center justify-center gap-2 text-center text-gray-500",e.padded&&"py-8"])},[e.icon?(t(),c(n,{key:0,name:e.icon,class:"size-6 opacity-60"},null,8,["name"])):l("",!0),m("p",_,r(e.text),1),i(a.$slots,"default")],2)}}}),y=Object.assign(f,{__name:"EmptyState"});export{y as _};
|