@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 @@
|
|
|
1
|
+
import{_ as pe}from"./9ti9eNH9.js";import{_ as me}from"./B_13C0GF.js";import{_ as he,a as fe}from"./DQM62mxB.js";import{_ as ye}from"./D8gX1Jde.js";import{_ as Y}from"./DkT2nCqn.js";import{_ as ge}from"./B3Fsod9X.js";import{d as G,o as v,c as C,i as b,t as I,k as e,j as E,g as S,p as J,q,m as R,s as ve,f as A,v as z,x as _e,F as W,y as Q,h as U,_ as Z,z as be,A as ee,r as F,u as xe,w as we,e as ke,B as $e,C as H}from"./DCFbQvIN.js";import{_ as Te}from"./D_eDAIsT.js";import{f as V}from"./D-c8ZSws.js";import{u as Ce}from"./E-_n_6vi.js";import"./C2hNxjjz.js";import"./BAKUqW95.js";import"./BpM6ZPIG.js";import"./BjaRappk.js";import"./Cpsq-kYE.js";const Ie={class:"p-3 sm:p-4 space-y-2"},ze={class:"flex items-start justify-between gap-3"},Be={class:"min-w-0 space-y-1"},Ee={class:"font-medium text-sm break-all"},Ue={class:"text-xs text-gray-500"},Re={class:"flex items-center gap-2 shrink-0"},Ae={key:2,class:"text-xs"},je={key:0,class:"text-xs text-gray-500"},Pe={class:"text-default"},Le={key:1,class:"flex flex-wrap gap-x-4 gap-y-1 text-xs text-gray-500"},Se={key:0},De={key:1},Fe={key:2},Ne={key:3},Me={key:3,class:"text-xs text-gray-500"},Ve={class:"space-y-0.5"},Oe={class:"text-[11px]"},He=G({__name:"ImportFileRow",props:{entry:{},removable:{type:Boolean}},emits:["remove"],setup(p){const c=p,a={hashing:{label:"Reading",color:"neutral",icon:"i-lucide-loader-circle"},checking:{label:"Checking",color:"neutral",icon:"i-lucide-loader-circle"},ready:{label:"Ready",color:"primary",icon:"i-lucide-circle-check"},uploading:{label:"Importing",color:"primary",icon:"i-lucide-loader-circle"},imported:{label:"Imported",color:"success",icon:"i-lucide-check"},duplicate:{label:"Already imported",color:"neutral",icon:"i-lucide-copy-check"},"too-large":{label:"Too large",color:"warning",icon:"i-lucide-weight"},invalid:{label:"Not importable",color:"warning",icon:"i-lucide-file-x"},failed:{label:"Failed",color:"error",icon:"i-lucide-circle-alert"}},d=U(()=>a[c.entry.state]),m=U(()=>["hashing","checking","uploading"].includes(c.entry.state)),o=U(()=>c.entry.result),t=U(()=>c.entry.state==="imported"?o.value:null),h=U(()=>t.value?.kind==="trace");function n(l,i){return`${l} ${i}${l===1?"":"s"}`}return(l,i)=>{const f=J,y=ve,k=Z,$=be,x=_e,T=Y;return v(),C("div",Ie,[b("div",ze,[b("div",Be,[b("p",Ee,I(p.entry.name),1),b("p",Ue,I(("formatBytes"in l?l.formatBytes:e(V))(p.entry.size)),1)]),b("div",Re,[E(y,{color:e(d).color,variant:"subtle",size:"sm"},{default:S(()=>[E(f,{name:e(d).icon,class:q(["size-3.5 mr-1",e(m)&&"animate-spin"])},null,8,["name","class"]),R(" "+I(e(d).label),1)]),_:1},8,["color"]),p.removable?(v(),A(k,{key:0,icon:"i-lucide-x",color:"neutral",variant:"ghost",size:"xs",title:"Remove from the list",onClick:i[0]||(i[0]=s=>l.$emit("remove",p.entry.id))})):z("",!0)])]),p.entry.state==="uploading"||p.entry.state==="hashing"?(v(),A($,{key:0,"model-value":Math.round(p.entry.progress*100),size:"sm"},null,8,["model-value"])):z("",!0),p.entry.message?(v(),C("p",{key:1,class:q(["text-xs",p.entry.state==="failed"?"text-error":"text-gray-500"])},I(p.entry.message),3)):z("",!0),e(o)?.testRunId?(v(),C("div",Ae,[E(x,{to:`/test-runs/${e(o).testRunId}`,class:"text-primary hover:underline"},{default:S(()=>[R(" View run #"+I(e(o).testRunId),1)]),_:1},8,["to"])])):z("",!0),e(t)?(v(),C(W,{key:3},[e(h)?(v(),C("p",je,[i[1]||(i[1]=R(" Added ",-1)),b("span",Pe,I(e(t).caseTitle),1),i[2]||(i[2]=R(" to this run. ",-1))])):(v(),C("div",Le,[b("span",null,I(n(e(t).totalTests,"execution")),1),b("span",null,I(e(t).passedTests)+" passed",1),b("span",null,I(e(t).failedTests)+" failed",1),e(t).skippedTests?(v(),C("span",Se,I(e(t).skippedTests)+" skipped",1)):z("",!0),e(t).flakyTests?(v(),C("span",De,I(e(t).flakyTests)+" flaky",1)):z("",!0),e(t).traceCount?(v(),C("span",Fe,I(n(e(t).traceCount,"trace")),1)):z("",!0),e(t).attachmentCount?(v(),C("span",Ne,I(n(e(t).attachmentCount,"attachment")),1)):z("",!0)])),e(t).shard?(v(),A(T,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-split",description:`This archive is shard ${e(t).shard.current} of ${e(t).shard.total}. Each shard imports as its own run — they are not merged.`,ui:{description:"text-xs"}},null,8,["description"])):z("",!0),e(t).filePaths.length&&!e(h)?(v(),C("div",Me,[i[3]||(i[3]=b("p",{class:"mb-1"},[R(" Spec files recorded as "),b("span",{class:"text-gray-400"},"(these must match the paths your live runs report for history to line up)"),R(": ")],-1)),b("ul",Ve,[(v(!0),C(W,null,Q(e(t).filePaths,s=>(v(),C("li",{key:s},[b("code",Oe,I(s),1)]))),128))])])):z("",!0)],64)):z("",!0)])}}}),qe=Object.assign(He,{__name:"ImportFileRow"}),L=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),We=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Ke=Array.from({length:256},(p,c)=>c.toString(16).padStart(2,"0"));class te{#r=new Uint32Array(We);#t=new Uint8Array(64);#e=0;#n=0;#i=new Uint32Array(64);#o=!1;update(c){if(this.#o)throw new Error("Sha256: update() after digest()");this.#n+=c.length;let a=0;if(this.#e>0){const d=Math.min(64-this.#e,c.length);if(this.#t.set(c.subarray(0,d),this.#e),this.#e+=d,a=d,this.#e<64)return this;this.#s(this.#t,0),this.#e=0}for(;a+64<=c.length;a+=64)this.#s(c,a);return a<c.length&&(this.#t.set(c.subarray(a),0),this.#e=c.length-a),this}digest(){if(this.#o)throw new Error("Sha256: digest() called twice");this.#o=!0;const c=this.#n*8;this.#t[this.#e++]=128,this.#e>56&&(this.#t.fill(0,this.#e),this.#s(this.#t,0),this.#e=0),this.#t.fill(0,this.#e,56);const a=new DataView(this.#t.buffer,this.#t.byteOffset,64);a.setUint32(56,Math.floor(c/4294967296),!1),a.setUint32(60,c>>>0,!1),this.#s(this.#t,0);const d=new Uint8Array(32),m=new DataView(d.buffer);for(let o=0;o<8;o++)m.setUint32(o*4,this.#r[o],!1);return d}hex(){const c=this.digest();let a="";for(let d=0;d<32;d++)a+=Ke[c[d]];return a}#s(c,a){const d=this.#i,m=this.#r;for(let r=0;r<16;r++){const _=a+r*4;d[r]=c[_]<<24|c[_+1]<<16|c[_+2]<<8|c[_+3]}for(let r=16;r<64;r++){const _=d[r-15],B=d[r-2],g=(_>>>7|_<<25)^(_>>>18|_<<14)^_>>>3,D=(B>>>17|B<<15)^(B>>>19|B<<13)^B>>>10;d[r]=d[r-16]+g+d[r-7]+D|0}let o=m[0],t=m[1],h=m[2],n=m[3],l=m[4],i=m[5],f=m[6],y=m[7],k=0,$=0,x=0,T=0,s=0,u=0;for(let r=0;r<64;r+=8)$=(l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7),x=l&i^~l&f,s=y+$+x+L[r]+d[r]|0,k=(o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10),T=o&t^o&h^t&h,u=k+T|0,n=n+s|0,y=s+u|0,$=(n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7),x=n&l^~n&i,s=f+$+x+L[r+1]+d[r+1]|0,k=(y>>>2|y<<30)^(y>>>13|y<<19)^(y>>>22|y<<10),T=y&o^y&t^o&t,u=k+T|0,h=h+s|0,f=s+u|0,$=(h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7),x=h&n^~h&l,s=i+$+x+L[r+2]+d[r+2]|0,k=(f>>>2|f<<30)^(f>>>13|f<<19)^(f>>>22|f<<10),T=f&y^f&o^y&o,u=k+T|0,t=t+s|0,i=s+u|0,$=(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7),x=t&h^~t&n,s=l+$+x+L[r+3]+d[r+3]|0,k=(i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10),T=i&f^i&y^f&y,u=k+T|0,o=o+s|0,l=s+u|0,$=(o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7),x=o&t^~o&h,s=n+$+x+L[r+4]+d[r+4]|0,k=(l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10),T=l&i^l&f^i&f,u=k+T|0,y=y+s|0,n=s+u|0,$=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7),x=y&o^~y&t,s=h+$+x+L[r+5]+d[r+5]|0,k=(n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10),T=n&l^n&i^l&i,u=k+T|0,f=f+s|0,h=s+u|0,$=(f>>>6|f<<26)^(f>>>11|f<<21)^(f>>>25|f<<7),x=f&y^~f&o,s=t+$+x+L[r+6]+d[r+6]|0,k=(h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10),T=h&n^h&l^n&l,u=k+T|0,i=i+s|0,t=s+u|0,$=(i>>>6|i<<26)^(i>>>11|i<<21)^(i>>>25|i<<7),x=i&f^~i&y,s=o+$+x+L[r+7]+d[r+7]|0,k=(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10),T=t&h^t&n^h&n,u=k+T|0,l=l+s|0,o=s+u|0;m[0]=m[0]+o|0,m[1]=m[1]+t|0,m[2]=m[2]+h|0,m[3]=m[3]+n|0,m[4]=m[4]+l|0,m[5]=m[5]+i|0,m[6]=m[6]+f|0,m[7]=m[7]+y|0}}async function Xe(p,c){const a=new te,d=p.stream().getReader();let m=0;for(;;){const{done:o,value:t}=await d.read();if(o)break;a.update(t),m+=t.length,c&&c(p.size?m/p.size:1)}return c&&c(1),a.hex()}const X=["ready","failed"],Ye={ok:"ready",duplicate:"duplicate","too-large":"too-large",invalid:"invalid"};function Ge(p){const c=Je("/api/test-runs/import"),a=F([]),d=F(null),m=F(null),o=F(!1);let t=1;const h=U(()=>a.value.filter(s=>X.includes(s.state)).length),n=U(()=>a.value.filter(s=>s.state==="imported").length),l=U(()=>a.value.some(s=>s.state==="hashing"||s.state==="checking")),i=F({done:0,total:0});async function f(){if(p.value)try{const s=await $fetch("/api/test-runs/import/check",{method:"POST",body:{projectName:p.value,files:[]}});d.value=s.maxBytes,m.value=null}catch(s){m.value=M(s,"Could not reach the server to read its upload limit.")}}async function y(s){const u=s.map(g=>({id:t++,file:g,name:g.name,size:g.size,state:"hashing",progress:0}));a.value=[...a.value,...u];const r=a.value.slice(-u.length),_=[];for(const g of r)d.value!=null&&g.size>d.value?(g.state="too-large",g.message=`${V(g.size)} exceeds the ${V(d.value)} limit.`):g.size===0?(g.state="invalid",g.message="The file is empty."):g.name.toLowerCase().endsWith(".zip")?_.push(g):(g.state="invalid",g.message="Expected a .zip blob report (blob-report/report-*.zip).");if(_.length===0)return;for(const g of _)try{g.progress=0,g.hash=await Xe(g.file,D=>{g.progress=D}),g.state="checking"}catch(D){g.state="failed",g.message=M(D,"Could not read the file.")}finally{g.progress=0}const B=await Qe(_);for(const g of _)g.group=B??void 0;await k(_.filter(g=>g.state==="checking"))}async function k(s){if(!(s.length===0||!p.value))try{const u=await $fetch("/api/test-runs/import/check",{method:"POST",body:{projectName:p.value,files:s.map(r=>({name:r.name,size:r.size,hash:r.hash}))}});d.value=u.maxBytes,u.results.forEach((r,_)=>{const B=s[_];B&&(B.state=Ye[r.status]??"ready",B.message=r.message,r.testRunId&&(B.result={testRunId:r.testRunId}))})}catch(u){const r=M(u,"Pre-flight check failed.");for(const _ of s)_.state="ready",_.message=`${r} Importing will still verify it.`}}async function $(){if(o.value||!p.value)return;o.value=!0;const s=a.value.filter(u=>X.includes(u.state));i.value={done:0,total:s.length};try{for(const u of s){u.state="uploading",u.message=void 0,u.progress=0;try{const r=await Ze(c,p.value,u,u.group??null,_=>{u.progress=_});u.result=r,u.state=r.status==="duplicate"?"duplicate":"imported",u.message=r.status==="duplicate"?"Already imported into this project.":void 0}catch(r){u.state="failed",u.message=M(r,"The import failed.")}finally{u.progress=0,i.value={...i.value,done:i.value.done+1}}}}finally{o.value=!1}}function x(s){a.value=a.value.filter(u=>u.id!==s)}function T(){a.value=a.value.filter(s=>!["imported","duplicate"].includes(s.state))}return{entries:a,maxBytes:d,limitError:m,importing:o,readyCount:h,importedCount:n,busy:l,batch:i,loadLimit:f,addFiles:y,startImport:$,remove:x,clearFinished:T}}function Je(p){return`${(ee().app.baseURL||"/").replace(/\/$/,"")}${p}`}async function Qe(p){const c=p.map(a=>a.hash).filter(a=>!!a);return c.length===0?null:new te().update(new TextEncoder().encode([...c].sort().join(""))).hex()}function Ze(p,c,a,d,m){return new Promise((o,t)=>{const h=new FormData;h.append("projectName",c),d&&h.append("importGroup",d),h.append("archive",a.file,a.name);const n=new XMLHttpRequest;n.open("POST",p),n.responseType="json",n.upload.addEventListener("progress",l=>{l.lengthComputable&&m(l.loaded/l.total)}),n.addEventListener("load",()=>{const l=n.response;if(n.status>=200&&n.status<300){o(l);return}const i=typeof l?.message=="string"?l.message:null;t(new Error(i??et(n.status)))}),n.addEventListener("error",()=>t(new Error("The connection dropped during the upload."))),n.addEventListener("abort",()=>t(new Error("The upload was cancelled."))),n.addEventListener("timeout",()=>t(new Error("The upload timed out."))),n.send(h)})}function et(p){return p===413?"The server (or a proxy in front of it) rejected the archive as too large.":p===401||p===403?"You do not have permission to import into this project.":p===0?"The connection dropped during the upload.":p>=500?`The server failed while importing (HTTP ${p}).`:`The import was rejected (HTTP ${p}).`}function M(p,c){const a=p?.data;return typeof a?.message=="string"&&a.message?a.message:p?.message||c}const tt={class:"p-4 space-y-4"},st={class:"space-y-4"},ot={class:"text-sm text-gray-600 dark:text-gray-400 space-y-2"},rt={class:"flex items-center gap-2"},nt={key:0,class:"text-xs text-gray-500 tabular-nums"},it={class:"space-y-4"},at={key:0,class:"text-xs text-gray-500 mt-3"},lt={key:1,class:"divide-y divide-gray-100 dark:divide-gray-800 border rounded-lg border-gray-200 dark:border-gray-800"},ct={key:2,class:"flex justify-end"},Tt=G({__name:"import",async setup(p){let c,a;const m=xe().params.id,{data:o}=([c,a]=we(()=>Ce(`/api/projects/${m}`,"$w9ISz8uFNz")),c=await c,a(),c);ke(U(()=>({title:`Import runs — ${o.value?.label||o.value?.name||"Project"} — Piwi Dashboard`})));const t=ee().public.demoMode,h=U(()=>o.value?.name),{entries:n,maxBytes:l,limitError:i,importing:f,readyCount:y,importedCount:k,busy:$,batch:x,loadLimit:T,addFiles:s,startImport:u,remove:r,clearFinished:_}=Ge(h);$e(T);const B=F(null),g=F(!1);function D(j){const w=j.target;w.files?.length&&s([...w.files]),w.value=""}function se(j){g.value=!1;const w=[...j.dataTransfer?.files??[]];w.length&&s(w)}const oe=U(()=>n.value.filter(j=>["imported","duplicate"].includes(j.state)).length);return(j,w)=>{const re=pe,ne=me,ie=fe,ae=ye,O=Y,K=ge,N=Z,le=J,ce=Te,de=qe,ue=he;return v(),A(ue,{id:"project-import"},{header:S(()=>[E(ie,null,{leading:S(()=>[E(re),E(ne,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(o)?.label||e(o)?.name||"Project",to:`/projects/${e(m)}`},{label:"Import runs"}]},null,8,["items"])]),_:1})]),body:S(()=>[b("div",tt,[E(K,{title:"Import past runs",icon:"i-lucide-import",help:"project.import",subtitle:"Backfill runs recorded before you started using Piwi, from Playwright's own blob reports."},{default:S(()=>[b("div",st,[b("div",ot,[w[5]||(w[5]=b("p",null,[R(" Run your suite with the blob reporter and upload the archives it writes to "),b("code",null,"blob-report/"),R(": ")],-1)),E(ae,{code:"npx playwright test --reporter=blob",language:"bash"}),w[6]||(w[6]=b("p",null," Each archive imports as one completed run, with its traces, screenshots and videos. Importing the same archive twice does nothing, so an interrupted batch is safe to repeat. ",-1))]),e(t)?(v(),A(O,{key:0,color:"primary",variant:"subtle",icon:"i-lucide-monitor-smartphone",title:"Nothing leaves your browser",description:"This is the demo: the archive is read by a service worker and stored in your browser, not uploaded. It is cleared when the demo's sample data is refreshed, or when you reset the demo.",ui:{description:"text-xs"}})):z("",!0),E(O,{color:"neutral",variant:"subtle",icon:"i-lucide-info",title:"What imported runs carry",description:"Failures still cluster, and traces, screenshots and videos open exactly as they do for reported runs. Web vitals, page state and locator healing come from Piwi's own capture fixtures, so historical runs have none — they start once the reporter is in place.",ui:{description:"text-xs"}}),e(i)?(v(),A(O,{key:1,color:"error",variant:"subtle",icon:"i-lucide-circle-alert",description:e(i)},null,8,["description"])):z("",!0)])]),_:1}),E(K,{title:"Archives",icon:"i-lucide-files",count:e(n).length||null},{actions:S(()=>[b("div",rt,[e(f)?(v(),C("span",nt,I(e(x).done)+" of "+I(e(x).total)+" done ",1)):z("",!0),e(oe)>0&&!e(f)?(v(),A(N,{key:1,label:"Clear finished",icon:"i-lucide-eraser",color:"neutral",variant:"ghost",size:"sm",disabled:e(f),onClick:w[0]||(w[0]=P=>e(_)())},null,8,["disabled"])):z("",!0),E(N,{label:e(y)>0?`Import ${e(y)} archive${e(y)===1?"":"s"}`:"Import",icon:"i-lucide-upload",size:"sm",loading:e(f),disabled:e(y)===0||e($),onClick:w[1]||(w[1]=P=>e(u)())},null,8,["label","loading","disabled"])])]),default:S(()=>[b("div",it,[b("div",{class:q(["rounded-lg border-2 border-dashed p-6 text-center transition-colors",e(g)?"border-primary bg-primary/5":"border-gray-200 dark:border-gray-700"]),onDragover:w[3]||(w[3]=H(P=>g.value=!0,["prevent"])),onDragleave:w[4]||(w[4]=H(P=>g.value=!1,["prevent"])),onDrop:H(se,["prevent"])},[E(le,{name:"i-lucide-file-archive",class:"size-7 text-gray-400 mb-2"}),w[7]||(w[7]=b("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[R("Drop "),b("code",null,"report-*.zip"),R(" files here, or")],-1)),E(N,{label:"Choose files",icon:"i-lucide-folder-open",variant:"outline",size:"sm",class:"mt-2",disabled:e(f),onClick:w[2]||(w[2]=P=>e(B)?.click())},null,8,["disabled"]),e(l)?(v(),C("p",at," Up to "+I(("formatBytes"in j?j.formatBytes:e(V))(e(l)))+" per archive. Larger ones are rejected here, before uploading. ",1)):z("",!0),b("input",{ref_key:"fileInput",ref:B,type:"file",accept:".zip",multiple:"",class:"hidden",onChange:D},null,544)],34),e(n).length===0?(v(),A(ce,{key:0,icon:"i-lucide-inbox",text:"No archives selected yet."})):(v(),C("div",lt,[(v(!0),C(W,null,Q(e(n),P=>(v(),A(de,{key:P.id,entry:P,removable:!e(f)&&P.state!=="uploading",onRemove:e(r)},null,8,["entry","removable","onRemove"]))),128))])),e(k)>0?(v(),C("div",ct,[E(N,{label:`Open ${e(o)?.label||e(o)?.name||"project"}`,icon:"i-lucide-arrow-right",trailing:"",variant:"ghost",size:"sm",to:`/projects/${e(m)}`},null,8,["label","to"])])):z("",!0)])]),_:1},8,["count"])])]),_:1})}}});export{Tt as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{aa as P,p as L}from"./NQikbhmK.js";const y=43200,k=1440,C=Symbol.for("constructDateFrom");function x(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&C in e?e[C](t):e instanceof Date?new e.constructor(t):new Date(t)}function g(e,t){return x(e,e)}let _={};function A(){return _}function W(e){const t=g(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function D(e,...t){const n=x.bind(null,e||t.find(r=>typeof r=="object"));return t.map(n)}function w(e,t){const n=+g(e)-+g(t);return n<0?-1:n>0?1:n}function z(e){return x(e,Date.now())}function E(e,t,n){const[r,a]=D(n?.in,e,t),u=r.getFullYear()-a.getFullYear(),o=r.getMonth()-a.getMonth();return u*12+o}function $(e){return t=>{const r=(e?Math[e]:Math.trunc)(t);return r===0?0:r}}function j(e,t){return+g(e)-+g(t)}function R(e,t){const n=g(e);return n.setHours(23,59,59,999),n}function X(e,t){const n=g(e),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function Y(e,t){const n=g(e);return+R(n)==+X(n)}function U(e,t,n){const[r,a,u]=D(n?.in,e,e,t),o=w(a,u),i=Math.abs(E(a,u));if(i<1)return 0;a.getMonth()===1&&a.getDate()>27&&a.setDate(30),a.setMonth(a.getMonth()-o*i);let l=w(a,u)===-o;Y(r)&&i===1&&w(r,u)===1&&(l=!1);const d=o*(i-+l);return d===0?0:d}function V(e,t,n){const r=j(e,t)/1e3;return $(n?.roundingMethod)(r)}const q={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},H=(e,t,n)=>{let r;const a=q[e];return typeof a=="string"?r=a:t===1?r=a.one:r=a.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function v(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const B={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},J={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},G={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Q={date:v({formats:B,defaultWidth:"full"}),time:v({formats:J,defaultWidth:"full"}),dateTime:v({formats:G,defaultWidth:"full"})},K={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Z=(e,t,n,r)=>K[e];function p(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let a;if(r==="formatting"&&e.formattingValues){const o=e.defaultFormattingWidth||e.defaultWidth,i=n?.width?String(n.width):o;a=e.formattingValues[i]||e.formattingValues[o]}else{const o=e.defaultWidth,i=n?.width?String(n.width):e.defaultWidth;a=e.values[i]||e.values[o]}const u=e.argumentCallback?e.argumentCallback(t):t;return a[u]}}const ee={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},te={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},ne={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},re={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},ae={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},ie={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},oe=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},se={ordinalNumber:oe,era:p({values:ee,defaultWidth:"wide"}),quarter:p({values:te,defaultWidth:"wide",argumentCallback:e=>e-1}),month:p({values:ne,defaultWidth:"wide"}),day:p({values:re,defaultWidth:"wide"}),dayPeriod:p({values:ae,defaultWidth:"wide",formattingValues:ie,defaultFormattingWidth:"wide"})};function b(e){return(t,n={})=>{const r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],u=t.match(a);if(!u)return null;const o=u[0],i=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(i)?ce(i,h=>h.test(o)):ue(i,h=>h.test(o));let d;d=e.valueCallback?e.valueCallback(l):l,d=n.valueCallback?n.valueCallback(d):d;const f=t.slice(o.length);return{value:d,rest:f}}}function ue(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function ce(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return n}function le(e){return(t,n={})=>{const r=t.match(e.matchPattern);if(!r)return null;const a=r[0],u=t.match(e.parsePattern);if(!u)return null;let o=e.valueCallback?e.valueCallback(u[0]):u[0];o=n.valueCallback?n.valueCallback(o):o;const i=t.slice(a.length);return{value:o,rest:i}}}const de=/^(\d+)(th|st|nd|rd)?/i,fe=/\d+/i,he={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},me={any:[/^b/i,/^(a|c)/i]},ge={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},pe={any:[/1/i,/2/i,/3/i,/4/i]},be={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},ye={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},we={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Me={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},ve={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},xe={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},De={ordinalNumber:le({matchPattern:de,parsePattern:fe,valueCallback:e=>parseInt(e,10)}),era:b({matchPatterns:he,defaultMatchWidth:"wide",parsePatterns:me,defaultParseWidth:"any"}),quarter:b({matchPatterns:ge,defaultMatchWidth:"wide",parsePatterns:pe,defaultParseWidth:"any",valueCallback:e=>e+1}),month:b({matchPatterns:be,defaultMatchWidth:"wide",parsePatterns:ye,defaultParseWidth:"any"}),day:b({matchPatterns:we,defaultMatchWidth:"wide",parsePatterns:Me,defaultParseWidth:"any"}),dayPeriod:b({matchPatterns:ve,defaultMatchWidth:"any",parsePatterns:xe,defaultParseWidth:"any"})},N={code:"en-US",formatDistance:H,formatLong:Q,formatRelative:Z,localize:se,match:De,options:{weekStartsOn:0,firstWeekContainsDate:1}};function Se(e,t,n){const r=A(),a=n?.locale??r.locale??N,u=2520,o=w(e,t);if(isNaN(o))throw new RangeError("Invalid time value");const i=Object.assign({},n,{addSuffix:n?.addSuffix,comparison:o}),[l,d]=D(n?.in,...o>0?[t,e]:[e,t]),f=V(d,l),h=(W(d)-W(l))/1e3,c=Math.round((f-h)/60);let s;if(c<2)return n?.includeSeconds?f<5?a.formatDistance("lessThanXSeconds",5,i):f<10?a.formatDistance("lessThanXSeconds",10,i):f<20?a.formatDistance("lessThanXSeconds",20,i):f<40?a.formatDistance("halfAMinute",0,i):f<60?a.formatDistance("lessThanXMinutes",1,i):a.formatDistance("xMinutes",1,i):c===0?a.formatDistance("lessThanXMinutes",1,i):a.formatDistance("xMinutes",c,i);if(c<45)return a.formatDistance("xMinutes",c,i);if(c<90)return a.formatDistance("aboutXHours",1,i);if(c<k){const m=Math.round(c/60);return a.formatDistance("aboutXHours",m,i)}else{if(c<u)return a.formatDistance("xDays",1,i);if(c<y){const m=Math.round(c/k);return a.formatDistance("xDays",m,i)}else if(c<y*2)return s=Math.round(c/y),a.formatDistance("aboutXMonths",s,i)}if(s=U(d,l),s<12){const m=Math.round(c/y);return a.formatDistance("xMonths",m,i)}else{const m=s%12,M=Math.trunc(s/12);return m<3?a.formatDistance("aboutXYears",M,i):m<9?a.formatDistance("overXYears",M,i):a.formatDistance("almostXYears",M+1,i)}}function Pe(e,t){return Se(e,z(e),t)}const ke=["years","months","weeks","days","hours","minutes","seconds"];function Ce(e,t){const r=A().locale??N,a=ke,u=" ";return r.formatDistance?a.reduce((i,l)=>{const d=`x${l.replace(/(^.)/,h=>h.toUpperCase())}`,f=e[l];return f!==void 0&&e[l]?i.concat(r.formatDistance(d,f)):i},[]).join(u):""}const We="piwi:",O=["critical","high","medium","low"];new Set(O);function Le(e){return typeof e=="string"&&e.trim().toLowerCase().startsWith(We)}function _e(e){return O.includes(e)?e:void 0}function ze(e){return({column:t})=>{const n=t.getIsSorted();return P("button",{class:"flex items-center gap-1 font-semibold select-none cursor-pointer hover:text-highlighted transition-colors",onClick:()=>t.toggleSorting()},[e,P(L,{name:n==="asc"?"i-lucide-chevron-up":n==="desc"?"i-lucide-chevron-down":"i-lucide-chevrons-up-down",class:["shrink-0 size-3.5",!n&&"opacity-40"]})])}}function Ee(e,t={}){if(e==null||e==="")return"N/A";let n;if(e instanceof Date)n=e;else{const r=typeof e=="number"?e:Number(e);!Number.isNaN(r)&&String(e).trim()!==""?n=new Date(r<1e12?r*1e3:r):n=new Date(e)}return Number.isNaN(n.getTime())?"N/A":t.dateOnly?n.toLocaleDateString():n.toLocaleString()}function $e(e){return e?Pe(new Date(e),{addSuffix:!0}):"N/A"}function je(e){if(e==null)return"N/A";const t=Math.round(Math.abs(e));return t===0?"0 seconds":(e<0?"−":"")+Ce({seconds:t/1e3})}function Re(e){if(e==null)return null;const t=Math.round(Math.abs(e)),n=e<0?"−":"";if(t<1e3)return{value:n+t,unit:"ms"};const r=t/1e3;return r<60?{value:n+Math.round(r*10)/10,unit:"s"}:{value:n+Math.round(r/60*10)/10,unit:"m"}}function Xe(e){switch(e){case"html":return"i-lucide-layout-dashboard";case"monocart":return"i-lucide-bar-chart-2";case"blob":return"i-lucide-download";default:return"i-lucide-file-text"}}function Ye(e){if(!e)return"i-lucide-globe";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"i-simple-icons-googlechrome":t.includes("firefox")?"i-simple-icons-firefoxbrowser":t.includes("safari")||t.includes("webkit")?"i-simple-icons-safari":t.includes("edge")?"i-simple-icons-microsoftedge":"i-lucide-globe"}function Ue(e){if(!e)return"#6b7280";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"#4285F4":t.includes("firefox")?"#FF7139":t.includes("safari")||t.includes("webkit")?"#007AFF":t.includes("edge")?"#0078D7":"#6b7280"}function Te(e){switch(e){case"passed":return"success";case"failed":return"error";case"timedout":return"warning";case"timedOut":return"warning";case"interrupted":return"warning";case"cancelled":return"neutral";case"initialising":return"info";case"running":return"info";case"finalizing":return"info";default:return"neutral"}}function S(e){return e==="timedOut"?"timedout":e}function Ve(e){switch(S(e)){case"passed":return"i-lucide-check-circle-2";case"failed":case"timedout":return"i-lucide-x-circle";case"didnotrun":return"i-lucide-circle-slash";case"running":case"initialising":case"finalizing":return"i-lucide-loader-circle";default:return"i-lucide-minus-circle"}}function qe(e){switch(S(e)){case"passed":return"text-emerald-600 dark:text-emerald-400";case"failed":case"timedout":return"text-rose-600 dark:text-rose-400";case"didnotrun":return"text-amber-600 dark:text-amber-400";case"running":case"initialising":case"finalizing":return"text-blue-600 dark:text-blue-400";default:return"text-zinc-400 dark:text-zinc-500"}}function He(e){const t=S(e);return t==="running"||t==="initialising"||t==="finalizing"}function Be(e){return e==="timedOut"||e==="timedout"?"failed":e==="didnotrun"?"didn't run":e==="never-run"?"never run":e}function Je(e){return e&&{open:"warning",resolved:"success",ignored:"neutral"}[e]||"neutral"}function Ge(e){switch(e){case"diagnosis-verified":return{label:"Fix verified",color:"success",icon:"i-lucide-badge-check",hint:"The tests went green and the change touched the files the diagnosis named."};case"stopped-failing":return{label:"Stopped failing",color:"info",icon:"i-lucide-check",hint:"The tests went green. Nothing corroborates which change did it."};case"regressed":return{label:"Regressed",color:"error",icon:"i-lucide-undo-2",hint:"A fix was recorded for this cluster and it did not hold — the failure came back."};default:return null}}function Qe(e){return e&&{timeout:"warning",assertion:"error","strict-mode":"info",navigation:"secondary",crash:"error",unknown:"neutral"}[e]||"neutral"}const T=["#ef4444","#f97316","#f59e0b","#84cc16","#10b981","#14b8a6","#06b6d4","#3b82f6","#6366f1","#8b5cf6","#d946ef","#ec4899"];function Ke(){return T[Math.floor(Math.random()*T.length)]}function I(e){return!e.startsWith(".")&&!e.startsWith("/")?e:e.replace(".data/storage/","")}function Ze(e,t,n="/",r=!1){const a=(n||"/").replace(/\/$/,""),u=new URLSearchParams,o=/\.[a-z0-9]+$/i.test(e);t&&!o&&u.set("contentType",t),r&&u.set("compress","1");const i=u.toString();return`${a}/api/files/${I(e)}${i?`?${i}`:""}`}function et(e,t="/",n=!1){const r=(t||"/").replace(/\/$/,""),o=`${typeof location>"u"?"":location.origin}${r}/${n?"":"api/files/"}${I(e)}`;return`${r}/trace-viewer/?trace=${encodeURIComponent(o)}`}function tt(e,t="Unknown error"){if(e&&typeof e=="object"){const n=e;return n.data?.message??n.message??t}return t}function nt(e,t){const n=t.trim().toLowerCase();return n?e.filter(r=>r.message.toLowerCase().includes(n)||r.author.toLowerCase().includes(n)||r.sha.includes(n)||r.shortSha.includes(n)):e}function rt(e){switch(e){case"added":return{icon:"i-lucide-file-plus",color:"text-green-500",badgeColor:"success"};case"removed":return{icon:"i-lucide-file-minus",color:"text-red-500",badgeColor:"error"};case"renamed":return{icon:"i-lucide-file-symlink",color:"text-blue-500",badgeColor:"info"};default:return{icon:"i-lucide-file-pen-line",color:"text-gray-400",badgeColor:"neutral"}}}const at={add:"bg-green-50 dark:bg-green-950/30 text-green-800 dark:text-green-300",remove:"bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-300",hunk:"bg-blue-50 dark:bg-blue-950/20 text-blue-500 dark:text-blue-400",context:"text-gray-600 dark:text-gray-400"};function it(e){return e.split(`
|
|
2
|
-
`).map(t=>t.startsWith("+")&&!t.startsWith("+++")?{type:"add",text:t}:t.startsWith("-")&&!t.startsWith("---")?{type:"remove",text:t}:t.startsWith("@@")?{type:"hunk",text:t}:{type:"context",text:t})}const Fe="\x1B",Ae={30:"#000000",31:"#dc2626",32:"#16a34a",33:"#d97706",34:"#2563eb",35:"#9333ea",36:"#0891b2",37:"#9ca3af"},Ne={40:"#000000",41:"#dc2626",42:"#16a34a",43:"#d97706",44:"#2563eb",45:"#9333ea",46:"#0891b2",47:"#9ca3af"},F=new RegExp(`${Fe}\\[([0-9;]*)m`,"g");function Oe(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function ot(e){const t=[];let n=0,r,a,u=!1,o=!1,i=!1,l=!1;const d=c=>{if(!c)return;const s=[];u&&s.push("font-weight:600"),o&&s.push("opacity:.7"),i&&s.push("font-style:italic"),l&&s.push("text-decoration:underline"),r&&s.push(`color:${r}`),a&&s.push(`background:${a}`);const m=Oe(c);t.push(s.length?`<span style="${s.join(";")}">${m}</span>`:m)},f=c=>{for(const s of c)s===0?(r=void 0,a=void 0,u=!1,o=!1,i=!1,l=!1):s===1?u=!0:s===2?o=!0:s===3?i=!0:s===4?l=!0:s===22?(u=!1,o=!1):s===23?i=!1:s===24?l=!1:s>=30&&s<=37?r=Ae[s]:s===39?r=void 0:s>=40&&s<=47?a=Ne[s]:s===49&&(a=void 0)};let h;for(;(h=F.exec(e))!==null;){d(e.slice(n,h.index)),n=F.lastIndex;const c=h[1]?h[1].split(";").map(Number):[0];f(c)}return d(e.slice(n)),t.join("")}function st(e,t=120){if(!e)return"";const n=e.replace(/\n/g," · ");return n.length<=t?n:n.slice(0,t)+"…"}function ut(e){return e.totalTests>0?Math.round(e.passedTests/e.totalTests*100):0}function ct(e){return e==="flaky"?"warning":e==="never-run"?"neutral":e==="didnotrun"?"warning":Te(e)}function lt(e){switch(e.toUpperCase()){case"GET":return"info";case"POST":return"success";case"DELETE":return"error";case"PUT":case"PATCH":return"warning";default:return"neutral"}}function dt(e){return!e||e<=0?"neutral":e>=500?"error":e>=400?"warning":"success"}export{Ve as A,He as B,Ye as C,Ue as D,Ke as E,ut as F,Re as G,je as a,Je as b,Qe as c,Ge as d,
|
|
1
|
+
import{aa as P,p as L}from"./DCFbQvIN.js";const y=43200,k=1440,C=Symbol.for("constructDateFrom");function x(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&C in e?e[C](t):e instanceof Date?new e.constructor(t):new Date(t)}function g(e,t){return x(e,e)}let _={};function A(){return _}function W(e){const t=g(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function D(e,...t){const n=x.bind(null,e||t.find(r=>typeof r=="object"));return t.map(n)}function w(e,t){const n=+g(e)-+g(t);return n<0?-1:n>0?1:n}function z(e){return x(e,Date.now())}function E(e,t,n){const[r,a]=D(n?.in,e,t),u=r.getFullYear()-a.getFullYear(),o=r.getMonth()-a.getMonth();return u*12+o}function $(e){return t=>{const r=(e?Math[e]:Math.trunc)(t);return r===0?0:r}}function j(e,t){return+g(e)-+g(t)}function R(e,t){const n=g(e);return n.setHours(23,59,59,999),n}function X(e,t){const n=g(e),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function Y(e,t){const n=g(e);return+R(n)==+X(n)}function U(e,t,n){const[r,a,u]=D(n?.in,e,e,t),o=w(a,u),i=Math.abs(E(a,u));if(i<1)return 0;a.getMonth()===1&&a.getDate()>27&&a.setDate(30),a.setMonth(a.getMonth()-o*i);let l=w(a,u)===-o;Y(r)&&i===1&&w(r,u)===1&&(l=!1);const d=o*(i-+l);return d===0?0:d}function V(e,t,n){const r=j(e,t)/1e3;return $(n?.roundingMethod)(r)}const q={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},H=(e,t,n)=>{let r;const a=q[e];return typeof a=="string"?r=a:t===1?r=a.one:r=a.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function v(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const B={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},J={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},G={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Q={date:v({formats:B,defaultWidth:"full"}),time:v({formats:J,defaultWidth:"full"}),dateTime:v({formats:G,defaultWidth:"full"})},K={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Z=(e,t,n,r)=>K[e];function p(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let a;if(r==="formatting"&&e.formattingValues){const o=e.defaultFormattingWidth||e.defaultWidth,i=n?.width?String(n.width):o;a=e.formattingValues[i]||e.formattingValues[o]}else{const o=e.defaultWidth,i=n?.width?String(n.width):e.defaultWidth;a=e.values[i]||e.values[o]}const u=e.argumentCallback?e.argumentCallback(t):t;return a[u]}}const ee={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},te={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},ne={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},re={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},ae={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},ie={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},oe=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},se={ordinalNumber:oe,era:p({values:ee,defaultWidth:"wide"}),quarter:p({values:te,defaultWidth:"wide",argumentCallback:e=>e-1}),month:p({values:ne,defaultWidth:"wide"}),day:p({values:re,defaultWidth:"wide"}),dayPeriod:p({values:ae,defaultWidth:"wide",formattingValues:ie,defaultFormattingWidth:"wide"})};function b(e){return(t,n={})=>{const r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],u=t.match(a);if(!u)return null;const o=u[0],i=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(i)?ce(i,h=>h.test(o)):ue(i,h=>h.test(o));let d;d=e.valueCallback?e.valueCallback(l):l,d=n.valueCallback?n.valueCallback(d):d;const f=t.slice(o.length);return{value:d,rest:f}}}function ue(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function ce(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return n}function le(e){return(t,n={})=>{const r=t.match(e.matchPattern);if(!r)return null;const a=r[0],u=t.match(e.parsePattern);if(!u)return null;let o=e.valueCallback?e.valueCallback(u[0]):u[0];o=n.valueCallback?n.valueCallback(o):o;const i=t.slice(a.length);return{value:o,rest:i}}}const de=/^(\d+)(th|st|nd|rd)?/i,fe=/\d+/i,he={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},me={any:[/^b/i,/^(a|c)/i]},ge={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},pe={any:[/1/i,/2/i,/3/i,/4/i]},be={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},ye={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},we={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Me={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},ve={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},xe={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},De={ordinalNumber:le({matchPattern:de,parsePattern:fe,valueCallback:e=>parseInt(e,10)}),era:b({matchPatterns:he,defaultMatchWidth:"wide",parsePatterns:me,defaultParseWidth:"any"}),quarter:b({matchPatterns:ge,defaultMatchWidth:"wide",parsePatterns:pe,defaultParseWidth:"any",valueCallback:e=>e+1}),month:b({matchPatterns:be,defaultMatchWidth:"wide",parsePatterns:ye,defaultParseWidth:"any"}),day:b({matchPatterns:we,defaultMatchWidth:"wide",parsePatterns:Me,defaultParseWidth:"any"}),dayPeriod:b({matchPatterns:ve,defaultMatchWidth:"any",parsePatterns:xe,defaultParseWidth:"any"})},N={code:"en-US",formatDistance:H,formatLong:Q,formatRelative:Z,localize:se,match:De,options:{weekStartsOn:0,firstWeekContainsDate:1}};function Se(e,t,n){const r=A(),a=n?.locale??r.locale??N,u=2520,o=w(e,t);if(isNaN(o))throw new RangeError("Invalid time value");const i=Object.assign({},n,{addSuffix:n?.addSuffix,comparison:o}),[l,d]=D(n?.in,...o>0?[t,e]:[e,t]),f=V(d,l),h=(W(d)-W(l))/1e3,c=Math.round((f-h)/60);let s;if(c<2)return n?.includeSeconds?f<5?a.formatDistance("lessThanXSeconds",5,i):f<10?a.formatDistance("lessThanXSeconds",10,i):f<20?a.formatDistance("lessThanXSeconds",20,i):f<40?a.formatDistance("halfAMinute",0,i):f<60?a.formatDistance("lessThanXMinutes",1,i):a.formatDistance("xMinutes",1,i):c===0?a.formatDistance("lessThanXMinutes",1,i):a.formatDistance("xMinutes",c,i);if(c<45)return a.formatDistance("xMinutes",c,i);if(c<90)return a.formatDistance("aboutXHours",1,i);if(c<k){const m=Math.round(c/60);return a.formatDistance("aboutXHours",m,i)}else{if(c<u)return a.formatDistance("xDays",1,i);if(c<y){const m=Math.round(c/k);return a.formatDistance("xDays",m,i)}else if(c<y*2)return s=Math.round(c/y),a.formatDistance("aboutXMonths",s,i)}if(s=U(d,l),s<12){const m=Math.round(c/y);return a.formatDistance("xMonths",m,i)}else{const m=s%12,M=Math.trunc(s/12);return m<3?a.formatDistance("aboutXYears",M,i):m<9?a.formatDistance("overXYears",M,i):a.formatDistance("almostXYears",M+1,i)}}function Pe(e,t){return Se(e,z(e),t)}const ke=["years","months","weeks","days","hours","minutes","seconds"];function Ce(e,t){const r=A().locale??N,a=ke,u=" ";return r.formatDistance?a.reduce((i,l)=>{const d=`x${l.replace(/(^.)/,h=>h.toUpperCase())}`,f=e[l];return f!==void 0&&e[l]?i.concat(r.formatDistance(d,f)):i},[]).join(u):""}const We="piwi:",O=["critical","high","medium","low"];new Set(O);function Le(e){return typeof e=="string"&&e.trim().toLowerCase().startsWith(We)}function _e(e){return O.includes(e)?e:void 0}function ze(e){return({column:t})=>{const n=t.getIsSorted();return P("button",{class:"flex items-center gap-1 font-semibold select-none cursor-pointer hover:text-highlighted transition-colors",onClick:()=>t.toggleSorting()},[e,P(L,{name:n==="asc"?"i-lucide-chevron-up":n==="desc"?"i-lucide-chevron-down":"i-lucide-chevrons-up-down",class:["shrink-0 size-3.5",!n&&"opacity-40"]})])}}function Ee(e,t={}){if(e==null||e==="")return"N/A";let n;if(e instanceof Date)n=e;else{const r=typeof e=="number"?e:Number(e);!Number.isNaN(r)&&String(e).trim()!==""?n=new Date(r<1e12?r*1e3:r):n=new Date(e)}return Number.isNaN(n.getTime())?"N/A":t.dateOnly?n.toLocaleDateString():n.toLocaleString()}function $e(e){return e?Pe(new Date(e),{addSuffix:!0}):"N/A"}function je(e){if(e==null)return"N/A";const t=Math.round(Math.abs(e));return t===0?"0 seconds":(e<0?"−":"")+Ce({seconds:t/1e3})}function Re(e){if(e==null)return null;const t=Math.round(Math.abs(e)),n=e<0?"−":"";if(t<1e3)return{value:n+t,unit:"ms"};const r=t/1e3;return r<60?{value:n+Math.round(r*10)/10,unit:"s"}:{value:n+Math.round(r/60*10)/10,unit:"m"}}function Xe(e){switch(e){case"html":return"i-lucide-layout-dashboard";case"monocart":return"i-lucide-bar-chart-2";case"blob":return"i-lucide-download";default:return"i-lucide-file-text"}}function Ye(e){if(!e)return"i-lucide-globe";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"i-simple-icons-googlechrome":t.includes("firefox")?"i-simple-icons-firefoxbrowser":t.includes("safari")||t.includes("webkit")?"i-simple-icons-safari":t.includes("edge")?"i-simple-icons-microsoftedge":"i-lucide-globe"}function Ue(e){if(!e)return"#6b7280";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"#4285F4":t.includes("firefox")?"#FF7139":t.includes("safari")||t.includes("webkit")?"#007AFF":t.includes("edge")?"#0078D7":"#6b7280"}function Te(e){switch(e){case"passed":return"success";case"failed":return"error";case"timedout":return"warning";case"timedOut":return"warning";case"interrupted":return"warning";case"cancelled":return"neutral";case"initialising":return"info";case"running":return"info";case"finalizing":return"info";default:return"neutral"}}function S(e){return e==="timedOut"?"timedout":e}function Ve(e){switch(S(e)){case"passed":return"i-lucide-check-circle-2";case"failed":case"timedout":return"i-lucide-x-circle";case"didnotrun":return"i-lucide-circle-slash";case"running":case"initialising":case"finalizing":return"i-lucide-loader-circle";default:return"i-lucide-minus-circle"}}function qe(e){switch(S(e)){case"passed":return"text-emerald-600 dark:text-emerald-400";case"failed":case"timedout":return"text-rose-600 dark:text-rose-400";case"didnotrun":return"text-amber-600 dark:text-amber-400";case"running":case"initialising":case"finalizing":return"text-blue-600 dark:text-blue-400";default:return"text-zinc-400 dark:text-zinc-500"}}function He(e){const t=S(e);return t==="running"||t==="initialising"||t==="finalizing"}function Be(e){return e==="timedOut"||e==="timedout"?"failed":e==="didnotrun"?"didn't run":e==="never-run"?"never run":e}function Je(e){return e&&{open:"warning",resolved:"success",ignored:"neutral"}[e]||"neutral"}function Ge(e){switch(e){case"diagnosis-verified":return{label:"Fix verified",color:"success",icon:"i-lucide-badge-check",hint:"The tests went green and the change touched the files the diagnosis named."};case"stopped-failing":return{label:"Stopped failing",color:"info",icon:"i-lucide-check",hint:"The tests went green. Nothing corroborates which change did it."};case"regressed":return{label:"Regressed",color:"error",icon:"i-lucide-undo-2",hint:"A fix was recorded for this cluster and it did not hold — the failure came back."};default:return null}}function Qe(e){return e&&{timeout:"warning",assertion:"error","strict-mode":"info",navigation:"secondary",crash:"error",unknown:"neutral"}[e]||"neutral"}const T=["#ef4444","#f97316","#f59e0b","#84cc16","#10b981","#14b8a6","#06b6d4","#3b82f6","#6366f1","#8b5cf6","#d946ef","#ec4899"];function Ke(){return T[Math.floor(Math.random()*T.length)]}function I(e){return!e.startsWith(".")&&!e.startsWith("/")?e:e.replace(".data/storage/","")}function Ze(e,t,n="/",r=!1){const a=(n||"/").replace(/\/$/,""),u=new URLSearchParams,o=/\.[a-z0-9]+$/i.test(e);t&&!o&&u.set("contentType",t),r&&u.set("compress","1");const i=u.toString();return`${a}/api/files/${I(e)}${i?`?${i}`:""}`}function et(e,t="/",n=!1){const r=(t||"/").replace(/\/$/,""),o=`${typeof location>"u"?"":location.origin}${r}/${n?"":"api/files/"}${I(e)}`;return`${r}/trace-viewer/?trace=${encodeURIComponent(o)}`}function tt(e,t="Unknown error"){if(e&&typeof e=="object"){const n=e;return n.data?.message??n.message??t}return t}function nt(e,t){const n=t.trim().toLowerCase();return n?e.filter(r=>r.message.toLowerCase().includes(n)||r.author.toLowerCase().includes(n)||r.sha.includes(n)||r.shortSha.includes(n)):e}function rt(e){switch(e){case"added":return{icon:"i-lucide-file-plus",color:"text-green-500",badgeColor:"success"};case"removed":return{icon:"i-lucide-file-minus",color:"text-red-500",badgeColor:"error"};case"renamed":return{icon:"i-lucide-file-symlink",color:"text-blue-500",badgeColor:"info"};default:return{icon:"i-lucide-file-pen-line",color:"text-gray-400",badgeColor:"neutral"}}}const at={add:"bg-green-50 dark:bg-green-950/30 text-green-800 dark:text-green-300",remove:"bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-300",hunk:"bg-blue-50 dark:bg-blue-950/20 text-blue-500 dark:text-blue-400",context:"text-gray-600 dark:text-gray-400"};function it(e){return e.split(`
|
|
2
|
+
`).map(t=>t.startsWith("+")&&!t.startsWith("+++")?{type:"add",text:t}:t.startsWith("-")&&!t.startsWith("---")?{type:"remove",text:t}:t.startsWith("@@")?{type:"hunk",text:t}:{type:"context",text:t})}const Fe="\x1B",Ae={30:"#000000",31:"#dc2626",32:"#16a34a",33:"#d97706",34:"#2563eb",35:"#9333ea",36:"#0891b2",37:"#9ca3af"},Ne={40:"#000000",41:"#dc2626",42:"#16a34a",43:"#d97706",44:"#2563eb",45:"#9333ea",46:"#0891b2",47:"#9ca3af"},F=new RegExp(`${Fe}\\[([0-9;]*)m`,"g");function Oe(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function ot(e){const t=[];let n=0,r,a,u=!1,o=!1,i=!1,l=!1;const d=c=>{if(!c)return;const s=[];u&&s.push("font-weight:600"),o&&s.push("opacity:.7"),i&&s.push("font-style:italic"),l&&s.push("text-decoration:underline"),r&&s.push(`color:${r}`),a&&s.push(`background:${a}`);const m=Oe(c);t.push(s.length?`<span style="${s.join(";")}">${m}</span>`:m)},f=c=>{for(const s of c)s===0?(r=void 0,a=void 0,u=!1,o=!1,i=!1,l=!1):s===1?u=!0:s===2?o=!0:s===3?i=!0:s===4?l=!0:s===22?(u=!1,o=!1):s===23?i=!1:s===24?l=!1:s>=30&&s<=37?r=Ae[s]:s===39?r=void 0:s>=40&&s<=47?a=Ne[s]:s===49&&(a=void 0)};let h;for(;(h=F.exec(e))!==null;){d(e.slice(n,h.index)),n=F.lastIndex;const c=h[1]?h[1].split(";").map(Number):[0];f(c)}return d(e.slice(n)),t.join("")}function st(e,t=120){if(!e)return"";const n=e.replace(/\n/g," · ");return n.length<=t?n:n.slice(0,t)+"…"}function ut(e){return e.totalTests>0?Math.round(e.passedTests/e.totalTests*100):0}function ct(e){return e==="flaky"?"warning":e==="never-run"?"neutral":e==="didnotrun"?"warning":Te(e)}function lt(e){switch(e.toUpperCase()){case"GET":return"info";case"POST":return"success";case"DELETE":return"error";case"PUT":case"PATCH":return"warning";default:return"neutral"}}function dt(e){return!e||e<=0?"neutral":e>=500?"error":e>=400?"warning":"success"}export{Ve as A,He as B,Ye as C,Ue as D,Ke as E,ut as F,Re as G,je as a,Je as b,Qe as c,Ge as d,tt as e,$e as f,nt as g,st as h,ze as i,Te as j,Be as k,ct as l,Le as m,Ze as n,lt as o,Ee as p,dt as q,ot as r,rt as s,_e as t,at as u,it as v,et as w,I as x,Xe as y,qe as z};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{_ as ee,a as te}from"./DQM62mxB.js";import{_ as se}from"./DkT2nCqn.js";import{d as N,b as re,B as ie,ao as D,k as i,o as r,f as w,g as d,c,j as a,p as E,m as s,F as k,y as O,q as oe,i as e,t as l,s as ne,v as f,_ as F,r as U,w as ae,e as ce,A as pe,h as b}from"./DCFbQvIN.js";import{_ as G}from"./B3Fsod9X.js";import{e as B}from"./BAKUqW95.js";import{_ as de}from"./D8gX1Jde.js";import{_ as le}from"./_rglcvXN.js";import{E as ue}from"./DWwiVTZX.js";import{u as me}from"./rL4C0HV5.js";import{a as ge,u as fe}from"./E-_n_6vi.js";import"./C2hNxjjz.js";import"./BpM6ZPIG.js";import"./BjaRappk.js";import"./Cpsq-kYE.js";import"./YE1kAkU9.js";import"./DGnQ69wW.js";const ye={key:0,class:"flex items-center gap-2 text-sm text-muted"},he={key:1,class:"space-y-2"},be=["data-testid"],xe={class:"min-w-0 flex-1"},_e={class:"flex items-center gap-2"},ve={class:"text-sm font-medium"},ke={key:0,class:"text-xs text-muted truncate"},we={key:1,class:"text-xs text-warning"},je={class:"flex items-center gap-1.5 shrink-0"},Ie=N({__name:"DesktopMcpClientsCard",setup(M){const x=re(),C=U(!1),S=U(!0),j=U([]),g=U(null);async function A(){const n=D();if(n)try{j.value=await n.invoke("desktop_mcp_clients"),C.value=!0}catch{C.value=!1}finally{S.value=!1}}ie(()=>{D()?A():S.value=!1});async function _(n,p){const y=D();if(y){g.value=n.id;try{const v=await y.invoke(p?"desktop_mcp_connect":"desktop_mcp_disconnect",{clientId:n.id});j.value=j.value.map(h=>h.id===v.id?v:h),x.add({title:p?`${n.label} connected`:`${n.label} disconnected`,description:p?`Restart ${n.label} to pick up the new server.`:void 0,color:"success",icon:"i-lucide-plug"})}catch(v){x.add({title:`Could not update ${n.label}`,description:B(v),color:"error"})}finally{g.value=null}}}async function u(n){const p=D();if(p)try{await p.invoke("desktop_mcp_reveal",{clientId:n.id})}catch(y){x.add({title:"Could not open the file",description:B(y),color:"error"})}}function q(n){switch(n.status){case"connected":return{label:"Connected",color:"success"};case"stale":return{label:"Needs update",color:"warning"};case"manual":return{label:"Manual setup",color:"warning"};case"not_installed":return{label:"Not detected",color:"neutral"};default:return null}}return(n,p)=>{const y=E,v=ne,h=F,z=G;return i(C)?(r(),w(z,{key:0,icon:"i-lucide-plug-zap",title:"Connect a client on this machine"},{subtitle:d(()=>[...p[0]||(p[0]=[s(" One click writes the ",-1),e("code",null,"piwi",-1),s(" entry into the client's own config file (a backup is kept next to it), and entries are kept current when this app's address changes. Restart the client after connecting. ",-1)])]),default:d(()=>[i(S)?(r(),c("div",ye,[a(y,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),p[1]||(p[1]=s(" Detecting clients… ",-1))])):(r(),c("div",he,[(r(!0),c(k,null,O(i(j),o=>(r(),c("div",{key:o.id,"data-testid":`mcp-client-${o.id}`,class:oe(["flex items-center gap-3 rounded-md border border-default p-2.5",o.status==="not_installed"?"opacity-60":""])},[a(y,{name:"i-lucide-bot",class:"size-4 text-gray-400 shrink-0"}),e("div",xe,[e("div",_e,[e("p",ve,l(o.label),1),q(o)?(r(),w(v,{key:0,color:q(o).color,variant:"subtle",size:"sm"},{default:d(()=>[s(l(q(o).label),1)]),_:2},1032,["color"])):f("",!0)]),o.config_path?(r(),c("p",ke,l(o.config_path),1)):f("",!0),o.detail?(r(),c("p",we,l(o.detail),1)):f("",!0)]),e("div",je,[o.status==="not_connected"?(r(),w(h,{key:0,size:"xs",icon:"i-lucide-plug",loading:i(g)===o.id,onClick:P=>_(o,!0)},{default:d(()=>[...p[2]||(p[2]=[s(" Connect ",-1)])]),_:1},8,["loading","onClick"])):o.status==="stale"?(r(),w(h,{key:1,size:"xs",color:"warning",icon:"i-lucide-refresh-cw",loading:i(g)===o.id,onClick:P=>_(o,!0)},{default:d(()=>[...p[3]||(p[3]=[s(" Update ",-1)])]),_:1},8,["loading","onClick"])):f("",!0),o.status==="connected"||o.status==="stale"?(r(),w(h,{key:2,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-unplug",loading:i(g)===o.id,onClick:P=>_(o,!1)},{default:d(()=>[...p[4]||(p[4]=[s(" Disconnect ",-1)])]),_:1},8,["loading","onClick"])):f("",!0),o.status!=="not_installed"&&o.config_path?(r(),w(h,{key:3,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-folder-open","aria-label":"Reveal config file",title:"Reveal config file",onClick:P=>u(o)},null,8,["onClick"])):f("",!0)])],10,be))),128)),p[5]||(p[5]=e("p",{class:"text-xs text-muted"}," A client that is not listed — or marked manual — can always be connected with the snippets below. ",-1))]))]),_:1})):f("",!0)}}}),Ce=Object.assign(Ie,{__name:"DesktopMcpClientsCard"}),Se=[{name:"list_projects",description:"List all projects with stats: total runs, test cases, latest run status and branch. Use this first to discover available projects and their IDs.",inputSchema:{type:"object",properties:{}}},{name:"get_project",description:"Get project details and its recent test runs with pass/fail counts. Results are paginated — use pageSize and cursor for the runs list.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Project ID from list_projects"},pageSize:{type:"number",description:"Runs per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of runs"}},required:["id"]}},{name:"list_runs",description:"List test runs for a project with filters.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["passed","failed","running","initialising","aborted"],description:"Filter by status"},branch:{type:"string",description:"Filter by branch name (exact match against SCM metadata)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_run",description:"Get a test run summary plus its test cases (paginated), with status, truncated error text, and failure cluster IDs. Filter by status and page with pageSize/cursor.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"},status_filter:{type:"string",enum:["failed","flaky","all"],description:'Which test cases to include (default: "failed" — only failed+timedOut; "flaky" — only flaky; "all" — every case)'},pageSize:{type:"number",description:"Cases per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response for the next page of cases"}},required:["id"]}},{name:"list_failed_cases",description:"List failed and timed-out test cases across recent runs for a project.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"},runId:{type:"number",description:"Optional: restrict to a specific run"}},required:["projectId"]}},{name:"list_flaky_tests",description:"List flaky tests for a project with flakiness scores.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Number of recent runs to analyze (default 50, max 200)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response. Cursor is the flakyScore value (descending)."}},required:["projectId"]}},{name:"get_test_case",description:"Get test case details including aggregated pass/fail stats, flakiness metrics, and recent executions (paginated). Use testCaseId (stable identity), not the per-run caseId.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test case ID (testCaseId from list_failed_cases or list_flaky_tests)"},pageSize:{type:"number",description:"Executions per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of executions"}},required:["id"]}},{name:"list_clusters",description:"List failure clusters for a project. Each cluster groups similar failures by error fingerprint.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"Filter by triage status (default: all statuses)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_cluster",description:"Get full details for a failure cluster including all affected test cases, a compact diagnosis summary, and locator healing suggestions for up to 5 affected cases. Each healing entry includes the failing locator, the recommended fix, and the number of alternatives available. Use get_cluster_diagnosis for the full diagnosis text, or get_cluster_context for the raw AI evidence.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID from list_clusters"}},required:["id"]}},{name:"get_fix_plan",description:"Everything needed to fix one failure cluster, in a single answer: the diagnosis and its validated patch, ranked locator replacements with the exact file and line to edit, the failing tests, the owning team, and the command that verifies the work. `verify.expectation` states what the dashboard records once those tests pass, so you can confirm the fix landed rather than guessing. Prefer this over assembling get_cluster + get_cluster_diagnosis + get_locator_healing yourself.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID from list_clusters or list_open_clusters"}},required:["clusterId"]}},{name:"get_cluster_diagnosis",description:"Get the stored AI diagnosis for a failure cluster. Returns category, confidence, root cause, evidence, and suggested fix. Returns null if no diagnosis has been run yet.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"}},required:["id"]}},{name:"get_test_case_context",description:"Get the AI evidence context for a specific test-run-case (execution scope). Use this when debugging a single test failure — it provides the execution-scoped evidence including steps, console, network, and SCM diff.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run case ID"}},required:["id"]}},{name:"get_case_screenshots",description:"Get screenshots for a test-run-case. By default returns metadata only (name, type, size). Set content=true to include base64-encoded image data (max 3, capped at ~100 KB each). Call metadata-only first to discover what exists, then request content for the ones you need.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID"},content:{type:"boolean",description:"Include base64 image data (default false — metadata only)"}},required:["testRunsCaseId"]}},{name:"get_cluster_context",description:"Get the full AI evidence context for a failure cluster — the same data sent to the diagnosis AI. Includes error samples, stack traces, test steps, console logs, network failures, ARIA snapshots, SCM diff (changed files since last green run), and a per-section breakdown with char counts and truncation flags. This is the richest available evidence for debugging a failure.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},baseCommit:{type:"string",description:"Optional: override the baseline commit SHA for SCM diff comparison"},selectedCommitShas:{type:"array",items:{type:"string"},description:"Optional: specific commit SHAs to include in the diff context (max 10)"}},required:["id"]}},{name:"search_test_cases",description:"Search test cases by title or file path within a project. Accepts a free-text query and returns matching test cases with basic stats. Use this to find a test case when you don't know its ID.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},q:{type:"string",description:"Search query — matched against title and file path (case-insensitive)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId","q"]}},{name:"get_test_run_case",description:"Get a single test-run-case execution record with full (untruncated) error text plus steps, console logs, web vitals, and ARIA snapshot. Use include to fetch only the blobs you need. The ID is the executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run case ID (executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases)"},include:{type:"array",items:{type:"string",enum:["steps","console","webVitals","aria","source"]},description:"Optional: which heavy blobs to include (default: all). The error, status, and summary are always returned."}},required:["id"]}},{name:"list_recent_activity",description:"List the most recent test runs across all projects. No projectId required — returns a cross-project view of recent CI activity. Paginated by startTime descending.",inputSchema:{type:"object",properties:{pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_repo_commits",description:"List recent commits for a project's repository. Requires SCM token configuration (per-project or global). Returns commit details (SHA, message, author, date).",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},branch:{type:"string",description:"Branch name (default: repository default branch)"},limit:{type:"number",description:"Max commits (default 20, max 100)"}},required:["projectId"]}},{name:"get_repo_diff",description:"Get the diff (changed files with patches) for a single commit in a project's repository. Requires SCM token configuration (per-project or global). Useful for inspecting what code changed in a specific commit suspected of causing a failure.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},sha:{type:"string",description:"Full commit SHA"}},required:["projectId","sha"]}},{name:"get_run_insights",description:'Compare a run to its last green baseline: pass-rate delta, new regressions, recurrences, recovered tests, new flaky tests, biggest perf improvements/regressions, worker imbalance, and newly opened clusters. Use this to answer "what changed?" and "did my fix work?".',inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"}},required:["id"]}},{name:"get_spec_health",description:"Per-spec-file health for a project: pass rate, flaky rate, failure count, test count, and average duration grouped by spec-file prefix over the last N days. Use to find which areas of the suite are unhealthy.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},days:{type:"number",description:"Lookback window in days (default 30, max 90)"}},required:["projectId"]}},{name:"get_slow_tests",description:"Slowest test cases in a project by average duration, with max/min and trend direction across recent runs. Use to target performance work.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Recent runs to analyze (default 50, max 100)"}},required:["projectId"]}},{name:"get_performance_trend",description:'Time series of run duration, average test duration, and p90 test duration for a project. Use to answer "is the suite getting slower?".',inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},limit:{type:"number",description:"Number of recent runs (default 30, max 100)"}},required:["projectId"]}},{name:"get_test_stability_trend",description:'Time-series stability for a single test case: flaky rate, pass rate, and average duration bucketed over its recent execution history. Use to answer "is this test getting flakier?".',inputSchema:{type:"object",properties:{id:{type:"number",description:"Test case ID (stable testCaseId)"},buckets:{type:"number",description:"Number of time buckets (default 20, 5–50)"}},required:["id"]}},{name:"get_network_requests",description:"A run's network requests aggregated by method + normalized route, sorted by average duration, with status codes and captured backend server logs. Use to pin a UI failure on a slow or failing endpoint.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"}},required:["id"]}},{name:"get_failure_groups",description:"One run's failures grouped by failure cluster, with per-group affected cases and worker correlation. Run-scoped counterpart to list_clusters.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Test run ID"}},required:["id"]}},{name:"get_locator_healing",description:"Ranked alternative locators for a failing test-run-case: the failing locator, the recommended durable fix, and the full alternative lists (from prior success, element match, and ARIA snapshot). Use when fixing a broken selector.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID (executionId)"}},required:["testRunsCaseId"]}},{name:"search",description:"Global search across all in-scope projects, runs (by label or numeric id), and test cases (by title). Use to find a run by its label or locate an entity across projects.",inputSchema:{type:"object",properties:{q:{type:"string",description:"Search query (min 2 chars)"}},required:["q"]}},{name:"list_case_traces",description:"List Playwright trace files for a test-run-case, with a download path for each. Fetch the bytes via GET /api/files/<path>.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID (executionId)"}},required:["testRunsCaseId"]}},{name:"list_links",description:"List external entity links (Jira, GitHub PR/issue, etc.) attached to a run, test-run-case, or test case, with provider and unfurled status.",inputSchema:{type:"object",properties:{entityType:{type:"string",enum:["test_run","test_runs_case","test_case"],description:"Which entity the links are attached to"},id:{type:"number",description:"The entity ID matching entityType"}},required:["entityType","id"]}},{name:"list_tags",description:"List the project tag catalog (id, text, color).",inputSchema:{type:"object",properties:{}}},{name:"get_project_test_catalog",description:"The full test-case catalog for a project with aggregated pass/fail/flaky counts, average duration, and last status per test. Offset-paginated bulk companion to get_test_case.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},offset:{type:"number",description:"Row offset for paging (default 0)"},query:{type:"string",description:"Optional case-insensitive substring filter on title or file path"},tags:{type:"string",description:"Comma-separated tags; a test must carry every one of them. A leading @ is optional."},owner:{type:"string",description:"Exact owner declared via the piwi:owner annotation"},priority:{type:"string",enum:["critical","high","medium","low"],description:"Priority declared via the piwi:priority annotation"}},required:["projectId"]}},{name:"list_open_clusters",description:"Open failure clusters across all in-scope projects, ranked by occurrences — a cross-project triage queue. Filter by status; paginate with pageSize/cursor.",inputSchema:{type:"object",properties:{status:{type:"string",enum:["open","resolved","ignored"],description:"Triage status (default: open)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_instance_stats",description:"Instance-wide counts (projects, runs, test cases, executions, files) and total storage size. Admin only.",inputSchema:{type:"object",properties:{}}},{name:"explain_failure",description:"One-call evidence bundle for a single failing execution: error, steps, console, ARIA snapshot, the recommended locator fix, a screenshot count, and the AI diagnosis context. Prefer this over chaining get_test_run_case + get_locator_healing + get_test_case_context.",inputSchema:{type:"object",properties:{testRunsCaseId:{type:"number",description:"Test run case ID (executionId)"}},required:["testRunsCaseId"]}},{name:"set_cluster_status",description:"Triage a failure cluster: set its status to open, resolved, or ignored with an optional note. Requires reporter or admin access. Use after fixing the underlying issue.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"New triage status"},triageNote:{type:"string",description:"Optional note explaining the status change"}},required:["id","status"]}},{name:"set_cluster_base_commit",description:'Pin the baseline commit SHA a cluster uses for its SCM-diff diagnosis context, so "what changed since green" is accurate. Requires reporter or admin access.',inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},commit:{type:"string",description:"Baseline commit SHA (empty to clear)"}},required:["id","commit"]}},{name:"submit_diagnosis_feedback",description:"Record thumbs up/down feedback on a stored diagnosis, with an optional note. Requires reporter or admin access.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Diagnosis ID"},feedback:{type:"string",enum:["up","down"],description:"Rating (omit to clear)"},feedbackNote:{type:"string",description:"Optional note"}},required:["id"]}},{name:"run_cluster_diagnosis",description:"Trigger an AI diagnosis for a failure cluster and return the result (category, confidence, root cause, suggested fix). Returns the existing completed diagnosis unless force is set. Requires reporter or admin access and a configured AI provider.",inputSchema:{type:"object",properties:{id:{type:"number",description:"Cluster ID"},force:{type:"boolean",description:"Re-run even if a completed diagnosis exists (default false)"},baseCommit:{type:"string",description:"Optional baseline commit SHA for SCM-diff context"}},required:["id"]}},{name:"create_test_function",description:`Register a page-object method or helper in a project's test-function catalog, so the Piwi Picker browser extension (and its recorder) can match a live page or a recorded session against it and substitute a call to your own code instead of raw locator lines. This tool does not call an AI itself — you (the calling agent) read the function's real source in your own context and fill in these fields directly; the tool only validates the shape and persists it. Follow these extraction rules when deciding the field values:
|
|
2
|
+
|
|
3
|
+
${ue}
|
|
4
|
+
|
|
5
|
+
The fields below map onto that guidance one-for-one, plus "module" and "urlPattern", which no amount of code-reading can infer — supply them from where the function actually lives and, optionally, which page it applies to. Requires reporter or administrator access.`,inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID from list_projects"},name:{type:"string",description:"Becomes the called method/function name — must be a valid JS identifier"},kind:{type:"string",enum:["page-object-method","helper","fixture"],description:'"page-object-method" for a class method acting on this.page; "helper" for a standalone function taking page as its first parameter; "fixture" only for Playwright fixture setup'},module:{type:"string",description:"Import specifier for where this function lives, e.g. './pages/CartPage'"},receiver:{type:["string","null"],description:"page-object-method only: instance variable name, e.g. cartPage (null for a helper/fixture)"},importName:{type:["string","null"],description:"page-object-method only: the class name to import, e.g. CartPage (null for a helper/fixture)"},params:{type:"array",description:"The function's own parameters, excluding the leading Playwright handle (page/locator/this). An options-bag parameter must be type 'object' with its property names in 'fields' — never flattened to a string.",items:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["string","number","boolean","object"]},fields:{type:"array",items:{type:"string"},description:"For type 'object': the bag's property names, e.g. ['label', 'testId']"}},required:["name","type"]}},returnsPage:{type:"boolean",description:"True if the function returns/navigates to a new Page (default false)"},urlPattern:{type:["string","null"],description:'Optional glob (** crosses path segments, * does not, e.g. "**/cart") gating which page this applies to'},steps:{type:"array",description:"The ordered sequence of page interactions the function performs — at least one required",items:{type:"object",properties:{action:{type:"string",enum:["goto","click","fill","check","uncheck","selectOption","press","assertVisible"]},target:{type:"object",properties:{role:{type:["string","null"]},name:{type:["string","null"]},testId:{type:["string","null"]}}}},required:["action","target"]}},paramSources:{type:"array",description:"Maps a step's argument back to a function parameter, when that argument IS the parameter",items:{type:"object",properties:{param:{type:"string"},path:{type:["string","null"],description:"For an 'object' param: which of its fields this fills (e.g. 'label'). Omit for a scalar param."},stepIndex:{type:"integer"},from:{type:"string",enum:["text","value","testId"]}},required:["param","stepIndex","from"]}}},required:["projectId","name","kind","module","params","steps"]}}],qe=[{name:"setup_piwi",description:"Set up the current Playwright project to report to this Piwi Dashboard: install the reporter, wrap the config, add the capture fixtures, and verify a run lands. Server-aware — fills in this dashboard's URL, whether authentication is required, and the projects that already exist.",arguments:[{name:"projectName",description:"Name to report runs under. Omit to reuse an existing project or derive one from the repository.",required:!1}]}];function Pe(M){return new URL(globalThis.location.href)}const Re={class:"max-w-3xl mx-auto p-6 space-y-6"},Ae={key:0,class:"mb-4 space-y-3 rounded-md border border-default bg-elevated/50 p-3"},Te={class:"space-y-1"},De={class:"flex items-start gap-2"},Ue={class:"text-xs break-all flex-1"},Oe={class:"space-y-1"},ze={class:"flex items-start gap-2"},$e={class:"text-xs break-all flex-1"},Me={class:"text-sm text-gray-500 dark:text-gray-400 mb-4"},Le={class:"space-y-3"},Be={class:"space-y-3"},Ne={class:"space-y-3"},Ee={class:"space-y-3"},Fe={class:"space-y-3"},Ge={class:"space-y-3"},He={class:"space-y-3"},We={class:"flex flex-col gap-1.5"},Ve={class:"min-w-0"},Je={class:"text-sm font-mono font-semibold text-foreground"},Ye={class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},Ke={class:"flex flex-col gap-1.5"},Xe={class:"min-w-0"},Qe={class:"text-sm font-mono font-semibold text-foreground"},Ze={class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},et={key:0,class:"flex flex-wrap gap-1.5 mt-1.5"},tt=["title"],st={class:"space-y-3 text-sm text-gray-600 dark:text-gray-400"},rt={key:0},it={key:1},ot={key:2,class:"text-xs text-gray-400"},nt={key:3,class:"text-xs text-gray-400"},at={class:"space-y-2"},ct={class:"flex items-center gap-2"},pt={class:"flex-1 px-3 py-2 bg-muted rounded-md text-sm font-mono break-all"},dt={class:"text-xs text-gray-400"},lt="pd_YOUR_API_KEY",qt=N({__name:"mcp",async setup(M){let x,C;const S=pe(),j=S.public.demoMode,g=me(),{copy:A}=ge(),{data:_}=([x,C]=ae(()=>fe("/api/desktop/reporter-config",{immediate:g,default:()=>null},"$fdl6kilREP")),x=await x,C(),x),u=b(()=>_.value?.token??lt),q=Pe(),n=b(()=>`${_.value?.url??S.public.siteUrl??q.origin}/mcp`);ce({title:"MCP server — Piwi Dashboard"});const p=Se,y=qe,v=[{label:"Claude Code",slot:"claude-code"},{label:"Opencode",slot:"opencode"},{label:"Cursor",slot:"cursor"},{label:"VS Code",slot:"vscode"},{label:"Claude Desktop",slot:"claude-desktop"},{label:"Gemini CLI",slot:"gemini"},{label:"Windsurf / Continue",slot:"windsurf"}],h=b(()=>`claude mcp add --transport http piwi ${n.value} \\
|
|
6
|
+
--header "Authorization: Bearer ${u.value}"`),z=b(()=>JSON.stringify({mcp:{piwi:{type:"remote",url:n.value,headers:{Authorization:`Bearer ${u.value}`}}}},null,2)),o=b(()=>JSON.stringify({mcpServers:{piwi:{url:n.value,headers:{Authorization:`Bearer ${u.value}`}}}},null,2)),P=b(()=>JSON.stringify({servers:{piwi:{type:"http",url:n.value,headers:{Authorization:`Bearer ${u.value}`}}}},null,2)),H=b(()=>JSON.stringify({mcpServers:{piwi:{type:"http",url:n.value,headers:{Authorization:`Bearer ${u.value}`}}}},null,2)),W=b(()=>`gemini mcp add --transport http piwi ${n.value} \\
|
|
7
|
+
--header "Authorization: Bearer ${u.value}"`),V=b(()=>JSON.stringify({mcpServers:{piwi:{serverUrl:n.value,headers:{Authorization:`Bearer ${u.value}`}}}},null,2));return(J,t)=>{const Y=te,K=se,X=Ce,$=F,I=de,Q=le,R=G,L=E,Z=ee;return r(),w(Z,null,{header:d(()=>[a(Y,{title:"MCP server"})]),body:d(()=>[e("div",Re,[i(j)?(r(),w(K,{key:0,color:"info",icon:"i-lucide-bot",title:"Feature preview",description:"The MCP endpoint is not active in this demo — it requires a real Piwi backend. The tools and client setup shown below reflect what your own deployment exposes."})):f("",!0),a(X),a(R,{icon:"i-lucide-settings-2",title:"Client setup",help:"mcp.client-setup"},{default:d(()=>[i(_)?(r(),c("div",Ae,[e("div",Te,[t[2]||(t[2]=e("div",{class:"text-xs text-muted"},"MCP URL",-1)),e("div",De,[e("code",Ue,l(i(n)),1),a($,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy MCP URL",onClick:t[0]||(t[0]=m=>i(A)(i(n),{toast:!0}))})])]),e("div",Oe,[t[3]||(t[3]=e("div",{class:"text-xs text-muted"},"Access token",-1)),e("div",ze,[e("code",$e,l(i(u)),1),a($,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy access token",onClick:t[1]||(t[1]=m=>i(A)(i(u),{toast:!0}))})])]),t[4]||(t[4]=e("p",{class:"text-xs text-muted"},[s(" This app authenticates with a local access token even though sign-in is off — it is the "),e("code",{class:"font-mono"},"Bearer"),s(" value, already filled into the snippets below. ")],-1))])):f("",!0),e("p",Me,[i(_)?(r(),c(k,{key:0},[s("Pick your client below — the URL and access token above are already baked into each snippet.")],64)):(r(),c(k,{key:1},[t[5]||(t[5]=s("Replace ",-1)),t[6]||(t[6]=e("code",{class:"px-1 py-0.5 bg-muted rounded text-xs font-mono"},"pd_YOUR_API_KEY",-1)),t[7]||(t[7]=s(" with your actual API key. The MCP URL shown in the snippets is auto-detected from your current browser origin.",-1))],64))]),a(Q,{items:v,ui:{list:"mb-4"}},{"claude-code":d(()=>[e("div",Le,[t[8]||(t[8]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"}," Run once in any terminal. Claude Code stores the server in your global MCP config. ",-1)),a(I,{code:i(h),lang:"sh"},null,8,["code"]),t[9]||(t[9]=e("p",{class:"text-xs text-gray-400"},[s(" After adding, restart Claude Code and use "),e("code",{class:"font-mono"},"/mcp"),s(" to verify "),e("strong",null,"piwi"),s(" is connected. Claude will call the tools automatically when you ask about test results or failures. ")],-1))])]),opencode:d(()=>[e("div",Be,[t[10]||(t[10]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to "),e("code",{class:"font-mono text-xs"},"~/.config/opencode/opencode.json"),s(" (global config): ")],-1)),a(I,{code:i(z),lang:"json"},null,8,["code"]),t[11]||(t[11]=e("p",{class:"text-xs text-gray-400"}," Restart Opencode to pick up the new MCP server. Tools become available automatically in the next session. ",-1))])]),cursor:d(()=>[e("div",Ne,[t[12]||(t[12]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to "),e("code",{class:"font-mono text-xs"},"~/.cursor/mcp.json"),s(" (global) or "),e("code",{class:"font-mono text-xs"},".cursor/mcp.json"),s(" in your project root: ")],-1)),a(I,{code:i(o),lang:"json"},null,8,["code"]),t[13]||(t[13]=e("p",{class:"text-xs text-gray-400"}," Restart Cursor, then enable the MCP server in Cursor Settings → MCP. ",-1))])]),vscode:d(()=>[e("div",Ee,[t[14]||(t[14]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to "),e("code",{class:"font-mono text-xs"},".vscode/mcp.json"),s(" in your workspace (VS Code Copilot agent mode, version 1.99+): ")],-1)),a(I,{code:i(P),lang:"json"},null,8,["code"]),t[15]||(t[15]=e("p",{class:"text-xs text-gray-400"}," The server appears in the Copilot chat agent drop-down once the file is saved. ",-1))])]),"claude-desktop":d(()=>[e("div",Fe,[t[16]||(t[16]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Add to your Claude Desktop config file:",-1)),t[17]||(t[17]=e("ul",{class:"text-xs text-gray-400 space-y-0.5 mb-2"},[e("li",null,[e("strong",null,"macOS:"),e("code",{class:"font-mono"},"~/Library/Application Support/Claude/claude_desktop_config.json")]),e("li",null,[e("strong",null,"Windows:"),e("code",{class:"font-mono"},"%APPDATA%\\Claude\\claude_desktop_config.json")])],-1)),a(I,{code:i(H),lang:"json"},null,8,["code"]),t[18]||(t[18]=e("p",{class:"text-xs text-gray-400"}," Requires Claude Desktop with remote MCP support (released early 2025). Restart the app after saving. ",-1))])]),gemini:d(()=>[e("div",Ge,[t[19]||(t[19]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"Run once to register the server with Gemini CLI:",-1)),a(I,{code:i(W),lang:"sh"},null,8,["code"]),t[20]||(t[20]=e("p",{class:"text-xs text-gray-400"}," Gemini CLI fetches the tool list on startup and makes them available in agent mode. ",-1))])]),windsurf:d(()=>[e("div",He,[t[21]||(t[21]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[s(" Add to your Windsurf or Continue MCP config. For Windsurf: "),e("code",{class:"font-mono text-xs"},"~/.codeium/windsurf/mcp_config.json"),s(". For Continue: "),e("code",{class:"font-mono text-xs"},"~/.continue/config.json"),s(" under "),e("code",{class:"font-mono text-xs"},"mcpServers"),s(". ")],-1)),a(I,{code:i(V),lang:"json"},null,8,["code"])])]),_:1})]),_:1}),a(R,{icon:"i-lucide-bot",title:"What it provides",help:"mcp.tools"},{default:d(()=>[e("div",We,[(r(!0),c(k,null,O(i(p),m=>(r(),c("div",{key:m.name,class:"flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"},[a(L,{name:"i-lucide-wrench",class:"size-4 mt-0.5 shrink-0 text-primary"}),e("div",Ve,[e("p",Je,l(m.name),1),e("p",Ye,l(m.description),1)])]))),128))])]),_:1}),a(R,{icon:"i-lucide-sparkles",title:"Prompts"},{default:d(()=>[t[22]||(t[22]=e("p",{class:"text-sm text-gray-500 dark:text-gray-400 mb-4"},[s(" Prompts are ready-made instructions your MCP client offers as a slash command — nothing to install. "),e("code",{class:"font-mono"},"setup_piwi"),s(" is "),e("strong",null,"server-aware"),s(": it fills in this instance's URL, whether authentication is required, and the projects that already exist, then hands your agent a ready-to-run setup for a Playwright project that is not yet reporting here. ")],-1)),e("div",Ke,[(r(!0),c(k,null,O(i(y),m=>(r(),c("div",{key:m.name,class:"flex items-start gap-3 px-3 py-2.5 rounded-md bg-elevated/50 border border-default hover:bg-elevated transition-colors"},[a(L,{name:"i-lucide-square-slash",class:"size-4 mt-0.5 shrink-0 text-primary"}),e("div",Xe,[e("p",Qe,l(m.name),1),e("p",Ze,l(m.description),1),m.arguments?.length?(r(),c("div",et,[(r(!0),c(k,null,O(m.arguments,T=>(r(),c("code",{key:T.name,class:"px-1.5 py-0.5 rounded bg-muted text-[11px] font-mono",title:T.description},l(T.name)+l(T.required?"":"?"),9,tt))),128))])):f("",!0)])]))),128))])]),_:1}),a(R,{icon:"i-lucide-key",title:"Authentication",help:"mcp.auth"},{default:d(()=>[e("div",st,[t[27]||(t[27]=e("p",null,[s(" MCP requests are authenticated with the same API keys used by the REST API. API keys start with "),e("code",{class:"px-1 py-0.5 bg-muted rounded text-xs font-mono"},"pd_"),s(". ")],-1)),i(g)?(r(),c("p",it,[...t[24]||(t[24]=[s(" This app provides a local access token automatically — shown in ",-1),e("strong",null,"Client setup",-1),s(" above and already filled into every snippet, so there is nothing to replace. ",-1)])])):(r(),c("p",rt,[...t[23]||(t[23]=[s(" Generate a key in ",-1),e("strong",null,"Settings → Users → [your account] → API keys",-1),s(", then replace ",-1),e("code",{class:"px-1 py-0.5 bg-muted rounded text-xs font-mono"},"pd_YOUR_API_KEY",-1),s(" in the snippets above. ",-1)])])),i(g)?(r(),c("p",nt,[...t[26]||(t[26]=[s(" This desktop app keeps sign-in off but still requires its own local access token on every request — it is the ",-1),e("code",{class:"font-mono"},"Bearer",-1),s(" value. The endpoint is not open. ",-1)])])):(r(),c("p",ot,[...t[25]||(t[25]=[s(" When authentication is disabled (",-1),e("code",{class:"font-mono"},"PIWI_AUTH_ENABLED",-1),s(" not set), any request is accepted without a key. ",-1)])]))])]),_:1}),a(R,{icon:"i-lucide-link",title:"Server URL"},{default:d(()=>[e("div",at,[e("div",ct,[e("code",pt,l(i(n)),1),a($,{icon:"i-lucide-external-link",size:"sm",color:"neutral",variant:"outline",title:"Open API docs",to:"/docs",external:!i(j)},{default:d(()=>[...t[28]||(t[28]=[s(" REST API docs ",-1)])]),_:1},8,["external"])]),e("p",dt,[t[35]||(t[35]=s(" This is your Piwi instance's MCP endpoint. It is also the server URL to paste into client configs above. ",-1)),i(g)?(r(),c(k,{key:0},[t[29]||(t[29]=s("This desktop app requires its local access token as the ",-1)),t[30]||(t[30]=e("code",{class:"font-mono"},"Bearer",-1)),t[31]||(t[31]=s(" value on every request.",-1))],64)):(r(),c(k,{key:1},[t[32]||(t[32]=s("The server requires a valid Bearer token (or no auth if ",-1)),t[33]||(t[33]=e("code",{class:"font-mono"},"PIWI_AUTH_ENABLED",-1)),t[34]||(t[34]=s(" is not set).",-1))],64))])])]),_:1})])]),_:1})}}});export{qt as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{aq as s}from"./DCFbQvIN.js";let a=null;function i(){const t=s("ai-status",()=>null);async function u(){t.value===null&&(a||(a=$fetch("/api/ai/status").catch(()=>({configured:!1}))),t.value=await a)}return u(),{aiStatus:t}}export{i as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as P,Y as L,Z as O,U as j,o as r,c as v,j as C,g as f,V as q,k as e,W as z,S as M,C as D,X as I,f as u,v as h,F as
|
|
1
|
+
import{d as P,Y as L,Z as O,U as j,o as r,c as v,j as C,g as f,V as q,k as e,W as z,S as M,C as D,X as I,f as u,v as h,F as T,h as w,$ as H,a2 as W,a3 as X,a5 as Y,a6 as Z,a7 as G,aO as J,aP as Q,at as ee,i as ae,q as o,p as S,m as R,t as A,a8 as te}from"./DCFbQvIN.js";import{L as se}from"./NERLHpOL.js";import{u as re}from"./CIEceDOw.js";import{u as le}from"./Vxyo_mU9.js";import{V as ie}from"./CTD_pJ_v.js";const[oe,ne]=H("SwitchRoot");var de=P({inheritAttrs:!1,__name:"SwitchRoot",props:{defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},disabled:{type:Boolean,required:!1},id:{type:String,required:!1},value:{type:String,required:!1,default:"on"},trueValue:{type:null,required:!1,default:()=>!0},falseValue:{type:null,required:!1,default:()=>!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue"],setup(g,{emit:c}){const t=g,d=c,{disabled:n}=L(t),a=O(t,"modelValue",d,{defaultValue:t.defaultValue??t.falseValue,passive:t.modelValue===void 0}),i=w(()=>a.value===t.trueValue);function m(){n.value||(a.value=i.value?t.falseValue:t.trueValue)}const{forwardRef:V,currentElement:b}=j(),x=re(b),k=le(),_=w(()=>t.id&&b.value?document.querySelector(`[for="${t.id}"]`)?.innerText:void 0);return ne({checked:i,toggleCheck:m,disabled:n}),(s,B)=>(r(),v(T,null,[C(e(I),z({id:s.id,ref:e(V),role:"switch",type:s.as==="button"?"button":void 0,value:s.value,"aria-label":s.$attrs["aria-label"]||_.value,"aria-checked":i.value,"aria-required":s.required,"data-state":i.value?"checked":"unchecked","data-disabled":e(n)?"":void 0,"as-child":s.asChild,as:s.as,disabled:e(n)},{...e(k),...s.$attrs},{onClick:m,onKeydown:M(D(m,["prevent"]),["enter"])}),{default:f(()=>[q(s.$slots,"default",{modelValue:e(a),checked:i.value})]),_:3},16,["id","type","value","aria-label","aria-checked","aria-required","data-state","data-disabled","as-child","as","disabled","onKeydown"]),e(x)&&s.name?(r(),u(e(ie),z({key:0,type:"checkbox",name:s.name,disabled:e(n),required:s.required,value:s.value,checked:i.value},e(k)),null,16,["name","disabled","required","value","checked"])):h("v-if",!0)],64))}}),ue=de,ce=P({__name:"SwitchThumb",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(g){const c=oe();return j(),(t,d)=>(r(),u(e(I),{"data-state":e(c).checked.value?"checked":"unchecked","data-disabled":e(c).disabled.value?"":void 0,"as-child":t.asChild,as:t.as},{default:f(()=>[q(t.$slots,"default")]),_:3},8,["data-state","data-disabled","as-child","as"]))}}),pe=ce;const he={slots:{root:"relative flex items-start",base:["inline-flex items-center shrink-0 rounded-full border-2 border-transparent focus-visible:outline-3 data-[state=unchecked]:bg-accented","transition-[background] duration-200"],container:"flex items-center",thumb:"group pointer-events-none rounded-full bg-default shadow-lg ring-0 transition-transform duration-200 data-[state=unchecked]:translate-x-0 data-[state=unchecked]:rtl:-translate-x-0 flex items-center justify-center",icon:["absolute shrink-0 group-data-[state=unchecked]:text-dimmed opacity-0 size-10/12","transition-[color,opacity] duration-200"],wrapper:"ms-2",label:"block font-medium text-default",description:"text-muted"},variants:{color:{primary:{base:"data-[state=checked]:bg-primary outline-primary/25",icon:"group-data-[state=checked]:text-primary"},secondary:{base:"data-[state=checked]:bg-secondary outline-secondary/25",icon:"group-data-[state=checked]:text-secondary"},success:{base:"data-[state=checked]:bg-success outline-success/25",icon:"group-data-[state=checked]:text-success"},info:{base:"data-[state=checked]:bg-info outline-info/25",icon:"group-data-[state=checked]:text-info"},warning:{base:"data-[state=checked]:bg-warning outline-warning/25",icon:"group-data-[state=checked]:text-warning"},error:{base:"data-[state=checked]:bg-error outline-error/25",icon:"group-data-[state=checked]:text-error"},neutral:{base:"data-[state=checked]:bg-inverted outline-inverted/25",icon:"group-data-[state=checked]:text-highlighted"}},size:{xs:{base:"w-7",container:"h-4",thumb:"size-3 data-[state=checked]:translate-x-3 data-[state=checked]:rtl:-translate-x-3",wrapper:"text-xs"},sm:{base:"w-8",container:"h-4",thumb:"size-3.5 data-[state=checked]:translate-x-3.5 data-[state=checked]:rtl:-translate-x-3.5",wrapper:"text-xs"},md:{base:"w-9",container:"h-5",thumb:"size-4 data-[state=checked]:translate-x-4 data-[state=checked]:rtl:-translate-x-4",wrapper:"text-sm"},lg:{base:"w-10",container:"h-5",thumb:"size-4.5 data-[state=checked]:translate-x-4.5 data-[state=checked]:rtl:-translate-x-4.5",wrapper:"text-sm"},xl:{base:"w-11",container:"h-6",thumb:"size-5 data-[state=checked]:translate-x-5 data-[state=checked]:rtl:-translate-x-5",wrapper:"text-base"}},checked:{true:{icon:"group-data-[state=checked]:opacity-100"}},unchecked:{true:{icon:"group-data-[state=unchecked]:opacity-100"}},loading:{true:{icon:"animate-spin"}},highlight:{true:""},required:{true:{label:"after:content-['*'] after:ms-0.5 after:text-error"}},disabled:{true:{root:"opacity-75",base:"cursor-not-allowed",label:"cursor-not-allowed",description:"cursor-not-allowed"}}},compoundVariants:[{color:"primary",highlight:!0,class:{base:"ring ring-primary"}},{color:"secondary",highlight:!0,class:{base:"ring ring-secondary"}},{color:"success",highlight:!0,class:{base:"ring ring-success"}},{color:"info",highlight:!0,class:{base:"ring ring-info"}},{color:"warning",highlight:!0,class:{base:"ring ring-warning"}},{color:"error",highlight:!0,class:{base:"ring ring-error"}},{color:"neutral",highlight:!0,class:{base:"ring ring-inverted"}}],defaultVariants:{color:"primary",size:"md"}},ye=Object.assign({inheritAttrs:!1},{__name:"USwitch",props:{as:{type:null,required:!1},color:{type:null,required:!1},size:{type:null,required:!1},highlight:{type:Boolean,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},checkedIcon:{type:null,required:!1},uncheckedIcon:{type:null,required:!1},label:{type:String,required:!1},description:{type:String,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},id:{type:String,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1},value:{type:String,required:!1},defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1},trueValue:{type:null,required:!1},falseValue:{type:null,required:!1}},emits:["change","update:modelValue"],setup(g,{emit:c}){const t=g,d=W(),n=c,a=X("switch",t),i=Y(),m=Z(G(a,"required","value","defaultValue","modelValue","trueValue","falseValue"),n),{id:V,emitFormChange:b,emitFormInput:x,size:k,color:_,highlight:s,name:B,disabled:F,ariaAttrs:E}=J(t),$=V.value??Q(),N=ee(),U=w(()=>{const{"data-state":p,...y}=N;return y}),l=w(()=>te({extend:he,...i.ui?.switch||{}})({size:k.value??a.size,color:_.value??a.color,highlight:s.value??a.highlight,required:a.required,loading:a.loading,disabled:F.value||a.loading}));function K(p){const y=new Event("change",{target:{value:p}});n("change",y),b(),x()}return(p,y)=>(r(),u(e(I),{as:e(a).as,"data-slot":p.$attrs["data-slot"]??"root",class:o(l.value.root({class:[e(a).ui?.root,e(a).class]}))},{default:f(()=>[ae("div",{"data-slot":"container",class:o(l.value.container({class:e(a).ui?.container}))},[C(e(ue),z({id:e($)},{...e(m),...U.value,...e(E)},{name:e(B),disabled:e(F)||e(a).loading,"data-slot":"base",class:l.value.base({class:e(a).ui?.base}),"onUpdate:modelValue":K}),{default:f(()=>[C(e(pe),{"data-slot":"thumb",class:o(l.value.thumb({class:e(a).ui?.thumb}))},{default:f(()=>[e(a).loading?(r(),u(S,{key:0,name:e(a).loadingIcon||e(i).ui.icons.loading,"data-slot":"icon",class:o(l.value.icon({class:e(a).ui?.icon,checked:!0,unchecked:!0}))},null,8,["name","class"])):(r(),v(T,{key:1},[e(a).checkedIcon?(r(),u(S,{key:0,name:e(a).checkedIcon,"data-slot":"icon",class:o(l.value.icon({class:e(a).ui?.icon,checked:!0}))},null,8,["name","class"])):h("",!0),e(a).uncheckedIcon?(r(),u(S,{key:1,name:e(a).uncheckedIcon,"data-slot":"icon",class:o(l.value.icon({class:e(a).ui?.icon,unchecked:!0}))},null,8,["name","class"])):h("",!0)],64))]),_:1},8,["class"])]),_:1},16,["id","name","disabled","class"])],2),e(a).label||d.label||e(a).description||d.description?(r(),v("div",{key:0,"data-slot":"wrapper",class:o(l.value.wrapper({class:e(a).ui?.wrapper}))},[e(a).label||d.label?(r(),u(e(se),{key:0,for:e($),"data-slot":"label",class:o(l.value.label({class:e(a).ui?.label}))},{default:f(()=>[q(p.$slots,"label",{label:e(a).label},()=>[R(A(e(a).label),1)])]),_:3},8,["for","class"])):h("",!0),e(a).description||d.description?(r(),v("p",{key:1,"data-slot":"description",class:o(l.value.description({class:e(a).ui?.description}))},[q(p.$slots,"description",{description:e(a).description},()=>[R(A(e(a).description),1)])],2)):h("",!0)],2)):h("",!0)]),_:3},8,["as","data-slot","class"]))}});export{ye as _};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{x as U,y as g,z as q,A as Q,B as Z,D as ee,E as V,X as te,C as ne,c as E,d as ae,i as re,e as se,F as $,j as ie,G as R,f as Y,g as X,k as oe,r as O,n as P,s as T,l as W,H as z,I,J as le,K as ce,p as ue,t as he,P as de,v as ye}from"./
|
|
1
|
+
import{x as U,y as g,z as q,A as Q,B as Z,D as ee,E as V,X as te,C as ne,c as E,d as ae,i as re,e as se,F as $,j as ie,G as R,f as Y,g as X,k as oe,r as O,n as P,s as T,l as W,H as z,I,J as le,K as ce,p as ue,t as he,P as de,v as ye}from"./CMYAryzi.js";import{d as fe,an as pe,B as ve,L as ge,ad as me,J,o as ke,c as xe,h as be,r as Se}from"./DCFbQvIN.js";function Ae(p,n,e){var r=null,s=g(!0),l=null,o=q,c=null,m=U(a);p=typeof p=="function"?p:p===void 0?Q:g(+p),n=typeof n=="function"?n:n===void 0?g(0):g(+n),e=typeof e=="function"?e:e===void 0?Z:g(+e);function a(t){var u,x,h,d=(t=ee(t)).length,f,v=!1,b,i=new Array(d),y=new Array(d);for(l==null&&(c=o(b=m())),u=0;u<=d;++u){if(!(u<d&&s(f=t[u],u,t))===v)if(v=!v)x=u,c.areaStart(),c.lineStart();else{for(c.lineEnd(),c.lineStart(),h=u-1;h>=x;--h)c.point(i[h],y[h]);c.lineEnd(),c.areaEnd()}v&&(i[u]=+p(f,u,t),y[u]=+n(f,u,t),c.point(r?+r(f,u,t):i[u],e?+e(f,u,t):y[u]))}if(b)return c=null,b+""||null}function k(){return V().defined(s).curve(o).context(l)}return a.x=function(t){return arguments.length?(p=typeof t=="function"?t:g(+t),r=null,a):p},a.x0=function(t){return arguments.length?(p=typeof t=="function"?t:g(+t),a):p},a.x1=function(t){return arguments.length?(r=t==null?null:typeof t=="function"?t:g(+t),a):r},a.y=function(t){return arguments.length?(n=typeof t=="function"?t:g(+t),e=null,a):n},a.y0=function(t){return arguments.length?(n=typeof t=="function"?t:g(+t),a):n},a.y1=function(t){return arguments.length?(e=t==null?null:typeof t=="function"?t:g(+t),a):e},a.lineX0=a.lineY0=function(){return k().x(p).y(n)},a.lineY1=function(){return k().x(p).y(e)},a.lineX1=function(){return k().x(r).y(n)},a.defined=function(t){return arguments.length?(s=typeof t=="function"?t:g(!!t),a):s},a.curve=function(t){return arguments.length?(o=t,l!=null&&(c=o(l)),a):o},a.context=function(t){return arguments.length?(t==null?l=c=null:c=o(l=t),a):l},a}const De=Object.assign(Object.assign({},te),{color:void 0,curveType:ne.MonotoneX,baseline:()=>0,opacity:1,cursor:null,line:!1,lineColor:void 0,lineWidth:2,lineDashArray:void 0,minHeight1Px:!1,minHeight:void 0,stackMinHeight:!1}),K=E`
|
|
2
2
|
label: area-component;
|
|
3
3
|
`,Ce=re`
|
|
4
4
|
:root {
|
|
@@ -15,7 +15,7 @@ import{x as U,y as g,z as q,A as Q,B as Z,D as ee,E as V,X as te,C as ne,c as E,
|
|
|
15
15
|
--vis-dark-area-stroke-color: none;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
${ae} ${`.${
|
|
18
|
+
${ae} ${`.${K}`} {
|
|
19
19
|
--vis-area-fill-opacity: 0.5;
|
|
20
20
|
--vis-area-stroke-color: var(--vis-dark-area-stroke-color);
|
|
21
21
|
}
|
|
@@ -38,4 +38,4 @@ import{x as U,y as g,z as q,A as Q,B as Z,D as ee,E as V,X as te,C as ne,c as E,
|
|
|
38
38
|
fill: none;
|
|
39
39
|
stroke-dasharray: var(--vis-line-stroke-dasharray);
|
|
40
40
|
stroke-dashoffset: var(--vis-line-stroke-dashoffset);
|
|
41
|
-
`,Me=Object.freeze(Object.defineProperty({__proto__:null,area:w,areaLinePath:B,globalStyles:Ce,root:
|
|
41
|
+
`,Me=Object.freeze(Object.defineProperty({__proto__:null,area:w,areaLinePath:B,globalStyles:Ce,root:K},Symbol.toStringTag,{value:"Module"}));class H extends se{constructor(n){super(),this._defaultConfig=De,this.config=this._defaultConfig,this.stacked=!0,this.events={[H.selectors.area]:{}},n&&this.setConfig(n),this.stacked=Array.isArray(this.config.y)}get bleed(){const{config:{line:n,lineWidth:e}}=this;if(!n)return{top:0,bottom:0,left:0,right:0};const r=this.yScale.domain(),l=(this.yScale.range()[0]>this.yScale.range()[1]?$.North:$.South)===$.South,o=e>3,c=e>=10;return{top:!c&&(!l&&r[1]===0||l&&r[0]===0)?0:e/2,bottom:!c&&(!l&&r[0]===0||l&&r[1]===0)?0:e/2,left:o?e/2:0,right:o?e/2:0}}_render(n){super._render(n);const{config:e,datamodel:{data:r}}=this,s=ie(n)?n:e.duration,l=R[e.curveType];this._areaGen=Ae().x(i=>i.x).y0(i=>i.y0).y1(i=>i.y1).curve(l);const o=Y(e.y)?e.y:[e.y],c=r.map((i,y)=>this.xScale(X(i,e.x,y))),m=oe(r,e.baseline,o,this._prevNegative);this._prevNegative=m.map(i=>!!i.isMostlyNegative);const a=this.yScale.range(),k=Math.min(a[0],a[1]),t=Math.max(a[0],a[1]),u=[],x=m.map(i=>i.map((y,A)=>{var S,D;const F=c[A],L=O(this.yScale(y[0]),k,t),j=O(this.yScale(y[1]),k,t),G=j>L,C=e.stackMinHeight&&u[A]||0,N=G?L+C:L-C,M=G?j+C:j-C;let _=0;return(e.minHeight||e.minHeight1Px)&&Math.abs(M-N)<((S=e.minHeight)!==null&&S!==void 0?S:1)&&(_=((D=e.minHeight)!==null&&D!==void 0?D:1)-Math.abs(M-N),e.stackMinHeight&&(u[A]=C+_)),{x:F,y0:N,y1:G?M+_:M-_}})),h=x.length-1,d=[...x].reverse(),f=this.g.selectAll(`.${w}`).data(d),v=f.enter().append("path").attr("class",w).attr("d",i=>this._areaGen(i)||this._emptyPath()).style("opacity",0).style("fill",(i,y)=>P(r,e.color,h-y)),b=T(v.merge(f),s).style("opacity",(i,y)=>i.some(S=>S.y0-S.y1!==0)?X(r,e.opacity,h-y):0).style("fill",(i,y)=>P(r,e.color,h-y)).style("cursor",(i,y)=>W(r,e.cursor,h-y));s?b.attrTween("d",(y,A,S)=>{const D=z(S[A]).attr("d"),F=this._areaGen(y)||this._emptyPath();return I(D,F)}):b.attr("d",i=>this._areaGen(i)||this._emptyPath()),T(f.exit(),s).style("opacity",0).remove(),this._renderLines(s,e.line?x:[])}_renderLines(n,e){var r;const{config:s,datamodel:{data:l}}=this,o=e.length-1,c=[...e].reverse(),m=(r=s.lineColor)!==null&&r!==void 0?r:s.color,a=this.g.selectAll(`.${B}`).data(c),k=this.g.selectAll(`.${w}`).nodes(),t=a.enter().insert("path",(h,d)=>k[d+1]).attr("class",B).attr("stroke",(h,d)=>P(l,m,o-d)).attr("stroke-width",s.lineWidth).attr("stroke-opacity",0),u=T(t.merge(a),n).attr("stroke",(h,d)=>P(l,m,o-d)).attr("stroke-width",s.lineWidth).attr("stroke-opacity",1).attr("cursor",(h,d)=>W(l,s.cursor,o-d)).style("stroke-dasharray",(h,d)=>{var f,v;return(v=(f=le(l,s.lineDashArray,d))===null||f===void 0?void 0:f.join(" "))!==null&&v!==void 0?v:null}),x=R[s.curveType];this._lineGen=V().x(h=>h.x).y(h=>h.y1).curve(x),n?u.attrTween("d",(d,f,v)=>{const b=z(v[f]).attr("d")||this._emptyLinePath(),i=this._lineGen(d)||this._emptyLinePath();return I(b,i)}):u.attr("d",h=>this._lineGen(h)||this._emptyLinePath()),T(a.exit(),n).style("opacity",0).remove()}getYDataExtent(n){const{config:e,datamodel:r}=this,s=Y(e.y)?e.y:[e.y],l=this.xScale.domain(),o=n?ce(r.data,l,e.x,!0):r.data;return ue(o,e.baseline,...s)}_emptyPath(){const n=this.xScale.range(),e=this.yScale.domain(),r=this.yScale((e[0]+e[1])/2),s=r;return this._areaGen([{y0:r,y1:s,x:n[0]},{y0:r,y1:s,x:n[1]}])}_emptyLinePath(){const n=this.xScale.range(),e=this.yScale.range();return`M${n[0]},${e[0]} L${n[1]},${e[0]}`}}H.selectors=Me;const _e={"data-vis-component":""},we=fe({__name:"index",props:{color:{type:[Function,String,Array,null]},curveType:{},baseline:{type:[Function,Number,null]},opacity:{type:[Function,Number,null]},cursor:{type:[Function,String,null]},line:{type:Boolean},lineColor:{type:[Function,String,Array,null]},lineWidth:{},lineDashArray:{type:[Function,Array,null]},minHeight1Px:{type:Boolean},minHeight:{},stackMinHeight:{type:Boolean},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(p,{expose:n}){const e=pe(he),r=p,s=be(()=>e.data.value??r.data),l=de(r),o=Se();return ve(()=>{ge(()=>{o.value=new H(l.value),o.value?.setData(s.value),e.update(o.value)})}),me(()=>{o.value?.destroy(),e.destroy()}),J(l,(c,m)=>{ye(c,m)||(o.value?.setConfig(l.value),o.value?.render())}),J(s,()=>{o.value?.setData(s.value)}),n({component:o}),(c,m)=>(ke(),xe("div",_e))}});export{we as N};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as r,o as s,c as l,i as n,V as o,m as i,t,q as c,v as d}from"./DCFbQvIN.js";const m={class:"rounded-lg bg-gray-50 dark:bg-gray-900 p-3 min-w-0"},u={class:"text-xs font-medium text-gray-500 uppercase tracking-wider inline-flex items-center gap-1 max-w-full"},g={key:0,class:"text-xs text-gray-400 mt-1"},x=r({__name:"StatTile",props:{label:{},value:{},hint:{},size:{default:"lg"},valueClass:{default:""}},setup(e){return(a,f)=>(s(),l("div",m,[n("p",u,[o(a.$slots,"label",{},()=>[i(t(e.label),1)])]),n("p",{class:c(["mt-0.5 break-words",[e.size==="lg"?"text-xl font-bold":"text-sm font-semibold",e.valueClass]])},[o(a.$slots,"default",{},()=>[i(t(e.value??"—"),1)])],2),e.hint?(s(),l("p",g,t(e.hint),1)):d("",!0)]))}}),h=Object.assign(x,{__name:"StatTile"});export{h as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as ut,a as dt}from"./9ti9eNH9.js";import{_ as mt,a as pt}from"./BpM6ZPIG.js";import{_ as _t}from"./COhdybDy.js";import{_ as ft,a as gt}from"./DQM62mxB.js";import{d as yt,e as xt,b as bt,c as l,j as o,g as s,F as R,D as vt,o as a,i as c,E as ht,m as d,y as P,f as m,_ as kt,v as _,t as y,k as i,G as jt,h as N,r as x,M as Rt}from"./DCFbQvIN.js";import{_ as $t}from"./B-zdP-D4.js";import{_ as Ct}from"./DfSBKzrC.js";import{_ as Tt}from"./DL24AjfW.js";import{_ as Pt}from"./CtstIQSh.js";import{_ as Nt}from"./CLVWiCds.js";import{_ as Ut}from"./CTP8Pw0-.js";import{_ as Dt}from"./gV2U_Gqd.js";import{_ as Ft}from"./tQoyVPCE.js";import{_ as St}from"./D_eDAIsT.js";import{_ as Bt}from"./DKFXZdWZ.js";import{_ as Kt}from"./DON74Yh6.js";import{_ as Lt}from"./oKrbs1XK.js";import{p as Vt,i as b}from"./BAKUqW95.js";import{u as w}from"./E-_n_6vi.js";import{o as wt,s as U}from"./DGnQ69wW.js";import"./C2hNxjjz.js";import"./BjaRappk.js";import"./Ebw5l7n8.js";import"./D-c8ZSws.js";import"./DqEOMteW.js";import"./zv8WdMx0.js";import"./NERLHpOL.js";import"./B1RmmOsM.js";import"./RAdNGxcF.js";import"./CIEceDOw.js";import"./CTD_pJ_v.js";const zt={class:"flex flex-wrap items-center gap-3 mb-4"},Ht={key:0,class:"flex flex-wrap items-center gap-2"},At={class:"text-sm text-muted shrink-0 inline-flex items-center gap-1"},It=["onClick"],Mt={class:"flex flex-col gap-1"},Ot={class:"flex items-center gap-2"},qt={key:0,class:"flex flex-wrap gap-1"},Et={key:0,class:"text-xs text-gray-600 italic"},Gt={key:1},Qt={key:0,class:"text-xs text-gray-600"},Xt={key:1,class:"text-xs text-gray-600 italic"},Jt={key:0,class:"flex items-center gap-1 flex-wrap"},Wt={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Yt={key:1,class:"text-xs text-gray-500"},Zt={key:1,class:"text-xs text-gray-600 italic"},te={key:1,class:"text-xs text-gray-600 italic"},ee={key:1,class:"text-xs text-gray-600 italic"},ae={class:"flex justify-end gap-2"},se={key:1,class:"space-y-2","aria-busy":"true"},oe={key:2,class:"text-center py-12 text-gray-500"},ne={class:"text-xs text-gray-400 max-w-sm"},le={class:"flex w-full justify-end gap-2"},ze=yt({__name:"index",setup(re){xt({title:"Projects — Piwi Dashboard"});const{data:v,refresh:D,status:z}=w("/api/projects",{key:"projects",lazy:!0,default:()=>[]},"$AIGg5yw_0K"),{data:H,refresh:A}=w("/api/tags",{lazy:!0},"$qcllBXh9C_"),F=bt(),$=N(()=>H.value?.tags||[]),I=N(()=>z.value==="pending"&&!v.value?.length),h=x(""),u=x([]),S=N(()=>{let n=v.value||[];if(h.value.trim()){const e=h.value.trim().toLowerCase();n=n.filter(p=>(p.label||p.name).toLowerCase().includes(e)||p.name.toLowerCase().includes(e))}return u.value.length>0&&(n=n.filter(e=>u.value.some(p=>(e.tags||[]).some(T=>T.id===p)))),n});function M(n){const e=u.value.indexOf(n);e===-1?u.value.push(n):u.value.splice(e,1)}function O(n){return u.value.includes(n)}const f=x(!1),q=wt({name:U().min(1,"Project name is required").max(100),label:U().optional(),description:U().optional()}),r=Rt({name:"",label:"",description:""}),k=x([]),C=x(!1);async function E(){if(r.name?.trim())try{C.value=!0,await $fetch("/api/projects",{method:"POST",body:{name:r.name.trim(),label:r.label?.trim()||null,description:r.description?.trim()||null,tagIds:k.value.map(n=>n.id)}}),F.add({title:"Project created",description:`Project "${r.name}" has been created`,color:"success"}),f.value=!1,r.name="",r.label="",r.description="",k.value=[],await D()}catch(n){const e=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;F.add({title:"Failed to create project",description:e||"An error occurred",color:"error"})}finally{C.value=!1}}const G=[{header:"Project",columns:[{accessorKey:"name",header:b("Name")},{accessorKey:"totalRuns",header:b("Runs")}]},{accessorKey:"latestRunData",header:"Latest run",columns:[{accessorKey:"latestRun",header:b("Date")},{accessorKey:"branch",header:"Branch"},{accessorKey:"duration",header:b("Duration")},{accessorKey:"status",header:b("Status")},{accessorKey:"testRatio",header:"Test status"},{accessorKey:"report",header:"Reports"}]},{accessorKey:"actions",header:"Project actions"}];return(n,e)=>{const p=ut,T=dt,B=mt,Q=_t,X=gt,J=ht,K=$t,g=kt,L=jt,W=Ct,Y=Tt,Z=Pt,tt=Nt,et=Ut,at=Dt,V=Ft,st=pt,ot=St,nt=ft,lt=Bt,rt=Kt,it=Lt,ct=vt;return a(),l(R,null,[o(nt,{id:"projects"},{header:s(()=>[o(X,null,{leading:s(()=>[o(p),o(T,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects"}]})]),right:s(()=>[o(Q,{actions:[{label:"New project",icon:"i-lucide-plus",onClick:()=>f.value=!0},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>i(D)()}]},{leading:s(()=>[o(B,{topic:"projects.table",size:"sm"})]),_:1},8,["actions"])]),_:1})]),body:s(()=>[c("div",zt,[o(J,{modelValue:h.value,"onUpdate:modelValue":e[0]||(e[0]=t=>h.value=t),icon:"i-lucide-search",placeholder:"Search projects by name...",class:"min-w-48 flex-1",ui:{base:"w-full"}},null,8,["modelValue"]),$.value.length>0?(a(),l("div",Ht,[c("span",At,[e[10]||(e[10]=d(" Filter by tag (any match): ",-1)),o(B,{topic:"projects.tag-filter"})]),(a(!0),l(R,null,P($.value,t=>(a(),l("button",{key:t.id,type:"button",class:"cursor-pointer focus:outline-none",onClick:j=>M(t.id)},[o(K,{text:t.text,color:t.color,variant:O(t.id)?"solid":"outline"},null,8,["text","color","variant"])],8,It))),128)),u.value.length>0?(a(),m(g,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filters",onClick:e[1]||(e[1]=t=>u.value=[])})):_("",!0)])):_("",!0)]),S.value.length>0?(a(),m(at,{key:0,"min-width":"60rem",bleed:!1},{default:s(()=>[o(et,{data:S.value,columns:G,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"name-cell":s(({row:t})=>[c("div",Mt,[c("div",Ot,[o(L,{to:`/projects/${t.original.id}`,class:"text-primary hover:underline font-medium"},{default:s(()=>[d(y(t.original.label||t.original.name),1)]),_:2},1032,["to"])]),t.original.tags?.length?(a(),l("div",qt,[(a(!0),l(R,null,P(t.original.tags,j=>(a(),m(K,{key:j.id,text:j.text,color:j.color},null,8,["text","color"]))),128))])):_("",!0)])]),"totalRuns-cell":s(({row:t})=>[t.original.totalRuns===0?(a(),l("span",Et,"No data")):(a(),l("span",Gt,y(t.original.totalRuns)+" runs",1))]),"latestRun-cell":s(({row:t})=>[t.original.latestRun?(a(),l("span",Qt,y(("prettyDateFormat"in n?n.prettyDateFormat:i(Vt))(t.original.latestRun.startTime)),1)):(a(),l("span",Xt,"No data"))]),"branch-cell":s(({row:t})=>[t.original.latestRun?.metadata?.scm?(a(),l("div",Jt,[t.original.latestRun.metadata.scm.branch?(a(),l("span",Wt,y(t.original.latestRun.metadata.scm.branch),1)):_("",!0),t.original.latestRun.metadata.scm.commit?(a(),l("code",Yt,y(t.original.latestRun.metadata.scm.commit.substring(0,7)),1)):_("",!0)])):_("",!0)]),"duration-cell":s(({row:t})=>[t.original.latestRun?.duration!=null?(a(),m(W,{key:0,ms:t.original.latestRun.duration,class:"text-sm text-gray-600"},null,8,["ms"])):(a(),l("span",Zt,"No data"))]),"status-cell":s(({row:t})=>[t.original.latestRun?(a(),m(Y,{key:0,status:t.original.latestRun.status},null,8,["status"])):(a(),l("span",te,"No data"))]),"testRatio-cell":s(({row:t})=>[t.original.latestRun?(a(),m(Z,{key:0,passed:t.original.latestRun.passedTests,failed:t.original.latestRun.failedTests,skipped:t.original.latestRun.skippedTests,flaky:t.original.latestRun.flakyTests,"did-not-run":t.original.latestRun.didNotRunTests??0,total:t.original.latestRun.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"])):(a(),l("span",ee,"No data"))]),"report-cell":s(({row:t})=>[t.original.latestRun?(a(),m(tt,{key:0,reports:t.original.latestRun.reports},null,8,["reports"])):_("",!0)]),"actions-header":s(()=>[...e[11]||(e[11]=[c("div",{class:"text-right"},"Project actions",-1)])]),"actions-cell":s(({row:t})=>[c("div",ae,[o(g,{to:`/projects/${t.original.id}`,size:"sm",variant:"outline"},{default:s(()=>[...e[12]||(e[12]=[d("View details",-1)])]),_:1},8,["to"]),o(g,{to:`/projects/${t.original.id}/edit`,size:"sm",variant:"ghost",icon:"i-lucide-pencil"},null,8,["to"])])]),_:1},8,["data"])]),_:1})):I.value?(a(),l("div",se,[e[13]||(e[13]=c("span",{class:"sr-only",role:"status"},"Loading projects…",-1)),o(V,{class:"h-10 w-full rounded-lg"}),(a(),l(R,null,P(6,t=>o(V,{key:t,class:"h-14 w-full rounded-lg"})),64))])):i(v)&&i(v).length>0?(a(),l("div",oe,[...e[14]||(e[14]=[c("p",{class:"text-lg mb-2"},"No projects match your search",-1),c("p",{class:"text-sm"},"Try adjusting your search or filters",-1)])])):(a(),m(ot,{key:3,icon:"i-lucide-rocket",text:"No projects yet"},{default:s(()=>[c("p",ne,[e[17]||(e[17]=d(" Projects are created automatically once the reporter submits its first run — see the ",-1)),o(L,{to:"/",class:"text-primary hover:underline"},{default:s(()=>[...e[15]||(e[15]=[d("home page",-1)])]),_:1}),e[18]||(e[18]=d(" for a copy-paste setup snippet, or the ",-1)),o(st,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:s(()=>[...e[16]||(e[16]=[d("reporter docs",-1)])]),_:1}),e[19]||(e[19]=d(". ",-1))]),o(g,{icon:"i-lucide-plus",label:"New project",variant:"ghost",size:"sm",class:"mt-2",onClick:e[2]||(e[2]=t=>f.value=!0)})]),_:1}))]),_:1}),o(ct,null,{default:s(()=>[o(it,{open:f.value,title:"Create new project","onUpdate:open":e[9]||(e[9]=t=>f.value=t)},{body:s(()=>[o(rt,{schema:i(q),state:i(r)},{default:s(()=>[o(lt,{mode:"create",name:i(r).name,"onUpdate:name":e[3]||(e[3]=t=>i(r).name=t),label:i(r).label,"onUpdate:label":e[4]||(e[4]=t=>i(r).label=t),description:i(r).description,"onUpdate:description":e[5]||(e[5]=t=>i(r).description=t),tags:k.value,"onUpdate:tags":e[6]||(e[6]=t=>k.value=t),"all-tags":$.value,onTagCreated:e[7]||(e[7]=t=>i(A)())},null,8,["name","label","description","tags","all-tags"])]),_:1},8,["schema","state"])]),footer:s(()=>[c("div",le,[o(g,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[8]||(e[8]=t=>f.value=!1)}),o(g,{label:"Create project",icon:"i-lucide-plus",loading:C.value,onClick:E},null,8,["loading"])])]),_:1},8,["open"])]),_:1})],64)}}});export{ze as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as m}from"./
|
|
1
|
+
import{_ as m}from"./Chpah_7l.js";import{d,o as t,c as r,R as l,i as n,j as s,t as a,s as x,g as k,m as u,v as o}from"./DCFbQvIN.js";const g={class:"p-2 text-sm text-gray-900 dark:text-gray-100 space-y-1"},_={class:"text-xs text-muted"},y={key:0,class:"text-xs"},h={key:1,class:"text-xs text-muted"},p=d({__name:"ChartMarkerTooltip",props:{marker:{},pos:{}},setup(e){return(v,f)=>{const c=m,i=x;return e.marker?(t(),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:l({left:`${e.pos.x}px`,top:`${e.pos.y}px`})},[n("div",g,[s(c,{marker:e.marker},null,8,["marker"]),n("div",_,a(new Date(e.marker.occurredAt).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),e.marker.environment?(t(),r("div",y,[s(i,{color:"neutral",variant:"subtle",size:"xs"},{default:k(()=>[u(a(e.marker.environment),1)]),_:1})])):o("",!0),e.marker.description?(t(),r("p",h,a(e.marker.description),1)):o("",!0)])],4)):o("",!0)}}}),B=Object.assign(p,{__name:"ChartMarkerTooltip"});export{B as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as B}from"./
|
|
1
|
+
import{a as B}from"./9ti9eNH9.js";import{d as $,o,c as w,j as m,ac as x,y as N,g as d,V as _,a0 as y,a1 as S,i as u,k as s,f as p,_ as V,v as h,m as U,t as z,F as C,h as c,ar as P,p as j}from"./DCFbQvIN.js";const D={class:"flex min-w-0 items-center gap-1 sm:hidden"},F={class:"truncate text-sm font-medium"},I=$({__name:"BreadcrumbNav",props:{items:{}},setup(t){const n=t,a=c(()=>n.items[n.items.length-1]),i=c(()=>n.items.slice(0,-1).map(e=>({label:typeof e.label=="string"?e.label:String(e.label??""),icon:e.icon,to:e.to}))),r=c(()=>i.value.length>0);return(e,q)=>{const f=B,g=V,b=P,v=j;return o(),w(C,null,[m(f,{items:t.items,class:"hidden min-w-0 sm:flex"},x({_:2},[N(e.$slots,(A,l)=>({name:l,fn:d(k=>[_(e.$slots,l,y(S(k??{})))])}))]),1032,["items"]),u("div",D,[s(r)?(o(),p(b,{key:0,items:s(i),content:{align:"start",collisionPadding:12}},{default:d(()=>[m(g,{icon:t.items[0]?.icon||"i-lucide-ellipsis","trailing-icon":"i-lucide-chevron-down",color:"neutral",variant:"ghost",size:"sm",square:"","aria-label":"Show navigation path",class:"shrink-0"},null,8,["icon"])]),_:1},8,["items"])):h("",!0),s(r)?(o(),p(v,{key:1,name:"i-lucide-chevron-right",class:"size-4 shrink-0 text-muted"})):h("",!0),u("span",F,[_(e.$slots,s(a)?.slot||"current",{item:s(a)},()=>[U(z(s(a)?.label),1)])])])],64)}}}),M=Object.assign(I,{__name:"BreadcrumbNav"});export{M as _};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import{d as F,B as W,o,f as u,g as n,i as e,c,F as E,y as N,k as a,q as C,p as O,t as y,v as m,s as R,m as s,_ as V,j as i,r as I,h as g,A as G}from"./DCFbQvIN.js";import{a as T,d as K,_ as L}from"./BpM6ZPIG.js";import{_ as Y}from"./D8gX1Jde.js";import{_ as q}from"./Cpsq-kYE.js";import{u as H}from"./rL4C0HV5.js";const M={class:"flex items-center gap-3"},J={class:"p-2 bg-primary/10 rounded-lg shrink-0"},Q={class:"text-xl font-semibold inline-flex items-center gap-1"},X={class:"text-sm text-gray-500 dark:text-gray-400"},Z={class:"flex flex-col items-center shrink-0"},tt={key:1},et={key:0,class:"w-px flex-1 mt-2 min-h-6 bg-gray-200 dark:bg-gray-700"},st={class:"flex-1 pb-6"},rt={class:"flex items-center gap-2 mb-1"},ot={class:"font-medium"},it={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},nt={class:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-2"},at={key:0,class:"mt-4 space-y-6"},lt={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},dt={class:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400"},pt=`// tests/fixtures.ts
|
|
2
|
+
import { test as base, expect } from '@playwright/test'
|
|
3
|
+
import { piwiFixtures } from '@piwitests/reporter'
|
|
4
|
+
|
|
5
|
+
export const test = base.extend(piwiFixtures)
|
|
6
|
+
export { expect }`,ut=`// your test file
|
|
7
|
+
import { test, expect } from './fixtures'
|
|
8
|
+
|
|
9
|
+
test('homepage loads', async ({ page }) => {
|
|
10
|
+
await page.goto('/')
|
|
11
|
+
// network requests, web vitals, console errors, and ARIA snapshots
|
|
12
|
+
// are captured automatically and appear in the dashboard
|
|
13
|
+
})`,ct=`// tests/fixtures.ts
|
|
14
|
+
import { test as base } from '@playwright/test'
|
|
15
|
+
import { extendPiwiFixtures } from '@piwitests/reporter'
|
|
16
|
+
|
|
17
|
+
export const test = extendPiwiFixtures(base)
|
|
18
|
+
export { expect } from '@playwright/test'`,mt=F({__name:"GetStartedWizard",setup(gt){const P=G(),h=g(()=>!!P.public.authEnabled),b=H(),_=I("http://localhost:3000");W(()=>{_.value=window.location.origin});function k(d){const t=["projectName: 'my-project',"];return b||(t.unshift(`serverUrl: '${_.value}',`),h.value&&t.push("apiKey: process.env.PIWI_API_KEY,")),t.map(l=>`${d}${l}`).join(`
|
|
19
|
+
`)}const A=g(()=>`import { defineConfig } from '@playwright/test'
|
|
20
|
+
|
|
21
|
+
export default defineConfig({
|
|
22
|
+
reporter: [
|
|
23
|
+
['list'],
|
|
24
|
+
['@piwitests/reporter', {
|
|
25
|
+
${k(" ")}
|
|
26
|
+
}],
|
|
27
|
+
],
|
|
28
|
+
use: {
|
|
29
|
+
trace: 'retain-on-failure',
|
|
30
|
+
},
|
|
31
|
+
})`),z=g(()=>`import { defineConfig } from '@playwright/test'
|
|
32
|
+
import PiwiDashboard from '@piwitests/reporter'
|
|
33
|
+
|
|
34
|
+
export default PiwiDashboard.wrapConfig(
|
|
35
|
+
defineConfig({
|
|
36
|
+
// your existing config
|
|
37
|
+
use: {
|
|
38
|
+
trace: 'retain-on-failure',
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
{
|
|
42
|
+
${k(" ")}
|
|
43
|
+
},
|
|
44
|
+
)`),x=g(()=>{const d=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return h.value&&d.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),d.push({title:"Configure Playwright",description:b?"Add the reporter to your playwright.config.ts. While this app is running it needs no URL or token — the reporter finds it automatically.":"Add the reporter to your playwright.config.ts.",code:A.value,lang:"typescript"},{title:"Run your tests",description:"Results appear in the dashboard automatically. The project is created on first submit.",code:"npx playwright test",lang:"bash"}),d.map((t,l)=>({id:l+1,...t}))}),S=["zero","one","two","three","four","five","six"],j=g(()=>S[x.value.length]??String(x.value.length)),f=I(!1);return(d,t)=>{const l=O,U=L,$=R,w=V,p=Y,v=T,B=q;return o(),u(B,null,{header:n(()=>[e("div",M,[e("div",J,[i(l,{name:"i-lucide-rocket",class:"size-5 text-primary"})]),e("div",null,[e("h2",Q,[t[1]||(t[1]=s(" Get started in 60 seconds ",-1)),i(U,{topic:"home.get-started"})]),e("p",X,"Send your first test run in "+y(a(j))+" steps",1)])])]),footer:n(()=>[e("div",dt,[e("span",null,[t[18]||(t[18]=s("Need more options? See the ",-1)),i(v,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[17]||(t[17]=[s("full reporter docs",-1)])]),_:1}),t[19]||(t[19]=s(".",-1))]),i(w,{to:a(K)("demo/"),target:"_blank",variant:"ghost",size:"sm",color:"neutral","trailing-icon":"i-lucide-external-link"},{default:n(()=>[...t[20]||(t[20]=[s(" View demo with sample data ",-1)])]),_:1},8,["to"])])]),default:n(()=>[e("div",null,[(o(!0),c(E,null,N(a(x),(r,D)=>(o(),c("div",{key:r.id,class:"flex gap-4"},[e("div",Z,[e("div",{class:C(["flex size-8 items-center justify-center rounded-full text-sm font-semibold",r.done?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-primary/10 text-primary"])},[r.done?(o(),u(l,{key:0,name:"i-lucide-check",class:"size-4"})):(o(),c("span",tt,y(r.id),1))],2),D<a(x).length-1?(o(),c("div",et)):m("",!0)]),e("div",st,[e("div",rt,[e("h3",ot,y(r.title),1),r.done?(o(),u($,{key:0,color:"success",variant:"subtle",size:"xs"},{default:n(()=>[...t[2]||(t[2]=[s("Done",-1)])]),_:1})):m("",!0)]),e("p",it,y(r.description),1),r.action==="create-api-key"?(o(),u(w,{key:0,to:"/settings/users",icon:"i-lucide-key-round",size:"sm",variant:"soft"},{default:n(()=>[...t[3]||(t[3]=[s(" Create an API key ",-1)])]),_:1})):m("",!0),r.code?(o(),u(p,{key:1,code:r.code,lang:r.lang},null,8,["code","lang"])):m("",!0)])]))),128)),e("div",nt,[e("button",{class:"flex items-center gap-2 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-primary dark:hover:text-primary transition-colors w-full text-left",onClick:t[0]||(t[0]=r=>f.value=!a(f))},[i(l,{name:"i-lucide-chevron-right",class:C(["size-4 transition-transform duration-200",a(f)?"rotate-90":""])},null,8,["class"]),t[4]||(t[4]=s(" Go further — simpler config & capture fixtures ",-1))]),a(f)?(o(),c("div",at,[e("div",null,[t[5]||(t[5]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Simpler config with "),e("code",{class:"text-primary text-xs"},"wrapConfig")],-1)),t[6]||(t[6]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},[s(" Instead of manually adding the reporter array entry, "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"wrapConfig"),s(" auto-injects the reporter and chains the global setup in one call. It also registers the run on the dashboard "),e("em",null,"before"),s(" your "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"globalSetup"),s(" runs, so the dashboard shows an initializing state during setup. ")],-1)),i(p,{code:a(z),lang:"typescript"},null,8,["code"])]),e("div",null,[t[14]||(t[14]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Capture fixtures — network, Web Vitals, console & locator healing with "),e("code",{class:"text-primary text-xs"},"piwiFixtures")],-1)),e("p",lt,[t[8]||(t[8]=s(" Extend your Playwright ",-1)),t[9]||(t[9]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"test",-1)),t[10]||(t[10]=s(" with ",-1)),t[11]||(t[11]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"piwiFixtures",-1)),t[12]||(t[12]=s(" to automatically capture network timing, browser Web Vitals, console errors, ARIA snapshots on failure, and the locator snapshots that power locator healing. See the ",-1)),i(v,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[7]||(t[7]=[s("capture fixtures guide",-1)])]),_:1}),t[13]||(t[13]=s(". ",-1))]),t[15]||(t[15]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option A — extend your existing fixtures ",-1)),i(p,{code:pt,lang:"typescript",class:"mb-3"}),i(p,{code:ut,lang:"typescript",class:"mb-4"}),t[16]||(t[16]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option B — one-line extend ",-1)),i(p,{code:ct,lang:"typescript"})])])):m("",!0)])])]),_:1})}}}),_t=Object.assign(mt,{__name:"GetStartedWizard"});export{_t as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as
|
|
1
|
+
import{_ as j}from"./DdH3op4b.js";import{_ as F}from"./Cpsq-kYE.js";import{_ as G}from"./DkT2nCqn.js";import{az as T,d as Y,O as D,a as H,u as J,b as K,B as q,c as M,i as r,k as t,f as m,g as s,j as a,m as f,A as Q,r as _,G as W,o as i,v,C as z,E as X,_ as Z,p as ee,M as B,h as te}from"./DCFbQvIN.js";import{_ as ae}from"./zv8WdMx0.js";import{_ as se}from"./CFTZwazK.js";import"./NERLHpOL.js";const oe=T("/logo-wide.svg"),ne={class:"min-h-screen flex flex-col items-center justify-center bg-elevated/50 gap-6 px-4"},le={key:1,class:"space-y-2 mb-4"},re={class:"mt-4 text-center"},ie={class:"flex items-center gap-4 text-sm text-muted"},de={href:"https://github.com/piwitests/platform",target:"_blank",rel:"noopener",class:"flex items-center gap-1.5 hover:text-default transition-colors"},ve=Y({__name:"login",setup(ue){const{login:U}=D(),C=H(),E=J(),y=K(),A=Q(),d=B({username:"",password:""}),w=_(!1),c=_(""),h=_(null),o=B({username:"",password:"",confirmPassword:"",name:""}),u=_(!1),p=_("");q(async()=>{if(A.public.demoMode){h.value=!1;return}try{const n=await $fetch("/api/auth/setup");h.value=n.needsSetup}catch{h.value=!1}});async function N(){if(!o.username||!o.password){p.value="Please choose a username and password";return}if(o.password!==o.confirmPassword){p.value="Passwords do not match";return}u.value=!0,p.value="";try{await $fetch("/api/auth/setup",{method:"POST",body:{username:o.username,password:o.password,name:o.name||void 0}}),await U(o.username,o.password),y.add({title:"Admin account created",description:"You're signed in.",color:"success"}),C.push("/")}catch(n){const e=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;p.value=e||"Failed to create the admin account",y.add({title:"Setup failed",description:p.value,color:"error"})}finally{u.value=!1}}const x=te(()=>A.public.demoMode?[]:A.public.oauthProviders||[]);q(()=>{const n=E.query.error;if(n){const e={"access-denied":"Access was denied","invalid-state":"Authentication failed (invalid state)","missing-code":"Authentication failed (missing code)","oauth-failed":"OAuth authentication failed","account-exists":"This email is already linked to a different sign-in method. Sign in with that method instead.","domain-not-allowed":"Your email domain is not allowed to sign in here.","org-not-allowed":"You are not a member of an allowed organization.","link-requires-login":"Please sign in before connecting a provider.","auth-disabled":"Authentication is not enabled","invalid-provider":"Invalid OAuth provider"};c.value=e[n]||"Authentication failed"}});async function I(){if(!d.username||!d.password){c.value="Please enter username and password";return}w.value=!0,c.value="";try{await U(d.username,d.password),y.add({title:"Login successful",color:"success"}),C.push("/")}catch(n){const e=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;c.value=e||"Invalid username or password",y.add({title:"Login failed",description:c.value,color:"error"})}finally{w.value=!1}}function S(n){window.location.href=`/api/auth/oauth/${n}/login`}return(n,e)=>{const O=j,P=F,$=G,g=X,b=ae,k=Z,V=ee,R=se,L=W;return i(),M("div",ne,[e[18]||(e[18]=r("img",{src:oe,alt:"Piwi Dashboard",class:"h-16 rounded-xl"},null,-1)),t(h)===null?(i(),m(P,{key:0,class:"w-full max-w-md"},{default:s(()=>[a(O,{text:"Loading…"})]),_:1})):t(h)?(i(),m(P,{key:1,class:"w-full max-w-md"},{header:s(()=>[...e[8]||(e[8]=[r("h1",{class:"text-xl font-semibold"},"Create the first admin account",-1),r("p",{class:"text-sm text-muted mt-1"}," Authentication is enabled and no accounts exist yet. Create the administrator account to sign in. ",-1)])]),default:s(()=>[t(p)?(i(),m($,{key:0,color:"error",title:t(p),variant:"subtle",class:"mb-4"},null,8,["title"])):v("",!0),r("form",{class:"space-y-4",onSubmit:z(N,["prevent"])},[a(b,{label:"Username",name:"username",required:""},{default:s(()=>[a(g,{modelValue:t(o).username,"onUpdate:modelValue":e[0]||(e[0]=l=>t(o).username=l),type:"text",placeholder:"Choose a username",autocomplete:"username",disabled:t(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),a(b,{label:"Name",name:"name"},{default:s(()=>[a(g,{modelValue:t(o).name,"onUpdate:modelValue":e[1]||(e[1]=l=>t(o).name=l),type:"text",placeholder:"Administrator (optional)",autocomplete:"name",disabled:t(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),a(b,{label:"Password",name:"password",required:""},{default:s(()=>[a(g,{modelValue:t(o).password,"onUpdate:modelValue":e[2]||(e[2]=l=>t(o).password=l),type:"password",placeholder:"Choose a password",autocomplete:"new-password",disabled:t(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),a(b,{label:"Confirm password",name:"confirmPassword",required:""},{default:s(()=>[a(g,{modelValue:t(o).confirmPassword,"onUpdate:modelValue":e[3]||(e[3]=l=>t(o).confirmPassword=l),type:"password",placeholder:"Re-enter the password",autocomplete:"new-password",disabled:t(u),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),a(k,{type:"submit",block:"",loading:t(u),disabled:t(u)},{default:s(()=>[...e[9]||(e[9]=[f(" Create admin account ",-1)])]),_:1},8,["loading","disabled"])],32)]),_:1})):(i(),m(P,{key:2,class:"w-full max-w-md"},{header:s(()=>[...e[10]||(e[10]=[r("h1",{class:"text-xl font-semibold"},"Sign in to your account",-1)])]),default:s(()=>[t(c)?(i(),m($,{key:0,color:"error",title:t(c),variant:"subtle",class:"mb-4"},null,8,["title"])):v("",!0),t(x).length>0?(i(),M("div",le,[t(x).includes("google")?(i(),m(k,{key:0,block:"",color:"neutral",variant:"outline",onClick:e[4]||(e[4]=l=>S("google"))},{leading:s(()=>[a(V,{name:"i-lucide-chrome",class:"size-5"})]),default:s(()=>[e[11]||(e[11]=f(" Sign in with Google ",-1))]),_:1})):v("",!0),t(x).includes("github")?(i(),m(k,{key:1,block:"",color:"neutral",variant:"outline",onClick:e[5]||(e[5]=l=>S("github"))},{leading:s(()=>[a(V,{name:"i-lucide-github",class:"size-5"})]),default:s(()=>[e[12]||(e[12]=f(" Sign in with GitHub ",-1))]),_:1})):v("",!0),t(x).length>0?(i(),m(R,{key:2,label:"or continue with password",class:"my-4"})):v("",!0)])):v("",!0),r("form",{class:"space-y-4",onSubmit:z(I,["prevent"])},[a(b,{label:"Username",name:"username",required:""},{default:s(()=>[a(g,{modelValue:t(d).username,"onUpdate:modelValue":e[6]||(e[6]=l=>t(d).username=l),type:"text",placeholder:"Enter your username",autocomplete:"username",disabled:t(w),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),a(b,{label:"Password",name:"password",required:""},{default:s(()=>[a(g,{modelValue:t(d).password,"onUpdate:modelValue":e[7]||(e[7]=l=>t(d).password=l),type:"password",placeholder:"Enter your password",autocomplete:"current-password",disabled:t(w),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),a(k,{type:"submit",block:"",loading:t(w),disabled:t(w)},{default:s(()=>[...e[13]||(e[13]=[f(" Login ",-1)])]),_:1},8,["loading","disabled"])],32),r("div",re,[a(L,{to:"/forgot-password",class:"text-sm text-muted hover:text-default"},{default:s(()=>[...e[14]||(e[14]=[f(" Forgot password? ",-1)])]),_:1})])]),_:1})),r("div",ie,[r("a",de,[a(V,{name:"i-lucide-github",class:"size-4"}),e[15]||(e[15]=f(" GitHub ",-1))]),e[17]||(e[17]=r("span",null,"·",-1)),a(L,{to:"/docs",class:"flex items-center gap-1.5 hover:text-default transition-colors"},{default:s(()=>[a(V,{name:"i-lucide-book-open",class:"size-4"}),e[16]||(e[16]=f(" API Docs ",-1))]),_:1})])])}}});export{ve as default};
|