@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.
Files changed (688) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{CXEH9OPk.js → 9ti9eNH9.js} +1 -1
  3. package/.output/public/_nuxt/{oAClCn_h.js → B-zdP-D4.js} +1 -1
  4. package/.output/public/_nuxt/{DsesNydr.js → B1RmmOsM.js} +1 -1
  5. package/.output/public/_nuxt/{C0_yH0N7.js → B3Fsod9X.js} +1 -1
  6. package/.output/public/_nuxt/{Cnsmicv2.js → B3rirOqU.js} +34 -34
  7. package/.output/public/_nuxt/B3zmIJYb.js +1 -0
  8. package/.output/public/_nuxt/{DuwtTfO8.js → BAKUqW95.js} +2 -2
  9. package/.output/public/_nuxt/BG0KKQiT.js +7 -0
  10. package/.output/public/_nuxt/BGL_V7Y4.js +1 -0
  11. package/.output/public/_nuxt/{Dpd16JVI.js → BGusFAvZ.js} +1 -1
  12. package/.output/public/_nuxt/{l5WKbU4h.js → BNurUTla.js} +3 -3
  13. package/.output/public/_nuxt/BR5cR2Ot.js +1 -0
  14. package/.output/public/_nuxt/BTCh_0zN.js +1 -0
  15. package/.output/public/_nuxt/{C8e1EbJI.js → BTVqMsA3.js} +1 -1
  16. package/.output/public/_nuxt/{DabzhQB1.js → B_13C0GF.js} +1 -1
  17. package/.output/public/_nuxt/BeDIjhoR.js +44 -0
  18. package/.output/public/_nuxt/{D5tke0B5.js → BerCW7Ug.js} +1 -1
  19. package/.output/public/_nuxt/{BicAJ6U8.js → BfTNbVc_.js} +1 -1
  20. package/.output/public/_nuxt/BnbSEpXX.js +1 -0
  21. package/.output/public/_nuxt/Bo_dxehb.js +1 -0
  22. package/.output/public/_nuxt/{C2hkrSey.js → BpBHls4-.js} +1 -1
  23. package/.output/public/_nuxt/{Bm62iDV5.js → BpM6ZPIG.js} +1 -1
  24. package/.output/public/_nuxt/{GPNI1ffD.js → BqGumsDo.js} +2 -2
  25. package/.output/public/_nuxt/{A1pj0VnG.js → BrxtP_cN.js} +1 -1
  26. package/.output/public/_nuxt/{KyA_4Ks-.js → C2hNxjjz.js} +1 -1
  27. package/.output/public/_nuxt/C5PSqfKi.js +2 -0
  28. package/.output/public/_nuxt/C5vsaU4G.js +1 -0
  29. package/.output/public/_nuxt/C9sdHaXd.js +1 -0
  30. package/.output/public/_nuxt/{Und3xXFc.js → CAxgBYIt.js} +2 -2
  31. package/.output/public/_nuxt/{BmUfSNMV.js → CES2i5Pl.js} +1 -1
  32. package/.output/public/_nuxt/{CNyV9YpI.js → CFEdRqaj.js} +1 -1
  33. package/.output/public/_nuxt/{Dy-TJ0Mt.js → CFTZwazK.js} +1 -1
  34. package/.output/public/_nuxt/CIBS7ye6.js +1 -0
  35. package/.output/public/_nuxt/CIEceDOw.js +1 -0
  36. package/.output/public/_nuxt/{bLcjFslv.js → CJBhojV6.js} +1 -1
  37. package/.output/public/_nuxt/{b-GYfcrQ.js → CKYddHa6.js} +1 -1
  38. package/.output/public/_nuxt/{BKkF4pPD.js → CLVWiCds.js} +1 -1
  39. package/.output/public/_nuxt/{CwGWJbiy.js → CMYAryzi.js} +1 -1
  40. package/.output/public/_nuxt/{CjPfj7ya.js → COhdybDy.js} +1 -1
  41. package/.output/public/_nuxt/{B7FTvFWq.js → CRBXM2d6.js} +2 -2
  42. package/.output/public/_nuxt/CTD_pJ_v.js +1 -0
  43. package/.output/public/_nuxt/{Cus22Ud3.js → CTP8Pw0-.js} +2 -2
  44. package/.output/public/_nuxt/{CeW8v31b.js → CV8iF2kG.js} +1 -1
  45. package/.output/public/_nuxt/{H94BMf3L.js → CWKmbYlT.js} +1 -1
  46. package/.output/public/_nuxt/C_NfGMTd.js +9 -0
  47. package/.output/public/_nuxt/Cejoebel.js +6 -0
  48. package/.output/public/_nuxt/{FaFoMVKo.js → Chpah_7l.js} +1 -1
  49. package/.output/public/_nuxt/Ci9d8YVV.js +1 -0
  50. package/.output/public/_nuxt/{CIrFl3MW.js → CifRHVaR.js} +1 -1
  51. package/.output/public/_nuxt/{DrfE8IY0.js → Ckgsh9AT.js} +1 -1
  52. package/.output/public/_nuxt/{-f7BAm1H.js → Cpsq-kYE.js} +1 -1
  53. package/.output/public/_nuxt/Cqc-DSTF.js +1 -0
  54. package/.output/public/_nuxt/{CAAwCT7H.js → CsHulb12.js} +1 -1
  55. package/.output/public/_nuxt/Ctb2CqUf.js +5 -0
  56. package/.output/public/_nuxt/CtstIQSh.js +1 -0
  57. package/.output/public/_nuxt/{DJxlKFGb.js → CvMzDKvu.js} +1 -1
  58. package/.output/public/_nuxt/{CTU1mrhq.js → D2pBhsH8.js} +1 -1
  59. package/.output/public/_nuxt/{B3obW6cw.js → D8gX1Jde.js} +2 -2
  60. package/.output/public/_nuxt/D9knOn6D.js +1 -0
  61. package/.output/public/_nuxt/DAPTVdvA.js +1 -0
  62. package/.output/public/_nuxt/{Du2W7Jne.js → DCFbQvIN.js} +42 -42
  63. package/.output/public/_nuxt/DCoJlz_q.js +1 -0
  64. package/.output/public/_nuxt/DGnQ69wW.js +64 -0
  65. package/.output/public/_nuxt/{hNh4CIL0.js → DHzij16p.js} +1 -1
  66. package/.output/public/_nuxt/DJMCXRuW.js +5 -0
  67. package/.output/public/_nuxt/DJXcGkJP.js +2 -0
  68. package/.output/public/_nuxt/{DPCxhHri.js → DKFXZdWZ.js} +1 -1
  69. package/.output/public/_nuxt/{Bnxf8nbZ.js → DL24AjfW.js} +1 -1
  70. package/.output/public/_nuxt/DON74Yh6.js +1 -0
  71. package/.output/public/_nuxt/{5A6ITZXj.js → DQM62mxB.js} +1 -1
  72. package/.output/public/_nuxt/DSe8DxMl.js +1 -0
  73. package/.output/public/_nuxt/DWwiVTZX.js +24 -0
  74. package/.output/public/_nuxt/DX4tAP78.js +1 -0
  75. package/.output/public/_nuxt/{C1gTN4Q8.js → D_eDAIsT.js} +1 -1
  76. package/.output/public/_nuxt/Da8A92cF.js +1 -0
  77. package/.output/public/_nuxt/{CzAPFPpL.js → DdH3op4b.js} +1 -1
  78. package/.output/public/_nuxt/DepFDZO3.js +1 -0
  79. package/.output/public/_nuxt/{BzRRzmwm.js → DfSBKzrC.js} +1 -1
  80. package/.output/public/_nuxt/{BdfhYr-u.js → DfnKh3dZ.js} +1 -1
  81. package/.output/public/_nuxt/{Bow4tTR0.js → DhpTfeip.js} +1 -1
  82. package/.output/public/_nuxt/{CAvY22RE.js → Dk9nD32g.js} +1 -1
  83. package/.output/public/_nuxt/{BrQEE053.js → DkT2nCqn.js} +1 -1
  84. package/.output/public/_nuxt/DlW85lQq.js +4 -0
  85. package/.output/public/_nuxt/DnNio-ut.js +1 -0
  86. package/.output/public/_nuxt/{DdwHkKfV.js → DnQv_hst.js} +1 -1
  87. package/.output/public/_nuxt/{B99fbi73.js → DqEOMteW.js} +1 -1
  88. package/.output/public/_nuxt/{4gYNA-d4.js → Dsvu7YJT.js} +1 -1
  89. package/.output/public/_nuxt/DvhCDBrR.js +2 -0
  90. package/.output/public/_nuxt/DwQaVMZR.js +1 -0
  91. package/.output/public/_nuxt/E-_n_6vi.js +1 -0
  92. package/.output/public/_nuxt/{BT3wGCTI.js → Ebw5l7n8.js} +1 -1
  93. package/.output/public/_nuxt/{CA9B2HE5.js → IPePdbzl.js} +1 -1
  94. package/.output/public/_nuxt/{DJmoLeVt.js → LHoUGrfi.js} +1 -1
  95. package/.output/public/_nuxt/{L3kAWB2a.js → NERLHpOL.js} +1 -1
  96. package/.output/public/_nuxt/{CeG9pBAD.js → RAdNGxcF.js} +1 -1
  97. package/.output/public/_nuxt/Vxyo_mU9.js +1 -0
  98. package/.output/public/_nuxt/{pQqGiNch.js → YE1kAkU9.js} +1 -1
  99. package/.output/public/_nuxt/{CsLojMwR.js → YmT5WiN5.js} +1 -1
  100. package/.output/public/_nuxt/ZcAfCxWE.js +17 -0
  101. package/.output/public/_nuxt/{CxyAzHr3.js → _rglcvXN.js} +1 -1
  102. package/.output/public/_nuxt/bFU9Y1Vw.js +10 -0
  103. package/.output/public/_nuxt/bfecIH89.js +1 -0
  104. package/.output/public/_nuxt/builds/latest.json +1 -1
  105. package/.output/public/_nuxt/builds/meta/31ca2be4-a949-4df6-9818-773fc085557a.json +1 -0
  106. package/.output/public/_nuxt/entry.BAvBQY-h.css +1 -0
  107. package/.output/public/_nuxt/four-S1Y.js +1 -0
  108. package/.output/public/_nuxt/{CJFtzlQ4.js → gV2U_Gqd.js} +1 -1
  109. package/.output/public/_nuxt/{DeY2JkR2.js → lGC893pn.js} +1 -1
  110. package/.output/public/_nuxt/nOfj-ar8.js +1 -0
  111. package/.output/public/_nuxt/oKrbs1XK.js +1 -0
  112. package/.output/public/_nuxt/oSJFAC38.js +1 -0
  113. package/.output/public/_nuxt/rL4C0HV5.js +1 -0
  114. package/.output/public/_nuxt/{Dyeqn3aG.js → tQoyVPCE.js} +1 -1
  115. package/.output/public/_nuxt/{DfgOx_ou.js → uSPCvASp.js} +1 -1
  116. package/.output/public/_nuxt/{hC_z4G8p.js → wkz5-1SO.js} +1 -1
  117. package/.output/public/_nuxt/yYlVYKCz.js +34 -0
  118. package/.output/public/_nuxt/{AbmKWFQQ.js → zv8WdMx0.js} +1 -1
  119. package/.output/server/chunks/_/scope.mjs +43 -27
  120. package/.output/server/chunks/_/scope.mjs.map +1 -1
  121. package/.output/server/chunks/_/users.mjs +1 -1
  122. package/.output/server/chunks/build/{Breadcrumb-Ak2Lg3oM.mjs → Breadcrumb-3itRZ1uz.mjs} +2 -2
  123. package/.output/server/chunks/build/Breadcrumb-3itRZ1uz.mjs.map +1 -0
  124. package/.output/server/chunks/build/{BreadcrumbNav-DO7I_z-n.mjs → BreadcrumbNav-GnjBvXuT.mjs} +2 -2
  125. package/.output/server/chunks/build/BreadcrumbNav-GnjBvXuT.mjs.map +1 -0
  126. package/.output/server/chunks/build/{BrowserBadge-MFvBwxmD.mjs → BrowserBadge-DQqJS9CV.mjs} +2 -2
  127. package/.output/server/chunks/build/BrowserBadge-DQqJS9CV.mjs.map +1 -0
  128. package/.output/server/chunks/build/{ChartCard-Y1UKwMsf.mjs → ChartCard-D0rzMf-N.mjs} +2 -2
  129. package/.output/server/chunks/build/ChartCard-D0rzMf-N.mjs.map +1 -0
  130. package/.output/server/chunks/build/{Checkbox-4Q5d0fa0.mjs → Checkbox-DmRKG-0s.mjs} +3 -3
  131. package/.output/server/chunks/build/Checkbox-DmRKG-0s.mjs.map +1 -0
  132. package/.output/server/chunks/build/{CodeBlock-BgE-NSmE.mjs → CodeBlock-DGhKVFad.mjs} +4 -4
  133. package/.output/server/chunks/build/CodeBlock-DGhKVFad.mjs.map +1 -0
  134. package/.output/server/chunks/build/{DashboardNavbar-BHmMSPX7.mjs → DashboardNavbar-DCr10nxL.mjs} +2 -2
  135. package/.output/server/chunks/build/DashboardNavbar-DCr10nxL.mjs.map +1 -0
  136. package/.output/server/chunks/build/{DashboardSidebarToggle-DCTnHiIv.mjs → DashboardSidebarToggle-8EpBhX0R.mjs} +3 -3
  137. package/.output/server/chunks/build/DashboardSidebarToggle-8EpBhX0R.mjs.map +1 -0
  138. package/.output/server/chunks/build/{DataLocationCard-B_YHdzSz.mjs → DataLocationCard-rzS-pgCP.mjs} +5 -5
  139. package/.output/server/chunks/build/DataLocationCard-rzS-pgCP.mjs.map +1 -0
  140. package/.output/server/chunks/build/{DiagnosisPanel-CALyEmcJ.mjs → DiagnosisPanel-BWTpoCKy.mjs} +8 -7
  141. package/.output/server/chunks/build/DiagnosisPanel-BWTpoCKy.mjs.map +1 -0
  142. package/.output/server/chunks/build/{useAiStatus-CxjMmDDY.mjs → DiagnosisResult-Br3qBLXe.mjs} +10 -32
  143. package/.output/server/chunks/build/DiagnosisResult-Br3qBLXe.mjs.map +1 -0
  144. package/.output/server/chunks/build/{DurationValue-D20oGbnc.mjs → DurationValue-CWKfjIF2.mjs} +2 -2
  145. package/.output/server/chunks/build/DurationValue-CWKfjIF2.mjs.map +1 -0
  146. package/.output/server/chunks/build/{EntityLinks-BBHWssHH.mjs → EntityLinks-CF0xG3Y8.mjs} +6 -6
  147. package/.output/server/chunks/build/EntityLinks-CF0xG3Y8.mjs.map +1 -0
  148. package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs +1 -1
  149. package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs +83 -0
  150. package/.output/server/chunks/build/FeatureUnavailable-CwPms6X_.mjs.map +1 -0
  151. package/.output/server/chunks/build/{FormField-B0HKsdMd.mjs → FormField-e7OnSKPM.mjs} +2 -2
  152. package/.output/server/chunks/build/FormField-e7OnSKPM.mjs.map +1 -0
  153. package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs +510 -0
  154. package/.output/server/chunks/build/GetStartedWizard-CB5v1Xzu.mjs.map +1 -0
  155. package/.output/server/chunks/build/{HelpHint-DrcIv-Oj.mjs → HelpHint-DjGrGFA7.mjs} +3 -3
  156. package/.output/server/chunks/build/HelpHint-DjGrGFA7.mjs.map +1 -0
  157. package/.output/server/chunks/build/{LoadingState-C3pBSuOO.mjs → LoadingState-B8v1nWJt.mjs} +3 -3
  158. package/.output/server/chunks/build/LoadingState-B8v1nWJt.mjs.map +1 -0
  159. package/.output/server/chunks/build/{CiEnvCard-DB5DvBh1.mjs → MetaStripGroup-dXXa_MzF.mjs} +242 -529
  160. package/.output/server/chunks/build/MetaStripGroup-dXXa_MzF.mjs.map +1 -0
  161. package/.output/server/chunks/build/{MiniRunBars-CZMugDrh.mjs → MiniRunBars-fgLMgRUp.mjs} +2 -2
  162. package/.output/server/chunks/build/MiniRunBars-fgLMgRUp.mjs.map +1 -0
  163. package/.output/server/chunks/build/{useSettingsNav-DnQKacz8.mjs → NavigationMenu-cqpt11Ce.mjs} +5 -28
  164. package/.output/server/chunks/build/NavigationMenu-cqpt11Ce.mjs.map +1 -0
  165. package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs → OpenInIdeLink-B9wvQkhy.mjs} +5 -5
  166. package/.output/server/chunks/build/{OpenInIdeLink-CQWKKChd.mjs.map → OpenInIdeLink-B9wvQkhy.mjs.map} +1 -1
  167. package/.output/server/chunks/build/{ProjectTestCasesTable-Bo61P5K1.mjs → ProjectTestCasesTable-BwHEtZTz.mjs} +15 -15
  168. package/.output/server/chunks/build/ProjectTestCasesTable-BwHEtZTz.mjs.map +1 -0
  169. package/.output/server/chunks/build/{RunReports-DFLv51TX.mjs → RunReports-BDRIWn3o.mjs} +2 -2
  170. package/.output/server/chunks/build/RunReports-BDRIWn3o.mjs.map +1 -0
  171. package/.output/server/chunks/build/{RunStatusBadge-FfGb6bkW.mjs → RunStatusBadge-CuTDknRJ.mjs} +2 -2
  172. package/.output/server/chunks/build/RunStatusBadge-CuTDknRJ.mjs.map +1 -0
  173. package/.output/server/chunks/build/{SectionCard-CN-v0FZ_.mjs → SectionCard-BW5Lynrr.mjs} +2 -2
  174. package/.output/server/chunks/build/SectionCard-BW5Lynrr.mjs.map +1 -0
  175. package/.output/server/chunks/build/{Select-5DK9frQ7.mjs → Select-CVctwpib.mjs} +3 -3
  176. package/.output/server/chunks/build/Select-CVctwpib.mjs.map +1 -0
  177. package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs → SelectMenu-XLVBEa11.mjs} +3 -3
  178. package/.output/server/chunks/build/{SelectMenu-D-2FSqBU.mjs.map → SelectMenu-XLVBEa11.mjs.map} +1 -1
  179. package/.output/server/chunks/build/{SettingsField-BZfx4ma1.mjs → SettingsField-DvtRvI6O.mjs} +3 -3
  180. package/.output/server/chunks/build/SettingsField-DvtRvI6O.mjs.map +1 -0
  181. package/.output/server/chunks/build/{StatTile-D61Vzo6e.mjs → StatTile-DpcVQFVI.mjs} +2 -26
  182. package/.output/server/chunks/build/StatTile-DpcVQFVI.mjs.map +1 -0
  183. package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs +30 -0
  184. package/.output/server/chunks/build/StatTileGrid-7zOFUQ6j.mjs.map +1 -0
  185. package/.output/server/chunks/build/{Switch-B5Fp8ULt.mjs → Switch-8zWfwI5B.mjs} +2 -2
  186. package/.output/server/chunks/build/Switch-8zWfwI5B.mjs.map +1 -0
  187. package/.output/server/chunks/build/Table-BRk04Hd2.mjs +1 -1
  188. package/.output/server/chunks/build/{TestCaseHistoryChart-CSi64vVA.mjs → TestCaseHistoryChart-C6t5RrCG.mjs} +2 -2
  189. package/.output/server/chunks/build/TestCaseHistoryChart-C6t5RrCG.mjs.map +1 -0
  190. package/.output/server/chunks/build/{TestMetaBadges-D5_yUtIP.mjs → TestMetaBadges-BlyKmfeP.mjs} +1 -1
  191. package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +1 -0
  192. package/.output/server/chunks/build/{TestStatusBar-DX3EhlyP.mjs → TestStatusBar-DhbrM_rQ.mjs} +3 -3
  193. package/.output/server/chunks/build/TestStatusBar-DhbrM_rQ.mjs.map +1 -0
  194. package/.output/server/chunks/build/{Textarea-Dv2-lOvW.mjs → Textarea-vkMKVQTJ.mjs} +2 -2
  195. package/.output/server/chunks/build/Textarea-vkMKVQTJ.mjs.map +1 -0
  196. package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs +1 -1
  197. package/.output/server/chunks/build/{_id_-BdG37K7s.mjs → _id_-2PMH6rl8.mjs} +20 -19
  198. package/.output/server/chunks/build/_id_-2PMH6rl8.mjs.map +1 -0
  199. package/.output/server/chunks/build/{_id_-BdJs7BJZ.mjs → _id_-8cGIgeg6.mjs} +1903 -1113
  200. package/.output/server/chunks/build/_id_-8cGIgeg6.mjs.map +1 -0
  201. package/.output/server/chunks/build/{_id_-C_uSBiyU.mjs → _id_-CUZ5S6y5.mjs} +29 -29
  202. package/.output/server/chunks/build/_id_-CUZ5S6y5.mjs.map +1 -0
  203. package/.output/server/chunks/build/{_id_-BxA6IgWr.mjs → _id_-DMkgWSLZ.mjs} +885 -381
  204. package/.output/server/chunks/build/_id_-DMkgWSLZ.mjs.map +1 -0
  205. package/.output/server/chunks/build/{about-BE0UV-8-.mjs → about-D3WXTDro.mjs} +21 -453
  206. package/.output/server/chunks/build/about-D3WXTDro.mjs.map +1 -0
  207. package/.output/server/chunks/build/{account-DAfvaD-F.mjs → account-BslDNCoo.mjs} +6 -6
  208. package/.output/server/chunks/build/account-BslDNCoo.mjs.map +1 -0
  209. package/.output/server/chunks/build/{ai-Cn05ch0u.mjs → ai-C23R9l94.mjs} +14 -14
  210. package/.output/server/chunks/build/{ai-Cn05ch0u.mjs.map → ai-C23R9l94.mjs.map} +1 -1
  211. package/.output/server/chunks/build/{analytics-Bo_B_jko.mjs → analytics-DQHeToK0.mjs} +104 -77
  212. package/.output/server/chunks/build/analytics-DQHeToK0.mjs.map +1 -0
  213. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  214. package/.output/server/chunks/build/compare-RxHSOdsO.mjs +1 -0
  215. package/.output/server/chunks/build/{db.client-CQoVTYB9.mjs → db.client-D74DghqX.mjs} +38 -2
  216. package/.output/server/chunks/build/db.client-D74DghqX.mjs.map +1 -0
  217. package/.output/server/chunks/build/{default-CbNHaFsy.mjs → default-CeyePZ5I.mjs} +32 -19
  218. package/.output/server/chunks/build/{default-CbNHaFsy.mjs.map → default-CeyePZ5I.mjs.map} +1 -1
  219. package/.output/server/chunks/build/{docs-B_llWMxx.mjs → docs-f_bnC75q.mjs} +14 -14
  220. package/.output/server/chunks/build/{docs-B_llWMxx.mjs.map → docs-f_bnC75q.mjs.map} +1 -1
  221. package/.output/server/chunks/build/{edit-J0asTFg8.mjs → edit-BOC4zWuH.mjs} +11 -12
  222. package/.output/server/chunks/build/edit-BOC4zWuH.mjs.map +1 -0
  223. package/.output/server/chunks/build/{fetch-B4FwBOzu.mjs → fetch-BQg_fhX0.mjs} +32 -4
  224. package/.output/server/chunks/build/fetch-BQg_fhX0.mjs.map +1 -0
  225. package/.output/server/chunks/build/{forgot-password-CC__1OnV.mjs → forgot-password-CxuVbGWy.mjs} +4 -3
  226. package/.output/server/chunks/build/forgot-password-CxuVbGWy.mjs.map +1 -0
  227. package/.output/server/chunks/build/{import-CS9oylTN.mjs → import-CC27wEIu.mjs} +12 -12
  228. package/.output/server/chunks/build/import-CC27wEIu.mjs.map +1 -0
  229. package/.output/server/chunks/build/{index-e9skCi-V.mjs → index-B6PjfyTY.mjs} +39 -537
  230. package/.output/server/chunks/build/index-B6PjfyTY.mjs.map +1 -0
  231. package/.output/server/chunks/build/{index-CU2nZhAa.mjs → index-BOK1aJk9.mjs} +2 -1
  232. package/.output/server/chunks/build/index-BOK1aJk9.mjs.map +1 -0
  233. package/.output/server/chunks/build/{index-hGHlmyxj.mjs → index-BhS1DuCr.mjs} +117 -76
  234. package/.output/server/chunks/build/index-BhS1DuCr.mjs.map +1 -0
  235. package/.output/server/chunks/build/{index-DE45ycdZ.mjs → index-DUmjP3Gr.mjs} +12 -13
  236. package/.output/server/chunks/build/index-DUmjP3Gr.mjs.map +1 -0
  237. package/.output/server/chunks/build/index-jvF53f7_.mjs +91 -0
  238. package/.output/server/chunks/build/index-jvF53f7_.mjs.map +1 -0
  239. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
  240. package/.output/server/chunks/build/{login-Da4u1IlW.mjs → login-CdpOhiP8.mjs} +8 -7
  241. package/.output/server/chunks/build/login-CdpOhiP8.mjs.map +1 -0
  242. package/.output/server/chunks/build/{mcp-uhVCCwQM.mjs → mcp-WTeO5WRo.mjs} +193 -10
  243. package/.output/server/chunks/build/mcp-WTeO5WRo.mjs.map +1 -0
  244. package/.output/server/chunks/build/{notifications-fx_qnKGA.mjs → notifications-yY6ik-fi.mjs} +9 -9
  245. package/.output/server/chunks/build/notifications-yY6ik-fi.mjs.map +1 -0
  246. package/.output/server/chunks/build/{pr-feedback-X6-70iF0.mjs → pr-feedback-Hv2Ydh_6.mjs} +7 -7
  247. package/.output/server/chunks/build/pr-feedback-Hv2Ydh_6.mjs.map +1 -0
  248. package/.output/server/chunks/build/{reset-password-BmrUS4ZD.mjs → reset-password-CFtO8A6n.mjs} +4 -3
  249. package/.output/server/chunks/build/reset-password-CFtO8A6n.mjs.map +1 -0
  250. package/.output/server/chunks/build/server.mjs +51 -34
  251. package/.output/server/chunks/build/{settings-CCYe7rsc.mjs → settings-DIpvnY8_.mjs} +10 -8
  252. package/.output/server/chunks/build/settings-DIpvnY8_.mjs.map +1 -0
  253. package/.output/server/chunks/build/{settings-metadata-DrEqWcW-.mjs → settings-metadata-DRv9VveS.mjs} +32 -2
  254. package/.output/server/chunks/build/settings-metadata-DRv9VveS.mjs.map +1 -0
  255. package/.output/server/chunks/build/setup-Di0UMyWx.mjs +1116 -0
  256. package/.output/server/chunks/build/setup-Di0UMyWx.mjs.map +1 -0
  257. package/.output/server/chunks/build/{storage-CJEmviCD.mjs → storage-gAbY1KbQ.mjs} +10 -10
  258. package/.output/server/chunks/build/storage-gAbY1KbQ.mjs.map +1 -0
  259. package/.output/server/chunks/build/{tags-DauTe_F-.mjs → tags-DJ80wCqt.mjs} +6 -7
  260. package/.output/server/chunks/build/tags-DJ80wCqt.mjs.map +1 -0
  261. package/.output/server/chunks/build/{test-cases-thBbAykw.mjs → test-cases-YP83YlnL.mjs} +18 -18
  262. package/.output/server/chunks/build/test-cases-YP83YlnL.mjs.map +1 -0
  263. package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs +550 -0
  264. package/.output/server/chunks/build/test-functions-BwLTxGmM.mjs.map +1 -0
  265. package/.output/server/chunks/build/{timeout-hygiene-CbnSaVbK.mjs → timeout-hygiene-RpXDjXTX.mjs} +6 -6
  266. package/.output/server/chunks/build/timeout-hygiene-RpXDjXTX.mjs.map +1 -0
  267. package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs +9 -0
  268. package/.output/server/chunks/build/useAiStatus-UR8x-feE.mjs.map +1 -0
  269. package/.output/server/chunks/build/{useCopyRich-RJKhWoyj.mjs → useCopyRich-Cd5Yj_Wy.mjs} +694 -242
  270. package/.output/server/chunks/build/useCopyRich-Cd5Yj_Wy.mjs.map +1 -0
  271. package/.output/server/chunks/build/{useDesktopDownload-BepjqxOt.mjs → useDesktopDownload-BmR6ouz2.mjs} +2 -2
  272. package/.output/server/chunks/build/useDesktopDownload-BmR6ouz2.mjs.map +1 -0
  273. package/.output/server/chunks/build/{useOpenInIde-BbTnPhFA.mjs → useOpenInIde-DolN3bZ5.mjs} +1 -1
  274. package/.output/server/chunks/build/useOpenInIde-DolN3bZ5.mjs.map +1 -0
  275. package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs +19 -0
  276. package/.output/server/chunks/build/useSettingsNav-DfnOFlR_.mjs.map +1 -0
  277. package/.output/server/chunks/build/{users-CTUqXyGh.mjs → users-I2K7HXS2.mjs} +6 -7
  278. package/.output/server/chunks/build/users-I2K7HXS2.mjs.map +1 -0
  279. package/.output/server/chunks/build/{wasted-time-BNTPIyrC.mjs → wasted-time-DyIk0olc.mjs} +9 -9
  280. package/.output/server/chunks/build/wasted-time-DyIk0olc.mjs.map +1 -0
  281. package/.output/server/chunks/nitro/nitro.mjs +1348 -675
  282. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  283. package/.output/server/chunks/routes/__piwi/session.get.mjs +2 -1
  284. package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +1 -0
  286. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
  287. package/.output/server/chunks/routes/api/admin/stats.get.mjs +1 -0
  288. package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/ai/status.get.mjs +1 -0
  290. package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
  291. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -0
  292. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
  293. package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -0
  294. package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
  295. package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -0
  296. package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
  297. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -0
  298. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
  299. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -0
  300. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -0
  302. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
  303. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -0
  304. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
  305. package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -0
  306. package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
  307. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -0
  308. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
  309. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -0
  310. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
  311. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -0
  312. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
  313. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -0
  314. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
  315. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -0
  316. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
  317. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -0
  318. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -1
  319. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +1 -0
  320. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
  321. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -0
  322. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
  323. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -0
  324. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
  325. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -0
  326. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
  327. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -0
  328. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
  329. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -0
  330. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
  331. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -0
  332. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
  333. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -0
  334. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
  335. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -0
  336. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
  337. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -0
  338. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
  339. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -0
  340. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -1
  341. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -0
  342. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
  343. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -0
  344. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -1
  345. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -0
  346. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
  347. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -0
  348. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
  349. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -0
  350. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
  351. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -0
  352. package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
  353. package/.output/server/chunks/routes/api/health.get.mjs +1 -0
  354. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  355. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  356. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  357. package/.output/server/chunks/routes/api/index.get2.mjs +1 -0
  358. package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
  359. package/.output/server/chunks/routes/api/index.get3.mjs +1 -0
  360. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  361. package/.output/server/chunks/routes/api/index.get4.mjs +2 -1
  362. package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
  363. package/.output/server/chunks/routes/api/index.get5.mjs +1 -0
  364. package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
  365. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  366. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  367. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  368. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -0
  369. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -0
  371. package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
  372. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -0
  373. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -0
  375. package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
  376. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -0
  377. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -0
  379. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -0
  381. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -0
  383. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -0
  385. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -0
  387. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -0
  389. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -0
  391. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -0
  393. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -0
  395. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -0
  397. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -0
  399. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -0
  401. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -0
  403. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +76 -0
  405. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs.map +1 -0
  406. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +66 -0
  407. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs.map +1 -0
  408. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +53 -0
  409. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs.map +1 -0
  410. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +67 -0
  411. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs.map +1 -0
  412. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +2 -1
  413. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -0
  415. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -0
  417. package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/projects/menu.get.mjs +2 -1
  419. package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/projects/overview.get.mjs +2 -1
  421. package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/projects.get.mjs +1 -0
  423. package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/search.get.mjs +2 -1
  425. package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +2 -1
  427. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +2 -1
  429. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +1 -0
  431. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +2 -1
  433. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -0
  435. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/settings/ai.get.mjs +2 -1
  437. package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/settings/ai.put.mjs +2 -1
  439. package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +2 -1
  441. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -1
  442. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +2 -1
  443. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -1
  444. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +2 -1
  445. package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
  446. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +2 -1
  447. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +2 -1
  449. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +2 -1
  451. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +2 -1
  453. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/setup-status.get.mjs +99 -0
  455. package/.output/server/chunks/routes/api/setup-status.get.mjs.map +1 -0
  456. package/.output/server/chunks/routes/api/stream.get.mjs +1 -0
  457. package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -0
  459. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  461. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +2 -1
  462. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
  463. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  464. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +2 -1
  465. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +2 -1
  467. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +2 -1
  469. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +60 -0
  471. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs.map +1 -0
  472. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +69 -0
  473. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs.map +1 -0
  474. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +2 -1
  475. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
  476. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +2 -1
  477. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
  478. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +2 -1
  479. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
  480. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +2 -1
  481. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -1
  482. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +2 -1
  483. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
  484. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +2 -1
  485. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
  486. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +2 -1
  487. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +2 -1
  489. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
  490. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +2 -1
  491. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +2 -1
  493. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +2 -1
  495. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +2 -1
  497. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +2 -1
  499. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +2 -1
  501. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +2 -1
  503. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +2 -1
  505. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +2 -1
  507. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +2 -1
  509. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
  510. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +2 -1
  511. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
  512. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +2 -1
  513. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -1
  514. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +2 -1
  515. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
  516. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +2 -1
  517. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
  518. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +2 -1
  519. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
  520. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +2 -1
  521. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
  522. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +2 -1
  523. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
  524. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +2 -1
  525. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
  526. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +2 -1
  527. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
  528. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +2 -1
  529. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
  530. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +2 -1
  531. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
  532. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +2 -1
  533. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -1
  534. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +2 -1
  535. package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -1
  536. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +2 -1
  537. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
  538. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +2 -1
  539. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
  540. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +2 -1
  541. package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +2 -1
  543. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  544. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
  545. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  546. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +1 -0
  547. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  548. package/.output/server/chunks/routes/api/traces/check.post.mjs +2 -1
  549. package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
  550. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -0
  551. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -0
  553. package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
  554. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  555. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +2 -1
  556. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
  557. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +2 -1
  558. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
  559. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  560. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -0
  561. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  562. package/.output/server/chunks/routes/api/version.get.mjs +2 -1
  563. package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
  564. package/.output/server/chunks/routes/mcp.post.mjs +41 -11
  565. package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
  566. package/.output/server/chunks/routes/renderer.mjs +1 -1
  567. package/.output/server/chunks/tasks/sweep.mjs +1 -0
  568. package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
  569. package/.output/server/chunks/tasks/sweep2.mjs +1 -0
  570. package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
  571. package/.output/server/database/migrations/0043_watery_dragon_lord.sql +22 -0
  572. package/.output/server/database/migrations/meta/0043_snapshot.json +3764 -0
  573. package/.output/server/database/migrations/meta/_journal.json +7 -0
  574. package/.output/server/database/migrations-pg/0044_dark_triathlon.sql +22 -0
  575. package/.output/server/database/migrations-pg/meta/0044_snapshot.json +4473 -0
  576. package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
  577. package/.output/server/index.mjs +2 -1
  578. package/.output/server/index.mjs.map +1 -1
  579. package/.output/server/package.json +1 -1
  580. package/package.json +1 -1
  581. package/.output/public/_nuxt/8PUUncmO.js +0 -44
  582. package/.output/public/_nuxt/B8zkOmwo.js +0 -1
  583. package/.output/public/_nuxt/B96M2gdj.js +0 -1
  584. package/.output/public/_nuxt/B9OLmp0f.js +0 -1
  585. package/.output/public/_nuxt/BUa0V0Ly.js +0 -1
  586. package/.output/public/_nuxt/BUkim3TM.js +0 -1
  587. package/.output/public/_nuxt/BVc14Ncz.js +0 -4
  588. package/.output/public/_nuxt/BY0HxR3t.js +0 -17
  589. package/.output/public/_nuxt/B_xAMWQS.js +0 -2
  590. package/.output/public/_nuxt/BdQoBaOv.js +0 -1
  591. package/.output/public/_nuxt/BgRu_3tT.js +0 -1
  592. package/.output/public/_nuxt/BiO7RBWb.js +0 -6
  593. package/.output/public/_nuxt/CEfS4-oS.js +0 -64
  594. package/.output/public/_nuxt/CIoSMkpp.js +0 -1
  595. package/.output/public/_nuxt/CSJ-eOQM.js +0 -1
  596. package/.output/public/_nuxt/CahpB9Z2.js +0 -5
  597. package/.output/public/_nuxt/Cbh--1MW.js +0 -1
  598. package/.output/public/_nuxt/Cx6gc2VW.js +0 -1
  599. package/.output/public/_nuxt/D--H4jLI.js +0 -1
  600. package/.output/public/_nuxt/D1POo6S4.js +0 -10
  601. package/.output/public/_nuxt/D8nkF-OO.js +0 -3
  602. package/.output/public/_nuxt/DA25RkyK.js +0 -1
  603. package/.output/public/_nuxt/DIB-5fUJ.js +0 -1
  604. package/.output/public/_nuxt/DMec-OLo.js +0 -1
  605. package/.output/public/_nuxt/DSqHUrvO.js +0 -1
  606. package/.output/public/_nuxt/DmkUdSS4.js +0 -1
  607. package/.output/public/_nuxt/DoIREDVb.js +0 -1
  608. package/.output/public/_nuxt/DpZ1r1HA.js +0 -1
  609. package/.output/public/_nuxt/DqcKngf3.js +0 -1
  610. package/.output/public/_nuxt/DtHJgCS8.js +0 -1
  611. package/.output/public/_nuxt/Dtd4rC58.js +0 -9
  612. package/.output/public/_nuxt/Dy86h-7P.js +0 -1
  613. package/.output/public/_nuxt/HPNQD6v3.js +0 -1
  614. package/.output/public/_nuxt/HXadJrHu.js +0 -2
  615. package/.output/public/_nuxt/McL25vkx.js +0 -34
  616. package/.output/public/_nuxt/Nn93e_Mz.js +0 -1
  617. package/.output/public/_nuxt/UdR3DBPS.js +0 -1
  618. package/.output/public/_nuxt/_mj6CfPa.js +0 -1
  619. package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +0 -1
  620. package/.output/public/_nuxt/entry.DmptwB51.css +0 -1
  621. package/.output/public/_nuxt/ryMzSDUj.js +0 -2
  622. package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +0 -1
  623. package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +0 -1
  624. package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +0 -1
  625. package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +0 -1
  626. package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +0 -1
  627. package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +0 -1
  628. package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +0 -1
  629. package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +0 -1
  630. package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +0 -1
  631. package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +0 -1
  632. package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.mjs.map +0 -1
  633. package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +0 -1
  634. package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +0 -1
  635. package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +0 -1
  636. package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +0 -1
  637. package/.output/server/chunks/build/LoadingState-C3pBSuOO.mjs.map +0 -1
  638. package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +0 -1
  639. package/.output/server/chunks/build/ProjectTestCasesTable-Bo61P5K1.mjs.map +0 -1
  640. package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +0 -1
  641. package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +0 -1
  642. package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +0 -1
  643. package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +0 -1
  644. package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +0 -1
  645. package/.output/server/chunks/build/StatTile-D61Vzo6e.mjs.map +0 -1
  646. package/.output/server/chunks/build/Switch-B5Fp8ULt.mjs.map +0 -1
  647. package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +0 -1
  648. package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +0 -1
  649. package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.mjs.map +0 -1
  650. package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +0 -1
  651. package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +0 -1
  652. package/.output/server/chunks/build/_id_-BdJs7BJZ.mjs.map +0 -1
  653. package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +0 -1
  654. package/.output/server/chunks/build/_id_-C_uSBiyU.mjs.map +0 -1
  655. package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +0 -1
  656. package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +0 -1
  657. package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +0 -1
  658. package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +0 -1
  659. package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +0 -1
  660. package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +0 -1
  661. package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +0 -1
  662. package/.output/server/chunks/build/import-CS9oylTN.mjs.map +0 -1
  663. package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +0 -1
  664. package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +0 -1
  665. package/.output/server/chunks/build/index-e9skCi-V.mjs.map +0 -1
  666. package/.output/server/chunks/build/index-hGHlmyxj.mjs.map +0 -1
  667. package/.output/server/chunks/build/index-tR6owKzj.mjs +0 -167
  668. package/.output/server/chunks/build/index-tR6owKzj.mjs.map +0 -1
  669. package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +0 -1
  670. package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +0 -1
  671. package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +0 -1
  672. package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +0 -1
  673. package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +0 -1
  674. package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +0 -1
  675. package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +0 -1
  676. package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +0 -1
  677. package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +0 -1
  678. package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +0 -1
  679. package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +0 -1
  680. package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +0 -1
  681. package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs +0 -33
  682. package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +0 -1
  683. package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +0 -1
  684. package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +0 -1
  685. package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +0 -1
  686. package/.output/server/chunks/build/useSettingsNav-DnQKacz8.mjs.map +0 -1
  687. package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +0 -1
  688. package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +0 -1
