@piwitests/server 0.19.0 → 0.20.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/{eptP4pGv.js → -f7BAm1H.js} +1 -1
- package/.output/public/_nuxt/{Bti38m-M.js → 4gYNA-d4.js} +1 -1
- package/.output/public/_nuxt/{CHEFCN8Q.js → 5A6ITZXj.js} +1 -1
- package/.output/public/_nuxt/{DoUy4UHi.js → 8PUUncmO.js} +2 -2
- package/.output/public/_nuxt/{DS636elg.js → A1pj0VnG.js} +1 -1
- package/.output/public/_nuxt/{B9WhzpKO.js → AbmKWFQQ.js} +1 -1
- package/.output/public/_nuxt/{rWNTSFD6.js → B3obW6cw.js} +3 -3
- package/.output/public/_nuxt/{Bu2aaVIY.js → B7FTvFWq.js} +1 -1
- package/.output/public/_nuxt/{CpjgB2aY.js → B8zkOmwo.js} +1 -1
- package/.output/public/_nuxt/B96M2gdj.js +1 -0
- package/.output/public/_nuxt/{FUXhyidq.js → B99fbi73.js} +1 -1
- package/.output/public/_nuxt/{DslPMqfa.js → B9OLmp0f.js} +1 -1
- package/.output/public/_nuxt/{BccXfBfI.js → BKkF4pPD.js} +1 -1
- package/.output/public/_nuxt/{DP8hfJ9h.js → BT3wGCTI.js} +1 -1
- package/.output/public/_nuxt/{B3B9Ii2A.js → BUa0V0Ly.js} +1 -1
- package/.output/public/_nuxt/{B3HO8kuh.js → BUkim3TM.js} +1 -1
- package/.output/public/_nuxt/{BVaxh6Nl.js → BVc14Ncz.js} +3 -3
- package/.output/public/_nuxt/{DW0xl3I6.js → BY0HxR3t.js} +1 -1
- package/.output/public/_nuxt/B_xAMWQS.js +2 -0
- package/.output/public/_nuxt/{C2_3mdPC.js → BdQoBaOv.js} +1 -1
- package/.output/public/_nuxt/{DT53RWbC.js → BdfhYr-u.js} +1 -1
- package/.output/public/_nuxt/{CtQBsNUb.js → BgRu_3tT.js} +1 -1
- package/.output/public/_nuxt/{SlIRLREZ.js → BiO7RBWb.js} +1 -1
- package/.output/public/_nuxt/BicAJ6U8.js +1 -0
- package/.output/public/_nuxt/{C7P1UCO2.js → Bm62iDV5.js} +1 -1
- package/.output/public/_nuxt/{CZfMdzfk.js → BmUfSNMV.js} +1 -1
- package/.output/public/_nuxt/{tvgqrYDd.js → Bnxf8nbZ.js} +1 -1
- package/.output/public/_nuxt/{ndShiWE8.js → Bow4tTR0.js} +1 -1
- package/.output/public/_nuxt/{D0HNloZ9.js → BrQEE053.js} +1 -1
- package/.output/public/_nuxt/{CV9-fTmY.js → BzRRzmwm.js} +1 -1
- package/.output/public/_nuxt/{DprVVyUQ.js → C0_yH0N7.js} +1 -1
- package/.output/public/_nuxt/{DLSrtpsA.js → C1gTN4Q8.js} +1 -1
- package/.output/public/_nuxt/{ClOqkAcc.js → C2hkrSey.js} +1 -1
- package/.output/public/_nuxt/{ZFiQCMUB.js → C8e1EbJI.js} +1 -1
- package/.output/public/_nuxt/{nv9-6vBK.js → CA9B2HE5.js} +1 -1
- package/.output/public/_nuxt/{KnfsST6Y.js → CAAwCT7H.js} +1 -1
- package/.output/public/_nuxt/{ybDYeNxd.js → CAvY22RE.js} +1 -1
- package/.output/public/_nuxt/{C5iG7O4O.js → CEfS4-oS.js} +1 -1
- package/.output/public/_nuxt/{Bp5ELvx9.js → CIoSMkpp.js} +1 -1
- package/.output/public/_nuxt/{C95YAaJq.js → CIrFl3MW.js} +1 -1
- package/.output/public/_nuxt/{DiOLdHBC.js → CJFtzlQ4.js} +1 -1
- package/.output/public/_nuxt/{BX9ZXe98.js → CNyV9YpI.js} +1 -1
- package/.output/public/_nuxt/CSJ-eOQM.js +1 -0
- package/.output/public/_nuxt/{fVcG504p.js → CTU1mrhq.js} +1 -1
- package/.output/public/_nuxt/{279D2RYp.js → CXEH9OPk.js} +1 -1
- package/.output/public/_nuxt/CahpB9Z2.js +5 -0
- package/.output/public/_nuxt/{B7NBP1C-.js → Cbh--1MW.js} +1 -1
- package/.output/public/_nuxt/CeG9pBAD.js +1 -0
- package/.output/public/_nuxt/{D55D4EYo.js → CeW8v31b.js} +1 -1
- package/.output/public/_nuxt/{BuMC3WjZ.js → CjPfj7ya.js} +1 -1
- package/.output/public/_nuxt/{HXerICAi.js → Cnsmicv2.js} +1 -1
- package/.output/public/_nuxt/{DgE2YE3R.js → CsLojMwR.js} +1 -1
- package/.output/public/_nuxt/{C9_jrmk9.js → Cus22Ud3.js} +2 -2
- package/.output/public/_nuxt/{DX-MDGb3.js → CwGWJbiy.js} +1 -1
- package/.output/public/_nuxt/{BJ0XQElc.js → Cx6gc2VW.js} +1 -1
- package/.output/public/_nuxt/{cHAnlQbv.js → CxyAzHr3.js} +1 -1
- package/.output/public/_nuxt/{BxCKKeYs.js → CzAPFPpL.js} +1 -1
- package/.output/public/_nuxt/{B33iXw77.js → D--H4jLI.js} +1 -1
- package/.output/public/_nuxt/D1POo6S4.js +10 -0
- package/.output/public/_nuxt/{BDicZ1gQ.js → D5tke0B5.js} +1 -1
- package/.output/public/_nuxt/D8nkF-OO.js +3 -0
- package/.output/public/_nuxt/{CzGyac8q.js → DA25RkyK.js} +1 -1
- package/.output/public/_nuxt/{CUtJobDm.js → DIB-5fUJ.js} +1 -1
- package/.output/public/_nuxt/{BPRffDuo.js → DJmoLeVt.js} +1 -1
- package/.output/public/_nuxt/{DGfAxLHV.js → DJxlKFGb.js} +1 -1
- package/.output/public/_nuxt/{81InBX9v.js → DMec-OLo.js} +1 -1
- package/.output/public/_nuxt/{CK_2LZBS.js → DPCxhHri.js} +1 -1
- package/.output/public/_nuxt/{Bn0YQDyy.js → DSqHUrvO.js} +1 -1
- package/.output/public/_nuxt/{BqV0l12c.js → DabzhQB1.js} +1 -1
- package/.output/public/_nuxt/{BfTuX0wq.js → DdwHkKfV.js} +1 -1
- package/.output/public/_nuxt/{C-elpgyr.js → DeY2JkR2.js} +1 -1
- package/.output/public/_nuxt/{DEFEpYzn.js → DfgOx_ou.js} +1 -1
- package/.output/public/_nuxt/DmkUdSS4.js +1 -0
- package/.output/public/_nuxt/{Ar3IelOY.js → DoIREDVb.js} +1 -1
- package/.output/public/_nuxt/DpZ1r1HA.js +1 -0
- package/.output/public/_nuxt/{Jo8kRmHz.js → Dpd16JVI.js} +1 -1
- package/.output/public/_nuxt/{BSIxhGsh.js → DqcKngf3.js} +1 -1
- package/.output/public/_nuxt/{BMvCSA6h.js → DrfE8IY0.js} +1 -1
- package/.output/public/_nuxt/{eaVkJRSa.js → DsesNydr.js} +1 -1
- package/.output/public/_nuxt/{zQyPuvV1.js → DtHJgCS8.js} +1 -1
- package/.output/public/_nuxt/Dtd4rC58.js +9 -0
- package/.output/public/_nuxt/{NQikbhmK.js → Du2W7Jne.js} +37 -36
- package/.output/public/_nuxt/{CDk0q2hV.js → DuwtTfO8.js} +1 -1
- package/.output/public/_nuxt/{B44A4LSJ.js → Dy-TJ0Mt.js} +1 -1
- package/.output/public/_nuxt/{-09h6CA9.js → Dy86h-7P.js} +1 -1
- package/.output/public/_nuxt/{Cdff9XNh.js → Dyeqn3aG.js} +1 -1
- package/.output/public/_nuxt/{Dnpkl-1q.js → FaFoMVKo.js} +1 -1
- package/.output/public/_nuxt/GPNI1ffD.js +4 -0
- package/.output/public/_nuxt/{BCMuIgP5.js → H94BMf3L.js} +1 -1
- package/.output/public/_nuxt/HPNQD6v3.js +1 -0
- package/.output/public/_nuxt/HXadJrHu.js +2 -0
- package/.output/public/_nuxt/{YVN7WG7q.js → KyA_4Ks-.js} +1 -1
- package/.output/public/_nuxt/{CYsTqbBS.js → L3kAWB2a.js} +1 -1
- package/.output/public/_nuxt/{Dk9fwOCm.js → McL25vkx.js} +2 -2
- package/.output/public/_nuxt/Nn93e_Mz.js +1 -0
- package/.output/public/_nuxt/UdR3DBPS.js +1 -0
- package/.output/public/_nuxt/{SfMRXW25.js → Und3xXFc.js} +1 -1
- package/.output/public/_nuxt/_mj6CfPa.js +1 -0
- package/.output/public/_nuxt/{BPQoBGg5.js → b-GYfcrQ.js} +1 -1
- package/.output/public/_nuxt/{DHDtnj7p.js → bLcjFslv.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +1 -0
- package/.output/public/_nuxt/entry.DmptwB51.css +1 -0
- package/.output/public/_nuxt/{y17lMTFy.js → hC_z4G8p.js} +1 -1
- package/.output/public/_nuxt/{CTxDO9fB.js → hNh4CIL0.js} +1 -1
- package/.output/public/_nuxt/{CGNkHojN.js → l5WKbU4h.js} +1 -1
- package/.output/public/_nuxt/{DcmZRa_F.js → oAClCn_h.js} +1 -1
- package/.output/public/_nuxt/{IvQlbZk6.js → pQqGiNch.js} +1 -1
- package/.output/public/_nuxt/ryMzSDUj.js +2 -0
- package/.output/server/chunks/_/collect.mjs +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{BrowserBadge-D33lqUcj.mjs → BrowserBadge-MFvBwxmD.mjs} +66 -6
- package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-DvUBGagc.mjs → Checkbox-4Q5d0fa0.mjs} +4 -4
- package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +1 -0
- package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs +1492 -0
- package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +1 -0
- package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs +1 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs +1 -1
- package/.output/server/chunks/build/{DiagnosisPanel-B646dK4p.mjs → DiagnosisPanel-CALyEmcJ.mjs} +3 -3
- package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.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-BBHWssHH.mjs} +4 -4
- package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-Bg3FSiU1.mjs → EnvManagedBadge-UwD2b9v2.mjs} +2 -2
- package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.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/{OpenInIdeLink-C4MXA8ya.mjs → OpenInIdeLink-CQWKKChd.mjs} +3 -3
- package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs.map → OpenInIdeLink-CQWKKChd.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-CxfQ5wtN.mjs → ProjectTestCasesTable-Bo61P5K1.mjs} +8 -8
- package/.output/server/chunks/build/{ProjectTestCasesTable-CxfQ5wtN.mjs.map → ProjectTestCasesTable-Bo61P5K1.mjs.map} +1 -1
- 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 +1 -1
- package/.output/server/chunks/build/{Select-CUqj50wi.mjs → Select-5DK9frQ7.mjs} +3 -3
- package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs → SelectMenu-D-2FSqBU.mjs} +939 -7
- package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs.map → SelectMenu-D-2FSqBU.mjs.map} +1 -1
- package/.output/server/chunks/build/{SettingsField-D6iEYbEc.mjs → SettingsField-BZfx4ma1.mjs} +2 -2
- package/.output/server/chunks/build/SettingsField-BZfx4ma1.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/{Switch-CgUioOYB.mjs → Switch-B5Fp8ULt.mjs} +2 -2
- package/.output/server/chunks/build/Switch-B5Fp8ULt.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-CSi64vVA.mjs} +5 -5
- package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-j6h2Jp6A.mjs → TestStatusBar-DX3EhlyP.mjs} +2 -2
- package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.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_-BdG37K7s.mjs} +12 -12
- package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BHh65pfg.mjs → _id_-BdJs7BJZ.mjs} +57 -33
- package/.output/server/chunks/build/{_id_-BHh65pfg.mjs.map → _id_-BdJs7BJZ.mjs.map} +1 -1
- package/.output/server/chunks/build/{_id_-B78ky13D.mjs → _id_-BxA6IgWr.mjs} +96 -73
- package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-Rzkqx55x.mjs → _id_-C_uSBiyU.mjs} +22 -23
- package/.output/server/chunks/build/{_id_-Rzkqx55x.mjs.map → _id_-C_uSBiyU.mjs.map} +1 -1
- package/.output/server/chunks/build/{about-CvSP73Ug.mjs → about-BE0UV-8-.mjs} +365 -18
- package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs → ai-Cn05ch0u.mjs} +9 -9
- package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs.map → ai-Cn05ch0u.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-CJPC6t4L.mjs → analytics-Bo_B_jko.mjs} +20 -21
- package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{default-zvbFgDJG.mjs → default-CbNHaFsy.mjs} +603 -71
- package/.output/server/chunks/build/default-CbNHaFsy.mjs.map +1 -0
- package/.output/server/chunks/build/{docs-DyuVEgtB.mjs → docs-B_llWMxx.mjs} +6 -6
- package/.output/server/chunks/build/{docs-DyuVEgtB.mjs.map → docs-B_llWMxx.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-CFR5g2Qf.mjs → edit-J0asTFg8.mjs} +4 -5
- package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +1 -0
- package/.output/server/chunks/build/fetch-B4FwBOzu.mjs +1 -1
- package/.output/server/chunks/build/{import-CZo3djDi.mjs → import-CS9oylTN.mjs} +4 -4
- package/.output/server/chunks/build/import-CS9oylTN.mjs.map +1 -0
- package/.output/server/chunks/build/{index-Stqw0dEI.mjs → index-DE45ycdZ.mjs} +9 -9
- package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +1 -0
- package/.output/server/chunks/build/{index-gCw_y4ZJ.mjs → index-e9skCi-V.mjs} +10 -11
- package/.output/server/chunks/build/{index-gCw_y4ZJ.mjs.map → index-e9skCi-V.mjs.map} +1 -1
- package/.output/server/chunks/build/{index-D7fe97l3.mjs → index-hGHlmyxj.mjs} +299 -91
- package/.output/server/chunks/build/index-hGHlmyxj.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
- package/.output/server/chunks/build/login-Da4u1IlW.mjs +1 -1
- package/.output/server/chunks/build/{mcp-B3IUvRgD.mjs → mcp-uhVCCwQM.mjs} +339 -10
- package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-abDv0id8.mjs → notifications-fx_qnKGA.mjs} +4 -4
- package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-DjZID6q-.mjs → pr-feedback-X6-70iF0.mjs} +3 -3
- package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +24 -24
- package/.output/server/chunks/build/{settings-Du7YqF8i.mjs → settings-CCYe7rsc.mjs} +3 -3
- package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-B4vzxd8G.mjs → storage-CJEmviCD.mjs} +5 -5
- package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-DUvaO1He.mjs → test-cases-thBbAykw.mjs} +9 -9
- package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-CWvIo32Q.mjs → useAiStatus-CxjMmDDY.mjs} +8 -8
- package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-BemRsKgv.mjs → useCopyRich-RJKhWoyj.mjs} +74 -44
- package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopDownload-D49JRQSw.mjs → useDesktopDownload-BepjqxOt.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-4GFf-kdi.mjs → useOpenInIde-BbTnPhFA.mjs} +2 -2
- package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-C3O866KC.mjs → useSettingsNav-DnQKacz8.mjs} +4 -4
- package/.output/server/chunks/build/useSettingsNav-DnQKacz8.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/{wasted-time-lYkx5YO4.mjs → wasted-time-BNTPIyrC.mjs} +4 -4
- package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +3471 -2802
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +88 -0
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.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 +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
- package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +5 -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 +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -2
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/import.post.mjs +4 -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 +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +3 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/BYDaY0Z7.js +0 -1
- package/.output/public/_nuxt/Bc8mOoz9.js +0 -4
- package/.output/public/_nuxt/BeLWlVK0.js +0 -1
- package/.output/public/_nuxt/BpUaY9nH.js +0 -2
- 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/CrwJAwhk.js +0 -1
- package/.output/public/_nuxt/CuSVQEkS.js +0 -3
- package/.output/public/_nuxt/CylWPruw.js +0 -1
- package/.output/public/_nuxt/DDDpCFpF.js +0 -1
- package/.output/public/_nuxt/DVDXJYq2.js +0 -2
- package/.output/public/_nuxt/Dgf5N4Ng.js +0 -1
- package/.output/public/_nuxt/DiZyJYez.js +0 -1
- package/.output/public/_nuxt/OSduWzyz.js +0 -1
- 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/server/chunks/_/import-runs.mjs +0 -351
- package/.output/server/chunks/_/import-runs.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-D33lqUcj.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/DiagnosisPanel-B646dK4p.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/Modal-Ck2XLt8d.mjs.map +0 -1
- package/.output/server/chunks/build/RovingFocusItem-BJSzTBjy.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/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/TestStatusBar-j6h2Jp6A.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_-z5N6HPyC.mjs.map +0 -1
- package/.output/server/chunks/build/about-CvSP73Ug.mjs.map +0 -1
- package/.output/server/chunks/build/analytics-CJPC6t4L.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/import-CZo3djDi.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/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/settings-Du7YqF8i.mjs.map +0 -1
- package/.output/server/chunks/build/storage-B4vzxd8G.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-DUvaO1He.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-CWvIo32Q.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/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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as At,a as Lt}from"./
|
|
1
|
+
import{_ as At,a as Lt}from"./CXEH9OPk.js";import{_ as Ot,a as zt}from"./5A6ITZXj.js";import{_ as Bt}from"./A1pj0VnG.js";import{d as B,an as Ut,B as Ft,K as qt,ad as Wt,H as vt,o as s,c as v,h as T,r as ft,j as k,l as at,k as t,f as x,g as f,i as n,p as it,q as A,t as g,v as P,m as D,_ as q,w as F,F as V,y as L,ag as wt,D as Q,Q as ot,s as Mt,e as Gt}from"./Du2W7Jne.js";import{_ as Ht}from"./CeG9pBAD.js";import{_ as Yt}from"./DrfE8IY0.js";import{u as Xt}from"./KyA_4Ks-.js";import{u as _t}from"./B8zkOmwo.js";import{_ as Jt}from"./4gYNA-d4.js";import{_ as Qt}from"./BrQEE053.js";import{g as W,f as lt,c as Zt}from"./DuwtTfO8.js";import{_ as G}from"./CzAPFPpL.js";import{_ as H}from"./CAvY22RE.js";import{_ as Y}from"./C1gTN4Q8.js";import{_ as K}from"./C0_yH0N7.js";import{_ as Kt}from"./bLcjFslv.js";import{_ as Rt}from"./oAClCn_h.js";import{_ as te}from"./BzRRzmwm.js";import{_ as ee}from"./Bnxf8nbZ.js";import{_ as ct}from"./CJFtzlQ4.js";import{X as se,b as Et,c as dt,d as ae,i as ne,e as re,f as oe,g as et,m as mt,h as le,j as kt,k as ie,l as $t,s as st,n as St,o as ce,p as de,q as ue,r as me,t as pe,P as _e,v as ye,_ as bt,u as jt,a as xt,C as yt,w as ge,O as Z}from"./CwGWJbiy.js";import{_ as ut}from"./CNyV9YpI.js";import{N as Dt}from"./l5WKbU4h.js";import{_ as he,a as fe}from"./DoIREDVb.js";import"./UdR3DBPS.js";import"./DmkUdSS4.js";import"./B99fbi73.js";import"./DfgOx_ou.js";import"./Nn93e_Mz.js";import"./pQqGiNch.js";import"./L3kAWB2a.js";import"./Bm62iDV5.js";import"./BjaRappk.js";import"./DSqHUrvO.js";import"./-f7BAm1H.js";import"./D7W_4Sqc.js";function be({x:C,y:e,w:l,h:p,tl:a=!1,tr:R=!1,bl:u=!1,br:j=!1,r:b=0}){let m;m=`M${C+b},${e}h${l-2*b}`;let r=R?b:0,i=R?0:b;return m+=`a${r},${r} 0 0 1 ${r},${r}`,m+=`h${i}v${i}`,m+=`v${p-2*b}`,r=j?b:0,i=j?0:b,m+=`a${r},${r} 0 0 1 ${-r},${r}`,m+=`v${i}h${-i}`,m+=`h${2*b-l}`,r=u?b:0,i=u?0:b,m+=`a${r},${r} 0 0 1 ${-r},${-r}`,m+=`h${-i}v${-i}`,m+=`v${2*b-p}`,r=a?b:0,i=a?0:b,m+=`a${r},${r} 0 0 1 ${r},${-r}`,m+=`v${-i}h${i}`,m+="z",m}const xe=Object.assign(Object.assign({},se),{color:void 0,barMaxWidth:void 0,barWidth:void 0,dataStep:void 0,barPadding:0,roundedCorners:2,cursor:null,barMinHeight1Px:!1,barMinHeightZeroValue:null,orientation:Et.Vertical}),Tt=dt`
|
|
2
2
|
label: stacked-bar-component;
|
|
3
3
|
`,ve=ne`
|
|
4
4
|
:root {
|
|
@@ -31,4 +31,4 @@ import{_ as At,a as Lt}from"./279D2RYp.js";import{_ as Ot,a as zt}from"./CHEFCN8
|
|
|
31
31
|
label: barGroup;
|
|
32
32
|
`,Vt=dt`
|
|
33
33
|
label: barGroupExit;
|
|
34
|
-
`,ke=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:gt,barGroupExit:Vt,globalStyles:ve,root:Tt},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=xe,this.config=this._defaultConfig,this.getAccessors=()=>oe(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],l=this.dataScale.domain(),p=this._getBarWidth()/2,a=this._barData.map((S,y)=>et(S,this.config.x,y)),R=mt(a),u=le(a),j=this.dataScale(R),b=this.dataScale(u),m=this.dataScale.invert(j+(e?p:-p)),r=this.dataScale.invert(b+(e?-p:p)),i=m<=l[0]?this.dataScale(l[0])-this.dataScale(m):0,E=r>l[1]?this.dataScale(r)-this.dataScale(l[1]):0;return{top:this.isVertical()?0:e?-E:i,bottom:this.isVertical()?0:e?-i:E,left:this.isVertical()?i:0,right:this.isVertical()?E:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Et.Vertical}_render(e){const{config:l}=this,p=kt(e)?e:l.duration,a=this.getAccessors(),R=ie(this._barData,0,a,this._prevNegative);this._prevNegative=R.map(y=>!!y.isMostlyNegative);const u=this.g.selectAll(`.${gt}`).data(this._barData,(y,h)=>{var c;return`${(c=$t(y,l.id,h))!==null&&c!==void 0?c:h}`}),j=(y,h)=>{const c=this.dataScale(et(y,l.x,h)),$=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${$},${o})`},m=u.enter().append("g").attr("class",gt).attr("transform",j).style("opacity",1).merge(u);st(m,p).attr("transform",j).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,p).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),p).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const i=m.selectAll(`.${rt}`).data((y,h)=>{const c=R.map(($,o)=>({datum:y,index:h,stacked:$[h],stackIndex:o})).filter($=>$.stacked[0]!==$.stacked[1]);return c.forEach(($,o)=>{$.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==$.stacked[1]}),c},y=>y.stackIndex),S=i.enter().append("path").attr("class",rt).attr("d",y=>this._getBarPath(y,!0)).style("fill",y=>St(y.datum,l.color,y.stackIndex)).merge(i);st(S,p).attr("d",y=>this._getBarPath(y)).style("fill",y=>St(y.datum,l.color,y.stackIndex)).style("cursor",y=>$t(y.datum,l.cursor,y.stackIndex)),st(i.exit(),p).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:l}}=this;if(ce(l))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const p=this.dataScale.bandwidth,a=this.dataScale.domain?this.dataScale.domain():[];let u=1+(p?a.length:a[1]-a[0])/e.dataStep||!p&&l.filter((m,r)=>{const i=et(m,e.x,r);return i>=a[0]&&i<=a[1]}).length||l.length;!p&&u>=2&&(u+=1);const b=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return mt([b,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:l}}=this,p=this._getBarWidth(),a=l.length<2?0:p/2,R=this.dataScale,u=Math.abs(R.invert(a)-R.invert(0));return l?.filter((b,m)=>{const r=et(b,e.x,m),i=R.domain(),E=+i[0],S=+i[1];return r>=E-u&&r<=S+u})}_getBarPath(e,l=!1){const{config:p}=this,a=this.getAccessors(),R=this._getBarWidth(),u=e.stacked[1]<0,j=e.isEnding,b=et(e.datum,a[e.stackIndex],e.index),m=l?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!l&&p.barMinHeight1Px&&m<1&&isFinite(b)&&b!==p.barMinHeightZeroValue?1:m,i=l?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(m<1&&p.barMinHeight1Px?1:0),E=-R/2,S=R,y=p.roundedCorners?kt(p.roundedCorners)?+p.roundedCorners:S/2:0,h=me(y,0,Math.min(m,S)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return be({x:this.isVertical()?E:i-r,y:this.isVertical()?i+(c?0:-r):E,w:this.isVertical()?S:r,h:this.isVertical()?r:S,tl:j&&(this.isVertical()?!u&&c||u&&!c:u),tr:j&&(this.isVertical()?!u&&c||u&&!c:!u),br:j&&(this.isVertical()?u&&c||!u&&!c:!u),bl:j&&(this.isVertical()?u&&c||!u&&!c:u),r:h})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:l}=this,p=this.getAccessors(),a=e?this._getVisibleData():l.data;return de(a,...p)}getDataScaleExtent(){const{config:e,datamodel:l}=this;return ue(l.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=ke;const $e={"data-vis-component":""},Se=B({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(C,{expose:e}){const l=Ut(pe),p=C,a=T(()=>l.data.value??p.data),R=_e(p),u=ft();return Ft(()=>{qt(()=>{u.value=new It(R.value),u.value?.setData(a.value),l.update(u.value)})}),Wt(()=>{u.value?.destroy(),l.destroy()}),vt(R,(j,b)=>{ye(j,b)||(u.value?.setConfig(R.value),u.value?.render())}),vt(a,()=>{u.value?.setData(a.value)}),e({component:u}),(j,b)=>(s(),v("div",$e))}}),Ce=30,ht=3650;function we(C){const e={days:String(C.days)};return C.projectIds&&C.projectIds.length>0&&(e.projects=C.projectIds.join(",")),C.environment&&(e.environment=C.environment),C.fullRunsOnly||(e.fullRunsOnly="false"),e}const J={days:Ce,projectIds:[],environment:null,fullRunsOnly:!0};function Me(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:p=>JSON.stringify(p),decode:p=>{try{return p?{...J,...JSON.parse(p)}:{...J}}catch{return{...J}}}}),e=T(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),l=T(()=>we(e.value));return{state:C,scope:e,scopeQuery:l}}function X(C,e){return _t(`/api/analytics/${C}`,{query:T(e),lazy:!0,server:!1},"$EEH4o0rJ7t")}const Re={class:"flex items-center gap-3 flex-wrap"},Ee={class:"flex items-center gap-1.5"},je={key:0,class:"text-gray-500"},De={key:1,class:"truncate"},Te={key:2},Ve={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},pt="All environments",Ie=B({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const l=C,p=e,a=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:ht}],R=T({get:()=>l.modelValue.days,set:y=>p("update:modelValue",{...l.modelValue,days:y})}),u=T(()=>l.availableProjects.map(y=>({label:y.label||y.name,value:y.id}))),j=T({get:()=>l.modelValue.projectIds,set:y=>p("update:modelValue",{...l.modelValue,projectIds:y})});function b(y){return u.value.find(h=>h.value===y)?.label??`#${y}`}const m=T({get:()=>l.modelValue.environment??pt,set:y=>p("update:modelValue",{...l.modelValue,environment:y===pt?null:y})}),r=T(()=>[pt,...l.availableEnvironments]),i=T({get:()=>l.modelValue.fullRunsOnly,set:y=>p("update:modelValue",{...l.modelValue,fullRunsOnly:y})}),E=T(()=>l.modelValue.days===J.days&&l.modelValue.projectIds.length===0&&l.modelValue.environment===null&&l.modelValue.fullRunsOnly===J.fullRunsOnly);function S(){p("update:modelValue",{...J})}return(y,h)=>{const c=Bt,$=it,o=Ht,d=Yt,_=q;return s(),v("div",Re,[k(c,{modelValue:t(R),"onUpdate:modelValue":h[0]||(h[0]=w=>at(R)?R.value=w:null),items:a,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),x(o,{key:0,modelValue:t(j),"onUpdate:modelValue":h[1]||(h[1]=w=>at(j)?j.value=w:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:w})=>[n("div",Ee,[k($,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",w.length?"text-primary":"text-gray-400"])},null,8,["class"]),w.length?w.length===1?(s(),v("span",De,g(b(w[0])),1)):(s(),v("span",Te,g(w.length)+" projects",1)):(s(),v("span",je,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),x(c,{key:1,modelValue:t(m),"onUpdate:modelValue":h[2]||(h[2]=w=>at(m)?m.value=w:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),n("label",Ve,[k(d,{modelValue:t(i),"onUpdate:modelValue":h[3]||(h[3]=w=>at(i)?i.value=w:null),size:"sm"},null,8,["modelValue"]),h[4]||(h[4]=D(" Full runs only ",-1))]),t(E)?P("",!0):(s(),x(_,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:S},{default:f(()=>[...h[5]||(h[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ie,{__name:"AnalyticsScopeBar"}),Pt=[{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half"},{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full"}];new Set(Pt.map(C=>C.id));const Ne={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Ae={class:"min-w-0"},Le={class:"text-sm font-medium"},Oe={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},ze=B({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("insights",()=>p.query)),e=await e,l(),e),b=Q,m={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(r,i)=>{const E=G,S=q,y=H,h=Y,c=it,$=K;return s(),x($,{icon:"i-lucide-lightbulb",title:"Insights",count:t(a)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=o=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).length===0?(s(),x(h,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Ne,[(s(!0),v(V,null,L(t(a),o=>(s(),x(wt(o.to?t(b):"div"),{key:o.id,to:o.to,class:A(["flex items-start gap-3 py-3 pl-3 border-l-2",[m[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[k(c,{name:m[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",m[o.severity].class])},null,8,["name","class"]),n("div",Ae,[n("p",Le,g(o.message),1),o.detail?(s(),v("p",Oe,g(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Be=Object.assign(ze,{__name:"InsightsFeed"}),Ue={class:"md:hidden space-y-3"},Fe={class:"flex items-center justify-between gap-2"},qe={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},We={key:0},Ge={class:"hidden md:block"},He={class:"w-full text-sm"},Ye={class:"divide-y divide-gray-100 dark:divide-gray-800"},Xe={class:"py-2.5 pr-4"},Je={class:"flex items-center gap-2 min-w-0"},Qe={class:"py-2.5 pr-4"},Ze={class:"w-36"},Ke={class:"py-2.5 pr-4 text-right"},ts={class:"py-2.5 pr-4 text-right tabular-nums"},es={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ss={class:"py-2.5 text-right"},as={class:"text-xs text-gray-500 dark:text-gray-400"},ns={key:1,class:"text-xs text-gray-400"},rs=B({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("portfolio",()=>p.query)),e=await e,l(),e);function b(r){return r===null?"text-gray-400":r>=90?"text-green-600 dark:text-green-400":r>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function m(r){return r===null||Math.abs(r)<1?null:r>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(r,i)=>{const E=G,S=q,y=H,h=Y,c=Q,$=Kt,o=Rt,d=it,_=te,w=ee,I=ct,N=K;return s(),x(N,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(a)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=M=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).length===0?(s(),x(h,{key:2,text:"No projects with runs in this period."})):(s(),v(V,{key:3},[n("div",Ue,[(s(!0),v(V,null,L(t(a),M=>(s(),v("div",{key:M.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[n("div",Fe,[k(c,{to:`/projects/${M.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(g(M.label||M.name),1)]),_:2},1032,["to"]),n("span",{class:A(["tabular-nums font-semibold shrink-0",b(M.passRate)])},g(M.passRate!==null?`${M.passRate}%`:"—"),3)]),k($,{runs:M.recentRuns,height:20},null,8,["runs"]),n("div",qe,[n("span",null,g(M.runCount)+" runs · "+g(M.flakyTests)+" flaky · "+g(M.openClusters)+" open clusters",1),M.latestRun?(s(),v("span",We,g(("formatRelativeTime"in r?r.formatRelativeTime:t(lt))(M.latestRun.startTime)),1)):P("",!0)])]))),128))]),n("div",Ge,[k(I,{"min-width":"52rem"},{default:f(()=>[n("table",He,[i[2]||(i[2]=n("thead",null,[n("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[n("th",{class:"py-2 pr-4 font-medium"},"Project"),n("th",{class:"py-2 pr-4 font-medium"},"Trend"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),n("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),n("tbody",Ye,[(s(!0),v(V,null,L(t(a),M=>(s(),v("tr",{key:M.projectId},[n("td",Xe,[n("div",Je,[k(c,{to:`/projects/${M.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(g(M.label||M.name),1)]),_:2},1032,["to"]),(s(!0),v(V,null,L(M.tags.slice(0,2),U=>(s(),x(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),n("td",Qe,[n("div",Ze,[k($,{runs:M.recentRuns,height:22},null,8,["runs"])])]),n("td",Ke,[n("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(M.passRate)])},[D(g(M.passRate!==null?`${M.passRate}%`:"—")+" ",1),m(M.passRateDelta)?(s(),x(d,{key:0,name:m(M.passRateDelta).icon,class:A(["size-3.5",m(M.passRateDelta).class]),title:`${M.passRateDelta>0?"+":""}${M.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),n("td",ts,g(M.runCount),1),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",M.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},g(M.flakyTests),3),n("td",es,[k(_,{ms:M.avgRunDurationMs},null,8,["ms"])]),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",M.openClusters>0?"text-red-600 dark:text-red-400":""])},g(M.openClusters),3),n("td",ss,[M.latestRun?(s(),x(c,{key:0,to:`/test-runs/${M.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[k(w,{status:M.latestRun.status},null,8,["status"]),n("span",as,g(("formatRelativeTime"in r?r.formatRelativeTime:t(lt))(M.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",ns,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),os=Object.assign(rs,{__name:"PortfolioScorecard"}),ls={class:"space-y-1"},is={class:"flex gap-px"},cs=["title"],ds={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},us={class:"relative h-4"},ms=B({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("pass-rate-heatmap",()=>p.query)),e=await e,l(),e);function b(c){return c===null?{}:c>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:c>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:c>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:c>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function m(c,$,o){const d=a.value?.buckets[$]??"",_=(a.value?.bucketDays??1)>1?` (${a.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${_}: ${o!==null?`${o}% passed`:"no runs"}`}const r=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],i=T(()=>{const c=a.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],S=T(()=>{const c=a.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function y(c){const[$,o,d]=c.split("-"),_=E[Number(o)-1];return S.value?`${_} ${$}`:`${_} ${Number(d)}`}const h=T(()=>{const c=a.value?.buckets??[],$=c.length;if($===0)return[];const o=Math.min(S.value?4:5,$),d=new Set,_=[];for(let w=0;w<o;w++){const I=o===1?0:Math.round(w*($-1)/(o-1));if(d.has(I))continue;d.add(I);const N=I===0?0:I===$-1?100:(I+.5)/$*100,M=I===0?"translateX(0)":I===$-1?"translateX(-100%)":"translateX(-50%)";_.push({index:I,label:y(c[I]),left:N,transform:M})}return _});return(c,$)=>{const o=G,d=q,_=H,w=Y,I=Q,N=bt,M=ct,U=ut;return s(),x(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(i),help:"analytics.heatmap"},{default:f(()=>[t(R)?(s(),x(o,{key:0})):t(u)?(s(),x(_,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=O=>t(j)())},{default:f(()=>[...$[1]||($[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).rows.length===0?(s(),x(w,{key:2,text:"No runs in this period."})):(s(),x(M,{key:3,"min-width":"22rem"},{default:f(()=>[n("div",ls,[(s(!0),v(V,null,L(t(a).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[k(I,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(g(O.label||O.name),1)]),_:2},1032,["to","title"]),n("div",is,[(s(!0),v(V,null,L(O.cells,(nt,tt)=>(s(),v("div",{key:tt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:ot(b(nt)),title:m(O,tt,nt)},null,12,cs))),128))])]))),128)),n("div",ds,[$[2]||($[2]=n("span",null,null,-1)),n("div",us,[(s(!0),v(V,null,L(t(h),O=>(s(),v("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:ot({left:`${O.left}%`,transform:O.transform})},g(O.label),5))),128))])]),k(N,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ps=Object.assign(ms,{__name:"PassRateHeatmap"}),_s={key:3,class:"w-full relative"},ys={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},gs={class:"font-semibold mb-1"},hs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",fs=B({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("ci-time-trend",()=>p.query)),e=await e,l(),e),b=T(()=>a.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),m=T(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,i=o=>o.totalMinutes,E=ft(null),{tooltipData:S,tooltipPos:y,onRenderComplete:h}=jt(E,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=T(()=>{if(!a.value||a.value.deltaPct===null)return null;const o=a.value.deltaPct;return{label:`${o>0?"+":""}${o}% vs previous period`,class:o>25?"text-red-600 dark:text-red-400":o<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),$=T(()=>{if(!a.value)return;const o=a.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${a.value.runCount} runs`});return(o,d)=>{const _=G,w=q,I=H,N=Y,M=ut;return s(),x(M,{icon:"i-lucide-timer",title:"CI time",subtitle:t($),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},g(t(c).label),3)):P("",!0)]),default:f(()=>[t(R)?(s(),x(_,{key:0})):t(u)?(s(),x(I,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(j)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(m)?(s(),v("div",_s,[k(t(xt),{ref_key:"xyContainerRef",ref:E,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(h)},{default:f(()=>[k(t(Dt),{x:r,y:i,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),k(t(ge),{x:r,y:i,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),k(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),k(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(S)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(y).x}px`,top:`${t(y).y}px`})},[n("div",ys,[n("div",gs,g(new Date(t(S).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),n("div",null,g(t(S).totalMinutes)+" minutes",1),n("div",hs,g(t(S).runCount)+" runs",1)])],4)):P("",!0)])):(s(),x(N,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),bs=Object.assign(fs,{__name:"CiTimeTrendChart"}),xs={key:3,class:"w-full relative"},vs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},ks={class:"font-semibold mb-1"},$s={key:1,class:"mt-4 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2.5 text-sm dark:border-amber-900/50 dark:bg-amber-950/30"},Ss={class:"text-gray-700 dark:text-gray-300"},Cs={class:"font-semibold"},ws={key:2,class:"mt-4 space-y-1"},Ms={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},Rs=B({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("wasted-time",()=>p.query)),e=await e,l(),e),b=T(()=>a.value?.points.map(_=>({date:new Date(_.date),waitMinutes:_.waitMinutes,failedExecMinutes:_.failedExecMinutes}))??[]),m=T(()=>b.value.some(_=>_.waitMinutes>0||_.failedExecMinutes>0)),r=_=>_.date,i=["rgb(245, 158, 11)","rgb(239, 68, 68)"],E=ft(null),{tooltipData:S,tooltipPos:y,onRenderComplete:h}=jt(E,b,{x:_=>_.date,series:[{y:_=>_.waitMinutes,color:i[0]},{y:_=>_.failedExecMinutes,color:i[1]}]}),c=[{color:i[0],label:"Wait steps"},{color:i[1],label:"Failed attempts"}],$=T(()=>{if(!a.value)return;const _=a.value.totalWaitMinutes+a.value.totalFailedExecMinutes;return`${_<60?`${Math.round(_)} min`:`${Math.round(_/60*10)/10} h`} of CI time produced no signal`}),o=T(()=>a.value?.timeoutReclaimable??null),d=T(()=>{const _=o.value?.estimatedMinutes??0;return _<60?`${Math.round(_)} min`:`${Math.round(_/60*10)/10} h`});return(_,w)=>{const I=bt,N=G,M=q,U=H,O=Y,nt=it,tt=Q,Nt=ut;return s(),x(Nt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t($),help:"analytics.wasted-time"},{legend:f(()=>[k(I,{items:c,dense:""})]),default:f(()=>[t(R)?(s(),x(N,{key:0})):t(u)?(s(),x(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in _?_.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(M,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:w[0]||(w[0]=z=>t(j)())},{default:f(()=>[...w[1]||(w[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(m)?(s(),v("div",xs,[k(t(xt),{ref_key:"xyContainerRef",ref:E,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(h)},{default:f(()=>[k(t(Dt),{x:r,y:[z=>z.waitMinutes,z=>z.failedExecMinutes],color:i,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),k(t(Z),{type:"x","tick-format":z=>new Date(z).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),k(t(Z),{type:"y",label:"Minutes","tick-format":z=>z.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(S)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(y).x}px`,top:`${t(y).y}px`})},[n("div",vs,[n("div",ks,g(new Date(t(S).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),n("div",null,[w[2]||(w[2]=n("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+g(t(S).waitMinutes)+" min",1)]),n("div",null,[w[3]||(w[3]=n("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+g(t(S).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",$s,[k(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),n("div",Ss,[w[5]||(w[5]=D(" Up to ",-1)),n("span",Cs,"≈"+g(t(d)),1),D(" of this is avoidable — "+g(t(o).oversizedCount)+" oversized "+g(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+g(t(o).staleSlowCount)+" stale ",1),w[6]||(w[6]=n("code",{class:"text-xs"},"test.slow()",-1)),D(" "+g(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),x(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...w[4]||(w[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(a)&&t(a).byProject.length>0?(s(),v("div",ws,[(s(!0),v(V,null,L(t(a).byProject.slice(0,5),z=>(s(),v("div",{key:z.projectId,class:"flex items-center justify-between text-sm"},[k(tt,{to:`/projects/${z.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(g(z.label||z.name),1)]),_:2},1032,["to"]),n("span",Ms,g(Math.round(z.waitMinutes+z.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),x(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Es=Object.assign(Rs,{__name:"WastedTimeChart"}),js={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Ds={class:"flex-1 min-w-0"},Ts={class:"text-sm font-medium truncate"},Vs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Is={class:"text-right shrink-0"},Ps=B({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("flaky-leaderboard",()=>p.query)),e=await e,l(),e);function b(r){return r>=60?"text-red-600 dark:text-red-400":r>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function m(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,i)=>{const E=G,S=q,y=H,h=Y,c=Rt,$=Q,o=K;return s(),x(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(a)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=d=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).length===0?(s(),x(h,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",js,[(s(!0),v(V,null,L(t(a),d=>(s(),x($,{key:`${d.projectId}-${d.testCaseId}`,to:`/test-cases/${d.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[n("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},g(d.score),3),n("div",Ds,[n("p",Ts,g(d.title),1),n("p",Vs,[D(g(d.projectLabel||d.projectName)+" · "+g(m(d))+" ",1),d.lastFlakeAt?(s(),v(V,{key:0},[D(" · last "+g(("formatRelativeTime"in r?r.formatRelativeTime:t(lt))(d.lastFlakeAt)),1)],64)):P("",!0)])]),n("div",Is,[n("p",{class:A(["text-sm tabular-nums",d.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":d.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},g(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),x(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ns=Object.assign(Ps,{__name:"GlobalFlakyLeaderboard"}),As={key:3,class:"space-y-4"},Ls={key:0,class:"flex flex-wrap gap-1.5"},Os={class:"divide-y divide-gray-100 dark:divide-gray-800"},zs={class:"flex-1 min-w-0"},Bs={class:"text-sm font-medium truncate"},Us={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Fs={class:"text-right text-xs shrink-0"},qs={class:"tabular-nums font-medium"},Ws=B({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("cluster-landscape",()=>p.query)),e=await e,l(),e);function b(m){return m>=30?"text-red-600 dark:text-red-400":m>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(m,r)=>{const i=G,E=q,S=H,y=Y,h=fe,c=he,$=Mt,o=Q,d=K;return s(),x(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(R)?(s(),x(i,{key:0})):t(u)?(s(),x(S,{key:1,text:`Couldn't load clusters: ${("errorMessage"in m?m.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(E,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=_=>t(j)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).totalOpen===0&&t(a).resolvedInPeriod===0?(s(),x(y,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",As,[k(c,null,{default:f(()=>[k(h,{label:"Open",value:t(a).totalOpen,"value-class":t(a).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),k(h,{label:"Resolved this period",value:t(a).resolvedInPeriod},null,8,["value"]),k(h,{label:"Oldest open",value:t(a).clusters.length>0?`${Math.max(...t(a).clusters.map(_=>_.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(a).byErrorType.length>0?(s(),v("div",Ls,[(s(!0),v(V,null,L(t(a).byErrorType,_=>(s(),x($,{key:_.errorType,color:("clusterErrorTypeColor"in m?m.clusterErrorTypeColor:t(Zt))(_.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(g(_.errorType)+" · "+g(_.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),n("div",Os,[(s(!0),v(V,null,L(t(a).clusters.slice(0,8),_=>(s(),x(o,{key:_.id,to:`/failure-clusters/${_.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[n("div",zs,[n("p",Bs,g(_.title||_.signature),1),n("p",Us,[D(g(_.projectLabel||_.projectName)+" ",1),_.errorType?(s(),v(V,{key:0},[D(" · "+g(_.errorType),1)],64)):P("",!0)])]),n("div",Fs,[n("p",qs,g(_.occurrences)+"×",1),n("p",{class:A(["tabular-nums",b(_.ageDays)])},g(_.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Gs=Object.assign(Ws,{__name:"ClusterLandscape"}),Hs={key:3,class:"w-full"},Ys=B({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("regression-velocity",()=>p.query)),e=await e,l(),e),b=T(()=>a.value?.points.map(h=>({date:new Date(h.date),regressions:h.regressions,newFlaky:h.newFlaky}))??[]),m=T(()=>b.value.some(h=>h.regressions>0||h.newFlaky>0)),r=h=>h.date,i=["rgb(239, 68, 68)","rgb(147, 51, 234)"],E=[{color:i[0],label:"New regressions"},{color:i[1],label:"Newly flaky"}],S=T(()=>{if(!a.value||a.value.deltaPct===null)return null;const h=a.value.deltaPct;return{label:`${h>0?"+":""}${h}% vs previous period`,class:h>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),y=T(()=>{if(a.value)return`${a.value.totalRegressions} new regressions, ${a.value.totalNewFlaky} newly flaky`});return(h,c)=>{const $=bt,o=G,d=q,_=H,w=Y,I=ut;return s(),x(I,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(y),help:"analytics.regression-velocity"},{legend:f(()=>[k($,{items:E,dense:""})]),actions:f(()=>[t(S)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(S).class])},g(t(S).label),3)):P("",!0)]),default:f(()=>[t(R)?(s(),x(o,{key:0})):t(u)?(s(),x(_,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in h?h.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=N=>t(j)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(m)?(s(),v("div",Hs,[k(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[k(t(Se),{x:r,y:[N=>N.regressions,N=>N.newFlaky],color:i,"rounded-corners":2},null,8,["y"]),k(t(Z),{type:"x","tick-format":N=>new Date(N).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),k(t(Z),{type:"y",label:"Count","tick-format":N=>N.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),x(w,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Xs=Object.assign(Ys,{__name:"RegressionVelocityChart"}),Js={class:"w-full text-sm border-separate border-spacing-1"},Qs={class:"pr-2 max-w-[12rem]"},Zs=["title"],Ks=B({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("browser-matrix",()=>p.query)),e=await e,l(),e);function b(m){return m===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":m>=99.5?"bg-green-500/85 text-white":m>=90?"bg-green-500/45":m>=75?"bg-amber-500/50":m>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(m,r)=>{const i=G,E=q,S=H,y=Y,h=Q,c=ct,$=K;return s(),x($,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(R)?(s(),x(i,{key:0})):t(u)?(s(),x(S,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in m?m.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(E,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(j)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).rows.length===0?(s(),x(y,{key:2,text:"No runs with browser data in this period."})):(s(),x(c,{key:3,"min-width":"30rem"},{default:f(()=>[n("table",Js,[n("thead",null,[n("tr",null,[r[2]||(r[2]=n("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(V,null,L(t(a).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},g(o),1))),128))])]),n("tbody",null,[(s(!0),v(V,null,L(t(a).rows,o=>(s(),v("tr",{key:o.projectId},[n("td",Qs,[k(h,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(g(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(V,null,L(o.cells,(d,_)=>(s(),v("td",{key:_,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(a).browsers[_]}: ${d!==null?`${d}% passed`:"no tests"}`},g(d!==null?`${Math.round(d)}%`:"—"),11,Zs))),128))]))),128))])])]),_:1}))]),_:1})}}}),ta=Object.assign(Ks,{__name:"BrowserMatrix"}),ea={class:"md:hidden space-y-3"},sa={class:"flex items-center gap-2 min-w-0"},aa={class:"text-xs truncate"},na={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ra={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},oa={class:"hidden md:block"},la={class:"w-full text-sm"},ia={class:"divide-y divide-gray-100 dark:divide-gray-800"},ca={class:"py-2.5 pr-4"},da={class:"flex items-center gap-2 min-w-0"},ua=["title"],ma={class:"py-2.5 pr-4 text-right tabular-nums"},pa={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},_a={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ya={class:"py-2.5 text-right tabular-nums"},ga=B({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("slow-endpoints",()=>p.query)),e=await e,l(),e);function b(r){return r>=1e3?"text-red-600 dark:text-red-400":r>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function m(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,i)=>{const E=G,S=q,y=H,h=Y,c=Mt,$=ct,o=K;return s(),x(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(a)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=d=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).endpoints.length===0?(s(),x(h,{key:2,icon:"i-lucide-network",text:"No network requests captured in this period."})):(s(),v(V,{key:3},[n("div",ea,[(s(!0),v(V,null,L(t(a).endpoints,d=>(s(),v("div",{key:`${d.method} ${d.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[n("div",sa,[k(c,{color:m(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(g(d.method),1)]),_:2},1032,["color"]),n("code",aa,g(d.route),1)]),n("div",na,[n("span",null,[i[2]||(i[2]=D("p90 ",-1)),n("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},g(d.p90Ms)+" ms",3)]),n("span",null,g(d.requests)+" reqs · "+g(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ra,g(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),n("div",oa,[k($,{"min-width":"44rem"},{default:f(()=>[n("table",la,[i[3]||(i[3]=n("thead",null,[n("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[n("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),n("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),n("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),n("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),n("tbody",ia,[(s(!0),v(V,null,L(t(a).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[n("td",ca,[n("div",da,[k(c,{color:m(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(g(d.method),1)]),_:2},1032,["color"]),n("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},g(d.route),9,ua)])]),n("td",ma,g(d.requests),1),n("td",pa,g(d.p50Ms)+" ms",1),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},g(d.p90Ms)+" ms ",3),n("td",_a,g(d.maxMs)+" ms",1),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",d.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},g(d.errorRate)+"% ",3),n("td",ya,g(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ha=Object.assign(ga,{__name:"SlowEndpointsTable"}),fa={class:"space-y-6"},ba={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},an=B({__name:"analytics",async setup(C){let e,l;Gt({title:"Analytics - Piwi Dashboard"});const{state:p,scopeQuery:a}=Me(),{data:R}=([e,l]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$jZuDAh0IrH")),e=await e,l(),e),{data:u}=([e,l]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$lmj5ErCURQ")),e=await e,l(),e),j=T(()=>{const E=new Set;for(const S of u.value??[])S.environment&&E.add(S.environment);return[...E].sort()}),b=T(()=>{const E=u.value??[];return E.length===0?null:Math.max(...E.map(S=>new Date(S.startTime).getTime()))}),m=T(()=>{if(b.value===null||p.value.days>=ht)return!1;const E=Date.now()-p.value.days*24*60*60*1e3;return b.value<E});function r(){p.value={...p.value,days:ht}}const i={insights:Be,portfolio:os,"pass-rate-heatmap":ps,"ci-time-trend":bs,"wasted-time":Es,"flaky-leaderboard":Ns,"cluster-landscape":Gs,"regression-velocity":Xs,"browser-matrix":ta,"slow-endpoints":ha};return(E,S)=>{const y=At,h=Lt,c=zt,$=Pe,o=Jt,d=Qt,_=Ot;return s(),x(_,{id:"analytics"},{header:f(()=>[k(c,null,{leading:f(()=>[k(y),k(h,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[n("div",fa,[k(o,null,{default:f(()=>[k($,{modelValue:t(p),"onUpdate:modelValue":S[0]||(S[0]=w=>at(p)?p.value=w:null),"available-projects":t(R),"available-environments":t(j)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(m)?(s(),x(d,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(p).days} days`,description:`Your most recent run was ${("formatRelativeTime"in E?E.formatRelativeTime:t(lt))(t(b))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:r}]},null,8,["title","description","actions"])):P("",!0),n("div",ba,[(s(!0),v(V,null,L(t(Pt),w=>(s(),v("div",{key:w.id,class:A(w.size==="full"?"xl:col-span-2":"")},[(s(),x(wt(i[w.id]),{query:t(a)},null,8,["query"]))],2))),128))])])]),_:1})}}});export{an as default};
|
|
34
|
+
`,ke=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:gt,barGroupExit:Vt,globalStyles:ve,root:Tt},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=xe,this.config=this._defaultConfig,this.getAccessors=()=>oe(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],l=this.dataScale.domain(),p=this._getBarWidth()/2,a=this._barData.map((S,y)=>et(S,this.config.x,y)),R=mt(a),u=le(a),j=this.dataScale(R),b=this.dataScale(u),m=this.dataScale.invert(j+(e?p:-p)),r=this.dataScale.invert(b+(e?-p:p)),i=m<=l[0]?this.dataScale(l[0])-this.dataScale(m):0,E=r>l[1]?this.dataScale(r)-this.dataScale(l[1]):0;return{top:this.isVertical()?0:e?-E:i,bottom:this.isVertical()?0:e?-i:E,left:this.isVertical()?i:0,right:this.isVertical()?E:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Et.Vertical}_render(e){const{config:l}=this,p=kt(e)?e:l.duration,a=this.getAccessors(),R=ie(this._barData,0,a,this._prevNegative);this._prevNegative=R.map(y=>!!y.isMostlyNegative);const u=this.g.selectAll(`.${gt}`).data(this._barData,(y,h)=>{var c;return`${(c=$t(y,l.id,h))!==null&&c!==void 0?c:h}`}),j=(y,h)=>{const c=this.dataScale(et(y,l.x,h)),$=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${$},${o})`},m=u.enter().append("g").attr("class",gt).attr("transform",j).style("opacity",1).merge(u);st(m,p).attr("transform",j).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,p).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),p).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const i=m.selectAll(`.${rt}`).data((y,h)=>{const c=R.map(($,o)=>({datum:y,index:h,stacked:$[h],stackIndex:o})).filter($=>$.stacked[0]!==$.stacked[1]);return c.forEach(($,o)=>{$.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==$.stacked[1]}),c},y=>y.stackIndex),S=i.enter().append("path").attr("class",rt).attr("d",y=>this._getBarPath(y,!0)).style("fill",y=>St(y.datum,l.color,y.stackIndex)).merge(i);st(S,p).attr("d",y=>this._getBarPath(y)).style("fill",y=>St(y.datum,l.color,y.stackIndex)).style("cursor",y=>$t(y.datum,l.cursor,y.stackIndex)),st(i.exit(),p).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:l}}=this;if(ce(l))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const p=this.dataScale.bandwidth,a=this.dataScale.domain?this.dataScale.domain():[];let u=1+(p?a.length:a[1]-a[0])/e.dataStep||!p&&l.filter((m,r)=>{const i=et(m,e.x,r);return i>=a[0]&&i<=a[1]}).length||l.length;!p&&u>=2&&(u+=1);const b=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return mt([b,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:l}}=this,p=this._getBarWidth(),a=l.length<2?0:p/2,R=this.dataScale,u=Math.abs(R.invert(a)-R.invert(0));return l?.filter((b,m)=>{const r=et(b,e.x,m),i=R.domain(),E=+i[0],S=+i[1];return r>=E-u&&r<=S+u})}_getBarPath(e,l=!1){const{config:p}=this,a=this.getAccessors(),R=this._getBarWidth(),u=e.stacked[1]<0,j=e.isEnding,b=et(e.datum,a[e.stackIndex],e.index),m=l?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!l&&p.barMinHeight1Px&&m<1&&isFinite(b)&&b!==p.barMinHeightZeroValue?1:m,i=l?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(m<1&&p.barMinHeight1Px?1:0),E=-R/2,S=R,y=p.roundedCorners?kt(p.roundedCorners)?+p.roundedCorners:S/2:0,h=me(y,0,Math.min(m,S)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return be({x:this.isVertical()?E:i-r,y:this.isVertical()?i+(c?0:-r):E,w:this.isVertical()?S:r,h:this.isVertical()?r:S,tl:j&&(this.isVertical()?!u&&c||u&&!c:u),tr:j&&(this.isVertical()?!u&&c||u&&!c:!u),br:j&&(this.isVertical()?u&&c||!u&&!c:!u),bl:j&&(this.isVertical()?u&&c||!u&&!c:u),r:h})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:l}=this,p=this.getAccessors(),a=e?this._getVisibleData():l.data;return de(a,...p)}getDataScaleExtent(){const{config:e,datamodel:l}=this;return ue(l.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=ke;const $e={"data-vis-component":""},Se=B({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(C,{expose:e}){const l=Ut(pe),p=C,a=T(()=>l.data.value??p.data),R=_e(p),u=ft();return Ft(()=>{qt(()=>{u.value=new It(R.value),u.value?.setData(a.value),l.update(u.value)})}),Wt(()=>{u.value?.destroy(),l.destroy()}),vt(R,(j,b)=>{ye(j,b)||(u.value?.setConfig(R.value),u.value?.render())}),vt(a,()=>{u.value?.setData(a.value)}),e({component:u}),(j,b)=>(s(),v("div",$e))}}),Ce=30,ht=3650;function we(C){const e={days:String(C.days)};return C.projectIds&&C.projectIds.length>0&&(e.projects=C.projectIds.join(",")),C.environment&&(e.environment=C.environment),C.fullRunsOnly||(e.fullRunsOnly="false"),e}const J={days:Ce,projectIds:[],environment:null,fullRunsOnly:!0};function Me(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:p=>JSON.stringify(p),decode:p=>{try{return p?{...J,...JSON.parse(p)}:{...J}}catch{return{...J}}}}),e=T(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),l=T(()=>we(e.value));return{state:C,scope:e,scopeQuery:l}}function X(C,e){return _t(`/api/analytics/${C}`,{query:T(e),lazy:!0,server:!1},"$EEH4o0rJ7t")}const Re={class:"flex items-center gap-3 flex-wrap"},Ee={class:"flex items-center gap-1.5"},je={key:0,class:"text-gray-500"},De={key:1,class:"truncate"},Te={key:2},Ve={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},pt="All environments",Ie=B({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const l=C,p=e,a=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:ht}],R=T({get:()=>l.modelValue.days,set:y=>p("update:modelValue",{...l.modelValue,days:y})}),u=T(()=>l.availableProjects.map(y=>({label:y.label||y.name,value:y.id}))),j=T({get:()=>l.modelValue.projectIds,set:y=>p("update:modelValue",{...l.modelValue,projectIds:y})});function b(y){return u.value.find(h=>h.value===y)?.label??`#${y}`}const m=T({get:()=>l.modelValue.environment??pt,set:y=>p("update:modelValue",{...l.modelValue,environment:y===pt?null:y})}),r=T(()=>[pt,...l.availableEnvironments]),i=T({get:()=>l.modelValue.fullRunsOnly,set:y=>p("update:modelValue",{...l.modelValue,fullRunsOnly:y})}),E=T(()=>l.modelValue.days===J.days&&l.modelValue.projectIds.length===0&&l.modelValue.environment===null&&l.modelValue.fullRunsOnly===J.fullRunsOnly);function S(){p("update:modelValue",{...J})}return(y,h)=>{const c=Bt,$=it,o=Ht,d=Yt,_=q;return s(),v("div",Re,[k(c,{modelValue:t(R),"onUpdate:modelValue":h[0]||(h[0]=w=>at(R)?R.value=w:null),items:a,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),x(o,{key:0,modelValue:t(j),"onUpdate:modelValue":h[1]||(h[1]=w=>at(j)?j.value=w:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:w})=>[n("div",Ee,[k($,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",w.length?"text-primary":"text-gray-400"])},null,8,["class"]),w.length?w.length===1?(s(),v("span",De,g(b(w[0])),1)):(s(),v("span",Te,g(w.length)+" projects",1)):(s(),v("span",je,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),x(c,{key:1,modelValue:t(m),"onUpdate:modelValue":h[2]||(h[2]=w=>at(m)?m.value=w:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),n("label",Ve,[k(d,{modelValue:t(i),"onUpdate:modelValue":h[3]||(h[3]=w=>at(i)?i.value=w:null),size:"sm"},null,8,["modelValue"]),h[4]||(h[4]=D(" Full runs only ",-1))]),t(E)?P("",!0):(s(),x(_,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:S},{default:f(()=>[...h[5]||(h[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ie,{__name:"AnalyticsScopeBar"}),Pt=[{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half"},{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full"}];new Set(Pt.map(C=>C.id));const Ne={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Ae={class:"min-w-0"},Le={class:"text-sm font-medium"},Oe={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},ze=B({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("insights",()=>p.query)),e=await e,l(),e),b=Q,m={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(r,i)=>{const E=G,S=q,y=H,h=Y,c=it,$=K;return s(),x($,{icon:"i-lucide-lightbulb",title:"Insights",count:t(a)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=o=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).length===0?(s(),x(h,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Ne,[(s(!0),v(V,null,L(t(a),o=>(s(),x(wt(o.to?t(b):"div"),{key:o.id,to:o.to,class:A(["flex items-start gap-3 py-3 pl-3 border-l-2",[m[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[k(c,{name:m[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",m[o.severity].class])},null,8,["name","class"]),n("div",Ae,[n("p",Le,g(o.message),1),o.detail?(s(),v("p",Oe,g(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Be=Object.assign(ze,{__name:"InsightsFeed"}),Ue={class:"md:hidden space-y-3"},Fe={class:"flex items-center justify-between gap-2"},qe={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},We={key:0},Ge={class:"hidden md:block"},He={class:"w-full text-sm"},Ye={class:"divide-y divide-gray-100 dark:divide-gray-800"},Xe={class:"py-2.5 pr-4"},Je={class:"flex items-center gap-2 min-w-0"},Qe={class:"py-2.5 pr-4"},Ze={class:"w-36"},Ke={class:"py-2.5 pr-4 text-right"},ts={class:"py-2.5 pr-4 text-right tabular-nums"},es={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ss={class:"py-2.5 text-right"},as={class:"text-xs text-gray-500 dark:text-gray-400"},ns={key:1,class:"text-xs text-gray-400"},rs=B({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("portfolio",()=>p.query)),e=await e,l(),e);function b(r){return r===null?"text-gray-400":r>=90?"text-green-600 dark:text-green-400":r>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function m(r){return r===null||Math.abs(r)<1?null:r>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(r,i)=>{const E=G,S=q,y=H,h=Y,c=Q,$=Kt,o=Rt,d=it,_=te,w=ee,I=ct,N=K;return s(),x(N,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(a)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=M=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).length===0?(s(),x(h,{key:2,text:"No projects with runs in this period."})):(s(),v(V,{key:3},[n("div",Ue,[(s(!0),v(V,null,L(t(a),M=>(s(),v("div",{key:M.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[n("div",Fe,[k(c,{to:`/projects/${M.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(g(M.label||M.name),1)]),_:2},1032,["to"]),n("span",{class:A(["tabular-nums font-semibold shrink-0",b(M.passRate)])},g(M.passRate!==null?`${M.passRate}%`:"—"),3)]),k($,{runs:M.recentRuns,height:20},null,8,["runs"]),n("div",qe,[n("span",null,g(M.runCount)+" runs · "+g(M.flakyTests)+" flaky · "+g(M.openClusters)+" open clusters",1),M.latestRun?(s(),v("span",We,g(("formatRelativeTime"in r?r.formatRelativeTime:t(lt))(M.latestRun.startTime)),1)):P("",!0)])]))),128))]),n("div",Ge,[k(I,{"min-width":"52rem"},{default:f(()=>[n("table",He,[i[2]||(i[2]=n("thead",null,[n("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[n("th",{class:"py-2 pr-4 font-medium"},"Project"),n("th",{class:"py-2 pr-4 font-medium"},"Trend"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),n("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),n("tbody",Ye,[(s(!0),v(V,null,L(t(a),M=>(s(),v("tr",{key:M.projectId},[n("td",Xe,[n("div",Je,[k(c,{to:`/projects/${M.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(g(M.label||M.name),1)]),_:2},1032,["to"]),(s(!0),v(V,null,L(M.tags.slice(0,2),U=>(s(),x(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),n("td",Qe,[n("div",Ze,[k($,{runs:M.recentRuns,height:22},null,8,["runs"])])]),n("td",Ke,[n("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(M.passRate)])},[D(g(M.passRate!==null?`${M.passRate}%`:"—")+" ",1),m(M.passRateDelta)?(s(),x(d,{key:0,name:m(M.passRateDelta).icon,class:A(["size-3.5",m(M.passRateDelta).class]),title:`${M.passRateDelta>0?"+":""}${M.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),n("td",ts,g(M.runCount),1),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",M.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},g(M.flakyTests),3),n("td",es,[k(_,{ms:M.avgRunDurationMs},null,8,["ms"])]),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",M.openClusters>0?"text-red-600 dark:text-red-400":""])},g(M.openClusters),3),n("td",ss,[M.latestRun?(s(),x(c,{key:0,to:`/test-runs/${M.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[k(w,{status:M.latestRun.status},null,8,["status"]),n("span",as,g(("formatRelativeTime"in r?r.formatRelativeTime:t(lt))(M.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",ns,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),os=Object.assign(rs,{__name:"PortfolioScorecard"}),ls={class:"space-y-1"},is={class:"flex gap-px"},cs=["title"],ds={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},us={class:"relative h-4"},ms=B({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("pass-rate-heatmap",()=>p.query)),e=await e,l(),e);function b(c){return c===null?{}:c>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:c>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:c>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:c>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function m(c,$,o){const d=a.value?.buckets[$]??"",_=(a.value?.bucketDays??1)>1?` (${a.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${_}: ${o!==null?`${o}% passed`:"no runs"}`}const r=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],i=T(()=>{const c=a.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],S=T(()=>{const c=a.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function y(c){const[$,o,d]=c.split("-"),_=E[Number(o)-1];return S.value?`${_} ${$}`:`${_} ${Number(d)}`}const h=T(()=>{const c=a.value?.buckets??[],$=c.length;if($===0)return[];const o=Math.min(S.value?4:5,$),d=new Set,_=[];for(let w=0;w<o;w++){const I=o===1?0:Math.round(w*($-1)/(o-1));if(d.has(I))continue;d.add(I);const N=I===0?0:I===$-1?100:(I+.5)/$*100,M=I===0?"translateX(0)":I===$-1?"translateX(-100%)":"translateX(-50%)";_.push({index:I,label:y(c[I]),left:N,transform:M})}return _});return(c,$)=>{const o=G,d=q,_=H,w=Y,I=Q,N=bt,M=ct,U=ut;return s(),x(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(i),help:"analytics.heatmap"},{default:f(()=>[t(R)?(s(),x(o,{key:0})):t(u)?(s(),x(_,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=O=>t(j)())},{default:f(()=>[...$[1]||($[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).rows.length===0?(s(),x(w,{key:2,text:"No runs in this period."})):(s(),x(M,{key:3,"min-width":"22rem"},{default:f(()=>[n("div",ls,[(s(!0),v(V,null,L(t(a).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[k(I,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(g(O.label||O.name),1)]),_:2},1032,["to","title"]),n("div",is,[(s(!0),v(V,null,L(O.cells,(nt,tt)=>(s(),v("div",{key:tt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:ot(b(nt)),title:m(O,tt,nt)},null,12,cs))),128))])]))),128)),n("div",ds,[$[2]||($[2]=n("span",null,null,-1)),n("div",us,[(s(!0),v(V,null,L(t(h),O=>(s(),v("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:ot({left:`${O.left}%`,transform:O.transform})},g(O.label),5))),128))])]),k(N,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ps=Object.assign(ms,{__name:"PassRateHeatmap"}),_s={key:3,class:"w-full relative"},ys={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},gs={class:"font-semibold mb-1"},hs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",fs=B({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("ci-time-trend",()=>p.query)),e=await e,l(),e),b=T(()=>a.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),m=T(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,i=o=>o.totalMinutes,E=ft(null),{tooltipData:S,tooltipPos:y,onRenderComplete:h}=jt(E,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=T(()=>{if(!a.value||a.value.deltaPct===null)return null;const o=a.value.deltaPct;return{label:`${o>0?"+":""}${o}% vs previous period`,class:o>25?"text-red-600 dark:text-red-400":o<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),$=T(()=>{if(!a.value)return;const o=a.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${a.value.runCount} runs`});return(o,d)=>{const _=G,w=q,I=H,N=Y,M=ut;return s(),x(M,{icon:"i-lucide-timer",title:"CI time",subtitle:t($),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},g(t(c).label),3)):P("",!0)]),default:f(()=>[t(R)?(s(),x(_,{key:0})):t(u)?(s(),x(I,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(j)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(m)?(s(),v("div",_s,[k(t(xt),{ref_key:"xyContainerRef",ref:E,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(h)},{default:f(()=>[k(t(Dt),{x:r,y:i,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),k(t(ge),{x:r,y:i,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),k(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),k(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(S)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(y).x}px`,top:`${t(y).y}px`})},[n("div",ys,[n("div",gs,g(new Date(t(S).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),n("div",null,g(t(S).totalMinutes)+" minutes",1),n("div",hs,g(t(S).runCount)+" runs",1)])],4)):P("",!0)])):(s(),x(N,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),bs=Object.assign(fs,{__name:"CiTimeTrendChart"}),xs={key:3,class:"w-full relative"},vs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},ks={class:"font-semibold mb-1"},$s={key:1,class:"mt-4 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2.5 text-sm dark:border-amber-900/50 dark:bg-amber-950/30"},Ss={class:"text-gray-700 dark:text-gray-300"},Cs={class:"font-semibold"},ws={key:2,class:"mt-4 space-y-1"},Ms={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},Rs=B({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("wasted-time",()=>p.query)),e=await e,l(),e),b=T(()=>a.value?.points.map(_=>({date:new Date(_.date),waitMinutes:_.waitMinutes,failedExecMinutes:_.failedExecMinutes}))??[]),m=T(()=>b.value.some(_=>_.waitMinutes>0||_.failedExecMinutes>0)),r=_=>_.date,i=["rgb(245, 158, 11)","rgb(239, 68, 68)"],E=ft(null),{tooltipData:S,tooltipPos:y,onRenderComplete:h}=jt(E,b,{x:_=>_.date,series:[{y:_=>_.waitMinutes,color:i[0]},{y:_=>_.failedExecMinutes,color:i[1]}]}),c=[{color:i[0],label:"Wait steps"},{color:i[1],label:"Failed attempts"}],$=T(()=>{if(!a.value)return;const _=a.value.totalWaitMinutes+a.value.totalFailedExecMinutes;return`${_<60?`${Math.round(_)} min`:`${Math.round(_/60*10)/10} h`} of CI time produced no signal`}),o=T(()=>a.value?.timeoutReclaimable??null),d=T(()=>{const _=o.value?.estimatedMinutes??0;return _<60?`${Math.round(_)} min`:`${Math.round(_/60*10)/10} h`});return(_,w)=>{const I=bt,N=G,M=q,U=H,O=Y,nt=it,tt=Q,Nt=ut;return s(),x(Nt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t($),help:"analytics.wasted-time"},{legend:f(()=>[k(I,{items:c,dense:""})]),default:f(()=>[t(R)?(s(),x(N,{key:0})):t(u)?(s(),x(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in _?_.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(M,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:w[0]||(w[0]=z=>t(j)())},{default:f(()=>[...w[1]||(w[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(m)?(s(),v("div",xs,[k(t(xt),{ref_key:"xyContainerRef",ref:E,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(h)},{default:f(()=>[k(t(Dt),{x:r,y:[z=>z.waitMinutes,z=>z.failedExecMinutes],color:i,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),k(t(Z),{type:"x","tick-format":z=>new Date(z).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),k(t(Z),{type:"y",label:"Minutes","tick-format":z=>z.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(S)?(s(),v("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[240px]",style:ot({left:`${t(y).x}px`,top:`${t(y).y}px`})},[n("div",vs,[n("div",ks,g(new Date(t(S).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),n("div",null,[w[2]||(w[2]=n("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+g(t(S).waitMinutes)+" min",1)]),n("div",null,[w[3]||(w[3]=n("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+g(t(S).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",$s,[k(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),n("div",Ss,[w[5]||(w[5]=D(" Up to ",-1)),n("span",Cs,"≈"+g(t(d)),1),D(" of this is avoidable — "+g(t(o).oversizedCount)+" oversized "+g(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+g(t(o).staleSlowCount)+" stale ",1),w[6]||(w[6]=n("code",{class:"text-xs"},"test.slow()",-1)),D(" "+g(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),x(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...w[4]||(w[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(a)&&t(a).byProject.length>0?(s(),v("div",ws,[(s(!0),v(V,null,L(t(a).byProject.slice(0,5),z=>(s(),v("div",{key:z.projectId,class:"flex items-center justify-between text-sm"},[k(tt,{to:`/projects/${z.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(g(z.label||z.name),1)]),_:2},1032,["to"]),n("span",Ms,g(Math.round(z.waitMinutes+z.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),x(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Es=Object.assign(Rs,{__name:"WastedTimeChart"}),js={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Ds={class:"flex-1 min-w-0"},Ts={class:"text-sm font-medium truncate"},Vs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Is={class:"text-right shrink-0"},Ps=B({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("flaky-leaderboard",()=>p.query)),e=await e,l(),e);function b(r){return r>=60?"text-red-600 dark:text-red-400":r>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function m(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,i)=>{const E=G,S=q,y=H,h=Y,c=Rt,$=Q,o=K;return s(),x(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(a)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=d=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).length===0?(s(),x(h,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",js,[(s(!0),v(V,null,L(t(a),d=>(s(),x($,{key:`${d.projectId}-${d.testCaseId}`,to:`/test-cases/${d.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[n("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},g(d.score),3),n("div",Ds,[n("p",Ts,g(d.title),1),n("p",Vs,[D(g(d.projectLabel||d.projectName)+" · "+g(m(d))+" ",1),d.lastFlakeAt?(s(),v(V,{key:0},[D(" · last "+g(("formatRelativeTime"in r?r.formatRelativeTime:t(lt))(d.lastFlakeAt)),1)],64)):P("",!0)])]),n("div",Is,[n("p",{class:A(["text-sm tabular-nums",d.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":d.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},g(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),x(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ns=Object.assign(Ps,{__name:"GlobalFlakyLeaderboard"}),As={key:3,class:"space-y-4"},Ls={key:0,class:"flex flex-wrap gap-1.5"},Os={class:"divide-y divide-gray-100 dark:divide-gray-800"},zs={class:"flex-1 min-w-0"},Bs={class:"text-sm font-medium truncate"},Us={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Fs={class:"text-right text-xs shrink-0"},qs={class:"tabular-nums font-medium"},Ws=B({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("cluster-landscape",()=>p.query)),e=await e,l(),e);function b(m){return m>=30?"text-red-600 dark:text-red-400":m>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(m,r)=>{const i=G,E=q,S=H,y=Y,h=fe,c=he,$=Mt,o=Q,d=K;return s(),x(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(R)?(s(),x(i,{key:0})):t(u)?(s(),x(S,{key:1,text:`Couldn't load clusters: ${("errorMessage"in m?m.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(E,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=_=>t(j)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).totalOpen===0&&t(a).resolvedInPeriod===0?(s(),x(y,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",As,[k(c,null,{default:f(()=>[k(h,{label:"Open",value:t(a).totalOpen,"value-class":t(a).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),k(h,{label:"Resolved this period",value:t(a).resolvedInPeriod},null,8,["value"]),k(h,{label:"Oldest open",value:t(a).clusters.length>0?`${Math.max(...t(a).clusters.map(_=>_.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(a).byErrorType.length>0?(s(),v("div",Ls,[(s(!0),v(V,null,L(t(a).byErrorType,_=>(s(),x($,{key:_.errorType,color:("clusterErrorTypeColor"in m?m.clusterErrorTypeColor:t(Zt))(_.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(g(_.errorType)+" · "+g(_.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),n("div",Os,[(s(!0),v(V,null,L(t(a).clusters.slice(0,8),_=>(s(),x(o,{key:_.id,to:`/failure-clusters/${_.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[n("div",zs,[n("p",Bs,g(_.title||_.signature),1),n("p",Us,[D(g(_.projectLabel||_.projectName)+" ",1),_.errorType?(s(),v(V,{key:0},[D(" · "+g(_.errorType),1)],64)):P("",!0)])]),n("div",Fs,[n("p",qs,g(_.occurrences)+"×",1),n("p",{class:A(["tabular-nums",b(_.ageDays)])},g(_.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Gs=Object.assign(Ws,{__name:"ClusterLandscape"}),Hs={key:3,class:"w-full"},Ys=B({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("regression-velocity",()=>p.query)),e=await e,l(),e),b=T(()=>a.value?.points.map(h=>({date:new Date(h.date),regressions:h.regressions,newFlaky:h.newFlaky}))??[]),m=T(()=>b.value.some(h=>h.regressions>0||h.newFlaky>0)),r=h=>h.date,i=["rgb(239, 68, 68)","rgb(147, 51, 234)"],E=[{color:i[0],label:"New regressions"},{color:i[1],label:"Newly flaky"}],S=T(()=>{if(!a.value||a.value.deltaPct===null)return null;const h=a.value.deltaPct;return{label:`${h>0?"+":""}${h}% vs previous period`,class:h>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),y=T(()=>{if(a.value)return`${a.value.totalRegressions} new regressions, ${a.value.totalNewFlaky} newly flaky`});return(h,c)=>{const $=bt,o=G,d=q,_=H,w=Y,I=ut;return s(),x(I,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(y),help:"analytics.regression-velocity"},{legend:f(()=>[k($,{items:E,dense:""})]),actions:f(()=>[t(S)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(S).class])},g(t(S).label),3)):P("",!0)]),default:f(()=>[t(R)?(s(),x(o,{key:0})):t(u)?(s(),x(_,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in h?h.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=N=>t(j)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(m)?(s(),v("div",Hs,[k(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[k(t(Se),{x:r,y:[N=>N.regressions,N=>N.newFlaky],color:i,"rounded-corners":2},null,8,["y"]),k(t(Z),{type:"x","tick-format":N=>new Date(N).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),k(t(Z),{type:"y",label:"Count","tick-format":N=>N.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),x(w,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Xs=Object.assign(Ys,{__name:"RegressionVelocityChart"}),Js={class:"w-full text-sm border-separate border-spacing-1"},Qs={class:"pr-2 max-w-[12rem]"},Zs=["title"],Ks=B({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("browser-matrix",()=>p.query)),e=await e,l(),e);function b(m){return m===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":m>=99.5?"bg-green-500/85 text-white":m>=90?"bg-green-500/45":m>=75?"bg-amber-500/50":m>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(m,r)=>{const i=G,E=q,S=H,y=Y,h=Q,c=ct,$=K;return s(),x($,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(R)?(s(),x(i,{key:0})):t(u)?(s(),x(S,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in m?m.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(E,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(j)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).rows.length===0?(s(),x(y,{key:2,text:"No runs with browser data in this period."})):(s(),x(c,{key:3,"min-width":"30rem"},{default:f(()=>[n("table",Js,[n("thead",null,[n("tr",null,[r[2]||(r[2]=n("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(V,null,L(t(a).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},g(o),1))),128))])]),n("tbody",null,[(s(!0),v(V,null,L(t(a).rows,o=>(s(),v("tr",{key:o.projectId},[n("td",Qs,[k(h,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(g(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(V,null,L(o.cells,(d,_)=>(s(),v("td",{key:_,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(a).browsers[_]}: ${d!==null?`${d}% passed`:"no tests"}`},g(d!==null?`${Math.round(d)}%`:"—"),11,Zs))),128))]))),128))])])]),_:1}))]),_:1})}}}),ta=Object.assign(Ks,{__name:"BrowserMatrix"}),ea={class:"md:hidden space-y-3"},sa={class:"flex items-center gap-2 min-w-0"},aa={class:"text-xs truncate"},na={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ra={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},oa={class:"hidden md:block"},la={class:"w-full text-sm"},ia={class:"divide-y divide-gray-100 dark:divide-gray-800"},ca={class:"py-2.5 pr-4"},da={class:"flex items-center gap-2 min-w-0"},ua=["title"],ma={class:"py-2.5 pr-4 text-right tabular-nums"},pa={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},_a={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ya={class:"py-2.5 text-right tabular-nums"},ga=B({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,l;const p=C,{data:a,pending:R,error:u,refresh:j}=([e,l]=F(()=>X("slow-endpoints",()=>p.query)),e=await e,l(),e);function b(r){return r>=1e3?"text-red-600 dark:text-red-400":r>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function m(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,i)=>{const E=G,S=q,y=H,h=Y,c=Mt,$=ct,o=K;return s(),x(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(a)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(R)?(s(),x(E,{key:0})):t(u)?(s(),x(y,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[k(S,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:i[0]||(i[0]=d=>t(j)())},{default:f(()=>[...i[1]||(i[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(a)||t(a).endpoints.length===0?(s(),x(h,{key:2,icon:"i-lucide-network",text:"No network requests captured in this period."})):(s(),v(V,{key:3},[n("div",ea,[(s(!0),v(V,null,L(t(a).endpoints,d=>(s(),v("div",{key:`${d.method} ${d.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[n("div",sa,[k(c,{color:m(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(g(d.method),1)]),_:2},1032,["color"]),n("code",aa,g(d.route),1)]),n("div",na,[n("span",null,[i[2]||(i[2]=D("p90 ",-1)),n("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},g(d.p90Ms)+" ms",3)]),n("span",null,g(d.requests)+" reqs · "+g(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ra,g(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),n("div",oa,[k($,{"min-width":"44rem"},{default:f(()=>[n("table",la,[i[3]||(i[3]=n("thead",null,[n("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[n("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),n("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),n("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),n("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),n("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),n("tbody",ia,[(s(!0),v(V,null,L(t(a).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[n("td",ca,[n("div",da,[k(c,{color:m(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(g(d.method),1)]),_:2},1032,["color"]),n("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},g(d.route),9,ua)])]),n("td",ma,g(d.requests),1),n("td",pa,g(d.p50Ms)+" ms",1),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},g(d.p90Ms)+" ms ",3),n("td",_a,g(d.maxMs)+" ms",1),n("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",d.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},g(d.errorRate)+"% ",3),n("td",ya,g(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ha=Object.assign(ga,{__name:"SlowEndpointsTable"}),fa={class:"space-y-6"},ba={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},sn=B({__name:"analytics",async setup(C){let e,l;Gt({title:"Analytics - Piwi Dashboard"});const{state:p,scopeQuery:a}=Me(),{data:R}=([e,l]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$jZuDAh0IrH")),e=await e,l(),e),{data:u}=([e,l]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$lmj5ErCURQ")),e=await e,l(),e),j=T(()=>{const E=new Set;for(const S of u.value??[])S.environment&&E.add(S.environment);return[...E].sort()}),b=T(()=>{const E=u.value??[];return E.length===0?null:Math.max(...E.map(S=>new Date(S.startTime).getTime()))}),m=T(()=>{if(b.value===null||p.value.days>=ht)return!1;const E=Date.now()-p.value.days*24*60*60*1e3;return b.value<E});function r(){p.value={...p.value,days:ht}}const i={insights:Be,portfolio:os,"pass-rate-heatmap":ps,"ci-time-trend":bs,"wasted-time":Es,"flaky-leaderboard":Ns,"cluster-landscape":Gs,"regression-velocity":Xs,"browser-matrix":ta,"slow-endpoints":ha};return(E,S)=>{const y=At,h=Lt,c=zt,$=Pe,o=Jt,d=Qt,_=Ot;return s(),x(_,{id:"analytics"},{header:f(()=>[k(c,null,{leading:f(()=>[k(y),k(h,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[n("div",fa,[k(o,null,{default:f(()=>[k($,{modelValue:t(p),"onUpdate:modelValue":S[0]||(S[0]=w=>at(p)?p.value=w:null),"available-projects":t(R),"available-environments":t(j)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(m)?(s(),x(d,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(p).days} days`,description:`Your most recent run was ${("formatRelativeTime"in E?E.formatRelativeTime:t(lt))(t(b))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:r}]},null,8,["title","description","actions"])):P("",!0),n("div",ba,[(s(!0),v(V,null,L(t(Pt),w=>(s(),v("div",{key:w.id,class:A(w.size==="full"?"xl:col-span-2":"")},[(s(),x(wt(i[w.id]),{query:t(a)},null,8,["query"]))],2))),128))])])]),_:1})}}});export{sn as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{av as o}from"./Du2W7Jne.js";function n(){const e=o()?.vnode?.scopeId;return e?{[e]:""}:{}}export{n as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{h as e,ab as r,bD as t}from"./Du2W7Jne.js";function a(o){return e(()=>r(o)?!!t(o)?.closest("form"):!0)}export{a as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as me,a as de}from"./
|
|
1
|
+
import{_ as me,a as de}from"./CXEH9OPk.js";import{_ as pe,a as fe}from"./5A6ITZXj.js";import{_ as he}from"./CzAPFPpL.js";import{d as H,o as n,c as a,F as B,y as T,i,t as c,k as s,v as g,m as R,f as U,h as x,ay as _e,L as se,r as N,j as $,_ as Y,I as oe,l as Z,s as ee,g as P,q as Q,A as ae,p as xe,e as ye}from"./Du2W7Jne.js";import{_ as ge}from"./CAvY22RE.js";import{_ as be}from"./BrQEE053.js";import{_ as ve}from"./A1pj0VnG.js";import{_ as ke}from"./DsesNydr.js";import{_ as $e}from"./B3obW6cw.js";import{g as we}from"./DuwtTfO8.js";import{_ as Ae}from"./C1gTN4Q8.js";import{u as je}from"./DSqHUrvO.js";import{u as re}from"./BgRu_3tT.js";import{u as Ue}from"./B8zkOmwo.js";import"./KyA_4Ks-.js";import"./UdR3DBPS.js";import"./_mj6CfPa.js";const Ce=["get","post","put","patch","delete","head","options","trace"];function Se(e){switch(e.toLowerCase()){case"get":return"success";case"post":return"info";case"put":case"patch":return"warning";case"delete":return"error";default:return"neutral"}}function Oe(e,t){return`op-${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")}function qe(e){const t=new Map;for(const[r,o]of Object.entries(e?.paths??{})){if(!o)continue;const u=o.parameters??[];for(const p of Ce){const v=o[p];if(!v)continue;const f=v.tags?.[0]??"Other",y={path:r,method:p,operation:v,parameters:[...u,...v.parameters??[]],tag:f,anchor:Oe(p,r)},A=t.get(f);A?A.push(y):t.set(f,[y])}}return[...t.entries()].map(([r,o])=>({tag:r,operations:o})).sort((r,o)=>r.tag.localeCompare(o.tag))}function ie(e,t){return Array.isArray(e.security)?e.security.length>0:Array.isArray(t?.security)&&t.security.length>0}function Be(e){return Array.isArray(e.security)&&e.security.length===0}function D(e,t){if(!e?.$ref)return e;const r=/^#\/components\/schemas\/(.+)$/.exec(e.$ref);return r?.[1]?t?.components?.schemas?.[r[1]]??e:e}const Re=["administrator","reporter","user"];function ne(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Te(e){const t=e["x-required-roles"];if(!t||t.length===0)return null;const r=Re.every(o=>t.includes(o));return{roles:t,label:r?"Any signed-in user":t.map(ne).join(" or "),shortLabel:r?"Any user":t.map(o=>o==="administrator"?"Admin":ne(o)).join(" / "),elevated:!r&&!t.includes("user")}}function te(e){if(!e)return"any";if(e.$ref)return e.$ref.split("/").pop()??"object";const t=Array.isArray(e.type)?e.type.join(" | "):e.type;if(t==="array"){const r=e.items;return`array<${r?te(r):"any"}>`}return!t&&e.properties||!t&&(e.oneOf||e.anyOf||e.allOf)?"object":t??"any"}const Pe={class:"space-y-2"},Ve={class:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5"},Le={class:"font-mono text-primary"},ze={class:"text-xs text-muted font-mono"},Ie={key:0,class:"text-xs text-dimmed font-mono"},Ne={key:1,class:"text-xs font-medium text-error"},De={key:0,class:"text-muted mt-0.5"},Ee={key:1,class:"text-xs text-dimmed mt-0.5"},Je={class:"font-mono"},Me=H({__name:"ApiSchema",props:{schema:{},spec:{default:null},depth:{default:0}},setup(e){const t=e,r=x(()=>D(t.schema,t.spec)??t.schema),o=x(()=>{const f=r.value.type==="array"?D(r.value.items,t.spec):r.value,y=f?.properties;if(!y)return[];const A=new Set(f?.required??[]);return Object.entries(y).map(([h,j])=>({name:h,required:A.has(h),schema:D(j,t.spec)??j}))}),u=x(()=>(t.depth??0)<6);function p(f){const y=f.type==="array"?D(f.items,t.spec):f;return!!(y?.properties&&Object.keys(y.properties).length>0)}function v(f){return(f.enum??[]).map(y=>JSON.stringify(y)).join(", ")}return(f,y)=>{const A=le;return n(),a("div",Pe,[(n(!0),a(B,null,T(s(o),h=>(n(),a("div",{key:h.name,class:"text-sm"},[i("div",Ve,[i("code",Le,c(h.name),1),i("span",ze,c(("schemaTypeLabel"in f?f.schemaTypeLabel:s(te))(h.schema)),1),h.schema.format?(n(),a("span",Ie,"("+c(h.schema.format)+")",1)):g("",!0),h.required?(n(),a("span",Ne,"required")):g("",!0)]),h.schema.description?(n(),a("p",De,c(h.schema.description),1)):g("",!0),h.schema.enum?.length?(n(),a("p",Ee,[y[0]||(y[0]=R(" Allowed values: ",-1)),i("span",Je,c(v(h.schema)),1)])):g("",!0),s(u)&&p(h.schema)?(n(),U(A,{key:2,schema:h.schema,spec:e.spec,depth:(e.depth??0)+1,class:"mt-1.5 border-l border-default pl-3"},null,8,["schema","spec","depth"])):g("",!0)]))),128))])}}}),le=Object.assign(Me,{__name:"ApiSchema"});function He(){return{token:_e("piwi-api-token","")}}function We(e,t){return e.replace(/\{([^}]+)\}/g,(r,o)=>{const u=t[o];return u?encodeURIComponent(u):r})}function Fe(e){const t=new URLSearchParams;for(const[o,u]of Object.entries(e))u!==void 0&&u!==""&&t.append(o,u);const r=t.toString();return r?`?${r}`:""}function K(e,t,r=0){const o=D(e,t);if(!o||r>6)return null;if(o.example!==void 0)return o.example;if(o.default!==void 0)return o.default;if(o.enum?.length)return o.enum[0];const u=Array.isArray(o.type)?o.type.find(p=>p!=="null"):o.type;if(u==="object"||!u&&o.properties){const p={};for(const[v,f]of Object.entries(o.properties??{}))p[v]=K(f,t,r+1);return p}if(u==="array")return[K(o.items,t,r+1)];switch(u){case"string":return o.format==="date-time"?"2024-01-01T00:00:00Z":o.format==="date"?"2024-01-01":o.format==="uuid"?"00000000-0000-0000-0000-000000000000":"string";case"integer":case"number":return 0;case"boolean":return!1;default:return null}}function Qe(e,t){const r=e.requestBody?.content?.["application/json"]?.schema;return r?JSON.stringify(K(r,t),null,2):null}function Ge(e){return!!e.requestBody?.content?.["application/json"]}function X(e){return`'${e.replace(/'/g,"'\\''")}'`}function Xe({method:e,url:t,headers:r,body:o}){const u=["curl"];e.toUpperCase()!=="GET"&&u.push("-X",e.toUpperCase());for(const[p,v]of Object.entries(r))u.push("-H",X(`${p}: ${v}`));return o&&u.push("-d",X(o)),u.push(X(t)),u.join(" ")}function Ze({method:e,url:t,headers:r,body:o}){const u=[` method: ${JSON.stringify(e.toUpperCase())},`];return Object.keys(r).length&&u.push(` headers: ${JSON.stringify(r)},`),o&&u.push(` body: ${JSON.stringify(o)},`),`const res = await fetch(${JSON.stringify(t)}, {
|
|
2
2
|
${u.join(`
|
|
3
3
|
`)}
|
|
4
4
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as o}from"./Du2W7Jne.js";function n(){const t=o();return String(t.public.desktop)==="true"}export{n as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as m,k as r,o as c,f as _,g,j as b,p as w,Q as v,q as x,c as $,h as t}from"./
|
|
1
|
+
import{d as m,k as r,o as c,f as _,g,j as b,p as w,Q as v,q as x,c as $,h as t}from"./Du2W7Jne.js";import{_ as C}from"./BT3wGCTI.js";import{C as S,D as k}from"./DuwtTfO8.js";const z={key:1,class:"text-xs text-gray-400 dark:text-gray-500 italic"},B=m({__name:"BrowserBadge",props:{browser:{},size:{}},setup(a){const n=a,s=t(()=>n.browser?.projectName??null),l=t(()=>S(s.value)),p=t(()=>k(s.value)),u=t(()=>n.size==="sm"?"size-3.5":n.size==="lg"?"size-5":"size-4"),i=t(()=>{const e=n.browser;if(!e)return[];const o=[];return e.browserName&&e.browserName!==s.value&&o.push(`Browser: ${e.browserName}`),e.channel&&o.push(`Channel: ${e.channel}`),e.viewport&&o.push(`Viewport: ${e.viewport.width}×${e.viewport.height}`),e.deviceScaleFactor&&e.deviceScaleFactor!==1&&o.push(`Scale: ${e.deviceScaleFactor}x`),e.isMobile&&o.push("Mobile"),e.hasTouch&&!e.isMobile&&o.push("Touch"),e.locale&&o.push(`Locale: ${e.locale}`),e.timezoneId&&o.push(`TZ: ${e.timezoneId}`),e.colorScheme&&e.colorScheme!=="light"&&o.push(`Color: ${e.colorScheme}`),e.reducedMotion&&e.reducedMotion!=="no-preference"&&o.push(`Motion: ${e.reducedMotion}`),e.forcedColors&&e.forcedColors!=="none"&&o.push("Colors: forced"),e.offline&&o.push("Offline"),e.bypassCSP&&o.push("CSP bypassed"),e.javaScriptEnabled===!1&&o.push("JS disabled"),e.serviceWorkers==="block"&&o.push("SW blocked"),e.geolocation&&o.push(`Geo: ${e.geolocation.latitude.toFixed(2)},${e.geolocation.longitude.toFixed(2)}`),e.userAgent&&o.push(`UA: ${e.userAgent.length>60?e.userAgent.slice(0,60)+"…":e.userAgent}`),o}),h=t(()=>s.value?i.value.length?`${s.value} · ${i.value.join(" · ")}`:s.value:"");return(e,o)=>{const f=w,d=C;return r(s)?(c(),_(d,{key:0,text:r(h),popper:{placement:"top"}},{default:g(()=>[b(f,{name:r(l),class:x(["shrink-0 cursor-help",r(u)]),style:v({color:r(p)})},null,8,["name","class","style"])]),_:1},8,["text"])):(c(),$("span",z,"—"))}}}),A=Object.assign(B,{__name:"BrowserBadge"});export{A as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as g,o as s,c as a,F as l,y as o,f,D as p,q as b,k as y,Q as k,h as _}from"./
|
|
1
|
+
import{d as g,o as s,c as a,F as l,y as o,f,D as p,q as b,k as y,Q as k,h as _}from"./Du2W7Jne.js";const h=g({__name:"MiniRunBars",props:{runs:{},height:{default:28},maxBars:{default:20}},setup(n){const i=n;function u(t){return["running","initialising","finalizing"].includes(t.status)?"bg-blue-400 dark:bg-blue-500":t.flakyTests>0&&t.status==="passed"?"bg-amber-400 dark:bg-amber-400":t.status==="passed"?"bg-green-500":["failed","timedout","interrupted"].includes(t.status)?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function c(t){const r=[`Run #${t.id}`,`Status: ${t.status}`,`${t.passedTests}/${t.totalTests} passed`];return t.flakyTests>0&&r.push(`${t.flakyTests} flaky`),r.join(" · ")}const d=_(()=>Math.max(0,i.maxBars-i.runs.length));return(t,r)=>{const m=p;return s(),a("div",{class:"flex items-stretch gap-px",style:k({height:`${n.height}px`})},[(s(!0),a(l,null,o(n.runs,e=>(s(),f(m,{key:e.id,to:`/test-runs/${e.id}`,title:c(e),class:b(["flex-1 rounded-sm transition-opacity hover:opacity-70 min-w-0",u(e)])},null,8,["to","title","class"]))),128)),(s(!0),a(l,null,o(y(d),e=>(s(),a("div",{key:`empty-${e}`,class:"flex-1 rounded-sm bg-gray-100 dark:bg-gray-800 min-w-0"}))),128))],4)}}}),$=Object.assign(h,{__name:"MiniRunBars"});export{$ as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"
|
|
1
|
+
{"id":"e659b3e1-0e61-4971-940e-10063f9f4763","timestamp":1785169384856}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"e659b3e1-0e61-4971-940e-10063f9f4763","timestamp":1785169384856,"prerendered":[]}
|