@piwitests/server 0.23.0 → 0.25.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 (619) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{DZECGgZm.js → 5nOoVJzL.js} +1 -1
  3. package/.output/public/_nuxt/6DSY_93j.js +1 -0
  4. package/.output/public/_nuxt/7vRR5W2L.js +1 -0
  5. package/.output/public/_nuxt/{CC8wk-N0.js → 9Dtlg-K4.js} +1 -1
  6. package/.output/public/_nuxt/9Yziijlb.js +1 -0
  7. package/.output/public/_nuxt/{DAhv9aNg.js → B-onBCAB.js} +1 -1
  8. package/.output/public/_nuxt/B2bK5uNR.js +1 -0
  9. package/.output/public/_nuxt/{B2L0-Lzp.js → B63B19Iv.js} +2 -2
  10. package/.output/public/_nuxt/{oSLbl-p0.js → B77w1Eib.js} +1 -1
  11. package/.output/public/_nuxt/{pZbe82l5.js → BC5bqlfM.js} +1 -1
  12. package/.output/public/_nuxt/{jR2xm3_t.js → BF5JDf9_.js} +1 -1
  13. package/.output/public/_nuxt/BFVrl1ss.js +1 -0
  14. package/.output/public/_nuxt/{Bj_v57Zu.js → BIHMeNW-.js} +1 -1
  15. package/.output/public/_nuxt/BKqOGcst.js +1 -0
  16. package/.output/public/_nuxt/{Bsc11YIJ.js → BLqooxh5.js} +1 -1
  17. package/.output/public/_nuxt/{Ce_j5NtN.js → BMfTUMYy.js} +1 -1
  18. package/.output/public/_nuxt/{CmTzxoQt.js → BOrnSpTA.js} +1 -1
  19. package/.output/public/_nuxt/{Bq4_kqIp.js → BPQNVV4M.js} +1 -1
  20. package/.output/public/_nuxt/{FJTsZ5Aa.js → BSKLNgre.js} +1 -1
  21. package/.output/public/_nuxt/BTCWUyBX.js +1 -0
  22. package/.output/public/_nuxt/BUYmGTVP.js +1 -0
  23. package/.output/public/_nuxt/{mi22nGUC.js → BWddBCom.js} +1 -1
  24. package/.output/public/_nuxt/{axj2iIDK.js → BYQ9lXQb.js} +1 -1
  25. package/.output/public/_nuxt/BYWQ47QQ.js +5 -0
  26. package/.output/public/_nuxt/{Bag08cIY.js → BYnqoVCE.js} +1 -1
  27. package/.output/public/_nuxt/{Clg2Qx0r.js → BaU2hm4B.js} +1 -1
  28. package/.output/public/_nuxt/{roaTZkYi.js → BbXvpkBp.js} +1 -1
  29. package/.output/public/_nuxt/Bb_925DD.js +1 -0
  30. package/.output/public/_nuxt/BcHU1KNK.js +1 -0
  31. package/.output/public/_nuxt/BdUGUwvE.js +1 -0
  32. package/.output/public/_nuxt/{D1Ucra3E.js → BeQq85yJ.js} +2 -2
  33. package/.output/public/_nuxt/Bg8yOdSf.js +1 -0
  34. package/.output/public/_nuxt/BhzfJaPC.js +1 -0
  35. package/.output/public/_nuxt/{499RbBSX.js → Bkb-0yS0.js} +4 -4
  36. package/.output/public/_nuxt/BmweLu9g.js +2 -0
  37. package/.output/public/_nuxt/Boyv6hLW.js +1 -0
  38. package/.output/public/_nuxt/{DXkFgrsT.js → Bq4xEWLF.js} +4 -4
  39. package/.output/public/_nuxt/{7_9fts7T.js → BraJd4EA.js} +1 -1
  40. package/.output/public/_nuxt/BvXrhZ8k.js +1 -0
  41. package/.output/public/_nuxt/{DNKZmhbX.js → Bw4oIhct.js} +1 -1
  42. package/.output/public/_nuxt/BxSrScjV.js +1 -0
  43. package/.output/public/_nuxt/Byqt8JHG.js +1 -0
  44. package/.output/public/_nuxt/{CNu3kken.js → BzBaMPgu.js} +4 -4
  45. package/.output/public/_nuxt/{PDSNX4Te.js → C1-8_6cB.js} +1 -1
  46. package/.output/public/_nuxt/{Ce89VyHE.js → C7SG50jD.js} +1 -1
  47. package/.output/public/_nuxt/{CBJFORiZ.js → C8WgBDU1.js} +1 -1
  48. package/.output/public/_nuxt/C8uZoJVq.js +1 -0
  49. package/.output/public/_nuxt/{D3SJGdl4.js → CBQXv4bU.js} +2 -2
  50. package/.output/public/_nuxt/CDEmotIt.js +1 -0
  51. package/.output/public/_nuxt/CIBOv3Ge.js +2 -0
  52. package/.output/public/_nuxt/CO7j4p5r.js +1 -0
  53. package/.output/public/_nuxt/COMhp7lz.js +1 -0
  54. package/.output/public/_nuxt/{jxc14CqP.js → CPiLUjjx.js} +1 -1
  55. package/.output/public/_nuxt/{DZ-KbUZi.js → CTYlay1H.js} +1 -1
  56. package/.output/public/_nuxt/{5QBnDbs_.js → CVEk4D8I.js} +1 -1
  57. package/.output/public/_nuxt/{LTMoFvEY.js → CbuK1HIv.js} +1 -1
  58. package/.output/public/_nuxt/{2yLW7WU0.js → CdLqOMvN.js} +1 -1
  59. package/.output/public/_nuxt/CdM2qNYM.js +2 -0
  60. package/.output/public/_nuxt/Ch8sGLqE.js +1 -0
  61. package/.output/public/_nuxt/CkdznmkX.js +1 -0
  62. package/.output/public/_nuxt/{DJzFYrBt.js → Cmuwgbf4.js} +1 -1
  63. package/.output/public/_nuxt/{C9I1Dp3S.js → CnRNwiuE.js} +1 -1
  64. package/.output/public/_nuxt/{Bb2mDqKr.js → CnsaoeEq.js} +1 -1
  65. package/.output/public/_nuxt/{DgEa6_av.js → Cp0V2FeW.js} +1 -1
  66. package/.output/public/_nuxt/Cvw4EFTy.js +17 -0
  67. package/.output/public/_nuxt/CwDej2Lz.js +1 -0
  68. package/.output/public/_nuxt/D-wlhH6J.js +1 -0
  69. package/.output/public/_nuxt/D5Mhpp98.js +1 -0
  70. package/.output/public/_nuxt/{CTTmX4gy.js → D8ixf-ZR.js} +5 -5
  71. package/.output/public/_nuxt/{HbnAkiyK.js → DBvdRbTA.js} +2 -2
  72. package/.output/public/_nuxt/DDho3MJD.js +1 -0
  73. package/.output/public/_nuxt/DEGHW4pO.js +1 -0
  74. package/.output/public/_nuxt/{C77tM5Hz.js → DHSYRMJp.js} +1 -1
  75. package/.output/public/_nuxt/DH_LEqhd.js +2 -0
  76. package/.output/public/_nuxt/{CUOS6S13.js → DIqik40e.js} +1 -1
  77. package/.output/public/_nuxt/DLwuL-qR.js +1 -0
  78. package/.output/public/_nuxt/{AQ86C4c2.js → DPDFGVb_.js} +2 -2
  79. package/.output/public/_nuxt/DRNHuVn4.js +2 -0
  80. package/.output/public/_nuxt/{B_MVJP17.js → DUtYU4Sb.js} +1 -1
  81. package/.output/public/_nuxt/{CAoQUDI4.js → DWl73MJR.js} +1 -1
  82. package/.output/public/_nuxt/{BZFiz2UB.js → DWz_bHNP.js} +1 -1
  83. package/.output/public/_nuxt/{CGDPUNcO.js → D_SCB-z2.js} +1 -1
  84. package/.output/public/_nuxt/{Ce47NgZw.js → D_j436ND.js} +1 -1
  85. package/.output/public/_nuxt/DamzjN7l.js +1 -0
  86. package/.output/public/_nuxt/Db5xe__T.js +1 -0
  87. package/.output/public/_nuxt/{BuGAn4f7.js → DcUBmKKE.js} +1 -1
  88. package/.output/public/_nuxt/DiP18sFE.js +1 -0
  89. package/.output/public/_nuxt/Die1200X.js +1 -0
  90. package/.output/public/_nuxt/DihSeDlY.js +9 -0
  91. package/.output/public/_nuxt/{BAbrtVp3.js → DkGXOZRW.js} +1 -1
  92. package/.output/public/_nuxt/{ZLfZolDM.js → DnOtRv65.js} +1 -1
  93. package/.output/public/_nuxt/DnV-BkUA.js +1 -0
  94. package/.output/public/_nuxt/DpeRrg68.js +1 -0
  95. package/.output/public/_nuxt/Dq6_-84R.js +1 -0
  96. package/.output/public/_nuxt/DqKFKS1b.js +1 -0
  97. package/.output/public/_nuxt/DrbO0dl5.js +6 -0
  98. package/.output/public/_nuxt/{B3G-TIoP.js → Ds8_6Fzl.js} +1 -1
  99. package/.output/public/_nuxt/{QZYo3ErV.js → DvewDI9t.js} +1 -1
  100. package/.output/public/_nuxt/E26Y1NWH.js +1 -0
  101. package/.output/public/_nuxt/Hp-_W7z4.js +1 -0
  102. package/.output/public/_nuxt/OanUGF_v.js +1 -0
  103. package/.output/public/_nuxt/{9_aJhhcm.js → RSS6R9Te.js} +12 -12
  104. package/.output/public/_nuxt/{BfcMJBTf.js → VqLetC2g.js} +1 -1
  105. package/.output/public/_nuxt/WCZdf9Ln.js +1 -0
  106. package/.output/public/_nuxt/{DBWM_xs-.js → Yl6iqHwK.js} +4 -4
  107. package/.output/public/_nuxt/builds/latest.json +1 -1
  108. package/.output/public/_nuxt/builds/meta/03f2d81b-8c58-4ea8-9a9d-7553c8ca4af6.json +1 -0
  109. package/.output/public/_nuxt/entry.DVKh2Fd6.css +1 -0
  110. package/.output/public/_nuxt/iUf7K_JR.js +1 -0
  111. package/.output/public/_nuxt/{B_JSV0yG.js → kDEwM7SQ.js} +1 -1
  112. package/.output/public/_nuxt/{BDUfBn3i.js → knaDbxMJ.js} +1 -1
  113. package/.output/public/_nuxt/lnpLc047.js +1 -0
  114. package/.output/public/_nuxt/{C2_7XZo0.js → mhvG7mu8.js} +1 -1
  115. package/.output/public/_nuxt/{Ck_fTH5z.js → qUaN2ZW8.js} +4 -4
  116. package/.output/public/_nuxt/qeqzb80l.js +1 -0
  117. package/.output/public/_nuxt/{BwwfasRt.js → uj92NYTx.js} +2 -2
  118. package/.output/public/_nuxt/vOZZ2cLi.js +1 -0
  119. package/.output/public/_nuxt/{CLWMETf9.js → zAFiz2Mg.js} +1 -1
  120. package/.output/public/demo/seed.version.json +2 -2
  121. package/.output/server/chunks/_/collect.mjs +1 -1
  122. package/.output/server/chunks/_/markers.mjs +1 -1
  123. package/.output/server/chunks/_/quarantine.mjs +1 -1
  124. package/.output/server/chunks/_/users.mjs +1 -1
  125. package/.output/server/chunks/build/{Alert-He-UxEt6.mjs → Alert-BhTWQzM5.mjs} +2 -2
  126. package/.output/server/chunks/build/Alert-BhTWQzM5.mjs.map +1 -0
  127. package/.output/server/chunks/build/{Breadcrumb-DEP2dVCZ.mjs → Breadcrumb-BJnPB2AW.mjs} +3 -3
  128. package/.output/server/chunks/build/Breadcrumb-BJnPB2AW.mjs.map +1 -0
  129. package/.output/server/chunks/build/{BreadcrumbNav-y6nMDYcR.mjs → BreadcrumbNav-C6Cun6tF.mjs} +3 -3
  130. package/.output/server/chunks/build/BreadcrumbNav-C6Cun6tF.mjs.map +1 -0
  131. package/.output/server/chunks/build/{BrowserBadge-DIASU8Gf.mjs → BrowserBadge-T1KRMIXA.mjs} +4 -4
  132. package/.output/server/chunks/build/BrowserBadge-T1KRMIXA.mjs.map +1 -0
  133. package/.output/server/chunks/build/{ChartCard-ZTsCvItQ.mjs → ChartCard-D_asI_WF.mjs} +2 -2
  134. package/.output/server/chunks/build/ChartCard-D_asI_WF.mjs.map +1 -0
  135. package/.output/server/chunks/build/{ChartMarkerTooltip-u_1DUHh-.mjs → ChartMarkerTooltip-DscESDg7.mjs} +3 -3
  136. package/.output/server/chunks/build/ChartMarkerTooltip-DscESDg7.mjs.map +1 -0
  137. package/.output/server/chunks/build/{Checkbox-BisdHf8n.mjs → Checkbox-Y9ZiIRkJ.mjs} +7 -7
  138. package/.output/server/chunks/build/Checkbox-Y9ZiIRkJ.mjs.map +1 -0
  139. package/.output/server/chunks/build/{CodeBlock-B8BNtZAe.mjs → CodeBlock-Bnn_ps9O.mjs} +5 -5
  140. package/.output/server/chunks/build/CodeBlock-Bnn_ps9O.mjs.map +1 -0
  141. package/.output/server/chunks/build/{DashboardNavbar-D7-3zBUU.mjs → DashboardNavbar-D37dPEtR.mjs} +3 -3
  142. package/.output/server/chunks/build/DashboardNavbar-D37dPEtR.mjs.map +1 -0
  143. package/.output/server/chunks/build/{DashboardSidebarToggle-C3HdHvlE.mjs → DashboardSidebarToggle-DzwsZHVx.mjs} +3 -3
  144. package/.output/server/chunks/build/DashboardSidebarToggle-DzwsZHVx.mjs.map +1 -0
  145. package/.output/server/chunks/build/{DataLocationCard-CC2-lHiP.mjs → DataLocationCard-CUXgZQEs.mjs} +4 -4
  146. package/.output/server/chunks/build/DataLocationCard-CUXgZQEs.mjs.map +1 -0
  147. package/.output/server/chunks/build/{DesktopRunLocallyButton-iNzrDsEs.mjs → DesktopRunLocallyButton-BCmQklj6.mjs} +15 -76
  148. package/.output/server/chunks/build/DesktopRunLocallyButton-BCmQklj6.mjs.map +1 -0
  149. package/.output/server/chunks/build/{DiagnosisPanel-BVb2LgHu.mjs → DiagnosisPanel-haHS2azn.mjs} +8 -8
  150. package/.output/server/chunks/build/DiagnosisPanel-haHS2azn.mjs.map +1 -0
  151. package/.output/server/chunks/build/{DiagnosisResult-xVgZlfKK.mjs → DiagnosisResult-DqTIOelM.mjs} +11 -11
  152. package/.output/server/chunks/build/DiagnosisResult-DqTIOelM.mjs.map +1 -0
  153. package/.output/server/chunks/build/{DurationValue-UX9uajQJ.mjs → DurationValue-D6fQEi5S.mjs} +2 -2
  154. package/.output/server/chunks/build/DurationValue-D6fQEi5S.mjs.map +1 -0
  155. package/.output/server/chunks/build/{EmptyState-DC2q_7TD.mjs → EmptyState-C-mCzGhO.mjs} +2 -2
  156. package/.output/server/chunks/build/EmptyState-C-mCzGhO.mjs.map +1 -0
  157. package/.output/server/chunks/build/{EntityLinks-Dzn73fbq.mjs → EntityLinks-CRJQM9Vy.mjs} +4 -4
  158. package/.output/server/chunks/build/EntityLinks-CRJQM9Vy.mjs.map +1 -0
  159. package/.output/server/chunks/build/{EnvManagedBadge-C-agmABK.mjs → EnvManagedBadge-hyelwXrw.mjs} +4 -4
  160. package/.output/server/chunks/build/EnvManagedBadge-hyelwXrw.mjs.map +1 -0
  161. package/.output/server/chunks/build/{ErrorState-CktYyeEZ.mjs → ErrorState-9UPssp7w.mjs} +2 -2
  162. package/.output/server/chunks/build/ErrorState-9UPssp7w.mjs.map +1 -0
  163. package/.output/server/chunks/build/{FeatureUnavailable-DHFkwI7t.mjs → FeatureUnavailable-CDw3__eq.mjs} +3 -3
  164. package/.output/server/chunks/build/FeatureUnavailable-CDw3__eq.mjs.map +1 -0
  165. package/.output/server/chunks/build/{FormField-GYHKiSI6.mjs → FormField-8vSc-3mb.mjs} +2 -2
  166. package/.output/server/chunks/build/FormField-8vSc-3mb.mjs.map +1 -0
  167. package/.output/server/chunks/build/{GetStartedWizard-BpcGYsm2.mjs → GetStartedWizard-Dp_tjhry.mjs} +4 -4
  168. package/.output/server/chunks/build/GetStartedWizard-Dp_tjhry.mjs.map +1 -0
  169. package/.output/server/chunks/build/{HelpHint-plioHKA0.mjs → HelpHint-Bfyo3ar6.mjs} +31 -4
  170. package/.output/server/chunks/build/HelpHint-Bfyo3ar6.mjs.map +1 -0
  171. package/.output/server/chunks/build/{LoadingState-CwpfmI0W.mjs → LoadingState-CxfFwac9.mjs} +2 -2
  172. package/.output/server/chunks/build/LoadingState-CxfFwac9.mjs.map +1 -0
  173. package/.output/server/chunks/build/{MarkerBadge-Biz5--h2.mjs → MarkerBadge-DmubzeuF.mjs} +2 -2
  174. package/.output/server/chunks/build/MarkerBadge-DmubzeuF.mjs.map +1 -0
  175. package/.output/server/chunks/build/{MetaStripGroup-A0a72vt5.mjs → MetaStripGroup-C-cNBfC9.mjs} +6 -6
  176. package/.output/server/chunks/build/MetaStripGroup-C-cNBfC9.mjs.map +1 -0
  177. package/.output/server/chunks/build/{Modal-hKLvVFNp.mjs → Modal-DcNzjvnm.mjs} +2 -2
  178. package/.output/server/chunks/build/Modal-DcNzjvnm.mjs.map +1 -0
  179. package/.output/server/chunks/build/{NavbarActions-_YjrSUat.mjs → NavbarActions-VCHW0u67.mjs} +2 -2
  180. package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +1 -0
  181. package/.output/server/chunks/build/{NavigationMenu-RfBOyS32.mjs → NavigationMenu-DG6V0R9Y.mjs} +5 -5
  182. package/.output/server/chunks/build/NavigationMenu-DG6V0R9Y.mjs.map +1 -0
  183. package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs → OpenInIdeLink-CLj2cTkc.mjs} +6 -6
  184. package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs.map → OpenInIdeLink-CLj2cTkc.mjs.map} +1 -1
  185. package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs → ProjectTestCasesTable-BNd5Fn_G.mjs} +15 -15
  186. package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs.map → ProjectTestCasesTable-BNd5Fn_G.mjs.map} +1 -1
  187. package/.output/server/chunks/build/{RovingFocusItem-BOSx1Z9Z.mjs → RovingFocusItem-DkZadRuK.mjs} +2 -2
  188. package/.output/server/chunks/build/RovingFocusItem-DkZadRuK.mjs.map +1 -0
  189. package/.output/server/chunks/build/{RunReports-nuLb-Nm3.mjs → RunReports-CnyGcU8K.mjs} +4 -4
  190. package/.output/server/chunks/build/RunReports-CnyGcU8K.mjs.map +1 -0
  191. package/.output/server/chunks/build/{RunStatusBadge-CvWmcFYM.mjs → RunStatusBadge-DTqX18X-.mjs} +3 -3
  192. package/.output/server/chunks/build/RunStatusBadge-DTqX18X-.mjs.map +1 -0
  193. package/.output/server/chunks/build/{SectionCard-DHAFvJxm.mjs → SectionCard-taTpPtua.mjs} +3 -3
  194. package/.output/server/chunks/build/SectionCard-taTpPtua.mjs.map +1 -0
  195. package/.output/server/chunks/build/{Select-CEyw7HGK.mjs → Select-BChKOOsc.mjs} +4 -4
  196. package/.output/server/chunks/build/Select-BChKOOsc.mjs.map +1 -0
  197. package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs → SelectMenu-DLkMyBsW.mjs} +5 -5
  198. package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs.map → SelectMenu-DLkMyBsW.mjs.map} +1 -1
  199. package/.output/server/chunks/build/{Separator-lrN70ODV.mjs → Separator-Dn-4PN3P.mjs} +2 -2
  200. package/.output/server/chunks/build/Separator-Dn-4PN3P.mjs.map +1 -0
  201. package/.output/server/chunks/build/{SettingsField-tRmytcEJ.mjs → SettingsField-BLO1C7uY.mjs} +6 -6
  202. package/.output/server/chunks/build/SettingsField-BLO1C7uY.mjs.map +1 -0
  203. package/.output/server/chunks/build/{Slideover-D6cRIqch.mjs → Slideover-BiDJaQrt.mjs} +3 -3
  204. package/.output/server/chunks/build/Slideover-BiDJaQrt.mjs.map +1 -0
  205. package/.output/server/chunks/build/{Switch-R2n82ncQ.mjs → Switch-Ca3fYrSH.mjs} +4 -4
  206. package/.output/server/chunks/build/Switch-Ca3fYrSH.mjs.map +1 -0
  207. package/.output/server/chunks/build/{Table-qZdnm9t2.mjs → Table-DQb34a0A.mjs} +3 -3
  208. package/.output/server/chunks/build/Table-DQb34a0A.mjs.map +1 -0
  209. package/.output/server/chunks/build/{Tabs-BDP7MWl4.mjs → Tabs-_ALhm_oG.mjs} +3 -3
  210. package/.output/server/chunks/build/Tabs-_ALhm_oG.mjs.map +1 -0
  211. package/.output/server/chunks/build/{TestCaseHistoryChart-CKDXQ2GI.mjs → TestCaseHistoryChart-D-TEUsZ8.mjs} +3 -3
  212. package/.output/server/chunks/build/TestCaseHistoryChart-D-TEUsZ8.mjs.map +1 -0
  213. package/.output/server/chunks/build/{TestMetaBadges-BlyKmfeP.mjs → TestMetaBadges-G2dAHnT-.mjs} +2 -2
  214. package/.output/server/chunks/build/TestMetaBadges-G2dAHnT-.mjs.map +1 -0
  215. package/.output/server/chunks/build/{TestStatusBar-CvsmKJ4D.mjs → TestStatusBar-CseETAdn.mjs} +2 -2
  216. package/.output/server/chunks/build/TestStatusBar-CseETAdn.mjs.map +1 -0
  217. package/.output/server/chunks/build/{Textarea-DpmpM-lN.mjs → Textarea-CXOoRq7y.mjs} +2 -2
  218. package/.output/server/chunks/build/Textarea-CXOoRq7y.mjs.map +1 -0
  219. package/.output/server/chunks/build/{Tooltip-BI3WQErw.mjs → Tooltip-trltUr5c.mjs} +3 -3
  220. package/.output/server/chunks/build/Tooltip-trltUr5c.mjs.map +1 -0
  221. package/.output/server/chunks/build/{VisuallyHiddenInput-D4E5aJCQ.mjs → VisuallyHiddenInput-CGURvg3N.mjs} +2 -2
  222. package/.output/server/chunks/build/VisuallyHiddenInput-CGURvg3N.mjs.map +1 -0
  223. package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs → _id_-B-G4eG5U.mjs} +40 -40
  224. package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs.map → _id_-B-G4eG5U.mjs.map} +1 -1
  225. package/.output/server/chunks/build/{_id_-T965GKYC.mjs → _id_-Cnzg8n21.mjs} +41 -38
  226. package/.output/server/chunks/build/_id_-Cnzg8n21.mjs.map +1 -0
  227. package/.output/server/chunks/build/{_id_-wiULjAVc.mjs → _id_-Dp_d6gT7.mjs} +63 -55
  228. package/.output/server/chunks/build/{_id_-wiULjAVc.mjs.map → _id_-Dp_d6gT7.mjs.map} +1 -1
  229. package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs → _id_-t2AWaYuK.mjs} +59 -52
  230. package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs.map → _id_-t2AWaYuK.mjs.map} +1 -1
  231. package/.output/server/chunks/build/{about-B3V_OEiu.mjs → about-BFsHkJwE.mjs} +8 -8
  232. package/.output/server/chunks/build/about-BFsHkJwE.mjs.map +1 -0
  233. package/.output/server/chunks/build/{account-DpBdYE46.mjs → account-CZAq8kVg.mjs} +8 -8
  234. package/.output/server/chunks/build/account-CZAq8kVg.mjs.map +1 -0
  235. package/.output/server/chunks/build/{ai-DYhpzbqp.mjs → ai-BGP3GcCR.mjs} +21 -21
  236. package/.output/server/chunks/build/{ai-DYhpzbqp.mjs.map → ai-BGP3GcCR.mjs.map} +1 -1
  237. package/.output/server/chunks/build/{analytics-CZJEU0an.mjs → analytics-CXl5OWV-.mjs} +25 -25
  238. package/.output/server/chunks/build/{analytics-CZJEU0an.mjs.map → analytics-CXl5OWV-.mjs.map} +1 -1
  239. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  240. package/.output/server/chunks/build/{db.client-Bdqk_eYQ.mjs → db.client-DijpEH6i.mjs} +3 -1
  241. package/.output/server/chunks/build/db.client-DijpEH6i.mjs.map +1 -0
  242. package/.output/server/chunks/build/{default-DO1izI2V.mjs → default-4ixAePum.mjs} +209 -77
  243. package/.output/server/chunks/build/default-4ixAePum.mjs.map +1 -0
  244. package/.output/server/chunks/build/{docs-C8bndVXg.mjs → docs-Cgsd01H9.mjs} +16 -16
  245. package/.output/server/chunks/build/{docs-C8bndVXg.mjs.map → docs-Cgsd01H9.mjs.map} +1 -1
  246. package/.output/server/chunks/build/{edit-BdfF9er2.mjs → edit-BEQ-ozj9.mjs} +436 -40
  247. package/.output/server/chunks/build/edit-BEQ-ozj9.mjs.map +1 -0
  248. package/.output/server/chunks/build/{fetch-tkz5_OA-.mjs → fetch-B5TVXZ1s.mjs} +3 -3
  249. package/.output/server/chunks/build/fetch-B5TVXZ1s.mjs.map +1 -0
  250. package/.output/server/chunks/build/{forgot-password-swZRcvXE.mjs → forgot-password-mqE1mpDI.mjs} +4 -4
  251. package/.output/server/chunks/build/forgot-password-mqE1mpDI.mjs.map +1 -0
  252. package/.output/server/chunks/build/{help-content-C876a9WD.mjs → help-content-Bc99BajS.mjs} +6 -1
  253. package/.output/server/chunks/build/help-content-Bc99BajS.mjs.map +1 -0
  254. package/.output/server/chunks/build/{import-B27Sv7h5.mjs → import-DqDDTcSc.mjs} +15 -15
  255. package/.output/server/chunks/build/import-DqDDTcSc.mjs.map +1 -0
  256. package/.output/server/chunks/build/{index-ID913tUa.mjs → index-Bpdj6TXV.mjs} +5 -5
  257. package/.output/server/chunks/build/index-Bpdj6TXV.mjs.map +1 -0
  258. package/.output/server/chunks/build/{index-vRwzDXLs.mjs → index-DBFsIsjA.mjs} +534 -262
  259. package/.output/server/chunks/build/index-DBFsIsjA.mjs.map +1 -0
  260. package/.output/server/chunks/build/{index-C7m32bRI.mjs → index-DSufXCZq.mjs} +22 -18
  261. package/.output/server/chunks/build/index-DSufXCZq.mjs.map +1 -0
  262. package/.output/server/chunks/build/{index-BdZmxLtC.mjs → index-WXE60AXk.mjs} +24 -24
  263. package/.output/server/chunks/build/{index-BdZmxLtC.mjs.map → index-WXE60AXk.mjs.map} +1 -1
  264. package/.output/server/chunks/build/{index-ByWTzqF6.mjs → index-okKjrRhL.mjs} +15 -4
  265. package/.output/server/chunks/build/index-okKjrRhL.mjs.map +1 -0
  266. package/.output/server/chunks/build/{isValueEqualOrExist-D4lZ8uRY.mjs → isValueEqualOrExist-C-9DzL4K.mjs} +3 -3
  267. package/.output/server/chunks/build/isValueEqualOrExist-C-9DzL4K.mjs.map +1 -0
  268. package/.output/server/chunks/build/{login-hxCF06JT.mjs → login-eQ88UoBW.mjs} +7 -7
  269. package/.output/server/chunks/build/login-eQ88UoBW.mjs.map +1 -0
  270. package/.output/server/chunks/build/{mcp-BVW1llyW.mjs → mcp-frcSP2Zg.mjs} +14 -14
  271. package/.output/server/chunks/build/mcp-frcSP2Zg.mjs.map +1 -0
  272. package/.output/server/chunks/build/{notifications-Dn-evqXM.mjs → notifications-DAtRd5V6.mjs} +14 -14
  273. package/.output/server/chunks/build/notifications-DAtRd5V6.mjs.map +1 -0
  274. package/.output/server/chunks/build/{performance-CV8qm94u.mjs → performance-BcQzGXE7.mjs} +13 -13
  275. package/.output/server/chunks/build/performance-BcQzGXE7.mjs.map +1 -0
  276. package/.output/server/chunks/build/{pr-feedback-gKDz8LyA.mjs → pr-feedback-BHtgvegy.mjs} +11 -11
  277. package/.output/server/chunks/build/pr-feedback-BHtgvegy.mjs.map +1 -0
  278. package/.output/server/chunks/build/{reset-password-DtEISa1I.mjs → reset-password-DMHrp14-.mjs} +4 -4
  279. package/.output/server/chunks/build/reset-password-DMHrp14-.mjs.map +1 -0
  280. package/.output/server/chunks/build/server.mjs +34 -34
  281. package/.output/server/chunks/build/{settings-BJDnuLpc.mjs → settings-Bo5OETop.mjs} +11 -11
  282. package/.output/server/chunks/build/settings-Bo5OETop.mjs.map +1 -0
  283. package/.output/server/chunks/build/{settings-metadata-DnAK4Rzg.mjs → settings-metadata-BHbsWQ2g.mjs} +3 -3
  284. package/.output/server/chunks/build/settings-metadata-BHbsWQ2g.mjs.map +1 -0
  285. package/.output/server/chunks/build/{setup-BO9tXa_G.mjs → setup-DAXcxuNY.mjs} +18 -18
  286. package/.output/server/chunks/build/{setup-BO9tXa_G.mjs.map → setup-DAXcxuNY.mjs.map} +1 -1
  287. package/.output/server/chunks/build/{storage-zN92cA9q.mjs → storage-BPK0fVwx.mjs} +13 -13
  288. package/.output/server/chunks/build/storage-BPK0fVwx.mjs.map +1 -0
  289. package/.output/server/chunks/build/{tags-CJFnoyQc.mjs → tags-CoxErA5m.mjs} +8 -8
  290. package/.output/server/chunks/build/tags-CoxErA5m.mjs.map +1 -0
  291. package/.output/server/chunks/build/{test-cases-0Q6rT73d.mjs → test-cases-D8rn-0le.mjs} +27 -27
  292. package/.output/server/chunks/build/test-cases-D8rn-0le.mjs.map +1 -0
  293. package/.output/server/chunks/build/{test-functions-DVRJgiWo.mjs → test-functions-pWs9mhbJ.mjs} +13 -13
  294. package/.output/server/chunks/build/test-functions-pWs9mhbJ.mjs.map +1 -0
  295. package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs → useCopyRich-BqVfhnoH.mjs} +90 -33
  296. package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs.map → useCopyRich-BqVfhnoH.mjs.map} +1 -1
  297. package/.output/server/chunks/build/{useDesktopDownload-Dyf0fR47.mjs → useDesktopDownload-l80DQJ9e.mjs} +2 -2
  298. package/.output/server/chunks/build/useDesktopDownload-l80DQJ9e.mjs.map +1 -0
  299. package/.output/server/chunks/build/{useDesktopLocalRuns-k7Gw3Fv3.mjs → useDesktopLocalRuns-Dil3YzyU.mjs} +68 -6
  300. package/.output/server/chunks/build/useDesktopLocalRuns-Dil3YzyU.mjs.map +1 -0
  301. package/.output/server/chunks/build/{useDesktopProjectLink-WwLte59P.mjs → useDesktopProjectLink-BnIONB--.mjs} +21 -4
  302. package/.output/server/chunks/build/useDesktopProjectLink-BnIONB--.mjs.map +1 -0
  303. package/.output/server/chunks/build/{useFormControl-8skMOTIf.mjs → useFormControl-CXKztoWk.mjs} +2 -2
  304. package/.output/server/chunks/build/useFormControl-CXKztoWk.mjs.map +1 -0
  305. package/.output/server/chunks/build/{useOpenInIde-D74FmDNg.mjs → useOpenInIde-CbbYW3pd.mjs} +2 -2
  306. package/.output/server/chunks/build/useOpenInIde-CbbYW3pd.mjs.map +1 -0
  307. package/.output/server/chunks/build/{useSettingsNav-BLTHducV.mjs → useSettingsNav-C6NpD4Ab.mjs} +2 -2
  308. package/.output/server/chunks/build/useSettingsNav-C6NpD4Ab.mjs.map +1 -0
  309. package/.output/server/chunks/build/{users-C9bjOBde.mjs → users-C2MuCf5G.mjs} +9 -9
  310. package/.output/server/chunks/build/users-C2MuCf5G.mjs.map +1 -0
  311. package/.output/server/chunks/nitro/nitro.mjs +1032 -721
  312. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  313. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs +88 -0
  315. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs.map +1 -0
  316. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
  319. package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
  323. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
  326. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
  327. package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
  330. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
  332. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
  334. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -1
  335. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
  336. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
  337. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
  339. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
  343. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
  345. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
  346. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
  347. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
  348. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
  349. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
  350. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  352. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  353. package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
  354. package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
  355. package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
  356. package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
  357. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  358. package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
  359. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  360. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  361. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  362. package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
  363. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
  364. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
  365. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
  366. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
  367. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
  368. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
  369. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs +63 -0
  370. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs.map +1 -0
  371. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
  372. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
  373. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
  374. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
  375. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
  376. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
  377. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
  378. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
  379. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
  380. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
  381. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
  382. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
  383. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
  384. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
  385. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
  386. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
  387. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +1 -1
  388. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +1 -1
  389. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +1 -1
  390. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +1 -1
  391. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
  392. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
  393. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
  394. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
  395. package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
  396. package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
  397. package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
  398. package/.output/server/chunks/routes/api/search.get.mjs +1 -1
  399. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
  400. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
  401. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
  402. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
  403. package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
  404. package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
  405. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
  406. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
  407. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
  408. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
  409. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
  410. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
  411. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
  412. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
  413. package/.output/server/chunks/routes/api/setup-status.get.mjs +1 -1
  414. package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
  416. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  417. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
  418. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  419. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
  420. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
  422. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +1 -1
  423. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +1 -1
  424. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
  425. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
  426. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
  427. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
  428. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
  429. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
  430. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
  431. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
  432. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
  433. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
  434. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
  436. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
  437. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
  438. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
  439. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
  440. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  441. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  442. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
  443. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  444. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  445. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  446. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  447. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  448. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
  449. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  450. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
  451. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
  452. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
  453. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
  454. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +1 -1
  455. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  456. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
  457. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
  458. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
  459. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
  461. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +2 -1
  463. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  465. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
  466. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
  467. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  468. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  469. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  470. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  471. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  472. package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
  473. package/.output/server/chunks/routes/api/version.get.mjs +1 -1
  474. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  475. package/.output/server/chunks/routes/renderer.mjs +1 -1
  476. package/.output/server/database/migrations/0045_productive_stingray.sql +1 -0
  477. package/.output/server/database/migrations/meta/0045_snapshot.json +3779 -0
  478. package/.output/server/database/migrations/meta/_journal.json +7 -0
  479. package/.output/server/database/migrations-pg/0046_gorgeous_hercules.sql +1 -0
  480. package/.output/server/database/migrations-pg/meta/0046_snapshot.json +4486 -0
  481. package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
  482. package/.output/server/index.mjs +1 -1
  483. package/.output/server/package.json +1 -1
  484. package/package.json +1 -1
  485. package/.output/public/_nuxt/5SkLJHl8.js +0 -1
  486. package/.output/public/_nuxt/6sA-GK37.js +0 -1
  487. package/.output/public/_nuxt/6vX5JdHr.js +0 -1
  488. package/.output/public/_nuxt/B070fjS-.js +0 -1
  489. package/.output/public/_nuxt/B0tmRAhY.js +0 -1
  490. package/.output/public/_nuxt/B3AG2m76.js +0 -1
  491. package/.output/public/_nuxt/B4mZElvM.js +0 -1
  492. package/.output/public/_nuxt/B7tiBVLW.js +0 -1
  493. package/.output/public/_nuxt/BFYkWpPx.js +0 -1
  494. package/.output/public/_nuxt/BM5BPKlc.js +0 -1
  495. package/.output/public/_nuxt/BNyTWIad.js +0 -9
  496. package/.output/public/_nuxt/BOvtXn3m.js +0 -1
  497. package/.output/public/_nuxt/BVyjw9Bi.js +0 -1
  498. package/.output/public/_nuxt/BZOykMLD.js +0 -1
  499. package/.output/public/_nuxt/BjMo2tKC.js +0 -6
  500. package/.output/public/_nuxt/BjOFxi54.js +0 -1
  501. package/.output/public/_nuxt/BjaRappk.js +0 -1
  502. package/.output/public/_nuxt/BtZNYmZO.js +0 -1
  503. package/.output/public/_nuxt/C6t4kxaa.js +0 -1
  504. package/.output/public/_nuxt/CEai-PWF.js +0 -1
  505. package/.output/public/_nuxt/CF_eDZHu.js +0 -1
  506. package/.output/public/_nuxt/CIQeRUSy.js +0 -17
  507. package/.output/public/_nuxt/CPQRQqXU.js +0 -1
  508. package/.output/public/_nuxt/CYhm2FBS.js +0 -5
  509. package/.output/public/_nuxt/CdEzDaDI.js +0 -1
  510. package/.output/public/_nuxt/CfhOanaF.js +0 -1
  511. package/.output/public/_nuxt/CvVbKrcH.js +0 -1
  512. package/.output/public/_nuxt/Cz7SCzdW.js +0 -1
  513. package/.output/public/_nuxt/D7fxV-UA.js +0 -1
  514. package/.output/public/_nuxt/D7t0Dn3h.js +0 -1
  515. package/.output/public/_nuxt/DCE2_MKD.js +0 -2
  516. package/.output/public/_nuxt/DFfqRQxk.js +0 -1
  517. package/.output/public/_nuxt/DNqm5cWU.js +0 -1
  518. package/.output/public/_nuxt/DTrPCv7R.js +0 -1
  519. package/.output/public/_nuxt/DYjxDsYC.js +0 -1
  520. package/.output/public/_nuxt/Dbf8eT28.js +0 -1
  521. package/.output/public/_nuxt/DeewM3Wg.js +0 -2
  522. package/.output/public/_nuxt/DiWxW-w3.js +0 -2
  523. package/.output/public/_nuxt/DmqCquDx.js +0 -1
  524. package/.output/public/_nuxt/DnxrNGE_.js +0 -1
  525. package/.output/public/_nuxt/DprkT7rM.js +0 -1
  526. package/.output/public/_nuxt/DuBtaw3j.js +0 -1
  527. package/.output/public/_nuxt/DylyATWU.js +0 -2
  528. package/.output/public/_nuxt/HIGGZ_c-.js +0 -1
  529. package/.output/public/_nuxt/RkNtgoTD.js +0 -1
  530. package/.output/public/_nuxt/Wk7ZKG4B.js +0 -1
  531. package/.output/public/_nuxt/Ya8ZzWuY.js +0 -1
  532. package/.output/public/_nuxt/a8Z6VC7V.js +0 -2
  533. package/.output/public/_nuxt/builds/meta/6d1766a0-0aba-46b8-9d97-7dd174130359.json +0 -1
  534. package/.output/public/_nuxt/dUPMBJ4f.js +0 -1
  535. package/.output/public/_nuxt/eT2oObCh.js +0 -1
  536. package/.output/public/_nuxt/entry.D_eWXrnD.css +0 -1
  537. package/.output/public/_nuxt/kWnH8yJq.js +0 -1
  538. package/.output/public/_nuxt/sqqg4oXL.js +0 -1
  539. package/.output/public/_nuxt/xZQGtnVA.js +0 -1
  540. package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +0 -1
  541. package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +0 -1
  542. package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +0 -1
  543. package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +0 -1
  544. package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +0 -1
  545. package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +0 -1
  546. package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +0 -1
  547. package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +0 -1
  548. package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +0 -1
  549. package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +0 -1
  550. package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +0 -1
  551. package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +0 -1
  552. package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +0 -1
  553. package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +0 -1
  554. package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +0 -1
  555. package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +0 -1
  556. package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +0 -1
  557. package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +0 -1
  558. package/.output/server/chunks/build/ErrorState-CktYyeEZ.mjs.map +0 -1
  559. package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +0 -1
  560. package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +0 -1
  561. package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +0 -1
  562. package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +0 -1
  563. package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +0 -1
  564. package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +0 -1
  565. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +0 -1
  566. package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +0 -1
  567. package/.output/server/chunks/build/NavbarActions-_YjrSUat.mjs.map +0 -1
  568. package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +0 -1
  569. package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +0 -1
  570. package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +0 -1
  571. package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +0 -1
  572. package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +0 -1
  573. package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +0 -1
  574. package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +0 -1
  575. package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +0 -1
  576. package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +0 -1
  577. package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +0 -1
  578. package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +0 -1
  579. package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +0 -1
  580. package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.mjs.map +0 -1
  581. package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +0 -1
  582. package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +0 -1
  583. package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +0 -1
  584. package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +0 -1
  585. package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +0 -1
  586. package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +0 -1
  587. package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +0 -1
  588. package/.output/server/chunks/build/account-DpBdYE46.mjs.map +0 -1
  589. package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +0 -1
  590. package/.output/server/chunks/build/default-DO1izI2V.mjs.map +0 -1
  591. package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +0 -1
  592. package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +0 -1
  593. package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +0 -1
  594. package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +0 -1
  595. package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +0 -1
  596. package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +0 -1
  597. package/.output/server/chunks/build/index-C7m32bRI.mjs.map +0 -1
  598. package/.output/server/chunks/build/index-ID913tUa.mjs.map +0 -1
  599. package/.output/server/chunks/build/index-vRwzDXLs.mjs.map +0 -1
  600. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +0 -1
  601. package/.output/server/chunks/build/login-hxCF06JT.mjs.map +0 -1
  602. package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +0 -1
  603. package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +0 -1
  604. package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +0 -1
  605. package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +0 -1
  606. package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +0 -1
  607. package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +0 -1
  608. package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +0 -1
  609. package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +0 -1
  610. package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +0 -1
  611. package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +0 -1
  612. package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +0 -1
  613. package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +0 -1
  614. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +0 -1
  615. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +0 -1
  616. package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +0 -1
  617. package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +0 -1
  618. package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +0 -1
  619. package/.output/server/chunks/build/users-C9bjOBde.mjs.map +0 -1