@@ -1,44 +1,45 @@
1
- import { _ as _sfc_main$1$1, a as _sfc_main$g } from './DashboardNavbar-BHmMSPX7.mjs';
2
- import { _ as _sfc_main$1$2 } from './Breadcrumb-Ak2Lg3oM.mjs';
3
- import { _ as __nuxt_component_3$1 } from './BreadcrumbNav-DO7I_z-n.mjs';
4
- import { u as useRoute, k as useRouter, r as useRuntimeConfig, l as useHead, j as useToast, n as _sfc_main$7$1, m as _sfc_main$k, s as __nuxt_component_12$1, o as _sfc_main$p, y as __nuxt_component_7$1, _ as _sfc_main$d$1, v as _sfc_main$8$1, p as _sfc_main$j$1 } from './server.mjs';
5
- import { _ as _sfc_main$h } from './Tooltip-Dv4htNP6.mjs';
1
+ import { _ as _sfc_main$1$1, a as _sfc_main$h } from './DashboardNavbar-DCr10nxL.mjs';
2
+ import { _ as _sfc_main$1$2 } from './Breadcrumb-3itRZ1uz.mjs';
3
+ import { _ as __nuxt_component_3$1 } from './BreadcrumbNav-GnjBvXuT.mjs';
4
+ import { u as useRoute, k as useRouter, r as useRuntimeConfig, l as useHead, j as useToast, n as _sfc_main$7$1, m as _sfc_main$k, v as __nuxt_component_12$1, o as _sfc_main$p, s as __nuxt_component_7$1, _ as _sfc_main$d$1, w as _sfc_main$8$1, p as _sfc_main$j$1 } from './server.mjs';
5
+ import { _ as _sfc_main$i } from './Tooltip-Dv4htNP6.mjs';
6
6
  import { _ as __nuxt_component_4 } from './NavbarActions-_YjrSUat.mjs';
7
- import { _ as __nuxt_component_8, b as __nuxt_component_1$2, a as __nuxt_component_13$2, d as __nuxt_component_14$3, c as __nuxt_component_15$1, e as __nuxt_component_16$1 } from './CiEnvCard-DB5DvBh1.mjs';
8
- import { u as useDetailGrid, _ as __nuxt_component_0$1 } from './useAiStatus-CxjMmDDY.mjs';
9
- import { _ as __nuxt_component_14$2 } from './TestStatusBar-DX3EhlyP.mjs';
10
- import { _ as __nuxt_component_14$1 } from './DurationValue-D20oGbnc.mjs';
11
- import { _ as _sfc_main$m } from './Card-BQP_oZkQ.mjs';
12
- import { _ as __nuxt_component_2$2 } from './HelpHint-DrcIv-Oj.mjs';
7
+ import { _ as __nuxt_component_8, b as __nuxt_component_1$1, a as __nuxt_component_14$2, c as __nuxt_component_16$1, d as __nuxt_component_17$1 } from './MetaStripGroup-dXXa_MzF.mjs';
8
+ import { _ as __nuxt_component_0$1 } from './DiagnosisResult-Br3qBLXe.mjs';
9
+ import { _ as __nuxt_component_14$3 } from './TestStatusBar-DhbrM_rQ.mjs';
10
+ import { _ as __nuxt_component_14$1 } from './DurationValue-CWKfjIF2.mjs';
11
+ import { _ as _sfc_main$n } from './Card-BQP_oZkQ.mjs';
12
+ import { _ as __nuxt_component_2$2 } from './HelpHint-DjGrGFA7.mjs';
13
13
  import { _ as __nuxt_component_5 } from './MarkerBadge-D7meXy4u.mjs';
14
- import { _ as __nuxt_component_18$1 } from './EntityLinks-BBHWssHH.mjs';
15
- import { p as prettyDateFormat, v as getStatusColor, f as formatRelativeTime, c as copyPreview, j as clusterStatusColor, i as clusterErrorTypeColor, z as reportIcon, n as fileApiUrl, w as createSortHeader, d as formatDuration, F as getStatusTextClass, E as getStatusIcon, a as formatStatusLabel, D as isStatusInFlight, C as isPiwiAnnotation } from './index-CU2nZhAa.mjs';
16
- import { aa as formatBytes, bM as DEFAULT_WASTED_WAIT_PATTERNS, dH as isWastedWait } from '../nitro/nitro.mjs';
14
+ import { _ as __nuxt_component_1$2 } from './StatTileGrid-7zOFUQ6j.mjs';
15
+ import { p as prettyDateFormat, v as getStatusColor, f as formatRelativeTime, c as copyPreview, j as clusterStatusColor, i as clusterErrorTypeColor, z as reportIcon, n as fileApiUrl, w as createSortHeader, d as formatDuration, F as getStatusTextClass, E as getStatusIcon, a as formatStatusLabel, D as isStatusInFlight, C as isPiwiAnnotation } from './index-BOK1aJk9.mjs';
16
+ import { aa as formatBytes, bR as DEFAULT_WASTED_WAIT_PATTERNS, dX as isWastedWait } from '../nitro/nitro.mjs';
17
17
  import { defineComponent, withAsyncContext, ref, computed, watch, withCtx, isRef, unref, createVNode, createTextVNode, openBlock, createBlock, createCommentVNode, toDisplayString, nextTick, mergeProps, Fragment, renderList, useModel, mergeModels, withDirectives, vModelText, useSSRContext } from 'vue';
18
18
  import { ssrRenderComponent, ssrInterpolate, ssrRenderAttrs, ssrRenderClass, ssrRenderList, ssrRenderStyle, ssrRenderAttr, ssrRenderTeleport, ssrIncludeBooleanAttr } from 'vue/server-renderer';
19
- import { b as buildRetryCommand } from './useOpenInIde-BbTnPhFA.mjs';
20
- import { u as useCopy } from './useCopy-CeKWgHyT.mjs';
21
- import { _ as __nuxt_component_4$2 } from './FilterToolbar-BwXy8xSk.mjs';
22
- import { _ as _sfc_main$o } from './Select-5DK9frQ7.mjs';
23
- import { _ as _sfc_main$q } from './Checkbox-4Q5d0fa0.mjs';
24
- import { _ as __nuxt_component_1$3 } from './OpenInIdeLink-CQWKKChd.mjs';
25
- import { _ as __nuxt_component_2$3 } from './TestMetaBadges-D5_yUtIP.mjs';
26
- import { _ as __nuxt_component_3$3 } from './BrowserBadge-MFvBwxmD.mjs';
19
+ import { _ as __nuxt_component_19 } from './EntityLinks-CF0xG3Y8.mjs';
20
+ import { b as buildRetryCommand } from './useOpenInIde-DolN3bZ5.mjs';
21
+ import { u as useFetch, a as useCopy } from './fetch-BQg_fhX0.mjs';
22
+ import { _ as __nuxt_component_4$3 } from './FilterToolbar-BwXy8xSk.mjs';
23
+ import { _ as _sfc_main$q } from './Select-CVctwpib.mjs';
24
+ import { _ as _sfc_main$r } from './Checkbox-DmRKG-0s.mjs';
25
+ import { _ as __nuxt_component_1$3 } from './OpenInIdeLink-B9wvQkhy.mjs';
26
+ import { _ as __nuxt_component_2$3 } from './TestMetaBadges-BlyKmfeP.mjs';
27
+ import { _ as __nuxt_component_3$3 } from './BrowserBadge-DQqJS9CV.mjs';
27
28
  import { u as useTreeViewCookie } from './useTreeViewCookie-CQjQdTkH.mjs';
28
29
  import { _ as __nuxt_component_5$1 } from './ErrorState-CktYyeEZ.mjs';
