@piwitests/server 0.17.0 → 0.18.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 (134) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BcLXUmKT.js → 36cXPVrY.js} +1 -1
  3. package/.output/public/_nuxt/{CMB-NkFa.js → 87SGk1nu.js} +1 -1
  4. package/.output/public/_nuxt/{CWmQcueG.js → AjuKBlzz.js} +1 -1
  5. package/.output/public/_nuxt/{DAeYmPfX.js → B1CB30tg.js} +1 -1
  6. package/.output/public/_nuxt/{BU6xjw05.js → B6IHiVa1.js} +1 -1
  7. package/.output/public/_nuxt/{z7PmsnBG.js → B6rt3IcG.js} +1 -1
  8. package/.output/public/_nuxt/{BDcIWTTq.js → BAaSmp8J.js} +1 -1
  9. package/.output/public/_nuxt/{rw7Hdll3.js → BAkJhSAW.js} +1 -1
  10. package/.output/public/_nuxt/{L6HlmmEa.js → BCArQk0c.js} +1 -1
  11. package/.output/public/_nuxt/{D811X8KM.js → BEB2Mv6B.js} +1 -1
  12. package/.output/public/_nuxt/BFjmLXYo.js +8 -0
  13. package/.output/public/_nuxt/{CbuWynGG.js → BJltXwHg.js} +1 -1
  14. package/.output/public/_nuxt/{Dn6cGVYB.js → BKaU95es.js} +1 -1
  15. package/.output/public/_nuxt/{CHHqhAsw.js → BReNbog6.js} +1 -1
  16. package/.output/public/_nuxt/{yZ4LuI9d.js → BTYiG93l.js} +1 -1
  17. package/.output/public/_nuxt/{D7P0ML0H.js → BUMZHDRC.js} +1 -1
  18. package/.output/public/_nuxt/{US3YSX4T.js → BVDBIVAQ.js} +1 -1
  19. package/.output/public/_nuxt/{BgDEjrcz.js → B_aSGB8S.js} +1 -1
  20. package/.output/public/_nuxt/{Ce3tBrN7.js → BaDv5D7A.js} +1 -1
  21. package/.output/public/_nuxt/{BWFY2RuU.js → BdHdHyop.js} +1 -1
  22. package/.output/public/_nuxt/{jlBi8Byu.js → BfoG8R5a.js} +1 -1
  23. package/.output/public/_nuxt/{3QTvYrZp.js → Bi3i470l.js} +1 -1
  24. package/.output/public/_nuxt/Bi9DO8jm.js +1 -0
  25. package/.output/public/_nuxt/{PxPbRVF-.js → BiX7c2qU.js} +1 -1
  26. package/.output/public/_nuxt/{DwZiG9xH.js → BoC6qaRF.js} +4 -4
  27. package/.output/public/_nuxt/{C7nwFokE.js → BsDB_eCd.js} +1 -1
  28. package/.output/public/_nuxt/{cBj9fai9.js → BuuvTH9e.js} +1 -1
  29. package/.output/public/_nuxt/{DvC5Adg1.js → C11lmBd4.js} +1 -1
  30. package/.output/public/_nuxt/{Dx1oCMgy.js → C4AfzZER.js} +1 -1
  31. package/.output/public/_nuxt/{CYuWAvXE.js → C7ZVzS0K.js} +1 -1
  32. package/.output/public/_nuxt/{B6hPf4UR.js → C8cz5feG.js} +1 -1
  33. package/.output/public/_nuxt/{DjRhouSr.js → C9EpbPNU.js} +1 -1
  34. package/.output/public/_nuxt/{HCK35QD8.js → C9ahP7km.js} +1 -1
  35. package/.output/public/_nuxt/{8jZmK2De.js → CBEM3L1q.js} +1 -1
  36. package/.output/public/_nuxt/{sMFaPAAR.js → CCsl9MOZ.js} +1 -1
  37. package/.output/public/_nuxt/{DTH2lteW.js → CCw3Tx4S.js} +1 -1
  38. package/.output/public/_nuxt/{99tAfVF5.js → CGq9qR-0.js} +1 -1
  39. package/.output/public/_nuxt/{Dym66h3p.js → CLdGRzLL.js} +1 -1
  40. package/.output/public/_nuxt/{BRdhP5lm.js → CP0vUzbd.js} +1 -1
  41. package/.output/public/_nuxt/{D_TbJDHY.js → CPZ5wygb.js} +1 -1
  42. package/.output/public/_nuxt/{Bua_L6p4.js → CRcjGmf7.js} +1 -1
  43. package/.output/public/_nuxt/{DS9yGVFL.js → CRpbGS75.js} +1 -1
  44. package/.output/public/_nuxt/{DDPptydi.js → CTgM5Fke.js} +1 -1
  45. package/.output/public/_nuxt/{D_A6axXa.js → CU3W9YrI.js} +1 -1
  46. package/.output/public/_nuxt/{BwKwWgQe.js → CUDeMcEK.js} +1 -1
  47. package/.output/public/_nuxt/{DFM2jv9I.js → CYIR2GbL.js} +1 -1
  48. package/.output/public/_nuxt/{B1CUXGbl.js → Ccit_CX1.js} +1 -1
  49. package/.output/public/_nuxt/CiPH-swI.js +1 -0
  50. package/.output/public/_nuxt/{DRTxhZBV.js → ClIKZ4qY.js} +1 -1
  51. package/.output/public/_nuxt/{DvXvJzFP.js → ClVRQpP_.js} +1 -1
  52. package/.output/public/_nuxt/{CvtYJHkY.js → CmbjAoQu.js} +1 -1
  53. package/.output/public/_nuxt/Cx65B3c3.js +1 -0
  54. package/.output/public/_nuxt/{Cz2HhsB6.js → D1ttGJfs.js} +1 -1
  55. package/.output/public/_nuxt/{DtXREpk_.js → D3MWm6JP.js} +1 -1
  56. package/.output/public/_nuxt/{BrT_Sys2.js → D3SYPlEB.js} +28 -28
  57. package/.output/public/_nuxt/{Cf4h8qty.js → D4SFgXAf.js} +1 -1
  58. package/.output/public/_nuxt/{DCffDvxl.js → D51_cB9D.js} +1 -1
  59. package/.output/public/_nuxt/{QFMx1VKs.js → D8YZvjas.js} +1 -1
  60. package/.output/public/_nuxt/{BE8ykmwr.js → DB3ljns7.js} +1 -1
  61. package/.output/public/_nuxt/{CSAmL8XJ.js → DC51KKt4.js} +1 -1
  62. package/.output/public/_nuxt/{3QTorEhJ.js → DCMFuzDI.js} +1 -1
  63. package/.output/public/_nuxt/{CNULGfLp.js → DIA_NAIv.js} +1 -1
  64. package/.output/public/_nuxt/{COVRAesU.js → DM_YaJgJ.js} +1 -1
  65. package/.output/public/_nuxt/{DJHNEqb7.js → DOr_4nln.js} +2 -2
  66. package/.output/public/_nuxt/{BGZQONfm.js → DRE6Aqqp.js} +1 -1
  67. package/.output/public/_nuxt/{DPSOtRoz.js → DVgMaBxD.js} +1 -1
  68. package/.output/public/_nuxt/{Sgf5OLhm.js → DaewB_zT.js} +1 -1
  69. package/.output/public/_nuxt/{ClJkng9p.js → Db_-yjYg.js} +1 -1
  70. package/.output/public/_nuxt/{DxQq_L07.js → Dbg8z684.js} +1 -1
  71. package/.output/public/_nuxt/{qYFZH4Z8.js → DcfRfTaA.js} +1 -1
  72. package/.output/public/_nuxt/{csqspBeX.js → Dm1_3W9g.js} +1 -1
  73. package/.output/public/_nuxt/{Dz3Wbekz.js → DnThe2U0.js} +1 -1
  74. package/.output/public/_nuxt/{D0-HTQTD.js → Do6zIWQf.js} +1 -1
  75. package/.output/public/_nuxt/{CoKEjZX7.js → DoFSKAvY.js} +1 -1
  76. package/.output/public/_nuxt/{Bpha13F_.js → DoYgYLOd.js} +1 -1
  77. package/.output/public/_nuxt/{Dvc1aWpA.js → Doul3p1_.js} +1 -1
  78. package/.output/public/_nuxt/{Ba4_ydKG.js → DraETso1.js} +1 -1
  79. package/.output/public/_nuxt/{CxLN5Tmq.js → Dwp3GkV-.js} +1 -1
  80. package/.output/public/_nuxt/{-9tk1FrT.js → Dy4TloG3.js} +1 -1
  81. package/.output/public/_nuxt/{DT5rhzhJ.js → EltzgiyS.js} +1 -1
  82. package/.output/public/_nuxt/{D13ybpY3.js → HTQtMbWb.js} +1 -1
  83. package/.output/public/_nuxt/{Wfk1m0ni.js → KYucVFu7.js} +1 -1
  84. package/.output/public/_nuxt/TBDx0s9p.js +3 -0
  85. package/.output/public/_nuxt/{Bq0PQfQY.js → Tt5LX5Y-.js} +1 -1
  86. package/.output/public/_nuxt/{BxRsAYRS.js → Vnfkr1pJ.js} +1 -1
  87. package/.output/public/_nuxt/{Df3QtbpW.js → WAaPPk0g.js} +2 -2
  88. package/.output/public/_nuxt/builds/latest.json +1 -1
  89. package/.output/public/_nuxt/builds/meta/ed1db2e5-9865-4231-9605-4edd5272e164.json +1 -0
  90. package/.output/public/_nuxt/{CHIbdzqp.js → empGC_x-.js} +1 -1
  91. package/.output/public/_nuxt/entry.ChQMshd4.css +1 -0
  92. package/.output/public/_nuxt/{BciovqwK.js → l0QnzFNM.js} +1 -1
  93. package/.output/public/_nuxt/{73aPL7Ir.js → lowCGL2S.js} +1 -1
  94. package/.output/public/_nuxt/{B6w76fJT.js → mlAADjK3.js} +1 -1
  95. package/.output/public/_nuxt/{Ds2Y3oms.js → n-QWmQgc.js} +1 -1
  96. package/.output/public/_nuxt/{DpJrGwCr.js → oFIS9u6t.js} +1 -1
  97. package/.output/public/_nuxt/{BEsJE07U.js → oWY3I9uX.js} +1 -1
  98. package/.output/public/_nuxt/{lCkcEykv.js → q0DPzLKN.js} +1 -1
  99. package/.output/public/_nuxt/{r9WApUfF.js → quV6tp4n.js} +1 -1
  100. package/.output/public/_nuxt/{8xyZSRSO.js → riEUDnED.js} +1 -1
  101. package/.output/public/_nuxt/{ByoIgYX_.js → rm7OkgDG.js} +1 -1
  102. package/.output/public/_nuxt/uaqMzXqE.js +5 -0
  103. package/.output/public/_nuxt/{vzXhOO8R.js → va1mwSm9.js} +1 -1
  104. package/.output/public/_nuxt/{BoRJdCd4.js → wGpfdK6o.js} +1 -1
  105. package/.output/public/_nuxt/{za5M7BGh.js → wQZj69OY.js} +1 -1
  106. package/.output/public/_nuxt/wgcgHmRR.js +1 -0
  107. package/.output/public/sw.js +1 -1
  108. package/.output/server/chunks/build/{about-TuEZ9n1Q.mjs → about-CoJjvUwM.mjs} +119 -11
  109. package/.output/server/chunks/build/about-CoJjvUwM.mjs.map +1 -0
  110. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  111. package/.output/server/chunks/build/{docs-EXhN3sqC.mjs → docs-BN_x1OW3.mjs} +50 -6
  112. package/.output/server/chunks/build/{docs-EXhN3sqC.mjs.map → docs-BN_x1OW3.mjs.map} +1 -1
  113. package/.output/server/chunks/build/{mcp-CQ-21rwc.mjs → mcp-_o6cMS6m.mjs} +307 -225
  114. package/.output/server/chunks/build/mcp-_o6cMS6m.mjs.map +1 -0
  115. package/.output/server/chunks/build/server.mjs +3 -3
  116. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +7 -0
  117. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +1 -0
  118. package/.output/server/chunks/nitro/nitro.mjs +688 -695
  119. package/.output/server/package.json +1 -1
  120. package/package.json +1 -1
  121. package/.output/public/_nuxt/26ll_vBr.js +0 -1
  122. package/.output/public/_nuxt/B_QIrc7l.js +0 -1
  123. package/.output/public/_nuxt/CEuVRSr0.js +0 -3
  124. package/.output/public/_nuxt/Cl96oI21.js +0 -5
  125. package/.output/public/_nuxt/DATh_1DQ.js +0 -1
  126. package/.output/public/_nuxt/DUe6xuKQ.js +0 -1
  127. package/.output/public/_nuxt/DqsMiUoW.js +0 -2
  128. package/.output/public/_nuxt/Ds4Lb1vi.js +0 -7
  129. package/.output/public/_nuxt/builds/meta/05a2dd95-d1c1-4e3a-8625-ac6bfea83837.json +0 -1
  130. package/.output/public/_nuxt/entry.BaIGwMjT.css +0 -1
  131. package/.output/server/chunks/build/DesktopMcpCard-B4JuUTKj.mjs +0 -122
  132. package/.output/server/chunks/build/DesktopMcpCard-B4JuUTKj.mjs.map +0 -1
  133. package/.output/server/chunks/build/about-TuEZ9n1Q.mjs.map +0 -1
  134. package/.output/server/chunks/build/mcp-CQ-21rwc.mjs.map +0 -1
