@piwitests/server 0.20.0 → 0.22.0

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