29
- import { _ as __nuxt_component_1$1 } from './LoadingState-C3pBSuOO.mjs';
30
- import { _ as __nuxt_component_4$1 } from './EmptyState-DC2q_7TD.mjs';
31
- import { _ as __nuxt_component_11 } from './SectionCard-CN-v0FZ_.mjs';
30
+ import { _ as __nuxt_component_12$2 } from './LoadingState-B8v1nWJt.mjs';
31
+ import { _ as __nuxt_component_4$2 } from './EmptyState-DC2q_7TD.mjs';
32
+ import { _ as __nuxt_component_11 } from './SectionCard-BW5Lynrr.mjs';
32
33
  import { _ as __nuxt_component_3$2 } from './TableScroller-DMcdCVrH.mjs';
33
- import { _ as _sfc_main$i } from './Table-BRk04Hd2.mjs';
34
- import { _ as _sfc_main$n } from './Modal-pSDlXzT3.mjs';
35
- import { _ as __nuxt_component_0$2 } from './DiagnosisPanel-CALyEmcJ.mjs';
36
- import { u as useFetch } from './fetch-B4FwBOzu.mjs';
37
- import { _ as _sfc_main$j } from './SelectMenu-D-2FSqBU.mjs';
38
- import { _ as __nuxt_component_13$1 } from './RunStatusBadge-FfGb6bkW.mjs';
39
- import { _ as _sfc_main$l } from './Alert-C4xq8lao.mjs';
34
+ import { _ as _sfc_main$j } from './Table-BRk04Hd2.mjs';
35
+ import { _ as _sfc_main$o } from './Modal-pSDlXzT3.mjs';
36
+ import { _ as __nuxt_component_0$2 } from './DiagnosisPanel-BWTpoCKy.mjs';
37
+ import { _ as _sfc_main$l } from './SelectMenu-XLVBEa11.mjs';
38
+ import { _ as __nuxt_component_13$1 } from './RunStatusBadge-CuTDknRJ.mjs';
39
+ import { _ as _sfc_main$m } from './Alert-C4xq8lao.mjs';
40
40
  import { u as useRunComparison } from './useRunComparison-CiMBLpe2.mjs';
41
- import './DashboardSidebarToggle-DCTnHiIv.mjs';
41
+ import { _ as __nuxt_component_4$1 } from './FeatureUnavailable-CwPms6X_.mjs';
42
+ import './DashboardSidebarToggle-8EpBhX0R.mjs';
42
43
  import 'vue-router';
43
44
  import '@iconify/vue';
44
45
  import 'tailwindcss/colors';
@@ -71,6 +72,7 @@ import 'highlight.js/lib/languages/typescript';
71
72
  import 'highlight.js/lib/languages/xml';
72
73
  import 'highlight.js/lib/languages/yaml';
73
74
  import 'fflate';
75
+ import 'zod';
74
76
  import 'pixelmatch';
75
77
  import 'sharp';
76
78
  import '@anthropic-ai/sdk';
@@ -94,27 +96,187 @@ import 'node:zlib';
94
96
  import 'consola';
95
97
  import 'node:url';
96
98
  import '@iconify/utils';
97
- import './FormField-B0HKsdMd.mjs';
99
+ import './FormField-e7OnSKPM.mjs';
98
100
  import './Label-DYDR1Oeh.mjs';
99
- import './Switch-B5Fp8ULt.mjs';
101
+ import './Switch-8zWfwI5B.mjs';
100
102
  import './useFormControl-CZ9So7iX.mjs';
101
103
  import './useForwardScopeId-D0ameaSU.mjs';
102
104
  import './VisuallyHiddenInput-BHvzNumK.mjs';
103
- import './CodeBlock-BgE-NSmE.mjs';
105
+ import './CodeBlock-DGhKVFad.mjs';
104
106
  import './useTauri-Kf3HE_42.mjs';
105
107
  import './Tabs-BkSOnbaB.mjs';
106
108
  import './RovingFocusItem--OEHI2P3.mjs';
107
- import './Textarea-Dv2-lOvW.mjs';
109
+ import './Textarea-vkMKVQTJ.mjs';
108
110
  import './help-content-C876a9WD.mjs';
109
111
  import '../_/marker-categories.mjs';
110
112
  import 'date-fns';
113
+ import '@vue/shared';
111
114
  import './handleAndDispatchCustomEvent-Bk_AVSSo.mjs';
112
115
  import './isValueEqualOrExist-D2qw9YEr.mjs';
113
116
  import './Separator-CR4WcEKD.mjs';
114
117
  import '@tanstack/vue-table';
115
118
  import '@tanstack/vue-virtual';
116
- import '@vue/shared';
119
+ import './useAiStatus-UR8x-feE.mjs';
117
120
 