@@ -1,2 +1,2 @@
1
- import{_ as Vt}from"./BDcIWTTq.js";import{d as fe,b as ut,o as s,f as R,g as r,i as n,p as J,k as e,j as u,m as _,t as o,c as a,F as V,M as at,l as Re,ai as ot,v as ke,q as k,s as be,x as Ne,_ as _e,E as dt,y as oe,aj as Gt,h as M,r as O,G as Ie,O as he,H as Ue,n as Xe,z as He,B as me,ak as rt,D as Xt,P as ct,A as qt,u as Ae,w as je,af as Yt,C as Jt,ab as mt,a as Zt,K as Qt,e as es}from"./BrT_Sys2.js";import{_ as ft}from"./DTH2lteW.js";import{_ as ts}from"./B1CUXGbl.js";import{_ as ss}from"./BwKwWgQe.js";import{_ as ns,a as as}from"./CMB-NkFa.js";import{_ as os,b as rs,a as ls,c as is,d as us}from"./L6HlmmEa.js";import{_ as ds}from"./DjRhouSr.js";import{_ as Se}from"./B6hPf4UR.js";import{_ as gt}from"./BGZQONfm.js";import{_ as qe}from"./CoKEjZX7.js";import{_ as cs}from"./3QTorEhJ.js";import{u as ms,_ as fs}from"./BcLXUmKT.js";import{p as pt,h as xe,k as Ve,x as gs,w as ps,d as yt,j as xt,i as Le,f as ht,a as ys,c as xs,g as ie}from"./D7P0ML0H.js";import{b as vt}from"./za5M7BGh.js";import{u as Ye}from"./DtXREpk_.js";import{_ as hs}from"./sMFaPAAR.js";import{_ as kt}from"./Cf4h8qty.js";import{_ as vs}from"./QFMx1VKs.js";import{_ as bt}from"./Bq0PQfQY.js";import{_ as ks}from"./D_A6axXa.js";import{u as bs}from"./yZ4LuI9d.js";import{_ as _s}from"./COVRAesU.js";import{_ as _t}from"./3QTvYrZp.js";import{_ as wt}from"./Wfk1m0ni.js";import{_ as ws}from"./CHIbdzqp.js";import{_ as Je}from"./DJHNEqb7.js";import{_ as $t}from"./CYuWAvXE.js";import{_ as $s}from"./BWFY2RuU.js";import{_ as Ct}from"./BciovqwK.js";import{u as Me}from"./Dvc1aWpA.js";import{_ as Cs}from"./Sgf5OLhm.js";import{_ as Rs}from"./D13ybpY3.js";import{_ as Ts}from"./BU6xjw05.js";import{u as Is}from"./r9WApUfF.js";import{u as Ss,s as zs}from"./Bpha13F_.js";import"./z7PmsnBG.js";import"./CxLN5Tmq.js";import"./D0-HTQTD.js";import"./r3SBLxtE.js";import"./D7W_4Sqc.js";import"./DpJrGwCr.js";import"./Dz3Wbekz.js";import"./26ll_vBr.js";import"./vzXhOO8R.js";import"./DATh_1DQ.js";import"./ByoIgYX_.js";import"./rw7Hdll3.js";import"./BE8ykmwr.js";import"./BxRsAYRS.js";import"./cBj9fai9.js";import"./DxQq_L07.js";const Ds={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Fs={class:"flex items-center gap-3 min-w-0"},Ps={class:"text-sm font-semibold truncate flex items-center gap-1"},js={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Ms={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ns={class:"text-gray-700 dark:text-gray-300"},As={class:"text-xs text-green-600 dark:text-green-400 tabular-nums whitespace-nowrap"},Bs={class:"text-xs text-red-600 dark:text-red-400 tabular-nums whitespace-nowrap"},Us={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ls={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)"},Es={class:"text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"},Os={class:"text-xs text-gray-400 tabular-nums whitespace-nowrap"},Ws={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ks={class:"space-y-3"},Hs={class:"flex items-start gap-3"},Vs={class:"flex items-center gap-2.5 min-w-0 flex-1"},Gs={class:"min-w-0 flex-1"},Xs={class:"flex items-center gap-2"},qs={class:"text-base font-bold shrink-0 flex items-center gap-1"},Ys={class:"text-xs text-gray-500 ml-auto whitespace-nowrap"},Js={class:"p-2 space-y-1 min-w-32"},Zs=["onClick"],Qs={class:"grid grid-cols-3 sm:grid-cols-5 gap-2"},en={class:"text-xl font-bold mt-0.5"},tn={class:"relative"},sn={class:"text-xl font-bold mt-0.5 text-green-600 dark:text-green-400"},nn={class:"text-xl font-bold mt-0.5 text-red-600 dark:text-red-400"},an={class:"text-xl font-bold mt-0.5 text-gray-600 dark:text-gray-400"},on={class:"text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"},rn={key:0,class:"flex items-center gap-3"},ln={class:"flex-1 max-w-md"},un={class:"flex items-center gap-3 text-xs shrink-0"},dn={class:"flex items-center gap-1"},cn={class:"font-medium tabular-nums"},mn={key:0,class:"flex items-center gap-1"},fn={class:"font-medium tabular-nums"},gn={key:1,class:"flex items-center gap-1"},pn={class:"font-medium tabular-nums text-orange-600 dark:text-orange-400"},yn={key:2,class:"flex items-center gap-1"},xn={class:"font-medium tabular-nums text-amber-600 dark:text-amber-400"},hn={key:0,class:"flex items-center gap-3"},vn={class:"flex-1 min-w-0"},kn={key:1,class:"space-y-1.5 text-sm"},bn={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"},_n={key:0,class:"flex items-center justify-between gap-2 min-w-0"},wn={class:"truncate"},$n={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"},Cn={class:"space-y-3 text-sm"},Rn={key:0},Tn={class:"flex flex-wrap gap-1.5"},In={key:1,class:"flex items-center gap-1"},Sn={key:3},zn={class:"bg-gray-50 dark:bg-gray-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"},Dn={class:"m-0"},Fn=fe({__name:"RunSummary",props:{testRun:{},displayProgress:{},allReports:{},showCustomData:{type:Boolean},finalizing:{type:Boolean},activeFilter:{},totalWastedTime:{}},emits:["update:showCustomData","filter-status","label-updated"],setup(t,{emit:b}){const w=t,F=b,$=ut(),l=M(()=>w.testRun?.storageStats),C=M(()=>!!(w.testRun?.metadata?.ci||w.testRun?.environment||w.testRun?.playwrightVersion||w.testRun?.reporterVersion)),m=M(()=>!!w.testRun?.metadata?.scm),D=M(()=>!!(l.value?.totalFiles||w.finalizing)),K=M(()=>!!(w.testRun?.metadata?.tags?.length||w.testRun?.metadata?.projectDescription||w.testRun?.metadata?.relatedIssue||w.testRun?.metadata?.customData||w.testRun?.links?.length)),{summaryColSpanClass:E,blockColSpanClass:N}=ms(()=>[C,m,D,K].filter(z=>z.value).length),{copy:I,copied:A}=Ye(),H=O("file-line"),U=O(!1),j=M(()=>w.testRun?.testCases?w.testRun.testCases.filter(z=>z.status==="failed"||z.status==="timedout").map(z=>({filePath:(z.filePath||z.location?.split(":")[0])??"",title:z.title,line:z.location&&parseInt(z.location.split(":")[1]??"",10)||null,projectName:z.browser?.projectName||null})):[]);function g(){return vt(j.value,{mode:H.value})}async function f(){const z=g();z&&(U.value=!0,await I(z,{toast:"Retry command copied"}),setTimeout(()=>{U.value=!1},2e3))}const d=M(()=>U.value?"Copied!":yt(g()));function c(){const z=w.testRun;if(!z)return"";const i=z.status==="passed"?"✅":z.status==="failed"?"❌":z.status==="running"?"🔄":"⚠️",ue=z.label?` — ${z.label}`:"",h=z.project?.label??z.project?.name??"",T=z.totalTests??0,G=z.passedTests??0,te=z.failedTests??0,de=z.skippedTests??0,Y=z.didNotRunTests??0,v=z.flakyTests??0,q=xe(z.duration),ae=v>0?` · ${v} flaky`:"",se=Y>0?` · ${Y} didn't run`:"";return[`*Run #${z.id}*${ue}`,`Status: ${i} ${z.status} | Project: ${h}`,`Tests: ${T} total · ${G} passed · ${te} failed · ${de} skipped${se}${ae}`,`Duration: ${q}`].join(`
1
+ import{_ as Vt}from"./BAaSmp8J.js";import{d as fe,b as ut,o as s,f as R,g as r,i as n,p as J,k as e,j as u,m as _,t as o,c as a,F as V,M as at,l as Re,ai as ot,v as ke,q as k,s as be,x as Ne,_ as _e,E as dt,y as oe,aj as Gt,h as M,r as O,G as Ie,O as he,H as Ue,n as Xe,z as He,B as me,ak as rt,D as Xt,P as ct,A as qt,u as Ae,w as je,af as Yt,C as Jt,ab as mt,a as Zt,K as Qt,e as es}from"./D3SYPlEB.js";import{_ as ft}from"./CCw3Tx4S.js";import{_ as ts}from"./Ccit_CX1.js";import{_ as ss}from"./CUDeMcEK.js";import{_ as ns,a as as}from"./87SGk1nu.js";import{_ as os,b as rs,a as ls,c as is,d as us}from"./BCArQk0c.js";import{_ as ds}from"./C9EpbPNU.js";import{_ as Se}from"./C8cz5feG.js";import{_ as gt}from"./DRE6Aqqp.js";import{_ as qe}from"./DoFSKAvY.js";import{_ as cs}from"./DCMFuzDI.js";import{u as ms,_ as fs}from"./36cXPVrY.js";import{p as pt,h as xe,k as Ve,x as gs,w as ps,d as yt,j as xt,i as Le,f as ht,a as ys,c as xs,g as ie}from"./BUMZHDRC.js";import{b as vt}from"./wQZj69OY.js";import{u as Ye}from"./D3MWm6JP.js";import{_ as hs}from"./CCsl9MOZ.js";import{_ as kt}from"./D4SFgXAf.js";import{_ as vs}from"./D8YZvjas.js";import{_ as bt}from"./Tt5LX5Y-.js";import{_ as ks}from"./CU3W9YrI.js";import{u as bs}from"./BTYiG93l.js";import{_ as _s}from"./DM_YaJgJ.js";import{_ as _t}from"./Bi3i470l.js";import{_ as wt}from"./KYucVFu7.js";import{_ as ws}from"./empGC_x-.js";import{_ as Je}from"./DOr_4nln.js";import{_ as $t}from"./C7ZVzS0K.js";import{_ as $s}from"./BdHdHyop.js";import{_ as Ct}from"./l0QnzFNM.js";import{u as Me}from"./Doul3p1_.js";import{_ as Cs}from"./DaewB_zT.js";import{_ as Rs}from"./HTQtMbWb.js";import{_ as Ts}from"./B6IHiVa1.js";import{u as Is}from"./quV6tp4n.js";import{u as Ss,s as zs}from"./DoYgYLOd.js";import"./B6rt3IcG.js";import"./Dwp3GkV-.js";import"./Do6zIWQf.js";import"./r3SBLxtE.js";import"./D7W_4Sqc.js";import"./oFIS9u6t.js";import"./DnThe2U0.js";import"./Cx65B3c3.js";import"./va1mwSm9.js";import"./wgcgHmRR.js";import"./rm7OkgDG.js";import"./BAkJhSAW.js";import"./DB3ljns7.js";import"./Vnfkr1pJ.js";import"./BuuvTH9e.js";import"./Dbg8z684.js";const Ds={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Fs={class:"flex items-center gap-3 min-w-0"},Ps={class:"text-sm font-semibold truncate flex items-center gap-1"},js={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Ms={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ns={class:"text-gray-700 dark:text-gray-300"},As={class:"text-xs text-green-600 dark:text-green-400 tabular-nums whitespace-nowrap"},Bs={class:"text-xs text-red-600 dark:text-red-400 tabular-nums whitespace-nowrap"},Us={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Ls={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)"},Es={class:"text-xs text-orange-600 dark:text-orange-400 tabular-nums whitespace-nowrap"},Os={class:"text-xs text-gray-400 tabular-nums whitespace-nowrap"},Ws={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ks={class:"space-y-3"},Hs={class:"flex items-start gap-3"},Vs={class:"flex items-center gap-2.5 min-w-0 flex-1"},Gs={class:"min-w-0 flex-1"},Xs={class:"flex items-center gap-2"},qs={class:"text-base font-bold shrink-0 flex items-center gap-1"},Ys={class:"text-xs text-gray-500 ml-auto whitespace-nowrap"},Js={class:"p-2 space-y-1 min-w-32"},Zs=["onClick"],Qs={class:"grid grid-cols-3 sm:grid-cols-5 gap-2"},en={class:"text-xl font-bold mt-0.5"},tn={class:"relative"},sn={class:"text-xl font-bold mt-0.5 text-green-600 dark:text-green-400"},nn={class:"text-xl font-bold mt-0.5 text-red-600 dark:text-red-400"},an={class:"text-xl font-bold mt-0.5 text-gray-600 dark:text-gray-400"},on={class:"text-xl font-bold mt-0.5 text-amber-600 dark:text-amber-400"},rn={key:0,class:"flex items-center gap-3"},ln={class:"flex-1 max-w-md"},un={class:"flex items-center gap-3 text-xs shrink-0"},dn={class:"flex items-center gap-1"},cn={class:"font-medium tabular-nums"},mn={key:0,class:"flex items-center gap-1"},fn={class:"font-medium tabular-nums"},gn={key:1,class:"flex items-center gap-1"},pn={class:"font-medium tabular-nums text-orange-600 dark:text-orange-400"},yn={key:2,class:"flex items-center gap-1"},xn={class:"font-medium tabular-nums text-amber-600 dark:text-amber-400"},hn={key:0,class:"flex items-center gap-3"},vn={class:"flex-1 min-w-0"},kn={key:1,class:"space-y-1.5 text-sm"},bn={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"},_n={key:0,class:"flex items-center justify-between gap-2 min-w-0"},wn={class:"truncate"},$n={class:"text-xs tabular-nums text-gray-400 dark:text-gray-500 shrink-0"},Cn={class:"space-y-3 text-sm"},Rn={key:0},Tn={class:"flex flex-wrap gap-1.5"},In={key:1,class:"flex items-center gap-1"},Sn={key:3},zn={class:"bg-gray-50 dark:bg-gray-900 p-2.5 rounded text-xs font-mono overflow-x-auto max-h-48 overflow-y-auto"},Dn={class:"m-0"},Fn=fe({__name:"RunSummary",props:{testRun:{},displayProgress:{},allReports:{},showCustomData:{type:Boolean},finalizing:{type:Boolean},activeFilter:{},totalWastedTime:{}},emits:["update:showCustomData","filter-status","label-updated"],setup(t,{emit:b}){const w=t,F=b,$=ut(),l=M(()=>w.testRun?.storageStats),C=M(()=>!!(w.testRun?.metadata?.ci||w.testRun?.environment||w.testRun?.playwrightVersion||w.testRun?.reporterVersion)),m=M(()=>!!w.testRun?.metadata?.scm),D=M(()=>!!(l.value?.totalFiles||w.finalizing)),K=M(()=>!!(w.testRun?.metadata?.tags?.length||w.testRun?.metadata?.projectDescription||w.testRun?.metadata?.relatedIssue||w.testRun?.metadata?.customData||w.testRun?.links?.length)),{summaryColSpanClass:E,blockColSpanClass:N}=ms(()=>[C,m,D,K].filter(z=>z.value).length),{copy:I,copied:A}=Ye(),H=O("file-line"),U=O(!1),j=M(()=>w.testRun?.testCases?w.testRun.testCases.filter(z=>z.status==="failed"||z.status==="timedout").map(z=>({filePath:(z.filePath||z.location?.split(":")[0])??"",title:z.title,line:z.location&&parseInt(z.location.split(":")[1]??"",10)||null,projectName:z.browser?.projectName||null})):[]);function g(){return vt(j.value,{mode:H.value})}async function f(){const z=g();z&&(U.value=!0,await I(z,{toast:"Retry command copied"}),setTimeout(()=>{U.value=!1},2e3))}const d=M(()=>U.value?"Copied!":yt(g()));function c(){const z=w.testRun;if(!z)return"";const i=z.status==="passed"?"✅":z.status==="failed"?"❌":z.status==="running"?"🔄":"⚠️",ue=z.label?` — ${z.label}`:"",h=z.project?.label??z.project?.name??"",T=z.totalTests??0,G=z.passedTests??0,te=z.failedTests??0,de=z.skippedTests??0,Y=z.didNotRunTests??0,v=z.flakyTests??0,q=xe(z.duration),ae=v>0?` · ${v} flaky`:"",se=Y>0?` · ${Y} didn't run`:"";return[`*Run #${z.id}*${ue}`,`Status: ${i} ${z.status} | Project: ${h}`,`Tests: ${T} total · ${G} passed · ${te} failed · ${de} skipped${se}${ae}`,`Duration: ${q}`].join(`
2
2
  `)}const S=O(""),y=O(!1),x=O(!1);let P=!1;const Q=O(null);function Z(){P=!1,S.value=w.testRun?.label??"",y.value=!0,Ie(()=>Q.value?.focus())}async function ne(){if(x.value)return;if(P){P=!1;return}const z=w.testRun;if(z){x.value=!0;try{await $fetch(`/api/test-runs/${z.id}`,{method:"PATCH",body:{label:S.value||null}}),y.value=!1,F("label-updated")}catch(i){const ue=i&&typeof i=="object"&&"data"in i?i.data?.message:"Failed to save label";$.add({title:"Error",description:ue||"Failed to save label",color:"error"})}finally{x.value=!1}}}function ee(){P=!0,y.value=!1}function B(z){z.key==="Enter"?ne():z.key==="Escape"&&ee()}return(z,i)=>{const ue=os,h=ke,T=be,G=ds,te=Se,de=gt,Y=Ne,v=ft,q=_e,ae=dt,se=qe,ge=rs,Ce=ls,re=Gt,we=is,ze=cs,ye=fs;return s(),R(ye,{"storage-key":"test-run"},{folded:r(()=>[n("div",Ds,[n("div",Fs,[u(ue,{status:t.testRun?.status??"",size:"sm"},null,8,["status"]),n("span",Ps,[_(" Run #"+o(t.testRun?.id)+" ",1),e(y)?(s(),a(V,{key:0},[at(n("input",{ref_key:"labelInputRef",ref:Q,"onUpdate:modelValue":i[0]||(i[0]=p=>Re(S)?S.value=p:null),type:"text",placeholder:"Add a label...",class:"inline-block w-40 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:B,onBlur:ne},null,544),[[ot,e(S)]]),e(x)?(s(),R(h,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-gray-400 animate-spin shrink-0"})):k("",!0)],64)):(s(),a(V,{key:1},[t.testRun?.label?(s(),a("span",{key:0,class:"font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",onClick:Z},"— "+o(t.testRun.label),1)):(s(),a("button",{key:1,class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1",title:"Add a label",onClick:Z}," + label "))],64))]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),R(T,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:r(()=>[u(h,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),_(" "+o(t.testRun.shardsFinished??0)+"/"+o(t.testRun.shardTotal),1)]),_:1},8,["title"])):k("",!0)]),n("div",js,[n("span",Ms,[i[12]||(i[12]=_(" T: ",-1)),n("strong",Ns,o(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)]),n("span",As,[i[13]||(i[13]=_(" P: ",-1)),n("strong",null,o(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)]),n("span",Bs,[i[14]||(i[14]=_(" F: ",-1)),n("strong",null,o(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)]),n("span",Us,[i[15]||(i[15]=_(" S: ",-1)),n("strong",null,o(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)]),n("span",Ls,[i[16]||(i[16]=_(" DNR: ",-1)),n("strong",null,o(t.testRun?.didNotRunTests??0),1)]),n("span",Es,[i[17]||(i[17]=_(" Fl: ",-1)),n("strong",null,o(t.testRun?.flakyTests??0),1)]),u(G,{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("span",Os,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun?.duration)),1)])])]),default:r(()=>[n("div",Ws,[n("div",{class:J(e(E))},[u(se,{class:"shadow-xs h-full"},{default:r(()=>[n("div",Ks,[n("div",Hs,[n("div",Vs,[u(ue,{status:t.testRun?.status??"",size:"md"},null,8,["status"]),n("div",Gs,[n("div",Xs,[n("h2",qs,[_(" Run #"+o(t.testRun?.id)+" ",1),e(y)?(s(),a(V,{key:0},[at(n("input",{ref_key:"labelInputRef",ref:Q,"onUpdate:modelValue":i[1]||(i[1]=p=>Re(S)?S.value=p:null),type:"text",placeholder:"Add a label...",class:"inline-block w-48 text-sm font-normal border-b border-dashed border-gray-400 bg-transparent outline-none focus:border-primary px-0.5 py-0",onKeydown:B,onBlur:ne},null,544),[[ot,e(S)]]),e(x)?(s(),R(h,{key:0,name:"i-lucide-loader-circle",class:"size-3.5 text-gray-400 animate-spin shrink-0"})):k("",!0)],64)):(s(),a(V,{key:1},[t.testRun?.label?(s(),a("span",{key:0,class:"font-normal text-gray-500 ml-1.5 cursor-pointer hover:text-gray-700 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400",onClick:Z},"— "+o(t.testRun.label),1)):(s(),a("button",{key:1,class:"text-xs text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 border-b border-dashed border-transparent hover:border-gray-400 ml-1.5",title:"Add a label",onClick:Z}," + label "))],64)),u(te,{topic:"run.summary"})]),t.testRun?.shardTotal&&t.testRun.shardTotal>1?(s(),R(T,{key:0,color:"neutral",variant:"soft",size:"sm",class:"shrink-0",title:`Shard ${t.testRun.shardsFinished??0}/${t.testRun.shardTotal}`},{default:r(()=>[u(h,{name:"i-lucide-layout-grid",class:"size-3 mr-1"}),_(" "+o(t.testRun.shardsFinished??0)+"/"+o(t.testRun.shardTotal),1)]),_:1},8,["title"])):k("",!0),t.testRun?.precedingMarker?(s(),R(v,{key:1,text:`This run started after: ${t.testRun.precedingMarker.label}`},{default:r(()=>[u(Y,{to:`/projects/${t.testRun.projectId}?tab=timeline`,class:"shrink-0 inline-flex items-center gap-1"},{default:r(()=>[i[18]||(i[18]=n("span",{class:"text-xs text-muted"},"After",-1)),u(de,{marker:t.testRun.precedingMarker,size:"xs"},null,8,["marker"])]),_:1},8,["to"])]),_:1},8,["text"])):k("",!0),n("span",Ys,o(t.testRun?.project?.label??t.testRun?.project?.name)+" · Started "+o(("prettyDateFormat"in z?z.prettyDateFormat:e(pt))(t.testRun?.startTime)),1),u(v,{text:e(A)?"Copied!":"Copy run summary"},{default:r(()=>[u(q,{size:"xs",variant:"ghost",color:"neutral",icon:e(A)?"i-lucide-check":"i-lucide-clipboard",class:"shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",onClick:i[2]||(i[2]=p=>e(I)(c(),{toast:"Run summary copied"}))},null,8,["icon"])]),_:1},8,["text"]),e(j).length>0?(s(),R(ae,{key:2},{content:r(()=>[n("div",Js,[i[20]||(i[20]=n("p",{class:"text-xs font-medium text-gray-500 px-2 py-1"},"Mode",-1)),(s(),a(V,null,oe(["file-line","grep","file"],p=>n("button",{key:p,class:J(["w-full text-left px-2 py-1 text-sm rounded hover:bg-gray-100 dark:hover:bg-gray-800",e(H)===p?"bg-primary/10 text-primary":""]),onClick:ve=>H.value=p},o(p==="file-line"?"File:line":p==="grep"?"Title (grep)":"File only"),11,Zs)),64))])]),default:r(()=>[u(q,{size:"xs",color:"warning",variant:"subtle",icon:e(U)?"i-lucide-check":"i-lucide-play",title:e(d),onClick:i[3]||(i[3]=p=>f())},{default:r(()=>[...i[19]||(i[19]=[_(" Retry ",-1)])]),_:1},8,["icon","title"])]),_:1})):k("",!0)])])])]),n("div",Qs,[n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="all"?"bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500":"bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"]),onClick:i[4]||(i[4]=p=>F("filter-status","all"))},[i[21]||(i[21]=n("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Total",-1)),n("p",en,o(t.displayProgress?.totalTests??t.testRun?.totalTests??0),1)],2),n("div",tn,[n("button",{class:J(["rounded-lg p-3 text-left w-full h-full transition-colors cursor-pointer",t.activeFilter==="passed"?"bg-green-100 dark:bg-green-900/30 ring-2 ring-green-400 dark:ring-green-600":"bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30"]),onClick:i[5]||(i[5]=p=>F("filter-status","passed"))},[i[22]||(i[22]=n("p",{class:"text-xs font-medium text-green-700 dark:text-green-400 uppercase tracking-wider"},"Passed",-1)),n("p",sn,o(t.displayProgress?.passedTests??t.testRun?.passedTests??0),1)],2),(t.testRun?.flakyTests??0)>0?(s(),a("button",{key:0,class:J(["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:i[6]||(i[6]=p=>F("filter-status","flaky"))},[u(h,{name:"i-lucide-shuffle",class:"size-3"}),_(" "+o(t.testRun?.flakyTests??0),1)],2)):k("",!0)]),n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="failed"?"bg-red-100 dark:bg-red-900/30 ring-2 ring-red-400 dark:ring-red-600":"bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30"]),onClick:i[7]||(i[7]=p=>F("filter-status","failed"))},[i[23]||(i[23]=n("p",{class:"text-xs font-medium text-red-700 dark:text-red-400 uppercase tracking-wider"},"Failed",-1)),n("p",nn,o(t.displayProgress?.failedTests??t.testRun?.failedTests??0),1)],2),n("button",{class:J(["rounded-lg p-3 text-left w-full transition-colors cursor-pointer",t.activeFilter==="skipped"?"bg-gray-200 dark:bg-gray-700 ring-2 ring-gray-400 dark:ring-gray-500":"bg-gray-50 dark:bg-gray-900 hover:bg-gray-100 dark:hover:bg-gray-800"]),onClick:i[8]||(i[8]=p=>F("filter-status","skipped"))},[i[24]||(i[24]=n("p",{class:"text-xs font-medium text-gray-500 uppercase tracking-wider"},"Skipped",-1)),n("p",an,o(t.displayProgress?.skippedTests??t.testRun?.skippedTests??0),1)],2),n("button",{class:J(["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:i[9]||(i[9]=p=>F("filter-status","didnotrun"))},[i[25]||(i[25]=n("p",{class:"text-xs font-medium text-amber-700 dark:text-amber-400 uppercase tracking-wider"}," Didn't run ",-1)),n("p",on,o(t.testRun?.didNotRunTests??0),1)],2)]),n("div",null,[t.testRun?(s(),a("div",rn,[n("div",ln,[u(G,{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",un,[n("div",dn,[u(h,{name:"i-lucide-clock",class:"size-3.5 text-gray-400"}),n("span",cn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun?.duration)),1)]),t.testRun?.avgTestDuration?(s(),a("div",mn,[u(h,{name:"i-lucide-gauge",class:"size-3.5 text-gray-400"}),i[26]||(i[26]=n("span",{class:"text-gray-500 hidden sm:inline"},"Avg",-1)),n("span",fn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun.avgTestDuration)),1)])):k("",!0),t.testRun?.p90TestDuration?(s(),a("div",gn,[u(h,{name:"i-lucide-arrow-up-right",class:"size-3.5 text-orange-500"}),i[27]||(i[27]=n("span",{class:"text-gray-500 hidden sm:inline"},"P90",-1)),n("span",pn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.testRun.p90TestDuration)),1)])):k("",!0),t.totalWastedTime&&t.totalWastedTime>0?(s(),a("div",yn,[u(h,{name:"i-lucide-clock",class:"size-3.5 text-amber-500"}),i[28]||(i[28]=n("span",{class:"text-gray-500 hidden sm:inline"},"Wasted",-1)),n("span",xn,o(("formatDuration"in z?z.formatDuration:e(xe))(t.totalWastedTime)),1)])):k("",!0)])])):k("",!0)])])]),_:1})],2),e(C)?(s(),R(ge,{key:0,ci:t.testRun?.metadata?.ci,environment:t.testRun?.environment,"playwright-version":t.testRun?.playwrightVersion,"reporter-version":t.testRun?.reporterVersion,class:J(e(N))},null,8,["ci","environment","playwright-version","reporter-version","class"])):k("",!0),e(m)?(s(),R(Ce,{key:1,scm:t.testRun.metadata.scm,class:J(e(N))},null,8,["scm","class"])):k("",!0),e(D)?(s(),R(we,{key:2,class:J(e(N)),title:"Storage",icon:"i-lucide-database",help:"run.reports",subtitle:e(l)?.totalFiles?`${e(l).totalFiles} files · ${("formatBytes"in z?z.formatBytes:e(Ve))(e(l).totalSize)}`:void 0},{default:r(()=>[t.finalizing?(s(),a("div",hn,[u(h,{name:"i-lucide-upload",class:"size-5 text-info shrink-0 animate-pulse"}),n("div",vn,[i[29]||(i[29]=n("div",{class:"flex items-center justify-between mb-1"},[n("span",{class:"text-sm font-medium"},"Finalizing test run"),n("span",{class:"text-xs text-gray-500"},"Uploading reports & traces…")],-1)),u(re,{value:null,size:"sm",color:"info",class:"rounded-full animate-pulse"})])])):k("",!0),e(l)?.totalFiles?(s(),a("div",kn,[(s(!0),a(V,null,oe(t.allReports,p=>(s(),a("div",{key:p.label,class:"flex items-center justify-between gap-2 min-w-0"},[u(q,{href:`/api/files/${("getFileApiPath"in z?z.getFileApiPath:e(ps))(p.path)}`,icon:("reportIcon"in z?z.reportIcon:e(gs))(p.type),target:"_blank",size:"xs",variant:"outline",class:"min-w-0",ui:{label:"truncate"}},{default:r(()=>[_(o(p.label),1)]),_:2},1032,["href","icon"]),n("span",bn,o(("formatBytes"in z?z.formatBytes:e(Ve))(p.size)),1)]))),128)),e(l).testCaseFilesCount>0?(s(),a("div",_n,[n("span",wn,"Test files ("+o(e(l).testCaseFilesCount)+")",1),n("span",$n,o(("formatBytes"in z?z.formatBytes:e(Ve))(e(l).testCaseFilesSize)),1)])):k("",!0)])):k("",!0)]),_:1},8,["class","subtitle"])):k("",!0),e(K)?(s(),R(we,{key:3,class:J(e(N)),title:"Other",icon:"i-lucide-tags",help:"run.metadata"},{default:r(()=>[n("div",Cn,[t.testRun.metadata.tags&&t.testRun.metadata.tags.length>0?(s(),a("div",Rn,[n("div",Tn,[(s(!0),a(V,null,oe(t.testRun.metadata.tags,p=>(s(),R(T,{key:p,color:"neutral",variant:"soft",size:"sm"},{default:r(()=>[_(o(p),1)]),_:2},1024))),128))])])):k("",!0),t.testRun.metadata.relatedIssue?(s(),a("p",In,[u(h,{name:"i-lucide-link",class:"w-3.5 h-3.5 text-gray-400 shrink-0"}),n("span",null,o(t.testRun.metadata.relatedIssue),1)])):k("",!0),u(ze,{"entity-type":"test_run","entity-id":t.testRun.id,links:t.testRun.links??null,onUpdated:i[10]||(i[10]=p=>z.$emit("label-updated"))},null,8,["entity-id","links"]),t.testRun.metadata.customData?(s(),R(q,{key:2,size:"xs",variant:"ghost",color:"neutral",icon:t.showCustomData?"i-lucide-chevron-up":"i-lucide-chevron-down",onClick:i[11]||(i[11]=p=>F("update:showCustomData",!t.showCustomData))},{default:r(()=>[...i[30]||(i[30]=[_(" Custom data ",-1)])]),_:1},8,["icon"])):k("",!0),t.showCustomData&&t.testRun.metadata.customData?(s(),a("div",Sn,[n("div",zn,[n("pre",Dn,o(JSON.stringify(t.testRun.metadata.customData,null,2)),1)])])):k("",!0)])]),_:1},8,["class"])):k("",!0)])]),_:1})}}}),Pn=Object.assign(Fn,{__name:"RunSummary"}),jn={class:"rounded-lg border border-default text-sm flex flex-col flex-1 min-h-0"},Mn={class:"flex items-center justify-end px-3 py-1.5 border-b border-default bg-elevated shrink-0"},Nn=["disabled","title"],An={class:"overflow-y-auto flex-1 min-h-0"},Bn=["onClick"],Un={key:1,class:"font-medium truncate min-w-0 text-muted"},Ln={key:2,class:"flex items-center gap-1 shrink-0"},En={class:"flex items-center gap-2 shrink-0 tabular-nums"},On={key:0,class:"text-xs text-red-600 dark:text-red-400 font-medium"},Wn={key:1,class:"text-xs text-green-600 dark:text-green-400"},Kn={key:2,class:"text-xs text-muted"},Hn={key:3,class:"text-xs text-amber-600 dark:text-amber-400"},Vn={key:4,class:"text-xs text-info"},Gn=["href","onClick"],Xn={class:"flex items-center gap-2 shrink-0"},qn={key:0,class:"text-xs text-info"},Yn={key:1,class:"text-xs text-muted tabular-nums"},Jn={key:0,class:"text-center py-8 text-muted"},Zn=fe({__name:"TestCasesTree",props:{testCases:{},suites:{},hasFilter:{type:Boolean},highlightedCaseId:{},projectKey:{},projectName:{}},setup(t){const b=t,w=M(()=>{const g=new Map;for(const f of b.suites)g.set(`${f.filePath}${f.suitePath.join("")}`,f);return g});function F(g){return g==="timedOut"||g==="timedout"?"failed":g}function $(g){return g==="fixme"||g==="slow"?"warning":g==="fail"?"error":g==="skip"?"neutral":g==="tag"?"primary":"info"}function l(g){switch(g){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 C(g){return g.type==="tag"?g.description??g.type:g.type}function m(g){const f={passed:0,failed:0,skipped:0,didnotrun:0,running:0,total:0};for(const d of g){const c=F(d.status);c in f&&f[c]++,f.total++}return f}const D=O(new Set),K=M(()=>D.value.size===0);function E(g){return b.hasFilter?!0:!D.value.has(g)}function N(g){if(b.hasFilter)return;const f=new Set(D.value);f.has(g)?f.delete(g):f.add(g),D.value=f}function I(){const g=[],f=new Map;for(const d of b.testCases){const c=d.filePath??"unknown";f.has(c)||f.set(c,[]),f.get(c).push(d)}for(const[d,c]of f){g.push(`file:${d}`);const S=new Set;for(const y of c){const x=y.suitePath??[];for(let P=1;P<=x.length;P++)S.add(`group:${d}${x.slice(0,P).join("")}`)}for(const y of S)g.push(y)}return g}function A(){D.value=new Set(I())}function H(){D.value=new Set}function U(g,f,d,c,S){const y=f.filter(Q=>(Q.suitePath??[]).length===c.length),x=f.filter(Q=>(Q.suitePath??[]).length>c.length),P=new Map;for(const Q of x){const Z=(Q.suitePath??[])[c.length];P.has(Z)||P.set(Z,[]),P.get(Z).push(Q)}for(const[Q,Z]of P){const ne=[...c,Q],ee=`group:${d}${ne.join("")}`,B=w.value.get(`${d}${ne.join("")}`);g.push({kind:"group",depth:S,key:ee,label:Q,stats:m(Z),mode:B?.mode??"default",annotations:B?.annotations??[]}),E(ee)&&U(g,Z,d,ne,S+1)}for(const Q of y)g.push({kind:"test",depth:S,key:`test:${Q.id}`,test:Q})}const j=M(()=>{const g=[],f=new Map;for(const d of b.testCases){const c=d.filePath??"unknown";f.has(c)||f.set(c,[]),f.get(c).push(d)}for(const[d,c]of[...f.entries()].sort(([S],[y])=>S.localeCompare(y))){const S=`file:${d}`;g.push({kind:"group",depth:0,key:S,label:d,stats:m(c)}),E(S)&&U(g,c,d,[],1)}return g});return(g,f)=>{const d=ke,c=bt,S=be,y=_e;return s(),a("div",jn,[n("div",Mn,[n("button",{class:J(["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":K.value?"Collapse all":"Expand all",onClick:f[0]||(f[0]=x=>K.value?A():H())},[u(d,{name:K.value?"i-lucide-fold-vertical":"i-lucide-unfold-vertical",class:"size-3.5"},null,8,["name"]),_(" "+o(K.value?"Collapse all":"Expand all"),1)],10,Nn)]),n("div",An,[(s(!0),a(V,null,oe(j.value,x=>(s(),a(V,{key:x.key},[x.kind==="group"?(s(),a("div",{key:0,class:J(["flex items-center gap-2 py-2 pr-4 border-b border-default last:border-b-0 select-none sticky",[x.depth===0?"bg-elevated":"bg-default",!t.hasFilter&&"cursor-pointer"]]),style:he({paddingLeft:`${x.depth*20+12}px`,top:`${x.depth*36}px`,zIndex:20-x.depth}),onClick:P=>N(x.key)},[u(d,{name:E(x.key)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5 text-muted shrink-0"},null,8,["name"]),u(d,{name:x.depth===0?"i-lucide-file-code-2":"i-lucide-folder-open",class:J(["size-4 shrink-0",x.depth===0?"text-blue-500":"text-amber-500"])},null,8,["name","class"]),x.depth===0?(s(),a("span",{key:0,class:"min-w-0",onClick:f[1]||(f[1]=Ue(()=>{},["stop"]))},[u(c,{"file-path":x.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",Un,o(x.label),1)),x.depth>0?(s(),a("div",Ln,[x.mode==="parallel"?(s(),R(S,{key:0,color:"success",variant:"soft",size:"xs"},{default:r(()=>[...f[2]||(f[2]=[_("parallel",-1)])]),_:1})):k("",!0),x.mode==="serial"?(s(),R(S,{key:1,color:"warning",variant:"soft",size:"xs"},{default:r(()=>[...f[3]||(f[3]=[_("serial",-1)])]),_:1})):k("",!0),(s(!0),a(V,null,oe(x.annotations,P=>(s(),R(S,{key:`${P.type}:${P.description??""}`,color:$(P.type),variant:"soft",size:"xs",title:P.type!=="tag"?P.description??void 0:void 0,class:"gap-1"},{default:r(()=>[l(P.type)?(s(),R(d,{key:0,name:l(P.type),class:"size-2.5 shrink-0"},null,8,["name"])):k("",!0),_(" "+o(C(P)),1)]),_:2},1032,["color","title"]))),128))])):k("",!0),f[4]||(f[4]=n("div",{class:"flex-1"},null,-1)),n("div",En,[x.stats.failed>0?(s(),a("span",On,o(x.stats.failed)+" failed ",1)):k("",!0),x.stats.passed>0?(s(),a("span",Wn,o(x.stats.passed)+" passed ",1)):k("",!0),x.stats.skipped>0?(s(),a("span",Kn,o(x.stats.skipped)+" skipped",1)):k("",!0),x.stats.didnotrun>0?(s(),a("span",Hn,o(x.stats.didnotrun)+" didn't run ",1)):k("",!0),x.stats.running>0?(s(),a("span",Vn,o(x.stats.running)+" running",1)):k("",!0)])],14,Bn)):(s(),a("div",{key:1,class:J(["flex items-center gap-2 pr-3 py-1.5 border-b border-default last:border-b-0 hover:bg-gray-50 dark:hover:bg-gray-900/40 transition-colors",t.highlightedCaseId===x.test.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),style:he({paddingLeft:`${x.depth*20+12}px`})},[u(d,{name:"i-lucide-flask-conical",class:"size-3.5 text-muted shrink-0"}),u(S,{color:("getStatusColor"in g?g.getStatusColor:e(Le))(x.test.status==="timedOut"||x.test.status==="timedout"?"failed":x.test.status),size:"xs",class:"capitalize shrink-0"},{default:r(()=>[_(o(("formatStatusLabel"in g?g.formatStatusLabel:e(xt))(x.test.status)),1)]),_:2},1032,["color"]),(s(!0),a(V,null,oe(x.test.testAnnotations??[],P=>(s(),R(S,{key:`${P.type}:${P.description??""}`,color:$(P.type),variant:"soft",size:"xs",title:P.type!=="tag"?P.description??void 0:void 0,class:"shrink-0 gap-1"},{default:r(()=>[l(P.type)?(s(),R(d,{key:0,name:l(P.type),class:"size-2.5 shrink-0"},null,8,["name"])):k("",!0),_(" "+o(C(P)),1)]),_:2},1032,["color","title"]))),128)),n("a",{href:`/test-run-cases/${x.test.id}`,class:"text-primary hover:underline truncate flex-1 min-w-0",onClick:Ue(P=>("navigateTo"in g?g.navigateTo:e(Xe))(`/test-run-cases/${x.test.id}`),["prevent"])},o(x.test.title),9,Gn),n("div",Xn,[x.test.status==="running"?(s(),a("span",qn,"In progress...")):x.test.duration?(s(),a("span",Yn,o(("formatDuration"in g?g.formatDuration:e(xe))(x.test.duration)),1)):k("",!0),x.test.workerIndex!=null?(s(),R(S,{key:2,color:"neutral",variant:"soft",size:"xs",class:"font-mono",title:`Worker ${x.test.workerIndex}`},{default:r(()=>[_(" w"+o(x.test.workerIndex),1)]),_:2},1032,["title"])):k("",!0),(x.test.retries??0)>0?(s(),R(S,{key:3,color:"warning",variant:"soft",size:"xs"},{default:r(()=>[_(o(x.test.retries)+"x ",1)]),_:2},1024)):k("",!0),u(y,{to:`/test-run-cases/${x.test.id}`,size:"xs",variant:"outline"},{default:r(()=>[...f[5]||(f[5]=[_(" View ",-1)])]),_:1},8,["to"])])],6))],64))),128)),j.value.length===0?(s(),a("div",Jn,[u(d,{name:"i-lucide-search-x",class:"size-6 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),f[6]||(f[6]=n("p",{class:"text-sm"},"No test cases match your filters.",-1))])):k("",!0)])])}}}),Qn=Object.assign(Zn,{__name:"TestCasesTree"}),ea={class:"flex flex-col min-h-0"},ta={class:"flex items-center rounded-md border border-default overflow-hidden"},sa={key:0,class:"text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"},na={key:1,class:"text-sm text-gray-500 tabular-nums inline-flex items-center gap-1"},aa={class:"flex flex-wrap items-center gap-1"},oa=["onClick"],ra={key:0,class:"flex-1 min-h-0 max-lg:h-[70dvh] overflow-x-auto overflow-y-hidden rounded-lg border border-default"},la=["aria-rowcount"],ia=["aria-sort","aria-label","title","onClick"],ua={key:1,class:"truncate"},da={class:"px-3 py-2 flex items-center min-w-0",role:"cell"},ca={class:"px-3 py-2 min-w-0 space-y-0.5",role:"cell"},ma={class:"flex items-center gap-1.5 min-w-0"},fa=["href","title","onClick"],ga={class:"px-3 py-2 flex items-center",role:"cell"},pa={class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},ya={key:0,class:"text-info text-xs"},xa={key:1},ha={class:"px-3 py-2 flex items-center",role:"cell"},va={class:"px-3 py-2 flex items-center tabular-nums",role:"cell"},ka={key:0,class:"px-3 py-2 flex items-center whitespace-nowrap",role:"cell"},ba={key:0,class:"text-amber-600 dark:text-amber-400"},_a={key:1,class:"text-gray-400"},wa={class:"px-3 py-2 flex items-center justify-end",role:"cell"},$a={class:"flex-1 min-h-0 flex items-center justify-center py-10 text-sm text-gray-500"},Ca={key:1,class:"text-center py-10 text-gray-500"},Ra={key:2,class:"text-center py-10 text-gray-500"},Ta=fe({__name:"TestCasesList",props:qt({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:b}){const{treeView:w,setTreeView:F}=bs("test-cases"),$=t,l=He(t,"search"),C=He(t,"activeStatuses"),m=He(t,"browserFilter"),D=O(!1),K=O(!1),E=[{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 N(h){C.value.indexOf(h)>=0?C.value=C.value.filter(G=>G!==h):C.value=[...C.value,h]}const I=M(()=>{const h=new Set;for(const G of $.testCases){const te=G.browser?.projectName;te&&h.add(te)}const T=[{label:"All browsers",value:"all"}];for(const G of[...h].sort())T.push({label:G,value:G});return T});function A(h,T){return T==="failed"?h.status==="failed"||h.status==="timedOut"||h.status==="timedout":T==="flaky"?(h.retries??0)>0:h.status===T}const H=M(()=>{let h=$.testCases;if($.failureClusterFilter!=null&&(h=h.filter(T=>T.failureClusterId===$.failureClusterFilter)),C.value.length>0&&(h=h.filter(T=>C.value.some(G=>A(T,G)))),m.value!=="all"&&(h=h.filter(T=>T.browser?.projectName===m.value)),l.value){const T=l.value.toLowerCase();h=h.filter(G=>G.title.toLowerCase().includes(T)||G.location&&G.location.toLowerCase().includes(T))}return D.value&&(h=h.filter(T=>T.isNewRegression)),K.value&&(h=h.filter(T=>T.isNewFlaky)),h}),U=O(null),j=O("asc");function g(h){U.value!==h?(U.value=h,j.value="asc"):j.value==="asc"?j.value="desc":U.value=null}function f(h){return U.value!==h?"i-lucide-chevrons-up-down":j.value==="asc"?"i-lucide-chevron-up":"i-lucide-chevron-down"}function d(h,T){switch(T){case"browser":return h.browser?.projectName??"";case"title":return h.title??"";case"status":return h.status??"";case"duration":return h.duration??0;case"workerIndex":return h.workerIndex??-1;case"retries":return h.retries??0;case"wastedTimeMs":return h.wastedTimeMs??0;default:return""}}function c(h){if(h==null)return"";const T=Math.round(Math.abs(h));if(T===0)return"0s";const G=h<0?"−":"";if(T<1e3)return`${G}${T}ms`;const te=T/1e3;if(te<60)return`${G}${Number.isInteger(te)?te:te.toFixed(1)}s`;const de=Math.floor(te/60),Y=Math.round(te%60);return Y?`${G}${de}m ${Y}s`:`${G}${de}m`}const S=M(()=>{const h=H.value,T=U.value;if(!T)return h;const G=j.value==="asc"?1:-1;return[...h].sort((te,de)=>{const Y=d(te,T),v=d(de,T);return typeof Y=="number"&&typeof v=="number"?(Y-v)*G:String(Y).localeCompare(String(v))*G})}),y=M(()=>$.testCases.some(h=>(h.wastedTimeMs??0)>0)),x=M(()=>{const h=[{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 y.value&&h.push({key:"wastedTimeMs",label:"Wasted",sortable:!0,width:"6rem",align:"left"}),h.push({key:"actions",label:"Actions",sortable:!1,width:"7.5rem",align:"right"}),h}),P=M(()=>x.value.map(h=>h.width).join(" ")),Q=M(()=>y.value?"55rem":"49rem"),Z=M(()=>l.value!==""||C.value.length>0||m.value!=="all"||$.failureClusterFilter!=null),ne=O(null),ee=O(!1),B=O(null);function z(h){return h.scrollHeight-h.scrollTop-h.clientHeight<50}function i(h){const T=h.target;T&&(ee.value=!z(T))}me(()=>$.isLive,h=>{h||(ee.value=!1)}),me(()=>S.value.length,()=>{!$.isLive||ee.value||Ie(()=>ne.value?.scrollToBottom())});function ue(h){F(!1),B.value=h;const T=()=>{const G=S.value.findIndex(te=>te.id===h);G>=0&&ne.value?.scrollToItem(G,{behavior:"smooth"})};Ie(()=>{ne.value?T():setTimeout(T,60),setTimeout(()=>{B.value=null},3e3)})}return b({scrollToCase:ue}),(h,T)=>{const G=ke,te=Se,de=Xt,Y=hs,v=kt,q=vs,ae=Qn,se=ks,ge=be,Ce=bt,re=_e,we=rt("DynamicScrollerItem"),ze=rt("DynamicScroller"),ye=ct;return s(),a("div",ea,[u(q,{class:"mb-4 shrink-0"},{start:r(()=>[n("div",ta,[n("button",{class:J(["px-2 py-1 text-xs transition-colors",e(w)?"text-muted hover:bg-elevated/60":"bg-primary text-white dark:text-white"]),title:"Flat list",onClick:T[0]||(T[0]=p=>e(F)(!1))},[u(G,{name:"i-lucide-list",class:"size-3.5"})],2),n("button",{class:J(["px-2 py-1 text-xs transition-colors",e(w)?"bg-primary text-white dark:text-white":"text-muted hover:bg-elevated/60"]),title:"Tree view",onClick:T[1]||(T[1]=p=>e(F)(!0))},[u(G,{name:"i-lucide-folder-tree",class:"size-3.5"})],2)]),t.isLive?(s(),a("span",sa,[_(o(t.testCases.length)+" completed ",1),u(te,{topic:"run.live"})])):(s(),a("span",na,[_(o(S.value.length)+o(S.value.length!==t.testCases.length?` / ${t.testCases.length}`:"")+" cases ",1),u(te,{topic:"run.test-cases"})]))]),default:r(()=>[u(de,{modelValue:l.value,"onUpdate:modelValue":T[2]||(T[2]=p=>l.value=p),placeholder:"Search test cases...",icon:"i-lucide-search",size:"sm",class:"min-w-48 max-sm:flex-1"},null,8,["modelValue"]),n("div",aa,[(s(),a(V,null,oe(E,p=>n("button",{key:p.value,class:J(["inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium transition-colors whitespace-nowrap",C.value.includes(p.value)?p.color==="green"?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":p.color==="red"?"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400":p.color==="orange"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300":"bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700"]),onClick:ve=>N(p.value)},[n("span",{class:J(["size-2 rounded-full shrink-0",p.color==="green"?"bg-green-500":p.color==="red"?"bg-red-500":p.color==="orange"?"bg-orange-500":"bg-gray-400"])},null,2),_(" "+o(p.label),1)],10,oa)),64))]),u(Y,{modelValue:m.value,"onUpdate:modelValue":T[3]||(T[3]=p=>m.value=p),items:I.value,size:"sm",class:"w-36"},null,8,["modelValue","items"]),t.isLive?k("",!0):(s(),R(v,{key:0,modelValue:D.value,"onUpdate:modelValue":T[4]||(T[4]=p=>D.value=p),label:"New regressions",size:"sm"},null,8,["modelValue"])),t.isLive?k("",!0):(s(),R(v,{key:1,modelValue:K.value,"onUpdate:modelValue":T[5]||(T[5]=p=>K.value=p),label:"New flaky",size:"sm"},null,8,["modelValue"]))]),_:1}),e(w)&&t.testCases.length>0?(s(),R(ae,{key:0,"test-cases":S.value,suites:t.suites,"has-filter":Z.value,"highlighted-case-id":B.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(w)?k("",!0):(s(),a(V,{key:1},[S.value.length>0?(s(),a("div",ra,[n("div",{class:"flex flex-col h-full",role:"table","aria-label":"Test cases","aria-rowcount":S.value.length+1,style:he({minWidth:Q.value})},[n("div",{class:"grid shrink-0 bg-elevated/50 border-b border-default",role:"row",style:he({gridTemplateColumns:P.value})},[(s(!0),a(V,null,oe(x.value,p=>(s(),a(V,{key:p.key},[p.sortable?(s(),a("button",{key:0,type:"button",role:"columnheader","aria-sort":U.value===p.key?j.value==="asc"?"ascending":"descending":"none","aria-label":p.icon?p.label:void 0,title:p.icon?p.label:void 0,class:J(["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",p.align==="right"?"justify-end":""]),onClick:ve=>g(p.key)},[p.icon?(s(),R(G,{key:0,name:p.icon,class:"shrink-0 size-4"},null,8,["name"])):(s(),a("span",ua,o(p.label),1)),u(G,{name:f(p.key),class:J(["shrink-0 size-3.5",U.value===p.key?"":"opacity-40"])},null,8,["name","class"])],10,ia)):(s(),a("div",{key:1,role:"columnheader",class:J(["px-3 py-2 text-sm font-semibold",p.align==="right"?"text-right":""])},o(p.label),3))],64))),128))],4),u(ye,null,{fallback:r(()=>[n("div",$a,[u(G,{name:"i-lucide-loader-circle",class:"size-4 mr-2 animate-spin"}),T[9]||(T[9]=_(" Loading test cases… ",-1))])]),default:r(()=>[u(ze,{ref_key:"scrollerRef",ref:ne,items:S.value,"min-item-size":44,"key-field":"id",role:"rowgroup",class:"flex-1 min-h-0",onScrollPassive:i},{default:r(({item:p,index:ve,active:De})=>[u(we,{item:p,active:De,"size-dependencies":[p.title,p.location,p.isNewRegression,p.isNewFlaky],"data-index":ve},{default:r(()=>[n("div",{class:J(["grid items-center border-b border-default text-sm transition-colors hover:bg-gray-50 dark:hover:bg-gray-900/50",B.value===p.id?"animate-pulse bg-yellow-100 dark:bg-yellow-900/30":""]),role:"row",style:he({gridTemplateColumns:P.value})},[n("div",da,[u(se,{browser:p.browser},null,8,["browser"])]),n("div",ca,[n("div",ma,[p.isNewRegression?(s(),R(ge,{key:0,color:"error",variant:"solid",size:"xs",class:"uppercase tracking-wider"},{default:r(()=>[...T[6]||(T[6]=[_(" NEW ",-1)])]),_:1})):k("",!0),p.isNewFlaky?(s(),R(ge,{key:1,color:"info",variant:"solid",size:"xs",class:"uppercase tracking-wider"},{default:r(()=>[...T[7]||(T[7]=[_(" FLAKY ",-1)])]),_:1})):k("",!0),n("a",{href:`/test-run-cases/${p.id}`,class:"text-primary hover:underline font-medium truncate",title:p.title,onClick:Ue(Ze=>("navigateTo"in h?h.navigateTo:e(Xe))(`/test-run-cases/${p.id}`),["prevent"])},o(p.title),9,fa)]),p.location?(s(),R(Ce,{key:0,location:p.location,"project-key":t.projectKey,"project-name":t.projectName,class:"text-xs text-gray-400 dark:text-gray-500"},null,8,["location","project-key","project-name"])):k("",!0)]),n("div",ga,[u(ge,{color:("getStatusColor"in h?h.getStatusColor:e(Le))(p.status==="timedOut"||p.status==="timedout"?"failed":p.status),class:"capitalize"},{default:r(()=>[_(o(("formatStatusLabel"in h?h.formatStatusLabel:e(xt))(p.status)),1)]),_:2},1032,["color"])]),n("div",pa,[p.status==="running"?(s(),a("span",ya,"In progress...")):(s(),a("span",xa,o(c(p.duration)),1))]),n("div",ha,[p.workerIndex!=null?(s(),R(ge,{key:0,color:"neutral",variant:"soft",class:"font-mono text-xs"},{default:r(()=>[_(o(p.workerIndex),1)]),_:2},1024)):k("",!0)]),n("div",va,o(p.retries&&p.retries>0?p.retries:""),1),y.value?(s(),a("div",ka,[p.wastedTimeMs?(s(),a("span",ba,o(c(p.wastedTimeMs)),1)):(s(),a("span",_a,"—"))])):k("",!0),n("div",wa,[u(re,{to:`/test-run-cases/${p.id}`,size:"sm",variant:"outline"},{default:r(()=>[...T[8]||(T[8]=[_(" View details ",-1)])]),_:1},8,["to"])])],6)]),_:2},1032,["item","active","size-dependencies","data-index"])]),_:1},8,["items"])]),_:1})],12,la)])):t.testCases.length===0?(s(),a("div",Ca,[u(G,{name:"i-lucide-beaker",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),T[10]||(T[10]=n("p",null,"No test cases recorded for this run.",-1))])):(s(),a("div",Ra,[u(G,{name:"i-lucide-search-x",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),T[11]||(T[11]=n("p",null,"No test cases match your filters.",-1))]))],64))])}}}),Ia=Object.assign(Ta,{__name:"TestCasesList"}),Sa={key:2,class:"p-4"},za={key:3,class:"p-4"},Da={key:4,class:"p-4"},Fa={key:5,class:"space-y-6 p-4"},Pa={class:"flex items-center gap-1.5 text-sm text-muted"},ja={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},Ma={class:"space-y-1"},Na={class:"text-xl font-semibold"},Aa={key:0},Ba={key:1},Ua={class:"space-y-1"},La={key:1,class:"text-xl font-semibold text-muted"},Ea={class:"space-y-1"},Oa={class:"space-y-0.5 text-sm"},Wa={key:0,class:"text-red-500"},Ka={key:1,class:"text-green-600"},Ha={key:2,class:"text-purple-500"},Va={key:3,class:"text-muted"},Ga={class:"space-y-1"},Xa={class:"font-medium text-primary hover:underline truncate"},qa={class:"text-gray-400 text-xs ml-auto shrink-0"},Ya={class:"space-y-1"},Ja={class:"font-medium text-primary hover:underline truncate"},Za={class:"space-y-1"},Qa={class:"font-medium text-primary hover:underline truncate"},eo={class:"space-y-1"},to={class:"font-medium text-primary hover:underline truncate"},so={class:"text-gray-400 text-xs ml-auto shrink-0"},no={class:"space-y-1"},ao={class:"font-medium text-primary hover:underline truncate"},oo={class:"grid grid-cols-2 gap-4"},ro={key:0},lo={class:"space-y-1"},io={class:"text-red-500 font-mono shrink-0"},uo={class:"truncate text-primary hover:underline"},co={key:1},mo={class:"space-y-1"},fo={class:"text-green-500 font-mono shrink-0"},go={class:"truncate text-primary hover:underline"},po={class:"space-y-1"},yo={class:"flex-1 truncate text-primary hover:underline"},xo={class:"text-gray-500 font-mono text-xs shrink-0"},ho={class:"w-24 h-2 rounded-full bg-gray-100 shrink-0"},vo={key:0,class:"flex items-center gap-1.5 text-xs text-amber-600 mb-3"},ko={class:"flex items-end gap-2 h-20"},bo={class:"text-xs text-gray-500"},_o={class:"text-xs text-gray-400"},wo={class:"space-y-1"},$o={class:"truncate"},Co=fe({__name:"RunInsights",props:{testRunId:{},runStatus:{},refreshKey:{}},setup(t){const b=t,w=M(()=>{if(!l.value)return"";const N=l.value.passRateDelta;return N>0?"text-green-600":N<0?"text-red-600":"text-muted"}),F=M(()=>{if(!l.value)return"";const N=l.value.passRateDelta;return N>0?"i-lucide-trending-up":N<0?"i-lucide-trending-down":"i-lucide-minus"}),$=M(()=>l.value?.avgDurationDelta==null?"":l.value.avgDurationDelta>0?"text-red-600":"text-green-600"),l=O(null),C=O(!1),m=O(null),D=M(()=>b.runStatus==="running"||b.runStatus==="initialising"||b.runStatus==="finalizing");async function K(){if(!b.testRunId||D.value){l.value=null;return}C.value=!0,m.value=null;try{l.value=await $fetch(`/api/test-runs/${b.testRunId}/insights`)}catch(N){console.error("[RunInsights] failed to load",N),m.value=N?.data?.message||N?.message||"Failed to load insights"}finally{C.value=!1}}me(()=>b.testRunId,K,{immediate:!0}),me(()=>b.refreshKey,(N,I)=>{N!==I&&N!==void 0&&K()});function E(N){return N==null?"—":N<1e3?`${N}ms`:`${(N/1e3).toFixed(1)}s`}return(N,I)=>{const A=_e,H=_s,U=_t,j=wt,g=ke,f=Se,d=ws,c=be,S=Ne;return e(m)?(s(),R(H,{key:0,text:e(m),padded:""},{action:r(()=>[u(A,{size:"sm",onClick:K},{default:r(()=>[...I[0]||(I[0]=[_("Retry",-1)])]),_:1})]),_:1},8,["text"])):e(C)?(s(),R(U,{key:1,padded:""})):e(D)?(s(),a("div",Sa,[u(j,{icon:"i-lucide-loader-circle",text:"Run in progress"},{default:r(()=>[...I[1]||(I[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(l)?e(l).hasBaseline?(s(),a("div",Fa,[n("div",Pa,[u(g,{name:"i-lucide-sparkles",class:"size-4 shrink-0 text-primary/70"}),I[3]||(I[3]=n("span",null,"Automatic highlights from this run",-1)),u(f,{topic:"run.insights"})]),u(d,{icon:"i-lucide-bar-chart-3","icon-class":"text-blue-500",title:"Run summary"},{default:r(()=>[n("div",ja,[n("div",Ma,[I[4]||(I[4]=n("p",{class:"text-xs text-muted"},"Pass rate",-1)),n("p",Na,o(e(l).passRate)+"%",1),n("div",{class:J(["flex items-center gap-1 text-xs",e(w)])},[u(g,{name:e(F),class:"size-3.5"},null,8,["name"]),e(l).passRateDelta!==0?(s(),a("span",Aa,o(e(l).passRateDelta>0?"+":"")+o(e(l).passRateDelta)+"pp vs baseline",1)):(s(),a("span",Ba,"Same as baseline"))],2)]),n("div",Ua,[I[5]||(I[5]=n("p",{class:"text-xs text-muted"},"Avg duration",-1)),e(l).avgDurationDelta!==null?(s(),a("p",{key:0,class:J(["text-xl font-semibold",e($)])},o(e(l).avgDurationDelta>0?"+":"")+o(e(l).avgDurationDelta)+"% ",3)):(s(),a("p",La,"—")),I[6]||(I[6]=n("p",{class:"text-xs text-muted"},"vs baseline (passing tests)",-1))]),n("div",Ea,[I[7]||(I[7]=n("p",{class:"text-xs text-muted"},"Changes",-1)),n("div",Oa,[e(l).newRegressions.length>0?(s(),a("p",Wa," +"+o(e(l).newRegressions.length)+" regressed ",1)):k("",!0),e(l).recovered.length>0?(s(),a("p",Ka,"+"+o(e(l).recovered.length)+" fixed",1)):k("",!0),e(l).newFlaky.length>0?(s(),a("p",Ha,"+"+o(e(l).newFlaky.length)+" flaky",1)):k("",!0),!e(l).newRegressions.length&&!e(l).recovered.length&&!e(l).newFlaky.length?(s(),a("p",Va," No status changes ")):k("",!0)])])])]),_:1}),e(l).newRegressions.length>0?(s(),R(d,{key:0,icon:"i-lucide-alert-circle","icon-class":"text-red-500",title:"New regressions",count:e(l).newRegressions.length},{default:r(()=>[n("div",Ga,[(s(!0),a(V,null,oe(e(l).newRegressions,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[u(c,{color:"error",variant:"solid",size:"xs"},{default:r(()=>[...I[8]||(I[8]=[_("NEW",-1)])]),_:1}),n("span",Xa,o(y.title),1),n("span",qa,o(E(y.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).recurrences.length>0?(s(),R(d,{key:1,icon:"i-lucide-refresh-cw","icon-class":"text-amber-500",title:"Recurring failures",count:e(l).recurrences.length},{default:r(()=>[n("div",Ya,[(s(!0),a(V,null,oe(e(l).recurrences,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[u(c,{color:"warning",variant:"solid",size:"xs"},{default:r(()=>[...I[9]||(I[9]=[_("RECURRING",-1)])]),_:1}),n("span",Ja,o(y.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).recovered.length>0?(s(),R(d,{key:2,icon:"i-lucide-check-circle","icon-class":"text-green-500",title:"Fixed tests",count:e(l).recovered.length},{default:r(()=>[n("div",Za,[(s(!0),a(V,null,oe(e(l).recovered,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[u(c,{color:"success",variant:"solid",size:"xs"},{default:r(()=>[...I[10]||(I[10]=[_("FIXED",-1)])]),_:1}),n("span",Qa,o(y.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).newFlaky.length>0?(s(),R(d,{key:3,icon:"i-lucide-flask","icon-class":"text-purple-500",title:"New flaky tests",count:e(l).newFlaky.length},{default:r(()=>[n("div",eo,[(s(!0),a(V,null,oe(e(l).newFlaky,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[u(c,{color:"info",variant:"solid",size:"xs"},{default:r(()=>[...I[11]||(I[11]=[_("FLAKY",-1)])]),_:1}),n("span",to,o(y.title),1),n("span",so,o(E(y.duration)),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).flakyOnRetry.length>0?(s(),R(d,{key:4,icon:"i-lucide-repeat","icon-class":"text-orange-500",title:"Passed on retry",count:e(l).flakyOnRetry.length,subtitle:"Tests that passed but needed one or more retries"},{default:r(()=>[n("div",no,[(s(!0),a(V,null,oe(e(l).flakyOnRetry,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[u(c,{color:"warning",variant:"subtle",size:"xs"},{default:r(()=>[_("×"+o(y.retries),1)]),_:2},1024),n("span",ao,o(y.title),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0),e(l).mostRegressed.length>0||e(l).mostImproved.length>0?(s(),R(d,{key:5,icon:"i-lucide-trending-up","icon-class":"text-blue-500",title:"Performance changes"},{default:r(()=>[n("div",oo,[e(l).mostRegressed.length>0?(s(),a("div",ro,[I[12]||(I[12]=n("p",{class:"text-xs font-medium text-red-500 mb-2"},"Most regressed",-1)),n("div",lo,[(s(!0),a(V,null,oe(e(l).mostRegressed,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[n("span",io,"+"+o(y.pctChange)+"%",1),n("span",uo,o(y.title),1)]),_:2},1032,["to"]))),128))])])):k("",!0),e(l).mostImproved.length>0?(s(),a("div",co,[I[13]||(I[13]=n("p",{class:"text-xs font-medium text-green-500 mb-2"},"Most improved",-1)),n("div",mo,[(s(!0),a(V,null,oe(e(l).mostImproved,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[n("span",fo,o(y.pctChange)+"%",1),n("span",go,o(y.title),1)]),_:2},1032,["to"]))),128))])])):k("",!0)])]),_:1})):k("",!0),e(l).slowestTests.length>0?(s(),R(d,{key:6,icon:"i-lucide-clock","icon-class":"text-amber-500",title:"Slowest tests"},{default:r(()=>[n("div",po,[(s(!0),a(V,null,oe(e(l).slowestTests,y=>(s(),R(S,{key:y.testRunsCaseId,to:`/test-run-cases/${y.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:r(()=>[n("div",yo,o(y.title),1),n("div",xo,o(E(y.duration)),1),n("div",ho,[n("div",{class:"h-full rounded-full bg-amber-400",style:he({width:Math.min(100,y.duration/(e(l).slowestTests[0]?.duration||1)*100)+"%"})},null,4)])]),_:2},1032,["to"]))),128))])]),_:1})):k("",!0),e(l).workerImbalance.length>1?(s(),R(d,{key:7,icon:"i-lucide-users","icon-class":"text-gray-500",title:"Worker distribution"},{default:r(()=>[e(l).workerImbalanceWarning?(s(),a("div",vo,[u(g,{name:"i-lucide-alert-triangle",class:"size-3.5 shrink-0"}),n("span",null,o(e(l).workerImbalanceWarning),1)])):k("",!0),n("div",ko,[(s(!0),a(V,null,oe(e(l).workerImbalance,y=>(s(),a("div",{key:y.workerIndex,class:"flex-1 flex flex-col items-center gap-1"},[n("span",bo,o(y.count),1),n("div",{class:"w-full bg-blue-400 rounded-t",style:he({height:Math.max(4,y.count/Math.max(...e(l).workerImbalance.map(x=>x.count))*60)+"px"})},null,4),n("span",_o,"W"+o(y.workerIndex),1)]))),128))])]),_:1})):k("",!0),e(l).clusterNew.length>0?(s(),R(d,{key:8,icon:"i-lucide-layers","icon-class":"text-purple-500",title:"New failure clusters",count:e(l).clusterNew.length},{default:r(()=>[n("div",wo,[(s(!0),a(V,null,oe(e(l).clusterNew,y=>(s(),R(S,{key:y.clusterId,to:`/failure-clusters/${y.clusterId}`,class:"flex items-center gap-2 text-sm text-primary hover:underline"},{default:r(()=>[n("span",$o,o(y.signature),1)]),_:2},1032,["to"]))),128))])]),_:1},8,["count"])):k("",!0)])):(s(),a("div",Da,[u(j,{icon:"i-lucide-git-compare-arrows",text:"No baseline run found"},{default:r(()=>[...I[2]||(I[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",za,[u(j,{text:"No insights yet"})]))}}}),Ro=Object.assign(Co,{__name:"RunInsights"}),To=fe({__name:"ClusterDiagnosis",props:{clusterId:{}},setup(t){return(b,w)=>{const F=$s;return s(),R(F,{"cluster-id":t.clusterId},null,8,["cluster-id"])}}}),Io=Object.assign(To,{__name:"ClusterDiagnosis"}),So={class:"pt-4 space-y-3"},zo={key:0,class:"flex items-center justify-center py-8 text-gray-500 gap-2"},Do={class:"flex items-center justify-between gap-3"},Fo={class:"text-sm text-gray-500 dark:text-gray-400 inline-flex items-center gap-1"},Po={class:"min-w-0 space-y-0.5"},jo=["title"],Mo={key:0,class:"text-xs text-gray-500 truncate block"},No={class:"font-mono"},Ao={key:1,class:"text-gray-400 text-xs"},Bo={key:1,class:"text-gray-400 text-xs"},Uo={class:"text-sm tabular-nums"},Lo={key:0,class:"flex flex-wrap gap-1"},Eo={key:1,class:"text-gray-400 text-xs"},Oo={key:0,class:"flex items-center gap-1 text-xs text-gray-500"},Wo={key:2,class:"text-gray-400 text-xs"},Ko={key:0,class:"text-xs font-medium text-warning-500"},Ho={key:1,class:"text-sm text-gray-500 whitespace-nowrap"},Vo={key:0,class:"ml-1 text-xs text-gray-400"},Go={class:"flex justify-end gap-2"},Xo={key:2,class:"flex flex-col items-center justify-center py-8 text-gray-500 gap-2"},qo=fe({__name:"FailureGroups",props:{refreshKey:{}},emits:["selectCluster"],async setup(t,{emit:b}){let w,F;const $=b,l=t,m=Ae().params.id,{data:D,pending:K,refresh:E}=([w,F]=je(()=>Me(`/api/test-runs/${m}/failure-groups`,{lazy:!0,server:!1},"$qddF1IOQ64")),w=await w,F(),w);me(()=>l.refreshKey,(d,c)=>{d!==c&&d!==void 0&&E()});const N=O(null),{copy:I,copied:A}=Ye(),H=M(()=>D.value?D.value.flatMap(d=>d.cases.filter(c=>!c.passedOnRetry).map(c=>({filePath:c.filePath,title:c.title,line:null,projectName:null}))):[]),U=M(()=>vt(H.value));function j(){const d=U.value;d&&I(d,{toast:"Retry command copied"})}const g=[{accessorKey:"signature",header:ie("Signature")},{accessorKey:"errorType",header:ie("Type")},{accessorKey:"status",header:ie("Status")},{accessorKey:"caseCount",header:ie("Tests")},{accessorKey:"signals",header:"Signals"},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"firstSeenRunId",header:ie("Known since")},{id:"actions",header:"Actions"}],f=M(()=>D.value?.reduce((d,c)=>d+c.caseCount,0)??0);return(d,c)=>{const S=ke,y=Se,x=_e,P=be,Q=Ne,Z=Je,ne=$t,ee=qe,B=Io,z=Ct;return s(),a(V,null,[n("div",So,[e(K)?(s(),a("div",zo,[u(S,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),c[2]||(c[2]=n("span",null,"Grouping failures...",-1))])):e(D)&&e(D).length?(s(),a(V,{key:1},[n("div",Do,[n("p",Fo,[_(o(e(f))+" failing "+o(e(f)===1?"test":"tests")+" across "+o(e(D).length)+" "+o(e(D).length===1?"group":"groups")+" ",1),u(y,{topic:"cluster.concept"})]),e(H).length>0?(s(),R(x,{key:0,size:"xs",variant:"outline",color:"neutral",icon:e(A)?"i-lucide-check":"i-lucide-play",title:e(A)?"Copied!":("copyPreview"in d?d.copyPreview:e(yt))(e(U)),onClick:c[0]||(c[0]=i=>j())},{default:r(()=>[...c[3]||(c[3]=[_(" Copy retry command ",-1)])]),_:1},8,["icon","title"])):k("",!0)]),u(ee,{ui:{body:"p-0 sm:p-0"}},{default:r(()=>[u(ne,{"min-width":"46rem",bleed:!1},{default:r(()=>[u(Z,{data:e(D),columns:g},{"actions-header":r(()=>[...c[4]||(c[4]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":r(({row:i})=>[n("div",Po,[n("span",{class:J(["text-sm block truncate",i.original.title?"":"font-mono"]),title:i.original.signature},o(i.original.title||i.original.signature),11,jo),i.original.selector?(s(),a("span",Mo,[c[5]||(c[5]=_(" Locator: ",-1)),n("code",No,o(i.original.selector),1)])):k("",!0)])]),"errorType-cell":r(({row:i})=>[i.original.errorType?(s(),R(P,{key:0,color:("clusterErrorTypeColor"in d?d.clusterErrorTypeColor:e(xs))(i.original.errorType),variant:"subtle",size:"sm"},{default:r(()=>[_(o(i.original.errorType),1)]),_:2},1032,["color"])):(s(),a("span",Ao,"—"))]),"status-cell":r(({row:i})=>[i.original.status?(s(),R(P,{key:0,color:("clusterStatusColor"in d?d.clusterStatusColor:e(ys))(i.original.status),variant:"subtle",size:"sm"},{default:r(()=>[_(o(i.original.status),1)]),_:2},1032,["color"])):(s(),a("span",Bo,"—"))]),"caseCount-cell":r(({row:i})=>[n("span",Uo,o(i.original.caseCount),1)]),"signals-cell":r(({row:i})=>[i.original.isNew||i.original.flaky||i.original.workerCorrelated||i.original.locatorHealing?(s(),a("div",Lo,[i.original.isNew?(s(),R(P,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:r(()=>[...c[6]||(c[6]=[_(" New ",-1)])]),_:1})):k("",!0),i.original.flaky?(s(),R(P,{key:1,color:"warning",variant:"outline",size:"sm"},{default:r(()=>[...c[7]||(c[7]=[_(" Flaky ",-1)])]),_:1})):k("",!0),i.original.workerCorrelated?(s(),R(P,{key:2,color:"info",variant:"outline",size:"sm",title:"All failures ran on the same worker"},{default:r(()=>[...c[8]||(c[8]=[_(" Same worker ",-1)])]),_:1})):k("",!0),i.original.locatorHealing?.healed?(s(),R(P,{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:r(()=>[...c[9]||(c[9]=[_(" Healed ",-1)])]),_:1})):i.original.locatorHealing?(s(),R(P,{key:4,color:"success",variant:"outline",size:"sm",icon:"i-lucide-bandage",title:`Locator fix available: ${i.original.locatorHealing.recommended} — open the cluster to apply it`},{default:r(()=>[...c[10]||(c[10]=[_(" Locator fix ",-1)])]),_:1},8,["title"])):k("",!0)])):(s(),a("span",Eo,"—"))]),"diagnosis-cell":r(({row:i})=>[i.original.diagnosis?.status==="running"?(s(),a("div",Oo,[u(S,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),c[11]||(c[11]=_(" Running ",-1))])):i.original.diagnosis?.status==="completed"&&i.original.diagnosis.category?(s(),R(P,{key:1,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:r(()=>[u(S,{name:"i-lucide-sparkles",class:"size-3"}),_(" "+o(i.original.diagnosis.category),1)]),_:2},1024)):(s(),a("span",Wo,"—"))]),"firstSeenRunId-cell":r(({row:i})=>[i.original.isNew?(s(),a("span",Ko,"New in this run")):(s(),a("div",Ho,[u(Q,{to:`/test-runs/${i.original.firstSeenRunId}`,class:"text-primary hover:underline"},{default:r(()=>[_(" run #"+o(i.original.firstSeenRunId),1)]),_:2},1032,["to"]),i.original.firstSeenAt?(s(),a("span",Vo," ("+o(("formatRelativeTime"in d?d.formatRelativeTime:e(ht))(i.original.firstSeenAt))+") ",1)):k("",!0)]))]),"actions-cell":r(({row:i})=>[n("div",Go,[u(x,{size:"sm",color:"primary",variant:"soft",onClick:ue=>$("selectCluster",i.original.clusterId)},{default:r(()=>[...c[12]||(c[12]=[_(" Filter ",-1)])]),_:1},8,["onClick"]),u(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-sparkles",onClick:ue=>N.value=i.original.clusterId},{default:r(()=>[...c[13]||(c[13]=[_(" Diagnose ",-1)])]),_:1},8,["onClick"]),u(x,{to:`/failure-clusters/${i.original.clusterId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:r(()=>[...c[14]||(c[14]=[_(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data"])]),_:1})]),_:1})],64)):(s(),a("div",Xo,[u(S,{name:"i-lucide-party-popper",class:"size-6"}),c[15]||(c[15]=n("span",null,"No failure groups — failed tests without error details are not grouped",-1))]))]),u(z,{open:e(N)!==null,title:"AI Diagnosis",ui:{content:"max-w-2xl"},"onUpdate:open":c[1]||(c[1]=i=>{i||(N.value=null)})},{body:r(()=>[e(N)!==null?(s(),R(B,{key:0,"cluster-id":e(N)},null,8,["cluster-id"])):k("",!0)]),_:1},8,["open"])],64)}}}),Yo=Object.assign(qo,{__name:"FailureGroups"}),Jo={class:"pt-4"},Zo={key:2,class:"space-y-4"},Qo={class:"flex flex-wrap items-center gap-2 text-sm"},er={class:"text-gray-500 inline-flex items-center gap-1"},tr={key:0,class:"text-gray-400"},sr={key:0,class:"flex flex-wrap items-center gap-2"},nr={class:"text-sm text-gray-500"},ar={key:1,class:"flex items-center gap-2"},or={class:"text-sm text-gray-500"},rr={class:"space-y-3"},lr={class:"flex items-center gap-2 text-sm font-medium"},ir={class:"flex flex-wrap items-center gap-2 text-sm font-mono"},ur={key:0,class:"text-xs text-gray-400 font-sans"},dr={class:"flex flex-wrap items-center gap-2"},cr={class:"flex items-center gap-1.5 flex-1 min-w-0"},mr={class:"flex-1 text-xs bg-gray-100 dark:bg-gray-800 px-3 py-1.5 rounded font-mono truncate select-all"},fr={key:3,class:"text-sm text-gray-500 flex items-center gap-2"},gr={class:"px-4 py-3 text-sm font-medium flex items-center gap-2 border-b border-default"},pr={class:"overflow-x-auto"},yr={class:"w-full min-w-[36rem] text-sm"},xr={class:"px-4 py-2 text-gray-500"},hr={class:"px-4 py-2 font-mono text-xs"},vr={key:0,class:"text-green-700 dark:text-green-400"},kr={key:1,class:"text-gray-400"},br={class:"px-4 py-2 font-mono text-xs"},_r={key:0,class:"text-red-700 dark:text-red-400"},wr={key:1,class:"text-gray-400"},$r=fe({__name:"RegressionContext",props:{refreshKey:{}},async setup(t){let b,w;const $=Ae().params.id,l=t,{data:C,pending:m,refresh:D}=([b,w]=je(()=>Me(`/api/test-runs/${$}/regression-context`,{lazy:!0,server:!1},"$AcrCJopY1M")),b=await b,w(),b);me(()=>l.refreshKey,(I,A)=>{I!==A&&I!==void 0&&D()});const{copy:K,copied:E}=Ye();function N(){K(C.value?.commitRange?.gitCommand)}return(I,A)=>{const H=_t,U=wt,j=ke,g=Se,f=Ne,d=be,c=_e,S=qe;return s(),a("div",Jo,[e(m)?(s(),R(H,{key:0,text:"Looking for last passing run…"})):e(C)?.hasGreen?(s(),a("div",Zo,[n("div",Qo,[u(j,{name:"i-lucide-circle-check",class:"size-4 text-green-500 shrink-0"}),n("span",er,[A[0]||(A[0]=_("Last passing run: ",-1)),u(g,{topic:"run.regression"})]),u(f,{to:`/test-runs/${e(C).lastGreenRunId}`,class:"font-medium text-primary hover:underline"},{default:r(()=>[_(" Run #"+o(e(C).lastGreenRunId),1)]),_:1},8,["to"]),e(C).lastGreenRunAt?(s(),a("span",tr," ("+o(("formatRelativeTime"in I?I.formatRelativeTime:e(ht))(e(C).lastGreenRunAt))+") ",1)):k("",!0)]),(e(C).newFailures??0)>0?(s(),a("div",sr,[u(d,{color:"error",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(C).newFailures)+" new "+o(e(C).newFailures===1?"failure":"failures"),1)]),_:1}),n("span",nr,o(e(C).newFailures===1?"test":"tests")+" that "+o((e(C).newFailures===1,"passed"))+" in run #"+o(e(C).lastGreenRunId)+" but "+o(e(C).newFailures===1?"fails":"fail")+" here ",1)])):(s(),a("div",ar,[u(d,{color:"warning",variant:"soft",size:"lg"},{default:r(()=>[...A[1]||(A[1]=[_(" No new regressions ",-1)])]),_:1}),n("span",or,"All failing tests were also failing before run #"+o(e(C).lastGreenRunId),1)])),e(C).commitRange?(s(),R(S,{key:2,ui:{body:"p-4 sm:p-4"}},{default:r(()=>[n("div",rr,[n("div",lr,[u(j,{name:"i-lucide-git-commit-horizontal",class:"size-4"}),A[2]||(A[2]=_(" Commits introduced since last passing run ",-1))]),n("div",ir,[u(d,{color:"success",variant:"soft",size:"sm"},{default:r(()=>[_(o(e(C).commitRange.fromShort),1)]),_:1}),u(j,{name:"i-lucide-arrow-right",class:"size-3 text-gray-400"}),u(d,{color:"error",variant:"soft",size:"sm"},{default:r(()=>[_(o(e(C).commitRange.toShort),1)]),_:1}),e(C).currentBranch||e(C).lastGreenBranch?(s(),a("span",ur," on "+o(e(C).currentBranch||e(C).lastGreenBranch),1)):k("",!0)]),n("div",dr,[e(C).commitRange.compareUrl?(s(),R(c,{key:0,to:e(C).commitRange.compareUrl,target:"_blank",external:"",icon:"i-lucide-external-link",size:"sm",variant:"soft",color:"primary"},{default:r(()=>[...A[3]||(A[3]=[_(" View commits ",-1)])]),_:1},8,["to"])):k("",!0),n("div",cr,[n("code",mr,o(e(C).commitRange.gitCommand),1),u(c,{icon:e(E)?"i-lucide-check":"i-lucide-clipboard",size:"xs",color:"neutral",variant:"ghost",title:e(E)?"Copied!":"Copy git command",onClick:N},null,8,["icon","title"])])])])]),_:1})):!e(C).currentCommit||!e(C).lastGreenCommit?(s(),a("div",fr,[u(j,{name:"i-lucide-git-branch",class:"size-4 shrink-0"}),A[4]||(A[4]=_(" No commit info available — enable ",-1)),A[5]||(A[5]=n("code",{class:"font-mono text-xs"},"collectScmInfo: true",-1)),A[6]||(A[6]=_(" in the reporter to see commit ranges ",-1))])):k("",!0),e(C).metadataDiff&&e(C).metadataDiff.length>0?(s(),R(S,{key:4,ui:{body:"p-0 sm:p-0"}},{default:r(()=>[n("div",gr,[u(j,{name:"i-lucide-sliders-horizontal",class:"size-4"}),A[7]||(A[7]=_(" What changed between runs ",-1))]),n("div",pr,[n("table",yr,[A[8]||(A[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(V,null,oe(e(C).metadataDiff,y=>(s(),a("tr",{key:y.key,class:"border-b last:border-b-0 border-default"},[n("td",xr,o(y.label),1),n("td",hr,[y.before?(s(),a("span",vr,o(y.before),1)):(s(),a("span",kr,"—"))]),n("td",br,[y.after?(s(),a("span",_r,o(y.after),1)):(s(),a("span",wr,"—"))])]))),128))])])])]),_:1})):k("",!0)])):(s(),R(U,{key:1,icon:"i-lucide-history",text:"No previous passing run found for this project"}))])}}}),Cr=Object.assign($r,{__name:"RegressionContext"}),Rr={class:"flex items-center justify-between mb-2"},Tr={class:"text-xs text-gray-500 inline-flex items-center gap-1"},Ir={class:"flex items-center gap-1"},Sr={class:"p-2 flex flex-col gap-2 min-w-56"},zr=fe({__name:"TimelineHeader",props:{workerCount:{},shardTotal:{},testCount:{},hookCount:{},waitCount:{},spanTypes:{},live:{type:Boolean}},emits:["reset","toggleSpan"],setup(t){return(b,w)=>{const F=Se,$=_e,l=kt,C=dt;return s(),a("div",Rr,[n("span",Tr,[n("span",null,[_(o(t.workerCount)+" worker"+o(t.workerCount>1?"s":"")+" ",1),t.shardTotal&&t.shardTotal>1?(s(),a(V,{key:0},[_(" · "+o(t.shardTotal)+" shard"+o(t.shardTotal>1?"s":""),1)],64)):k("",!0),_(" · "+o(t.testCount)+" tests ",1),t.hookCount>0?(s(),a(V,{key:1},[_(" · "+o(t.hookCount)+" hooks ",1)],64)):k("",!0),t.waitCount>0?(s(),a(V,{key:2},[_(" · "+o(t.waitCount)+" waits ",1)],64)):k("",!0)]),u(F,{topic:"run.timeline"})]),n("div",Ir,[t.spanTypes.length>1?(s(),R(C,{key:0,content:{align:"end"}},{content:r(()=>[n("div",Sr,[(s(!0),a(V,null,oe(t.spanTypes,m=>(s(),R(l,{key:m.key,"model-value":m.checked,label:m.label,"onUpdate:modelValue":D=>b.$emit("toggleSpan",m.key,D===!0)},null,8,["model-value","label","onUpdate:modelValue"]))),128))])]),default:r(()=>[u($,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list-filter","trailing-icon":"i-lucide-chevron-down",title:"Show or hide span types"},{default:r(()=>[...w[1]||(w[1]=[_(" Span types ",-1)])]),_:1})]),_:1})):k("",!0),t.live?k("",!0):(s(),R($,{key:1,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-rotate-ccw",onClick:w[0]||(w[0]=m=>b.$emit("reset"))},{default:r(()=>[...w[2]||(w[2]=[_(" Reset view ",-1)])]),_:1}))])])}}}),Dr=Object.assign(zr,{__name:"TimelineHeader"}),Ee={barHeight:24,rowGap:8,labelWidth:80,sidePadding:16,axisHeight:28,get rowHeight(){return this.barHeight+this.rowGap}},Fr={passed:"#16a34a",failed:"#dc2626",timedOut:"#ea580c",running:"#2563eb",initialising:"#2563eb",skipped:"#9ca3af",cancelled:"#a1a1aa",interrupted:"#ea580c",flaky:"#ca8a04"},Te={fill:"#facc15",stroke:"#ca8a04",swatch:"#f59e0b"};function We(t){return Fr[t]||"#a1a1aa"}function Rt(t){return We(t)+"66"}function Tt(t){return We(t)}function Oe(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 Pr=["y","width","height"],jr=["y1","x2","y2"],Mr=["x1","y1","x2","y2"],Nr=["x1","y1","x2","y2"],Ar=["x","y"],Br=["y"],Ur=fe({__name:"TimelineGrid",props:{workerRows:{},shardGroups:{},tickMarks:{},contentWidth:{},shardTotal:{}},setup(t){const{barHeight:b,rowGap:w,axisHeight:F,rowHeight:$}=Ee;return(l,C)=>(s(),a("g",null,[(s(!0),a(V,null,oe(t.workerRows,(m,D)=>(s(),a("rect",{key:"bg-"+D,x:0,y:D*e($)+e(F),width:t.contentWidth,height:e($),class:J(D%2===1?"fill-black/[0.03] dark:fill-white/[0.03]":"fill-transparent")},null,10,Pr))),128)),(s(!0),a(V,null,oe(t.shardGroups.slice(1),m=>(s(),a("line",{key:"shard-sep-"+m.rowRange[0],x1:0,y1:m.rowRange[0]*e($)+e(F)-e(w)/2,x2:t.contentWidth,y2:m.rowRange[0]*e($)+e(F)-e(w)/2,stroke:"currentColor","stroke-dasharray":"4,3",class:"stroke-gray-400 dark:stroke-gray-500"},null,8,jr))),128)),n("line",{x1:e(Ee).labelWidth,y1:e(F),x2:t.contentWidth,y2:e(F),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,Mr),(s(!0),a(V,null,oe(t.tickMarks,m=>(s(),a("g",{key:m.ms},[n("line",{x1:m.x,y1:e(F)-4,x2:m.x,y2:e(F),stroke:"currentColor",class:"stroke-gray-300 dark:stroke-gray-600"},null,8,Nr),n("text",{x:m.x,y:e(F)-8,"text-anchor":"middle",class:"fill-gray-400 text-[10px]"},o(m.label),9,Ar)]))),128)),(s(!0),a(V,null,oe(t.workerRows,(m,D)=>(s(),a("text",{key:"label-"+D,x:6,y:D*e($)+e(F)+e(b)/2+4,class:"fill-gray-500 text-[11px] font-medium"},o(m.shardIndex!=null&&t.shardTotal&&t.shardTotal>1?`S${m.shardIndex} W${m.workerIndex}`:`Worker ${m.workerIndex}`),9,Br))),128))]))}}),Lr=Object.assign(Ur,{__name:"TimelineGrid"}),Er=["x","y","width","height","fill","stroke"],Or=["x","y"],Wr=["x","y","width","height","fill","stroke"],Kr=["x1","y1","x2","y2","stroke"],Hr=["x1","y1","x2","y2","stroke"],Vr=["x","y"],Gr=["cx","cy"],Xr=["cx","cy"],qr=["x","y","width","height","fill"],Yr=["x","y"],Jr=fe({__name:"TimelineBar",props:{item:{},x:{},y:{},width:{}},emits:["select","hover","move","leave"],setup(t,{emit:b}){const w=t,F=b,{barHeight:$}=Ee,l=M(()=>["setup","hook","fixture"].includes(w.item.kind)),C=M(()=>w.item.testCaseId!=null),m=M(()=>C.value?"cursor-pointer":"cursor-default");function D(){w.item.testCaseId!=null&&F("select",w.item.testCaseId)}return(K,E)=>(s(),a("g",{class:"timeline-bar-group",onMouseenter:E[0]||(E[0]=N=>F("hover",t.item,N)),onMousemove:E[1]||(E[1]=N=>F("move",N)),onMouseleave:E[2]||(E[2]=N=>F("leave"))},[l.value?(s(),a(V,{key:0},[n("rect",{x:t.x,y:t.y,width:t.width,height:e($),rx:3,ry:3,fill:e(Rt)(t.item.status),stroke:e(Tt)(t.item.status),"stroke-width":"1","stroke-dasharray":"3,2",class:J(["timeline-bar-shape transition-opacity duration-100 opacity-80",m.value]),onClick:D},null,10,Er),t.width>60?(s(),a("text",{key:0,x:t.x+4,y:t.y+e($)/2+4,class:"fill-gray-600 dark:fill-gray-300 text-[9px] font-medium pointer-events-none"},o(t.item.title),9,Or)):k("",!0)],64)):t.item.kind==="wait"?(s(),a(V,{key:1},[n("rect",{x:t.x,y:t.y-3,width:t.width,height:e($)+6,rx:2,ry:2,fill:e(Te).fill,"fill-opacity":"0.28",stroke:e(Te).stroke,"stroke-width":"1.5",class:J(["timeline-bar-shape transition-opacity duration-100 opacity-90",m.value]),onClick:D},null,10,Wr),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($)+3,stroke:e(Te).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,Kr)):k("",!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($)+3,stroke:e(Te).stroke,"stroke-width":"1","stroke-opacity":"0.25",class:"pointer-events-none"},null,8,Hr)):k("",!0),t.width>50?(s(),a("text",{key:2,x:t.x+4,y:t.y+e($)/2+4,class:"fill-yellow-800 dark:fill-yellow-200 text-[9px] font-bold pointer-events-none"}," wasted "+o(e(Oe)(t.item.duration)),9,Vr)):k("",!0)],64)):t.item.status==="running"?(s(),a(V,{key:2},[n("circle",{cx:t.x+6,cy:t.y+e($)/2,r:"3",fill:"#2563eb",filter:"url(#glow)",class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:D},null,8,Gr),n("circle",{cx:t.x+6,cy:t.y+e($)/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:D},null,8,Xr)],64)):(s(),a(V,{key:3},[n("rect",{x:t.x,y:t.y,width:t.width,height:e($),rx:3,ry:3,fill:e(We)(t.item.status),class:"timeline-bar-shape transition-opacity duration-100 cursor-pointer opacity-90",onClick:D},null,8,qr),t.width>40?(s(),a("text",{key:0,x:t.x+4,y:t.y+e($)/2+4,class:"fill-white text-[10px] font-medium pointer-events-none"},o(e(Oe)(t.item.duration)),9,Yr)):k("",!0)],64))],32))}}),Zr=Object.assign(Jr,{__name:"TimelineBar"}),Qr={class:"flex items-center gap-2 mb-1"},el={class:"font-medium text-gray-900 dark:text-white max-w-64 truncate"},tl={class:"flex items-center gap-3 text-gray-500"},sl={class:"capitalize"},nl={key:0,class:"italic truncate max-w-48"},al=340,ol=fe({__name:"TimelineTooltip",props:{item:{},pos:{}},setup(t){const b=t,w=M(()=>{const $=b.item;return $?$.kind==="test"?{backgroundColor:We($.status)}:$.kind==="wait"?{backgroundColor:Te.swatch+"66",borderColor:Te.swatch}:{backgroundColor:Rt($.status),borderColor:Tt($.status)}:{}}),F=M(()=>{const{x:$,y:l}=b.pos;if(typeof window>"u")return{left:`${$+12}px`,top:`${l-10}px`};const C=$+12+al>window.innerWidth,m=l+90>window.innerHeight;return{left:C?void 0:`${$+12}px`,right:C?`${window.innerWidth-$+12}px`:void 0,top:m?void 0:`${l-10}px`,bottom:m?`${window.innerHeight-l+10}px`:void 0}});return($,l)=>(s(),R(Yt,{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:he(F.value)},[n("div",Qr,[n("span",{class:J(["inline-block size-2.5 rounded-full shrink-0",{"border border-dashed":t.item.kind!=="test"}]),style:he(w.value)},null,6),n("span",el,[t.item.kind!=="test"?(s(),a("span",{key:0,class:J(["uppercase text-[10px] tracking-wider mr-1",t.item.kind==="wait"?"text-amber-500":"text-gray-500"])},o(t.item.kind),3)):k("",!0),_(" "+o(t.item.title),1)])]),n("div",tl,[n("span",sl,o(t.item.status),1),n("span",null,o(e(Oe)(t.item.duration)),1),n("span",null,"Worker "+o(t.item.workerIndex),1),t.item.parentTitle?(s(),a("span",nl," for "+o(t.item.parentTitle),1)):k("",!0)])],4)):k("",!0)]))}}),rl=Object.assign(ol,{__name:"TimelineTooltip"}),ll=["Wait for timeout*","*waitForTimeout*"];function il(t){const b=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp(`^${b}$`,"i")}const lt=new Map;function ul(t){let b=lt.get(t);return b||(b=il(t),lt.set(t,b)),b}function dl(t,b){if(!b||b.length===0)return!1;const w=t.title??"",F=t.location??"";for(const $ of b){const l=ul($);if(l.test(w)||F&&l.test(F))return!0}return!1}function cl(t){const b=new Map;for(const w of t){const F=w.workerIndex;if(F==null||F<0)continue;const $=w.shardIndex??null,l=`${$??"null"}|${F}`;let C=b.get(l);C||(C={shardIndex:$,workerIndex:F,cases:[]},b.set(l,C)),C.cases.push(w)}return[...b.values()].sort((w,F)=>{const $=w.shardIndex??1/0,l=F.shardIndex??1/0;return $!==l?$-l:w.workerIndex-F.workerIndex})}function Be(t){if(t==null)return null;if(typeof t=="number")return Number.isFinite(t)?t:null;if(t instanceof Date)return t.getTime();const b=new Date(t).getTime();return Number.isNaN(b)?null:b}function ml(t,b){return t.category==="wait"?dl(t,b)?"wait":null:t.category==="hook"||t.category==="fixture"?t.category:null}function fl(t){const b=M(()=>t.wastedPatterns&&t.wastedPatterns.length>0?t.wastedPatterns:ll),w=M(()=>cl(t.testCases)),F=M(()=>{const m=w.value,D=b.value;let K=1/0;for(const H of m)for(const U of H.cases){const j=Be(U.startedAt);j!=null&&j>0&&(K=Math.min(K,j))}const E=Number.isFinite(K),N=H=>Math.max(0,(Be(H)??K)-K),I=[],A=new Map;if(m.forEach((H,U)=>{const j=[],g=E?H.cases:[...H.cases].sort((d,c)=>(Be(d.startedAt)??0)-(Be(c.startedAt)??0));let f=0;for(const d of g){const c=d.duration??1e3,S=E?N(d.startedAt):f;j.push({key:`t${d.id}`,kind:"test",testCaseId:d.id,title:d.title,status:d.status,workerIndex:H.workerIndex,start:S,duration:c,rowIndex:U}),f=S+c,(d.stepEvents??[]).forEach((x,P)=>{const Q=ml(x,D);if(!Q)return;const Z=x.duration||0,ne=E?N(x.startedAt):f;j.push({key:`s${d.id}:${P}`,kind:Q,testCaseId:d.id,title:x.title,status:x.status||"passed",workerIndex:H.workerIndex,start:ne,duration:Z,rowIndex:U,parentTitle:d.title}),f=ne+Z})}j.sort((d,c)=>d.start-c.start),I.push(...j),A.has(H.workerIndex)||A.set(H.workerIndex,f)}),t.setupSteps&&t.setupSteps.length>0){const H=new Map;m.forEach((U,j)=>{H.has(U.workerIndex)||H.set(U.workerIndex,j)}),t.setupSteps.forEach((U,j)=>{const g=U.workerIndex;if(g==null||g<0)return;const f=H.get(g);if(f==null)return;const d=U.duration||0;let c;E?c=N(U.startedAt):(c=A.get(g)??0,A.set(g,c+d)),I.push({key:`setup${g}:${j}`,kind:"setup",testCaseId:null,title:`[Setup] ${U.title}`,status:U.status||"passed",workerIndex:g,start:c,duration:d,rowIndex:f,parentTitle:null})})}return I}),$=M(()=>w.value.map(m=>({shardIndex:m.shardIndex,workerIndex:m.workerIndex}))),l=M(()=>{const m=[];for(let D=0;D<$.value.length;D++){const K=$.value[D],E=m[m.length-1];!E||E.shardIndex!==K.shardIndex?m.push({shardIndex:K.shardIndex,rowRange:[D,D]}):E.rowRange[1]=D}return m}),C=M(()=>{let m=0;for(const D of F.value)m=Math.max(m,D.start+D.duration);return m||6e4});return{timelineData:F,workerRows:$,shardGroups:l,maxTime:C}}const it=1.12,gl=10,pl=100,Ge=[10,20,50,100,200,500,1e3,2e3,5e3,1e4,15e3,3e4,6e4,12e4,3e5,6e5,9e5,18e5,36e5];function yl(t){const{containerRef:b,maxTime:w,rowCount:F,hasData:$,live:l}=t,{labelWidth:C,sidePadding:m,axisHeight:D,rowHeight:K}=Ee,E=O(1),N=O(0),I=O(!1),A=O(0),H=O(0),U=M(()=>.5*E.value),j=M(()=>w.value*U.value+C+m),g=M(()=>F.value*K+D);function f(v){return v.start*U.value+C}function d(v){return Math.max(v.duration*U.value,3)}function c(v){return v.rowIndex*K+D}function S(){const v=b.value?.clientWidth;if(!v||w.value<=0)return 1;const q=(v-C)/w.value;return Math.min(1,q/.5)}function y(){const v=S();v>0&&(E.value=v,N.value=0)}function x(v){if(!b.value)return v;const q=b.value.clientWidth;return j.value<=q?0:Math.max(q-j.value,Math.min(0,v))}function P(v,q){const ae=Math.max(S(),Math.min(gl,v)),se=ae/E.value;E.value=ae,N.value=x(q-(q-N.value)*se)}const Q=M(()=>{const v=pl/U.value;let q=Ge.find(se=>se>=v)??Ge[Ge.length-1];for(;w.value/q>1e3;)q*=2;const ae=[];for(let se=0;se<=w.value;se+=q)ae.push({ms:se,x:se*U.value+C,label:Oe(se)});return ae});function Z(v){if(l())return;const q=v.deltaY>0?1/it:it,ae=b.value?.getBoundingClientRect();P(E.value*q,ae?v.clientX-ae.left:0)}const ne=4,ee=new Map;let B=null,z=0,i=1,ue=0;function h(v,q){B=v,A.value=q,H.value=N.value}function T(v){if(!l()&&!(v.pointerType==="mouse"&&v.button!==0)){if(ee.set(v.pointerId,{x:v.clientX,y:v.clientY}),ee.size===1)h(v.pointerId,v.clientX);else if(ee.size===2){B=null,I.value=!1;for(const ge of ee.keys())b.value?.setPointerCapture?.(ge);const[q,ae]=[...ee.values()];z=Math.hypot(q.x-ae.x,q.y-ae.y)||1,i=E.value;const se=b.value?.getBoundingClientRect();ue=(q.x+ae.x)/2-(se?.left??0)}v.preventDefault()}}function G(v){if(!(l()||!ee.has(v.pointerId))){if(ee.set(v.pointerId,{x:v.clientX,y:v.clientY}),ee.size>=2){const[q,ae]=[...ee.values()],se=Math.hypot(q.x-ae.x,q.y-ae.y)||1;P(i*(se/z),ue);return}I.value?N.value=x(H.value+(v.clientX-A.value)):B===v.pointerId&&Math.abs(v.clientX-A.value)>ne&&(b.value?.setPointerCapture?.(v.pointerId),I.value=!0,N.value=x(H.value+(v.clientX-A.value)))}}function te(v){if(ee.delete(v.pointerId),B===v.pointerId&&(B=null),b.value?.releasePointerCapture?.(v.pointerId),ee.size===1){const[q]=[...ee.entries()];h(q[0],q[1].x)}else ee.size===0&&(I.value=!1)}function de(){y()}let Y=null;return Jt(()=>{Ie(y),b.value&&(Y=new ResizeObserver(()=>y()),Y.observe(b.value))}),mt(()=>{Y?.disconnect()}),me(()=>[l(),$.value,w.value,F.value],([v,q])=>{v&&q&&Ie(y)}),{panX:N,isPanning:I,pxPerMs:U,contentWidth:j,contentHeight:g,getBarX:f,getBarWidth:d,getBarTop:c,tickMarks:Q,onWheel:Z,onPointerDown:T,onPointerMove:G,onPointerUp:te,resetView:de}}const xl={key:0,class:"relative select-none"},hl=["width","height"],vl={key:1,class:"text-center py-10 text-gray-500"},kl=fe({__name:"WorkersTimeline",props:{testCases:{},setupSteps:{},shardTotal:{},live:{type:Boolean},wastedPatterns:{}},emits:["selectTestCase"],setup(t,{emit:b}){const w=t,F=b,{timelineData:$,workerRows:l,shardGroups:C,maxTime:m}=fl(w),D=O(null),K=M(()=>l.value.length),E=M(()=>$.value.length>0),{panX:N,isPanning:I,contentWidth:A,contentHeight:H,getBarX:U,getBarWidth:j,getBarTop:g,tickMarks:f,onWheel:d,onPointerDown:c,onPointerMove:S,onPointerUp:y,resetView:x}=yl({containerRef:D,maxTime:m,rowCount:K,hasData:E,live:()=>w.live}),P=M(()=>$.value.filter(Y=>Y.kind==="test").length),Q=M(()=>$.value.filter(Y=>Y.kind!=="test"&&Y.kind!=="wait").length),Z=M(()=>$.value.filter(Y=>Y.kind==="wait").length),ne=["test","setup","hook","fixture","wait"],ee={test:"Tests",setup:"Setup (beforeAll/afterAll)",hook:"Hooks",fixture:"Fixtures",wait:"Wasted waits"},B=O({}),z=M(()=>$.value.filter(Y=>!B.value[Y.kind])),i=M(()=>{const Y=new Set($.value.map(v=>v.kind));return ne.filter(v=>Y.has(v)).map(v=>({key:v,label:ee[v],checked:!B.value[v]}))});function ue(Y,v){B.value={...B.value,[Y]:!v}}const h=O(null),T=O({x:0,y:0});me(z,Y=>{h.value&&(h.value=Y.find(v=>v.key===h.value.key)??null)});function G(Y,v){h.value=Y,T.value={x:v.clientX,y:v.clientY}}function te(Y){T.value={x:Y.clientX,y:Y.clientY}}function de(){h.value=null}return(Y,v)=>{const q=Dr,ae=Lr,se=Zr,ge=rl,Ce=ke;return e($).length>0?(s(),a("div",xl,[u(q,{"worker-count":e(l).length,"shard-total":t.shardTotal,"test-count":P.value,"hook-count":Q.value,"wait-count":Z.value,"span-types":i.value,live:t.live,onToggleSpan:ue,onReset:e(x)},null,8,["worker-count","shard-total","test-count","hook-count","wait-count","span-types","live","onReset"]),n("div",{ref_key:"containerRef",ref:D,class:J(["relative overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 touch-pan-y",{"cursor-grab":!e(I),"cursor-grabbing":e(I)}]),style:he({height:e(H)+"px"}),onWheel:v[1]||(v[1]=Ue((...re)=>e(d)&&e(d)(...re),["prevent"])),onPointerdown:v[2]||(v[2]=(...re)=>e(c)&&e(c)(...re)),onPointermove:v[3]||(v[3]=(...re)=>e(S)&&e(S)(...re)),onPointerup:v[4]||(v[4]=(...re)=>e(y)&&e(y)(...re)),onPointercancel:v[5]||(v[5]=(...re)=>e(y)&&e(y)(...re)),onPointerleave:v[6]||(v[6]=(...re)=>e(y)&&e(y)(...re))},[(s(),a("svg",{class:"overflow-visible",style:he({transform:`translateX(${e(N)}px)`}),width:e(A),height:e(H)},[v[7]||(v[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)),u(ae,{"worker-rows":e(l),"shard-groups":e(C),"tick-marks":e(f),"content-width":e(A),"shard-total":t.shardTotal},null,8,["worker-rows","shard-groups","tick-marks","content-width","shard-total"]),(s(!0),a(V,null,oe(z.value,re=>(s(),R(se,{key:re.key,item:re,x:e(U)(re),y:e(g)(re),width:e(j)(re),onSelect:v[0]||(v[0]=we=>F("selectTestCase",we)),onHover:G,onMove:te,onLeave:de},null,8,["item","x","y","width"]))),128))],12,hl))],38),u(ge,{item:h.value,pos:T.value},null,8,["item","pos"])])):(s(),a("div",vl,[u(Ce,{name:"i-lucide-rows-3",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),v[8]||(v[8]=n("p",null,"No worker data available for this run.",-1))]))}}}),bl=Object.assign(kl,{__name:"WorkersTimeline"}),_l={key:0,class:"space-y-4"},wl={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},$l={class:"flex items-center gap-2 py-1.5"},Cl={class:"font-medium"},Rl={key:0,class:"flex"},Tl={key:1,class:"flex items-center justify-center py-6 text-gray-500 gap-2"},Il={class:"flex flex-wrap gap-2 mt-1"},Sl={class:"flex flex-wrap gap-4 text-sm"},zl={key:3,class:"text-sm text-gray-500"},Dl={class:"flex flex-wrap gap-4 text-sm"},Fl={key:0,class:"text-gray-400"},Pl={key:0,class:"text-gray-400"},jl={key:0},Ml={key:1,class:"text-gray-400"},Nl={key:0},Al={key:1,class:"text-gray-400"},Bl={key:0,class:"text-gray-400"},Ul={key:0,class:"text-gray-400"},Ll={key:4,class:"text-center py-8 text-gray-500"},El={key:5,class:"text-center py-8 text-gray-500"},Ol={key:1,class:"text-center py-10 text-gray-500"},Wl=fe({__name:"RunCompare",props:{testRun:{}},setup(t){const b=t,F=Ae().params.id,$=O(null),l=O([]),C=M(()=>b.testRun?.status==="running"||b.testRun?.status==="finalizing");me(()=>b.testRun?.projectId,async f=>{if(!(!f||C.value)){try{$.value=await $fetch(`/api/projects/${f}`)}catch(d){console.error("Failed to fetch project for RunCompare",d)}try{const d=await $fetch(`/api/projects/${f}/markers`);l.value=d.markers??[]}catch{}}},{immediate:!0});const m=M(()=>{if(!N.value||!b.testRun)return[];const f=new Date(N.value.startTime).getTime(),d=new Date(b.testRun.startTime).getTime(),c=Math.min(f,d),S=Math.max(f,d),y=new Set([N.value.environment,b.testRun.environment].filter(x=>x!=null));return l.value.filter(x=>{const P=new Date(x.occurredAt).getTime();return P<=c||P>=S?!1:x.environment==null||y.has(x.environment)})}),D=M(()=>$.value?.testRuns?$.value.testRuns.filter(f=>f.id!==Number(F)).slice(0,50).map(f=>({label:`Run #${f.id} — ${pt(f.startTime,{dateOnly:!0})} (${f.status})`,value:f.id})):[]),K=M(()=>{if(!$.value?.testRuns)return null;const f=[...$.value.testRuns].sort((c,S)=>new Date(S.startTime).getTime()-new Date(c.startTime).getTime()),d=f.findIndex(c=>c.id===Number(F));return d>=0&&d<f.length-1?f[d+1].id:null}),E=O(void 0),N=O(null),I=O(!1);me(E,async f=>{if(!f?.value){N.value=null;return}I.value=!0;try{N.value=await $fetch(`/api/test-runs/${f.value}`)}catch{}finally{I.value=!1}});function A(){if(K.value){const f=D.value.find(d=>d.value===K.value);f&&(E.value=f)}}const H=M(()=>b.testRun??null),{comparisonData:U,comparisonSummary:j}=Is(N,H),g=[{accessorKey:"title",header:ie("Test case")},{accessorKey:"statusA",header:ie("Status A")},{accessorKey:"statusB",header:ie("Status B")},{accessorKey:"durationA",header:ie("Duration A")},{accessorKey:"durationB",header:ie("Duration B")},{accessorKey:"delta",header:ie("Delta")},{accessorKey:"percentChange",header:ie("Change")}];return(f,d)=>{const c=Cs,S=Rs,y=_e,x=ke,P=gt,Q=Ts,Z=be,ne=Je,ee=$t;return s(),a("div",null,[t.testRun&&!C.value?(s(),a("div",_l,[n("div",wl,[n("div",null,[d[1]||(d[1]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),u(c,{modelValue:E.value,"onUpdate:modelValue":d[0]||(d[0]=B=>E.value=B),items:D.value,placeholder:"Select a baseline run..."},null,8,["modelValue","items"])]),n("div",null,[d[2]||(d[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",$l,[u(S,{status:t.testRun.status},null,8,["status"]),n("span",Cl,"#"+o(t.testRun.id),1)])])]),K.value?(s(),a("div",Rl,[u(y,{icon:"i-lucide-arrow-left-right",size:"sm",variant:"outline",label:"Compare with previous run",onClick:A})])):k("",!0),I.value?(s(),a("div",Tl,[u(x,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),d[3]||(d[3]=n("span",null,"Loading baseline data...",-1))])):m.value.length>0?(s(),R(Q,{key:2,color:"warning",variant:"subtle",icon:"i-lucide-milestone",title:`${m.value.length} timeline marker${m.value.length>1?"s":""} between these runs`},{description:r(()=>[n("div",Il,[(s(!0),a(V,null,oe(m.value,B=>(s(),R(P,{key:B.id,marker:B,size:"sm"},null,8,["marker"]))),128))])]),_:1},8,["title"])):N.value&&e(U).length>0?(s(),a(V,{key:3},[n("div",Sl,[d[4]||(d[4]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status",-1)),e(j).newFailures>0?(s(),R(Z,{key:0,color:"error",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).newFailures)+" new failure"+o(e(j).newFailures>1?"s":""),1)]),_:1})):k("",!0),e(j).recovered>0?(s(),R(Z,{key:1,color:"success",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).recovered)+" recovered ",1)]),_:1})):k("",!0),e(j).stillFailing>0?(s(),R(Z,{key:2,color:"warning",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).stillFailing)+" still failing ",1)]),_:1})):k("",!0),e(j).newFailures===0&&e(j).recovered===0&&e(j).stillFailing===0?(s(),a("span",zl,"No status changes")):k("",!0)]),n("div",Dl,[d[5]||(d[5]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(j).regressed>0?(s(),R(Z,{key:0,color:"error",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).regressed)+" regressed ",1)]),_:1})):k("",!0),e(j).improved>0?(s(),R(Z,{key:1,color:"success",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).improved)+" improved ",1)]),_:1})):k("",!0),u(Z,{color:"neutral",variant:"soft",size:"lg"},{default:r(()=>[_(o(e(j).unchanged)+" unchanged ",1)]),_:1})]),u(ee,{"min-width":"48rem",bleed:!1},{default:r(()=>[u(ne,{data:e(U),columns:g,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":r(({row:B})=>[B.original.statusA?(s(),R(Z,{key:1,color:("getStatusColor"in f?f.getStatusColor:e(Le))(B.original.statusA),class:"capitalize"},{default:r(()=>[_(o(B.original.statusA),1)]),_:2},1032,["color"])):(s(),a("span",Fl,"—"))]),"statusB-cell":r(({row:B})=>[B.original.statusB?(s(),R(Z,{key:1,color:("getStatusColor"in f?f.getStatusColor:e(Le))(B.original.statusB),class:"capitalize"},{default:r(()=>[_(o(B.original.statusB),1)]),_:2},1032,["color"])):(s(),a("span",Pl,"—"))]),"durationA-cell":r(({row:B})=>[B.original.durationA!==null?(s(),a("span",jl,o(("formatDuration"in f?f.formatDuration:e(xe))(B.original.durationA)),1)):(s(),a("span",Ml,"—"))]),"durationB-cell":r(({row:B})=>[B.original.durationB!==null?(s(),a("span",Nl,o(("formatDuration"in f?f.formatDuration:e(xe))(B.original.durationB)),1)):(s(),a("span",Al,"—"))]),"delta-cell":r(({row:B})=>[B.original.delta===null?(s(),a("span",Bl,"—")):(s(),a("span",{key:1,class:J(B.original.delta>0?"text-red-600":B.original.delta<0?"text-green-600":"text-gray-500")},o(B.original.delta>0?"+":"")+o(("formatDuration"in f?f.formatDuration:e(xe))(B.original.delta)),3))]),"percentChange-cell":r(({row:B})=>[B.original.percentChange===null?(s(),a("span",Ul,"—")):(s(),a("span",{key:1,class:J(B.original.percentChange>10?"text-red-600 font-medium":B.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},o(B.original.percentChange>0?"+":"")+o(B.original.percentChange)+"% ",3))]),_:1},8,["data"])]),_:1})],64)):E.value&&!I.value?(s(),a("div",Ll,[u(x,{name:"i-lucide-git-compare-arrows",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),d[6]||(d[6]=n("p",null,"No comparison data available.",-1))])):(s(),a("div",El,[u(x,{name:"i-lucide-arrow-left-right",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),d[7]||(d[7]=n("p",null,"Select a baseline run to compare.",-1))]))])):C.value?(s(),a("div",Ol,[u(x,{name:"i-lucide-git-compare-arrows",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),d[8]||(d[8]=n("p",null,"Comparison is available after the run finishes.",-1))])):k("",!0)])}}}),Kl=Object.assign(Wl,{__name:"RunCompare"}),Hl={class:"flex flex-col overflow-hidden"},Vl={key:0,class:"flex-1 flex items-center justify-center text-gray-500 gap-2"},Gl={class:"text-xs font-mono break-all"},Xl={key:0,class:"text-gray-400"},ql={key:1,class:"text-red-600 font-medium"},Yl={key:2,class:"flex-1 flex items-center justify-center text-center text-gray-500"},Jl=fe({__name:"SlowEndpoints",props:{refreshKey:{}},emits:["endpointsCount"],async setup(t,{emit:b}){let w,F;const l=Ae().params.id,C=t,m=b,{data:D,pending:K,refresh:E}=([w,F]=je(()=>Me(`/api/test-runs/${l}/network-requests`,{lazy:!0,server:!1},"$DE3r8oSbIq")),w=await w,F(),w);me(D,I=>{m("endpointsCount",I?.length??0)}),me(()=>C.refreshKey,(I,A)=>{I!==A&&I!==void 0&&E()});const N=[{accessorKey:"method",header:ie("Method")},{accessorKey:"route",header:ie("Route")},{accessorKey:"count",header:ie("Calls")},{accessorKey:"avgDuration",header:ie("Avg")},{accessorKey:"p90Duration",header:ie("P90")},{accessorKey:"maxDuration",header:ie("Max")},{accessorKey:"errorRate",header:ie("Errors")}];return(I,A)=>{const H=ke,U=be,j=Je;return s(),a("div",Hl,[e(K)?(s(),a("div",Vl,[u(H,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),A[0]||(A[0]=n("span",null,"Loading network data...",-1))])):e(D)&&e(D).length>0?(s(),R(j,{key:1,sticky:"",data:e(D),columns:N,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":r(({row:g})=>[u(U,{color:g.original.method==="GET"?"info":g.original.method==="POST"?"success":g.original.method==="PUT"||g.original.method==="PATCH"?"warning":g.original.method==="DELETE"?"error":"neutral",variant:"soft",class:"font-mono text-xs"},{default:r(()=>[_(o(g.original.method),1)]),_:2},1032,["color"])]),"route-cell":r(({row:g})=>[n("code",Gl,o(g.original.route),1)]),"avgDuration-cell":r(({row:g})=>[n("span",{class:J(g.original.avgDuration>1e3?"text-red-600 font-medium":g.original.avgDuration>500?"text-orange-500 font-medium":"")},o(("formatDuration"in I?I.formatDuration:e(xe))(g.original.avgDuration)),3)]),"p90Duration-cell":r(({row:g})=>[n("span",{class:J(g.original.p90Duration>2e3?"text-red-600 font-medium":g.original.p90Duration>1e3?"text-orange-500":"")},o(("formatDuration"in I?I.formatDuration:e(xe))(g.original.p90Duration)),3)]),"errorRate-cell":r(({row:g})=>[g.original.errorRate===0?(s(),a("span",Xl,"0%")):(s(),a("span",ql,o(g.original.errorRate)+"%",1))]),_:1},8,["data"])):(s(),a("div",Yl,[u(H,{name:"i-lucide-wifi-off",class:"size-8 mx-auto mb-2 text-gray-300 dark:text-gray-600"}),A[1]||(A[1]=n("p",null,[_(" No network request data. Add the "),n("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 rounded font-mono"},"@piwitests/reporter"),_(" fixtures to your test setup. ")],-1))]))])}}}),Zl=Object.assign(Jl,{__name:"SlowEndpoints"}),Ql={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"},ei={key:0,class:"flex items-center gap-2 mb-3 shrink-0"},Qi=fe({__name:"[id]",async setup(t){let b,w;const F=Ae(),$=Zt(),l=F.params.id,C=!!Qt().public.demoMode,{data:m,refresh:D}=([b,w]=je(()=>Me(`/api/test-runs/${l}`,"$D01RBpMFGT")),b=await b,w(),b),K=m.value?.projectId,{data:E,refresh:N}=K?([b,w]=je(()=>Me(`/api/projects/${K}/latest-run`,{key:`latest-run-${K}`},"$e4OLHgXNMR")),b=await b,w(),b):{data:O(null),refresh:async()=>{}};Ss(N);const I=M(()=>E.value?.id??m.value?.project?.latestRunId??null),A=M(()=>E.value?.status??m.value?.project?.latestRunStatus??null),H=M(()=>A.value==="running"||A.value==="finalizing");es(M(()=>({title:`Test run #${l}${m.value?.project?` — ${m.value.project.name}`:""} — Piwi Dashboard`})));const U=ut(),j=O(!1),g=O(!1),f=M(()=>m.value?.status==="running"||m.value?.status==="finalizing"),d=O(!1),c=O([]),S=new Map,y=O(null);let x=null;const P=O([]);me([f,m],()=>{f.value&&c.value.length>0?P.value=[...c.value]:m.value?.testCases?P.value=m.value.testCases:P.value=[]},{immediate:!0});function Q(L){for(const W of L){const le=`${W.title}@@${W.location}@@${JSON.stringify(W.browser)}`;S.has(le)||(S.set(le,!0),c.value=[...c.value,W])}P.value=[...c.value]}let Z=[],ne=null;function ee(){if(Z.length===0)return;const L=Z;Z=[];for(const W of L){const le=W.data;if(W.type==="init")y.value={totalTests:le.totalTests,passedTests:le.passedTests,failedTests:le.failedTests,skippedTests:le.skippedTests};else if(W.type==="test-begin"){const X=le;if(X.stepCategory)continue;const $e=`${X.title}@@${X.location}@@${JSON.stringify(X.browser)}`;S.has($e)||(S.set($e,!0),c.value=[...c.value,{id:c.value.length+1,title:X.title,filePath:X.filePath,suitePath:X.suitePath??void 0,status:"running",location:X.location,workerIndex:X.workerIndex??null,startedAt:X.startedAt??Date.now(),browser:X.browser??null}],P.value=[...c.value])}else if(W.type==="test-completed"){const X=le;if(X.stepCategory)continue;const $e=`${X.title}@@${X.location}@@${JSON.stringify(X.browser)}`;if(S.has($e)){const Fe=c.value.findIndex(pe=>`${pe.title}@@${pe.location}@@${JSON.stringify(pe.browser)}`===$e);if(Fe>=0){const pe=c.value[Fe],Pe=[...c.value];Pe[Fe]={...pe,filePath:X.filePath??pe.filePath,suitePath:X.suitePath??pe.suitePath,status:X.status,duration:X.duration,error:X.error,stepEvents:X.stepEvents??pe.stepEvents,wastedTimeMs:X.wastedTimeMs??pe.wastedTimeMs,workerIndex:X.workerIndex??pe.workerIndex,startedAt:X.startedAt?X.startedAt:pe.startedAt,browser:X.browser??pe.browser},c.value=Pe,P.value=[...Pe]}}else S.set($e,!0),c.value=[...c.value,{id:c.value.length+1,title:X.title,filePath:X.filePath,suitePath:X.suitePath??void 0,status:X.status,duration:X.duration,location:X.location,error:X.error,stepEvents:X.stepEvents??null,wastedTimeMs:X.wastedTimeMs??null,workerIndex:X.workerIndex??null,startedAt:X.startedAt??void 0,browser:X.browser??null}],P.value=[...c.value]}else W.type==="run-progress"?y.value=le:W.type==="run-finalizing"?(d.value=!0,y.value=le):W.type==="run-finished"&&(d.value=!1,T(),D(),ve.value++,B())}}function B(L=0){C||L>=5||setTimeout(async()=>{await D(),B(L+1)},1500*(L+1))}function z(L){Z.push(L),ne&&clearTimeout(ne),ne=setTimeout(ee,200)}let i=null;function ue(){i||(m.value?.testCases?.length&&Q(m.value.testCases),i=zs(L=>{L.scope==="run"&&L.runId===Number(l)?z(L.event):L.scope==="global"&&L.event.runId===Number(l)&&L.event.type==="run-started"&&D()}))}function h(){if(C){ue();return}x||f.value&&(m.value?.testCases?.length&&Q(m.value.testCases),x=new EventSource(`/api/test-runs/${l}/stream`),x.onmessage=L=>{try{z(JSON.parse(L.data))}catch{}},x.onerror=()=>{})}function T(){x&&(x.close(),x=null),i&&(i(),i=null)}const G=M(()=>f.value||C&&m.value?.status==="initialising");me(G,L=>{L?h():T()},{immediate:!0}),mt(()=>{T()});let te=null;const de=O([]);me(P,L=>{te===null&&(te=requestAnimationFrame(()=>{de.value=L,te=null}))},{immediate:!0});const Y=M(()=>f.value&&y.value?y.value:m.value?{totalTests:m.value.totalTests,passedTests:m.value.passedTests,failedTests:m.value.failedTests,skippedTests:m.value.skippedTests}:null);async function v(){j.value=!1,g.value=!0;try{await $fetch(`/api/test-runs/${l}`,{method:"DELETE"}),U.add({title:"Test run deleted",color:"success"}),await Xe(`/projects/${m.value?.project?.id}`)}catch(L){const W=L&&typeof L=="object"&&"data"in L?L.data?.message:void 0;U.add({title:"Delete failed",description:W||"An error occurred",color:"error"})}finally{g.value=!1}}const q=O(!1),ae=O(""),se=O([]),ge=O("all"),Ce=M(()=>se.value.length===1?se.value[0]:"all");function re(L){se.value=!L||L==="all"?[]:[L]}const we=M(()=>m.value?.reports||[]),ze=M(()=>{const L=P.value;return L?L.reduce((W,le)=>W+(le.wastedTimeMs??0),0):0}),ye=O("test-cases"),p=O(null),ve=O(0),De=O(0);function Ze(){p.value=null}const Qe=M(()=>m.value&&m.value.failedTests>0),It=M(()=>{if(!m.value?.testCases)return 0;const L=new Set;for(const W of m.value.testCases)W.failureClusterId!=null&&L.add(W.failureClusterId);return L.size}),et=M(()=>{const L=f.value?P.value:m.value?.testCases;if(!L||L.length===0)return 0;const W=new Set;for(const le of L)le.workerIndex!=null&&le.workerIndex>=0&&W.add(le.workerIndex);return W.size}),tt=M(()=>[{label:`Test cases (${P.value.length})`,icon:"i-lucide-beaker",value:"test-cases",slot:"test-cases"},{label:"Insights",icon:"i-lucide-sparkles",value:"insights",slot:"insights"},...Qe.value?[{label:`Failure groups (${It.value})`,icon:"i-lucide-layers",value:"failure-groups",slot:"failure-groups"}]:[],...Qe.value?[{label:"Regression",icon:"i-lucide-git-pull-request-arrow",value:"regression",slot:"regression"}]:[],{label:`Timeline${et.value>0?` (${et.value})`:""}`,icon:"i-lucide-timeline",value:"workers",slot:"workers"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"},{label:`Slow endpoints${De.value>0?` (${De.value})`:""}`,icon:"i-lucide-network",value:"endpoints",slot:"endpoints"}]),St={"test-cases":"overflow-hidden flex flex-col",endpoints:"overflow-hidden flex flex-col"},st=M(()=>tt.value.map(L=>L.value));typeof F.query.tab=="string"&&st.value.includes(F.query.tab)&&(ye.value=F.query.tab),me(st,L=>{L.includes(ye.value)||(ye.value="test-cases")}),me(ye,L=>{F.query.tab!==L&&$.replace({query:{...F.query,tab:L}})});const nt=O(null);function zt(L){ye.value="test-cases",Ie(()=>{nt.value?.scrollToCase(L)})}function Dt(L){p.value=L,ye.value="test-cases"}return(L,W)=>{const le=Vt,X=Ne,$e=ke,Fe=ft,pe=ts,Pe=ss,Ft=as,Pt=Pn,jt=be,Ke=_e,Mt=Ia,Nt=Ro,At=Yo,Bt=Cr,Ut=bl,Lt=Kl,Et=Zl,Ot=us,Wt=ns,Kt=Ct,Ht=ct;return s(),a(V,null,[u(Wt,{id:"test-run-detail"},{header:r(()=>[u(Ft,null,{leading:r(()=>[u(le),u(pe,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...e(m)?.project?.id?[{label:e(m).project.label||e(m).project.name||"Project",to:`/projects/${e(m).project.id}`,slot:"project"}]:[{label:"Project"}],{label:`Run #${e(l)}`+(e(m)?.label?` — ${e(m).label}`:"")}]},{project:r(({item:ce})=>[u(X,{to:ce?.to,class:"text-sm font-medium text-[var(--ui-text-muted)] hover:text-[var(--ui-text)] transition-colors"},{default:r(()=>[_(o(ce?.label),1)]),_:2},1032,["to"]),I.value&&I.value!==Number(e(l))?(s(),R(Fe,{key:0,text:H.value?"Go to running run":"Go to latest run"},{default:r(()=>[u(X,{to:`/test-runs/${I.value}`},{default:r(()=>[n("span",Ql,[u($e,{name:"i-lucide-circle-play",class:J(["w-3.5 h-3.5 text-blue-500",{"animate-pulse":H.value}])},null,8,["class"])])]),_:1},8,["to"])]),_:1},8,["text"])):k("",!0)]),_:1},8,["items"])]),right:r(()=>[u(Pe,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>e(D)()},{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:e(g),onClick:()=>j.value=!0}]},null,8,["actions"])]),_:1})]),body:r(()=>[u(Ot,{modelValue:e(ye),"onUpdate:modelValue":W[5]||(W[5]=ce=>Re(ye)?ye.value=ce:null),"tab-items":tt.value,"tab-panel-class":St},{summary:r(()=>[e(m)?(s(),R(Pt,{key:0,"test-run":e(m),"display-progress":Y.value,"all-reports":we.value,"show-custom-data":e(q),finalizing:e(d),"active-filter":Ce.value,"total-wasted-time":ze.value,"onUpdate:showCustomData":W[0]||(W[0]=ce=>q.value=ce),onFilterStatus:re,onLabelUpdated:e(D)},null,8,["test-run","display-progress","all-reports","show-custom-data","finalizing","active-filter","total-wasted-time","onLabelUpdated"])):k("",!0)]),"tab-test-cases":r(()=>[e(p)!=null?(s(),a("div",ei,[u(jt,{color:"info",variant:"subtle",size:"sm"},{default:r(()=>[...W[8]||(W[8]=[_(" Filtered by failure group ",-1)])]),_:1}),u(Ke,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",label:"Clear filter",onClick:Ze})])):k("",!0),u(Mt,{ref_key:"testCasesListRef",ref:nt,search:e(ae),"onUpdate:search":W[1]||(W[1]=ce=>Re(ae)?ae.value=ce:null),"active-statuses":e(se),"onUpdate:activeStatuses":W[2]||(W[2]=ce=>Re(se)?se.value=ce:null),"browser-filter":e(ge),"onUpdate:browserFilter":W[3]||(W[3]=ce=>Re(ge)?ge.value=ce:null),"test-cases":e(P),suites:e(m)?.suites??[],"is-live":f.value,"failure-cluster-filter":e(p),"project-key":e(m)?.projectId,"project-name":e(m)?.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":r(()=>[u(Nt,{"test-run-id":Number(e(l)),"run-status":e(m)?.status??"","refresh-key":e(ve),class:"flex-1 min-h-0 p-4"},null,8,["test-run-id","run-status","refresh-key"])]),"tab-failure-groups":r(()=>[u(At,{"refresh-key":e(ve),onSelectCluster:Dt},null,8,["refresh-key"])]),"tab-regression":r(()=>[u(Bt,{"refresh-key":e(ve)},null,8,["refresh-key"])]),"tab-workers":r(()=>[u(Ut,{"test-cases":e(de),"setup-steps":e(m)?.setupSteps??null,"shard-total":e(m)?.shardTotal??null,live:f.value,"wasted-patterns":e(m)?.wastedWaitPatterns??null,onSelectTestCase:zt},null,8,["test-cases","setup-steps","shard-total","live","wasted-patterns"])]),"tab-compare":r(()=>[u(Lt,{"test-run":e(m)},null,8,["test-run"])]),"tab-endpoints":r(()=>[u(Et,{"refresh-key":e(ve),class:"flex-1 min-h-0",onEndpointsCount:W[4]||(W[4]=ce=>De.value=ce)},null,8,["refresh-key"])]),_:1},8,["modelValue","tab-items"])]),_:1}),u(Ht,null,{default:r(()=>[u(Kt,{open:e(j),title:"Delete test run","onUpdate:open":W[7]||(W[7]=ce=>j.value=ce)},{body:r(()=>[n("p",null,[W[9]||(W[9]=_(" Are you sure you want to delete ",-1)),n("strong",null,"Test Run #"+o(e(m)?.id),1),W[10]||(W[10]=_("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:r(()=>[u(Ke,{color:"neutral",variant:"ghost",label:"Cancel",onClick:W[6]||(W[6]=ce=>j.value=!1)}),u(Ke,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(g),onClick:v},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Qi as default};
@@ -1 +1 @@
1
- import{h}from"./BrT_Sys2.js";function r(s){if(!s.location)return s.title;const o=s.location.match(/^(.*):(\d+):(\d+)$/);return`${o?o[1]:s.location}::${s.title}`}function C(s,o){const c=h(()=>{if(!s.value?.testCases||!o.value?.testCases)return[];const d=new Map;for(const t of s.value.testCases)d.set(r(t),t);const u=[];for(const t of o.value.testCases){const a=d.get(r(t)),l=a?.duration??null,n=t.duration??null;let e=null,f=null;l!==null&&n!==null&&(e=n-l,f=l>0?Math.round((n-l)/l*100):null),u.push({title:t.title,location:t.location??null,statusA:a?.status??null,statusB:t.status,durationA:l,durationB:n,delta:e,percentChange:f})}const i=new Set(o.value.testCases.map(r));for(const t of s.value.testCases)i.has(r(t))||u.push({title:t.title,location:t.location??null,statusA:t.status,statusB:null,durationA:t.duration??null,durationB:null,delta:null,percentChange:null});return u.sort((t,a)=>Math.abs(a.delta??0)-Math.abs(t.delta??0))}),p=h(()=>{let u=0,i=0,t=0,a=0,l=0,n=0;for(const e of c.value)e.statusA==="passed"&&e.statusB==="failed"?a++:e.statusA==="failed"&&e.statusB==="passed"?l++:e.statusA==="failed"&&e.statusB==="failed"&&n++,e.percentChange!==null&&(e.percentChange<-10?u++:e.percentChange>10?i++:t++);return{improved:u,regressed:i,unchanged:t,newFailures:a,recovered:l,stillFailing:n}});return{comparisonData:c,comparisonSummary:p}}export{C as u};
1
+ import{h}from"./D3SYPlEB.js";function r(s){if(!s.location)return s.title;const o=s.location.match(/^(.*):(\d+):(\d+)$/);return`${o?o[1]:s.location}::${s.title}`}function C(s,o){const c=h(()=>{if(!s.value?.testCases||!o.value?.testCases)return[];const d=new Map;for(const t of s.value.testCases)d.set(r(t),t);const u=[];for(const t of o.value.testCases){const a=d.get(r(t)),l=a?.duration??null,n=t.duration??null;let e=null,f=null;l!==null&&n!==null&&(e=n-l,f=l>0?Math.round((n-l)/l*100):null),u.push({title:t.title,location:t.location??null,statusA:a?.status??null,statusB:t.status,durationA:l,durationB:n,delta:e,percentChange:f})}const i=new Set(o.value.testCases.map(r));for(const t of s.value.testCases)i.has(r(t))||u.push({title:t.title,location:t.location??null,statusA:t.status,statusB:null,durationA:t.duration??null,durationB:null,delta:null,percentChange:null});return u.sort((t,a)=>Math.abs(a.delta??0)-Math.abs(t.delta??0))}),p=h(()=>{let u=0,i=0,t=0,a=0,l=0,n=0;for(const e of c.value)e.statusA==="passed"&&e.statusB==="failed"?a++:e.statusA==="failed"&&e.statusB==="passed"?l++:e.statusA==="failed"&&e.statusB==="failed"&&n++,e.percentChange!==null&&(e.percentChange<-10?u++:e.percentChange>10?i++:t++);return{improved:u,regressed:i,unchanged:t,newFailures:a,recovered:l,stillFailing:n}});return{comparisonData:c,comparisonSummary:p}}export{C as u};