@piwitests/server 0.20.0 → 0.22.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/2VtBYkNh.js +1 -0
- package/.output/public/_nuxt/{BmUfSNMV.js → 3xlGO1qT.js} +1 -1
- package/.output/public/_nuxt/{DeY2JkR2.js → 4yvOL9PC.js} +1 -1
- package/.output/public/_nuxt/6-ivqM_I.js +17 -0
- package/.output/public/_nuxt/{BrQEE053.js → 9N6hSApy.js} +1 -1
- package/.output/public/_nuxt/{hC_z4G8p.js → 9P8iHISX.js} +1 -1
- package/.output/public/_nuxt/B-6GGrhr.js +1 -0
- package/.output/public/_nuxt/B09ddw9C.js +1 -0
- package/.output/public/_nuxt/{Dpd16JVI.js → B0hK-xDF.js} +1 -1
- package/.output/public/_nuxt/{BdfhYr-u.js → B2a-Phk3.js} +1 -1
- package/.output/public/_nuxt/{B99fbi73.js → B6s20NbT.js} +1 -1
- package/.output/public/_nuxt/B9FSuKdA.js +1 -0
- package/.output/public/_nuxt/B9kt7ySS.js +5 -0
- package/.output/public/_nuxt/BDQCwxpX.js +1 -0
- package/.output/public/_nuxt/{oAClCn_h.js → BFcdtAzg.js} +1 -1
- package/.output/public/_nuxt/{CeG9pBAD.js → BH-ym1CI.js} +1 -1
- package/.output/public/_nuxt/{AbmKWFQQ.js → BKJetfRH.js} +1 -1
- package/.output/public/_nuxt/BNAHBHbY.js +1 -0
- package/.output/public/_nuxt/BQOWm9mQ.js +1 -0
- package/.output/public/_nuxt/{DJxlKFGb.js → BQzG26t0.js} +1 -1
- package/.output/public/_nuxt/{DabzhQB1.js → BTvE9qca.js} +1 -1
- package/.output/public/_nuxt/{C2hkrSey.js → BUMoU50-.js} +1 -1
- package/.output/public/_nuxt/{C1gTN4Q8.js → BVN50jIb.js} +1 -1
- package/.output/public/_nuxt/BYB8NVJZ.js +1 -0
- package/.output/public/_nuxt/{BicAJ6U8.js → BZnfiR67.js} +1 -1
- package/.output/public/_nuxt/{5A6ITZXj.js → B_mN5eMV.js} +1 -1
- package/.output/public/_nuxt/BaDhDBCV.js +1 -0
- package/.output/public/_nuxt/Bb7Uckln.js +5 -0
- package/.output/public/_nuxt/Be4c943G.js +2 -0
- package/.output/public/_nuxt/{CsLojMwR.js → BfS8BZTO.js} +1 -1
- package/.output/public/_nuxt/{KyA_4Ks-.js → BhH0TNTi.js} +1 -1
- package/.output/public/_nuxt/BjU3HZuS.js +1 -0
- package/.output/public/_nuxt/{DrfE8IY0.js → BlRWlfdD.js} +1 -1
- package/.output/public/_nuxt/BmJUhCIO.js +6 -0
- package/.output/public/_nuxt/BpUXqOVj.js +2 -0
- package/.output/public/_nuxt/BqCiYSVY.js +1 -0
- package/.output/public/_nuxt/Bt4FLbe0.js +1 -0
- package/.output/public/_nuxt/{Bm62iDV5.js → BtSJxOdh.js} +1 -1
- package/.output/public/_nuxt/{Und3xXFc.js → BtaTvcz6.js} +2 -2
- package/.output/public/_nuxt/{hNh4CIL0.js → By5qkOq8.js} +1 -1
- package/.output/public/_nuxt/{Bnxf8nbZ.js → C0v6l4pr.js} +1 -1
- package/.output/public/_nuxt/{CXEH9OPk.js → C9p0YCAi.js} +1 -1
- package/.output/public/_nuxt/{Dyeqn3aG.js → CAZpjzvB.js} +1 -1
- package/.output/public/_nuxt/{CjPfj7ya.js → CBZD8ym8.js} +1 -1
- package/.output/public/_nuxt/CCP6Tyle.js +1 -0
- package/.output/public/_nuxt/{DuwtTfO8.js → CD3R-ggS.js} +2 -2
- package/.output/public/_nuxt/{CxyAzHr3.js → CDh_Qt7h.js} +1 -1
- package/.output/public/_nuxt/CI_q0F1O.js +9 -0
- package/.output/public/_nuxt/CJEp4i0N.js +1 -0
- package/.output/public/_nuxt/{l5WKbU4h.js → CMhK1PvI.js} +3 -3
- package/.output/public/_nuxt/{H94BMf3L.js → CNcu4khZ.js} +1 -1
- package/.output/public/_nuxt/COP3KBCA.js +9 -0
- package/.output/public/_nuxt/{BT3wGCTI.js → CRPt9SfB.js} +1 -1
- package/.output/public/_nuxt/{DsesNydr.js → CScusXhF.js} +1 -1
- package/.output/public/_nuxt/{-f7BAm1H.js → CWoSSKhQ.js} +1 -1
- package/.output/public/_nuxt/{CAvY22RE.js → CWw9WGlv.js} +1 -1
- package/.output/public/_nuxt/{DdwHkKfV.js → CZ9ThISn.js} +1 -1
- package/.output/public/_nuxt/Cd8r0xk5.js +1 -0
- package/.output/public/_nuxt/Cf52zHyB.js +1 -0
- package/.output/public/_nuxt/{GPNI1ffD.js → CkKCKAYp.js} +2 -2
- package/.output/public/_nuxt/CkyMZI-0.js +1 -0
- package/.output/public/_nuxt/CoPntblj.js +1 -0
- package/.output/public/_nuxt/CobveFaj.js +1 -0
- package/.output/public/_nuxt/Cot8fIp5.js +2 -0
- package/.output/public/_nuxt/{D5tke0B5.js → CrOA9onF.js} +1 -1
- package/.output/public/_nuxt/{FaFoMVKo.js → Cwwe5bRS.js} +1 -1
- package/.output/public/_nuxt/D0ROfwV0.js +1 -0
- package/.output/public/_nuxt/{L3kAWB2a.js → D4UlSVir.js} +1 -1
- package/.output/public/_nuxt/D4oheDIm.js +4 -0
- package/.output/public/_nuxt/{CAAwCT7H.js → D6Mo5HeX.js} +1 -1
- package/.output/public/_nuxt/{Cnsmicv2.js → DBhdObsO.js} +34 -34
- package/.output/public/_nuxt/{A1pj0VnG.js → DDN2tt0a.js} +1 -1
- package/.output/public/_nuxt/DGnQ69wW.js +64 -0
- package/.output/public/_nuxt/{Cus22Ud3.js → DGyGmFem.js} +2 -2
- package/.output/public/_nuxt/{CzAPFPpL.js → DHUT-BKj.js} +1 -1
- package/.output/public/_nuxt/DK7xciFW.js +7 -0
- package/.output/public/_nuxt/{C0_yH0N7.js → DLNNAYfu.js} +1 -1
- package/.output/public/_nuxt/DLn-VPtK.js +34 -0
- package/.output/public/_nuxt/{CA9B2HE5.js → DOBSrxzY.js} +1 -1
- package/.output/public/_nuxt/{Dy-TJ0Mt.js → DOLeth7M.js} +1 -1
- package/.output/public/_nuxt/{CNyV9YpI.js → DQnsFoJn.js} +1 -1
- package/.output/public/_nuxt/DS2ANCQh.js +1 -0
- package/.output/public/_nuxt/{bLcjFslv.js → DSvBQHzW.js} +1 -1
- package/.output/public/_nuxt/{BzRRzmwm.js → DWEkQ7bl.js} +1 -1
- package/.output/public/_nuxt/DWwiVTZX.js +24 -0
- package/.output/public/_nuxt/DXXnDejN.js +1 -0
- package/.output/public/_nuxt/{B3obW6cw.js → Dj-TetcW.js} +2 -2
- package/.output/public/_nuxt/DpalT0nH.js +1 -0
- package/.output/public/_nuxt/{Bow4tTR0.js → DsX5CCb5.js} +1 -1
- package/.output/public/_nuxt/DslnXfcH.js +1 -0
- package/.output/public/_nuxt/DtSn2Q9-.js +1 -0
- package/.output/public/_nuxt/DwyFnMoY.js +44 -0
- package/.output/public/_nuxt/{CJFtzlQ4.js → DzM9oeLa.js} +1 -1
- package/.output/public/_nuxt/{BKkF4pPD.js → Gik813Ek.js} +1 -1
- package/.output/public/_nuxt/{pQqGiNch.js → Hot1UcKY.js} +1 -1
- package/.output/public/_nuxt/{DPCxhHri.js → HwFFbACq.js} +1 -1
- package/.output/public/_nuxt/{DJmoLeVt.js → PdEEuEsg.js} +1 -1
- package/.output/public/_nuxt/SBmMTKQb.js +1 -0
- package/.output/public/_nuxt/{C8e1EbJI.js → Sgis3xif.js} +1 -1
- package/.output/public/_nuxt/{CTU1mrhq.js → _VzR8bwc.js} +1 -1
- package/.output/public/_nuxt/{CeW8v31b.js → b_yFgp5S.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/5f1ebc7c-d690-4f02-847f-a3249653f75f.json +1 -0
- package/.output/public/_nuxt/{b-GYfcrQ.js → cSeAgciy.js} +1 -1
- package/.output/public/_nuxt/{CwGWJbiy.js → czXrP7NB.js} +1 -1
- package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
- package/.output/public/_nuxt/{Du2W7Jne.js → h49q_GXF.js} +42 -42
- package/.output/public/_nuxt/hzsG6cAc.js +1 -0
- package/.output/public/_nuxt/iubpj2qv.js +1 -0
- package/.output/public/_nuxt/jjOqY9Tv.js +1 -0
- package/.output/public/_nuxt/kfFeu9tK.js +1 -0
- package/.output/public/_nuxt/nANaAHCd.js +5 -0
- package/.output/public/_nuxt/{CIrFl3MW.js → t-juTK3X.js} +1 -1
- package/.output/public/_nuxt/{4gYNA-d4.js → x8YSyy4c.js} +1 -1
- package/.output/public/_nuxt/{DfgOx_ou.js → x8w_1_rn.js} +1 -1
- package/.output/public/_nuxt/xbO0VmDX.js +1 -0
- package/.output/server/chunks/_/collect.mjs +1 -1
- package/.output/server/chunks/_/error-500.mjs.map +1 -1
- package/.output/server/chunks/_/markers.mjs +1 -1
- package/.output/server/chunks/_/quarantine.mjs +1 -1
- package/.output/server/chunks/_/scope.mjs +43 -27
- package/.output/server/chunks/_/scope.mjs.map +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Alert-C4xq8lao.mjs → Alert-DAb8nKVs.mjs} +2 -2
- package/.output/server/chunks/build/Alert-DAb8nKVs.mjs.map +1 -0
- package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-DJp5WvUM.mjs} +5 -5
- package/.output/server/chunks/build/Breadcrumb-DJp5WvUM.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-BrQwfL8G.mjs} +2 -2
- package/.output/server/chunks/build/BreadcrumbNav-BrQwfL8G.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-MFvBwxmD.mjs → BrowserBadge-Djw_e_I9.mjs} +3 -3
- package/.output/server/chunks/build/BrowserBadge-Djw_e_I9.mjs.map +1 -0
- package/.output/server/chunks/build/{Card-BQP_oZkQ.mjs → Card--Ike7sYc.mjs} +2 -2
- package/.output/server/chunks/build/Card--Ike7sYc.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-B2gd_8HP.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-B2gd_8HP.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartMarkerTooltip-0DcMfD_6.mjs → ChartMarkerTooltip-u_1DUHh-.mjs} +2 -2
- package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-4Q5d0fa0.mjs → Checkbox-C1khEdTh.mjs} +4 -4
- package/.output/server/chunks/build/Checkbox-C1khEdTh.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-CjnDrO3Y.mjs} +4 -4
- package/.output/server/chunks/build/CodeBlock-CjnDrO3Y.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DYtmVlhy.mjs} +5 -5
- package/.output/server/chunks/build/DashboardNavbar-DYtmVlhy.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-BPNxODwj.mjs} +5 -5
- package/.output/server/chunks/build/DashboardSidebarToggle-BPNxODwj.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-2B-sVSMr.mjs} +5 -5
- package/.output/server/chunks/build/DataLocationCard-2B-sVSMr.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-CALyEmcJ.mjs → DiagnosisPanel-D6QO30FQ.mjs} +9 -8
- package/.output/server/chunks/build/DiagnosisPanel-D6QO30FQ.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-CxjMmDDY.mjs → DiagnosisResult-ujB5Lt2A.mjs} +12 -34
- package/.output/server/chunks/build/DiagnosisResult-ujB5Lt2A.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-UX9uajQJ.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-BBHWssHH.mjs → EntityLinks-F8_kC-IH.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-F8_kC-IH.mjs.map +1 -0
- package/.output/server/chunks/build/{EnvManagedBadge-UwD2b9v2.mjs → EnvManagedBadge-D6e-10M9.mjs} +3 -3
- package/.output/server/chunks/build/EnvManagedBadge-D6e-10M9.mjs.map +1 -0
- package/.output/server/chunks/build/FeatureUnavailable-BMw4euTk.mjs +83 -0
- package/.output/server/chunks/build/FeatureUnavailable-BMw4euTk.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-QptK0rPg.mjs} +3 -3
- package/.output/server/chunks/build/FormField-QptK0rPg.mjs.map +1 -0
- package/.output/server/chunks/build/GetStartedWizard-DxT8T14Y.mjs +510 -0
- package/.output/server/chunks/build/GetStartedWizard-DxT8T14Y.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-C5Ru8BCc.mjs} +3 -3
- package/.output/server/chunks/build/HelpHint-C5Ru8BCc.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-CwpfmI0W.mjs} +3 -3
- package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +1 -0
- package/.output/server/chunks/build/{MarkerBadge-D7meXy4u.mjs → MarkerBadge-Biz5--h2.mjs} +1 -1
- package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DB5DvBh1.mjs → MetaStripGroup-BBByVvpR.mjs} +242 -529
- package/.output/server/chunks/build/MetaStripGroup-BBByVvpR.mjs.map +1 -0
- package/.output/server/chunks/build/{MiniRunBars-CZMugDrh.mjs → MiniRunBars-fgLMgRUp.mjs} +2 -2
- package/.output/server/chunks/build/MiniRunBars-fgLMgRUp.mjs.map +1 -0
- package/.output/server/chunks/build/{Modal-pSDlXzT3.mjs → Modal-BacZmQCX.mjs} +3 -3
- package/.output/server/chunks/build/Modal-BacZmQCX.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-DnQKacz8.mjs → NavigationMenu-sTiKSWDm.mjs} +7 -30
- package/.output/server/chunks/build/NavigationMenu-sTiKSWDm.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs → OpenInIdeLink-Crc8y0Yx.mjs} +6 -6
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs.map → OpenInIdeLink-Crc8y0Yx.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs → ProjectTestCasesTable-DwjqZ2i5.mjs} +17 -17
- package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs.map → ProjectTestCasesTable-DwjqZ2i5.mjs.map} +1 -1
- package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-nuLb-Nm3.mjs} +3 -3
- package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CvWmcFYM.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-C753B3Yo.mjs} +3 -3
- package/.output/server/chunks/build/SectionCard-C753B3Yo.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-5DK9frQ7.mjs → Select-BAyYwPuo.mjs} +4 -4
- package/.output/server/chunks/build/Select-BAyYwPuo.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs → SelectMenu-zE_AhMX8.mjs} +4 -4
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs.map → SelectMenu-zE_AhMX8.mjs.map} +1 -1
- package/.output/server/chunks/build/{Separator-CR4WcEKD.mjs → Separator-BbgCfKKJ.mjs} +3 -3
- package/.output/server/chunks/build/Separator-BbgCfKKJ.mjs.map +1 -0
- package/.output/server/chunks/build/{SettingsField-BZfx4ma1.mjs → SettingsField-D-VriK9X.mjs} +5 -5
- package/.output/server/chunks/build/SettingsField-D-VriK9X.mjs.map +1 -0
- package/.output/server/chunks/build/{Skeleton-CEHuuKVh.mjs → Skeleton-DAp_WMEe.mjs} +2 -2
- package/.output/server/chunks/build/Skeleton-DAp_WMEe.mjs.map +1 -0
- package/.output/server/chunks/build/{Slideover-D270EZZD.mjs → Slideover-CNbGvbUF.mjs} +3 -3
- package/.output/server/chunks/build/Slideover-CNbGvbUF.mjs.map +1 -0
- package/.output/server/chunks/build/{StatTile-D61Vzo6e.mjs → StatTile-DpcVQFVI.mjs} +2 -26
- package/.output/server/chunks/build/StatTile-DpcVQFVI.mjs.map +1 -0
- package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs +30 -0
- package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs.map +1 -0
- package/.output/server/chunks/build/{Switch-B5Fp8ULt.mjs → Switch-DdkA3Fii.mjs} +3 -3
- package/.output/server/chunks/build/Switch-DdkA3Fii.mjs.map +1 -0
- package/.output/server/chunks/build/{Table-BRk04Hd2.mjs → Table-CfDVAuUJ.mjs} +4 -4
- package/.output/server/chunks/build/Table-CfDVAuUJ.mjs.map +1 -0
- package/.output/server/chunks/build/{Tabs-BkSOnbaB.mjs → Tabs-BCOhHEB9.mjs} +2 -2
- package/.output/server/chunks/build/Tabs-BCOhHEB9.mjs.map +1 -0
- package/.output/server/chunks/build/{TestCaseHistoryChart-CSi64vVA.mjs → TestCaseHistoryChart-CKDXQ2GI.mjs} +4 -4
- package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.mjs.map +1 -0
- package/.output/server/chunks/build/{TestMetaBadges-D5_yUtIP.mjs → TestMetaBadges-BlyKmfeP.mjs} +1 -1
- package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-DX3EhlyP.mjs → TestStatusBar-wquHQqtp.mjs} +4 -4
- package/.output/server/chunks/build/TestStatusBar-wquHQqtp.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-Ohs6QTXf.mjs} +3 -3
- package/.output/server/chunks/build/Textarea-Ohs6QTXf.mjs.map +1 -0
- package/.output/server/chunks/build/{Tooltip-Dv4htNP6.mjs → Tooltip-BRBnl4pE.mjs} +3 -3
- package/.output/server/chunks/build/Tooltip-BRBnl4pE.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BxA6IgWr.mjs → _id_-BesWjK_d.mjs} +900 -394
- package/.output/server/chunks/build/_id_-BesWjK_d.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-C_uSBiyU.mjs → _id_-CGs0u8Fr.mjs} +38 -36
- package/.output/server/chunks/build/_id_-CGs0u8Fr.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BdG37K7s.mjs → _id_-CQ0lolEK.mjs} +31 -28
- package/.output/server/chunks/build/_id_-CQ0lolEK.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BdJs7BJZ.mjs → _id_-D1-06Fcl.mjs} +1913 -1121
- package/.output/server/chunks/build/_id_-D1-06Fcl.mjs.map +1 -0
- package/.output/server/chunks/build/{about-BE0UV-8-.mjs → about-DdyOj-dj.mjs} +25 -455
- package/.output/server/chunks/build/about-DdyOj-dj.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-7aVMKekZ.mjs} +11 -9
- package/.output/server/chunks/build/account-7aVMKekZ.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs → ai-zw3T9b5u.mjs} +24 -22
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs.map → ai-zw3T9b5u.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-Bo_B_jko.mjs → analytics-CeCzKwEX.mjs} +105 -76
- package/.output/server/chunks/build/analytics-CeCzKwEX.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{compare-RxHSOdsO.mjs → compare-B2OB3zdd.mjs} +4 -1
- package/.output/server/chunks/build/compare-B2OB3zdd.mjs.map +1 -0
- package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-Bdqk_eYQ.mjs} +40 -2
- package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +1 -0
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs → default-CkyAx_Mu.mjs} +48 -33
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs.map → default-CkyAx_Mu.mjs.map} +1 -1
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs → docs-Dhj-wEks.mjs} +18 -16
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs.map → docs-Dhj-wEks.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-J0asTFg8.mjs → edit-CVz_gdoe.mjs} +17 -16
- package/.output/server/chunks/build/edit-CVz_gdoe.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-Be-j7hF1.mjs} +32 -4
- package/.output/server/chunks/build/fetch-Be-j7hF1.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CwdjL7BO.mjs} +8 -5
- package/.output/server/chunks/build/forgot-password-CwdjL7BO.mjs.map +1 -0
- package/.output/server/chunks/build/{import-CS9oylTN.mjs → import-DyQEw4V3.mjs} +17 -15
- package/.output/server/chunks/build/import-DyQEw4V3.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-ByWTzqF6.mjs} +2 -1
- package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DE45ycdZ.mjs → index-D7Bmj6bq.mjs} +19 -18
- package/.output/server/chunks/build/index-D7Bmj6bq.mjs.map +1 -0
- package/.output/server/chunks/build/{index-e9skCi-V.mjs → index-DcnICCZU.mjs} +43 -539
- package/.output/server/chunks/build/index-DcnICCZU.mjs.map +1 -0
- package/.output/server/chunks/build/{index-hGHlmyxj.mjs → index-DghAFpNR.mjs} +132 -89
- package/.output/server/chunks/build/{index-hGHlmyxj.mjs.map → index-DghAFpNR.mjs.map} +1 -1
- package/.output/server/chunks/build/index-ID913tUa.mjs +93 -0
- package/.output/server/chunks/build/index-ID913tUa.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
- package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-rXKF63j6.mjs} +12 -9
- package/.output/server/chunks/build/login-rXKF63j6.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-uhVCCwQM.mjs → mcp-ByNvFy4o.mjs} +254 -22
- package/.output/server/chunks/build/mcp-ByNvFy4o.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-fx_qnKGA.mjs → notifications-CbLAZnKJ.mjs} +18 -16
- package/.output/server/chunks/build/notifications-CbLAZnKJ.mjs.map +1 -0
- package/.output/server/chunks/build/performance-C93MEPaZ.mjs +581 -0
- package/.output/server/chunks/build/performance-C93MEPaZ.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-X6-70iF0.mjs → pr-feedback-DKCB0bDE.mjs} +12 -10
- package/.output/server/chunks/build/pr-feedback-DKCB0bDE.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-BBoHKMqD.mjs} +8 -5
- package/.output/server/chunks/build/reset-password-BBoHKMqD.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +86 -72
- package/.output/server/chunks/build/server.mjs.map +1 -1
- package/.output/server/chunks/build/{settings-CCYe7rsc.mjs → settings-DiG0JjzC.mjs} +18 -26
- package/.output/server/chunks/build/settings-DiG0JjzC.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DnAK4Rzg.mjs} +40 -18
- package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +1 -0
- package/.output/server/chunks/build/setup-0-1O6Hjz.mjs +1065 -0
- package/.output/server/chunks/build/setup-0-1O6Hjz.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-CJEmviCD.mjs → storage-3JiFJ843.mjs} +18 -16
- package/.output/server/chunks/build/storage-3JiFJ843.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-CqYcp7js.mjs} +11 -10
- package/.output/server/chunks/build/tags-CqYcp7js.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-thBbAykw.mjs → test-cases-y1HSgPX2.mjs} +26 -24
- package/.output/server/chunks/build/test-cases-y1HSgPX2.mjs.map +1 -0
- package/.output/server/chunks/build/test-functions-D2ju95Ly.mjs +552 -0
- package/.output/server/chunks/build/test-functions-D2ju95Ly.mjs.map +1 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs +9 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs.map +1 -0
- package/.output/server/chunks/build/{useChartMarkers-C89e_VLV.mjs → useChartMarkers-C0wSO0xk.mjs} +1 -1
- package/.output/server/chunks/build/useChartMarkers-C0wSO0xk.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-RJKhWoyj.mjs → useCopyRich-CVFeYfkG.mjs} +699 -247
- package/.output/server/chunks/build/useCopyRich-CVFeYfkG.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopDownload-BepjqxOt.mjs → useDesktopDownload-Dyf0fR47.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-BbTnPhFA.mjs → useOpenInIde--6Me0WlL.mjs} +1 -1
- package/.output/server/chunks/build/useOpenInIde--6Me0WlL.mjs.map +1 -0
- package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs +19 -0
- package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +1 -0
- package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-IdmY9JZV.mjs} +12 -11
- package/.output/server/chunks/build/users-IdmY9JZV.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +2336 -1581
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +4 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +3 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +3 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +3 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +3 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs +10 -1
- package/.output/server/chunks/routes/api/auth/change-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +3 -1
- package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/login.post.mjs +16 -2
- package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +11 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +9 -1
- package/.output/server/chunks/routes/api/auth/reset-password.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +7 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.post.mjs +30 -12
- package/.output/server/chunks/routes/api/auth/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +4 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +6 -3
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +4 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +4 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +4 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +3 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +4 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs +23 -4
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +4 -1
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +12 -5
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +9 -3
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +4 -1
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +4 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +4 -1
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +6 -2
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +14 -1
- package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post6.mjs +3 -1
- package/.output/server/chunks/routes/api/index.post6.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +5 -3
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +5 -3
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs +4 -3
- package/.output/server/chunks/routes/api/links/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/markers/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +33 -16
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +3 -1
- package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +3 -1
- package/.output/server/chunks/routes/api/projects/_id/members.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +78 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +68 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +55 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +69 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/projects/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +4 -1
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +4 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +3 -0
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +3 -1
- package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +4 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/setup-status.get.mjs +101 -0
- package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs +8 -2
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +3 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +62 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +71 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +7 -4
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +4 -1
- 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 -1
- 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 +4 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +4 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +6 -3
- package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +4 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +3 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +4 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +4 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +3 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +4 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs +7 -2
- package/.output/server/chunks/routes/api/users/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +4 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +43 -11
- package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep.mjs +3 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +3 -0
- package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
- package/.output/server/database/migrations/0043_watery_dragon_lord.sql +22 -0
- package/.output/server/database/migrations/0044_panoramic_eddie_brock.sql +1 -0
- package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
- package/.output/server/database/migrations/meta/0044_snapshot.json +3772 -0
- package/.output/server/database/migrations/meta/_journal.json +14 -0
- package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
- package/.output/server/database/migrations-pg/0045_loose_runaways.sql +1 -0
- package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
- package/.output/server/database/migrations-pg/meta/0045_snapshot.json +4480 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +14 -0
- package/.output/server/index.mjs +4 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/bin/piwi-server.mjs +10 -0
- package/package.json +1 -1
- package/.output/public/_nuxt/8PUUncmO.js +0 -44
- package/.output/public/_nuxt/B7FTvFWq.js +0 -5
- package/.output/public/_nuxt/B8zkOmwo.js +0 -1
- package/.output/public/_nuxt/B96M2gdj.js +0 -1
- package/.output/public/_nuxt/B9OLmp0f.js +0 -1
- package/.output/public/_nuxt/BUa0V0Ly.js +0 -1
- package/.output/public/_nuxt/BUkim3TM.js +0 -1
- package/.output/public/_nuxt/BVc14Ncz.js +0 -4
- package/.output/public/_nuxt/BY0HxR3t.js +0 -17
- package/.output/public/_nuxt/B_xAMWQS.js +0 -2
- package/.output/public/_nuxt/BdQoBaOv.js +0 -1
- package/.output/public/_nuxt/BgRu_3tT.js +0 -1
- package/.output/public/_nuxt/BiO7RBWb.js +0 -6
- package/.output/public/_nuxt/CEfS4-oS.js +0 -64
- package/.output/public/_nuxt/CIoSMkpp.js +0 -1
- package/.output/public/_nuxt/CSJ-eOQM.js +0 -1
- package/.output/public/_nuxt/CahpB9Z2.js +0 -5
- package/.output/public/_nuxt/Cbh--1MW.js +0 -1
- package/.output/public/_nuxt/Cx6gc2VW.js +0 -1
- package/.output/public/_nuxt/D--H4jLI.js +0 -1
- package/.output/public/_nuxt/D1POo6S4.js +0 -10
- package/.output/public/_nuxt/D8nkF-OO.js +0 -3
- package/.output/public/_nuxt/DA25RkyK.js +0 -1
- package/.output/public/_nuxt/DIB-5fUJ.js +0 -1
- package/.output/public/_nuxt/DMec-OLo.js +0 -1
- package/.output/public/_nuxt/DSqHUrvO.js +0 -1
- package/.output/public/_nuxt/DmkUdSS4.js +0 -1
- package/.output/public/_nuxt/DoIREDVb.js +0 -1
- package/.output/public/_nuxt/DpZ1r1HA.js +0 -1
- package/.output/public/_nuxt/DqcKngf3.js +0 -1
- package/.output/public/_nuxt/DtHJgCS8.js +0 -1
- package/.output/public/_nuxt/Dtd4rC58.js +0 -9
- package/.output/public/_nuxt/Dy86h-7P.js +0 -1
- package/.output/public/_nuxt/HPNQD6v3.js +0 -1
- package/.output/public/_nuxt/HXadJrHu.js +0 -2
- package/.output/public/_nuxt/McL25vkx.js +0 -34
- package/.output/public/_nuxt/Nn93e_Mz.js +0 -1
- package/.output/public/_nuxt/UdR3DBPS.js +0 -1
- package/.output/public/_nuxt/_mj6CfPa.js +0 -1
- package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +0 -1
- package/.output/public/_nuxt/entry.DmptwB51.css +0 -1
- package/.output/public/_nuxt/ryMzSDUj.js +0 -2
- package/.output/public/trace-viewer/assets/codeMirrorModule-LEHpjmcn.js +0 -32
- package/.output/public/trace-viewer/assets/defaultSettingsView-BNmKHKpQ.js +0 -264
- package/.output/public/trace-viewer/assets/urlMatch-BYQrIQwR.js +0 -1
- package/.output/public/trace-viewer/assets/xtermModule-CsJ4vdCR.js +0 -9
- package/.output/public/trace-viewer/codeMirrorModule.DYBRYzYX.css +0 -1
- package/.output/public/trace-viewer/codicon.DCmgc-ay.ttf +0 -0
- package/.output/public/trace-viewer/defaultSettingsView.CjdS-WJx.css +0 -1
- package/.output/public/trace-viewer/index.CzXZzn5A.css +0 -1
- package/.output/public/trace-viewer/index.DMMX1gXU.js +0 -2
- package/.output/public/trace-viewer/index.html +0 -44
- package/.output/public/trace-viewer/manifest.webmanifest +0 -16
- package/.output/public/trace-viewer/playwright-logo.svg +0 -9
- package/.output/public/trace-viewer/snapshot.html +0 -10
- package/.output/public/trace-viewer/snapshot.v8KI4P3m.js +0 -2
- package/.output/public/trace-viewer/sw.bundle.js +0 -5
- package/.output/public/trace-viewer/uiMode.BZQ54Kgt.css +0 -1
- package/.output/public/trace-viewer/uiMode.Ut8wwJNp.js +0 -6
- package/.output/public/trace-viewer/uiMode.html +0 -18
- package/.output/public/trace-viewer/xtermModule.DYP7pi_n.css +0 -32
- package/.output/server/chunks/build/Alert-C4xq8lao.mjs.map +0 -1
- package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +0 -1
- package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +0 -1
- package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +0 -1
- package/.output/server/chunks/build/Card-BQP_oZkQ.mjs.map +0 -1
- package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +0 -1
- package/.output/server/chunks/build/ChartMarkerTooltip-0DcMfD_6.mjs.map +0 -1
- package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +0 -1
- package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +0 -1
- package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +0 -1
- package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +0 -1
- package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +0 -1
- package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.mjs.map +0 -1
- package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +0 -1
- package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +0 -1
- package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs.map +0 -1
- package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +0 -1
- package/.output/server/chunks/build/LoadingState-C3pBSuOO.mjs.map +0 -1
- package/.output/server/chunks/build/MarkerBadge-D7meXy4u.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
- package/.output/server/chunks/build/Modal-pSDlXzT3.mjs.map +0 -1
- package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +0 -1
- package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +0 -1
- package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +0 -1
- package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +0 -1
- package/.output/server/chunks/build/Separator-CR4WcEKD.mjs.map +0 -1
- package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +0 -1
- package/.output/server/chunks/build/Skeleton-CEHuuKVh.mjs.map +0 -1
- package/.output/server/chunks/build/Slideover-D270EZZD.mjs.map +0 -1
- package/.output/server/chunks/build/StatTile-D61Vzo6e.mjs.map +0 -1
- package/.output/server/chunks/build/Switch-B5Fp8ULt.mjs.map +0 -1
- package/.output/server/chunks/build/Table-BRk04Hd2.mjs.map +0 -1
- package/.output/server/chunks/build/Tabs-BkSOnbaB.mjs.map +0 -1
- package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +0 -1
- package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +0 -1
- package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.mjs.map +0 -1
- package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +0 -1
- package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BdJs7BJZ.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +0 -1
- package/.output/server/chunks/build/_id_-C_uSBiyU.mjs.map +0 -1
- package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +0 -1
- package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +0 -1
- package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +0 -1
- package/.output/server/chunks/build/compare-RxHSOdsO.mjs.map +0 -1
- package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +0 -1
- package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +0 -1
- package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +0 -1
- package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +0 -1
- package/.output/server/chunks/build/import-CS9oylTN.mjs.map +0 -1
- package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +0 -1
- package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +0 -1
- package/.output/server/chunks/build/index-e9skCi-V.mjs.map +0 -1
- package/.output/server/chunks/build/index-tR6owKzj.mjs +0 -167
- package/.output/server/chunks/build/index-tR6owKzj.mjs.map +0 -1
- package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +0 -1
- package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +0 -1
- package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +0 -1
- package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +0 -1
- package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +0 -1
- package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +0 -1
- package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +0 -1
- package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +0 -1
- package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +0 -1
- package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +0 -1
- package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs +0 -330
- package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +0 -1
- package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +0 -1
- package/.output/server/chunks/build/useChartMarkers-C89e_VLV.mjs.map +0 -1
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs +0 -33
- package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +0 -1
- package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +0 -1
- package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +0 -1
- package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +0 -1
- package/.output/server/chunks/build/useSettingsNav-DnQKacz8.mjs.map +0 -1
- package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +0 -1
- package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs +0 -301
- package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import{_ as At,a as Lt}from"./C9p0YCAi.js";import{_ as Ot,a as Bt}from"./B_mN5eMV.js";import{_ as zt}from"./DDN2tt0a.js";import{d as z,an as Ut,B as Ft,L as qt,ad as Wt,J as vt,o as s,c as v,h as E,r as ft,j as $,l as at,k as t,f as k,g as f,i as a,p as lt,q as A,t as h,v as P,m as D,_ as q,w as F,F as N,y as L,ag as wt,G as Q,R as ot,s as Mt,e as Gt}from"./h49q_GXF.js";import{_ as Ht}from"./BH-ym1CI.js";import{_ as Yt}from"./BlRWlfdD.js";import{u as Xt}from"./BhH0TNTi.js";import{u as _t}from"./Cd8r0xk5.js";import{_ as Jt}from"./x8YSyy4c.js";import{_ as Qt}from"./9N6hSApy.js";import{e as W,f as it,c as Zt}from"./CD3R-ggS.js";import{_ as G}from"./DHUT-BKj.js";import{_ as H}from"./CWw9WGlv.js";import{_ as X}from"./BVN50jIb.js";import{_ as K}from"./DLNNAYfu.js";import{_ as Kt}from"./DSvBQHzW.js";import{_ as Rt}from"./BFcdtAzg.js";import{_ as te}from"./DWEkQ7bl.js";import{_ as ee}from"./C0v6l4pr.js";import{_ as ct}from"./DzM9oeLa.js";import{X as se,b as Tt,c as dt,d as ae,i as ne,e as re,f as oe,g as et,m as mt,h as ie,j as kt,k as le,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 he,O as Z}from"./czXrP7NB.js";import{_ as ut}from"./DQnsFoJn.js";import{N as Dt}from"./CMhK1PvI.js";import{_ as ge}from"./CkyMZI-0.js";import{_ as fe}from"./DtSn2Q9-.js";import{_ as be}from"./BQOWm9mQ.js";import"./xbO0VmDX.js";import"./BNAHBHbY.js";import"./B6s20NbT.js";import"./x8w_1_rn.js";import"./B9FSuKdA.js";import"./Hot1UcKY.js";import"./D4UlSVir.js";import"./BtSJxOdh.js";import"./BjaRappk.js";import"./CWoSSKhQ.js";import"./D7W_4Sqc.js";function xe({x:C,y:e,w:i,h:_,tl:n=!1,tr:M=!1,bl:u=!1,br:R=!1,r:b=0}){let p;p=`M${C+b},${e}h${i-2*b}`;let r=M?b:0,l=M?0:b;return p+=`a${r},${r} 0 0 1 ${r},${r}`,p+=`h${l}v${l}`,p+=`v${_-2*b}`,r=R?b:0,l=R?0:b,p+=`a${r},${r} 0 0 1 ${-r},${r}`,p+=`v${l}h${-l}`,p+=`h${2*b-i}`,r=u?b:0,l=u?0:b,p+=`a${r},${r} 0 0 1 ${-r},${-r}`,p+=`h${-l}v${-l}`,p+=`v${2*b-_}`,r=n?b:0,l=n?0:b,p+=`a${r},${r} 0 0 1 ${r},${-r}`,p+=`v${-l}h${l}`,p+="z",p}const ve=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:Tt.Vertical}),Et=dt`
|
|
2
|
+
label: stacked-bar-component;
|
|
3
|
+
`,ke=ne`
|
|
4
|
+
:root {
|
|
5
|
+
--vis-stacked-bar-cursor: default;
|
|
6
|
+
--vis-stacked-bar-fill-color: var(--vis-color-main);
|
|
7
|
+
--vis-stacked-bar-stroke-color: none;
|
|
8
|
+
--vis-stacked-bar-stroke-width: 0px;
|
|
9
|
+
--vis-stacked-bar-hover-stroke-width: none;
|
|
10
|
+
--vis-stacked-bar-hover-stroke-color: none;
|
|
11
|
+
|
|
12
|
+
/* Dark Theme */
|
|
13
|
+
--vis-dark-stacked-bar-stroke-color: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
${ae} ${`.${Et}`} {
|
|
17
|
+
--vis-stacked-bar-stroke-color: var(--vis-dark-stacked-bar-stroke-color);
|
|
18
|
+
}
|
|
19
|
+
`,rt=dt`
|
|
20
|
+
label: bar;
|
|
21
|
+
fill: var(--vis-stacked-bar-fill-color);
|
|
22
|
+
stroke: var(--vis-stacked-bar-stroke-color);
|
|
23
|
+
stroke-width: var(--vis-stacked-bar-stroke-width);
|
|
24
|
+
cursor: var(--vis-stacked-bar-cursor);
|
|
25
|
+
|
|
26
|
+
&:hover {
|
|
27
|
+
stroke-width: var(--vis-stacked-bar-hover-stroke-width);
|
|
28
|
+
stroke: var(--vis-stacked-bar-hover-stroke-color);
|
|
29
|
+
}
|
|
30
|
+
`,ht=dt`
|
|
31
|
+
label: barGroup;
|
|
32
|
+
`,Vt=dt`
|
|
33
|
+
label: barGroupExit;
|
|
34
|
+
`,$e=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:ht,barGroupExit:Vt,globalStyles:ke,root:Et},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=ve,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],i=this.dataScale.domain(),_=this._getBarWidth()/2,n=this._barData.map((x,m)=>et(x,this.config.x,m)),M=mt(n),u=ie(n),R=this.dataScale(M),b=this.dataScale(u),p=this.dataScale.invert(R+(e?_:-_)),r=this.dataScale.invert(b+(e?-_:_)),l=p<=i[0]?this.dataScale(i[0])-this.dataScale(p):0,j=r>i[1]?this.dataScale(r)-this.dataScale(i[1]):0;return{top:this.isVertical()?0:e?-j:l,bottom:this.isVertical()?0:e?-l:j,left:this.isVertical()?l:0,right:this.isVertical()?j:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Tt.Vertical}_render(e){const{config:i}=this,_=kt(e)?e:i.duration,n=this.getAccessors(),M=le(this._barData,0,n,this._prevNegative);this._prevNegative=M.map(m=>!!m.isMostlyNegative);const u=this.g.selectAll(`.${ht}`).data(this._barData,(m,g)=>{var c;return`${(c=$t(m,i.id,g))!==null&&c!==void 0?c:g}`}),R=(m,g)=>{const c=this.dataScale(et(m,i.x,g)),S=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${S},${o})`},p=u.enter().append("g").attr("class",ht).attr("transform",R).style("opacity",1).merge(u);st(p,_).attr("transform",R).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,_).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),_).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const l=p.selectAll(`.${rt}`).data((m,g)=>{const c=M.map((S,o)=>({datum:m,index:g,stacked:S[g],stackIndex:o})).filter(S=>S.stacked[0]!==S.stacked[1]);return c.forEach((S,o)=>{S.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==S.stacked[1]}),c},m=>m.stackIndex),x=l.enter().append("path").attr("class",rt).attr("d",m=>this._getBarPath(m,!0)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).merge(l);st(x,_).attr("d",m=>this._getBarPath(m)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).style("cursor",m=>$t(m.datum,i.cursor,m.stackIndex)),st(l.exit(),_).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:i}}=this;if(ce(i))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const _=this.dataScale.bandwidth,n=this.dataScale.domain?this.dataScale.domain():[];let u=1+(_?n.length:n[1]-n[0])/e.dataStep||!_&&i.filter((p,r)=>{const l=et(p,e.x,r);return l>=n[0]&&l<=n[1]}).length||i.length;!_&&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:i}}=this,_=this._getBarWidth(),n=i.length<2?0:_/2,M=this.dataScale,u=Math.abs(M.invert(n)-M.invert(0));return i?.filter((b,p)=>{const r=et(b,e.x,p),l=M.domain(),j=+l[0],x=+l[1];return r>=j-u&&r<=x+u})}_getBarPath(e,i=!1){const{config:_}=this,n=this.getAccessors(),M=this._getBarWidth(),u=e.stacked[1]<0,R=e.isEnding,b=et(e.datum,n[e.stackIndex],e.index),p=i?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!i&&_.barMinHeight1Px&&p<1&&isFinite(b)&&b!==_.barMinHeightZeroValue?1:p,l=i?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(p<1&&_.barMinHeight1Px?1:0),j=-M/2,x=M,m=_.roundedCorners?kt(_.roundedCorners)?+_.roundedCorners:x/2:0,g=me(m,0,Math.min(p,x)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return xe({x:this.isVertical()?j:l-r,y:this.isVertical()?l+(c?0:-r):j,w:this.isVertical()?x:r,h:this.isVertical()?r:x,tl:R&&(this.isVertical()?!u&&c||u&&!c:u),tr:R&&(this.isVertical()?!u&&c||u&&!c:!u),br:R&&(this.isVertical()?u&&c||!u&&!c:!u),bl:R&&(this.isVertical()?u&&c||!u&&!c:u),r:g})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:i}=this,_=this.getAccessors(),n=e?this._getVisibleData():i.data;return de(n,..._)}getDataScaleExtent(){const{config:e,datamodel:i}=this;return ue(i.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=$e;const Se={"data-vis-component":""},Ce=z({__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 i=Ut(pe),_=C,n=E(()=>i.data.value??_.data),M=_e(_),u=ft();return Ft(()=>{qt(()=>{u.value=new It(M.value),u.value?.setData(n.value),i.update(u.value)})}),Wt(()=>{u.value?.destroy(),i.destroy()}),vt(M,(R,b)=>{ye(R,b)||(u.value?.setConfig(M.value),u.value?.render())}),vt(n,()=>{u.value?.setData(n.value)}),e({component:u}),(R,b)=>(s(),v("div",Se))}}),we=30,gt=3650;function Me(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:we,projectIds:[],environment:null,fullRunsOnly:!0};function Re(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:_=>JSON.stringify(_),decode:_=>{try{return _?{...J,...JSON.parse(_)}:{...J}}catch{return{...J}}}}),e=E(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),i=E(()=>Me(e.value));return{state:C,scope:e,scopeQuery:i}}function Y(C,e){return _t(`/api/analytics/${C}`,{query:E(e),lazy:!0,server:!1},"$UlG3SHNJJg")}const Te={class:"flex items-center gap-3 flex-wrap"},je={class:"flex items-center gap-1.5"},De={key:0,class:"text-gray-500"},Ee={key:1,class:"truncate"},Ve={key:2},Ie={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",Ne=z({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const i=C,_=e,n=[{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:gt}],M=E({get:()=>i.modelValue.days,set:m=>_("update:modelValue",{...i.modelValue,days:m})}),u=E(()=>i.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),R=E({get:()=>i.modelValue.projectIds,set:m=>_("update:modelValue",{...i.modelValue,projectIds:m})});function b(m){return u.value.find(g=>g.value===m)?.label??`#${m}`}const p=E({get:()=>i.modelValue.environment??pt,set:m=>_("update:modelValue",{...i.modelValue,environment:m===pt?null:m})}),r=E(()=>[pt,...i.availableEnvironments]),l=E({get:()=>i.modelValue.fullRunsOnly,set:m=>_("update:modelValue",{...i.modelValue,fullRunsOnly:m})}),j=E(()=>i.modelValue.days===J.days&&i.modelValue.projectIds.length===0&&i.modelValue.environment===null&&i.modelValue.fullRunsOnly===J.fullRunsOnly);function x(){_("update:modelValue",{...J})}return(m,g)=>{const c=zt,S=lt,o=Ht,d=Yt,y=q;return s(),v("div",Te,[$(c,{modelValue:t(M),"onUpdate:modelValue":g[0]||(g[0]=T=>at(M)?M.value=T:null),items:n,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),k(o,{key:0,modelValue:t(R),"onUpdate:modelValue":g[1]||(g[1]=T=>at(R)?R.value=T:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:T})=>[a("div",je,[$(S,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",T.length?"text-primary":"text-gray-400"])},null,8,["class"]),T.length?T.length===1?(s(),v("span",Ee,h(b(T[0])),1)):(s(),v("span",Ve,h(T.length)+" projects",1)):(s(),v("span",De,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),k(c,{key:1,modelValue:t(p),"onUpdate:modelValue":g[2]||(g[2]=T=>at(p)?p.value=T:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),a("label",Ie,[$(d,{modelValue:t(l),"onUpdate:modelValue":g[3]||(g[3]=T=>at(l)?l.value=T:null),size:"sm"},null,8,["modelValue"]),g[4]||(g[4]=D(" Full runs only ",-1))]),t(j)?P("",!0):(s(),k(y,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:x},{default:f(()=>[...g[5]||(g[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ne,{__name:"AnalyticsScopeBar"}),Ae=[{id:"health",label:"Where things stand",description:"The state of every project right now."},{id:"pain",label:"Where the pain is",description:"What is costing you the most time and attention."},{id:"trends",label:"Which way it is going",description:"Movement over the selected period."},{id:"detail",label:"Detail",description:"Breakdowns to reach for once you know what you are chasing."}],Nt=[{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full",band:"health"},{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half",band:"health"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half",band:"health"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half",band:"pain"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half",band:"pain"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half",band:"pain"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half",band:"trends"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half",band:"trends"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half",band:"detail"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full",band:"detail"}];new Set(Nt.map(C=>C.id));const Le={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Oe={class:"min-w-0"},Be={class:"text-sm font-medium"},ze={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},Ue=z({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("insights",()=>_.query)),e=await e,i(),e),b=Q,p={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,l)=>{const j=G,x=q,m=H,g=X,c=lt,S=K;return s(),k(S,{icon:"i-lucide-lightbulb",title:"Insights",count:t(n)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=o=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Le,[(s(!0),v(N,null,L(t(n),o=>(s(),k(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",[p[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[$(c,{name:p[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",p[o.severity].class])},null,8,["name","class"]),a("div",Oe,[a("p",Be,h(o.message),1),o.detail?(s(),v("p",ze,h(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Fe=Object.assign(Ue,{__name:"InsightsFeed"}),qe={class:"md:hidden space-y-3"},We={class:"flex items-center justify-between gap-2"},Ge={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},He={key:0},Ye={class:"hidden md:block"},Xe={class:"w-full text-sm"},Je={class:"divide-y divide-gray-100 dark:divide-gray-800"},Qe={class:"py-2.5 pr-4"},Ze={class:"flex items-center gap-2 min-w-0"},Ke={class:"py-2.5 pr-4"},ts={class:"w-36"},es={class:"py-2.5 pr-4 text-right"},ss={class:"py-2.5 pr-4 text-right tabular-nums"},as={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ns={class:"py-2.5 text-right"},rs={class:"text-xs text-gray-500 dark:text-gray-400"},os={key:1,class:"text-xs text-gray-400"},is=z({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("portfolio",()=>_.query)),e=await e,i(),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 p(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,l)=>{const j=G,x=q,m=H,g=X,c=Q,S=Kt,o=Rt,d=lt,y=te,T=ee,V=ct,I=K;return s(),k(I,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(n)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=w=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No projects with runs in this period."})):(s(),v(N,{key:3},[a("div",qe,[(s(!0),v(N,null,L(t(n),w=>(s(),v("div",{key:w.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[a("div",We,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),a("span",{class:A(["tabular-nums font-semibold shrink-0",b(w.passRate)])},h(w.passRate!==null?`${w.passRate}%`:"—"),3)]),$(S,{runs:w.recentRuns,height:20},null,8,["runs"]),a("div",Ge,[a("span",null,h(w.runCount)+" runs · "+h(w.flakyTests)+" flaky · "+h(w.openClusters)+" open clusters",1),w.latestRun?(s(),v("span",He,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)):P("",!0)])]))),128))]),a("div",Ye,[$(V,{"min-width":"52rem"},{default:f(()=>[a("table",Xe,[l[2]||(l[2]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Project"),a("th",{class:"py-2 pr-4 font-medium"},"Trend"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),a("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),a("tbody",Je,[(s(!0),v(N,null,L(t(n),w=>(s(),v("tr",{key:w.projectId},[a("td",Qe,[a("div",Ze,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),(s(!0),v(N,null,L(w.tags.slice(0,2),U=>(s(),k(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),a("td",Ke,[a("div",ts,[$(S,{runs:w.recentRuns,height:22},null,8,["runs"])])]),a("td",es,[a("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(w.passRate)])},[D(h(w.passRate!==null?`${w.passRate}%`:"—")+" ",1),p(w.passRateDelta)?(s(),k(d,{key:0,name:p(w.passRateDelta).icon,class:A(["size-3.5",p(w.passRateDelta).class]),title:`${w.passRateDelta>0?"+":""}${w.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),a("td",ss,h(w.runCount),1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},h(w.flakyTests),3),a("td",as,[$(y,{ms:w.avgRunDurationMs},null,8,["ms"])]),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.openClusters>0?"text-red-600 dark:text-red-400":""])},h(w.openClusters),3),a("td",ns,[w.latestRun?(s(),k(c,{key:0,to:`/test-runs/${w.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[$(T,{status:w.latestRun.status},null,8,["status"]),a("span",rs,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",os,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ls=Object.assign(is,{__name:"PortfolioScorecard"}),cs={class:"space-y-1"},ds={class:"flex gap-px"},us=["title"],ms={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},ps={class:"relative h-4"},_s=z({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("pass-rate-heatmap",()=>_.query)),e=await e,i(),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 p(c,S,o){const d=n.value?.buckets[S]??"",y=(n.value?.bucketDays??1)>1?` (${n.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${y}: ${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%"}],l=E(()=>{const c=n.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),j=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],x=E(()=>{const c=n.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function m(c){const[S,o,d]=c.split("-"),y=j[Number(o)-1];return x.value?`${y} ${S}`:`${y} ${Number(d)}`}const g=E(()=>{const c=n.value?.buckets??[],S=c.length;if(S===0)return[];const o=Math.min(x.value?4:5,S),d=new Set,y=[];for(let T=0;T<o;T++){const V=o===1?0:Math.round(T*(S-1)/(o-1));if(d.has(V))continue;d.add(V);const I=V===0?0:V===S-1?100:(V+.5)/S*100,w=V===0?"translateX(0)":V===S-1?"translateX(-100%)":"translateX(-50%)";y.push({index:V,label:m(c[V]),left:I,transform:w})}return y});return(c,S)=>{const o=G,d=q,y=H,T=X,V=Q,I=bt,w=ct,U=ut;return s(),k(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(l),help:"analytics.heatmap"},{default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:S[0]||(S[0]=O=>t(R)())},{default:f(()=>[...S[1]||(S[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(T,{key:2,text:"No runs in this period."})):(s(),k(w,{key:3,"min-width":"22rem"},{default:f(()=>[a("div",cs,[(s(!0),v(N,null,L(t(n).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[$(V,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(h(O.label||O.name),1)]),_:2},1032,["to","title"]),a("div",ds,[(s(!0),v(N,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:p(O,tt,nt)},null,12,us))),128))])]))),128)),a("div",ms,[S[2]||(S[2]=a("span",null,null,-1)),a("div",ps,[(s(!0),v(N,null,L(t(g),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})},h(O.label),5))),128))])]),$(I,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ys=Object.assign(_s,{__name:"PassRateHeatmap"}),hs={key:3,class:"w-full relative"},gs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},fs={class:"font-semibold mb-1"},bs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",xs=z({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("ci-time-trend",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),p=E(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,l=o=>o.totalMinutes,j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const o=n.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"}}),S=E(()=>{if(!n.value)return;const o=n.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${n.value.runCount} runs`});return(o,d)=>{const y=G,T=q,V=H,I=X,w=ut;return s(),k(w,{icon:"i-lucide-timer",title:"CI time",subtitle:t(S),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},h(t(c).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(y,{key:0})):t(u)?(s(),k(V,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(T,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(R)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",hs,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:l,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),$(t(he),{x:r,y:l,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),$(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(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(m).x}px`,top:`${t(m).y}px`})},[a("div",gs,[a("div",fs,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,h(t(x).totalMinutes)+" minutes",1),a("div",bs,h(t(x).runCount)+" runs",1)])],4)):P("",!0)])):(s(),k(I,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),vs=Object.assign(xs,{__name:"CiTimeTrendChart"}),ks={key:3,class:"w-full relative"},$s={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ss={class:"font-semibold mb-1"},Cs={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"},ws={class:"text-gray-700 dark:text-gray-300"},Ms={class:"font-semibold"},Rs={key:2,class:"mt-4 space-y-1"},Ts={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},js=z({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("wasted-time",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(y=>({date:new Date(y.date),waitMinutes:y.waitMinutes,failedExecMinutes:y.failedExecMinutes}))??[]),p=E(()=>b.value.some(y=>y.waitMinutes>0||y.failedExecMinutes>0)),r=y=>y.date,l=["rgb(245, 158, 11)","rgb(239, 68, 68)"],j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:y=>y.date,series:[{y:y=>y.waitMinutes,color:l[0]},{y:y=>y.failedExecMinutes,color:l[1]}]}),c=[{color:l[0],label:"Wait steps"},{color:l[1],label:"Failed attempts"}],S=E(()=>{if(!n.value)return;const y=n.value.totalWaitMinutes+n.value.totalFailedExecMinutes;return`${y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`} of CI time produced no signal`}),o=E(()=>n.value?.timeoutReclaimable??null),d=E(()=>{const y=o.value?.estimatedMinutes??0;return y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`});return(y,T)=>{const V=bt,I=G,w=q,U=H,O=X,nt=lt,tt=Q,Pt=ut;return s(),k(Pt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t(S),help:"analytics.wasted-time"},{legend:f(()=>[$(V,{items:c,dense:""})]),default:f(()=>[t(M)?(s(),k(I,{key:0})):t(u)?(s(),k(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in y?y.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:T[0]||(T[0]=B=>t(R)())},{default:f(()=>[...T[1]||(T[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",ks,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:[B=>B.waitMinutes,B=>B.failedExecMinutes],color:l,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),$(t(Z),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(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(m).x}px`,top:`${t(m).y}px`})},[a("div",$s,[a("div",Ss,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,[T[2]||(T[2]=a("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+h(t(x).waitMinutes)+" min",1)]),a("div",null,[T[3]||(T[3]=a("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+h(t(x).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",Cs,[$(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),a("div",ws,[T[5]||(T[5]=D(" Up to ",-1)),a("span",Ms,"≈"+h(t(d)),1),D(" of this is avoidable — "+h(t(o).oversizedCount)+" oversized "+h(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+h(t(o).staleSlowCount)+" stale ",1),T[6]||(T[6]=a("code",{class:"text-xs"},"test.slow()",-1)),D(" "+h(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),k(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...T[4]||(T[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(n)&&t(n).byProject.length>0?(s(),v("div",Rs,[(s(!0),v(N,null,L(t(n).byProject.slice(0,5),B=>(s(),v("div",{key:B.projectId,class:"flex items-center justify-between text-sm"},[$(tt,{to:`/projects/${B.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(h(B.label||B.name),1)]),_:2},1032,["to"]),a("span",Ts,h(Math.round(B.waitMinutes+B.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),k(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Ds=Object.assign(js,{__name:"WastedTimeChart"}),Es={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Vs={class:"flex-1 min-w-0"},Is={class:"text-sm font-medium truncate"},Ns={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ps={class:"text-right shrink-0"},As=z({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("flaky-leaderboard",()=>_.query)),e=await e,i(),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 p(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Rt,S=Q,o=K;return s(),k(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(n)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",Es,[(s(!0),v(N,null,L(t(n),d=>(s(),k(S,{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(()=>[a("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},h(d.score),3),a("div",Vs,[a("p",Is,h(d.title),1),a("p",Ns,[D(h(d.projectLabel||d.projectName)+" · "+h(p(d))+" ",1),d.lastFlakeAt?(s(),v(N,{key:0},[D(" · last "+h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(d.lastFlakeAt)),1)],64)):P("",!0)])]),a("div",Ps,[a("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"])},h(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),k(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ls=Object.assign(As,{__name:"GlobalFlakyLeaderboard"}),Os={key:3,class:"space-y-4"},Bs={key:0,class:"flex flex-wrap gap-1.5"},zs={class:"divide-y divide-gray-100 dark:divide-gray-800"},Us={class:"flex-1 min-w-0"},Fs={class:"text-sm font-medium truncate"},qs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ws={class:"text-right text-xs shrink-0"},Gs={class:"tabular-nums font-medium"},Hs=z({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("cluster-landscape",()=>_.query)),e=await e,i(),e);function b(p){return p>=30?"text-red-600 dark:text-red-400":p>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=ge,c=fe,S=Mt,o=Q,d=K;return s(),k(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load clusters: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=y=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).totalOpen===0&&t(n).resolvedInPeriod===0?(s(),k(m,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",Os,[$(c,null,{default:f(()=>[$(g,{label:"Open",value:t(n).totalOpen,"value-class":t(n).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),$(g,{label:"Resolved this period",value:t(n).resolvedInPeriod},null,8,["value"]),$(g,{label:"Oldest open",value:t(n).clusters.length>0?`${Math.max(...t(n).clusters.map(y=>y.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(n).byErrorType.length>0?(s(),v("div",Bs,[(s(!0),v(N,null,L(t(n).byErrorType,y=>(s(),k(S,{key:y.errorType,color:("clusterErrorTypeColor"in p?p.clusterErrorTypeColor:t(Zt))(y.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(h(y.errorType)+" · "+h(y.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),a("div",zs,[(s(!0),v(N,null,L(t(n).clusters.slice(0,8),y=>(s(),k(o,{key:y.id,to:`/failure-clusters/${y.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(()=>[a("div",Us,[a("p",Fs,h(y.title||y.signature),1),a("p",qs,[D(h(y.projectLabel||y.projectName)+" ",1),y.errorType?(s(),v(N,{key:0},[D(" · "+h(y.errorType),1)],64)):P("",!0)])]),a("div",Ws,[a("p",Gs,h(y.occurrences)+"×",1),a("p",{class:A(["tabular-nums",b(y.ageDays)])},h(y.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Ys=Object.assign(Hs,{__name:"ClusterLandscape"}),Xs={key:3,class:"w-full"},Js=z({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("regression-velocity",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(g=>({date:new Date(g.date),regressions:g.regressions,newFlaky:g.newFlaky}))??[]),p=E(()=>b.value.some(g=>g.regressions>0||g.newFlaky>0)),r=g=>g.date,l=["rgb(239, 68, 68)","rgb(147, 51, 234)"],j=[{color:l[0],label:"New regressions"},{color:l[1],label:"Newly flaky"}],x=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const g=n.value.deltaPct;return{label:`${g>0?"+":""}${g}% vs previous period`,class:g>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),m=E(()=>{if(n.value)return`${n.value.totalRegressions} new regressions, ${n.value.totalNewFlaky} newly flaky`});return(g,c)=>{const S=bt,o=G,d=q,y=H,T=X,V=ut;return s(),k(V,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(m),help:"analytics.regression-velocity"},{legend:f(()=>[$(S,{items:j,dense:""})]),actions:f(()=>[t(x)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(x).class])},h(t(x).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in g?g.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=I=>t(R)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",Xs,[$(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[$(t(Ce),{x:r,y:[I=>I.regressions,I=>I.newFlaky],color:l,"rounded-corners":2},null,8,["y"]),$(t(Z),{type:"x","tick-format":I=>new Date(I).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Count","tick-format":I=>I.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),k(T,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Qs=Object.assign(Js,{__name:"RegressionVelocityChart"}),Zs={class:"w-full text-sm border-separate border-spacing-1"},Ks={class:"pr-2 max-w-[12rem]"},ta=["title"],ea=z({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("browser-matrix",()=>_.query)),e=await e,i(),e);function b(p){return p===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":p>=99.5?"bg-green-500/85 text-white":p>=90?"bg-green-500/45":p>=75?"bg-amber-500/50":p>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=Q,c=ct,S=K;return s(),k(S,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(m,{key:2,text:"No runs with browser data in this period."})):(s(),k(c,{key:3,"min-width":"30rem"},{default:f(()=>[a("table",Zs,[a("thead",null,[a("tr",null,[r[2]||(r[2]=a("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(N,null,L(t(n).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},h(o),1))),128))])]),a("tbody",null,[(s(!0),v(N,null,L(t(n).rows,o=>(s(),v("tr",{key:o.projectId},[a("td",Ks,[$(g,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(h(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(N,null,L(o.cells,(d,y)=>(s(),v("td",{key:y,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(n).browsers[y]}: ${d!==null?`${d}% passed`:"no tests"}`},h(d!==null?`${Math.round(d)}%`:"—"),11,ta))),128))]))),128))])])]),_:1}))]),_:1})}}}),sa=Object.assign(ea,{__name:"BrowserMatrix"}),aa={class:"md:hidden space-y-3"},na={class:"flex items-center gap-2 min-w-0"},ra={class:"text-xs truncate"},oa={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ia={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},la={class:"hidden md:block"},ca={class:"w-full text-sm"},da={class:"divide-y divide-gray-100 dark:divide-gray-800"},ua={class:"py-2.5 pr-4"},ma={class:"flex items-center gap-2 min-w-0"},pa=["title"],_a={class:"py-2.5 pr-4 text-right tabular-nums"},ya={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ha={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ga={class:"py-2.5 text-right tabular-nums"},fa=z({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("slow-endpoints",()=>_.query)),e=await e,i(),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 p(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,l)=>{const j=G,x=q,m=H,g=be,c=Mt,S=ct,o=K;return s(),k(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(n)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).endpoints.length===0?(s(),k(g,{key:2,icon:"i-lucide-network",title:"No network requests captured in this period",text:"Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",doc:"capture-fixtures"})):(s(),v(N,{key:3},[a("div",aa,[(s(!0),v(N,null,L(t(n).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"},[a("div",na,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",ra,h(d.route),1)]),a("div",oa,[a("span",null,[l[2]||(l[2]=D("p90 ",-1)),a("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms",3)]),a("span",null,h(d.requests)+" reqs · "+h(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ia,h(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),a("div",la,[$(S,{"min-width":"44rem"},{default:f(()=>[a("table",ca,[l[3]||(l[3]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),a("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),a("tbody",da,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[a("td",ua,[a("div",ma,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},h(d.route),9,pa)])]),a("td",_a,h(d.requests),1),a("td",ya,h(d.p50Ms)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms ",3),a("td",ha,h(d.maxMs)+" ms",1),a("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"])},h(d.errorRate)+"% ",3),a("td",ga,h(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ba=Object.assign(fa,{__name:"SlowEndpointsTable"}),xa={class:"space-y-6"},va={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ka={class:"text-sm text-muted"},$a={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},ln=z({__name:"analytics",async setup(C){let e,i;Gt({title:"Analytics - Piwi Dashboard"});const{state:_,scopeQuery:n}=Re(),{data:M}=([e,i]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$sFpNat489G")),e=await e,i(),e),{data:u}=([e,i]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$QJEpX0hRMv")),e=await e,i(),e),R=E(()=>{const x=new Set;for(const m of u.value??[])m.environment&&x.add(m.environment);return[...x].sort()}),b=E(()=>{const x=u.value??[];return x.length===0?null:Math.max(...x.map(m=>new Date(m.startTime).getTime()))}),p=E(()=>{if(b.value===null||_.value.days>=gt)return!1;const x=Date.now()-_.value.days*24*60*60*1e3;return b.value<x});function r(){_.value={..._.value,days:gt}}const l={insights:Fe,portfolio:ls,"pass-rate-heatmap":ys,"ci-time-trend":vs,"wasted-time":Ds,"flaky-leaderboard":Ls,"cluster-landscape":Ys,"regression-velocity":Qs,"browser-matrix":sa,"slow-endpoints":ba},j=E(()=>Ae.map(x=>({...x,widgets:Nt.filter(m=>m.band===x.id)})).filter(x=>x.widgets.length>0));return(x,m)=>{const g=At,c=Lt,S=Bt,o=Pe,d=Jt,y=Qt,T=Ot;return s(),k(T,{id:"analytics"},{header:f(()=>[$(S,null,{leading:f(()=>[$(g),$(c,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[a("div",xa,[$(d,null,{default:f(()=>[$(o,{modelValue:t(_),"onUpdate:modelValue":m[0]||(m[0]=V=>at(_)?_.value=V:null),"available-projects":t(M),"available-environments":t(R)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(p)?(s(),k(y,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(_).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:t(it))(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),(s(!0),v(N,null,L(t(j),V=>(s(),v("section",{key:V.id,class:"space-y-3"},[a("div",null,[a("h2",va,h(V.label),1),a("p",ka,h(V.description),1)]),a("div",$a,[(s(!0),v(N,null,L(V.widgets,I=>(s(),v("div",{key:I.id,class:A(I.size==="full"?"xl:col-span-2":"")},[(s(),k(wt(l[I.id]),{query:t(n)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{ln as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as z,k as n,o as a,c as x,f as s,s as C,g as r,m as l,t as c,v as i,F as B,y as M,j as y,p as O,x as j,C as I,h as m}from"./
|
|
1
|
+
import{d as z,k as n,o as a,c as x,f as s,s as C,g as r,m as l,t as c,v as i,F as B,y as M,j as y,p as O,x as j,C as I,h as m}from"./h49q_GXF.js";import"./CD3R-ggS.js";const L={key:0,class:"inline-flex items-center gap-1 flex-wrap"},N=z({__name:"TestMetaBadges",props:{tags:{default:null},meta:{default:null},maxTags:{default:0}},setup(t){const e=t,_={critical:"error",high:"warning",medium:"info",low:"neutral"},u=m(()=>{const f=e.tags??[];return e.maxTags>0?f.slice(0,e.maxTags):f}),d=m(()=>Math.max(0,(e.tags?.length??0)-u.value.length)),p=m(()=>(e.tags??[]).slice(u.value.length).join(", ")),v=m(()=>e.meta?.priority?_[e.meta.priority]??"neutral":"neutral"),w=m(()=>u.value.length>0||!!(e.meta?.owner||e.meta?.priority||e.meta?.feature||e.meta?.link));return(f,k)=>{const o=C,g=O,T=j;return n(w)?(a(),x("div",L,[t.meta?.priority?(a(),s(o,{key:0,color:n(v),variant:"soft",size:"xs",class:"shrink-0 capitalize"},{default:r(()=>[l(c(t.meta.priority),1)]),_:1},8,["color"])):i("",!0),(a(!0),x(B,null,M(n(u),h=>(a(),s(o,{key:h,color:"primary",variant:"soft",size:"xs",class:"shrink-0 font-mono"},{default:r(()=>[l(" @"+c(h),1)]),_:2},1024))),128)),n(d)>0?(a(),s(o,{key:1,color:"neutral",variant:"soft",size:"xs",class:"shrink-0",title:n(p)},{default:r(()=>[l(" +"+c(n(d)),1)]),_:1},8,["title"])):i("",!0),t.meta?.owner?(a(),s(o,{key:2,color:"neutral",variant:"soft",size:"xs",class:"shrink-0 gap-1"},{default:r(()=>[y(g,{name:"i-lucide-user",class:"size-2.5 shrink-0"}),l(" "+c(t.meta.owner),1)]),_:1})):i("",!0),t.meta?.feature?(a(),s(o,{key:3,color:"neutral",variant:"outline",size:"xs",class:"shrink-0"},{default:r(()=>[l(c(t.meta.feature),1)]),_:1})):i("",!0),t.meta?.link?(a(),s(T,{key:4,to:t.meta.link,target:"_blank",rel:"noopener noreferrer",class:"text-gray-500 hover:text-primary shrink-0",title:t.meta.link,onClick:k[0]||(k[0]=I(()=>{},["stop"]))},{default:r(()=>[y(g,{name:"i-lucide-external-link",class:"size-3"})]),_:1},8,["to","title"])):i("",!0)])):i("",!0)}}}),V=Object.assign(N,{__name:"TestMetaBadges"});export{V as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as S,o,f as i,g as f,V as x,W as h,k as a,X as k,h as c,a0 as C,a1 as B,a2 as w,a3 as P,a5 as O,a6 as V,a7 as $,
|
|
1
|
+
import{d as S,o,f as i,g as f,V as x,W as h,k as a,X as k,h as c,a0 as C,a1 as B,a2 as w,a3 as P,a5 as O,a6 as V,a7 as $,b6 as N,c as y,j as z,i as _,q as d,t as R,p as j,aJ as A,v as b,F as g,a8 as F}from"./h49q_GXF.js";var T=S({__name:"BaseSeparator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const s=n,l=["horizontal","vertical"];function e(r){return l.includes(r)}const u=c(()=>e(s.orientation)?s.orientation:"horizontal"),v=c(()=>u.value==="vertical"?s.orientation:void 0),m=c(()=>s.decorative?{role:"none"}:{"aria-orientation":v.value,role:"separator"});return(r,p)=>(o(),i(a(k),h({as:r.as,"as-child":r.asChild,"data-orientation":u.value},m.value),{default:f(()=>[x(r.$slots,"default")]),_:3},16,["as","as-child","data-orientation"]))}}),D=T,E=S({__name:"Separator",props:{orientation:{type:String,required:!1,default:"horizontal"},decorative:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){const s=n;return(l,e)=>(o(),i(D,C(B(s)),{default:f(()=>[x(l.$slots,"default")]),_:3},16))}}),I=E;const J={slots:{root:"flex items-center align-center text-center",border:"",container:"font-medium text-default flex",icon:"shrink-0 size-5",avatar:"shrink-0",avatarSize:"2xs",label:"text-sm"},variants:{color:{primary:{border:"border-primary"},secondary:{border:"border-secondary"},success:{border:"border-success"},info:{border:"border-info"},warning:{border:"border-warning"},error:{border:"border-error"},neutral:{border:"border-default"}},orientation:{horizontal:{root:"w-full flex-row",border:"w-full",container:"whitespace-nowrap"},vertical:{root:"h-full flex-col",border:"h-full",container:""}},size:{xs:"",sm:"",md:"",lg:"",xl:""},position:{start:"",center:"",end:""},type:{solid:{border:"border-solid"},dashed:{border:"border-dashed"},dotted:{border:"border-dotted"}}},compoundVariants:[{orientation:"horizontal",position:"start",class:{container:"me-3"}},{orientation:"horizontal",position:"center",class:{container:"mx-3"}},{orientation:"horizontal",position:"end",class:{container:"ms-3"}},{orientation:"vertical",position:"start",class:{container:"mb-2"}},{orientation:"vertical",position:"center",class:{container:"my-2"}},{orientation:"vertical",position:"end",class:{container:"mt-2"}},{orientation:"horizontal",size:"xs",class:{border:"border-t"}},{orientation:"horizontal",size:"sm",class:{border:"border-t-[2px]"}},{orientation:"horizontal",size:"md",class:{border:"border-t-[3px]"}},{orientation:"horizontal",size:"lg",class:{border:"border-t-[4px]"}},{orientation:"horizontal",size:"xl",class:{border:"border-t-[5px]"}},{orientation:"vertical",size:"xs",class:{border:"border-s"}},{orientation:"vertical",size:"sm",class:{border:"border-s-[2px]"}},{orientation:"vertical",size:"md",class:{border:"border-s-[3px]"}},{orientation:"vertical",size:"lg",class:{border:"border-s-[4px]"}},{orientation:"vertical",size:"xl",class:{border:"border-s-[5px]"}}],defaultVariants:{color:"neutral",size:"xs",type:"solid"}},X=Object.assign({inheritAttrs:!1},{__name:"USeparator",props:{as:{type:null,required:!1},label:{type:String,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},color:{type:null,required:!1},size:{type:null,required:!1},type:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},position:{type:null,required:!1,default:"center"},class:{type:null,required:!1},ui:{type:null,required:!1},decorative:{type:Boolean,required:!1}},setup(n){const s=n,l=w(),e=P("separator",s),u=O(),v=V($(e,"as","decorative","orientation")),[m,r]=N(),p=c(()=>!!(e.label||e.icon||e.avatar||l.default)),t=c(()=>F({extend:J,...u.ui?.separator||{}})({color:e.color,orientation:e.orientation,size:e.size,position:e.position,type:e.type}));return(q,U)=>(o(),y(g,null,[z(a(m),null,{default:f(()=>[_("div",{"data-slot":"container",class:d(t.value.container({class:a(e).ui?.container}))},[x(q.$slots,"default",{ui:t.value},()=>[a(e).label?(o(),y("span",{key:0,"data-slot":"label",class:d(t.value.label({class:a(e).ui?.label}))},R(a(e).label),3)):a(e).icon?(o(),i(j,{key:1,name:a(e).icon,"data-slot":"icon",class:d(t.value.icon({class:a(e).ui?.icon}))},null,8,["name","class"])):a(e).avatar?(o(),i(A,h({key:2,size:a(e).ui?.avatarSize||t.value.avatarSize()},a(e).avatar,{"data-slot":"avatar",class:t.value.avatar({class:a(e).ui?.avatar})}),null,16,["size","class"])):b("",!0)])],2)]),_:3}),z(a(I),h({"data-slot":"root"},{...a(v),...q.$attrs},{class:t.value.root({class:[a(e).ui?.root,a(e).class]})}),{default:f(()=>[p.value&&a(e).position==="start"?(o(),i(a(r),{key:0})):b("",!0),_("div",{"data-slot":"border",class:d(t.value.border({class:a(e).ui?.border}))},null,2),p.value&&a(e).position==="center"?(o(),y(g,{key:1},[z(a(r)),_("div",{"data-slot":"border",class:d(t.value.border({class:a(e).ui?.border}))},null,2)],64)):b("",!0),p.value&&a(e).position==="end"?(o(),i(a(r),{key:2})):b("",!0)]),_:1},16,["class"])],64))}});export{X as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as l}from"./
|
|
1
|
+
import{_ as l}from"./DLNNAYfu.js";import{d as a,o as i,f as c,ac as r,g as n,V as s}from"./h49q_GXF.js";const u=a({__name:"ChartCard",props:{title:{},subtitle:{},icon:{},iconClass:{},help:{}},setup(e){return(t,m)=>{const o=l;return i(),c(o,{title:e.title,subtitle:e.subtitle,icon:e.icon,"icon-class":e.iconClass,help:e.help},r({default:n(()=>[s(t.$slots,"default")]),_:2},[t.$slots.subtitle?{name:"subtitle",fn:n(()=>[s(t.$slots,"subtitle")]),key:"0"}:void 0,t.$slots.legend||t.$slots.actions?{name:"actions",fn:n(()=>[s(t.$slots,"legend"),s(t.$slots,"actions")]),key:"1"}:void 0]),1032,["title","subtitle","icon","icon-class","help"])}}}),C=Object.assign(u,{__name:"ChartCard"});export{C as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as Ee,a as Re}from"./BfS8BZTO.js";import{d as H,H as le,J as se,o as l,f as T,g as c,i as s,j as r,E as G,l as W,k as a,c as m,p as ne,F as U,y as F,q as ie,m as I,t as w,v as x,I as q,r as R,h as D,L as $e,_ as re,w as oe,b as Oe,ac as Le,M as z}from"./h49q_GXF.js";import{_ as Be}from"./BtSJxOdh.js";import{_ as pe}from"./B0hK-xDF.js";import{_ as fe}from"./DDN2tt0a.js";import{_ as ve}from"./BKJetfRH.js";import{_ as ge}from"./3xlGO1qT.js";import{_ as Fe}from"./jjOqY9Tv.js";import{h as We}from"./BjaRappk.js";import{_ as ye}from"./DLNNAYfu.js";import{_ as Ne}from"./DWEkQ7bl.js";import{u as ae}from"./Cd8r0xk5.js";import{_ as De}from"./CScusXhF.js";import{p as qe,g as Xe}from"./CobveFaj.js";import"./9N6hSApy.js";import"./D4UlSVir.js";import"./xbO0VmDX.js";import"./B9FSuKdA.js";import"./BNAHBHbY.js";import"./CRPt9SfB.js";import"./CWoSSKhQ.js";import"./CD3R-ggS.js";const je={class:"space-y-3"},Ke={key:0,class:"flex items-center justify-center gap-2 py-8 text-gray-400"},ze={key:1,class:"py-8 text-center text-sm text-gray-400"},He={key:2,class:"max-h-96 overflow-y-auto space-y-px"},Ge=["onClick"],Qe={class:"flex-1 min-w-0"},Ye={class:"text-sm font-medium leading-snug truncate"},Ze={key:0,class:"text-gray-500 font-normal"},Je={class:"text-xs text-gray-400 leading-snug mt-0.5"},et={key:3,class:"italic text-gray-500"},tt={key:0,class:"flex items-center gap-1 shrink-0 pt-0.5"},st=["title"],ot=["title"],at={key:0,class:"py-8 text-center text-sm text-gray-400"},lt=H({__name:"ModelPickerModal",props:q({models:{},selected:{},loading:{type:Boolean}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:q(["select"],["update:open"]),setup(o,{emit:M}){function C(y){return y?y>=1e6?`${(y/1e6).toFixed(1)}M`:y>=1e3?`${Math.round(y/1e3)}K`:String(y):""}const v=o,i=M,A=le(o,"open"),_=R(null),d=R("");se(A,y=>{y&&$e(()=>_.value?.focus())});const n=D(()=>{const y=d.value.toLowerCase();return y?v.models.filter(h=>h.id.toLowerCase().includes(y)||(h.label?.toLowerCase()??"").includes(y)):v.models}),k={image:{icon:"i-lucide-image",label:"Image input"},pdf:{icon:"i-lucide-file-text",label:"PDF input"},code:{icon:"i-lucide-code",label:"Code execution"},thinking:{icon:"i-lucide-brain",label:"Extended thinking"},json:{icon:"i-lucide-braces",label:"Structured output"},text:{icon:"i-lucide-type",label:"Text"},audio:{icon:"i-lucide-music",label:"Audio"}};function V(y){return y.map(h=>{const g=h.indexOf("→");if(g!==-1){const E=h.slice(0,g),O=h.slice(g+1);return{inputs:E.split("+").filter(Boolean),outputs:O.split("+").filter(Boolean)}}return{inputs:[h],outputs:[]}})}function $(y){i("select",y),A.value=!1,d.value=""}return(y,h)=>{const g=G,E=ne,O=Fe;return l(),T(O,{open:A.value,"onUpdate:open":h[1]||(h[1]=f=>A.value=f),title:"Select a model",ui:{content:"max-w-2xl"}},{body:c(()=>[s("div",je,[r(g,{ref_key:"searchInput",ref:_,modelValue:a(d),"onUpdate:modelValue":h[0]||(h[0]=f=>W(d)?d.value=f:null),placeholder:"Search models…",icon:"i-lucide-search",size:"sm"},null,8,["modelValue"]),o.models.length===0&&o.loading?(l(),m("div",Ke,[r(E,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),h[2]||(h[2]=s("span",{class:"text-sm"},"Loading models…",-1))])):o.models.length===0?(l(),m("div",ze," No models available — check your provider configuration ")):(l(),m("div",He,[(l(!0),m(U,null,F(a(n),f=>(l(),m("button",{key:f.id,class:ie(["w-full text-left px-4 py-3 rounded-lg hover:bg-elevated transition-colors border border-transparent hover:border-default flex items-start gap-4",o.selected===f.id?"bg-primary/10 ring-1 ring-inset ring-primary/30 border-primary/30":""]),onClick:b=>$(f.id)},[s("div",Qe,[s("p",Ye,[I(w(f.id)+" ",1),f.label&&f.label!==f.id?(l(),m("span",Ze," — "+w(f.label),1)):x("",!0)]),s("p",Je,[f.contextLength?(l(),m(U,{key:0},[I(w(C(f.contextLength))+" ctx",1)],64)):x("",!0),f.maxTokens?(l(),m(U,{key:1},[I(" · up to "+w(C(f.maxTokens))+" out",1)],64)):x("",!0),f.pricing?.prompt?(l(),m(U,{key:2},[I(" · $"+w(f.pricing.prompt)+" / $"+w(f.pricing.completion??"?")+" per 1M",1)],64)):x("",!0),!f.contextLength&&!f.maxTokens&&!f.pricing?.prompt?(l(),m("span",et,"No additional info")):x("",!0)])]),f.modalities?.length?(l(),m("div",tt,[(l(!0),m(U,null,F(V(f.modalities),b=>(l(),m(U,{key:b.inputs.join()+"→"+b.outputs.join()},[(l(!0),m(U,null,F(b.inputs,P=>(l(),m("span",{key:"in-"+P,title:k[P]?.label??P,class:"inline-flex items-center justify-center size-6 rounded-md bg-gray-100 dark:bg-gray-800 text-gray-500 hover:text-primary transition-colors"},[r(E,{name:k[P]?.icon??"i-lucide-cpu",class:"size-3.5"},null,8,["name"])],8,st))),128)),b.outputs.length?(l(),T(E,{key:0,name:"i-lucide-arrow-right",class:"size-3 text-gray-400 shrink-0"})):x("",!0),(l(!0),m(U,null,F(b.outputs,P=>(l(),m("span",{key:"out-"+P,title:k[P]?.label??P,class:"inline-flex items-center justify-center size-6 rounded-md bg-gray-100 dark:bg-gray-800 text-gray-500 hover:text-primary transition-colors"},[r(E,{name:k[P]?.icon??"i-lucide-cpu",class:"size-3.5"},null,8,["name"])],8,ot))),128))],64))),128))])):x("",!0)],10,Ge))),128)),a(n).length===0?(l(),m("div",at,' No models match "'+w(a(d))+'" ',1)):x("",!0)]))])]),_:1},8,["open"])}}}),nt=Object.assign(lt,{__name:"ModelPickerModal"}),it={class:"flex gap-2"},rt=H({__name:"ModelFieldInput",props:q({provider:{},providerResolved:{},reuse:{type:Boolean},models:{},loadingModels:{type:Boolean},placeholderAnthropic:{},placeholderOpenai:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:q(["loadModels"],["update:modelValue"]),setup(o,{emit:M}){const C=M,v=le(o,"modelValue"),i=R(!1);return(A,_)=>{const d=G,n=re,k=nt;return l(),m(U,null,[s("div",it,[r(d,{modelValue:v.value,"onUpdate:modelValue":_[0]||(_[0]=V=>v.value=V),placeholder:o.providerResolved==="anthropic"?o.placeholderAnthropic:o.placeholderOpenai,class:"flex-1"},null,8,["modelValue","placeholder"]),o.providerResolved?(l(),T(n,{key:0,size:"sm",variant:"soft",onClick:_[1]||(_[1]=V=>{C("loadModels"),i.value=!0})},{default:c(()=>[..._[4]||(_[4]=[I(" Choose model… ",-1)])]),_:1})):x("",!0)]),r(k,{open:a(i),"onUpdate:open":_[2]||(_[2]=V=>W(i)?i.value=V:null),models:o.models,selected:v.value,loading:o.loadingModels,onSelect:_[3]||(_[3]=V=>v.value=V)},null,8,["open","models","selected","loading"])],64)}}}),dt=Object.assign(rt,{__name:"ModelFieldInput"}),ct={class:"flex items-start justify-between gap-3"},ut={class:"flex items-start gap-2"},mt={class:"font-medium inline-flex items-center gap-1"},pt={class:"text-sm text-gray-500"},ft={class:"inline-flex items-center gap-1"},vt={class:"inline-flex items-center gap-1"},gt={class:"inline-flex items-center gap-1"},yt={key:3,class:"flex justify-end"},ht=H({__name:"AiRoleConfigForm",props:q({meta:{},hasApiKey:{type:Boolean},reuseOptions:{},providerOptions:{},presetOptions:{},disabled:{type:Boolean},envManaged:{type:Boolean},models:{},loadingModels:{type:Boolean},providerResolved:{},testing:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:q(["applyPreset","loadModels","test"],["update:modelValue"]),setup(o,{emit:M}){const C=o,v=M,i=le(o,"modelValue"),A=D({get:()=>i.value.reuse??"own",set:d=>i.value.reuse=d==="own"?null:d}),_=D(()=>We(C.meta.help));return(d,n)=>{const k=ne,V=Be,$=pe,y=fe,h=ve,g=ge,E=G,O=dt,f=re;return l(),m("div",{class:ie(["rounded-lg border border-default p-4 space-y-4",o.meta.optional&&!i.value.enabled?"opacity-80":""])},[s("div",ct,[s("div",ut,[r(k,{name:o.meta.icon,class:"size-5 mt-0.5 text-primary"},null,8,["name"]),s("div",null,[s("p",mt,[I(w(o.meta.title)+" ",1),r(V,{topic:o.meta.help},null,8,["topic"])]),s("p",pt,w(o.meta.blurb),1)])]),o.meta.optional?(l(),T($,{key:0,modelValue:i.value.enabled,"onUpdate:modelValue":n[0]||(n[0]=b=>i.value.enabled=b),disabled:o.disabled&&!o.envManaged,"aria-label":o.meta.enableLabel},null,8,["modelValue","disabled","aria-label"])):x("",!0)]),!o.meta.optional||i.value.enabled?(l(),m(U,{key:0},[o.meta.reuseTargets.length?(l(),T(h,{key:0,label:"Provider source"},{default:c(()=>[r(y,{modelValue:a(A),"onUpdate:modelValue":n[1]||(n[1]=b=>W(A)?A.value=b:null),items:o.reuseOptions,disabled:o.disabled&&!o.envManaged,class:"w-full"},null,8,["modelValue","items","disabled"])]),_:1})):x("",!0),i.value.reuse?x("",!0):(l(),m(U,{key:1},[r(h,{label:"Provider"},{label:c(()=>[s("span",ft,[n[9]||(n[9]=I(" Provider ",-1)),o.disabled?(l(),T(g,{key:0,"env-vars":a(_)},null,8,["env-vars"])):x("",!0)])]),default:c(()=>[r(y,{modelValue:i.value.provider,"onUpdate:modelValue":n[2]||(n[2]=b=>i.value.provider=b),items:o.providerOptions,disabled:o.disabled,placeholder:"Choose a provider…",class:"w-full"},null,8,["modelValue","items","disabled"])]),_:1}),i.value.provider==="openai"?(l(),T(h,{key:0,label:"Preset",description:"Pick a known provider to auto-fill the URL and model, then adjust as needed"},{default:c(()=>[r(y,{items:o.presetOptions,placeholder:"Choose a preset…",disabled:o.disabled,class:"w-full","onUpdate:modelValue":n[3]||(n[3]=b=>v("applyPreset",b))},null,8,["items","disabled"])]),_:1})):x("",!0),i.value.provider?(l(),T(h,{key:1,label:"API key",description:o.hasApiKey?"Leave empty to keep the stored key, clear and save to remove it":"Required for Anthropic; optional for local OpenAI-compatible servers"},{label:c(()=>[s("span",vt,[n[10]||(n[10]=I(" API key ",-1)),o.disabled?(l(),T(g,{key:0,"env-vars":a(_)},null,8,["env-vars"])):x("",!0)])]),default:c(()=>[r(E,{modelValue:i.value.apiKey,"onUpdate:modelValue":n[4]||(n[4]=b=>i.value.apiKey=b),type:"password",placeholder:o.hasApiKey?"•••••••• (unchanged)":"sk-…",disabled:o.disabled,class:"w-full font-mono"},null,8,["modelValue","placeholder","disabled"])]),_:1},8,["description"])):x("",!0),i.value.provider==="openai"?(l(),T(h,{key:2,label:"Base URL",description:"Required, e.g. http://localhost:11434/v1"},{label:c(()=>[s("span",gt,[n[11]||(n[11]=I(" Base URL ",-1)),o.disabled?(l(),T(g,{key:0,"env-vars":a(_)},null,8,["env-vars"])):x("",!0)])]),default:c(()=>[r(E,{modelValue:i.value.baseUrl,"onUpdate:modelValue":n[5]||(n[5]=b=>i.value.baseUrl=b),placeholder:"http://localhost:11434/v1",disabled:o.disabled,class:"w-full"},null,8,["modelValue","disabled"])]),_:1})):x("",!0)],64)),i.value.reuse||i.value.provider?(l(),T(h,{key:2,label:"Model",description:i.value.reuse?"Leave empty to use the reused role's model":void 0},{default:c(()=>[r(O,{modelValue:i.value.model,"onUpdate:modelValue":n[6]||(n[6]=b=>i.value.model=b),provider:i.value.provider,"provider-resolved":o.providerResolved,reuse:!!i.value.reuse,models:o.models,"loading-models":o.loadingModels,"placeholder-anthropic":o.meta.modelPlaceholderAnthropic,"placeholder-openai":o.meta.modelPlaceholderOpenai,onLoadModels:n[7]||(n[7]=b=>v("loadModels"))},null,8,["modelValue","provider","provider-resolved","reuse","models","loading-models","placeholder-anthropic","placeholder-openai"])]),_:1},8,["description"])):x("",!0),o.providerResolved?(l(),m("div",yt,[r(f,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-plug",loading:o.testing,onClick:n[8]||(n[8]=b=>v("test"))},{default:c(()=>[...n[12]||(n[12]=[I(" Test connection ",-1)])]),_:1},8,["loading"])])):x("",!0)],64)):x("",!0)],2)}}}),bt=Object.assign(ht,{__name:"AiRoleConfigForm"}),_t={key:0,class:"space-y-3"},xt={class:"text-sm text-gray-500"},kt={key:0,class:"text-sm text-gray-500"},At={key:1,class:"overflow-x-auto"},It={class:"w-full text-sm"},Mt={class:"px-2 py-2"},St={class:"font-mono text-xs"},Vt={class:"text-xs text-gray-400"},wt={class:"text-right px-2 py-2"},Pt=["title"],Tt=["title"],Ct={class:"text-right px-2 py-2"},Ut={key:1,class:"flex items-center gap-2 py-4 text-muted"},Et=H({__name:"AiUsagePanel",async setup(o){let M,C;const v=R(30),i=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],{data:A,pending:_}=([M,C]=oe(()=>ae("/api/settings/ai/usage",{query:{days:v}},"$Q4bVv0_V0W")),M=await M,C(),M);function d(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}return(n,k)=>{const V=fe,$=Ne,y=ne,h=ye;return l(),T(h,{icon:"i-lucide-activity",title:"AI usage"},{actions:c(()=>[r(V,{modelValue:a(v),"onUpdate:modelValue":k[0]||(k[0]=g=>W(v)?v.value=g:null),items:i,size:"sm",class:"w-36"},null,8,["modelValue"])]),default:c(()=>[a(A)?(l(),m("div",_t,[s("p",xt,w(d(a(A).totals.diagnoses))+" diagnoses · "+w(d(a(A).totals.inputTokens))+" input tokens · "+w(d(a(A).totals.outputTokens))+" output tokens ",1),a(A).byModel.length===0?(l(),m("p",kt,"No AI calls recorded in this period.")):(l(),m("div",At,[s("table",It,[k[1]||(k[1]=s("thead",null,[s("tr",{class:"text-xs text-gray-500 uppercase tracking-wider border-b border-default"},[s("th",{class:"text-left px-2 py-2 font-medium"},"Model"),s("th",{class:"text-right px-2 py-2 font-medium"},"Diagnoses"),s("th",{class:"text-right px-2 py-2 font-medium"},"Failed"),s("th",{class:"text-right px-2 py-2 font-medium"},"Input tokens"),s("th",{class:"text-right px-2 py-2 font-medium"},"Output tokens"),s("th",{class:"text-right px-2 py-2 font-medium"},"Avg duration")])],-1)),s("tbody",null,[(l(!0),m(U,null,F(a(A).byModel,g=>(l(),m("tr",{key:`${g.provider??"unknown"}/${g.model}`,class:"border-b last:border-b-0 border-default"},[s("td",Mt,[s("span",St,w(g.model),1),s("span",Vt," · "+w(g.provider??"unknown"),1)]),s("td",wt,w(g.diagnoses),1),s("td",{class:ie(["text-right px-2 py-2",g.failed>0?"text-red-600 dark:text-red-400":""])},w(g.failed),3),s("td",{class:"text-right px-2 py-2",title:g.inputTokens.toLocaleString()},w(d(g.inputTokens)),9,Pt),s("td",{class:"text-right px-2 py-2",title:g.outputTokens.toLocaleString()},w(d(g.outputTokens)),9,Tt),s("td",Ct,[r($,{ms:g.avgDurationMs},null,8,["ms"])])]))),128))])])]))])):a(_)?(l(),m("div",Ut,[r(y,{name:"i-lucide-loader-circle",class:"size-4 animate-spin"}),k[2]||(k[2]=s("span",{class:"text-sm"},"Loading usage…",-1))])):x("",!0)]),_:1})}}}),Rt=Object.assign(Et,{__name:"AiUsagePanel"}),$t=[{key:"sampleErrorChars",label:"Error text characters",envVar:"PIWI_AI_MAX_SAMPLE_ERROR_CHARS",description:"Max characters of raw error text (per error block).",min:200,max:5e4},{key:"scmPatchBudget",label:"SCM patch budget",envVar:"PIWI_AI_MAX_SCM_PATCH_BUDGET",description:"Total characters of diff patches across changed files.",min:0,max:5e4},{key:"affectedTests",label:"Affected tests",envVar:"PIWI_AI_MAX_AFFECTED_TESTS",description:"Max affected tests listed.",min:1,max:200},{key:"steps",label:"Test steps",envVar:"PIWI_AI_MAX_STEPS",description:"Max recent test steps included.",min:1,max:200},{key:"consoleEntries",label:"Console entries",envVar:"PIWI_AI_MAX_CONSOLE_ENTRIES",description:"Max console error/warning entries included.",min:0,max:200},{key:"consoleEntryChars",label:"Console entry characters",envVar:"PIWI_AI_MAX_CONSOLE_ENTRY_CHARS",description:"Max characters per console entry.",min:50,max:5e3},{key:"networkRequests",label:"Network requests",envVar:"PIWI_AI_MAX_NETWORK_REQUESTS",description:"Max failed network requests included.",min:0,max:200},{key:"ariaSnapshotChars",label:"ARIA snapshot characters",envVar:"PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS",description:"Max characters of the page ARIA snapshot.",min:0,max:5e4},{key:"testSourceChars",label:"Test source characters",envVar:"PIWI_AI_MAX_TEST_SOURCE_CHARS",description:"Max characters of the test source snippet.",min:0,max:5e4},{key:"maxSourceFiles",label:"Full source files",envVar:"PIWI_AI_MAX_SOURCE_FILES",description:"Max full source files fetched from SCM to ground patches (0 disables).",min:0,max:20},{key:"sourceFileChars",label:"Source file characters",envVar:"PIWI_AI_MAX_SOURCE_FILE_CHARS",description:"Max characters per fetched full source file.",min:0,max:5e4},{key:"serverLogEntries",label:"Server log entries",envVar:"PIWI_AI_MAX_SERVER_LOG_ENTRIES",description:"Max backend server log entries (from X-Piwi-Logs header) included.",min:0,max:200},{key:"serverLogEntryChars",label:"Server log entry characters",envVar:"PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS",description:"Max characters per backend server log entry.",min:50,max:5e3},{key:"serverTraceSpans",label:"Server trace spans",envVar:"PIWI_AI_MAX_SERVER_TRACE_SPANS",description:"Max backend server spans (from X-Piwi-Trace header) included (0 disables).",min:0,max:500},{key:"maxImages",label:"Max screenshots",envVar:"PIWI_AI_MAX_IMAGES",description:"Max screenshots auto-included in the diagnosis context.",min:0,max:20},{key:"maxPassedPeers",label:"Max passed peers",envVar:"PIWI_AI_MAX_PASSED_PEERS",description:"Max peer tests in the same file listed when they passed.",min:0,max:100},{key:"maxConsoleWindow",label:"Console window entries",envVar:"PIWI_AI_MAX_CONSOLE_WINDOW",description:"Max console entries of any type in the window before failure.",min:0,max:200},{key:"slowRequestMs",label:"Slow request threshold (ms)",envVar:"PIWI_AI_SLOW_REQUEST_MS",description:"Network request duration threshold for flagging as slow.",min:100,max:3e4},{key:"maxTraceActions",label:"Trace actions",envVar:"PIWI_AI_MAX_TRACE_ACTIONS",description:"Max actions extracted from trace ZIP for failing-action context (0 disables).",min:0,max:50},{key:"traceDomChars",label:"Trace DOM excerpt characters",envVar:"PIWI_AI_TRACE_DOM_CHARS",description:"Max characters for the trace-derived DOM/ARIA excerpt in failing-action context.",min:0,max:2e4},{key:"traceStackFrames",label:"Trace stack frames",envVar:"PIWI_AI_MAX_TRACE_STACK_FRAMES",description:"Max call-stack frames (with source windows) from the trace (0 disables).",min:0,max:50},{key:"traceNetworkRequests",label:"Trace network requests",envVar:"PIWI_AI_MAX_TRACE_NETWORK_REQUESTS",description:"Max requests from the trace network stream (0 disables).",min:0,max:200},{key:"domSnapshotChars",label:"DOM snapshot characters",envVar:"PIWI_AI_MAX_DOM_SNAPSHOT_CHARS",description:"Max characters of the failure-time DOM snapshot rendered from the trace (0 disables).",min:0,max:5e4},{key:"imageMaxEdge",label:"Screenshot max edge (px)",envVar:"PIWI_AI_IMAGE_MAX_EDGE",description:"Screenshots are downscaled to at most this many pixels on the long edge before being sent.",min:512,max:8192}],Ot={class:"space-y-6"},Lt={class:"space-y-5"},Bt={class:"flex items-center gap-3"},Ft={class:"flex items-center gap-2 justify-end"},Wt={class:"flex justify-end"},Nt={class:"flex justify-end"},Dt={class:"grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-3"},qt={class:"flex justify-end gap-2"},ms=H({__name:"ai",async setup(o){let M,C;const v=Oe(),{data:i,refresh:A}=([M,C]=oe(()=>ae("/api/settings/ai","$5FSQHzGDZ4")),M=await M,C(),M);function _(){return{enabled:!1,reuse:null,provider:"",model:"",baseUrl:"",apiKey:""}}const d=z({diagnosis:_(),research:_(),embedding:_()}),n=R(!1),k=R(""),V=R(""),$=R(!1),y=R(!1),h=R(!1),g=z({diagnosis:!1,research:!1,embedding:!1}),E=z({diagnosis:[],research:[],embedding:[]}),O=z({diagnosis:!1,research:!1,embedding:!1});function f(t){const e=d[t];return e.reuse?d[e.reuse]?.provider||"":e.provider}async function b(t){const e=d[t],p=f(t),S=e.reuse?d[e.reuse]:e,ee=S.apiKey||void 0;O[t]=!0;try{const te=await $fetch("/api/settings/ai/models",{method:"POST",body:{role:t,provider:p,baseUrl:S.baseUrl||void 0,apiKey:ee}});E[t]=te.models}catch{E[t]=[]}finally{O[t]=!1}}const P=[{key:"diagnosis",title:"Diagnosis model",icon:"i-lucide-stethoscope",help:"settings.ai-provider",optional:!1,enableLabel:"",blurb:"The main model that writes the final diagnosis. Required to enable AI features.",reuseTargets:[],modelPlaceholderAnthropic:"claude-opus-4-8",modelPlaceholderOpenai:"e.g. gpt-4o, llama3.1"},{key:"research",title:"Research model",icon:"i-lucide-search",help:"settings.ai-research",optional:!0,enableLabel:"Two-stage diagnosis",blurb:"A cheaper/faster model that pre-analyzes the failure before the diagnosis model writes the final answer. Also used for cluster naming and merge adjudication.",reuseTargets:["diagnosis"],modelPlaceholderAnthropic:"e.g. claude-haiku-4-5",modelPlaceholderOpenai:"e.g. llama-3.1-8b-instant"},{key:"embedding",title:"Embedding model",icon:"i-lucide-vector-square",help:"settings.embedding-model",optional:!0,enableLabel:"Semantic clustering",blurb:"Embeds failures so semantically-similar errors group together (used by failure clustering).",reuseTargets:["diagnosis","research"],modelPlaceholderAnthropic:"— Anthropic has no embeddings API —",modelPlaceholderOpenai:"e.g. text-embedding-3-small"}],de=[{label:"Anthropic API",value:"anthropic"},{label:"OpenAI-compatible",value:"openai"}],he=de.filter(t=>t.value!=="anthropic"),be=D(()=>{const t={};for(const e of P)t[e.key]=[{label:"Configure its own provider",value:"own"},...e.reuseTargets.filter(p=>d[p].enabled||p==="diagnosis").filter(p=>e.key!=="embedding"||d[p].provider==="openai").map(p=>({label:`Reuse ${P.find(S=>S.key===p).title.toLowerCase()}`,value:p}))];return t}),N=D(()=>!!i.value?.envManaged),_e=qe(Xe("ai"));se(i,t=>{if(t){for(const e of P){const p=t.roles[e.key],S=d[e.key];S.enabled=!!p,S.reuse=p?.reuse??null,S.provider=p?.provider??"",S.model=p?.model??"",S.baseUrl=p?.baseUrl??"",S.apiKey=""}n.value=t.autoDiagnose,k.value=t.customInstructions||""}},{immediate:!0});function xe(t){return!!i.value?.roles[t]?.hasApiKey}const ce=[{label:"ollama (local)",baseUrl:"http://localhost:11434/v1",model:"llama3.1"},{label:"LM Studio (local)",baseUrl:"http://localhost:1234/v1",model:""},{label:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",model:"meta-llama/llama-3.1-8b-instruct"},{label:"Groq",baseUrl:"https://api.groq.com/openai/v1",model:"llama-3.1-8b-instant"},{label:"OpenAI",baseUrl:"https://api.openai.com/v1",model:"gpt-4o"},{label:"Mistral AI",baseUrl:"https://api.mistral.ai/v1",model:"mistral-small-latest"},{label:"Custom",baseUrl:"",model:""}],ke=ce.map(t=>({label:t.label,value:t.label}));function Ae(t,e){const p=ce.find(S=>S.label===e);!p||p.label==="Custom"||(d[t].baseUrl=p.baseUrl,d[t].model=p.model)}function Q(t){const e=d[t];if(!e.enabled)return null;if(e.reuse)return{reuse:e.reuse,model:e.model||void 0};const p={provider:e.provider,model:e.model||void 0,baseUrl:e.baseUrl||void 0};return e.apiKey!==""&&(p.apiKey=e.apiKey),p}async function Ie(){$.value=!0;try{!N&&(!d.diagnosis.enabled||!d.diagnosis.provider)?await $fetch("/api/settings/ai",{method:"PUT",body:{roles:null,autoDiagnose:n.value}}):await $fetch("/api/settings/ai",{method:"PUT",body:{roles:{diagnosis:Q("diagnosis"),research:Q("research"),embedding:Q("embedding")},autoDiagnose:n.value}}),await A();for(const t of P)d[t.key].apiKey="";v.add({title:"Settings saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{$.value=!1}}async function Me(){h.value=!0;try{await $fetch("/api/settings/ai",{method:"PUT",body:{scmToken:V.value||null}}),await A(),V.value="",v.add({title:"SCM token saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{h.value=!1}}async function Se(){y.value=!0;try{await $fetch("/api/settings/ai",{method:"PUT",body:{customInstructions:k.value||null}}),await A(),v.add({title:"Instructions saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{y.value=!1}}async function Ve(t){g[t]=!0;try{const e=d[t],p=e.reuse?d[e.reuse]:e,S=await $fetch("/api/settings/ai/test",{method:"POST",body:{role:t,provider:p.provider||void 0,apiKey:p.apiKey||void 0,model:e.model||(e.reuse?p.model:"")||void 0,baseUrl:p.baseUrl||void 0}});S.success?v.add({title:"Connection successful",description:`Model: ${S.model}`,color:"success"}):v.add({title:"Connection failed",description:S.error||"Unknown error",color:"error"})}catch(e){v.add({title:"Connection failed",description:String(e?.message??e),color:"error"})}finally{g[t]=!1}}const{data:L}=([M,C]=oe(()=>ae("/api/settings/ai/limits","$qHhpP8mBYb")),M=await M,C(),M),Y=$t,X=z({}),Z=R(!1),J=D(()=>new Set(L.value?.envManaged??[]));se(L,t=>{if(t)for(const e of Y)X[e.key]=t.limits[e.key]},{immediate:!0});async function we(){Z.value=!0;try{L.value=await $fetch("/api/settings/ai/limits",{method:"PUT",body:{limits:X}}),v.add({title:"Context limits saved",color:"success"})}catch(t){v.add({title:"Failed to save context limits",description:String(t?.message??t),color:"error"})}finally{Z.value=!1}}function Pe(){if(L.value)for(const t of Y)J.value.has(t.key)||(X[t.key]=L.value.defaults[t.key])}return(t,e)=>{const p=Ee,S=bt,ee=pe,te=Re,j=re,K=ye,Te=Rt,ue=G,me=ve,Ce=De,Ue=ge;return l(),m("div",Ot,[a(N)?(l(),T(p,{key:0,"env-vars":a(_e)},null,8,["env-vars"])):x("",!0),r(K,{icon:"i-lucide-sparkles",title:"Model providers",help:"settings.ai-provider"},{subtitle:c(()=>[...e[3]||(e[3]=[I(" Configure a complete provider for each model role. Optional roles can reuse another role's provider so you don't re-enter credentials. ",-1)])]),footer:c(()=>[s("div",Ft,[r(j,{color:"primary",loading:a($),icon:"i-lucide-save",onClick:Ie},{default:c(()=>[...e[5]||(e[5]=[I(" Save ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[s("div",Lt,[(l(),m(U,null,F(P,u=>r(S,{key:u.key,modelValue:a(d)[u.key],"onUpdate:modelValue":B=>a(d)[u.key]=B,meta:u,"has-api-key":xe(u.key),"reuse-options":a(be)[u.key],"provider-options":u.key==="embedding"?a(he):de,"preset-options":a(ke),disabled:a(N),"env-managed":a(N),"provider-resolved":f(u.key),models:a(E)[u.key],"loading-models":a(O)[u.key],testing:a(g)[u.key],onApplyPreset:B=>Ae(u.key,B),onLoadModels:B=>b(u.key),onTest:B=>Ve(u.key)},null,8,["modelValue","onUpdate:modelValue","meta","has-api-key","reuse-options","provider-options","preset-options","disabled","env-managed","provider-resolved","models","loading-models","testing","onApplyPreset","onLoadModels","onTest"])),64)),r(te,{label:"Auto-diagnose",help:"settings.auto-diagnose","env-managed":a(N)},{default:c(()=>[s("div",Bt,[r(ee,{modelValue:a(n),"onUpdate:modelValue":e[0]||(e[0]=u=>W(n)?n.value=u:null),disabled:a(N)||!a(d).diagnosis.enabled},null,8,["modelValue","disabled"]),e[4]||(e[4]=s("span",{class:"text-sm text-gray-500"}," Automatically diagnose new failure clusters when a run finishes — up to 3 clusters per run (research + diagnosis call each), plus one batched call to title new clusters ",-1))])]),_:1},8,["env-managed"])])]),_:1}),r(Te),r(K,{title:"Repository access",help:"project.scm-token"},{subtitle:c(()=>[...e[6]||(e[6]=[I(" Optional — required for private repositories. Per-project tokens override this. ",-1)])]),footer:c(()=>[s("div",Wt,[r(j,{color:"primary",loading:a(h),icon:"i-lucide-save",onClick:Me},{default:c(()=>[...e[7]||(e[7]=[I(" Save token ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[r(me,{label:"SCM token",description:a(i)?.hasScmToken?"Leave empty to keep the stored token, enter a new value to replace it, or save empty to remove it":"Personal access token with read access to repository contents. Supports GitHub (ghp_), GitLab (glpat-), and Bitbucket tokens."},{default:c(()=>[r(ue,{modelValue:a(V),"onUpdate:modelValue":e[1]||(e[1]=u=>W(V)?V.value=u:null),type:"password",placeholder:a(i)?.hasScmToken?"•••••••• (unchanged)":"ghp_..., glpat-..., or Bitbucket token",class:"w-full font-mono"},null,8,["modelValue","placeholder"])]),_:1},8,["description"])]),_:1}),r(K,{title:"Global analysis instructions",help:"settings.ai-instructions"},{footer:c(()=>[s("div",Nt,[r(j,{color:"primary",loading:a(y),icon:"i-lucide-save",onClick:Se},{default:c(()=>[...e[8]||(e[8]=[I(" Save instructions ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[r(Ce,{modelValue:a(k),"onUpdate:modelValue":e[2]||(e[2]=u=>W(k)?k.value=u:null),rows:6,placeholder:"e.g. Always suggest running failing tests with --repeat-each 5 to confirm flakiness. Prefer network-level evidence over ARIA snapshots. Recommend git bisect when a commit range is available.",class:"w-full font-mono text-sm"},null,8,["modelValue"]),e[9]||(e[9]=s("p",{class:"text-xs text-gray-400 mt-2"}," These instructions are appended to the base system prompt. They shape how the AI analyzes failures but cannot override the response schema or confidence requirement. ",-1))]),_:1}),r(K,{title:"Diagnosis context limits",help:"settings.ai-limits"},{subtitle:c(()=>[...e[10]||(e[10]=[I(" Leave a field empty to use its default; env-managed fields are read-only. ",-1)])]),footer:c(()=>[s("div",qt,[r(j,{color:"neutral",variant:"ghost",size:"sm",onClick:Pe},{default:c(()=>[...e[11]||(e[11]=[I("Reset to defaults",-1)])]),_:1}),r(j,{color:"primary",loading:a(Z),icon:"i-lucide-save",size:"sm",onClick:we},{default:c(()=>[...e[12]||(e[12]=[I(" Save limits ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[s("div",Dt,[(l(!0),m(U,null,F(a(Y),u=>(l(),T(me,{key:u.key,label:u.label,description:u.description,hint:`default ${a(L)?.defaults[u.key]??""}`},{default:c(()=>[r(ue,{modelValue:a(X)[u.key],"onUpdate:modelValue":B=>a(X)[u.key]=B,modelModifiers:{number:!0},type:"number",min:u.min,max:u.max,disabled:a(J).has(u.key),placeholder:`default ${a(L)?.defaults[u.key]??""}`,class:"w-full"},Le({_:2},[a(J).has(u.key)?{name:"trailing",fn:c(()=>[r(Ue,{"env-vars":[u.envVar]},null,8,["env-vars"])]),key:"0"}:void 0]),1032,["modelValue","onUpdate:modelValue","min","max","disabled","placeholder"])]),_:2},1032,["label","description","hint"]))),128))])]),_:1}),r(K,{icon:"i-lucide-shield-check",title:"Privacy notice",help:"settings.privacy"},{default:c(()=>[...e[13]||(e[13]=[s("div",{class:"space-y-2 text-sm text-gray-600 dark:text-gray-400"},[s("p",null,"When diagnosing a failure cluster, the following data is sent to the configured LLM provider:"),s("ul",{class:"list-disc list-inside space-y-1 ml-2"},[s("li",null,"Normalized error signature and sample raw error text"),s("li",null,"Test titles and file paths for affected tests"),s("li",null,"Browser info, test steps, console error/warning entries (excerpts)"),s("li",null,"Failed network request URLs and status codes"),s("li",null,"ARIA page snapshot (if collected)"),s("li",null," Commit SHA range since last passing run, plus changed file names and diff patches fetched from GitHub/GitLab/Bitbucket (if a repository token is configured or the repo is public) ")]),s("p",{class:"mt-2"},[I(" API keys are stored encrypted in the application database (admin-only access). For stricter setups, use the "),s("code",{class:"font-mono text-xs"},"PIWI_AI_*"),I(" environment variables instead of the UI. ")])],-1)])]),_:1})])}}});export{ms as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as g,o as s,c as a,F as l,y as o,f,
|
|
1
|
+
import{d as g,o as s,c as a,F as l,y as o,f,G as p,q as b,k as y,R as k,h as _}from"./h49q_GXF.js";const h=g({__name:"MiniRunBars",props:{runs:{},height:{default:28},maxBars:{default:20}},setup(n){const i=n;function u(t){return["running","initialising","finalizing"].includes(t.status)?"bg-blue-400 dark:bg-blue-500":t.flakyTests>0&&t.status==="passed"?"bg-amber-400 dark:bg-amber-400":t.status==="passed"?"bg-green-500":["failed","timedout","interrupted"].includes(t.status)?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function c(t){const r=[`Run #${t.id}`,`Status: ${t.status}`,`${t.passedTests}/${t.totalTests} passed`];return t.flakyTests>0&&r.push(`${t.flakyTests} flaky`),r.join(" · ")}const d=_(()=>Math.max(0,i.maxBars-i.runs.length));return(t,r)=>{const m=p;return s(),a("div",{class:"flex items-stretch gap-px",style:k({height:`${n.height}px`})},[(s(!0),a(l,null,o(n.runs,e=>(s(),f(m,{key:e.id,to:`/test-runs/${e.id}`,title:c(e),class:b(["flex-1 rounded-sm transition-opacity hover:opacity-70 min-w-0",u(e)])},null,8,["to","title","class"]))),128)),(s(!0),a(l,null,o(y(d),e=>(s(),a("div",{key:`empty-${e}`,class:"flex-1 rounded-sm bg-gray-100 dark:bg-gray-800 min-w-0"}))),128))],4)}}}),$=Object.assign(h,{__name:"MiniRunBars"});export{$ as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{G as m,a as p}from"./
|
|
1
|
+
import{G as m,a as p}from"./CD3R-ggS.js";import{d,o as n,c as o,k as t,F as r,m as i,t as l,i as f,q as _,h as c}from"./h49q_GXF.js";const k=["title"],x=d({__name:"DurationValue",props:{ms:{default:null},fallback:{default:"—"},unitClass:{default:"text-gray-400/70 dark:text-gray-500/70"},noTitle:{type:Boolean,default:!1}},setup(e){const a=e,s=c(()=>m(a.ms)),u=c(()=>a.noTitle||a.ms===null||a.ms===void 0?void 0:p(a.ms));return(y,g)=>(n(),o("span",{class:"tabular-nums whitespace-nowrap",title:t(u)},[t(s)?(n(),o(r,{key:0},[i(l(t(s).value),1),f("span",{class:_(e.unitClass)},l(t(s).unit),3)],64)):(n(),o(r,{key:1},[i(l(e.fallback),1)],64))],8,k))}}),h=Object.assign(x,{__name:"DurationValue"});export{h as _};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import{s as e,_ as o,o as a,a as t,n as r,b as s}from"./DGnQ69wW.js";const i=e().min(1,"Name is required").max(120).regex(/^[A-Za-z_$][A-Za-z0-9_$]*$/,"Must be a valid JS identifier"),n=e().max(120).regex(/^[A-Za-z_$][A-Za-z0-9_$]*$/,"Must be a valid JS identifier").nullish(),h=e().min(1,"Module is required").max(240).regex(/^[^'"`\r\n]+$/,"Must not contain quotes or line breaks"),g=o(["goto","click","fill","check","uncheck","selectOption","press","assertVisible"]),y=a({role:e().nullish(),name:e().nullish(),testId:e().nullish()}),l=a({name:e().min(1),type:o(["string","number","boolean","object"]),fields:t(e().min(1).max(80)).max(20).optional()}),c=a({action:g,target:y}),p=a({param:e().min(1),path:e().min(1).max(80).nullish(),stepIndex:r().int().min(0),from:o(["text","value","testId"])}),m=o(["page-object-method","helper","fixture"]);a({name:i,kind:m,receiver:n,importName:n,params:t(l).max(10),returnsPage:s().optional(),steps:t(c).min(1,"At least one pattern step is required").max(30),paramSources:t(p).max(10).optional(),confidence:r().min(0).max(1).optional(),notes:e().max(500).nullish()});a({name:i,kind:m,module:h,receiver:n,importName:n,params:t(l).max(10),returnsPage:s().optional(),urlPattern:e().max(240).nullish(),steps:t(c).min(1,"At least one pattern step is required").max(30),paramSources:t(p).max(10).optional(),source:o(["manual","scanned","recorded","ai-extracted"]).optional(),confidence:r().min(0).max(1).optional()});a({name:i.optional(),kind:m.optional(),module:h.optional(),receiver:n,importName:n,params:t(l).max(10).optional(),returnsPage:s().optional(),urlPattern:e().max(240).nullish(),steps:t(c).min(1).max(30).optional(),paramSources:t(p).max(10).optional(),source:o(["manual","scanned","recorded","ai-extracted"]).optional(),confidence:r().min(0).max(1).optional()});const f=`You analyze a single Playwright page-object method or helper function's TypeScript/JavaScript source code and extract a structured, reusable pattern describing what it does. You never execute the code — this is text analysis only. Reply strictly as JSON matching the given schema, nothing else.
|
|
2
|
+
|
|
3
|
+
Rules:
|
|
4
|
+
- "kind" is "page-object-method" when the code is a class method acting on "this.page" (or a "page" property) — set "receiver" to a sensible instance variable name (camelCase of the class name) and "importName" to the class name. "kind" is "helper" for a standalone exported function taking a Playwright "page" as its first parameter — "receiver" and "importName" must be null in that case. Use "fixture" only if the function is clearly Playwright fixture setup, not a page action.
|
|
5
|
+
- "params" lists the function's own parameters, excluding the leading Playwright handle — that first parameter is often named "page", but may be named anything and typed "Page", "Locator", or a union like "Page | Locator"; if the first parameter is a Playwright handle of any kind, skip it. Infer "type" from the TypeScript annotation, or absent one, from how the value is used.
|
|
6
|
+
- A parameter whose type is an object/interface (an options bag like "{ label?: string; testId?: string }", very common in helpers) MUST be typed "object", never "string". Set its "fields" to the object's own property names — from the interface declaration if you can see it, otherwise from the properties the function body actually reads off it. If the parameter is declared as an object OR an array of that object, still type it "object" and list the single object's fields. Never flatten an object parameter into a scalar.
|
|
7
|
+
- "steps" is the ordered sequence of page interactions the function performs, one entry per Playwright locator-then-action call (".click()", ".fill(value)", ".check()", ".uncheck()", ".selectOption(value)", ".press(key)"; a "page.goto(...)" call becomes a "goto" step). For each step's "target": "getByTestId('x')" sets "testId" only; "getByRole('role', { name: 'X' })" sets both "role" and "name"; a bare "getByRole('role')" sets only "role"; "getByText"/"getByLabel"/"getByPlaceholder" set "name" to that text and leave "role" null. Skip a step whose locator can't be classified this way rather than guessing.
|
|
8
|
+
- "paramSources" maps a step's argument back to a function parameter when that argument IS the parameter (e.g. ".fill(username)" where "username" is a parameter) — "from" is "value" for fill/selectOption/press arguments, "testId" when the parameter is interpolated into a getByTestId call, "text" when interpolated into a name/text match. Omit an entry when a step's value is a literal, not a parameter. When the value comes from a *field* of an object parameter (e.g. ".getByRole('option', { name: opt.value })"), set "param" to the parameter and "path" to that field name ("value") — one entry per field, and each field you reference this way must also appear in that parameter's "fields".
|
|
9
|
+
- "steps" must see through wrappers that aren't themselves page interactions: "test.step(...)" / "await test.step(...)" callbacks are transparent — extract the Playwright calls inside them as if the wrapper weren't there. The same goes for try/finally and "await Promise.all([...])".
|
|
10
|
+
- Branching and loops: when the body picks between alternative locators for the *same* logical interaction (an if/else chain over which option field was passed, a ".or(...)" locator), emit ONE step for that interaction using the most representative branch, and lower "confidence". Do not emit one step per branch — the pattern is matched against a real recording, which only ever took one path. For a loop that repeats an interaction an unknown number of times, emit the body once.
|
|
11
|
+
- A call to another helper in the same project that you cannot see the source of (e.g. "focusVSelect(...)", "getVSelectLocator(...)") is a real interaction you cannot classify. Do not silently drop it and do not guess its target: leave it out of "steps", lower "confidence", and name it in "notes".
|
|
12
|
+
- "confidence": your own 0-1 confidence that "steps" faithfully represents what the code does — lower it for loops, conditionals, or calls to other helper functions you can't see the inside of.
|
|
13
|
+
- "notes": one short sentence, only when something material could not be represented — unseen helper calls, branches you collapsed, or locators you had to skip. Null when the extraction is clean. This is shown to the user next to the confidence, so be specific about what is missing rather than generic.
|
|
14
|
+
- Never invent a step that isn't evidenced by an actual Playwright call in the code. A pattern of one or two well-grounded steps plus an honest "notes" is far more useful than a longer guessed one.`,b={type:"object",properties:{name:{type:"string"},kind:{type:"string",enum:["page-object-method","helper","fixture"]},receiver:{type:["string","null"]},importName:{type:["string","null"]},params:{type:"array",items:{type:"object",properties:{name:{type:"string"},type:{type:"string",enum:["string","number","boolean","object"]},fields:{type:"array",items:{type:"string"}}},required:["name","type"],additionalProperties:!1}},returnsPage:{type:"boolean"},steps:{type:"array",items:{type:"object",properties:{action:{type:"string",enum:["goto","click","fill","check","uncheck","selectOption","press","assertVisible"]},target:{type:"object",properties:{role:{type:["string","null"]},name:{type:["string","null"]},testId:{type:["string","null"]}},additionalProperties:!1}},required:["action","target"],additionalProperties:!1}},paramSources:{type:"array",items:{type:"object",properties:{param:{type:"string"},path:{type:["string","null"]},stepIndex:{type:"integer"},from:{type:"string",enum:["text","value","testId"]}},required:["param","stepIndex","from"],additionalProperties:!1}},confidence:{type:"number"},notes:{type:["string","null"]}},required:["name","kind","params","steps"],additionalProperties:!1};function w(d){const u=d.trim();return`${f}
|
|
15
|
+
|
|
16
|
+
Respond with ONLY a JSON object — no markdown code fences, no commentary — matching exactly this JSON schema:
|
|
17
|
+
|
|
18
|
+
${JSON.stringify(b,null,2)}
|
|
19
|
+
|
|
20
|
+
Here is the function to analyze:
|
|
21
|
+
|
|
22
|
+
\`\`\`
|
|
23
|
+
${u}
|
|
24
|
+
\`\`\``}const S=.6;export{f as E,S as L,w as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as s}from"./DHUT-BKj.js";import{u as r}from"./B-6GGrhr.js";import{d as i,w as _,f as p,n as m,o as c}from"./h49q_GXF.js";import"./CobveFaj.js";import"./BjaRappk.js";import"./BaDhDBCV.js";const h=i({__name:"index",async setup(f){let t,e;const n=r().value.flat().find(o=>typeof o.to=="string")?.to;return n&&([t,e]=_(()=>m(n,{replace:!0})),await t,e()),(o,g)=>{const a=s;return c(),p(a,{text:"Opening settings…"})}}});export{h as default};
|