121
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
122
+ __name: "RunStorageChip",
123
+ __ssrInlineRender: true,
124
+ props: {
125
+ storageStats: {},
126
+ reports: {},
127
+ finalizing: { type: Boolean }
128
+ },
129
+ setup(__props) {
130
+ const config = useRuntimeConfig();
131
+ return (_ctx, _push, _parent, _attrs) => {
132
+ const _component_UIcon = _sfc_main$p;
133
+ const _component_UProgress = _sfc_main$j$1;
134
+ const _component_UPopover = _sfc_main$8$1;
135
+ const _component_HelpHint = __nuxt_component_2$2;
136
+ const _component_UButton = _sfc_main$k;
137
+ if (__props.finalizing) {
138
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "inline-flex items-center gap-2 text-info" }, _attrs))}>`);
139
+ _push(ssrRenderComponent(_component_UIcon, {
140
+ name: "i-lucide-upload",
141
+ class: "size-3.5 shrink-0 animate-pulse"
142
+ }, null, _parent));
143
+ _push(`<span class="text-xs font-medium whitespace-nowrap">Uploading reports &amp; traces…</span>`);
144
+ _push(ssrRenderComponent(_component_UProgress, {
145
+ value: null,
146
+ size: "sm",
147
+ color: "info",
148
+ class: "w-24 rounded-full animate-pulse"
149
+ }, null, _parent));
150
+ _push(`</div>`);
151
+ } else if (__props.storageStats?.totalFiles) {
152
+ _push(ssrRenderComponent(_component_UPopover, _attrs, {
153
+ content: withCtx((_, _push2, _parent2, _scopeId) => {
154
+ if (_push2) {
155
+ _push2(`<div class="p-3 w-72 space-y-2"${_scopeId}><p class="text-xs font-medium text-muted inline-flex items-center gap-1"${_scopeId}> Stored artifacts `);
156
+ _push2(ssrRenderComponent(_component_HelpHint, { topic: "run.reports" }, null, _parent2, _scopeId));
157
+ _push2(`</p><!--[-->`);
158
+ ssrRenderList(__props.reports, (report) => {
159
+ _push2(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId}>`);
160
+ _push2(ssrRenderComponent(_component_UButton, {
161
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
162
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
163
+ target: "_blank",
164
+ size: "xs",
165
+ variant: "outline",
166
+ class: "min-w-0",
167
+ ui: { label: "truncate" }
168
+ }, {
169
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
170
+ if (_push3) {
171
+ _push3(`${ssrInterpolate(report.label)}`);
172
+ } else {
173
+ return [
174
+ createTextVNode(toDisplayString(report.label), 1)
175
+ ];
176
+ }
177
+ }),
178
+ _: 2
179
+ }, _parent2, _scopeId));
180
+ _push2(`<span class="text-xs tabular-nums text-dimmed shrink-0"${_scopeId}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size))}</span></div>`);
181
+ });
182
+ _push2(`<!--]-->`);
183
+ if (__props.storageStats.testCaseFilesCount > 0) {
184
+ _push2(`<div class="flex items-center justify-between gap-2 text-sm border-t border-default pt-2"${_scopeId}><span class="truncate"${_scopeId}>Test files (${ssrInterpolate(__props.storageStats.testCaseFilesCount)})</span><span class="text-xs tabular-nums text-dimmed shrink-0"${_scopeId}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.testCaseFilesSize))}</span></div>`);
185
+ } else {
186
+ _push2(`<!---->`);
187
+ }
188
+ _push2(`</div>`);
189
+ } else {
190
+ return [
191
+ createVNode("div", { class: "p-3 w-72 space-y-2" }, [
192
+ createVNode("p", { class: "text-xs font-medium text-muted inline-flex items-center gap-1" }, [
193
+ createTextVNode(" Stored artifacts "),
194
+ createVNode(_component_HelpHint, { topic: "run.reports" })
195
+ ]),
196
+ (openBlock(true), createBlock(Fragment, null, renderList(__props.reports, (report) => {
197
+ return openBlock(), createBlock("div", {
198
+ key: `${report.type}-${report.path}`,
199
+ class: "flex items-center justify-between gap-2 min-w-0"
200
+ }, [
201
+ createVNode(_component_UButton, {
202
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
203
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
204
+ target: "_blank",
205
+ size: "xs",
206
+ variant: "outline",
207
+ class: "min-w-0",
208
+ ui: { label: "truncate" }
209
+ }, {
210
+ default: withCtx(() => [
211
+ createTextVNode(toDisplayString(report.label), 1)
212
+ ]),
213
+ _: 2
214
+ }, 1032, ["href", "icon"]),
215
+ createVNode("span", { class: "text-xs tabular-nums text-dimmed shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
216
+ ]);
217
+ }), 128)),
218
+ __props.storageStats.testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
219
+ key: 0,
220
+ class: "flex items-center justify-between gap-2 text-sm border-t border-default pt-2"
221
+ }, [
222
+ createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(__props.storageStats.testCaseFilesCount) + ")", 1),
223
+ createVNode("span", { class: "text-xs tabular-nums text-dimmed shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.testCaseFilesSize)), 1)
224
+ ])) : createCommentVNode("", true)
225
+ ])
226
+ ];
227
+ }
228
+ }),
229
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
230
+ if (_push2) {
231
+ _push2(`<button type="button" class="inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 -my-0.5 -ml-1.5 text-muted hover:text-default hover:bg-elevated/60 transition-colors cursor-pointer" title="Stored reports &amp; artifacts"${_scopeId}>`);
232
+ _push2(ssrRenderComponent(_component_UIcon, {
233
+ name: "i-lucide-database",
234
+ class: "size-3.5 text-dimmed shrink-0"
235
+ }, null, _parent2, _scopeId));
236
+ _push2(`<span class="tabular-nums whitespace-nowrap"${_scopeId}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.totalSize))} <span class="text-dimmed"${_scopeId}>· ${ssrInterpolate(__props.storageStats.totalFiles)} file${ssrInterpolate(__props.storageStats.totalFiles === 1 ? "" : "s")}</span></span>`);
237
+ _push2(ssrRenderComponent(_component_UIcon, {
238
+ name: "i-lucide-chevron-down",
239
+ class: "size-3 text-dimmed shrink-0"
240
+ }, null, _parent2, _scopeId));
241
+ _push2(`</button>`);
242
+ } else {
243
+ return [
244
+ createVNode("button", {
245
+ type: "button",
246
+ class: "inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 -my-0.5 -ml-1.5 text-muted hover:text-default hover:bg-elevated/60 transition-colors cursor-pointer",
247
+ title: "Stored reports & artifacts"
248
+ }, [
249
+ createVNode(_component_UIcon, {
250
+ name: "i-lucide-database",
251
+ class: "size-3.5 text-dimmed shrink-0"
252
+ }),
253
+ createVNode("span", { class: "tabular-nums whitespace-nowrap" }, [
254
+ createTextVNode(toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(__props.storageStats.totalSize)) + " ", 1),
255
+ createVNode("span", { class: "text-dimmed" }, "· " + toDisplayString(__props.storageStats.totalFiles) + " file" + toDisplayString(__props.storageStats.totalFiles === 1 ? "" : "s"), 1)
256
+ ]),
257
+ createVNode(_component_UIcon, {
258
+ name: "i-lucide-chevron-down",
259
+ class: "size-3 text-dimmed shrink-0"
260
+ })
261
+ ])
262
+ ];
263
+ }
264
+ }),
265
+ _: 1
266
+ }, _parent));
267
+ } else {
268
+ _push(`<!---->`);
269
+ }
270
+ };
271
+ }
272
+ });
273
+ const _sfc_setup$g = _sfc_main$g.setup;
274
+ _sfc_main$g.setup = (props, ctx) => {
275
+ const ssrContext = useSSRContext();
276
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/run/RunStorageChip.vue");
277
+ return _sfc_setup$g ? _sfc_setup$g(props, ctx) : void 0;
278
+ };
279
+ const __nuxt_component_18$1 = Object.assign(_sfc_main$g, { __name: "RunStorageChip" });
118
280
  const _sfc_main$f = /* @__PURE__ */ defineComponent({
119
281
  __name: "RunSummary",
120
282
  __ssrInlineRender: true,
@@ -134,17 +296,14 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
134
296
  const toast = useToast();
135
297
  const config = useRuntimeConfig();
136
298
  const storageStats = computed(() => props.testRun?.storageStats);
137
- const showCiEnv = computed(
138
- () => !!(props.testRun?.metadata?.ci || props.testRun?.environment || props.testRun?.playwrightVersion || props.testRun?.reporterVersion)
139
- );
140
- const showSource = computed(() => !!props.testRun?.metadata?.scm);
299
+ const ci = computed(() => props.testRun?.metadata?.ci);
300
+ const scm = computed(() => props.testRun?.metadata?.scm);
301
+ const tags = computed(() => props.testRun?.metadata?.tags);
302
+ const customData = computed(() => props.testRun?.metadata?.customData);
303
+ const showCiGroup = computed(() => !!(ci.value || props.testRun?.environment));
304
+ const showVersions = computed(() => !!(props.testRun?.playwrightVersion || props.testRun?.reporterVersion));
141
305
  const showStorage = computed(() => !!(storageStats.value?.totalFiles || props.finalizing));
142
- const showOther = computed(
143
- () => !!(props.testRun?.metadata?.tags?.length || props.testRun?.metadata?.projectDescription || props.testRun?.metadata?.relatedIssue || props.testRun?.metadata?.customData || props.testRun?.links?.length)
144
- );
145
- const { summaryColSpanClass, blockColSpanClass } = useDetailGrid(
146
- () => [showCiEnv, showSource, showStorage, showOther].filter((b) => b.value).length
147
- );
306
+ const primaryReport = computed(() => props.allReports[0] ?? null);
148
307
  const { copy, copied } = useCopy();
149
308
  const retryMode = ref("file-line");
150
309
  const retryCopied = ref(false);
@@ -239,29 +398,30 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
239
398
  }
240
399
  return (_ctx, _push, _parent, _attrs) => {
241
400
  const _component_FoldableSummary = __nuxt_component_0$1;
242
- const _component_StatusBlock = __nuxt_component_1$2;
401
+ const _component_StatusChip = __nuxt_component_1$1;
243
402
  const _component_UIcon = _sfc_main$p;
244
403
  const _component_UBadge = _sfc_main$7$1;
245
- const _component_TestStatusBar = __nuxt_component_14$2;
404
+ const _component_TestStatusBar = __nuxt_component_14$3;
246
405
  const _component_DurationValue = __nuxt_component_14$1;
247
- const _component_UCard = _sfc_main$m;
406
+ const _component_UCard = _sfc_main$n;
248
407
  const _component_HelpHint = __nuxt_component_2$2;
249
- const _component_UTooltip = _sfc_main$h;
408
+ const _component_UTooltip = _sfc_main$i;
250
409
  const _component_NuxtLink = __nuxt_component_12$1;
251
410
  const _component_MarkerBadge = __nuxt_component_5;
411
+ const _component_ClientOnly = __nuxt_component_7$1;
252
412
  const _component_UButton = _sfc_main$k;
253
413
  const _component_UPopover = _sfc_main$8$1;
254
- const _component_DesktopRunLocallyButton = __nuxt_component_13$2;
255
- const _component_CiEnvCard = __nuxt_component_14$3;
256
- const _component_SourceInfoCard = __nuxt_component_15$1;
257
- const _component_BlockCard = __nuxt_component_16$1;
258
- const _component_UProgress = _sfc_main$j$1;
259
- const _component_EntityLinks = __nuxt_component_18$1;
414
+ const _component_DesktopRunLocallyButton = __nuxt_component_14$2;
415
+ const _component_StatTileGrid = __nuxt_component_1$2;
416
+ const _component_SummaryMetaStrip = __nuxt_component_16$1;
417
+ const _component_MetaStripGroup = __nuxt_component_17$1;
418
+ const _component_RunStorageChip = __nuxt_component_18$1;
419
+ const _component_EntityLinks = __nuxt_component_19;
260
420
  _push(ssrRenderComponent(_component_FoldableSummary, mergeProps({ "storage-key": "test-run" }, _attrs), {
261
421
  folded: withCtx((_, _push2, _parent2, _scopeId) => {
262
422
  if (_push2) {
263
423
  _push2(`<div class="flex items-center gap-3 flex-1 min-w-0 justify-between"${_scopeId}><div class="flex items-center gap-3 min-w-0"${_scopeId}>`);
264
- _push2(ssrRenderComponent(_component_StatusBlock, {
424
+ _push2(ssrRenderComponent(_component_StatusChip, {
265
425
  status: __props.testRun?.status ?? "",
266
426
  size: "sm"
267
427
  }, null, _parent2, _scopeId));
@@ -335,7 +495,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
335
495
  return [
336
496
  createVNode("div", { class: "flex items-center gap-3 flex-1 min-w-0 justify-between" }, [
337
497
  createVNode("div", { class: "flex items-center gap-3 min-w-0" }, [
338
- createVNode(_component_StatusBlock, {
498
+ createVNode(_component_StatusChip, {
339
499
  status: __props.testRun?.status ?? "",
340
500
  size: "sm"
341
501
  }, null, 8, ["status"]),
@@ -437,134 +597,856 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
437
597
  }),
438
598
  default: withCtx((_, _push2, _parent2, _scopeId) => {
439
599
  if (_push2) {
440
- _push2(`<div class="grid grid-cols-1 lg:grid-cols-12 gap-4"${_scopeId}><div class="${ssrRenderClass(unref(summaryColSpanClass))}"${_scopeId}>`);
441
- _push2(ssrRenderComponent(_component_UCard, { class: "shadow-xs h-full" }, {
442
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
600
+ _push2(`<div class="@container"${_scopeId}>`);
601
+ _push2(ssrRenderComponent(_component_UCard, {
602
+ class: "shadow-xs",
603
+ ui: { footer: "px-4 py-2.5 sm:px-4 bg-muted/30" }
604
+ }, {
605
+ footer: withCtx((_2, _push3, _parent3, _scopeId2) => {
443
606
  if (_push3) {
444
- _push3(`<div class="space-y-3"${_scopeId2}><div class="flex items-start gap-3"${_scopeId2}><div class="flex items-center gap-2.5 min-w-0 flex-1"${_scopeId2}>`);
445
- _push3(ssrRenderComponent(_component_StatusBlock, {
446
- status: __props.testRun?.status ?? "",
447
- size: "md"
448
- }, null, _parent3, _scopeId2));
449
- _push3(`<div class="min-w-0 flex-1"${_scopeId2}><div class="flex items-center gap-2"${_scopeId2}><h2 class="text-base font-bold shrink-0 flex items-center gap-1"${_scopeId2}> Run #${ssrInterpolate(__props.testRun?.id)} `);
450
- if (unref(editingLabel)) {
451
- _push3(`<!--[--><input${ssrRenderAttr("value", unref(labelInput))} type="text" placeholder="Add a label..." class="inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId2}>`);
452
- if (unref(savingLabel)) {
453
- _push3(ssrRenderComponent(_component_UIcon, {
454
- name: "i-lucide-loader-circle",
455
- class: "size-3.5 text-zinc-400 animate-spin shrink-0"
456
- }, null, _parent3, _scopeId2));
457
- } else {
458
- _push3(`<!---->`);
459
- }
460
- _push3(`<!--]-->`);
461
- } else {
462
- _push3(`<!--[-->`);
463
- if (__props.testRun?.label) {
464
- _push3(`<span class="font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400"${_scopeId2}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
465
- } else {
466
- _push3(`<button class="text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5" title="Add a label"${_scopeId2}> + label </button>`);
467
- }
468
- _push3(`<!--]-->`);
469
- }
470
- _push3(ssrRenderComponent(_component_HelpHint, { topic: "run.summary" }, null, _parent3, _scopeId2));
471
- _push3(`</h2>`);
472
- if (__props.testRun?.shardTotal && __props.testRun.shardTotal > 1) {
473
- _push3(ssrRenderComponent(_component_UBadge, {
474
- color: "neutral",
475
- variant: "soft",
476
- size: "sm",
477
- class: "shrink-0",
478
- title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
479
- }, {
480
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
481
- if (_push4) {
482
- _push4(ssrRenderComponent(_component_UIcon, {
483
- name: "i-lucide-layout-grid",
484
- class: "size-3 mr-1"
485
- }, null, _parent4, _scopeId3));
486
- _push4(` ${ssrInterpolate(__props.testRun.shardsFinished ?? 0)}/${ssrInterpolate(__props.testRun.shardTotal)}`);
607
+ _push3(ssrRenderComponent(_component_SummaryMetaStrip, null, {
608
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
609
+ if (_push4) {
610
+ if (unref(showCiGroup)) {
611
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
612
+ label: "CI & environment",
613
+ icon: "i-lucide-cloud",
614
+ help: "run.ci-env"
615
+ }, {
616
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
617
+ if (_push5) {
618
+ if (__props.testRun?.environment) {
619
+ _push5(`<span class="rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"${_scopeId4}>${ssrInterpolate(__props.testRun.environment)}</span>`);
620
+ } else {
621
+ _push5(`<!---->`);
622
+ }
623
+ if (unref(ci)?.provider) {
624
+ _push5(`<span${_scopeId4}>${ssrInterpolate(unref(ci).provider)}</span>`);
625
+ } else {
626
+ _push5(`<!---->`);
627
+ }
628
+ if (unref(ci)?.buildNumber || unref(ci)?.buildUrl) {
629
+ _push5(`<!--[--><span class="text-dimmed"${_scopeId4}>·</span>`);
630
+ if (unref(ci)?.buildUrl) {
631
+ _push5(`<a${ssrRenderAttr("href", unref(ci).buildUrl)} target="_blank" class="text-primary hover:underline"${_scopeId4}>${ssrInterpolate(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build")}</a>`);
632
+ } else {
633
+ _push5(`<span${_scopeId4}>Build #${ssrInterpolate(unref(ci).buildNumber)}</span>`);
634
+ }
635
+ _push5(`<!--]-->`);
636
+ } else {
637
+ _push5(`<!---->`);
638
+ }
639
+ if (unref(ci)?.workflow || unref(ci)?.jobName) {
640
+ _push5(`<!--[--><span class="text-dimmed"${_scopeId4}>·</span><span class="text-muted"${_scopeId4}>`);
641
+ if (unref(ci)?.workflow) {
642
+ _push5(`<!--[-->${ssrInterpolate(unref(ci).workflow)}<!--]-->`);
643
+ } else {
644
+ _push5(`<!---->`);
645
+ }
646
+ if (unref(ci)?.workflow && unref(ci)?.jobName) {
647
+ _push5(`<!--[--> · <!--]-->`);
648
+ } else {
649
+ _push5(`<!---->`);
650
+ }
651
+ if (unref(ci)?.jobName) {
652
+ _push5(`<!--[-->${ssrInterpolate(unref(ci).jobName)}<!--]-->`);
653
+ } else {
654
+ _push5(`<!---->`);
655
+ }
656
+ _push5(`</span><!--]-->`);
657
+ } else {
658
+ _push5(`<!---->`);
659
+ }
660
+ } else {
661
+ return [
662
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
663
+ key: 0,
664
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
665
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
666
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
667
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
668
+ createVNode("span", { class: "text-dimmed" }, "·"),
669
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
670
+ key: 0,
671
+ href: unref(ci).buildUrl,
672
+ target: "_blank",
673
+ class: "text-primary hover:underline"
674
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
675
+ ], 64)) : createCommentVNode("", true),
676
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
677
+ createVNode("span", { class: "text-dimmed" }, "·"),
678
+ createVNode("span", { class: "text-muted" }, [
679
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
680
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
681
+ ], 64)) : createCommentVNode("", true),
682
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
683
+ createTextVNode(" · ")
684
+ ], 64)) : createCommentVNode("", true),
685
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
686
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
687
+ ], 64)) : createCommentVNode("", true)
688
+ ])
689
+ ], 64)) : createCommentVNode("", true)
690
+ ];
691
+ }
692
+ }),
693
+ _: 1
694
+ }, _parent4, _scopeId3));
487
695
  } else {
488
- return [
489
- createVNode(_component_UIcon, {
490
- name: "i-lucide-layout-grid",
491
- class: "size-3 mr-1"
696
+ _push4(`<!---->`);
697
+ }
698
+ if (unref(scm)) {
699
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
700
+ label: "Source",
701
+ icon: "i-lucide-git-branch"
702
+ }, {
703
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
704
+ if (_push5) {
705
+ if (unref(scm).branch) {
706
+ _push5(`<span class="font-medium"${_scopeId4}>${ssrInterpolate(unref(scm).branch)}</span>`);
707
+ } else {
708
+ _push5(`<!---->`);
709
+ }
710
+ if (unref(scm).commit) {
711
+ _push5(`<code class="text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded"${ssrRenderAttr("title", unref(scm).commit)}${_scopeId4}>${ssrInterpolate(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit)}</code>`);
712
+ } else {
713
+ _push5(`<!---->`);
714
+ }
715
+ if (unref(scm).author) {
716
+ _push5(`<span class="text-muted"${_scopeId4}>${ssrInterpolate(unref(scm).author)}</span>`);
717
+ } else {
718
+ _push5(`<!---->`);
719
+ }
720
+ if (unref(scm).commitMessage) {
721
+ _push5(`<span class="text-xs text-dimmed truncate max-w-[40ch]"${ssrRenderAttr("title", unref(scm).commitMessage)}${_scopeId4}>${ssrInterpolate(unref(scm).commitMessage)}</span>`);
722
+ } else {
723
+ _push5(`<!---->`);
724
+ }
725
+ } else {
726
+ return [
727
+ unref(scm).branch ? (openBlock(), createBlock("span", {
728
+ key: 0,
729
+ class: "font-medium"
730
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
731
+ unref(scm).commit ? (openBlock(), createBlock("code", {
732
+ key: 1,
733
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
734
+ title: unref(scm).commit
735
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
736
+ unref(scm).author ? (openBlock(), createBlock("span", {
737
+ key: 2,
738
+ class: "text-muted"
739
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
740
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
741
+ key: 3,
742
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
743
+ title: unref(scm).commitMessage
744
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
745
+ ];
746
+ }
492
747
  }),
493
- createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
494
- ];
748
+ _: 1
749
+ }, _parent4, _scopeId3));
750
+ } else {
751
+ _push4(`<!---->`);
495
752
  }
496
- }),
497
- _: 1
498
- }, _parent3, _scopeId2));
499
- } else {
500
- _push3(`<!---->`);
501
- }
502
- if (__props.testRun?.precedingMarker) {
503
- _push3(ssrRenderComponent(_component_UTooltip, {
504
- text: `This run started after: ${__props.testRun.precedingMarker.label}`
505
- }, {
506
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
507
- if (_push4) {
508
- _push4(ssrRenderComponent(_component_NuxtLink, {
509
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
510
- class: "shrink-0 inline-flex items-center gap-1"
753
+ if (unref(showVersions)) {
754
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
755
+ label: "Tooling versions",
756
+ icon: "i-lucide-tag"
511
757
  }, {
512
758
  default: withCtx((_4, _push5, _parent5, _scopeId4) => {
513
759
  if (_push5) {
514
- _push5(`<span class="text-xs text-muted"${_scopeId4}>After</span>`);
515
- _push5(ssrRenderComponent(_component_MarkerBadge, {
516
- marker: __props.testRun.precedingMarker,
517
- size: "xs"
518
- }, null, _parent5, _scopeId4));
760
+ _push5(`<span class="text-muted whitespace-nowrap"${_scopeId4}>`);
761
+ if (__props.testRun?.playwrightVersion) {
762
+ _push5(`<!--[-->Playwright v${ssrInterpolate(__props.testRun.playwrightVersion)}<!--]-->`);
763
+ } else {
764
+ _push5(`<!---->`);
765
+ }
766
+ if (__props.testRun?.playwrightVersion && __props.testRun?.reporterVersion) {
767
+ _push5(`<!--[--> · <!--]-->`);
768
+ } else {
769
+ _push5(`<!---->`);
770
+ }
771
+ if (__props.testRun?.reporterVersion) {
772
+ _push5(`<!--[-->Piwi v${ssrInterpolate(__props.testRun.reporterVersion)}<!--]-->`);
773
+ } else {
774
+ _push5(`<!---->`);
775
+ }
776
+ _push5(`</span>`);
519
777
  } else {
520
778
  return [
521
- createVNode("span", { class: "text-xs text-muted" }, "After"),
522
- createVNode(_component_MarkerBadge, {
523
- marker: __props.testRun.precedingMarker,
524
- size: "xs"
525
- }, null, 8, ["marker"])
779
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
780
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
781
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
782
+ ], 64)) : createCommentVNode("", true),
783
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
784
+ createTextVNode(" · ")
785
+ ], 64)) : createCommentVNode("", true),
786
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
787
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
788
+ ], 64)) : createCommentVNode("", true)
789
+ ])
526
790
  ];
527
791
  }
528
792
  }),
529
793
  _: 1
530
794
  }, _parent4, _scopeId3));
531
795
  } else {
532
- return [
533
- createVNode(_component_NuxtLink, {
534
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
535
- class: "shrink-0 inline-flex items-center gap-1"
536
- }, {
537
- default: withCtx(() => [
538
- createVNode("span", { class: "text-xs text-muted" }, "After"),
539
- createVNode(_component_MarkerBadge, {
540
- marker: __props.testRun.precedingMarker,
541
- size: "xs"
542
- }, null, 8, ["marker"])
543
- ]),
544
- _: 1
545
- }, 8, ["to"])
546
- ];
796
+ _push4(`<!---->`);
547
797
  }
548
- }),
549
- _: 1
550
- }, _parent3, _scopeId2));
551
- } else {
552
- _push3(`<!---->`);
553
- }
554
- _push3(`<span class="text-xs text-zinc-500 ml-auto whitespace-nowrap"${_scopeId2}>${ssrInterpolate(__props.testRun?.project?.label ?? __props.testRun?.project?.name)} · Started ${ssrInterpolate(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime))}</span>`);
555
- _push3(ssrRenderComponent(_component_UTooltip, {
556
- text: unref(copied) ? "Copied!" : "Copy run summary"
557
- }, {
558
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
559
- if (_push4) {
560
- _push4(ssrRenderComponent(_component_UButton, {
561
- size: "xs",
562
- variant: "ghost",
563
- color: "neutral",
564
- icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
565
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
566
- onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
567
- }, null, _parent4, _scopeId3));
798
+ if (unref(tags)?.length) {
799
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
800
+ label: "Tags",
801
+ icon: "i-lucide-tags"
802
+ }, {
803
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
804
+ if (_push5) {
805
+ _push5(`<!--[-->`);
806
+ ssrRenderList(unref(tags), (tag) => {
807
+ _push5(ssrRenderComponent(_component_UBadge, {
808
+ key: tag,
809
+ color: "neutral",
810
+ variant: "soft",
811
+ size: "sm"
812
+ }, {
813
+ default: withCtx((_5, _push6, _parent6, _scopeId5) => {
814
+ if (_push6) {
815
+ _push6(`${ssrInterpolate(tag)}`);
816
+ } else {
817
+ return [
818
+ createTextVNode(toDisplayString(tag), 1)
819
+ ];
820
+ }
821
+ }),
822
+ _: 2
823
+ }, _parent5, _scopeId4));
824
+ });
825
+ _push5(`<!--]-->`);
826
+ } else {
827
+ return [
828
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
829
+ return openBlock(), createBlock(_component_UBadge, {
830
+ key: tag,
831
+ color: "neutral",
832
+ variant: "soft",
833
+ size: "sm"
834
+ }, {
835
+ default: withCtx(() => [
836
+ createTextVNode(toDisplayString(tag), 1)
837
+ ]),
838
+ _: 2
839
+ }, 1024);
840
+ }), 128))
841
+ ];
842
+ }
843
+ }),
844
+ _: 1
845
+ }, _parent4, _scopeId3));
846
+ } else {
847
+ _push4(`<!---->`);
848
+ }
849
+ if (__props.testRun?.metadata?.relatedIssue) {
850
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
851
+ label: "Related issue",
852
+ icon: "i-lucide-bookmark"
853
+ }, {
854
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
855
+ if (_push5) {
856
+ _push5(`<span class="text-muted"${_scopeId4}>${ssrInterpolate(__props.testRun.metadata.relatedIssue)}</span>`);
857
+ } else {
858
+ return [
859
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
860
+ ];
861
+ }
862
+ }),
863
+ _: 1
864
+ }, _parent4, _scopeId3));
865
+ } else {
866
+ _push4(`<!---->`);
867
+ }
868
+ if (unref(showStorage)) {
869
+ _push4(ssrRenderComponent(_component_MetaStripGroup, { label: "Storage" }, {
870
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
871
+ if (_push5) {
872
+ _push5(ssrRenderComponent(_component_RunStorageChip, {
873
+ "storage-stats": unref(storageStats),
874
+ reports: __props.allReports,
875
+ finalizing: __props.finalizing
876
+ }, null, _parent5, _scopeId4));
877
+ } else {
878
+ return [
879
+ createVNode(_component_RunStorageChip, {
880
+ "storage-stats": unref(storageStats),
881
+ reports: __props.allReports,
882
+ finalizing: __props.finalizing
883
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
884
+ ];
885
+ }
886
+ }),
887
+ _: 1
888
+ }, _parent4, _scopeId3));
889
+ } else {
890
+ _push4(`<!---->`);
891
+ }
892
+ _push4(ssrRenderComponent(_component_MetaStripGroup, {
893
+ label: "Links",
894
+ icon: "i-lucide-link",
895
+ help: "run.metadata"
896
+ }, {
897
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
898
+ if (_push5) {
899
+ _push5(ssrRenderComponent(_component_EntityLinks, {
900
+ "entity-type": "test_run",
901
+ "entity-id": __props.testRun.id,
902
+ links: __props.testRun.links ?? null,
903
+ onUpdated: ($event) => _ctx.$emit("label-updated")
904
+ }, null, _parent5, _scopeId4));
905
+ } else {
906
+ return [
907
+ createVNode(_component_EntityLinks, {
908
+ "entity-type": "test_run",
909
+ "entity-id": __props.testRun.id,
910
+ links: __props.testRun.links ?? null,
911
+ onUpdated: ($event) => _ctx.$emit("label-updated")
912
+ }, null, 8, ["entity-id", "links", "onUpdated"])
913
+ ];
914
+ }
915
+ }),
916
+ _: 1
917
+ }, _parent4, _scopeId3));
918
+ if (unref(customData)) {
919
+ _push4(ssrRenderComponent(_component_MetaStripGroup, { label: "Custom data" }, {
920
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
921
+ if (_push5) {
922
+ _push5(ssrRenderComponent(_component_UButton, {
923
+ size: "xs",
924
+ variant: "ghost",
925
+ color: "neutral",
926
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
927
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
928
+ }, {
929
+ default: withCtx((_5, _push6, _parent6, _scopeId5) => {
930
+ if (_push6) {
931
+ _push6(` Custom data `);
932
+ } else {
933
+ return [
934
+ createTextVNode(" Custom data ")
935
+ ];
936
+ }
937
+ }),
938
+ _: 1
939
+ }, _parent5, _scopeId4));
940
+ } else {
941
+ return [
942
+ createVNode(_component_UButton, {
943
+ size: "xs",
944
+ variant: "ghost",
945
+ color: "neutral",
946
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
947
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
948
+ }, {
949
+ default: withCtx(() => [
950
+ createTextVNode(" Custom data ")
951
+ ]),
952
+ _: 1
953
+ }, 8, ["icon", "onClick"])
954
+ ];
955
+ }
956
+ }),
957
+ _: 1
958
+ }, _parent4, _scopeId3));
959
+ } else {
960
+ _push4(`<!---->`);
961
+ }
962
+ } else {
963
+ return [
964
+ unref(showCiGroup) ? (openBlock(), createBlock(_component_MetaStripGroup, {
965
+ key: 0,
966
+ label: "CI & environment",
967
+ icon: "i-lucide-cloud",
968
+ help: "run.ci-env"
969
+ }, {
970
+ default: withCtx(() => [
971
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
972
+ key: 0,
973
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
974
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
975
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
976
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
977
+ createVNode("span", { class: "text-dimmed" }, "·"),
978
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
979
+ key: 0,
980
+ href: unref(ci).buildUrl,
981
+ target: "_blank",
982
+ class: "text-primary hover:underline"
983
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
984
+ ], 64)) : createCommentVNode("", true),
985
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
986
+ createVNode("span", { class: "text-dimmed" }, "·"),
987
+ createVNode("span", { class: "text-muted" }, [
988
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
989
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
990
+ ], 64)) : createCommentVNode("", true),
991
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
992
+ createTextVNode(" · ")
993
+ ], 64)) : createCommentVNode("", true),
994
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
995
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
996
+ ], 64)) : createCommentVNode("", true)
997
+ ])
998
+ ], 64)) : createCommentVNode("", true)
999
+ ]),
1000
+ _: 1
1001
+ })) : createCommentVNode("", true),
1002
+ unref(scm) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1003
+ key: 1,
1004
+ label: "Source",
1005
+ icon: "i-lucide-git-branch"
1006
+ }, {
1007
+ default: withCtx(() => [
1008
+ unref(scm).branch ? (openBlock(), createBlock("span", {
1009
+ key: 0,
1010
+ class: "font-medium"
1011
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
1012
+ unref(scm).commit ? (openBlock(), createBlock("code", {
1013
+ key: 1,
1014
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
1015
+ title: unref(scm).commit
1016
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
1017
+ unref(scm).author ? (openBlock(), createBlock("span", {
1018
+ key: 2,
1019
+ class: "text-muted"
1020
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
1021
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
1022
+ key: 3,
1023
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
1024
+ title: unref(scm).commitMessage
1025
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
1026
+ ]),
1027
+ _: 1
1028
+ })) : createCommentVNode("", true),
1029
+ unref(showVersions) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1030
+ key: 2,
1031
+ label: "Tooling versions",
1032
+ icon: "i-lucide-tag"
1033
+ }, {
1034
+ default: withCtx(() => [
1035
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
1036
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1037
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
1038
+ ], 64)) : createCommentVNode("", true),
1039
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
1040
+ createTextVNode(" · ")
1041
+ ], 64)) : createCommentVNode("", true),
1042
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1043
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
1044
+ ], 64)) : createCommentVNode("", true)
1045
+ ])
1046
+ ]),
1047
+ _: 1
1048
+ })) : createCommentVNode("", true),
1049
+ unref(tags)?.length ? (openBlock(), createBlock(_component_MetaStripGroup, {
1050
+ key: 3,
1051
+ label: "Tags",
1052
+ icon: "i-lucide-tags"
1053
+ }, {
1054
+ default: withCtx(() => [
1055
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
1056
+ return openBlock(), createBlock(_component_UBadge, {
1057
+ key: tag,
1058
+ color: "neutral",
1059
+ variant: "soft",
1060
+ size: "sm"
1061
+ }, {
1062
+ default: withCtx(() => [
1063
+ createTextVNode(toDisplayString(tag), 1)
1064
+ ]),
1065
+ _: 2
1066
+ }, 1024);
1067
+ }), 128))
1068
+ ]),
1069
+ _: 1
1070
+ })) : createCommentVNode("", true),
1071
+ __props.testRun?.metadata?.relatedIssue ? (openBlock(), createBlock(_component_MetaStripGroup, {
1072
+ key: 4,
1073
+ label: "Related issue",
1074
+ icon: "i-lucide-bookmark"
1075
+ }, {
1076
+ default: withCtx(() => [
1077
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1078
+ ]),
1079
+ _: 1
1080
+ })) : createCommentVNode("", true),
1081
+ unref(showStorage) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1082
+ key: 5,
1083
+ label: "Storage"
1084
+ }, {
1085
+ default: withCtx(() => [
1086
+ createVNode(_component_RunStorageChip, {
1087
+ "storage-stats": unref(storageStats),
1088
+ reports: __props.allReports,
1089
+ finalizing: __props.finalizing
1090
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
1091
+ ]),
1092
+ _: 1
1093
+ })) : createCommentVNode("", true),
1094
+ createVNode(_component_MetaStripGroup, {
1095
+ label: "Links",
1096
+ icon: "i-lucide-link",
1097
+ help: "run.metadata"
1098
+ }, {
1099
+ default: withCtx(() => [
1100
+ createVNode(_component_EntityLinks, {
1101
+ "entity-type": "test_run",
1102
+ "entity-id": __props.testRun.id,
1103
+ links: __props.testRun.links ?? null,
1104
+ onUpdated: ($event) => _ctx.$emit("label-updated")
1105
+ }, null, 8, ["entity-id", "links", "onUpdated"])
1106
+ ]),
1107
+ _: 1
1108
+ }),
1109
+ unref(customData) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1110
+ key: 6,
1111
+ label: "Custom data"
1112
+ }, {
1113
+ default: withCtx(() => [
1114
+ createVNode(_component_UButton, {
1115
+ size: "xs",
1116
+ variant: "ghost",
1117
+ color: "neutral",
1118
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1119
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1120
+ }, {
1121
+ default: withCtx(() => [
1122
+ createTextVNode(" Custom data ")
1123
+ ]),
1124
+ _: 1
1125
+ }, 8, ["icon", "onClick"])
1126
+ ]),
1127
+ _: 1
1128
+ })) : createCommentVNode("", true)
1129
+ ];
1130
+ }
1131
+ }),
1132
+ _: 1
1133
+ }, _parent3, _scopeId2));
1134
+ if (__props.showCustomData && unref(customData)) {
1135
+ _push3(`<div class="mt-2"${_scopeId2}><div class="bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"${_scopeId2}><pre class="m-0"${_scopeId2}>${ssrInterpolate(JSON.stringify(unref(customData), null, 2))}</pre></div></div>`);
1136
+ } else {
1137
+ _push3(`<!---->`);
1138
+ }
1139
+ } else {
1140
+ return [
1141
+ createVNode(_component_SummaryMetaStrip, null, {
1142
+ default: withCtx(() => [
1143
+ unref(showCiGroup) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1144
+ key: 0,
1145
+ label: "CI & environment",
1146
+ icon: "i-lucide-cloud",
1147
+ help: "run.ci-env"
1148
+ }, {
1149
+ default: withCtx(() => [
1150
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
1151
+ key: 0,
1152
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
1153
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
1154
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
1155
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1156
+ createVNode("span", { class: "text-dimmed" }, "·"),
1157
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
1158
+ key: 0,
1159
+ href: unref(ci).buildUrl,
1160
+ target: "_blank",
1161
+ class: "text-primary hover:underline"
1162
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
1163
+ ], 64)) : createCommentVNode("", true),
1164
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
1165
+ createVNode("span", { class: "text-dimmed" }, "·"),
1166
+ createVNode("span", { class: "text-muted" }, [
1167
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1168
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
1169
+ ], 64)) : createCommentVNode("", true),
1170
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
1171
+ createTextVNode(" · ")
1172
+ ], 64)) : createCommentVNode("", true),
1173
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1174
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
1175
+ ], 64)) : createCommentVNode("", true)
1176
+ ])
1177
+ ], 64)) : createCommentVNode("", true)
1178
+ ]),
1179
+ _: 1
1180
+ })) : createCommentVNode("", true),
1181
+ unref(scm) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1182
+ key: 1,
1183
+ label: "Source",
1184
+ icon: "i-lucide-git-branch"
1185
+ }, {
1186
+ default: withCtx(() => [
1187
+ unref(scm).branch ? (openBlock(), createBlock("span", {
1188
+ key: 0,
1189
+ class: "font-medium"
1190
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
1191
+ unref(scm).commit ? (openBlock(), createBlock("code", {
1192
+ key: 1,
1193
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
1194
+ title: unref(scm).commit
1195
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
1196
+ unref(scm).author ? (openBlock(), createBlock("span", {
1197
+ key: 2,
1198
+ class: "text-muted"
1199
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
1200
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
1201
+ key: 3,
1202
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
1203
+ title: unref(scm).commitMessage
1204
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
1205
+ ]),
1206
+ _: 1
1207
+ })) : createCommentVNode("", true),
1208
+ unref(showVersions) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1209
+ key: 2,
1210
+ label: "Tooling versions",
1211
+ icon: "i-lucide-tag"
1212
+ }, {
1213
+ default: withCtx(() => [
1214
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
1215
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1216
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
1217
+ ], 64)) : createCommentVNode("", true),
1218
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
1219
+ createTextVNode(" · ")
1220
+ ], 64)) : createCommentVNode("", true),
1221
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
1222
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
1223
+ ], 64)) : createCommentVNode("", true)
1224
+ ])
1225
+ ]),
1226
+ _: 1
1227
+ })) : createCommentVNode("", true),
1228
+ unref(tags)?.length ? (openBlock(), createBlock(_component_MetaStripGroup, {
1229
+ key: 3,
1230
+ label: "Tags",
1231
+ icon: "i-lucide-tags"
1232
+ }, {
1233
+ default: withCtx(() => [
1234
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
1235
+ return openBlock(), createBlock(_component_UBadge, {
1236
+ key: tag,
1237
+ color: "neutral",
1238
+ variant: "soft",
1239
+ size: "sm"
1240
+ }, {
1241
+ default: withCtx(() => [
1242
+ createTextVNode(toDisplayString(tag), 1)
1243
+ ]),
1244
+ _: 2
1245
+ }, 1024);
1246
+ }), 128))
1247
+ ]),
1248
+ _: 1
1249
+ })) : createCommentVNode("", true),
1250
+ __props.testRun?.metadata?.relatedIssue ? (openBlock(), createBlock(_component_MetaStripGroup, {
1251
+ key: 4,
1252
+ label: "Related issue",
1253
+ icon: "i-lucide-bookmark"
1254
+ }, {
1255
+ default: withCtx(() => [
1256
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1257
+ ]),
1258
+ _: 1
1259
+ })) : createCommentVNode("", true),
1260
+ unref(showStorage) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1261
+ key: 5,
1262
+ label: "Storage"
1263
+ }, {
1264
+ default: withCtx(() => [
1265
+ createVNode(_component_RunStorageChip, {
1266
+ "storage-stats": unref(storageStats),
1267
+ reports: __props.allReports,
1268
+ finalizing: __props.finalizing
1269
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
1270
+ ]),
1271
+ _: 1
1272
+ })) : createCommentVNode("", true),
1273
+ createVNode(_component_MetaStripGroup, {
1274
+ label: "Links",
1275
+ icon: "i-lucide-link",
1276
+ help: "run.metadata"
1277
+ }, {
1278
+ default: withCtx(() => [
1279
+ createVNode(_component_EntityLinks, {
1280
+ "entity-type": "test_run",
1281
+ "entity-id": __props.testRun.id,
1282
+ links: __props.testRun.links ?? null,
1283
+ onUpdated: ($event) => _ctx.$emit("label-updated")
1284
+ }, null, 8, ["entity-id", "links", "onUpdated"])
1285
+ ]),
1286
+ _: 1
1287
+ }),
1288
+ unref(customData) ? (openBlock(), createBlock(_component_MetaStripGroup, {
1289
+ key: 6,
1290
+ label: "Custom data"
1291
+ }, {
1292
+ default: withCtx(() => [
1293
+ createVNode(_component_UButton, {
1294
+ size: "xs",
1295
+ variant: "ghost",
1296
+ color: "neutral",
1297
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1298
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1299
+ }, {
1300
+ default: withCtx(() => [
1301
+ createTextVNode(" Custom data ")
1302
+ ]),
1303
+ _: 1
1304
+ }, 8, ["icon", "onClick"])
1305
+ ]),
1306
+ _: 1
1307
+ })) : createCommentVNode("", true)
1308
+ ]),
1309
+ _: 1
1310
+ }),
1311
+ __props.showCustomData && unref(customData) ? (openBlock(), createBlock("div", {
1312
+ key: 0,
1313
+ class: "mt-2"
1314
+ }, [
1315
+ createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1316
+ createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(unref(customData), null, 2)), 1)
1317
+ ])
1318
+ ])) : createCommentVNode("", true)
1319
+ ];
1320
+ }
1321
+ }),
1322
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1323
+ if (_push3) {
1324
+ _push3(`<div class="space-y-3"${_scopeId2}><div class="flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8"${_scopeId2}><div class="min-w-0 flex-1 basis-64"${_scopeId2}><div class="flex items-center gap-2 flex-wrap"${_scopeId2}>`);
1325
+ _push3(ssrRenderComponent(_component_StatusChip, {
1326
+ status: __props.testRun?.status ?? ""
1327
+ }, null, _parent3, _scopeId2));
1328
+ _push3(`<h2 class="text-base font-bold shrink-0 flex items-center gap-1"${_scopeId2}> Run #${ssrInterpolate(__props.testRun?.id)} `);
1329
+ if (unref(editingLabel)) {
1330
+ _push3(`<!--[--><input${ssrRenderAttr("value", unref(labelInput))} type="text" placeholder="Add a label..." class="inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0"${_scopeId2}>`);
1331
+ if (unref(savingLabel)) {
1332
+ _push3(ssrRenderComponent(_component_UIcon, {
1333
+ name: "i-lucide-loader-circle",
1334
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1335
+ }, null, _parent3, _scopeId2));
1336
+ } else {
1337
+ _push3(`<!---->`);
1338
+ }
1339
+ _push3(`<!--]-->`);
1340
+ } else {
1341
+ _push3(`<!--[-->`);
1342
+ if (__props.testRun?.label) {
1343
+ _push3(`<span class="font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400"${_scopeId2}>— ${ssrInterpolate(__props.testRun.label)}</span>`);
1344
+ } else {
1345
+ _push3(`<button class="text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5" title="Add a label"${_scopeId2}> + label </button>`);
1346
+ }
1347
+ _push3(`<!--]-->`);
1348
+ }
1349
+ _push3(ssrRenderComponent(_component_HelpHint, { topic: "run.summary" }, null, _parent3, _scopeId2));
1350
+ _push3(`</h2>`);
1351
+ if (__props.testRun?.shardTotal && __props.testRun.shardTotal > 1) {
1352
+ _push3(ssrRenderComponent(_component_UBadge, {
1353
+ color: "neutral",
1354
+ variant: "soft",
1355
+ size: "sm",
1356
+ class: "shrink-0",
1357
+ title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
1358
+ }, {
1359
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1360
+ if (_push4) {
1361
+ _push4(ssrRenderComponent(_component_UIcon, {
1362
+ name: "i-lucide-layout-grid",
1363
+ class: "size-3 mr-1"
1364
+ }, null, _parent4, _scopeId3));
1365
+ _push4(` ${ssrInterpolate(__props.testRun.shardsFinished ?? 0)}/${ssrInterpolate(__props.testRun.shardTotal)}`);
1366
+ } else {
1367
+ return [
1368
+ createVNode(_component_UIcon, {
1369
+ name: "i-lucide-layout-grid",
1370
+ class: "size-3 mr-1"
1371
+ }),
1372
+ createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
1373
+ ];
1374
+ }
1375
+ }),
1376
+ _: 1
1377
+ }, _parent3, _scopeId2));
1378
+ } else {
1379
+ _push3(`<!---->`);
1380
+ }
1381
+ if (__props.testRun?.precedingMarker) {
1382
+ _push3(ssrRenderComponent(_component_UTooltip, {
1383
+ text: `This run started after: ${__props.testRun.precedingMarker.label}`
1384
+ }, {
1385
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1386
+ if (_push4) {
1387
+ _push4(ssrRenderComponent(_component_NuxtLink, {
1388
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1389
+ class: "shrink-0 inline-flex items-center gap-1"
1390
+ }, {
1391
+ default: withCtx((_4, _push5, _parent5, _scopeId4) => {
1392
+ if (_push5) {
1393
+ _push5(`<span class="text-xs text-muted"${_scopeId4}>After</span>`);
1394
+ _push5(ssrRenderComponent(_component_MarkerBadge, {
1395
+ marker: __props.testRun.precedingMarker,
1396
+ size: "xs"
1397
+ }, null, _parent5, _scopeId4));
1398
+ } else {
1399
+ return [
1400
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
1401
+ createVNode(_component_MarkerBadge, {
1402
+ marker: __props.testRun.precedingMarker,
1403
+ size: "xs"
1404
+ }, null, 8, ["marker"])
1405
+ ];
1406
+ }
1407
+ }),
1408
+ _: 1
1409
+ }, _parent4, _scopeId3));
1410
+ } else {
1411
+ return [
1412
+ createVNode(_component_NuxtLink, {
1413
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1414
+ class: "shrink-0 inline-flex items-center gap-1"
1415
+ }, {
1416
+ default: withCtx(() => [
1417
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
1418
+ createVNode(_component_MarkerBadge, {
1419
+ marker: __props.testRun.precedingMarker,
1420
+ size: "xs"
1421
+ }, null, 8, ["marker"])
1422
+ ]),
1423
+ _: 1
1424
+ }, 8, ["to"])
1425
+ ];
1426
+ }
1427
+ }),
1428
+ _: 1
1429
+ }, _parent3, _scopeId2));
1430
+ } else {
1431
+ _push3(`<!---->`);
1432
+ }
1433
+ _push3(`</div><p class="mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap"${_scopeId2}><span${_scopeId2}>Started ${ssrInterpolate(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime))}</span>`);
1434
+ _push3(ssrRenderComponent(_component_ClientOnly, null, {}, _parent3, _scopeId2));
1435
+ _push3(`</p></div><div class="flex items-center gap-1.5 shrink-0"${_scopeId2}>`);
1436
+ _push3(ssrRenderComponent(_component_UTooltip, {
1437
+ text: unref(copied) ? "Copied!" : "Copy run summary"
1438
+ }, {
1439
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1440
+ if (_push4) {
1441
+ _push4(ssrRenderComponent(_component_UButton, {
1442
+ size: "xs",
1443
+ variant: "ghost",
1444
+ color: "neutral",
1445
+ icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
1446
+ "aria-label": "Copy run summary",
1447
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1448
+ onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
1449
+ }, null, _parent4, _scopeId3));
568
1450
  } else {
569
1451
  return [
570
1452
  createVNode(_component_UButton, {
@@ -572,7 +1454,8 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
572
1454
  variant: "ghost",
573
1455
  color: "neutral",
574
1456
  icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
575
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1457
+ "aria-label": "Copy run summary",
1458
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
576
1459
  onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
577
1460
  }, null, 8, ["icon", "onClick"])
578
1461
  ];
@@ -612,14 +1495,15 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
612
1495
  variant: "subtle",
613
1496
  icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
614
1497
  title: unref(retryTitle),
1498
+ "aria-label": "Retry",
615
1499
  onClick: ($event) => copyRetryCommand()
616
1500
  }, {
617
1501
  default: withCtx((_4, _push5, _parent5, _scopeId4) => {
618
1502
  if (_push5) {
619
- _push5(` Retry `);
1503
+ _push5(`<span class="hidden @2xl:inline"${_scopeId4}>Retry</span>`);
620
1504
  } else {
621
1505
  return [
622
- createTextVNode(" Retry ")
1506
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
623
1507
  ];
624
1508
  }
625
1509
  }),
@@ -633,10 +1517,11 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
633
1517
  variant: "subtle",
634
1518
  icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
635
1519
  title: unref(retryTitle),
1520
+ "aria-label": "Retry",
636
1521
  onClick: ($event) => copyRetryCommand()
637
1522
  }, {
638
1523
  default: withCtx(() => [
639
- createTextVNode(" Retry ")
1524
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
640
1525
  ]),
641
1526
  _: 1
642
1527
  }, 8, ["icon", "title", "onClick"])
@@ -657,38 +1542,142 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
657
1542
  } else {
658
1543
  _push3(`<!---->`);
659
1544
  }
660
- _push3(`</div></div></div></div><div class="grid grid-cols-3 sm:grid-cols-5 gap-2"${_scopeId2}><button class="${ssrRenderClass([
661
- __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
662
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
663
- ])}"${_scopeId2}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId2}>Total</p><p class="text-xl font-bold mt-0.5"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0)}</p></button><div class="relative"${_scopeId2}><button class="${ssrRenderClass([
664
- __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30",
665
- "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer"
666
- ])}"${_scopeId2}><p class="text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider"${_scopeId2}> Passed </p><p class="text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</p></button>`);
667
- if ((__props.testRun?.flakyTests ?? 0) > 0) {
668
- _push3(`<button class="${ssrRenderClass([
669
- __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60",
670
- "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer"
671
- ])}" title="Flaky — passed only after a retry (a subset of passed). Click to filter."${_scopeId2}>`);
672
- _push3(ssrRenderComponent(_component_UIcon, {
673
- name: "i-lucide-shuffle",
674
- class: "size-3"
675
- }, null, _parent3, _scopeId2));
676
- _push3(` ${ssrInterpolate(__props.testRun?.flakyTests ?? 0)}</button>`);
1545
+ if (unref(primaryReport)) {
1546
+ _push3(ssrRenderComponent(_component_UButton, {
1547
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(unref(primaryReport).path, null, unref(config).app?.baseURL),
1548
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(unref(primaryReport).type),
1549
+ target: "_blank",
1550
+ size: "xs",
1551
+ color: "primary",
1552
+ variant: "outline",
1553
+ "aria-label": unref(primaryReport).label,
1554
+ title: unref(primaryReport).size ? `${unref(primaryReport).label} · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(primaryReport).size)}` : unref(primaryReport).label
1555
+ }, {
1556
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1557
+ if (_push4) {
1558
+ _push4(`<span class="hidden @2xl:inline"${_scopeId3}>${ssrInterpolate(unref(primaryReport).label)}</span>`);
1559
+ } else {
1560
+ return [
1561
+ createVNode("span", { class: "hidden @2xl:inline" }, toDisplayString(unref(primaryReport).label), 1)
1562
+ ];
1563
+ }
1564
+ }),
1565
+ _: 1
1566
+ }, _parent3, _scopeId2));
677
1567
  } else {
678
1568
  _push3(`<!---->`);
679
1569
  }
