@piwitests/server 0.19.0 → 0.21.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/{279D2RYp.js → 9ti9eNH9.js} +1 -1
- package/.output/public/_nuxt/{DcmZRa_F.js → B-zdP-D4.js} +1 -1
- package/.output/public/_nuxt/{eaVkJRSa.js → B1RmmOsM.js} +1 -1
- package/.output/public/_nuxt/{DprVVyUQ.js → B3Fsod9X.js} +1 -1
- package/.output/public/_nuxt/{HXerICAi.js → B3rirOqU.js} +34 -34
- package/.output/public/_nuxt/B3zmIJYb.js +1 -0
- package/.output/public/_nuxt/{CDk0q2hV.js → BAKUqW95.js} +2 -2
- package/.output/public/_nuxt/BG0KKQiT.js +7 -0
- package/.output/public/_nuxt/BGL_V7Y4.js +1 -0
- package/.output/public/_nuxt/{Jo8kRmHz.js → BGusFAvZ.js} +1 -1
- package/.output/public/_nuxt/{CGNkHojN.js → BNurUTla.js} +3 -3
- package/.output/public/_nuxt/BR5cR2Ot.js +1 -0
- package/.output/public/_nuxt/BTCh_0zN.js +1 -0
- package/.output/public/_nuxt/{ZFiQCMUB.js → BTVqMsA3.js} +1 -1
- package/.output/public/_nuxt/{BqV0l12c.js → B_13C0GF.js} +1 -1
- package/.output/public/_nuxt/BeDIjhoR.js +44 -0
- package/.output/public/_nuxt/{BDicZ1gQ.js → BerCW7Ug.js} +1 -1
- package/.output/public/_nuxt/BfTNbVc_.js +1 -0
- package/.output/public/_nuxt/BnbSEpXX.js +1 -0
- package/.output/public/_nuxt/Bo_dxehb.js +1 -0
- package/.output/public/_nuxt/{ClOqkAcc.js → BpBHls4-.js} +1 -1
- package/.output/public/_nuxt/{C7P1UCO2.js → BpM6ZPIG.js} +1 -1
- package/.output/public/_nuxt/BqGumsDo.js +4 -0
- package/.output/public/_nuxt/{DS636elg.js → BrxtP_cN.js} +1 -1
- package/.output/public/_nuxt/{YVN7WG7q.js → C2hNxjjz.js} +1 -1
- package/.output/public/_nuxt/C5PSqfKi.js +2 -0
- package/.output/public/_nuxt/C5vsaU4G.js +1 -0
- package/.output/public/_nuxt/C9sdHaXd.js +1 -0
- package/.output/public/_nuxt/{SfMRXW25.js → CAxgBYIt.js} +2 -2
- package/.output/public/_nuxt/{CZfMdzfk.js → CES2i5Pl.js} +1 -1
- package/.output/public/_nuxt/{BX9ZXe98.js → CFEdRqaj.js} +1 -1
- package/.output/public/_nuxt/{B44A4LSJ.js → CFTZwazK.js} +1 -1
- package/.output/public/_nuxt/CIBS7ye6.js +1 -0
- package/.output/public/_nuxt/CIEceDOw.js +1 -0
- package/.output/public/_nuxt/{DHDtnj7p.js → CJBhojV6.js} +1 -1
- package/.output/public/_nuxt/{BPQoBGg5.js → CKYddHa6.js} +1 -1
- package/.output/public/_nuxt/{BccXfBfI.js → CLVWiCds.js} +1 -1
- package/.output/public/_nuxt/{DX-MDGb3.js → CMYAryzi.js} +1 -1
- package/.output/public/_nuxt/{BuMC3WjZ.js → COhdybDy.js} +1 -1
- package/.output/public/_nuxt/{Bu2aaVIY.js → CRBXM2d6.js} +2 -2
- package/.output/public/_nuxt/{BYDaY0Z7.js → CTD_pJ_v.js} +1 -1
- package/.output/public/_nuxt/{C9_jrmk9.js → CTP8Pw0-.js} +2 -2
- package/.output/public/_nuxt/{D55D4EYo.js → CV8iF2kG.js} +1 -1
- package/.output/public/_nuxt/{BCMuIgP5.js → CWKmbYlT.js} +1 -1
- package/.output/public/_nuxt/C_NfGMTd.js +9 -0
- package/.output/public/_nuxt/Cejoebel.js +6 -0
- package/.output/public/_nuxt/{Dnpkl-1q.js → Chpah_7l.js} +1 -1
- package/.output/public/_nuxt/Ci9d8YVV.js +1 -0
- package/.output/public/_nuxt/{C95YAaJq.js → CifRHVaR.js} +1 -1
- package/.output/public/_nuxt/{BMvCSA6h.js → Ckgsh9AT.js} +1 -1
- package/.output/public/_nuxt/{eptP4pGv.js → Cpsq-kYE.js} +1 -1
- package/.output/public/_nuxt/Cqc-DSTF.js +1 -0
- package/.output/public/_nuxt/{KnfsST6Y.js → CsHulb12.js} +1 -1
- package/.output/public/_nuxt/Ctb2CqUf.js +5 -0
- package/.output/public/_nuxt/CtstIQSh.js +1 -0
- package/.output/public/_nuxt/{DGfAxLHV.js → CvMzDKvu.js} +1 -1
- package/.output/public/_nuxt/{fVcG504p.js → D2pBhsH8.js} +1 -1
- package/.output/public/_nuxt/{rWNTSFD6.js → D8gX1Jde.js} +3 -3
- package/.output/public/_nuxt/D9knOn6D.js +1 -0
- package/.output/public/_nuxt/DAPTVdvA.js +1 -0
- package/.output/public/_nuxt/{NQikbhmK.js → DCFbQvIN.js} +44 -43
- package/.output/public/_nuxt/DCoJlz_q.js +1 -0
- package/.output/public/_nuxt/DGnQ69wW.js +64 -0
- package/.output/public/_nuxt/{CTxDO9fB.js → DHzij16p.js} +1 -1
- package/.output/public/_nuxt/DJMCXRuW.js +5 -0
- package/.output/public/_nuxt/DJXcGkJP.js +2 -0
- package/.output/public/_nuxt/{CK_2LZBS.js → DKFXZdWZ.js} +1 -1
- package/.output/public/_nuxt/{tvgqrYDd.js → DL24AjfW.js} +1 -1
- package/.output/public/_nuxt/DON74Yh6.js +1 -0
- package/.output/public/_nuxt/{CHEFCN8Q.js → DQM62mxB.js} +1 -1
- package/.output/public/_nuxt/DSe8DxMl.js +1 -0
- package/.output/public/_nuxt/DWwiVTZX.js +24 -0
- package/.output/public/_nuxt/DX4tAP78.js +1 -0
- package/.output/public/_nuxt/{DLSrtpsA.js → D_eDAIsT.js} +1 -1
- package/.output/public/_nuxt/Da8A92cF.js +1 -0
- package/.output/public/_nuxt/{BxCKKeYs.js → DdH3op4b.js} +1 -1
- package/.output/public/_nuxt/DepFDZO3.js +1 -0
- package/.output/public/_nuxt/{CV9-fTmY.js → DfSBKzrC.js} +1 -1
- package/.output/public/_nuxt/{DT53RWbC.js → DfnKh3dZ.js} +1 -1
- package/.output/public/_nuxt/{ndShiWE8.js → DhpTfeip.js} +1 -1
- package/.output/public/_nuxt/{ybDYeNxd.js → Dk9nD32g.js} +1 -1
- package/.output/public/_nuxt/{D0HNloZ9.js → DkT2nCqn.js} +1 -1
- package/.output/public/_nuxt/DlW85lQq.js +4 -0
- package/.output/public/_nuxt/DnNio-ut.js +1 -0
- package/.output/public/_nuxt/{BfTuX0wq.js → DnQv_hst.js} +1 -1
- package/.output/public/_nuxt/{FUXhyidq.js → DqEOMteW.js} +1 -1
- package/.output/public/_nuxt/{Bti38m-M.js → Dsvu7YJT.js} +1 -1
- package/.output/public/_nuxt/DvhCDBrR.js +2 -0
- package/.output/public/_nuxt/DwQaVMZR.js +1 -0
- package/.output/public/_nuxt/E-_n_6vi.js +1 -0
- package/.output/public/_nuxt/{DP8hfJ9h.js → Ebw5l7n8.js} +1 -1
- package/.output/public/_nuxt/{nv9-6vBK.js → IPePdbzl.js} +1 -1
- package/.output/public/_nuxt/{BPRffDuo.js → LHoUGrfi.js} +1 -1
- package/.output/public/_nuxt/{CYsTqbBS.js → NERLHpOL.js} +1 -1
- package/.output/public/_nuxt/RAdNGxcF.js +1 -0
- package/.output/public/_nuxt/Vxyo_mU9.js +1 -0
- package/.output/public/_nuxt/{IvQlbZk6.js → YE1kAkU9.js} +1 -1
- package/.output/public/_nuxt/{DgE2YE3R.js → YmT5WiN5.js} +1 -1
- package/.output/public/_nuxt/ZcAfCxWE.js +17 -0
- package/.output/public/_nuxt/{cHAnlQbv.js → _rglcvXN.js} +1 -1
- package/.output/public/_nuxt/bFU9Y1Vw.js +10 -0
- package/.output/public/_nuxt/bfecIH89.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/31ca2be4-a949-4df6-9818-773fc085557a.json +1 -0
- package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
- package/.output/public/_nuxt/four-S1Y.js +1 -0
- package/.output/public/_nuxt/{DiOLdHBC.js → gV2U_Gqd.js} +1 -1
- package/.output/public/_nuxt/{C-elpgyr.js → lGC893pn.js} +1 -1
- package/.output/public/_nuxt/nOfj-ar8.js +1 -0
- package/.output/public/_nuxt/oKrbs1XK.js +1 -0
- package/.output/public/_nuxt/oSJFAC38.js +1 -0
- package/.output/public/_nuxt/rL4C0HV5.js +1 -0
- package/.output/public/_nuxt/{Cdff9XNh.js → tQoyVPCE.js} +1 -1
- package/.output/public/_nuxt/{DEFEpYzn.js → uSPCvASp.js} +1 -1
- package/.output/public/_nuxt/{y17lMTFy.js → wkz5-1SO.js} +1 -1
- package/.output/public/_nuxt/yYlVYKCz.js +34 -0
- package/.output/public/_nuxt/{B9WhzpKO.js → zv8WdMx0.js} +1 -1
- package/.output/server/chunks/_/collect.mjs +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +1 -1
- package/.output/server/chunks/_/scope.mjs +43 -27
- package/.output/server/chunks/_/scope.mjs.map +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-3itRZ1uz.mjs} +2 -2
- package/.output/server/chunks/build/Breadcrumb-3itRZ1uz.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-GnjBvXuT.mjs} +2 -2
- package/.output/server/chunks/build/BreadcrumbNav-GnjBvXuT.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-D33lqUcj.mjs → BrowserBadge-DQqJS9CV.mjs} +66 -6
- package/.output/server/chunks/build/BrowserBadge-DQqJS9CV.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-D0rzMf-N.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-D0rzMf-N.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-DvUBGagc.mjs → Checkbox-DmRKG-0s.mjs} +5 -5
- package/.output/server/chunks/build/Checkbox-DmRKG-0s.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-DGhKVFad.mjs} +4 -4
- package/.output/server/chunks/build/CodeBlock-DGhKVFad.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DCr10nxL.mjs} +2 -2
- package/.output/server/chunks/build/DashboardNavbar-DCr10nxL.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-8EpBhX0R.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-8EpBhX0R.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-rzS-pgCP.mjs} +5 -5
- package/.output/server/chunks/build/DataLocationCard-rzS-pgCP.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-B646dK4p.mjs → DiagnosisPanel-BWTpoCKy.mjs} +8 -7
- package/.output/server/chunks/build/DiagnosisPanel-BWTpoCKy.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-CWvIo32Q.mjs → DiagnosisResult-Br3qBLXe.mjs} +14 -36
- package/.output/server/chunks/build/DiagnosisResult-Br3qBLXe.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-CWKfjIF2.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-CWKfjIF2.mjs.map +1 -0
- package/.output/server/chunks/build/{EmptyState-Dtlab7S9.mjs → EmptyState-DC2q_7TD.mjs} +3 -3
- package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-D3fp57pR.mjs → EntityLinks-CF0xG3Y8.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-CF0xG3Y8.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-Bg3FSiU1.mjs → EnvManagedBadge-UwD2b9v2.mjs} +3 -3
- package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs.map +1 -0
- package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs +83 -0
- package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-e7OnSKPM.mjs} +2 -2
- package/.output/server/chunks/build/FormField-e7OnSKPM.mjs.map +1 -0
- package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs +510 -0
- package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-DjGrGFA7.mjs} +3 -3
- package/.output/server/chunks/build/HelpHint-DjGrGFA7.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-B8v1nWJt.mjs} +3 -3
- package/.output/server/chunks/build/LoadingState-B8v1nWJt.mjs.map +1 -0
- package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs +1205 -0
- package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs.map +1 -0
- package/.output/server/chunks/build/{MiniRunBars-CZMugDrh.mjs → MiniRunBars-fgLMgRUp.mjs} +2 -2
- package/.output/server/chunks/build/MiniRunBars-fgLMgRUp.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-Ck2XLt8d.mjs → Modal-pSDlXzT3.mjs} +2 -2
- package/.output/server/chunks/build/Modal-pSDlXzT3.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-C3O866KC.mjs → NavigationMenu-cqpt11Ce.mjs} +6 -29
- package/.output/server/chunks/build/NavigationMenu-cqpt11Ce.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs → OpenInIdeLink-B9wvQkhy.mjs} +5 -5
- package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs.map → OpenInIdeLink-B9wvQkhy.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-CxfQ5wtN.mjs → ProjectTestCasesTable-BwHEtZTz.mjs} +19 -19
- package/.output/server/chunks/build/ProjectTestCasesTable-BwHEtZTz.mjs.map +1 -0
- package/.output/server/chunks/build/{RovingFocusItem-BJSzTBjy.mjs → RovingFocusItem--OEHI2P3.mjs} +2 -2
- package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-BDRIWn3o.mjs} +3 -3
- package/.output/server/chunks/build/RunReports-BDRIWn3o.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CuTDknRJ.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-CuTDknRJ.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-BW5Lynrr.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-BW5Lynrr.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-CUqj50wi.mjs → Select-CVctwpib.mjs} +3 -3
- package/.output/server/chunks/build/Select-CVctwpib.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs → SelectMenu-XLVBEa11.mjs} +939 -7
- package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs.map → SelectMenu-XLVBEa11.mjs.map} +1 -1
- package/.output/server/chunks/build/{SettingsField-D6iEYbEc.mjs → SettingsField-DvtRvI6O.mjs} +4 -4
- package/.output/server/chunks/build/SettingsField-DvtRvI6O.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-DgCa80mf.mjs → Slideover-D270EZZD.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-D270EZZD.mjs.map +1 -0
- package/.output/server/chunks/build/{StatTile-D61Vzo6e.mjs → StatTile-DpcVQFVI.mjs} +2 -26
- package/.output/server/chunks/build/StatTile-DpcVQFVI.mjs.map +1 -0
- package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs +30 -0
- package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-CgUioOYB.mjs → Switch-8zWfwI5B.mjs} +3 -3
- package/.output/server/chunks/build/Switch-8zWfwI5B.mjs.map +1 -0
- package/.output/server/chunks/build/Table-BRk04Hd2.mjs +1 -1
- package/.output/server/chunks/build/{Tabs-Bbsg9wag.mjs → Tabs-BkSOnbaB.mjs} +2 -2
- package/.output/server/chunks/build/Tabs-BkSOnbaB.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-nMLPhdvD.mjs → TestCaseHistoryChart-C6t5RrCG.mjs} +6 -6
- package/.output/server/chunks/build/TestCaseHistoryChart-C6t5RrCG.mjs.map +1 -0
- package/.output/server/chunks/build/{TestMetaBadges-D5_yUtIP.mjs → TestMetaBadges-BlyKmfeP.mjs} +1 -1
- package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-j6h2Jp6A.mjs → TestStatusBar-DhbrM_rQ.mjs} +4 -4
- package/.output/server/chunks/build/TestStatusBar-DhbrM_rQ.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-vkMKVQTJ.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-vkMKVQTJ.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-BOazooWP.mjs → Tooltip-Dv4htNP6.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs.map +1 -0
- package/.output/server/chunks/build/{VisuallyHiddenInput-D6kBJxVd.mjs → VisuallyHiddenInput-BHvzNumK.mjs} +2 -2
- package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-z5N6HPyC.mjs → _id_-2PMH6rl8.mjs} +26 -25
- package/.output/server/chunks/build/_id_-2PMH6rl8.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BHh65pfg.mjs → _id_-8cGIgeg6.mjs} +1912 -1098
- package/.output/server/chunks/build/_id_-8cGIgeg6.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-Rzkqx55x.mjs → _id_-CUZ5S6y5.mjs} +43 -44
- package/.output/server/chunks/build/_id_-CUZ5S6y5.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-B78ky13D.mjs → _id_-DMkgWSLZ.mjs} +956 -429
- package/.output/server/chunks/build/_id_-DMkgWSLZ.mjs.map +1 -0
- package/.output/server/chunks/build/about-D3WXTDro.mjs +696 -0
- package/.output/server/chunks/build/about-D3WXTDro.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-BslDNCoo.mjs} +6 -6
- package/.output/server/chunks/build/account-BslDNCoo.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs → ai-C23R9l94.mjs} +18 -18
- package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs.map → ai-C23R9l94.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-CJPC6t4L.mjs → analytics-DQHeToK0.mjs} +106 -80
- package/.output/server/chunks/build/analytics-DQHeToK0.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/compare-RxHSOdsO.mjs +1 -0
- package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-D74DghqX.mjs} +38 -2
- package/.output/server/chunks/build/db.client-D74DghqX.mjs.map +1 -0
- package/.output/server/chunks/build/{default-zvbFgDJG.mjs → default-CeyePZ5I.mjs} +624 -79
- package/.output/server/chunks/build/default-CeyePZ5I.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-DyuVEgtB.mjs → docs-f_bnC75q.mjs} +17 -17
- package/.output/server/chunks/build/{docs-DyuVEgtB.mjs.map → docs-f_bnC75q.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-CFR5g2Qf.mjs → edit-BOC4zWuH.mjs} +13 -15
- package/.output/server/chunks/build/edit-BOC4zWuH.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-BQg_fhX0.mjs} +32 -4
- package/.output/server/chunks/build/fetch-BQg_fhX0.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CxuVbGWy.mjs} +4 -3
- package/.output/server/chunks/build/forgot-password-CxuVbGWy.mjs.map +1 -0
- package/.output/server/chunks/build/{import-CZo3djDi.mjs → import-CC27wEIu.mjs} +14 -14
- package/.output/server/chunks/build/import-CC27wEIu.mjs.map +1 -0
- package/.output/server/chunks/build/{index-gCw_y4ZJ.mjs → index-B6PjfyTY.mjs} +44 -543
- package/.output/server/chunks/build/index-B6PjfyTY.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-BOK1aJk9.mjs} +2 -1
- package/.output/server/chunks/build/index-BOK1aJk9.mjs.map +1 -0
- package/.output/server/chunks/build/{index-D7fe97l3.mjs → index-BhS1DuCr.mjs} +400 -151
- package/.output/server/chunks/build/index-BhS1DuCr.mjs.map +1 -0
- package/.output/server/chunks/build/{index-Stqw0dEI.mjs → index-DUmjP3Gr.mjs} +18 -19
- package/.output/server/chunks/build/index-DUmjP3Gr.mjs.map +1 -0
- package/.output/server/chunks/build/index-jvF53f7_.mjs +91 -0
- package/.output/server/chunks/build/index-jvF53f7_.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
- package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-CdpOhiP8.mjs} +8 -7
- package/.output/server/chunks/build/login-CdpOhiP8.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-B3IUvRgD.mjs → mcp-WTeO5WRo.mjs} +528 -16
- package/.output/server/chunks/build/mcp-WTeO5WRo.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-abDv0id8.mjs → notifications-yY6ik-fi.mjs} +11 -11
- package/.output/server/chunks/build/notifications-yY6ik-fi.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-DjZID6q-.mjs → pr-feedback-Hv2Ydh_6.mjs} +8 -8
- package/.output/server/chunks/build/pr-feedback-Hv2Ydh_6.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-CFtO8A6n.mjs} +4 -3
- package/.output/server/chunks/build/reset-password-CFtO8A6n.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +51 -34
- package/.output/server/chunks/build/{settings-Du7YqF8i.mjs → settings-DIpvnY8_.mjs} +11 -9
- package/.output/server/chunks/build/settings-DIpvnY8_.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DRv9VveS.mjs} +32 -2
- package/.output/server/chunks/build/settings-metadata-DRv9VveS.mjs.map +1 -0
- package/.output/server/chunks/build/setup-Di0UMyWx.mjs +1116 -0
- package/.output/server/chunks/build/setup-Di0UMyWx.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-B4vzxd8G.mjs → storage-gAbY1KbQ.mjs} +13 -13
- package/.output/server/chunks/build/storage-gAbY1KbQ.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-DJ80wCqt.mjs} +6 -7
- package/.output/server/chunks/build/tags-DJ80wCqt.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-DUvaO1He.mjs → test-cases-YP83YlnL.mjs} +21 -21
- package/.output/server/chunks/build/test-cases-YP83YlnL.mjs.map +1 -0
- package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs +550 -0
- package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs.map +1 -0
- package/.output/server/chunks/build/{timeout-hygiene-CbnSaVbK.mjs → timeout-hygiene-RpXDjXTX.mjs} +6 -6
- package/.output/server/chunks/build/timeout-hygiene-RpXDjXTX.mjs.map +1 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs +9 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-BemRsKgv.mjs → useCopyRich-Cd5Yj_Wy.mjs} +721 -239
- package/.output/server/chunks/build/useCopyRich-Cd5Yj_Wy.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopDownload-D49JRQSw.mjs → useDesktopDownload-BmR6ouz2.mjs} +3 -3
- package/.output/server/chunks/build/useDesktopDownload-BmR6ouz2.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-4GFf-kdi.mjs → useOpenInIde-DolN3bZ5.mjs} +2 -2
- package/.output/server/chunks/build/useOpenInIde-DolN3bZ5.mjs.map +1 -0
- package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs +19 -0
- package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs.map +1 -0
- package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs +11 -0
- package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs.map +1 -0
- package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-I2K7HXS2.mjs} +6 -7
- package/.output/server/chunks/build/users-I2K7HXS2.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-lYkx5YO4.mjs → wasted-time-DyIk0olc.mjs} +11 -11
- package/.output/server/chunks/build/wasted-time-DyIk0olc.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +3124 -1782
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +2 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +1 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -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 +1 -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 +1 -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 +1 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -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 +1 -0
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -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 +1 -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 +1 -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 +1 -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 +1 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +89 -0
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +1 -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 +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +2 -1
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +2 -1
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +2 -1
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +2 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +2 -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 +2 -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 +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +2 -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 +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +76 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +66 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +53 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +67 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +2 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +2 -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 +2 -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 +1 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/setup-status.get.mjs +99 -0
- package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs +2 -1
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +60 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +69 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +2 -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 +2 -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 +2 -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 +2 -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 +6 -3
- 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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -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 +2 -2
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +5 -128
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +2 -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 +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +2 -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 +1 -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 +1 -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 +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +2 -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 +2 -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 +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +2 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +41 -11
- package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/tasks/sweep.mjs +1 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +1 -0
- package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
- package/.output/server/database/migrations/0043_watery_dragon_lord.sql +22 -0
- package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
- package/.output/server/database/migrations/meta/_journal.json +7 -0
- package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
- package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
- package/.output/server/index.mjs +2 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/-09h6CA9.js +0 -1
- package/.output/public/_nuxt/81InBX9v.js +0 -1
- package/.output/public/_nuxt/Ar3IelOY.js +0 -1
- package/.output/public/_nuxt/B33iXw77.js +0 -1
- package/.output/public/_nuxt/B3B9Ii2A.js +0 -1
- package/.output/public/_nuxt/B3HO8kuh.js +0 -1
- package/.output/public/_nuxt/B7NBP1C-.js +0 -1
- package/.output/public/_nuxt/BJ0XQElc.js +0 -1
- package/.output/public/_nuxt/BSIxhGsh.js +0 -1
- package/.output/public/_nuxt/BVaxh6Nl.js +0 -4
- package/.output/public/_nuxt/Bc8mOoz9.js +0 -4
- package/.output/public/_nuxt/BeLWlVK0.js +0 -1
- package/.output/public/_nuxt/Bn0YQDyy.js +0 -1
- package/.output/public/_nuxt/Bp5ELvx9.js +0 -1
- package/.output/public/_nuxt/BpUaY9nH.js +0 -2
- package/.output/public/_nuxt/C2_3mdPC.js +0 -1
- package/.output/public/_nuxt/C5iG7O4O.js +0 -64
- package/.output/public/_nuxt/CHNwfU1y.js +0 -1
- package/.output/public/_nuxt/CNFYDQmj.js +0 -1
- package/.output/public/_nuxt/CU5S9GCh.js +0 -1
- package/.output/public/_nuxt/CUtJobDm.js +0 -1
- package/.output/public/_nuxt/CpjgB2aY.js +0 -1
- package/.output/public/_nuxt/CrwJAwhk.js +0 -1
- package/.output/public/_nuxt/CtQBsNUb.js +0 -1
- package/.output/public/_nuxt/CuSVQEkS.js +0 -3
- package/.output/public/_nuxt/CylWPruw.js +0 -1
- package/.output/public/_nuxt/CzGyac8q.js +0 -1
- package/.output/public/_nuxt/DDDpCFpF.js +0 -1
- package/.output/public/_nuxt/DVDXJYq2.js +0 -2
- package/.output/public/_nuxt/DW0xl3I6.js +0 -17
- package/.output/public/_nuxt/Dgf5N4Ng.js +0 -1
- package/.output/public/_nuxt/DiZyJYez.js +0 -1
- package/.output/public/_nuxt/Dk9fwOCm.js +0 -34
- package/.output/public/_nuxt/DoUy4UHi.js +0 -44
- package/.output/public/_nuxt/DslPMqfa.js +0 -1
- package/.output/public/_nuxt/OSduWzyz.js +0 -1
- package/.output/public/_nuxt/SlIRLREZ.js +0 -6
- package/.output/public/_nuxt/WsxFTEFq.js +0 -10
- package/.output/public/_nuxt/aQgs_c6e.js +0 -9
- package/.output/public/_nuxt/builds/meta/ab473028-4b37-4884-b243-b8f6e5046e5e.json +0 -1
- package/.output/public/_nuxt/dYCKgE-3.js +0 -5
- package/.output/public/_nuxt/entry.CPhW41mh.css +0 -1
- package/.output/public/_nuxt/g26aVPxc.js +0 -1
- package/.output/public/_nuxt/zQyPuvV1.js +0 -1
- package/.output/server/chunks/_/import-runs.mjs +0 -351
- package/.output/server/chunks/_/import-runs.mjs.map +0 -1
- package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-D33lqUcj.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-DvUBGagc.mjs.map +0 -1
- package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs +0 -631
- package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-B646dK4p.mjs.map +0 -1
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +0 -1
- package/.output/server/chunks/build/EmptyState-Dtlab7S9.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-D3fp57pR.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-Bg3FSiU1.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +0 -1
- package/.output/server/chunks/build/LoadingState-C3pBSuOO.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-Ck2XLt8d.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-CxfQ5wtN.mjs.map +0 -1
- package/.output/server/chunks/build/RovingFocusItem-BJSzTBjy.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +0 -1
- package/.output/server/chunks/build/Select-CUqj50wi.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-D6iEYbEc.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-DgCa80mf.mjs.map +0 -1
- package/.output/server/chunks/build/StatTile-D61Vzo6e.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-CgUioOYB.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-Bbsg9wag.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-nMLPhdvD.mjs.map +0 -1
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-j6h2Jp6A.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-BOazooWP.mjs.map +0 -1
- package/.output/server/chunks/build/VisuallyHiddenInput-D6kBJxVd.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-B78ky13D.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BHh65pfg.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-Rzkqx55x.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-z5N6HPyC.mjs.map +0 -1
- package/.output/server/chunks/build/about-CvSP73Ug.mjs +0 -781
- package/.output/server/chunks/build/about-CvSP73Ug.mjs.map +0 -1
- package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +0 -1
- package/.output/server/chunks/build/analytics-CJPC6t4L.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +0 -1
- package/.output/server/chunks/build/default-zvbFgDJG.mjs.map +0 -1
- package/.output/server/chunks/build/edit-CFR5g2Qf.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +0 -1
- package/.output/server/chunks/build/import-CZo3djDi.mjs.map +0 -1
- package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +0 -1
- package/.output/server/chunks/build/index-D7fe97l3.mjs.map +0 -1
- package/.output/server/chunks/build/index-Stqw0dEI.mjs.map +0 -1
- package/.output/server/chunks/build/index-gCw_y4ZJ.mjs.map +0 -1
- package/.output/server/chunks/build/index-tR6owKzj.mjs +0 -167
- package/.output/server/chunks/build/index-tR6owKzj.mjs.map +0 -1
- package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-B3IUvRgD.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-abDv0id8.mjs.map +0 -1
- package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +0 -1
- package/.output/server/chunks/build/settings-Du7YqF8i.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +0 -1
- package/.output/server/chunks/build/storage-B4vzxd8G.mjs.map +0 -1
- package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-DUvaO1He.mjs.map +0 -1
- package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-CWvIo32Q.mjs.map +0 -1
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs +0 -33
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +0 -1
- package/.output/server/chunks/build/useCopyRich-BemRsKgv.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-4GFf-kdi.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-C3O866KC.mjs.map +0 -1
- package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +0 -7
- package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +0 -1
- package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +0 -1
- package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs +0 -940
- package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs.map +0 -1
- package/.output/server/chunks/build/wasted-time-lYkx5YO4.mjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{am as he,h as V,ao as O,r as x,ap as be,d as D,H as oe,J as Y,o as r,f as C,g as f,i as d,k as e,s as ae,m as b,t as $,c as h,j as c,_ as ie,v as I,F,p as J,l as A,E as ye,y as re,q,I as ue,L as ke,B as xe,V as G}from"./DCFbQvIN.js";import{_ as we}from"./Ebw5l7n8.js";import{_ as $e}from"./DkT2nCqn.js";import{_ as ce}from"./BrxtP_cN.js";import{_ as Se}from"./zv8WdMx0.js";import{_ as je}from"./BGusFAvZ.js";import{_ as Ce}from"./D8gX1Jde.js";import{_ as Ie}from"./oKrbs1XK.js";import{e as Me,t as se,u as Ue}from"./BfTNbVc_.js";import{e as Ve,j as Le,B as Re,A as ze,k as Pe}from"./BAKUqW95.js";import{_ as Be}from"./BpM6ZPIG.js";import{_ as Ee}from"./_rglcvXN.js";const Fe={normal:[],headed:["--headed"],debug:["--debug"],ui:["--ui"]};function De(t){const n=new Map;for(const o of t){const l=o.projectName||"";n.has(l)||n.set(l,[]),n.get(l).push(o)}return n}function Te(t,n){if(n==="grep"){const a=t.map(p=>Me(p.title));return["--grep",a.length===1?a[0]:`(${a.join("|")})`]}const o=new Set,l=[];for(const a of t){const p=n==="file-line"&&a.line?`${se(a.filePath)}:${a.line}`:se(a.filePath);o.has(p)||(o.add(p),l.push(p))}return l}function Ne(t){return/[\s"'()|]/.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function Ae(t,n={}){if(t.length===0)return[];const o=n.mode??"file-line",l=n.runMode??"normal",a=Math.min(1e3,Math.max(1,Math.floor(n.repeatEach??1))),p=[];for(const[i,u]of De(t)){const m=Te(u,o);i&&m.push(`--project=${i}`),m.push(...Fe[l]),n.trace&&m.push("--trace=on"),a>1&&m.push(`--repeat-each=${a}`),p.push({args:m,display:["playwright","test",...m.map(Ne)].join(" ")})}return p}const le=2e3;function He(){const t=x("idle"),n=x([]),o=x(null),l=x(0),a=x(0),p=V(()=>t.value==="running");let i=null,u=!1,m=!1,S=[],j=null,v=null;function T(g,_){n.value.push({text:g,error:_}),n.value.length>le&&n.value.splice(0,n.value.length-le)}function N(g){if(g.kind==="exit"){v?.(g.code);return}T(g.line??"",g.kind!=="stdout")}async function z(){if(j)return;const g=be();if(!g)throw new Error("The desktop bridge is unavailable.");j=await g.listen("piwi:local-run",({payload:_})=>{_.id===i?N(_):u&&S.push(_)})}async function P(g,_){const k=O();if(!k)throw new Error("The desktop bridge is unavailable.");const L=new Promise(M=>{v=M});u=!0,S=[];try{i=await k.invoke("desktop_run_local_tests",{projectId:String(g),args:_.args})}finally{u=!1}for(const M of S)M.id===i&&N(M);S=[];const w=await L;return i=null,v=null,w}async function B(g,_){if(!(p.value||_.length===0)){m=!1,n.value=[],o.value=null,a.value=_.length,l.value=0,t.value="running";try{await z();let k=0;for(const[L,w]of _.entries()){if(m)break;l.value=L,_.length>1&&T(`$ ${w.display}`,!1);const M=await P(g,w);if(m)break;M!==0&&(k=M??1)}m?t.value="stopped":(o.value=typeof k=="number"?k:1,t.value=k===0?"passed":"failed")}catch(k){T(Ve(k),!0),t.value="error"}}}async function R(){if(!p.value)return;m=!0;const g=O(),_=i;if(g&&_!=null)try{await g.invoke("desktop_stop_local_tests",{runId:_})}catch{}v?.(null),t.value="stopped"}return he(()=>{p.value&&R(),j?.(),j=null}),{status:t,running:p,lines:n,exitCode:o,stepIndex:l,stepCount:a,start:B,stop:R}}const Oe={class:"flex items-center gap-2 min-w-0"},qe={class:"space-y-4"},Ge={key:0,class:"space-y-3"},Je={class:"text-sm text-muted"},Xe={class:"flex items-center justify-between gap-3"},Ke={class:"flex items-center gap-2 min-w-0 text-sm"},Qe={class:"text-xs break-all"},We={class:"grid grid-cols-2 gap-3"},Ye={class:"text-xs"},Ze={class:"text-xs"},et={key:0},tt={class:"mt-1"},nt={class:"space-y-1"},st={key:1,class:"space-y-2"},lt={class:"flex items-center justify-between w-full gap-3"},ot={key:1},at={class:"flex items-center gap-2"},it=D({__name:"DesktopRunLocallyModal",props:ue({projectId:{},projectLabel:{},cases:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(t){const n=t,o=oe(t,"open"),{link:l,busy:a,pickAndLink:p}=Ue(()=>n.projectId),{status:i,running:u,lines:m,exitCode:S,stepIndex:j,stepCount:v,start:T,stop:N}=He(),z=x("file-line"),P=x("normal"),B=x(!1),R=x(1),g=[{label:"File:line",value:"file-line"},{label:"Title (grep)",value:"grep"},{label:"File only",value:"file"}],_=[{label:"Headless",value:"normal"},{label:"Headed",value:"headed"},{label:"Debug (inspector)",value:"debug"},{label:"UI mode",value:"ui"}],k=V(()=>!!l.value?.exists),L=V(()=>[...new Set(n.cases.map(U=>U.filePath).filter(Boolean))]),w=x([]);async function M(){const U=O();if(w.value=[],!(!U||!k.value||L.value.length===0))try{const s=await U.invoke("desktop_check_local_specs",{projectId:String(n.projectId),files:L.value});w.value=s?.missing??[]}catch{}}Y([o,()=>l.value?.path,k],()=>{o.value&&M()});const X=V(()=>L.value.length>0&&w.value.length===L.value.length),K=V(()=>Ae(n.cases,{mode:z.value,runMode:P.value,trace:B.value,repeatEach:R.value})),de=V(()=>K.value.map(U=>U.display).join(`
|
|
2
|
+
`)),Q=V(()=>{switch(i.value){case"running":return{label:v.value>1?`Running ${j.value+1}/${v.value}…`:"Running…",color:"info"};case"passed":return{label:"Passed",color:"success"};case"failed":return{label:S.value!=null?`Failed (exit ${S.value})`:"Failed",color:"error"};case"stopped":return{label:"Stopped",color:"neutral"};case"error":return{label:"Could not run",color:"error"};default:return null}});async function pe(){await T(n.projectId,K.value)}Y(o,U=>{!U&&u.value&&N()});const W=x(null);return Y(()=>m.value.length,async()=>{await ke(),W.value?.scrollTo({top:W.value.scrollHeight})}),(U,s)=>{const Z=J,ee=ae,te=$e,E=ie,ne=ce,H=Se,me=ye,fe=je,ve=Ce,ge=Ie;return r(),C(ge,{open:o.value,"onUpdate:open":s[7]||(s[7]=y=>o.value=y),ui:{content:"max-w-2xl"}},{header:f(()=>[d("div",Oe,[c(Z,{name:"i-lucide-monitor-play",class:"size-5 text-primary shrink-0"}),s[8]||(s[8]=d("h2",{class:"text-base font-semibold truncate"},"Run tests locally",-1)),c(ee,{color:"neutral",variant:"subtle",size:"sm"},{default:f(()=>[b($(t.cases.length)+" test"+$(t.cases.length===1?"":"s"),1)]),_:1})])]),body:f(()=>[d("div",qe,[e(k)?(r(),h(F,{key:1},[d("div",Xe,[d("div",Ke,[c(Z,{name:"i-lucide-folder-check",class:"size-4 text-success shrink-0"}),d("code",Qe,$(e(l)?.path),1)]),c(E,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-folder-search",loading:e(a),disabled:e(u),onClick:e(p)},{default:f(()=>[...s[10]||(s[10]=[b(" Change ",-1)])]),_:1},8,["loading","disabled","onClick"])]),d("div",We,[c(H,{label:"Select tests by",name:"mode"},{default:f(()=>[c(ne,{modelValue:e(z),"onUpdate:modelValue":s[0]||(s[0]=y=>A(z)?z.value=y:null),items:g,disabled:e(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),c(H,{label:"Browser",name:"runMode"},{default:f(()=>[c(ne,{modelValue:e(P),"onUpdate:modelValue":s[1]||(s[1]=y=>A(P)?P.value=y:null),items:_,disabled:e(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),c(H,{label:"Repeat each",name:"repeatEach",description:"Run every test N times — flake reproduction."},{default:f(()=>[c(me,{modelValue:e(R),"onUpdate:modelValue":s[2]||(s[2]=y=>A(R)?R.value=y:null),modelModifiers:{number:!0},type:"number",min:"1",max:"1000",disabled:e(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),c(H,{label:"Trace",name:"trace",description:"Force trace recording (--trace=on)."},{default:f(()=>[c(fe,{modelValue:e(B),"onUpdate:modelValue":s[3]||(s[3]=y=>A(B)?B.value=y:null),disabled:e(u)},null,8,["modelValue","disabled"])]),_:1})]),e(w).length>0?(r(),C(te,{key:0,color:"warning",variant:"soft",icon:"i-lucide-file-question",title:e(X)?"None of these tests are in the linked folder":"Some tests are not in the linked folder"},{description:f(()=>[d("p",null,[s[11]||(s[11]=b(" Not found under ",-1)),d("code",Ye,$(e(l)?.path),1),s[12]||(s[12]=b(": ",-1)),d("code",Ze,$(e(w)[0]),1),e(w).length>1?(r(),h("span",et," and "+$(e(w).length-1)+" more",1)):I("",!0),s[13]||(s[13]=b(". ",-1))]),d("p",tt,[e(X)?(r(),h(F,{key:0},[b(" This project is probably linked to a different checkout than the one these tests come from. ")],64)):(r(),h(F,{key:1},[b(" Running anyway is fine when your Playwright config puts them elsewhere. ")],64))]),e(X)?(r(),C(E,{key:0,size:"xs",color:"warning",variant:"soft",icon:"i-lucide-folder-search",class:"mt-2",loading:e(a),disabled:e(u),onClick:e(p)},{default:f(()=>[...s[14]||(s[14]=[b(" Choose the right folder… ",-1)])]),_:1},8,["loading","disabled","onClick"])):I("",!0)]),_:1},8,["title"])):I("",!0),d("div",nt,[s[15]||(s[15]=d("div",{class:"text-xs text-muted"},"Runs in the linked folder",-1)),c(ve,{code:e(de),lang:"sh"},null,8,["code"])]),s[16]||(s[16]=d("p",{class:"text-xs text-muted"}," Results are reported by the folder's own Playwright config — with the Piwi reporter set up, the new run appears in this app automatically. ",-1)),e(i)!=="idle"?(r(),h("div",st,[d("div",{ref_key:"outputEl",ref:W,class:"h-64 overflow-y-auto rounded-md bg-zinc-950 p-3"},[(r(!0),h(F,null,re(e(m),(y,_e)=>(r(),h("p",{key:_e,class:q(["font-mono text-xs whitespace-pre-wrap",y.error?"text-red-400":"text-zinc-300"])},$(y.text||" "),3))),128))],512)])):I("",!0)],64)):(r(),h("div",Ge,[d("p",Je," Link "+$(t.projectLabel||"this project")+" to its local checkout — the folder that contains these tests. Piwi runs that folder's own Playwright with the app's bundled Node, so nothing else needs to be installed. ",1),e(l)&&!e(l).exists?(r(),C(te,{key:0,color:"warning",variant:"soft",icon:"i-lucide-folder-x",title:"The linked folder no longer exists",description:e(l).path},null,8,["description"])):I("",!0),c(E,{icon:"i-lucide-folder-plus",loading:e(a),onClick:e(p)},{default:f(()=>[...s[9]||(s[9]=[b("Choose folder…",-1)])]),_:1},8,["loading","onClick"])]))])]),footer:f(()=>[d("div",lt,[e(Q)?(r(),C(ee,{key:0,color:e(Q).color,variant:"subtle"},{default:f(()=>[b($(e(Q).label),1)]),_:1},8,["color"])):(r(),h("span",ot)),d("div",at,[c(E,{color:"neutral",variant:"ghost",onClick:s[4]||(s[4]=y=>o.value=!1)},{default:f(()=>[...s[17]||(s[17]=[b("Close",-1)])]),_:1}),e(u)?(r(),C(E,{key:0,color:"error",icon:"i-lucide-square",onClick:s[5]||(s[5]=y=>e(N)())},{default:f(()=>[...s[18]||(s[18]=[b("Stop",-1)])]),_:1})):(r(),C(E,{key:1,icon:"i-lucide-play",disabled:!e(k)||e(K).length===0||e(a),onClick:s[6]||(s[6]=y=>pe())},{default:f(()=>[b($(e(i)==="idle"?"Run":"Run again"),1)]),_:1},8,["disabled"]))])])]),_:1},8,["open"])}}}),rt=Object.assign(it,{__name:"DesktopRunLocallyModal"}),ut={key:0,class:"inline-flex"},ct=D({__name:"DesktopRunLocallyButton",props:{projectId:{},projectLabel:{},cases:{}},setup(t){const n=t,o=x(!1);xe(()=>{o.value=!!O()});const l=x(!1),a=V(()=>o.value&&n.projectId!=null&&n.cases.length>0);return(p,i)=>{const u=ie,m=we,S=rt;return e(a)?(r(),h("span",ut,[c(m,{text:"Run these tests on this machine"},{default:f(()=>[c(u,{size:"xs",color:"warning",variant:"subtle",icon:"i-lucide-monitor-play",onClick:i[0]||(i[0]=j=>l.value=!0)},{default:f(()=>[...i[2]||(i[2]=[b(" Run locally ",-1)])]),_:1})]),_:1}),c(S,{open:e(l),"onUpdate:open":i[1]||(i[1]=j=>A(l)?l.value=j:null),"project-id":t.projectId,"project-label":t.projectLabel,cases:t.cases},null,8,["open","project-id","project-label","cases"])])):I("",!0)}}}),Lt=Object.assign(ct,{__name:"DesktopRunLocallyButton"}),dt=D({__name:"StatusChip",props:{status:{},size:{}},setup(t){return(n,o)=>{const l=J,a=ae;return r(),C(a,{color:("getStatusColor"in n?n.getStatusColor:e(Le))(t.status),size:t.size,variant:"subtle",class:"capitalize gap-1 items-center font-semibold shrink-0"},{default:f(()=>[c(l,{name:("getStatusIcon"in n?n.getStatusIcon:e(ze))(t.status),class:q(["size-3.5 shrink-0",{"animate-spin":("isStatusInFlight"in n?n.isStatusInFlight:e(Re))(t.status)}])},null,8,["name","class"]),b(" "+$(("formatStatusLabel"in n?n.formatStatusLabel:e(Pe))(t.status)),1)]),_:1},8,["color","size"])}}}),Rt=Object.assign(dt,{__name:"StatusChip"}),pt=["title"],mt=D({__name:"MetaStripGroup",props:{label:{},icon:{},help:{}},setup(t){return(n,o)=>{const l=J,a=Be;return r(),h("div",{class:"inline-flex items-center flex-wrap gap-x-1.5 gap-y-1 min-w-0 py-0.5 mr-3 [&:not(:first-child)]:border-l [&:not(:first-child)]:border-default [&:not(:first-child)]:pl-3",title:t.label},[t.icon?(r(),C(l,{key:0,name:t.icon,class:"w-3.5 h-3.5 text-dimmed shrink-0"},null,8,["name"])):I("",!0),G(n.$slots,"default"),t.help?(r(),C(a,{key:1,topic:t.help},null,8,["topic"])):I("",!0)],8,pt)}}}),zt=Object.assign(mt,{__name:"MetaStripGroup"}),ft={class:"flex flex-wrap items-center gap-y-1 text-sm min-w-0"},vt=D({__name:"SummaryMetaStrip",setup(t){return(n,o)=>(r(),h("div",ft,[G(n.$slots,"default")]))}}),Pt=Object.assign(vt,{__name:"SummaryMetaStrip"}),gt={class:"flex flex-col h-full gap-4 p-1 max-lg:overflow-y-auto lg:overflow-hidden"},_t={key:0,class:"lg:shrink-0"},ht={class:"lg:shrink-0 max-lg:sticky max-lg:top-0 max-lg:z-10 max-lg:-mx-1 max-lg:bg-(--ui-bg-canvas) max-lg:px-1 max-lg:py-1.5"},bt=D({__name:"DetailPageLayout",props:ue({tabItems:{},tabPanelClass:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(t){const n=t,o=oe(t,"modelValue"),l=x(!1),a=V(()=>n.tabItems.find(i=>i.value===o.value)?.icon);function p(i){return["min-h-0","lg:flex-1",n.tabPanelClass?.[i]??"overflow-y-auto","max-lg:!block","max-lg:!overflow-visible"]}return(i,u)=>{const m=J,S=ce,j=Ee;return r(),h("div",gt,[i.$slots.summary?(r(),h("div",_t,[d("div",{class:q(e(l)?"max-lg:hidden":"")},[G(i.$slots,"summary")],2),d("button",{type:"button",class:"lg:hidden mt-2 w-full flex items-center justify-center gap-1 rounded-md border border-default py-1.5 text-xs font-medium text-muted hover:bg-elevated/60 transition-colors",onClick:u[0]||(u[0]=v=>l.value=!e(l))},[c(m,{name:e(l)?"i-lucide-chevron-down":"i-lucide-chevron-up",class:"size-3.5"},null,8,["name"]),b(" "+$(e(l)?"Show summary":"Hide summary"),1)])])):I("",!0),d("div",ht,[c(S,{modelValue:o.value,"onUpdate:modelValue":u[1]||(u[1]=v=>o.value=v),items:t.tabItems,icon:e(a),size:"md",class:"w-full sm:hidden"},null,8,["modelValue","items","icon"]),c(j,{modelValue:o.value,"onUpdate:modelValue":u[2]||(u[2]=v=>o.value=v),items:t.tabItems,size:"sm",class:"hidden sm:flex",ui:{list:"overflow-x-auto",trigger:"shrink-0"}},null,8,["modelValue","items"])]),(r(!0),h(F,null,re(t.tabItems,v=>(r(),h(F,{key:v.value},[o.value===v.value?(r(),h("div",{key:0,class:q(p(v.value))},[G(i.$slots,`tab-${v.slot??v.value}`)],2)):I("",!0)],64))),128))])}}}),Bt=Object.assign(bt,{__name:"DetailPageLayout"});export{Rt as _,Pt as a,zt as b,Bt as c,Lt as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as Is}from"./9ti9eNH9.js";import{_ as Ms}from"./B_13C0GF.js";import{b as Ae,A as wt,d as ie,O as Ot,w as xe,J as ye,k as e,o as s,f,g as t,j as a,_ as ke,c as r,i as n,m as d,t as c,v as R,F as J,y as ae,p as Pe,G as Ee,l as X,P as Lt,Q as Nt,q as re,h as N,r as I,K as Fs,s as $e,R as qt,n as Rt,D as Dt,E as Ht,M as Ps,u as Es,a as Bs,e as Vs,C as Kt,S as Ls,T as Ns}from"./DCFbQvIN.js";import{_ as Ks}from"./CFTZwazK.js";import{_ as Qe,a as Os}from"./BpM6ZPIG.js";import{_ as Be}from"./BrxtP_cN.js";import{_ as Qt}from"./zv8WdMx0.js";import{u as qs}from"./CsHulb12.js";import{u as be}from"./E-_n_6vi.js";import{_ as Hs}from"./COhdybDy.js";import{_ as Qs,a as Gs}from"./DQM62mxB.js";import{_ as Gt}from"./B-zdP-D4.js";import{_ as ct}from"./B3Fsod9X.js";import{u as Js}from"./BfTNbVc_.js";import{_ as Jt}from"./BTVqMsA3.js";import{_ as Ce}from"./D_eDAIsT.js";import{C as St,w as Xt,O as rt,a as Yt,_ as Wt,u as Zt}from"./CMYAryzi.js";import{N as Xs}from"./BNurUTla.js";import{_ as Ys}from"./CFEdRqaj.js";import{_ as Ws}from"./BGusFAvZ.js";import{_ as Zs}from"./DL24AjfW.js";import{_ as es}from"./Ebw5l7n8.js";import{_ as en}from"./CKYddHa6.js";import{_ as tn}from"./CtstIQSh.js";import{_ as sn}from"./DfSBKzrC.js";import{_ as nn}from"./CLVWiCds.js";import{_ as Ve}from"./CTP8Pw0-.js";import{_ as Ge}from"./Cpsq-kYE.js";import{_ as Je}from"./gV2U_Gqd.js";import{f as At,b as an,c as on,d as ln,i as V,t as rn,e as ts,p as it,j as at}from"./BAKUqW95.js";import{_ as ss}from"./IPePdbzl.js";import{_ as ut}from"./LHoUGrfi.js";import{_ as dt}from"./DdH3op4b.js";import{_ as cn}from"./RAdNGxcF.js";import{_ as un}from"./D2pBhsH8.js";import{_ as dn}from"./Dk9nD32g.js";import{_ as mn}from"./BR5cR2Ot.js";import{_ as pn}from"./D9knOn6D.js";import{_ as gn}from"./Ckgsh9AT.js";import{_ as fn}from"./Chpah_7l.js";import{_ as _n}from"./B1RmmOsM.js";import{_ as zt}from"./oKrbs1XK.js";import{M as vn,D as Tt,g as jt}from"./D7W_4Sqc.js";import{_ as yn}from"./_rglcvXN.js";import{u as hn}from"./BpBHls4-.js";import{u as xn}from"./CWKmbYlT.js";import"./C2hNxjjz.js";import"./BjaRappk.js";import"./CIEceDOw.js";import"./NERLHpOL.js";import"./Vxyo_mU9.js";import"./CTD_pJ_v.js";import"./D-c8ZSws.js";import"./DqEOMteW.js";import"./Dsvu7YJT.js";import"./DkT2nCqn.js";import"./lGC893pn.js";import"./uSPCvASp.js";import"./YE1kAkU9.js";const bn=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],ot=new Map,lt=new Map;function kn(U,$){const k=[{event:"run.failed",scenario:{title:`Test run failed — ${U}`,description:"3 of 12 tests failed on main — checkout › applies discount code +2 more",icon:"i-lucide-circle-x",color:"error"}},{event:"run.failed.default_branch",scenario:{title:`Test run failed on main — ${U}`,description:"2 of 12 tests failed · main — auth › logs in with valid credentials +1 more",icon:"i-lucide-circle-x",color:"error"}},{event:"cluster.new",scenario:{title:`New failure cluster — ${U}`,description:"TimeoutError: locator.click: Timeout 30000ms exceeded",icon:"i-lucide-layers",color:"warning"}},{event:"flakiness.spike",scenario:{title:`Flakiness spike — ${U}`,description:"3 tests became flaky (8.3% rate)",icon:"i-lucide-shuffle",color:"warning"}},{event:"perf.regression",scenario:{title:`Performance regression — ${U}`,description:"p90 duration increased by 42% vs last week",icon:"i-lucide-trending-down",color:"warning"}},{event:"run.finished",scenario:{title:`Test run recovered — ${U}`,description:"All 12 tests passed on main",icon:"i-lucide-circle-check",color:"success"}},{event:"diagnosis.completed",scenario:{title:`Diagnosis complete — ${U}`,description:"Root cause: test bug — confidence: high",icon:"i-lucide-sparkles",color:"info"}}],C=k.filter(x=>$.length===0||$.includes(x.event)).map(x=>x.scenario);return C.length===0?[k[0].scenario,k[k.length-1].scenario]:C}function $n(){if(!wt().public.demoMode)return null;const $=Ae();function k(x,m,i){C(x);const M=kn(m,i);lt.set(x,0);function D(){const A=(lt.get(x)??0)%M.length;lt.set(x,A+1);const v=M[A];$.add({title:v.title,description:v.description,icon:v.icon,color:v.color,duration:7e3});const _=25e3+Math.random()*1e4;ot.set(x,setTimeout(D,_))}ot.set(x,setTimeout(D,8e3))}function C(x){const m=ot.get(x);m!==void 0&&(clearTimeout(m),ot.delete(x)),lt.delete(x)}return{scheduleFor:k,cancelFor:C}}const Cn={key:0,class:"p-3 space-y-3"},Tn={key:0,class:"text-xs text-gray-500"},jn={key:1,class:"text-xs text-gray-500"},Sn={key:2,class:"text-xs text-gray-500"},wn={class:"space-y-1"},Rn=["checked","onChange"],Dn={key:1,class:"p-3 space-y-3"},An={class:"flex items-center justify-between"},zn={class:"font-medium text-sm inline-flex items-center gap-1"},Un={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},In={key:1,class:"text-xs text-muted text-center py-2"},Mn={key:2,class:"space-y-1.5"},Fn={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},Pn={class:"space-y-1"},En=["value"],Bn={class:"flex gap-1.5 justify-end"},Vn={class:"flex-1 font-medium truncate"},Ln={key:3,class:"text-xs text-muted text-center py-1"},Nn={key:4,class:"space-y-2 border-t border-default pt-2"},Kn={class:"space-y-1"},On=["value"],qn={class:"flex gap-1.5 justify-end"},Hn=ie({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(U){let $,k;const C=U,x=wt(),m=x.public.demoMode,i=N(()=>x.public.authEnabled),{authState:M}=Ot(),D=N(()=>M.value.authenticated),A=Ae(),v=I(!1),_=m?$n():null,b=!i.value&&!m?qs():null,z=I("default"),p=N(()=>"Notification"in window);"Notification"in window&&(z.value=Notification.permission);const y=N(()=>b?.getProject(C.projectId).events??[]),P=N(()=>b?.isSubscribed(C.projectId)??!1);async function K(){!p.value||z.value!=="default"||(z.value=await Notification.requestPermission())}function S(L){return y.value.includes(L)}function g(L){b?.toggleEvent(C.projectId,L)}const T=m||i.value&&D.value,Q=m?{server:!1}:{},{data:w,refresh:H}=([$,k]=xe(()=>be(`/api/subscriptions?projectId=${C.projectId}`,{immediate:T,...Q},"$5zp4moJ-7_")),$=await $,k(),$),B=N(()=>w.value?.subscriptions??[]),ue=N(()=>B.value.length>0),{data:ge}=([$,k]=xe(()=>be("/api/channels",{immediate:T,...Q},"$vFApQ6eA2X")),$=await $,k(),$),h=N(()=>ge.value?.channels??[]),j=I(!1),q=I(void 0),de=I(["run.failed"]),ze=I(!1),me=I(null),he=I(void 0),fe=I([]),Ue=I(!1);function mt(L){me.value=L,he.value=L.channel.id,fe.value=[...L.events]}function pt(){me.value=null}async function W(){if(!(!me.value||!he.value||fe.value.length===0)){Ue.value=!0;try{await $fetch(`/api/subscriptions/${me.value.id}`,{method:"PATCH",body:{channelId:he.value,events:fe.value}}),await H(),me.value=null}catch(L){A.add({title:"Update failed",description:String(L?.message??L),color:"error"})}finally{Ue.value=!1}}}const Xe=N(()=>h.value.map(L=>({label:L.type==="personal_email"?`${L.name} (${L.config.address})`:L.name,value:L.id}))),Le=bn.map(L=>({label:L.replace(/\./g," › "),value:L}));ye(v,L=>{L?(T&&H(),h.value.length>0&&!q.value&&(q.value=h.value[0].id)):(j.value=!1,me.value=null)});async function Ne(){if(!(!q.value||de.value.length===0)){ze.value=!0;try{await $fetch("/api/subscriptions",{method:"POST",body:{channelId:q.value,projectId:C.projectId,events:de.value,mode:"realtime"}}),await H(),j.value=!1,A.add({title:"Subscribed",color:"success"}),m&&_?.scheduleFor(C.projectId,C.projectLabel||"this project",de.value)}catch(L){A.add({title:"Subscribe failed",description:String(L?.message??L),color:"error"})}finally{ze.value=!1}}}async function gt(L){try{await $fetch(`/api/subscriptions/${L}`,{method:"DELETE"}),await H(),A.add({title:"Unsubscribed",color:"success"}),m&&B.value.length===0&&_?.cancelFor(C.projectId)}catch(F){A.add({title:"Failed",description:String(F?.message??F),color:"error"})}}async function ne(L){const F=L.mutedUntil&&new Date(L.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${L.id}`,{method:"PATCH",body:{mutedUntil:F?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await H()}catch(Z){A.add({title:"Failed",description:String(Z?.message??Z),color:"error"})}}function pe(L){return L.mutedUntil&&new Date(L.mutedUntil)>new Date}function Ke(L){return L==="personal_email"?"i-lucide-user-round":L==="email"?"i-lucide-mail":L==="slack"?"i-lucide-slack":"i-lucide-webhook"}const ft=N(()=>m||i.value&&D.value||b!=null),Oe=N(()=>m||i.value?ue.value:P.value);return(L,F)=>{const Z=ke,_t=Ks,Te=Qe,Ye=Pe,We=Ee,Ie=Be,je=Qt,vt=Fs;return e(ft)?(s(),f(vt,{key:0,open:e(v),"onUpdate:open":F[6]||(F[6]=O=>X(v)?v.value=O:null),ui:{content:"w-72"}},{content:t(()=>[e(b)?(s(),r("div",Cn,[F[9]||(F[9]=n("div",{class:"flex items-center justify-between"},[n("span",{class:"font-medium text-sm"},"Browser notifications")],-1)),e(p)&&e(z)==="default"?(s(),r("p",Tn,[a(Z,{variant:"link",size:"xs",class:"p-0",onClick:K},{default:t(()=>[...F[7]||(F[7]=[d(" Allow notifications ",-1)])]),_:1}),F[8]||(F[8]=d(" "+c(" ")+"in your browser to get alerts for this project. ",-1))])):e(p)&&e(z)==="denied"?(s(),r("p",jn," Notifications are blocked. Check your browser settings to allow them. ")):e(p)?R("",!0):(s(),r("p",Sn,"Notifications are not supported in this browser.")),e(p)&&e(z)==="granted"?(s(),r(J,{key:3},[a(_t),n("div",wn,[(s(!0),r(J,null,ae(e(Le),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[n("input",{type:"checkbox",checked:S(O.value),class:"accent-primary size-3",onChange:oe=>g(O.value)},null,40,Rn),d(" "+c(O.label),1)]))),128))])],64)):R("",!0)])):(s(),r("div",Dn,[n("div",An,[n("span",zn,[F[10]||(F[10]=d(" Notifications ",-1)),a(Te,{topic:"notifications.subscribe"})]),e(j)?R("",!0):(s(),f(Z,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(h).length===0,onClick:F[0]||(F[0]=O=>j.value=!0)},{default:t(()=>[...F[11]||(F[11]=[d(" Add ",-1)])]),_:1},8,["disabled"]))]),e(m)?(s(),r("div",Un,[a(Ye,{name:"i-lucide-sparkles",class:"size-3 inline-block mr-1 text-primary"}),F[12]||(F[12]=d(" Demo — notifications will appear as toasts in ~8 s. ",-1))])):e(h).length===0?(s(),r("div",In,[F[14]||(F[14]=d(" No channels configured.",-1)),F[15]||(F[15]=n("br",null,null,-1)),a(We,{to:"/settings/notifications",class:"text-primary underline"},{default:t(()=>[...F[13]||(F[13]=[d("Add one in Settings",-1)])]),_:1})])):R("",!0),e(B).length>0?(s(),r("div",Mn,[(s(!0),r(J,null,ae(e(B),O=>(s(),r(J,{key:O.id},[e(me)?.id===O.id?(s(),r("div",Fn,[a(je,{label:"Channel",size:"xs"},{default:t(()=>[a(Ie,{modelValue:e(he),"onUpdate:modelValue":F[1]||(F[1]=oe=>X(he)?he.value=oe:null),items:e(Xe),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(je,{label:"Events",size:"xs"},{default:t(()=>[n("div",Pn,[(s(!0),r(J,null,ae(e(Le),oe=>(s(),r("label",{key:oe.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Lt(n("input",{type:"checkbox",value:oe.value,"onUpdate:modelValue":F[2]||(F[2]=qe=>X(fe)?fe.value=qe:null),class:"accent-primary size-3"},null,8,En),[[Nt,e(fe)]]),d(" "+c(oe.label),1)]))),128))])]),_:1}),n("div",Bn,[a(Z,{size:"xs",color:"neutral",variant:"ghost",onClick:pt},{default:t(()=>[...F[16]||(F[16]=[d("Cancel",-1)])]),_:1}),a(Z,{size:"xs",color:"primary",loading:e(Ue),disabled:!e(he)||e(fe).length===0,onClick:W},{default:t(()=>[...F[17]||(F[17]=[d(" Save ",-1)])]),_:1},8,["loading","disabled"])])])):(s(),r("div",{key:1,class:re(["flex items-center gap-2 rounded px-2 py-1.5 text-xs",pe(O)?"opacity-60":""])},[a(Ye,{name:Ke(O.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),n("span",Vn,c(O.channel.name),1),a(Z,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:oe=>mt(O)},null,8,["onClick"]),a(Z,{icon:pe(O)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:pe(O)?"Unmute":"Mute 7 days",onClick:oe=>ne(O)},null,8,["icon","title","onClick"]),a(Z,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:oe=>gt(O.id)},null,8,["onClick"])],2))],64))),128))])):!e(j)&&e(h).length>0?(s(),r("div",Ln," Not subscribed to this project. ")):R("",!0),e(j)?(s(),r("div",Nn,[a(je,{label:"Channel",size:"xs"},{default:t(()=>[a(Ie,{modelValue:e(q),"onUpdate:modelValue":F[3]||(F[3]=O=>X(q)?q.value=O:null),items:e(Xe),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(je,{label:"Events",size:"xs"},{default:t(()=>[n("div",Kn,[(s(!0),r(J,null,ae(e(Le),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Lt(n("input",{type:"checkbox",value:O.value,"onUpdate:modelValue":F[4]||(F[4]=oe=>X(de)?de.value=oe:null),class:"accent-primary size-3"},null,8,On),[[Nt,e(de)]]),d(" "+c(O.label),1)]))),128))])]),_:1}),n("div",qn,[a(Z,{size:"xs",color:"neutral",variant:"ghost",onClick:F[5]||(F[5]=O=>j.value=!1)},{default:t(()=>[...F[18]||(F[18]=[d("Cancel",-1)])]),_:1}),a(Z,{size:"xs",color:"primary",loading:e(ze),disabled:!e(q)||e(de).length===0,onClick:Ne},{default:t(()=>[...F[19]||(F[19]=[d(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):R("",!0)]))]),default:t(()=>[a(Z,{icon:e(Oe)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Oe)?"primary":"neutral",variant:e(Oe)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):R("",!0)}}}),Qn=Object.assign(Hn,{__name:"SubscribeBell"}),Gn={key:0,class:"flex items-center justify-between gap-3"},Jn={class:"flex items-center gap-2 min-w-0 text-sm"},Xn={class:"text-xs break-all"},Yn={class:"flex items-center gap-1.5 shrink-0"},Wn={key:1,class:"flex items-center justify-between gap-3"},Zn=ie({__name:"DesktopProjectLinkCard",props:{projectId:{}},setup(U){const $=U,{available:k,link:C,busy:x,pickAndLink:m,unlink:i}=Js(()=>$.projectId);return(M,D)=>{const A=Pe,v=$e,_=ke,b=ct;return e(k)?(s(),f(b,{key:0,icon:"i-lucide-folder-symlink",title:"Local folder"},{subtitle:t(()=>[...D[0]||(D[0]=[d(" Link this project to its checkout on this machine to retry failures from here and open files in your IDE. ",-1)])]),default:t(()=>[e(C)?(s(),r("div",Gn,[n("div",Jn,[a(A,{name:e(C).exists?"i-lucide-folder-check":"i-lucide-folder-x",class:re(["size-4 shrink-0",e(C).exists?"text-success":"text-warning"])},null,8,["name","class"]),n("code",Xn,c(e(C).path),1),e(C).exists?R("",!0):(s(),f(v,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:t(()=>[...D[1]||(D[1]=[d("missing",-1)])]),_:1}))]),n("div",Yn,[a(_,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-folder-search",loading:e(x),onClick:e(m)},{default:t(()=>[...D[2]||(D[2]=[d(" Change ",-1)])]),_:1},8,["loading","onClick"]),a(_,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-unlink",disabled:e(x),onClick:e(i)},{default:t(()=>[...D[3]||(D[3]=[d(" Unlink ",-1)])]),_:1},8,["disabled","onClick"])])])):(s(),r("div",Wn,[D[5]||(D[5]=n("p",{class:"text-sm text-muted"},"No folder linked yet.",-1)),a(_,{size:"xs",icon:"i-lucide-folder-plus",loading:e(x),onClick:e(m)},{default:t(()=>[...D[4]||(D[4]=[d("Choose folder…",-1)])]),_:1},8,["loading","onClick"])]))]),_:1})):R("",!0)}}}),ea=Object.assign(Zn,{__name:"DesktopProjectLinkCard"}),ta={class:"w-full relative"},sa={key:0},na={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},aa={class:"font-semibold mb-1"},oa={class:"capitalize mb-1"},la={class:"space-y-0.5"},ra={class:"font-medium mt-1"},ia=ie({__name:"TestRunsChart",props:{testRuns:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:$}){const k=U,C=$,x=N(()=>k.markers),m=N(()=>!k.testRuns||k.testRuns.length===0?[]:[...k.testRuns].sort((T,Q)=>new Date(T.startTime).getTime()-new Date(Q.startTime).getTime()).slice(-30).map(T=>({id:T.id,date:new Date(T.startTime),passed:T.passedTests||0,failed:T.failedTests||0,skipped:T.skippedTests||0,flaky:T.flakyTests||0,total:T.totalTests||0,status:T.status}))),i=g=>g.date,M=g=>g.passed,D=g=>g.failed,A=g=>g.skipped,v=g=>g.flaky,_=["rgb(34, 197, 94)","rgb(239, 68, 68)","rgb(245, 158, 11)","rgb(147, 51, 234)"],b=I(null),{tooltipData:z,tooltipPos:p,markerTooltip:y,markerTooltipPos:P,onRenderComplete:K}=Zt(b,m,{x:g=>g.date,series:[{y:g=>g.passed,color:_[0]},{y:g=>g.failed,color:_[1]},{y:g=>g.skipped,color:_[2]},{y:g=>g.flaky,color:_[3]}],onClick:g=>Rt(`/test-runs/${g.id}`),markers:x,onMarkerClick:g=>C("marker-click",g.id)}),S=[{color:_[0],label:"Passed"},{color:_[1],label:"Failed"},{color:_[2],label:"Skipped"},{color:_[3],label:"Flaky"}];return(g,T)=>{const Q=Jt,w=Ce,H=Wt;return s(),r("div",ta,[e(m).length>0?(s(),r("div",sa,[a(e(Yt),{ref_key:"xyContainerRef",ref:b,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(K)},{default:t(()=>[a(e(Xs),{x:i,y:[M,D,A,v],color:_,"curve-type":e(St).MonotoneX},null,8,["y","curve-type"]),a(e(Xt),{x:i,y:[M,D,A,v],color:_,"curve-type":e(St).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(rt),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),a(e(rt),{type:"y",label:"Tests","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(z)?(s(),r("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[260px]",style:qt({left:`${e(p).x}px`,top:`${e(p).y}px`})},[n("div",na,[n("div",aa,c(new Date(e(z).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",oa,"Status: "+c(e(z).status),1),n("div",la,[n("div",null,[T[0]||(T[0]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Passed: "+c(e(z).passed),1)]),n("div",null,[T[1]||(T[1]=n("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),d(" Failed: "+c(e(z).failed),1)]),n("div",null,[T[2]||(T[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" Skipped: "+c(e(z).skipped),1)]),n("div",null,[T[3]||(T[3]=n("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),d(" Flaky: "+c(e(z).flaky),1)]),n("div",ra,"Total: "+c(e(z).total),1)]),T[4]||(T[4]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):R("",!0),a(Q,{marker:e(y),pos:e(P)},null,8,["marker","pos"])])):(s(),f(w,{key:1,text:"No test run data available to display chart"})),a(H,{items:S})])}}}),ca=Object.assign(ia,{__name:"TestRunsChart"}),ua={class:"space-y-3"},da={class:"min-w-0 space-y-1"},ma={class:"flex items-center gap-2 flex-wrap text-sm"},pa={key:0,class:"text-gray-500"},ga=["title"],fa=["title"],_a={key:0,class:"text-xs text-gray-500 italic"},va={class:"flex items-center gap-2 shrink-0"},ya=ie({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=I([]),i=I(null);async function M(){try{m.value=await $fetch(`/api/projects/${k.projectId}/cluster-merge-suggestions`)}catch{m.value=[]}}ye(()=>k.projectId,M,{immediate:!0});async function D(v,_){i.value=v;try{await $fetch(`/api/cluster-merge-suggestions/${v}/${_}`,{method:"POST"}),x.add({title:_==="approve"?"Clusters merged":"Suggestion dismissed",color:"success"}),await M(),_==="approve"&&C("merged")}catch(b){x.add({title:"Action failed",description:String(b?.message??b),color:"error"})}finally{i.value=null}}const A=v=>v==null?"":`${Math.round(v*100)}% similar`;return(v,_)=>{const b=$e,z=ke,p=ct;return e(m).length?(s(),f(p,{key:0,icon:"i-lucide-git-merge",title:"Suggested merges",count:e(m).length,class:"mb-4"},{subtitle:t(()=>[..._[0]||(_[0]=[d(" Likely-duplicate clusters found by semantic analysis. Approving merges them into the older cluster. ",-1)])]),default:t(()=>[n("div",ua,[(s(!0),r(J,null,ae(e(m),y=>(s(),r("div",{key:y.id,class:"rounded-lg border border-default p-3 flex items-start justify-between gap-4"},[n("div",da,[n("div",ma,[a(b,{color:y.method==="llm"?"primary":"neutral",variant:"subtle",size:"sm"},{default:t(()=>[d(c(y.method==="llm"?`AI · ${y.llmConfidence??""}`:"similarity"),1)]),_:2},1032,["color"]),A(y.score)?(s(),r("span",pa,c(A(y.score)),1)):R("",!0)]),n("p",{class:"text-sm truncate",title:y.clusterA?.signature||""},[_[1]||(_[1]=n("span",{class:"text-gray-400"},"A:",-1)),d(" "+c(y.clusterA?.signature||`#${y.id}`),1)],8,ga),n("p",{class:"text-sm truncate",title:y.clusterB?.signature||""},[_[2]||(_[2]=n("span",{class:"text-gray-400"},"B:",-1)),d(" "+c(y.clusterB?.signature||""),1)],8,fa),y.llmReason?(s(),r("p",_a,c(y.llmReason),1)):R("",!0)]),n("div",va,[a(z,{size:"sm",color:"primary",icon:"i-lucide-git-merge",loading:e(i)===y.id,onClick:P=>D(y.id,"approve")},{default:t(()=>[..._[3]||(_[3]=[d(" Merge ",-1)])]),_:1},8,["loading","onClick"]),a(z,{size:"sm",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:e(i)===y.id,onClick:P=>D(y.id,"reject")},{default:t(()=>[..._[4]||(_[4]=[d(" Dismiss ",-1)])]),_:1},8,["disabled","onClick"])])]))),128))])]),_:1},8,["count"])):R("",!0)}}}),ha=Object.assign(ya,{__name:"ClusterMergeSuggestions"}),xa={class:"flex items-center justify-between"},ba={class:"text-sm text-gray-500 inline-flex items-center gap-1"},ka={class:"min-w-0 space-y-0.5"},$a={key:0,class:"text-xs text-gray-500 italic truncate"},Ca={key:1,class:"text-gray-400 text-xs"},Ta={class:"space-y-1"},ja={class:"text-sm tabular-nums"},Sa={class:"text-sm tabular-nums"},wa={key:1,class:"text-gray-400 text-xs"},Ra={class:"text-sm text-gray-500 whitespace-nowrap"},Da={key:0,class:"ml-1 text-xs text-gray-400"},Aa={class:"flex justify-end"},za=ie({__name:"FailureClustersList",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(void 0),{data:m,pending:i}=([$,k]=xe(()=>be(()=>{const A=new URLSearchParams;x.value&&A.set("status",x.value);const v=A.toString();return`/api/projects/${C.projectId}/failure-clusters${v?`?${v}`:""}`},{lazy:!0,server:!1,watch:[x]},"$f7pDU1t-lL")),$=await $,k(),$),M=A=>ln(A.fixVerification),D=[{accessorKey:"signature",header:V("Signature")},{accessorKey:"errorType",header:V("Type")},{accessorKey:"status",header:V("Status")},{accessorKey:"affectedTests",header:V("Tests")},{accessorKey:"occurrences",header:V("Occurrences")},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"lastSeenAt",header:V("Last seen")},{id:"actions",header:"Actions"}];return(A,v)=>{const _=Qe,b=Be,z=Ee,p=$e,y=Pe,P=es,K=ke,S=Ve,g=Je,T=Ce,Q=Ge;return s(),f(Q,null,{header:t(()=>[n("div",xa,[n("p",ba,[v[1]||(v[1]=d(" Ongoing failure signatures grouped by normalized error. ",-1)),a(_,{topic:"cluster.concept"})]),a(b,{modelValue:e(x),"onUpdate:modelValue":v[0]||(v[0]=w=>X(x)?x.value=w:null),items:[{label:"All",value:void 0},{label:"Open",value:"open"},{label:"Resolved",value:"resolved"},{label:"Ignored",value:"ignored"}],size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[a(g,{"min-width":"48rem",bleed:!1},{default:t(()=>[a(S,{data:e(m)??[],columns:D,loading:e(i)},{"actions-header":t(()=>[...v[2]||(v[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":t(({row:w})=>[n("div",ka,[a(z,{to:`/failure-clusters/${w.original.id}`,class:re(["text-sm text-primary hover:underline truncate block",w.original.title?"":"font-mono"]),title:w.original.signature},{default:t(()=>[d(c(w.original.title||w.original.signature),1)]),_:2},1032,["to","class","title"]),w.original.triageNote?(s(),r("p",$a,c(w.original.triageNote),1)):R("",!0)])]),"errorType-cell":t(({row:w})=>[w.original.errorType?(s(),f(p,{key:0,color:("clusterErrorTypeColor"in A?A.clusterErrorTypeColor:e(on))(w.original.errorType),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.errorType),1)]),_:2},1032,["color"])):(s(),r("span",Ca,"—"))]),"status-cell":t(({row:w})=>[n("div",Ta,[a(p,{color:("clusterStatusColor"in A?A.clusterStatusColor:e(an))(w.original.status),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.status),1)]),_:2},1032,["color"]),M(w.original)?(s(),f(P,{key:0,text:M(w.original).hint},{default:t(()=>[a(p,{color:M(w.original).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(y,{name:M(w.original).icon,class:"size-3"},null,8,["name"]),d(" "+c(M(w.original).label),1)]),_:2},1032,["color"])]),_:2},1032,["text"])):R("",!0)])]),"affectedTests-cell":t(({row:w})=>[n("span",ja,c(w.original.affectedTests),1)]),"occurrences-cell":t(({row:w})=>[n("span",Sa,c(w.original.occurrences),1)]),"diagnosis-cell":t(({row:w})=>[w.original.diagnosis?.status==="completed"&&w.original.diagnosis.category?(s(),f(p,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(y,{name:"i-lucide-sparkles",class:"size-3"}),d(" "+c(w.original.diagnosis.category),1)]),_:2},1024)):(s(),r("span",wa,"—"))]),"lastSeenAt-cell":t(({row:w})=>[n("div",Ra,[a(z,{to:`/test-runs/${w.original.lastSeenRunId}`,class:"text-primary hover:underline"},{default:t(()=>[d(" run #"+c(w.original.lastSeenRunId),1)]),_:2},1032,["to"]),w.original.lastSeenAt?(s(),r("span",Da," ("+c(("formatRelativeTime"in A?A.formatRelativeTime:e(At))(w.original.lastSeenAt))+") ",1)):R("",!0)])]),"actions-cell":t(({row:w})=>[n("div",Aa,[a(K,{to:`/failure-clusters/${w.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...v[3]||(v[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(i)&&e(m)&&e(m).length===0?(s(),f(T,{key:0,text:"No failure clusters recorded for this project.",padded:!1,class:"py-4"})):R("",!0)]),_:1})}}}),Ua=Object.assign(za,{__name:"FailureClustersList"}),Ia={class:"flex items-center justify-between"},Ma={class:"flex items-center gap-3"},Fa={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Pa={class:"flex items-center gap-1.5"},Ea={class:"min-w-0 space-y-0.5"},Ba={class:"flex items-center gap-2"},Va={class:"text-sm tabular-nums"},La={class:"text-sm tabular-nums"},Na={key:1,class:"text-gray-400 text-xs"},Ka={key:1,class:"text-gray-400 text-xs"},Oa={key:1,class:"text-gray-400 text-xs"},qa={key:0,class:"text-sm text-gray-500"},Ha={key:1,class:"text-gray-400 text-xs"},Qa={class:"flex justify-end"},Ga={key:0,class:"text-sm text-gray-500 py-4 text-center"},Ja=ie({__name:"FlakyTestsList",props:{projectId:{},environment:{},projectName:{}},async setup(U){let $,k;const C=U,x=I(50),m=I([]),{data:i,pending:M}=([$,k]=xe(()=>be(()=>{const p=new URLSearchParams({runs:String(x.value)});return C.environment&&p.set("environment",C.environment),`/api/projects/${C.projectId}/flaky-tests?${p.toString()}`},{lazy:!0,server:!1,watch:[x,()=>C.environment]},"$qKoEnbecbI")),$=await $,k(),$),D=N(()=>m.value.length===0?i.value??[]:(i.value??[]).filter(p=>m.value.includes(p.rootCause??"")));function A(p){return p>=60?"error":p>=30?"warning":"neutral"}function v(p){switch(p){case"timing":return"amber";case"network":return"red";case"assertion":return"blue";case"environment":return"purple";default:return"gray"}}function _(p){m.value.indexOf(p)>=0?m.value=m.value.filter(P=>P!==p):m.value=[...m.value,p]}const b=[{label:"Timing",value:"timing"},{label:"Network",value:"network"},{label:"Assertion",value:"assertion"},{label:"Environment",value:"environment"},{label:"Other",value:"other"}],z=[{accessorKey:"title",header:V("Test")},{accessorKey:"impact",header:V("Impact")},{accessorKey:"score",header:V("Score")},{accessorKey:"failureRate",header:V("Failure rate")},{accessorKey:"retryPassRuns",header:V("Retry passes")},{accessorKey:"alternations",header:V("Flips")},{accessorKey:"rootCause",header:"Root cause"},{accessorKey:"lastFlakeAt",header:V("Last flake")},{id:"actions",header:"Actions"}];return(p,y)=>{const P=Qe,K=Pe,S=$e,g=ke,T=Be,Q=Ee,w=ss,H=ut,B=Gt,ue=Ve,ge=Je,h=Ge;return s(),f(h,null,{header:t(()=>[n("div",Ia,[n("div",Ma,[n("p",Fa,[y[1]||(y[1]=d(" Tests that fail intermittently — detected by retry passes and status alternations ",-1)),a(P,{topic:"project.flaky-tests"})]),U.environment?(s(),f(S,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(K,{name:"i-lucide-layers",class:"size-3"}),d(" "+c(U.environment),1)]),_:1})):R("",!0),n("div",Pa,[(s(),r(J,null,ae(b,j=>a(g,{key:j.value,size:"xs",variant:e(m).includes(j.value)?"solid":"outline",color:(e(m).includes(j.value),"neutral"),onClick:q=>_(j.value)},{default:t(()=>[d(c(j.label),1)]),_:2},1032,["variant","color","onClick"])),64))])]),a(T,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=j=>X(x)?x.value=j:null),items:[{label:"Last 20 runs",value:20},{label:"Last 50 runs",value:50},{label:"Last 100 runs",value:100}],size:"xs",class:"w-36"},null,8,["modelValue"])])]),default:t(()=>[a(ge,{"min-width":"52rem",bleed:!1},{default:t(()=>[a(ue,{data:e(D),columns:z,loading:e(M),sticky:"",class:"max-h-[32rem]"},{"actions-header":t(()=>[...y[2]||(y[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"title-cell":t(({row:j})=>[n("div",Ea,[a(Q,{to:`/test-run-cases/${j.original.latestRunsCaseId}`,class:"text-sm font-medium text-primary hover:underline truncate block",title:j.original.title},{default:t(()=>[d(c(j.original.title),1)]),_:2},1032,["to","title"]),a(w,{tags:j.original.tags,meta:{owner:j.original.owner??void 0,priority:("toTestPriority"in p?p.toTestPriority:e(rn))(j.original.priority)},"max-tags":3},null,8,["tags","meta"]),a(H,{"file-path":j.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])])]),"impact-cell":t(({row:j})=>[n("div",Ba,[n("span",{class:re(["inline-block w-2 h-2 rounded-full shrink-0",{"bg-red-500":j.original.wastedCiMinutes>=30,"bg-amber-500":j.original.wastedCiMinutes>=5&&j.original.wastedCiMinutes<30,"bg-green-500":j.original.wastedCiMinutes>=0&&j.original.wastedCiMinutes<5}])},null,2),n("span",Va,c(Math.round(j.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":t(({row:j})=>[a(S,{color:A(j.original.score),variant:"subtle",size:"sm"},{default:t(()=>[d(c(j.original.score),1)]),_:2},1032,["color"])]),"failureRate-cell":t(({row:j})=>[n("span",La,c(Math.round(j.original.failureRate*100))+"%",1)]),"retryPassRuns-cell":t(({row:j})=>[j.original.retryPassRuns?(s(),f(S,{key:0,color:"warning",variant:"outline",size:"sm"},{default:t(()=>[d(c(j.original.retryPassRuns)+" run"+c(j.original.retryPassRuns===1?"":"s"),1)]),_:2},1024)):(s(),r("span",Na,"—"))]),"alternations-cell":t(({row:j})=>[j.original.alternations>=2?(s(),f(S,{key:0,color:"neutral",variant:"outline",size:"sm"},{default:t(()=>[d(c(j.original.alternations),1)]),_:2},1024)):(s(),r("span",Ka,"—"))]),"rootCause-cell":t(({row:j})=>[j.original.rootCause?(s(),f(B,{key:0,text:j.original.rootCause,color:v(j.original.rootCause)},null,8,["text","color"])):(s(),r("span",Oa,"—"))]),"lastFlakeAt-cell":t(({row:j})=>[j.original.lastFlakeAt?(s(),r("span",qa,c(("formatRelativeTime"in p?p.formatRelativeTime:e(At))(j.original.lastFlakeAt)),1)):(s(),r("span",Ha,"—"))]),"actions-cell":t(({row:j})=>[n("div",Qa,[a(g,{to:`/test-run-cases/${j.original.latestRunsCaseId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...y[3]||(y[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(M)&&e(D).length===0?(s(),r("p",Ga," No flaky tests detected in the last "+c(e(x))+" runs. ",1)):R("",!0)]),_:1})}}}),Xa=Object.assign(Ja,{__name:"FlakyTestsList"}),Ya={class:"w-full relative"},Wa={key:0},Za={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},eo={class:"font-semibold mb-1"},to={class:"capitalize mb-1"},so={class:"space-y-0.5"},no={class:"mt-1"},ao={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},oo=ie({__name:"PerformanceTrendChart",props:{data:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:$}){const k=U,C=$,x=N(()=>k.markers),m=N(()=>!k.data||k.data.length===0?[]:k.data.map(S=>({id:S.id,date:new Date(S.startTime),duration:S.duration?Math.round(S.duration/1e3):null,avgTestDuration:S.avgTestDuration?Math.round(S.avgTestDuration/1e3):null,p90TestDuration:S.p90TestDuration?Math.round(S.p90TestDuration/1e3):null,commit:S.commit?S.commit.substring(0,7):null,status:S.status,totalTests:S.totalTests}))),i=S=>S.date,M=S=>S.duration??void 0,D=S=>S.avgTestDuration??void 0,A=S=>S.p90TestDuration??void 0,v=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],_=I(null),{tooltipData:b,tooltipPos:z,markerTooltip:p,markerTooltipPos:y,onRenderComplete:P}=Zt(_,m,{x:S=>S.date,series:[{y:S=>S.duration,color:v[0]},{y:S=>S.avgTestDuration,color:v[1]},{y:S=>S.p90TestDuration,color:v[2]}],onClick:S=>Rt(`/test-runs/${S.id}`),markers:x,onMarkerClick:S=>C("marker-click",S.id)}),K=[{color:v[0],label:"Total Duration"},{color:v[1],label:"Avg Test Duration"},{color:v[2],label:"P90 Test Duration"}];return(S,g)=>{const T=Jt,Q=Ce,w=Wt;return s(),r("div",Ya,[e(m).length>0?(s(),r("div",Wa,[a(e(Yt),{ref_key:"xyContainerRef",ref:_,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(P)},{default:t(()=>[a(e(Xt),{x:i,y:[M,D,A],color:v,"curve-type":e(St).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(rt),{type:"x","tick-format":H=>new Date(H).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),a(e(rt),{type:"y",label:"Duration (s)","tick-format":H=>`${H}s`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(b)?(s(),r("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[260px]",style:qt({left:`${e(z).x}px`,top:`${e(z).y}px`})},[n("div",Za,[n("div",eo,c(new Date(e(b).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",to,"Status: "+c(e(b).status),1),n("div",so,[n("div",null,[g[0]||(g[0]=n("span",{class:"text-blue-500 dark:text-blue-400"},"●",-1)),d(" Total: "+c(e(b).duration??"-")+"s ",1)]),n("div",null,[g[1]||(g[1]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Avg: "+c(e(b).avgTestDuration??"-")+"s ",1)]),n("div",null,[g[2]||(g[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" P90: "+c(e(b).p90TestDuration??"-")+"s ",1)]),n("div",no,"Tests: "+c(e(b).totalTests),1),e(b).commit?(s(),r("div",ao," Commit: "+c(e(b).commit),1)):R("",!0)]),g[3]||(g[3]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):R("",!0),a(T,{marker:e(p),pos:e(y)},null,8,["marker","pos"])])):(s(),f(Q,{key:1,text:"No performance data available to display chart"})),a(w,{items:K})])}}}),lo=Object.assign(oo,{__name:"PerformanceTrendChart"}),ro={class:"min-w-0"},io={class:"mt-1"},co={class:"tabular-nums"},uo={key:0,class:"ml-1 text-xs text-gray-500",title:"timeout ÷ p95"},mo={class:"tabular-nums text-gray-500"},po={key:0,class:"text-sm"},go={key:1,class:"tabular-nums"},fo={class:"tabular-nums font-medium text-green-600 dark:text-green-400"},_o={class:"tabular-nums text-gray-500"},vo=ie({__name:"TimeoutOpportunitiesTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,{data:x,pending:m}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/timeout-opportunities`,{lazy:!0,server:!1},"$tMBJjTyDol")),$=await $,k(),$),i=N(()=>x.value??[]);function M(A){return A==null?"—":A<1e3?`${A}ms`:`${(A/1e3).toFixed(1)}s`}const D=[{accessorKey:"title",header:V("Test case")},{accessorKey:"kind",header:"Type"},{accessorKey:"timeout",header:V("Timeout")},{accessorKey:"p95",header:V("p95")},{accessorKey:"recommendedTimeout",header:"Recommendation"},{accessorKey:"estimatedSavingMs",header:V("Est. saving / failure")},{accessorKey:"runCount",header:V("Runs")}];return(A,v)=>{const _=dt,b=Ce,z=Ee,p=ut,y=$e,P=Ve,K=Je,S=Ge;return s(),f(S,null,{header:t(()=>[...v[0]||(v[0]=[n("h2",{class:"text-xl font-semibold"},"Timeout opportunities",-1),n("p",{class:"text-sm text-gray-600 mt-1"},[d(" Tests whose configured timeout far exceeds their real duration, or that still carry a stale "),n("code",{class:"text-xs"},"test.slow()"),d(" mark — tightening these makes failures surface sooner. ")],-1)])]),default:t(()=>[e(m)?(s(),f(_,{key:0})):e(i).length===0?(s(),f(b,{key:1,text:"No timeout opportunities",description:"No oversized timeouts or stale test.slow() marks were found for this project."})):(s(),f(K,{key:2,"min-width":"52rem",bleed:!1},{default:t(()=>[a(P,{data:e(i),columns:D,sticky:"",class:"max-h-[32rem]"},{"title-cell":t(({row:g})=>[n("div",ro,[a(z,{to:`/test-cases/${g.original.testCaseId}`,class:"font-medium truncate block hover:text-primary hover:underline"},{default:t(()=>[d(c(g.original.title),1)]),_:2},1032,["to"]),n("div",io,[a(p,{"file-path":g.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"kind-cell":t(({row:g})=>[a(y,{color:g.original.kind==="oversized-timeout"?"warning":"info",variant:"subtle",size:"sm"},{default:t(()=>[d(c(g.original.kind==="oversized-timeout"?"Oversized timeout":"Stale test.slow()"),1)]),_:2},1032,["color"])]),"timeout-cell":t(({row:g})=>[n("span",co,c(M(g.original.timeout)),1),g.original.headroomRatio!=null?(s(),r("span",uo," ("+c(g.original.headroomRatio)+"×) ",1)):R("",!0)]),"p95-cell":t(({row:g})=>[n("span",mo,c(M(g.original.p95)),1)]),"recommendedTimeout-cell":t(({row:g})=>[g.original.kind==="stale-slow"?(s(),r("span",po,[...v[1]||(v[1]=[d("Remove ",-1),n("code",{class:"text-xs"},"test.slow()",-1)])])):(s(),r("span",go,"Lower to ~"+c(M(g.original.recommendedTimeout)),1))]),"estimatedSavingMs-cell":t(({row:g})=>[n("span",fo,c(M(g.original.estimatedSavingMs)),1)]),"runCount-cell":t(({row:g})=>[n("span",_o,c(g.original.runCount),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),yo=Object.assign(vo,{__name:"TimeoutOpportunitiesTable"}),ho={class:"flex items-center justify-between"},xo={class:"text-sm text-gray-500 inline-flex items-center gap-1"},bo={class:"truncate font-mono text-xs"},ko={class:"tabular-nums"},$o={class:"tabular-nums text-gray-500"},Co={class:"tabular-nums text-gray-500"},To=ie({__name:"SpecHealthTable",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(30),{data:m,pending:i}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/spec-health?days=${x.value}`,{lazy:!0,server:!1,watch:[x]},"$QL0nEFEG1b")),$=await $,k(),$),M=N(()=>m.value?.specs??[]);function D(p){return p>=.9?"bg-green-500":p>=.7?"bg-amber-500":p>0?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function A(p){return p>=.9?"text-green-600 dark:text-green-400":p>=.7?"text-amber-600 dark:text-amber-400":p>0?"text-red-600 dark:text-red-400":"text-gray-500"}function v(p){return`${Math.round(p*100)}%`}function _(p){return p<1e3?`${p}ms`:`${(p/1e3).toFixed(1)}s`}const b=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],z=[{accessorKey:"prefix",header:V("Spec prefix")},{accessorKey:"passRate",header:V("Pass rate")},{accessorKey:"flakyRate",header:V("Flaky")},{accessorKey:"failureCount",header:V("Failures")},{accessorKey:"testCount",header:V("Tests")},{accessorKey:"avgDuration",header:V("Avg time")}];return(p,y)=>{const P=Qe,K=Be,S=dt,g=Ce,T=Ee,Q=Ve,w=Je,H=Ge;return s(),f(H,null,{header:t(()=>[n("div",ho,[n("p",xo,[y[1]||(y[1]=d(" Spec-file health overview — pass rate, flaky rate, and failure count per spec prefix ",-1)),a(P,{topic:"project.spec-health"})]),a(K,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=B=>X(x)?x.value=B:null),items:b,size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[e(i)?(s(),f(S,{key:0})):e(M).length===0?(s(),f(g,{key:1,text:"No data",description:"No spec health data available for the selected period."})):(s(),f(w,{key:2,"min-width":"46rem",bleed:!1},{default:t(()=>[a(Q,{data:e(M),columns:z,sticky:"",class:"max-h-[32rem]"},{"prefix-cell":t(({row:B})=>[a(T,{to:`/projects/${U.projectId}/test-cases?file=${encodeURIComponent(B.original.prefix)}`,class:"flex items-center gap-2 min-w-0 text-primary hover:underline",title:B.original.prefix},{default:t(()=>[n("span",{class:re(["inline-block size-3 rounded shrink-0",D(B.original.passRate)])},null,2),n("span",bo,c(B.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":t(({row:B})=>[n("span",{class:re(["font-medium tabular-nums",A(B.original.passRate)])},c(v(B.original.passRate)),3)]),"flakyRate-cell":t(({row:B})=>[n("span",ko,c(Math.round(B.original.flakyRate*100))+"%",1)]),"failureCount-cell":t(({row:B})=>[n("span",{class:re(["tabular-nums",B.original.failureCount>0?"text-red-600 dark:text-red-400":""])},c(B.original.failureCount),3)]),"testCount-cell":t(({row:B})=>[n("span",$o,c(B.original.testCount),1)]),"avgDuration-cell":t(({row:B})=>[n("span",Co,c(_(B.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),jo=Object.assign(To,{__name:"SpecHealthTable"}),So={class:"space-y-6"},wo={class:"w-full text-sm"},Ro={class:"px-3 py-2 min-w-0"},Do={class:"text-xs text-muted"},Ao={class:"px-3 py-2 text-muted"},zo={class:"px-3 py-2 whitespace-nowrap"},Uo={key:1,class:"text-xs text-muted"},Io={key:2,class:"text-xs"},Mo={class:"px-3 py-2 whitespace-nowrap text-muted"},Fo={class:"px-3 py-2 text-right"},Po={class:"w-full text-sm"},Eo={class:"px-3 py-2 min-w-0"},Bo={class:"text-xs text-muted"},Vo={class:"px-3 py-2 text-right whitespace-nowrap"},Lo=ie({__name:"QuarantineTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,x=Ae(),m=I(null),{data:i,status:M,error:D,refresh:A}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/quarantine`,"$9P2J7SsiYf")),$=await $,k(),$);function v(z){const p=Math.round(z/36e5);return p<48?`${Math.max(1,p)}h`:`${Math.round(p/24)}d`}async function _(z,p){m.value=z;try{await $fetch(`/api/projects/${C.projectId}/quarantine`,{method:"POST",body:{testCaseId:z,reason:p,source:"proposed"}}),x.add({title:"Quarantined",color:"success"}),await A()}catch{x.add({title:"Could not quarantine that test",color:"error"})}finally{m.value=null}}async function b(z){m.value=z;try{await $fetch(`/api/projects/${C.projectId}/quarantine/${z}`,{method:"DELETE"}),x.add({title:"Released",color:"success"}),await A()}catch{x.add({title:"Could not release that test",color:"error"})}finally{m.value=null}}return(z,p)=>{const y=dt,P=dn,K=mn,S=pn,g=Ce,T=Ee,Q=ss,w=ut,H=$e,B=ke,ue=Je,ge=ct;return s(),r("div",So,[a(ge,{title:"Quarantine",icon:"i-lucide-shield-alert",count:e(i)?.debt.active,help:"project.quarantine"},{subtitle:t(()=>[...p[0]||(p[0]=[d(" A quarantined test keeps running and keeps reporting — it is excluded from the CI gate's verdict and nothing else. That is what lets it earn its way back out. ",-1)])]),default:t(()=>[e(M)==="pending"?(s(),f(y,{key:0})):e(D)?(s(),f(P,{key:1,text:String(e(D))},null,8,["text"])):(s(),r(J,{key:2},[e(i)&&e(i).debt.active>0?(s(),f(S,{key:0,class:"mb-4"},{default:t(()=>[a(K,{label:"Quarantined",value:e(i).debt.active},null,8,["value"]),a(K,{label:"Ready to release",value:e(i).debt.readyToRelease,"value-class":e(i).debt.readyToRelease>0?"text-green-600 dark:text-green-400":"",hint:"earned their way out"},null,8,["value","value-class"]),a(K,{label:"Still failing",value:e(i).debt.stillFailing,hint:"no passing streak"},null,8,["value"]),a(K,{label:"Oldest",value:v(e(i).debt.oldestAgeMs),size:"sm"},null,8,["value"])]),_:1})):R("",!0),!e(i)||e(i).entries.length===0?(s(),f(g,{key:1,icon:"i-lucide-shield-check",text:"Nothing quarantined. Tests you quarantine appear here with their progress back out."})):(s(),f(ue,{key:2},{default:t(()=>[n("table",wo,[p[2]||(p[2]=n("thead",{class:"text-left text-xs text-muted"},[n("tr",null,[n("th",{class:"px-3 py-2"},"Test"),n("th",{class:"px-3 py-2"},"Reason"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Streak"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Age"),n("th",{class:"px-3 py-2 text-right"},"Actions")])],-1)),n("tbody",null,[(s(!0),r(J,null,ae(e(i).entries,h=>(s(),r("tr",{key:h.id,class:"border-t border-default"},[n("td",Ro,[a(T,{to:`/test-cases/${h.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(c(h.title),1)]),_:2},1032,["to"]),a(Q,{tags:h.tags,meta:{owner:h.owner??void 0},"max-tags":3,class:"ml-1"},null,8,["tags","meta"]),n("div",Do,[a(w,{"file-path":h.filePath,"project-key":U.projectId,"project-name":U.projectName},null,8,["file-path","project-key","project-name"])])]),n("td",Ao,c(h.reason||"—"),1),n("td",zo,[h.releaseProposed?(s(),f(H,{key:0,color:"success",variant:"soft",size:"xs"},{default:t(()=>[d(c(h.consecutivePasses)+" green — ready ",1)]),_:2},1024)):h.runsSinceQuarantine===0?(s(),r("span",Uo,"not run yet")):(s(),r("span",Io,c(h.consecutivePasses)+" / "+c(e(i).releaseAfterConsecutivePasses),1))]),n("td",Mo,c(v(h.ageMs)),1),n("td",Fo,[a(B,{size:"xs",color:h.releaseProposed?"primary":"neutral",variant:"soft",loading:e(m)===h.testCaseId,onClick:j=>b(h.testCaseId)},{default:t(()=>[...p[1]||(p[1]=[d(" Release ",-1)])]),_:1},8,["color","loading","onClick"])])]))),128))])])]),_:1}))],64))]),_:1},8,["count"]),e(i)&&e(i).candidates.length>0?(s(),f(ge,{key:0,title:"Worth quarantining",icon:"i-lucide-lightbulb",count:e(i).candidates.length},{subtitle:t(()=>[...p[3]||(p[3]=[d(" Ranked by the CI minutes their flakiness wastes, not by how often they flake — a test that flakes constantly but finishes instantly costs nothing. ",-1)])]),default:t(()=>[a(ue,null,{default:t(()=>[n("table",Po,[n("tbody",null,[(s(!0),r(J,null,ae(e(i).candidates,h=>(s(),r("tr",{key:h.testCaseId,class:"border-t border-default"},[n("td",Eo,[a(T,{to:`/test-cases/${h.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(c(h.title),1)]),_:2},1032,["to"]),n("div",Bo,c(h.rationale),1)]),n("td",Vo,[a(B,{size:"xs",color:"neutral",variant:"soft",loading:e(m)===h.testCaseId,onClick:j=>_(h.testCaseId,h.rationale)},{default:t(()=>[...p[4]||(p[4]=[d(" Quarantine ",-1)])]),_:1},8,["loading","onClick"])])]))),128))])])]),_:1})]),_:1},8,["count"])):R("",!0)])}}}),No=Object.assign(Lo,{__name:"QuarantineTable"}),Ko={class:"space-y-4"},Oo={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},qo={id:"marker-environments"},Ho=["value"],Qo=ie({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=vn.map(_=>({label:_.label,value:_.id,icon:_.icon})),i=Ps({label:"",occurredAt:"",category:Tt,environment:"",description:""}),M=N(()=>!!k.marker),D=I(!1);function A(_){const b=new Date(_),z=p=>String(p).padStart(2,"0");return`${b.getFullYear()}-${z(b.getMonth()+1)}-${z(b.getDate())}T${z(b.getHours())}:${z(b.getMinutes())}`}ye(()=>k.open,_=>{_&&(k.marker?(i.label=k.marker.label,i.occurredAt=A(k.marker.occurredAt),i.category=k.marker.category||Tt,i.environment=k.marker.environment??"",i.description=k.marker.description??""):(i.label="",i.occurredAt=A(new Date),i.category=Tt,i.environment="",i.description=""))});async function v(){if(!i.label.trim()){x.add({title:"Label is required",color:"error"});return}if(!i.occurredAt){x.add({title:"Date is required",color:"error"});return}D.value=!0;const _={label:i.label.trim(),occurredAt:new Date(i.occurredAt).toISOString(),category:i.category,environment:i.environment.trim()||null,description:i.description.trim()||null};try{k.marker?(await $fetch(`/api/markers/${k.marker.id}`,{method:"PUT",body:_}),x.add({title:"Marker updated",color:"success"})):(await $fetch(`/api/projects/${k.projectId}/markers`,{method:"POST",body:_}),x.add({title:"Marker created",color:"success"})),C("update:open",!1),C("saved")}catch(b){x.add({title:M.value?"Failed to update marker":"Failed to create marker",description:ts(b),color:"error"})}finally{D.value=!1}}return(_,b)=>{const z=Ht,p=Qt,y=Be,P=_n,K=ke,S=zt,g=Dt;return s(),f(g,null,{default:t(()=>[a(S,{open:U.open,title:e(M)?"Edit marker":"Add marker","onUpdate:open":b[6]||(b[6]=T=>C("update:open",T))},{body:t(()=>[n("div",Ko,[a(p,{label:"Label",name:"label",required:""},{default:t(()=>[a(z,{modelValue:e(i).label,"onUpdate:modelValue":b[0]||(b[0]=T=>e(i).label=T),placeholder:"e.g. Migrated CI to new runners",class:"w-full"},null,8,["modelValue"])]),_:1}),n("div",Oo,[a(p,{label:"Date & time",name:"occurredAt",required:""},{default:t(()=>[a(z,{modelValue:e(i).occurredAt,"onUpdate:modelValue":b[1]||(b[1]=T=>e(i).occurredAt=T),type:"datetime-local",class:"w-full"},null,8,["modelValue"])]),_:1}),a(p,{label:"Category",name:"category"},{default:t(()=>[a(y,{modelValue:e(i).category,"onUpdate:modelValue":b[2]||(b[2]=T=>e(i).category=T),items:e(m),class:"w-full"},null,8,["modelValue","items"])]),_:1})]),a(p,{label:"Environment",name:"environment",help:"Optional. Leave empty to apply to all environments."},{default:t(()=>[a(z,{modelValue:e(i).environment,"onUpdate:modelValue":b[3]||(b[3]=T=>e(i).environment=T),list:"marker-environments",placeholder:"e.g. production",class:"w-full"},null,8,["modelValue"]),n("datalist",qo,[(s(!0),r(J,null,ae(U.environments||[],T=>(s(),r("option",{key:T,value:T},null,8,Ho))),128))])]),_:1}),a(p,{label:"Description",name:"description"},{default:t(()=>[a(P,{modelValue:e(i).description,"onUpdate:modelValue":b[4]||(b[4]=T=>e(i).description=T),rows:3,placeholder:"Optional details",class:"w-full"},null,8,["modelValue"])]),_:1})])]),footer:t(()=>[a(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:b[5]||(b[5]=T=>C("update:open",!1))}),a(K,{label:e(M)?"Save changes":"Add marker",icon:e(M)?"i-lucide-check":"i-lucide-plus",loading:e(D),onClick:v},null,8,["label","icon","loading"])]),_:1},8,["open","title"])]),_:1})}}}),Go=Object.assign(Qo,{__name:"MarkerFormModal"}),Jo={class:"md:hidden space-y-3"},Xo={class:"flex items-start justify-between gap-2"},Yo={key:0,class:"flex gap-1 shrink-0"},Wo={class:"text-sm text-muted"},Zo={key:0,class:"text-xs"},el={key:1,class:"text-sm text-muted"},tl={class:"whitespace-nowrap"},sl={class:"text-sm"},nl={class:"text-xs text-muted"},al={class:"font-medium flex items-center gap-1"},ol={key:0,class:"text-xs text-muted line-clamp-1"},ll={key:1,class:"text-xs text-muted"},rl={key:0,class:"flex gap-1 justify-end"},il=ie({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=N(()=>[...k.markers].sort((y,P)=>+new Date(P.occurredAt)-+new Date(y.occurredAt))),i=[{accessorKey:"occurredAt",header:"When"},{accessorKey:"category",header:"Category"},{accessorKey:"label",header:"Label"},{accessorKey:"environment",header:"Environment"},{accessorKey:"actions",header:""}],M=I(!1),D=I(null);function A(){D.value=null,M.value=!0}function v(y){D.value=y,M.value=!0}ye(()=>k.focusMarkerId,y=>{if(y==null)return;const P=k.markers.find(K=>K.id===y);P&&v(P),C("clear-focus")},{immediate:!0});const _=I(!1),b=I(null);function z(y){b.value=y,_.value=!0}async function p(){const y=b.value;if(_.value=!1,b.value=null,!!y)try{await $fetch(`/api/markers/${y.id}`,{method:"DELETE"}),x.add({title:"Marker deleted",color:"success"}),C("changed")}catch(P){x.add({title:"Failed to delete marker",description:ts(P),color:"error"})}}return(y,P)=>{const K=ke,S=Ce,g=fn,T=$e,Q=Pe,w=Ve,H=Go,B=zt,ue=Dt,ge=ct;return s(),f(ge,{title:"Timeline markers",count:U.markers.length,icon:"i-lucide-milestone",help:"project.timeline",subtitle:"Dated events overlaid on the analytics charts"},{actions:t(()=>[U.canEdit?(s(),f(K,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:A})):R("",!0)]),default:t(()=>[U.markers.length===0?(s(),f(S,{key:0,icon:"i-lucide-milestone",text:"No markers yet. Add a deploy, config change, or incident to see it on the charts."})):(s(),r(J,{key:1},[n("div",Jo,[(s(!0),r(J,null,ae(e(m),h=>(s(),r("div",{key:h.id,class:"rounded-lg border border-default p-3 space-y-2"},[n("div",Xo,[a(g,{marker:h},null,8,["marker"]),U.canEdit?(s(),r("div",Yo,[a(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:j=>v(h)},null,8,["onClick"]),a(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:j=>z(h)},null,8,["onClick"])])):R("",!0)]),n("div",Wo,c(("prettyDateFormat"in y?y.prettyDateFormat:e(it))(h.occurredAt)),1),h.environment?(s(),r("div",Zo,[a(T,{color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.environment),1)]),_:2},1024)])):R("",!0),h.description?(s(),r("p",el,c(h.description),1)):R("",!0)]))),128))]),a(w,{data:e(m),columns:i,class:"hidden md:block"},{"occurredAt-cell":t(({row:h})=>[n("div",tl,[n("div",sl,c(("prettyDateFormat"in y?y.prettyDateFormat:e(it))(h.original.occurredAt)),1),n("div",nl,c(("formatRelativeTime"in y?y.formatRelativeTime:e(At))(h.original.occurredAt)),1)])]),"category-cell":t(({row:h})=>[a(T,{color:e(jt)(h.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(Q,{name:e(jt)(h.original.category).icon,class:"size-3"},null,8,["name"]),d(" "+c(e(jt)(h.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":t(({row:h})=>[n("div",null,[n("div",al,[d(c(h.original.label)+" ",1),h.original.source==="auto"?(s(),f(Q,{key:0,name:"i-lucide-sparkles",class:"size-3 text-muted",title:"Automatically detected"})):R("",!0)]),h.original.description?(s(),r("div",ol,c(h.original.description),1)):R("",!0)])]),"environment-cell":t(({row:h})=>[h.original.environment?(s(),f(T,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.original.environment),1)]),_:2},1024)):(s(),r("span",ll,"All"))]),"actions-cell":t(({row:h})=>[U.canEdit?(s(),r("div",rl,[a(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:j=>v(h.original)},null,8,["onClick"]),a(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:j=>z(h.original)},null,8,["onClick"])])):R("",!0)]),_:1},8,["data"])],64)),a(H,{open:e(M),"onUpdate:open":P[0]||(P[0]=h=>X(M)?M.value=h:null),"project-id":U.projectId,marker:e(D),environments:U.environments,onSaved:P[1]||(P[1]=h=>C("changed"))},null,8,["open","project-id","marker","environments"]),a(ue,null,{default:t(()=>[a(B,{open:e(_),title:"Delete marker","onUpdate:open":P[3]||(P[3]=h=>_.value=h)},{body:t(()=>[n("p",null,[P[4]||(P[4]=d(" Delete marker ",-1)),e(b)?(s(),f(g,{key:0,marker:e(b),class:"inline-flex align-middle"},null,8,["marker"])):R("",!0),P[5]||(P[5]=d("? This can't be undone. ",-1))])]),footer:t(()=>[a(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:P[2]||(P[2]=h=>_.value=!1)}),a(K,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:p})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),cl=Object.assign(il,{__name:"ProjectTimeline"}),ul={class:"flex flex-col h-full overflow-y-auto gap-4"},dl={key:0,class:"pb-0 space-y-4"},ml={key:0,class:"text-gray-600"},pl={key:1,class:"flex flex-wrap gap-1 mt-2"},gl={class:"flex flex-wrap items-center gap-3 mb-4"},fl={class:"inline-flex items-center gap-1"},_l=["onClick"],vl={key:0,class:"flex items-center gap-3 px-3 py-2 mb-3 rounded-lg bg-primary-50 dark:bg-primary-900/20 border border-primary-200 dark:border-primary-800"},yl={class:"text-sm text-primary-700 dark:text-primary-300"},hl={key:1,class:"text-xs text-primary-500"},xl=["checked","onClick"],bl={class:"flex items-center gap-2"},kl=["href","onClick"],$l={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},Cl={class:"inline-flex items-center gap-1"},Tl={key:0,class:"flex items-center gap-1"},jl={class:"text-xs text-gray-600"},Sl={key:0,class:"flex items-center gap-1 flex-wrap"},wl={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Rl={key:1,class:"text-xs text-gray-500"},Dl={class:"space-y-1"},Al={class:"flex justify-end gap-2"},zl={key:2,class:"text-center py-8 text-gray-500"},Ul={class:"text-xs text-gray-400 max-w-sm"},Il={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Ml={class:"flex flex-wrap items-center gap-3"},Fl={class:"text-xl font-semibold inline-flex items-center gap-1"},Pl={class:"font-medium"},El={class:"mt-1"},Bl={key:0,class:"text-red-600 font-medium"},Vl={key:1,class:"text-green-600 font-medium"},Ll={key:2,class:"text-gray-500"},Nl={key:2,class:"text-center py-8 text-red-500"},Kl={key:3,class:"text-center py-8 text-gray-500"},Ol={class:"flex items-center justify-between"},ql={class:"text-xl font-semibold inline-flex items-center gap-1"},Hl={class:"space-y-4"},Ql={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Gl={key:0,class:"text-center py-4 text-gray-500"},Jl={key:1,class:"space-y-4"},Xl={class:"flex gap-4 text-sm"},Yl={key:0,class:"text-gray-400"},Wl={key:0,class:"text-gray-400"},Zl={key:1,class:"text-gray-400"},er={key:1,class:"text-gray-400"},tr={key:0,class:"text-gray-400"},sr={key:0,class:"text-gray-400"},nr={key:2,class:"text-center py-8 text-gray-500"},ar={key:3,class:"text-center py-8 text-gray-500"},or={class:"flex items-center justify-between"},lr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},rr={class:"space-y-4"},ir={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},cr={key:0,class:"text-center py-8 text-gray-500"},ur={key:1,class:"space-y-4"},dr={class:"space-y-2"},mr={class:"flex flex-wrap gap-4 text-sm"},pr={key:3,class:"text-sm text-gray-500"},gr={class:"flex flex-wrap gap-4 text-sm"},fr={key:0,class:"text-gray-400"},_r={key:0,class:"text-gray-400"},vr={key:1,class:"text-gray-400"},yr={key:1,class:"text-gray-400"},hr={key:0,class:"text-gray-400"},xr={key:0,class:"text-gray-400"},br={key:2,class:"text-center py-8 text-gray-500"},kr={key:3,class:"text-center py-8 text-gray-500"},$r={class:"flex items-center justify-between"},Cr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},Tr={key:0,class:"space-y-2"},jr={class:"font-medium text-sm"},Sr={class:"text-xs text-muted flex items-center gap-2"},wr={key:0,class:"italic"},Rr={key:1,class:"text-xs text-muted italic"},Dr={key:1,class:"text-center py-8 text-muted text-sm"},Ar={class:"space-y-4"},zr={class:"text-sm text-gray-600 dark:text-gray-400"},Ur={class:"block text-sm font-medium mb-1"},Ir={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Vi=ie({__name:"index",async setup(U){let $,k;const C=Es(),x=Bs(),m=C.params.id,{data:i,refresh:M}=([$,k]=xe(()=>be(`/api/projects/${m}`,"$NX9Zy2qnH1")),$=await $,k(),$);Vs(N(()=>({title:`${i.value?.label||i.value?.name||"Project"} — Piwi Dashboard`})));const D=Ae(),A=I(null),v=I(null),{isAdmin:_,isReporter:b}=Ot(),z=wt(),p=N(()=>!z.public.authEnabled||_.value),y=p,P=I(!1),K=I(""),S=I(!1),g=N(()=>K.value===i.value?.name);async function T(){if(g.value){S.value=!0;try{await $fetch(`/api/projects/${m}`,{method:"DELETE"}),D.add({title:"Project deleted",color:"success"}),await Ns(),await x.push("/")}catch(u){const o=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;D.add({title:"Delete failed",description:o||"An error occurred",color:"error"}),S.value=!1}}}xn(M);async function Q(u){v.value=null,A.value=u;try{await $fetch(`/api/test-runs/${u}`,{method:"DELETE"}),D.add({title:"Test run deleted",color:"success"}),await M()}catch(o){const E=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;D.add({title:"Delete failed",description:E||"An error occurred",color:"error"})}finally{A.value=null}}const w=I([]),H=I([]),B=I([]),ue=N(()=>{const u=new Map(w.value.map(E=>[E.id,E])),o=[];for(const E of H.value){if(E.role==="administrator")continue;const G=u.get(E.id);o.push({id:E.id,username:E.username,name:E.name??null,role:E.role,global:G?.global??!1,hasAccess:!!G})}for(const E of w.value)E.role==="administrator"&&o.push({...E,hasAccess:!0});return o}),ge=N(()=>{const u=w.value.filter(E=>E.role!=="administrator"&&!E.global).map(E=>E.id).sort(),o=[...B.value].sort();return JSON.stringify(u)!==JSON.stringify(o)});ye(()=>i.value?.id,async u=>{if(!(!u||!_.value))try{const[o,E]=await Promise.all([$fetch(`/api/projects/${m}/members`),$fetch("/api/users")]);w.value=o.users,H.value=E.users,B.value=o.users.filter(G=>G.role!=="administrator"&&!G.global).map(G=>G.id)}catch{w.value=[],H.value=[],B.value=[]}},{immediate:!0});function h(u){const o=B.value.indexOf(u);o>=0?B.value.splice(o,1):B.value.push(u)}async function j(){try{await $fetch(`/api/projects/${m}/members`,{method:"PUT",body:{userIds:B.value}}),D.add({title:"Members updated",color:"success"});const u=await $fetch(`/api/projects/${m}/members`);w.value=u.users}catch(u){const o=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;D.add({title:"Update failed",description:o||"An error occurred",color:"error"})}}const q=I("test-runs"),de=I(0),ze=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","quarantine","timeline","members"],me=C.query.tab;typeof me=="string"&&ze.includes(me)&&(q.value=me),ye(q,u=>{C.query.tab!==u&&ze.includes(u)&&x.replace({query:{...C.query,tab:u}})});const he=N(()=>i.value?.testRuns?.some(u=>u.failedTests>0)??!1),fe=N(()=>[{label:"Results",items:[{label:`Test runs (${L.value.length})`,icon:"i-lucide-play-circle",value:"test-runs",slot:"test-runs"},{label:`Test cases${qe.value!=null?` (${qe.value})`:""}`,icon:"i-lucide-list-checks",value:"test-cases",slot:"test-cases"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"}]},{label:"Failures",items:[...he.value?[{label:"Failure clusters",icon:"i-lucide-layers",value:"failure-clusters",slot:"failure-clusters"}]:[],{label:"Flaky tests",icon:"i-lucide-shuffle",value:"flaky-tests",slot:"flaky-tests"},{label:"Quarantine",icon:"i-lucide-shield-alert",value:"quarantine",slot:"quarantine"}]},{label:"Health",items:[{label:"Spec health",icon:"i-lucide-table-2",value:"spec-health",slot:"spec-health"},{label:"Performance",icon:"i-lucide-trending-up",value:"performance",slot:"performance"},{label:`Timeline${Te.value.length?` (${Te.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"}]},..._.value?[{label:"Admin",items:[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]}]:[]]),Ue=N(()=>fe.value.flatMap(u=>u.items)),mt=N(()=>fe.value.map(u=>u.items).filter(u=>u.length>0)),pt=N(()=>Ue.value.find(u=>u.value===q.value)?.icon),W=I([]),Xe=u=>W.value.includes(u);function Le(u){const o=W.value.indexOf(u);if(o>=0)W.value.splice(o,1);else{if(W.value.length>=2){D.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}W.value.push(u)}}const Ne=I(null);function gt(){W.value.length===2&&(Ne.value=[W.value[0],W.value[1]],q.value="compare")}const ne=I([]),pe=I(!0),Ke=N(()=>{const u=new Set;for(const o of i.value?.testRuns||[])o.environment&&u.add(o.environment);return[...u].sort()});function ft(u){const o=ne.value.indexOf(u);o===-1?ne.value.push(u):ne.value.splice(o,1)}function Oe(u){return ne.value.includes(u)}const L=N(()=>{let u=i.value?.testRuns||[];return pe.value&&(u=u.filter(o=>o.isFullRun!==!1)),ne.value.length===0?u:u.filter(o=>o.environment&&ne.value.includes(o.environment))}),F=N(()=>ne.value.length===1?ne.value[0]:void 0),{data:Z,refresh:_t}=([$,k]=xe(()=>be(`/api/projects/${m}/markers`,{default:()=>({markers:[]})},"$3gm0grYTFL")),$=await $,k(),$),Te=N(()=>Z.value?.markers??[]),Ye=N(()=>!z.public.authEnabled||_.value||b.value),We=N(()=>ne.value.length===0?Te.value:Te.value.filter(u=>u.environment==null||ne.value.includes(u.environment))),Ie=I(null);function je(u){Ie.value=u,q.value="timeline"}const vt=N(()=>{const u=i.value?.testRuns||[];return pe.value?u.filter(o=>o.isFullRun!==!1):u});function O(u){if(u.isFullRun!==!1)return"Full run — the complete test suite ran";const o=[],E=u.filterDetails?.grep?.trim(),G=u.filterDetails?.grepInvert?.trim(),_e=u.filterDetails?.files;return E&&E!==".*"&&o.push(`grep: ${E}`),G&&o.push(`grep-invert: ${G}`),_e?.length&&o.push(`files: ${_e.join(", ")}`),o.length?`Partial run — ${o.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const oe=[{accessorKey:"select",header:""},{accessorKey:"id",header:V("Run")},{accessorKey:"status",header:V("Status")},{accessorKey:"isFullRun",header:"Scope"},{id:"browsers",accessorFn:u=>u.browsers,header:""},{accessorKey:"startTime",header:V("Started")},{accessorKey:"environment",header:V("Environment")},{accessorKey:"metadata",header:"Branch / Commit"},{accessorKey:"duration",header:V("Test status / Dur.")},{accessorKey:"reports",header:"Reports"},{id:"actions",header:"Actions"}],qe=I(null),Se=I(""),we=I(""),ns=N(()=>{const u={};return Se.value&&(u.from=Se.value),we.value&&(u.to=we.value),u}),yt=I(null),ht=I(!1),Me=I(null),xt=I(!1),Ze=I(!1),as=N(()=>ht.value&&yt.value===null);ye([q,ns,pe],async([u,o])=>{if(u!=="performance")return;ht.value=!0,Me.value||(Ze.value=!0);const E=new URLSearchParams(o).toString(),G=pe.value?`${E?"&":""}fullRunsOnly=true`:"",_e=E||G?`?${E}${G}`:"";yt.value=await $fetch(`/api/projects/${m}/performance${_e}`).catch(ve=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",ve),null)),ht.value=!1,Ze.value&&(xt.value=!1,Me.value=await $fetch(`/api/projects/${m}/slow-tests`).catch(ve=>(xt.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",ve),null)),Ze.value=!1)},{immediate:!0});const os=[{accessorKey:"title",header:V("Test case")},{accessorKey:"avgDuration",header:V("Avg duration")},{accessorKey:"maxDuration",header:V("Max")},{accessorKey:"minDuration",header:V("Min")},{accessorKey:"latestDuration",header:V("Latest")},{accessorKey:"trend",header:V("Trend")},{accessorKey:"runCount",header:V("Runs")}];function ls(u){const o=it(u.startTime,{dateOnly:!0}),E=u.metadata?.scm?.commit?` (${u.metadata.scm.commit.substring(0,7)})`:"";return`Run #${u.id} — ${o}${E}`}const ce=N(()=>i.value?.testRuns?[...i.value.testRuns].reverse().map(u=>({label:ls(u),value:u.id})):[]),ee=I(void 0),te=I(void 0),Ut=N(()=>C.query.runA?Number(C.query.runA):null),It=N(()=>C.query.runB?Number(C.query.runB):null);ye(ce,u=>{if(Ut.value){const o=u.find(E=>E.value===Ut.value);o&&(ee.value=o)}if(It.value){const o=u.find(E=>E.value===It.value);o&&(te.value=o)}},{immediate:!0}),ye(Ne,u=>{if(u){const o=ce.value.find(G=>G.value===u[0]),E=ce.value.find(G=>G.value===u[1]);o&&(ee.value=o),E&&(te.value=E),Ne.value=null}});function Mt(){ce.value.length>=2&&(ee.value=ce.value[1],te.value=ce.value[0])}const bt=I(null),kt=I(null),et=I(!1);async function rs(){const u=ee.value,o=te.value;if(!(!u?.value&&!o?.value)){et.value=!0;try{const E=[];u?.value&&E.push(u.value),o?.value&&E.push(o.value);const G=await Promise.all(E.map(ve=>$fetch(`/api/test-runs/${ve}/summary`))),_e=new Map;for(const ve of G)_e.set(ve.id,ve);bt.value=u?.value?_e.get(u.value)??null:null,kt.value=o?.value?_e.get(o.value)??null:null}catch{bt.value=null,kt.value=null}finally{et.value=!1}}}ye([ee,te],()=>{rs()});const{comparisonData:tt,comparisonSummary:Y}=hn(bt,kt),Ft=[{accessorKey:"title",header:V("Test case")},{accessorKey:"statusA",header:V("Status A")},{accessorKey:"statusB",header:V("Status B")},{accessorKey:"durationA",header:V("Duration A")},{accessorKey:"durationB",header:V("Duration B")},{accessorKey:"delta",header:V("Delta")},{accessorKey:"percentChange",header:V("Change")}];return(u,o)=>{const E=Is,G=Ms,_e=Qn,ve=Hs,is=Gs,cs=Gt,us=ea,ds=Be,ms=ca,Pt=Ys,ps=Ws,Fe=Qe,le=ke,gs=Zs,$t=Pe,fs=es,_s=en,se=$e,vs=tn,Re=sn,ys=nn,st=Ve,hs=Os,xs=Ce,He=Ge,bs=ha,ks=Ua,$s=Xa,Ct=Ht,Et=dt,Cs=lo,Ts=ut,js=yo,nt=cn,Ss=un,ws=jo,Rs=No,Ds=gn,As=cl,zs=yn,Us=Qs,Bt=zt,Vt=Dt;return s(),r(J,null,[a(Us,{id:"project-detail"},{header:t(()=>[a(is,null,{leading:t(()=>[a(E),a(G,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(i)?.label||e(i)?.name||"Project"}]},null,8,["items"])]),right:t(()=>[a(ve,{size:"sm",actions:[...e(p)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{K.value="",P.value=!0}}]:[],...e(y)?[{label:"Import",icon:"i-lucide-import",variant:"outline",to:`/projects/${e(m)}/import`}]:[],{label:"Test functions",icon:"i-lucide-function-square",variant:"outline",to:`/projects/${e(m)}/test-functions`},{label:"Edit",icon:"i-lucide-pencil",variant:"outline",to:`/projects/${e(m)}/edit`},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>e(M)()}]},{leading:t(()=>[a(_e,{"project-id":parseInt(e(m)),"project-label":e(i)?.label||e(i)?.name},null,8,["project-id","project-label"])]),_:1},8,["actions"])]),_:1})]),body:t(()=>[n("div",ul,[e(i)?.description||e(i)?.tags&&e(i).tags.length>0?(s(),r("div",dl,[e(i)?.description?(s(),r("p",ml,c(e(i).description),1)):R("",!0),e(i)?.tags&&e(i).tags.length>0?(s(),r("div",pl,[(s(!0),r(J,null,ae(e(i).tags,l=>(s(),f(cs,{key:l.id,text:l.text,color:l.color},null,8,["text","color"]))),128))])):R("",!0)])):R("",!0),a(us,{"project-id":e(m)},null,8,["project-id"]),a(ds,{modelValue:e(q),"onUpdate:modelValue":o[0]||(o[0]=l=>X(q)?q.value=l:null),items:e(mt),icon:e(pt),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),a(zs,{modelValue:e(q),"onUpdate:modelValue":o[14]||(o[14]=l=>X(q)?q.value=l:null),items:e(Ue),size:"sm",class:"p-1",ui:{list:"max-sm:hidden overflow-x-auto",trigger:"shrink-0"}},{"test-runs":t(()=>[e(i)?.testRuns&&e(i).testRuns.length>0?(s(),f(Pt,{key:0,title:"Run trend",subtitle:`Test run statistics over time for ${e(i)?.label||e(i)?.name}`,help:"project.runs-trend"},{default:t(()=>[a(ms,{"test-runs":e(vt),height:200,markers:e(We),onMarkerClick:je},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):R("",!0),a(He,{class:"mt-4"},{default:t(()=>[n("div",gl,[n("div",fl,[a(ps,{modelValue:e(pe),"onUpdate:modelValue":o[1]||(o[1]=l=>X(pe)?pe.value=l:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),a(Fe,{topic:"project.run-scope"})]),e(Ke).length>0?(s(),r(J,{key:0},[o[21]||(o[21]=n("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(s(!0),r(J,null,ae(e(Ke),l=>(s(),r("button",{key:l,type:"button",class:re(["text-xs font-medium px-2 py-1 rounded border cursor-pointer focus:outline-none transition-colors",Oe(l)?"bg-blue-100 text-blue-700 border-blue-300 dark:bg-blue-900/40 dark:text-blue-300 dark:border-blue-700":"bg-zinc-100 text-zinc-500 border-zinc-200 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-400 dark:border-zinc-700 dark:hover:bg-zinc-700"]),onClick:De=>ft(l)},c(l),11,_l))),128)),e(ne).length>0?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filter",onClick:o[2]||(o[2]=l=>ne.value=[])})):R("",!0)],64)):R("",!0)]),e(W).length>0?(s(),r("div",vl,[n("span",yl,c(e(W).length)+" run"+c(e(W).length>1?"s":"")+" selected ",1),e(W).length===2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:gt})):(s(),r("span",hl," Select another run to compare ")),a(le,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[3]||(o[3]=l=>W.value=[])})])):R("",!0),e(L).length>0?(s(),f(st,{key:1,data:e(L),columns:oe,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"select-cell":t(({row:l})=>[n("input",{type:"checkbox",checked:Xe(l.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Kt(De=>Le(l.original.id),["stop"])},null,8,xl)]),"id-cell":t(({row:l})=>[n("div",bl,[n("a",{href:`/test-runs/${l.original.id}`,class:"text-primary hover:underline font-medium",onClick:Kt(De=>("navigateTo"in u?u.navigateTo:e(Rt))(`/test-runs/${l.original.id}`),["prevent"])}," Run #"+c(l.original.id),9,kl),l.original.label?(s(),r("span",$l,c(l.original.label),1)):R("",!0)])]),"status-cell":t(({row:l})=>[a(gs,{status:l.original.status},null,8,["status"])]),"isFullRun-header":t(()=>[n("span",Cl,[o[22]||(o[22]=d("Scope ",-1)),a(Fe,{topic:"run.partial"})])]),"isFullRun-cell":t(({row:l})=>[a(fs,{text:O(l.original)},{default:t(()=>[a($t,{name:l.original.isFullRun===!1?"i-lucide-list-filter":"i-lucide-list-checks",class:re(["size-4 shrink-0 cursor-help",l.original.isFullRun===!1?"text-amber-500":"text-green-500"])},null,8,["name","class"])]),_:2},1032,["text"])]),"browsers-cell":t(({row:l})=>[l.original.browsers?.length?(s(),r("div",Tl,[(s(!0),r(J,null,ae(l.original.browsers,De=>(s(),f(_s,{key:De,browser:{projectName:De},size:"sm"},null,8,["browser"]))),128))])):R("",!0)]),"startTime-cell":t(({row:l})=>[n("span",jl,c(("prettyDateFormat"in u?u.prettyDateFormat:e(it))(l.original.startTime)),1)]),"environment-cell":t(({row:l})=>[l.original.environment?(s(),f(se,{key:0,color:"info",variant:"subtle",size:"sm"},{default:t(()=>[d(c(l.original.environment),1)]),_:2},1024)):R("",!0)]),"metadata-cell":t(({row:l})=>[l.original.metadata?.scm?(s(),r("div",Sl,[l.original.metadata.scm.branch?(s(),r("span",wl,c(l.original.metadata.scm.branch),1)):R("",!0),l.original.metadata.scm.commit?(s(),r("code",Rl,c(l.original.metadata.scm.commit.substring(0,7)),1)):R("",!0)])):R("",!0)]),"duration-cell":t(({row:l})=>[n("div",Dl,[a(vs,{passed:l.original.passedTests,failed:l.original.failedTests,skipped:l.original.skippedTests,flaky:l.original.flakyTests,"did-not-run":l.original.didNotRunTests??0,total:l.original.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),a(Re,{ms:l.original.duration,class:"text-xs text-gray-500"},null,8,["ms"])])]),"reports-cell":t(({row:l})=>[a(ys,{reports:l.original.reports},null,8,["reports"])]),"actions-header":t(()=>[...o[23]||(o[23]=[n("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":t(({row:l})=>[n("div",Al,[a(le,{to:`/test-runs/${l.original.id}`,size:"sm",variant:"outline"},{default:t(()=>[...o[24]||(o[24]=[d(" View ",-1)])]),_:1},8,["to"]),a(le,{size:"sm",color:"error",variant:"soft",icon:"i-lucide-trash-2",loading:e(A)===l.original.id,onClick:De=>v.value=l.original.id},{default:t(()=>[...o[25]||(o[25]=[d(" Delete ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data"])):e(i)?.testRuns&&e(i).testRuns.length>0?(s(),r("div",zl," No test runs match the selected environment filter. ")):(s(),f(xs,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:t(()=>[n("p",Ul,[o[27]||(o[27]=d(" Point the reporter's ",-1)),o[28]||(o[28]=n("code",{class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},"projectName",-1)),o[29]||(o[29]=d(" at ",-1)),n("code",Il,c(e(i)?.name),1),o[30]||(o[30]=d(" to send results here — see the ",-1)),a(hs,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:t(()=>[...o[26]||(o[26]=[d("reporter docs",-1)])]),_:1}),o[31]||(o[31]=d(" for setup instructions. ",-1))])]),_:1}))]),_:1})]),"failure-clusters":t(()=>[e(q)==="failure-clusters"?(s(),r(J,{key:0},[(s(),f(bs,{key:`sug-${e(de)}`,"project-id":String(e(m)),onMerged:o[4]||(o[4]=l=>de.value++)},null,8,["project-id"])),(s(),f(ks,{key:e(de),"project-id":String(e(m))},null,8,["project-id"]))],64)):R("",!0)]),"flaky-tests":t(()=>[e(q)==="flaky-tests"?(s(),f($s,{key:0,"project-id":String(e(m)),environment:e(F),"project-name":e(i)?.name},null,8,["project-id","environment","project-name"])):R("",!0)]),performance:t(()=>[n("div",Ml,[o[32]||(o[32]=n("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),a(Ct,{modelValue:e(Se),"onUpdate:modelValue":o[5]||(o[5]=l=>X(Se)?Se.value=l:null),type:"date",size:"sm",placeholder:"From",class:"w-40"},null,8,["modelValue"]),o[33]||(o[33]=n("span",{class:"text-sm text-muted"},"to",-1)),a(Ct,{modelValue:e(we),"onUpdate:modelValue":o[6]||(o[6]=l=>X(we)?we.value=l:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(Se)||e(we)?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[7]||(o[7]=l=>{Se.value="",we.value=""})})):R("",!0)]),a(Pt,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:t(()=>[e(as)?(s(),f(Et,{key:0,text:"Loading chart…"})):(s(),f(Cs,{key:1,data:e(yt)||[],height:350,markers:e(We),onMarkerClick:je},null,8,["data","markers"]))]),_:1}),a(He,null,{header:t(()=>[n("h2",Fl,[o[34]||(o[34]=d(" Slowest tests ",-1)),a(Fe,{topic:"project.slowest-tests"})]),o[35]||(o[35]=n("p",{class:"text-sm text-gray-600 mt-1"},"Top 20 slowest test cases across recent runs",-1))]),default:t(()=>[e(Ze)&&e(Me)===null?(s(),f(Et,{key:0,text:"Loading…"})):e(Me)&&e(Me).length>0?(s(),f(st,{key:1,data:e(Me),columns:os,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"title-cell":t(({row:l})=>[n("div",null,[n("div",Pl,c(l.original.title),1),n("div",El,[a(Ts,{"file-path":l.original.filePath,"project-key":e(m),"project-name":e(i)?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"trend-cell":t(({row:l})=>[l.original.trend==="slower"?(s(),r("span",Bl,"▲ Slower")):l.original.trend==="faster"?(s(),r("span",Vl,"▼ Faster")):(s(),r("span",Ll,"— Stable"))]),_:1},8,["data"])):e(xt)?(s(),r("div",Nl," Couldn't load the slowest tests — try refreshing. ")):(s(),r("div",Kl,"No slow test data available yet."))]),_:1}),a(js,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"]),a(He,null,{header:t(()=>[n("div",Ol,[n("div",null,[n("h2",ql,[o[36]||(o[36]=d(" Run comparison ",-1)),a(Fe,{topic:"project.run-compare"})]),o[37]||(o[37]=n("p",{class:"text-sm text-gray-600 mt-1"},"Compare duration changes between two runs",-1))]),e(ce).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Compare latest vs previous",onClick:Mt})):R("",!0)])]),default:t(()=>[n("div",Hl,[n("div",Ql,[n("div",null,[o[38]||(o[38]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),a(nt,{modelValue:e(ee),"onUpdate:modelValue":o[8]||(o[8]=l=>X(ee)?ee.value=l:null),items:e(ce),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[o[39]||(o[39]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),a(nt,{modelValue:e(te),"onUpdate:modelValue":o[9]||(o[9]=l=>X(te)?te.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(et)?(s(),r("div",Gl,[a($t,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[40]||(o[40]=d(" Loading run data… ",-1))])):e(ee)&&e(te)&&e(tt).length>0?(s(),r("div",Jl,[n("div",Xl,[a(se,{color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).improved)+" improved",1)]),_:1}),a(se,{color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).regressed)+" regressed",1)]),_:1}),a(se,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).unchanged)+" unchanged",1)]),_:1})]),a(st,{data:e(tt),columns:Ft,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",Yl,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",Wl,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Re,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",Zl,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Re,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",er,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",tr,"—")):(s(),r("span",{key:1,class:re(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(c(l.original.delta>0?"+":""),1),a(Re,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",sr,"—")):(s(),r("span",{key:1,class:re(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(l.original.percentChange>0?"+":"")+c(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(ee)||!e(te)?(s(),r("div",nr," Select two runs to compare their performance. ")):(s(),r("div",ar," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":t(()=>[a(Ss,{"project-id":e(m),"project-name":e(i)?.name,"sync-query":"",onTotal:o[10]||(o[10]=l=>qe.value=l)},null,8,["project-id","project-name"])]),compare:t(()=>[a(He,null,{header:t(()=>[n("div",or,[n("p",lr,[o[41]||(o[41]=d(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),a(Fe,{topic:"project.compare"})]),e(ce).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Latest vs previous",onClick:Mt})):R("",!0)])]),default:t(()=>[n("div",rr,[n("div",ir,[n("div",null,[o[42]||(o[42]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),a(nt,{modelValue:e(ee),"onUpdate:modelValue":o[11]||(o[11]=l=>X(ee)?ee.value=l:null),items:e(ce),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[o[43]||(o[43]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),a(nt,{modelValue:e(te),"onUpdate:modelValue":o[12]||(o[12]=l=>X(te)?te.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(et)?(s(),r("div",cr,[a($t,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[44]||(o[44]=d(" Loading run data… ",-1))])):e(ee)&&e(te)&&e(tt).length>0?(s(),r("div",ur,[n("div",dr,[n("div",mr,[o[45]||(o[45]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(Y).newFailures>0?(s(),f(se,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).newFailures)+" new failure"+c(e(Y).newFailures>1?"s":""),1)]),_:1})):R("",!0),e(Y).recovered>0?(s(),f(se,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).recovered)+" recovered ",1)]),_:1})):R("",!0),e(Y).stillFailing>0?(s(),f(se,{key:2,color:"warning",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).stillFailing)+" still failing ",1)]),_:1})):R("",!0),e(Y).newFailures===0&&e(Y).recovered===0&&e(Y).stillFailing===0?(s(),r("span",pr,"No status changes")):R("",!0)]),n("div",gr,[o[46]||(o[46]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(Y).regressed>0?(s(),f(se,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).regressed)+" regressed ",1)]),_:1})):R("",!0),e(Y).improved>0?(s(),f(se,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).improved)+" improved ",1)]),_:1})):R("",!0),a(se,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(Y).unchanged)+" unchanged ",1)]),_:1})])]),a(st,{data:e(tt),columns:Ft,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",fr,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",_r,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Re,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",vr,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Re,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",yr,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",hr,"—")):(s(),r("span",{key:1,class:re(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(c(l.original.delta>0?"+":""),1),a(Re,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",xr,"—")):(s(),r("span",{key:1,class:re(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(l.original.percentChange>0?"+":"")+c(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(ee)||!e(te)?(s(),r("div",br," Select two runs to compare test results. ")):(s(),r("div",kr," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":t(()=>[a(ws,{"project-id":String(e(m))},null,8,["project-id"])]),quarantine:t(()=>[a(Rs,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"])]),members:t(()=>[a(He,null,{header:t(()=>[n("div",$r,[n("p",Cr,[o[47]||(o[47]=d(" Users with access to this project ",-1)),a(Fe,{topic:"project.members"})]),a(le,{label:"Save changes",icon:"i-lucide-check",size:"sm",disabled:!e(ge),onClick:j},null,8,["disabled"])])]),default:t(()=>[e(ue).length>0?(s(),r("div",Tr,[(s(!0),r(J,null,ae(e(ue),l=>(s(),r("div",{key:l.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[n("div",null,[n("div",jr,c(l.name||l.username),1),n("div",Sr,[n("span",null,"@"+c(l.username),1),a(se,{color:l.role==="administrator"?"primary":l.role==="reporter"?"info":"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(l.role),1)]),_:2},1032,["color"]),l.global?(s(),r("span",wr,"Global access")):R("",!0)])]),l.role!=="administrator"?(s(),f(Ds,{key:0,"model-value":e(B).includes(l.id),disabled:l.global,title:l.global?"Has global access — remove global assignment first":"",onChange:De=>h(l.id)},null,8,["model-value","disabled","title","onChange"])):(s(),r("span",Rr,"Admin"))]))),128))])):(s(),r("div",Dr,"Loading members…"))]),_:1})]),timeline:t(()=>[a(As,{"project-id":Number(e(m)),markers:e(Te),environments:e(Ke),"can-edit":e(Ye),"focus-marker-id":e(Ie),onChanged:e(_t),onClearFocus:o[13]||(o[13]=l=>Ie.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),a(Vt,null,{default:t(()=>[a(Bt,{open:e(P),title:"Delete project","onUpdate:open":o[17]||(o[17]=l=>{l||(P.value=!1)})},{body:t(()=>[n("div",Ar,[n("p",zr,[o[48]||(o[48]=d(" This will permanently delete ",-1)),n("strong",null,c(e(i)?.label||e(i)?.name),1),o[49]||(o[49]=d(" and all its test runs, reports, traces, and failure clusters. This action cannot be undone. ",-1))]),n("div",null,[n("label",Ur,[o[50]||(o[50]=d(" Type the project key ",-1)),n("code",Ir,c(e(i)?.name),1),o[51]||(o[51]=d(" to confirm: ",-1))]),a(Ct,{modelValue:e(K),"onUpdate:modelValue":o[15]||(o[15]=l=>X(K)?K.value=l:null),placeholder:e(i)?.name,autofocus:"",onKeydown:Ls(T,["enter"])},null,8,["modelValue","placeholder"])])])]),footer:t(()=>[a(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:o[16]||(o[16]=l=>P.value=!1)}),a(le,{color:"error",label:"Delete project",icon:"i-lucide-trash-2",disabled:!e(g),loading:e(S),onClick:T},null,8,["disabled","loading"])]),_:1},8,["open"])]),_:1}),a(Vt,null,{default:t(()=>[a(Bt,{open:e(v)!==null,title:"Delete test run","onUpdate:open":o[20]||(o[20]=l=>{l||(v.value=null)})},{body:t(()=>[n("p",null,[o[52]||(o[52]=d(" Are you sure you want to delete ",-1)),n("strong",null,"Run #"+c(e(v)),1),o[53]||(o[53]=d("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:t(()=>[a(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:o[18]||(o[18]=l=>v.value=null)}),a(le,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(A)===e(v),onClick:o[19]||(o[19]=l=>Q(e(v)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Vi as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as F}from"./BR5cR2Ot.js";import{_ as M}from"./D9knOn6D.js";import{_ as L}from"./B3Fsod9X.js";import{d as R,b as P,B as H,ao as U,k as e,f as v,g as i,v as k,r as h,o as a,i as _,c as f,j as s,m as l,t as S,_ as q,z as O,F as Q,ap as Y,h as I,x as j,am as W,p as G,w as J,A as K}from"./DCFbQvIN.js";import{e as A,f as X}from"./BAKUqW95.js";import{_ as Z}from"./DkT2nCqn.js";import{a as ee}from"./BpM6ZPIG.js";import{u as te}from"./rL4C0HV5.js";import{u as ne}from"./E-_n_6vi.js";import"./Cpsq-kYE.js";import"./BjaRappk.js";const se={class:"space-y-3"},oe={key:0,class:"flex items-center justify-between gap-3"},ae={key:1,class:"text-sm text-muted"},ie={key:2,class:"flex items-center justify-between gap-3"},le={class:"text-sm flex items-center gap-2"},re={class:"flex items-start justify-between gap-3"},ce={class:"space-y-1 min-w-0"},ue={class:"text-sm font-medium"},de={key:0,class:"text-xs text-muted whitespace-pre-wrap line-clamp-6"},pe={key:1,class:"text-xs text-muted"},me=R({__name:"DesktopUpdateCard",props:{currentVersion:{}},setup(V){const p=P(),b=h(!1),r=h(!1),u=h(!1),x=h(!1),c=h(null),d=h(null);let m=null;H(()=>{b.value=!!U()}),W(()=>{m?.()});async function g(){const n=U();if(!(!n||r.value)){r.value=!0;try{c.value=await n.invoke("desktop_check_update")}catch(t){p.add({title:"Update check failed",description:A(t),color:"error"})}finally{r.value=!1}}}async function T(){const n=U(),t=Y();if(!(!n||u.value)){u.value=!0,d.value={downloaded:0,total:null};try{t&&!m&&(m=await t.listen("piwi:update-progress",({payload:o})=>{d.value=o})),await n.invoke("desktop_install_update"),x.value=!0}catch(o){p.add({title:"Update failed",description:A(o),color:"error"}),d.value=null}finally{u.value=!1}}}async function y(){const n=U();if(n)try{await n.invoke("desktop_restart_app")}catch{}}const w=I(()=>{const n=d.value;return n?.total?Math.min(100,Math.round(n.downloaded/n.total*100)):null});return(n,t)=>{const o=q,D=j,C=G,$=O,B=L;return e(b)?(a(),v(B,{key:0,icon:"i-lucide-arrow-up-circle",title:"Updates"},{subtitle:i(()=>[l(" Updates install from GitHub releases and apply on restart"+S(V.currentVersion?` — you are on v${V.currentVersion}`:"")+". ",1)]),default:i(()=>[_("div",se,[e(c)?e(c).state==="unsupported"?(a(),f("p",ae,[t[3]||(t[3]=l(" This build has no update channel — dev builds and releases made without the update signing key cannot self-update. Grab new versions from the ",-1)),s(D,{to:"https://github.com/piwitests/platform/releases/latest",target:"_blank",rel:"noopener noreferrer",class:"text-primary hover:underline"},{default:i(()=>[...t[2]||(t[2]=[l("latest release",-1)])]),_:1}),t[4]||(t[4]=l(". ",-1))])):e(c).state==="uptodate"?(a(),f("div",ie,[_("p",le,[s(C,{name:"i-lucide-check-circle",class:"size-4 text-success"}),t[5]||(t[5]=l(" You're on the latest version. ",-1))]),s(o,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-refresh-cw",loading:e(r),onClick:g},{default:i(()=>[...t[6]||(t[6]=[l(" Check again ",-1)])]),_:1},8,["loading"])])):(a(),f(Q,{key:3},[_("div",re,[_("div",ce,[_("p",ue,"Version "+S(e(c).version)+" is available",1),e(c).notes?(a(),f("p",de,S(e(c).notes),1)):k("",!0)]),e(x)?(a(),v(o,{key:1,size:"xs",color:"success",icon:"i-lucide-rotate-cw",class:"shrink-0",onClick:y},{default:i(()=>[...t[7]||(t[7]=[l(" Restart now ",-1)])]),_:1})):(a(),v(o,{key:0,size:"xs",icon:"i-lucide-download",loading:e(u),class:"shrink-0",onClick:T},{default:i(()=>[l(S(e(u)?"Installing…":"Install update"),1)]),_:1},8,["loading"]))]),e(u)&&e(w)!==null?(a(),v($,{key:0,"model-value":e(w),size:"sm"},null,8,["model-value"])):k("",!0),e(x)?(a(),f("p",pe," The update is installed — it applies the next time the app starts. ")):k("",!0)],64)):(a(),f("div",oe,[t[1]||(t[1]=_("p",{class:"text-sm text-muted"},"Check GitHub for a newer version of the desktop app.",-1)),s(o,{size:"xs",icon:"i-lucide-refresh-cw",loading:e(r),onClick:g},{default:i(()=>[...t[0]||(t[0]=[l("Check for updates",-1)])]),_:1},8,["loading"])]))])]),_:1})):k("",!0)}}}),_e=Object.assign(me,{__name:"DesktopUpdateCard"}),fe={class:"space-y-6"},ve={class:"flex flex-wrap items-center gap-x-6 gap-y-3 text-sm"},Te=R({__name:"about",async setup(V){let p,b;const r=K(),u=te(),{data:x}=([p,b]=J(()=>ne("/api/version","$mIoGdvWYhF")),p=await p,b(),p),c=r.public.appVersion,d=r.public.buildSha,m=r.public.buildTime,g=r.public.nodeVersion,T=r.public.authEnabled,y=I(()=>d?d.slice(0,7):null),w=I(()=>{const n=x.value?.dbBackend;return n==="postgresql"?"PostgreSQL":n==="sqlite"?"SQLite":n??null});return(n,t)=>{const o=F,D=M,C=L,$=_e,B=Z,E=ee,z=j,N=G;return a(),f("div",fe,[s(C,{icon:"i-lucide-info",title:"Application"},{default:i(()=>[s(D,null,{default:i(()=>[s(o,{label:"Version",value:`v${e(c)}`},null,8,["value"]),e(y)?(a(),v(o,{key:0,label:"Build",value:e(y),hint:e(d)},null,8,["value","hint"])):k("",!0),e(m)?(a(),v(o,{key:1,label:"Built",value:("formatRelativeTime"in n?n.formatRelativeTime:e(X))(e(m)),hint:e(m)},null,8,["value","hint"])):k("",!0),s(o,{label:"Node.js",value:e(g)},null,8,["value"]),s(o,{label:"Database",value:e(w)},null,8,["value"]),s(o,{label:"Authentication",value:e(T)?"Enabled":"Disabled"},null,8,["value"])]),_:1})]),_:1}),s($,{"current-version":e(c)},null,8,["current-version"]),e(u)?(a(),v(B,{key:0,icon:"i-lucide-rocket",color:"neutral",variant:"subtle",title:"Connecting the reporter and AI clients",description:"The URL and access token for this local instance, the data location, and background-service control are on the Setup page.",actions:[{label:"Open Setup",to:"/setup",color:"neutral",variant:"solid",size:"xs"}]})):k("",!0),s(C,{icon:"i-lucide-book-open",title:"Resources"},{default:i(()=>[_("div",ve,[s(E,{to:""},{default:i(()=>[...t[0]||(t[0]=[l("Documentation",-1)])]),_:1}),s(z,{to:"/docs",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:i(()=>[...t[1]||(t[1]=[l(" API reference ",-1)])]),_:1}),s(z,{to:"https://github.com/piwitests/platform",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 text-primary hover:underline"},{default:i(()=>[t[2]||(t[2]=l(" GitHub ",-1)),s(N,{name:"i-lucide-external-link",class:"w-3.5 h-3.5 shrink-0"})]),_:1})])]),_:1})])}}});export{Te as default};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{_ as me,a as de}from"./
|
|
1
|
+
import{_ as me,a as de}from"./9ti9eNH9.js";import{_ as pe,a as fe}from"./DQM62mxB.js";import{_ as he}from"./DdH3op4b.js";import{d as H,o as n,c as a,F as B,y as T,i,t as c,k as s,v as g,m as R,f as U,h as x,ay as _e,M as se,r as N,j as $,_ as Y,E as oe,l as Z,s as ee,g as P,q as Q,A as ae,p as xe,e as ye}from"./DCFbQvIN.js";import{_ as ge}from"./Dk9nD32g.js";import{_ as be}from"./DkT2nCqn.js";import{_ as ve}from"./BrxtP_cN.js";import{_ as ke}from"./B1RmmOsM.js";import{_ as $e}from"./D8gX1Jde.js";import{e as we}from"./BAKUqW95.js";import{_ as Ae}from"./D_eDAIsT.js";import{a as je,u as Ue}from"./E-_n_6vi.js";import{u as re}from"./BnbSEpXX.js";import"./C2hNxjjz.js";import"./CIEceDOw.js";import"./rL4C0HV5.js";const Ce=["get","post","put","patch","delete","head","options","trace"];function Se(e){switch(e.toLowerCase()){case"get":return"success";case"post":return"info";case"put":case"patch":return"warning";case"delete":return"error";default:return"neutral"}}function Oe(e,t){return`op-${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")}function qe(e){const t=new Map;for(const[r,o]of Object.entries(e?.paths??{})){if(!o)continue;const u=o.parameters??[];for(const p of Ce){const v=o[p];if(!v)continue;const f=v.tags?.[0]??"Other",y={path:r,method:p,operation:v,parameters:[...u,...v.parameters??[]],tag:f,anchor:Oe(p,r)},A=t.get(f);A?A.push(y):t.set(f,[y])}}return[...t.entries()].map(([r,o])=>({tag:r,operations:o})).sort((r,o)=>r.tag.localeCompare(o.tag))}function ie(e,t){return Array.isArray(e.security)?e.security.length>0:Array.isArray(t?.security)&&t.security.length>0}function Be(e){return Array.isArray(e.security)&&e.security.length===0}function D(e,t){if(!e?.$ref)return e;const r=/^#\/components\/schemas\/(.+)$/.exec(e.$ref);return r?.[1]?t?.components?.schemas?.[r[1]]??e:e}const Re=["administrator","reporter","user"];function ne(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Te(e){const t=e["x-required-roles"];if(!t||t.length===0)return null;const r=Re.every(o=>t.includes(o));return{roles:t,label:r?"Any signed-in user":t.map(ne).join(" or "),shortLabel:r?"Any user":t.map(o=>o==="administrator"?"Admin":ne(o)).join(" / "),elevated:!r&&!t.includes("user")}}function te(e){if(!e)return"any";if(e.$ref)return e.$ref.split("/").pop()??"object";const t=Array.isArray(e.type)?e.type.join(" | "):e.type;if(t==="array"){const r=e.items;return`array<${r?te(r):"any"}>`}return!t&&e.properties||!t&&(e.oneOf||e.anyOf||e.allOf)?"object":t??"any"}const Pe={class:"space-y-2"},Ve={class:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5"},Le={class:"font-mono text-primary"},ze={class:"text-xs text-muted font-mono"},Ie={key:0,class:"text-xs text-dimmed font-mono"},Ne={key:1,class:"text-xs font-medium text-error"},De={key:0,class:"text-muted mt-0.5"},Ee={key:1,class:"text-xs text-dimmed mt-0.5"},Me={class:"font-mono"},Je=H({__name:"ApiSchema",props:{schema:{},spec:{default:null},depth:{default:0}},setup(e){const t=e,r=x(()=>D(t.schema,t.spec)??t.schema),o=x(()=>{const f=r.value.type==="array"?D(r.value.items,t.spec):r.value,y=f?.properties;if(!y)return[];const A=new Set(f?.required??[]);return Object.entries(y).map(([h,j])=>({name:h,required:A.has(h),schema:D(j,t.spec)??j}))}),u=x(()=>(t.depth??0)<6);function p(f){const y=f.type==="array"?D(f.items,t.spec):f;return!!(y?.properties&&Object.keys(y.properties).length>0)}function v(f){return(f.enum??[]).map(y=>JSON.stringify(y)).join(", ")}return(f,y)=>{const A=le;return n(),a("div",Pe,[(n(!0),a(B,null,T(s(o),h=>(n(),a("div",{key:h.name,class:"text-sm"},[i("div",Ve,[i("code",Le,c(h.name),1),i("span",ze,c(("schemaTypeLabel"in f?f.schemaTypeLabel:s(te))(h.schema)),1),h.schema.format?(n(),a("span",Ie,"("+c(h.schema.format)+")",1)):g("",!0),h.required?(n(),a("span",Ne,"required")):g("",!0)]),h.schema.description?(n(),a("p",De,c(h.schema.description),1)):g("",!0),h.schema.enum?.length?(n(),a("p",Ee,[y[0]||(y[0]=R(" Allowed values: ",-1)),i("span",Me,c(v(h.schema)),1)])):g("",!0),s(u)&&p(h.schema)?(n(),U(A,{key:2,schema:h.schema,spec:e.spec,depth:(e.depth??0)+1,class:"mt-1.5 border-l border-default pl-3"},null,8,["schema","spec","depth"])):g("",!0)]))),128))])}}}),le=Object.assign(Je,{__name:"ApiSchema"});function He(){return{token:_e("piwi-api-token","")}}function We(e,t){return e.replace(/\{([^}]+)\}/g,(r,o)=>{const u=t[o];return u?encodeURIComponent(u):r})}function Fe(e){const t=new URLSearchParams;for(const[o,u]of Object.entries(e))u!==void 0&&u!==""&&t.append(o,u);const r=t.toString();return r?`?${r}`:""}function K(e,t,r=0){const o=D(e,t);if(!o||r>6)return null;if(o.example!==void 0)return o.example;if(o.default!==void 0)return o.default;if(o.enum?.length)return o.enum[0];const u=Array.isArray(o.type)?o.type.find(p=>p!=="null"):o.type;if(u==="object"||!u&&o.properties){const p={};for(const[v,f]of Object.entries(o.properties??{}))p[v]=K(f,t,r+1);return p}if(u==="array")return[K(o.items,t,r+1)];switch(u){case"string":return o.format==="date-time"?"2024-01-01T00:00:00Z":o.format==="date"?"2024-01-01":o.format==="uuid"?"00000000-0000-0000-0000-000000000000":"string";case"integer":case"number":return 0;case"boolean":return!1;default:return null}}function Qe(e,t){const r=e.requestBody?.content?.["application/json"]?.schema;return r?JSON.stringify(K(r,t),null,2):null}function Ge(e){return!!e.requestBody?.content?.["application/json"]}function X(e){return`'${e.replace(/'/g,"'\\''")}'`}function Xe({method:e,url:t,headers:r,body:o}){const u=["curl"];e.toUpperCase()!=="GET"&&u.push("-X",e.toUpperCase());for(const[p,v]of Object.entries(r))u.push("-H",X(`${p}: ${v}`));return o&&u.push("-d",X(o)),u.push(X(t)),u.join(" ")}function Ze({method:e,url:t,headers:r,body:o}){const u=[` method: ${JSON.stringify(e.toUpperCase())},`];return Object.keys(r).length&&u.push(` headers: ${JSON.stringify(r)},`),o&&u.push(` body: ${JSON.stringify(o)},`),`const res = await fetch(${JSON.stringify(t)}, {
|
|
2
2
|
${u.join(`
|
|
3
3
|
`)}
|
|
4
4
|
});
|
|
5
|
-
const data = await res.json();`}const Ke={class:"rounded-lg border border-default bg-default/50 p-3 space-y-3"},Ye={class:"flex items-center justify-between gap-2"},et={key:0,class:"space-y-1"},tt={key:1,class:"space-y-1.5"},st=["title"],nt={key:2,class:"space-y-1.5"},ot=["title"],at={key:3,class:"space-y-1"},rt={key:4,class:"text-xs text-dimmed"},it={key:5,class:"space-y-1.5"},lt={class:"flex items-center gap-2 text-xs"},ct={class:"text-dimmed"},ut={class:"max-h-80 overflow-auto"},mt={key:6,class:"text-xs text-error"},dt={class:"space-y-1.5"},pt={class:"flex gap-1"},ft=H({__name:"ApiTryIt",props:{item:{},spec:{}},setup(e){const t=e,r=ae(),o=r.public.demoMode,u=(r.app?.baseURL??"/").replace(/\/$/,""),{token:p}=He(),v=x(()=>ie(t.item.operation,t.spec)),f=x(()=>t.item.parameters.filter(O=>O.in==="path")),y=x(()=>t.item.parameters.filter(O=>O.in==="query")),A=se(Object.fromEntries(f.value.map(O=>[O.name,""]))),h=se(Object.fromEntries(y.value.map(O=>[O.name,""]))),j=x(()=>Ge(t.item.operation)),C=x(()=>!!t.item.operation.requestBody?.content?.["multipart/form-data"]&&!j.value),w=N(Qe(t.item.operation,t.spec)??""),l=x(()=>j.value&&w.value.trim()?w.value:void 0),d=x(()=>u+We(t.item.path,A)+Fe(h)),S=x(()=>{const O={};return l.value&&(O["Content-Type"]="application/json"),v.value&&p.value&&(O.Authorization=`Bearer ${p.value}`),O}),q=x(()=>window.location.origin+d.value),L=x(()=>Xe({method:t.item.method,url:q.value,headers:S.value,body:l.value})),I=x(()=>Ze({method:t.item.method,url:q.value,headers:S.value,body:l.value})),_=N("curl"),m=N(!1),V=N(null),z=N(null);async function ce(){m.value=!0,V.value=null,z.value=null;const O=performance.now();try{const b={...S.value};o&&(b["x-demo-user-id"]=localStorage.getItem("piwi-demo-user-id")||"1");const E=await fetch(d.value,{method:t.item.method.toUpperCase(),headers:b,body:l.value,credentials:"same-origin"}),J=Math.round(performance.now()-O),W=await E.text();let F=W;try{F=JSON.stringify(JSON.parse(W),null,2)}catch{}z.value={status:E.status,statusText:E.statusText,ok:E.ok,timeMs:J,body:F}}catch(b){V.value=we(b)}finally{m.value=!1}}return(O,b)=>{const E=Y,J=oe,W=ve,F=ke,ue=ee,G=$e;return n(),a("div",Ke,[i("div",Ye,[b[4]||(b[4]=i("h4",{class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},"Try it out",-1)),$(E,{size:"xs",color:"primary",icon:"i-lucide-play",loading:s(m),label:"Send",onClick:ce},null,8,["loading"])]),s(v)?(n(),a("div",et,[b[5]||(b[5]=i("label",{class:"text-xs text-dimmed"},"Authorization — Bearer token",-1)),$(J,{modelValue:s(p),"onUpdate:modelValue":b[0]||(b[0]=k=>Z(p)?p.value=k:null),type:"password",placeholder:"pd_…",size:"sm",class:"w-full",ui:{base:"font-mono"}},null,8,["modelValue"])])):g("",!0),s(f).length?(n(),a("div",tt,[b[6]||(b[6]=i("label",{class:"text-xs text-dimmed"},"Path parameters",-1)),(n(!0),a(B,null,T(s(f),k=>(n(),a("div",{key:k.name,class:"flex items-center gap-2"},[i("code",{class:"text-xs font-mono text-primary w-28 shrink-0 truncate",title:k.name},c(k.name),9,st),$(J,{modelValue:s(A)[k.name],"onUpdate:modelValue":M=>s(A)[k.name]=M,placeholder:k.name,size:"sm",class:"flex-1",ui:{base:"font-mono"}},null,8,["modelValue","onUpdate:modelValue","placeholder"])]))),128))])):g("",!0),s(y).length?(n(),a("div",nt,[b[7]||(b[7]=i("label",{class:"text-xs text-dimmed"},"Query parameters",-1)),(n(!0),a(B,null,T(s(y),k=>(n(),a("div",{key:k.name,class:"flex items-center gap-2"},[i("code",{class:"text-xs font-mono text-primary w-28 shrink-0 truncate",title:k.name},c(k.name),9,ot),k.schema?.enum?.length?(n(),U(W,{key:0,modelValue:s(h)[k.name],"onUpdate:modelValue":M=>s(h)[k.name]=M,items:["",...k.schema.enum.map(String)],size:"sm",class:"flex-1"},null,8,["modelValue","onUpdate:modelValue","items"])):(n(),U(J,{key:1,modelValue:s(h)[k.name],"onUpdate:modelValue":M=>s(h)[k.name]=M,placeholder:k.name,size:"sm",class:"flex-1",ui:{base:"font-mono"}},null,8,["modelValue","onUpdate:modelValue","placeholder"]))]))),128))])):g("",!0),s(j)?(n(),a("div",at,[b[8]||(b[8]=i("label",{class:"text-xs text-dimmed"},"Request body — application/json",-1)),$(F,{modelValue:s(w),"onUpdate:modelValue":b[1]||(b[1]=k=>Z(w)?w.value=k:null),rows:6,class:"w-full",ui:{base:"font-mono text-xs"}},null,8,["modelValue"])])):s(C)?(n(),a("p",rt,[...b[9]||(b[9]=[R(" This endpoint expects ",-1),i("code",{class:"font-mono"},"multipart/form-data",-1),R(" (file upload) — use the cURL sample below as a starting point. ",-1)])])):g("",!0),s(z)?(n(),a("div",it,[i("div",lt,[$(ue,{color:s(z).ok?"success":"error",variant:"subtle",class:"font-mono"},{default:P(()=>[R(c(s(z).status)+" "+c(s(z).statusText),1)]),_:1},8,["color"]),i("span",ct,c(s(z).timeMs)+" ms",1)]),i("div",ut,[$(G,{code:s(z).body,lang:"json"},null,8,["code"])])])):s(V)?(n(),a("p",mt,"Request failed: "+c(s(V)),1)):g("",!0),i("div",dt,[i("div",pt,[i("button",{type:"button",class:Q(["text-xs px-2 py-0.5 rounded-md transition-colors",s(_)==="curl"?"bg-elevated text-highlighted":"text-muted hover:text-highlighted"]),onClick:b[2]||(b[2]=k=>_.value="curl")}," cURL ",2),i("button",{type:"button",class:Q(["text-xs px-2 py-0.5 rounded-md transition-colors",s(_)==="fetch"?"bg-elevated text-highlighted":"text-muted hover:text-highlighted"]),onClick:b[3]||(b[3]=k=>_.value="fetch")}," JavaScript ",2)]),s(_)==="curl"?(n(),U(G,{key:0,code:s(L),lang:"bash"},null,8,["code"])):(n(),U(G,{key:1,code:s(I),lang:"javascript"},null,8,["code"]))])])}}}),ht=Object.assign(ft,{__name:"ApiTryIt"}),_t=["id"],xt=["aria-expanded"],yt={class:"font-mono text-sm text-highlighted break-all"},gt={class:"text-sm text-muted truncate hidden sm:inline flex-1"},bt={key:0,class:"px-3 pb-3 pt-1 space-y-4 border-t border-default"},vt={key:0,class:"text-sm font-medium text-highlighted sm:hidden"},kt={key:1,class:"text-sm text-muted"},$t={key:2,class:"flex items-center gap-1.5 text-xs"},wt={class:"text-muted font-medium"},At={key:0,class:"space-y-1.5"},jt={class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},Ut={class:"space-y-2"},Ct={class:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5"},St={class:"font-mono text-primary"},Ot={class:"text-xs text-muted font-mono"},qt={key:0,class:"text-xs font-medium text-error"},Bt={key:0,class:"text-muted mt-0.5"},Rt={key:1,class:"text-xs text-dimmed mt-0.5"},Tt={class:"font-mono"},Pt={key:3,class:"space-y-1.5"},Vt={class:"text-xs text-dimmed font-mono"},Lt={key:4,class:"space-y-1.5"},zt={class:"flex items-baseline gap-2"},It={class:"text-muted"},Nt={class:"text-xs text-dimmed font-mono"},Dt=H({__name:"ApiOperation",props:{item:{},spec:{}},setup(e){const t=e,r=N(!1),o=x(()=>ie(t.item.operation,t.spec)),u=x(()=>Be(t.item.operation)),p=x(()=>Te(t.item.operation)),v=x(()=>u.value?"Public — no authentication required":p.value?p.value.label:o.value?"Requires authentication":null),f=x(()=>t.item.parameters.filter(l=>l.in==="path")),y=x(()=>t.item.parameters.filter(l=>l.in==="query")),A=x(()=>t.item.parameters.filter(l=>l.in==="header")),h=x(()=>Object.entries(t.item.operation.requestBody?.content??{}).map(([l,d])=>({contentType:l,schema:D(d.schema,t.spec)}))),j=x(()=>Object.entries(t.item.operation.responses??{}).map(([l,d])=>({status:l,description:d.description,entries:Object.entries(d.content??{}).map(([S,q])=>({contentType:S,schema:D(q.schema,t.spec)}))}))),C=x(()=>t.item.path.split(/(\{[^}]+\})/g).map(l=>({text:l,isParam:l.startsWith("{")})));function w(l){return l.startsWith("2")?"text-success":l.startsWith("3")?"text-info":l.startsWith("4")?"text-warning":l.startsWith("5")?"text-error":"text-muted"}return(l,d)=>{const S=ee,q=xe,L=le,I=ht;return n(),a("div",{id:e.item.anchor,class:"border border-default rounded-lg bg-elevated/20 scroll-mt-20"},[i("button",{type:"button",class:"w-full flex items-center gap-3 px-3 py-2.5 text-left cursor-pointer","aria-expanded":s(r),onClick:d[0]||(d[0]=_=>r.value=!s(r))},[$(S,{color:("methodBadgeColor"in l?l.methodBadgeColor:s(Se))(e.item.method),variant:"subtle",class:"font-mono uppercase shrink-0 w-16 justify-center"},{default:P(()=>[R(c(e.item.method),1)]),_:1},8,["color"]),i("code",yt,[(n(!0),a(B,null,T(s(C),(_,m)=>(n(),a("span",{key:m,class:Q(_.isParam?"text-warning":"")},c(_.text),3))),128))]),i("span",gt,c(e.item.operation.summary),1),s(p)?.elevated?(n(),U(S,{key:0,color:"warning",variant:"subtle",size:"sm",icon:"i-lucide-shield",class:"shrink-0 ml-auto sm:ml-0",title:`Requires role: ${s(p).label}`},{default:P(()=>[R(c(s(p).shortLabel),1)]),_:1},8,["title"])):s(u)?(n(),U(S,{key:1,color:"neutral",variant:"subtle",size:"sm",class:"shrink-0 ml-auto sm:ml-0"},{default:P(()=>[...d[1]||(d[1]=[R(" Public ",-1)])]),_:1})):s(o)?(n(),U(q,{key:2,name:"i-lucide-lock",class:"size-3.5 text-dimmed shrink-0 ml-auto sm:ml-0",title:"Requires authentication"})):g("",!0),$(q,{name:s(r)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-4 text-dimmed shrink-0"},null,8,["name"])],8,xt),s(r)?(n(),a("div",bt,[e.item.operation.summary?(n(),a("p",vt,c(e.item.operation.summary),1)):g("",!0),e.item.operation.description?(n(),a("p",kt,c(e.item.operation.description),1)):g("",!0),s(v)?(n(),a("div",$t,[$(q,{name:s(p)?.elevated?"i-lucide-shield":"i-lucide-users",class:"size-3.5 text-dimmed shrink-0"},null,8,["name"]),d[2]||(d[2]=i("span",{class:"text-dimmed"},"Access",-1)),i("span",wt,c(s(v)),1)])):g("",!0),(n(!0),a(B,null,T([{label:"Path parameters",params:s(f)},{label:"Query parameters",params:s(y)},{label:"Header parameters",params:s(A)}],_=>(n(),a(B,{key:_.label},[_.params.length?(n(),a("div",At,[i("h4",jt,c(_.label),1),i("div",Ut,[(n(!0),a(B,null,T(_.params,m=>(n(),a("div",{key:m.name,class:"text-sm"},[i("div",Ct,[i("code",St,c(m.name),1),i("span",Ot,c(("schemaTypeLabel"in l?l.schemaTypeLabel:s(te))(m.schema)),1),m.required?(n(),a("span",qt,"required")):g("",!0)]),m.description?(n(),a("p",Bt,c(m.description),1)):g("",!0),m.schema?.enum?.length?(n(),a("p",Rt,[d[3]||(d[3]=R(" Allowed values: ",-1)),i("span",Tt,c(m.schema.enum.map(V=>JSON.stringify(V)).join(", ")),1)])):g("",!0)]))),128))])])):g("",!0)],64))),128)),s(h).length?(n(),a("div",Pt,[d[4]||(d[4]=i("h4",{class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},"Request body",-1)),(n(!0),a(B,null,T(s(h),_=>(n(),a("div",{key:_.contentType,class:"space-y-1.5"},[i("code",Vt,c(_.contentType),1),_.schema?(n(),U(L,{key:0,schema:_.schema,spec:e.spec},null,8,["schema","spec"])):g("",!0)]))),128))])):g("",!0),s(j).length?(n(),a("div",Lt,[d[5]||(d[5]=i("h4",{class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},"Responses",-1)),(n(!0),a(B,null,T(s(j),_=>(n(),a("div",{key:_.status,class:"text-sm"},[i("div",zt,[i("code",{class:Q(["font-mono font-semibold",w(_.status)])},c(_.status),3),i("span",It,c(_.description),1)]),(n(!0),a(B,null,T(_.entries,m=>(n(),a("div",{key:m.contentType,class:"mt-1 pl-3 border-l border-default"},[i("code",Nt,c(m.contentType),1),m.schema?(n(),U(L,{key:0,schema:m.schema,spec:e.spec,class:"mt-1"},null,8,["schema","spec"])):g("",!0)]))),128))]))),128))])):g("",!0),$(I,{item:e.item,spec:e.spec},null,8,["item","spec"])])):g("",!0)],8,_t)}}}),Et=Object.assign(Dt,{__name:"ApiOperation"}),Jt={class:"max-w-4xl mx-auto px-4 sm:px-6 py-6 space-y-6"},Mt={class:"space-y-3"},Ht={class:"flex flex-wrap items-center gap-2"},Wt={class:"text-xl font-semibold text-highlighted"},Ft={key:0,class:"text-sm text-muted"},Qt={key:1,class:"flex items-center gap-2 text-sm"},Gt={class:"flex flex-wrap items-center gap-2"},Xt={class:"text-xs text-dimmed"},Zt={key:0,class:"flex flex-wrap gap-1.5"},Kt=["href"],Yt={class:"text-dimmed"},es={key:1,class:"space-y-8"},ts=["id"],ss={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ns={class:"text-dimmed/60"},os=H({__name:"ApiReference",props:{spec:{},specUrl:{}},setup(e){const t=e,{copy:r,copied:o}=je(),{isDesktop:u,download:p}=re(),v=N("");function f(w){u&&(w.preventDefault(),p(t.specUrl,"piwi-openapi.json"))}const y=x(()=>qe(t.spec)),A=x(()=>y.value.reduce((w,l)=>w+l.operations.length,0)),h=x(()=>{const w=v.value.trim().toLowerCase();return w?y.value.map(l=>({tag:l.tag,operations:l.operations.filter(d=>`${d.method} ${d.path} ${d.operation.summary??""} ${d.operation.description??""} ${d.tag}`.toLowerCase().includes(w))})).filter(l=>l.operations.length>0):y.value}),j=x(()=>t.spec.servers?.[0]?.url??"");function C(w){return`tag-${w.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")}`}return(w,l)=>{const d=ee,S=Y,q=be,L=oe,I=Et,_=Ae;return n(),a("div",Jt,[i("header",Mt,[i("div",Ht,[i("h1",Wt,c(e.spec.info?.title??"API Reference"),1),e.spec.info?.version?(n(),U(d,{key:0,color:"neutral",variant:"subtle",class:"font-mono"},{default:P(()=>[R(" v"+c(e.spec.info.version),1)]),_:1})):g("",!0)]),e.spec.info?.description?(n(),a("p",Ft,c(e.spec.info.description),1)):g("",!0),s(j)?(n(),a("div",Qt,[l[2]||(l[2]=i("span",{class:"text-dimmed"},"Base URL",-1)),$(S,{label:s(j),color:"neutral",variant:"subtle",size:"xs",icon:s(o)?"i-lucide-check":"i-lucide-copy",class:"font-mono",onClick:l[0]||(l[0]=m=>s(r)(s(j),{toast:!0}))},null,8,["label","icon"])])):g("",!0),i("div",Gt,[$(S,{to:e.specUrl,target:"_blank",external:"",color:"neutral",variant:"outline",size:"xs",icon:"i-lucide-file-json",label:"Raw OpenAPI spec",onClick:f},null,8,["to"]),i("span",Xt,c(s(A))+" endpoints",1)]),$(q,{color:"info",variant:"subtle",icon:"i-lucide-terminal",title:"Windows users",description:"curl examples below use Unix syntax — run them in Git Bash / WSL, or use PowerShell's Invoke-RestMethod instead."})]),$(L,{modelValue:s(v),"onUpdate:modelValue":l[1]||(l[1]=m=>Z(v)?v.value=m:null),icon:"i-lucide-search",placeholder:"Filter endpoints by path, method, or description…",size:"md",class:"w-full",ui:{root:"sticky top-0 z-10"}},null,8,["modelValue"]),!s(v)&&s(y).length>1?(n(),a("div",Zt,[(n(!0),a(B,null,T(s(y),m=>(n(),a("a",{key:m.tag,href:`#${C(m.tag)}`,class:"text-xs px-2 py-1 rounded-md bg-elevated text-muted hover:text-highlighted hover:bg-accented transition-colors"},[R(c(m.tag)+" ",1),i("span",Yt,c(m.operations.length),1)],8,Kt))),128))])):g("",!0),s(h).length?(n(),a("div",es,[(n(!0),a(B,null,T(s(h),m=>(n(),a("section",{key:m.tag,id:C(m.tag),class:"space-y-2 scroll-mt-4"},[i("h2",ss,[R(c(m.tag)+" ",1),i("span",ns,"("+c(m.operations.length)+")",1)]),(n(!0),a(B,null,T(m.operations,V=>(n(),U(I,{key:V.anchor,item:V,spec:e.spec},null,8,["item","spec"]))),128))],8,ts))),128))])):(n(),U(_,{key:2,icon:"i-lucide-search-x",text:"No endpoints match your filter."}))])}}}),as=Object.assign(os,{__name:"ApiReference"}),rs={key:1,class:"p-6"},is={class:"flex flex-wrap justify-center gap-2 mt-1"},As=H({__name:"docs",setup(e){const r=ae().public.demoMode,o=r?"/demo/_openapi.json":"/_openapi.json",{isDesktop:u,download:p}=re();function v(j){u&&(j.preventDefault(),p(o,"piwi-openapi.json"))}ye({title:"API Reference — Piwi Dashboard"});const{data:f,status:y,error:A,refresh:h}=Ue(o,{key:"openapi-spec",lazy:!0,server:!r},"$jVU__ibpQM");return(j,C)=>{const w=me,l=de,d=fe,S=he,q=Y,L=ge,I=as,_=pe;return n(),U(_,{id:"docs"},{header:P(()=>[$(d,null,{leading:P(()=>[$(w),$(l,{items:[{label:"API Reference",icon:"i-lucide-book-open"}]})]),_:1})]),body:P(()=>[s(y)==="pending"||!s(f)&&!s(A)?(n(),U(S,{key:0,text:"Loading API reference…"})):s(A)||!s(f)?(n(),a("div",rs,[$(L,{text:"Couldn't load the API reference UI."},{action:P(()=>[C[3]||(C[3]=i("p",{class:"text-sm text-muted max-w-sm"},"The raw OpenAPI spec is still available directly.",-1)),i("div",is,[$(q,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:C[0]||(C[0]=()=>s(h)())},{default:P(()=>[...C[1]||(C[1]=[R(" Retry ",-1)])]),_:1}),$(q,{to:s(o),target:"_blank",external:"",size:"sm",variant:"outline",icon:"i-lucide-file-json",onClick:v},{default:P(()=>[...C[2]||(C[2]=[R(" Raw OpenAPI spec ",-1)])]),_:1},8,["to"])])]),_:1})])):(n(),U(I,{key:2,spec:s(f),"spec-url":s(o)},null,8,["spec","spec-url"]))]),_:1})}}});export{As as default};
|
|
5
|
+
const data = await res.json();`}const Ke={class:"rounded-lg border border-default bg-default/50 p-3 space-y-3"},Ye={class:"flex items-center justify-between gap-2"},et={key:0,class:"space-y-1"},tt={key:1,class:"space-y-1.5"},st=["title"],nt={key:2,class:"space-y-1.5"},ot=["title"],at={key:3,class:"space-y-1"},rt={key:4,class:"text-xs text-dimmed"},it={key:5,class:"space-y-1.5"},lt={class:"flex items-center gap-2 text-xs"},ct={class:"text-dimmed"},ut={class:"max-h-80 overflow-auto"},mt={key:6,class:"text-xs text-error"},dt={class:"space-y-1.5"},pt={class:"flex gap-1"},ft=H({__name:"ApiTryIt",props:{item:{},spec:{}},setup(e){const t=e,r=ae(),o=r.public.demoMode,u=(r.app?.baseURL??"/").replace(/\/$/,""),{token:p}=He(),v=x(()=>ie(t.item.operation,t.spec)),f=x(()=>t.item.parameters.filter(O=>O.in==="path")),y=x(()=>t.item.parameters.filter(O=>O.in==="query")),A=se(Object.fromEntries(f.value.map(O=>[O.name,""]))),h=se(Object.fromEntries(y.value.map(O=>[O.name,""]))),j=x(()=>Ge(t.item.operation)),C=x(()=>!!t.item.operation.requestBody?.content?.["multipart/form-data"]&&!j.value),w=N(Qe(t.item.operation,t.spec)??""),l=x(()=>j.value&&w.value.trim()?w.value:void 0),d=x(()=>u+We(t.item.path,A)+Fe(h)),S=x(()=>{const O={};return l.value&&(O["Content-Type"]="application/json"),v.value&&p.value&&(O.Authorization=`Bearer ${p.value}`),O}),q=x(()=>window.location.origin+d.value),L=x(()=>Xe({method:t.item.method,url:q.value,headers:S.value,body:l.value})),I=x(()=>Ze({method:t.item.method,url:q.value,headers:S.value,body:l.value})),_=N("curl"),m=N(!1),V=N(null),z=N(null);async function ce(){m.value=!0,V.value=null,z.value=null;const O=performance.now();try{const b={...S.value};o&&(b["x-demo-user-id"]=localStorage.getItem("piwi-demo-user-id")||"1");const E=await fetch(d.value,{method:t.item.method.toUpperCase(),headers:b,body:l.value,credentials:"same-origin"}),M=Math.round(performance.now()-O),W=await E.text();let F=W;try{F=JSON.stringify(JSON.parse(W),null,2)}catch{}z.value={status:E.status,statusText:E.statusText,ok:E.ok,timeMs:M,body:F}}catch(b){V.value=we(b)}finally{m.value=!1}}return(O,b)=>{const E=Y,M=oe,W=ve,F=ke,ue=ee,G=$e;return n(),a("div",Ke,[i("div",Ye,[b[4]||(b[4]=i("h4",{class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},"Try it out",-1)),$(E,{size:"xs",color:"primary",icon:"i-lucide-play",loading:s(m),label:"Send",onClick:ce},null,8,["loading"])]),s(v)?(n(),a("div",et,[b[5]||(b[5]=i("label",{class:"text-xs text-dimmed"},"Authorization — Bearer token",-1)),$(M,{modelValue:s(p),"onUpdate:modelValue":b[0]||(b[0]=k=>Z(p)?p.value=k:null),type:"password",placeholder:"pd_…",size:"sm",class:"w-full",ui:{base:"font-mono"}},null,8,["modelValue"])])):g("",!0),s(f).length?(n(),a("div",tt,[b[6]||(b[6]=i("label",{class:"text-xs text-dimmed"},"Path parameters",-1)),(n(!0),a(B,null,T(s(f),k=>(n(),a("div",{key:k.name,class:"flex items-center gap-2"},[i("code",{class:"text-xs font-mono text-primary w-28 shrink-0 truncate",title:k.name},c(k.name),9,st),$(M,{modelValue:s(A)[k.name],"onUpdate:modelValue":J=>s(A)[k.name]=J,placeholder:k.name,size:"sm",class:"flex-1",ui:{base:"font-mono"}},null,8,["modelValue","onUpdate:modelValue","placeholder"])]))),128))])):g("",!0),s(y).length?(n(),a("div",nt,[b[7]||(b[7]=i("label",{class:"text-xs text-dimmed"},"Query parameters",-1)),(n(!0),a(B,null,T(s(y),k=>(n(),a("div",{key:k.name,class:"flex items-center gap-2"},[i("code",{class:"text-xs font-mono text-primary w-28 shrink-0 truncate",title:k.name},c(k.name),9,ot),k.schema?.enum?.length?(n(),U(W,{key:0,modelValue:s(h)[k.name],"onUpdate:modelValue":J=>s(h)[k.name]=J,items:["",...k.schema.enum.map(String)],size:"sm",class:"flex-1"},null,8,["modelValue","onUpdate:modelValue","items"])):(n(),U(M,{key:1,modelValue:s(h)[k.name],"onUpdate:modelValue":J=>s(h)[k.name]=J,placeholder:k.name,size:"sm",class:"flex-1",ui:{base:"font-mono"}},null,8,["modelValue","onUpdate:modelValue","placeholder"]))]))),128))])):g("",!0),s(j)?(n(),a("div",at,[b[8]||(b[8]=i("label",{class:"text-xs text-dimmed"},"Request body — application/json",-1)),$(F,{modelValue:s(w),"onUpdate:modelValue":b[1]||(b[1]=k=>Z(w)?w.value=k:null),rows:6,class:"w-full",ui:{base:"font-mono text-xs"}},null,8,["modelValue"])])):s(C)?(n(),a("p",rt,[...b[9]||(b[9]=[R(" This endpoint expects ",-1),i("code",{class:"font-mono"},"multipart/form-data",-1),R(" (file upload) — use the cURL sample below as a starting point. ",-1)])])):g("",!0),s(z)?(n(),a("div",it,[i("div",lt,[$(ue,{color:s(z).ok?"success":"error",variant:"subtle",class:"font-mono"},{default:P(()=>[R(c(s(z).status)+" "+c(s(z).statusText),1)]),_:1},8,["color"]),i("span",ct,c(s(z).timeMs)+" ms",1)]),i("div",ut,[$(G,{code:s(z).body,lang:"json"},null,8,["code"])])])):s(V)?(n(),a("p",mt,"Request failed: "+c(s(V)),1)):g("",!0),i("div",dt,[i("div",pt,[i("button",{type:"button",class:Q(["text-xs px-2 py-0.5 rounded-md transition-colors",s(_)==="curl"?"bg-elevated text-highlighted":"text-muted hover:text-highlighted"]),onClick:b[2]||(b[2]=k=>_.value="curl")}," cURL ",2),i("button",{type:"button",class:Q(["text-xs px-2 py-0.5 rounded-md transition-colors",s(_)==="fetch"?"bg-elevated text-highlighted":"text-muted hover:text-highlighted"]),onClick:b[3]||(b[3]=k=>_.value="fetch")}," JavaScript ",2)]),s(_)==="curl"?(n(),U(G,{key:0,code:s(L),lang:"bash"},null,8,["code"])):(n(),U(G,{key:1,code:s(I),lang:"javascript"},null,8,["code"]))])])}}}),ht=Object.assign(ft,{__name:"ApiTryIt"}),_t=["id"],xt=["aria-expanded"],yt={class:"font-mono text-sm text-highlighted break-all"},gt={class:"text-sm text-muted truncate hidden sm:inline flex-1"},bt={key:0,class:"px-3 pb-3 pt-1 space-y-4 border-t border-default"},vt={key:0,class:"text-sm font-medium text-highlighted sm:hidden"},kt={key:1,class:"text-sm text-muted"},$t={key:2,class:"flex items-center gap-1.5 text-xs"},wt={class:"text-muted font-medium"},At={key:0,class:"space-y-1.5"},jt={class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},Ut={class:"space-y-2"},Ct={class:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5"},St={class:"font-mono text-primary"},Ot={class:"text-xs text-muted font-mono"},qt={key:0,class:"text-xs font-medium text-error"},Bt={key:0,class:"text-muted mt-0.5"},Rt={key:1,class:"text-xs text-dimmed mt-0.5"},Tt={class:"font-mono"},Pt={key:3,class:"space-y-1.5"},Vt={class:"text-xs text-dimmed font-mono"},Lt={key:4,class:"space-y-1.5"},zt={class:"flex items-baseline gap-2"},It={class:"text-muted"},Nt={class:"text-xs text-dimmed font-mono"},Dt=H({__name:"ApiOperation",props:{item:{},spec:{}},setup(e){const t=e,r=N(!1),o=x(()=>ie(t.item.operation,t.spec)),u=x(()=>Be(t.item.operation)),p=x(()=>Te(t.item.operation)),v=x(()=>u.value?"Public — no authentication required":p.value?p.value.label:o.value?"Requires authentication":null),f=x(()=>t.item.parameters.filter(l=>l.in==="path")),y=x(()=>t.item.parameters.filter(l=>l.in==="query")),A=x(()=>t.item.parameters.filter(l=>l.in==="header")),h=x(()=>Object.entries(t.item.operation.requestBody?.content??{}).map(([l,d])=>({contentType:l,schema:D(d.schema,t.spec)}))),j=x(()=>Object.entries(t.item.operation.responses??{}).map(([l,d])=>({status:l,description:d.description,entries:Object.entries(d.content??{}).map(([S,q])=>({contentType:S,schema:D(q.schema,t.spec)}))}))),C=x(()=>t.item.path.split(/(\{[^}]+\})/g).map(l=>({text:l,isParam:l.startsWith("{")})));function w(l){return l.startsWith("2")?"text-success":l.startsWith("3")?"text-info":l.startsWith("4")?"text-warning":l.startsWith("5")?"text-error":"text-muted"}return(l,d)=>{const S=ee,q=xe,L=le,I=ht;return n(),a("div",{id:e.item.anchor,class:"border border-default rounded-lg bg-elevated/20 scroll-mt-20"},[i("button",{type:"button",class:"w-full flex items-center gap-3 px-3 py-2.5 text-left cursor-pointer","aria-expanded":s(r),onClick:d[0]||(d[0]=_=>r.value=!s(r))},[$(S,{color:("methodBadgeColor"in l?l.methodBadgeColor:s(Se))(e.item.method),variant:"subtle",class:"font-mono uppercase shrink-0 w-16 justify-center"},{default:P(()=>[R(c(e.item.method),1)]),_:1},8,["color"]),i("code",yt,[(n(!0),a(B,null,T(s(C),(_,m)=>(n(),a("span",{key:m,class:Q(_.isParam?"text-warning":"")},c(_.text),3))),128))]),i("span",gt,c(e.item.operation.summary),1),s(p)?.elevated?(n(),U(S,{key:0,color:"warning",variant:"subtle",size:"sm",icon:"i-lucide-shield",class:"shrink-0 ml-auto sm:ml-0",title:`Requires role: ${s(p).label}`},{default:P(()=>[R(c(s(p).shortLabel),1)]),_:1},8,["title"])):s(u)?(n(),U(S,{key:1,color:"neutral",variant:"subtle",size:"sm",class:"shrink-0 ml-auto sm:ml-0"},{default:P(()=>[...d[1]||(d[1]=[R(" Public ",-1)])]),_:1})):s(o)?(n(),U(q,{key:2,name:"i-lucide-lock",class:"size-3.5 text-dimmed shrink-0 ml-auto sm:ml-0",title:"Requires authentication"})):g("",!0),$(q,{name:s(r)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-4 text-dimmed shrink-0"},null,8,["name"])],8,xt),s(r)?(n(),a("div",bt,[e.item.operation.summary?(n(),a("p",vt,c(e.item.operation.summary),1)):g("",!0),e.item.operation.description?(n(),a("p",kt,c(e.item.operation.description),1)):g("",!0),s(v)?(n(),a("div",$t,[$(q,{name:s(p)?.elevated?"i-lucide-shield":"i-lucide-users",class:"size-3.5 text-dimmed shrink-0"},null,8,["name"]),d[2]||(d[2]=i("span",{class:"text-dimmed"},"Access",-1)),i("span",wt,c(s(v)),1)])):g("",!0),(n(!0),a(B,null,T([{label:"Path parameters",params:s(f)},{label:"Query parameters",params:s(y)},{label:"Header parameters",params:s(A)}],_=>(n(),a(B,{key:_.label},[_.params.length?(n(),a("div",At,[i("h4",jt,c(_.label),1),i("div",Ut,[(n(!0),a(B,null,T(_.params,m=>(n(),a("div",{key:m.name,class:"text-sm"},[i("div",Ct,[i("code",St,c(m.name),1),i("span",Ot,c(("schemaTypeLabel"in l?l.schemaTypeLabel:s(te))(m.schema)),1),m.required?(n(),a("span",qt,"required")):g("",!0)]),m.description?(n(),a("p",Bt,c(m.description),1)):g("",!0),m.schema?.enum?.length?(n(),a("p",Rt,[d[3]||(d[3]=R(" Allowed values: ",-1)),i("span",Tt,c(m.schema.enum.map(V=>JSON.stringify(V)).join(", ")),1)])):g("",!0)]))),128))])])):g("",!0)],64))),128)),s(h).length?(n(),a("div",Pt,[d[4]||(d[4]=i("h4",{class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},"Request body",-1)),(n(!0),a(B,null,T(s(h),_=>(n(),a("div",{key:_.contentType,class:"space-y-1.5"},[i("code",Vt,c(_.contentType),1),_.schema?(n(),U(L,{key:0,schema:_.schema,spec:e.spec},null,8,["schema","spec"])):g("",!0)]))),128))])):g("",!0),s(j).length?(n(),a("div",Lt,[d[5]||(d[5]=i("h4",{class:"text-xs font-semibold uppercase tracking-wide text-dimmed"},"Responses",-1)),(n(!0),a(B,null,T(s(j),_=>(n(),a("div",{key:_.status,class:"text-sm"},[i("div",zt,[i("code",{class:Q(["font-mono font-semibold",w(_.status)])},c(_.status),3),i("span",It,c(_.description),1)]),(n(!0),a(B,null,T(_.entries,m=>(n(),a("div",{key:m.contentType,class:"mt-1 pl-3 border-l border-default"},[i("code",Nt,c(m.contentType),1),m.schema?(n(),U(L,{key:0,schema:m.schema,spec:e.spec,class:"mt-1"},null,8,["schema","spec"])):g("",!0)]))),128))]))),128))])):g("",!0),$(I,{item:e.item,spec:e.spec},null,8,["item","spec"])])):g("",!0)],8,_t)}}}),Et=Object.assign(Dt,{__name:"ApiOperation"}),Mt={class:"max-w-4xl mx-auto px-4 sm:px-6 py-6 space-y-6"},Jt={class:"space-y-3"},Ht={class:"flex flex-wrap items-center gap-2"},Wt={class:"text-xl font-semibold text-highlighted"},Ft={key:0,class:"text-sm text-muted"},Qt={key:1,class:"flex items-center gap-2 text-sm"},Gt={class:"flex flex-wrap items-center gap-2"},Xt={class:"text-xs text-dimmed"},Zt={key:0,class:"flex flex-wrap gap-1.5"},Kt=["href"],Yt={class:"text-dimmed"},es={key:1,class:"space-y-8"},ts=["id"],ss={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ns={class:"text-dimmed/60"},os=H({__name:"ApiReference",props:{spec:{},specUrl:{}},setup(e){const t=e,{copy:r,copied:o}=je(),{isDesktop:u,download:p}=re(),v=N("");function f(w){u&&(w.preventDefault(),p(t.specUrl,"piwi-openapi.json"))}const y=x(()=>qe(t.spec)),A=x(()=>y.value.reduce((w,l)=>w+l.operations.length,0)),h=x(()=>{const w=v.value.trim().toLowerCase();return w?y.value.map(l=>({tag:l.tag,operations:l.operations.filter(d=>`${d.method} ${d.path} ${d.operation.summary??""} ${d.operation.description??""} ${d.tag}`.toLowerCase().includes(w))})).filter(l=>l.operations.length>0):y.value}),j=x(()=>t.spec.servers?.[0]?.url??"");function C(w){return`tag-${w.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")}`}return(w,l)=>{const d=ee,S=Y,q=be,L=oe,I=Et,_=Ae;return n(),a("div",Mt,[i("header",Jt,[i("div",Ht,[i("h1",Wt,c(e.spec.info?.title??"API Reference"),1),e.spec.info?.version?(n(),U(d,{key:0,color:"neutral",variant:"subtle",class:"font-mono"},{default:P(()=>[R(" v"+c(e.spec.info.version),1)]),_:1})):g("",!0)]),e.spec.info?.description?(n(),a("p",Ft,c(e.spec.info.description),1)):g("",!0),s(j)?(n(),a("div",Qt,[l[2]||(l[2]=i("span",{class:"text-dimmed"},"Base URL",-1)),$(S,{label:s(j),color:"neutral",variant:"subtle",size:"xs",icon:s(o)?"i-lucide-check":"i-lucide-copy",class:"font-mono",onClick:l[0]||(l[0]=m=>s(r)(s(j),{toast:!0}))},null,8,["label","icon"])])):g("",!0),i("div",Gt,[$(S,{to:e.specUrl,target:"_blank",external:"",color:"neutral",variant:"outline",size:"xs",icon:"i-lucide-file-json",label:"Raw OpenAPI spec",onClick:f},null,8,["to"]),i("span",Xt,c(s(A))+" endpoints",1)]),$(q,{color:"info",variant:"subtle",icon:"i-lucide-terminal",title:"Windows users",description:"curl examples below use Unix syntax — run them in Git Bash / WSL, or use PowerShell's Invoke-RestMethod instead."})]),$(L,{modelValue:s(v),"onUpdate:modelValue":l[1]||(l[1]=m=>Z(v)?v.value=m:null),icon:"i-lucide-search",placeholder:"Filter endpoints by path, method, or description…",size:"md",class:"w-full",ui:{root:"sticky top-0 z-10"}},null,8,["modelValue"]),!s(v)&&s(y).length>1?(n(),a("div",Zt,[(n(!0),a(B,null,T(s(y),m=>(n(),a("a",{key:m.tag,href:`#${C(m.tag)}`,class:"text-xs px-2 py-1 rounded-md bg-elevated text-muted hover:text-highlighted hover:bg-accented transition-colors"},[R(c(m.tag)+" ",1),i("span",Yt,c(m.operations.length),1)],8,Kt))),128))])):g("",!0),s(h).length?(n(),a("div",es,[(n(!0),a(B,null,T(s(h),m=>(n(),a("section",{key:m.tag,id:C(m.tag),class:"space-y-2 scroll-mt-4"},[i("h2",ss,[R(c(m.tag)+" ",1),i("span",ns,"("+c(m.operations.length)+")",1)]),(n(!0),a(B,null,T(m.operations,V=>(n(),U(I,{key:V.anchor,item:V,spec:e.spec},null,8,["item","spec"]))),128))],8,ts))),128))])):(n(),U(_,{key:2,icon:"i-lucide-search-x",text:"No endpoints match your filter."}))])}}}),as=Object.assign(os,{__name:"ApiReference"}),rs={key:1,class:"p-6"},is={class:"flex flex-wrap justify-center gap-2 mt-1"},ws=H({__name:"docs",setup(e){const r=ae().public.demoMode,o=r?"/demo/_openapi.json":"/_openapi.json",{isDesktop:u,download:p}=re();function v(j){u&&(j.preventDefault(),p(o,"piwi-openapi.json"))}ye({title:"API Reference — Piwi Dashboard"});const{data:f,status:y,error:A,refresh:h}=Ue(o,{key:"openapi-spec",lazy:!0,server:!r},"$jVU__ibpQM");return(j,C)=>{const w=me,l=de,d=fe,S=he,q=Y,L=ge,I=as,_=pe;return n(),U(_,{id:"docs"},{header:P(()=>[$(d,null,{leading:P(()=>[$(w),$(l,{items:[{label:"API Reference",icon:"i-lucide-book-open"}]})]),_:1})]),body:P(()=>[s(y)==="pending"||!s(f)&&!s(A)?(n(),U(S,{key:0,text:"Loading API reference…"})):s(A)||!s(f)?(n(),a("div",rs,[$(L,{text:"Couldn't load the API reference UI."},{action:P(()=>[C[3]||(C[3]=i("p",{class:"text-sm text-muted max-w-sm"},"The raw OpenAPI spec is still available directly.",-1)),i("div",is,[$(q,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:C[0]||(C[0]=()=>s(h)())},{default:P(()=>[...C[1]||(C[1]=[R(" Retry ",-1)])]),_:1}),$(q,{to:s(o),target:"_blank",external:"",size:"sm",variant:"outline",icon:"i-lucide-file-json",onClick:v},{default:P(()=>[...C[2]||(C[2]=[R(" Raw OpenAPI spec ",-1)])]),_:1},8,["to"])])]),_:1})])):(n(),U(I,{key:2,spec:s(f),"spec-url":s(o)},null,8,["spec","spec-url"]))]),_:1})}}});export{ws as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
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"./
|
|
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"./DCFbQvIN.js";import{_ as v}from"./Ebw5l7n8.js";import{g as x}from"./BpM6ZPIG.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{_ as l}from"./
|
|
1
|
+
import{_ as l}from"./B3Fsod9X.js";import{d as a,o as i,f as c,ac as r,g as n,V as s}from"./DCFbQvIN.js";const u=a({__name:"ChartCard",props:{title:{},subtitle:{},icon:{},iconClass:{},help:{}},setup(e){return(t,m)=>{const o=l;return i(),c(o,{title:e.title,subtitle:e.subtitle,icon:e.icon,"icon-class":e.iconClass,help:e.help},r({default:n(()=>[s(t.$slots,"default")]),_:2},[t.$slots.subtitle?{name:"subtitle",fn:n(()=>[s(t.$slots,"subtitle")]),key:"0"}:void 0,t.$slots.legend||t.$slots.actions?{name:"actions",fn:n(()=>[s(t.$slots,"legend"),s(t.$slots,"actions")]),key:"1"}:void 0]),1032,["title","subtitle","icon","icon-class","help"])}}}),C=Object.assign(u,{__name:"ChartCard"});export{C as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as S,o,f as i,g as f,V as x,W as h,k as a,X as k,h as c,a0 as C,a1 as B,a2 as w,a3 as P,a5 as O,a6 as V,a7 as $,
|
|
1
|
+
import{d as S,o,f as i,g as f,V as x,W as h,k as a,X as k,h as c,a0 as C,a1 as B,a2 as w,a3 as P,a5 as O,a6 as V,a7 as $,b6 as N,c as y,j as z,i as _,q as d,t as R,p as j,aJ as A,v as b,F as g,a8 as F}from"./DCFbQvIN.js";var T=S({__name:"BaseSeparator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const s=n,l=["horizontal","vertical"];function e(r){return l.includes(r)}const u=c(()=>e(s.orientation)?s.orientation:"horizontal"),v=c(()=>u.value==="vertical"?s.orientation:void 0),m=c(()=>s.decorative?{role:"none"}:{"aria-orientation":v.value,role:"separator"});return(r,p)=>(o(),i(a(k),h({as:r.as,"as-child":r.asChild,"data-orientation":u.value},m.value),{default:f(()=>[x(r.$slots,"default")]),_:3},16,["as","as-child","data-orientation"]))}}),D=T,E=S({__name:"Separator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const s=n;return(l,e)=>(o(),i(D,C(B(s)),{default:f(()=>[x(l.$slots,"default")]),_:3},16))}}),I=E;const J={slots:{root:"flex items-center align-center text-center",border:"",container:"font-medium text-default flex",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xs",label:"text-sm"},variants:{color:{primary:{border:"border-primary"},secondary:{border:"border-secondary"},success:{border:"border-success"},info:{border:"border-info"},warning:{border:"border-warning"},error:{border:"border-error"},neutral:{border:"border-default"}},orientation:{horizontal:{root:"w-full flex-row",border:"w-full",container:"whitespace-nowrap"},vertical:{root:"h-full flex-col",border:"h-full",container:""}},size:{xs:"",sm:"",md:"",lg:"",xl:""},position:{start:"",center:"",end:""},type:{solid:{border:"border-solid"},dashed:{border:"border-dashed"},dotted:{border:"border-dotted"}}},compoundVariants:[{orientation:"horizontal",position:"start",class:{container:"me-3"}},{orientation:"horizontal",position:"center",class:{container:"mx-3"}},{orientation:"horizontal",position:"end",class:{container:"ms-3"}},{orientation:"vertical",position:"start",class:{container:"mb-2"}},{orientation:"vertical",position:"center",class:{container:"my-2"}},{orientation:"vertical",position:"end",class:{container:"mt-2"}},{orientation:"horizontal",size:"xs",class:{border:"border-t"}},{orientation:"horizontal",size:"sm",class:{border:"border-t-[2px]"}},{orientation:"horizontal",size:"md",class:{border:"border-t-[3px]"}},{orientation:"horizontal",size:"lg",class:{border:"border-t-[4px]"}},{orientation:"horizontal",size:"xl",class:{border:"border-t-[5px]"}},{orientation:"vertical",size:"xs",class:{border:"border-s"}},{orientation:"vertical",size:"sm",class:{border:"border-s-[2px]"}},{orientation:"vertical",size:"md",class:{border:"border-s-[3px]"}},{orientation:"vertical",size:"lg",class:{border:"border-s-[4px]"}},{orientation:"vertical",size:"xl",class:{border:"border-s-[5px]"}}],defaultVariants:{color:"neutral",size:"xs",type:"solid"}},X=Object.assign({inheritAttrs:!1},{__name:"USeparator",props:{as:{type:null,required:!1},label:{type:String,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},size:{type:null,required:!1},type:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},position:{type:null,required:!1,default:"center"},class:{type:null,required:!1},ui:{type:null,required:!1},decorative:{type:Boolean,required:!1}},setup(n){const s=n,l=w(),e=P("separator",s),u=O(),v=V($(e,"as","decorative","orientation")),[m,r]=N(),p=c(()=>!!(e.label||e.icon||e.avatar||l.default)),t=c(()=>F({extend:J,...u.ui?.separator||{}})({color:e.color,orientation:e.orientation,size:e.size,position:e.position,type:e.type}));return(q,U)=>(o(),y(g,null,[z(a(m),null,{default:f(()=>[_("div",{"data-slot":"container",class:d(t.value.container({class:a(e).ui?.container}))},[x(q.$slots,"default",{ui:t.value},()=>[a(e).label?(o(),y("span",{key:0,"data-slot":"label",class:d(t.value.label({class:a(e).ui?.label}))},R(a(e).label),3)):a(e).icon?(o(),i(j,{key:1,name:a(e).icon,"data-slot":"icon",class:d(t.value.icon({class:a(e).ui?.icon}))},null,8,["name","class"])):a(e).avatar?(o(),i(A,h({key:2,size:a(e).ui?.avatarSize||t.value.avatarSize()},a(e).avatar,{"data-slot":"avatar",class:t.value.avatar({class:a(e).ui?.avatar})}),null,16,["size","class"])):b("",!0)])],2)]),_:3}),z(a(I),h({"data-slot":"root"},{...a(v),...q.$attrs},{class:t.value.root({class:[a(e).ui?.root,a(e).class]})}),{default:f(()=>[p.value&&a(e).position==="start"?(o(),i(a(r),{key:0})):b("",!0),_("div",{"data-slot":"border",class:d(t.value.border({class:a(e).ui?.border}))},null,2),p.value&&a(e).position==="center"?(o(),y(g,{key:1},[z(a(r)),_("div",{"data-slot":"border",class:d(t.value.border({class:a(e).ui?.border}))},null,2)],64)):b("",!0),p.value&&a(e).position==="end"?(o(),i(a(r),{key:2})):b("",!0)]),_:1},16,["class"])],64))}});export{X as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as q}from"./DkT2nCqn.js";import{_ as S}from"./BGusFAvZ.js";import{_ as $}from"./zv8WdMx0.js";import{d as T,b as j,w as F,aw as N,c as y,j as n,g as r,o as m,k as e,f as O,v as P,i as c,q as B,F as E,y as I,E as M,_ as R,m as k,r as W,M as A}from"./DCFbQvIN.js";import{_ as L}from"./B3Fsod9X.js";import{u as z}from"./E-_n_6vi.js";import"./NERLHpOL.js";import"./CIEceDOw.js";import"./Vxyo_mU9.js";import"./CTD_pJ_v.js";import"./BpM6ZPIG.js";import"./BjaRappk.js";import"./Cpsq-kYE.js";const D={class:"space-y-6"},K={class:"space-y-4"},G={class:"flex items-center justify-between gap-2"},H={class:"flex items-center gap-2 shrink-0"},ce=T({__name:"pr-feedback",async setup(J){let u,p;const d=j(),{data:o,refresh:f}=([u,p]=F(()=>z("/api/settings/pr-feedback","$My52-nCqWi")),u=await u,p(),u),l=W(!1),t=A({enabled:!1,comment:!0,status:!0,onlyOnFailure:!1,statusContext:"piwi/tests"});N(()=>{o.value&&Object.assign(t,o.value.settings)});const v=[{key:"comment",label:"Post a summary comment",description:"Creates one comment on the pull request and edits it on every later run, so a busy branch gets one comment rather than one per push."},{key:"status",label:"Set a commit status",description:"Marks the run’s commit passed or failed, so the pull request shows the result in its checks list. Still set on a green run when the comment is suppressed."},{key:"onlyOnFailure",label:"Only comment on failures",description:"Keeps green runs from adding a comment. The commit status is still set either way."}];async function g(){l.value=!0;try{const i=await $fetch("/api/settings/pr-feedback",{method:"PUT",body:{settings:{...t}}});o.value=i,Object.assign(t,i.settings),d.add({title:"Saved",color:"success"}),await f()}catch{d.add({title:"Save failed",color:"error"})}finally{l.value=!1}}async function w(){l.value=!0;try{const i=await $fetch("/api/settings/pr-feedback",{method:"PUT",body:{settings:null}});o.value=i,Object.assign(t,i.settings),d.add({title:"Reset to defaults",color:"success"}),await f()}catch{d.add({title:"Reset failed",color:"error"})}finally{l.value=!1}}return(i,s)=>{const x=q,h=S,_=$,C=M,b=R,V=L;return m(),y("div",D,[n(V,{icon:"i-lucide-git-pull-request",title:"Pull-request feedback",help:"settings.pr-feedback"},{subtitle:r(()=>[...s[2]||(s[2]=[k(" When a run finishes on a branch with an open pull request, post the result back to it — new failures separated from pre-existing ones, the failure clusters behind them, and the locator to use instead of the one that broke. ",-1)])]),footer:r(()=>[c("div",G,[s[4]||(s[4]=c("p",{class:"text-xs text-muted"}," Needs an SCM token with write access to the repository — set it globally, or per project in the project’s edit page. ",-1)),c("div",H,[n(b,{variant:"ghost",color:"neutral",disabled:e(l),label:"Reset to defaults",onClick:w},null,8,["disabled"]),n(b,{color:"primary",loading:e(l),icon:"i-lucide-save",onClick:g},{default:r(()=>[...s[3]||(s[3]=[k("Save",-1)])]),_:1},8,["loading"])])])]),default:r(()=>[e(o)&&!e(o).siteUrlConfigured?(m(),O(x,{key:0,color:"warning",variant:"soft",icon:"i-lucide-triangle-alert",title:"PIWI_SITE_URL is not set",description:"Nothing is posted until it is — every link in the comment is built from it, and a comment full of unreachable links is worse than no comment.",class:"mb-4"})):P("",!0),c("div",K,[n(h,{modelValue:e(t).enabled,"onUpdate:modelValue":s[0]||(s[0]=a=>e(t).enabled=a),label:"Post feedback to pull requests"},null,8,["modelValue"]),c("div",{class:B(["space-y-4 pl-1",!e(t).enabled&&"opacity-50 pointer-events-none"])},[(m(),y(E,null,I(v,a=>n(_,{key:a.key,label:a.label,description:a.description},{default:r(()=>[n(h,{modelValue:e(t)[a.key],"onUpdate:modelValue":U=>e(t)[a.key]=U},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1032,["label","description"])),64)),n(_,{label:"Commit status context",description:"The name shown next to the status in the pull request’s checks list.",hint:`default ${e(o)?.defaults.statusContext??""}`},{default:r(()=>[n(C,{modelValue:e(t).statusContext,"onUpdate:modelValue":s[1]||(s[1]=a=>e(t).statusContext=a),placeholder:e(o)?.defaults.statusContext,class:"w-full max-w-sm"},null,8,["modelValue","placeholder"])]),_:1},8,["hint"])],2)])]),_:1})])}}});export{ce as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{h as e,ab as r,bV as t}from"./DCFbQvIN.js";function a(o){return e(()=>r(o)?!!t(o)?.closest("form"):!0)}export{a as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as g,o as s,c as a,F as l,y as o,f,
|
|
1
|
+
import{d as g,o as s,c as a,F as l,y as o,f,G as p,q as b,k as y,R as k,h as _}from"./DCFbQvIN.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 _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as m,k as r,o as c,f as _,g,j as b,p as w,
|
|
1
|
+
import{d as m,k as r,o as c,f as _,g,j as b,p as w,R as v,q as x,c as $,h as t}from"./DCFbQvIN.js";import{_ as C}from"./Ebw5l7n8.js";import{C as S,D as k}from"./BAKUqW95.js";const z={key:1,class:"text-xs text-gray-400 dark:text-gray-500 italic"},B=m({__name:"BrowserBadge",props:{browser:{},size:{}},setup(a){const n=a,s=t(()=>n.browser?.projectName??null),l=t(()=>S(s.value)),p=t(()=>k(s.value)),u=t(()=>n.size==="sm"?"size-3.5":n.size==="lg"?"size-5":"size-4"),i=t(()=>{const e=n.browser;if(!e)return[];const o=[];return e.browserName&&e.browserName!==s.value&&o.push(`Browser: ${e.browserName}`),e.channel&&o.push(`Channel: ${e.channel}`),e.viewport&&o.push(`Viewport: ${e.viewport.width}×${e.viewport.height}`),e.deviceScaleFactor&&e.deviceScaleFactor!==1&&o.push(`Scale: ${e.deviceScaleFactor}x`),e.isMobile&&o.push("Mobile"),e.hasTouch&&!e.isMobile&&o.push("Touch"),e.locale&&o.push(`Locale: ${e.locale}`),e.timezoneId&&o.push(`TZ: ${e.timezoneId}`),e.colorScheme&&e.colorScheme!=="light"&&o.push(`Color: ${e.colorScheme}`),e.reducedMotion&&e.reducedMotion!=="no-preference"&&o.push(`Motion: ${e.reducedMotion}`),e.forcedColors&&e.forcedColors!=="none"&&o.push("Colors: forced"),e.offline&&o.push("Offline"),e.bypassCSP&&o.push("CSP bypassed"),e.javaScriptEnabled===!1&&o.push("JS disabled"),e.serviceWorkers==="block"&&o.push("SW blocked"),e.geolocation&&o.push(`Geo: ${e.geolocation.latitude.toFixed(2)},${e.geolocation.longitude.toFixed(2)}`),e.userAgent&&o.push(`UA: ${e.userAgent.length>60?e.userAgent.slice(0,60)+"…":e.userAgent}`),o}),h=t(()=>s.value?i.value.length?`${s.value} · ${i.value.join(" · ")}`:s.value:"");return(e,o)=>{const f=w,d=C;return r(s)?(c(),_(d,{key:0,text:r(h),popper:{placement:"top"}},{default:g(()=>[b(f,{name:r(l),class:x(["shrink-0 cursor-help",r(u)]),style:v({color:r(p)})},null,8,["name","class","style"])]),_:1},8,["text"])):(c(),$("span",z,"—"))}}}),A=Object.assign(B,{__name:"BrowserBadge"});export{A as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as c,o as n,c as o,F as l,y as m,f as p,g as f,m as _,t as u,k as t,v as g,A as d,_ as h}from"./
|
|
1
|
+
import{d as c,o as n,c as o,F as l,y as m,f as p,g as f,m as _,t as u,k as t,v as g,A as d,_ as h}from"./DCFbQvIN.js";import{y,n as k}from"./BAKUqW95.js";import{f as x}from"./D-c8ZSws.js";const R={key:0,class:"flex flex-wrap gap-1"},b=c({__name:"RunReports",props:{reports:{}},setup(a){const r=d();return(s,B)=>{const i=h;return a.reports?.length?(n(),o("div",R,[(n(!0),o(l,null,m(a.reports,e=>(n(),p(i,{key:`${e.type}-${e.path}`,href:t(k)(e.path,null,t(r).app?.baseURL),icon:("reportIcon"in s?s.reportIcon:t(y))(e.type),title:e.size?t(x)(e.size):e.label,target:"_blank",size:"xs",variant:"outline"},{default:f(()=>[_(u(e.label),1)]),_:2},1032,["href","icon","title"]))),128))])):g("",!0)}}}),I=Object.assign(b,{__name:"RunReports"});export{I as _};
|