@@ -1,2 +0,0 @@
1
- import{aa as P,p as L}from"./CNu3kken.js";const y=43200,k=1440,C=Symbol.for("constructDateFrom");function x(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&C in e?e[C](t):e instanceof Date?new e.constructor(t):new Date(t)}function g(e,t){return x(e,e)}let _={};function A(){return _}function W(e){const t=g(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function D(e,...t){const n=x.bind(null,e||t.find(r=>typeof r=="object"));return t.map(n)}function w(e,t){const n=+g(e)-+g(t);return n<0?-1:n>0?1:n}function z(e){return x(e,Date.now())}function E(e,t,n){const[r,a]=D(n?.in,e,t),u=r.getFullYear()-a.getFullYear(),o=r.getMonth()-a.getMonth();return u*12+o}function $(e){return t=>{const r=(e?Math[e]:Math.trunc)(t);return r===0?0:r}}function j(e,t){return+g(e)-+g(t)}function R(e,t){const n=g(e);return n.setHours(23,59,59,999),n}function X(e,t){const n=g(e),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function Y(e,t){const n=g(e);return+R(n)==+X(n)}function U(e,t,n){const[r,a,u]=D(n?.in,e,e,t),o=w(a,u),i=Math.abs(E(a,u));if(i<1)return 0;a.getMonth()===1&&a.getDate()>27&&a.setDate(30),a.setMonth(a.getMonth()-o*i);let l=w(a,u)===-o;Y(r)&&i===1&&w(r,u)===1&&(l=!1);const d=o*(i-+l);return d===0?0:d}function V(e,t,n){const r=j(e,t)/1e3;return $(n?.roundingMethod)(r)}const q={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},H=(e,t,n)=>{let r;const a=q[e];return typeof a=="string"?r=a:t===1?r=a.one:r=a.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function v(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const B={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},J={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},G={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Q={date:v({formats:B,defaultWidth:"full"}),time:v({formats:J,defaultWidth:"full"}),dateTime:v({formats:G,defaultWidth:"full"})},K={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Z=(e,t,n,r)=>K[e];function p(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let a;if(r==="formatting"&&e.formattingValues){const o=e.defaultFormattingWidth||e.defaultWidth,i=n?.width?String(n.width):o;a=e.formattingValues[i]||e.formattingValues[o]}else{const o=e.defaultWidth,i=n?.width?String(n.width):e.defaultWidth;a=e.values[i]||e.values[o]}const u=e.argumentCallback?e.argumentCallback(t):t;return a[u]}}const ee={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},te={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},ne={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},re={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},ae={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},ie={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},oe=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},se={ordinalNumber:oe,era:p({values:ee,defaultWidth:"wide"}),quarter:p({values:te,defaultWidth:"wide",argumentCallback:e=>e-1}),month:p({values:ne,defaultWidth:"wide"}),day:p({values:re,defaultWidth:"wide"}),dayPeriod:p({values:ae,defaultWidth:"wide",formattingValues:ie,defaultFormattingWidth:"wide"})};function b(e){return(t,n={})=>{const r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],u=t.match(a);if(!u)return null;const o=u[0],i=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(i)?ce(i,h=>h.test(o)):ue(i,h=>h.test(o));let d;d=e.valueCallback?e.valueCallback(l):l,d=n.valueCallback?n.valueCallback(d):d;const f=t.slice(o.length);return{value:d,rest:f}}}function ue(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function ce(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return n}function le(e){return(t,n={})=>{const r=t.match(e.matchPattern);if(!r)return null;const a=r[0],u=t.match(e.parsePattern);if(!u)return null;let o=e.valueCallback?e.valueCallback(u[0]):u[0];o=n.valueCallback?n.valueCallback(o):o;const i=t.slice(a.length);return{value:o,rest:i}}}const de=/^(\d+)(th|st|nd|rd)?/i,fe=/\d+/i,he={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},me={any:[/^b/i,/^(a|c)/i]},ge={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},pe={any:[/1/i,/2/i,/3/i,/4/i]},be={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},ye={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},we={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Me={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},ve={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},xe={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},De={ordinalNumber:le({matchPattern:de,parsePattern:fe,valueCallback:e=>parseInt(e,10)}),era:b({matchPatterns:he,defaultMatchWidth:"wide",parsePatterns:me,defaultParseWidth:"any"}),quarter:b({matchPatterns:ge,defaultMatchWidth:"wide",parsePatterns:pe,defaultParseWidth:"any",valueCallback:e=>e+1}),month:b({matchPatterns:be,defaultMatchWidth:"wide",parsePatterns:ye,defaultParseWidth:"any"}),day:b({matchPatterns:we,defaultMatchWidth:"wide",parsePatterns:Me,defaultParseWidth:"any"}),dayPeriod:b({matchPatterns:ve,defaultMatchWidth:"any",parsePatterns:xe,defaultParseWidth:"any"})},N={code:"en-US",formatDistance:H,formatLong:Q,formatRelative:Z,localize:se,match:De,options:{weekStartsOn:0,firstWeekContainsDate:1}};function Se(e,t,n){const r=A(),a=n?.locale??r.locale??N,u=2520,o=w(e,t);if(isNaN(o))throw new RangeError("Invalid time value");const i=Object.assign({},n,{addSuffix:n?.addSuffix,comparison:o}),[l,d]=D(n?.in,...o>0?[t,e]:[e,t]),f=V(d,l),h=(W(d)-W(l))/1e3,c=Math.round((f-h)/60);let s;if(c<2)return n?.includeSeconds?f<5?a.formatDistance("lessThanXSeconds",5,i):f<10?a.formatDistance("lessThanXSeconds",10,i):f<20?a.formatDistance("lessThanXSeconds",20,i):f<40?a.formatDistance("halfAMinute",0,i):f<60?a.formatDistance("lessThanXMinutes",1,i):a.formatDistance("xMinutes",1,i):c===0?a.formatDistance("lessThanXMinutes",1,i):a.formatDistance("xMinutes",c,i);if(c<45)return a.formatDistance("xMinutes",c,i);if(c<90)return a.formatDistance("aboutXHours",1,i);if(c<k){const m=Math.round(c/60);return a.formatDistance("aboutXHours",m,i)}else{if(c<u)return a.formatDistance("xDays",1,i);if(c<y){const m=Math.round(c/k);return a.formatDistance("xDays",m,i)}else if(c<y*2)return s=Math.round(c/y),a.formatDistance("aboutXMonths",s,i)}if(s=U(d,l),s<12){const m=Math.round(c/y);return a.formatDistance("xMonths",m,i)}else{const m=s%12,M=Math.trunc(s/12);return m<3?a.formatDistance("aboutXYears",M,i):m<9?a.formatDistance("overXYears",M,i):a.formatDistance("almostXYears",M+1,i)}}function Pe(e,t){return Se(e,z(e),t)}const ke=["years","months","weeks","days","hours","minutes","seconds"];function Ce(e,t){const r=A().locale??N,a=ke,u=" ";return r.formatDistance?a.reduce((i,l)=>{const d=`x${l.replace(/(^.)/,h=>h.toUpperCase())}`,f=e[l];return f!==void 0&&e[l]?i.concat(r.formatDistance(d,f)):i},[]).join(u):""}const We="piwi:",O=["critical","high","medium","low"];new Set(O);function Le(e){return typeof e=="string"&&e.trim().toLowerCase().startsWith(We)}function _e(e){return O.includes(e)?e:void 0}function ze(e){return({column:t})=>{const n=t.getIsSorted();return P("button",{class:"flex items-center gap-1 font-semibold select-none cursor-pointer hover:text-highlighted transition-colors",onClick:()=>t.toggleSorting()},[e,P(L,{name:n==="asc"?"i-lucide-chevron-up":n==="desc"?"i-lucide-chevron-down":"i-lucide-chevrons-up-down",class:["shrink-0 size-3.5",!n&&"opacity-40"]})])}}function Ee(e,t={}){if(e==null||e==="")return"N/A";let n;if(e instanceof Date)n=e;else{const r=typeof e=="number"?e:Number(e);!Number.isNaN(r)&&String(e).trim()!==""?n=new Date(r<1e12?r*1e3:r):n=new Date(e)}return Number.isNaN(n.getTime())?"N/A":t.dateOnly?n.toLocaleDateString():n.toLocaleString()}function $e(e){return e?Pe(new Date(e),{addSuffix:!0}):"N/A"}function je(e){if(e==null)return"N/A";const t=Math.round(Math.abs(e));return t===0?"0 seconds":(e<0?"−":"")+Ce({seconds:t/1e3})}function Re(e){if(e==null)return null;const t=Math.round(Math.abs(e)),n=e<0?"−":"";if(t<1e3)return{value:n+t,unit:"ms"};const r=t/1e3;return r<60?{value:n+Math.round(r*10)/10,unit:"s"}:{value:n+Math.round(r/60*10)/10,unit:"m"}}function Xe(e){switch(e){case"html":return"i-lucide-layout-dashboard";case"monocart":return"i-lucide-bar-chart-2";case"blob":return"i-lucide-download";default:return"i-lucide-file-text"}}function Ye(e){if(!e)return"i-lucide-globe";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"i-simple-icons-googlechrome":t.includes("firefox")?"i-simple-icons-firefoxbrowser":t.includes("safari")||t.includes("webkit")?"i-simple-icons-safari":t.includes("edge")?"i-simple-icons-microsoftedge":"i-lucide-globe"}function Ue(e){if(!e)return"#6b7280";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"#4285F4":t.includes("firefox")?"#FF7139":t.includes("safari")||t.includes("webkit")?"#007AFF":t.includes("edge")?"#0078D7":"#6b7280"}function Te(e){switch(e){case"passed":return"success";case"failed":return"error";case"timedout":return"warning";case"timedOut":return"warning";case"interrupted":return"warning";case"cancelled":return"neutral";case"initialising":return"info";case"running":return"info";case"finalizing":return"info";default:return"neutral"}}function S(e){return e==="timedOut"?"timedout":e}function Ve(e){switch(S(e)){case"passed":return"i-lucide-check-circle-2";case"failed":case"timedout":return"i-lucide-x-circle";case"didnotrun":return"i-lucide-circle-slash";case"running":case"initialising":case"finalizing":return"i-lucide-loader-circle";default:return"i-lucide-minus-circle"}}function qe(e){switch(S(e)){case"passed":return"text-emerald-600 dark:text-emerald-400";case"failed":case"timedout":return"text-rose-600 dark:text-rose-400";case"didnotrun":return"text-amber-600 dark:text-amber-400";case"running":case"initialising":case"finalizing":return"text-blue-600 dark:text-blue-400";default:return"text-zinc-400 dark:text-zinc-500"}}function He(e){const t=S(e);return t==="running"||t==="initialising"||t==="finalizing"}function Be(e){return e==="timedOut"||e==="timedout"?"failed":e==="didnotrun"?"didn't run":e==="never-run"?"never run":e}function Je(e){return e&&{open:"warning",resolved:"success",ignored:"neutral"}[e]||"neutral"}function Ge(e){switch(e){case"diagnosis-verified":return{label:"Fix verified",color:"success",icon:"i-lucide-badge-check",hint:"The tests went green and the change touched the files the diagnosis named."};case"stopped-failing":return{label:"Stopped failing",color:"info",icon:"i-lucide-check",hint:"The tests went green. Nothing corroborates which change did it."};case"regressed":return{label:"Regressed",color:"error",icon:"i-lucide-undo-2",hint:"A fix was recorded for this cluster and it did not hold — the failure came back."};default:return null}}function Qe(e){return e&&{timeout:"warning",assertion:"error","strict-mode":"info",navigation:"secondary",crash:"error",unknown:"neutral"}[e]||"neutral"}const T=["#ef4444","#f97316","#f59e0b","#84cc16","#10b981","#14b8a6","#06b6d4","#3b82f6","#6366f1","#8b5cf6","#d946ef","#ec4899"];function Ke(){return T[Math.floor(Math.random()*T.length)]}function I(e){return!e.startsWith(".")&&!e.startsWith("/")?e:e.replace(".data/storage/","")}function Ze(e,t,n="/",r=!1){const a=(n||"/").replace(/\/$/,""),u=new URLSearchParams,o=/\.[a-z0-9]+$/i.test(e);t&&!o&&u.set("contentType",t),r&&u.set("compress","1");const i=u.toString();return`${a}/api/files/${I(e)}${i?`?${i}`:""}`}function et(e,t="/",n=!1){const r=(t||"/").replace(/\/$/,""),o=`${typeof location>"u"?"":location.origin}${r}/${n?"":"api/files/"}${I(e)}`;return`${r}/trace-viewer/?trace=${encodeURIComponent(o)}`}function tt(e,t="Unknown error"){if(e&&typeof e=="object"){const n=e;return n.data?.message??n.message??t}return t}function nt(e,t){const n=t.trim().toLowerCase();return n?e.filter(r=>r.message.toLowerCase().includes(n)||r.author.toLowerCase().includes(n)||r.sha.includes(n)||r.shortSha.includes(n)):e}function rt(e){switch(e){case"added":return{icon:"i-lucide-file-plus",color:"text-green-500",badgeColor:"success"};case"removed":return{icon:"i-lucide-file-minus",color:"text-red-500",badgeColor:"error"};case"renamed":return{icon:"i-lucide-file-symlink",color:"text-blue-500",badgeColor:"info"};default:return{icon:"i-lucide-file-pen-line",color:"text-gray-400",badgeColor:"neutral"}}}const at={add:"bg-green-50 dark:bg-green-950/30 text-green-800 dark:text-green-300",remove:"bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-300",hunk:"bg-blue-50 dark:bg-blue-950/20 text-blue-500 dark:text-blue-400",context:"text-gray-600 dark:text-gray-400"};function it(e){return e.split(`
2
- `).map(t=>t.startsWith("+")&&!t.startsWith("+++")?{type:"add",text:t}:t.startsWith("-")&&!t.startsWith("---")?{type:"remove",text:t}:t.startsWith("@@")?{type:"hunk",text:t}:{type:"context",text:t})}const Fe="\x1B",Ae={30:"#000000",31:"#dc2626",32:"#16a34a",33:"#d97706",34:"#2563eb",35:"#9333ea",36:"#0891b2",37:"#9ca3af"},Ne={40:"#000000",41:"#dc2626",42:"#16a34a",43:"#d97706",44:"#2563eb",45:"#9333ea",46:"#0891b2",47:"#9ca3af"},F=new RegExp(`${Fe}\\[([0-9;]*)m`,"g");function Oe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ot(e){const t=[];let n=0,r,a,u=!1,o=!1,i=!1,l=!1;const d=c=>{if(!c)return;const s=[];u&&s.push("font-weight:600"),o&&s.push("opacity:.7"),i&&s.push("font-style:italic"),l&&s.push("text-decoration:underline"),r&&s.push(`color:${r}`),a&&s.push(`background:${a}`);const m=Oe(c);t.push(s.length?`<span style="${s.join(";")}">${m}</span>`:m)},f=c=>{for(const s of c)s===0?(r=void 0,a=void 0,u=!1,o=!1,i=!1,l=!1):s===1?u=!0:s===2?o=!0:s===3?i=!0:s===4?l=!0:s===22?(u=!1,o=!1):s===23?i=!1:s===24?l=!1:s>=30&&s<=37?r=Ae[s]:s===39?r=void 0:s>=40&&s<=47?a=Ne[s]:s===49&&(a=void 0)};let h;for(;(h=F.exec(e))!==null;){d(e.slice(n,h.index)),n=F.lastIndex;const c=h[1]?h[1].split(";").map(Number):[0];f(c)}return d(e.slice(n)),t.join("")}function st(e,t=120){if(!e)return"";const n=e.replace(/\n/g," · ");return n.length<=t?n:n.slice(0,t)+"…"}function ut(e){return e.totalTests>0?Math.round(e.passedTests/e.totalTests*100):0}function ct(e){return e==="flaky"?"warning":e==="never-run"?"neutral":e==="didnotrun"?"warning":Te(e)}function lt(e){switch(e.toUpperCase()){case"GET":return"info";case"POST":return"success";case"DELETE":return"error";case"PUT":case"PATCH":return"warning";default:return"neutral"}}function dt(e){return!e||e<=0?"neutral":e>=500?"error":e>=400?"warning":"success"}export{Ve as A,He as B,Ye as C,Ue as D,Ke as E,ut as F,Re as G,je as a,Je as b,Qe as c,Ge as d,tt as e,$e as f,nt as g,st as h,ze as i,Te as j,Be as k,ct as l,Le as m,Ze as n,lt as o,Ee as p,dt as q,ot as r,rt as s,_e as t,at as u,it as v,et as w,I as x,Xe as y,qe as z};
@@ -1,2 +0,0 @@
1
- import{_ as ss}from"./DTrPCv7R.js";import{d as me,o as s,c as a,j as l,p as ke,i as n,z as ns,f as w,K as at,g as i,m as _,t as o,k as e,y as oe,_ as Ce,F as O,v as g,A as ot,b as vt,B as kt,ak as as,P as pt,l as Pe,al as gt,s as _e,G as Oe,D as lt,q as Y,h as I,r as W,L as Ne,R as we,C as Ue,n as Xe,H as Qe,J as de,am as xt,E as os,I as ls,u as Ke,w as Le,ah as is,ad as bt,a as rs,e as us}from"./CNu3kken.js";import{_ as wt}from"./FJTsZ5Aa.js";import{_ as cs}from"./B3G-TIoP.js";import{_ as ds}from"./pZbe82l5.js";import{_ as ms,a as fs}from"./2yLW7WU0.js";import{_ as ps,a as gs,b as xs,c as ys}from"./dUPMBJ4f.js";import{_ as hs}from"./5QBnDbs_.js";import{_ as We}from"./CdEzDaDI.js";import{_ as Ie}from"./CfhOanaF.js";import{_ as _t}from"./Bag08cIY.js";import{_ as vs}from"./DylyATWU.js";import{_ as ks}from"./DAhv9aNg.js";import{y as $t,n as Ct,p as Tt,f as it,a as bs,h as Rt,m as ws,z as tt,A as st,k as De,B as zt,j as nt,b as _s,c as $s,i as ue}from"./DeewM3Wg.js";import{f as Ge}from"./D-c8ZSws.js";import{_ as Cs}from"./CvVbKrcH.js";import{_ as rt}from"./B_JSV0yG.js";import{_ as Ts}from"./9_aJhhcm.js";import{b as St}from"./D7t0Dn3h.js";import{a as ut,u as Ee}from"./DprkT7rM.js";import{_ as Rs}from"./C9I1Dp3S.js";import{_ as It}from"./BtZNYmZO.js";import{_ as zs}from"./DNKZmhbX.js";import{_ as Ft}from"./Ce_j5NtN.js";import{_ as Ss}from"./7_9fts7T.js";import{_ as Pt}from"./5SkLJHl8.js";import{u as Is}from"./BAbrtVp3.js";import{_ as Fs}from"./B_MVJP17.js";import{_ as jt}from"./HIGGZ_c-.js";import{_ as Dt}from"./oSLbl-p0.js";import{_ as Ps}from"./Ce47NgZw.js";import{_ as ct}from"./D3SJGdl4.js";import{_ as Nt}from"./DZECGgZm.js";import{_ as js}from"./CIQeRUSy.js";import{_ as Bt}from"./roaTZkYi.js";import{_ as Ds}from"./BM5BPKlc.js";import{_ as Ns}from"./6vX5JdHr.js";import{_ as Bs}from"./Ya8ZzWuY.js";import{u as Ms}from"./sqqg4oXL.js";import{_ as As}from"./C2_7XZo0.js";import{u as Us,s as Ls}from"./Bsc11YIJ.js";import"./BZFiz2UB.js";import"./DNqm5cWU.js";import"./Bq4_kqIp.js";import"./BjaRappk.js";import"./D7W_4Sqc.js";import"./CF_eDZHu.js";import"./DZ-KbUZi.js";import"./DYjxDsYC.js";import"./BVyjw9Bi.js";import"./BZOykMLD.js";import"./B3AG2m76.js";import"./DJzFYrBt.js";import"./D7fxV-UA.js";import"./B0tmRAhY.js";import"./BuGAn4f7.js";import"./BjOFxi54.js";import"./CmTzxoQt.js";import"./CLWMETf9.js";import"./CAoQUDI4.js";const Es={key:0,class:"inline-flex items-center gap-2 text-info"},Os={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 & artifacts"},Ks={class:"tabular-nums whitespace-nowrap"},Ws={class:"text-dimmed"},Hs={class:"p-3 w-72 space-y-2"},Vs={class:"text-xs font-medium text-muted inline-flex items-center gap-1"},Gs={class:"text-xs tabular-nums text-dimmed shrink-0"},Xs={key:0,class:"flex items-center justify-between gap-2 text-sm border-t border-default pt-2"},qs={class:"truncate"},Ys={class:"text-xs tabular-nums text-dimmed shrink-0"},Js=me({__name:"RunStorageChip",props:{storageStats:{},reports:{},finalizing:{type:Boolean}},setup(t){const y=ot();return(v,z)=>{const T=ke,m=ns,R=Ie,u=Ce,h=at;return t.finalizing?(s(),a("div",Es,[l(T,{name:"i-lucide-upload",class:"size-3.5 shrink-0 animate-pulse"}),z[0]||(z[0]=n("span",{class:"text-xs font-medium whitespace-nowrap"},"Uploading reports & traces…",-1)),l(m,{value:null,size:"sm",color:"info",class:"w-24 rounded-full animate-pulse"})])):t.storageStats?.totalFiles?(s(),w(h,{key:1},{content:i(()=>[n("div",Hs,[n("p",Vs,[z[1]||(z[1]=_(" Stored artifacts ",-1)),l(R,{topic:"run.reports"})]),(s(!0),a(O,null,oe(t.reports,N=>(s(),a("div",{key:`${N.type}-${N.path}`,class:"flex items-center justify-between gap-2 min-w-0"},[l(u,{href:("fileApiUrl"in v?v.fileApiUrl:e(Ct))(N.path,null,e(y).app?.baseURL),icon:("reportIcon"in v?v.reportIcon:e($t))(N.type),target:"_blank",size:"xs",variant:"outline",class:"min-w-0",ui:{label:"truncate"}},{default:i(()=>[_(o(N.label),1)]),_:2},1032,["href","icon"]),n("span",Gs,o(("formatBytes"in v?v.formatBytes:e(Ge))(N.size)),1)]))),128)),t.storageStats.testCaseFilesCount>0?(s(),a("div",Xs,[n("span",qs,"Test files ("+o(t.storageStats.testCaseFilesCount)+")",1),n("span",Ys,o(("formatBytes"in v?v.formatBytes:e(Ge))(t.storageStats.testCaseFilesSize)),1)])):g("",!0)])]),default:i(()=>[n("button",Os,[l(T,{name:"i-lucide-database",class:"size-3.5 text-dimmed shrink-0"}),n("span",Ks,[_(o(("formatBytes"in v?v.formatBytes:e(Ge))(t.storageStats.totalSize))+" ",1),n("span",Ws,"· "+o(t.storageStats.totalFiles)+" file"+o(t.storageStats.totalFiles===1?"":"s"),1)]),l(T,{name:"i-lucide-chevron-down",class:"size-3 text-dimmed shrink-0"})])]),_:1})):g("",!0)}}}),Zs=Object.assign(Js,{__name:"RunStorageChip"}),Qs={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},en={class:"flex items-center gap-3 min-w-0"},tn={class:"text-sm font-semibold truncate flex items-center gap-1"},sn={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},nn={class:"text-xs text-zinc-500 tabular-nums whitespace-nowrap"},an={class:"text-zinc-700 dark:text-zinc-300"},on={class:"text-xs text-emerald-600 dark:text-emerald-400 tabular-nums whitespace-nowrap"},ln={class:"text-xs text-rose-600 dark:text-rose-400 tabular-nums whitespace-nowrap"},rn={class:"text-xs text-zinc-500 tabular-nums whitespace-nowrap"},un={class:"text-xs text-amber-600 dark:text-amber-400 tabular-nums whitespace-nowrap",title:"Tests that never ran (maxFailures cutoff or a serial-group failure)"},cn={class:"text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"},dn={class:"@container"},mn={class:"space-y-3"},fn={class:"flex items-start justify-between gap-x-3 gap-y-2 flex-wrap pr-8"},pn={class:"min-w-0 flex-1 basis-64"},gn={class:"flex items-center gap-2 flex-wrap"},xn={class:"text-base font-bold shrink-0 flex items-center gap-1"},yn={class:"mt-1 text-xs text-muted flex items-center gap-1.5 flex-wrap"},hn={class:"text-dimmed"},vn={class:"flex items-center gap-1.5 shrink-0"},kn={class:"p-2 space-y-1 min-w-32"},bn=["onClick"],wn={class:"hidden @2xl:inline"},_n={class:"text-xl font-bold mt-0.5"},$n={class:"relative"},Cn={class:"text-xl font-bold mt-0.5 text-emerald-600 dark:text-emerald-400"},Tn={class:"text-xl font-bold mt-0.5 text-rose-600 dark:text-rose-400"},Rn={class:"text-xl font-bold mt-0.5 text-zinc-600 dark:text-zinc-400"},zn={class:"text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"},Sn={key:0,class:"flex items-center gap-x-4 gap-y-1.5 flex-wrap"},In={class:"flex-1 basis-60 min-w-44 max-w-xl"},Fn={class:"flex items-center flex-wrap gap-x-3 gap-y-1 text-xs shrink-0"},Pn={class:"flex items-center gap-1"},jn={key:0,class:"flex items-center gap-1"},Dn={key:1,class:"flex items-center gap-1"},Nn={key:2,class:"flex items-center gap-1"},Bn={key:0,class:"rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"},Mn={key:1},An=["href"],Un={key:1},Ln={class:"text-muted"},En={key:0,class:"font-medium"},On=["title"],Kn={key:2,class:"text-muted"},Wn=["title"],Hn={class:"text-muted whitespace-nowrap"},Vn={class:"text-muted"},Gn={key:0,class:"mt-2"},Xn={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"},qn={class:"m-0"},Yn=me({__name:"RunSummary",props:{testRun:{},displayProgress:{},allReports:{},showCustomData:{type:Boolean},finalizing:{type:Boolean},activeFilter:{},totalWastedTime:{}},emits:["update:showCustomData","filter-status","label-updated"],setup(t,{emit:y}){const v=t,z=y,T=vt(),m=ot(),R=I(()=>v.testRun?.storageStats),u=I(()=>v.testRun?.metadata?.ci),h=I(()=>v.testRun?.metadata?.scm),N=I(()=>v.testRun?.metadata?.tags),B=I(()=>v.testRun?.metadata?.customData),P=I(()=>!!(u.value||v.testRun?.environment)),F=I(()=>!!(v.testRun?.playwrightVersion||v.testRun?.reporterVersion)),j=I(()=>!!(R.value?.totalFiles||v.finalizing)),K=I(()=>v.allReports[0]??null),{copy:U,copied:p}=ut(),S=W("file-line"),$=W(!1),c=W(!1);kt(()=>{c.value=!!as()});const f=I(()=>v.testRun?.testCases?v.testRun.testCases.filter(r=>r.status==="failed"||r.status==="timedout").map(r=>({filePath:(r.filePath||r.location?.split(":")[0])??"",title:r.title,line:r.location&&parseInt(r.location.split(":")[1]??"",10)||null,projectName:r.browser?.projectName||null})):[]);function M(){return St(f.value,{mode:S.value})}async function C(){const r=M();r&&($.value=!0,await U(r,{toast:"Retry command copied"}),setTimeout(()=>{$.value=!1},2e3))}const L=I(()=>$.value?"Copied!":Rt(M()));function k(){const r=v.testRun;if(!r)return"";const d=r.status==="passed"?"✅":r.status==="failed"?"❌":r.status==="running"?"🔄":"⚠️",X=r.label?` — ${r.label}`:"",te=r.project?.label??r.project?.name??"",J=r.totalTests??0,b=r.passedTests??0,H=r.failedTests??0,ne=r.skippedTests??0,ee=r.didNotRunTests??0,xe=r.flakyTests??0,be=bs(r.duration),ae=xe>0?` · ${xe} flaky`:"",he=ee>0?` · ${ee} didn't run`:"";return[`*Run #${r.id}*${X}`,`Status: ${d} ${r.status} | Project: ${te}`,`Tests: ${J} total · ${b} passed · ${H} failed · ${ne} skipped${he}${ae}`,`Duration: ${be}`].join(`
2
- `)}const G=W(""),Z=W(!1),se=W(!1);let Q=!1;const le=W(null);function E(){Q=!1,G.value=v.testRun?.label??"",Z.value=!0,Ne(()=>le.value?.focus())}async function D(){if(se.value)return;if(Q){Q=!1;return}const r=v.testRun;if(r){se.value=!0;try{await $fetch(`/api/test-runs/${r.id}`,{method:"PATCH",body:{label:G.value||null}}),Z.value=!1,z("label-updated")}catch(d){const X=d&&typeof d=="object"&&"data"in d?d.data?.message:"Failed to save label";T.add({title:"Error",description:X||"Failed to save label",color:"error"})}finally{se.value=!1}}}function ve(){Q=!0,Z.value=!1}function fe(r){r.key==="Enter"?D():r.key==="Escape"&&ve()}return(r,d)=>{const X=ps,te=ke,J=_e,b=hs,H=We,ne=Ie,ee=_t,xe=Oe,be=wt,ae=lt,he=Ce,Te=at,pe=vs,Re=ks,ge=xs,Se=Zs,x=Cs,$e=gs,Be=rt,Fe=Ts;return s(),w(Fe,{"storage-key":"test-run"},{folded:i(()=>[n("div",Qs,[n("div",en,[l(X,{status:t.testRun?.status??"",size:"sm"},null,8,["status"]),n("span",tn,[_(" Run #"+o(t.testRun?.id)+" ",1),e(Z)?(s(),a(O,{key:0},[pt(n("input",{ref_key:"labelInputRef",ref:le,"onUpdate:modelValue":d[0]||(d[0]=ie=>Pe(G)?G.value=ie:null),type:"text",placeholder:"Add a label...",class:"inline-block w-40 text-sm font-normal border-b border-dashed border-zinc-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:fe,onBlur:D},null,544),[[gt,e(G)]]),e(se)?(s(),w(te,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-zinc-400 animate-spin shrink-0"})):g("",!0)],64)):(s(),a(O,{key:1},[t.testRun?.label?(s(),a("span",{key:0,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",onClick:E},"— "+o(t.testRun.label),1)):(s(),a("button",{key:1,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",title:"Add a label",onClick:E}," + label "))],64))]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),w(J,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:i(()=>[l(te,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),_(" "+o(t.testRun.shardsFinished??0)+"/"+o(t.testRun.shardTotal),1)]),_:1},8,["title"])):g("",!0)]),n("div",sn,[n("span",nn,[d[12]||(d[12]=_(" T: ",-1)),n("strong",an,o(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)]),n("span",on,[d[13]||(d[13]=_(" P: ",-1)),n("strong",null,o(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)]),n("span",ln,[d[14]||(d[14]=_(" F: ",-1)),n("strong",null,o(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)]),n("span",rn,[d[15]||(d[15]=_(" S: ",-1)),n("strong",null,o(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)]),n("span",un,[d[16]||(d[16]=_(" DNR: ",-1)),n("strong",null,o(t.testRun?.didNotRunTests??0),1)]),n("span",cn,[d[17]||(d[17]=_(" Fl: ",-1)),n("strong",null,o(t.testRun?.flakyTests??0),1)]),l(b,{passed:t.displayProgress?.passedTests??t.testRun?.passedTests??0,failed:t.displayProgress?.failedTests??t.testRun?.failedTests??0,skipped:t.displayProgress?.skippedTests??t.testRun?.skippedTests??0,flaky:t.testRun?.flakyTests??0,"did-not-run":t.testRun?.didNotRunTests??0,total:t.displayProgress?.totalTests??t.testRun?.totalTests??0},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),l(H,{ms:t.testRun?.duration,class:"text-xs text-zinc-400"},null,8,["ms"])])])]),default:i(()=>[n("div",dn,[l(Be,{class:"shadow-xs",ui:{footer:"px-4 py-2.5 sm:px-4 bg-muted/30"}},{footer:i(()=>[l($e,null,{default:i(()=>[e(P)?(s(),w(ge,{key:0,label:"CI & environment",icon:"i-lucide-cloud",help:"run.ci-env"},{default:i(()=>[t.testRun?.environment?(s(),a("span",Bn,o(t.testRun.environment),1)):g("",!0),e(u)?.provider?(s(),a("span",Mn,o(e(u).provider),1)):g("",!0),e(u)?.buildNumber||e(u)?.buildUrl?(s(),a(O,{key:2},[d[29]||(d[29]=n("span",{class:"text-dimmed"},"·",-1)),e(u)?.buildUrl?(s(),a("a",{key:0,href:e(u).buildUrl,target:"_blank",class:"text-primary hover:underline"},o(e(u)?.buildNumber?`Build #${e(u).buildNumber}`:"View build"),9,An)):(s(),a("span",Un,"Build #"+o(e(u).buildNumber),1))],64)):g("",!0),e(u)?.workflow||e(u)?.jobName?(s(),a(O,{key:3},[d[30]||(d[30]=n("span",{class:"text-dimmed"},"·",-1)),n("span",Ln,[e(u)?.workflow?(s(),a(O,{key:0},[_(o(e(u).workflow),1)],64)):g("",!0),e(u)?.workflow&&e(u)?.jobName?(s(),a(O,{key:1},[_(" · ")],64)):g("",!0),e(u)?.jobName?(s(),a(O,{key:2},[_(o(e(u).jobName),1)],64)):g("",!0)])],64)):g("",!0)]),_:1})):g("",!0),e(h)?(s(),w(ge,{key:1,label:"Source",icon:"i-lucide-git-branch"},{default:i(()=>[e(h).branch?(s(),a("span",En,o(e(h).branch),1)):g("",!0),e(h).commit?(s(),a("code",{key:1,class:"text-xs font-mono bg-zinc-100 dark:bg-zinc-800 px-1 py-0.5 rounded",title:e(h).commit},o(e(h).commit.length>=8?e(h).commit.substring(0,8):e(h).commit),9,On)):g("",!0),e(h).author?(s(),a("span",Kn,o(e(h).author),1)):g("",!0),e(h).commitMessage?(s(),a("span",{key:3,class:"text-xs text-dimmed truncate max-w-[40ch]",title:e(h).commitMessage},o(e(h).commitMessage),9,Wn)):g("",!0)]),_:1})):g("",!0),e(F)?(s(),w(ge,{key:2,label:"Tooling versions",icon:"i-lucide-tag"},{default:i(()=>[n("span",Hn,[t.testRun?.playwrightVersion?(s(),a(O,{key:0},[_("Playwright v"+o(t.testRun.playwrightVersion),1)],64)):g("",!0),t.testRun?.playwrightVersion&&t.testRun?.reporterVersion?(s(),a(O,{key:1},[_(" · ")],64)):g("",!0),t.testRun?.reporterVersion?(s(),a(O,{key:2},[_("Piwi v"+o(t.testRun.reporterVersion),1)],64)):g("",!0)])]),_:1})):g("",!0),e(N)?.length?(s(),w(ge,{key:3,label:"Tags",icon:"i-lucide-tags"},{default:i(()=>[(s(!0),a(O,null,oe(e(N),ie=>(s(),w(J,{key:ie,color:"neutral",variant:"soft",size:"sm"},{default:i(()=>[_(o(ie),1)]),_:2},1024))),128))]),_:1})):g("",!0),t.testRun?.metadata?.relatedIssue?(s(),w(ge,{key:4,label:"Related issue",icon:"i-lucide-bookmark"},{default:i(()=>[n("span",Vn,o(t.testRun.metadata.relatedIssue),1)]),_:1})):g("",!0),e(j)?(s(),w(ge,{key:5,label:"Storage"},{default:i(()=>[l(Se,{"storage-stats":e(R),reports:t.allReports,finalizing:t.finalizing},null,8,["storage-stats","reports","finalizing"])]),_:1})):g("",!0),l(ge,{label:"Links",icon:"i-lucide-link",help:"run.metadata"},{default:i(()=>[l(x,{"entity-type":"test_run","entity-id":t.testRun.id,links:t.testRun.links??null,onUpdated:d[10]||(d[10]=ie=>r.$emit("label-updated"))},null,8,["entity-id","links"])]),_:1}),e(B)?(s(),w(ge,{key:6,label:"Custom data"},{default:i(()=>[l(he,{size:"xs",variant:"ghost",color:"neutral",icon:t.showCustomData?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:d[11]||(d[11]=ie=>z("update:showCustomData",!t.showCustomData))},{default:i(()=>[...d[31]||(d[31]=[_(" Custom data ",-1)])]),_:1},8,["icon"])]),_:1})):g("",!0)]),_:1}),t.showCustomData&&e(B)?(s(),a("div",Gn,[n("div",Xn,[n("pre",qn,o(JSON.stringify(e(B),null,2)),1)])])):g("",!0)]),default:i(()=>[n("div",mn,[n("div",fn,[n("div",pn,[n("div",gn,[l(X,{status:t.testRun?.status??""},null,8,["status"]),n("h2",xn,[_(" Run #"+o(t.testRun?.id)+" ",1),e(Z)?(s(),a(O,{key:0},[pt(n("input",{ref_key:"labelInputRef",ref:le,"onUpdate:modelValue":d[1]||(d[1]=ie=>Pe(G)?G.value=ie:null),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",onKeydown:fe,onBlur:D},null,544),[[gt,e(G)]]),e(se)?(s(),w(te,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-zinc-400 animate-spin shrink-0"})):g("",!0)],64)):(s(),a(O,{key:1},[t.testRun?.label?(s(),a("span",{key:0,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",onClick:E},"— "+o(t.testRun.label),1)):(s(),a("button",{key:1,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",onClick:E}," + label "))],64)),l(ne,{topic:"run.summary"})]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),w(J,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:i(()=>[l(te,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),_(" "+o(t.testRun.shardsFinished??0)+"/"+o(t.testRun.shardTotal),1)]),_:1},8,["title"])):g("",!0),t.testRun?.precedingMarker?(s(),w(be,{key:1,text:`This run started after: ${t.testRun.precedingMarker.label}`},{default:i(()=>[l(xe,{to:`/projects/${t.testRun.projectId}?tab=timeline`,class:"shrink-0 inline-flex items-center gap-1"},{default:i(()=>[d[18]||(d[18]=n("span",{class:"text-xs text-muted"},"After",-1)),l(ee,{marker:t.testRun.precedingMarker,size:"xs"},null,8,["marker"])]),_:1},8,["to"])]),_:1},8,["text"])):g("",!0)]),n("p",yn,[n("span",null,"Started "+o(("prettyDateFormat"in r?r.prettyDateFormat:e(Tt))(t.testRun?.startTime)),1),l(ae,null,{default:i(()=>[n("span",hn,"· "+o(("formatRelativeTime"in r?r.formatRelativeTime:e(it))(t.testRun?.startTime)),1)]),_:1})])]),n("div",vn,[l(be,{text:e(p)?"Copied!":"Copy run summary"},{default:i(()=>[l(he,{size:"xs",variant:"ghost",color:"neutral",icon:e(p)?"i-lucide-check":"i-lucide-clipboard","aria-label":"Copy run summary",class:"text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",onClick:d[2]||(d[2]=ie=>e(U)(k(),{toast:"Run summary copied"}))},null,8,["icon"])]),_:1},8,["text"]),e(f).length>0&&!e(c)?(s(),w(Te,{key:0},{content:i(()=>[n("div",kn,[d[20]||(d[20]=n("p",{class:"text-xs font-medium text-zinc-500 px-2 py-1"},"Mode",-1)),(s(),a(O,null,oe(["file-line","grep","file"],ie=>n("button",{key:ie,class:Y(["w-full text-left px-2 py-1 text-sm rounded hover:bg-zinc-100 dark:hover:bg-zinc-800",e(S)===ie?"bg-primary/10 text-primary":""]),onClick:dt=>S.value=ie},o(ie==="file-line"?"File:line":ie==="grep"?"Title (grep)":"File only"),11,bn)),64))])]),default:i(()=>[l(he,{size:"xs",color:"warning",variant:"subtle",icon:e($)?"i-lucide-check":"i-lucide-play",title:e(L),"aria-label":"Retry",onClick:d[3]||(d[3]=ie=>C())},{default:i(()=>[...d[19]||(d[19]=[n("span",{class:"hidden @2xl:inline"},"Retry",-1)])]),_:1},8,["icon","title"])]),_:1})):g("",!0),e(f).length>0?(s(),w(pe,{key:1,"project-id":t.testRun?.project?.id,"project-label":t.testRun?.project?.label??t.testRun?.project?.name,cases:e(f)},null,8,["project-id","project-label","cases"])):g("",!0),e(K)?(s(),w(he,{key:2,href:("fileApiUrl"in r?r.fileApiUrl:e(Ct))(e(K).path,null,e(m).app?.baseURL),icon:("reportIcon"in r?r.reportIcon:e($t))(e(K).type),target:"_blank",size:"xs",color:"primary",variant:"outline","aria-label":e(K).label,title:e(K).size?`${e(K).label} · ${("formatBytes"in r?r.formatBytes:e(Ge))(e(K).size)}`:e(K).label},{default:i(()=>[n("span",wn,o(e(K).label),1)]),_:1},8,["href","icon","aria-label","title"])):g("",!0)])]),l(Re,{"min-tile-width":"7.5rem"},{default:i(()=>[n("button",{class:Y(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="all"?"bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500":"bg-elevated/60 hover:bg-elevated"]),onClick:d[4]||(d[4]=ie=>z("filter-status","all"))},[d[21]||(d[21]=n("p",{class:"text-xs font-medium text-zinc-500 uppercase tracking-wider"},"Total",-1)),n("p",_n,o(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)],2),n("div",$n,[n("button",{class:Y(["rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",t.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"]),onClick:d[5]||(d[5]=ie=>z("filter-status","passed"))},[d[22]||(d[22]=n("p",{class:"text-xs font-medium text-emerald-700 dark:text-emerald-400 uppercase tracking-wider"}," Passed ",-1)),n("p",Cn,o(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)],2),(t.testRun?.flakyTests??0)>0?(s(),a("button",{key:0,class:Y(["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",t.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"]),title:"Flaky — passed only after a retry (a subset of passed). Click to filter.",onClick:d[6]||(d[6]=ie=>z("filter-status","flaky"))},[l(te,{name:"i-lucide-shuffle",class:"size-3"}),_(" "+o(t.testRun?.flakyTests??0),1)],2)):g("",!0)]),n("button",{class:Y(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.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"]),onClick:d[7]||(d[7]=ie=>z("filter-status","failed"))},[d[23]||(d[23]=n("p",{class:"text-xs font-medium text-rose-700 dark:text-rose-400 uppercase tracking-wider"},"Failed",-1)),n("p",Tn,o(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)],2),n("button",{class:Y(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="skipped"?"bg-accented ring-2 ring-zinc-400 dark:ring-zinc-500":"bg-elevated/60 hover:bg-elevated"]),onClick:d[8]||(d[8]=ie=>z("filter-status","skipped"))},[d[24]||(d[24]=n("p",{class:"text-xs font-medium text-zinc-500 uppercase tracking-wider"},"Skipped",-1)),n("p",Rn,o(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)],2),n("button",{class:Y(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.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"]),title:"Tests that never ran (maxFailures cutoff or a serial-group failure)",onClick:d[9]||(d[9]=ie=>z("filter-status","didnotrun"))},[d[25]||(d[25]=n("p",{class:"text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"},"Didn't run",-1)),n("p",zn,o(t.testRun?.didNotRunTests??0),1)],2)]),_:1}),t.testRun?(s(),a("div",Sn,[n("div",In,[l(b,{passed:t.displayProgress?.passedTests??t.testRun?.passedTests??0,failed:t.displayProgress?.failedTests??t.testRun?.failedTests??0,skipped:t.displayProgress?.skippedTests??t.testRun?.skippedTests??0,flaky:t.testRun?.flakyTests??0,"did-not-run":t.testRun?.didNotRunTests??0,total:t.displayProgress?.totalTests??t.testRun?.totalTests??0},null,8,["passed","failed","skipped","flaky","did-not-run","total"])]),n("div",Fn,[n("div",Pn,[l(te,{name:"i-lucide-clock",class:"size-3.5 text-zinc-400"}),l(H,{ms:t.testRun?.duration,class:"font-medium"},null,8,["ms"])]),t.testRun?.avgTestDuration?(s(),a("div",jn,[l(te,{name:"i-lucide-gauge",class:"size-3.5 text-zinc-400"}),d[26]||(d[26]=n("span",{class:"text-zinc-500"},"Avg",-1)),l(H,{ms:t.testRun.avgTestDuration,class:"font-medium"},null,8,["ms"])])):g("",!0),t.testRun?.p90TestDuration?(s(),a("div",Dn,[l(te,{name:"i-lucide-arrow-up-right",class:"size-3.5 text-orange-500"}),d[27]||(d[27]=n("span",{class:"text-zinc-500"},"P90",-1)),l(H,{ms:t.testRun.p90TestDuration,class:"font-medium text-orange-600 dark:text-orange-400","unit-class":"opacity-60"},null,8,["ms"])])):g("",!0),t.totalWastedTime&&t.totalWastedTime>0?(s(),a("div",Nn,[l(te,{name:"i-lucide-clock",class:"size-3.5 text-amber-500"}),d[28]||(d[28]=n("span",{class:"text-zinc-500"},"Wasted",-1)),l(H,{ms:t.totalWastedTime,class:"font-medium text-amber-600 dark:text-amber-400","unit-class":"opacity-60"},null,8,["ms"])])):g("",!0)])])):g("",!0)])]),_:1})])]),_:1})}}}),Jn=Object.assign(Yn,{__name:"RunSummary"}),Zn={key:0,class:"inline-flex items-center gap-1 flex-wrap"},Qn=me({__name:"TestRowBadges",props:{mode:{default:null},isNewRegression:{type:[Boolean,null],default:!1},isNewFlaky:{type:[Boolean,null],default:!1},annotations:{default:null},tags:{default:null},meta:{default:null},maxTags:{default:0}},setup(t){const y=t;function v(h){return h==="fixme"||h==="slow"?"warning":h==="fail"?"error":h==="skip"?"neutral":h==="tag"?"primary":"info"}function z(h){switch(h){case"fixme":return"i-lucide-wrench";case"skip":return"i-lucide-skip-forward";case"slow":return"i-lucide-timer";case"fail":return"i-lucide-x-circle";case"tag":return"i-lucide-tag";default:return null}}function T(h){return h.type==="tag"?h.description??h.type:h.type}const m=I(()=>(y.annotations??[]).filter(h=>!ws(h.type))),R=I(()=>!!((y.tags?.length??0)>0||y.meta?.owner||y.meta?.priority||y.meta?.feature||y.meta?.link)),u=I(()=>y.mode==="parallel"||y.mode==="serial"||!!y.isNewRegression||!!y.isNewFlaky||m.value.length>0||R.value);return(h,N)=>{const B=_e,P=ke,F=Ss;return e(u)?(s(),a("div",Zn,[t.mode==="parallel"?(s(),w(B,{key:0,color:"success",variant:"soft",size:"xs",class:"shrink-0"},{default:i(()=>[...N[0]||(N[0]=[_("parallel",-1)])]),_:1})):g("",!0),t.mode==="serial"?(s(),w(B,{key:1,color:"warning",variant:"soft",size:"xs",class:"shrink-0"},{default:i(()=>[...N[1]||(N[1]=[_("serial",-1)])]),_:1})):g("",!0),t.isNewRegression?(s(),w(B,{key:2,color:"error",variant:"solid",size:"xs",class:"uppercase tracking-wider shrink-0",title:"First run in which this test failed"},{default:i(()=>[...N[2]||(N[2]=[_(" NEW ",-1)])]),_:1})):g("",!0),t.isNewFlaky?(s(),w(B,{key:3,color:"info",variant:"solid",size:"xs",class:"uppercase tracking-wider shrink-0",title:"First run in which this test was flaky"},{default:i(()=>[...N[3]||(N[3]=[_(" FLAKY ",-1)])]),_:1})):g("",!0),(s(!0),a(O,null,oe(e(m),j=>(s(),w(B,{key:`${j.type}:${j.description??""}`,color:v(j.type),variant:"soft",size:"xs",title:j.type!=="tag"?j.description??void 0:void 0,class:"shrink-0 gap-1"},{default:i(()=>[z(j.type)?(s(),w(P,{key:0,name:z(j.type),class:"size-2.5 shrink-0"},null,8,["name"])):g("",!0),_(" "+o(T(j)),1)]),_:2},1032,["color","title"]))),128)),l(F,{tags:t.tags,meta:t.meta,"max-tags":t.maxTags},null,8,["tags","meta","max-tags"])])):g("",!0)}}}),Mt=Object.assign(Qn,{__name:"TestRowBadges"}),ea={class:"rounded-lg border border-default bg-default text-sm flex flex-col flex-1 min-h-0"},ta={class:"flex items-center justify-end px-3 py-1.5 border-b border-default bg-elevated shrink-0"},sa=["disabled","title"],na={class:"overflow-y-auto flex-1 min-h-0"},aa=["onClick"],oa={key:1,class:"font-medium truncate min-w-0 text-muted"},la={class:"flex items-center gap-1.5 sm:gap-2 shrink-0 tabular-nums"},ia=["title"],ra={class:"max-sm:sr-only"},ua=["href","title","onClick"],ca={class:"truncate"},da={class:"flex items-center gap-1.5 sm:gap-2 shrink-0 ml-auto"},ma={key:0,class:"text-xs text-info"},fa={key:4,class:"inline-flex items-center gap-0.5 text-xs text-amber-600 dark:text-amber-400",title:"Wasted in fixed waits"},pa={key:0,class:"text-center py-8 text-muted"},ga=me({__name:"TestCasesTree",props:{testCases:{},suites:{},hasFilter:{type:Boolean},highlightedCaseId:{},projectKey:{},projectName:{}},setup(t){const y=t,v=I(()=>{const p=new Map;for(const S of y.suites)p.set(`${S.filePath}${S.suitePath.join("")}`,S);return p});function z(p){return p==="timedOut"||p==="timedout"?"failed":p}const T=["failed","passed","skipped","didnotrun","running"];function m(p){return T.filter(S=>p[S]>0).map(S=>({key:S,count:p[S],label:De(S)}))}function R(p){const S={passed:0,failed:0,skipped:0,didnotrun:0,running:0,total:0};for(const $ of p){const c=z($.status);c in S&&S[c]++,S.total++}return S}const u=W(new Set),h=I(()=>u.value.size===0);function N(p){return y.hasFilter?!0:!u.value.has(p)}function B(p){if(y.hasFilter)return;const S=new Set(u.value);S.has(p)?S.delete(p):S.add(p),u.value=S}function P(){const p=[],S=new Map;for(const $ of y.testCases){const c=$.filePath??"unknown";S.has(c)||S.set(c,[]),S.get(c).push($)}for(const[$,c]of S){p.push(`file:${$}`);const f=new Set;for(const M of c){const C=M.suitePath??[];for(let L=1;L<=C.length;L++)f.add(`group:${$}${C.slice(0,L).join("")}`)}for(const M of f)p.push(M)}return p}function F(){u.value=new Set(P())}function j(){u.value=new Set}function K(p,S,$,c,f){const M=S.filter(k=>(k.suitePath??[]).length===c.length),C=S.filter(k=>(k.suitePath??[]).length>c.length),L=new Map;for(const k of C){const G=(k.suitePath??[])[c.length];L.has(G)||L.set(G,[]),L.get(G).push(k)}for(const[k,G]of L){const Z=[...c,k],se=`group:${$}${Z.join("")}`,Q=v.value.get(`${$}${Z.join("")}`);p.push({kind:"group",depth:f,key:se,label:k,stats:R(G),mode:Q?.mode??"default",annotations:Q?.annotations??[]}),N(se)&&K(p,G,$,Z,f+1)}for(const k of M)p.push({kind:"test",depth:f,key:`test:${k.id}`,test:k})}const U=I(()=>{const p=[],S=new Map;for(const $ of y.testCases){const c=$.filePath??"unknown";S.has(c)||S.set(c,[]),S.get(c).push($)}for(const[$,c]of[...S.entries()].sort(([f],[M])=>f.localeCompare(M))){const f=`file:${$}`;p.push({kind:"group",depth:0,key:f,label:$,stats:R(c)}),N(f)&&K(p,c,$,[],1)}return p});return(p,S)=>{const $=ke,c=Ft,f=Mt,M=Pt,C=We,L=_e;return s(),a("div",ea,[n("div",ta,[n("button",{class:Y(["flex items-center gap-1 text-xs transition-colors",t.hasFilter?"text-muted cursor-not-allowed opacity-50":"text-muted hover:text-default"]),disabled:t.hasFilter,title:t.hasFilter?"Clear filters to collapse/expand":h.value?"Collapse all":"Expand all",onClick:S[0]||(S[0]=k=>h.value?F():j())},[l($,{name:h.value?"i-lucide-fold-vertical":"i-lucide-unfold-vertical",class:"size-3.5"},null,8,["name"]),_(" "+o(h.value?"Collapse all":"Expand all"),1)],10,sa)]),n("div",na,[(s(!0),a(O,null,oe(U.value,k=>(s(),a(O,{key:k.key},[k.kind==="group"?(s(),a("div",{key:0,class:Y(["flex items-center gap-2 py-2 pr-4 border-b border-default last:border-b-0 select-none sticky",[k.depth===0?"bg-elevated":"bg-default",!t.hasFilter&&"cursor-pointer"]]),style:we({paddingLeft:`${k.depth*20+12}px`,top:`${k.depth*36}px`,zIndex:20-k.depth}),onClick:G=>B(k.key)},[l($,{name:N(k.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 text-muted shrink-0"},null,8,["name"]),l($,{name:k.depth===0?"i-lucide-file-code-2":"i-lucide-folder-open",class:Y(["size-4 shrink-0",k.depth===0?"text-blue-500":"text-amber-500"])},null,8,["name","class"]),k.depth===0?(s(),a("span",{key:0,class:"min-w-0",onClick:S[1]||(S[1]=Ue(()=>{},["stop"]))},[l(c,{"file-path":k.label,"project-key":t.projectKey,"project-name":t.projectName,class:"font-medium text-default"},null,8,["file-path","project-key","project-name"])])):(s(),a("span",oa,o(k.label),1)),k.depth>0?(s(),w(f,{key:2,mode:k.mode,annotations:k.annotations,class:"shrink-0"},null,8,["mode","annotations"])):g("",!0),S[2]||(S[2]=n("div",{class:"flex-1"},null,-1)),n("div",la,[(s(!0),a(O,null,oe(m(k.stats),G=>(s(),a("span",{key:G.key,class:Y(["text-xs inline-flex items-center gap-0.5",[("getStatusTextClass"in p?p.getStatusTextClass:e(tt))(G.key),G.key==="failed"?"font-medium":""]]),title:`${G.count} ${G.label}`},[l($,{name:("getStatusIcon"in p?p.getStatusIcon:e(st))(G.key),class:"size-3 shrink-0 sm:hidden"},null,8,["name"]),_(" "+o(G.count),1),n("span",ra,o(G.label),1)],10,ia))),128))])],14,aa)):(s(),a("div",{key:1,class:Y(["flex flex-wrap items-center gap-x-2 gap-y-1 pr-3 py-2 sm:py-1.5 border-b border-default last:border-b-0 hover:bg-zinc-50 dark:hover:bg-zinc-900/40 transition-colors",t.highlightedCaseId===k.test.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),style:we({paddingLeft:`${k.depth*20+12}px`})},[l(M,{browser:k.test.browser,size:"sm"},null,8,["browser"]),l($,{name:("getStatusIcon"in p?p.getStatusIcon:e(st))(k.test.status),class:Y(["size-4 shrink-0",[("getStatusTextClass"in p?p.getStatusTextClass:e(tt))(k.test.status),("isStatusInFlight"in p?p.isStatusInFlight:e(zt))(k.test.status)?"animate-spin":""]]),role:"img","aria-label":`Status: ${("formatStatusLabel"in p?p.formatStatusLabel:e(De))(k.test.status)}`,title:("formatStatusLabel"in p?p.formatStatusLabel:e(De))(k.test.status)},null,8,["name","class","aria-label","title"]),n("a",{href:`/test-run-cases/${k.test.id}`,class:"text-highlighted hover:text-primary hover:underline min-w-32 self-stretch flex items-center",title:k.test.title,onClick:Ue(G=>("navigateTo"in p?p.navigateTo:e(Xe))(`/test-run-cases/${k.test.id}`),["prevent"])},[n("span",ca,o(k.test.title),1)],8,ua),l(f,{"is-new-regression":!!k.test.isNewRegression,"is-new-flaky":!!k.test.isNewFlaky,annotations:k.test.testAnnotations,tags:k.test.tags,meta:k.test.testMeta,"max-tags":3,class:"shrink-0"},null,8,["is-new-regression","is-new-flaky","annotations","tags","meta"]),n("div",da,[k.test.status==="running"?(s(),a("span",ma,"In progress...")):k.test.duration?(s(),w(C,{key:1,ms:k.test.duration,class:"text-xs text-muted"},null,8,["ms"])):g("",!0),k.test.workerIndex!=null?(s(),w(L,{key:2,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:`Worker ${k.test.workerIndex}`},{default:i(()=>[_(" w"+o(k.test.workerIndex),1)]),_:2},1032,["title"])):g("",!0),(k.test.retries??0)>0?(s(),w(L,{key:3,color:"warning",variant:"soft",size:"xs"},{default:i(()=>[_(o(k.test.retries)+"x ",1)]),_:2},1024)):g("",!0),k.test.wastedTimeMs?(s(),a("span",fa,[l($,{name:"i-lucide-hourglass",class:"size-3 shrink-0"}),l(C,{ms:k.test.wastedTimeMs,"unit-class":"opacity-60","no-title":""},null,8,["ms"])])):g("",!0)])],6))],64))),128)),U.value.length===0?(s(),a("div",pa,[l($,{name:"i-lucide-search-x",class:"size-6 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"}),S[3]||(S[3]=n("p",{class:"text-sm"},"No test cases match your filters.",-1))])):g("",!0)])])}}}),xa=Object.assign(ga,{__name:"TestCasesTree"}),ya={class:"flex flex-col min-h-0"},ha={class:"flex items-center rounded-md border border-default overflow-hidden"},va={key:0,class:"text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"},ka={key:1,class:"text-sm text-zinc-500 tabular-nums inline-flex items-center gap-1"},ba={class:"flex flex-wrap items-center gap-1"},wa=["onClick"],_a={key:2,class:"flex items-center gap-1 md:hidden"},$a={key:0,class:"flex-1 min-h-0 max-lg:h-[70dvh] md:overflow-x-auto overflow-y-hidden rounded-lg border border-default bg-default"},Ca=["aria-rowcount"],Ta=["aria-sort","aria-label","title","onClick"],Ra={key:1,class:"truncate"},za={class:"flex items-start gap-2"},Sa=["href","onClick"],Ia={class:"pl-6 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted"},Fa={key:0,class:"text-info"},Pa={key:4,class:"inline-flex items-center gap-0.5 text-amber-600 dark:text-amber-400",title:"Wasted in fixed waits"},ja={class:"px-3 py-2 flex items-center min-w-0",role:"cell"},Da={class:"px-3 py-2 min-w-0 space-y-0.5",role:"cell"},Na={class:"flex items-center gap-1.5 min-w-0"},Ba=["href","title","onClick"],Ma={class:"px-3 py-2 flex items-center",role:"cell"},Aa={class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},Ua={key:0,class:"text-info text-xs"},La={class:"px-3 py-2 flex items-center",role:"cell"},Ea={class:"px-3 py-2 flex items-center tabular-nums",role:"cell"},Oa={key:0,class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},Ka={key:1,class:"text-zinc-400"},Wa={class:"flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-zinc-500"},Ha={key:1,class:"text-center py-10 text-zinc-500"},Va={key:2,class:"text-center py-10 text-zinc-500"},He="natural",Ga=me({__name:"TestCasesList",props:ls({testCases:{},suites:{},isLive:{type:Boolean},failureClusterFilter:{},projectKey:{},projectName:{}},{search:{default:""},searchModifiers:{},activeStatuses:{default:()=>[]},activeStatusesModifiers:{},browserFilter:{default:"all"},browserFilterModifiers:{}}),emits:["update:search","update:activeStatuses","update:browserFilter"],setup(t,{expose:y}){const{treeView:v,setTreeView:z}=Is("test-cases"),T=t,m=Qe(t,"search"),R=Qe(t,"activeStatuses"),u=Qe(t,"browserFilter"),h=W(!1),N=W(!1),B=[{label:"Passed",value:"passed",color:"green"},{label:"Failed",value:"failed",color:"red"},{label:"Skipped",value:"skipped",color:"gray"},{label:"Didn't run",value:"didnotrun",color:"amber"},{label:"Flaky",value:"flaky",color:"orange"}];function P(r){R.value.indexOf(r)>=0?R.value=R.value.filter(X=>X!==r):R.value=[...R.value,r]}const F=I(()=>{const r=new Set;for(const X of T.testCases){const te=X.browser?.projectName;te&&r.add(te)}const d=[{label:"All browsers",value:"all"}];for(const X of[...r].sort())d.push({label:X,value:X});return d});function j(r,d){return d==="failed"?r.status==="failed"||r.status==="timedOut"||r.status==="timedout":d==="flaky"?(r.retries??0)>0:r.status===d}const K=I(()=>{let r=T.testCases;if(T.failureClusterFilter!=null&&(r=r.filter(d=>d.failureClusterId===T.failureClusterFilter)),R.value.length>0&&(r=r.filter(d=>R.value.some(X=>j(d,X)))),u.value!=="all"&&(r=r.filter(d=>d.browser?.projectName===u.value)),m.value){const d=m.value.toLowerCase();r=r.filter(X=>X.title.toLowerCase().includes(d)||X.location&&X.location.toLowerCase().includes(d))}return h.value&&(r=r.filter(d=>d.isNewRegression)),N.value&&(r=r.filter(d=>d.isNewFlaky)),r}),U=W(null),p=W("asc");function S(r){U.value!==r?(U.value=r,p.value="asc"):p.value==="asc"?p.value="desc":U.value=null}function $(r){return U.value!==r?"i-lucide-chevrons-up-down":p.value==="asc"?"i-lucide-chevron-up":"i-lucide-chevron-down"}function c(r,d){switch(d){case"browser":return r.browser?.projectName??"";case"title":return r.title??"";case"status":return r.status??"";case"duration":return r.duration??0;case"workerIndex":return r.workerIndex??-1;case"retries":return r.retries??0;case"wastedTimeMs":return r.wastedTimeMs??0;default:return""}}const f=I(()=>{const r=K.value,d=U.value;if(!d)return r;const X=p.value==="asc"?1:-1;return[...r].sort((te,J)=>{const b=c(te,d),H=c(J,d);return typeof b=="number"&&typeof H=="number"?(b-H)*X:String(b).localeCompare(String(H))*X})}),M=I(()=>T.testCases.some(r=>(r.wastedTimeMs??0)>0)),C=I(()=>{const r=[{key:"browser",label:"Browser",sortable:!0,width:"3.25rem",align:"left",icon:"i-lucide-monitor"},{key:"title",label:"Test case",sortable:!0,width:"minmax(12rem, 3fr)",align:"left"},{key:"status",label:"Status",sortable:!0,width:"6rem",align:"left"},{key:"duration",label:"Duration",sortable:!0,width:"7rem",align:"left"},{key:"workerIndex",label:"Worker",sortable:!0,width:"6rem",align:"left"},{key:"retries",label:"Retries",sortable:!0,width:"6.5rem",align:"left"}];return M.value&&r.push({key:"wastedTimeMs",label:"Wasted",sortable:!0,width:"6rem",align:"left"}),r}),L=I(()=>[{label:"Run order",value:He},...C.value.map(r=>({label:r.label,value:r.key}))]),k=I({get:()=>U.value??He,set:r=>{U.value=r===He?null:r,r!==He&&(p.value="asc")}}),G=I(()=>C.value.map(r=>r.width).join(" ")),Z=I(()=>M.value?"47.5rem":"41.5rem"),se=I(()=>m.value!==""||R.value.length>0||u.value!=="all"||T.failureClusterFilter!=null),Q=W(null),le=W(!1),E=W(null);function D(r){return r.scrollHeight-r.scrollTop-r.clientHeight<50}function ve(r){const d=r.target;d&&(le.value=!D(d))}de(()=>T.isLive,r=>{r||(le.value=!1)}),de(()=>f.value.length,()=>{!T.isLive||le.value||Ne(()=>Q.value?.scrollToBottom())});function fe(r){z(!1),E.value=r;const d=()=>{const X=f.value.findIndex(te=>te.id===r);X>=0&&Q.value?.scrollToItem(X,{behavior:"smooth"})};Ne(()=>{Q.value?d():setTimeout(d,60),setTimeout(()=>{E.value=null},3e3)})}return y({scrollToCase:fe}),(r,d)=>{const X=ke,te=Ie,J=os,b=Rs,H=It,ne=Ce,ee=zs,xe=xa,be=Pt,ae=Ft,he=Mt,Te=We,pe=_e,Re=xt("DynamicScrollerItem"),ge=xt("DynamicScroller"),Se=lt;return s(),a("div",ya,[l(ee,{class:"mb-4 shrink-0"},{start:i(()=>[n("div",ha,[n("button",{class:Y(["px-2 py-1 text-xs transition-colors",e(v)?"text-muted hover:bg-elevated/60":"bg-primary text-white dark:text-white"]),title:"Flat list",onClick:d[0]||(d[0]=x=>e(z)(!1))},[l(X,{name:"i-lucide-list",class:"size-3.5"})],2),n("button",{class:Y(["px-2 py-1 text-xs transition-colors",e(v)?"bg-primary text-white dark:text-white":"text-muted hover:bg-elevated/60"]),title:"Tree view",onClick:d[1]||(d[1]=x=>e(z)(!0))},[l(X,{name:"i-lucide-folder-tree",class:"size-3.5"})],2)]),t.isLive?(s(),a("span",va,[_(o(t.testCases.length)+" completed ",1),l(te,{topic:"run.live"})])):(s(),a("span",ka,[_(o(f.value.length)+o(f.value.length!==t.testCases.length?` / ${t.testCases.length}`:"")+" cases ",1),l(te,{topic:"run.test-cases"})]))]),default:i(()=>[l(J,{modelValue:m.value,"onUpdate:modelValue":d[2]||(d[2]=x=>m.value=x),placeholder:"Search test cases...",icon:"i-lucide-search",size:"sm",class:"min-w-48 max-sm:flex-1"},null,8,["modelValue"]),n("div",ba,[(s(),a(O,null,oe(B,x=>n("button",{key:x.value,class:Y(["inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap",R.value.includes(x.value)?x.color==="green"?"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400":x.color==="red"?"bg-rose-100 text-rose-700 dark:bg-rose-900/30 dark:text-rose-400":x.color==="orange"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-zinc-200 text-zinc-700 dark:bg-zinc-700 dark:text-zinc-300":"bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 hover:bg-zinc-200 dark:hover:bg-zinc-700"]),onClick:$e=>P(x.value)},[n("span",{class:Y(["size-2 rounded-full shrink-0",x.color==="green"?"bg-emerald-500":x.color==="red"?"bg-rose-500":x.color==="orange"?"bg-orange-500":"bg-zinc-400"])},null,2),_(" "+o(x.label),1)],10,wa)),64))]),l(b,{modelValue:u.value,"onUpdate:modelValue":d[3]||(d[3]=x=>u.value=x),items:F.value,size:"sm",class:"w-36"},null,8,["modelValue","items"]),t.isLive?g("",!0):(s(),w(H,{key:0,modelValue:h.value,"onUpdate:modelValue":d[4]||(d[4]=x=>h.value=x),label:"New regressions",size:"sm"},null,8,["modelValue"])),t.isLive?g("",!0):(s(),w(H,{key:1,modelValue:N.value,"onUpdate:modelValue":d[5]||(d[5]=x=>N.value=x),label:"New flaky",size:"sm"},null,8,["modelValue"])),e(v)?g("",!0):(s(),a("div",_a,[l(b,{modelValue:k.value,"onUpdate:modelValue":d[6]||(d[6]=x=>k.value=x),items:L.value,size:"sm",class:"w-32","aria-label":"Sort cases by"},null,8,["modelValue","items"]),l(ne,{size:"sm",variant:"outline",color:"neutral",disabled:U.value===null,icon:p.value==="asc"?"i-lucide-arrow-up-narrow-wide":"i-lucide-arrow-down-wide-narrow",title:p.value==="asc"?"Sorted ascending":"Sorted descending","aria-label":p.value==="asc"?"Sorted ascending":"Sorted descending",onClick:d[7]||(d[7]=x=>p.value=p.value==="asc"?"desc":"asc")},null,8,["disabled","icon","title","aria-label"])]))]),_:1}),e(v)&&t.testCases.length>0?(s(),w(xe,{key:0,"test-cases":f.value,suites:t.suites,"has-filter":se.value,"highlighted-case-id":E.value,"project-key":t.projectKey,"project-name":t.projectName,class:"flex-1 min-h-0"},null,8,["test-cases","suites","has-filter","highlighted-case-id","project-key","project-name"])):e(v)?g("",!0):(s(),a(O,{key:1},[f.value.length>0?(s(),a("div",$a,[n("div",{class:"flex flex-col h-full md:min-w-(--grid-min-width)",role:"table","aria-label":"Test cases","aria-rowcount":f.value.length+1,style:we({"--grid-min-width":Z.value})},[n("div",{class:"hidden md:grid shrink-0 bg-elevated/50 border-b border-default",role:"row",style:we({gridTemplateColumns:G.value})},[(s(!0),a(O,null,oe(C.value,x=>(s(),a(O,{key:x.key},[x.sortable?(s(),a("button",{key:0,type:"button",role:"columnheader","aria-sort":U.value===x.key?p.value==="asc"?"ascending":"descending":"none","aria-label":x.icon?x.label:void 0,title:x.icon?x.label:void 0,class:Y(["flex items-center gap-1 min-w-0 px-3 py-2 text-sm font-semibold select-none cursor-pointer hover:text-highlighted transition-colors",x.align==="right"?"justify-end":""]),onClick:$e=>S(x.key)},[x.icon?(s(),w(X,{key:0,name:x.icon,class:"shrink-0 size-4"},null,8,["name"])):(s(),a("span",Ra,o(x.label),1)),l(X,{name:$(x.key),class:Y(["shrink-0 size-3.5",U.value===x.key?"":"opacity-40"])},null,8,["name","class"])],10,Ta)):(s(),a("div",{key:1,role:"columnheader",class:Y(["px-3 py-2 text-sm font-semibold",x.align==="right"?"text-right":""])},o(x.label),3))],64))),128))],4),l(Se,null,{fallback:i(()=>[n("div",Wa,[l(X,{name:"i-lucide-loader-circle",class:"size-4 mr-2 animate-spin"}),d[8]||(d[8]=_(" Loading test cases… ",-1))])]),default:i(()=>[l(ge,{ref_key:"scrollerRef",ref:Q,items:f.value,"min-item-size":44,"key-field":"id",role:"rowgroup",class:"flex-1 min-h-0",onScrollPassive:ve},{default:i(({item:x,index:$e,active:Be})=>[l(Re,{item:x,active:Be,"size-dependencies":[x.title,x.location,x.isNewRegression,x.isNewFlaky,x.testAnnotations,x.tags],"data-index":$e},{default:i(()=>[n("div",{class:Y(["md:hidden border-b border-default px-3 py-2.5 space-y-1.5 text-sm transition-colors",E.value===x.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),role:"row"},[n("div",za,[l(X,{name:("getStatusIcon"in r?r.getStatusIcon:e(st))(x.status),class:Y(["size-4 shrink-0 mt-0.5",[("getStatusTextClass"in r?r.getStatusTextClass:e(tt))(x.status),("isStatusInFlight"in r?r.isStatusInFlight:e(zt))(x.status)?"animate-spin":""]]),role:"img","aria-label":`Status: ${("formatStatusLabel"in r?r.formatStatusLabel:e(De))(x.status)}`,title:("formatStatusLabel"in r?r.formatStatusLabel:e(De))(x.status)},null,8,["name","class","aria-label","title"]),n("a",{href:`/test-run-cases/${x.id}`,class:"text-highlighted hover:text-primary hover:underline font-medium flex-1 min-w-0",onClick:Ue(Fe=>("navigateTo"in r?r.navigateTo:e(Xe))(`/test-run-cases/${x.id}`),["prevent"])},o(x.title),9,Sa),l(be,{browser:x.browser,size:"sm",class:"mt-0.5"},null,8,["browser"])]),x.location?(s(),w(ae,{key:0,location:x.location,"project-key":t.projectKey,"project-name":t.projectName,class:"block pl-6 text-xs text-gray-400 dark:text-gray-500"},null,8,["location","project-key","project-name"])):g("",!0),l(he,{"is-new-regression":!!x.isNewRegression,"is-new-flaky":!!x.isNewFlaky,annotations:x.testAnnotations,tags:x.tags,meta:x.testMeta,"max-tags":3,class:"pl-6"},null,8,["is-new-regression","is-new-flaky","annotations","tags","meta"]),n("div",Ia,[x.status==="running"?(s(),a("span",Fa,"In progress...")):x.duration?(s(),w(Te,{key:1,ms:x.duration},null,8,["ms"])):g("",!0),x.workerIndex!=null?(s(),w(pe,{key:2,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:`Worker ${x.workerIndex}`},{default:i(()=>[_(" w"+o(x.workerIndex),1)]),_:2},1032,["title"])):g("",!0),(x.retries??0)>0?(s(),w(pe,{key:3,color:"warning",variant:"soft",size:"xs"},{default:i(()=>[_(o(x.retries)+"x ",1)]),_:2},1024)):g("",!0),x.wastedTimeMs?(s(),a("span",Pa,[l(X,{name:"i-lucide-hourglass",class:"size-3 shrink-0"}),l(Te,{ms:x.wastedTimeMs,"unit-class":"opacity-60","no-title":""},null,8,["ms"])])):g("",!0)])],2),n("div",{class:Y(["hidden md:grid items-center border-b border-default text-sm transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-900/50",E.value===x.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),role:"row",style:we({gridTemplateColumns:G.value})},[n("div",ja,[l(be,{browser:x.browser},null,8,["browser"])]),n("div",Da,[n("div",Na,[n("a",{href:`/test-run-cases/${x.id}`,class:"text-highlighted hover:text-primary hover:underline font-medium truncate",title:x.title,onClick:Ue(Fe=>("navigateTo"in r?r.navigateTo:e(Xe))(`/test-run-cases/${x.id}`),["prevent"])},o(x.title),9,Ba),l(he,{"is-new-regression":!!x.isNewRegression,"is-new-flaky":!!x.isNewFlaky,annotations:x.testAnnotations,tags:x.tags,meta:x.testMeta,"max-tags":3,class:"shrink-0"},null,8,["is-new-regression","is-new-flaky","annotations","tags","meta"])]),x.location?(s(),w(ae,{key:0,location:x.location,"project-key":t.projectKey,"project-name":t.projectName,class:"text-xs text-zinc-400 dark:text-zinc-500"},null,8,["location","project-key","project-name"])):g("",!0)]),n("div",Ma,[l(pe,{color:("getStatusColor"in r?r.getStatusColor:e(nt))(x.status==="timedOut"||x.status==="timedout"?"failed":x.status),variant:"subtle",class:"capitalize"},{default:i(()=>[_(o(("formatStatusLabel"in r?r.formatStatusLabel:e(De))(x.status)),1)]),_:2},1032,["color"])]),n("div",Aa,[x.status==="running"?(s(),a("span",Ua,"In progress...")):(s(),w(Te,{key:1,ms:x.duration,fallback:""},null,8,["ms"]))]),n("div",La,[x.workerIndex!=null?(s(),w(pe,{key:0,color:"neutral",variant:"soft",class:"font-mono text-xs"},{default:i(()=>[_(o(x.workerIndex),1)]),_:2},1024)):g("",!0)]),n("div",Ea,o(x.retries&&x.retries>0?x.retries:""),1),M.value?(s(),a("div",Oa,[x.wastedTimeMs?(s(),w(Te,{key:0,ms:x.wastedTimeMs,class:"text-amber-600 dark:text-amber-400","unit-class":"opacity-60"},null,8,["ms"])):(s(),a("span",Ka,"—"))])):g("",!0)],6)]),_:2},1032,["item","active","size-dependencies","data-index"])]),_:1},8,["items"])]),_:1})],12,Ca)])):t.testCases.length===0?(s(),a("div",Ha,[l(X,{name:"i-lucide-beaker",class:"size-8 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"}),d[9]||(d[9]=n("p",null,"No test cases recorded for this run.",-1))])):(s(),a("div",Va,[l(X,{name:"i-lucide-search-x",class:"size-8 mx-auto mb-2 text-zinc-300 dark:text-zinc-600"}),d[10]||(d[10]=n("p",null,"No test cases match your filters.",-1))]))],64))])}}}),Xa=Object.assign(Ga,{__name:"TestCasesList"}),qa={key:2,class:"p-4"},Ya={key:3,class:"p-4"},Ja={key:4,class:"p-4"},Za={key:5,class:"space-y-6 p-4"},Qa={class:"flex items-center gap-1.5 text-sm text-muted"},eo={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},to={class:"space-y-1"},so={class:"text-xl font-semibold"},no={key:0},ao={key:1},oo={class:"space-y-1"},lo={key:1,class:"text-xl font-semibold text-muted"},io={class:"space-y-1"},ro={class:"space-y-0.5 text-sm"},uo={key:0,class:"text-red-500"},co={key:1,class:"text-green-600"},mo={key:2,class:"text-purple-500"},fo={key:3,class:"text-muted"},po={class:"space-y-1"},go={class:"font-medium text-primary hover:underline truncate"},xo={class:"text-gray-400 text-xs ml-auto shrink-0"},yo={class:"space-y-1"},ho={class:"font-medium text-primary hover:underline truncate"},vo={class:"space-y-1"},ko={class:"font-medium text-primary hover:underline truncate"},bo={class:"space-y-1"},wo={class:"font-medium text-primary hover:underline truncate"},_o={class:"text-gray-400 text-xs ml-auto shrink-0"},$o={class:"space-y-1"},Co={class:"font-medium text-primary hover:underline truncate"},To={class:"grid grid-cols-2 gap-4"},Ro={key:0},zo={class:"space-y-1"},So={class:"text-red-500 font-mono shrink-0"},Io={class:"truncate text-primary hover:underline"},Fo={key:1},Po={class:"space-y-1"},jo={class:"text-green-500 font-mono shrink-0"},Do={class:"truncate text-primary hover:underline"},No={class:"space-y-1"},Bo={class:"flex-1 truncate text-primary hover:underline"},Mo={class:"text-gray-500 font-mono text-xs shrink-0"},Ao={class:"w-24 h-2 rounded-full bg-gray-100 shrink-0"},Uo={key:0,class:"flex items-center gap-1.5 text-xs text-amber-600 mb-3"},Lo={class:"flex items-end gap-2 h-20"},Eo={class:"text-xs text-gray-500"},Oo={class:"text-xs text-gray-400"},Ko={class:"space-y-1"},Wo={class:"truncate"},Ho=me({__name:"RunInsights",props:{testRunId:{},runStatus:{},refreshKey:{}},setup(t){const y=t,v=I(()=>{if(!m.value)return"";const P=m.value.passRateDelta;return P>0?"text-green-600":P<0?"text-red-600":"text-muted"}),z=I(()=>{if(!m.value)return"";const P=m.value.passRateDelta;return P>0?"i-lucide-trending-up":P<0?"i-lucide-trending-down":"i-lucide-minus"}),T=I(()=>m.value?.avgDurationDelta==null?"":m.value.avgDurationDelta>0?"text-red-600":"text-green-600"),m=W(null),R=W(!1),u=W(null),h=I(()=>y.runStatus==="running"||y.runStatus==="initialising"||y.runStatus==="finalizing");async function N(){if(!y.testRunId||h.value){m.value=null;return}R.value=!0,u.value=null;try{m.value=await $fetch(`/api/test-runs/${y.testRunId}/insights`)}catch(P){console.error("[RunInsights] failed to load",P),u.value=P?.data?.message||P?.message||"Failed to load insights"}finally{R.value=!1}}de(()=>y.testRunId,N,{immediate:!0}),de(()=>y.refreshKey,(P,F)=>{P!==F&&P!==void 0&&N()});function B(P){return P==null?"—":P<1e3?`${P}ms`:`${(P/1e3).toFixed(1)}s`}return(P,F)=>{const j=Ce,K=Fs,U=jt,p=Dt,S=ke,$=Ie,c=Ps,f=_e,M=Oe;return e(u)?(s(),w(K,{key:0,text:e(u),padded:""},{action:i(()=>[l(j,{size:"sm",onClick:N},{default:i(()=>[...F[0]||(F[0]=[_("Retry",-1)])]),_:1})]),_:1},8,["text"])):e(R)?(s(),w(U,{key:1,padded:""})):e(h)?(s(),a("div",qa,[l(p,{icon:"i-lucide-loader-circle",text:"Run in progress"},{default:i(()=>[...F[1]||(F[1]=[n("p",{class:"text-sm text-muted max-w-sm text-center"}," Insights are computed once the run finishes. Switch back here when the run completes. ",-1)])]),_:1})])):e(m)?e(m).hasBaseline?(s(),a("div",Za,[n("div",Qa,[l(S,{name:"i-lucide-sparkles",class:"size-4 shrink-0 text-primary/70"}),F[3]||(F[3]=n("span",null,"Automatic highlights from this run",-1)),l($,{topic:"run.insights"})]),l(c,{icon:"i-lucide-bar-chart-3","icon-class":"text-blue-500",title:"Run summary"},{default:i(()=>[n("div",eo,[n("div",to,[F[4]||(F[4]=n("p",{class:"text-xs text-muted"},"Pass rate",-1)),n("p",so,o(e(m).passRate)+"%",1),n("div",{class:Y(["flex items-center gap-1 text-xs",e(v)])},[l(S,{name:e(z),class:"size-3.5"},null,8,["name"]),e(m).passRateDelta!==0?(s(),a("span",no,o(e(m).passRateDelta>0?"+":"")+o(e(m).passRateDelta)+"pp vs baseline",1)):(s(),a("span",ao,"Same as baseline"))],2)]),n("div",oo,[F[5]||(F[5]=n("p",{class:"text-xs text-muted"},"Avg duration",-1)),e(m).avgDurationDelta!==null?(s(),a("p",{key:0,class:Y(["text-xl font-semibold",e(T)])},o(e(m).avgDurationDelta>0?"+":"")+o(e(m).avgDurationDelta)+"% ",3)):(s(),a("p",lo,"—")),F[6]||(F[6]=n("p",{class:"text-xs text-muted"},"vs baseline (passing tests)",-1))]),n("div",io,[F[7]||(F[7]=n("p",{class:"text-xs text-muted"},"Changes",-1)),n("div",ro,[e(m).newRegressions.length>0?(s(),a("p",uo," +"+o(e(m).newRegressions.length)+" regressed ",1)):g("",!0),e(m).recovered.length>0?(s(),a("p",co,"+"+o(e(m).recovered.length)+" fixed",1)):g("",!0),e(m).newFlaky.length>0?(s(),a("p",mo,"+"+o(e(m).newFlaky.length)+" flaky",1)):g("",!0),!e(m).newRegressions.length&&!e(m).recovered.length&&!e(m).newFlaky.length?(s(),a("p",fo," No status changes ")):g("",!0)])])])]),_:1}),e(m).newRegressions.length>0?(s(),w(c,{key:0,icon:"i-lucide-alert-circle","icon-class":"text-red-500",title:"New regressions",count:e(m).newRegressions.length},{default:i(()=>[n("div",po,[(s(!0),a(O,null,oe(e(m).newRegressions,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}`,class:"flex items-center gap-2 text-sm hover:bg-red-50 dark:hover:bg-red-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[l(f,{color:"error",variant:"solid",size:"xs"},{default:i(()=>[...F[8]||(F[8]=[_("NEW",-1)])]),_:1}),n("span",go,o(C.title),1),n("span",xo,o(B(C.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):g("",!0),e(m).recurrences.length>0?(s(),w(c,{key:1,icon:"i-lucide-refresh-cw","icon-class":"text-amber-500",title:"Recurring failures",count:e(m).recurrences.length},{default:i(()=>[n("div",yo,[(s(!0),a(O,null,oe(e(m).recurrences,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}`,class:"flex items-center gap-2 text-sm hover:bg-amber-50 dark:hover:bg-amber-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[l(f,{color:"warning",variant:"solid",size:"xs"},{default:i(()=>[...F[9]||(F[9]=[_("RECURRING",-1)])]),_:1}),n("span",ho,o(C.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):g("",!0),e(m).recovered.length>0?(s(),w(c,{key:2,icon:"i-lucide-check-circle","icon-class":"text-green-500",title:"Fixed tests",count:e(m).recovered.length},{default:i(()=>[n("div",vo,[(s(!0),a(O,null,oe(e(m).recovered,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}`,class:"flex items-center gap-2 text-sm hover:bg-green-50 dark:hover:bg-green-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[l(f,{color:"success",variant:"solid",size:"xs"},{default:i(()=>[...F[10]||(F[10]=[_("FIXED",-1)])]),_:1}),n("span",ko,o(C.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):g("",!0),e(m).newFlaky.length>0?(s(),w(c,{key:3,icon:"i-lucide-flask","icon-class":"text-purple-500",title:"New flaky tests",count:e(m).newFlaky.length},{default:i(()=>[n("div",bo,[(s(!0),a(O,null,oe(e(m).newFlaky,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}?tab=history`,class:"flex items-center gap-2 text-sm hover:bg-purple-50 dark:hover:bg-purple-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[l(f,{color:"info",variant:"solid",size:"xs"},{default:i(()=>[...F[11]||(F[11]=[_("FLAKY",-1)])]),_:1}),n("span",wo,o(C.title),1),n("span",_o,o(B(C.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):g("",!0),e(m).flakyOnRetry.length>0?(s(),w(c,{key:4,icon:"i-lucide-repeat","icon-class":"text-orange-500",title:"Passed on retry",count:e(m).flakyOnRetry.length,subtitle:"Tests that passed but needed one or more retries"},{default:i(()=>[n("div",$o,[(s(!0),a(O,null,oe(e(m).flakyOnRetry,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}?tab=history`,class:"flex items-center gap-2 text-sm hover:bg-orange-50 dark:hover:bg-orange-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[l(f,{color:"warning",variant:"subtle",size:"xs"},{default:i(()=>[_("×"+o(C.retries),1)]),_:2},1024),n("span",Co,o(C.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):g("",!0),e(m).mostRegressed.length>0||e(m).mostImproved.length>0?(s(),w(c,{key:5,icon:"i-lucide-trending-up","icon-class":"text-blue-500",title:"Performance changes"},{default:i(()=>[n("div",To,[e(m).mostRegressed.length>0?(s(),a("div",Ro,[F[12]||(F[12]=n("p",{class:"text-xs font-medium text-red-500 mb-2"},"Most regressed",-1)),n("div",zo,[(s(!0),a(O,null,oe(e(m).mostRegressed,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}?tab=performance`,class:"flex items-center gap-2 text-sm hover:bg-red-50 dark:hover:bg-red-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[n("span",So,"+"+o(C.pctChange)+"%",1),n("span",Io,o(C.title),1)]),_:2},1032,["to"]))),128))])])):g("",!0),e(m).mostImproved.length>0?(s(),a("div",Fo,[F[13]||(F[13]=n("p",{class:"text-xs font-medium text-green-500 mb-2"},"Most improved",-1)),n("div",Po,[(s(!0),a(O,null,oe(e(m).mostImproved,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}?tab=performance`,class:"flex items-center gap-2 text-sm hover:bg-green-50 dark:hover:bg-green-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[n("span",jo,o(C.pctChange)+"%",1),n("span",Do,o(C.title),1)]),_:2},1032,["to"]))),128))])])):g("",!0)])]),_:1})):g("",!0),e(m).slowestTests.length>0?(s(),w(c,{key:6,icon:"i-lucide-clock","icon-class":"text-amber-500",title:"Slowest tests"},{default:i(()=>[n("div",No,[(s(!0),a(O,null,oe(e(m).slowestTests,C=>(s(),w(M,{key:C.testRunsCaseId,to:`/test-run-cases/${C.testRunsCaseId}?tab=performance`,class:"flex items-center gap-2 text-sm hover:bg-amber-50 dark:hover:bg-amber-900/10 rounded px-1 -mx-1 transition-colors"},{default:i(()=>[n("div",Bo,o(C.title),1),n("div",Mo,o(B(C.duration)),1),n("div",Ao,[n("div",{class:"h-full rounded-full bg-amber-400",style:we({width:Math.min(100,C.duration/(e(m).slowestTests[0]?.duration||1)*100)+"%"})},null,4)])]),_:2},1032,["to"]))),128))])]),_:1})):g("",!0),e(m).workerImbalance.length>1?(s(),w(c,{key:7,icon:"i-lucide-users","icon-class":"text-gray-500",title:"Worker distribution"},{default:i(()=>[e(m).workerImbalanceWarning?(s(),a("div",Uo,[l(S,{name:"i-lucide-alert-triangle",class:"size-3.5 shrink-0"}),n("span",null,o(e(m).workerImbalanceWarning),1)])):g("",!0),n("div",Lo,[(s(!0),a(O,null,oe(e(m).workerImbalance,C=>(s(),a("div",{key:C.workerIndex,class:"flex-1 flex flex-col items-center gap-1"},[n("span",Eo,o(C.count),1),n("div",{class:"w-full bg-blue-400 rounded-t",style:we({height:Math.max(4,C.count/Math.max(...e(m).workerImbalance.map(L=>L.count))*60)+"px"})},null,4),n("span",Oo,"W"+o(C.workerIndex),1)]))),128))])]),_:1})):g("",!0),e(m).clusterNew.length>0?(s(),w(c,{key:8,icon:"i-lucide-layers","icon-class":"text-purple-500",title:"New failure clusters",count:e(m).clusterNew.length},{default:i(()=>[n("div",Ko,[(s(!0),a(O,null,oe(e(m).clusterNew,C=>(s(),w(M,{key:C.clusterId,to:`/failure-clusters/${C.clusterId}`,class:"flex items-center gap-2 text-sm text-primary hover:underline"},{default:i(()=>[n("span",Wo,o(C.signature),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):g("",!0)])):(s(),a("div",Ja,[l(p,{icon:"i-lucide-git-compare-arrows",text:"No baseline run found"},{default:i(()=>[...F[2]||(F[2]=[n("p",{class:"text-sm text-muted max-w-sm text-center"}," Insights compare this run against the most recent passing run in the same project. No previous passing run exists yet — once you have at least two completed runs, comparisons will appear here automatically. ",-1)])]),_:1})])):(s(),a("div",Ya,[l(p,{text:"No insights yet"})]))}}}),Vo=Object.assign(Ho,{__name:"RunInsights"}),Go=me({__name:"ClusterDiagnosis",props:{clusterId:{}},setup(t){return(y,v)=>{const z=js;return s(),w(z,{"cluster-id":t.clusterId},null,8,["cluster-id"])}}}),Xo=Object.assign(Go,{__name:"ClusterDiagnosis"}),qo={class:"pt-4 space-y-3"},Yo={key:0,class:"flex items-center justify-center py-8 text-gray-500 gap-2"},Jo={class:"flex items-center justify-between gap-3"},Zo={class:"text-sm text-gray-500 dark:text-gray-400 inline-flex items-center gap-1"},Qo={class:"min-w-0 space-y-0.5"},el=["title"],tl={key:0,class:"text-xs text-gray-500 truncate block"},sl={class:"font-mono"},nl={key:1,class:"text-gray-400 text-xs"},al={key:1,class:"text-gray-400 text-xs"},ol={class:"text-sm tabular-nums"},ll={key:0,class:"flex flex-wrap gap-1"},il={key:1,class:"text-gray-400 text-xs"},rl={key:0,class:"flex items-center gap-1 text-xs text-gray-500"},ul={key:2,class:"text-gray-400 text-xs"},cl={key:0,class:"text-xs font-medium text-warning-500"},dl={key:1,class:"text-sm text-gray-500 whitespace-nowrap"},ml={key:0,class:"ml-1 text-xs text-gray-400"},fl={class:"flex justify-end gap-2"},pl={key:2,class:"flex flex-col items-center justify-center py-8 text-gray-500 gap-2"},gl=me({__name:"FailureGroups",props:{refreshKey:{}},emits:["selectCluster"],async setup(t,{emit:y}){let v,z;const T=y,m=t,u=Ke().params.id,{data:h,pending:N,refresh:B}=([v,z]=Le(()=>Ee(`/api/test-runs/${u}/failure-groups`,{lazy:!0,server:!1},"$MjXpKokGLu")),v=await v,z(),v);de(()=>m.refreshKey,(c,f)=>{c!==f&&c!==void 0&&B()});const P=W(null),{copy:F,copied:j}=ut(),K=I(()=>h.value?h.value.flatMap(c=>c.cases.filter(f=>!f.passedOnRetry).map(f=>({filePath:f.filePath,title:f.title,line:null,projectName:null}))):[]),U=I(()=>St(K.value));function p(){const c=U.value;c&&F(c,{toast:"Retry command copied"})}const S=[{accessorKey:"signature",header:ue("Signature")},{accessorKey:"errorType",header:ue("Type")},{accessorKey:"status",header:ue("Status")},{accessorKey:"caseCount",header:ue("Tests")},{accessorKey:"signals",header:"Signals"},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"firstSeenRunId",header:ue("Known since")},{id:"actions",header:"Actions"}],$=I(()=>h.value?.reduce((c,f)=>c+f.caseCount,0)??0);return(c,f)=>{const M=ke,C=Ie,L=Ce,k=_e,G=Oe,Z=ct,se=Nt,Q=rt,le=Xo,E=Bt;return s(),a(O,null,[n("div",qo,[e(N)?(s(),a("div",Yo,[l(M,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),f[2]||(f[2]=n("span",null,"Grouping failures...",-1))])):e(h)&&e(h).length?(s(),a(O,{key:1},[n("div",Jo,[n("p",Zo,[_(o(e($))+" failing "+o(e($)===1?"test":"tests")+" across "+o(e(h).length)+" "+o(e(h).length===1?"group":"groups")+" ",1),l(C,{topic:"cluster.concept"})]),e(K).length>0?(s(),w(L,{key:0,size:"xs",variant:"outline",color:"neutral",icon:e(j)?"i-lucide-check":"i-lucide-play",title:e(j)?"Copied!":("copyPreview"in c?c.copyPreview:e(Rt))(e(U)),onClick:f[0]||(f[0]=D=>p())},{default:i(()=>[...f[3]||(f[3]=[_(" Copy retry command ",-1)])]),_:1},8,["icon","title"])):g("",!0)]),l(Q,{ui:{body:"p-0 sm:p-0"}},{default:i(()=>[l(se,{"min-width":"46rem",bleed:!1},{default:i(()=>[l(Z,{data:e(h),columns:S},{"actions-header":i(()=>[...f[4]||(f[4]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":i(({row:D})=>[n("div",Qo,[n("span",{class:Y(["text-sm block truncate",D.original.title?"":"font-mono"]),title:D.original.signature},o(D.original.title||D.original.signature),11,el),D.original.selector?(s(),a("span",tl,[f[5]||(f[5]=_(" Locator: ",-1)),n("code",sl,o(D.original.selector),1)])):g("",!0)])]),"errorType-cell":i(({row:D})=>[D.original.errorType?(s(),w(k,{key:0,color:("clusterErrorTypeColor"in c?c.clusterErrorTypeColor:e($s))(D.original.errorType),variant:"subtle",size:"sm"},{default:i(()=>[_(o(D.original.errorType),1)]),_:2},1032,["color"])):(s(),a("span",nl,"—"))]),"status-cell":i(({row:D})=>[D.original.status?(s(),w(k,{key:0,color:("clusterStatusColor"in c?c.clusterStatusColor:e(_s))(D.original.status),variant:"subtle",size:"sm"},{default:i(()=>[_(o(D.original.status),1)]),_:2},1032,["color"])):(s(),a("span",al,"—"))]),"caseCount-cell":i(({row:D})=>[n("span",ol,o(D.original.caseCount),1)]),"signals-cell":i(({row:D})=>[D.original.isNew||D.original.flaky||D.original.workerCorrelated||D.original.locatorHealing?(s(),a("div",ll,[D.original.isNew?(s(),w(k,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:i(()=>[...f[6]||(f[6]=[_(" New ",-1)])]),_:1})):g("",!0),D.original.flaky?(s(),w(k,{key:1,color:"warning",variant:"outline",size:"sm"},{default:i(()=>[...f[7]||(f[7]=[_(" Flaky ",-1)])]),_:1})):g("",!0),D.original.workerCorrelated?(s(),w(k,{key:2,color:"info",variant:"outline",size:"sm",title:"All failures ran on the same worker"},{default:i(()=>[...f[8]||(f[8]=[_(" Same worker ",-1)])]),_:1})):g("",!0),D.original.locatorHealing?.healed?(s(),w(k,{key:3,color:"success",variant:"subtle",size:"sm",icon:"i-lucide-circle-check",title:"The recommended locator already passes at this call site in a later run"},{default:i(()=>[...f[9]||(f[9]=[_(" Healed ",-1)])]),_:1})):D.original.locatorHealing?(s(),w(k,{key:4,color:"success",variant:"outline",size:"sm",icon:"i-lucide-bandage",title:`Locator fix available: ${D.original.locatorHealing.recommended} — open the cluster to apply it`},{default:i(()=>[...f[10]||(f[10]=[_(" Locator fix ",-1)])]),_:1},8,["title"])):g("",!0)])):(s(),a("span",il,"—"))]),"diagnosis-cell":i(({row:D})=>[D.original.diagnosis?.status==="running"?(s(),a("div",rl,[l(M,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),f[11]||(f[11]=_(" Running ",-1))])):D.original.diagnosis?.status==="completed"&&D.original.diagnosis.category?(s(),w(k,{key:1,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:i(()=>[l(M,{name:"i-lucide-sparkles",class:"size-3"}),_(" "+o(D.original.diagnosis.category),1)]),_:2},1024)):(s(),a("span",ul,"—"))]),"firstSeenRunId-cell":i(({row:D})=>[D.original.isNew?(s(),a("span",cl,"New in this run")):(s(),a("div",dl,[l(G,{to:`/test-runs/${D.original.firstSeenRunId}`,class:"text-primary hover:underline"},{default:i(()=>[_(" run #"+o(D.original.firstSeenRunId),1)]),_:2},1032,["to"]),D.original.firstSeenAt?(s(),a("span",ml," ("+o(("formatRelativeTime"in c?c.formatRelativeTime:e(it))(D.original.firstSeenAt))+") ",1)):g("",!0)]))]),"actions-cell":i(({row:D})=>[n("div",fl,[l(L,{size:"sm",color:"primary",variant:"soft",onClick:ve=>T("selectCluster",D.original.clusterId)},{default:i(()=>[...f[12]||(f[12]=[_(" Filter ",-1)])]),_:1},8,["onClick"]),l(L,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-sparkles",onClick:ve=>P.value=D.original.clusterId},{default:i(()=>[...f[13]||(f[13]=[_(" Diagnose ",-1)])]),_:1},8,["onClick"]),l(L,{to:`/failure-clusters/${D.original.clusterId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:i(()=>[...f[14]||(f[14]=[_(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data"])]),_:1})]),_:1})],64)):(s(),a("div",pl,[l(M,{name:"i-lucide-party-popper",class:"size-6"}),f[15]||(f[15]=n("span",null,"No failure groups — failed tests without error details are not grouped",-1))]))]),l(E,{open:e(P)!==null,title:"AI Diagnosis",ui:{content:"max-w-2xl"},"onUpdate:open":f[1]||(f[1]=D=>{D||(P.value=null)})},{body:i(()=>[e(P)!==null?(s(),w(le,{key:0,"cluster-id":e(P)},null,8,["cluster-id"])):g("",!0)]),_:1},8,["open"])],64)}}}),xl=Object.assign(gl,{__name:"FailureGroups"}),yl={class:"pt-4"},hl={key:2,class:"space-y-4"},vl={class:"flex flex-wrap items-center gap-2 text-sm"},kl={class:"text-gray-500 inline-flex items-center gap-1"},bl={key:0,class:"text-gray-400"},wl={key:0,class:"flex flex-wrap items-center gap-2"},_l={class:"text-sm text-gray-500"},$l={key:1,class:"flex items-center gap-2"},Cl={class:"text-sm text-gray-500"},Tl={class:"space-y-3"},Rl={class:"flex items-center gap-2 text-sm font-medium"},zl={class:"flex flex-wrap items-center gap-2 text-sm font-mono"},Sl={key:0,class:"text-xs text-gray-400 font-sans"},Il={class:"flex flex-wrap items-center gap-2"},Fl={class:"flex items-center gap-1.5 flex-1 min-w-0"},Pl={class:"flex-1 text-xs bg-gray-100 dark:bg-gray-800 px-3 py-1.5 rounded font-mono truncate select-all"},jl={key:3,class:"text-sm text-gray-500 flex items-center gap-2"},Dl={class:"px-4 py-3 text-sm font-medium flex items-center gap-2 border-b border-default"},Nl={class:"overflow-x-auto"},Bl={class:"w-full min-w-[36rem] text-sm"},Ml={class:"px-4 py-2 text-gray-500"},Al={class:"px-4 py-2 font-mono text-xs"},Ul={key:0,class:"text-green-700 dark:text-green-400"},Ll={key:1,class:"text-gray-400"},El={class:"px-4 py-2 font-mono text-xs"},Ol={key:0,class:"text-red-700 dark:text-red-400"},Kl={key:1,class:"text-gray-400"},Wl=me({__name:"RegressionContext",props:{refreshKey:{}},async setup(t){let y,v;const T=Ke().params.id,m=t,{data:R,pending:u,refresh:h}=([y,v]=Le(()=>Ee(`/api/test-runs/${T}/regression-context`,{lazy:!0,server:!1},"$bK54nhbSza")),y=await y,v(),y);de(()=>m.refreshKey,(F,j)=>{F!==j&&F!==void 0&&h()});const{copy:N,copied:B}=ut();function P(){N(R.value?.commitRange?.gitCommand)}return(F,j)=>{const K=jt,U=Dt,p=ke,S=Ie,$=Oe,c=_e,f=Ce,M=rt;return s(),a("div",yl,[e(u)?(s(),w(K,{key:0,text:"Looking for last passing run…"})):e(R)?.hasGreen?(s(),a("div",hl,[n("div",vl,[l(p,{name:"i-lucide-circle-check",class:"size-4 text-green-500 shrink-0"}),n("span",kl,[j[0]||(j[0]=_("Last passing run: ",-1)),l(S,{topic:"run.regression"})]),l($,{to:`/test-runs/${e(R).lastGreenRunId}`,class:"font-medium text-primary hover:underline"},{default:i(()=>[_(" Run #"+o(e(R).lastGreenRunId),1)]),_:1},8,["to"]),e(R).lastGreenRunAt?(s(),a("span",bl," ("+o(("formatRelativeTime"in F?F.formatRelativeTime:e(it))(e(R).lastGreenRunAt))+") ",1)):g("",!0)]),(e(R).newFailures??0)>0?(s(),a("div",wl,[l(c,{color:"error",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(R).newFailures)+" new "+o(e(R).newFailures===1?"failure":"failures"),1)]),_:1}),n("span",_l,o(e(R).newFailures===1?"test":"tests")+" that "+o((e(R).newFailures===1,"passed"))+" in run #"+o(e(R).lastGreenRunId)+" but "+o(e(R).newFailures===1?"fails":"fail")+" here ",1)])):(s(),a("div",$l,[l(c,{color:"warning",variant:"soft",size:"lg"},{default:i(()=>[...j[1]||(j[1]=[_(" No new regressions ",-1)])]),_:1}),n("span",Cl,"All failing tests were also failing before run #"+o(e(R).lastGreenRunId),1)])),e(R).commitRange?(s(),w(M,{key:2,ui:{body:"p-4 sm:p-4"}},{default:i(()=>[n("div",Tl,[n("div",Rl,[l(p,{name:"i-lucide-git-commit-horizontal",class:"size-4"}),j[2]||(j[2]=_(" Commits introduced since last passing run ",-1))]),n("div",zl,[l(c,{color:"success",variant:"soft",size:"sm"},{default:i(()=>[_(o(e(R).commitRange.fromShort),1)]),_:1}),l(p,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),l(c,{color:"error",variant:"soft",size:"sm"},{default:i(()=>[_(o(e(R).commitRange.toShort),1)]),_:1}),e(R).currentBranch||e(R).lastGreenBranch?(s(),a("span",Sl," on "+o(e(R).currentBranch||e(R).lastGreenBranch),1)):g("",!0)]),n("div",Il,[e(R).commitRange.compareUrl?(s(),w(f,{key:0,to:e(R).commitRange.compareUrl,target:"_blank",external:"",icon:"i-lucide-external-link",size:"sm",variant:"soft",color:"primary"},{default:i(()=>[...j[3]||(j[3]=[_(" View commits ",-1)])]),_:1},8,["to"])):g("",!0),n("div",Fl,[n("code",Pl,o(e(R).commitRange.gitCommand),1),l(f,{icon:e(B)?"i-lucide-check":"i-lucide-clipboard",size:"xs",color:"neutral",variant:"ghost",title:e(B)?"Copied!":"Copy git command",onClick:P},null,8,["icon","title"])])])])]),_:1})):!e(R).currentCommit||!e(R).lastGreenCommit?(s(),a("div",jl,[l(p,{name:"i-lucide-git-branch",class:"size-4 shrink-0"}),j[4]||(j[4]=_(" No commit info available — enable ",-1)),j[5]||(j[5]=n("code",{class:"font-mono text-xs"},"collectScmInfo: true",-1)),j[6]||(j[6]=_(" in the reporter to see commit ranges ",-1))])):g("",!0),e(R).metadataDiff&&e(R).metadataDiff.length>0?(s(),w(M,{key:4,ui:{body:"p-0 sm:p-0"}},{default:i(()=>[n("div",Dl,[l(p,{name:"i-lucide-sliders-horizontal",class:"size-4"}),j[7]||(j[7]=_(" What changed between runs ",-1))]),n("div",Nl,[n("table",Bl,[j[8]||(j[8]=n("thead",null,[n("tr",{class:"text-xs text-gray-500 uppercase tracking-wider border-b border-default"},[n("th",{class:"text-left px-4 py-2 font-medium w-32"},"Field"),n("th",{class:"text-left px-4 py-2 font-medium"},"Last passing"),n("th",{class:"text-left px-4 py-2 font-medium"},"This run")])],-1)),n("tbody",null,[(s(!0),a(O,null,oe(e(R).metadataDiff,C=>(s(),a("tr",{key:C.key,class:"border-b last:border-b-0 border-default"},[n("td",Ml,o(C.label),1),n("td",Al,[C.before?(s(),a("span",Ul,o(C.before),1)):(s(),a("span",Ll,"—"))]),n("td",El,[C.after?(s(),a("span",Ol,o(C.after),1)):(s(),a("span",Kl,"—"))])]))),128))])])])]),_:1})):g("",!0)])):(s(),w(U,{key:1,icon:"i-lucide-history",text:"No previous passing run found for this project"}))])}}}),Hl=Object.assign(Wl,{__name:"RegressionContext"}),Vl={class:"flex items-center justify-between mb-2"},Gl={class:"text-xs text-gray-500 inline-flex items-center gap-1"},Xl={class:"flex items-center gap-1"},ql={class:"p-2 flex flex-col gap-2 min-w-56"},Yl=me({__name:"TimelineHeader",props:{workerCount:{},shardTotal:{},testCount:{},hookCount:{},waitCount:{},spanTypes:{},live:{type:Boolean}},emits:["reset","toggleSpan"],setup(t){return(y,v)=>{const z=Ie,T=Ce,m=It,R=at;return s(),a("div",Vl,[n("span",Gl,[n("span",null,[_(o(t.workerCount)+" worker"+o(t.workerCount>1?"s":"")+" ",1),t.shardTotal&&t.shardTotal>1?(s(),a(O,{key:0},[_(" · "+o(t.shardTotal)+" shard"+o(t.shardTotal>1?"s":""),1)],64)):g("",!0),_(" · "+o(t.testCount)+" tests ",1),t.hookCount>0?(s(),a(O,{key:1},[_(" · "+o(t.hookCount)+" hooks ",1)],64)):g("",!0),t.waitCount>0?(s(),a(O,{key:2},[_(" · "+o(t.waitCount)+" waits ",1)],64)):g("",!0)]),l(z,{topic:"run.timeline"})]),n("div",Xl,[t.spanTypes.length>1?(s(),w(R,{key:0,content:{align:"end"}},{content:i(()=>[n("div",ql,[(s(!0),a(O,null,oe(t.spanTypes,u=>(s(),w(m,{key:u.key,"model-value":u.checked,label:u.label,"onUpdate:modelValue":h=>y.$emit("toggleSpan",u.key,h===!0)},null,8,["model-value","label","onUpdate:modelValue"]))),128))])]),default:i(()=>[l(T,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list-filter","trailing-icon":"i-lucide-chevron-down",title:"Show or hide span types"},{default:i(()=>[...v[1]||(v[1]=[_(" Span types ",-1)])]),_:1})]),_:1})):g("",!0),t.live?g("",!0):(s(),w(T,{key:1,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-rotate-ccw",onClick:v[0]||(v[0]=u=>y.$emit("reset"))},{default:i(()=>[...v[2]||(v[2]=[_(" Reset view ",-1)])]),_:1}))])])}}}),Jl=Object.assign(Yl,{__name:"TimelineHeader"}),qe={barHeight:24,rowGap:8,labelWidth:80,sidePadding:16,axisHeight:28,get rowHeight(){return this.barHeight+this.rowGap}},Zl={passed:"#16a34a",failed:"#dc2626",timedOut:"#ea580c",running:"#2563eb",initialising:"#2563eb",skipped:"#9ca3af",cancelled:"#a1a1aa",interrupted:"#ea580c",flaky:"#ca8a04"},je={fill:"#facc15",stroke:"#ca8a04",swatch:"#f59e0b"};function Je(t){return Zl[t]||"#a1a1aa"}function At(t){return Je(t)+"66"}function Ut(t){return Je(t)}function Ye(t){return t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:`${Math.floor(t/6e4)}m ${Math.floor(t%6e4/1e3)}s`}const Ql=["y","width","height"],ei=["y1","x2","y2"],ti=["x1","y1","x2","y2"],si=["x1","y1","x2","y2"],ni=["x","y"],ai=["y"],oi=me({__name:"TimelineGrid",props:{workerRows:{},shardGroups:{},tickMarks:{},contentWidth:{},shardTotal:{}},setup(t){const{barHeight:y,rowGap:v,axisHeight:z,rowHeight:T}=qe;return(m,R)=>(s(),a("g",null,[(s(!0),a(O,null,oe(t.workerRows,(u,h)=>(s(),a("rect",{key:"bg-"+h,x:0,y:h*e(T)+e(z),width:t.contentWidth,height:e(T),class:Y(h%2===1?"fill-black/[0.03] dark:fill-white/[0.03]":"fill-transparent")},null,10,Ql))),128)),(s(!0),a(O,null,oe(t.shardGroups.slice(1),u=>(s(),a("line",{key:"shard-sep-"+u.rowRange[0],x1:0,y1:u.rowRange[0]*e(T)+e(z)-e(v)/2,x2:t.contentWidth,y2:u.rowRange[0]*e(T)+e(z)-e(v)/2,stroke:"currentColor","stroke-dasharray":"4,3",class:"stroke-gray-400 dark:stroke-gray-500"},null,8,ei))),128)),n("line",{x1:e(qe).labelWidth,y1:e(z),x2:t.contentWidth,y2:e(z),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,ti),(s(!0),a(O,null,oe(t.tickMarks,u=>(s(),a("g",{key:u.ms},[n("line",{x1:u.x,y1:e(z)-4,x2:u.x,y2:e(z),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,si),n("text",{x:u.x,y:e(z)-8,"text-anchor":"middle",class:"fill-gray-400 text-[10px]"},o(u.label),9,ni)]))),128)),(s(!0),a(O,null,oe(t.workerRows,(u,h)=>(s(),a("text",{key:"label-"+h,x:6,y:h*e(T)+e(z)+e(y)/2+4,class:"fill-gray-500 text-[11px] font-medium"},o(u.shardIndex!=null&&t.shardTotal&&t.shardTotal>1?`S${u.shardIndex} W${u.workerIndex}`:`Worker ${u.workerIndex}`),9,ai))),128))]))}}),li=Object.assign(oi,{__name:"TimelineGrid"}),ii=["x","y","width","height","fill","stroke"],ri=["x","y"],ui=["x","y","width","height","fill","stroke"],ci=["x1","y1","x2","y2","stroke"],di=["x1","y1","x2","y2","stroke"],mi=["x","y"],fi=["cx","cy"],pi=["cx","cy"],gi=["x","y","width","height","fill"],xi=["x","y"],yi=me({__name:"TimelineBar",props:{item:{},x:{},y:{},width:{}},emits:["select","hover","move","leave"],setup(t,{emit:y}){const v=t,z=y,{barHeight:T}=qe,m=I(()=>["setup","hook","fixture"].includes(v.item.kind)),R=I(()=>v.item.testCaseId!=null),u=I(()=>R.value?"cursor-pointer":"cursor-default");function h(){v.item.testCaseId!=null&&z("select",v.item.testCaseId)}return(N,B)=>(s(),a("g",{class:"timeline-bar-group",onMouseenter:B[0]||(B[0]=P=>z("hover",t.item,P)),onMousemove:B[1]||(B[1]=P=>z("move",P)),onMouseleave:B[2]||(B[2]=P=>z("leave"))},[m.value?(s(),a(O,{key:0},[n("rect",{x:t.x,y:t.y,width:t.width,height:e(T),rx:3,ry:3,fill:e(At)(t.item.status),stroke:e(Ut)(t.item.status),"stroke-width":"1","stroke-dasharray":"3,2",class:Y(["timeline-bar-shape transition-opacity duration-100 opacity-80",u.value]),onClick:h},null,10,ii),t.width>60?(s(),a("text",{key:0,x:t.x+4,y:t.y+e(T)/2+4,class:"fill-gray-600 dark:fill-gray-300 text-[9px] font-medium pointer-events-none"},o(t.item.title),9,ri)):g("",!0)],64)):t.item.kind==="wait"?(s(),a(O,{key:1},[n("rect",{x:t.x,y:t.y-3,width:t.width,height:e(T)+6,rx:2,ry:2,fill:e(je).fill,"fill-opacity":"0.28",stroke:e(je).stroke,"stroke-width":"1.5",class:Y(["timeline-bar-shape transition-opacity duration-100 opacity-90",u.value]),onClick:h},null,10,ui),t.width>4?(s(),a("line",{key:0,x1:t.x+1,y1:t.y-3,x2:t.x+t.width-1,y2:t.y+e(T)+3,stroke:e(je).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,ci)):g("",!0),t.width>4?(s(),a("line",{key:1,x1:t.x+t.width-1,y1:t.y-3,x2:t.x+1,y2:t.y+e(T)+3,stroke:e(je).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,di)):g("",!0),t.width>50?(s(),a("text",{key:2,x:t.x+4,y:t.y+e(T)/2+4,class:"fill-yellow-800 dark:fill-yellow-200 text-[9px] font-bold pointer-events-none"}," wasted "+o(e(Ye)(t.item.duration)),9,mi)):g("",!0)],64)):t.item.status==="running"?(s(),a(O,{key:2},[n("circle",{cx:t.x+6,cy:t.y+e(T)/2,r:"3",fill:"#2563eb",filter:"url(#glow)",class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:h},null,8,fi),n("circle",{cx:t.x+6,cy:t.y+e(T)/2,r:"5",fill:"none",stroke:"#2563eb","stroke-width":"1.5","stroke-opacity":"0.4",filter:"url(#glow)",class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:h},null,8,pi)],64)):(s(),a(O,{key:3},[n("rect",{x:t.x,y:t.y,width:t.width,height:e(T),rx:3,ry:3,fill:e(Je)(t.item.status),class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:h},null,8,gi),t.width>40?(s(),a("text",{key:0,x:t.x+4,y:t.y+e(T)/2+4,class:"fill-white text-[10px] font-medium pointer-events-none"},o(e(Ye)(t.item.duration)),9,xi)):g("",!0)],64))],32))}}),hi=Object.assign(yi,{__name:"TimelineBar"}),vi={class:"flex items-center gap-2 mb-1"},ki={class:"font-medium text-gray-900 dark:text-white max-w-64 truncate"},bi={class:"flex items-center gap-3 text-gray-500"},wi={class:"capitalize"},_i={key:0,class:"italic truncate max-w-48"},$i=340,Ci=me({__name:"TimelineTooltip",props:{item:{},pos:{}},setup(t){const y=t,v=I(()=>{const T=y.item;return T?T.kind==="test"?{backgroundColor:Je(T.status)}:T.kind==="wait"?{backgroundColor:je.swatch+"66",borderColor:je.swatch}:{backgroundColor:At(T.status),borderColor:Ut(T.status)}:{}}),z=I(()=>{const{x:T,y:m}=y.pos;if(typeof window>"u")return{left:`${T+12}px`,top:`${m-10}px`};const R=T+12+$i>window.innerWidth,u=m+90>window.innerHeight;return{left:R?void 0:`${T+12}px`,right:R?`${window.innerWidth-T+12}px`:void 0,top:u?void 0:`${m-10}px`,bottom:u?`${window.innerHeight-m+10}px`:void 0}});return(T,m)=>(s(),w(is,{to:"body"},[t.item?(s(),a("div",{key:0,class:"fixed z-[9999] pointer-events-none rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 px-3 py-2 text-xs shadow-lg",style:we(z.value)},[n("div",vi,[n("span",{class:Y(["inline-block size-2.5 rounded-full shrink-0",{"border border-dashed":t.item.kind!=="test"}]),style:we(v.value)},null,6),n("span",ki,[t.item.kind!=="test"?(s(),a("span",{key:0,class:Y(["uppercase text-[10px] tracking-wider mr-1",t.item.kind==="wait"?"text-amber-500":"text-gray-500"])},o(t.item.kind),3)):g("",!0),_(" "+o(t.item.title),1)])]),n("div",bi,[n("span",wi,o(t.item.status),1),n("span",null,o(e(Ye)(t.item.duration)),1),n("span",null,"Worker "+o(t.item.workerIndex),1),t.item.parentTitle?(s(),a("span",_i," for "+o(t.item.parentTitle),1)):g("",!0)])],4)):g("",!0)]))}}),Ti=Object.assign(Ci,{__name:"TimelineTooltip"}),Ri=["Wait for timeout*","*waitForTimeout*"];function zi(t){const y=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${y}$`,"i")}const yt=new Map;function Si(t){let y=yt.get(t);return y||(y=zi(t),yt.set(t,y)),y}function Ii(t,y){if(!y||y.length===0)return!1;const v=t.title??"",z=t.location??"";for(const T of y){const m=Si(T);if(m.test(v)||z&&m.test(z))return!0}return!1}function Fi(t){const y=new Map;for(const v of t){const z=v.workerIndex;if(z==null||z<0)continue;const T=v.shardIndex??null,m=`${T??"null"}|${z}`;let R=y.get(m);R||(R={shardIndex:T,workerIndex:z,cases:[]},y.set(m,R)),R.cases.push(v)}return[...y.values()].sort((v,z)=>{const T=v.shardIndex??1/0,m=z.shardIndex??1/0;return T!==m?T-m:v.workerIndex-z.workerIndex})}function Ve(t){if(t==null)return null;if(typeof t=="number")return Number.isFinite(t)?t:null;if(t instanceof Date)return t.getTime();const y=new Date(t).getTime();return Number.isNaN(y)?null:y}function Pi(t,y){return t.category==="wait"?Ii(t,y)?"wait":null:t.category==="hook"||t.category==="fixture"?t.category:null}function ji(t){const y=I(()=>t.wastedPatterns&&t.wastedPatterns.length>0?t.wastedPatterns:Ri),v=I(()=>Fi(t.testCases)),z=I(()=>{const u=v.value,h=y.value;let N=1/0;for(const K of u)for(const U of K.cases){const p=Ve(U.startedAt);p!=null&&p>0&&(N=Math.min(N,p))}const B=Number.isFinite(N),P=K=>Math.max(0,(Ve(K)??N)-N),F=[],j=new Map;if(u.forEach((K,U)=>{const p=[],S=B?K.cases:[...K.cases].sort((c,f)=>(Ve(c.startedAt)??0)-(Ve(f.startedAt)??0));let $=0;for(const c of S){const f=c.duration??1e3,M=B?P(c.startedAt):$;p.push({key:`t${c.id}`,kind:"test",testCaseId:c.id,title:c.title,status:c.status,workerIndex:K.workerIndex,start:M,duration:f,rowIndex:U}),$=M+f,(c.stepEvents??[]).forEach((L,k)=>{const G=Pi(L,h);if(!G)return;const Z=L.duration||0,se=B?P(L.startedAt):$;p.push({key:`s${c.id}:${k}`,kind:G,testCaseId:c.id,title:L.title,status:L.status||"passed",workerIndex:K.workerIndex,start:se,duration:Z,rowIndex:U,parentTitle:c.title}),$=se+Z})}p.sort((c,f)=>c.start-f.start),F.push(...p),j.has(K.workerIndex)||j.set(K.workerIndex,$)}),t.setupSteps&&t.setupSteps.length>0){const K=new Map;u.forEach((U,p)=>{K.has(U.workerIndex)||K.set(U.workerIndex,p)}),t.setupSteps.forEach((U,p)=>{const S=U.workerIndex;if(S==null||S<0)return;const $=K.get(S);if($==null)return;const c=U.duration||0;let f;B?f=P(U.startedAt):(f=j.get(S)??0,j.set(S,f+c)),F.push({key:`setup${S}:${p}`,kind:"setup",testCaseId:null,title:`[Setup] ${U.title}`,status:U.status||"passed",workerIndex:S,start:f,duration:c,rowIndex:$,parentTitle:null})})}return F}),T=I(()=>v.value.map(u=>({shardIndex:u.shardIndex,workerIndex:u.workerIndex}))),m=I(()=>{const u=[];for(let h=0;h<T.value.length;h++){const N=T.value[h],B=u[u.length-1];!B||B.shardIndex!==N.shardIndex?u.push({shardIndex:N.shardIndex,rowRange:[h,h]}):B.rowRange[1]=h}return u}),R=I(()=>{let u=0;for(const h of z.value)u=Math.max(u,h.start+h.duration);return u||6e4});return{timelineData:z,workerRows:T,shardGroups:m,maxTime:R}}const ht=1.12,Di=10,Ni=100,et=[10,20,50,100,200,500,1e3,2e3,5e3,1e4,15e3,3e4,6e4,12e4,3e5,6e5,9e5,18e5,36e5];function Bi(t){const{containerRef:y,maxTime:v,rowCount:z,hasData:T,live:m}=t,{labelWidth:R,sidePadding:u,axisHeight:h,rowHeight:N}=qe,B=W(1),P=W(0),F=W(!1),j=W(0),K=W(0),U=I(()=>.5*B.value),p=I(()=>v.value*U.value+R+u),S=I(()=>z.value*N+h);function $(b){return b.start*U.value+R}function c(b){return Math.max(b.duration*U.value,3)}function f(b){return b.rowIndex*N+h}function M(){const b=y.value?.clientWidth;if(!b||v.value<=0)return 1;const H=(b-R)/v.value;return Math.min(1,H/.5)}function C(){const b=M();b>0&&(B.value=b,P.value=0)}function L(b){if(!y.value)return b;const H=y.value.clientWidth;return p.value<=H?0:Math.max(H-p.value,Math.min(0,b))}function k(b,H){const ne=Math.max(M(),Math.min(Di,b)),ee=ne/B.value;B.value=ne,P.value=L(H-(H-P.value)*ee)}const G=I(()=>{const b=Ni/U.value;let H=et.find(ee=>ee>=b)??et[et.length-1];for(;v.value/H>1e3;)H*=2;const ne=[];for(let ee=0;ee<=v.value;ee+=H)ne.push({ms:ee,x:ee*U.value+R,label:Ye(ee)});return ne});function Z(b){if(m())return;const H=b.deltaY>0?1/ht:ht,ne=y.value?.getBoundingClientRect();k(B.value*H,ne?b.clientX-ne.left:0)}const se=4,Q=new Map;let le=null,E=0,D=1,ve=0;function fe(b,H){le=b,j.value=H,K.value=P.value}function r(b){if(!m()&&!(b.pointerType==="mouse"&&b.button!==0)){if(Q.set(b.pointerId,{x:b.clientX,y:b.clientY}),Q.size===1)fe(b.pointerId,b.clientX);else if(Q.size===2){le=null,F.value=!1;for(const xe of Q.keys())y.value?.setPointerCapture?.(xe);const[H,ne]=[...Q.values()];E=Math.hypot(H.x-ne.x,H.y-ne.y)||1,D=B.value;const ee=y.value?.getBoundingClientRect();ve=(H.x+ne.x)/2-(ee?.left??0)}b.preventDefault()}}function d(b){if(!(m()||!Q.has(b.pointerId))){if(Q.set(b.pointerId,{x:b.clientX,y:b.clientY}),Q.size>=2){const[H,ne]=[...Q.values()],ee=Math.hypot(H.x-ne.x,H.y-ne.y)||1;k(D*(ee/E),ve);return}F.value?P.value=L(K.value+(b.clientX-j.value)):le===b.pointerId&&Math.abs(b.clientX-j.value)>se&&(y.value?.setPointerCapture?.(b.pointerId),F.value=!0,P.value=L(K.value+(b.clientX-j.value)))}}function X(b){if(Q.delete(b.pointerId),le===b.pointerId&&(le=null),y.value?.releasePointerCapture?.(b.pointerId),Q.size===1){const[H]=[...Q.entries()];fe(H[0],H[1].x)}else Q.size===0&&(F.value=!1)}function te(){C()}let J=null;return kt(()=>{Ne(C),y.value&&(J=new ResizeObserver(()=>C()),J.observe(y.value))}),bt(()=>{J?.disconnect()}),de(()=>[m(),T.value,v.value,z.value],([b,H])=>{b&&H&&Ne(C)}),{panX:P,isPanning:F,pxPerMs:U,contentWidth:p,contentHeight:S,getBarX:$,getBarWidth:c,getBarTop:f,tickMarks:G,onWheel:Z,onPointerDown:r,onPointerMove:d,onPointerUp:X,resetView:te}}const Mi={key:0,class:"relative select-none"},Ai=["width","height"],Ui={key:1,class:"text-center py-10 text-gray-500"},Li=me({__name:"WorkersTimeline",props:{testCases:{},setupSteps:{},shardTotal:{},live:{type:Boolean},wastedPatterns:{}},emits:["selectTestCase"],setup(t,{emit:y}){const v=t,z=y,{timelineData:T,workerRows:m,shardGroups:R,maxTime:u}=ji(v),h=W(null),N=I(()=>m.value.length),B=I(()=>T.value.length>0),{panX:P,isPanning:F,contentWidth:j,contentHeight:K,getBarX:U,getBarWidth:p,getBarTop:S,tickMarks:$,onWheel:c,onPointerDown:f,onPointerMove:M,onPointerUp:C,resetView:L}=Bi({containerRef:h,maxTime:u,rowCount:N,hasData:B,live:()=>v.live}),k=I(()=>T.value.filter(J=>J.kind==="test").length),G=I(()=>T.value.filter(J=>J.kind!=="test"&&J.kind!=="wait").length),Z=I(()=>T.value.filter(J=>J.kind==="wait").length),se=["test","setup","hook","fixture","wait"],Q={test:"Tests",setup:"Setup (beforeAll/afterAll)",hook:"Hooks",fixture:"Fixtures",wait:"Wasted waits"},le=W({}),E=I(()=>T.value.filter(J=>!le.value[J.kind])),D=I(()=>{const J=new Set(T.value.map(b=>b.kind));return se.filter(b=>J.has(b)).map(b=>({key:b,label:Q[b],checked:!le.value[b]}))});function ve(J,b){le.value={...le.value,[J]:!b}}const fe=W(null),r=W({x:0,y:0});de(E,J=>{fe.value&&(fe.value=J.find(b=>b.key===fe.value.key)??null)});function d(J,b){fe.value=J,r.value={x:b.clientX,y:b.clientY}}function X(J){r.value={x:J.clientX,y:J.clientY}}function te(){fe.value=null}return(J,b)=>{const H=Jl,ne=li,ee=hi,xe=Ti,be=ke;return e(T).length>0?(s(),a("div",Mi,[l(H,{"worker-count":e(m).length,"shard-total":t.shardTotal,"test-count":k.value,"hook-count":G.value,"wait-count":Z.value,"span-types":D.value,live:t.live,onToggleSpan:ve,onReset:e(L)},null,8,["worker-count","shard-total","test-count","hook-count","wait-count","span-types","live","onReset"]),n("div",{ref_key:"containerRef",ref:h,class:Y(["relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 touch-pan-y",{"cursor-grab":!e(F),"cursor-grabbing":e(F)}]),style:we({height:e(K)+"px"}),onWheel:b[1]||(b[1]=Ue((...ae)=>e(c)&&e(c)(...ae),["prevent"])),onPointerdown:b[2]||(b[2]=(...ae)=>e(f)&&e(f)(...ae)),onPointermove:b[3]||(b[3]=(...ae)=>e(M)&&e(M)(...ae)),onPointerup:b[4]||(b[4]=(...ae)=>e(C)&&e(C)(...ae)),onPointercancel:b[5]||(b[5]=(...ae)=>e(C)&&e(C)(...ae)),onPointerleave:b[6]||(b[6]=(...ae)=>e(C)&&e(C)(...ae))},[(s(),a("svg",{class:"overflow-visible",style:we({transform:`translateX(${e(P)}px)`}),width:e(j),height:e(K)},[b[7]||(b[7]=n("defs",null,[n("filter",{id:"glow"},[n("feGaussianBlur",{stdDeviation:"2.5",result:"blur"}),n("feMerge",null,[n("feMergeNode",{in:"blur"}),n("feMergeNode",{in:"SourceGraphic"})])])],-1)),l(ne,{"worker-rows":e(m),"shard-groups":e(R),"tick-marks":e($),"content-width":e(j),"shard-total":t.shardTotal},null,8,["worker-rows","shard-groups","tick-marks","content-width","shard-total"]),(s(!0),a(O,null,oe(E.value,ae=>(s(),w(ee,{key:ae.key,item:ae,x:e(U)(ae),y:e(S)(ae),width:e(p)(ae),onSelect:b[0]||(b[0]=he=>z("selectTestCase",he)),onHover:d,onMove:X,onLeave:te},null,8,["item","x","y","width"]))),128))],12,Ai))],38),l(xe,{item:fe.value,pos:r.value},null,8,["item","pos"])])):(s(),a("div",Ui,[l(be,{name:"i-lucide-rows-3",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),b[8]||(b[8]=n("p",null,"No worker data available for this run.",-1))]))}}}),Ei=Object.assign(Li,{__name:"WorkersTimeline"}),Oi={key:0,class:"space-y-4"},Ki={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Wi={class:"flex items-center gap-2 py-1.5"},Hi={class:"font-medium"},Vi={key:0,class:"flex"},Gi={key:1,class:"flex items-center justify-center py-6 text-gray-500 gap-2"},Xi={class:"flex flex-wrap gap-2 mt-1"},qi={class:"flex flex-wrap gap-4 text-sm"},Yi={key:3,class:"text-sm text-gray-500"},Ji={class:"flex flex-wrap gap-4 text-sm"},Zi={key:0,class:"text-gray-400"},Qi={key:0,class:"text-gray-400"},er={key:1,class:"text-gray-400"},tr={key:1,class:"text-gray-400"},sr={key:0,class:"text-gray-400"},nr={key:0,class:"text-gray-400"},ar={key:4,class:"text-center py-8 text-gray-500"},or={key:5,class:"text-center py-8 text-gray-500"},lr={key:1,class:"text-center py-10 text-gray-500"},ir=me({__name:"RunCompare",props:{testRun:{}},setup(t){const y=t,z=Ke().params.id,T=W(null),m=W([]),R=I(()=>y.testRun?.status==="running"||y.testRun?.status==="finalizing");de(()=>y.testRun?.projectId,async $=>{if(!(!$||R.value)){try{T.value=await $fetch(`/api/projects/${$}`)}catch(c){console.error("Failed to fetch project for RunCompare",c)}try{const c=await $fetch(`/api/projects/${$}/markers`);m.value=c.markers??[]}catch{}}},{immediate:!0});const u=I(()=>{if(!P.value||!y.testRun)return[];const $=new Date(P.value.startTime).getTime(),c=new Date(y.testRun.startTime).getTime(),f=Math.min($,c),M=Math.max($,c),C=new Set([P.value.environment,y.testRun.environment].filter(L=>L!=null));return m.value.filter(L=>{const k=new Date(L.occurredAt).getTime();return k<=f||k>=M?!1:L.environment==null||C.has(L.environment)})}),h=I(()=>T.value?.testRuns?T.value.testRuns.filter($=>$.id!==Number(z)).slice(0,50).map($=>({label:`Run #${$.id} — ${Tt($.startTime,{dateOnly:!0})} (${$.status})`,value:$.id})):[]),N=I(()=>{if(!T.value?.testRuns)return null;const $=[...T.value.testRuns].sort((f,M)=>new Date(M.startTime).getTime()-new Date(f.startTime).getTime()),c=$.findIndex(f=>f.id===Number(z));return c>=0&&c<$.length-1?$[c+1].id:null}),B=W(void 0),P=W(null),F=W(!1);de(B,async $=>{if(!$?.value){P.value=null;return}F.value=!0;try{P.value=await $fetch(`/api/test-runs/${$.value}`)}catch{}finally{F.value=!1}});function j(){if(N.value){const $=h.value.find(c=>c.value===N.value);$&&(B.value=$)}}const K=I(()=>y.testRun??null),{comparisonData:U,comparisonSummary:p}=Ms(P,K),S=[{accessorKey:"title",header:ue("Test case")},{accessorKey:"statusA",header:ue("Status A")},{accessorKey:"statusB",header:ue("Status B")},{accessorKey:"durationA",header:ue("Duration A")},{accessorKey:"durationB",header:ue("Duration B")},{accessorKey:"delta",header:ue("Delta")},{accessorKey:"percentChange",header:ue("Change")}];return($,c)=>{const f=Ds,M=Ns,C=Ce,L=ke,k=_t,G=Bs,Z=_e,se=We,Q=ct,le=Nt;return s(),a("div",null,[t.testRun&&!R.value?(s(),a("div",Oi,[n("div",Ki,[n("div",null,[c[1]||(c[1]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),l(f,{modelValue:B.value,"onUpdate:modelValue":c[0]||(c[0]=E=>B.value=E),items:h.value,placeholder:"Select a baseline run..."},null,8,["modelValue","items"])]),n("div",null,[c[2]||(c[2]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (this run)",-1)),n("div",Wi,[l(M,{status:t.testRun.status},null,8,["status"]),n("span",Hi,"#"+o(t.testRun.id),1)])])]),N.value?(s(),a("div",Vi,[l(C,{icon:"i-lucide-arrow-left-right",size:"sm",variant:"outline",label:"Compare with previous run",onClick:j})])):g("",!0),F.value?(s(),a("div",Gi,[l(L,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),c[3]||(c[3]=n("span",null,"Loading baseline data...",-1))])):u.value.length>0?(s(),w(G,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-milestone",title:`${u.value.length} timeline marker${u.value.length>1?"s":""} between these runs`},{description:i(()=>[n("div",Xi,[(s(!0),a(O,null,oe(u.value,E=>(s(),w(k,{key:E.id,marker:E,size:"sm"},null,8,["marker"]))),128))])]),_:1},8,["title"])):P.value&&e(U).length>0?(s(),a(O,{key:3},[n("div",qi,[c[4]||(c[4]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status",-1)),e(p).newFailures>0?(s(),w(Z,{key:0,color:"error",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(p).newFailures)+" new failure"+o(e(p).newFailures>1?"s":""),1)]),_:1})):g("",!0),e(p).recovered>0?(s(),w(Z,{key:1,color:"success",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(p).recovered)+" recovered ",1)]),_:1})):g("",!0),e(p).stillFailing>0?(s(),w(Z,{key:2,color:"warning",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(p).stillFailing)+" still failing ",1)]),_:1})):g("",!0),e(p).newFailures===0&&e(p).recovered===0&&e(p).stillFailing===0?(s(),a("span",Yi,"No status changes")):g("",!0)]),n("div",Ji,[c[5]||(c[5]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(p).regressed>0?(s(),w(Z,{key:0,color:"error",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(p).regressed)+" regressed ",1)]),_:1})):g("",!0),e(p).improved>0?(s(),w(Z,{key:1,color:"success",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(p).improved)+" improved ",1)]),_:1})):g("",!0),l(Z,{color:"neutral",variant:"soft",size:"lg"},{default:i(()=>[_(o(e(p).unchanged)+" unchanged ",1)]),_:1})]),l(le,{"min-width":"48rem",bleed:!1},{default:i(()=>[l(Q,{data:e(U),columns:S,ui:{base:"table-fixed border-separate border-spacing-0 min-w-[48rem]",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":i(({row:E})=>[E.original.statusA?(s(),w(Z,{key:1,color:("getStatusColor"in $?$.getStatusColor:e(nt))(E.original.statusA),variant:"subtle",class:"capitalize"},{default:i(()=>[_(o(E.original.statusA),1)]),_:2},1032,["color"])):(s(),a("span",Zi,"—"))]),"statusB-cell":i(({row:E})=>[E.original.statusB?(s(),w(Z,{key:1,color:("getStatusColor"in $?$.getStatusColor:e(nt))(E.original.statusB),variant:"subtle",class:"capitalize"},{default:i(()=>[_(o(E.original.statusB),1)]),_:2},1032,["color"])):(s(),a("span",Qi,"—"))]),"durationA-cell":i(({row:E})=>[E.original.durationA!==null?(s(),w(se,{key:0,ms:E.original.durationA},null,8,["ms"])):(s(),a("span",er,"—"))]),"durationB-cell":i(({row:E})=>[E.original.durationB!==null?(s(),w(se,{key:0,ms:E.original.durationB},null,8,["ms"])):(s(),a("span",tr,"—"))]),"delta-cell":i(({row:E})=>[E.original.delta===null?(s(),a("span",sr,"—")):(s(),a("span",{key:1,class:Y(E.original.delta>0?"text-red-600":E.original.delta<0?"text-green-600":"text-gray-500")},[_(o(E.original.delta>0?"+":""),1),l(se,{ms:E.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":i(({row:E})=>[E.original.percentChange===null?(s(),a("span",nr,"—")):(s(),a("span",{key:1,class:Y(E.original.percentChange>10?"text-red-600 font-medium":E.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},o(E.original.percentChange>0?"+":"")+o(E.original.percentChange)+"% ",3))]),_:1},8,["data"])]),_:1})],64)):B.value&&!F.value?(s(),a("div",ar,[l(L,{name:"i-lucide-git-compare-arrows",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),c[6]||(c[6]=n("p",null,"No comparison data available.",-1))])):(s(),a("div",or,[l(L,{name:"i-lucide-arrow-left-right",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),c[7]||(c[7]=n("p",null,"Select a baseline run to compare.",-1))]))])):R.value?(s(),a("div",lr,[l(L,{name:"i-lucide-git-compare-arrows",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),c[8]||(c[8]=n("p",null,"Comparison is available after the run finishes.",-1))])):g("",!0)])}}}),rr=Object.assign(ir,{__name:"RunCompare"}),ur={class:"flex flex-col overflow-hidden"},cr={key:0,class:"flex-1 flex items-center justify-center text-gray-500 gap-2"},dr={class:"text-xs font-mono break-all"},mr={key:0,class:"text-gray-400"},fr={key:1,class:"text-red-600 font-medium"},pr=me({__name:"SlowEndpoints",props:{refreshKey:{}},emits:["endpointsCount"],async setup(t,{emit:y}){let v,z;const m=Ke().params.id,R=t,u=y,{data:h,pending:N,refresh:B}=([v,z]=Le(()=>Ee(`/api/test-runs/${m}/network-requests`,{lazy:!0,server:!1},"$QlrRz6EqI4")),v=await v,z(),v);de(h,F=>{u("endpointsCount",F?.length??0)}),de(()=>R.refreshKey,(F,j)=>{F!==j&&F!==void 0&&B()});const P=[{accessorKey:"method",header:ue("Method")},{accessorKey:"route",header:ue("Route")},{accessorKey:"count",header:ue("Calls")},{accessorKey:"avgDuration",header:ue("Avg")},{accessorKey:"p90Duration",header:ue("P90")},{accessorKey:"maxDuration",header:ue("Max")},{accessorKey:"errorRate",header:ue("Errors")}];return(F,j)=>{const K=ke,U=_e,p=We,S=ct,$=As;return s(),a("div",ur,[e(N)?(s(),a("div",cr,[l(K,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),j[0]||(j[0]=n("span",null,"Loading network data...",-1))])):e(h)&&e(h).length>0?(s(),w(S,{key:1,sticky:"",data:e(h),columns:P,class:"flex-1 min-h-0",ui:{base:"table-fixed border-separate border-spacing-0 min-w-[44rem]",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0 [&>tr]:hover:bg-gray-50 dark:[&>tr]:hover:bg-gray-900/50",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"method-cell":i(({row:c})=>[l(U,{color:c.original.method==="GET"?"info":c.original.method==="POST"?"success":c.original.method==="PUT"||c.original.method==="PATCH"?"warning":c.original.method==="DELETE"?"error":"neutral",variant:"soft",class:"font-mono text-xs"},{default:i(()=>[_(o(c.original.method),1)]),_:2},1032,["color"])]),"route-cell":i(({row:c})=>[n("code",dr,o(c.original.route),1)]),"avgDuration-cell":i(({row:c})=>[n("span",{class:Y(c.original.avgDuration>1e3?"text-red-600 font-medium":c.original.avgDuration>500?"text-orange-500 font-medium":"")},[l(p,{ms:c.original.avgDuration,"unit-class":"opacity-60"},null,8,["ms"])],2)]),"p90Duration-cell":i(({row:c})=>[n("span",{class:Y(c.original.p90Duration>2e3?"text-red-600 font-medium":c.original.p90Duration>1e3?"text-orange-500":"")},[l(p,{ms:c.original.p90Duration,"unit-class":"opacity-60"},null,8,["ms"])],2)]),"errorRate-cell":i(({row:c})=>[c.original.errorRate===0?(s(),a("span",mr,"0%")):(s(),a("span",fr,o(c.original.errorRate)+"%",1))]),_:1},8,["data"])):(s(),w($,{key:2,class:"flex-1",icon:"i-lucide-wifi-off",title:"No network requests captured",text:"Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",doc:"capture-fixtures"}))])}}}),gr=Object.assign(pr,{__name:"SlowEndpoints"}),xr={class:"inline-flex items-center justify-center w-5 h-5 rounded-full bg-blue-500/10 hover:bg-blue-500/20 transition-colors ml-1"},yr={key:0,class:"flex items-center gap-2 mb-3 shrink-0"},$u=me({__name:"[id]",async setup(t){let y,v;const z=Ke(),T=rs(),m=z.params.id,R=!!ot().public.demoMode,{data:u,refresh:h}=([y,v]=Le(()=>Ee(`/api/test-runs/${m}`,"$JCybzNzO0T")),y=await y,v(),y),N=u.value?.projectId,{data:B,refresh:P}=N?([y,v]=Le(()=>Ee(`/api/projects/${N}/latest-run`,{key:`latest-run-${N}`},"$26uPrJhWGK")),y=await y,v(),y):{data:W(null),refresh:async()=>{}};Us(P);const F=I(()=>B.value?.id??u.value?.project?.latestRunId??null),j=I(()=>B.value?.status??u.value?.project?.latestRunStatus??null),K=I(()=>j.value==="running"||j.value==="finalizing");us(I(()=>({title:`Test run #${m}${u.value?.project?` — ${u.value.project.name}`:""} — Piwi Dashboard`})));const U=vt(),p=W(!1),S=W(!1),$=I(()=>u.value?.status==="running"||u.value?.status==="finalizing"),c=W(!1),f=W([]),M=new Map,C=W(null);let L=null;const k=W([]);de([$,u],()=>{$.value&&f.value.length>0?k.value=[...f.value]:u.value?.testCases?k.value=u.value.testCases:k.value=[]},{immediate:!0});function G(A){for(const V of A){const re=`${V.title}@@${V.location}@@${JSON.stringify(V.browser)}`;M.has(re)||(M.set(re,!0),f.value=[...f.value,V])}k.value=[...f.value]}let Z=[],se=null;function Q(){if(Z.length===0)return;const A=Z;Z=[];for(const V of A){const re=V.data;if(V.type==="init")C.value={totalTests:re.totalTests,passedTests:re.passedTests,failedTests:re.failedTests,skippedTests:re.skippedTests};else if(V.type==="test-begin"){const q=re;if(q.stepCategory)continue;const ze=`${q.title}@@${q.location}@@${JSON.stringify(q.browser)}`;M.has(ze)||(M.set(ze,!0),f.value=[...f.value,{id:f.value.length+1,title:q.title,filePath:q.filePath,suitePath:q.suitePath??void 0,status:"running",location:q.location,workerIndex:q.workerIndex??null,startedAt:q.startedAt??Date.now(),browser:q.browser??null}],k.value=[...f.value])}else if(V.type==="test-completed"){const q=re;if(q.stepCategory)continue;const ze=`${q.title}@@${q.location}@@${JSON.stringify(q.browser)}`;if(M.has(ze)){const Me=f.value.findIndex(ye=>`${ye.title}@@${ye.location}@@${JSON.stringify(ye.browser)}`===ze);if(Me>=0){const ye=f.value[Me],Ae=[...f.value];Ae[Me]={...ye,filePath:q.filePath??ye.filePath,suitePath:q.suitePath??ye.suitePath,status:q.status,duration:q.duration,error:q.error,stepEvents:q.stepEvents??ye.stepEvents,wastedTimeMs:q.wastedTimeMs??ye.wastedTimeMs,workerIndex:q.workerIndex??ye.workerIndex,startedAt:q.startedAt?q.startedAt:ye.startedAt,browser:q.browser??ye.browser},f.value=Ae,k.value=[...Ae]}}else M.set(ze,!0),f.value=[...f.value,{id:f.value.length+1,title:q.title,filePath:q.filePath,suitePath:q.suitePath??void 0,status:q.status,duration:q.duration,location:q.location,error:q.error,stepEvents:q.stepEvents??null,wastedTimeMs:q.wastedTimeMs??null,workerIndex:q.workerIndex??null,startedAt:q.startedAt??void 0,browser:q.browser??null}],k.value=[...f.value]}else V.type==="run-progress"?C.value=re:V.type==="run-finalizing"?(c.value=!0,C.value=re):V.type==="run-finished"&&(c.value=!1,r(),h(),ge.value++,le())}}function le(A=0){R||A>=5||setTimeout(async()=>{await h(),le(A+1)},1500*(A+1))}function E(A){Z.push(A),se&&clearTimeout(se),se=setTimeout(Q,200)}let D=null;function ve(){D||(u.value?.testCases?.length&&G(u.value.testCases),D=Ls(A=>{A.scope==="run"&&A.runId===Number(m)?E(A.event):A.scope==="global"&&A.event.runId===Number(m)&&A.event.type==="run-started"&&h()}))}function fe(){if(R){ve();return}L||$.value&&(u.value?.testCases?.length&&G(u.value.testCases),L=new EventSource(`/api/test-runs/${m}/stream`),L.onmessage=A=>{try{E(JSON.parse(A.data))}catch{}},L.onerror=()=>{})}function r(){L&&(L.close(),L=null),D&&(D(),D=null)}const d=I(()=>$.value||R&&u.value?.status==="initialising");de(d,A=>{A?fe():r()},{immediate:!0}),bt(()=>{r()});let X=null;const te=W([]);de(k,A=>{X===null&&(X=requestAnimationFrame(()=>{te.value=A,X=null}))},{immediate:!0});const J=I(()=>$.value&&C.value?C.value:u.value?{totalTests:u.value.totalTests,passedTests:u.value.passedTests,failedTests:u.value.failedTests,skippedTests:u.value.skippedTests}:null);async function b(){p.value=!1,S.value=!0;try{await $fetch(`/api/test-runs/${m}`,{method:"DELETE"}),U.add({title:"Test run deleted",color:"success"}),await Xe(`/projects/${u.value?.project?.id}`)}catch(A){const V=A&&typeof A=="object"&&"data"in A?A.data?.message:void 0;U.add({title:"Delete failed",description:V||"An error occurred",color:"error"})}finally{S.value=!1}}const H=W(!1),ne=W(""),ee=W([]),xe=W("all"),be=I(()=>ee.value.length===1?ee.value[0]:"all");function ae(A){ee.value=!A||A==="all"?[]:[A]}const he=I(()=>u.value?.reports||[]),Te=I(()=>{const A=k.value;return A?A.reduce((V,re)=>V+(re.wastedTimeMs??0),0):0}),pe=W("test-cases"),Re=W(null),ge=W(0),Se=W(0);function x(){Re.value=null}const $e=I(()=>u.value&&u.value.failedTests>0),Be=I(()=>{if(!u.value?.testCases)return 0;const A=new Set;for(const V of u.value.testCases)V.failureClusterId!=null&&A.add(V.failureClusterId);return A.size}),Fe=I(()=>{const A=$.value?k.value:u.value?.testCases;if(!A||A.length===0)return 0;const V=new Set;for(const re of A)re.workerIndex!=null&&re.workerIndex>=0&&V.add(re.workerIndex);return V.size}),ie=I(()=>[{label:`Test cases (${k.value.length})`,icon:"i-lucide-beaker",value:"test-cases",slot:"test-cases"},{label:"Insights",icon:"i-lucide-sparkles",value:"insights",slot:"insights"},{label:$e.value?`Failure groups (${Be.value})`:"Failure groups",icon:"i-lucide-layers",value:"failure-groups",slot:"failure-groups",disabled:!$e.value},{label:"Regression",icon:"i-lucide-git-pull-request-arrow",value:"regression",slot:"regression",disabled:!$e.value},{label:`Timeline${Fe.value>0?` (${Fe.value})`:""}`,icon:"i-lucide-timeline",value:"workers",slot:"workers"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"},{label:`Slow endpoints${Se.value>0?` (${Se.value})`:""}`,icon:"i-lucide-network",value:"endpoints",slot:"endpoints"}]),dt={"test-cases":"overflow-hidden flex flex-col",endpoints:"overflow-hidden flex flex-col"},mt=I(()=>ie.value.filter(A=>!A.disabled).map(A=>A.value));typeof z.query.tab=="string"&&mt.value.includes(z.query.tab)&&(pe.value=z.query.tab),de(mt,A=>{A.includes(pe.value)||(pe.value="test-cases")}),de(pe,A=>{z.query.tab!==A&&T.replace({query:{...z.query,tab:A}})});const ft=W(null);function Lt(A){pe.value="test-cases",Ne(()=>{ft.value?.scrollToCase(A)})}function Et(A){Re.value=A,pe.value="test-cases"}return(A,V)=>{const re=ss,q=Oe,ze=ke,Me=wt,ye=cs,Ae=ds,Ot=fs,Kt=Jn,Wt=_e,Ze=Ce,Ht=Xa,Vt=Vo,Gt=xl,Xt=Hl,qt=Ei,Yt=rr,Jt=gr,Zt=ys,Qt=ms,es=Bt,ts=lt;return s(),a(O,null,[l(Qt,{id:"test-run-detail"},{header:i(()=>[l(Ot,null,{leading:i(()=>[l(re),l(ye,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...e(u)?.project?.id?[{label:e(u).project.label||e(u).project.name||"Project",to:`/projects/${e(u).project.id}`,slot:"project"}]:[{label:"Project"}],{label:`Run #${e(m)}`+(e(u)?.label?` — ${e(u).label}`:"")}]},{project:i(({item:ce})=>[l(q,{to:ce?.to,class:"text-sm font-medium text-[var(--ui-text-muted)] hover:text-[var(--ui-text)] transition-colors"},{default:i(()=>[_(o(ce?.label),1)]),_:2},1032,["to"]),F.value&&F.value!==Number(e(m))?(s(),w(Me,{key:0,text:K.value?"Go to running run":"Go to latest run"},{default:i(()=>[l(q,{to:`/test-runs/${F.value}`},{default:i(()=>[n("span",xr,[l(ze,{name:"i-lucide-circle-play",class:Y(["w-3.5 h-3.5 text-blue-500",{"animate-pulse":K.value}])},null,8,["class"])])]),_:1},8,["to"])]),_:1},8,["text"])):g("",!0)]),_:1},8,["items"])]),right:i(()=>[l(Ae,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>e(h)()},{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:e(S),onClick:()=>p.value=!0}]},null,8,["actions"])]),_:1})]),body:i(()=>[l(Zt,{modelValue:e(pe),"onUpdate:modelValue":V[5]||(V[5]=ce=>Pe(pe)?pe.value=ce:null),"tab-items":ie.value,"tab-panel-class":dt},{summary:i(()=>[e(u)?(s(),w(Kt,{key:0,"test-run":e(u),"display-progress":J.value,"all-reports":he.value,"show-custom-data":e(H),finalizing:e(c),"active-filter":be.value,"total-wasted-time":Te.value,"onUpdate:showCustomData":V[0]||(V[0]=ce=>H.value=ce),onFilterStatus:ae,onLabelUpdated:e(h)},null,8,["test-run","display-progress","all-reports","show-custom-data","finalizing","active-filter","total-wasted-time","onLabelUpdated"])):g("",!0)]),"tab-test-cases":i(()=>[e(Re)!=null?(s(),a("div",yr,[l(Wt,{color:"info",variant:"subtle",size:"sm"},{default:i(()=>[...V[8]||(V[8]=[_(" Filtered by failure group ",-1)])]),_:1}),l(Ze,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",label:"Clear filter",onClick:x})])):g("",!0),l(Ht,{ref_key:"testCasesListRef",ref:ft,search:e(ne),"onUpdate:search":V[1]||(V[1]=ce=>Pe(ne)?ne.value=ce:null),"active-statuses":e(ee),"onUpdate:activeStatuses":V[2]||(V[2]=ce=>Pe(ee)?ee.value=ce:null),"browser-filter":e(xe),"onUpdate:browserFilter":V[3]||(V[3]=ce=>Pe(xe)?xe.value=ce:null),"test-cases":e(k),suites:e(u)?.suites??[],"is-live":$.value,"failure-cluster-filter":e(Re),"project-key":e(u)?.projectId,"project-name":e(u)?.project?.name,class:"flex-1 min-h-0"},null,8,["search","active-statuses","browser-filter","test-cases","suites","is-live","failure-cluster-filter","project-key","project-name"])]),"tab-insights":i(()=>[l(Vt,{"test-run-id":Number(e(m)),"run-status":e(u)?.status??"","refresh-key":e(ge),class:"flex-1 min-h-0 p-4"},null,8,["test-run-id","run-status","refresh-key"])]),"tab-failure-groups":i(()=>[l(Gt,{"refresh-key":e(ge),onSelectCluster:Et},null,8,["refresh-key"])]),"tab-regression":i(()=>[l(Xt,{"refresh-key":e(ge)},null,8,["refresh-key"])]),"tab-workers":i(()=>[l(qt,{"test-cases":e(te),"setup-steps":e(u)?.setupSteps??null,"shard-total":e(u)?.shardTotal??null,live:$.value,"wasted-patterns":e(u)?.wastedWaitPatterns??null,onSelectTestCase:Lt},null,8,["test-cases","setup-steps","shard-total","live","wasted-patterns"])]),"tab-compare":i(()=>[l(Yt,{"test-run":e(u)},null,8,["test-run"])]),"tab-endpoints":i(()=>[l(Jt,{"refresh-key":e(ge),class:"flex-1 min-h-0",onEndpointsCount:V[4]||(V[4]=ce=>Se.value=ce)},null,8,["refresh-key"])]),_:1},8,["modelValue","tab-items"])]),_:1}),l(ts,null,{default:i(()=>[l(es,{open:e(p),title:"Delete test run","onUpdate:open":V[7]||(V[7]=ce=>p.value=ce)},{body:i(()=>[n("p",null,[V[9]||(V[9]=_(" Are you sure you want to delete ",-1)),n("strong",null,"Test Run #"+o(e(u)?.id),1),V[10]||(V[10]=_("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:i(()=>[l(Ze,{color:"neutral",variant:"ghost",label:"Cancel",onClick:V[6]||(V[6]=ce=>p.value=!1)}),l(Ze,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(S),onClick:b},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{$u as default};
@@ -1 +0,0 @@
1
- import{_ as f}from"./DTrPCv7R.js";import{_ as b}from"./B3G-TIoP.js";import{_ as h}from"./pZbe82l5.js";import{_ as j,a as v}from"./2yLW7WU0.js";import{_ as x}from"./BDUfBn3i.js";import{d as $,u as w,w as y,e as C,f as P,g as a,h as k,o as B,i as N,j as e,k as o,r as g}from"./CNu3kken.js";import{u as D}from"./DprkT7rM.js";import"./BZFiz2UB.js";import"./C9I1Dp3S.js";import"./BVyjw9Bi.js";import"./DNKZmhbX.js";import"./HIGGZ_c-.js";import"./B_MVJP17.js";import"./oSLbl-p0.js";import"./Ya8ZzWuY.js";import"./5QBnDbs_.js";import"./FJTsZ5Aa.js";import"./CdEzDaDI.js";import"./DeewM3Wg.js";import"./7_9fts7T.js";import"./Ce_j5NtN.js";import"./BjOFxi54.js";import"./D7t0Dn3h.js";import"./D3SJGdl4.js";import"./CmTzxoQt.js";import"./Ce47NgZw.js";import"./CfhOanaF.js";import"./BjaRappk.js";import"./B_JSV0yG.js";import"./BAbrtVp3.js";const R={class:"p-4"},_o=$({__name:"test-cases",async setup(T){let r,n;const i=w(),s=String(i.params.id),{data:t}=([r,n]=y(()=>D(`/api/projects/${s}`,"$GBv2haQFFX")),r=await r,n(),r),c=g(null);return C(k(()=>({title:`${t.value?.label||t.value?.name||"Project"} — Test cases — Piwi Dashboard`}))),(F,U)=>{const m=f,p=b,_=h,l=v,u=x,d=j;return B(),P(d,{id:"project-test-cases"},{header:a(()=>[e(l,null,{leading:a(()=>[e(m),e(p,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(t)?.label||o(t)?.name||"Project",to:`/projects/${o(s)}`},{label:"Test cases"}]},null,8,["items"])]),right:a(()=>[e(_,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>o(c)?.refresh()}]},null,8,["actions"])]),_:1})]),body:a(()=>[N("div",R,[e(u,{ref_key:"tableRef",ref:c,"project-id":o(s),"project-name":o(t)?.name,"sync-query":""},null,8,["project-id","project-name"])])]),_:1})}}});export{_o as default};
@@ -1 +0,0 @@
1
- import{_ as pe}from"./DTrPCv7R.js";import{_ as me}from"./B3G-TIoP.js";import{_ as he,a as fe}from"./2yLW7WU0.js";import{_ as ye}from"./DJzFYrBt.js";import{_ as X}from"./Ya8ZzWuY.js";import{_ as ge}from"./Ce47NgZw.js";import{d as Y,o as v,c as C,i as b,t as I,k as e,j as E,g as S,p as J,q,m as R,s as ve,f as A,v as B,x as _e,F as K,y as Q,h as U,_ as Z,z as be,A as ee,r as F,u as xe,w as we,e as ke,B as $e,C as O}from"./CNu3kken.js";import{_ as Te}from"./oSLbl-p0.js";import{f as V}from"./D-c8ZSws.js";import{u as Ce}from"./DprkT7rM.js";import"./BZFiz2UB.js";import"./DeewM3Wg.js";import"./CfhOanaF.js";import"./BjaRappk.js";import"./B_JSV0yG.js";const Ie={class:"p-3 sm:p-4 space-y-2"},Be={class:"flex items-start justify-between gap-3"},ze={class:"min-w-0 space-y-1"},Ee={class:"font-medium text-sm break-all"},Ue={class:"text-xs text-gray-500"},Re={class:"flex items-center gap-2 shrink-0"},Ae={key:2,class:"text-xs"},je={key:0,class:"text-xs text-gray-500"},Le={class:"text-default"},Pe={key:1,class:"flex flex-wrap gap-x-4 gap-y-1 text-xs text-gray-500"},Se={key:0},De={key:1},Fe={key:2},Ne={key:3},Me={key:3,class:"text-xs text-gray-500"},Ve={class:"space-y-0.5"},He={class:"text-[11px]"},Oe=Y({__name:"ImportFileRow",props:{entry:{},removable:{type:Boolean}},emits:["remove"],setup(p){const c=p,a={hashing:{label:"Reading",color:"neutral",icon:"i-lucide-loader-circle"},checking:{label:"Checking",color:"neutral",icon:"i-lucide-loader-circle"},ready:{label:"Ready",color:"primary",icon:"i-lucide-circle-check"},uploading:{label:"Importing",color:"primary",icon:"i-lucide-loader-circle"},imported:{label:"Imported",color:"success",icon:"i-lucide-check"},duplicate:{label:"Already imported",color:"neutral",icon:"i-lucide-copy-check"},"too-large":{label:"Too large",color:"warning",icon:"i-lucide-weight"},invalid:{label:"Not importable",color:"warning",icon:"i-lucide-file-x"},failed:{label:"Failed",color:"error",icon:"i-lucide-circle-alert"}},d=U(()=>a[c.entry.state]),m=U(()=>["hashing","checking","uploading"].includes(c.entry.state)),o=U(()=>c.entry.result),t=U(()=>c.entry.state==="imported"?o.value:null),h=U(()=>t.value?.kind==="trace");function n(l,i){return`${l} ${i}${l===1?"":"s"}`}return(l,i)=>{const f=J,y=ve,k=Z,$=be,x=_e,T=X;return v(),C("div",Ie,[b("div",Be,[b("div",ze,[b("p",Ee,I(p.entry.name),1),b("p",Ue,I(("formatBytes"in l?l.formatBytes:e(V))(p.entry.size)),1)]),b("div",Re,[E(y,{color:e(d).color,variant:"subtle",size:"sm"},{default:S(()=>[E(f,{name:e(d).icon,class:q(["size-3.5 mr-1",e(m)&&"animate-spin"])},null,8,["name","class"]),R(" "+I(e(d).label),1)]),_:1},8,["color"]),p.removable?(v(),A(k,{key:0,icon:"i-lucide-x",color:"neutral",variant:"ghost",size:"xs",title:"Remove from the list",onClick:i[0]||(i[0]=s=>l.$emit("remove",p.entry.id))})):B("",!0)])]),p.entry.state==="uploading"||p.entry.state==="hashing"?(v(),A($,{key:0,"model-value":Math.round(p.entry.progress*100),size:"sm"},null,8,["model-value"])):B("",!0),p.entry.message?(v(),C("p",{key:1,class:q(["text-xs",p.entry.state==="failed"?"text-error":"text-gray-500"])},I(p.entry.message),3)):B("",!0),e(o)?.testRunId?(v(),C("div",Ae,[E(x,{to:`/test-runs/${e(o).testRunId}`,class:"text-primary hover:underline"},{default:S(()=>[R(" View run #"+I(e(o).testRunId),1)]),_:1},8,["to"])])):B("",!0),e(t)?(v(),C(K,{key:3},[e(h)?(v(),C("p",je,[i[1]||(i[1]=R(" Added ",-1)),b("span",Le,I(e(t).caseTitle),1),i[2]||(i[2]=R(" to this run. ",-1))])):(v(),C("div",Pe,[b("span",null,I(n(e(t).totalTests,"execution")),1),b("span",null,I(e(t).passedTests)+" passed",1),b("span",null,I(e(t).failedTests)+" failed",1),e(t).skippedTests?(v(),C("span",Se,I(e(t).skippedTests)+" skipped",1)):B("",!0),e(t).flakyTests?(v(),C("span",De,I(e(t).flakyTests)+" flaky",1)):B("",!0),e(t).traceCount?(v(),C("span",Fe,I(n(e(t).traceCount,"trace")),1)):B("",!0),e(t).attachmentCount?(v(),C("span",Ne,I(n(e(t).attachmentCount,"attachment")),1)):B("",!0)])),e(t).shard?(v(),A(T,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-split",description:`This archive is shard ${e(t).shard.current} of ${e(t).shard.total}. Each shard imports as its own run — they are not merged.`,ui:{description:"text-xs"}},null,8,["description"])):B("",!0),e(t).filePaths.length&&!e(h)?(v(),C("div",Me,[i[3]||(i[3]=b("p",{class:"mb-1"},[R(" Spec files recorded as "),b("span",{class:"text-gray-400"},"(these must match the paths your live runs report for history to line up)"),R(": ")],-1)),b("ul",Ve,[(v(!0),C(K,null,Q(e(t).filePaths,s=>(v(),C("li",{key:s},[b("code",He,I(s),1)]))),128))])])):B("",!0)],64)):B("",!0)])}}}),qe=Object.assign(Oe,{__name:"ImportFileRow"}),P=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Ke=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),We=Array.from({length:256},(p,c)=>c.toString(16).padStart(2,"0"));class te{#r=new Uint32Array(Ke);#t=new Uint8Array(64);#e=0;#n=0;#i=new Uint32Array(64);#o=!1;update(c){if(this.#o)throw new Error("Sha256: update() after digest()");this.#n+=c.length;let a=0;if(this.#e>0){const d=Math.min(64-this.#e,c.length);if(this.#t.set(c.subarray(0,d),this.#e),this.#e+=d,a=d,this.#e<64)return this;this.#s(this.#t,0),this.#e=0}for(;a+64<=c.length;a+=64)this.#s(c,a);return a<c.length&&(this.#t.set(c.subarray(a),0),this.#e=c.length-a),this}digest(){if(this.#o)throw new Error("Sha256: digest() called twice");this.#o=!0;const c=this.#n*8;this.#t[this.#e++]=128,this.#e>56&&(this.#t.fill(0,this.#e),this.#s(this.#t,0),this.#e=0),this.#t.fill(0,this.#e,56);const a=new DataView(this.#t.buffer,this.#t.byteOffset,64);a.setUint32(56,Math.floor(c/4294967296),!1),a.setUint32(60,c>>>0,!1),this.#s(this.#t,0);const d=new Uint8Array(32),m=new DataView(d.buffer);for(let o=0;o<8;o++)m.setUint32(o*4,this.#r[o],!1);return d}hex(){const c=this.digest();let a="";for(let d=0;d<32;d++)a+=We[c[d]];return a}#s(c,a){const d=this.#i,m=this.#r;for(let r=0;r<16;r++){const _=a+r*4;d[r]=c[_]<<24|c[_+1]<<16|c[_+2]<<8|c[_+3]}for(let r=16;r<64;r++){const _=d[r-15],z=d[r-2],g=(_>>>7|_<<25)^(_>>>18|_<<14)^_>>>3,D=(z>>>17|z<<15)^(z>>>19|z<<13)^z>>>10;d[r]=d[r-16]+g+d[r-7]+D|0}let o=m[0],t=m[1],h=m[2],n=m[3],l=m[4],i=m[5],f=m[6],y=m[7],k=0,$=0,x=0,T=0,s=0,u=0;for(let r=0;r<64;r+=8)$=(l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7),x=l&i^~l&f,s=y+$+x+P[r]+d[r]|0,k=(o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10),T=o&t^o&h^t&h,u=k+T|0,n=n+s|0,y=s+u|0,$=(n>>>6|n<<26)^(n>>>11|n<<21)^(n>>>25|n<<7),x=n&l^~n&i,s=f+$+x+P[r+1]+d[r+1]|0,k=(y>>>2|y<<30)^(y>>>13|y<<19)^(y>>>22|y<<10),T=y&o^y&t^o&t,u=k+T|0,h=h+s|0,f=s+u|0,$=(h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7),x=h&n^~h&l,s=i+$+x+P[r+2]+d[r+2]|0,k=(f>>>2|f<<30)^(f>>>13|f<<19)^(f>>>22|f<<10),T=f&y^f&o^y&o,u=k+T|0,t=t+s|0,i=s+u|0,$=(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7),x=t&h^~t&n,s=l+$+x+P[r+3]+d[r+3]|0,k=(i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10),T=i&f^i&y^f&y,u=k+T|0,o=o+s|0,l=s+u|0,$=(o>>>6|o<<26)^(o>>>11|o<<21)^(o>>>25|o<<7),x=o&t^~o&h,s=n+$+x+P[r+4]+d[r+4]|0,k=(l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10),T=l&i^l&f^i&f,u=k+T|0,y=y+s|0,n=s+u|0,$=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7),x=y&o^~y&t,s=h+$+x+P[r+5]+d[r+5]|0,k=(n>>>2|n<<30)^(n>>>13|n<<19)^(n>>>22|n<<10),T=n&l^n&i^l&i,u=k+T|0,f=f+s|0,h=s+u|0,$=(f>>>6|f<<26)^(f>>>11|f<<21)^(f>>>25|f<<7),x=f&y^~f&o,s=t+$+x+P[r+6]+d[r+6]|0,k=(h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10),T=h&n^h&l^n&l,u=k+T|0,i=i+s|0,t=s+u|0,$=(i>>>6|i<<26)^(i>>>11|i<<21)^(i>>>25|i<<7),x=i&f^~i&y,s=o+$+x+P[r+7]+d[r+7]|0,k=(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10),T=t&h^t&n^h&n,u=k+T|0,l=l+s|0,o=s+u|0;m[0]=m[0]+o|0,m[1]=m[1]+t|0,m[2]=m[2]+h|0,m[3]=m[3]+n|0,m[4]=m[4]+l|0,m[5]=m[5]+i|0,m[6]=m[6]+f|0,m[7]=m[7]+y|0}}async function Ge(p,c){const a=new te,d=p.stream().getReader();let m=0;for(;;){const{done:o,value:t}=await d.read();if(o)break;a.update(t),m+=t.length,c&&c(p.size?m/p.size:1)}return c&&c(1),a.hex()}const G=["ready","failed"],Xe={ok:"ready",duplicate:"duplicate","too-large":"too-large",invalid:"invalid"};function Ye(p){const c=Je("/api/test-runs/import"),a=F([]),d=F(null),m=F(null),o=F(!1);let t=1;const h=U(()=>a.value.filter(s=>G.includes(s.state)).length),n=U(()=>a.value.filter(s=>s.state==="imported").length),l=U(()=>a.value.some(s=>s.state==="hashing"||s.state==="checking")),i=F({done:0,total:0});async function f(){if(p.value)try{const s=await $fetch("/api/test-runs/import/check",{method:"POST",body:{projectName:p.value,files:[]}});d.value=s.maxBytes,m.value=null}catch(s){m.value=M(s,"Could not reach the server to read its upload limit.")}}async function y(s){const u=s.map(g=>({id:t++,file:g,name:g.name,size:g.size,state:"hashing",progress:0}));a.value=[...a.value,...u];const r=a.value.slice(-u.length),_=[];for(const g of r)d.value!=null&&g.size>d.value?(g.state="too-large",g.message=`${V(g.size)} exceeds the ${V(d.value)} limit.`):g.size===0?(g.state="invalid",g.message="The file is empty."):g.name.toLowerCase().endsWith(".zip")?_.push(g):(g.state="invalid",g.message="Expected a .zip blob report (blob-report/report-*.zip).");if(_.length===0)return;for(const g of _)try{g.progress=0,g.hash=await Ge(g.file,D=>{g.progress=D}),g.state="checking"}catch(D){g.state="failed",g.message=M(D,"Could not read the file.")}finally{g.progress=0}const z=await Qe(_);for(const g of _)g.group=z??void 0;await k(_.filter(g=>g.state==="checking"))}async function k(s){if(!(s.length===0||!p.value))try{const u=await $fetch("/api/test-runs/import/check",{method:"POST",body:{projectName:p.value,files:s.map(r=>({name:r.name,size:r.size,hash:r.hash}))}});d.value=u.maxBytes,u.results.forEach((r,_)=>{const z=s[_];z&&(z.state=Xe[r.status]??"ready",z.message=r.message,r.testRunId&&(z.result={testRunId:r.testRunId}))})}catch(u){const r=M(u,"Pre-flight check failed.");for(const _ of s)_.state="ready",_.message=`${r} Importing will still verify it.`}}async function $(){if(o.value||!p.value)return;o.value=!0;const s=a.value.filter(u=>G.includes(u.state));i.value={done:0,total:s.length};try{for(const u of s){u.state="uploading",u.message=void 0,u.progress=0;try{const r=await Ze(c,p.value,u,u.group??null,_=>{u.progress=_});u.result=r,u.state=r.status==="duplicate"?"duplicate":"imported",u.message=r.status==="duplicate"?"Already imported into this project.":void 0}catch(r){u.state="failed",u.message=M(r,"The import failed.")}finally{u.progress=0,i.value={...i.value,done:i.value.done+1}}}}finally{o.value=!1}}function x(s){a.value=a.value.filter(u=>u.id!==s)}function T(){a.value=a.value.filter(s=>!["imported","duplicate"].includes(s.state))}return{entries:a,maxBytes:d,limitError:m,importing:o,readyCount:h,importedCount:n,busy:l,batch:i,loadLimit:f,addFiles:y,startImport:$,remove:x,clearFinished:T}}function Je(p){return`${(ee().app.baseURL||"/").replace(/\/$/,"")}${p}`}async function Qe(p){const c=p.map(a=>a.hash).filter(a=>!!a);return c.length===0?null:new te().update(new TextEncoder().encode([...c].sort().join(""))).hex()}function Ze(p,c,a,d,m){return new Promise((o,t)=>{const h=new FormData;h.append("projectName",c),d&&h.append("importGroup",d),h.append("archive",a.file,a.name);const n=new XMLHttpRequest;n.open("POST",p),n.responseType="json",n.upload.addEventListener("progress",l=>{l.lengthComputable&&m(l.loaded/l.total)}),n.addEventListener("load",()=>{const l=n.response;if(n.status>=200&&n.status<300){o(l);return}const i=typeof l?.message=="string"?l.message:null;t(new Error(i??et(n.status)))}),n.addEventListener("error",()=>t(new Error("The connection dropped during the upload."))),n.addEventListener("abort",()=>t(new Error("The upload was cancelled."))),n.addEventListener("timeout",()=>t(new Error("The upload timed out."))),n.send(h)})}function et(p){return p===413?"The server (or a proxy in front of it) rejected the archive as too large.":p===401||p===403?"You do not have permission to import into this project.":p===0?"The connection dropped during the upload.":p>=500?`The server failed while importing (HTTP ${p}).`:`The import was rejected (HTTP ${p}).`}function M(p,c){const a=p?.data;return typeof a?.message=="string"&&a.message?a.message:p?.message||c}const tt={class:"p-4 space-y-4"},st={class:"space-y-4"},ot={class:"text-sm text-gray-600 dark:text-gray-400 space-y-2"},rt={class:"flex items-center gap-2"},nt={key:0,class:"text-xs text-gray-500 tabular-nums"},it={class:"space-y-4"},at={key:0,class:"text-xs text-gray-500 mt-3"},lt={key:1,class:"divide-y divide-gray-100 dark:divide-gray-800 border rounded-lg border-gray-200 dark:border-gray-800"},ct={key:2,class:"flex justify-end"},Tt=Y({__name:"import",async setup(p){let c,a;const m=xe().params.id,{data:o}=([c,a]=we(()=>Ce(`/api/projects/${m}`,"$GhVKHsNemL")),c=await c,a(),c);ke(U(()=>({title:`Import runs — ${o.value?.label||o.value?.name||"Project"} — Piwi Dashboard`})));const t=ee().public.demoMode,h=U(()=>o.value?.name),{entries:n,maxBytes:l,limitError:i,importing:f,readyCount:y,importedCount:k,busy:$,batch:x,loadLimit:T,addFiles:s,startImport:u,remove:r,clearFinished:_}=Ye(h);$e(T);const z=F(null),g=F(!1);function D(j){const w=j.target;w.files?.length&&s([...w.files]),w.value=""}function se(j){g.value=!1;const w=[...j.dataTransfer?.files??[]];w.length&&s(w)}const oe=U(()=>n.value.filter(j=>["imported","duplicate"].includes(j.state)).length);return(j,w)=>{const re=pe,ne=me,ie=fe,ae=ye,H=X,W=ge,N=Z,le=J,ce=Te,de=qe,ue=he;return v(),A(ue,{id:"project-import"},{header:S(()=>[E(ie,null,{leading:S(()=>[E(re),E(ne,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(o)?.label||e(o)?.name||"Project",to:`/projects/${e(m)}`},{label:"Import runs"}]},null,8,["items"])]),_:1})]),body:S(()=>[b("div",tt,[E(W,{title:"Import past runs",icon:"i-lucide-import",help:"project.import",subtitle:"Backfill runs recorded before you started using Piwi, from Playwright's own blob reports."},{default:S(()=>[b("div",st,[b("div",ot,[w[5]||(w[5]=b("p",null,[R(" Run your suite with the blob reporter and upload the archives it writes to "),b("code",null,"blob-report/"),R(": ")],-1)),E(ae,{code:"npx playwright test --reporter=blob",language:"bash"}),w[6]||(w[6]=b("p",null," Each archive imports as one completed run, with its traces, screenshots and videos. Importing the same archive twice does nothing, so an interrupted batch is safe to repeat. ",-1))]),e(t)?(v(),A(H,{key:0,color:"primary",variant:"subtle",icon:"i-lucide-monitor-smartphone",title:"Nothing leaves your browser",description:"This is the demo: the archive is read by a service worker and stored in your browser, not uploaded. It is cleared when the demo's sample data is refreshed, or when you reset the demo.",ui:{description:"text-xs"}})):B("",!0),E(H,{color:"neutral",variant:"subtle",icon:"i-lucide-info",title:"What imported runs carry",description:"Failures still cluster, and traces, screenshots and videos open exactly as they do for reported runs. Web vitals, page state and locator healing come from Piwi's own capture fixtures, so historical runs have none — they start once the reporter is in place.",ui:{description:"text-xs"}}),e(i)?(v(),A(H,{key:1,color:"error",variant:"subtle",icon:"i-lucide-circle-alert",description:e(i)},null,8,["description"])):B("",!0)])]),_:1}),E(W,{title:"Archives",icon:"i-lucide-files",count:e(n).length||null},{actions:S(()=>[b("div",rt,[e(f)?(v(),C("span",nt,I(e(x).done)+" of "+I(e(x).total)+" done ",1)):B("",!0),e(oe)>0&&!e(f)?(v(),A(N,{key:1,label:"Clear finished",icon:"i-lucide-eraser",color:"neutral",variant:"ghost",size:"sm",disabled:e(f),onClick:w[0]||(w[0]=L=>e(_)())},null,8,["disabled"])):B("",!0),E(N,{label:e(y)>0?`Import ${e(y)} archive${e(y)===1?"":"s"}`:"Import",icon:"i-lucide-upload",size:"sm",loading:e(f),disabled:e(y)===0||e($),onClick:w[1]||(w[1]=L=>e(u)())},null,8,["label","loading","disabled"])])]),default:S(()=>[b("div",it,[b("div",{class:q(["rounded-lg border-2 border-dashed p-6 text-center transition-colors",e(g)?"border-primary bg-primary/5":"border-gray-200 dark:border-gray-700"]),onDragover:w[3]||(w[3]=O(L=>g.value=!0,["prevent"])),onDragleave:w[4]||(w[4]=O(L=>g.value=!1,["prevent"])),onDrop:O(se,["prevent"])},[E(le,{name:"i-lucide-file-archive",class:"size-7 text-gray-400 mb-2"}),w[7]||(w[7]=b("p",{class:"text-sm text-gray-600 dark:text-gray-400"},[R("Drop "),b("code",null,"report-*.zip"),R(" files here, or")],-1)),E(N,{label:"Choose files",icon:"i-lucide-folder-open",variant:"outline",size:"sm",class:"mt-2",disabled:e(f),onClick:w[2]||(w[2]=L=>e(z)?.click())},null,8,["disabled"]),e(l)?(v(),C("p",at," Up to "+I(("formatBytes"in j?j.formatBytes:e(V))(e(l)))+" per archive. Larger ones are rejected here, before uploading. ",1)):B("",!0),b("input",{ref_key:"fileInput",ref:z,type:"file",accept:".zip",multiple:"",class:"hidden",onChange:D},null,544)],34),e(n).length===0?(v(),A(ce,{key:0,icon:"i-lucide-inbox",text:"No archives selected yet."})):(v(),C("div",lt,[(v(!0),C(K,null,Q(e(n),L=>(v(),A(de,{key:L.id,entry:L,removable:!e(f)&&L.state!=="uploading",onRemove:e(r)},null,8,["entry","removable","onRemove"]))),128))])),e(k)>0?(v(),C("div",ct,[E(N,{label:`Open ${e(o)?.label||e(o)?.name||"project"}`,icon:"i-lucide-arrow-right",trailing:"",variant:"ghost",size:"sm",to:`/projects/${e(m)}`},null,8,["label","to"])])):B("",!0)])]),_:1},8,["count"])])]),_:1})}}});export{Tt as default};
@@ -1 +0,0 @@
1
- import{be as x,b as z,bf as E,M as b,bg as L,bh as S,h as d,ab as r,bi as h,bj as T}from"./CNu3kken.js";function B(t={}){const{copy:c,copied:e,isSupported:a}=x({copiedDuring:t.duration??2e3,legacy:!0}),n=z();async function o(s,i={}){if(s){try{await c(s)}catch{return}i.toast&&n.add({title:typeof i.toast=="string"?i.toast:"Copied to clipboard",icon:"i-lucide-check",color:"success",duration:2e3})}}return{copy:o,copied:e,isSupported:a}}function q(t){const c=[r(t.method)?.toUpperCase()||"GET",r(t.baseURL)];for(const e of[t.query||t.params]){const a=r(e);if(!a)continue;const n={};for(const[o,s]of Object.entries(a))n[r(o)]=r(s);c.push(n)}if(t.body){const e=r(t.body);if(!e)c.push(h(e));else if(e instanceof ArrayBuffer)c.push(h(Object.fromEntries([...new Uint8Array(e).entries()].map(([a,n])=>[a,n.toString()]))));else if(e instanceof FormData){const a=[];for(const n of e.entries()){const[o,s]=n;a.push([o,s instanceof File?`${s.name}:${s.size}:${s.lastModified}`:s])}c.push(h(a))}else if(T(e))c.push(h(b(e)));else try{c.push(h(e))}catch{console.warn("[useFetch] Failed to hash body",e)}}return c}const m=E({name:"createUseFetch",factory(t={}){function c(e,a,n){const[o={},s]=typeof a=="string"?[{},a]:[a,n],i=typeof t=="function"?t(o):t,{server:_,lazy:g,default:F,transform:v,pick:w,watch:y,immediate:D,getCachedData:O,deep:$,dedupe:k,timeout:U,...u}={...typeof t=="function"?{}:i,...o,...typeof t=="function"?i:{}},f=d(()=>r(e)),j=d(()=>r(u.key)||"$f"+h([s,typeof f.value=="string"?f.value:"",...q(u)]));if(!u.baseURL&&typeof f.value=="string"&&f.value[0]==="/"&&f.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const l=b({...L,...u,cache:typeof u.cache=="boolean"?void 0:u.cache}),p={server:_,lazy:g,default:F,transform:v,pick:w,immediate:D,getCachedData:O,deep:$,dedupe:k,timeout:U,watch:y===!1?[]:[...y||[],l]};return y===!1&&(p._keyTriggersExecute=!1),S(j,(R,{signal:C})=>(u.$fetch||globalThis.$fetch)(f.value,{signal:C,...l}),p)}return c}}),G=m.__nuxt_factory();m.__nuxt_factory({lazy:!0,_functionName:"useLazyFetch"});export{B as a,G as u};
@@ -1 +0,0 @@
1
- import{_ as S}from"./Ya8ZzWuY.js";import{_ as $}from"./DYjxDsYC.js";import{_ as q}from"./CF_eDZHu.js";import{d as T,b as j,w as F,ax as N,c as y,j as n,g as r,o as m,k as e,f as O,v as P,i as c,q as B,F as E,y as I,E as M,_ as R,m as k,r as A,M as K}from"./CNu3kken.js";import{_ as L}from"./Ce47NgZw.js";import{u as W}from"./DprkT7rM.js";import"./DZ-KbUZi.js";import"./BVyjw9Bi.js";import"./BZOykMLD.js";import"./B3AG2m76.js";import"./CfhOanaF.js";import"./BjaRappk.js";import"./B_JSV0yG.js";const z={class:"space-y-6"},D={class:"space-y-4"},G={class:"flex items-center justify-between gap-2"},H={class:"flex items-center gap-2 shrink-0"},ce=T({__name:"pr-feedback",async setup(J){let u,p;const d=j(),{data:o,refresh:f}=([u,p]=F(()=>W("/api/settings/pr-feedback","$vSS3KCMfao")),u=await u,p(),u),l=A(!1),t=K({enabled:!1,comment:!0,status:!0,onlyOnFailure:!1,statusContext:"piwi/tests"});N(()=>{o.value&&Object.assign(t,o.value.settings)});const v=[{key:"comment",label:"Post a summary comment",description:"Creates one comment on the pull request and edits it on every later run, so a busy branch gets one comment rather than one per push."},{key:"status",label:"Set a commit status",description:"Marks the run’s commit passed or failed, so the pull request shows the result in its checks list. Still set on a green run when the comment is suppressed."},{key:"onlyOnFailure",label:"Only comment on failures",description:"Keeps green runs from adding a comment. The commit status is still set either way."}];async function g(){l.value=!0;try{const i=await $fetch("/api/settings/pr-feedback",{method:"PUT",body:{settings:{...t}}});o.value=i,Object.assign(t,i.settings),d.add({title:"Saved",color:"success"}),await f()}catch{d.add({title:"Save failed",color:"error"})}finally{l.value=!1}}async function w(){l.value=!0;try{const i=await $fetch("/api/settings/pr-feedback",{method:"PUT",body:{settings:null}});o.value=i,Object.assign(t,i.settings),d.add({title:"Reset to defaults",color:"success"}),await f()}catch{d.add({title:"Reset failed",color:"error"})}finally{l.value=!1}}return(i,s)=>{const x=S,h=$,_=q,C=M,b=R,V=L;return m(),y("div",z,[n(V,{icon:"i-lucide-git-pull-request",title:"Pull-request feedback",help:"settings.pr-feedback"},{subtitle:r(()=>[...s[2]||(s[2]=[k(" When a run finishes on a branch with an open pull request, post the result back to it — new failures separated from pre-existing ones, the failure clusters behind them, and the locator to use instead of the one that broke. ",-1)])]),footer:r(()=>[c("div",G,[s[4]||(s[4]=c("p",{class:"text-xs text-muted"}," Needs an SCM token with write access to the repository — set it globally, or per project in the project’s edit page. ",-1)),c("div",H,[n(b,{variant:"ghost",color:"neutral",disabled:e(l),label:"Reset to defaults",onClick:w},null,8,["disabled"]),n(b,{color:"primary",loading:e(l),icon:"i-lucide-save",onClick:g},{default:r(()=>[...s[3]||(s[3]=[k("Save",-1)])]),_:1},8,["loading"])])])]),default:r(()=>[e(o)&&!e(o).siteUrlConfigured?(m(),O(x,{key:0,color:"warning",variant:"soft",icon:"i-lucide-triangle-alert",title:"PIWI_SITE_URL is not set",description:"Nothing is posted until it is — every link in the comment is built from it, and a comment full of unreachable links is worse than no comment.",class:"mb-4"})):P("",!0),c("div",D,[n(h,{modelValue:e(t).enabled,"onUpdate:modelValue":s[0]||(s[0]=a=>e(t).enabled=a),label:"Post feedback to pull requests"},null,8,["modelValue"]),c("div",{class:B(["space-y-4 pl-1",!e(t).enabled&&"opacity-50 pointer-events-none"])},[(m(),y(E,null,I(v,a=>n(_,{key:a.key,label:a.label,description:a.description},{default:r(()=>[n(h,{modelValue:e(t)[a.key],"onUpdate:modelValue":U=>e(t)[a.key]=U},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1032,["label","description"])),64)),n(_,{label:"Commit status context",description:"The name shown next to the status in the pull request’s checks list.",hint:`default ${e(o)?.defaults.statusContext??""}`},{default:r(()=>[n(C,{modelValue:e(t).statusContext,"onUpdate:modelValue":s[1]||(s[1]=a=>e(t).statusContext=a),placeholder:e(o)?.defaults.statusContext,class:"w-full max-w-sm"},null,8,["modelValue","placeholder"])]),_:1},8,["hint"])],2)])]),_:1})])}}});export{ce as default};
@@ -1,2 +0,0 @@
1
- import{a3 as ue,a5 as de,o as _,f as D,g as u,V as pe,q as fe,k as e,X as me,h as a,a8 as ve,N as he,aq as ge,ak as Z,ab as Y,r as G,d as ee,H as _e,J as Q,i as d,j as i,_ as te,m as v,c as E,t as R,v as U,F as X,p as be,l as T,E as ke,s as ye,I as xe,B as we,ar as je,as as Ce}from"./CNu3kken.js";import{_ as Re}from"./FJTsZ5Aa.js";import{_ as Se}from"./Ya8ZzWuY.js";import{_ as Ie}from"./C9I1Dp3S.js";import{_ as $e}from"./CF_eDZHu.js";import{_ as Le}from"./DYjxDsYC.js";import{_ as Me}from"./DJzFYrBt.js";import{_ as Pe}from"./roaTZkYi.js";import{u as oe,R as le,L as W,b as Ee,l as Ue}from"./D7fxV-UA.js";import{u as ne,b as Oe}from"./D7t0Dn3h.js";import{a as Ve}from"./DprkT7rM.js";const ze={base:"relative",variants:{size:{xs:"",sm:"",md:"",lg:"",xl:""},orientation:{horizontal:"inline-flex -space-x-px",vertical:"flex flex-col -space-y-px"}}},De={__name:"UFieldGroup",props:{as:{type:null,required:!1},size:{type:null,required:!1},orientation:{type:null,required:!1,default:"horizontal"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(p){const n=ue("fieldGroup",p),c=de(),r=a(()=>ve({extend:ze,...c.ui?.fieldGroup||{}}));return he(ge,a(()=>({orientation:n.orientation,size:n.size}))),(h,b)=>(_(),D(e(me),{as:e(n).as,"data-orientation":e(n).orientation,class:fe(r.value({orientation:e(n).orientation,class:[e(n).ui?.base,e(n).class]}))},{default:u(()=>[pe(h.$slots,"default")]),_:3},8,["as","data-orientation","class"]))}};function se(p,o){const n=a(()=>[...new Set(Y(o).map(b=>b.filePath).filter(Boolean))]),c=G([]),r=a(()=>n.value.length>0&&c.value.length===n.value.length);async function h(b){const j=Z(),y=Y(p);if(c.value=[],!(!j||!b||y==null||n.value.length===0))try{const $=await j.invoke("desktop_check_local_specs",{projectId:String(y),files:n.value});c.value=$?.missing??[]}catch{}}return{specFiles:n,missingSpecs:c,wrongFolder:r,checkSpecs:h}}function ae(p){const o=G(null),n=a(()=>!!o.value?.exists&&o.value.playwrightCli==null);async function c(){const r=Z(),h=Y(p);if(o.value=null,!(!r||h==null))try{o.value=await r.invoke("desktop_check_local_env",{projectId:String(h)})}catch{}}return{env:o,playwrightMissing:n,checkEnv:c}}const Fe={class:"flex items-center gap-2 min-w-0"},Ne={class:"space-y-4"},Be={key:0,class:"space-y-3"},Te={class:"text-sm text-muted"},Ae={class:"flex items-center justify-between gap-3"},qe={class:"flex items-center gap-2 min-w-0 text-sm"},Ge={class:"text-xs break-all"},He={class:"grid grid-cols-2 gap-3"},Je={class:"text-xs"},Ke={class:"text-xs"},Xe={class:"text-xs"},Ye={key:0},Qe={class:"mt-1"},We={class:"space-y-1"},Ze={class:"flex items-center justify-end w-full gap-2"},et=ee({__name:"DesktopRunLocallyModal",props:xe({projectId:{},projectLabel:{},cases:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(p){const o=p,n=_e(p,"open"),c=oe(),{link:r,busy:h,pickAndLink:b}=ne(()=>o.projectId),{missingSpecs:j,wrongFolder:y,checkSpecs:$}=se(()=>o.projectId,()=>o.cases),{playwrightMissing:H,checkEnv:A}=ae(()=>o.projectId),L=a(()=>!!r.value?.exists),f=a({get:()=>c.getProjectOptions(o.projectId),set:m=>c.saveProjectOptions(o.projectId,m)}),x=a({get:()=>f.value.mode,set:m=>f.value={...f.value,mode:m}}),F=a({get:()=>f.value.runMode,set:m=>f.value={...f.value,runMode:m}}),k=a({get:()=>f.value.trace,set:m=>f.value={...f.value,trace:m}}),O=a({get:()=>f.value.repeatEach,set:m=>f.value={...f.value,repeatEach:m}}),w=le,N=W;Q([n,()=>r.value?.path,L],()=>{n.value&&($(L.value),A())});const M=a(()=>Ee(o.cases,f.value)),J=a(()=>M.value.map(m=>m.display).join(`
2
- `));function P(){c.startRun({projectId:o.projectId,projectLabel:o.projectLabel,cases:o.cases}),n.value=!1}return(m,t)=>{const S=be,V=ye,B=Se,C=te,q=Ie,z=$e,l=ke,s=Le,I=Me,K=Pe;return _(),D(K,{open:n.value,"onUpdate:open":t[6]||(t[6]=g=>n.value=g),ui:{content:"max-w-2xl"}},{header:u(()=>[d("div",Fe,[i(S,{name:"i-lucide-monitor-play",class:"size-5 text-primary shrink-0"}),t[7]||(t[7]=d("h2",{class:"text-base font-semibold truncate"},"Run tests locally",-1)),i(V,{color:"neutral",variant:"subtle",size:"sm"},{default:u(()=>[v(R(p.cases.length)+" test"+R(p.cases.length===1?"":"s"),1)]),_:1})])]),body:u(()=>[d("div",Ne,[e(L)?(_(),E(X,{key:1},[d("div",Ae,[d("div",qe,[i(S,{name:"i-lucide-folder-check",class:"size-4 text-success shrink-0"}),d("code",Ge,R(e(r)?.path),1)]),i(C,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-folder-search",loading:e(h),onClick:e(b)},{default:u(()=>[...t[9]||(t[9]=[v(" Change ",-1)])]),_:1},8,["loading","onClick"])]),d("div",He,[i(z,{label:"Select tests by",name:"mode"},{default:u(()=>[i(q,{modelValue:e(x),"onUpdate:modelValue":t[0]||(t[0]=g=>T(x)?x.value=g:null),items:e(w),class:"w-full"},null,8,["modelValue","items"])]),_:1}),i(z,{label:"Browser",name:"runMode"},{default:u(()=>[i(q,{modelValue:e(F),"onUpdate:modelValue":t[1]||(t[1]=g=>T(F)?F.value=g:null),items:e(N),class:"w-full"},null,8,["modelValue","items"])]),_:1}),i(z,{label:"Repeat each",name:"repeatEach",description:"Run every test N times — flake reproduction."},{default:u(()=>[i(l,{modelValue:e(O),"onUpdate:modelValue":t[2]||(t[2]=g=>T(O)?O.value=g:null),modelModifiers:{number:!0},type:"number",min:"1",max:"1000",class:"w-full"},null,8,["modelValue"])]),_:1}),i(z,{label:"Trace",name:"trace",description:"Force trace recording (--trace=on)."},{default:u(()=>[i(s,{modelValue:e(k),"onUpdate:modelValue":t[3]||(t[3]=g=>T(k)?k.value=g:null)},null,8,["modelValue"])]),_:1})]),e(H)?(_(),D(B,{key:0,color:"warning",variant:"soft",icon:"i-lucide-package-x",title:"No Playwright installation found"},{description:u(()=>[t[10]||(t[10]=v(" Neither ",-1)),d("code",Je,R(e(r)?.path),1),t[11]||(t[11]=v(" nor its parents hold a ",-1)),t[12]||(t[12]=d("code",{class:"text-xs"},"node_modules",-1)),t[13]||(t[13]=v(" with Playwright. Run your package manager's install in the checkout first — the app executes that folder's own Playwright. ",-1))]),_:1})):U("",!0),e(j).length>0?(_(),D(B,{key:1,color:"warning",variant:"soft",icon:"i-lucide-file-question",title:e(y)?"None of these tests are in the linked folder":"Some tests are not in the linked folder"},{description:u(()=>[d("p",null,[t[14]||(t[14]=v(" Not found under ",-1)),d("code",Ke,R(e(r)?.path),1),t[15]||(t[15]=v(": ",-1)),d("code",Xe,R(e(j)[0]),1),e(j).length>1?(_(),E("span",Ye," and "+R(e(j).length-1)+" more",1)):U("",!0),t[16]||(t[16]=v(". ",-1))]),d("p",Qe,[e(y)?(_(),E(X,{key:0},[v(" This project is probably linked to a different checkout than the one these tests come from. ")],64)):(_(),E(X,{key:1},[v(" Running anyway is fine when your Playwright config puts them elsewhere. ")],64))]),e(y)?(_(),D(C,{key:0,size:"xs",color:"warning",variant:"soft",icon:"i-lucide-folder-search",class:"mt-2",loading:e(h),onClick:e(b)},{default:u(()=>[...t[17]||(t[17]=[v(" Choose the right folder… ",-1)])]),_:1},8,["loading","onClick"])):U("",!0)]),_:1},8,["title"])):U("",!0),d("div",We,[t[18]||(t[18]=d("div",{class:"text-xs text-muted"},"Runs in the linked folder",-1)),i(I,{code:e(J),lang:"sh"},null,8,["code"])]),t[19]||(t[19]=d("p",{class:"text-xs text-muted"}," The run streams into the Local runs tray and keeps going while you browse. Results are reported by the folder's own Playwright config — with the Piwi reporter set up, the new run appears in this app automatically. ",-1))],64)):(_(),E("div",Be,[d("p",Te," Link "+R(p.projectLabel||"this project")+" to its local checkout — the folder that contains these tests. Piwi runs that folder's own Playwright with the app's bundled Node, so nothing else needs to be installed. ",1),e(r)&&!e(r).exists?(_(),D(B,{key:0,color:"warning",variant:"soft",icon:"i-lucide-folder-x",title:"The linked folder no longer exists",description:e(r).path},null,8,["description"])):U("",!0),i(C,{icon:"i-lucide-folder-plus",loading:e(h),onClick:e(b)},{default:u(()=>[...t[8]||(t[8]=[v("Choose folder…",-1)])]),_:1},8,["loading","onClick"])]))])]),footer:u(()=>[d("div",Ze,[i(C,{color:"neutral",variant:"ghost",onClick:t[4]||(t[4]=g=>n.value=!1)},{default:u(()=>[...t[20]||(t[20]=[v("Close",-1)])]),_:1}),i(C,{icon:"i-lucide-play",disabled:!e(L)||e(M).length===0||e(h),onClick:t[5]||(t[5]=g=>P())},{default:u(()=>[...t[21]||(t[21]=[v("Run",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),tt=Object.assign(et,{__name:"DesktopRunLocallyModal"}),ot={key:0,class:"inline-flex"},lt={key:0,class:"absolute -top-1 -right-1 size-2 rounded-full bg-warning"},nt=8e3,st=ee({__name:"DesktopRunLocallyButton",props:{projectId:{},projectLabel:{},cases:{},label:{},presetOptions:{}},setup(p){const o=p,n=G(!1);we(()=>{n.value=!!Z()});const c=oe(),{link:r,busy:h,pickAndLink:b,refresh:j}=ne(()=>o.projectId),{missingSpecs:y,wrongFolder:$,checkSpecs:H}=se(()=>o.projectId,()=>o.cases),{playwrightMissing:A,checkEnv:L}=ae(()=>o.projectId),{copy:f}=Ve(),x=G(!1);Q(x,l=>{l||j()});const F=a(()=>n.value&&o.projectId!=null&&o.cases.length>0),k=a(()=>!!r.value?.exists),O=a(()=>!k.value||$.value||A.value);Q([n,()=>r.value?.path,k],()=>{n.value&&(H(k.value),L())});const w=a(()=>({...c.getProjectOptions(o.projectId??""),...o.presetOptions})),N=a(()=>c.latestForProject(o.projectId)),M=a(()=>N.value?.status==="running"),J=je({interval:1e3}),P=a(()=>{const l=N.value;return!l||!l.finishedAt||l.status!=="passed"&&l.status!=="failed"?null:J.value-l.finishedAt<nt?l:null}),m=a(()=>`${o.cases.length} test${o.cases.length===1?"":"s"}`),t=a(()=>W.find(l=>l.value===w.value.runMode)?.label??"Headless"),S=a(()=>{const l=N.value;if(l&&M.value)return{label:Ue(l),color:"info",icon:void 0,tooltip:"A local run is going — view its output"};if(P.value){const s=P.value.status==="passed";return{label:s?"Passed":P.value.exitCode!=null?`Failed (exit ${P.value.exitCode})`:"Failed",color:s?"success":"error",icon:s?"i-lucide-check":"i-lucide-x",tooltip:"View the run output"}}return k.value?{label:o.label??"Run locally",color:"warning",icon:"i-lucide-monitor-play",tooltip:`Run ${m.value} on this machine · ${t.value} · in ${r.value?.path}`}:{label:o.label??"Run locally",color:"warning",icon:"i-lucide-monitor-play",tooltip:"Link this project to its local checkout to run tests here"}});function V(l){o.projectId!=null&&c.startRun({projectId:o.projectId,projectLabel:o.projectLabel,cases:o.cases,options:{...o.presetOptions,...l},persistOptions:o.presetOptions?!1:void 0})}function B(){if(M.value||P.value){c.trayOpen.value=!0;return}if(O.value){x.value=!0;return}V()}function C(l){o.projectId!=null&&c.saveProjectOptions(o.projectId,l)}const q=[1,5,10,20,50,100],z=a(()=>{const l=[];return k.value?$.value?l.push([{type:"label",label:"Tests not found in the linked folder"},{label:"Choose the right folder…",icon:"i-lucide-folder-search",onSelect:()=>{b()}},{label:"Run anyway",icon:"i-lucide-play",onSelect:()=>V()}]):A.value&&l.push([{type:"label",label:"No Playwright found in the linked folder"},{label:"Re-check after installing",icon:"i-lucide-refresh-cw",onSelect:s=>{s.preventDefault(),L()}},{label:"Run anyway",icon:"i-lucide-play",onSelect:()=>V()}]):l.push([{type:"label",label:r.value?"The linked folder is missing":"No folder linked yet"},{label:"Choose folder…",icon:"i-lucide-folder-plus",onSelect:()=>{b()}}]),k.value&&(l.push([{type:"label",label:`Run ${m.value}`},...W.map(s=>({label:s.label,icon:s.icon,type:"checkbox",checked:w.value.runMode===s.value,disabled:M.value,onSelect:()=>V({runMode:s.value})}))]),l.push([{label:"Record trace",icon:"i-lucide-film",type:"checkbox",checked:w.value.trace,onSelect:s=>{s.preventDefault(),C({trace:!w.value.trace})}},{label:`Repeat each (× ${w.value.repeatEach})`,icon:"i-lucide-repeat",children:q.map(s=>({label:`× ${s}`,type:"checkbox",checked:w.value.repeatEach===s,onSelect:I=>{I.preventDefault(),C({repeatEach:s})}}))},{label:"Select tests by",icon:"i-lucide-list-filter",children:le.map(s=>({label:s.label,type:"checkbox",checked:w.value.mode===s.value,onSelect:I=>{I.preventDefault(),C({mode:s.value})}}))}]),l.push([{label:"Run with options…",icon:"i-lucide-sliders-horizontal",onSelect:()=>x.value=!0},{label:"Copy as command",icon:"i-lucide-clipboard",onSelect:()=>{f(Oe(o.cases,{mode:w.value.mode}),{toast:"Command copied"})}}])),l.push([{label:c.activeCount.value>0?`Local runs (${c.activeCount.value} active)`:"Local runs",icon:"i-lucide-terminal",onSelect:()=>c.trayOpen.value=!0}]),k.value&&!$.value&&y.value.length>0&&l[l.length-1].unshift({type:"label",label:`${y.value.length} spec${y.value.length===1?"":"s"} not in the linked folder`}),k.value&&l.push([{type:"label",label:r.value.path,class:"font-mono text-[11px] break-all font-normal"},{label:"Change linked folder…",icon:"i-lucide-folder-search",onSelect:()=>{b()}}]),l});return(l,s)=>{const I=te,K=Re,g=Ce,ie=De,ce=tt;return e(F)?(_(),E("span",ot,[i(ie,{size:"xs"},{default:u(()=>[i(K,{text:e(S).tooltip},{default:u(()=>[i(I,{size:"xs",color:e(S).color,variant:"subtle",icon:e(S).icon,loading:e(M),disabled:e(h),onClick:B},{default:u(()=>[v(R(e(S).label),1)]),_:1},8,["color","icon","loading","disabled"])]),_:1},8,["text"]),i(g,{items:e(z),content:{align:"end"},ui:{content:"min-w-56"}},{default:u(()=>[i(I,{size:"xs",color:e(S).color,variant:"subtle",icon:"i-lucide-chevron-down","aria-label":"Run options",class:"relative"},{default:u(()=>[e(O)?(_(),E("span",lt)):U("",!0)]),_:1},8,["color"])]),_:1},8,["items"])]),_:1}),i(ce,{open:e(x),"onUpdate:open":s[0]||(s[0]=re=>T(x)?x.value=re:null),"project-id":p.projectId,"project-label":p.projectLabel,cases:p.cases},null,8,["open","project-id","project-label","cases"])])):U("",!0)}}}),gt=Object.assign(st,{__name:"DesktopRunLocallyButton"});export{gt as _};
@@ -1 +0,0 @@
1
- import{d as a,o as s,c as n,j as o,p as c,i,t as r,q as d}from"./CNu3kken.js";const l={class:"text-sm"},p=a({__name:"LoadingState",props:{text:{default:"Loading…"},padded:{type:Boolean,default:!0}},setup(e){return(_,m)=>{const t=c;return s(),n("div",{role:"status","aria-live":"polite","aria-busy":"true",class:d(["flex items-center justify-center gap-2 text-gray-400",e.padded&&"py-8"])},[o(t,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),i("span",l,r(e.text),1)],2)}}}),f=Object.assign(p,{__name:"LoadingState"});export{f as _};
@@ -1 +0,0 @@
1
- import{_ as ut,a as dt}from"./DTrPCv7R.js";import{_ as mt,a as pt}from"./CfhOanaF.js";import{_ as _t}from"./pZbe82l5.js";import{_ as ft,a as gt}from"./2yLW7WU0.js";import{d as yt,e as xt,b as bt,c as l,j as o,g as s,F as R,D as vt,o as a,i as c,E as ht,m as d,y as N,f as m,_ as kt,v as _,t as y,k as i,G as jt,h as P,r as x,M as Rt}from"./CNu3kken.js";import{_ as $t}from"./Ce89VyHE.js";import{_ as Tt}from"./CdEzDaDI.js";import{_ as Ct}from"./6vX5JdHr.js";import{_ as Nt}from"./5QBnDbs_.js";import{_ as Pt}from"./kWnH8yJq.js";import{_ as Dt}from"./D3SJGdl4.js";import{_ as Ut}from"./DZECGgZm.js";import{_ as Ft}from"./DgEa6_av.js";import{_ as St}from"./oSLbl-p0.js";import{_ as Bt}from"./B070fjS-.js";import{_ as Lt}from"./Wk7ZKG4B.js";import{_ as Kt}from"./roaTZkYi.js";import{p as Vt,i as b}from"./DeewM3Wg.js";import{u as w}from"./DprkT7rM.js";import{o as wt,s as D}from"./DGnQ69wW.js";import"./BZFiz2UB.js";import"./BjaRappk.js";import"./FJTsZ5Aa.js";import"./D-c8ZSws.js";import"./CmTzxoQt.js";import"./CF_eDZHu.js";import"./DZ-KbUZi.js";import"./B0tmRAhY.js";import"./BM5BPKlc.js";import"./BVyjw9Bi.js";import"./B3AG2m76.js";const zt={class:"flex flex-wrap items-center gap-3 mb-4"},Et={key:0,class:"flex flex-wrap items-center gap-2"},Ht={class:"text-sm text-muted shrink-0 inline-flex items-center gap-1"},It=["onClick"],Mt={class:"flex flex-col gap-1"},Ot={class:"flex items-center gap-2"},At={key:0,class:"flex flex-wrap gap-1"},qt={key:0,class:"text-xs text-gray-600 italic"},Gt={key:1},Qt={key:0,class:"text-xs text-gray-600"},Zt={key:1,class:"text-xs text-gray-600 italic"},Jt={key:0,class:"flex items-center gap-1 flex-wrap"},Wt={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Xt={key:1,class:"text-xs text-gray-500"},Yt={key:1,class:"text-xs text-gray-600 italic"},te={key:1,class:"text-xs text-gray-600 italic"},ee={key:1,class:"text-xs text-gray-600 italic"},ae={class:"flex justify-end gap-2"},se={key:1,class:"space-y-2","aria-busy":"true"},oe={key:2,class:"text-center py-12 text-gray-500"},ne={class:"text-xs text-gray-400 max-w-sm"},le={class:"flex w-full justify-end gap-2"},ze=yt({__name:"index",setup(re){xt({title:"Projects — Piwi Dashboard"});const{data:v,refresh:U,status:z}=w("/api/projects",{key:"projects",lazy:!0,default:()=>[]},"$6DHNZL9pIE"),{data:E,refresh:H}=w("/api/tags",{lazy:!0},"$FLI1EBmEg_"),F=bt(),$=P(()=>E.value?.tags||[]),I=P(()=>z.value==="pending"&&!v.value?.length),h=x(""),u=x([]),S=P(()=>{let n=v.value||[];if(h.value.trim()){const e=h.value.trim().toLowerCase();n=n.filter(p=>(p.label||p.name).toLowerCase().includes(e)||p.name.toLowerCase().includes(e))}return u.value.length>0&&(n=n.filter(e=>u.value.some(p=>(e.tags||[]).some(C=>C.id===p)))),n});function M(n){const e=u.value.indexOf(n);e===-1?u.value.push(n):u.value.splice(e,1)}function O(n){return u.value.includes(n)}const f=x(!1),A=wt({name:D().min(1,"Project name is required").max(100),label:D().optional(),description:D().optional()}),r=Rt({name:"",label:"",description:""}),k=x([]),T=x(!1);async function q(){if(r.name?.trim())try{T.value=!0,await $fetch("/api/projects",{method:"POST",body:{name:r.name.trim(),label:r.label?.trim()||null,description:r.description?.trim()||null,tagIds:k.value.map(n=>n.id)}}),F.add({title:"Project created",description:`Project "${r.name}" has been created`,color:"success"}),f.value=!1,r.name="",r.label="",r.description="",k.value=[],await U()}catch(n){const e=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;F.add({title:"Failed to create project",description:e||"An error occurred",color:"error"})}finally{T.value=!1}}const G=[{header:"Project",columns:[{accessorKey:"name",header:b("Name")},{accessorKey:"totalRuns",header:b("Runs")}]},{accessorKey:"latestRunData",header:"Latest run",columns:[{accessorKey:"latestRun",header:b("Date")},{accessorKey:"branch",header:"Branch"},{accessorKey:"duration",header:b("Duration")},{accessorKey:"status",header:b("Status")},{accessorKey:"testRatio",header:"Test status"},{accessorKey:"report",header:"Reports"}]},{accessorKey:"actions",header:"Project actions"}];return(n,e)=>{const p=ut,C=dt,B=mt,Q=_t,Z=gt,J=ht,L=$t,g=kt,K=jt,W=Tt,X=Ct,Y=Nt,tt=Pt,et=Dt,at=Ut,V=Ft,st=pt,ot=St,nt=ft,lt=Bt,rt=Lt,it=Kt,ct=vt;return a(),l(R,null,[o(nt,{id:"projects"},{header:s(()=>[o(Z,null,{leading:s(()=>[o(p),o(C,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects"}]})]),right:s(()=>[o(Q,{actions:[{label:"New project",icon:"i-lucide-plus",onClick:()=>f.value=!0},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>i(U)()}]},{leading:s(()=>[o(B,{topic:"projects.table",size:"sm"})]),_:1},8,["actions"])]),_:1})]),body:s(()=>[c("div",zt,[o(J,{modelValue:h.value,"onUpdate:modelValue":e[0]||(e[0]=t=>h.value=t),icon:"i-lucide-search",placeholder:"Search projects by name...",class:"min-w-48 flex-1",ui:{base:"w-full"}},null,8,["modelValue"]),$.value.length>0?(a(),l("div",Et,[c("span",Ht,[e[10]||(e[10]=d(" Filter by tag (any match): ",-1)),o(B,{topic:"projects.tag-filter"})]),(a(!0),l(R,null,N($.value,t=>(a(),l("button",{key:t.id,type:"button",class:"cursor-pointer focus:outline-none",onClick:j=>M(t.id)},[o(L,{text:t.text,color:t.color,variant:O(t.id)?"solid":"outline"},null,8,["text","color","variant"])],8,It))),128)),u.value.length>0?(a(),m(g,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filters",onClick:e[1]||(e[1]=t=>u.value=[])})):_("",!0)])):_("",!0)]),S.value.length>0?(a(),m(at,{key:0,"min-width":"60rem",bleed:!1},{default:s(()=>[o(et,{data:S.value,columns:G,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"name-cell":s(({row:t})=>[c("div",Mt,[c("div",Ot,[o(K,{to:`/projects/${t.original.id}`,class:"text-primary hover:underline font-medium"},{default:s(()=>[d(y(t.original.label||t.original.name),1)]),_:2},1032,["to"])]),t.original.tags?.length?(a(),l("div",At,[(a(!0),l(R,null,N(t.original.tags,j=>(a(),m(L,{key:j.id,text:j.text,color:j.color},null,8,["text","color"]))),128))])):_("",!0)])]),"totalRuns-cell":s(({row:t})=>[t.original.totalRuns===0?(a(),l("span",qt,"No data")):(a(),l("span",Gt,y(t.original.totalRuns)+" runs",1))]),"latestRun-cell":s(({row:t})=>[t.original.latestRun?(a(),l("span",Qt,y(("prettyDateFormat"in n?n.prettyDateFormat:i(Vt))(t.original.latestRun.startTime)),1)):(a(),l("span",Zt,"No data"))]),"branch-cell":s(({row:t})=>[t.original.latestRun?.metadata?.scm?(a(),l("div",Jt,[t.original.latestRun.metadata.scm.branch?(a(),l("span",Wt,y(t.original.latestRun.metadata.scm.branch),1)):_("",!0),t.original.latestRun.metadata.scm.commit?(a(),l("code",Xt,y(t.original.latestRun.metadata.scm.commit.substring(0,7)),1)):_("",!0)])):_("",!0)]),"duration-cell":s(({row:t})=>[t.original.latestRun?.duration!=null?(a(),m(W,{key:0,ms:t.original.latestRun.duration,class:"text-sm text-gray-600"},null,8,["ms"])):(a(),l("span",Yt,"No data"))]),"status-cell":s(({row:t})=>[t.original.latestRun?(a(),m(X,{key:0,status:t.original.latestRun.status},null,8,["status"])):(a(),l("span",te,"No data"))]),"testRatio-cell":s(({row:t})=>[t.original.latestRun?(a(),m(Y,{key:0,passed:t.original.latestRun.passedTests,failed:t.original.latestRun.failedTests,skipped:t.original.latestRun.skippedTests,flaky:t.original.latestRun.flakyTests,"did-not-run":t.original.latestRun.didNotRunTests??0,total:t.original.latestRun.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"])):(a(),l("span",ee,"No data"))]),"report-cell":s(({row:t})=>[t.original.latestRun?(a(),m(tt,{key:0,reports:t.original.latestRun.reports},null,8,["reports"])):_("",!0)]),"actions-header":s(()=>[...e[11]||(e[11]=[c("div",{class:"text-right"},"Project actions",-1)])]),"actions-cell":s(({row:t})=>[c("div",ae,[o(g,{to:`/projects/${t.original.id}`,size:"sm",variant:"outline"},{default:s(()=>[...e[12]||(e[12]=[d("View details",-1)])]),_:1},8,["to"]),o(g,{to:`/projects/${t.original.id}/edit`,size:"sm",variant:"ghost",icon:"i-lucide-pencil"},null,8,["to"])])]),_:1},8,["data"])]),_:1})):I.value?(a(),l("div",se,[e[13]||(e[13]=c("span",{class:"sr-only",role:"status"},"Loading projects…",-1)),o(V,{class:"h-10 w-full rounded-lg"}),(a(),l(R,null,N(6,t=>o(V,{key:t,class:"h-14 w-full rounded-lg"})),64))])):i(v)&&i(v).length>0?(a(),l("div",oe,[...e[14]||(e[14]=[c("p",{class:"text-lg mb-2"},"No projects match your search",-1),c("p",{class:"text-sm"},"Try adjusting your search or filters",-1)])])):(a(),m(ot,{key:3,icon:"i-lucide-rocket",text:"No projects yet"},{default:s(()=>[c("p",ne,[e[17]||(e[17]=d(" Projects are created automatically once the reporter submits its first run — see the ",-1)),o(K,{to:"/",class:"text-primary hover:underline"},{default:s(()=>[...e[15]||(e[15]=[d("home page",-1)])]),_:1}),e[18]||(e[18]=d(" for a copy-paste setup snippet, or the ",-1)),o(st,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:s(()=>[...e[16]||(e[16]=[d("reporter docs",-1)])]),_:1}),e[19]||(e[19]=d(". ",-1))]),o(g,{icon:"i-lucide-plus",label:"New project",variant:"ghost",size:"sm",class:"mt-2",onClick:e[2]||(e[2]=t=>f.value=!0)})]),_:1}))]),_:1}),o(ct,null,{default:s(()=>[o(it,{open:f.value,title:"Create new project","onUpdate:open":e[9]||(e[9]=t=>f.value=t)},{body:s(()=>[o(rt,{schema:i(A),state:i(r)},{default:s(()=>[o(lt,{mode:"create",name:i(r).name,"onUpdate:name":e[3]||(e[3]=t=>i(r).name=t),label:i(r).label,"onUpdate:label":e[4]||(e[4]=t=>i(r).label=t),description:i(r).description,"onUpdate:description":e[5]||(e[5]=t=>i(r).description=t),tags:k.value,"onUpdate:tags":e[6]||(e[6]=t=>k.value=t),"all-tags":$.value,onTagCreated:e[7]||(e[7]=t=>i(H)())},null,8,["name","label","description","tags","all-tags"])]),_:1},8,["schema","state"])]),footer:s(()=>[c("div",le,[o(g,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[8]||(e[8]=t=>f.value=!1)}),o(g,{label:"Create project",icon:"i-lucide-plus",loading:T.value,onClick:q},null,8,["loading"])])]),_:1},8,["open"])]),_:1})],64)}}});export{ze as default};
@@ -1 +0,0 @@
1
- import{a3 as se,a5 as ie,aU as oe,aP as ue,ao as z,aV as H,aW as X,B as Y,L as le,ad as fe,r as j,M,h as x,aX as R,o as ce,f as de,g as me,V as pe,C as ye,q as ve,k as g,ag as he,aY as Ee,a8 as be,N as w,aZ as ge,a_ as we,a$ as Se,b0 as Fe}from"./CNu3kken.js";function Ie(n){return"schema"in n&&typeof n.coercer=="function"&&typeof n.validator=="function"&&typeof n.refiner=="function"}function qe(n){return"~standard"in n}async function je(n,i){const f=await i["~standard"].validate(n);return f.issues?{errors:f.issues?.map(u=>({name:u.path?.map(o=>typeof o=="object"?o.key:o).join(".")||"",message:u.message}))||[],result:null}:{errors:null,result:f.value}}async function xe(n,i){const[f,u]=i.validate(n);return f?{errors:f.failures().map(r=>({message:r.message,name:r.path.join(".")})),result:null}:{errors:null,result:u}}function Be(n,i){if(qe(i))return je(n,i);if(Ie(i))return xe(n,i);throw new Error("Form validation failed: Unsupported form schema")}function Ne(n,i){return i?i.split(".").reduce((u,o)=>u?.[o],n):n}function Oe(n,i,f){if(!i)return Object.assign(n,f);if(!n)return n;const u=i.split(".");let o=n;for(let y=0;y<u.length-1;y++){const v=u[y];(o[v]===void 0||o[v]===null)&&(y+1<u.length&&!Number.isNaN(Number(u[y+1]))?o[v]=[]:o[v]={}),o=o[v]}const r=u[u.length-1];return o[r]=f,n}class B extends Error{formId;errors;constructor(i,f){super("Form validation exception"),this.formId=i,this.errors=f,Object.setPrototypeOf(this,B.prototype)}}const ke={base:""},_e={__name:"UForm",props:{id:{type:[String,Number],required:!1},schema:{type:null,required:!1},state:{type:null,required:!1},validate:{type:Function,required:!1},validateOn:{type:Array,required:!1,default(){return["input","blur","change"]}},disabled:{type:Boolean,required:!1},name:{type:String,required:!1},validateOnInputDelay:{type:Number,required:!1,default:300},transform:{type:null,required:!1,default:()=>!0},nested:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1,default:!0},class:{type:null,required:!1},ui:{type:Object,required:!1},onSubmit:{type:Function,required:!1}},emits:["submit","error"],setup(n,{expose:i,emit:f}){const u=n,o=f,r=se("form",u),y=ie(),v=x(()=>be({extend:ke,...y.ui?.form||{}})),S=r.id??oe(),_=ue("formRef"),A=Ee(`form-${S}`),E=r.nested===!0&&z(H,void 0),C=r.nested===!0?z(X,void 0):void 0,F=x(()=>C?.value?r.name?Ne(C.value,r.name):C.value:r.state);w(H,A),w(X,F);const I=j(new Map);Y(async()=>{E&&(await le(),E.emit({type:"attach",validate:q,formId:S,name:r.name,api:$}))}),fe(()=>{A.reset(),E&&E.emit({type:"detach",formId:S})}),Y(async()=>{A.on(async e=>{e.type==="attach"?I.value.set(e.formId,{validate:e.validate,name:e.name,api:e.api}):e.type==="detach"?I.value.delete(e.formId):r.validateOn?.includes(e.type)&&!h.value&&(e.type!=="input"?await q({name:e.name,silent:!0,nested:!1}):(e.eager||K.has(e.name))&&await q({name:e.name,silent:!0,nested:!1})),e.type==="blur"&&K.add(e.name),(e.type==="change"||e.type==="input"||e.type==="blur"||e.type==="focus")&&T.add(e.name),(e.type==="change"||e.type==="input")&&O.add(e.name)})});const l=j([]);w(ge,l);const N=j({});w(we,N);const O=M(new Set),T=M(new Set),K=M(new Set);function W(e){return e.map(t=>({...t,id:t?.name?N.value[t.name]?.id:void 0}))}const k=j(null);async function Z(){let e=r.validate?await r.validate(F.value)??[]:[];if(r.schema){const{errors:t,result:a}=await Be(F.value,r.schema);t?e=e.concat(t):k.value=a}return W(e)}async function q(e={silent:!1,nested:!1,transform:!1}){const t=e.name&&!Array.isArray(e.name)?[e.name]:e.name;let a=[],s=[];if(!t&&e.nested){const p=Array.from(I.value.values()).map(m=>G(m,e)),d=await Promise.all(p);s=d.filter(m=>m.error).flatMap(m=>m.error.errors.map(ne=>J(ne,m.name))),a=d.filter(m=>m.output!==void 0)}const b=[...await Z(),...s];if(t?l.value=ae(b,t):l.value=b,l.value?.length){if(e.silent)return!1;throw new B(S,l.value)}return e.transform?(a.forEach(p=>{p.name?Oe(k.value,p.name,p.output):Object.assign(k.value,p.output)}),k.value??F.value):F.value}const h=j(!1);w(Se,R(h));async function D(e){h.value=!!r.loadingAuto;const t=e;try{t.data=await q({nested:!0,transform:r.transform}),await r.onSubmit?.(t),O.clear()}catch(a){if(!(a instanceof B))throw a;const s={...t,errors:a.errors};o("error",s)}finally{h.value=!1}}const L=x(()=>r.disabled||h.value);w(Fe,x(()=>({disabled:L.value,validateOnInputDelay:r.validateOnInputDelay})));async function G(e,t){try{const a=await e.validate({...t,silent:!1});return{name:e.name,output:a}}catch(a){if(!(a instanceof B))throw a;return{name:e.name,error:a}}}function J(e,t){return!t||!e.name?e:{...e,name:t+"."+e.name}}function Q(e,t){const a=t+".",s=e?.name?.startsWith(a)?e.name.substring(a.length):e.name;return{...e,name:s}}function ee(e,t){return t?e.filter(a=>a?.name?.startsWith(t+".")).map(a=>Q(a,t)):e}function U(e){return e.api.getErrors().map(t=>e.name?{...t,name:e.name+"."+t.name}:t)}function P(e,t){return!e||!t?!0:e instanceof RegExp?e.test(t):t===e||typeof e=="string"&&e.startsWith(t+".")}function te(e,t){if(!e||e instanceof RegExp)return e;if(t!==e)return typeof e=="string"&&e.startsWith(t+".")?e.substring(t.length+1):e}function ae(e,t){const a=new Set(t),s=t.map(d=>N.value?.[d]?.pattern).filter(Boolean),c=d=>d.name?a.has(d.name)?!0:s.some(m=>m.test(d.name)):!1,b=l.value.filter(d=>!c(d)),p=e.filter(c);return[...b,...p]}function re(e,t){return e.filter(a=>t instanceof RegExp?!(a.name&&t.test(a.name)):!a.name||a.name!==t)}function V(e){return!e.name||!!N.value[e.name]}const $={validate:q,errors:l,setErrors(e,t){const a=W(e.filter(V)),s=[];for(const c of I.value.values())if(P(t,c.name)){const b=ee(e,c.name);c.api.setErrors(b,te(t,c.name||"")),s.push(...U(c))}if(t){const c=re(l.value,t);l.value=[...c,...a,...s]}else l.value=[...a,...s]},async submit(){_.value instanceof HTMLFormElement&&_.value.reportValidity()===!1||await D(new Event("submit"))},getErrors(e){return e?l.value.filter(t=>e instanceof RegExp?t.name&&e.test(t.name):t.name===e):l.value},clear(e){const t=e?l.value.filter(s=>V(s)&&(e instanceof RegExp?!(s.name&&e.test(s.name)):s.name!==e)):[],a=[];for(const s of I.value.values())P(e,s.name)&&s.api.clear(),a.push(...U(s));l.value=[...t,...a]},disabled:L,loading:h,dirty:x(()=>!!O.size),dirtyFields:R(O),blurredFields:R(K),touchedFields:R(T)};return i($),(e,t)=>(ce(),de(he(g(E)?"div":"form"),{id:g(S),ref_key:"formRef",ref:_,name:g(E)?void 0:g(r).name,method:"post",class:ve(v.value({class:[g(r).ui?.base,g(r).class]})),onSubmit:ye(D,["prevent"])},{default:me(()=>[pe(e.$slots,"default",{errors:l.value,loading:h.value})]),_:3},40,["id","name","class"]))}};export{_e as _};