680
- _push3(`</div><button class="${ssrRenderClass([
681
- __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30",
682
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
683
- ])}"${_scopeId2}><p class="text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider"${_scopeId2}>Failed</p><p class="text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</p></button><button class="${ssrRenderClass([
684
- __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
685
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
686
- ])}"${_scopeId2}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId2}>Skipped</p><p class="text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400"${_scopeId2}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</p></button><button class="${ssrRenderClass([
687
- __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30",
688
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
689
- ])}" title="Tests that never ran (maxFailures cutoff or a serial-group failure)"${_scopeId2}><p class="text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"${_scopeId2}> Didn&#39;t run </p><p class="text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"${_scopeId2}>${ssrInterpolate(__props.testRun?.didNotRunTests ?? 0)}</p></button></div><div${_scopeId2}>`);
1570
+ _push3(`</div></div>`);
1571
+ _push3(ssrRenderComponent(_component_StatTileGrid, { "min-tile-width": "7.5rem" }, {
1572
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1573
+ if (_push4) {
1574
+ _push4(`<button class="${ssrRenderClass([
1575
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
1576
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1577
+ ])}"${_scopeId3}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId3}>Total</p><p class="text-xl font-bold mt-0.5"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0)}</p></button><div class="relative"${_scopeId3}><button class="${ssrRenderClass([
1578
+ __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30",
1579
+ "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer"
1580
+ ])}"${_scopeId3}><p class="text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider"${_scopeId3}> Passed </p><p class="text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0)}</p></button>`);
1581
+ if ((__props.testRun?.flakyTests ?? 0) > 0) {
1582
+ _push4(`<button class="${ssrRenderClass([
1583
+ __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60",
1584
+ "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer"
1585
+ ])}" title="Flaky — passed only after a retry (a subset of passed). Click to filter."${_scopeId3}>`);
1586
+ _push4(ssrRenderComponent(_component_UIcon, {
1587
+ name: "i-lucide-shuffle",
1588
+ class: "size-3"
1589
+ }, null, _parent4, _scopeId3));
1590
+ _push4(` ${ssrInterpolate(__props.testRun?.flakyTests ?? 0)}</button>`);
1591
+ } else {
1592
+ _push4(`<!---->`);
1593
+ }
1594
+ _push4(`</div><button class="${ssrRenderClass([
1595
+ __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30",
1596
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1597
+ ])}"${_scopeId3}><p class="text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider"${_scopeId3}>Failed</p><p class="text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0)}</p></button><button class="${ssrRenderClass([
1598
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated",
1599
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1600
+ ])}"${_scopeId3}><p class="text-xs font-medium text-zinc-500 uppercase tracking-wider"${_scopeId3}>Skipped</p><p class="text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400"${_scopeId3}>${ssrInterpolate(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0)}</p></button><button class="${ssrRenderClass([
1601
+ __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30",
1602
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer"
1603
+ ])}" title="Tests that never ran (maxFailures cutoff or a serial-group failure)"${_scopeId3}><p class="text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"${_scopeId3}>Didn&#39;t run</p><p class="text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"${_scopeId3}>${ssrInterpolate(__props.testRun?.didNotRunTests ?? 0)}</p></button>`);
1604
+ } else {
1605
+ return [
1606
+ createVNode("button", {
1607
+ class: [
1608
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1609
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1610
+ ],
1611
+ onClick: ($event) => emit("filter-status", "all")
1612
+ }, [
1613
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
1614
+ createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
1615
+ ], 10, ["onClick"]),
1616
+ createVNode("div", { class: "relative" }, [
1617
+ createVNode("button", {
1618
+ class: [
1619
+ "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
1620
+ __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"
1621
+ ],
1622
+ onClick: ($event) => emit("filter-status", "passed")
1623
+ }, [
1624
+ createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
1625
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1626
+ ], 10, ["onClick"]),
1627
+ (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
1628
+ key: 0,
1629
+ class: [
1630
+ "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",
1631
+ __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"
1632
+ ],
1633
+ title: "Flaky — passed only after a retry (a subset of passed). Click to filter.",
1634
+ onClick: ($event) => emit("filter-status", "flaky")
1635
+ }, [
1636
+ createVNode(_component_UIcon, {
1637
+ name: "i-lucide-shuffle",
1638
+ class: "size-3"
1639
+ }),
1640
+ createTextVNode(" " + toDisplayString(__props.testRun?.flakyTests ?? 0), 1)
1641
+ ], 10, ["onClick"])) : createCommentVNode("", true)
1642
+ ]),
1643
+ createVNode("button", {
1644
+ class: [
1645
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1646
+ __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"
1647
+ ],
1648
+ onClick: ($event) => emit("filter-status", "failed")
1649
+ }, [
1650
+ createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
1651
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
1652
+ ], 10, ["onClick"]),
1653
+ createVNode("button", {
1654
+ class: [
1655
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1656
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1657
+ ],
1658
+ onClick: ($event) => emit("filter-status", "skipped")
1659
+ }, [
1660
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
1661
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
1662
+ ], 10, ["onClick"]),
1663
+ createVNode("button", {
1664
+ class: [
1665
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1666
+ __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"
1667
+ ],
1668
+ title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
1669
+ onClick: ($event) => emit("filter-status", "didnotrun")
1670
+ }, [
1671
+ createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, "Didn't run"),
1672
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
1673
+ ], 10, ["onClick"])
1674
+ ];
1675
+ }
1676
+ }),
1677
+ _: 1
1678
+ }, _parent3, _scopeId2));
690
1679
  if (__props.testRun) {
691
- _push3(`<div class="flex items-center gap-3"${_scopeId2}><div class="flex-1 max-w-md"${_scopeId2}>`);
1680
+ _push3(`<div class="flex items-center gap-x-4 gap-y-1.5 flex-wrap"${_scopeId2}><div class="flex-1 basis-60 min-w-44 max-w-xl"${_scopeId2}>`);
692
1681
  _push3(ssrRenderComponent(_component_TestStatusBar, {
693
1682
  passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
694
1683
  failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
@@ -697,7 +1686,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
697
1686
  "did-not-run": __props.testRun?.didNotRunTests ?? 0,
698
1687
  total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
699
1688
  }, null, _parent3, _scopeId2));
700
- _push3(`</div><div class="flex items-center gap-3 text-xs shrink-0"${_scopeId2}><div class="flex items-center gap-1"${_scopeId2}>`);
1689
+ _push3(`</div><div class="flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0"${_scopeId2}><div class="flex items-center gap-1"${_scopeId2}>`);
701
1690
  _push3(ssrRenderComponent(_component_UIcon, {
702
1691
  name: "i-lucide-clock",
703
1692
  class: "size-3.5 text-zinc-400"
@@ -713,7 +1702,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
713
1702
  name: "i-lucide-gauge",
714
1703
  class: "size-3.5 text-zinc-400"
715
1704
  }, null, _parent3, _scopeId2));
716
- _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>Avg</span>`);
1705
+ _push3(`<span class="text-zinc-500"${_scopeId2}>Avg</span>`);
717
1706
  _push3(ssrRenderComponent(_component_DurationValue, {
718
1707
  ms: __props.testRun.avgTestDuration,
719
1708
  class: "font-medium"
@@ -728,7 +1717,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
728
1717
  name: "i-lucide-arrow-up-right",
729
1718
  class: "size-3.5 text-orange-500"
730
1719
  }, null, _parent3, _scopeId2));
731
- _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>P90</span>`);
1720
+ _push3(`<span class="text-zinc-500"${_scopeId2}>P90</span>`);
732
1721
  _push3(ssrRenderComponent(_component_DurationValue, {
733
1722
  ms: __props.testRun.p90TestDuration,
734
1723
  class: "font-medium text-orange-600 dark:text-orange-400",
@@ -744,7 +1733,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
744
1733
  name: "i-lucide-clock",
745
1734
  class: "size-3.5 text-amber-500"
746
1735
  }, null, _parent3, _scopeId2));
747
- _push3(`<span class="text-zinc-500 hidden sm:inline"${_scopeId2}>Wasted</span>`);
1736
+ _push3(`<span class="text-zinc-500"${_scopeId2}>Wasted</span>`);
748
1737
  _push3(ssrRenderComponent(_component_DurationValue, {
749
1738
  ms: __props.totalWastedTime,
750
1739
  class: "font-medium text-amber-600 dark:text-amber-400",
@@ -758,289 +1747,315 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
758
1747
  } else {
759
1748
  _push3(`<!---->`);
760
1749
  }
761
- _push3(`</div></div>`);
1750
+ _push3(`</div>`);
762
1751
  } else {
763
1752
  return [
764
1753
  createVNode("div", { class: "space-y-3" }, [
765
- createVNode("div", { class: "flex items-start gap-3" }, [
766
- createVNode("div", { class: "flex items-center gap-2.5 min-w-0 flex-1" }, [
767
- createVNode(_component_StatusBlock, {
768
- status: __props.testRun?.status ?? "",
769
- size: "md"
770
- }, null, 8, ["status"]),
771
- createVNode("div", { class: "min-w-0 flex-1" }, [
772
- createVNode("div", { class: "flex items-center gap-2" }, [
773
- createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
774
- createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
775
- unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
776
- withDirectives(createVNode("input", {
777
- ref_key: "labelInputRef",
778
- ref: labelInputRef,
779
- "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
780
- type: "text",
781
- placeholder: "Add a label...",
782
- class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
783
- onKeydown: onLabelKeydown,
784
- onBlur: saveLabel
785
- }, null, 40, ["onUpdate:modelValue"]), [
786
- [vModelText, unref(labelInput)]
1754
+ createVNode("div", { class: "flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8" }, [
1755
+ createVNode("div", { class: "min-w-0 flex-1 basis-64" }, [
1756
+ createVNode("div", { class: "flex items-center gap-2 flex-wrap" }, [
1757
+ createVNode(_component_StatusChip, {
1758
+ status: __props.testRun?.status ?? ""
1759
+ }, null, 8, ["status"]),
1760
+ createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
1761
+ createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
1762
+ unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1763
+ withDirectives(createVNode("input", {
1764
+ ref_key: "labelInputRef",
1765
+ ref: labelInputRef,
1766
+ "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
1767
+ type: "text",
1768
+ placeholder: "Add a label...",
1769
+ class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
1770
+ onKeydown: onLabelKeydown,
1771
+ onBlur: saveLabel
1772
+ }, null, 40, ["onUpdate:modelValue"]), [
1773
+ [vModelText, unref(labelInput)]
1774
+ ]),
1775
+ unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1776
+ key: 0,
1777
+ name: "i-lucide-loader-circle",
1778
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1779
+ })) : createCommentVNode("", true)
1780
+ ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
1781
+ __props.testRun?.label ? (openBlock(), createBlock("span", {
1782
+ key: 0,
1783
+ class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
1784
+ onClick: startEditLabel
1785
+ }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1786
+ key: 1,
1787
+ class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
1788
+ title: "Add a label",
1789
+ onClick: startEditLabel
1790
+ }, " + label "))
1791
+ ], 64)),
1792
+ createVNode(_component_HelpHint, { topic: "run.summary" })
1793
+ ]),
1794
+ __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
1795
+ key: 0,
1796
+ color: "neutral",
1797
+ variant: "soft",
1798
+ size: "sm",
1799
+ class: "shrink-0",
1800
+ title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
1801
+ }, {
1802
+ default: withCtx(() => [
1803
+ createVNode(_component_UIcon, {
1804
+ name: "i-lucide-layout-grid",
1805
+ class: "size-3 mr-1"
1806
+ }),
1807
+ createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
1808
+ ]),
1809
+ _: 1
1810
+ }, 8, ["title"])) : createCommentVNode("", true),
1811
+ __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
1812
+ key: 1,
1813
+ text: `This run started after: ${__props.testRun.precedingMarker.label}`
1814
+ }, {
1815
+ default: withCtx(() => [
1816
+ createVNode(_component_NuxtLink, {
1817
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1818
+ class: "shrink-0 inline-flex items-center gap-1"
1819
+ }, {
1820
+ default: withCtx(() => [
1821
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
1822
+ createVNode(_component_MarkerBadge, {
1823
+ marker: __props.testRun.precedingMarker,
1824
+ size: "xs"
1825
+ }, null, 8, ["marker"])
787
1826
  ]),
788
- unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
789
- key: 0,
790
- name: "i-lucide-loader-circle",
791
- class: "size-3.5 text-zinc-400 animate-spin shrink-0"
792
- })) : createCommentVNode("", true)
793
- ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
794
- __props.testRun?.label ? (openBlock(), createBlock("span", {
795
- key: 0,
796
- class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
797
- onClick: startEditLabel
798
- }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
799
- key: 1,
800
- class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
801
- title: "Add a label",
802
- onClick: startEditLabel
803
- }, " + label "))
804
- ], 64)),
805
- createVNode(_component_HelpHint, { topic: "run.summary" })
1827
+ _: 1
1828
+ }, 8, ["to"])
806
1829
  ]),
807
- __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
808
- key: 0,
1830
+ _: 1
1831
+ }, 8, ["text"])) : createCommentVNode("", true)
1832
+ ]),
1833
+ createVNode("p", { class: "mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap" }, [
1834
+ createVNode("span", null, "Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
1835
+ createVNode(_component_ClientOnly, null, {
1836
+ default: withCtx(() => [
1837
+ createVNode("span", { class: "text-dimmed" }, "· " + toDisplayString(("formatRelativeTime" in _ctx ? _ctx.formatRelativeTime : unref(formatRelativeTime))(__props.testRun?.startTime)), 1)
1838
+ ]),
1839
+ _: 1
1840
+ })
1841
+ ])
1842
+ ]),
1843
+ createVNode("div", { class: "flex items-center gap-1.5 shrink-0" }, [
1844
+ createVNode(_component_UTooltip, {
1845
+ text: unref(copied) ? "Copied!" : "Copy run summary"
1846
+ }, {
1847
+ default: withCtx(() => [
1848
+ createVNode(_component_UButton, {
1849
+ size: "xs",
1850
+ variant: "ghost",
809
1851
  color: "neutral",
810
- variant: "soft",
811
- size: "sm",
812
- class: "shrink-0",
813
- title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
814
- }, {
815
- default: withCtx(() => [
816
- createVNode(_component_UIcon, {
817
- name: "i-lucide-layout-grid",
818
- class: "size-3 mr-1"
819
- }),
820
- createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
821
- ]),
822
- _: 1
823
- }, 8, ["title"])) : createCommentVNode("", true),
824
- __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
825
- key: 1,
826
- text: `This run started after: ${__props.testRun.precedingMarker.label}`
827
- }, {
828
- default: withCtx(() => [
829
- createVNode(_component_NuxtLink, {
830
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
831
- class: "shrink-0 inline-flex items-center gap-1"
832
- }, {
833
- default: withCtx(() => [
834
- createVNode("span", { class: "text-xs text-muted" }, "After"),
835
- createVNode(_component_MarkerBadge, {
836
- marker: __props.testRun.precedingMarker,
837
- size: "xs"
838
- }, null, 8, ["marker"])
839
- ]),
840
- _: 1
841
- }, 8, ["to"])
842
- ]),
843
- _: 1
844
- }, 8, ["text"])) : createCommentVNode("", true),
845
- createVNode("span", { class: "text-xs text-zinc-500 ml-auto whitespace-nowrap" }, toDisplayString(__props.testRun?.project?.label ?? __props.testRun?.project?.name) + " · Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
846
- createVNode(_component_UTooltip, {
847
- text: unref(copied) ? "Copied!" : "Copy run summary"
1852
+ icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
1853
+ "aria-label": "Copy run summary",
1854
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1855
+ onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
1856
+ }, null, 8, ["icon", "onClick"])
1857
+ ]),
1858
+ _: 1
1859
+ }, 8, ["text"]),
1860
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 0 }, {
1861
+ content: withCtx(() => [
1862
+ createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
1863
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
1864
+ (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
1865
+ return createVNode("button", {
1866
+ key: m,
1867
+ class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
1868
+ onClick: ($event) => retryMode.value = m
1869
+ }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
1870
+ }), 64))
1871
+ ])
1872
+ ]),
1873
+ default: withCtx(() => [
1874
+ createVNode(_component_UButton, {
1875
+ size: "xs",
1876
+ color: "warning",
1877
+ variant: "subtle",
1878
+ icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
1879
+ title: unref(retryTitle),
1880
+ "aria-label": "Retry",
1881
+ onClick: ($event) => copyRetryCommand()
848
1882
  }, {
849
1883
  default: withCtx(() => [
850
- createVNode(_component_UButton, {
851
- size: "xs",
852
- variant: "ghost",
853
- color: "neutral",
854
- icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
855
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
856
- onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
857
- }, null, 8, ["icon", "onClick"])
858
- ]),
859
- _: 1
860
- }, 8, ["text"]),
861
- unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 2 }, {
862
- content: withCtx(() => [
863
- createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
864
- createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
865
- (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
866
- return createVNode("button", {
867
- key: m,
868
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
869
- onClick: ($event) => retryMode.value = m
870
- }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
871
- }), 64))
872
- ])
873
- ]),
874
- default: withCtx(() => [
875
- createVNode(_component_UButton, {
876
- size: "xs",
877
- color: "warning",
878
- variant: "subtle",
879
- icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
880
- title: unref(retryTitle),
881
- onClick: ($event) => copyRetryCommand()
882
- }, {
883
- default: withCtx(() => [
884
- createTextVNode(" Retry ")
885
- ]),
886
- _: 1
887
- }, 8, ["icon", "title", "onClick"])
1884
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
888
1885
  ]),
