@piwitests/server 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{CXEH9OPk.js → 9ti9eNH9.js} +1 -1
- package/.output/public/_nuxt/{oAClCn_h.js → B-zdP-D4.js} +1 -1
- package/.output/public/_nuxt/{DsesNydr.js → B1RmmOsM.js} +1 -1
- package/.output/public/_nuxt/{C0_yH0N7.js → B3Fsod9X.js} +1 -1
- package/.output/public/_nuxt/{Cnsmicv2.js → B3rirOqU.js} +34 -34
- package/.output/public/_nuxt/B3zmIJYb.js +1 -0
- package/.output/public/_nuxt/{DuwtTfO8.js → BAKUqW95.js} +2 -2
- package/.output/public/_nuxt/BG0KKQiT.js +7 -0
- package/.output/public/_nuxt/BGL_V7Y4.js +1 -0
- package/.output/public/_nuxt/{Dpd16JVI.js → BGusFAvZ.js} +1 -1
- package/.output/public/_nuxt/{l5WKbU4h.js → BNurUTla.js} +3 -3
- package/.output/public/_nuxt/BR5cR2Ot.js +1 -0
- package/.output/public/_nuxt/BTCh_0zN.js +1 -0
- package/.output/public/_nuxt/{C8e1EbJI.js → BTVqMsA3.js} +1 -1
- package/.output/public/_nuxt/{DabzhQB1.js → B_13C0GF.js} +1 -1
- package/.output/public/_nuxt/BeDIjhoR.js +44 -0
- package/.output/public/_nuxt/{D5tke0B5.js → BerCW7Ug.js} +1 -1
- package/.output/public/_nuxt/{BicAJ6U8.js → BfTNbVc_.js} +1 -1
- package/.output/public/_nuxt/BnbSEpXX.js +1 -0
- package/.output/public/_nuxt/Bo_dxehb.js +1 -0
- package/.output/public/_nuxt/{C2hkrSey.js → BpBHls4-.js} +1 -1
- package/.output/public/_nuxt/{Bm62iDV5.js → BpM6ZPIG.js} +1 -1
- package/.output/public/_nuxt/{GPNI1ffD.js → BqGumsDo.js} +2 -2
- package/.output/public/_nuxt/{A1pj0VnG.js → BrxtP_cN.js} +1 -1
- package/.output/public/_nuxt/{KyA_4Ks-.js → C2hNxjjz.js} +1 -1
- package/.output/public/_nuxt/C5PSqfKi.js +2 -0
- package/.output/public/_nuxt/C5vsaU4G.js +1 -0
- package/.output/public/_nuxt/C9sdHaXd.js +1 -0
- package/.output/public/_nuxt/{Und3xXFc.js → CAxgBYIt.js} +2 -2
- package/.output/public/_nuxt/{BmUfSNMV.js → CES2i5Pl.js} +1 -1
- package/.output/public/_nuxt/{CNyV9YpI.js → CFEdRqaj.js} +1 -1
- package/.output/public/_nuxt/{Dy-TJ0Mt.js → CFTZwazK.js} +1 -1
- package/.output/public/_nuxt/CIBS7ye6.js +1 -0
- package/.output/public/_nuxt/CIEceDOw.js +1 -0
- package/.output/public/_nuxt/{bLcjFslv.js → CJBhojV6.js} +1 -1
- package/.output/public/_nuxt/{b-GYfcrQ.js → CKYddHa6.js} +1 -1
- package/.output/public/_nuxt/{BKkF4pPD.js → CLVWiCds.js} +1 -1
- package/.output/public/_nuxt/{CwGWJbiy.js → CMYAryzi.js} +1 -1
- package/.output/public/_nuxt/{CjPfj7ya.js → COhdybDy.js} +1 -1
- package/.output/public/_nuxt/{B7FTvFWq.js → CRBXM2d6.js} +2 -2
- package/.output/public/_nuxt/CTD_pJ_v.js +1 -0
- package/.output/public/_nuxt/{Cus22Ud3.js → CTP8Pw0-.js} +2 -2
- package/.output/public/_nuxt/{CeW8v31b.js → CV8iF2kG.js} +1 -1
- package/.output/public/_nuxt/{H94BMf3L.js → CWKmbYlT.js} +1 -1
- package/.output/public/_nuxt/C_NfGMTd.js +9 -0
- package/.output/public/_nuxt/Cejoebel.js +6 -0
- package/.output/public/_nuxt/{FaFoMVKo.js → Chpah_7l.js} +1 -1
- package/.output/public/_nuxt/Ci9d8YVV.js +1 -0
- package/.output/public/_nuxt/{CIrFl3MW.js → CifRHVaR.js} +1 -1
- package/.output/public/_nuxt/{DrfE8IY0.js → Ckgsh9AT.js} +1 -1
- package/.output/public/_nuxt/{-f7BAm1H.js → Cpsq-kYE.js} +1 -1
- package/.output/public/_nuxt/Cqc-DSTF.js +1 -0
- package/.output/public/_nuxt/{CAAwCT7H.js → CsHulb12.js} +1 -1
- package/.output/public/_nuxt/Ctb2CqUf.js +5 -0
- package/.output/public/_nuxt/CtstIQSh.js +1 -0
- package/.output/public/_nuxt/{DJxlKFGb.js → CvMzDKvu.js} +1 -1
- package/.output/public/_nuxt/{CTU1mrhq.js → D2pBhsH8.js} +1 -1
- package/.output/public/_nuxt/{B3obW6cw.js → D8gX1Jde.js} +2 -2
- package/.output/public/_nuxt/D9knOn6D.js +1 -0
- package/.output/public/_nuxt/DAPTVdvA.js +1 -0
- package/.output/public/_nuxt/{Du2W7Jne.js → DCFbQvIN.js} +42 -42
- package/.output/public/_nuxt/DCoJlz_q.js +1 -0
- package/.output/public/_nuxt/DGnQ69wW.js +64 -0
- package/.output/public/_nuxt/{hNh4CIL0.js → DHzij16p.js} +1 -1
- package/.output/public/_nuxt/DJMCXRuW.js +5 -0
- package/.output/public/_nuxt/DJXcGkJP.js +2 -0
- package/.output/public/_nuxt/{DPCxhHri.js → DKFXZdWZ.js} +1 -1
- package/.output/public/_nuxt/{Bnxf8nbZ.js → DL24AjfW.js} +1 -1
- package/.output/public/_nuxt/DON74Yh6.js +1 -0
- package/.output/public/_nuxt/{5A6ITZXj.js → DQM62mxB.js} +1 -1
- package/.output/public/_nuxt/DSe8DxMl.js +1 -0
- package/.output/public/_nuxt/DWwiVTZX.js +24 -0
- package/.output/public/_nuxt/DX4tAP78.js +1 -0
- package/.output/public/_nuxt/{C1gTN4Q8.js → D_eDAIsT.js} +1 -1
- package/.output/public/_nuxt/Da8A92cF.js +1 -0
- package/.output/public/_nuxt/{CzAPFPpL.js → DdH3op4b.js} +1 -1
- package/.output/public/_nuxt/DepFDZO3.js +1 -0
- package/.output/public/_nuxt/{BzRRzmwm.js → DfSBKzrC.js} +1 -1
- package/.output/public/_nuxt/{BdfhYr-u.js → DfnKh3dZ.js} +1 -1
- package/.output/public/_nuxt/{Bow4tTR0.js → DhpTfeip.js} +1 -1
- package/.output/public/_nuxt/{CAvY22RE.js → Dk9nD32g.js} +1 -1
- package/.output/public/_nuxt/{BrQEE053.js → DkT2nCqn.js} +1 -1
- package/.output/public/_nuxt/DlW85lQq.js +4 -0
- package/.output/public/_nuxt/DnNio-ut.js +1 -0
- package/.output/public/_nuxt/{DdwHkKfV.js → DnQv_hst.js} +1 -1
- package/.output/public/_nuxt/{B99fbi73.js → DqEOMteW.js} +1 -1
- package/.output/public/_nuxt/{4gYNA-d4.js → Dsvu7YJT.js} +1 -1
- package/.output/public/_nuxt/DvhCDBrR.js +2 -0
- package/.output/public/_nuxt/DwQaVMZR.js +1 -0
- package/.output/public/_nuxt/E-_n_6vi.js +1 -0
- package/.output/public/_nuxt/{BT3wGCTI.js → Ebw5l7n8.js} +1 -1
- package/.output/public/_nuxt/{CA9B2HE5.js → IPePdbzl.js} +1 -1
- package/.output/public/_nuxt/{DJmoLeVt.js → LHoUGrfi.js} +1 -1
- package/.output/public/_nuxt/{L3kAWB2a.js → NERLHpOL.js} +1 -1
- package/.output/public/_nuxt/{CeG9pBAD.js → RAdNGxcF.js} +1 -1
- package/.output/public/_nuxt/Vxyo_mU9.js +1 -0
- package/.output/public/_nuxt/{pQqGiNch.js → YE1kAkU9.js} +1 -1
- package/.output/public/_nuxt/{CsLojMwR.js → YmT5WiN5.js} +1 -1
- package/.output/public/_nuxt/ZcAfCxWE.js +17 -0
- package/.output/public/_nuxt/{CxyAzHr3.js → _rglcvXN.js} +1 -1
- package/.output/public/_nuxt/bFU9Y1Vw.js +10 -0
- package/.output/public/_nuxt/bfecIH89.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/31ca2be4-a949-4df6-9818-773fc085557a.json +1 -0
- package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
- package/.output/public/_nuxt/four-S1Y.js +1 -0
- package/.output/public/_nuxt/{CJFtzlQ4.js → gV2U_Gqd.js} +1 -1
- package/.output/public/_nuxt/{DeY2JkR2.js → lGC893pn.js} +1 -1
- package/.output/public/_nuxt/nOfj-ar8.js +1 -0
- package/.output/public/_nuxt/oKrbs1XK.js +1 -0
- package/.output/public/_nuxt/oSJFAC38.js +1 -0
- package/.output/public/_nuxt/rL4C0HV5.js +1 -0
- package/.output/public/_nuxt/{Dyeqn3aG.js → tQoyVPCE.js} +1 -1
- package/.output/public/_nuxt/{DfgOx_ou.js → uSPCvASp.js} +1 -1
- package/.output/public/_nuxt/{hC_z4G8p.js → wkz5-1SO.js} +1 -1
- package/.output/public/_nuxt/yYlVYKCz.js +34 -0
- package/.output/public/_nuxt/{AbmKWFQQ.js → zv8WdMx0.js} +1 -1
- package/.output/server/chunks/_/scope.mjs +43 -27
- package/.output/server/chunks/_/scope.mjs.map +1 -1
- package/.output/server/chunks/_/users.mjs +1 -1
- package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-3itRZ1uz.mjs} +2 -2
- package/.output/server/chunks/build/Breadcrumb-3itRZ1uz.mjs.map +1 -0
- package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-GnjBvXuT.mjs} +2 -2
- package/.output/server/chunks/build/BreadcrumbNav-GnjBvXuT.mjs.map +1 -0
- package/.output/server/chunks/build/{BrowserBadge-MFvBwxmD.mjs → BrowserBadge-DQqJS9CV.mjs} +2 -2
- package/.output/server/chunks/build/BrowserBadge-DQqJS9CV.mjs.map +1 -0
- package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-D0rzMf-N.mjs} +2 -2
- package/.output/server/chunks/build/ChartCard-D0rzMf-N.mjs.map +1 -0
- package/.output/server/chunks/build/{Checkbox-4Q5d0fa0.mjs → Checkbox-DmRKG-0s.mjs} +3 -3
- package/.output/server/chunks/build/Checkbox-DmRKG-0s.mjs.map +1 -0
- package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-DGhKVFad.mjs} +4 -4
- package/.output/server/chunks/build/CodeBlock-DGhKVFad.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DCr10nxL.mjs} +2 -2
- package/.output/server/chunks/build/DashboardNavbar-DCr10nxL.mjs.map +1 -0
- package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-8EpBhX0R.mjs} +3 -3
- package/.output/server/chunks/build/DashboardSidebarToggle-8EpBhX0R.mjs.map +1 -0
- package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-rzS-pgCP.mjs} +5 -5
- package/.output/server/chunks/build/DataLocationCard-rzS-pgCP.mjs.map +1 -0
- package/.output/server/chunks/build/{DiagnosisPanel-CALyEmcJ.mjs → DiagnosisPanel-BWTpoCKy.mjs} +8 -7
- package/.output/server/chunks/build/DiagnosisPanel-BWTpoCKy.mjs.map +1 -0
- package/.output/server/chunks/build/{useAiStatus-CxjMmDDY.mjs → DiagnosisResult-Br3qBLXe.mjs} +10 -32
- package/.output/server/chunks/build/DiagnosisResult-Br3qBLXe.mjs.map +1 -0
- package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-CWKfjIF2.mjs} +2 -2
- package/.output/server/chunks/build/DurationValue-CWKfjIF2.mjs.map +1 -0
- package/.output/server/chunks/build/{EntityLinks-BBHWssHH.mjs → EntityLinks-CF0xG3Y8.mjs} +6 -6
- package/.output/server/chunks/build/EntityLinks-CF0xG3Y8.mjs.map +1 -0
- package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs +1 -1
- package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs +83 -0
- package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs.map +1 -0
- package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-e7OnSKPM.mjs} +2 -2
- package/.output/server/chunks/build/FormField-e7OnSKPM.mjs.map +1 -0
- package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs +510 -0
- package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs.map +1 -0
- package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-DjGrGFA7.mjs} +3 -3
- package/.output/server/chunks/build/HelpHint-DjGrGFA7.mjs.map +1 -0
- package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-B8v1nWJt.mjs} +3 -3
- package/.output/server/chunks/build/LoadingState-B8v1nWJt.mjs.map +1 -0
- package/.output/server/chunks/build/{CiEnvCard-DB5DvBh1.mjs → MetaStripGroup-dXXa_MzF.mjs} +242 -529
- package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs.map +1 -0
- package/.output/server/chunks/build/{MiniRunBars-CZMugDrh.mjs → MiniRunBars-fgLMgRUp.mjs} +2 -2
- package/.output/server/chunks/build/MiniRunBars-fgLMgRUp.mjs.map +1 -0
- package/.output/server/chunks/build/{useSettingsNav-DnQKacz8.mjs → NavigationMenu-cqpt11Ce.mjs} +5 -28
- package/.output/server/chunks/build/NavigationMenu-cqpt11Ce.mjs.map +1 -0
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs → OpenInIdeLink-B9wvQkhy.mjs} +5 -5
- package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs.map → OpenInIdeLink-B9wvQkhy.mjs.map} +1 -1
- package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs → ProjectTestCasesTable-BwHEtZTz.mjs} +15 -15
- package/.output/server/chunks/build/ProjectTestCasesTable-BwHEtZTz.mjs.map +1 -0
- package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-BDRIWn3o.mjs} +2 -2
- package/.output/server/chunks/build/RunReports-BDRIWn3o.mjs.map +1 -0
- package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CuTDknRJ.mjs} +2 -2
- package/.output/server/chunks/build/RunStatusBadge-CuTDknRJ.mjs.map +1 -0
- package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-BW5Lynrr.mjs} +2 -2
- package/.output/server/chunks/build/SectionCard-BW5Lynrr.mjs.map +1 -0
- package/.output/server/chunks/build/{Select-5DK9frQ7.mjs → Select-CVctwpib.mjs} +3 -3
- package/.output/server/chunks/build/Select-CVctwpib.mjs.map +1 -0
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs → SelectMenu-XLVBEa11.mjs} +3 -3
- package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs.map → SelectMenu-XLVBEa11.mjs.map} +1 -1
- package/.output/server/chunks/build/{SettingsField-BZfx4ma1.mjs → SettingsField-DvtRvI6O.mjs} +3 -3
- package/.output/server/chunks/build/SettingsField-DvtRvI6O.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-8zWfwI5B.mjs} +2 -2
- package/.output/server/chunks/build/Switch-8zWfwI5B.mjs.map +1 -0
- package/.output/server/chunks/build/Table-BRk04Hd2.mjs +1 -1
- package/.output/server/chunks/build/{TestCaseHistoryChart-CSi64vVA.mjs → TestCaseHistoryChart-C6t5RrCG.mjs} +2 -2
- package/.output/server/chunks/build/TestCaseHistoryChart-C6t5RrCG.mjs.map +1 -0
- package/.output/server/chunks/build/{TestMetaBadges-D5_yUtIP.mjs → TestMetaBadges-BlyKmfeP.mjs} +1 -1
- package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +1 -0
- package/.output/server/chunks/build/{TestStatusBar-DX3EhlyP.mjs → TestStatusBar-DhbrM_rQ.mjs} +3 -3
- package/.output/server/chunks/build/TestStatusBar-DhbrM_rQ.mjs.map +1 -0
- package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-vkMKVQTJ.mjs} +2 -2
- package/.output/server/chunks/build/Textarea-vkMKVQTJ.mjs.map +1 -0
- package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs +1 -1
- package/.output/server/chunks/build/{_id_-BdG37K7s.mjs → _id_-2PMH6rl8.mjs} +20 -19
- package/.output/server/chunks/build/_id_-2PMH6rl8.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BdJs7BJZ.mjs → _id_-8cGIgeg6.mjs} +1903 -1113
- package/.output/server/chunks/build/_id_-8cGIgeg6.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-C_uSBiyU.mjs → _id_-CUZ5S6y5.mjs} +29 -29
- package/.output/server/chunks/build/_id_-CUZ5S6y5.mjs.map +1 -0
- package/.output/server/chunks/build/{_id_-BxA6IgWr.mjs → _id_-DMkgWSLZ.mjs} +885 -381
- package/.output/server/chunks/build/_id_-DMkgWSLZ.mjs.map +1 -0
- package/.output/server/chunks/build/{about-BE0UV-8-.mjs → about-D3WXTDro.mjs} +21 -453
- package/.output/server/chunks/build/about-D3WXTDro.mjs.map +1 -0
- package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-BslDNCoo.mjs} +6 -6
- package/.output/server/chunks/build/account-BslDNCoo.mjs.map +1 -0
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs → ai-C23R9l94.mjs} +14 -14
- package/.output/server/chunks/build/{ai-Cn05ch0u.mjs.map → ai-C23R9l94.mjs.map} +1 -1
- package/.output/server/chunks/build/{analytics-Bo_B_jko.mjs → analytics-DQHeToK0.mjs} +104 -77
- package/.output/server/chunks/build/analytics-DQHeToK0.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/compare-RxHSOdsO.mjs +1 -0
- package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-D74DghqX.mjs} +38 -2
- package/.output/server/chunks/build/db.client-D74DghqX.mjs.map +1 -0
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs → default-CeyePZ5I.mjs} +32 -19
- package/.output/server/chunks/build/{default-CbNHaFsy.mjs.map → default-CeyePZ5I.mjs.map} +1 -1
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs → docs-f_bnC75q.mjs} +14 -14
- package/.output/server/chunks/build/{docs-B_llWMxx.mjs.map → docs-f_bnC75q.mjs.map} +1 -1
- package/.output/server/chunks/build/{edit-J0asTFg8.mjs → edit-BOC4zWuH.mjs} +11 -12
- package/.output/server/chunks/build/edit-BOC4zWuH.mjs.map +1 -0
- package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-BQg_fhX0.mjs} +32 -4
- package/.output/server/chunks/build/fetch-BQg_fhX0.mjs.map +1 -0
- package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CxuVbGWy.mjs} +4 -3
- package/.output/server/chunks/build/forgot-password-CxuVbGWy.mjs.map +1 -0
- package/.output/server/chunks/build/{import-CS9oylTN.mjs → import-CC27wEIu.mjs} +12 -12
- package/.output/server/chunks/build/import-CC27wEIu.mjs.map +1 -0
- package/.output/server/chunks/build/{index-e9skCi-V.mjs → index-B6PjfyTY.mjs} +39 -537
- package/.output/server/chunks/build/index-B6PjfyTY.mjs.map +1 -0
- package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-BOK1aJk9.mjs} +2 -1
- package/.output/server/chunks/build/index-BOK1aJk9.mjs.map +1 -0
- package/.output/server/chunks/build/{index-hGHlmyxj.mjs → index-BhS1DuCr.mjs} +117 -76
- package/.output/server/chunks/build/index-BhS1DuCr.mjs.map +1 -0
- package/.output/server/chunks/build/{index-DE45ycdZ.mjs → index-DUmjP3Gr.mjs} +12 -13
- package/.output/server/chunks/build/index-DUmjP3Gr.mjs.map +1 -0
- package/.output/server/chunks/build/index-jvF53f7_.mjs +91 -0
- package/.output/server/chunks/build/index-jvF53f7_.mjs.map +1 -0
- package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
- package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-CdpOhiP8.mjs} +8 -7
- package/.output/server/chunks/build/login-CdpOhiP8.mjs.map +1 -0
- package/.output/server/chunks/build/{mcp-uhVCCwQM.mjs → mcp-WTeO5WRo.mjs} +193 -10
- package/.output/server/chunks/build/mcp-WTeO5WRo.mjs.map +1 -0
- package/.output/server/chunks/build/{notifications-fx_qnKGA.mjs → notifications-yY6ik-fi.mjs} +9 -9
- package/.output/server/chunks/build/notifications-yY6ik-fi.mjs.map +1 -0
- package/.output/server/chunks/build/{pr-feedback-X6-70iF0.mjs → pr-feedback-Hv2Ydh_6.mjs} +7 -7
- package/.output/server/chunks/build/pr-feedback-Hv2Ydh_6.mjs.map +1 -0
- package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-CFtO8A6n.mjs} +4 -3
- package/.output/server/chunks/build/reset-password-CFtO8A6n.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +51 -34
- package/.output/server/chunks/build/{settings-CCYe7rsc.mjs → settings-DIpvnY8_.mjs} +10 -8
- package/.output/server/chunks/build/settings-DIpvnY8_.mjs.map +1 -0
- package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DRv9VveS.mjs} +32 -2
- package/.output/server/chunks/build/settings-metadata-DRv9VveS.mjs.map +1 -0
- package/.output/server/chunks/build/setup-Di0UMyWx.mjs +1116 -0
- package/.output/server/chunks/build/setup-Di0UMyWx.mjs.map +1 -0
- package/.output/server/chunks/build/{storage-CJEmviCD.mjs → storage-gAbY1KbQ.mjs} +10 -10
- package/.output/server/chunks/build/storage-gAbY1KbQ.mjs.map +1 -0
- package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-DJ80wCqt.mjs} +6 -7
- package/.output/server/chunks/build/tags-DJ80wCqt.mjs.map +1 -0
- package/.output/server/chunks/build/{test-cases-thBbAykw.mjs → test-cases-YP83YlnL.mjs} +18 -18
- package/.output/server/chunks/build/test-cases-YP83YlnL.mjs.map +1 -0
- package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs +550 -0
- package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs.map +1 -0
- package/.output/server/chunks/build/{timeout-hygiene-CbnSaVbK.mjs → timeout-hygiene-RpXDjXTX.mjs} +6 -6
- package/.output/server/chunks/build/timeout-hygiene-RpXDjXTX.mjs.map +1 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs +9 -0
- package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs.map +1 -0
- package/.output/server/chunks/build/{useCopyRich-RJKhWoyj.mjs → useCopyRich-Cd5Yj_Wy.mjs} +694 -242
- package/.output/server/chunks/build/useCopyRich-Cd5Yj_Wy.mjs.map +1 -0
- package/.output/server/chunks/build/{useDesktopDownload-BepjqxOt.mjs → useDesktopDownload-BmR6ouz2.mjs} +2 -2
- package/.output/server/chunks/build/useDesktopDownload-BmR6ouz2.mjs.map +1 -0
- package/.output/server/chunks/build/{useOpenInIde-BbTnPhFA.mjs → useOpenInIde-DolN3bZ5.mjs} +1 -1
- package/.output/server/chunks/build/useOpenInIde-DolN3bZ5.mjs.map +1 -0
- package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs +19 -0
- package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs.map +1 -0
- package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-I2K7HXS2.mjs} +6 -7
- package/.output/server/chunks/build/users-I2K7HXS2.mjs.map +1 -0
- package/.output/server/chunks/build/{wasted-time-BNTPIyrC.mjs → wasted-time-DyIk0olc.mjs} +9 -9
- package/.output/server/chunks/build/wasted-time-DyIk0olc.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1348 -675
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs +2 -1
- package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/admin/stats.get.mjs +1 -0
- package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/status.get.mjs +1 -0
- package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -0
- package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -0
- package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -0
- package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/health.get.mjs +1 -0
- package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get4.mjs +2 -1
- package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
- package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
- package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -0
- package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- 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 +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +76 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +66 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +53 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +67 -0
- package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs +2 -1
- package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/projects.get.mjs +1 -0
- package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/search.get.mjs +2 -1
- package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +1 -0
- package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -0
- package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +2 -1
- package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/setup-status.get.mjs +99 -0
- package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs +1 -0
- package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +60 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +69 -0
- package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs.map +1 -0
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +2 -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 +2 -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 +2 -1
- package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
- package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs +2 -1
- package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +2 -1
- package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +2 -1
- package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
- package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/version.get.mjs +2 -1
- package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
- package/.output/server/chunks/routes/mcp.post.mjs +41 -11
- package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/chunks/tasks/sweep.mjs +1 -0
- package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
- package/.output/server/chunks/tasks/sweep2.mjs +1 -0
- package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
- package/.output/server/database/migrations/0043_watery_dragon_lord.sql +22 -0
- package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
- package/.output/server/database/migrations/meta/_journal.json +7 -0
- package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
- package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
- package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
- package/.output/server/index.mjs +2 -1
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/.output/public/_nuxt/8PUUncmO.js +0 -44
- 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/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/ChartCard-Y1UKwMsf.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/FormField-B0HKsdMd.mjs.map +0 -1
- package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +0 -1
- package/.output/server/chunks/build/LoadingState-C3pBSuOO.mjs.map +0 -1
- package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
- package/.output/server/chunks/build/ProjectTestCasesTable-Bo61P5K1.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/SettingsField-BZfx4ma1.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/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/_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/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-hGHlmyxj.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.map +0 -1
- package/.output/server/chunks/build/useAiStatus-CxjMmDDY.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.map +0 -1
package/.output/server/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import process from 'node:process';globalThis._importMeta_={url:import.meta.url,env:process.env};import 'node:http';
|
|
2
2
|
import 'node:https';
|
|
3
|
-
export {
|
|
3
|
+
export { dZ as default } from './chunks/nitro/nitro.mjs';
|
|
4
4
|
import 'node:crypto';
|
|
5
5
|
import 'drizzle-orm';
|
|
6
6
|
import 'path';
|
|
@@ -19,6 +19,7 @@ import 'highlight.js/lib/languages/typescript';
|
|
|
19
19
|
import 'highlight.js/lib/languages/xml';
|
|
20
20
|
import 'highlight.js/lib/languages/yaml';
|
|
21
21
|
import 'fflate';
|
|
22
|
+
import 'zod';
|
|
22
23
|
import 'pixelmatch';
|
|
23
24
|
import 'sharp';
|
|
24
25
|
import '@anthropic-ai/sdk';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import{_ as Re,a as we}from"./CXEH9OPk.js";import{d as X,o as n,c as d,f,g as u,i as e,j as l,p as Z,q as j,t as m,l as se,k as s,v as _,m as c,h as x,_ as ee,D as oe,F as E,y as H,r as Q,B as $e,s as Ce,A as Te,e as Fe,ac as je}from"./Du2W7Jne.js";import{_ as Se}from"./CeG9pBAD.js";import{_ as Pe}from"./DrfE8IY0.js";import{_ as ze,a as Ie}from"./5A6ITZXj.js";import{_ as Ue}from"./CAvY22RE.js";import{_ as Ve}from"./Dyeqn3aG.js";import{_ as Ae}from"./BrQEE053.js";import{_ as Ne}from"./oAClCn_h.js";import{_ as Ee}from"./bLcjFslv.js";import{_ as ie}from"./Bnxf8nbZ.js";import{_ as le}from"./BzRRzmwm.js";import{_ as De}from"./Cus22Ud3.js";import{_ as Oe}from"./C1gTN4Q8.js";import{_ as ue}from"./C0_yH0N7.js";import{f as ne,F as G,g as Be}from"./DuwtTfO8.js";import{a as Le,d as We,_ as He}from"./Bm62iDV5.js";import{_ as Me}from"./B3obW6cw.js";import{_ as de}from"./-f7BAm1H.js";import{u as Ge}from"./_mj6CfPa.js";import{u as re}from"./B8zkOmwo.js";import{u as Ke}from"./H94BMf3L.js";import{u as Ye}from"./KyA_4Ks-.js";import"./UdR3DBPS.js";import"./DmkUdSS4.js";import"./B99fbi73.js";import"./DfgOx_ou.js";import"./Nn93e_Mz.js";import"./pQqGiNch.js";import"./L3kAWB2a.js";import"./BjaRappk.js";import"./DSqHUrvO.js";const qe={class:"flex items-center gap-3 flex-wrap"},Je={class:"flex items-center gap-1.5"},Qe={key:0,class:"text-gray-500"},Xe={key:1},Ze={key:2},et={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"},tt=X({__name:"HomeFilters",props:{modelValue:{},availableEnvironments:{}},emits:["update:modelValue"],setup(D,{emit:w}){const $=D,k=w,z=x({get:()=>$.modelValue.environments,set:T=>k("update:modelValue",{...$.modelValue,environments:T})}),C=x({get:()=>$.modelValue.fullRunsOnly,set:T=>k("update:modelValue",{...$.modelValue,fullRunsOnly:T})}),N=x(()=>$.modelValue.environments.length>0||!$.modelValue.fullRunsOnly);function U(){k("update:modelValue",{environments:[],fullRunsOnly:!0})}return(T,h)=>{const O=Z,o=Se,y=Pe,t=ee;return n(),d("div",qe,[D.availableEnvironments.length>0?(n(),f(o,{key:0,modelValue:s(z),"onUpdate:modelValue":h[0]||(h[0]=p=>se(z)?z.value=p:null),items:D.availableEnvironments,multiple:"",placeholder:"All environments",size:"sm",class:"min-w-[160px]"},{default:u(({modelValue:p})=>[e("div",Je,[l(O,{name:"i-lucide-server",class:j(["size-3.5 shrink-0",p.length?"text-primary":"text-gray-400"])},null,8,["class"]),p.length?p.length===1?(n(),d("span",Xe,m(p[0]),1)):(n(),d("span",Ze,m(p.length)+" environments",1)):(n(),d("span",Qe,"All environments"))])]),_:1},8,["modelValue","items"])):_("",!0),e("label",et,[l(y,{modelValue:s(C),"onUpdate:modelValue":h[1]||(h[1]=p=>se(C)?C.value=p:null),size:"sm"},null,8,["modelValue"]),h[2]||(h[2]=c(" Full runs only ",-1))]),s(N)?(n(),f(t,{key:1,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:U},{default:u(()=>[...h[3]||(h[3]=[c(" Reset ",-1)])]),_:1})):_("",!0)])}}}),st=Object.assign(tt,{__name:"HomeFilters"}),nt={class:"hidden md:block overflow-x-auto -mx-4 px-4 sm:mx-0 sm:px-0"},rt={key:0,class:"flex flex-wrap gap-1 mt-0.5"},at={class:"w-40"},ot={key:1,class:"text-gray-400 text-sm"},it={class:"text-xs text-gray-500 dark:text-gray-400"},lt={key:1,class:"text-gray-400 text-sm"},ut={key:0,class:"tabular-nums text-sm text-gray-600 dark:text-gray-400"},dt={key:1,class:"text-gray-400"},ct={class:"space-y-2 md:hidden"},mt={class:"flex items-start justify-between gap-2"},pt={key:0,class:"flex flex-wrap gap-1"},gt={class:"flex items-center justify-between gap-2 text-xs"},ft={class:"text-gray-500 dark:text-gray-400 truncate"},yt={key:1,class:"text-gray-400"},_t={key:2,class:"shrink-0 tabular-nums text-gray-500 dark:text-gray-400"},xt=X({__name:"ProjectTrendTable",props:{projects:{},limit:{default:10}},setup(D){const w=D,$={failing:0,flaky:1,passing:2,unknown:3},k=Q(!1),z=x(()=>w.projects.length>w.limit),C=x(()=>{const o=[...w.projects].sort((y,t)=>{const p=$[y.tendency]-$[t.tendency];if(p!==0)return p;const I=y.latestFullRun?new Date(y.latestFullRun.startTime).getTime():0;return(t.latestFullRun?new Date(t.latestFullRun.startTime).getTime():0)-I});return k.value?o:o.slice(0,w.limit)});function N(o){return o>=90?"text-green-600 dark:text-green-400":o>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function U(o){switch(o){case"failing":return"text-red-700 dark:text-red-400 bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800";case"flaky":return"text-amber-700 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800";case"passing":return"text-green-700 dark:text-green-400 bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800";default:return"text-gray-500 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700"}}function T(o){return o==="unknown"?"Unknown":o.charAt(0).toUpperCase()+o.slice(1)}function h(o){switch(o){case"failing":return"i-lucide-trending-down";case"flaky":return"i-lucide-shuffle";case"passing":return"i-lucide-trending-up";default:return"i-lucide-minus"}}const O=[{accessorKey:"name",header:"Project"},{id:"recentRuns",header:"Last 20 runs"},{accessorKey:"tendency",header:"Tendency"},{id:"passRate",header:"Pass rate"},{id:"latestRun",header:"Latest run"},{id:"tests",header:"Tests"}];return(o,y)=>{const t=ee,p=oe,I=Ne,v=Ee,V=Z,F=ie,A=le,K=De,b=Oe,B=ue;return n(),f(B,{icon:"i-lucide-layout-dashboard",title:"Project health",help:"home.project-health"},{actions:u(()=>[s(z)&&!s(k)?(n(),f(t,{key:0,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-down",onClick:y[0]||(y[0]=r=>k.value=!0)},{default:u(()=>[c(" Show all "+m(w.projects.length),1)]),_:1})):s(k)?(n(),f(t,{key:1,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-up",onClick:y[1]||(y[1]=r=>k.value=!1)},{default:u(()=>[...y[2]||(y[2]=[c(" Show less ",-1)])]),_:1})):_("",!0),l(t,{to:"/projects",variant:"outline",size:"sm"},{default:u(()=>[...y[3]||(y[3]=[c("View all",-1)])]),_:1})]),default:u(()=>[e("div",nt,[l(K,{data:s(C),columns:O,ui:{base:"min-w-[700px]",td:"py-3",th:"py-3 text-xs uppercase tracking-wide"}},{"name-cell":u(({row:r})=>[l(p,{to:`/projects/${r.original.id}`,class:"font-medium text-primary hover:underline truncate block max-w-[200px]"},{default:u(()=>[c(m(r.original.label||r.original.name),1)]),_:2},1032,["to"]),r.original.tags.length>0?(n(),d("div",rt,[(n(!0),d(E,null,H(r.original.tags,S=>(n(),f(I,{key:S.id,text:S.text,color:S.color},null,8,["text","color"]))),128))])):_("",!0)]),"recentRuns-cell":u(({row:r})=>[e("div",at,[l(v,{runs:r.original.recentRuns,height:28},null,8,["runs"])])]),"tendency-cell":u(({row:r})=>[e("span",{class:j(["inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium border whitespace-nowrap",U(r.original.tendency)])},[l(V,{name:h(r.original.tendency),class:"size-3 shrink-0"},null,8,["name"]),c(" "+m(T(r.original.tendency)),1)],2)]),"passRate-cell":u(({row:r})=>[r.original.latestFullRun?(n(),d("span",{key:0,class:j(["font-semibold tabular-nums text-sm",N(("passRate"in o?o.passRate:s(G))(r.original.latestFullRun))])},m(("passRate"in o?o.passRate:s(G))(r.original.latestFullRun))+"% ",3)):(n(),d("span",ot,"—"))]),"latestRun-cell":u(({row:r})=>[r.original.latestFullRun?(n(),f(p,{key:0,to:`/test-runs/${r.original.latestFullRun.id}`,class:"flex items-center gap-2 min-w-[140px] hover:opacity-80 transition-opacity"},{default:u(()=>[l(F,{status:r.original.latestFullRun.status},null,8,["status"]),e("div",it,[e("div",null,m(("formatRelativeTime"in o?o.formatRelativeTime:s(ne))(r.original.latestFullRun.startTime)),1),r.original.latestFullRun.duration?(n(),f(A,{key:0,ms:r.original.latestFullRun.duration},null,8,["ms"])):_("",!0)])]),_:2},1032,["to"])):(n(),d("span",lt,"No full runs"))]),"tests-cell":u(({row:r})=>[r.original.latestFullRun?(n(),d("span",ut,m(r.original.latestFullRun.passedTests)+"/"+m(r.original.latestFullRun.totalTests),1)):(n(),d("span",dt,"—"))]),_:1},8,["data"])]),e("div",ct,[(n(!0),d(E,null,H(s(C),r=>(n(),d("div",{key:r.id,class:"rounded-lg border border-default p-3 space-y-2"},[e("div",mt,[l(p,{to:`/projects/${r.id}`,class:"font-medium text-primary hover:underline truncate"},{default:u(()=>[c(m(r.label||r.name),1)]),_:2},1032,["to"]),e("span",{class:j(["inline-flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs font-medium whitespace-nowrap",U(r.tendency)])},[l(V,{name:h(r.tendency),class:"size-3 shrink-0"},null,8,["name"]),c(" "+m(T(r.tendency)),1)],2)]),r.tags.length>0?(n(),d("div",pt,[(n(!0),d(E,null,H(r.tags,S=>(n(),f(I,{key:S.id,text:S.text,color:S.color},null,8,["text","color"]))),128))])):_("",!0),l(v,{runs:r.recentRuns,height:24},null,8,["runs"]),e("div",gt,[r.latestFullRun?(n(),f(p,{key:0,to:`/test-runs/${r.latestFullRun.id}`,class:"flex items-center gap-1.5 min-w-0 hover:opacity-80"},{default:u(()=>[l(F,{status:r.latestFullRun.status},null,8,["status"]),e("span",ft,m(("formatRelativeTime"in o?o.formatRelativeTime:s(ne))(r.latestFullRun.startTime)),1)]),_:2},1032,["to"])):(n(),d("span",yt,"No full runs")),r.latestFullRun?(n(),d("span",_t,[e("span",{class:j(["font-semibold",N(("passRate"in o?o.passRate:s(G))(r.latestFullRun))])},m(("passRate"in o?o.passRate:s(G))(r.latestFullRun))+"% ",3),c(" · "+m(r.latestFullRun.passedTests)+"/"+m(r.latestFullRun.totalTests),1)])):_("",!0)])]))),128))]),s(C).length===0?(n(),f(b,{key:0,text:"No projects yet",padded:!1,class:"py-8"})):_("",!0)]),_:1})}}}),ht=Object.assign(xt,{__name:"ProjectTrendTable"}),vt={class:"flex items-center gap-3"},bt={class:"p-2 bg-primary/10 rounded-lg shrink-0"},kt={class:"text-xl font-semibold inline-flex items-center gap-1"},Rt={class:"text-sm text-gray-500 dark:text-gray-400"},wt={class:"flex flex-col items-center shrink-0"},$t={key:1},Ct={key:0,class:"w-px flex-1 mt-2 min-h-6 bg-gray-200 dark:bg-gray-700"},Tt={class:"flex-1 pb-6"},Ft={class:"flex items-center gap-2 mb-1"},jt={class:"font-medium"},St={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},Pt={class:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-2"},zt={key:0,class:"mt-4 space-y-6"},It={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},Ut={class:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400"},Vt=`// tests/fixtures.ts
|
|
2
|
-
import { test as base, expect } from '@playwright/test'
|
|
3
|
-
import { piwiFixtures } from '@piwitests/reporter'
|
|
4
|
-
|
|
5
|
-
export const test = base.extend(piwiFixtures)
|
|
6
|
-
export { expect }`,At=`// your test file
|
|
7
|
-
import { test, expect } from './fixtures'
|
|
8
|
-
|
|
9
|
-
test('homepage loads', async ({ page }) => {
|
|
10
|
-
await page.goto('/')
|
|
11
|
-
// network requests, web vitals, console errors, and ARIA snapshots
|
|
12
|
-
// are captured automatically and appear in the dashboard
|
|
13
|
-
})`,Nt=`// tests/fixtures.ts
|
|
14
|
-
import { test as base } from '@playwright/test'
|
|
15
|
-
import { extendPiwiFixtures } from '@piwitests/reporter'
|
|
16
|
-
|
|
17
|
-
export const test = extendPiwiFixtures(base)
|
|
18
|
-
export { expect } from '@playwright/test'`,Et=X({__name:"GetStartedWizard",setup(D){const w=Te(),$=x(()=>!!w.public.authEnabled),k=Ge(),z=Q("http://localhost:3000");$e(()=>{z.value=window.location.origin});function C(y){const t=["projectName: 'my-project',"];return k||(t.unshift(`serverUrl: '${z.value}',`),$.value&&t.push("apiKey: process.env.PIWI_API_KEY,")),t.map(p=>`${y}${p}`).join(`
|
|
19
|
-
`)}const N=x(()=>`import { defineConfig } from '@playwright/test'
|
|
20
|
-
|
|
21
|
-
export default defineConfig({
|
|
22
|
-
reporter: [
|
|
23
|
-
['list'],
|
|
24
|
-
['@piwitests/reporter', {
|
|
25
|
-
${C(" ")}
|
|
26
|
-
}],
|
|
27
|
-
],
|
|
28
|
-
use: {
|
|
29
|
-
trace: 'retain-on-failure',
|
|
30
|
-
},
|
|
31
|
-
})`),U=x(()=>`import { defineConfig } from '@playwright/test'
|
|
32
|
-
import PiwiDashboard from '@piwitests/reporter'
|
|
33
|
-
|
|
34
|
-
export default PiwiDashboard.wrapConfig(
|
|
35
|
-
defineConfig({
|
|
36
|
-
// your existing config
|
|
37
|
-
use: {
|
|
38
|
-
trace: 'retain-on-failure',
|
|
39
|
-
},
|
|
40
|
-
}),
|
|
41
|
-
{
|
|
42
|
-
${C(" ")}
|
|
43
|
-
},
|
|
44
|
-
)`),T=x(()=>{const y=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return $.value&&y.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),y.push({title:"Configure Playwright",description:k?"Add the reporter to your playwright.config.ts. While this app is running it needs no URL or token — the reporter finds it automatically.":"Add the reporter to your playwright.config.ts.",code:N.value,lang:"typescript"},{title:"Run your tests",description:"Results appear in the dashboard automatically. The project is created on first submit.",code:"npx playwright test",lang:"bash"}),y.map((t,p)=>({id:p+1,...t}))}),h=["zero","one","two","three","four","five","six"],O=x(()=>h[T.value.length]??String(T.value.length)),o=Q(!1);return(y,t)=>{const p=Z,I=He,v=Ce,V=ee,F=Me,A=Le,K=de;return n(),f(K,null,{header:u(()=>[e("div",vt,[e("div",bt,[l(p,{name:"i-lucide-rocket",class:"size-5 text-primary"})]),e("div",null,[e("h2",kt,[t[1]||(t[1]=c(" Get started in 60 seconds ",-1)),l(I,{topic:"home.get-started"})]),e("p",Rt,"Send your first test run in "+m(s(O))+" steps",1)])])]),footer:u(()=>[e("div",Ut,[e("span",null,[t[18]||(t[18]=c("Need more options? See the ",-1)),l(A,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:u(()=>[...t[17]||(t[17]=[c("full reporter docs",-1)])]),_:1}),t[19]||(t[19]=c(".",-1))]),l(V,{to:s(We)("demo/"),target:"_blank",variant:"ghost",size:"sm",color:"neutral","trailing-icon":"i-lucide-external-link"},{default:u(()=>[...t[20]||(t[20]=[c(" View demo with sample data ",-1)])]),_:1},8,["to"])])]),default:u(()=>[e("div",null,[(n(!0),d(E,null,H(s(T),(b,B)=>(n(),d("div",{key:b.id,class:"flex gap-4"},[e("div",wt,[e("div",{class:j(["flex size-8 items-center justify-center rounded-full text-sm font-semibold",b.done?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-primary/10 text-primary"])},[b.done?(n(),f(p,{key:0,name:"i-lucide-check",class:"size-4"})):(n(),d("span",$t,m(b.id),1))],2),B<s(T).length-1?(n(),d("div",Ct)):_("",!0)]),e("div",Tt,[e("div",Ft,[e("h3",jt,m(b.title),1),b.done?(n(),f(v,{key:0,color:"success",variant:"subtle",size:"xs"},{default:u(()=>[...t[2]||(t[2]=[c("Done",-1)])]),_:1})):_("",!0)]),e("p",St,m(b.description),1),b.action==="create-api-key"?(n(),f(V,{key:0,to:"/settings/users",icon:"i-lucide-key-round",size:"sm",variant:"soft"},{default:u(()=>[...t[3]||(t[3]=[c(" Create an API key ",-1)])]),_:1})):_("",!0),b.code?(n(),f(F,{key:1,code:b.code,lang:b.lang},null,8,["code","lang"])):_("",!0)])]))),128)),e("div",Pt,[e("button",{class:"flex items-center gap-2 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-primary dark:hover:text-primary transition-colors w-full text-left",onClick:t[0]||(t[0]=b=>o.value=!s(o))},[l(p,{name:"i-lucide-chevron-right",class:j(["size-4 transition-transform duration-200",s(o)?"rotate-90":""])},null,8,["class"]),t[4]||(t[4]=c(" Go further — simpler config & capture fixtures ",-1))]),s(o)?(n(),d("div",zt,[e("div",null,[t[5]||(t[5]=e("h4",{class:"font-medium text-sm mb-1"},[c(" Simpler config with "),e("code",{class:"text-primary text-xs"},"wrapConfig")],-1)),t[6]||(t[6]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},[c(" Instead of manually adding the reporter array entry, "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"wrapConfig"),c(" auto-injects the reporter and chains the global setup in one call. It also registers the run on the dashboard "),e("em",null,"before"),c(" your "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"globalSetup"),c(" runs, so the dashboard shows an initializing state during setup. ")],-1)),l(F,{code:s(U),lang:"typescript"},null,8,["code"])]),e("div",null,[t[14]||(t[14]=e("h4",{class:"font-medium text-sm mb-1"},[c(" Capture fixtures — network, Web Vitals, console & locator healing with "),e("code",{class:"text-primary text-xs"},"piwiFixtures")],-1)),e("p",It,[t[8]||(t[8]=c(" Extend your Playwright ",-1)),t[9]||(t[9]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"test",-1)),t[10]||(t[10]=c(" with ",-1)),t[11]||(t[11]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"piwiFixtures",-1)),t[12]||(t[12]=c(" to automatically capture network timing, browser Web Vitals, console errors, ARIA snapshots on failure, and the locator snapshots that power locator healing. See the ",-1)),l(A,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:u(()=>[...t[7]||(t[7]=[c("capture fixtures guide",-1)])]),_:1}),t[13]||(t[13]=c(". ",-1))]),t[15]||(t[15]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option A — extend your existing fixtures ",-1)),l(F,{code:Vt,lang:"typescript",class:"mb-3"}),l(F,{code:At,lang:"typescript",class:"mb-4"}),t[16]||(t[16]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option B — one-line extend ",-1)),l(F,{code:Nt,lang:"typescript"})])])):_("",!0)])])]),_:1})}}}),Dt=Object.assign(Et,{__name:"GetStartedWizard"}),Ot={key:0,class:"p-6"},Bt={key:1,class:"p-6 space-y-8","aria-busy":"true"},Lt={class:"grid grid-cols-1 xl:grid-cols-3 gap-6 items-start"},Wt={class:"xl:col-span-2 space-y-3"},Ht={class:"space-y-3"},Mt={key:2,class:"p-6 space-y-8"},Gt={key:1,class:"flex flex-wrap items-center gap-x-8 gap-y-3 text-sm border border-gray-200 dark:border-gray-700 rounded-xl px-6 py-4 bg-gray-50 dark:bg-gray-900/50"},Kt={class:"flex items-center gap-1.5"},Yt={class:"font-semibold tabular-nums"},qt={class:"flex items-center gap-1.5"},Jt={class:"flex items-center gap-1.5"},Qt={key:0,class:"flex items-center gap-1.5"},Xt={class:"font-semibold tabular-nums"},Zt={class:"flex items-center gap-1.5"},es={class:"font-semibold tabular-nums"},ts={key:2,class:"grid grid-cols-1 xl:grid-cols-3 gap-6 items-start"},ss={class:"xl:col-span-2"},ns={class:"divide-y divide-gray-100 dark:divide-gray-800 text-sm"},rs={class:"flex-1 min-w-0"},as={class:"font-medium truncate"},os={class:"text-xs text-gray-400"},is={class:"text-right tabular-nums shrink-0"},ls={key:3,class:"text-center py-12 text-gray-500 dark:text-gray-400"},us={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4"},ds={class:"flex flex-col gap-3 h-full"},cs={class:"p-2 bg-primary/10 rounded-lg w-fit"},ms={class:"text-xs font-semibold uppercase tracking-wide text-primary mb-1"},ps={class:"font-semibold mb-1"},gs={class:"text-sm text-gray-600 dark:text-gray-400"},ae=6,Ks=X({__name:"index",setup(D){Fe({title:"Piwi Dashboard"});const{data:w,error:$,refresh:k,status:z}=re("/api/projects/overview",{lazy:!0,default:()=>[]},"$cnA6-rHww6"),{data:C,error:N,refresh:U}=re("/api/test-runs/recent",{lazy:!0},"$LEgADC56ri");Ke(()=>Promise.all([k(),U()]));const T=x(()=>z.value==="pending"&&!w.value?.length),h=x(()=>$.value||N.value);function O(){k(),U()}const o=Ye("piwi-home-filters",{default:()=>({environments:[],fullRunsOnly:!0}),encode:i=>JSON.stringify(i),decode:i=>{try{return i?JSON.parse(i):{environments:[],fullRunsOnly:!0}}catch{return{environments:[],fullRunsOnly:!0}}}}),y=x(()=>{const i=new Set;for(const a of C.value??[])a.environment&&i.add(a.environment);for(const a of w.value??[])for(const R of a.recentRuns)R.environment&&i.add(R.environment);return[...i].sort()});function t(i){return o.value.environments.length===0?!0:!!i&&o.value.environments.includes(i)}const p=x(()=>{let i=C.value??[];return o.value.fullRunsOnly&&(i=i.filter(a=>a.isFullRun)),o.value.environments.length>0&&(i=i.filter(a=>t(a.environment))),i}),I=x(()=>{let i=w.value??[];return o.value.environments.length>0&&(i=i.map(a=>({...a,recentRuns:a.recentRuns.filter(R=>t(R.environment))})).filter(a=>a.recentRuns.length>0)),i}),v=x(()=>{const i=I.value,a=i.length,R=i.filter(P=>P.tendency==="failing").length,M=i.filter(P=>P.tendency==="flaky").length;let L=0,Y=0;for(const P of i)P.latestFullRun&&(L+=P.latestFullRun.passedTests,Y+=P.latestFullRun.totalTests);const q=Y>0?Math.round(L/Y*100):null,te=Date.now()-1440*60*1e3,W=p.value.filter(P=>new Date(P.startTime).getTime()>te).length;return{totalProjects:a,failingNow:R,flakyNow:M,avgPassRate:q,runs24h:W}}),V=new Set(["running","initialising","finalizing"]),F=Q(!1),A=x(()=>[...p.value].sort((a,R)=>{const M=V.has(a.status)?0:1,L=V.has(R.status)?0:1;return M!==L?M-L:new Date(R.startTime).getTime()-new Date(a.startTime).getTime()})),K=x(()=>F.value?A.value:A.value.slice(0,ae)),b=x(()=>A.value.length>ae),B=x(()=>p.value.length>0),r=x(()=>(w.value?.length??0)>0),S=x(()=>o.value.fullRunsOnly?(C.value??[]).filter(R=>t(R.environment)).filter(R=>!R.isFullRun).length:0);function ce(){o.value={...o.value,fullRunsOnly:!1}}function me(i){const a=G(i);return a>=90?"text-green-600 dark:text-green-400":a>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function pe(i){return V.has(i)?"border-l-blue-400":i==="passed"?"border-l-green-500":i==="failed"||i==="timedout"||i==="interrupted"?"border-l-red-500":"border-l-gray-300 dark:border-l-gray-600"}const ge=[{icon:"i-lucide-radio",tagline:"Watch your CI run live",title:"Live streaming",description:"Follow test execution in real time. Investigate failures while the suite is still running — no waiting for the CI job to finish."},{icon:"i-lucide-layers",tagline:"10 failures, 2 root causes",title:"Failure clustering",description:"Tests sharing the same error are grouped automatically. Triage one cluster instead of scrolling through unrelated failures."},{icon:"i-lucide-brain-circuit",tagline:"Diagnosis grounded in your code",title:"AI diagnosis",description:"AI analyzes failure clusters using your actual SCM diff, trace files, and run history — not a generic prompt."},{icon:"i-lucide-archive",tagline:"Every run, forever",title:"Permanent test intelligence",description:"Test results, traces, and HTML reports stored permanently. Compare runs, track flakiness trends, and never lose a CI result again."}];return(i,a)=>{const R=Re,M=we,L=st,Y=Ie,q=ee,te=Ue,W=Ve,P=Ae,J=Z,fe=ht,ye=ie,_e=le,xe=oe,he=ue,ve=Dt,be=de,ke=ze;return n(),f(ke,{id:"home"},{header:u(()=>[l(Y,null,je({leading:u(()=>[l(R),l(M,{items:[{label:"Home",icon:"i-lucide-house",to:"/"}]})]),_:2},[s(r)?{name:"trailing",fn:u(()=>[l(L,{modelValue:s(o),"onUpdate:modelValue":a[0]||(a[0]=g=>se(o)?o.value=g:null),"available-environments":s(y)},null,8,["modelValue","available-environments"])]),key:"0"}:void 0]),1024)]),body:u(()=>[s(h)?(n(),d("div",Ot,[l(te,{text:`Couldn't load the dashboard: ${s(Be)(s(h))}`},{action:u(()=>[l(q,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:O},{default:u(()=>[...a[3]||(a[3]=[c(" Retry ",-1)])]),_:1})]),_:1},8,["text"])])):s(T)?(n(),d("div",Bt,[a[4]||(a[4]=e("span",{class:"sr-only",role:"status"},"Loading dashboard…",-1)),l(W,{class:"h-14 w-full rounded-xl"}),e("div",Lt,[e("div",Wt,[l(W,{class:"h-7 w-40"}),l(W,{class:"h-72 w-full rounded-lg"})]),e("div",Ht,[l(W,{class:"h-7 w-32"}),(n(),d(E,null,H(5,g=>l(W,{key:g,class:"h-12 w-full rounded-lg"})),64))])])])):(n(),d("div",Mt,[s(S)>0?(n(),f(P,{key:0,icon:"i-lucide-info",color:"primary",variant:"subtle",title:s(S)===1?"1 partial run is hidden":`${s(S)} partial runs are hidden`,description:"The “Full runs only” filter hides runs that only cover part of the suite (e.g. a single spec or --grep).",actions:[{label:"Show them",color:"primary",variant:"solid",size:"xs",onClick:ce}]},null,8,["title","actions"])):_("",!0),s(r)?(n(),d("div",Gt,[e("div",Kt,[l(J,{name:"i-lucide-folder",class:"size-4 text-primary shrink-0"}),e("span",Yt,m(s(v).totalProjects),1),a[5]||(a[5]=e("span",{class:"text-gray-500"},"projects",-1))]),e("div",qt,[e("div",{class:j(["w-2 h-2 rounded-full shrink-0",s(v).failingNow>0?"bg-red-500":"bg-green-500"])},null,2),e("span",{class:j(["font-semibold tabular-nums",s(v).failingNow>0?"text-red-600 dark:text-red-400":""])},m(s(v).failingNow),3),a[6]||(a[6]=e("span",{class:"text-gray-500"},"failing now",-1))]),e("div",Jt,[e("div",{class:j(["w-2 h-2 rounded-full shrink-0",s(v).flakyNow>0?"bg-amber-400":"bg-gray-300 dark:bg-gray-600"])},null,2),e("span",{class:j(["font-semibold tabular-nums",s(v).flakyNow>0?"text-amber-600 dark:text-amber-400":""])},m(s(v).flakyNow),3),a[7]||(a[7]=e("span",{class:"text-gray-500"},"flaky",-1))]),s(v).avgPassRate!==null?(n(),d("div",Qt,[l(J,{name:"i-lucide-check-circle",class:"size-4 text-green-500 shrink-0"}),e("span",Xt,m(s(v).avgPassRate)+"%",1),a[8]||(a[8]=e("span",{class:"text-gray-500"},"avg pass rate",-1))])):_("",!0),e("div",Zt,[l(J,{name:"i-lucide-play-circle",class:"size-4 text-primary shrink-0"}),e("span",es,m(s(v).runs24h),1),a[9]||(a[9]=e("span",{class:"text-gray-500"},"runs today",-1))])])):_("",!0),s(r)||s(B)?(n(),d("div",ts,[e("div",ss,[s(r)?(n(),f(fe,{key:0,projects:s(I)},null,8,["projects"])):_("",!0)]),s(B)?(n(),f(he,{key:0,icon:"i-lucide-activity",title:"Recent activity"},{actions:u(()=>[s(b)&&!s(F)?(n(),f(q,{key:0,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-down",onClick:a[1]||(a[1]=g=>F.value=!0)},{default:u(()=>[c(" Show all "+m(s(A).length),1)]),_:1})):s(F)?(n(),f(q,{key:1,variant:"ghost",size:"sm","trailing-icon":"i-lucide-chevron-up",onClick:a[2]||(a[2]=g=>F.value=!1)},{default:u(()=>[...a[10]||(a[10]=[c(" Show less ",-1)])]),_:1})):_("",!0)]),default:u(()=>[e("div",ns,[(n(!0),d(E,null,H(s(K),g=>(n(),f(xe,{key:g.id,to:`/test-runs/${g.id}`,class:j(["flex items-center gap-3 py-3 pl-3 border-l-2 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors",pe(g.status)])},{default:u(()=>[l(ye,{status:g.status},null,8,["status"]),e("div",rs,[e("div",as,m(g.projectLabel||g.projectName),1),e("div",os,"Run #"+m(g.id)+" · "+m(("formatRelativeTime"in i?i.formatRelativeTime:s(ne))(g.startTime)),1)]),e("div",is,[e("div",{class:j(me(g))},m(("passRate"in i?i.passRate:s(G))(g))+"%",3),g.duration?(n(),f(_e,{key:0,ms:g.duration,class:"block text-xs text-gray-400"},null,8,["ms"])):_("",!0)])]),_:2},1032,["to","class"]))),128))])]),_:1})):_("",!0)])):_("",!0),s(r)&&!s(B)&&s(I).length===0?(n(),d("div",ls,[l(J,{name:"i-lucide-filter-x",class:"size-8 mx-auto mb-2 opacity-40"}),a[11]||(a[11]=e("p",null,"No runs match the current filters.",-1))])):_("",!0),s(r)?_("",!0):(n(),d(E,{key:4},[l(ve),e("div",us,[(n(),d(E,null,H(ge,g=>l(be,{key:g.title,class:"flex flex-col"},{default:u(()=>[e("div",ds,[e("div",cs,[l(J,{name:g.icon,class:"size-5 text-primary"},null,8,["name"])]),e("div",null,[e("p",ms,m(g.tagline),1),e("h3",ps,m(g.title),1),e("p",gs,m(g.description),1)])])]),_:2},1024)),64))])],64))]))]),_:1})}}});export{Ks as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{cf as L,L as m,cg as z,ch as E,h as d,ab as o,ci as i,cj as q}from"./Du2W7Jne.js";function A(t){const s=[o(t.method)?.toUpperCase()||"GET",o(t.baseURL)];for(const e of[t.query||t.params]){const a=o(e);if(!a)continue;const n={};for(const[f,c]of Object.entries(a))n[o(f)]=o(c);s.push(n)}if(t.body){const e=o(t.body);if(!e)s.push(i(e));else if(e instanceof ArrayBuffer)s.push(i(Object.fromEntries([...new Uint8Array(e).entries()].map(([a,n])=>[a,n.toString()]))));else if(e instanceof FormData){const a=[];for(const n of e.entries()){const[f,c]=n;a.push([f,c instanceof File?`${c.name}:${c.size}:${c.lastModified}`:c])}s.push(i(a))}else if(q(e))s.push(i(m(e)));else try{s.push(i(e))}catch{console.warn("[useFetch] Failed to hash body",e)}}return s}const _=L({name:"createUseFetch",factory(t={}){function s(e,a,n){const[f={},c]=typeof a=="string"?[{},a]:[a,n],y=typeof t=="function"?t(f):t,{server:b,lazy:F,default:v,transform:g,pick:w,watch:h,immediate:O,getCachedData:$,deep:D,dedupe:U,timeout:j,...r}={...typeof t=="function"?{}:y,...f,...typeof t=="function"?y:{}},u=d(()=>o(e)),k=d(()=>o(r.key)||"$f"+i([c,typeof u.value=="string"?u.value:"",...A(r)]));if(!r.baseURL&&typeof u.value=="string"&&u.value[0]==="/"&&u.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const l=m({...z,...r,cache:typeof r.cache=="boolean"?void 0:r.cache}),p={server:b,lazy:F,default:v,transform:g,pick:w,immediate:O,getCachedData:$,deep:D,dedupe:U,timeout:j,watch:h===!1?[]:[...h||[],l]};return h===!1&&(p._keyTriggersExecute=!1),E(k,(S,{signal:x})=>(r.$fetch||globalThis.$fetch)(u.value,{signal:x,...l}),p)}return s}}),K=_.__nuxt_factory();_.__nuxt_factory({lazy:!0,_functionName:"useLazyFetch"});export{K as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as p,a$ as f,f as r,g as n,A as g,o as s,k as o,c as m,i as t,m as a,_,v as h}from"./Du2W7Jne.js";import{_ as x}from"./C0_yH0N7.js";import"./Bm62iDV5.js";import"./BjaRappk.js";import"./DSqHUrvO.js";import"./-f7BAm1H.js";const b={key:0,class:"flex max-sm:flex-col justify-between items-start gap-4"},v={key:1,class:"text-sm text-muted"},N=p({__name:"index",setup(k){const i=g().public.demoMode,{isResetting:d,resetDemo:c}=f();return(C,e)=>{const l=_,u=x;return s(),r(u,{icon:"i-lucide-settings",title:"General settings",help:"settings.general"},{actions:n(()=>[o(i)?(s(),r(l,{key:0,color:"error",variant:"soft",icon:"i-lucide-refresh-cw",loading:o(d),onClick:o(c)},{default:n(()=>[...e[0]||(e[0]=[a(" Reset demo ",-1)])]),_:1},8,["loading","onClick"])):h("",!0)]),default:n(()=>[o(i)?(s(),m("div",b,[...e[1]||(e[1]=[t("div",null,[t("p",{class:"font-medium text-sm"},"Reset demo data"),t("p",{class:"text-sm text-muted"}," Wipe the in-browser database and reload with fresh sample data dated to the current moment. All changes made during this demo session will be lost. ")],-1)])])):(s(),m("div",v,[...e[2]||(e[2]=[t("p",null," Appearance and theme are in the top bar. Use the sidebar to manage your account, users, AI diagnosis, notifications, storage, and tags. ",-1),t("p",{class:"mt-2"},[a(" Settings that can be overridden by "),t("code",{class:"font-mono text-xs"},"PIWI_*"),a(" environment variables show a lock badge with the variable name — hover the help icon on any card to see which env var backs a setting. ")],-1)])]))]),_:1})}}});export{N as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as M}from"./BdfhYr-u.js";import{d as P,b as z,w as I,c as u,i as t,k as s,f as O,v as w,j as a,g as r,F as x,R as j,o as c,p as A,m as p,y as N,t as i,_ as W,l as q,r as y}from"./Du2W7Jne.js";import{_ as G}from"./BmUfSNMV.js";import{_ as H}from"./C0_yH0N7.js";import{_ as J}from"./A1pj0VnG.js";import{_ as K}from"./AbmKWFQQ.js";import{_ as Q}from"./BUkim3TM.js";import{f as B}from"./D-c8ZSws.js";import{e as X,g as Y}from"./Bm62iDV5.js";import{u as Z}from"./B8zkOmwo.js";import"./DSqHUrvO.js";import"./BT3wGCTI.js";import"./-f7BAm1H.js";import"./UdR3DBPS.js";import"./L3kAWB2a.js";import"./BjaRappk.js";const ee={class:"space-y-6"},te={class:"space-y-3"},se={class:"flex items-center gap-2 text-sm text-muted"},oe={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm"},ae={class:"text-muted"},ne={class:"flex items-center gap-2 font-mono"},le={class:"text-xs"},ie={key:0,class:"flex items-center gap-2 py-4 text-muted"},re={key:1,class:"grid grid-cols-2 sm:grid-cols-3 gap-4"},de={class:"space-y-1"},ce={class:"text-2xl font-semibold"},me={class:"space-y-1"},ue={class:"text-2xl font-semibold"},pe={class:"space-y-1"},_e={class:"text-2xl font-semibold"},fe={class:"space-y-1"},ge={class:"text-2xl font-semibold"},ve={class:"space-y-1"},xe={class:"text-2xl font-semibold"},ye={class:"space-y-1"},be={class:"text-2xl font-semibold"},he={class:"space-y-1"},Ce={class:"text-2xl font-semibold"},ke={class:"flex flex-col sm:flex-row items-start sm:items-center gap-4"},je=P({__name:"storage",async setup(Se){let _,b;const h=z(),{data:n,refresh:C,pending:k}=([_,b]=I(()=>Z("/api/admin/stats","$-MAlPFSlMr")),_=await _,b(),_),T=X("storage").map(o=>({name:o,...Y(o)})),$=[{label:"7 days",value:7},{label:"14 days",value:14},{label:"30 days",value:30},{label:"60 days",value:60},{label:"90 days",value:90},{label:"180 days",value:180},{label:"1 year",value:365}],d=y(30),m=y(!1),f=y(!1);async function V(){m.value=!1,f.value=!0;try{const o=await $fetch("/api/admin/cleanup",{method:"DELETE",body:{olderThanDays:d.value}});h.add({title:"Cleanup complete",description:`Deleted ${o.deletedRuns} test run(s) older than ${d.value} days.`,color:"success"}),await C()}catch(o){const e=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;h.add({title:"Cleanup failed",description:e||"An error occurred",color:"error"})}finally{f.value=!1}}return(o,e)=>{const D=M,S=A,E=G,v=H,g=W,F=J,R=K,U=Q,L=j;return c(),u(x,null,[t("div",ee,[s(n)?(c(),O(D,{key:0,database:s(n).databaseLocation,storage:s(n).storageLocation},null,8,["database","storage"])):w("",!0),a(v,{icon:"i-lucide-server",title:"Storage backend",help:"settings.storage-backend"},{subtitle:r(()=>[...e[5]||(e[5]=[p(" Configured through environment variables. The active backend is shown read-only. ",-1)])]),default:r(()=>[t("div",te,[t("div",se,[a(S,{name:"i-lucide-info",class:"size-4"}),e[6]||(e[6]=p(" Storage backend selection (local disk or S3) and its credentials are set via the environment. Each variable below is shown read-only — hover the lock to see what it controls. ",-1))]),t("div",oe,[(c(!0),u(x,null,N(s(T),l=>(c(),u(x,{key:l.name},[t("div",ae,i(l.name.replace("PIWI_S3_","S3 ").replace("PIWI_STORAGE_","Storage ")),1),t("div",ne,[t("code",le,i(l.name),1),a(E,{"env-vars":[l.name]},null,8,["env-vars"])])],64))),128))])])]),_:1}),a(v,{icon:"i-lucide-database",title:"Storage statistics",help:"settings.storage-stats"},{footer:r(()=>[a(g,{icon:"i-lucide-refresh-cw",variant:"outline",size:"sm",loading:s(k),label:"Refresh",onClick:e[0]||(e[0]=l=>s(C)())},null,8,["loading"])]),default:r(()=>[s(k)?(c(),u("div",ie,[a(S,{name:"i-lucide-loader-2",class:"animate-spin"}),e[7]||(e[7]=p(" Loading… ",-1))])):s(n)?(c(),u("div",re,[t("div",de,[e[8]||(e[8]=t("p",{class:"text-sm text-muted"},"Projects",-1)),t("p",ce,i(s(n).totalProjects),1)]),t("div",me,[e[9]||(e[9]=t("p",{class:"text-sm text-muted"},"Test runs",-1)),t("p",ue,i(s(n).totalRuns),1)]),t("div",pe,[e[10]||(e[10]=t("p",{class:"text-sm text-muted"},"Test cases (unique)",-1)),t("p",_e,i(s(n).totalTestCases),1)]),t("div",fe,[e[11]||(e[11]=t("p",{class:"text-sm text-muted"},"Test results",-1)),t("p",ge,i(s(n).totalRunsCases),1)]),t("div",ve,[e[12]||(e[12]=t("p",{class:"text-sm text-muted"},"Stored files",-1)),t("p",xe,i(s(n).totalFiles),1)]),t("div",ye,[e[13]||(e[13]=t("p",{class:"text-sm text-muted"},"File size (DB)",-1)),t("p",be,i(("formatBytes"in o?o.formatBytes:s(B))(s(n).totalFileSize)),1)]),t("div",he,[e[14]||(e[14]=t("p",{class:"text-sm text-muted"},"Storage on disk",-1)),t("p",Ce,i(("formatBytes"in o?o.formatBytes:s(B))(s(n).storageSizeOnDisk)),1)])])):w("",!0)]),_:1}),a(v,{icon:"i-lucide-trash-2",title:"Cleanup old test runs",help:"settings.cleanup"},{default:r(()=>[t("div",ke,[a(R,{label:"Delete runs older than",name:"period"},{default:r(()=>[a(F,{modelValue:s(d),"onUpdate:modelValue":e[1]||(e[1]=l=>q(d)?d.value=l:null),items:$},null,8,["modelValue"])]),_:1}),a(g,{icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:s(f),label:"Run cleanup",class:"mt-4 sm:mt-5",onClick:e[2]||(e[2]=l=>m.value=!0)},null,8,["loading"])])]),_:1})]),a(L,null,{default:r(()=>[a(U,{open:s(m),title:"Confirm cleanup","onUpdate:open":e[4]||(e[4]=l=>m.value=l)},{body:r(()=>[t("p",null,[e[15]||(e[15]=p(" This will permanently delete all test runs older than ",-1)),t("strong",null,i(s(d))+" days",1),e[16]||(e[16]=p(", along with their associated reports, traces, and test results. This action cannot be undone. ",-1))])]),footer:r(()=>[a(g,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[3]||(e[3]=l=>m.value=!1)}),a(g,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:s(f),onClick:V},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{je as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as f}from"./CXEH9OPk.js";import{_ as b}from"./DabzhQB1.js";import{_ as h}from"./CjPfj7ya.js";import{_ as j,a as x}from"./5A6ITZXj.js";import{_ as y}from"./CTU1mrhq.js";import{d as C,u as $,w as v,e as w,f as P,g as a,h as g,o as k,i as B,j as e,k as o,r as N}from"./Du2W7Jne.js";import{u as R}from"./B8zkOmwo.js";import"./KyA_4Ks-.js";import"./A1pj0VnG.js";import"./UdR3DBPS.js";import"./4gYNA-d4.js";import"./CzAPFPpL.js";import"./CAvY22RE.js";import"./C1gTN4Q8.js";import"./BrQEE053.js";import"./DqcKngf3.js";import"./BT3wGCTI.js";import"./BzRRzmwm.js";import"./DuwtTfO8.js";import"./CA9B2HE5.js";import"./DJmoLeVt.js";import"./Dy-TJ0Mt.js";import"./BicAJ6U8.js";import"./DSqHUrvO.js";import"./Cus22Ud3.js";import"./B99fbi73.js";import"./C0_yH0N7.js";import"./Bm62iDV5.js";import"./BjaRappk.js";import"./-f7BAm1H.js";import"./DeY2JkR2.js";const D={class:"p-4"},lo=C({__name:"test-cases",async setup(T){let r,n;const i=$(),s=String(i.params.id),{data:t}=([r,n]=v(()=>R(`/api/projects/${s}`,"$yKRg49mBCi")),r=await r,n(),r),c=N(null);return w(g(()=>({title:`${t.value?.label||t.value?.name||"Project"} — Test cases — Piwi Dashboard`}))),(U,A)=>{const m=f,p=b,_=h,l=x,u=y,d=j;return k(),P(d,{id:"project-test-cases"},{header:a(()=>[e(l,null,{leading:a(()=>[e(m),e(p,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(t)?.label||o(t)?.name||"Project",to:`/projects/${o(s)}`},{label:"Test cases"}]},null,8,["items"])]),right:a(()=>[e(_,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>o(c)?.refresh()}]},null,8,["actions"])]),_:1})]),body:a(()=>[B("div",D,[e(u,{ref_key:"tableRef",ref:c,"project-id":o(s),"project-name":o(t)?.name,"sync-query":""},null,8,["project-id","project-name"])])]),_:1})}}});export{lo as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as O,Z as J,Y as ee,V as f,k as e,r as R,$ as te,U as B,o as r,f as i,g as u,W as D,X as I,aB as V,B as Q,bz as U,j as h,bB as oe,bU as ae,bN as se,bV as N,bL as le,H as x,h as F,O as L,ae as j,aD as W,bK as re,C as ne,v as g,a0 as X,a1 as Y,bQ as ue,a2 as ie,a3 as de,a4 as pe,a5 as fe,a6 as ce,a7 as ve,bi as ye,b5 as z,b4 as me,bk as _e,bl as ge,m as A,t as M,c as E,q as k,_ as be,bj as De,F as Oe,a8 as Ce,bm as qe}from"./Du2W7Jne.js";const[w,Be]=te("DialogRoot");var we=O({inheritAttrs:!1,__name:"DialogRoot",props:{open:{type:Boolean,required:!1,default:void 0},defaultOpen:{type:Boolean,required:!1,default:!1},modal:{type:Boolean,required:!1,default:!0},unmountOnHide:{type:Boolean,required:!1,default:!0}},emits:["update:open"],setup(d,{emit:n}){const a=d,o=J(a,"open",n,{defaultValue:a.defaultOpen,passive:a.open===void 0}),t=R(),y=R(),{modal:p,unmountOnHide:c}=ee(a);return Be({open:o,modal:p,unmountOnHide:c,openModal:()=>{o.value=!0},onOpenChange:l=>{o.value=l},onOpenToggle:()=>{o.value=!o.value},contentId:"",titleId:"",descriptionId:"",triggerElement:t,contentElement:y}),(l,m)=>f(l.$slots,"default",{open:e(o),close:()=>o.value=!1})}}),ke=we,he=O({__name:"DialogClose",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(d){const n=d;B();const a=w();return(s,o)=>(r(),i(e(I),D(n,{type:s.as==="button"?"button":void 0,onClick:o[0]||(o[0]=t=>e(a).onOpenChange(!1))}),{default:u(()=>[f(s.$slots,"default")]),_:3},16,["type"]))}}),$e=he,Pe=O({__name:"DialogContentImpl",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(d,{emit:n}){const a=d,s=n,o=w(),{forwardRef:t,currentElement:y}=B();return o.titleId||=V(void 0,"reka-dialog-title"),o.descriptionId||=V(void 0,"reka-dialog-description"),Q(()=>{o.contentElement=y,U()!==document.body&&(o.triggerElement.value=U())}),(p,c)=>(r(),i(e(se),{"as-child":"",loop:"",trapped:a.trapFocus,present:a.present,onMountAutoFocus:c[5]||(c[5]=l=>s("openAutoFocus",l)),onUnmountAutoFocus:c[6]||(c[6]=l=>s("closeAutoFocus",l))},{default:u(()=>[h(e(oe),D({id:e(o).contentId,ref:e(t),as:p.as,"as-child":p.asChild,present:a.present,"disable-outside-pointer-events":p.disableOutsidePointerEvents,role:"dialog","aria-describedby":e(o).descriptionId,"aria-labelledby":e(o).titleId,"data-state":e(ae)(e(o).open.value)},p.$attrs,{onDismiss:c[0]||(c[0]=l=>e(o).onOpenChange(!1)),onEscapeKeyDown:c[1]||(c[1]=l=>s("escapeKeyDown",l)),onFocusOutside:c[2]||(c[2]=l=>s("focusOutside",l)),onInteractOutside:c[3]||(c[3]=l=>s("interactOutside",l)),onPointerDownOutside:c[4]||(c[4]=l=>s("pointerDownOutside",l))}),{default:u(()=>[f(p.$slots,"default")]),_:3},16,["id","as","as-child","present","disable-outside-pointer-events","aria-describedby","aria-labelledby","data-state"])]),_:3},8,["trapped","present"]))}}),Z=Pe,Ee=O({__name:"DialogContentModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(d,{emit:n}){const a=d,s=n,o=w(),t=N(s),{forwardRef:y,currentElement:p}=B(),c=F(()=>a.present?p.value:void 0);le(c);const l=F(()=>{const{present:m,...v}=a;return v});return x(()=>a.present,(m,v)=>{!m&&v&&o.triggerElement.value?.focus()}),(m,v)=>(r(),i(Z,D({...l.value,...e(t)},{ref:e(y),present:m.present,"trap-focus":e(o).open.value,"disable-outside-pointer-events":a.disableOutsidePointerEvents,onCloseAutoFocus:v[0]||(v[0]=C=>{C.defaultPrevented||(C.preventDefault(),e(o).triggerElement.value?.focus())}),onPointerDownOutside:v[1]||(v[1]=C=>{const $=C.detail.originalEvent,b=$.button===0&&$.ctrlKey===!0;($.button===2||b)&&C.preventDefault()}),onFocusOutside:v[2]||(v[2]=C=>{C.preventDefault()})}),{default:u(()=>[f(m.$slots,"default")]),_:3},16,["present","trap-focus","disable-outside-pointer-events"]))}}),Fe=Ee,Ie=O({__name:"DialogContentNonModal",props:{forceMount:{type:Boolean,required:!1},trapFocus:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!0}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(d,{emit:n}){const a=d,o=N(n);B();const t=w(),y=R(!1),p=R(!1),c=F(()=>{const{present:l,...m}=a;return m});return x(()=>a.present,(l,m)=>{!l&&m&&(y.value||t.triggerElement.value?.focus(),y.value=!1,p.value=!1)}),(l,m)=>(r(),i(Z,D({...c.value,...e(o)},{present:l.present,"trap-focus":!1,"disable-outside-pointer-events":!1,onCloseAutoFocus:m[0]||(m[0]=v=>{v.defaultPrevented||(y.value||e(t).triggerElement.value?.focus(),v.preventDefault()),y.value=!1,p.value=!1}),onInteractOutside:m[1]||(m[1]=v=>{v.defaultPrevented||(y.value=!0,v.detail.originalEvent.type==="pointerdown"&&(p.value=!0));const C=v.target;e(t).triggerElement.value?.contains(C)&&v.preventDefault(),v.detail.originalEvent.type==="focusin"&&p.value&&v.preventDefault()})}),{default:u(()=>[f(l.$slots,"default")]),_:3},16,["present"]))}}),Ae=Ie,Me=O({__name:"DialogContent",props:{forceMount:{type:Boolean,required:!1},disableOutsidePointerEvents:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:["escapeKeyDown","pointerDownOutside","focusOutside","interactOutside","openAutoFocus","closeAutoFocus"],setup(d,{emit:n}){const a=d,s=n,o=w(),t=N(s),{forwardRef:y}=B();return(p,c)=>(r(),i(e(W),{present:p.forceMount||e(o).open.value,"force-mount":p.forceMount||!e(o).unmountOnHide.value},{default:u(({present:l})=>[e(o).modal.value?L((r(),i(Fe,D({key:0,ref:e(y),present:e(o).unmountOnHide.value||l},{...a,...e(t),...p.$attrs}),{default:u(()=>[f(p.$slots,"default")]),_:2},1040,["present"])),[[j,e(o).unmountOnHide.value||l]]):L((r(),i(Ae,D({key:1,ref:e(y),present:e(o).unmountOnHide.value||l},{...a,...e(t),...p.$attrs}),{default:u(()=>[f(p.$slots,"default")]),_:2},1040,["present"])),[[j,e(o).unmountOnHide.value||l]])]),_:3},8,["present","force-mount"]))}}),Re=Me,He=O({__name:"DialogDescription",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"p"}},setup(d){const n=d;B();const a=w();return(s,o)=>(r(),i(e(I),D(n,{id:e(a).descriptionId}),{default:u(()=>[f(s.$slots,"default")]),_:3},16,["id"]))}}),S=He,Te=O({__name:"DialogOverlayImpl",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1},present:{type:Boolean,required:!1,default:!0}},setup(d){const n=d,a=w(),s=re(n.present);return x(()=>n.present,o=>s.value=o),B(),(o,t)=>(r(),i(e(I),{as:o.as,"as-child":o.asChild,"data-state":e(a).open.value?"open":"closed",style:{"pointer-events":"auto"},onPointerdown:t[0]||(t[0]=ne(()=>{},["left","self","prevent"]))},{default:u(()=>[f(o.$slots,"default")]),_:3},8,["as","as-child","data-state"]))}}),Se=Te,Ke=O({__name:"DialogOverlay",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(d){const n=w(),{forwardRef:a}=B();return(s,o)=>e(n)?.modal.value?(r(),i(e(W),{key:0,present:s.forceMount||e(n).open.value,"force-mount":s.forceMount||!e(n).unmountOnHide.value},{default:u(({present:t})=>[L(h(Se,D(s.$attrs,{ref:e(a),as:s.as,"as-child":s.asChild,present:e(n).unmountOnHide.value||t}),{default:u(()=>[f(s.$slots,"default")]),_:2},1040,["as","as-child","present"]),[[j,e(n).unmountOnHide.value||t]])]),_:3},8,["present","force-mount"])):g("v-if",!0)}}),G=Ke,Ve=O({__name:"DialogPortal",props:{to:{type:null,required:!1},disabled:{type:Boolean,required:!1},defer:{type:Boolean,required:!1},forceMount:{type:Boolean,required:!1}},setup(d){const n=d;return(a,s)=>(r(),i(e(ue),X(Y(n)),{default:u(()=>[f(a.$slots,"default")]),_:3},16))}}),Le=Ve,je=O({__name:"DialogTitle",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"h2"}},setup(d){const n=d,a=w();return B(),(s,o)=>(r(),i(e(I),D(n,{id:e(a).titleId}),{default:u(()=>[f(s.$slots,"default")]),_:3},16,["id"]))}}),K=je,Ne=O({__name:"DialogTrigger",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"}},setup(d){const n=d,a=w(),{forwardRef:s,currentElement:o}=B();return a.contentId||=V(void 0,"reka-dialog-content"),Q(()=>{a.triggerElement.value=o.value}),(t,y)=>(r(),i(e(I),D(n,{ref:e(s),type:t.as==="button"?"button":void 0,"aria-haspopup":"dialog","aria-expanded":e(a).open.value||!1,"aria-controls":e(a).open.value?e(a).contentId:void 0,"data-state":e(a).open.value?"open":"closed",onClick:e(a).onOpenToggle}),{default:u(()=>[f(t.$slots,"default")]),_:3},16,["type","aria-expanded","aria-controls","data-state","onClick"]))}}),xe=Ne;const Ue={slots:{overlay:"fixed inset-0",content:"bg-default divide-y divide-default flex flex-col focus:outline-none",header:"flex items-center gap-1.5 p-4 sm:px-6 min-h-(--ui-header-height)",wrapper:"",body:"flex-1 p-4 sm:p-6",footer:"flex items-center gap-1.5 p-4 sm:px-6",title:"text-highlighted font-semibold",description:"mt-1 text-muted text-sm",close:"absolute top-4 end-4"},variants:{transition:{true:{overlay:"data-[state=open]:animate-[fade-in_200ms_ease-out] data-[state=closed]:animate-[fade-out_200ms_ease-in]",content:"data-[state=open]:animate-[scale-in_200ms_ease-out] data-[state=closed]:animate-[scale-out_200ms_ease-in]"}},fullscreen:{true:{content:"inset-0"},false:{content:"w-[calc(100vw-2rem)] max-w-lg rounded-lg shadow-lg ring ring-default"}},overlay:{true:{overlay:"bg-elevated/75"}},scrollable:{true:{overlay:"overflow-y-auto",content:"relative"},false:{content:"fixed",body:"overflow-y-auto"}}},compoundVariants:[{scrollable:!0,fullscreen:!1,class:{overlay:"grid place-items-center p-4 sm:py-8"}},{scrollable:!1,fullscreen:!1,class:{content:"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 max-h-[calc(100dvh-2rem)] sm:max-h-[calc(100dvh-4rem)] overflow-hidden"}}]},Ge={__name:"UModal",props:{title:{type:String,required:!1},description:{type:String,required:!1},content:{type:Object,required:!1},overlay:{type:Boolean,required:!1,default:!0},scrollable:{type:Boolean,required:!1},transition:{type:Boolean,required:!1,default:!0},fullscreen:{type:Boolean,required:!1},portal:{type:[Boolean,String],required:!1,skipCheck:!0,default:!0},close:{type:[Boolean,Object],required:!1,default:!0},closeIcon:{type:null,required:!1},dismissible:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},open:{type:Boolean,required:!1},defaultOpen:{type:Boolean,required:!1},modal:{type:Boolean,required:!1,default:!0},unmountOnHide:{type:Boolean,required:!1}},emits:["leave","after:leave","enter","after:enter","close:prevent","update:open"],setup(d,{emit:n}){const a=d,s=n,o=ie(),t=de("modal",a),{t:y}=pe(),p=fe(),c=ce(ve(t,"open","defaultOpen","modal","unmountOnHide"),s),l=ye(z(()=>t.portal)),m=z(()=>t.content),v=F(()=>t.dismissible?{pointerDownOutside:_=>qe(_,{scrollable:t.scrollable})}:["interactOutside","escapeKeyDown"].reduce((q,H)=>(q[H]=P=>{P.preventDefault(),s("close:prevent")},q),{})),[C,$]=me(),b=F(()=>Ce({extend:Ue,...p.ui?.modal||{}})({transition:t.transition,fullscreen:t.fullscreen,overlay:t.overlay,scrollable:t.scrollable}));return(_,q)=>(r(),i(e(ke),X(Y(e(c))),{default:u(({open:H,close:P})=>[h(e(C),null,{default:u(()=>[h(e(Re),D({"data-slot":"content",class:b.value.content({class:[!o.default&&e(t).class,e(t).ui?.content]})},m.value,{onEnter:q[0]||(q[0]=T=>s("enter")),onAfterEnter:q[1]||(q[1]=T=>s("after:enter")),onLeave:q[2]||(q[2]=T=>s("leave")),onAfterLeave:q[3]||(q[3]=T=>s("after:leave"))},_e(v.value)),{default:u(()=>[!e(t).title&&!o.title||!e(t).description&&!o.description||o.content?(r(),i(e(ge),{key:0},{default:u(()=>[!e(t).title&&!o.title?(r(),i(e(K),{key:0})):o.content?(r(),i(e(K),{key:1},{default:u(()=>[f(_.$slots,"title",{},()=>[A(M(e(t).title),1)])]),_:3})):g("",!0),!e(t).description&&!o.description?(r(),i(e(S),{key:2})):o.content?(r(),i(e(S),{key:3},{default:u(()=>[f(_.$slots,"description",{},()=>[A(M(e(t).description),1)])]),_:3})):g("",!0)]),_:3})):g("",!0),f(_.$slots,"content",{close:P},()=>[o.header||e(t).title||o.title||e(t).description||o.description||e(t).close||o.close?(r(),E("div",{key:0,"data-slot":"header",class:k(b.value.header({class:e(t).ui?.header}))},[f(_.$slots,"header",{close:P},()=>[e(t).title||o.title||e(t).description||o.description?(r(),E("div",{key:0,"data-slot":"wrapper",class:k(b.value.wrapper({class:e(t).ui?.wrapper}))},[e(t).title||o.title?(r(),i(e(K),{key:0,"data-slot":"title",class:k(b.value.title({class:e(t).ui?.title}))},{default:u(()=>[f(_.$slots,"title",{},()=>[A(M(e(t).title),1)])]),_:3},8,["class"])):g("",!0),e(t).description||o.description?(r(),i(e(S),{key:1,"data-slot":"description",class:k(b.value.description({class:e(t).ui?.description}))},{default:u(()=>[f(_.$slots,"description",{},()=>[A(M(e(t).description),1)])]),_:3},8,["class"])):g("",!0)],2)):g("",!0),f(_.$slots,"actions"),e(t).close||o.close?(r(),i(e($e),{key:1,"as-child":""},{default:u(()=>[f(_.$slots,"close",{ui:b.value},()=>[e(t).close?(r(),i(be,D({key:0,icon:e(t).closeIcon||e(p).ui.icons.close,color:"neutral",variant:"ghost","aria-label":e(y)("modal.close")},typeof e(t).close=="object"?e(t).close:{},{"data-slot":"close",class:b.value.close({class:e(t).ui?.close})}),null,16,["icon","aria-label","class"])):g("",!0)])]),_:2},1024)):g("",!0)])],2)):g("",!0),o.body?(r(),E("div",{key:1,"data-slot":"body",class:k(b.value.body({class:e(t).ui?.body}))},[f(_.$slots,"body",{close:P})],2)):g("",!0),o.footer?(r(),E("div",{key:2,"data-slot":"footer",class:k(b.value.footer({class:e(t).ui?.footer}))},[f(_.$slots,"footer",{close:P})],2)):g("",!0)])]),_:2},1040,["class"])]),_:2},1024),o.default?(r(),i(e(xe),{key:0,"as-child":"",class:k(e(t).class)},{default:u(()=>[f(_.$slots,"default",{open:H})]),_:2},1032,["class"])):g("",!0),h(e(Le),D(e(l),{"force-mount":e(l).disabled&&e(t).unmountOnHide===!1||void 0}),{default:u(()=>[h(e(De),null,{default:u(()=>[e(t).scrollable?(r(),i(e(G),{key:0,"data-slot":"overlay",class:k(b.value.overlay({class:e(t).ui?.overlay}))},{default:u(()=>[h(e($))]),_:1},8,["class"])):(r(),E(Oe,{key:1},[e(t).overlay?(r(),i(e(G),{key:0,"data-slot":"overlay",class:k(b.value.overlay({class:e(t).ui?.overlay}))},null,8,["class"])):g("",!0),h(e($))],64))]),_:1})]),_:1},16,["force-mount"])]),_:3},16))}};export{G as D,Ge as _,Re as a,ke as b,xe as c,Le as d,K as e,S as f,$e as g};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{_ as Le}from"./CXEH9OPk.js";import{_ as De}from"./DabzhQB1.js";import{_ as _e,a as Pe,b as Oe,c as He,d as qe,e as Ge,f as Ke,g as ke,u as We,h as Je,i as Ze,j as Qe,k as Xe,l as Ye,m as et}from"./CahpB9Z2.js";import{d as ee,o as s,f as S,g as p,i as t,q as Y,k as e,j as r,c as l,t as a,v as d,s as ce,m as $,p as te,D as be,F as B,y as Q,_ as ie,h as P,E as tt,G as st,r as v,H as ae,B as nt,l as Z,I as $e,J as at,K as ot,C as fe,L as lt,b as rt,u as it,w as ct,e as ut,M as dt}from"./Du2W7Jne.js";import{_ as Ce}from"./BT3wGCTI.js";import{_ as mt,a as ft}from"./5A6ITZXj.js";import{_ as ge}from"./Bm62iDV5.js";import{_ as pt}from"./Bnxf8nbZ.js";import{_ as gt}from"./C0_yH0N7.js";import{_ as we}from"./DsesNydr.js";import{u as xt,_ as vt,a as yt,i as ht,b as _t,s as ve,c as kt}from"./Cnsmicv2.js";import{c as ye,f as re,a as bt,b as $t,d as Ct,e as Se,s as pe,g as de,r as he,h as wt}from"./DuwtTfO8.js";import{_ as xe}from"./DJmoLeVt.js";import{_ as St}from"./CxyAzHr3.js";import{_ as Tt}from"./CeG9pBAD.js";import{_ as It}from"./CzAPFPpL.js";import{_ as jt}from"./CAvY22RE.js";import{_ as Te}from"./BUkim3TM.js";import{u as Rt,p as zt,_ as Ut}from"./BY0HxR3t.js";import{b as Et}from"./BicAJ6U8.js";import{u as Vt}from"./B8zkOmwo.js";import{u as At}from"./DSqHUrvO.js";import"./KyA_4Ks-.js";import"./Dy-TJ0Mt.js";import"./BgRu_3tT.js";import"./_mj6CfPa.js";import"./BrQEE053.js";import"./B3obW6cw.js";import"./D-c8ZSws.js";import"./-f7BAm1H.js";import"./BjaRappk.js";import"./pQqGiNch.js";import"./UdR3DBPS.js";import"./DmkUdSS4.js";import"./B99fbi73.js";import"./CIrFl3MW.js";const Mt={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Nt={class:"flex items-center gap-3 min-w-0"},Ft={class:"font-mono text-sm truncate text-gray-600 dark:text-gray-400 min-w-0"},Bt={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Lt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Dt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Pt={key:1,class:"text-xs text-gray-400 whitespace-nowrap"},Ot={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ht={class:"space-y-3"},qt={key:0,class:"text-sm font-medium break-words text-gray-500 dark:text-gray-400"},Gt={class:"flex flex-wrap gap-2"},Kt={class:"text-sm text-gray-500"},Wt={key:1,class:"rounded-md border border-default p-3 space-y-1.5"},Jt={class:"flex items-center gap-2 flex-wrap"},Zt={key:0,class:"text-xs text-gray-500"},Qt={class:"text-xs text-gray-500"},Xt={class:"text-sm text-gray-500"},Yt={class:"font-mono text-xs"},es={class:"flex items-start gap-3"},ts={class:"flex flex-col gap-1 shrink-0"},ss={class:"flex-1 min-w-0 space-y-1.5"},ns={class:"flex justify-end"},as=ee({__name:"ClusterSummary",props:{cluster:{},triageStatus:{},triageNote:{},triageSaving:{type:Boolean},triageChanged:{type:Boolean}},emits:["update:triageStatus","update:triageNote","save-triage"],setup(n,{emit:R}){const m=n,C=R,{summaryColSpanClass:f}=xt(()=>1),y=P(()=>Ct(m.cluster.fixVerification)),o=[{label:"Open",value:"open",color:"warning"},{label:"Resolved",value:"resolved",color:"success"},{label:"Ignored",value:"ignored",color:"neutral"}];return(i,g)=>{const I=ce,U=te,E=ge,T=be,_=pt,j=gt,h=ie,M=we,O=vt;return s(),S(O,{"storage-key":"failure-cluster"},{folded:p(()=>[t("div",Mt,[t("div",Nt,[r(I,{color:("clusterStatusColor"in i?i.clusterStatusColor:e($t))(n.cluster.status),variant:"solid",size:"sm",class:"shrink-0 capitalize"},{default:p(()=>[$(a(n.cluster.status),1)]),_:1},8,["color"]),t("span",Ft,a(n.cluster.signature),1),n.cluster.errorType?(s(),S(I,{key:0,color:("clusterErrorTypeColor"in i?i.clusterErrorTypeColor:e(ye))(n.cluster.errorType),variant:"subtle",size:"sm"},{default:p(()=>[$(a(n.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),e(y)?(s(),S(I,{key:1,color:e(y).color,variant:"subtle",size:"sm",class:"gap-1 shrink-0"},{default:p(()=>[r(U,{name:e(y).icon,class:"size-3"},null,8,["name"]),$(" "+a(e(y).label),1)]),_:1},8,["color"])):d("",!0)]),t("div",Bt,[t("span",Lt,a(n.cluster.occurrences)+" occurrence"+a(n.cluster.occurrences===1?"":"s"),1),t("span",Dt,a(n.cluster.affectedTests)+" "+a(n.cluster.affectedTests===1?"test":"tests"),1),n.cluster.diagnosis?.status==="completed"&&n.cluster.diagnosis?.category?(s(),S(I,{key:0,color:"neutral",variant:"outline",size:"sm",class:"gap-1 whitespace-nowrap"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+a(n.cluster.diagnosis.category),1)]),_:1})):d("",!0),n.cluster.lastSeenAt?(s(),l("span",Pt," last seen "+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.lastSeenAt)),1)):d("",!0)])])]),default:p(()=>[t("div",Ot,[t("div",{class:Y(e(f))},[r(j,{title:n.cluster.signature},{default:p(()=>[t("div",Ht,[n.cluster.title?(s(),l("p",qt,a(n.cluster.title),1)):d("",!0),t("div",Gt,[n.cluster.errorType?(s(),S(I,{key:0,color:("clusterErrorTypeColor"in i?i.clusterErrorTypeColor:e(ye))(n.cluster.errorType),variant:"subtle"},{default:p(()=>[$(a(n.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),r(I,{color:"neutral",variant:"subtle"},{default:p(()=>[$(a(n.cluster.occurrences)+" occurrence"+a(n.cluster.occurrences===1?"":"s"),1)]),_:1}),r(I,{color:"neutral",variant:"subtle"},{default:p(()=>[$(a(n.cluster.affectedTests)+" "+a(n.cluster.affectedTests===1?"test":"tests")+" affected ",1)]),_:1}),n.cluster.diagnosis?.status==="completed"&&n.cluster.diagnosis?.category?(s(),S(I,{key:1,color:"neutral",variant:"outline",class:"gap-1"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+a(n.cluster.diagnosis.category),1)]),_:1})):d("",!0),r(E,{topic:"cluster.concept"})]),t("p",Kt,[g[2]||(g[2]=$(" First seen in ",-1)),r(T,{to:`/test-runs/${n.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+a(n.cluster.firstSeenRunId),1)]),_:1},8,["to"]),n.cluster.firstSeenAt?(s(),l(B,{key:0},[$(" ("+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.firstSeenAt))+") ",1)],64)):d("",!0),g[3]||(g[3]=$(" · Last seen in ",-1)),r(T,{to:`/test-runs/${n.cluster.lastSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+a(n.cluster.lastSeenRunId),1)]),_:1},8,["to"]),n.cluster.lastSeenAt?(s(),l(B,{key:1},[$(" ("+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.lastSeenAt))+") ",1)],64)):d("",!0),n.cluster.lastSeenRunStatus?(s(),S(_,{key:2,status:n.cluster.lastSeenRunStatus,size:"sm",class:"ml-1 align-middle"},null,8,["status"])):d("",!0)]),e(y)?(s(),l("div",Wt,[t("div",Jt,[r(I,{color:e(y).color,variant:"subtle",class:"gap-1"},{default:p(()=>[r(U,{name:e(y).icon,class:"size-3"},null,8,["name"]),$(" "+a(e(y).label),1)]),_:1},8,["color"]),n.cluster.timeToResolutionMs!=null?(s(),l("span",Zt," open for "+a(("formatDuration"in i?i.formatDuration:e(bt))(n.cluster.timeToResolutionMs)),1)):d("",!0),r(E,{topic:"cluster.resolution"})]),t("p",Qt,a(e(y).hint),1),t("p",Xt,[n.cluster.fixLandedRunId?(s(),l(B,{key:0},[g[4]||(g[4]=$(" Fix landed in ",-1)),r(T,{to:`/test-runs/${n.cluster.fixLandedRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+a(n.cluster.fixLandedRunId),1)]),_:1},8,["to"])],64)):d("",!0),n.cluster.fixLandedAt?(s(),l(B,{key:1},[$(" ("+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.fixLandedAt))+")",1)],64)):d("",!0),n.cluster.fixCommit?(s(),l(B,{key:2},[g[5]||(g[5]=$(" · commit ",-1)),t("code",Yt,a(n.cluster.fixCommit.slice(0,8)),1)],64)):d("",!0)])])):d("",!0)])]),_:1},8,["title"])],2),r(j,{class:"lg:col-span-3",icon:"i-lucide-triangle-alert","icon-class":"text-amber-500",title:"Triage",help:"cluster.triage"},{default:p(()=>[t("div",es,[t("div",ts,[(s(),l(B,null,Q(o,V=>r(h,{key:V.value,size:"xs",class:"justify-start",color:n.triageStatus===V.value?V.color:"neutral",variant:n.triageStatus===V.value?"solid":"outline",onClick:N=>C("update:triageStatus",V.value)},{default:p(()=>[$(a(V.label),1)]),_:2},1032,["color","variant","onClick"])),64))]),t("div",ss,[r(M,{"model-value":n.triageNote,placeholder:"Optional note…",rows:3,class:"text-sm w-full","onUpdate:modelValue":g[0]||(g[0]=V=>C("update:triageNote",V))},null,8,["model-value"]),t("div",ns,[n.triageChanged?(s(),S(h,{key:0,size:"xs",icon:"i-lucide-check",loading:n.triageSaving,onClick:g[1]||(g[1]=V=>C("save-triage"))},{default:p(()=>[...g[6]||(g[6]=[$(" Save ",-1)])]),_:1},8,["loading"])):d("",!0)])])])]),_:1})])]),_:1})}}}),os=Object.assign(as,{__name:"ClusterSummary"}),ls={class:"divide-y divide-default"},rs={class:"text-xs font-mono text-gray-700 dark:text-gray-300 break-all whitespace-pre-wrap"},is={class:"text-xs font-mono text-gray-600 dark:text-gray-400 truncate"},cs=ee({__name:"TestEvidenceSignals",props:st({consoleLogs:{},networkRequests:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(n){const R=n,m=P(()=>Array.isArray(R.consoleLogs)?R.consoleLogs.filter(i=>i.type==="error"||i.type==="warning"):[]),C=P(()=>Array.isArray(R.networkRequests)?R.networkRequests.filter(i=>i.status&&i.status>=400):[]),f=P(()=>m.value.length>0||C.value.length>0),y=P(()=>{const i=[];return m.value.length&&i.push(`${m.value.length} console`),C.value.length&&i.push(`${C.value.length} network`),i.join(", ")}),o=tt(n,"open");return(i,g)=>{const I=te,U=ce,E=_e;return e(f)?(s(),S(E,{key:0,icon:"i-lucide-triangle-alert",label:`Signals (${e(y)})`,open:o.value,"onUpdate:open":g[0]||(g[0]=T=>o.value=T)},{default:p(()=>[t("div",ls,[e(m).length>0?(s(),l(B,{key:0},[g[1]||(g[1]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Console")],-1)),(s(!0),l(B,null,Q(e(m),(T,_)=>(s(),l("div",{key:"log-"+_,class:"px-3 py-1.5 flex items-start gap-2"},[r(I,{name:T.type==="error"?"i-lucide-x-circle":"i-lucide-alert-triangle",class:Y(["size-3.5 mt-0.5 shrink-0",T.type==="error"?"text-red-500":"text-yellow-500"])},null,8,["name","class"]),t("p",rs,a(T.text),1)]))),128))],64)):d("",!0),e(C).length>0?(s(),l(B,{key:1},[g[2]||(g[2]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Network")],-1)),(s(!0),l(B,null,Q(e(C),(T,_)=>(s(),l("div",{key:"req-"+_,class:"px-3 py-1.5 flex items-center gap-2"},[r(U,{color:T.status>=500?"error":"warning",variant:"subtle",size:"sm",class:"shrink-0 font-mono"},{default:p(()=>[$(a(T.status),1)]),_:2},1032,["color"]),t("p",is,a(T.url),1)]))),128))],64)):d("",!0)])]),_:1},8,["label","open"])):d("",!0)}}}),us=Object.assign(cs,{__name:"TestEvidenceSignals"}),ds={class:"space-y-3"},ms={key:0,class:"flex gap-0 border-b border-default overflow-x-auto"},fs=["title","onClick"],ps={key:0,class:"opacity-60 ml-1"},gs={key:1,class:"flex items-start justify-between gap-2 flex-wrap"},xs={class:"min-w-0"},vs={class:"text-sm font-medium break-words"},ys={key:2,class:"flex items-center justify-center py-10"},hs={key:0,class:"flex flex-wrap gap-1.5"},_s={class:"divide-y divide-default"},ks={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},bs={key:0,class:"text-xs font-mono text-red-500 whitespace-pre-wrap break-all"},$s={class:"overflow-x-auto max-h-72"},Cs={class:"max-h-64 overflow-auto"},ws=ee({__name:"ClusterTestEvidence",props:{affectedTestCases:{},projectKey:{},projectName:{}},setup(n){const R=n,m=v(R.affectedTestCases[0]?.recentTestRunsCaseId??null),C=P(()=>R.affectedTestCases.find(c=>c.recentTestRunsCaseId===m.value)),f=v(null),y=v([]),o=v(!1),i=v(!1),g=v(!1),I=v(!1),U=v(!1),E=v(!1),T=v(!1),_=new Map;function j(){g.value=!1,I.value=!1,U.value=!1,E.value=!1,T.value=!1}async function h(c){j();const w=_.get(c);if(w){f.value=w.detail,y.value=w.traces,o.value=!1,i.value=!1;return}o.value=!0,i.value=!0,f.value=null,y.value=[];const[D,q]=await Promise.allSettled([$fetch(`/api/test-run-cases/${c}`),$fetch(`/api/test-run-cases/${c}/traces`)]);D.status==="fulfilled"&&(f.value=D.value),o.value=!1,q.status==="fulfilled"&&(y.value=q.value),i.value=!1,D.status==="fulfilled"&&q.status==="fulfilled"&&_.set(c,{detail:D.value,traces:q.value})}const M=new Map,O=v(null),V=v("trace"),N=P(()=>O.value?.frames??[]);async function H(c){if(O.value=M.get(c)??null,M.has(c)||y.value.length===0)return;const w=f.value?.testRun?.id;if(w)try{const D=await $fetch(`/api/test-runs/${w}/cases/${c}/trace-stacks`),q=D.status==="ok"&&D.frames?.length?D:null;M.set(c,q),m.value===c&&(O.value=q)}catch{M.set(c,null)}}ae([f,y],()=>{V.value="trace",m.value&&H(m.value)}),ae(m,c=>{c&&h(c)}),nt(()=>{m.value&&h(m.value)});const A=P(()=>{const c=f.value?.steps;return Array.isArray(c)?c.filter(w=>w.error):[]}),L=P(()=>f.value?.testSource?f.value.testSource.split(`
|
|
2
|
-
`).length:0),z=P(()=>{const c=f.value;if(!c)return[];const w=c.attachments.filter(k=>ht(k.path,k.contentType)).length,D=c.attachments.filter(k=>_t(k.path,k.contentType)).length,q=Array.isArray(c.consoleLogs)?c.consoleLogs.filter(k=>k.type==="error"||k.type==="warning").length:0,X=Array.isArray(c.networkRequests)?c.networkRequests.filter(k=>(k.status??0)>=400).length:0;return[{icon:"i-lucide-image",label:"screenshots",count:w},{icon:"i-lucide-video",label:"videos",count:D},{icon:"i-lucide-bug-play",label:"traces",count:y.value.length},{icon:"i-lucide-list-checks",label:"failing steps",count:A.value.length},{icon:"i-lucide-triangle-alert",label:"signals",count:q+X},{icon:"i-lucide-code",label:"source",count:c.testSourceFrames?.length||(c.testSource?1:0)},{icon:"i-lucide-accessibility",label:"ARIA",count:c.ariaSnapshot?1:0}].filter(k=>k.count>0)});return(c,w)=>{const D=xe,q=ie,X=te,k=ce,u=Pe,b=Oe,F=He,G=_e,K=us,W=St,J=qe,se=Ge,ne=yt,ue=Ke;return s(),l("div",ds,[n.affectedTestCases.length>1?(s(),l("div",ms,[(s(!0),l(B,null,Q(n.affectedTestCases,x=>(s(),l("button",{key:x.recentTestRunsCaseId,class:Y(["px-3 py-1.5 text-xs whitespace-nowrap border-b-2 -mb-px transition-colors",e(m)===x.recentTestRunsCaseId?"border-primary text-primary font-medium":"border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"]),title:x.title,onClick:oe=>m.value=x.recentTestRunsCaseId},[$(a(x.title.split(" › ").pop())+" ",1),x.runCount>1?(s(),l("span",ps,a(x.runCount)+"×",1)):d("",!0)],10,fs))),128))])):d("",!0),e(C)?(s(),l("div",gs,[t("div",xs,[t("p",vs,a(e(C).title),1),r(D,{"file-path":e(C).filePath,"project-key":n.projectKey,"project-name":n.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])]),r(q,{to:`/test-run-cases/${e(C).recentTestRunsCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:p(()=>[...w[6]||(w[6]=[$(" Open test run case ",-1)])]),_:1},8,["to"])])):d("",!0),e(o)?(s(),l("div",ys,[r(X,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(f)?(s(),l(B,{key:3},[e(z).length?(s(),l("div",hs,[(s(!0),l(B,null,Q(e(z),x=>(s(),S(k,{key:x.label,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:p(()=>[r(X,{name:x.icon,class:"size-3"},null,8,["name"]),$(" "+a(x.count)+" "+a(x.label),1)]),_:2},1024))),128))])):d("",!0),r(u,{attachments:e(f).attachments},null,8,["attachments"]),r(b,{attachments:e(f).attachments},null,8,["attachments"]),r(F,{traces:e(y),loading:e(i)},null,8,["traces","loading"]),e(A).length>0?(s(),S(G,{key:1,icon:"i-lucide-list-checks",label:"Failing steps",count:e(A).length,open:e(g),"onUpdate:open":w[0]||(w[0]=x=>Z(g)?g.value=x:null)},{default:p(()=>[t("div",_s,[(s(!0),l(B,null,Q(e(A),(x,oe)=>(s(),l("div",{key:oe,class:"px-3 py-2 space-y-0.5"},[t("p",ks,a(oe+1)+". "+a(x.title),1),x.error?.message?(s(),l("p",bs,a(x.error.message),1)):d("",!0)]))),128))])]),_:1},8,["count","open"])):d("",!0),r(K,{"console-logs":e(f).consoleLogs,"network-requests":e(f).networkRequests,open:e(I),"onUpdate:open":w[1]||(w[1]=x=>Z(I)?I.value=x:null)},null,8,["console-logs","network-requests","open"]),e(f).testSourceFrames?.length||e(f).testSource||e(N).length?(s(),S(G,{key:2,icon:"i-lucide-code",label:"Test source",count:e(N).length||e(f).testSourceFrames?.length||e(L),open:e(U),"onUpdate:open":w[3]||(w[3]=x=>Z(U)?U.value=x:null)},{default:p(()=>[e(N).length&&(e(f).testSourceFrames?.length||e(f).testSource)?(s(),S(W,{key:0,modelValue:e(V),"onUpdate:modelValue":w[2]||(w[2]=x=>Z(V)?V.value=x:null),items:[{label:`Full stack (${e(N).length})`,value:"trace"},{label:`Captured (${e(f).testSourceFrames?.length||1})`,value:"captured"}],size:"xs",variant:"link",class:"mb-1.5",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"])):d("",!0),t("div",$s,[e(V)==="trace"&&e(N).length?(s(),S(J,{key:0,frames:e(N),"project-key":n.projectKey,"project-name":n.projectName},null,8,["frames","project-key","project-name"])):e(f).testSourceFrames?.length?(s(),S(se,{key:1,frames:e(f).testSourceFrames,"project-key":n.projectKey,"project-name":n.projectName},null,8,["frames","project-key","project-name"])):e(f).testSource?(s(),S(ne,{key:2,text:"```typescript\n"+e(f).testSource+"\n```"},null,8,["text"])):d("",!0)])]),_:1},8,["count","open"])):d("",!0),e(f).ariaSnapshot?(s(),S(G,{key:3,icon:"i-lucide-accessibility",label:"ARIA snapshot",open:e(E),"onUpdate:open":w[4]||(w[4]=x=>Z(E)?E.value=x:null)},{default:p(()=>[t("div",Cs,[r(ne,{text:"```yaml\n"+e(f).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},8,["open"])):d("",!0),e(f).pageState?(s(),S(G,{key:4,icon:"i-lucide-database",label:"App state",open:e(T),"onUpdate:open":w[5]||(w[5]=x=>Z(T)?T.value=x:null)},{default:p(()=>[r(ue,{"page-state":e(f).pageState,plain:""},null,8,["page-state"])]),_:1},8,["open"])):d("",!0)],64)):d("",!0)])}}}),Ss=Object.assign(ws,{__name:"ClusterTestEvidence"}),Ts={key:0,class:"flex items-center gap-1.5 overflow-hidden min-w-0"},Is={class:"text-primary shrink-0"},js={class:"text-gray-500 truncate text-xs font-sans"},Rs={key:1,class:"text-primary text-xs"},zs={key:2,class:"text-gray-400 font-sans text-xs"},Us={class:"w-96 p-2 space-y-2"},Es={class:"flex items-center gap-1"},Vs={class:"flex items-center gap-1"},As={key:0,class:"flex items-center gap-2 px-2 py-1.5 text-xs rounded-md bg-primary/5 text-gray-600 dark:text-gray-300"},Ms={class:"font-medium text-green-600 dark:text-green-400"},Ns={class:"font-medium text-red-600 dark:text-red-400"},Fs={class:"text-gray-400"},Bs={key:1,class:"flex items-center justify-center gap-2 py-6 text-gray-400"},Ls={key:2,class:"py-4 text-center text-sm text-red-500"},Ds={key:3,class:"flex items-start gap-2 px-2 py-2 text-xs text-amber-700 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 rounded-md"},Ps={key:4,class:"max-h-80 overflow-y-auto space-y-px"},Os={class:"text-xs text-primary"},Hs={key:1,class:"py-4 text-center text-sm text-gray-400"},qs=["onClick"],Gs={class:"text-xs text-primary shrink-0 w-14 pt-px"},Ks={class:"flex-1 min-w-0"},Ws={class:"text-xs font-medium leading-snug truncate"},Js={class:"text-xs text-gray-400 leading-snug truncate"},Zs=ee({__name:"CommitPicker",props:{modelValue:{},clusterId:{}},emits:["update:modelValue"],setup(n,{emit:R}){const m=n,C=R,f=v(!1),y=v(""),o=v([]),i=v(null),g=v(null),I=v(!1),U=v(!1),E=v(null),T=v(null),_=v([]),j=v(!1),h=v(void 0),M=P(()=>{if(!m.modelValue)return null;const z=m.modelValue.trim();return o.value.find(w=>w.sha===z||w.sha.startsWith(z))??{sha:z,shortSha:z.slice(0,7),message:"",author:"",date:""}});async function O(){if(!_.value.length){j.value=!0;try{const z=await $fetch(`/api/failure-clusters/${m.clusterId}/branches`);_.value=z.branches}catch{}finally{j.value=!1}}}async function V(){const z=m.modelValue||"";I.value=!0,U.value=!1,T.value=null;try{const c={};z&&(c.baseline=z),h.value&&(c.branch=h.value);const w=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:c});o.value=w.commits,g.value=w.aggregate,i.value=w.error??null,T.value=z}catch{U.value=!0}finally{I.value=!1}}ae(h,()=>{o.value=[],T.value=null,V()}),ae(f,async z=>{if(z){await Promise.all([O(),V()]),await ot();const c=E.value?.$el?.querySelector("input")??E.value?.$el;c instanceof HTMLElement&&c.focus()}else y.value=""});const N=P(()=>Se(o.value,y.value)),H=P(()=>{const z=y.value.trim();return!/^[0-9a-f]{7,40}$/i.test(z)||N.value.some(c=>c.sha.startsWith(z.toLowerCase()))?null:z});function A(z){C("update:modelValue",z),f.value=!1}function L(z){z.stopPropagation(),i.value=null,g.value=null,C("update:modelValue",""),f.value=!1}return(z,c)=>{const w=ie,D=te,q=Tt,X=$e,k=at;return s(),S(k,{open:e(f),"onUpdate:open":c[4]||(c[4]=u=>Z(f)?f.value=u:null)},{content:p(()=>[t("div",Us,[t("div",Es,[r(D,{name:"i-lucide-git-branch",class:"size-3.5 text-gray-400 shrink-0"}),r(q,{modelValue:e(h),"onUpdate:modelValue":c[0]||(c[0]=u=>Z(h)?h.value=u:null),items:e(_),placeholder:"Default branch",size:"xs",class:"flex-1",loading:e(j),disabled:e(j)},null,8,["modelValue","items","loading","disabled"])]),t("div",Vs,[r(X,{ref_key:"searchInputRef",ref:E,modelValue:e(y),"onUpdate:modelValue":c[1]||(c[1]=u=>Z(y)?y.value=u:null),placeholder:"Search message, author, SHA…",size:"xs",icon:"i-lucide-search",class:"flex-1"},null,8,["modelValue"]),n.modelValue?(s(),S(w,{key:0,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Clear baseline",onClick:c[2]||(c[2]=u=>L(u))})):d("",!0)]),e(g)&&n.modelValue&&!e(I)?(s(),l("div",As,[r(D,{name:"i-lucide-git-compare-arrows",class:"size-3.5 shrink-0 text-primary"}),c[5]||(c[5]=t("span",null,"Since baseline:",-1)),t("span",Ms,"+"+a(e(g).linesAdded),1),t("span",Ns,"-"+a(e(g).linesRemoved),1),t("span",Fs,"across "+a(e(g).filesChanged)+" file"+a(e(g).filesChanged===1?"":"s"),1)])):d("",!0),e(I)?(s(),l("div",Bs,[r(D,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),c[6]||(c[6]=t("span",{class:"text-sm"},"Loading commits…",-1))])):e(U)?(s(),l("div",Ls," Failed to load commits — check your SCM token in Settings → AI ")):e(i)&&!e(I)&&e(o).length===0?(s(),l("div",Ds,[r(D,{name:"i-lucide-triangle-alert",class:"size-3.5 shrink-0 mt-0.5"}),t("span",null,a(e(i)),1)])):(s(),l("div",Ps,[e(H)?(s(),l("button",{key:0,class:"w-full text-left px-2 py-1.5 rounded flex items-center gap-2 hover:bg-elevated transition-colors border border-dashed border-default",onClick:c[3]||(c[3]=u=>A(e(H)))},[r(D,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),c[7]||(c[7]=t("span",{class:"text-xs text-gray-500"},"Use commit",-1)),t("code",Os,a(e(H).slice(0,7)),1)])):d("",!0),e(N).length===0&&!e(H)?(s(),l("div",Hs,a(e(y)?"No commits match":"No commits available"),1)):d("",!0),(s(!0),l(B,null,Q(e(N),u=>(s(),l("button",{key:u.sha,class:Y(["w-full text-left px-2 py-1.5 rounded flex items-start gap-2 hover:bg-elevated transition-colors",n.modelValue===u.sha?"bg-primary/10 ring-1 ring-inset ring-primary/30":""]),onClick:b=>A(u.sha)},[t("code",Gs,a(u.shortSha),1),t("div",Ks,[t("p",Ws,a(u.message),1),t("p",Js,[$(a(u.author),1),u.date?(s(),l(B,{key:0},[$(" · "+a(e(re)(u.date)),1)],64)):d("",!0)])]),n.modelValue===u.sha?(s(),S(D,{key:0,name:"i-lucide-check",class:"size-3.5 text-primary shrink-0 mt-0.5"})):d("",!0)],10,qs))),128))]))])]),default:p(()=>[r(w,{size:"xs",color:"neutral",variant:"outline",icon:n.modelValue?"i-lucide-git-branch-plus":"i-lucide-git-branch","trailing-icon":"i-lucide-chevron-down",class:"min-w-36 max-w-48 font-mono"},{default:p(()=>[e(M)?.message?(s(),l("span",Ts,[t("code",Is,a(e(M).shortSha),1),t("span",js,a(e(M).message),1)])):n.modelValue?(s(),l("span",Rs,a(n.modelValue.slice(0,7))+"…",1)):(s(),l("span",zs,"baseline commit…"))]),_:1},8,["icon"])]),_:1},8,["open"])}}}),Qs=Object.assign(Zs,{__name:"CommitPicker"}),Xs={class:"space-y-3"},Ys={key:0,class:"space-y-1"},en={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},tn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},sn={class:"text-xs text-gray-400 shrink-0"},nn={class:"text-xs text-gray-700 dark:text-gray-300 truncate"},an={class:"space-y-1"},on={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},ln={key:0,class:"text-yellow-500 font-normal normal-case"},rn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},cn=["onClick"],un={class:"text-xs font-mono flex-1 truncate text-gray-700 dark:text-gray-300"},dn={class:"text-xs text-gray-400 shrink-0 tabular-nums"},mn={key:0,class:"text-green-500"},fn={key:1,class:"text-gray-300 mx-0.5"},pn={key:2,class:"text-red-500"},gn={key:0,class:"border-t border-default overflow-x-auto max-h-96"},xn=ee({__name:"ScmChangesView",props:{changes:{}},setup(n){const R=v(new Set);function m(C){const f=new Set(R.value);f.has(C)?f.delete(C):f.add(C),R.value=f}return(C,f)=>{const y=te,o=ke;return s(),l("div",Xs,[n.changes.commits.length>0?(s(),l("div",Ys,[t("p",en,a(n.changes.commits.length)+" commit"+a(n.changes.commits.length===1?"":"s"),1),t("div",tn,[(s(!0),l(B,null,Q(n.changes.commits,i=>(s(),l("div",{key:i.sha,class:"flex items-center gap-2 px-3 py-1.5"},[r(y,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),t("code",sn,a(i.sha.slice(0,7)),1),t("span",nn,a(i.message),1)]))),128))])])):d("",!0),t("div",an,[t("p",on,[$(a(n.changes.files.length)+" file"+a(n.changes.files.length===1?"":"s")+" changed ",1),n.changes.patchesOmitted?(s(),l("span",ln," — diff too large, file names only ")):d("",!0)]),t("div",rn,[(s(!0),l(B,null,Q(n.changes.files,i=>(s(),l("div",{key:i.filename},[t("button",{class:Y(["w-full flex items-center gap-2 px-3 py-1.5 text-left hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",i.patch?"cursor-pointer":"cursor-default"]),onClick:g=>i.patch&&m(i.filename)},[r(y,{name:("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(i.status).icon,class:Y(["size-3.5 shrink-0",("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(i.status).color])},null,8,["name","class"]),t("span",un,a(i.filename),1),t("span",dn,[i.additions?(s(),l("span",mn,"+"+a(i.additions),1)):d("",!0),i.additions&&i.deletions?(s(),l("span",fn,"/")):d("",!0),i.deletions?(s(),l("span",pn,"-"+a(i.deletions),1)):d("",!0)]),i.patch?(s(),S(y,{key:0,name:e(R).has(i.filename)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400 shrink-0"},null,8,["name"])):d("",!0)],10,cn),i.patch&&e(R).has(i.filename)?(s(),l("div",gn,[r(o,{patch:i.patch},null,8,["patch"])])):d("",!0)]))),128))])])])}}}),vn=Object.assign(xn,{__name:"ScmChangesView"}),yn={class:"border border-default rounded-lg overflow-clip text-xs font-mono"},hn={class:"sticky top-0 z-10 flex items-center justify-between px-3 py-1.5 bg-elevated border-b border-default text-gray-600 dark:text-gray-300"},_n={class:"font-medium truncate"},kn={class:"shrink-0 flex items-center gap-1.5 ml-2 text-[11px]"},bn={key:0,class:"text-green-600 dark:text-green-400"},$n={key:1,class:"text-red-600 dark:text-red-400"},Cn={key:1,class:"px-3 py-2 text-gray-400 text-[11px]"},wn=ee({__name:"DiffFile",props:{file:{}},setup(n){return(R,m)=>{const C=ce,f=ke;return s(),l("div",yn,[t("div",hn,[t("span",_n,a(n.file.filename),1),t("span",kn,[n.file.additions?(s(),l("span",bn,"+"+a(n.file.additions),1)):d("",!0),n.file.deletions?(s(),l("span",$n,"-"+a(n.file.deletions),1)):d("",!0),r(C,{label:n.file.status,size:"xs",variant:"subtle",color:("scmFileStatusMeta"in R?R.scmFileStatusMeta:e(pe))(n.file.status).badgeColor},null,8,["label","color"])])]),n.file.patch?(s(),S(f,{key:0,patch:n.file.patch},null,8,["patch"])):(s(),l("div",Cn,"No patch available"))])}}}),Sn=Object.assign(wn,{__name:"DiffFile"}),Tn={class:"inline-flex items-center gap-1"},In={class:"flex h-[72vh] overflow-hidden"},jn={class:"w-72 shrink-0 border-r border-default flex flex-col"},Rn={class:"p-2 border-b border-default space-y-2 shrink-0"},zn={class:"flex items-center gap-2 text-xs text-gray-500"},Un={class:"ml-auto"},En={key:2,class:"flex-1 overflow-y-auto flex flex-col"},Vn={key:0,class:"py-6 text-center text-sm text-gray-400 flex-1"},An=["onClick"],Mn=["checked","onChange"],Nn={class:"flex-1 min-w-0"},Fn={class:"text-xs font-medium leading-snug truncate"},Bn={class:"text-[10px] text-gray-400 leading-snug mt-0.5 flex items-center gap-1 min-w-0"},Ln={class:"text-primary shrink-0"},Dn={class:"truncate"},Pn={key:0,class:"shrink-0"},On={key:1,class:"p-2 shrink-0 space-y-1.5"},Hn={key:0,class:"flex items-center gap-1.5 text-xs text-red-500 px-1"},qn={class:"flex-1 overflow-y-auto flex flex-col min-w-0"},Gn={key:0,class:"flex-1 flex items-center justify-center text-gray-400 text-sm"},Kn={key:2,class:"flex-1 p-4 space-y-3"},Wn={key:0,class:"space-y-0.5 pb-3 border-b border-default"},Jn={class:"flex items-center gap-2"},Zn={class:"text-xs font-mono text-primary"},Qn={class:"text-xs text-gray-400"},Xn={class:"text-sm font-semibold"},Yn={key:1,class:"text-sm text-gray-400 pt-2"},ea={key:4,class:"flex-1 flex items-center justify-center text-sm text-gray-400"},ta={class:"flex items-center gap-3 w-full"},sa={class:"flex-1 flex items-center gap-2 text-sm text-gray-500 min-w-0"},na={class:"font-medium text-gray-700 dark:text-gray-200 shrink-0"},aa={class:"shrink-0"},oa={class:"text-green-600 dark:text-green-400 shrink-0 font-medium"},la={class:"text-red-600 dark:text-red-400 shrink-0 font-medium"},ra={key:1,class:"text-gray-400 text-xs shrink-0"},ia={key:1},me=50,ca=ee({__name:"CommitBrowserModal",props:{open:{type:Boolean},clusterId:{},initialSelected:{},autoSelectedShas:{}},emits:["update:open","confirm"],setup(n,{emit:R}){const m=n,C=P(()=>new Set(m.autoSelectedShas??[])),f=R,y=v(""),o=v([]),i=v(me),g=v(!1),I=v(!1),U=v(!1),E=v(null),T=v(null),_=v(new Set),j=v(null),h=lt({}),M=v(null),O=v(!1),V=v(null),N=P(()=>o.value.find(k=>k.sha===j.value)??null),H=P(()=>Se(o.value,y.value)),A=P(()=>{let k=0,u=0,b=0,F=0;for(const G of _.value){if(!(G in h)){F++;continue}const K=h[G];K&&(k+=K.files.length,u+=K.files.reduce((W,J)=>W+J.additions,0),b+=K.files.reduce((W,J)=>W+J.deletions,0))}return{files:k,linesAdded:u,linesRemoved:b,unreviewed:F}});async function L(k){k?(I.value=!0,E.value=null):(U.value=!0,T.value=null);try{const u=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:{limit:i.value}});o.value=u.commits,g.value=u.hasMore??!1,u.error&&!u.commits.length&&(k?E.value=u.error:T.value=u.error),k&&u.commits[0]&&c(u.commits[0].sha)}catch(u){k?E.value=de(u):T.value=de(u)}finally{I.value=!1,U.value=!1}}async function z(){i.value+=me,await L(!1)}ae(()=>m.open,async k=>{if(k){if(_.value=new Set(m.initialSelected??[]),o.value.length){!j.value&&o.value[0]&&c(o.value[0].sha);return}i.value=me,await L(!0)}});async function c(k){if(j.value!==k){if(j.value=k,V.value=null,k in h){M.value=h[k],O.value=!1;return}M.value=null,O.value=!0;try{const u=await $fetch(`/api/failure-clusters/${m.clusterId}/commit-diff`,{query:{sha:k}});h[k]=u,j.value===k&&(M.value=u)}catch(u){j.value===k&&(V.value=de(u))}finally{j.value===k&&(O.value=!1)}}}function w(k){const u=new Set(_.value);u.has(k)?u.delete(k):u.add(k),_.value=u}function D(){_.value=new Set(H.value.map(k=>k.sha))}function q(){_.value=new Set}function X(){f("confirm",[..._.value]),f("update:open",!1)}return(k,u)=>{const b=ge,F=$e,G=It,K=ie,W=jt,J=ce,se=te,ne=Sn,ue=Te;return s(),S(ue,{open:n.open,title:"Browse commits",ui:{content:"max-w-6xl",body:"p-0 overflow-hidden"},"onUpdate:open":u[4]||(u[4]=x=>f("update:open",x))},{title:p(()=>[t("span",Tn,[u[5]||(u[5]=$("Browse commits ",-1)),r(b,{topic:"cluster.commit-browser"})])]),body:p(()=>[t("div",In,[t("div",jn,[t("div",Rn,[r(F,{modelValue:e(y),"onUpdate:modelValue":u[0]||(u[0]=x=>Z(y)?y.value=x:null),placeholder:"Search commits…",size:"xs",icon:"i-lucide-search"},null,8,["modelValue"]),t("div",zn,[t("button",{class:"hover:text-primary transition-colors",onClick:D},"All"),u[6]||(u[6]=t("span",null,"·",-1)),t("button",{class:"hover:text-primary transition-colors",onClick:q},"None"),t("span",Un,a(e(_).size>0?`${e(_).size} selected`:"none selected"),1)])]),e(I)?(s(),S(G,{key:0,text:"Loading…",padded:!1,class:"flex-1"})):e(E)?(s(),S(W,{key:1,text:e(E),padded:!1,class:"flex-1 p-4"},{action:p(()=>[r(K,{size:"xs",color:"neutral",variant:"outline",onClick:u[1]||(u[1]=x=>L(!0))},{default:p(()=>[...u[7]||(u[7]=[$(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):(s(),l("div",En,[e(H).length===0?(s(),l("div",Vn,a(e(y)?"No commits match":"No commits"),1)):d("",!0),(s(!0),l(B,null,Q(e(H),x=>(s(),l("button",{key:x.sha,class:Y(["w-full text-left px-2.5 py-2 flex items-start gap-2.5 hover:bg-elevated transition-colors border-b border-default/50 last:border-0 shrink-0",e(j)===x.sha?"bg-elevated":""]),onClick:oe=>c(x.sha)},[t("input",{type:"checkbox",checked:e(_).has(x.sha),class:"mt-0.5 shrink-0 cursor-pointer accent-primary",onClick:u[2]||(u[2]=fe(()=>{},["stop"])),onChange:oe=>w(x.sha)},null,40,Mn),t("div",Nn,[t("p",Fn,a(x.message||"(no message)"),1),t("p",Bn,[t("code",Ln,a(x.shortSha),1),t("span",Dn,a(x.author),1),x.date?(s(),l("span",Pn,"· "+a(e(re)(x.date)),1)):d("",!0),e(C).has(x.sha)?(s(),S(J,{key:1,size:"xs",color:"info",variant:"soft",class:"shrink-0"},{default:p(()=>[...u[8]||(u[8]=[$(" auto ",-1)])]),_:1})):d("",!0)])])],10,An))),128)),e(g)&&!e(y)?(s(),l("div",On,[e(T)?(s(),l("p",Hn,[r(se,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+a(e(T)),1)])):d("",!0),r(K,{size:"xs",color:"neutral",variant:"outline",block:"",loading:e(U),onClick:z},{default:p(()=>[...u[9]||(u[9]=[$(" Load more ",-1)])]),_:1},8,["loading"])])):d("",!0)]))]),t("div",qn,[e(j)?e(O)?(s(),S(G,{key:1,text:"Loading diff…",padded:!1,class:"flex-1"})):e(M)?(s(),l("div",Kn,[e(N)?(s(),l("div",Wn,[t("div",Jn,[t("code",Zn,a(e(N).shortSha),1),t("span",Qn,[$(a(e(N).author),1),e(N).date?(s(),l(B,{key:0},[$(" · "+a(e(re)(e(N).date)),1)],64)):d("",!0)])]),t("p",Xn,a(e(N).message),1)])):d("",!0),e(M).files.length===0?(s(),l("div",Yn,"No file changes in this commit")):d("",!0),(s(!0),l(B,null,Q(e(M).files,x=>(s(),S(ne,{key:x.filename,file:x},null,8,["file"]))),128))])):e(V)?(s(),S(W,{key:3,text:e(V),padded:!1,class:"flex-1 p-6"},{action:p(()=>[...u[10]||(u[10]=[t("p",{class:"text-xs text-gray-400"},"Click the commit again to retry",-1)])]),_:1},8,["text"])):(s(),l("div",ea," Diff not available for this commit ")):(s(),l("div",Gn," Select a commit to view its diff "))])])]),footer:p(()=>[t("div",ta,[t("div",sa,[e(_).size>0?(s(),l(B,{key:0},[t("span",na,a(e(_).size)+" commit"+a(e(_).size===1?"":"s"),1),e(A).files>0||e(A).linesAdded>0||e(A).linesRemoved>0?(s(),l(B,{key:0},[u[11]||(u[11]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("span",aa,a(e(A).files)+" file"+a(e(A).files===1?"":"s"),1),t("span",oa,"+"+a(e(A).linesAdded),1),t("span",la,"-"+a(e(A).linesRemoved),1)],64)):d("",!0),e(A).unreviewed>0?(s(),l("span",ra," ("+a(e(A).unreviewed)+" unreviewed) ",1)):d("",!0)],64)):(s(),l("span",ia,"No commits selected"))]),r(K,{color:"neutral",variant:"ghost",onClick:u[3]||(u[3]=x=>f("update:open",!1))},{default:p(()=>[...u[12]||(u[12]=[$(" Cancel ",-1)])]),_:1}),r(K,{color:"primary",disabled:e(_).size===0,onClick:X},{default:p(()=>[...u[13]||(u[13]=[$(" Add to context ",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),ua=Object.assign(ca,{__name:"CommitBrowserModal"});function Ie(n){return{scmStatus:P(()=>{const m=n.value?.scm;if(!m)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"Git context unavailable",detail:""};if(m.baseCommitUsed){if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};const y=m.patchesOmitted?", no patches (diff too large)":m.patchesTruncated?`, ${m.patchedFilesCount} with patches (some cut)`:`, ${m.patchedFilesCount} with patches`;return{color:"text-blue-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · ${m.filesCount} files${y}`,detail:m.hasLastGreen?"overrides last passing run baseline":"no last passing run"}}if(!m.hasLastGreen)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No last passing run",detail:"enter a baseline commit below to enable diff"};if(!m.hasCommitRange)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No commit range",detail:"reporter did not send SCM metadata"};if(!m.provider)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:"Unsupported SCM host",detail:"only GitHub, GitLab and Bitbucket are supported"};if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};if(m.patchesOmitted)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files`,detail:"diff too large — file list only, no patches"};const C=m.patchesTruncated?", some patches cut (budget)":"",f=m.commitsCount>0?` · ${m.commitsCount} commit${m.commitsCount>1?"s":""}`:"";return{color:"text-green-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files · ${m.patchedFilesCount} with patches${C}${f}`,detail:""}})}}const da={class:"space-y-3"},ma={class:"pb-2 border-b border-default"},fa={class:"flex items-center gap-2 flex-wrap"},pa={class:"text-xs text-gray-500 font-medium shrink-0 inline-flex items-center gap-1"},ga={class:"flex items-center gap-1.5 ml-auto"},xa={key:0,class:"flex items-center gap-1 px-2 py-0.5 rounded-full bg-primary/10 text-primary text-xs font-medium"},va={key:0,class:"flex items-start gap-1.5 text-xs px-2 py-1.5 rounded-md bg-elevated border border-default"},ya={key:0,class:"text-gray-400 ml-1"},ha={key:1,class:"flex items-center justify-center py-6"},_a={key:3,class:"text-xs text-gray-400 text-center py-4"},ka=ee({__name:"ClusterInvestigation",setup(n){const{clusterId:R,baseCommit:m,selectedCommitShas:C,autoSelectedCommits:f,baseCommitIsPinned:y,coverage:o,scmChanges:i,contextLoading:g,refreshContext:I}=Rt(),U=v(!1),{scmStatus:E}=Ie(o);return(T,_)=>{const j=ge,h=Qs,M=te,O=Ce,V=ie,N=vn,H=ua;return s(),l(B,null,[t("div",da,[t("div",ma,[t("div",fa,[t("span",pa,[_[5]||(_[5]=$(" Baseline ",-1)),r(j,{topic:"cluster.baseline"})]),r(h,{modelValue:e(m),"onUpdate:modelValue":_[0]||(_[0]=A=>Z(m)?m.value=A:null),"cluster-id":e(R)},null,8,["modelValue","cluster-id"]),e(y)?(s(),S(O,{key:0,text:"Baseline commit pinned for this cluster"},{default:p(()=>[r(M,{name:"i-lucide-pin",class:"size-3.5 text-primary shrink-0"})]),_:1})):d("",!0),t("div",ga,[e(C).length?(s(),l("div",xa,[r(M,{name:"i-lucide-git-commit-horizontal",class:"size-3"}),t("span",null,a(e(C).length)+" commit"+a(e(C).length===1?"":"s"),1),t("button",{class:"ml-0.5 hover:opacity-70 transition-opacity",onClick:_[1]||(_[1]=A=>C.value=[])},[r(M,{name:"i-lucide-x",class:"size-3"})])])):d("",!0),r(V,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list",onClick:_[2]||(_[2]=A=>U.value=!0)},{default:p(()=>[..._[6]||(_[6]=[$(" Browse ",-1)])]),_:1}),r(V,{icon:"i-lucide-refresh-cw",size:"xs",color:"neutral",variant:"outline",loading:e(g),onClick:e(I)},null,8,["loading","onClick"])])])]),e(o)?(s(),l("div",va,[r(M,{name:e(E).icon,class:Y(["size-3.5 mt-0.5 shrink-0",e(E).color])},null,8,["name","class"]),t("div",null,[t("span",{class:Y(e(E).color)},a(e(E).text),3),e(E).detail?(s(),l("span",ya,"— "+a(e(E).detail),1)):d("",!0)])])):d("",!0),e(g)&&!e(i)?(s(),l("div",ha,[r(M,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):e(i)?(s(),S(N,{key:2,changes:e(i)},null,8,["changes"])):e(o)&&!e(g)&&!e(i)?(s(),l("p",_a," No changes found in this range. ")):d("",!0)]),r(H,{open:e(U),"onUpdate:open":_[3]||(_[3]=A=>Z(U)?U.value=A:null),"cluster-id":e(R),"initial-selected":e(C),"auto-selected-shas":e(f),onConfirm:_[4]||(_[4]=A=>C.value=A)},null,8,["open","cluster-id","initial-selected","auto-selected-shas"])],64)}}}),ba=Object.assign(ka,{__name:"ClusterInvestigation"}),$a={class:"flex flex-col h-[60vh]"},Ca={class:"flex items-center gap-3 px-4 py-2.5 border-b border-default text-sm shrink-0"},wa={key:0,class:"ml-auto text-xs text-gray-500"},Sa={class:"flex-1 overflow-y-auto"},Ta={class:"w-full text-sm"},Ia=["onClick"],ja={class:"px-4 py-2.5"},Ra=["checked","onChange"],za={class:"px-2 py-2.5 min-w-0"},Ua={class:"truncate font-medium text-gray-800 dark:text-gray-200 max-w-[24rem]"},Ea={class:"px-2 py-2.5 text-gray-500 text-xs max-w-[16rem] hidden sm:table-cell"},Va={class:"px-2 py-2.5 text-right text-gray-500 text-xs"},Aa={key:0},Ma={class:"shrink-0 border-t border-default px-4 py-3 space-y-1.5"},Na={key:0,class:"shrink-0 px-4 pb-3 flex items-center gap-1.5 text-xs text-red-500"},Fa={class:"flex items-center gap-3 w-full"},Ba=ee({__name:"ClusterExtractCasesModal",props:{open:{type:Boolean},clusterId:{},affectedTestCases:{},projectKey:{},projectName:{}},emits:["update:open","extracted"],setup(n,{emit:R}){const m=n,C=R,f=rt(),y=v(new Set),o=v(""),i=v(!1),g=v(null);function I(){y.value=new Set(m.affectedTestCases.map(j=>j.testCaseId))}function U(){y.value=new Set}function E(j){const h=new Set(y.value);h.has(j)?h.delete(j):h.add(j),y.value=h}ae(()=>m.open,j=>{j&&(U(),o.value="",g.value=null)});const T=P(()=>y.value.size);async function _(){if(T.value!==0){i.value=!0,g.value=null;try{await $fetch(`/api/failure-clusters/${m.clusterId}/extract-cases`,{method:"POST",body:{testCaseIds:[...y.value],triageNote:o.value.trim()||void 0}}),f.add({title:`Extracted ${T.value} test ${T.value===1?"case":"cases"}`,color:"success"}),C("extracted"),C("update:open",!1)}catch(j){g.value=de(j)}finally{i.value=!1}}}return(j,h)=>{const M=be,O=xe,V=we,N=te,H=ie,A=Te;return s(),S(A,{open:n.open,title:"Extract test cases",ui:{content:"max-w-4xl",body:"p-0 flex flex-col overflow-hidden"},"onUpdate:open":h[4]||(h[4]=L=>C("update:open",L))},{body:p(()=>[t("div",$a,[t("div",Ca,[t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:I},"Select all"),h[5]||(h[5]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:U},"Deselect all"),e(T)>0?(s(),l("span",wa,a(e(T))+" selected ",1)):d("",!0)]),t("div",Sa,[t("table",Ta,[h[8]||(h[8]=t("thead",{class:"sticky top-0 bg-gray-50 dark:bg-gray-800 border-b border-default"},[t("tr",null,[t("th",{class:"w-10 px-4 py-2.5"}),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide"},"Test"),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide hidden sm:table-cell"}," File "),t("th",{class:"text-right px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide w-20"}," Occurrences ")])],-1)),t("tbody",null,[(s(!0),l(B,null,Q(n.affectedTestCases,L=>(s(),l("tr",{key:L.testCaseId,class:"border-b border-default/50 hover:bg-elevated transition-colors cursor-pointer",onClick:z=>E(L.testCaseId)},[t("td",ja,[t("input",{type:"checkbox",checked:e(y).has(L.testCaseId),class:"shrink-0 cursor-pointer accent-primary",onClick:h[0]||(h[0]=fe(()=>{},["stop"])),onChange:z=>E(L.testCaseId)},null,40,Ra)]),t("td",za,[t("p",Ua,a(L.title),1),r(M,{to:`/test-cases/${L.testCaseId}`,class:"text-[10px] text-primary hover:underline mt-0.5 inline-block",onClick:h[1]||(h[1]=fe(()=>{},["stop"]))},{default:p(()=>[...h[6]||(h[6]=[$(" View details ",-1)])]),_:1},8,["to"])]),t("td",Ea,[r(O,{"file-path":L.filePath,"project-key":n.projectKey,"project-name":n.projectName,class:"max-w-full"},null,8,["file-path","project-key","project-name"])]),t("td",Va,a(L.runCount),1)],8,Ia))),128)),n.affectedTestCases.length===0?(s(),l("tr",Aa,[...h[7]||(h[7]=[t("td",{colspan:"4",class:"px-4 py-8 text-center text-gray-400 text-sm"},"No test cases in this cluster.",-1)])])):d("",!0)])])]),t("div",Ma,[h[9]||(h[9]=t("label",{class:"text-xs font-medium text-gray-500 uppercase tracking-wide"},"Triage note (optional)",-1)),r(V,{modelValue:e(o),"onUpdate:modelValue":h[2]||(h[2]=L=>Z(o)?o.value=L:null),placeholder:"Add a note explaining why these tests were extracted…",rows:2,class:"text-sm w-full"},null,8,["modelValue"])]),e(g)?(s(),l("p",Na,[r(N,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+a(e(g)),1)])):d("",!0)])]),footer:p(()=>[t("div",Fa,[h[11]||(h[11]=t("div",{class:"flex-1"},null,-1)),r(H,{color:"neutral",variant:"ghost",disabled:e(i),onClick:h[3]||(h[3]=L=>C("update:open",!1))},{default:p(()=>[...h[10]||(h[10]=[$(" Cancel ",-1)])]),_:1},8,["disabled"]),r(H,{color:"warning",disabled:e(T)===0,loading:e(i),onClick:_},{default:p(()=>[$(" Extract"+a(e(T)>0?` ${e(T)}`:""),1)]),_:1},8,["disabled","loading"])])]),_:1},8,["open"])}}}),La=Object.assign(Ba,{__name:"ClusterExtractCasesModal"}),Da={key:0,class:"flex flex-col h-full min-h-0 max-xl:overflow-y-auto xl:overflow-hidden"},Pa={class:"border-b border-default shrink-0"},Oa={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4 p-1 xl:flex-1 xl:min-h-0 xl:overflow-hidden"},Ha={class:"space-y-4 xl:overflow-y-auto"},qa={class:"font-mono text-xs"},Ga=["innerHTML"],Ka={class:"inline-flex items-center gap-1.5"},Wa={class:"xl:overflow-y-auto"},Ja={key:1,class:"flex items-center justify-center h-64 text-gray-500"},Eo=ee({__name:"[id]",async setup(n){let R,m;const C=it(),f=parseInt(String(C.params.id)),y=zt(f),{data:o,refresh:i}=([R,m]=ct(()=>Vt(`/api/failure-clusters/${f}`,"$y4C0kntcH9")),R=await R,m(),R);ut(P(()=>({title:`${o.value?.signature??"Failure cluster"} — Piwi Dashboard`})));const g=v(o.value?.status??"open"),I=v(o.value?.triageNote??""),U=v(!1);ae(()=>o.value?.status,b=>{b&&(g.value=b)}),ae(()=>o.value?.triageNote,b=>{I.value=b??""});const E=P(()=>g.value!==(o.value?.status??"open")||I.value.trim()!==(o.value?.triageNote??""));async function T(){U.value=!0;try{await $fetch(`/api/failure-clusters/${f}/status`,{method:"PATCH",body:{status:g.value,triageNote:I.value.trim()||null}}),i()}finally{U.value=!1}}const _=v(!1);function j(){_.value=!1,i()}const{copyRich:h,copied:M}=We();function O(){const b=o.value;if(!b)return;const F=window.location.href,G=ne=>ne.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),K=[b.errorType,`${b.occurrences} occurrence${b.occurrences===1?"":"s"}`,`${b.affectedTests} test${b.affectedTests===1?"":"s"} affected`,b.status!=="open"?b.status:null].filter(Boolean).join(" · "),W=b.diagnosis?.status==="completed"&&b.diagnosis.summary?`AI diagnosis (${b.diagnosis.category??"unknown"}, ${b.diagnosis.confidence??"?"} confidence): ${b.diagnosis.summary}`:null,J=[`❌ Failure cluster: ${b.signature}`,K,"",...b.sampleError?["Sample error:",ve(b.sampleError),""]:[],...W?[W,""]:[],`Cluster: ${F}`].join(`
|
|
3
|
-
`),se=[`<p><strong>❌ Failure cluster</strong>: <code>${G(b.signature)}</code></p>`,`<p><em>${G(K)}</em></p>`,b.sampleError?`<p><strong>Sample error:</strong></p><pre>${he(b.sampleError)}</pre>`:"",W?`<p><strong>AI diagnosis</strong> (${G(b.diagnosis?.category??"unknown")}, ${G(b.diagnosis?.confidence??"?")} confidence):<br>${G(b.diagnosis.summary)}</p>`:"",`<p>🔗 <a href="${F}">View failure cluster</a></p>`].join("");h(J,se,{toast:"Failure cluster copied"})}const V=P(()=>{const b=o.value?.sampleError;return b?ve(b).split(`
|
|
4
|
-
`).find(F=>F.trim())??"":""}),{scmStatus:N}=Ie(y.coverage),H=P(()=>Et((o.value?.affectedTestCases??[]).map(b=>({filePath:b.filePath,title:b.title,line:null,projectName:null})))),{copy:A,copied:L}=At(),z=v(null),c=v(null),w=v(null),D=v(null),q=v(null),X=v(null),k={sampleError:()=>z.value,executionError:()=>z.value,environmentDiff:()=>D.value,visualDiff:()=>q.value,domSnapshot:()=>X.value,scmInvestigation:()=>w.value,selectedCommits:()=>w.value,topSuspectedCommit:()=>w.value,failingAction:()=>w.value,affectedTests:()=>c.value,testSource:()=>c.value,sourceFiles:()=>c.value,steps:()=>c.value,failingSteps:()=>c.value,console:()=>c.value,networkRequests:()=>c.value,serverTraces:()=>c.value,ariaSnapshot:()=>c.value,screenshots:()=>c.value,tracePointers:()=>c.value,artifacts:()=>c.value};dt(kt,{canLocate:b=>b in k,open:b=>k[b]?.()?.reveal()});const u=P(()=>[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...o.value?.project?[{label:o.value.project.label||o.value.project.name||"Project",to:`/projects/${o.value.project.id}?tab=failure-clusters`}]:[{label:"Project"}],{label:`Failure cluster #${f}`}]);return(b,F)=>{const G=Le,K=De,W=et,J=ie,se=Ce,ne=ft,ue=os,x=Je,oe=Ze,je=Qe,Re=Xe,ze=Ye,Ue=xe,Ee=ce,Ve=Ss,Ae=te,Me=ba,Ne=Ut,Fe=mt,Be=La;return s(),l(B,null,[r(Fe,{id:"failure-cluster-detail"},{header:p(()=>[r(ne,null,{leading:p(()=>[r(G),r(K,{items:e(u)},null,8,["items"])]),right:p(()=>[e(o)?(s(),S(W,{key:0,endpoint:`/api/failure-clusters/${e(o).id}/export`,"base-name":`piwi-cluster-${e(o).id}`},null,8,["endpoint","base-name"])):d("",!0),e(o)?(s(),S(se,{key:1,text:e(M)?"Copied!":"Copy failure cluster"},{default:p(()=>[r(J,{size:"sm",variant:"ghost",color:"neutral",icon:e(M)?"i-lucide-check":"i-lucide-clipboard",onClick:O},null,8,["icon"])]),_:1},8,["text"])):d("",!0)]),_:1})]),body:p(()=>[e(o)?(s(),l("div",Da,[t("div",Pa,[r(ue,{cluster:e(o),"triage-status":e(g),"triage-note":e(I),"triage-saving":e(U),"triage-changed":e(E),"onUpdate:triageStatus":F[0]||(F[0]=le=>g.value=le),"onUpdate:triageNote":F[1]||(F[1]=le=>I.value=le),onSaveTriage:T},null,8,["cluster","triage-status","triage-note","triage-saving","triage-changed"])]),t("div",Oa,[t("div",Ha,[e(o).sampleError?(s(),S(x,{key:0,ref_key:"errorSection",ref:z,"storage-key":"cluster-error",icon:"i-lucide-circle-x","icon-class":"text-red-500",title:"Error message"},{folded:p(()=>[t("span",qa,a(e(V)),1)]),default:p(()=>[t("div",{class:"text-xs font-mono overflow-x-auto whitespace-pre-wrap",innerHTML:e(he)(e(o).sampleError)},null,8,Ga)]),_:1},512)):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(oe,{key:1,ref:"locatorSection","storage-key":"cluster-locators","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId,"affected-count":e(o).affectedTestCases.length},null,8,["run-id","test-runs-case-id","affected-count"])):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(je,{key:2,ref_key:"envDiffSection",ref:D,"storage-key":"cluster-env-diff","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Re,{key:3,ref_key:"visualDiffSection",ref:q,"storage-key":"cluster-visual-diff","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(ze,{key:4,ref_key:"domSnapshotSection",ref:X,"storage-key":"cluster-dom-snapshot","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(o).affectedTestCases?.length?(s(),S(x,{key:5,ref_key:"evidenceSection",ref:c,"storage-key":"cluster-evidence",icon:"i-lucide-flask-conical",title:"Test evidence",help:"cluster.evidence"},{folded:p(()=>[$(a(e(o).affectedTests)+" "+a(e(o).affectedTests===1?"test":"tests")+" · "+a(e(o).occurrences)+" occurrence"+a(e(o).occurrences===1?"":"s")+" · ",1),e(o).affectedTestCases[0]?.filePath?(s(),S(Ue,{key:0,"file-path":e(o).affectedTestCases[0].filePath,"project-key":e(o).project?.id,"project-name":e(o).project?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])):d("",!0)]),actions:p(()=>[r(Ee,{color:"neutral",variant:"subtle",size:"sm"},{default:p(()=>[$(a(e(o).affectedTestCases.length)+" "+a(e(o).affectedTestCases.length===1?"test":"tests"),1)]),_:1}),r(J,{size:"xs",variant:"outline",color:"neutral",icon:e(L)?"i-lucide-check":"i-lucide-play",title:e(L)?"Copied!":("copyPreview"in b?b.copyPreview:e(wt))(e(H)),onClick:F[2]||(F[2]=le=>e(A)(e(H),{toast:"Retry command copied"}))},{default:p(()=>[...F[5]||(F[5]=[$(" Copy retry command ",-1)])]),_:1},8,["icon","title"]),r(se,{text:"Unlink incorrectly clustered test cases from this group"},{default:p(()=>[r(J,{size:"xs",color:"warning",variant:"outline",icon:"i-lucide-arrow-up-from-line",onClick:F[3]||(F[3]=le=>_.value=!0)},{default:p(()=>[...F[6]||(F[6]=[$(" Extract ",-1)])]),_:1})]),_:1})]),default:p(()=>[r(Ve,{"affected-test-cases":e(o).affectedTestCases,"project-key":e(o).project?.id,"project-name":e(o).project?.name},null,8,["affected-test-cases","project-key","project-name"])]),_:1},512)):d("",!0),r(x,{ref_key:"scmSection",ref:w,"storage-key":"cluster-scm",icon:"i-lucide-git-compare-arrows",title:"What changed",help:"cluster.scm"},{folded:p(()=>[t("span",Ka,[r(Ae,{name:e(N).icon,class:Y(["size-3.5 shrink-0",e(N).color])},null,8,["name","class"]),t("span",{class:Y(e(N).color)},a(e(N).text),3)])]),default:p(()=>[r(Me)]),_:1},512)]),t("div",Wa,[r(Ne,{"cluster-id":e(f),"last-seen-run-id":e(o)?.lastSeenRunId,"affected-test-cases":e(o)?.affectedTestCases??[]},null,8,["cluster-id","last-seen-run-id","affected-test-cases"])])])])):(s(),l("div",Ja,"Cluster not found."))]),_:1}),e(o)?(s(),S(Be,{key:0,open:e(_),"cluster-id":e(f),"affected-test-cases":e(o).affectedTestCases??[],"project-key":e(o).project?.id,"project-name":e(o).project?.name,"onUpdate:open":F[4]||(F[4]=le=>_.value=le),onExtracted:j},null,8,["open","cluster-id","affected-test-cases","project-key","project-name"])):d("",!0)],64)}}});export{Eo as default};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{b as ie,H,B as ye,am as he,r as x,h as Q,an as be,M as Ve,d as _e,k as e,o as m,c as h,j as u,p as ke,m as C,i as a,t as $,g as B,_ as Ce,F as K,y as oe,q as J,v as T,A as qe,f as G,l as He,D as We,K as Ye}from"./Du2W7Jne.js";import{_ as Xe}from"./Bm62iDV5.js";import{i as Ge,d as Ke,h as Qe,g as Je,e as Ze,f as et,j as tt}from"./Cnsmicv2.js";import{_ as st}from"./DsesNydr.js";import{f as we,n as nt}from"./DuwtTfO8.js";import{_ as at}from"./BrQEE053.js";import{f as ot}from"./D-c8ZSws.js";import{u as it}from"./CIrFl3MW.js";const rt=globalThis.setInterval,re=Symbol("cluster-diagnosis");function lt(g){const b=ie(),o=x(""),r=x(""),k=x([]),S=x([]),_=Q(()=>!!r.value),R=x(null),P=x([]),E=x(0),U=x(0),O=x(null),l=x(null),p=x(!1),s=x(null),i=x(!1);let c=null,f=null,d=!0;function z(){const n={};return o.value.trim()&&(n.baseCommit=o.value.trim()),k.value.length&&(n.selectedCommitShas=k.value),n}async function D(){p.value=!0;try{const n=await $fetch(`/api/failure-clusters/${g}/context`,{query:{...z(),format:"json"}});R.value=n.text,P.value=n.sections,E.value=n.tokenEstimate,U.value=n.imageTokenEstimate??0,O.value=n.coverage,l.value=n.scmChanges??null}catch{R.value="(failed to load context)",P.value=[],E.value=0,U.value=0,O.value=null,l.value=null}finally{p.value=!1}}async function I(n){try{await $fetch(`/api/failure-clusters/${g}/base-commit`,{method:"PATCH",body:{commit:n||null}}),r.value=n}catch{}}function M(){c&&(clearInterval(c),c=null)}function j(){if(c)return;let n=0;c=rt(async()=>{n+=3e3,await q(),(!s.value||s.value.status!=="running"||n>=12e4)&&M()},3e3)}async function q(){try{const n=await $fetch(`/api/failure-clusters/${g}/diagnosis`);s.value=n.diagnosis}catch{}}async function W(n={}){i.value=!0;try{const w=n.force?`/api/failure-clusters/${g}/diagnose?force=true`:`/api/failure-clusters/${g}/diagnose`,F={};n.additionalContext&&(F.additionalContext=n.additionalContext),o.value.trim()&&(F.baseCommit=o.value.trim()),k.value.length&&(F.selectedCommitShas=k.value),n.images?.length&&(F.images=n.images),s.value=await $fetch(w,{method:"POST",body:Object.keys(F).length?F:void 0}),s.value?.status==="running"&&j()}catch(w){w?.statusCode===409?j():b.add({title:"Diagnosis failed",description:String(w?.message??w),color:"error"})}finally{i.value=!1}}return H(o,n=>{d||(f&&clearTimeout(f),f=setTimeout(()=>D(),900),n!==r.value&&I(n))}),H(k,()=>{d||D()},{deep:!0}),H(s,n=>{n?.status==="running"?j():M()}),ye(async()=>{try{const n=await $fetch(`/api/failure-clusters/${g}/diagnosis`);s.value=n.diagnosis,n.manualBaseCommit&&(r.value=n.manualBaseCommit,o.value=n.manualBaseCommit);const w=n.diagnosis?.details;w?.selectedCommitShas&&Array.isArray(w.selectedCommitShas)&&(k.value=w.selectedCommitShas),w?.autoSelectedCommits&&Array.isArray(w.autoSelectedCommits)&&(S.value=w.autoSelectedCommits)}catch{}d=!1,D(),s.value?.status==="running"&&j()}),he(()=>{M(),f&&clearTimeout(f)}),{clusterId:g,baseCommit:o,savedBaseCommit:r,selectedCommitShas:k,autoSelectedCommits:S,baseCommitIsPinned:_,contextText:R,contextSections:P,tokenEstimate:E,imageTokenEstimate:U,coverage:O,scmChanges:l,contextLoading:p,refreshContext:D,diagnosis:s,posting:i,runDiagnosis:W}}function ct(g){const b=lt(g);return Ve(re,b),b}function As(){const g=be(re);if(!g)throw new Error("useClusterDiagnosis() must be used under a page that called provideClusterDiagnosis()");return g}function ut(g){const b=be(re,null);if(b)return b;if(g==null)throw new Error("useOrProvideClusterDiagnosis() requires a clusterId when used outside provideClusterDiagnosis()");return ct(g)}const dt={key:0,class:"flex items-center gap-1.5 text-xs text-gray-400 py-1"},ft={key:1,class:"space-y-1.5"},mt={class:"flex items-center justify-between"},gt={class:"text-xs font-medium text-gray-500"},pt={class:"text-gray-400 font-normal"},vt={class:"flex gap-0.5"},xt={class:"grid grid-cols-4 gap-1.5"},yt=["onClick"],ht={class:"relative"},bt=["src","alt"],_t={class:"absolute top-0.5 right-0.5"},kt={class:"px-1 py-0.5 bg-elevated space-y-0.5"},Ct=["title"],wt={class:"flex items-center gap-1 flex-wrap"},St={key:0,class:"text-[8px] text-gray-400 leading-tight"},Tt={key:1,class:"text-[8px] text-gray-400 leading-tight truncate"},$t={key:2,class:"text-[8px] text-gray-400 leading-tight ml-auto"},xe=8,Dt=_e({__name:"DiagnosisScreenshots",props:{affectedTestCases:{}},emits:["update:images"],setup(g,{emit:b}){const o=g,r=b,k=qe();async function S(s){const i=(s.type||"image/webp").split(";")[0].trim();return new Promise((c,f)=>{const d=new FileReader;d.onload=()=>{const z=d.result.split(",")[1];z!=null?c({data:z,mediaType:i}):f(new Error("Failed to read blob"))},d.onerror=f,d.readAsDataURL(s)})}const _=x([]),R=x(!1);async function P(){if(!o.affectedTestCases.length)return;R.value=!0,_.value=[];const s=[];for(const i of o.affectedTestCases){if(s.length>=xe)break;try{const c=await $fetch(`/api/test-run-cases/${i.recentTestRunsCaseId}`);for(const f of c.attachments??[]){if(!Ge(f.path,f.contentType))continue;if(s.length>=xe)break;const d=f.name||f.path.split("/").pop()||"screenshot",z=nt(f.path,f.contentType,k.app?.baseURL,!0);try{const D=await fetch(z);if(!D.ok)continue;const I=await D.blob(),{data:M,mediaType:j}=await S(I);s.push({src:`data:${j};base64,${M}`,data:M,mediaType:j,name:d,selected:!0,caseTitle:i.title,status:c.status,retries:c.retries,browser:c.browser,startTime:c.testRun?.startTime??null})}catch{}}}catch{}}_.value=s,R.value=!1,E()}function E(){r("update:images",_.value.filter(s=>s.selected).map(({name:s,mediaType:i,data:c})=>({name:s,mediaType:i,data:c})))}function U(s){_.value[s].selected=!_.value[s].selected,E()}function O(){_.value.forEach(s=>s.selected=!0),E()}function l(){_.value.forEach(s=>s.selected=!1),E()}const p=Q(()=>_.value.filter(s=>s.selected).length);return ye(P),(s,i)=>{const c=ke,f=Ce;return e(R)?(m(),h("div",dt,[u(c,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),i[0]||(i[0]=C(" Loading screenshots from test evidence… ",-1))])):e(_).length?(m(),h("div",ft,[a("div",mt,[a("span",gt,[i[1]||(i[1]=C(" Test screenshots ",-1)),a("span",pt,"("+$(e(p))+"/"+$(e(_).length)+" will be sent to AI)",1)]),a("div",vt,[u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:O},{default:B(()=>[...i[2]||(i[2]=[C("All",-1)])]),_:1}),u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:l},{default:B(()=>[...i[3]||(i[3]=[C("None",-1)])]),_:1})])]),a("div",xt,[(m(!0),h(K,null,oe(e(_),(d,z)=>(m(),h("div",{key:z,class:J(["cursor-pointer rounded overflow-hidden border-2 transition-all",d.selected?"border-primary":"border-default opacity-50"]),onClick:D=>U(z)},[a("div",ht,[a("img",{src:d.src,alt:d.name,class:"w-full h-14 object-cover object-top"},null,8,bt),a("div",_t,[u(c,{name:d.selected?"i-lucide-check-circle-2":"i-lucide-circle",class:J(["size-3.5 drop-shadow",d.selected?"text-primary":"text-gray-300"])},null,8,["name","class"])])]),a("div",kt,[a("p",{class:"text-[9px] text-gray-700 dark:text-gray-300 truncate font-medium leading-tight",title:d.caseTitle},$(d.caseTitle),9,Ct),a("div",wt,[a("span",{class:J(["text-[8px] px-1 rounded leading-tight font-medium",d.status==="passed"?"bg-success/15 text-success":d.status==="failed"?"bg-error/15 text-error":"bg-neutral/15 text-gray-500"])},$(d.status),3),d.retries>0?(m(),h("span",St,"retry "+$(d.retries),1)):T("",!0),d.browser?(m(),h("span",Tt,$(d.browser),1)):T("",!0),d.startTime?(m(),h("span",$t,$(e(we)(d.startTime)),1)):T("",!0)])])],10,yt))),128))])])):T("",!0)}}}),At=Object.assign(Dt,{__name:"DiagnosisScreenshots"});function zt(g){const b=x(""),o=x(null),r=x("idle"),k=x(null),S=x(null);let _=null;function R(){_&&(_.abort(),_=null),r.value==="streaming"&&(r.value="cancelled")}function P(){R(),b.value="",o.value=null,r.value="idle",k.value=null,S.value=null}async function E(l={}){b.value="",o.value=null,S.value=null,k.value=null,r.value="streaming";const p=e(g);_=new AbortController;const s=new URLSearchParams;l.force&&s.set("force","true");const i=`/api/failure-clusters/${p}/diagnose/stream${s.toString()?"?"+s.toString():""}`;try{const c=await $fetch.raw(i,{method:"POST",body:{additionalContext:l.additionalContext,images:l.images,baseCommit:l.baseCommit,selectedCommitShas:l.selectedCommitShas,scope:l.scope,testRunsCaseId:l.testRunsCaseId},responseType:"stream",signal:_.signal,ignoreResponseError:!0}),f=c._data??c.body;if(!f)throw new Error("No response body from streaming endpoint");let d;if(f instanceof ReadableStream)d=f.getReader();else if(f instanceof Uint8Array||f instanceof ArrayBuffer){const M=new TextDecoder().decode(f instanceof ArrayBuffer?new Uint8Array(f):f);O(M),r.value==="streaming"&&(r.value="error",S.value="Stream ended without a result event");return}else if(typeof f?.getReader=="function")d=f.getReader();else if(f?.pipeThrough)d=f.getReader();else throw new Error("Unsupported stream response format");const z=new TextDecoder;let D="";for(;;){const{done:I,value:M}=await d.read();if(I)break;D+=z.decode(M,{stream:!0});const j=D.split(`
|
|
2
|
-
|
|
3
|
-
`);D=j.pop()||"";let q=!1;for(const W of j){const n=U(W);if(n){if(n.event==="result")k.value=n.data,r.value="complete",q=!0;else if(n.event==="thinking"){const w=n.data;b.value+=w.text}else if(n.event==="stage")o.value=n.data.stage;else if(n.event==="error"){const w=n.data;S.value=w.message,r.value="error"}}}if(q)break}if(D.trim()){const I=U(D.trim());I&&(I.event==="result"?(k.value=I.data,r.value="complete"):I.event==="error"&&(S.value=I.data.message,r.value="error"))}r.value==="streaming"&&(S.value||(r.value="complete"))}catch(c){if(c?.name==="AbortError"){r.value="cancelled";return}S.value=String(c?.message??c),r.value="error"}finally{_=null}}function U(l){if(!l.trim())return null;const p=l.split(`
|
|
4
|
-
`);let s="message",i="";for(const c of p)c.startsWith("event: ")?s=c.slice(7).trim():c.startsWith("data: ")?i+=c.slice(6):c.startsWith(":");if(!i)return null;try{return{event:s,data:JSON.parse(i)}}catch{return{event:s,data:i}}}function O(l){const p=l.split(`
|
|
5
|
-
|
|
6
|
-
`);for(const s of p){const i=U(s);if(i)if(i.event==="result")k.value=i.data,r.value="complete";else if(i.event==="thinking"){const c=i.data;b.value+=c.text}else i.event==="stage"?o.value=i.data.stage:i.event==="error"&&(S.value=i.data.message,r.value="error")}}return he(()=>{R()}),{thinkingText:b,stage:o,status:r,result:k,error:S,startStream:E,cancel:R,reset:P}}const Rt=200*1024,Et=5*1024*1024,It=["image/jpeg","image/png","image/gif","image/webp"];function Bt(g){return new Promise((b,o)=>{const r=new FileReader;r.onload=()=>{const k=r.result.split(",")[1];k!==void 0?b(k):o(new Error("Failed to read file"))},r.onerror=o,r.readAsDataURL(g)})}function Pt(){const g=ie(),b=x([]),o=x([]),r=x(!1);async function k(l){for(const p of Array.from(l))if(It.includes(p.type)){if(p.size>Et){g.add({title:"Image too large",description:`${p.name} exceeds 5 MB`,color:"error"});continue}const s=await Bt(p),i=`data:${p.type};base64,${s}`;o.value.push({name:p.name,mediaType:p.type,data:s,preview:i,size:p.size})}else{if(p.size>Rt){g.add({title:"File too large",description:`${p.name} exceeds 200 KB`,color:"error"});continue}const s=await p.text();b.value.push({name:p.name,content:s,size:p.size})}}function S(l){l.preventDefault(),r.value=!0}function _(l){l.currentTarget?.contains(l.relatedTarget)||(r.value=!1)}function R(l){l.preventDefault(),r.value=!1,l.dataTransfer?.files?.length&&k(l.dataTransfer.files)}function P(l){b.value.splice(l,1)}function E(l){o.value.splice(l,1)}function U(){return b.value.length?`## Attached Files
|
|
7
|
-
|
|
8
|
-
${b.value.map(p=>`### ${p.name}
|
|
9
|
-
\`\`\`
|
|
10
|
-
${p.content}
|
|
11
|
-
\`\`\``).join(`
|
|
12
|
-
|
|
13
|
-
`)}`:""}function O(){return o.value.map(l=>({name:l.name,mediaType:l.mediaType,data:l.data}))}return{files:b,images:o,dragOver:r,processFiles:k,onDragOver:S,onDragLeave:_,onDrop:R,removeFile:P,removeImage:E,filesMarkdown:U,imagesPayload:O}}const Ut={class:"space-y-4"},jt={class:"pb-2 border-b border-default"},Ft={class:"flex items-center justify-between gap-2"},Ot={class:"flex items-center gap-1.5"},Mt={class:"text-xs text-gray-400"},Lt={class:"flex items-center gap-1.5"},Nt={key:0,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-elevated/50 border border-default text-xs"},Vt={class:"text-gray-500"},qt={key:1,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-elevated/50 border border-default text-xs"},Ht={class:"flex items-center gap-1 mb-1"},Wt={key:0,class:"text-primary"},Yt={key:0},Xt={class:"flex items-center gap-2 px-3 pb-2 pt-1 border-t border-default"},Gt={key:0,class:"text-xs text-primary"},Kt={key:1,class:"text-xs text-gray-400"},Qt={key:0,class:"flex flex-wrap gap-2"},Jt={class:"max-w-40 truncate"},Zt={class:"text-gray-400"},es=["onClick"],ts={key:1,class:"flex flex-wrap gap-2"},ss=["src","alt"],ns={class:"absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity rounded-lg flex items-center justify-center"},as=["onClick"],os={class:"text-xs text-gray-500 text-center mt-0.5 w-16 truncate"},is={key:3,class:"pt-1"},rs={key:4,class:"rounded-lg border border-default overflow-hidden"},ls={class:"flex items-center justify-between gap-2 px-3 py-2 bg-elevated/30 border-b border-default"},cs={class:"flex items-center gap-2 text-sm text-gray-500"},us={key:0,class:"inline-flex items-center gap-1 text-xs text-gray-400"},ds={key:1,class:"text-gray-400 italic"},fs={class:"px-3 py-1.5 border-t border-default text-xs text-gray-400 flex items-center gap-2"},ms={key:5,class:"rounded-lg border border-warning/40 bg-warning/5 p-3 space-y-2"},gs={class:"flex items-center gap-2 text-sm"},ps={class:"flex items-center gap-2 pt-1"},vs={class:"text-xs text-gray-400"},xs={key:4,class:"flex flex-col items-center justify-center p-8 text-center text-gray-400 border border-dashed border-default rounded-lg"},ys={class:"text-sm inline-flex items-center gap-1"},hs={class:"pt-1 text-center"},bs=_e({__name:"DiagnosisPanel",props:{clusterId:{},lastSeenRunId:{},affectedTestCases:{}},setup(g){const b=g,{diagnosis:o,posting:r,contextText:k,contextSections:S,tokenEstimate:_,imageTokenEstimate:R,contextLoading:P,coverage:E,baseCommit:U,selectedCommitShas:O,refreshContext:l,runDiagnosis:p}=ut(b.clusterId),{aiStatus:s}=Ke();ie();const{permission:i,active:c,requestPermission:f,toggleEnabled:d}=it(),{thinkingText:z,stage:D,status:I,result:M,error:j,startStream:q,cancel:W}=zt(Q(()=>b.clusterId??0)),n=Pt(),{files:w,images:F,dragOver:le,processFiles:Se,onDragOver:ce,onDragLeave:ue,onDrop:de,removeFile:Te,removeImage:$e}=n,L=x(""),fe=x(null),me=x([]),Z=Q(()=>[...me.value,...F.value.length?n.imagesPayload():[]]),V=x(!1),Y=x(!1),se=x(null),ee=x(null);function ge(v){se.value=v,V.value=!0}const De=Q(()=>{const v=o.value?.details;if(!v)return[];const t=[];if(Array.isArray(v.evidence)&&t.push(...v.evidence),Array.isArray(v.hypotheses))for(const A of v.hypotheses)Array.isArray(A?.evidence)&&t.push(...A.evidence);return tt(t)});H(z,()=>{Ye(()=>{ee.value&&(ee.value.scrollTop=ee.value.scrollHeight)})}),H(M,v=>{v&&(o.value=v)}),H(()=>o.value?.details,v=>{if(!v)return;const t=v;typeof t.additionalContext=="string"&&t.additionalContext.trim()&&!L.value&&(L.value=t.additionalContext)},{immediate:!0});function Ae(v){L.value=L.value?`${L.value}
|
|
14
|
-
|
|
15
|
-
${v}`:v,Y.value=!0}function pe(){const v=[];L.value.trim()&&v.push(L.value.trim());const t=n.filesMarkdown();return t&&v.push(t),v.join(`
|
|
16
|
-
|
|
17
|
-
`)}async function ne(v=!1){await q({force:v,additionalContext:pe()||void 0,baseCommit:U.value.trim()||void 0,selectedCommitShas:O.value.length?[...O.value]:void 0,images:Z.value.length?Z.value:void 0})}async function ze(v=!1){await p({force:v,additionalContext:pe()||void 0,images:Z.value.length?Z.value:void 0})}function Re(){o.value=null}function ve(v){return v.status==="running"&&Date.now()-new Date(v.updatedAt).getTime()>300*1e3}function te(){return I.value==="streaming"}function Ee(){return!te()&&(!o.value||o.value.status==="failed"||ve(o.value))}function Ie(){return!te()&&o.value&&(o.value.status==="completed"||o.value.status==="failed")}return(v,t)=>{const A=ke,ae=Xe,Be=Qe,N=Ce,Pe=Ze,Ue=Je,je=st,Fe=At,Oe=at,Me=et,Le=We;return m(),h("div",Ut,[a("div",jt,[a("div",Ft,[a("div",Ot,[u(A,{name:"i-lucide-sparkles",class:"size-4 text-primary shrink-0"}),t[17]||(t[17]=a("span",{class:"text-sm font-semibold"},"Diagnosis",-1)),u(ae,{topic:"cluster.diagnosis"}),a("span",Mt,[t[15]||(t[15]=C(" — ",-1)),u(A,{name:"i-lucide-triangle-alert",class:"size-3 shrink-0 inline"}),t[16]||(t[16]=C(" AI-generated, verify before applying ",-1))])]),a("div",Lt,[u(Be,{"context-endpoint":`/api/failure-clusters/${g.clusterId}/context`},null,8,["context-endpoint"]),u(N,{icon:e(V)?"i-lucide-eye-off":"i-lucide-eye",size:"xs",color:"neutral",variant:"outline",loading:e(P),onClick:t[0]||(t[0]=y=>V.value=!e(V))},{default:B(()=>[C($(e(V)?"Hide context":"Show context"),1)]),_:1},8,["icon","loading"]),e(o)&&e(o).status==="completed"?(m(),G(N,{key:0,icon:"i-lucide-refresh-cw",size:"xs",color:"primary",variant:"soft",loading:e(r),onClick:t[1]||(t[1]=y=>ne(!0))},{default:B(()=>[...t[18]||(t[18]=[C(" Re-diagnose ",-1)])]),_:1},8,["loading"])):T("",!0)])])]),e(i)==="granted"&&e(s)?.configured?(m(),h("div",Nt,[u(A,{name:"i-lucide-bell",class:J(["size-3.5 shrink-0",e(c)?"text-primary":"text-gray-400"])},null,8,["class"]),a("span",Vt,$(e(c)?"Diagnosis notifications on":"Diagnosis notifications off"),1),u(N,{size:"xs",color:e(c)?"neutral":"primary",variant:"outline",onClick:e(d)},{default:B(()=>[C($(e(c)?"Disable":"Enable"),1)]),_:1},8,["color","onClick"])])):e(i)==="default"&&e(s)?.configured?(m(),h("div",qt,[u(A,{name:"i-lucide-bell",class:"size-3.5 text-gray-400 shrink-0"}),t[20]||(t[20]=a("span",{class:"text-gray-500"},"Notify when diagnosis completes?",-1)),u(N,{size:"xs",color:"neutral",variant:"outline",onClick:e(f)},{default:B(()=>[...t[19]||(t[19]=[C("Enable",-1)])]),_:1},8,["onClick"])])):T("",!0),e(s)?.configured?(m(),G(Pe,{key:2,sections:e(S),"not-applicable":e(E)?.notApplicable,"token-estimate":e(_),loading:e(P),onViewSection:ge,onOpen:t[2]||(t[2]=y=>V.value=!0)},null,8,["sections","not-applicable","token-estimate","loading"])):T("",!0),u(Ue,{open:e(V),sections:e(S),"token-estimate":e(_),"image-token-estimate":e(R),loading:e(P),"focus-section":e(se),"cited-sections":e(De),"not-applicable-sections":e(E)?.notApplicable,"onUpdate:open":t[3]||(t[3]=y=>{V.value=y,y||(se.value=null)}),onRefresh:e(l)},null,8,["open","sections","token-estimate","image-token-estimate","loading","focus-section","cited-sections","not-applicable-sections","onRefresh"]),e(s)?.configured?(m(),h(K,{key:3},[a("div",null,[a("div",Ht,[a("button",{class:"flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 text-left",onClick:t[4]||(t[4]=y=>Y.value=!e(Y))},[u(A,{name:e(Y)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5"},null,8,["name"]),t[21]||(t[21]=C(" Additional context ",-1)),e(w).length||e(F).length||e(L).trim()?(m(),h("span",Wt," ("+$(e(w).length+e(F).length+(e(L).trim()?1:0))+") ",1)):T("",!0)]),u(ae,{topic:"cluster.context-input"})]),e(Y)?(m(),h("div",Yt,[a("div",{class:J(["rounded-lg border-2 transition-colors",e(le)?"border-primary bg-primary/5 border-solid":"border-dashed border-default"]),onDragover:t[8]||(t[8]=(...y)=>e(ce)&&e(ce)(...y)),onDragleave:t[9]||(t[9]=(...y)=>e(ue)&&e(ue)(...y)),onDrop:t[10]||(t[10]=(...y)=>e(de)&&e(de)(...y))},[u(je,{modelValue:e(L),"onUpdate:modelValue":t[5]||(t[5]=y=>He(L)?L.value=y:null),placeholder:"e.g. We deployed a new auth middleware yesterday\\u2026",rows:3,class:"w-full text-sm border-0 bg-transparent focus:ring-0"},null,8,["modelValue"]),a("div",Xt,[a("input",{ref_key:"fileInputRef",ref:fe,type:"file",multiple:"",class:"hidden",accept:".txt,.log,.md,.json,.ts,.js,.py,.sql,.xml,.yaml,.yml,.html,.css,.env,image/*",onChange:t[6]||(t[6]=y=>e(Se)(y.target.files))},null,544),u(N,{icon:"i-lucide-paperclip",size:"xs",color:"neutral",variant:"ghost",onClick:t[7]||(t[7]=y=>e(fe)?.click())},{default:B(()=>[...t[22]||(t[22]=[C(" Attach files ",-1)])]),_:1}),e(le)?(m(),h("span",Gt,"Drop files here\\u2026")):(m(),h("span",Kt,"or drag & drop text files and images"))])],34)])):T("",!0)]),e(w).length?(m(),h("div",Qt,[(m(!0),h(K,null,oe(e(w),(y,X)=>(m(),h("div",{key:X,class:"flex items-center gap-1.5 bg-elevated rounded-full px-2.5 py-1 text-xs border border-default"},[u(A,{name:"i-lucide-file-text",class:"size-3 text-gray-500 shrink-0"}),a("span",Jt,$(y.name),1),a("span",Zt,$(("formatBytes"in v?v.formatBytes:e(ot))(y.size)),1),a("button",{class:"text-gray-400 hover:text-error ml-0.5",onClick:Ne=>e(Te)(X)},[u(A,{name:"i-lucide-x",class:"size-3"})],8,es)]))),128))])):T("",!0),e(F).length?(m(),h("div",ts,[(m(!0),h(K,null,oe(e(F),(y,X)=>(m(),h("div",{key:X,class:"relative group"},[a("img",{src:y.preview,alt:y.name,class:"h-16 w-16 object-cover rounded-lg border border-default"},null,8,ss),a("div",ns,[a("button",{class:"text-white",onClick:Ne=>e($e)(X)},[u(A,{name:"i-lucide-x",class:"size-4"})],8,as)]),a("p",os,$(y.name),1)]))),128))])):T("",!0),g.affectedTestCases?.length?(m(),G(Fe,{key:2,"affected-test-cases":g.affectedTestCases,"onUpdate:images":t[11]||(t[11]=y=>me.value=y)},null,8,["affected-test-cases"])):T("",!0),Ee()?(m(),h("div",is,[u(N,{icon:"i-lucide-sparkles",size:"sm",color:"primary",variant:"solid",loading:e(r),onClick:t[12]||(t[12]=y=>ne())},{default:B(()=>[...t[23]||(t[23]=[C(" Diagnose with AI ",-1)])]),_:1},8,["loading"])])):T("",!0),te()?(m(),h("div",rs,[a("div",ls,[a("div",cs,[u(A,{name:"i-lucide-loader-2",class:"size-4 animate-spin text-primary"}),t[24]||(t[24]=a("span",null,"Analyzing failure cluster",-1)),e(D)?(m(),h("span",us,[u(A,{name:"i-lucide-workflow",class:"size-3"}),C(" "+$(e(D)==="research"?"Researching patterns":"Diagnosing root cause"),1)])):T("",!0)]),u(N,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Cancel diagnosis",onClick:e(W)},null,8,["onClick"])]),a("div",{ref_key:"thinkingContainer",ref:ee,class:"max-h-64 overflow-y-auto p-3 text-xs font-mono leading-relaxed whitespace-pre-wrap break-words text-gray-600 dark:text-gray-400 bg-elevated/10"},[e(z)?(m(),h(K,{key:0},[C($(e(z))+" ",1),t[25]||(t[25]=a("span",{class:"inline-block w-2 h-4 bg-primary/60 animate-pulse ml-0.5 align-text-bottom"},null,-1))],64)):(m(),h("span",ds,"Waiting for model response\\u2026"))],512),a("div",fs,[u(A,{name:"i-lucide-file-text",class:"size-3"}),a("span",null,$(e(z).length.toLocaleString())+" characters received",1)])])):T("",!0),e(o)?.status==="running"&&!ve(e(o))&&!te()?(m(),h("div",ms,[a("div",gs,[u(A,{name:"i-lucide-alert-triangle",class:"size-4 text-warning shrink-0"}),t[26]||(t[26]=a("span",{class:"font-medium text-warning-700 dark:text-warning-400"},"Diagnosis was interrupted",-1))]),t[29]||(t[29]=a("p",{class:"text-xs text-gray-500"}," A previous diagnosis started but never completed — the server may have restarted. You can restart it below. ",-1)),a("div",ps,[u(N,{icon:"i-lucide-refresh-cw",size:"xs",color:"warning",variant:"solid",loading:e(r),onClick:t[13]||(t[13]=y=>ne(!0))},{default:B(()=>[...t[27]||(t[27]=[C(" Restart diagnosis ",-1)])]),_:1},8,["loading"]),u(N,{size:"xs",color:"neutral",variant:"ghost",loading:e(r),onClick:Re},{default:B(()=>[...t[28]||(t[28]=[C(" Dismiss ",-1)])]),_:1},8,["loading"])]),a("p",vs,"Started "+$(e(we)(e(o).updatedAt)),1)])):T("",!0),e(j)?(m(),G(Oe,{key:6,color:"error",icon:"i-lucide-alert-circle",title:"Streaming diagnosis failed",description:e(j),class:"mt-2"},{actions:B(()=>[u(N,{size:"xs",color:"neutral",variant:"outline",onClick:t[14]||(t[14]=y=>ze(!0))},{default:B(()=>[...t[30]||(t[30]=[C(" Retry (fallback) ",-1)])]),_:1})]),_:1},8,["description"])):T("",!0),Ie()?(m(),G(Me,{key:7,diagnosis:e(o),"last-seen-run-id":g.lastSeenRunId,onViewSection:ge,onPrefillContext:Ae},null,8,["diagnosis","last-seen-run-id"])):T("",!0)],64)):(m(),h("div",xs,[u(A,{name:"i-lucide-sparkles",class:"size-8 mb-2 opacity-30"}),a("p",ys,[t[31]||(t[31]=C(" AI diagnosis is not configured ",-1)),u(ae,{topic:"cluster.ai-setup"})]),u(N,{to:"/settings/ai",size:"xs",color:"neutral",variant:"outline",class:"mt-3"},{default:B(()=>[...t[32]||(t[32]=[C(" Configure in Settings ",-1)])]),_:1}),t[33]||(t[33]=a("p",{class:"text-xs text-gray-400 mt-4 max-w-xs"},[C(" Use the "),a("strong",null,"Show context"),C(" button above to inspect the full diagnosis context and copy it for use with your own AI tool. ")],-1))])),a("div",hs,[u(Le,{to:"/mcp",class:"inline-flex items-center gap-1 text-xs text-gray-400 hover:text-primary transition-colors"},{default:B(()=>[u(A,{name:"i-lucide-bot",class:"size-3"}),t[34]||(t[34]=C(" Query this cluster from your AI agent via the MCP server ",-1))]),_:1})])])}}}),zs=Object.assign(bs,{__name:"DiagnosisPanel"});export{zs as _,ct as p,As as u};
|