889
1886
  _: 1
890
- })) : createCommentVNode("", true),
891
- unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
892
- key: 3,
893
- "project-id": __props.testRun?.project?.id,
894
- "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
895
- cases: unref(failedCases)
896
- }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true)
897
- ])
898
- ])
1887
+ }, 8, ["icon", "title", "onClick"])
1888
+ ]),
1889
+ _: 1
1890
+ })) : createCommentVNode("", true),
1891
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
1892
+ key: 1,
1893
+ "project-id": __props.testRun?.project?.id,
1894
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
1895
+ cases: unref(failedCases)
1896
+ }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true),
1897
+ unref(primaryReport) ? (openBlock(), createBlock(_component_UButton, {
1898
+ key: 2,
1899
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(unref(primaryReport).path, null, unref(config).app?.baseURL),
1900
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(unref(primaryReport).type),
1901
+ target: "_blank",
1902
+ size: "xs",
1903
+ color: "primary",
1904
+ variant: "outline",
1905
+ "aria-label": unref(primaryReport).label,
1906
+ title: unref(primaryReport).size ? `${unref(primaryReport).label} · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(primaryReport).size)}` : unref(primaryReport).label
1907
+ }, {
1908
+ default: withCtx(() => [
1909
+ createVNode("span", { class: "hidden @2xl:inline" }, toDisplayString(unref(primaryReport).label), 1)
1910
+ ]),
1911
+ _: 1
1912
+ }, 8, ["href", "icon", "aria-label", "title"])) : createCommentVNode("", true)
899
1913
  ])
900
1914
  ]),
901
- createVNode("div", { class: "grid grid-cols-3 sm:grid-cols-5 gap-2" }, [
902
- createVNode("button", {
903
- class: [
904
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
905
- __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
906
- ],
907
- onClick: ($event) => emit("filter-status", "all")
908
- }, [
909
- createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
910
- createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
911
- ], 10, ["onClick"]),
912
- createVNode("div", { class: "relative" }, [
1915
+ createVNode(_component_StatTileGrid, { "min-tile-width": "7.5rem" }, {
1916
+ default: withCtx(() => [
913
1917
  createVNode("button", {
914
1918
  class: [
915
- "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
916
- __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"
1919
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1920
+ __props.activeFilter === "all" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
917
1921
  ],
918
- onClick: ($event) => emit("filter-status", "passed")
1922
+ onClick: ($event) => emit("filter-status", "all")
919
1923
  }, [
920
- createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
921
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1924
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Total"),
1925
+ createVNode("p", { class: "text-xl font-bold mt-0.5" }, toDisplayString(__props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0), 1)
922
1926
  ], 10, ["onClick"]),
923
- (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
924
- key: 0,
1927
+ createVNode("div", { class: "relative" }, [
1928
+ createVNode("button", {
1929
+ class: [
1930
+ "rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",
1931
+ __props.activeFilter === "passed" ? "bg-emerald-100 dark:bg-emerald-900/30 ring-2 ring-emerald-400 dark:ring-emerald-600" : "bg-emerald-50 dark:bg-emerald-900/20 hover:bg-emerald-100 dark:hover:bg-emerald-900/30"
1932
+ ],
1933
+ onClick: ($event) => emit("filter-status", "passed")
1934
+ }, [
1935
+ createVNode("p", { class: "text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider" }, " Passed "),
1936
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400" }, toDisplayString(__props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0), 1)
1937
+ ], 10, ["onClick"]),
1938
+ (__props.testRun?.flakyTests ?? 0) > 0 ? (openBlock(), createBlock("button", {
1939
+ key: 0,
1940
+ class: [
1941
+ "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",
1942
+ __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"
1943
+ ],
1944
+ title: "Flaky — passed only after a retry (a subset of passed). Click to filter.",
1945
+ onClick: ($event) => emit("filter-status", "flaky")
1946
+ }, [
1947
+ createVNode(_component_UIcon, {
1948
+ name: "i-lucide-shuffle",
1949
+ class: "size-3"
1950
+ }),
1951
+ createTextVNode(" " + toDisplayString(__props.testRun?.flakyTests ?? 0), 1)
1952
+ ], 10, ["onClick"])) : createCommentVNode("", true)
1953
+ ]),
1954
+ createVNode("button", {
1955
+ class: [
1956
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1957
+ __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"
1958
+ ],
1959
+ onClick: ($event) => emit("filter-status", "failed")
1960
+ }, [
1961
+ createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
1962
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
1963
+ ], 10, ["onClick"]),
1964
+ createVNode("button", {
1965
+ class: [
1966
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1967
+ __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
1968
+ ],
1969
+ onClick: ($event) => emit("filter-status", "skipped")
1970
+ }, [
1971
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
1972
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
1973
+ ], 10, ["onClick"]),
1974
+ createVNode("button", {
925
1975
  class: [
926
- "absolute top-1.5 right-1.5 inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-xs font-semibold leading-none tabular-nums transition-colors cursor-pointer",
927
- __props.activeFilter === "flaky" ? "bg-orange-200 dark:bg-orange-800/60 text-orange-800 dark:text-orange-200 ring-2 ring-orange-400 dark:ring-orange-600" : "bg-orange-100 dark:bg-orange-900/40 text-orange-700 dark:text-orange-300 hover:bg-orange-200 dark:hover:bg-orange-800/60"
1976
+ "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
1977
+ __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"
928
1978
  ],
929
- title: "Flaky passed only after a retry (a subset of passed). Click to filter.",
930
- onClick: ($event) => emit("filter-status", "flaky")
1979
+ title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
1980
+ onClick: ($event) => emit("filter-status", "didnotrun")
931
1981
  }, [
1982
+ createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, "Didn't run"),
1983
+ createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
1984
+ ], 10, ["onClick"])
1985
+ ]),
1986
+ _: 1
1987
+ }),
1988
+ __props.testRun ? (openBlock(), createBlock("div", {
1989
+ key: 0,
1990
+ class: "flex items-center gap-x-4 gap-y-1.5 flex-wrap"
1991
+ }, [
1992
+ createVNode("div", { class: "flex-1 basis-60 min-w-44 max-w-xl" }, [
1993
+ createVNode(_component_TestStatusBar, {
1994
+ passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
1995
+ failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
1996
+ skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
1997
+ flaky: __props.testRun?.flakyTests ?? 0,
1998
+ "did-not-run": __props.testRun?.didNotRunTests ?? 0,
1999
+ total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
2000
+ }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
2001
+ ]),
2002
+ createVNode("div", { class: "flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0" }, [
2003
+ createVNode("div", { class: "flex items-center gap-1" }, [
932
2004
  createVNode(_component_UIcon, {
933
- name: "i-lucide-shuffle",
934
- class: "size-3"
2005
+ name: "i-lucide-clock",
2006
+ class: "size-3.5 text-zinc-400"
935
2007
  }),
936
- createTextVNode(" " + toDisplayString(__props.testRun?.flakyTests ?? 0), 1)
937
- ], 10, ["onClick"])) : createCommentVNode("", true)
938
- ]),
939
- createVNode("button", {
940
- class: [
941
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
942
- __props.activeFilter === "failed" ? "bg-rose-100 dark:bg-rose-900/30 ring-2 ring-rose-400 dark:ring-rose-600" : "bg-rose-50 dark:bg-rose-900/20 hover:bg-rose-100 dark:hover:bg-rose-900/30"
943
- ],
944
- onClick: ($event) => emit("filter-status", "failed")
945
- }, [
946
- createVNode("p", { class: "text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider" }, "Failed"),
947
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400" }, toDisplayString(__props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0), 1)
948
- ], 10, ["onClick"]),
949
- createVNode("button", {
950
- class: [
951
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
952
- __props.activeFilter === "skipped" ? "bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500" : "bg-elevated/60 hover:bg-elevated"
953
- ],
954
- onClick: ($event) => emit("filter-status", "skipped")
955
- }, [
956
- createVNode("p", { class: "text-xs font-medium text-zinc-500 uppercase tracking-wider" }, "Skipped"),
957
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400" }, toDisplayString(__props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0), 1)
958
- ], 10, ["onClick"]),
959
- createVNode("button", {
960
- class: [
961
- "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
962
- __props.activeFilter === "didnotrun" ? "bg-amber-100 dark:bg-amber-900/30 ring-2 ring-amber-400 dark:ring-amber-600" : "bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30"
963
- ],
964
- title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
965
- onClick: ($event) => emit("filter-status", "didnotrun")
966
- }, [
967
- createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, " Didn't run "),
968
- createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
969
- ], 10, ["onClick"])
970
- ]),
971
- createVNode("div", null, [
972
- __props.testRun ? (openBlock(), createBlock("div", {
973
- key: 0,
974
- class: "flex items-center gap-3"
975
- }, [
976
- createVNode("div", { class: "flex-1 max-w-md" }, [
977
- createVNode(_component_TestStatusBar, {
978
- passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
979
- failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
980
- skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
981
- flaky: __props.testRun?.flakyTests ?? 0,
982
- "did-not-run": __props.testRun?.didNotRunTests ?? 0,
983
- total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
984
- }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
2008
+ createVNode(_component_DurationValue, {
2009
+ ms: __props.testRun?.duration,
2010
+ class: "font-medium"
2011
+ }, null, 8, ["ms"])
985
2012
  ]),
986
- createVNode("div", { class: "flex items-center gap-3 text-xs shrink-0" }, [
987
- createVNode("div", { class: "flex items-center gap-1" }, [
988
- createVNode(_component_UIcon, {
989
- name: "i-lucide-clock",
990
- class: "size-3.5 text-zinc-400"
991
- }),
992
- createVNode(_component_DurationValue, {
993
- ms: __props.testRun?.duration,
994
- class: "font-medium"
995
- }, null, 8, ["ms"])
996
- ]),
997
- __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
998
- key: 0,
999
- class: "flex items-center gap-1"
1000
- }, [
1001
- createVNode(_component_UIcon, {
1002
- name: "i-lucide-gauge",
1003
- class: "size-3.5 text-zinc-400"
1004
- }),
1005
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Avg"),
1006
- createVNode(_component_DurationValue, {
1007
- ms: __props.testRun.avgTestDuration,
1008
- class: "font-medium"
1009
- }, null, 8, ["ms"])
1010
- ])) : createCommentVNode("", true),
1011
- __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
1012
- key: 1,
1013
- class: "flex items-center gap-1"
1014
- }, [
1015
- createVNode(_component_UIcon, {
1016
- name: "i-lucide-arrow-up-right",
1017
- class: "size-3.5 text-orange-500"
1018
- }),
1019
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "P90"),
1020
- createVNode(_component_DurationValue, {
1021
- ms: __props.testRun.p90TestDuration,
1022
- class: "font-medium text-orange-600 dark:text-orange-400",
1023
- "unit-class": "opacity-60"
1024
- }, null, 8, ["ms"])
1025
- ])) : createCommentVNode("", true),
1026
- __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
1027
- key: 2,
1028
- class: "flex items-center gap-1"
1029
- }, [
1030
- createVNode(_component_UIcon, {
1031
- name: "i-lucide-clock",
1032
- class: "size-3.5 text-amber-500"
1033
- }),
1034
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Wasted"),
1035
- createVNode(_component_DurationValue, {
1036
- ms: __props.totalWastedTime,
1037
- class: "font-medium text-amber-600 dark:text-amber-400",
1038
- "unit-class": "opacity-60"
1039
- }, null, 8, ["ms"])
1040
- ])) : createCommentVNode("", true)
1041
- ])
1042
- ])) : createCommentVNode("", true)
1043
- ])
2013
+ __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
2014
+ key: 0,
2015
+ class: "flex items-center gap-1"
2016
+ }, [
2017
+ createVNode(_component_UIcon, {
2018
+ name: "i-lucide-gauge",
2019
+ class: "size-3.5 text-zinc-400"
2020
+ }),
2021
+ createVNode("span", { class: "text-zinc-500" }, "Avg"),
2022
+ createVNode(_component_DurationValue, {
2023
+ ms: __props.testRun.avgTestDuration,
2024
+ class: "font-medium"
2025
+ }, null, 8, ["ms"])
2026
+ ])) : createCommentVNode("", true),
2027
+ __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
2028
+ key: 1,
2029
+ class: "flex items-center gap-1"
2030
+ }, [
2031
+ createVNode(_component_UIcon, {
2032
+ name: "i-lucide-arrow-up-right",
2033
+ class: "size-3.5 text-orange-500"
2034
+ }),
2035
+ createVNode("span", { class: "text-zinc-500" }, "P90"),
2036
+ createVNode(_component_DurationValue, {
2037
+ ms: __props.testRun.p90TestDuration,
2038
+ class: "font-medium text-orange-600 dark:text-orange-400",
2039
+ "unit-class": "opacity-60"
2040
+ }, null, 8, ["ms"])
2041
+ ])) : createCommentVNode("", true),
2042
+ __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
2043
+ key: 2,
2044
+ class: "flex items-center gap-1"
2045
+ }, [
2046
+ createVNode(_component_UIcon, {
2047
+ name: "i-lucide-clock",
2048
+ class: "size-3.5 text-amber-500"
2049
+ }),
2050
+ createVNode("span", { class: "text-zinc-500" }, "Wasted"),
2051
+ createVNode(_component_DurationValue, {
2052
+ ms: __props.totalWastedTime,
2053
+ class: "font-medium text-amber-600 dark:text-amber-400",
2054
+ "unit-class": "opacity-60"
2055
+ }, null, 8, ["ms"])
2056
+ ])) : createCommentVNode("", true)
2057
+ ])
2058
+ ])) : createCommentVNode("", true)
1044
2059
  ])
1045
2060
  ];
1046
2061
  }
@@ -1048,238 +2063,108 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
1048
2063
  _: 1
1049
2064
  }, _parent2, _scopeId));
1050
2065
  _push2(`</div>`);
1051
- if (unref(showCiEnv)) {
1052
- _push2(ssrRenderComponent(_component_CiEnvCard, {
1053
- ci: __props.testRun?.metadata?.ci,
1054
- environment: __props.testRun?.environment,
1055
- "playwright-version": __props.testRun?.playwrightVersion,
1056
- "reporter-version": __props.testRun?.reporterVersion,
1057
- class: unref(blockColSpanClass)
1058
- }, null, _parent2, _scopeId));
1059
- } else {
1060
- _push2(`<!---->`);
1061
- }
1062
- if (unref(showSource)) {
1063
- _push2(ssrRenderComponent(_component_SourceInfoCard, {
1064
- scm: __props.testRun.metadata.scm,
1065
- class: unref(blockColSpanClass)
1066
- }, null, _parent2, _scopeId));
1067
- } else {
1068
- _push2(`<!---->`);
1069
- }
1070
- if (unref(showStorage)) {
1071
- _push2(ssrRenderComponent(_component_BlockCard, {
1072
- class: unref(blockColSpanClass),
1073
- title: "Storage",
1074
- icon: "i-lucide-database",
1075
- help: "run.reports",
1076
- subtitle: unref(storageStats)?.totalFiles ? `${unref(storageStats).totalFiles} files · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).totalSize)}` : void 0
1077
- }, {
1078
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1079
- if (_push3) {
1080
- if (__props.finalizing) {
1081
- _push3(`<div class="flex items-center gap-3"${_scopeId2}>`);
1082
- _push3(ssrRenderComponent(_component_UIcon, {
1083
- name: "i-lucide-upload",
1084
- class: "size-5 text-info shrink-0 animate-pulse"
1085
- }, null, _parent3, _scopeId2));
1086
- _push3(`<div class="flex-1 min-w-0"${_scopeId2}><div class="flex items-center justify-between mb-1"${_scopeId2}><span class="text-sm font-medium"${_scopeId2}>Finalizing test run</span><span class="text-xs text-zinc-500"${_scopeId2}>Uploading reports &amp; traces…</span></div>`);
1087
- _push3(ssrRenderComponent(_component_UProgress, {
1088
- value: null,
1089
- size: "sm",
1090
- color: "info",
1091
- class: "rounded-full animate-pulse"
1092
- }, null, _parent3, _scopeId2));
1093
- _push3(`</div></div>`);
1094
- } else {
1095
- _push3(`<!---->`);
1096
- }
1097
- if (unref(storageStats)?.totalFiles) {
1098
- _push3(`<div class="space-y-1.5 text-sm"${_scopeId2}><!--[-->`);
1099
- ssrRenderList(__props.allReports, (report) => {
1100
- _push3(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId2}>`);
1101
- _push3(ssrRenderComponent(_component_UButton, {
1102
- href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1103
- icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1104
- target: "_blank",
1105
- size: "xs",
1106
- variant: "outline",
1107
- class: "min-w-0",
1108
- ui: { label: "truncate" }
1109
- }, {
1110
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1111
- if (_push4) {
1112
- _push4(`${ssrInterpolate(report.label)}`);
1113
- } else {
1114
- return [
1115
- createTextVNode(toDisplayString(report.label), 1)
1116
- ];
1117
- }
1118
- }),
1119
- _: 2
1120
- }, _parent3, _scopeId2));
1121
- _push3(`<span class="text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0"${_scopeId2}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size))}</span></div>`);
1122
- });
1123
- _push3(`<!--]-->`);
1124
- if (unref(storageStats).testCaseFilesCount > 0) {
1125
- _push3(`<div class="flex items-center justify-between gap-2 min-w-0"${_scopeId2}><span class="truncate"${_scopeId2}>Test files (${ssrInterpolate(unref(storageStats).testCaseFilesCount)})</span><span class="text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0"${_scopeId2}>${ssrInterpolate(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize))}</span></div>`);
1126
- } else {
1127
- _push3(`<!---->`);
1128
- }
1129
- _push3(`</div>`);
1130
- } else {
1131
- _push3(`<!---->`);
1132
- }
1133
- } else {
1134
- return [
1135
- __props.finalizing ? (openBlock(), createBlock("div", {
1136
- key: 0,
1137
- class: "flex items-center gap-3"
1138
- }, [
1139
- createVNode(_component_UIcon, {
1140
- name: "i-lucide-upload",
1141
- class: "size-5 text-info shrink-0 animate-pulse"
1142
- }),
1143
- createVNode("div", { class: "flex-1 min-w-0" }, [
1144
- createVNode("div", { class: "flex items-center justify-between mb-1" }, [
1145
- createVNode("span", { class: "text-sm font-medium" }, "Finalizing test run"),
1146
- createVNode("span", { class: "text-xs text-zinc-500" }, "Uploading reports & traces…")
1147
- ]),
1148
- createVNode(_component_UProgress, {
1149
- value: null,
1150
- size: "sm",
1151
- color: "info",
1152
- class: "rounded-full animate-pulse"
1153
- })
1154
- ])
1155
- ])) : createCommentVNode("", true),
1156
- unref(storageStats)?.totalFiles ? (openBlock(), createBlock("div", {
1157
- key: 1,
1158
- class: "space-y-1.5 text-sm"
1159
- }, [
1160
- (openBlock(true), createBlock(Fragment, null, renderList(__props.allReports, (report) => {
1161
- return openBlock(), createBlock("div", {
1162
- key: report.label,
1163
- class: "flex items-center justify-between gap-2 min-w-0"
1164
- }, [
1165
- createVNode(_component_UButton, {
1166
- href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1167
- icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1168
- target: "_blank",
1169
- size: "xs",
1170
- variant: "outline",
1171
- class: "min-w-0",
1172
- ui: { label: "truncate" }
1173
- }, {
1174
- default: withCtx(() => [
1175
- createTextVNode(toDisplayString(report.label), 1)
1176
- ]),
1177
- _: 2
1178
- }, 1032, ["href", "icon"]),
1179
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
1180
- ]);
1181
- }), 128)),
1182
- unref(storageStats).testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
1183
- key: 0,
1184
- class: "flex items-center justify-between gap-2 min-w-0"
1185
- }, [
1186
- createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(unref(storageStats).testCaseFilesCount) + ")", 1),
1187
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize)), 1)
1188
- ])) : createCommentVNode("", true)
1189
- ])) : createCommentVNode("", true)
1190
- ];
1191
- }
1192
- }),
1193
- _: 1
1194
- }, _parent2, _scopeId));
1195
- } else {
1196
- _push2(`<!---->`);
1197
- }
1198
- if (unref(showOther)) {
1199
- _push2(ssrRenderComponent(_component_BlockCard, {
1200
- class: unref(blockColSpanClass),
1201
- title: "Other",
1202
- icon: "i-lucide-tags",
1203
- help: "run.metadata"
1204
- }, {
1205
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1206
- if (_push3) {
1207
- _push3(`<div class="space-y-3 text-sm"${_scopeId2}>`);
1208
- if (__props.testRun.metadata.tags && __props.testRun.metadata.tags.length > 0) {
1209
- _push3(`<div${_scopeId2}><div class="flex flex-wrap gap-1.5"${_scopeId2}><!--[-->`);
1210
- ssrRenderList(__props.testRun.metadata.tags, (tag) => {
1211
- _push3(ssrRenderComponent(_component_UBadge, {
1212
- key: tag,
1213
- color: "neutral",
1214
- variant: "soft",
1215
- size: "sm"
1216
- }, {
1217
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1218
- if (_push4) {
1219
- _push4(`${ssrInterpolate(tag)}`);
1220
- } else {
1221
- return [
1222
- createTextVNode(toDisplayString(tag), 1)
1223
- ];
1224
- }
1225
- }),
1226
- _: 2
1227
- }, _parent3, _scopeId2));
1228
- });
1229
- _push3(`<!--]--></div></div>`);
1230
- } else {
1231
- _push3(`<!---->`);
1232
- }
1233
- if (__props.testRun.metadata.relatedIssue) {
1234
- _push3(`<p class="flex items-center gap-1"${_scopeId2}>`);
1235
- _push3(ssrRenderComponent(_component_UIcon, {
1236
- name: "i-lucide-link",
1237
- class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1238
- }, null, _parent3, _scopeId2));
1239
- _push3(`<span${_scopeId2}>${ssrInterpolate(__props.testRun.metadata.relatedIssue)}</span></p>`);
1240
- } else {
1241
- _push3(`<!---->`);
1242
- }
1243
- _push3(ssrRenderComponent(_component_EntityLinks, {
1244
- "entity-type": "test_run",
1245
- "entity-id": __props.testRun.id,
1246
- links: __props.testRun.links ?? null,
1247
- onUpdated: ($event) => _ctx.$emit("label-updated")
1248
- }, null, _parent3, _scopeId2));
1249
- if (__props.testRun.metadata.customData) {
1250
- _push3(ssrRenderComponent(_component_UButton, {
1251
- size: "xs",
1252
- variant: "ghost",
1253
- color: "neutral",
1254
- icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1255
- onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1256
- }, {
1257
- default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1258
- if (_push4) {
1259
- _push4(` Custom data `);
1260
- } else {
1261
- return [
1262
- createTextVNode(" Custom data ")
1263
- ];
1264
- }
1265
- }),
1266
- _: 1
1267
- }, _parent3, _scopeId2));
1268
- } else {
1269
- _push3(`<!---->`);
1270
- }
1271
- if (__props.showCustomData && __props.testRun.metadata.customData) {
1272
- _push3(`<div${_scopeId2}><div class="bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"${_scopeId2}><pre class="m-0"${_scopeId2}>${ssrInterpolate(JSON.stringify(__props.testRun.metadata.customData, null, 2))}</pre></div></div>`);
1273
- } else {
1274
- _push3(`<!---->`);
1275
- }
1276
- _push3(`</div>`);
1277
- } else {
1278
- return [
1279
- createVNode("div", { class: "space-y-3 text-sm" }, [
1280
- __props.testRun.metadata.tags && __props.testRun.metadata.tags.length > 0 ? (openBlock(), createBlock("div", { key: 0 }, [
1281
- createVNode("div", { class: "flex flex-wrap gap-1.5" }, [
1282
- (openBlock(true), createBlock(Fragment, null, renderList(__props.testRun.metadata.tags, (tag) => {
2066
+ } else {
2067
+ return [
2068
+ createVNode("div", { class: "@container" }, [
2069
+ createVNode(_component_UCard, {
2070
+ class: "shadow-xs",
2071
+ ui: { footer: "px-4 py-2.5 sm:px-4 bg-muted/30" }
2072
+ }, {
2073
+ footer: withCtx(() => [
2074
+ createVNode(_component_SummaryMetaStrip, null, {
2075
+ default: withCtx(() => [
2076
+ unref(showCiGroup) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2077
+ key: 0,
2078
+ label: "CI & environment",
2079
+ icon: "i-lucide-cloud",
2080
+ help: "run.ci-env"
2081
+ }, {
2082
+ default: withCtx(() => [
2083
+ __props.testRun?.environment ? (openBlock(), createBlock("span", {
2084
+ key: 0,
2085
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
2086
+ }, toDisplayString(__props.testRun.environment), 1)) : createCommentVNode("", true),
2087
+ unref(ci)?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(unref(ci).provider), 1)) : createCommentVNode("", true),
2088
+ unref(ci)?.buildNumber || unref(ci)?.buildUrl ? (openBlock(), createBlock(Fragment, { key: 2 }, [
2089
+ createVNode("span", { class: "text-dimmed" }, "·"),
2090
+ unref(ci)?.buildUrl ? (openBlock(), createBlock("a", {
2091
+ key: 0,
2092
+ href: unref(ci).buildUrl,
2093
+ target: "_blank",
2094
+ class: "text-primary hover:underline"
2095
+ }, toDisplayString(unref(ci)?.buildNumber ? `Build #${unref(ci).buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(unref(ci).buildNumber), 1))
2096
+ ], 64)) : createCommentVNode("", true),
2097
+ unref(ci)?.workflow || unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 3 }, [
2098
+ createVNode("span", { class: "text-dimmed" }, "·"),
2099
+ createVNode("span", { class: "text-muted" }, [
2100
+ unref(ci)?.workflow ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2101
+ createTextVNode(toDisplayString(unref(ci).workflow), 1)
2102
+ ], 64)) : createCommentVNode("", true),
2103
+ unref(ci)?.workflow && unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 1 }, [
2104
+ createTextVNode(" · ")
2105
+ ], 64)) : createCommentVNode("", true),
2106
+ unref(ci)?.jobName ? (openBlock(), createBlock(Fragment, { key: 2 }, [
2107
+ createTextVNode(toDisplayString(unref(ci).jobName), 1)
2108
+ ], 64)) : createCommentVNode("", true)
2109
+ ])
2110
+ ], 64)) : createCommentVNode("", true)
2111
+ ]),
2112
+ _: 1
2113
+ })) : createCommentVNode("", true),
2114
+ unref(scm) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2115
+ key: 1,
2116
+ label: "Source",
2117
+ icon: "i-lucide-git-branch"
2118
+ }, {
2119
+ default: withCtx(() => [
2120
+ unref(scm).branch ? (openBlock(), createBlock("span", {
2121
+ key: 0,
2122
+ class: "font-medium"
2123
+ }, toDisplayString(unref(scm).branch), 1)) : createCommentVNode("", true),
2124
+ unref(scm).commit ? (openBlock(), createBlock("code", {
2125
+ key: 1,
2126
+ class: "text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",
2127
+ title: unref(scm).commit
2128
+ }, toDisplayString(unref(scm).commit.length >= 8 ? unref(scm).commit.substring(0, 8) : unref(scm).commit), 9, ["title"])) : createCommentVNode("", true),
2129
+ unref(scm).author ? (openBlock(), createBlock("span", {
2130
+ key: 2,
2131
+ class: "text-muted"
2132
+ }, toDisplayString(unref(scm).author), 1)) : createCommentVNode("", true),
2133
+ unref(scm).commitMessage ? (openBlock(), createBlock("span", {
2134
+ key: 3,
2135
+ class: "text-xs text-dimmed truncate max-w-[40ch]",
2136
+ title: unref(scm).commitMessage
2137
+ }, toDisplayString(unref(scm).commitMessage), 9, ["title"])) : createCommentVNode("", true)
2138
+ ]),
2139
+ _: 1
2140
+ })) : createCommentVNode("", true),
2141
+ unref(showVersions) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2142
+ key: 2,
2143
+ label: "Tooling versions",
2144
+ icon: "i-lucide-tag"
2145
+ }, {
2146
+ default: withCtx(() => [
2147
+ createVNode("span", { class: "text-muted whitespace-nowrap" }, [
2148
+ __props.testRun?.playwrightVersion ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2149
+ createTextVNode("Playwright v" + toDisplayString(__props.testRun.playwrightVersion), 1)
2150
+ ], 64)) : createCommentVNode("", true),
2151
+ __props.testRun?.playwrightVersion && __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 1 }, [
2152
+ createTextVNode(" · ")
2153
+ ], 64)) : createCommentVNode("", true),
2154
+ __props.testRun?.reporterVersion ? (openBlock(), createBlock(Fragment, { key: 2 }, [
2155
+ createTextVNode("Piwi v" + toDisplayString(__props.testRun.reporterVersion), 1)
2156
+ ], 64)) : createCommentVNode("", true)
2157
+ ])
2158
+ ]),
2159
+ _: 1
2160
+ })) : createCommentVNode("", true),
2161
+ unref(tags)?.length ? (openBlock(), createBlock(_component_MetaStripGroup, {
2162
+ key: 3,
2163
+ label: "Tags",
2164
+ icon: "i-lucide-tags"
2165
+ }, {
2166
+ default: withCtx(() => [
2167
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(tags), (tag) => {
1283
2168
  return openBlock(), createBlock(_component_UBadge, {
1284
2169
  key: tag,
1285
2170
  color: "neutral",
@@ -1292,196 +2177,244 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
1292
2177
  _: 2
1293
2178
  }, 1024);
1294
2179
  }), 128))
1295
- ])
1296
- ])) : createCommentVNode("", true),
1297
- __props.testRun.metadata.relatedIssue ? (openBlock(), createBlock("p", {
1298
- key: 1,
1299
- class: "flex items-center gap-1"
1300
- }, [
1301
- createVNode(_component_UIcon, {
1302
- name: "i-lucide-link",
1303
- class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1304
- }),
1305
- createVNode("span", null, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1306
- ])) : createCommentVNode("", true),
1307
- createVNode(_component_EntityLinks, {
1308
- "entity-type": "test_run",
1309
- "entity-id": __props.testRun.id,
1310
- links: __props.testRun.links ?? null,
1311
- onUpdated: ($event) => _ctx.$emit("label-updated")
1312
- }, null, 8, ["entity-id", "links", "onUpdated"]),
1313
- __props.testRun.metadata.customData ? (openBlock(), createBlock(_component_UButton, {
1314
- key: 2,
1315
- size: "xs",
1316
- variant: "ghost",
1317
- color: "neutral",
1318
- icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1319
- onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
2180
+ ]),
2181
+ _: 1
2182
+ })) : createCommentVNode("", true),
2183
+ __props.testRun?.metadata?.relatedIssue ? (openBlock(), createBlock(_component_MetaStripGroup, {
2184
+ key: 4,
2185
+ label: "Related issue",
2186
+ icon: "i-lucide-bookmark"
1320
2187
  }, {
1321
2188
  default: withCtx(() => [
1322
- createTextVNode(" Custom data ")
2189
+ createVNode("span", { class: "text-muted" }, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1323
2190
  ]),
1324
2191
  _: 1
1325
- }, 8, ["icon", "onClick"])) : createCommentVNode("", true),
1326
- __props.showCustomData && __props.testRun.metadata.customData ? (openBlock(), createBlock("div", { key: 3 }, [
1327
- createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1328
- createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(__props.testRun.metadata.customData, null, 2)), 1)
1329
- ])
1330
- ])) : createCommentVNode("", true)
2192
+ })) : createCommentVNode("", true),
2193
+ unref(showStorage) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2194
+ key: 5,
2195
+ label: "Storage"
2196
+ }, {
2197
+ default: withCtx(() => [
2198
+ createVNode(_component_RunStorageChip, {
2199
+ "storage-stats": unref(storageStats),
2200
+ reports: __props.allReports,
2201
+ finalizing: __props.finalizing
2202
+ }, null, 8, ["storage-stats", "reports", "finalizing"])
2203
+ ]),
2204
+ _: 1
2205
+ })) : createCommentVNode("", true),
2206
+ createVNode(_component_MetaStripGroup, {
2207
+ label: "Links",
2208
+ icon: "i-lucide-link",
2209
+ help: "run.metadata"
2210
+ }, {
2211
+ default: withCtx(() => [
2212
+ createVNode(_component_EntityLinks, {
2213
+ "entity-type": "test_run",
2214
+ "entity-id": __props.testRun.id,
2215
+ links: __props.testRun.links ?? null,
2216
+ onUpdated: ($event) => _ctx.$emit("label-updated")
2217
+ }, null, 8, ["entity-id", "links", "onUpdated"])
2218
+ ]),
2219
+ _: 1
2220
+ }),
2221
+ unref(customData) ? (openBlock(), createBlock(_component_MetaStripGroup, {
2222
+ key: 6,
2223
+ label: "Custom data"
2224
+ }, {
2225
+ default: withCtx(() => [
2226
+ createVNode(_component_UButton, {
2227
+ size: "xs",
2228
+ variant: "ghost",
2229
+ color: "neutral",
2230
+ icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
2231
+ onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
2232
+ }, {
2233
+ default: withCtx(() => [
2234
+ createTextVNode(" Custom data ")
2235
+ ]),
2236
+ _: 1
2237
+ }, 8, ["icon", "onClick"])
2238
+ ]),
2239
+ _: 1
2240
+ })) : createCommentVNode("", true)
2241
+ ]),
2242
+ _: 1
2243
+ }),
2244
+ __props.showCustomData && unref(customData) ? (openBlock(), createBlock("div", {
2245
+ key: 0,
2246
+ class: "mt-2"
2247
+ }, [
2248
+ createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
2249
+ createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(unref(customData), null, 2)), 1)
1331
2250
  ])
1332
- ];
1333
- }
1334
- }),
1335
- _: 1
1336
- }, _parent2, _scopeId));
1337
- } else {
1338
- _push2(`<!---->`);
1339
- }
1340
- _push2(`</div>`);
1341
- } else {
1342
- return [
1343
- createVNode("div", { class: "grid grid-cols-1 lg:grid-cols-12 gap-4" }, [
1344
- createVNode("div", { class: unref(summaryColSpanClass) }, [
1345
- createVNode(_component_UCard, { class: "shadow-xs h-full" }, {
1346
- default: withCtx(() => [
1347
- createVNode("div", { class: "space-y-3" }, [
1348
- createVNode("div", { class: "flex items-start gap-3" }, [
1349
- createVNode("div", { class: "flex items-center gap-2.5 min-w-0 flex-1" }, [
1350
- createVNode(_component_StatusBlock, {
1351
- status: __props.testRun?.status ?? "",
1352
- size: "md"
2251
+ ])) : createCommentVNode("", true)
2252
+ ]),
2253
+ default: withCtx(() => [
2254
+ createVNode("div", { class: "space-y-3" }, [
2255
+ createVNode("div", { class: "flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8" }, [
2256
+ createVNode("div", { class: "min-w-0 flex-1 basis-64" }, [
2257
+ createVNode("div", { class: "flex items-center gap-2 flex-wrap" }, [
2258
+ createVNode(_component_StatusChip, {
2259
+ status: __props.testRun?.status ?? ""
1353
2260
  }, null, 8, ["status"]),
1354
- createVNode("div", { class: "min-w-0 flex-1" }, [
1355
- createVNode("div", { class: "flex items-center gap-2" }, [
1356
- createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
1357
- createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
1358
- unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
1359
- withDirectives(createVNode("input", {
1360
- ref_key: "labelInputRef",
1361
- ref: labelInputRef,
1362
- "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
1363
- type: "text",
1364
- placeholder: "Add a label...",
1365
- class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
1366
- onKeydown: onLabelKeydown,
1367
- onBlur: saveLabel
1368
- }, null, 40, ["onUpdate:modelValue"]), [
1369
- [vModelText, unref(labelInput)]
1370
- ]),
1371
- unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1372
- key: 0,
1373
- name: "i-lucide-loader-circle",
1374
- class: "size-3.5 text-zinc-400 animate-spin shrink-0"
1375
- })) : createCommentVNode("", true)
1376
- ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
1377
- __props.testRun?.label ? (openBlock(), createBlock("span", {
1378
- key: 0,
1379
- class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
1380
- onClick: startEditLabel
1381
- }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1382
- key: 1,
1383
- class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
1384
- title: "Add a label",
1385
- onClick: startEditLabel
1386
- }, " + label "))
1387
- ], 64)),
1388
- createVNode(_component_HelpHint, { topic: "run.summary" })
2261
+ createVNode("h2", { class: "text-base font-bold shrink-0 flex items-center gap-1" }, [
2262
+ createTextVNode(" Run #" + toDisplayString(__props.testRun?.id) + " ", 1),
2263
+ unref(editingLabel) ? (openBlock(), createBlock(Fragment, { key: 0 }, [
2264
+ withDirectives(createVNode("input", {
2265
+ ref_key: "labelInputRef",
2266
+ ref: labelInputRef,
2267
+ "onUpdate:modelValue": ($event) => isRef(labelInput) ? labelInput.value = $event : null,
2268
+ type: "text",
2269
+ placeholder: "Add a label...",
2270
+ class: "inline-block w-48 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",
2271
+ onKeydown: onLabelKeydown,
2272
+ onBlur: saveLabel
2273
+ }, null, 40, ["onUpdate:modelValue"]), [
2274
+ [vModelText, unref(labelInput)]
1389
2275
  ]),
1390
- __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
2276
+ unref(savingLabel) ? (openBlock(), createBlock(_component_UIcon, {
1391
2277
  key: 0,
1392
- color: "neutral",
1393
- variant: "soft",
1394
- size: "sm",
1395
- class: "shrink-0",
1396
- title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
1397
- }, {
1398
- default: withCtx(() => [
1399
- createVNode(_component_UIcon, {
1400
- name: "i-lucide-layout-grid",
1401
- class: "size-3 mr-1"
1402
- }),
1403
- createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
1404
- ]),
1405
- _: 1
1406
- }, 8, ["title"])) : createCommentVNode("", true),
1407
- __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
2278
+ name: "i-lucide-loader-circle",
2279
+ class: "size-3.5 text-zinc-400 animate-spin shrink-0"
2280
+ })) : createCommentVNode("", true)
2281
+ ], 64)) : (openBlock(), createBlock(Fragment, { key: 1 }, [
2282
+ __props.testRun?.label ? (openBlock(), createBlock("span", {
2283
+ key: 0,
2284
+ class: "font-normal text-zinc-500 ml-1.5 cursor-pointer hover:text-zinc-700 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400",
2285
+ onClick: startEditLabel
2286
+ }, "— " + toDisplayString(__props.testRun.label), 1)) : (openBlock(), createBlock("button", {
1408
2287
  key: 1,
1409
- text: `This run started after: ${__props.testRun.precedingMarker.label}`
1410
- }, {
1411
- default: withCtx(() => [
1412
- createVNode(_component_NuxtLink, {
1413
- to: `/projects/${__props.testRun.projectId}?tab=timeline`,
1414
- class: "shrink-0 inline-flex items-center gap-1"
1415
- }, {
1416
- default: withCtx(() => [
1417
- createVNode("span", { class: "text-xs text-muted" }, "After"),
1418
- createVNode(_component_MarkerBadge, {
1419
- marker: __props.testRun.precedingMarker,
1420
- size: "xs"
1421
- }, null, 8, ["marker"])
1422
- ]),
1423
- _: 1
1424
- }, 8, ["to"])
1425
- ]),
1426
- _: 1
1427
- }, 8, ["text"])) : createCommentVNode("", true),
1428
- createVNode("span", { class: "text-xs text-zinc-500 ml-auto whitespace-nowrap" }, toDisplayString(__props.testRun?.project?.label ?? __props.testRun?.project?.name) + " · Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
1429
- createVNode(_component_UTooltip, {
1430
- text: unref(copied) ? "Copied!" : "Copy run summary"
2288
+ class: "text-xs text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300 border-b border-dashed border-transparent hover:border-zinc-400 ml-1.5",
2289
+ title: "Add a label",
2290
+ onClick: startEditLabel
2291
+ }, " + label "))
2292
+ ], 64)),
2293
+ createVNode(_component_HelpHint, { topic: "run.summary" })
2294
+ ]),
2295
+ __props.testRun?.shardTotal && __props.testRun.shardTotal > 1 ? (openBlock(), createBlock(_component_UBadge, {
2296
+ key: 0,
2297
+ color: "neutral",
2298
+ variant: "soft",
2299
+ size: "sm",
2300
+ class: "shrink-0",
2301
+ title: `Shard ${__props.testRun.shardsFinished ?? 0}/${__props.testRun.shardTotal}`
2302
+ }, {
2303
+ default: withCtx(() => [
2304
+ createVNode(_component_UIcon, {
2305
+ name: "i-lucide-layout-grid",
2306
+ class: "size-3 mr-1"
2307
+ }),
2308
+ createTextVNode(" " + toDisplayString(__props.testRun.shardsFinished ?? 0) + "/" + toDisplayString(__props.testRun.shardTotal), 1)
2309
+ ]),
2310
+ _: 1
2311
+ }, 8, ["title"])) : createCommentVNode("", true),
2312
+ __props.testRun?.precedingMarker ? (openBlock(), createBlock(_component_UTooltip, {
2313
+ key: 1,
2314
+ text: `This run started after: ${__props.testRun.precedingMarker.label}`
2315
+ }, {
2316
+ default: withCtx(() => [
2317
+ createVNode(_component_NuxtLink, {
2318
+ to: `/projects/${__props.testRun.projectId}?tab=timeline`,
2319
+ class: "shrink-0 inline-flex items-center gap-1"
1431
2320
  }, {
1432
2321
  default: withCtx(() => [
1433
- createVNode(_component_UButton, {
1434
- size: "xs",
1435
- variant: "ghost",
1436
- color: "neutral",
1437
- icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
1438
- class: "shrink-0 text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
1439
- onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
1440
- }, null, 8, ["icon", "onClick"])
1441
- ]),
1442
- _: 1
1443
- }, 8, ["text"]),
1444
- unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 2 }, {
1445
- content: withCtx(() => [
1446
- createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
1447
- createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
1448
- (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
1449
- return createVNode("button", {
1450
- key: m,
1451
- class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
1452
- onClick: ($event) => retryMode.value = m
1453
- }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
1454
- }), 64))
1455
- ])
1456
- ]),
1457
- default: withCtx(() => [
1458
- createVNode(_component_UButton, {
1459
- size: "xs",
1460
- color: "warning",
1461
- variant: "subtle",
1462
- icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
1463
- title: unref(retryTitle),
1464
- onClick: ($event) => copyRetryCommand()
1465
- }, {
1466
- default: withCtx(() => [
1467
- createTextVNode(" Retry ")
1468
- ]),
1469
- _: 1
1470
- }, 8, ["icon", "title", "onClick"])
2322
+ createVNode("span", { class: "text-xs text-muted" }, "After"),
2323
+ createVNode(_component_MarkerBadge, {
2324
+ marker: __props.testRun.precedingMarker,
2325
+ size: "xs"
2326
+ }, null, 8, ["marker"])
1471
2327
  ]),
1472
2328
  _: 1
1473
- })) : createCommentVNode("", true),
1474
- unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
1475
- key: 3,
1476
- "project-id": __props.testRun?.project?.id,
1477
- "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
1478
- cases: unref(failedCases)
1479
- }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true)
1480
- ])
1481
- ])
2329
+ }, 8, ["to"])
2330
+ ]),
2331
+ _: 1
2332
+ }, 8, ["text"])) : createCommentVNode("", true)
2333
+ ]),
2334
+ createVNode("p", { class: "mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap" }, [
2335
+ createVNode("span", null, "Started " + toDisplayString(("prettyDateFormat" in _ctx ? _ctx.prettyDateFormat : unref(prettyDateFormat))(__props.testRun?.startTime)), 1),
2336
+ createVNode(_component_ClientOnly, null, {
2337
+ default: withCtx(() => [
2338
+ createVNode("span", { class: "text-dimmed" }, "· " + toDisplayString(("formatRelativeTime" in _ctx ? _ctx.formatRelativeTime : unref(formatRelativeTime))(__props.testRun?.startTime)), 1)
2339
+ ]),
2340
+ _: 1
2341
+ })
1482
2342
  ])
1483
2343
  ]),
1484
- createVNode("div", { class: "grid grid-cols-3 sm:grid-cols-5 gap-2" }, [
2344
+ createVNode("div", { class: "flex items-center gap-1.5 shrink-0" }, [
2345
+ createVNode(_component_UTooltip, {
2346
+ text: unref(copied) ? "Copied!" : "Copy run summary"
2347
+ }, {
2348
+ default: withCtx(() => [
2349
+ createVNode(_component_UButton, {
2350
+ size: "xs",
2351
+ variant: "ghost",
2352
+ color: "neutral",
2353
+ icon: unref(copied) ? "i-lucide-check" : "i-lucide-clipboard",
2354
+ "aria-label": "Copy run summary",
2355
+ class: "text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
2356
+ onClick: ($event) => unref(copy)(buildRunSummary(), { toast: "Run summary copied" })
2357
+ }, null, 8, ["icon", "onClick"])
2358
+ ]),
2359
+ _: 1
2360
+ }, 8, ["text"]),
2361
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_UPopover, { key: 0 }, {
2362
+ content: withCtx(() => [
2363
+ createVNode("div", { class: "p-2 space-y-1 min-w-32" }, [
2364
+ createVNode("p", { class: "text-xs font-medium text-zinc-500 px-2 py-1" }, "Mode"),
2365
+ (openBlock(), createBlock(Fragment, null, renderList(["file-line", "grep", "file"], (m) => {
2366
+ return createVNode("button", {
2367
+ key: m,
2368
+ class: ["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800", unref(retryMode) === m ? "bg-primary/10 text-primary" : ""],
2369
+ onClick: ($event) => retryMode.value = m
2370
+ }, toDisplayString(m === "file-line" ? "File:line" : m === "grep" ? "Title (grep)" : "File only"), 11, ["onClick"]);
2371
+ }), 64))
2372
+ ])
2373
+ ]),
2374
+ default: withCtx(() => [
2375
+ createVNode(_component_UButton, {
2376
+ size: "xs",
2377
+ color: "warning",
2378
+ variant: "subtle",
2379
+ icon: unref(retryCopied) ? "i-lucide-check" : "i-lucide-play",
2380
+ title: unref(retryTitle),
2381
+ "aria-label": "Retry",
2382
+ onClick: ($event) => copyRetryCommand()
2383
+ }, {
2384
+ default: withCtx(() => [
2385
+ createVNode("span", { class: "hidden @2xl:inline" }, "Retry")
2386
+ ]),
2387
+ _: 1
2388
+ }, 8, ["icon", "title", "onClick"])
2389
+ ]),
2390
+ _: 1
2391
+ })) : createCommentVNode("", true),
2392
+ unref(failedCases).length > 0 ? (openBlock(), createBlock(_component_DesktopRunLocallyButton, {
2393
+ key: 1,
2394
+ "project-id": __props.testRun?.project?.id,
2395
+ "project-label": __props.testRun?.project?.label ?? __props.testRun?.project?.name,
2396
+ cases: unref(failedCases)
2397
+ }, null, 8, ["project-id", "project-label", "cases"])) : createCommentVNode("", true),
2398
+ unref(primaryReport) ? (openBlock(), createBlock(_component_UButton, {
2399
+ key: 2,
2400
+ href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(unref(primaryReport).path, null, unref(config).app?.baseURL),
2401
+ icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(unref(primaryReport).type),
2402
+ target: "_blank",
2403
+ size: "xs",
2404
+ color: "primary",
2405
+ variant: "outline",
2406
+ "aria-label": unref(primaryReport).label,
2407
+ title: unref(primaryReport).size ? `${unref(primaryReport).label} · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(primaryReport).size)}` : unref(primaryReport).label
2408
+ }, {
2409
+ default: withCtx(() => [
2410
+ createVNode("span", { class: "hidden @2xl:inline" }, toDisplayString(unref(primaryReport).label), 1)
2411
+ ]),
2412
+ _: 1
2413
+ }, 8, ["href", "icon", "aria-label", "title"])) : createCommentVNode("", true)
2414
+ ])
2415
+ ]),
2416
+ createVNode(_component_StatTileGrid, { "min-tile-width": "7.5rem" }, {
2417
+ default: withCtx(() => [
1485
2418
  createVNode("button", {
1486
2419
  class: [
1487
2420
  "rounded-lg p-3 text-left w-full transition-colors cursor-pointer",
@@ -1547,232 +2480,87 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
1547
2480
  title: "Tests that never ran (maxFailures cutoff or a serial-group failure)",
1548
2481
  onClick: ($event) => emit("filter-status", "didnotrun")
1549
2482
  }, [
1550
- createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, " Didn't run "),
2483
+ createVNode("p", { class: "text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider" }, "Didn't run"),
1551
2484
  createVNode("p", { class: "text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400" }, toDisplayString(__props.testRun?.didNotRunTests ?? 0), 1)
1552
2485
  ], 10, ["onClick"])
1553
2486
  ]),
1554
- createVNode("div", null, [
1555
- __props.testRun ? (openBlock(), createBlock("div", {
1556
- key: 0,
1557
- class: "flex items-center gap-3"
1558
- }, [
1559
- createVNode("div", { class: "flex-1 max-w-md" }, [
1560
- createVNode(_component_TestStatusBar, {
1561
- passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
1562
- failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
1563
- skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
1564
- flaky: __props.testRun?.flakyTests ?? 0,
1565
- "did-not-run": __props.testRun?.didNotRunTests ?? 0,
1566
- total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
1567
- }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
1568
- ]),
1569
- createVNode("div", { class: "flex items-center gap-3 text-xs shrink-0" }, [
1570
- createVNode("div", { class: "flex items-center gap-1" }, [
1571
- createVNode(_component_UIcon, {
1572
- name: "i-lucide-clock",
1573
- class: "size-3.5 text-zinc-400"
1574
- }),
1575
- createVNode(_component_DurationValue, {
1576
- ms: __props.testRun?.duration,
1577
- class: "font-medium"
1578
- }, null, 8, ["ms"])
1579
- ]),
1580
- __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
1581
- key: 0,
1582
- class: "flex items-center gap-1"
1583
- }, [
1584
- createVNode(_component_UIcon, {
1585
- name: "i-lucide-gauge",
1586
- class: "size-3.5 text-zinc-400"
1587
- }),
1588
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Avg"),
1589
- createVNode(_component_DurationValue, {
1590
- ms: __props.testRun.avgTestDuration,
1591
- class: "font-medium"
1592
- }, null, 8, ["ms"])
1593
- ])) : createCommentVNode("", true),
1594
- __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
1595
- key: 1,
1596
- class: "flex items-center gap-1"
1597
- }, [
1598
- createVNode(_component_UIcon, {
1599
- name: "i-lucide-arrow-up-right",
1600
- class: "size-3.5 text-orange-500"
1601
- }),
1602
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "P90"),
1603
- createVNode(_component_DurationValue, {
1604
- ms: __props.testRun.p90TestDuration,
1605
- class: "font-medium text-orange-600 dark:text-orange-400",
1606
- "unit-class": "opacity-60"
1607
- }, null, 8, ["ms"])
1608
- ])) : createCommentVNode("", true),
1609
- __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
1610
- key: 2,
1611
- class: "flex items-center gap-1"
1612
- }, [
1613
- createVNode(_component_UIcon, {
1614
- name: "i-lucide-clock",
1615
- class: "size-3.5 text-amber-500"
1616
- }),
1617
- createVNode("span", { class: "text-zinc-500 hidden sm:inline" }, "Wasted"),
1618
- createVNode(_component_DurationValue, {
1619
- ms: __props.totalWastedTime,
1620
- class: "font-medium text-amber-600 dark:text-amber-400",
1621
- "unit-class": "opacity-60"
1622
- }, null, 8, ["ms"])
1623
- ])) : createCommentVNode("", true)
1624
- ])
1625
- ])) : createCommentVNode("", true)
1626
- ])
1627
- ])
1628
- ]),
1629
- _: 1
1630
- })
1631
- ], 2),
1632
- unref(showCiEnv) ? (openBlock(), createBlock(_component_CiEnvCard, {
1633
- key: 0,
1634
- ci: __props.testRun?.metadata?.ci,
1635
- environment: __props.testRun?.environment,
1636
- "playwright-version": __props.testRun?.playwrightVersion,
1637
- "reporter-version": __props.testRun?.reporterVersion,
1638
- class: unref(blockColSpanClass)
1639
- }, null, 8, ["ci", "environment", "playwright-version", "reporter-version", "class"])) : createCommentVNode("", true),
1640
- unref(showSource) ? (openBlock(), createBlock(_component_SourceInfoCard, {
1641
- key: 1,
1642
- scm: __props.testRun.metadata.scm,
1643
- class: unref(blockColSpanClass)
1644
- }, null, 8, ["scm", "class"])) : createCommentVNode("", true),
1645
- unref(showStorage) ? (openBlock(), createBlock(_component_BlockCard, {
1646
- key: 2,
1647
- class: unref(blockColSpanClass),
1648
- title: "Storage",
1649
- icon: "i-lucide-database",
1650
- help: "run.reports",
1651
- subtitle: unref(storageStats)?.totalFiles ? `${unref(storageStats).totalFiles} files · ${("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).totalSize)}` : void 0
1652
- }, {
1653
- default: withCtx(() => [
1654
- __props.finalizing ? (openBlock(), createBlock("div", {
1655
- key: 0,
1656
- class: "flex items-center gap-3"
1657
- }, [
1658
- createVNode(_component_UIcon, {
1659
- name: "i-lucide-upload",
1660
- class: "size-5 text-info shrink-0 animate-pulse"
2487
+ _: 1
1661
2488
  }),
1662
- createVNode("div", { class: "flex-1 min-w-0" }, [
1663
- createVNode("div", { class: "flex items-center justify-between mb-1" }, [
1664
- createVNode("span", { class: "text-sm font-medium" }, "Finalizing test run"),
1665
- createVNode("span", { class: "text-xs text-zinc-500" }, "Uploading reports & traces…")
1666
- ]),
1667
- createVNode(_component_UProgress, {
1668
- value: null,
1669
- size: "sm",
1670
- color: "info",
1671
- class: "rounded-full animate-pulse"
1672
- })
1673
- ])
1674
- ])) : createCommentVNode("", true),
1675
- unref(storageStats)?.totalFiles ? (openBlock(), createBlock("div", {
1676
- key: 1,
1677
- class: "space-y-1.5 text-sm"
1678
- }, [
1679
- (openBlock(true), createBlock(Fragment, null, renderList(__props.allReports, (report) => {
1680
- return openBlock(), createBlock("div", {
1681
- key: report.label,
1682
- class: "flex items-center justify-between gap-2 min-w-0"
1683
- }, [
1684
- createVNode(_component_UButton, {
1685
- href: ("fileApiUrl" in _ctx ? _ctx.fileApiUrl : unref(fileApiUrl))(report.path, null, unref(config).app?.baseURL),
1686
- icon: ("reportIcon" in _ctx ? _ctx.reportIcon : unref(reportIcon))(report.type),
1687
- target: "_blank",
1688
- size: "xs",
1689
- variant: "outline",
1690
- class: "min-w-0",
1691
- ui: { label: "truncate" }
1692
- }, {
1693
- default: withCtx(() => [
1694
- createTextVNode(toDisplayString(report.label), 1)
1695
- ]),
1696
- _: 2
1697
- }, 1032, ["href", "icon"]),
1698
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(report.size)), 1)
1699
- ]);
1700
- }), 128)),
1701
- unref(storageStats).testCaseFilesCount > 0 ? (openBlock(), createBlock("div", {
2489
+ __props.testRun ? (openBlock(), createBlock("div", {
1702
2490
  key: 0,
1703
- class: "flex items-center justify-between gap-2 min-w-0"
1704
- }, [
1705
- createVNode("span", { class: "truncate" }, "Test files (" + toDisplayString(unref(storageStats).testCaseFilesCount) + ")", 1),
1706
- createVNode("span", { class: "text-xs tabular-nums text-zinc-400 dark:text-zinc-500 shrink-0" }, toDisplayString(("formatBytes" in _ctx ? _ctx.formatBytes : unref(formatBytes))(unref(storageStats).testCaseFilesSize)), 1)
1707
- ])) : createCommentVNode("", true)
1708
- ])) : createCommentVNode("", true)
1709
- ]),
1710
- _: 1
1711
- }, 8, ["class", "subtitle"])) : createCommentVNode("", true),
1712
- unref(showOther) ? (openBlock(), createBlock(_component_BlockCard, {
1713
- key: 3,
1714
- class: unref(blockColSpanClass),
1715
- title: "Other",
1716
- icon: "i-lucide-tags",
1717
- help: "run.metadata"
1718
- }, {
1719
- default: withCtx(() => [
1720
- createVNode("div", { class: "space-y-3 text-sm" }, [
1721
- __props.testRun.metadata.tags && __props.testRun.metadata.tags.length > 0 ? (openBlock(), createBlock("div", { key: 0 }, [
1722
- createVNode("div", { class: "flex flex-wrap gap-1.5" }, [
1723
- (openBlock(true), createBlock(Fragment, null, renderList(__props.testRun.metadata.tags, (tag) => {
1724
- return openBlock(), createBlock(_component_UBadge, {
1725
- key: tag,
1726
- color: "neutral",
1727
- variant: "soft",
1728
- size: "sm"
1729
- }, {
1730
- default: withCtx(() => [
1731
- createTextVNode(toDisplayString(tag), 1)
1732
- ]),
1733
- _: 2
1734
- }, 1024);
1735
- }), 128))
1736
- ])
1737
- ])) : createCommentVNode("", true),
1738
- __props.testRun.metadata.relatedIssue ? (openBlock(), createBlock("p", {
1739
- key: 1,
1740
- class: "flex items-center gap-1"
2491
+ class: "flex items-center gap-x-4 gap-y-1.5 flex-wrap"
1741
2492
  }, [
1742
- createVNode(_component_UIcon, {
1743
- name: "i-lucide-link",
1744
- class: "w-3.5 h-3.5 text-zinc-400 shrink-0"
1745
- }),
1746
- createVNode("span", null, toDisplayString(__props.testRun.metadata.relatedIssue), 1)
1747
- ])) : createCommentVNode("", true),
1748
- createVNode(_component_EntityLinks, {
1749
- "entity-type": "test_run",
1750
- "entity-id": __props.testRun.id,
1751
- links: __props.testRun.links ?? null,
1752
- onUpdated: ($event) => _ctx.$emit("label-updated")
1753
- }, null, 8, ["entity-id", "links", "onUpdated"]),
1754
- __props.testRun.metadata.customData ? (openBlock(), createBlock(_component_UButton, {
1755
- key: 2,
1756
- size: "xs",
1757
- variant: "ghost",
1758
- color: "neutral",
1759
- icon: __props.showCustomData ? "i-lucide-chevron-up" : "i-lucide-chevron-down",
1760
- onClick: ($event) => emit("update:showCustomData", !__props.showCustomData)
1761
- }, {
1762
- default: withCtx(() => [
1763
- createTextVNode(" Custom data ")
2493
+ createVNode("div", { class: "flex-1 basis-60 min-w-44 max-w-xl" }, [
2494
+ createVNode(_component_TestStatusBar, {
2495
+ passed: __props.displayProgress?.passedTests ?? __props.testRun?.passedTests ?? 0,
2496
+ failed: __props.displayProgress?.failedTests ?? __props.testRun?.failedTests ?? 0,
2497
+ skipped: __props.displayProgress?.skippedTests ?? __props.testRun?.skippedTests ?? 0,
2498
+ flaky: __props.testRun?.flakyTests ?? 0,
2499
+ "did-not-run": __props.testRun?.didNotRunTests ?? 0,
2500
+ total: __props.displayProgress?.totalTests ?? __props.testRun?.totalTests ?? 0
2501
+ }, null, 8, ["passed", "failed", "skipped", "flaky", "did-not-run", "total"])
1764
2502
  ]),
1765
- _: 1
1766
- }, 8, ["icon", "onClick"])) : createCommentVNode("", true),
1767
- __props.showCustomData && __props.testRun.metadata.customData ? (openBlock(), createBlock("div", { key: 3 }, [
1768
- createVNode("div", { class: "bg-zinc-50 dark:bg-zinc-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto" }, [
1769
- createVNode("pre", { class: "m-0" }, toDisplayString(JSON.stringify(__props.testRun.metadata.customData, null, 2)), 1)
2503
+ createVNode("div", { class: "flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0" }, [
2504
+ createVNode("div", { class: "flex items-center gap-1" }, [
2505
+ createVNode(_component_UIcon, {
2506
+ name: "i-lucide-clock",
2507
+ class: "size-3.5 text-zinc-400"
2508
+ }),
2509
+ createVNode(_component_DurationValue, {
2510
+ ms: __props.testRun?.duration,
2511
+ class: "font-medium"
2512
+ }, null, 8, ["ms"])
2513
+ ]),
2514
+ __props.testRun?.avgTestDuration ? (openBlock(), createBlock("div", {
2515
+ key: 0,
2516
+ class: "flex items-center gap-1"
2517
+ }, [
2518
+ createVNode(_component_UIcon, {
2519
+ name: "i-lucide-gauge",
2520
+ class: "size-3.5 text-zinc-400"
2521
+ }),
2522
+ createVNode("span", { class: "text-zinc-500" }, "Avg"),
2523
+ createVNode(_component_DurationValue, {
2524
+ ms: __props.testRun.avgTestDuration,
2525
+ class: "font-medium"
2526
+ }, null, 8, ["ms"])
2527
+ ])) : createCommentVNode("", true),
2528
+ __props.testRun?.p90TestDuration ? (openBlock(), createBlock("div", {
2529
+ key: 1,
2530
+ class: "flex items-center gap-1"
2531
+ }, [
2532
+ createVNode(_component_UIcon, {
2533
+ name: "i-lucide-arrow-up-right",
2534
+ class: "size-3.5 text-orange-500"
2535
+ }),
2536
+ createVNode("span", { class: "text-zinc-500" }, "P90"),
2537
+ createVNode(_component_DurationValue, {
2538
+ ms: __props.testRun.p90TestDuration,
2539
+ class: "font-medium text-orange-600 dark:text-orange-400",
2540
+ "unit-class": "opacity-60"
2541
+ }, null, 8, ["ms"])
2542
+ ])) : createCommentVNode("", true),
2543
+ __props.totalWastedTime && __props.totalWastedTime > 0 ? (openBlock(), createBlock("div", {
2544
+ key: 2,
2545
+ class: "flex items-center gap-1"
2546
+ }, [
2547
+ createVNode(_component_UIcon, {
2548
+ name: "i-lucide-clock",
2549
+ class: "size-3.5 text-amber-500"
2550
+ }),
2551
+ createVNode("span", { class: "text-zinc-500" }, "Wasted"),
2552
+ createVNode(_component_DurationValue, {
2553
+ ms: __props.totalWastedTime,
2554
+ class: "font-medium text-amber-600 dark:text-amber-400",
2555
+ "unit-class": "opacity-60"
2556
+ }, null, 8, ["ms"])
2557
+ ])) : createCommentVNode("", true)
1770
2558
  ])
1771
2559
  ])) : createCommentVNode("", true)
1772
2560
  ])
1773
2561
  ]),
1774
2562
  _: 1
1775
- }, 8, ["class"])) : createCommentVNode("", true)
2563
+ })
1776
2564
  ])
1777
2565
  ];
1778
2566
  }
@@ -2442,12 +3230,12 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
2442
3230
  }
2443
3231
  __expose({ scrollToCase });
2444
3232
  return (_ctx, _push, _parent, _attrs) => {
2445
- const _component_FilterToolbar = __nuxt_component_4$2;
3233
+ const _component_FilterToolbar = __nuxt_component_4$3;
2446
3234
  const _component_UIcon = _sfc_main$p;
2447
3235
  const _component_HelpHint = __nuxt_component_2$2;
2448
3236
  const _component_UInput = _sfc_main$d$1;
2449
- const _component_USelect = _sfc_main$o;
2450
- const _component_UCheckbox = _sfc_main$q;
3237
+ const _component_USelect = _sfc_main$q;
3238
+ const _component_UCheckbox = _sfc_main$r;
2451
3239
  const _component_UButton = _sfc_main$k;
2452
3240
  const _component_TestCasesTree = __nuxt_component_7;
2453
3241
  const _component_ClientOnly = __nuxt_component_7$1;
@@ -2826,8 +3614,8 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
2826
3614
  return (_ctx, _push, _parent, _attrs) => {
2827
3615
  const _component_ErrorState = __nuxt_component_5$1;
2828
3616
  const _component_UButton = _sfc_main$k;
2829
- const _component_LoadingState = __nuxt_component_1$1;
2830
- const _component_EmptyState = __nuxt_component_4$1;
3617
+ const _component_LoadingState = __nuxt_component_12$2;
3618
+ const _component_EmptyState = __nuxt_component_4$2;
2831
3619
  const _component_UIcon = _sfc_main$p;
2832
3620
  const _component_HelpHint = __nuxt_component_2$2;
2833
3621
  const _component_SectionCard = __nuxt_component_11;
@@ -3854,12 +4642,12 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3854
4642
  const _component_UIcon = _sfc_main$p;
3855
4643
  const _component_HelpHint = __nuxt_component_2$2;
3856
4644
  const _component_UButton = _sfc_main$k;
3857
- const _component_UCard = _sfc_main$m;
4645
+ const _component_UCard = _sfc_main$n;
3858
4646
  const _component_TableScroller = __nuxt_component_3$2;
3859
- const _component_UTable = _sfc_main$i;
4647
+ const _component_UTable = _sfc_main$j;
3860
4648
  const _component_UBadge = _sfc_main$7$1;
3861
4649
  const _component_NuxtLink = __nuxt_component_12$1;
3862
- const _component_UModal = _sfc_main$n;
4650
+ const _component_UModal = _sfc_main$o;
3863
4651
  const _component_ClusterDiagnosis = __nuxt_component_9;
3864
4652
  _push(`<!--[--><div class="pt-4 space-y-3">`);
3865
4653
  if (unref(loading)) {
@@ -4982,13 +5770,13 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
4982
5770
  copy(context.value?.commitRange?.gitCommand);
4983
5771
  }
4984
5772
  return (_ctx, _push, _parent, _attrs) => {
4985
- const _component_LoadingState = __nuxt_component_1$1;
4986
- const _component_EmptyState = __nuxt_component_4$1;
5773
+ const _component_LoadingState = __nuxt_component_12$2;
5774
+ const _component_EmptyState = __nuxt_component_4$2;
4987
5775
  const _component_UIcon = _sfc_main$p;
4988
5776
  const _component_HelpHint = __nuxt_component_2$2;
4989
5777
  const _component_NuxtLink = __nuxt_component_12$1;
4990
5778
  const _component_UBadge = _sfc_main$7$1;
4991
- const _component_UCard = _sfc_main$m;
5779
+ const _component_UCard = _sfc_main$n;
4992
5780
  const _component_UButton = _sfc_main$k;
4993
5781
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "pt-4" }, _attrs))}>`);
4994
5782
  if (unref(loading)) {
@@ -5350,7 +6138,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
5350
6138
  const _component_HelpHint = __nuxt_component_2$2;
5351
6139
  const _component_UPopover = _sfc_main$8$1;
5352
6140
  const _component_UButton = _sfc_main$k;
5353
- const _component_UCheckbox = _sfc_main$q;
6141
+ const _component_UCheckbox = _sfc_main$r;
5354
6142
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex items-center justify-between mb-2" }, _attrs))}><span class="text-xs text-gray-500 inline-flex items-center gap-1"><span>${ssrInterpolate(__props.workerCount)} worker${ssrInterpolate(__props.workerCount > 1 ? "s" : "")} `);
5355
6143
  if (__props.shardTotal && __props.shardTotal > 1) {
5356
6144
  _push(`<!--[--> · ${ssrInterpolate(__props.shardTotal)} shard${ssrInterpolate(__props.shardTotal > 1 ? "s" : "")}<!--]-->`);
@@ -6251,15 +7039,15 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
6251
7039
  }
6252
7040
  ];
6253
7041
  return (_ctx, _push, _parent, _attrs) => {
6254
- const _component_USelectMenu = _sfc_main$j;
7042
+ const _component_USelectMenu = _sfc_main$l;
6255
7043
  const _component_RunStatusBadge = __nuxt_component_13$1;
6256
7044
  const _component_UButton = _sfc_main$k;
6257
7045
  const _component_UIcon = _sfc_main$p;
6258
- const _component_UAlert = _sfc_main$l;
7046
+ const _component_UAlert = _sfc_main$m;
6259
7047
  const _component_MarkerBadge = __nuxt_component_5;
6260
7048
  const _component_UBadge = _sfc_main$7$1;
6261
7049
  const _component_TableScroller = __nuxt_component_3$2;
6262
- const _component_UTable = _sfc_main$i;
7050
+ const _component_UTable = _sfc_main$j;
6263
7051
  const _component_DurationValue = __nuxt_component_14$1;
6264
7052
  _push(`<div${ssrRenderAttrs(_attrs)}>`);
6265
7053
  if (__props.testRun && !isLive.value) {
@@ -6846,9 +7634,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6846
7634
  ];
6847
7635
  return (_ctx, _push, _parent, _attrs) => {
6848
7636
  const _component_UIcon = _sfc_main$p;
6849
- const _component_UTable = _sfc_main$i;
7637
+ const _component_UTable = _sfc_main$j;
6850
7638
  const _component_UBadge = _sfc_main$7$1;
6851
7639
  const _component_DurationValue = __nuxt_component_14$1;
7640
+ const _component_FeatureUnavailable = __nuxt_component_4$1;
6852
7641
  _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-col overflow-hidden" }, _attrs))}>`);
6853
7642
  if (unref(loading)) {
6854
7643
  _push(`<div class="flex-1 flex items-center justify-center text-gray-500 gap-2">`);
@@ -6981,12 +7770,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
6981
7770
  _: 1
6982
7771
  }, _parent));
6983
7772
  } else {
6984
- _push(`<div class="flex-1 flex items-center justify-center text-center text-gray-500">`);
6985
- _push(ssrRenderComponent(_component_UIcon, {
6986
- name: "i-lucide-wifi-off",
6987
- class: "size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"
7773
+ _push(ssrRenderComponent(_component_FeatureUnavailable, {
7774
+ class: "flex-1",
7775
+ icon: "i-lucide-wifi-off",
7776
+ title: "No network requests captured",
7777
+ text: "Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",
7778
+ doc: "capture-fixtures"
6988
7779
  }, null, _parent));
6989
- _push(`<p> No network request data. Add the <code class="text-xs bg-gray-100 dark:bg-gray-800 px-1 rounded font-mono">@piwitests/reporter</code> fixtures to your test setup. </p></div>`);
6990
7780
  }
6991
7781
  _push(`</div>`);
6992
7782
  };
@@ -7194,11 +7984,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
7194
7984
  }
7195
7985
  return (_ctx, _push, _parent, _attrs) => {
7196
7986
  const _component_UDashboardPanel = _sfc_main$1$1;
7197
- const _component_UDashboardNavbar = _sfc_main$g;
7987
+ const _component_UDashboardNavbar = _sfc_main$h;
7198
7988
  const _component_UDashboardSidebarCollapse = _sfc_main$1$2;
7199
7989
  const _component_BreadcrumbNav = __nuxt_component_3$1;
7200
7990
  const _component_NuxtLink = __nuxt_component_12$1;
7201
- const _component_UTooltip = _sfc_main$h;
7991
+ const _component_UTooltip = _sfc_main$i;
7202
7992
  const _component_UIcon = _sfc_main$p;
7203
7993
  const _component_NavbarActions = __nuxt_component_4;
7204
7994
  const _component_DetailPageLayout = __nuxt_component_8;
@@ -7859,4 +8649,4 @@ _sfc_main.setup = (props, ctx) => {
7859
8649
  };
7860
8650
 
7861
8651
  export { _sfc_main as default };
7862
- //# sourceMappingURL=_id_-BdJs7BJZ.mjs.map
8652
+ //# sourceMappingURL=_id_-8cGIgeg6.mjs.map