@piwitests/server 0.22.1 → 0.24.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 (528) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{By5qkOq8.js → -COcylA_.js} +1 -1
  3. package/.output/public/_nuxt/03FA4-rI.js +1 -0
  4. package/.output/public/_nuxt/{2VtBYkNh.js → 5a7jHE9s.js} +1 -1
  5. package/.output/public/_nuxt/6Z_ZwH8I.js +1 -0
  6. package/.output/public/_nuxt/7ZHq6PCI.js +1 -0
  7. package/.output/public/_nuxt/{cSeAgciy.js → 98sAB6Gu.js} +1 -1
  8. package/.output/public/_nuxt/{CoPntblj.js → B--J7VNt.js} +1 -1
  9. package/.output/public/_nuxt/{Dj-TetcW.js → B1LUinhp.js} +1 -1
  10. package/.output/public/_nuxt/{CCP6Tyle.js → B33YjaHr.js} +1 -1
  11. package/.output/public/_nuxt/B69RP95P.js +1 -0
  12. package/.output/public/_nuxt/{x8YSyy4c.js → B8H4XydJ.js} +1 -1
  13. package/.output/public/_nuxt/{DpalT0nH.js → B8Xm4_S_.js} +1 -1
  14. package/.output/public/_nuxt/{9N6hSApy.js → BBhrClA9.js} +1 -1
  15. package/.output/public/_nuxt/{BhH0TNTi.js → BCGljaM0.js} +1 -1
  16. package/.output/public/_nuxt/{BVN50jIb.js → BFxvHlO9.js} +1 -1
  17. package/.output/public/_nuxt/{DsX5CCb5.js → BKrWWV14.js} +1 -1
  18. package/.output/public/_nuxt/BN1zZw5b.js +9 -0
  19. package/.output/public/_nuxt/{iubpj2qv.js → BPXqL9vK.js} +1 -1
  20. package/.output/public/_nuxt/{CAZpjzvB.js → BUnwEAjq.js} +1 -1
  21. package/.output/public/_nuxt/{D6Mo5HeX.js → BVLqydCr.js} +1 -1
  22. package/.output/public/_nuxt/{9P8iHISX.js → BWMSVSNM.js} +1 -1
  23. package/.output/public/_nuxt/B_r0xHVS.js +1 -0
  24. package/.output/public/_nuxt/{DtSn2Q9-.js → BakMHV79.js} +1 -1
  25. package/.output/public/_nuxt/{_VzR8bwc.js → Bd8B-yeR.js} +1 -1
  26. package/.output/public/_nuxt/{BUMoU50-.js → BevElZaK.js} +1 -1
  27. package/.output/public/_nuxt/BfA6lfg4.js +1 -0
  28. package/.output/public/_nuxt/{DGyGmFem.js → Bg93Rnts.js} +1 -1
  29. package/.output/public/_nuxt/BgABj4Ty.js +4 -0
  30. package/.output/public/_nuxt/{CkKCKAYp.js → BkM2KXUo.js} +2 -2
  31. package/.output/public/_nuxt/{DQnsFoJn.js → BkxRbXIj.js} +1 -1
  32. package/.output/public/_nuxt/{CNcu4khZ.js → Bme1UkOl.js} +1 -1
  33. package/.output/public/_nuxt/{CobveFaj.js → BmzxRbcg.js} +1 -1
  34. package/.output/public/_nuxt/Bn0jaRxI.js +1 -0
  35. package/.output/public/_nuxt/{SBmMTKQb.js → BoNKdx5o.js} +1 -1
  36. package/.output/public/_nuxt/{BQzG26t0.js → Bp3FRuEm.js} +1 -1
  37. package/.output/public/_nuxt/{DOLeth7M.js → BrUBOQ0y.js} +1 -1
  38. package/.output/public/_nuxt/{nANaAHCd.js → BtSGUY-7.js} +1 -1
  39. package/.output/public/_nuxt/{BfS8BZTO.js → BtbpLWDs.js} +1 -1
  40. package/.output/public/_nuxt/{Cwwe5bRS.js → BvAfKk6C.js} +1 -1
  41. package/.output/public/_nuxt/{BqCiYSVY.js → BwEN1fJ1.js} +1 -1
  42. package/.output/public/_nuxt/{B0hK-xDF.js → C-XjxjG5.js} +1 -1
  43. package/.output/public/_nuxt/{kfFeu9tK.js → C3W_wyr9.js} +1 -1
  44. package/.output/public/_nuxt/{h49q_GXF.js → C5TrTuWv.js} +42 -42
  45. package/.output/public/_nuxt/{B2a-Phk3.js → C7D5Wl7T.js} +1 -1
  46. package/.output/public/_nuxt/{B09ddw9C.js → C7fq_rHE.js} +1 -1
  47. package/.output/public/_nuxt/{CWoSSKhQ.js → C8Paf_V1.js} +1 -1
  48. package/.output/public/_nuxt/{BQOWm9mQ.js → CD8ZzAFC.js} +1 -1
  49. package/.output/public/_nuxt/{DwyFnMoY.js → CDTeSrLO.js} +1 -1
  50. package/.output/public/_nuxt/{Cf52zHyB.js → CGHV0Y2d.js} +1 -1
  51. package/.output/public/_nuxt/{BtaTvcz6.js → CIpF9l75.js} +1 -1
  52. package/.output/public/_nuxt/{CkyMZI-0.js → CJ1rmnk4.js} +1 -1
  53. package/.output/public/_nuxt/{DOBSrxzY.js → CMuzkARi.js} +1 -1
  54. package/.output/public/_nuxt/{3xlGO1qT.js → COuZu9FO.js} +1 -1
  55. package/.output/public/_nuxt/{BZnfiR67.js → CX5Q0dZ8.js} +1 -1
  56. package/.output/public/_nuxt/{DBhdObsO.js → CX_G-FHC.js} +14 -14
  57. package/.output/public/_nuxt/{DDN2tt0a.js → Ce5_Tq63.js} +1 -1
  58. package/.output/public/_nuxt/{BlRWlfdD.js → Cf4MFOuf.js} +1 -1
  59. package/.output/public/_nuxt/{BYB8NVJZ.js → CgkXEZMo.js} +1 -1
  60. package/.output/public/_nuxt/{BFcdtAzg.js → CjBktNrC.js} +1 -1
  61. package/.output/public/_nuxt/{DXXnDejN.js → CjtjQV60.js} +1 -1
  62. package/.output/public/_nuxt/{x8w_1_rn.js → CpcrljrH.js} +1 -1
  63. package/.output/public/_nuxt/{C0v6l4pr.js → Cq33x7yV.js} +1 -1
  64. package/.output/public/_nuxt/{BDQCwxpX.js → CsV7pmcT.js} +1 -1
  65. package/.output/public/_nuxt/{C9p0YCAi.js → Cu2Q4iPh.js} +1 -1
  66. package/.output/public/_nuxt/CyLcEDg2.js +2 -0
  67. package/.output/public/_nuxt/{PdEEuEsg.js → D0Kop4bS.js} +1 -1
  68. package/.output/public/_nuxt/D1Y43xM1.js +2 -0
  69. package/.output/public/_nuxt/{DK7xciFW.js → D1vqYZsL.js} +1 -1
  70. package/.output/public/_nuxt/{BmJUhCIO.js → D2rZosKf.js} +1 -1
  71. package/.output/public/_nuxt/D7jpwkRG.js +5 -0
  72. package/.output/public/_nuxt/{CZ9ThISn.js → D8NAb7VE.js} +1 -1
  73. package/.output/public/_nuxt/{6-ivqM_I.js → D8vguZKg.js} +1 -1
  74. package/.output/public/_nuxt/{Hot1UcKY.js → DEvYVl9M.js} +1 -1
  75. package/.output/public/_nuxt/{CMhK1PvI.js → DF6Mes5z.js} +1 -1
  76. package/.output/public/_nuxt/{Sgis3xif.js → DGq4A2Pd.js} +1 -1
  77. package/.output/public/_nuxt/{BKJetfRH.js → DH5H1DJh.js} +1 -1
  78. package/.output/public/_nuxt/{Gik813Ek.js → DL8knjzi.js} +1 -1
  79. package/.output/public/_nuxt/{b_yFgp5S.js → DM3bDZC6.js} +1 -1
  80. package/.output/public/_nuxt/{DLNNAYfu.js → DMAiMrNr.js} +1 -1
  81. package/.output/public/_nuxt/{DLn-VPtK.js → DMWfVJCj.js} +1 -1
  82. package/.output/public/_nuxt/{BNAHBHbY.js → DMsm-RGQ.js} +1 -1
  83. package/.output/public/_nuxt/{CD3R-ggS.js → DMtrFQqi.js} +1 -1
  84. package/.output/public/_nuxt/{B9kt7ySS.js → DPZBpFOX.js} +1 -1
  85. package/.output/public/_nuxt/DVEGfqtt.js +2 -0
  86. package/.output/public/_nuxt/{D4UlSVir.js → D_y2VS8k.js} +1 -1
  87. package/.output/public/_nuxt/DaNC-xl1.js +1 -0
  88. package/.output/public/_nuxt/{DzM9oeLa.js → DbmGeOus.js} +1 -1
  89. package/.output/public/_nuxt/{DHUT-BKj.js → DcLbz6DV.js} +1 -1
  90. package/.output/public/_nuxt/{CWw9WGlv.js → DcR0Mmdl.js} +1 -1
  91. package/.output/public/_nuxt/{CDh_Qt7h.js → DhYznn-U.js} +1 -1
  92. package/.output/public/_nuxt/DhuRRlmK.js +1 -0
  93. package/.output/public/_nuxt/{CBZD8ym8.js → Drw8yQg6.js} +1 -1
  94. package/.output/public/_nuxt/{Bt4FLbe0.js → DuO5wfAC.js} +1 -1
  95. package/.output/public/_nuxt/{CRPt9SfB.js → DuOH5jcQ.js} +1 -1
  96. package/.output/public/_nuxt/{BH-ym1CI.js → DvEsAuE9.js} +1 -1
  97. package/.output/public/_nuxt/Dz6g_QJT.js +1 -0
  98. package/.output/public/_nuxt/{4yvOL9PC.js → DzZpIs4W.js} +1 -1
  99. package/.output/public/_nuxt/DzzNS-K1.js +1 -0
  100. package/.output/public/_nuxt/{COP3KBCA.js → Fsw2W4TA.js} +1 -1
  101. package/.output/public/_nuxt/{DWEkQ7bl.js → LwoTUb-r.js} +1 -1
  102. package/.output/public/_nuxt/{BjU3HZuS.js → OfPjZaky.js} +1 -1
  103. package/.output/public/_nuxt/{czXrP7NB.js → P5uOaRUZ.js} +1 -1
  104. package/.output/public/_nuxt/{BTvE9qca.js → Qo6oszaF.js} +1 -1
  105. package/.output/public/_nuxt/{Cd8r0xk5.js → T5UuMUxA.js} +1 -1
  106. package/.output/public/_nuxt/UY8pjaZA.js +1 -0
  107. package/.output/public/_nuxt/{B6s20NbT.js → V9p3z39z.js} +1 -1
  108. package/.output/public/_nuxt/{CJEp4i0N.js → VACXezo0.js} +1 -1
  109. package/.output/public/_nuxt/{CrOA9onF.js → YmCeJkZ2.js} +1 -1
  110. package/.output/public/_nuxt/builds/latest.json +1 -1
  111. package/.output/public/_nuxt/builds/meta/70224ee0-4d1f-45d2-b380-2ecb18064bf1.json +1 -0
  112. package/.output/public/_nuxt/entry.DzPSf_u5.css +1 -0
  113. package/.output/public/_nuxt/fXUwH_3d.js +1 -0
  114. package/.output/public/_nuxt/{t-juTK3X.js → opwuUqHG.js} +1 -1
  115. package/.output/public/_nuxt/{B_mN5eMV.js → opyDpgSw.js} +1 -1
  116. package/.output/public/_nuxt/{HwFFbACq.js → sVV8xB9f.js} +1 -1
  117. package/.output/public/_nuxt/{DSvBQHzW.js → xa5UHCot.js} +1 -1
  118. package/.output/server/chunks/_/collect.mjs +1 -1
  119. package/.output/server/chunks/_/markers.mjs +1 -1
  120. package/.output/server/chunks/_/quarantine.mjs +1 -1
  121. package/.output/server/chunks/_/users.mjs +1 -1
  122. package/.output/server/chunks/build/{Alert-DAb8nKVs.mjs → Alert-He-UxEt6.mjs} +2 -2
  123. package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +1 -0
  124. package/.output/server/chunks/build/{Breadcrumb-DJp5WvUM.mjs → Breadcrumb-DEP2dVCZ.mjs} +3 -3
  125. package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +1 -0
  126. package/.output/server/chunks/build/{BreadcrumbNav-BrQwfL8G.mjs → BreadcrumbNav-y6nMDYcR.mjs} +3 -3
  127. package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +1 -0
  128. package/.output/server/chunks/build/{BrowserBadge-Djw_e_I9.mjs → BrowserBadge-DIASU8Gf.mjs} +6 -66
  129. package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +1 -0
  130. package/.output/server/chunks/build/{ChartCard-B2gd_8HP.mjs → ChartCard-ZTsCvItQ.mjs} +2 -2
  131. package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +1 -0
  132. package/.output/server/chunks/build/{Checkbox-C1khEdTh.mjs → Checkbox-BisdHf8n.mjs} +7 -7
  133. package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +1 -0
  134. package/.output/server/chunks/build/{CodeBlock-CjnDrO3Y.mjs → CodeBlock-B8BNtZAe.mjs} +3 -3
  135. package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +1 -0
  136. package/.output/server/chunks/build/{DashboardNavbar-DYtmVlhy.mjs → DashboardNavbar-D7-3zBUU.mjs} +3 -3
  137. package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +1 -0
  138. package/.output/server/chunks/build/{DashboardSidebarToggle-BPNxODwj.mjs → DashboardSidebarToggle-C3HdHvlE.mjs} +3 -3
  139. package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +1 -0
  140. package/.output/server/chunks/build/{DataLocationCard-2B-sVSMr.mjs → DataLocationCard-CC2-lHiP.mjs} +3 -3
  141. package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +1 -0
  142. package/.output/server/chunks/build/{MetaStripGroup-BBByVvpR.mjs → DesktopRunLocallyButton-iNzrDsEs.mjs} +601 -623
  143. package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +1 -0
  144. package/.output/server/chunks/build/{DiagnosisPanel-D6QO30FQ.mjs → DiagnosisPanel-BVb2LgHu.mjs} +6 -6
  145. package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +1 -0
  146. package/.output/server/chunks/build/{DiagnosisResult-ujB5Lt2A.mjs → DiagnosisResult-xVgZlfKK.mjs} +9 -9
  147. package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +1 -0
  148. package/.output/server/chunks/build/{EntityLinks-F8_kC-IH.mjs → EntityLinks-Dzn73fbq.mjs} +3 -3
  149. package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +1 -0
  150. package/.output/server/chunks/build/{EnvManagedBadge-D6e-10M9.mjs → EnvManagedBadge-C-agmABK.mjs} +3 -3
  151. package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +1 -0
  152. package/.output/server/chunks/build/{FeatureUnavailable-BMw4euTk.mjs → FeatureUnavailable-DHFkwI7t.mjs} +2 -2
  153. package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +1 -0
  154. package/.output/server/chunks/build/{FormField-QptK0rPg.mjs → FormField-GYHKiSI6.mjs} +2 -2
  155. package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +1 -0
  156. package/.output/server/chunks/build/{GetStartedWizard-DxT8T14Y.mjs → GetStartedWizard-BpcGYsm2.mjs} +3 -3
  157. package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +1 -0
  158. package/.output/server/chunks/build/{HelpHint-C5Ru8BCc.mjs → HelpHint-plioHKA0.mjs} +29 -2
  159. package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +1 -0
  160. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs +193 -0
  161. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +1 -0
  162. package/.output/server/chunks/build/{Modal-BacZmQCX.mjs → Modal-hKLvVFNp.mjs} +2 -2
  163. package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +1 -0
  164. package/.output/server/chunks/build/{NavigationMenu-sTiKSWDm.mjs → NavigationMenu-RfBOyS32.mjs} +5 -5
  165. package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +1 -0
  166. package/.output/server/chunks/build/{OpenInIdeLink-Crc8y0Yx.mjs → OpenInIdeLink-Jp6SzEtD.mjs} +5 -5
  167. package/.output/server/chunks/build/{OpenInIdeLink-Crc8y0Yx.mjs.map → OpenInIdeLink-Jp6SzEtD.mjs.map} +1 -1
  168. package/.output/server/chunks/build/{ProjectTestCasesTable-DwjqZ2i5.mjs → ProjectTestCasesTable-DxOTfhi4.mjs} +8 -8
  169. package/.output/server/chunks/build/{ProjectTestCasesTable-DwjqZ2i5.mjs.map → ProjectTestCasesTable-DxOTfhi4.mjs.map} +1 -1
  170. package/.output/server/chunks/build/{RovingFocusItem--OEHI2P3.mjs → RovingFocusItem-BOSx1Z9Z.mjs} +2 -2
  171. package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +1 -0
  172. package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs +1 -1
  173. package/.output/server/chunks/build/{SectionCard-C753B3Yo.mjs → SectionCard-DHAFvJxm.mjs} +2 -2
  174. package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +1 -0
  175. package/.output/server/chunks/build/{Select-BAyYwPuo.mjs → Select-CEyw7HGK.mjs} +4 -4
  176. package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +1 -0
  177. package/.output/server/chunks/build/{SelectMenu-zE_AhMX8.mjs → SelectMenu-C02Hs2_F.mjs} +5 -5
  178. package/.output/server/chunks/build/{SelectMenu-zE_AhMX8.mjs.map → SelectMenu-C02Hs2_F.mjs.map} +1 -1
  179. package/.output/server/chunks/build/{Separator-BbgCfKKJ.mjs → Separator-lrN70ODV.mjs} +2 -2
  180. package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +1 -0
  181. package/.output/server/chunks/build/{SettingsField-D-VriK9X.mjs → SettingsField-tRmytcEJ.mjs} +5 -5
  182. package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +1 -0
  183. package/.output/server/chunks/build/{Slideover-CNbGvbUF.mjs → Slideover-D6cRIqch.mjs} +3 -3
  184. package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +1 -0
  185. package/.output/server/chunks/build/{Switch-DdkA3Fii.mjs → Switch-R2n82ncQ.mjs} +4 -4
  186. package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +1 -0
  187. package/.output/server/chunks/build/{Table-CfDVAuUJ.mjs → Table-qZdnm9t2.mjs} +3 -3
  188. package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +1 -0
  189. package/.output/server/chunks/build/{Tabs-BCOhHEB9.mjs → Tabs-BDP7MWl4.mjs} +3 -3
  190. package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +1 -0
  191. package/.output/server/chunks/build/{TestStatusBar-wquHQqtp.mjs → TestStatusBar-CvsmKJ4D.mjs} +2 -2
  192. package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +1 -0
  193. package/.output/server/chunks/build/{Textarea-Ohs6QTXf.mjs → Textarea-DpmpM-lN.mjs} +2 -2
  194. package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +1 -0
  195. package/.output/server/chunks/build/{Tooltip-BRBnl4pE.mjs → Tooltip-BI3WQErw.mjs} +3 -3
  196. package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +1 -0
  197. package/.output/server/chunks/build/{VisuallyHiddenInput-BHvzNumK.mjs → VisuallyHiddenInput-D4E5aJCQ.mjs} +2 -2
  198. package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +1 -0
  199. package/.output/server/chunks/build/{_id_-BesWjK_d.mjs → _id_-26komi8G.mjs} +47 -37
  200. package/.output/server/chunks/build/{_id_-BesWjK_d.mjs.map → _id_-26komi8G.mjs.map} +1 -1
  201. package/.output/server/chunks/build/{_id_-CQ0lolEK.mjs → _id_-T965GKYC.mjs} +58 -15
  202. package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +1 -0
  203. package/.output/server/chunks/build/{_id_-CGs0u8Fr.mjs → _id_-w7YCSiiy.mjs} +70 -41
  204. package/.output/server/chunks/build/{_id_-CGs0u8Fr.mjs.map → _id_-w7YCSiiy.mjs.map} +1 -1
  205. package/.output/server/chunks/build/{_id_-D1-06Fcl.mjs → _id_-wiULjAVc.mjs} +44 -40
  206. package/.output/server/chunks/build/{_id_-D1-06Fcl.mjs.map → _id_-wiULjAVc.mjs.map} +1 -1
  207. package/.output/server/chunks/build/{about-DdyOj-dj.mjs → about-B3V_OEiu.mjs} +5 -5
  208. package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +1 -0
  209. package/.output/server/chunks/build/{account-7aVMKekZ.mjs → account-DpBdYE46.mjs} +6 -6
  210. package/.output/server/chunks/build/account-DpBdYE46.mjs.map +1 -0
  211. package/.output/server/chunks/build/{ai-zw3T9b5u.mjs → ai-DYhpzbqp.mjs} +16 -16
  212. package/.output/server/chunks/build/{ai-zw3T9b5u.mjs.map → ai-DYhpzbqp.mjs.map} +1 -1
  213. package/.output/server/chunks/build/{analytics-CeCzKwEX.mjs → analytics-CZJEU0an.mjs} +17 -17
  214. package/.output/server/chunks/build/{analytics-CeCzKwEX.mjs.map → analytics-CZJEU0an.mjs.map} +1 -1
  215. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  216. package/.output/server/chunks/build/{db.client-Bdqk_eYQ.mjs → db.client-DijpEH6i.mjs} +3 -1
  217. package/.output/server/chunks/build/db.client-DijpEH6i.mjs.map +1 -0
  218. package/.output/server/chunks/build/{default-CkyAx_Mu.mjs → default-CQa_bmAf.mjs} +505 -89
  219. package/.output/server/chunks/build/default-CQa_bmAf.mjs.map +1 -0
  220. package/.output/server/chunks/build/{docs-Dhj-wEks.mjs → docs-C8bndVXg.mjs} +11 -11
  221. package/.output/server/chunks/build/{docs-Dhj-wEks.mjs.map → docs-C8bndVXg.mjs.map} +1 -1
  222. package/.output/server/chunks/build/{edit-CVz_gdoe.mjs → edit-BdfF9er2.mjs} +12 -12
  223. package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +1 -0
  224. package/.output/server/chunks/build/{fetch-Be-j7hF1.mjs → fetch-tkz5_OA-.mjs} +3 -3
  225. package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +1 -0
  226. package/.output/server/chunks/build/{forgot-password-CwdjL7BO.mjs → forgot-password-swZRcvXE.mjs} +3 -3
  227. package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +1 -0
  228. package/.output/server/chunks/build/{import-DyQEw4V3.mjs → import-B27Sv7h5.mjs} +11 -11
  229. package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +1 -0
  230. package/.output/server/chunks/build/{index-DcnICCZU.mjs → index-BdZmxLtC.mjs} +17 -17
  231. package/.output/server/chunks/build/{index-DcnICCZU.mjs.map → index-BdZmxLtC.mjs.map} +1 -1
  232. package/.output/server/chunks/build/{index-D7Bmj6bq.mjs → index-C7m32bRI.mjs} +9 -9
  233. package/.output/server/chunks/build/index-C7m32bRI.mjs.map +1 -0
  234. package/.output/server/chunks/build/{index-DghAFpNR.mjs → index-Dq6nk6OB.mjs} +385 -104
  235. package/.output/server/chunks/build/index-Dq6nk6OB.mjs.map +1 -0
  236. package/.output/server/chunks/build/{isValueEqualOrExist-D2qw9YEr.mjs → isValueEqualOrExist-D4lZ8uRY.mjs} +3 -3
  237. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +1 -0
  238. package/.output/server/chunks/build/{login-rXKF63j6.mjs → login-hxCF06JT.mjs} +5 -5
  239. package/.output/server/chunks/build/login-hxCF06JT.mjs.map +1 -0
  240. package/.output/server/chunks/build/{mcp-ByNvFy4o.mjs → mcp-BVW1llyW.mjs} +12 -12
  241. package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +1 -0
  242. package/.output/server/chunks/build/{notifications-CbLAZnKJ.mjs → notifications-Dn-evqXM.mjs} +11 -11
  243. package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +1 -0
  244. package/.output/server/chunks/build/{performance-C93MEPaZ.mjs → performance-CV8qm94u.mjs} +10 -10
  245. package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +1 -0
  246. package/.output/server/chunks/build/{pr-feedback-DKCB0bDE.mjs → pr-feedback-gKDz8LyA.mjs} +9 -9
  247. package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +1 -0
  248. package/.output/server/chunks/build/{reset-password-BBoHKMqD.mjs → reset-password-DtEISa1I.mjs} +3 -3
  249. package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +1 -0
  250. package/.output/server/chunks/build/server.mjs +87 -33
  251. package/.output/server/chunks/build/{settings-DiG0JjzC.mjs → settings-BJDnuLpc.mjs} +8 -8
  252. package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +1 -0
  253. package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs +1 -1
  254. package/.output/server/chunks/build/{setup-0-1O6Hjz.mjs → setup-BO9tXa_G.mjs} +14 -14
  255. package/.output/server/chunks/build/{setup-0-1O6Hjz.mjs.map → setup-BO9tXa_G.mjs.map} +1 -1
  256. package/.output/server/chunks/build/{storage-3JiFJ843.mjs → storage-zN92cA9q.mjs} +11 -11
  257. package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +1 -0
  258. package/.output/server/chunks/build/{tags-CqYcp7js.mjs → tags-CJFnoyQc.mjs} +5 -5
  259. package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +1 -0
  260. package/.output/server/chunks/build/{test-cases-y1HSgPX2.mjs → test-cases-0Q6rT73d.mjs} +18 -18
  261. package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +1 -0
  262. package/.output/server/chunks/build/{test-functions-D2ju95Ly.mjs → test-functions-DVRJgiWo.mjs} +9 -9
  263. package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +1 -0
  264. package/.output/server/chunks/build/{useCopyRich-CVFeYfkG.mjs → useCopyRich-BM9GTjJi.mjs} +75 -29
  265. package/.output/server/chunks/build/{useCopyRich-CVFeYfkG.mjs.map → useCopyRich-BM9GTjJi.mjs.map} +1 -1
  266. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs +319 -0
  267. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +1 -0
  268. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs +67 -0
  269. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +1 -0
  270. package/.output/server/chunks/build/{useFormControl-CZ9So7iX.mjs → useFormControl-8skMOTIf.mjs} +2 -2
  271. package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +1 -0
  272. package/.output/server/chunks/build/{useOpenInIde--6Me0WlL.mjs → useOpenInIde-D74FmDNg.mjs} +2 -2
  273. package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +1 -0
  274. package/.output/server/chunks/build/{users-IdmY9JZV.mjs → users-C9bjOBde.mjs} +6 -6
  275. package/.output/server/chunks/build/users-C9bjOBde.mjs.map +1 -0
  276. package/.output/server/chunks/nitro/nitro.mjs +982 -664
  277. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  278. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs +88 -0
  280. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs.map +1 -0
  281. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -1
  282. package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
  283. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
  285. package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
  286. package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
  287. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
  288. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
  289. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
  294. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
  297. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
  299. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
  301. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
  302. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
  304. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
  306. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
  307. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
  308. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
  309. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
  310. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
  311. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
  312. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
  313. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
  315. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  318. package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
  319. package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
  320. package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
  321. package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
  322. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
  324. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  325. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  326. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  327. package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
  328. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
  330. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
  331. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
  332. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
  333. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs +63 -0
  335. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs.map +1 -0
  336. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
  337. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
  341. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
  342. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
  343. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
  345. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
  346. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
  347. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
  348. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
  349. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
  350. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
  352. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +1 -1
  353. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +1 -1
  355. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +1 -1
  356. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
  357. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
  358. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
  359. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
  360. package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
  361. package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
  362. package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
  363. package/.output/server/chunks/routes/api/search.get.mjs +1 -1
  364. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
  365. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
  366. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
  367. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
  368. package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
  369. package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
  370. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
  371. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
  372. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
  373. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
  374. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
  375. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
  376. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
  377. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
  378. package/.output/server/chunks/routes/api/setup-status.get.mjs +1 -1
  379. package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
  380. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
  381. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  382. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
  383. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  384. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
  385. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
  386. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
  387. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +1 -1
  388. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +1 -1
  389. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
  390. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
  391. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
  392. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
  393. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
  394. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
  395. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
  396. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
  397. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
  398. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
  399. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
  400. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
  401. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
  402. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
  403. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
  404. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
  405. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  406. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  407. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
  408. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  409. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  410. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  411. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  412. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  413. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
  414. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
  416. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
  417. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
  418. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
  419. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +1 -1
  420. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
  422. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
  423. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
  424. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  425. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
  426. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  427. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +2 -1
  428. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  429. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  430. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
  431. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
  432. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  433. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  434. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  436. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  437. package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
  438. package/.output/server/chunks/routes/api/version.get.mjs +1 -1
  439. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  440. package/.output/server/chunks/routes/renderer.mjs +1 -1
  441. package/.output/server/database/migrations/0045_productive_stingray.sql +1 -0
  442. package/.output/server/database/migrations/meta/0045_snapshot.json +3779 -0
  443. package/.output/server/database/migrations/meta/_journal.json +7 -0
  444. package/.output/server/database/migrations-pg/0046_gorgeous_hercules.sql +1 -0
  445. package/.output/server/database/migrations-pg/meta/0046_snapshot.json +4486 -0
  446. package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
  447. package/.output/server/index.mjs +1 -1
  448. package/.output/server/package.json +1 -1
  449. package/package.json +1 -1
  450. package/.output/public/_nuxt/B-6GGrhr.js +0 -1
  451. package/.output/public/_nuxt/B9FSuKdA.js +0 -1
  452. package/.output/public/_nuxt/BaDhDBCV.js +0 -1
  453. package/.output/public/_nuxt/Bb7Uckln.js +0 -5
  454. package/.output/public/_nuxt/Be4c943G.js +0 -2
  455. package/.output/public/_nuxt/BpUXqOVj.js +0 -2
  456. package/.output/public/_nuxt/BtSJxOdh.js +0 -1
  457. package/.output/public/_nuxt/CI_q0F1O.js +0 -9
  458. package/.output/public/_nuxt/CScusXhF.js +0 -1
  459. package/.output/public/_nuxt/Cot8fIp5.js +0 -2
  460. package/.output/public/_nuxt/D0ROfwV0.js +0 -1
  461. package/.output/public/_nuxt/D4oheDIm.js +0 -4
  462. package/.output/public/_nuxt/DS2ANCQh.js +0 -1
  463. package/.output/public/_nuxt/DslnXfcH.js +0 -1
  464. package/.output/public/_nuxt/builds/meta/28bca36d-5571-4157-b1b8-7f62c934eed6.json +0 -1
  465. package/.output/public/_nuxt/entry.BAvBQY-h.css +0 -1
  466. package/.output/public/_nuxt/hzsG6cAc.js +0 -1
  467. package/.output/public/_nuxt/jjOqY9Tv.js +0 -1
  468. package/.output/public/_nuxt/xbO0VmDX.js +0 -1
  469. package/.output/server/chunks/build/Alert-DAb8nKVs.mjs.map +0 -1
  470. package/.output/server/chunks/build/Breadcrumb-DJp5WvUM.mjs.map +0 -1
  471. package/.output/server/chunks/build/BreadcrumbNav-BrQwfL8G.mjs.map +0 -1
  472. package/.output/server/chunks/build/BrowserBadge-Djw_e_I9.mjs.map +0 -1
  473. package/.output/server/chunks/build/ChartCard-B2gd_8HP.mjs.map +0 -1
  474. package/.output/server/chunks/build/Checkbox-C1khEdTh.mjs.map +0 -1
  475. package/.output/server/chunks/build/CodeBlock-CjnDrO3Y.mjs.map +0 -1
  476. package/.output/server/chunks/build/DashboardNavbar-DYtmVlhy.mjs.map +0 -1
  477. package/.output/server/chunks/build/DashboardSidebarToggle-BPNxODwj.mjs.map +0 -1
  478. package/.output/server/chunks/build/DataLocationCard-2B-sVSMr.mjs.map +0 -1
  479. package/.output/server/chunks/build/DiagnosisPanel-D6QO30FQ.mjs.map +0 -1
  480. package/.output/server/chunks/build/DiagnosisResult-ujB5Lt2A.mjs.map +0 -1
  481. package/.output/server/chunks/build/EntityLinks-F8_kC-IH.mjs.map +0 -1
  482. package/.output/server/chunks/build/EnvManagedBadge-D6e-10M9.mjs.map +0 -1
  483. package/.output/server/chunks/build/FeatureUnavailable-BMw4euTk.mjs.map +0 -1
  484. package/.output/server/chunks/build/FormField-QptK0rPg.mjs.map +0 -1
  485. package/.output/server/chunks/build/GetStartedWizard-DxT8T14Y.mjs.map +0 -1
  486. package/.output/server/chunks/build/HelpHint-C5Ru8BCc.mjs.map +0 -1
  487. package/.output/server/chunks/build/MetaStripGroup-BBByVvpR.mjs.map +0 -1
  488. package/.output/server/chunks/build/Modal-BacZmQCX.mjs.map +0 -1
  489. package/.output/server/chunks/build/NavigationMenu-sTiKSWDm.mjs.map +0 -1
  490. package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +0 -1
  491. package/.output/server/chunks/build/SectionCard-C753B3Yo.mjs.map +0 -1
  492. package/.output/server/chunks/build/Select-BAyYwPuo.mjs.map +0 -1
  493. package/.output/server/chunks/build/Separator-BbgCfKKJ.mjs.map +0 -1
  494. package/.output/server/chunks/build/SettingsField-D-VriK9X.mjs.map +0 -1
  495. package/.output/server/chunks/build/Slideover-CNbGvbUF.mjs.map +0 -1
  496. package/.output/server/chunks/build/Switch-DdkA3Fii.mjs.map +0 -1
  497. package/.output/server/chunks/build/Table-CfDVAuUJ.mjs.map +0 -1
  498. package/.output/server/chunks/build/Tabs-BCOhHEB9.mjs.map +0 -1
  499. package/.output/server/chunks/build/TestStatusBar-wquHQqtp.mjs.map +0 -1
  500. package/.output/server/chunks/build/Textarea-Ohs6QTXf.mjs.map +0 -1
  501. package/.output/server/chunks/build/Tooltip-BRBnl4pE.mjs.map +0 -1
  502. package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +0 -1
  503. package/.output/server/chunks/build/_id_-CQ0lolEK.mjs.map +0 -1
  504. package/.output/server/chunks/build/about-DdyOj-dj.mjs.map +0 -1
  505. package/.output/server/chunks/build/account-7aVMKekZ.mjs.map +0 -1
  506. package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +0 -1
  507. package/.output/server/chunks/build/default-CkyAx_Mu.mjs.map +0 -1
  508. package/.output/server/chunks/build/edit-CVz_gdoe.mjs.map +0 -1
  509. package/.output/server/chunks/build/fetch-Be-j7hF1.mjs.map +0 -1
  510. package/.output/server/chunks/build/forgot-password-CwdjL7BO.mjs.map +0 -1
  511. package/.output/server/chunks/build/import-DyQEw4V3.mjs.map +0 -1
  512. package/.output/server/chunks/build/index-D7Bmj6bq.mjs.map +0 -1
  513. package/.output/server/chunks/build/index-DghAFpNR.mjs.map +0 -1
  514. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs.map +0 -1
  515. package/.output/server/chunks/build/login-rXKF63j6.mjs.map +0 -1
  516. package/.output/server/chunks/build/mcp-ByNvFy4o.mjs.map +0 -1
  517. package/.output/server/chunks/build/notifications-CbLAZnKJ.mjs.map +0 -1
  518. package/.output/server/chunks/build/performance-C93MEPaZ.mjs.map +0 -1
  519. package/.output/server/chunks/build/pr-feedback-DKCB0bDE.mjs.map +0 -1
  520. package/.output/server/chunks/build/reset-password-BBoHKMqD.mjs.map +0 -1
  521. package/.output/server/chunks/build/settings-DiG0JjzC.mjs.map +0 -1
  522. package/.output/server/chunks/build/storage-3JiFJ843.mjs.map +0 -1
  523. package/.output/server/chunks/build/tags-CqYcp7js.mjs.map +0 -1
  524. package/.output/server/chunks/build/test-cases-y1HSgPX2.mjs.map +0 -1
  525. package/.output/server/chunks/build/test-functions-D2ju95Ly.mjs.map +0 -1
  526. package/.output/server/chunks/build/useFormControl-CZ9So7iX.mjs.map +0 -1
  527. package/.output/server/chunks/build/useOpenInIde--6Me0WlL.mjs.map +0 -1
  528. package/.output/server/chunks/build/users-IdmY9JZV.mjs.map +0 -1
@@ -1 +0,0 @@
1
- import{_ as Is}from"./C9p0YCAi.js";import{_ as Ms}from"./BTvE9qca.js";import{b as Ae,A as wt,d as ie,O as Ot,w as xe,J as ye,k as e,o as s,f,g as t,j as a,_ as ke,c as r,i as n,m as d,t as c,v as R,F as X,y as ae,p as Pe,G as Ee,l as J,P as Lt,Q as Nt,q as re,h as N,r as I,K as Fs,s as $e,R as qt,n as Rt,D as Dt,E as Ht,M as Ps,u as Es,a as Bs,e as Vs,C as Kt,S as Ls,T as Ns}from"./h49q_GXF.js";import{_ as Ks}from"./DOLeth7M.js";import{_ as Qe,a as Os}from"./BtSJxOdh.js";import{_ as Be}from"./DDN2tt0a.js";import{_ as Qt}from"./BKJetfRH.js";import{u as qs}from"./D6Mo5HeX.js";import{u as be}from"./Cd8r0xk5.js";import{_ as Hs}from"./CBZD8ym8.js";import{_ as Qs,a as Gs}from"./B_mN5eMV.js";import{_ as Gt}from"./BFcdtAzg.js";import{_ as ct}from"./DLNNAYfu.js";import{u as Xs}from"./BZnfiR67.js";import{_ as Xt}from"./Sgis3xif.js";import{_ as Ce}from"./BVN50jIb.js";import{C as St,w as Jt,O as rt,a as Wt,_ as Yt,u as Zt}from"./czXrP7NB.js";import{N as Js}from"./CMhK1PvI.js";import{_ as Ws}from"./DQnsFoJn.js";import{_ as Ys}from"./B0hK-xDF.js";import{_ as Zs}from"./C0v6l4pr.js";import{_ as es}from"./CRPt9SfB.js";import{_ as en}from"./cSeAgciy.js";import{_ as tn}from"./CJEp4i0N.js";import{_ as sn}from"./DWEkQ7bl.js";import{_ as nn}from"./Gik813Ek.js";import{_ as Ve}from"./DGyGmFem.js";import{_ as Ge}from"./CWoSSKhQ.js";import{_ as Xe}from"./DzM9oeLa.js";import{f as At,b as an,c as on,d as ln,i as V,t as rn,e as ts,p as it,j as at}from"./CD3R-ggS.js";import{_ as ss}from"./DOBSrxzY.js";import{_ as ut}from"./PdEEuEsg.js";import{_ as dt}from"./DHUT-BKj.js";import{_ as cn}from"./BH-ym1CI.js";import{_ as un}from"./_VzR8bwc.js";import{_ as dn}from"./CWw9WGlv.js";import{_ as mn}from"./CkyMZI-0.js";import{_ as pn}from"./DtSn2Q9-.js";import{_ as gn}from"./BlRWlfdD.js";import{_ as fn}from"./Cwwe5bRS.js";import{_ as _n}from"./CScusXhF.js";import{_ as zt}from"./jjOqY9Tv.js";import{M as vn,D as Tt,g as jt}from"./D7W_4Sqc.js";import{_ as yn}from"./CDh_Qt7h.js";import{u as hn}from"./BUMoU50-.js";import{u as xn}from"./CNcu4khZ.js";import"./BhH0TNTi.js";import"./BjaRappk.js";import"./xbO0VmDX.js";import"./D4UlSVir.js";import"./B9FSuKdA.js";import"./BNAHBHbY.js";import"./D-c8ZSws.js";import"./B6s20NbT.js";import"./x8YSyy4c.js";import"./9N6hSApy.js";import"./4yvOL9PC.js";import"./x8w_1_rn.js";import"./Hot1UcKY.js";const bn=["run.finished","run.failed","run.failed.default_branch","cluster.new","flakiness.spike","perf.regression","diagnosis.completed"],ot=new Map,lt=new Map;function kn(U,$){const k=[{event:"run.failed",scenario:{title:`Test run failed — ${U}`,description:"3 of 12 tests failed on main — checkout › applies discount code +2 more",icon:"i-lucide-circle-x",color:"error"}},{event:"run.failed.default_branch",scenario:{title:`Test run failed on main — ${U}`,description:"2 of 12 tests failed · main — auth › logs in with valid credentials +1 more",icon:"i-lucide-circle-x",color:"error"}},{event:"cluster.new",scenario:{title:`New failure cluster — ${U}`,description:"TimeoutError: locator.click: Timeout 30000ms exceeded",icon:"i-lucide-layers",color:"warning"}},{event:"flakiness.spike",scenario:{title:`Flakiness spike — ${U}`,description:"3 tests became flaky (8.3% rate)",icon:"i-lucide-shuffle",color:"warning"}},{event:"perf.regression",scenario:{title:`Performance regression — ${U}`,description:"p90 duration increased by 42% vs last week",icon:"i-lucide-trending-down",color:"warning"}},{event:"run.finished",scenario:{title:`Test run recovered — ${U}`,description:"All 12 tests passed on main",icon:"i-lucide-circle-check",color:"success"}},{event:"diagnosis.completed",scenario:{title:`Diagnosis complete — ${U}`,description:"Root cause: test bug — confidence: high",icon:"i-lucide-sparkles",color:"info"}}],C=k.filter(x=>$.length===0||$.includes(x.event)).map(x=>x.scenario);return C.length===0?[k[0].scenario,k[k.length-1].scenario]:C}function $n(){if(!wt().public.demoMode)return null;const $=Ae();function k(x,m,i){C(x);const M=kn(m,i);lt.set(x,0);function D(){const A=(lt.get(x)??0)%M.length;lt.set(x,A+1);const v=M[A];$.add({title:v.title,description:v.description,icon:v.icon,color:v.color,duration:7e3});const _=25e3+Math.random()*1e4;ot.set(x,setTimeout(D,_))}ot.set(x,setTimeout(D,8e3))}function C(x){const m=ot.get(x);m!==void 0&&(clearTimeout(m),ot.delete(x)),lt.delete(x)}return{scheduleFor:k,cancelFor:C}}const Cn={key:0,class:"p-3 space-y-3"},Tn={key:0,class:"text-xs text-gray-500"},jn={key:1,class:"text-xs text-gray-500"},Sn={key:2,class:"text-xs text-gray-500"},wn={class:"space-y-1"},Rn=["checked","onChange"],Dn={key:1,class:"p-3 space-y-3"},An={class:"flex items-center justify-between"},zn={class:"font-medium text-sm inline-flex items-center gap-1"},Un={key:0,class:"text-xs text-muted bg-primary/5 rounded px-2 py-1.5"},In={key:1,class:"text-xs text-muted text-center py-2"},Mn={key:2,class:"space-y-1.5"},Fn={key:0,class:"space-y-2 rounded border border-primary/30 bg-primary/5 px-2 py-2"},Pn={class:"space-y-1"},En=["value"],Bn={class:"flex gap-1.5 justify-end"},Vn={class:"flex-1 font-medium truncate"},Ln={key:3,class:"text-xs text-muted text-center py-1"},Nn={key:4,class:"space-y-2 border-t border-default pt-2"},Kn={class:"space-y-1"},On=["value"],qn={class:"flex gap-1.5 justify-end"},Hn=ie({__name:"SubscribeBell",props:{projectId:{},projectLabel:{}},async setup(U){let $,k;const C=U,x=wt(),m=x.public.demoMode,i=N(()=>x.public.authEnabled),{authState:M}=Ot(),D=N(()=>M.value.authenticated),A=Ae(),v=I(!1),_=m?$n():null,b=!i.value&&!m?qs():null,z=I("default"),p=N(()=>"Notification"in window);"Notification"in window&&(z.value=Notification.permission);const y=N(()=>b?.getProject(C.projectId).events??[]),P=N(()=>b?.isSubscribed(C.projectId)??!1);async function K(){!p.value||z.value!=="default"||(z.value=await Notification.requestPermission())}function S(L){return y.value.includes(L)}function g(L){b?.toggleEvent(C.projectId,L)}const T=m||i.value&&D.value,Q=m?{server:!1}:{},{data:w,refresh:H}=([$,k]=xe(()=>be(`/api/subscriptions?projectId=${C.projectId}`,{immediate:T,...Q},"$APDuK86tlj")),$=await $,k(),$),B=N(()=>w.value?.subscriptions??[]),ue=N(()=>B.value.length>0),{data:ge}=([$,k]=xe(()=>be("/api/channels",{immediate:T,...Q},"$uK3f0xlELn")),$=await $,k(),$),h=N(()=>ge.value?.channels??[]),j=I(!1),q=I(void 0),de=I(["run.failed"]),ze=I(!1),me=I(null),he=I(void 0),fe=I([]),Ue=I(!1);function mt(L){me.value=L,he.value=L.channel.id,fe.value=[...L.events]}function pt(){me.value=null}async function Y(){if(!(!me.value||!he.value||fe.value.length===0)){Ue.value=!0;try{await $fetch(`/api/subscriptions/${me.value.id}`,{method:"PATCH",body:{channelId:he.value,events:fe.value}}),await H(),me.value=null}catch(L){A.add({title:"Update failed",description:String(L?.message??L),color:"error"})}finally{Ue.value=!1}}}const Je=N(()=>h.value.map(L=>({label:L.type==="personal_email"?`${L.name} (${L.config.address})`:L.name,value:L.id}))),Le=bn.map(L=>({label:L.replace(/\./g," › "),value:L}));ye(v,L=>{L?(T&&H(),h.value.length>0&&!q.value&&(q.value=h.value[0].id)):(j.value=!1,me.value=null)});async function Ne(){if(!(!q.value||de.value.length===0)){ze.value=!0;try{await $fetch("/api/subscriptions",{method:"POST",body:{channelId:q.value,projectId:C.projectId,events:de.value,mode:"realtime"}}),await H(),j.value=!1,A.add({title:"Subscribed",color:"success"}),m&&_?.scheduleFor(C.projectId,C.projectLabel||"this project",de.value)}catch(L){A.add({title:"Subscribe failed",description:String(L?.message??L),color:"error"})}finally{ze.value=!1}}}async function gt(L){try{await $fetch(`/api/subscriptions/${L}`,{method:"DELETE"}),await H(),A.add({title:"Unsubscribed",color:"success"}),m&&B.value.length===0&&_?.cancelFor(C.projectId)}catch(F){A.add({title:"Failed",description:String(F?.message??F),color:"error"})}}async function ne(L){const F=L.mutedUntil&&new Date(L.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${L.id}`,{method:"PATCH",body:{mutedUntil:F?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await H()}catch(Z){A.add({title:"Failed",description:String(Z?.message??Z),color:"error"})}}function pe(L){return L.mutedUntil&&new Date(L.mutedUntil)>new Date}function Ke(L){return L==="personal_email"?"i-lucide-user-round":L==="email"?"i-lucide-mail":L==="slack"?"i-lucide-slack":"i-lucide-webhook"}const ft=N(()=>m||i.value&&D.value||b!=null),Oe=N(()=>m||i.value?ue.value:P.value);return(L,F)=>{const Z=ke,_t=Ks,Te=Qe,We=Pe,Ye=Ee,Ie=Be,je=Qt,vt=Fs;return e(ft)?(s(),f(vt,{key:0,open:e(v),"onUpdate:open":F[6]||(F[6]=O=>J(v)?v.value=O:null),ui:{content:"w-72"}},{content:t(()=>[e(b)?(s(),r("div",Cn,[F[9]||(F[9]=n("div",{class:"flex items-center justify-between"},[n("span",{class:"font-medium text-sm"},"Browser notifications")],-1)),e(p)&&e(z)==="default"?(s(),r("p",Tn,[a(Z,{variant:"link",size:"xs",class:"p-0",onClick:K},{default:t(()=>[...F[7]||(F[7]=[d(" Allow notifications ",-1)])]),_:1}),F[8]||(F[8]=d(" "+c(" ")+"in your browser to get alerts for this project. ",-1))])):e(p)&&e(z)==="denied"?(s(),r("p",jn," Notifications are blocked. Check your browser settings to allow them. ")):e(p)?R("",!0):(s(),r("p",Sn,"Notifications are not supported in this browser.")),e(p)&&e(z)==="granted"?(s(),r(X,{key:3},[a(_t),n("div",wn,[(s(!0),r(X,null,ae(e(Le),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[n("input",{type:"checkbox",checked:S(O.value),class:"accent-primary size-3",onChange:oe=>g(O.value)},null,40,Rn),d(" "+c(O.label),1)]))),128))])],64)):R("",!0)])):(s(),r("div",Dn,[n("div",An,[n("span",zn,[F[10]||(F[10]=d(" Notifications ",-1)),a(Te,{topic:"notifications.subscribe"})]),e(j)?R("",!0):(s(),f(Z,{key:0,size:"xs",icon:"i-lucide-plus",variant:"ghost",color:"neutral",disabled:e(h).length===0,onClick:F[0]||(F[0]=O=>j.value=!0)},{default:t(()=>[...F[11]||(F[11]=[d(" Add ",-1)])]),_:1},8,["disabled"]))]),e(m)?(s(),r("div",Un,[a(We,{name:"i-lucide-sparkles",class:"size-3 inline-block mr-1 text-primary"}),F[12]||(F[12]=d(" Demo — notifications will appear as toasts in ~8 s. ",-1))])):e(h).length===0?(s(),r("div",In,[F[14]||(F[14]=d(" No channels configured.",-1)),F[15]||(F[15]=n("br",null,null,-1)),a(Ye,{to:"/settings/notifications",class:"text-primary underline"},{default:t(()=>[...F[13]||(F[13]=[d("Add one in Settings",-1)])]),_:1})])):R("",!0),e(B).length>0?(s(),r("div",Mn,[(s(!0),r(X,null,ae(e(B),O=>(s(),r(X,{key:O.id},[e(me)?.id===O.id?(s(),r("div",Fn,[a(je,{label:"Channel",size:"xs"},{default:t(()=>[a(Ie,{modelValue:e(he),"onUpdate:modelValue":F[1]||(F[1]=oe=>J(he)?he.value=oe:null),items:e(Je),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(je,{label:"Events",size:"xs"},{default:t(()=>[n("div",Pn,[(s(!0),r(X,null,ae(e(Le),oe=>(s(),r("label",{key:oe.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Lt(n("input",{type:"checkbox",value:oe.value,"onUpdate:modelValue":F[2]||(F[2]=qe=>J(fe)?fe.value=qe:null),class:"accent-primary size-3"},null,8,En),[[Nt,e(fe)]]),d(" "+c(oe.label),1)]))),128))])]),_:1}),n("div",Bn,[a(Z,{size:"xs",color:"neutral",variant:"ghost",onClick:pt},{default:t(()=>[...F[16]||(F[16]=[d("Cancel",-1)])]),_:1}),a(Z,{size:"xs",color:"primary",loading:e(Ue),disabled:!e(he)||e(fe).length===0,onClick:Y},{default:t(()=>[...F[17]||(F[17]=[d(" Save ",-1)])]),_:1},8,["loading","disabled"])])])):(s(),r("div",{key:1,class:re(["flex items-center gap-2 rounded px-2 py-1.5 text-xs",pe(O)?"opacity-60":""])},[a(We,{name:Ke(O.channel.type),class:"size-3.5 text-muted shrink-0"},null,8,["name"]),n("span",Vn,c(O.channel.name),1),a(Z,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",title:"Edit subscription",onClick:oe=>mt(O)},null,8,["onClick"]),a(Z,{icon:pe(O)?"i-lucide-bell":"i-lucide-bell-off",color:"neutral",variant:"ghost",size:"xs",title:pe(O)?"Unmute":"Mute 7 days",onClick:oe=>ne(O)},null,8,["icon","title","onClick"]),a(Z,{icon:"i-lucide-x",color:"error",variant:"ghost",size:"xs",title:"Unsubscribe",onClick:oe=>gt(O.id)},null,8,["onClick"])],2))],64))),128))])):!e(j)&&e(h).length>0?(s(),r("div",Ln," Not subscribed to this project. ")):R("",!0),e(j)?(s(),r("div",Nn,[a(je,{label:"Channel",size:"xs"},{default:t(()=>[a(Ie,{modelValue:e(q),"onUpdate:modelValue":F[3]||(F[3]=O=>J(q)?q.value=O:null),items:e(Je),"value-key":"value",class:"w-full text-xs",size:"xs"},null,8,["modelValue","items"])]),_:1}),a(je,{label:"Events",size:"xs"},{default:t(()=>[n("div",Kn,[(s(!0),r(X,null,ae(e(Le),O=>(s(),r("label",{key:O.value,class:"flex items-center gap-1.5 text-xs cursor-pointer"},[Lt(n("input",{type:"checkbox",value:O.value,"onUpdate:modelValue":F[4]||(F[4]=oe=>J(de)?de.value=oe:null),class:"accent-primary size-3"},null,8,On),[[Nt,e(de)]]),d(" "+c(O.label),1)]))),128))])]),_:1}),n("div",qn,[a(Z,{size:"xs",color:"neutral",variant:"ghost",onClick:F[5]||(F[5]=O=>j.value=!1)},{default:t(()=>[...F[18]||(F[18]=[d("Cancel",-1)])]),_:1}),a(Z,{size:"xs",color:"primary",loading:e(ze),disabled:!e(q)||e(de).length===0,onClick:Ne},{default:t(()=>[...F[19]||(F[19]=[d(" Subscribe ",-1)])]),_:1},8,["loading","disabled"])])])):R("",!0)]))]),default:t(()=>[a(Z,{icon:e(Oe)?"i-lucide-bell-ring":"i-lucide-bell",size:"sm",color:e(Oe)?"primary":"neutral",variant:e(Oe)?"soft":"outline",title:"Notification subscriptions for this project"},null,8,["icon","color","variant"])]),_:1},8,["open"])):R("",!0)}}}),Qn=Object.assign(Hn,{__name:"SubscribeBell"}),Gn={key:0,class:"flex items-center justify-between gap-3"},Xn={class:"flex items-center gap-2 min-w-0 text-sm"},Jn={class:"text-xs break-all"},Wn={class:"flex items-center gap-1.5 shrink-0"},Yn={key:1,class:"flex items-center justify-between gap-3"},Zn=ie({__name:"DesktopProjectLinkCard",props:{projectId:{}},setup(U){const $=U,{available:k,link:C,busy:x,pickAndLink:m,unlink:i}=Xs(()=>$.projectId);return(M,D)=>{const A=Pe,v=$e,_=ke,b=ct;return e(k)?(s(),f(b,{key:0,icon:"i-lucide-folder-symlink",title:"Local folder"},{subtitle:t(()=>[...D[0]||(D[0]=[d(" Link this project to its checkout on this machine to retry failures from here and open files in your IDE. ",-1)])]),default:t(()=>[e(C)?(s(),r("div",Gn,[n("div",Xn,[a(A,{name:e(C).exists?"i-lucide-folder-check":"i-lucide-folder-x",class:re(["size-4 shrink-0",e(C).exists?"text-success":"text-warning"])},null,8,["name","class"]),n("code",Jn,c(e(C).path),1),e(C).exists?R("",!0):(s(),f(v,{key:0,color:"warning",variant:"subtle",size:"sm"},{default:t(()=>[...D[1]||(D[1]=[d("missing",-1)])]),_:1}))]),n("div",Wn,[a(_,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-folder-search",loading:e(x),onClick:e(m)},{default:t(()=>[...D[2]||(D[2]=[d(" Change ",-1)])]),_:1},8,["loading","onClick"]),a(_,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-unlink",disabled:e(x),onClick:e(i)},{default:t(()=>[...D[3]||(D[3]=[d(" Unlink ",-1)])]),_:1},8,["disabled","onClick"])])])):(s(),r("div",Yn,[D[5]||(D[5]=n("p",{class:"text-sm text-muted"},"No folder linked yet.",-1)),a(_,{size:"xs",icon:"i-lucide-folder-plus",loading:e(x),onClick:e(m)},{default:t(()=>[...D[4]||(D[4]=[d("Choose folder…",-1)])]),_:1},8,["loading","onClick"])]))]),_:1})):R("",!0)}}}),ea=Object.assign(Zn,{__name:"DesktopProjectLinkCard"}),ta={class:"w-full relative"},sa={key:0},na={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},aa={class:"font-semibold mb-1"},oa={class:"capitalize mb-1"},la={class:"space-y-0.5"},ra={class:"font-medium mt-1"},ia=ie({__name:"TestRunsChart",props:{testRuns:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:$}){const k=U,C=$,x=N(()=>k.markers),m=N(()=>!k.testRuns||k.testRuns.length===0?[]:[...k.testRuns].sort((T,Q)=>new Date(T.startTime).getTime()-new Date(Q.startTime).getTime()).slice(-30).map(T=>({id:T.id,date:new Date(T.startTime),passed:T.passedTests||0,failed:T.failedTests||0,skipped:T.skippedTests||0,flaky:T.flakyTests||0,total:T.totalTests||0,status:T.status}))),i=g=>g.date,M=g=>g.passed,D=g=>g.failed,A=g=>g.skipped,v=g=>g.flaky,_=["rgb(34, 197, 94)","rgb(239, 68, 68)","rgb(245, 158, 11)","rgb(147, 51, 234)"],b=I(null),{tooltipData:z,tooltipPos:p,markerTooltip:y,markerTooltipPos:P,onRenderComplete:K}=Zt(b,m,{x:g=>g.date,series:[{y:g=>g.passed,color:_[0]},{y:g=>g.failed,color:_[1]},{y:g=>g.skipped,color:_[2]},{y:g=>g.flaky,color:_[3]}],onClick:g=>Rt(`/test-runs/${g.id}`),markers:x,onMarkerClick:g=>C("marker-click",g.id)}),S=[{color:_[0],label:"Passed"},{color:_[1],label:"Failed"},{color:_[2],label:"Skipped"},{color:_[3],label:"Flaky"}];return(g,T)=>{const Q=Xt,w=Ce,H=Yt;return s(),r("div",ta,[e(m).length>0?(s(),r("div",sa,[a(e(Wt),{ref_key:"xyContainerRef",ref:b,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(K)},{default:t(()=>[a(e(Js),{x:i,y:[M,D,A,v],color:_,"curve-type":e(St).MonotoneX},null,8,["y","curve-type"]),a(e(Jt),{x:i,y:[M,D,A,v],color:_,"curve-type":e(St).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(rt),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),a(e(rt),{type:"y",label:"Tests","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(z)?(s(),r("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[260px]",style:qt({left:`${e(p).x}px`,top:`${e(p).y}px`})},[n("div",na,[n("div",aa,c(new Date(e(z).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",oa,"Status: "+c(e(z).status),1),n("div",la,[n("div",null,[T[0]||(T[0]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Passed: "+c(e(z).passed),1)]),n("div",null,[T[1]||(T[1]=n("span",{class:"text-red-500 dark:text-red-400"},"●",-1)),d(" Failed: "+c(e(z).failed),1)]),n("div",null,[T[2]||(T[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" Skipped: "+c(e(z).skipped),1)]),n("div",null,[T[3]||(T[3]=n("span",{class:"text-purple-500 dark:text-purple-400"},"●",-1)),d(" Flaky: "+c(e(z).flaky),1)]),n("div",ra,"Total: "+c(e(z).total),1)]),T[4]||(T[4]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):R("",!0),a(Q,{marker:e(y),pos:e(P)},null,8,["marker","pos"])])):(s(),f(w,{key:1,text:"No test run data available to display chart"})),a(H,{items:S})])}}}),ca=Object.assign(ia,{__name:"TestRunsChart"}),ua={class:"space-y-3"},da={class:"min-w-0 space-y-1"},ma={class:"flex items-center gap-2 flex-wrap text-sm"},pa={key:0,class:"text-gray-500"},ga=["title"],fa=["title"],_a={key:0,class:"text-xs text-gray-500 italic"},va={class:"flex items-center gap-2 shrink-0"},ya=ie({__name:"ClusterMergeSuggestions",props:{projectId:{}},emits:["merged"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=I([]),i=I(null);async function M(){try{m.value=await $fetch(`/api/projects/${k.projectId}/cluster-merge-suggestions`)}catch{m.value=[]}}ye(()=>k.projectId,M,{immediate:!0});async function D(v,_){i.value=v;try{await $fetch(`/api/cluster-merge-suggestions/${v}/${_}`,{method:"POST"}),x.add({title:_==="approve"?"Clusters merged":"Suggestion dismissed",color:"success"}),await M(),_==="approve"&&C("merged")}catch(b){x.add({title:"Action failed",description:String(b?.message??b),color:"error"})}finally{i.value=null}}const A=v=>v==null?"":`${Math.round(v*100)}% similar`;return(v,_)=>{const b=$e,z=ke,p=ct;return e(m).length?(s(),f(p,{key:0,icon:"i-lucide-git-merge",title:"Suggested merges",count:e(m).length,class:"mb-4"},{subtitle:t(()=>[..._[0]||(_[0]=[d(" Likely-duplicate clusters found by semantic analysis. Approving merges them into the older cluster. ",-1)])]),default:t(()=>[n("div",ua,[(s(!0),r(X,null,ae(e(m),y=>(s(),r("div",{key:y.id,class:"rounded-lg border border-default p-3 flex items-start justify-between gap-4"},[n("div",da,[n("div",ma,[a(b,{color:y.method==="llm"?"primary":"neutral",variant:"subtle",size:"sm"},{default:t(()=>[d(c(y.method==="llm"?`AI · ${y.llmConfidence??""}`:"similarity"),1)]),_:2},1032,["color"]),A(y.score)?(s(),r("span",pa,c(A(y.score)),1)):R("",!0)]),n("p",{class:"text-sm truncate",title:y.clusterA?.signature||""},[_[1]||(_[1]=n("span",{class:"text-gray-400"},"A:",-1)),d(" "+c(y.clusterA?.signature||`#${y.id}`),1)],8,ga),n("p",{class:"text-sm truncate",title:y.clusterB?.signature||""},[_[2]||(_[2]=n("span",{class:"text-gray-400"},"B:",-1)),d(" "+c(y.clusterB?.signature||""),1)],8,fa),y.llmReason?(s(),r("p",_a,c(y.llmReason),1)):R("",!0)]),n("div",va,[a(z,{size:"sm",color:"primary",icon:"i-lucide-git-merge",loading:e(i)===y.id,onClick:P=>D(y.id,"approve")},{default:t(()=>[..._[3]||(_[3]=[d(" Merge ",-1)])]),_:1},8,["loading","onClick"]),a(z,{size:"sm",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:e(i)===y.id,onClick:P=>D(y.id,"reject")},{default:t(()=>[..._[4]||(_[4]=[d(" Dismiss ",-1)])]),_:1},8,["disabled","onClick"])])]))),128))])]),_:1},8,["count"])):R("",!0)}}}),ha=Object.assign(ya,{__name:"ClusterMergeSuggestions"}),xa={class:"flex items-center justify-between"},ba={class:"text-sm text-gray-500 inline-flex items-center gap-1"},ka={class:"min-w-0 space-y-0.5"},$a={key:0,class:"text-xs text-gray-500 italic truncate"},Ca={key:1,class:"text-gray-400 text-xs"},Ta={class:"space-y-1"},ja={class:"text-sm tabular-nums"},Sa={class:"text-sm tabular-nums"},wa={key:1,class:"text-gray-400 text-xs"},Ra={class:"text-sm text-gray-500 whitespace-nowrap"},Da={key:0,class:"ml-1 text-xs text-gray-400"},Aa={class:"flex justify-end"},za=ie({__name:"FailureClustersList",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(void 0),{data:m,pending:i}=([$,k]=xe(()=>be(()=>{const A=new URLSearchParams;x.value&&A.set("status",x.value);const v=A.toString();return`/api/projects/${C.projectId}/failure-clusters${v?`?${v}`:""}`},{lazy:!0,server:!1,watch:[x]},"$fqv4nq7Mtw")),$=await $,k(),$),M=A=>ln(A.fixVerification),D=[{accessorKey:"signature",header:V("Signature")},{accessorKey:"errorType",header:V("Type")},{accessorKey:"status",header:V("Status")},{accessorKey:"affectedTests",header:V("Tests")},{accessorKey:"occurrences",header:V("Occurrences")},{accessorKey:"diagnosis",header:"AI"},{accessorKey:"lastSeenAt",header:V("Last seen")},{id:"actions",header:"Actions"}];return(A,v)=>{const _=Qe,b=Be,z=Ee,p=$e,y=Pe,P=es,K=ke,S=Ve,g=Xe,T=Ce,Q=Ge;return s(),f(Q,null,{header:t(()=>[n("div",xa,[n("p",ba,[v[1]||(v[1]=d(" Ongoing failure signatures grouped by normalized error. ",-1)),a(_,{topic:"cluster.concept"})]),a(b,{modelValue:e(x),"onUpdate:modelValue":v[0]||(v[0]=w=>J(x)?x.value=w:null),items:[{label:"All",value:void 0},{label:"Open",value:"open"},{label:"Resolved",value:"resolved"},{label:"Ignored",value:"ignored"}],size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[a(g,{"min-width":"48rem",bleed:!1},{default:t(()=>[a(S,{data:e(m)??[],columns:D,loading:e(i)},{"actions-header":t(()=>[...v[2]||(v[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"signature-cell":t(({row:w})=>[n("div",ka,[a(z,{to:`/failure-clusters/${w.original.id}`,class:re(["text-sm text-primary hover:underline truncate block",w.original.title?"":"font-mono"]),title:w.original.signature},{default:t(()=>[d(c(w.original.title||w.original.signature),1)]),_:2},1032,["to","class","title"]),w.original.triageNote?(s(),r("p",$a,c(w.original.triageNote),1)):R("",!0)])]),"errorType-cell":t(({row:w})=>[w.original.errorType?(s(),f(p,{key:0,color:("clusterErrorTypeColor"in A?A.clusterErrorTypeColor:e(on))(w.original.errorType),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.errorType),1)]),_:2},1032,["color"])):(s(),r("span",Ca,"—"))]),"status-cell":t(({row:w})=>[n("div",Ta,[a(p,{color:("clusterStatusColor"in A?A.clusterStatusColor:e(an))(w.original.status),variant:"subtle",size:"sm"},{default:t(()=>[d(c(w.original.status),1)]),_:2},1032,["color"]),M(w.original)?(s(),f(P,{key:0,text:M(w.original).hint},{default:t(()=>[a(p,{color:M(w.original).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(y,{name:M(w.original).icon,class:"size-3"},null,8,["name"]),d(" "+c(M(w.original).label),1)]),_:2},1032,["color"])]),_:2},1032,["text"])):R("",!0)])]),"affectedTests-cell":t(({row:w})=>[n("span",ja,c(w.original.affectedTests),1)]),"occurrences-cell":t(({row:w})=>[n("span",Sa,c(w.original.occurrences),1)]),"diagnosis-cell":t(({row:w})=>[w.original.diagnosis?.status==="completed"&&w.original.diagnosis.category?(s(),f(p,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(y,{name:"i-lucide-sparkles",class:"size-3"}),d(" "+c(w.original.diagnosis.category),1)]),_:2},1024)):(s(),r("span",wa,"—"))]),"lastSeenAt-cell":t(({row:w})=>[n("div",Ra,[a(z,{to:`/test-runs/${w.original.lastSeenRunId}`,class:"text-primary hover:underline"},{default:t(()=>[d(" run #"+c(w.original.lastSeenRunId),1)]),_:2},1032,["to"]),w.original.lastSeenAt?(s(),r("span",Da," ("+c(("formatRelativeTime"in A?A.formatRelativeTime:e(At))(w.original.lastSeenAt))+") ",1)):R("",!0)])]),"actions-cell":t(({row:w})=>[n("div",Aa,[a(K,{to:`/failure-clusters/${w.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...v[3]||(v[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(i)&&e(m)&&e(m).length===0?(s(),f(T,{key:0,text:"No failure clusters recorded for this project.",padded:!1,class:"py-4"})):R("",!0)]),_:1})}}}),Ua=Object.assign(za,{__name:"FailureClustersList"}),Ia={class:"flex items-center justify-between"},Ma={class:"flex items-center gap-3"},Fa={class:"text-sm text-gray-500 inline-flex items-center gap-1"},Pa={class:"flex items-center gap-1.5"},Ea={class:"min-w-0 space-y-0.5"},Ba={class:"flex items-center gap-2"},Va={class:"text-sm tabular-nums"},La={class:"text-sm tabular-nums"},Na={key:1,class:"text-gray-400 text-xs"},Ka={key:1,class:"text-gray-400 text-xs"},Oa={key:1,class:"text-gray-400 text-xs"},qa={key:0,class:"text-sm text-gray-500"},Ha={key:1,class:"text-gray-400 text-xs"},Qa={class:"flex justify-end"},Ga={key:0,class:"text-sm text-gray-500 py-4 text-center"},Xa=ie({__name:"FlakyTestsList",props:{projectId:{},environment:{},projectName:{}},async setup(U){let $,k;const C=U,x=I(50),m=I([]),{data:i,pending:M}=([$,k]=xe(()=>be(()=>{const p=new URLSearchParams({runs:String(x.value)});return C.environment&&p.set("environment",C.environment),`/api/projects/${C.projectId}/flaky-tests?${p.toString()}`},{lazy:!0,server:!1,watch:[x,()=>C.environment]},"$BbmtLKIPAB")),$=await $,k(),$),D=N(()=>m.value.length===0?i.value??[]:(i.value??[]).filter(p=>m.value.includes(p.rootCause??"")));function A(p){return p>=60?"error":p>=30?"warning":"neutral"}function v(p){switch(p){case"timing":return"amber";case"network":return"red";case"assertion":return"blue";case"environment":return"purple";default:return"gray"}}function _(p){m.value.indexOf(p)>=0?m.value=m.value.filter(P=>P!==p):m.value=[...m.value,p]}const b=[{label:"Timing",value:"timing"},{label:"Network",value:"network"},{label:"Assertion",value:"assertion"},{label:"Environment",value:"environment"},{label:"Other",value:"other"}],z=[{accessorKey:"title",header:V("Test")},{accessorKey:"impact",header:V("Impact")},{accessorKey:"score",header:V("Score")},{accessorKey:"failureRate",header:V("Failure rate")},{accessorKey:"retryPassRuns",header:V("Retry passes")},{accessorKey:"alternations",header:V("Flips")},{accessorKey:"rootCause",header:"Root cause"},{accessorKey:"lastFlakeAt",header:V("Last flake")},{id:"actions",header:"Actions"}];return(p,y)=>{const P=Qe,K=Pe,S=$e,g=ke,T=Be,Q=Ee,w=ss,H=ut,B=Gt,ue=Ve,ge=Xe,h=Ge;return s(),f(h,null,{header:t(()=>[n("div",Ia,[n("div",Ma,[n("p",Fa,[y[1]||(y[1]=d(" Tests that fail intermittently — detected by retry passes and status alternations ",-1)),a(P,{topic:"project.flaky-tests"})]),U.environment?(s(),f(S,{key:0,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(K,{name:"i-lucide-layers",class:"size-3"}),d(" "+c(U.environment),1)]),_:1})):R("",!0),n("div",Pa,[(s(),r(X,null,ae(b,j=>a(g,{key:j.value,size:"xs",variant:e(m).includes(j.value)?"solid":"outline",color:(e(m).includes(j.value),"neutral"),onClick:q=>_(j.value)},{default:t(()=>[d(c(j.label),1)]),_:2},1032,["variant","color","onClick"])),64))])]),a(T,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=j=>J(x)?x.value=j:null),items:[{label:"Last 20 runs",value:20},{label:"Last 50 runs",value:50},{label:"Last 100 runs",value:100}],size:"xs",class:"w-36"},null,8,["modelValue"])])]),default:t(()=>[a(ge,{"min-width":"52rem",bleed:!1},{default:t(()=>[a(ue,{data:e(D),columns:z,loading:e(M),sticky:"",class:"max-h-[32rem]"},{"actions-header":t(()=>[...y[2]||(y[2]=[n("div",{class:"text-right"},"Actions",-1)])]),"title-cell":t(({row:j})=>[n("div",Ea,[a(Q,{to:`/test-run-cases/${j.original.latestRunsCaseId}`,class:"text-sm font-medium text-primary hover:underline truncate block",title:j.original.title},{default:t(()=>[d(c(j.original.title),1)]),_:2},1032,["to","title"]),a(w,{tags:j.original.tags,meta:{owner:j.original.owner??void 0,priority:("toTestPriority"in p?p.toTestPriority:e(rn))(j.original.priority)},"max-tags":3},null,8,["tags","meta"]),a(H,{"file-path":j.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])])]),"impact-cell":t(({row:j})=>[n("div",Ba,[n("span",{class:re(["inline-block w-2 h-2 rounded-full shrink-0",{"bg-red-500":j.original.wastedCiMinutes>=30,"bg-amber-500":j.original.wastedCiMinutes>=5&&j.original.wastedCiMinutes<30,"bg-green-500":j.original.wastedCiMinutes>=0&&j.original.wastedCiMinutes<5}])},null,2),n("span",Va,c(Math.round(j.original.wastedCiMinutes))+" min wasted",1)])]),"score-cell":t(({row:j})=>[a(S,{color:A(j.original.score),variant:"subtle",size:"sm"},{default:t(()=>[d(c(j.original.score),1)]),_:2},1032,["color"])]),"failureRate-cell":t(({row:j})=>[n("span",La,c(Math.round(j.original.failureRate*100))+"%",1)]),"retryPassRuns-cell":t(({row:j})=>[j.original.retryPassRuns?(s(),f(S,{key:0,color:"warning",variant:"outline",size:"sm"},{default:t(()=>[d(c(j.original.retryPassRuns)+" run"+c(j.original.retryPassRuns===1?"":"s"),1)]),_:2},1024)):(s(),r("span",Na,"—"))]),"alternations-cell":t(({row:j})=>[j.original.alternations>=2?(s(),f(S,{key:0,color:"neutral",variant:"outline",size:"sm"},{default:t(()=>[d(c(j.original.alternations),1)]),_:2},1024)):(s(),r("span",Ka,"—"))]),"rootCause-cell":t(({row:j})=>[j.original.rootCause?(s(),f(B,{key:0,text:j.original.rootCause,color:v(j.original.rootCause)},null,8,["text","color"])):(s(),r("span",Oa,"—"))]),"lastFlakeAt-cell":t(({row:j})=>[j.original.lastFlakeAt?(s(),r("span",qa,c(("formatRelativeTime"in p?p.formatRelativeTime:e(At))(j.original.lastFlakeAt)),1)):(s(),r("span",Ha,"—"))]),"actions-cell":t(({row:j})=>[n("div",Qa,[a(g,{to:`/test-run-cases/${j.original.latestRunsCaseId}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:t(()=>[...y[3]||(y[3]=[d(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data","loading"])]),_:1}),!e(M)&&e(D).length===0?(s(),r("p",Ga," No flaky tests detected in the last "+c(e(x))+" runs. ",1)):R("",!0)]),_:1})}}}),Ja=Object.assign(Xa,{__name:"FlakyTestsList"}),Wa={class:"w-full relative"},Ya={key:0},Za={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},eo={class:"font-semibold mb-1"},to={class:"capitalize mb-1"},so={class:"space-y-0.5"},no={class:"mt-1"},ao={key:0,class:"text-gray-400 dark:text-gray-500 text-xs"},oo=ie({__name:"PerformanceTrendChart",props:{data:{},height:{default:300},markers:{default:()=>[]}},emits:["marker-click"],setup(U,{emit:$}){const k=U,C=$,x=N(()=>k.markers),m=N(()=>!k.data||k.data.length===0?[]:k.data.map(S=>({id:S.id,date:new Date(S.startTime),duration:S.duration?Math.round(S.duration/1e3):null,avgTestDuration:S.avgTestDuration?Math.round(S.avgTestDuration/1e3):null,p90TestDuration:S.p90TestDuration?Math.round(S.p90TestDuration/1e3):null,commit:S.commit?S.commit.substring(0,7):null,status:S.status,totalTests:S.totalTests}))),i=S=>S.date,M=S=>S.duration??void 0,D=S=>S.avgTestDuration??void 0,A=S=>S.p90TestDuration??void 0,v=["rgb(59, 130, 246)","rgb(34, 197, 94)","rgb(249, 115, 22)"],_=I(null),{tooltipData:b,tooltipPos:z,markerTooltip:p,markerTooltipPos:y,onRenderComplete:P}=Zt(_,m,{x:S=>S.date,series:[{y:S=>S.duration,color:v[0]},{y:S=>S.avgTestDuration,color:v[1]},{y:S=>S.p90TestDuration,color:v[2]}],onClick:S=>Rt(`/test-runs/${S.id}`),markers:x,onMarkerClick:S=>C("marker-click",S.id)}),K=[{color:v[0],label:"Total Duration"},{color:v[1],label:"Avg Test Duration"},{color:v[2],label:"P90 Test Duration"}];return(S,g)=>{const T=Xt,Q=Ce,w=Yt;return s(),r("div",Wa,[e(m).length>0?(s(),r("div",Ya,[a(e(Wt),{ref_key:"xyContainerRef",ref:_,data:e(m),height:U.height,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":e(P)},{default:t(()=>[a(e(Jt),{x:i,y:[M,D,A],color:v,"curve-type":e(St).MonotoneX,"line-width":2},null,8,["y","curve-type"]),a(e(rt),{type:"x","tick-format":H=>new Date(H).toLocaleDateString("en-US",{month:"short",day:"numeric"}),label:"Date"},null,8,["tick-format"]),a(e(rt),{type:"y",label:"Duration (s)","tick-format":H=>`${H}s`},null,8,["tick-format"])]),_:1},8,["data","height","on-render-complete"]),e(b)?(s(),r("div",{key:0,class:"fixed z-50 pointer-events-none bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 max-w-[260px]",style:qt({left:`${e(z).x}px`,top:`${e(z).y}px`})},[n("div",Za,[n("div",eo,c(new Date(e(b).date).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})),1),n("div",to,"Status: "+c(e(b).status),1),n("div",so,[n("div",null,[g[0]||(g[0]=n("span",{class:"text-blue-500 dark:text-blue-400"},"●",-1)),d(" Total: "+c(e(b).duration??"-")+"s ",1)]),n("div",null,[g[1]||(g[1]=n("span",{class:"text-green-500 dark:text-green-400"},"●",-1)),d(" Avg: "+c(e(b).avgTestDuration??"-")+"s ",1)]),n("div",null,[g[2]||(g[2]=n("span",{class:"text-orange-500 dark:text-orange-400"},"●",-1)),d(" P90: "+c(e(b).p90TestDuration??"-")+"s ",1)]),n("div",no,"Tests: "+c(e(b).totalTests),1),e(b).commit?(s(),r("div",ao," Commit: "+c(e(b).commit),1)):R("",!0)]),g[3]||(g[3]=n("div",{class:"text-gray-400 dark:text-gray-500 text-xs mt-1"},"Click to view run details",-1))])],4)):R("",!0),a(T,{marker:e(p),pos:e(y)},null,8,["marker","pos"])])):(s(),f(Q,{key:1,text:"No performance data available to display chart"})),a(w,{items:K})])}}}),lo=Object.assign(oo,{__name:"PerformanceTrendChart"}),ro={class:"min-w-0"},io={class:"mt-1"},co={class:"tabular-nums"},uo={key:0,class:"ml-1 text-xs text-gray-500",title:"timeout ÷ p95"},mo={class:"tabular-nums text-gray-500"},po={key:0,class:"text-sm"},go={key:1,class:"tabular-nums"},fo={class:"tabular-nums font-medium text-green-600 dark:text-green-400"},_o={class:"tabular-nums text-gray-500"},vo=ie({__name:"TimeoutOpportunitiesTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,{data:x,pending:m}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/timeout-opportunities`,{lazy:!0,server:!1},"$zikJNhkkxJ")),$=await $,k(),$),i=N(()=>x.value??[]);function M(A){return A==null?"—":A<1e3?`${A}ms`:`${(A/1e3).toFixed(1)}s`}const D=[{accessorKey:"title",header:V("Test case")},{accessorKey:"kind",header:"Type"},{accessorKey:"timeout",header:V("Timeout")},{accessorKey:"p95",header:V("p95")},{accessorKey:"recommendedTimeout",header:"Recommendation"},{accessorKey:"estimatedSavingMs",header:V("Est. saving / failure")},{accessorKey:"runCount",header:V("Runs")}];return(A,v)=>{const _=dt,b=Ce,z=Ee,p=ut,y=$e,P=Ve,K=Xe,S=Ge;return s(),f(S,null,{header:t(()=>[...v[0]||(v[0]=[n("h2",{class:"text-xl font-semibold"},"Timeout opportunities",-1),n("p",{class:"text-sm text-gray-600 mt-1"},[d(" Tests whose configured timeout far exceeds their real duration, or that still carry a stale "),n("code",{class:"text-xs"},"test.slow()"),d(" mark — tightening these makes failures surface sooner. ")],-1)])]),default:t(()=>[e(m)?(s(),f(_,{key:0})):e(i).length===0?(s(),f(b,{key:1,text:"No timeout opportunities",description:"No oversized timeouts or stale test.slow() marks were found for this project."})):(s(),f(K,{key:2,"min-width":"52rem",bleed:!1},{default:t(()=>[a(P,{data:e(i),columns:D,sticky:"",class:"max-h-[32rem]"},{"title-cell":t(({row:g})=>[n("div",ro,[a(z,{to:`/test-cases/${g.original.testCaseId}`,class:"font-medium truncate block hover:text-primary hover:underline"},{default:t(()=>[d(c(g.original.title),1)]),_:2},1032,["to"]),n("div",io,[a(p,{"file-path":g.original.filePath,"project-key":U.projectId,"project-name":U.projectName,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"kind-cell":t(({row:g})=>[a(y,{color:g.original.kind==="oversized-timeout"?"warning":"info",variant:"subtle",size:"sm"},{default:t(()=>[d(c(g.original.kind==="oversized-timeout"?"Oversized timeout":"Stale test.slow()"),1)]),_:2},1032,["color"])]),"timeout-cell":t(({row:g})=>[n("span",co,c(M(g.original.timeout)),1),g.original.headroomRatio!=null?(s(),r("span",uo," ("+c(g.original.headroomRatio)+"×) ",1)):R("",!0)]),"p95-cell":t(({row:g})=>[n("span",mo,c(M(g.original.p95)),1)]),"recommendedTimeout-cell":t(({row:g})=>[g.original.kind==="stale-slow"?(s(),r("span",po,[...v[1]||(v[1]=[d("Remove ",-1),n("code",{class:"text-xs"},"test.slow()",-1)])])):(s(),r("span",go,"Lower to ~"+c(M(g.original.recommendedTimeout)),1))]),"estimatedSavingMs-cell":t(({row:g})=>[n("span",fo,c(M(g.original.estimatedSavingMs)),1)]),"runCount-cell":t(({row:g})=>[n("span",_o,c(g.original.runCount),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),yo=Object.assign(vo,{__name:"TimeoutOpportunitiesTable"}),ho={class:"flex items-center justify-between"},xo={class:"text-sm text-gray-500 inline-flex items-center gap-1"},bo={class:"truncate font-mono text-xs"},ko={class:"tabular-nums"},$o={class:"tabular-nums text-gray-500"},Co={class:"tabular-nums text-gray-500"},To=ie({__name:"SpecHealthTable",props:{projectId:{}},async setup(U){let $,k;const C=U,x=I(30),{data:m,pending:i}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/spec-health?days=${x.value}`,{lazy:!0,server:!1,watch:[x]},"$SX5aqvhtuX")),$=await $,k(),$),M=N(()=>m.value?.specs??[]);function D(p){return p>=.9?"bg-green-500":p>=.7?"bg-amber-500":p>0?"bg-red-500":"bg-gray-300 dark:bg-gray-600"}function A(p){return p>=.9?"text-green-600 dark:text-green-400":p>=.7?"text-amber-600 dark:text-amber-400":p>0?"text-red-600 dark:text-red-400":"text-gray-500"}function v(p){return`${Math.round(p*100)}%`}function _(p){return p<1e3?`${p}ms`:`${(p/1e3).toFixed(1)}s`}const b=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],z=[{accessorKey:"prefix",header:V("Spec prefix")},{accessorKey:"passRate",header:V("Pass rate")},{accessorKey:"flakyRate",header:V("Flaky")},{accessorKey:"failureCount",header:V("Failures")},{accessorKey:"testCount",header:V("Tests")},{accessorKey:"avgDuration",header:V("Avg time")}];return(p,y)=>{const P=Qe,K=Be,S=dt,g=Ce,T=Ee,Q=Ve,w=Xe,H=Ge;return s(),f(H,null,{header:t(()=>[n("div",ho,[n("p",xo,[y[1]||(y[1]=d(" Spec-file health overview — pass rate, flaky rate, and failure count per spec prefix ",-1)),a(P,{topic:"project.spec-health"})]),a(K,{modelValue:e(x),"onUpdate:modelValue":y[0]||(y[0]=B=>J(x)?x.value=B:null),items:b,size:"xs",class:"w-32"},null,8,["modelValue"])])]),default:t(()=>[e(i)?(s(),f(S,{key:0})):e(M).length===0?(s(),f(g,{key:1,text:"No data",description:"No spec health data available for the selected period."})):(s(),f(w,{key:2,"min-width":"46rem",bleed:!1},{default:t(()=>[a(Q,{data:e(M),columns:z,sticky:"",class:"max-h-[32rem]"},{"prefix-cell":t(({row:B})=>[a(T,{to:`/projects/${U.projectId}/test-cases?file=${encodeURIComponent(B.original.prefix)}`,class:"flex items-center gap-2 min-w-0 text-primary hover:underline",title:B.original.prefix},{default:t(()=>[n("span",{class:re(["inline-block size-3 rounded shrink-0",D(B.original.passRate)])},null,2),n("span",bo,c(B.original.prefix),1)]),_:2},1032,["to","title"])]),"passRate-cell":t(({row:B})=>[n("span",{class:re(["font-medium tabular-nums",A(B.original.passRate)])},c(v(B.original.passRate)),3)]),"flakyRate-cell":t(({row:B})=>[n("span",ko,c(Math.round(B.original.flakyRate*100))+"%",1)]),"failureCount-cell":t(({row:B})=>[n("span",{class:re(["tabular-nums",B.original.failureCount>0?"text-red-600 dark:text-red-400":""])},c(B.original.failureCount),3)]),"testCount-cell":t(({row:B})=>[n("span",$o,c(B.original.testCount),1)]),"avgDuration-cell":t(({row:B})=>[n("span",Co,c(_(B.original.avgDuration)),1)]),_:1},8,["data"])]),_:1}))]),_:1})}}}),jo=Object.assign(To,{__name:"SpecHealthTable"}),So={class:"space-y-6"},wo={class:"w-full text-sm"},Ro={class:"px-3 py-2 min-w-0"},Do={class:"text-xs text-muted"},Ao={class:"px-3 py-2 text-muted"},zo={class:"px-3 py-2 whitespace-nowrap"},Uo={key:1,class:"text-xs text-muted"},Io={key:2,class:"text-xs"},Mo={class:"px-3 py-2 whitespace-nowrap text-muted"},Fo={class:"px-3 py-2 text-right"},Po={class:"w-full text-sm"},Eo={class:"px-3 py-2 min-w-0"},Bo={class:"text-xs text-muted"},Vo={class:"px-3 py-2 text-right whitespace-nowrap"},Lo=ie({__name:"QuarantineTable",props:{projectId:{},projectName:{}},async setup(U){let $,k;const C=U,x=Ae(),m=I(null),{data:i,status:M,error:D,refresh:A}=([$,k]=xe(()=>be(()=>`/api/projects/${C.projectId}/quarantine`,"$BSyDdCMaDx")),$=await $,k(),$);function v(z){const p=Math.round(z/36e5);return p<48?`${Math.max(1,p)}h`:`${Math.round(p/24)}d`}async function _(z,p){m.value=z;try{await $fetch(`/api/projects/${C.projectId}/quarantine`,{method:"POST",body:{testCaseId:z,reason:p,source:"proposed"}}),x.add({title:"Quarantined",color:"success"}),await A()}catch{x.add({title:"Could not quarantine that test",color:"error"})}finally{m.value=null}}async function b(z){m.value=z;try{await $fetch(`/api/projects/${C.projectId}/quarantine/${z}`,{method:"DELETE"}),x.add({title:"Released",color:"success"}),await A()}catch{x.add({title:"Could not release that test",color:"error"})}finally{m.value=null}}return(z,p)=>{const y=dt,P=dn,K=mn,S=pn,g=Ce,T=Ee,Q=ss,w=ut,H=$e,B=ke,ue=Xe,ge=ct;return s(),r("div",So,[a(ge,{title:"Quarantine",icon:"i-lucide-shield-alert",count:e(i)?.debt.active,help:"project.quarantine"},{subtitle:t(()=>[...p[0]||(p[0]=[d(" A quarantined test keeps running and keeps reporting — it is excluded from the CI gate's verdict and nothing else. That is what lets it earn its way back out. ",-1)])]),default:t(()=>[e(M)==="pending"?(s(),f(y,{key:0})):e(D)?(s(),f(P,{key:1,text:String(e(D))},null,8,["text"])):(s(),r(X,{key:2},[e(i)&&e(i).debt.active>0?(s(),f(S,{key:0,class:"mb-4"},{default:t(()=>[a(K,{label:"Quarantined",value:e(i).debt.active},null,8,["value"]),a(K,{label:"Ready to release",value:e(i).debt.readyToRelease,"value-class":e(i).debt.readyToRelease>0?"text-green-600 dark:text-green-400":"",hint:"earned their way out"},null,8,["value","value-class"]),a(K,{label:"Still failing",value:e(i).debt.stillFailing,hint:"no passing streak"},null,8,["value"]),a(K,{label:"Oldest",value:v(e(i).debt.oldestAgeMs),size:"sm"},null,8,["value"])]),_:1})):R("",!0),!e(i)||e(i).entries.length===0?(s(),f(g,{key:1,icon:"i-lucide-shield-check",text:"Nothing quarantined. Tests you quarantine appear here with their progress back out."})):(s(),f(ue,{key:2},{default:t(()=>[n("table",wo,[p[2]||(p[2]=n("thead",{class:"text-left text-xs text-muted"},[n("tr",null,[n("th",{class:"px-3 py-2"},"Test"),n("th",{class:"px-3 py-2"},"Reason"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Streak"),n("th",{class:"px-3 py-2 whitespace-nowrap"},"Age"),n("th",{class:"px-3 py-2 text-right"},"Actions")])],-1)),n("tbody",null,[(s(!0),r(X,null,ae(e(i).entries,h=>(s(),r("tr",{key:h.id,class:"border-t border-default"},[n("td",Ro,[a(T,{to:`/test-cases/${h.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(c(h.title),1)]),_:2},1032,["to"]),a(Q,{tags:h.tags,meta:{owner:h.owner??void 0},"max-tags":3,class:"ml-1"},null,8,["tags","meta"]),n("div",Do,[a(w,{"file-path":h.filePath,"project-key":U.projectId,"project-name":U.projectName},null,8,["file-path","project-key","project-name"])])]),n("td",Ao,c(h.reason||"—"),1),n("td",zo,[h.releaseProposed?(s(),f(H,{key:0,color:"success",variant:"soft",size:"xs"},{default:t(()=>[d(c(h.consecutivePasses)+" green — ready ",1)]),_:2},1024)):h.runsSinceQuarantine===0?(s(),r("span",Uo,"not run yet")):(s(),r("span",Io,c(h.consecutivePasses)+" / "+c(e(i).releaseAfterConsecutivePasses),1))]),n("td",Mo,c(v(h.ageMs)),1),n("td",Fo,[a(B,{size:"xs",color:h.releaseProposed?"primary":"neutral",variant:"soft",loading:e(m)===h.testCaseId,onClick:j=>b(h.testCaseId)},{default:t(()=>[...p[1]||(p[1]=[d(" Release ",-1)])]),_:1},8,["color","loading","onClick"])])]))),128))])])]),_:1}))],64))]),_:1},8,["count"]),e(i)&&e(i).candidates.length>0?(s(),f(ge,{key:0,title:"Worth quarantining",icon:"i-lucide-lightbulb",count:e(i).candidates.length},{subtitle:t(()=>[...p[3]||(p[3]=[d(" Ranked by the CI minutes their flakiness wastes, not by how often they flake — a test that flakes constantly but finishes instantly costs nothing. ",-1)])]),default:t(()=>[a(ue,null,{default:t(()=>[n("table",Po,[n("tbody",null,[(s(!0),r(X,null,ae(e(i).candidates,h=>(s(),r("tr",{key:h.testCaseId,class:"border-t border-default"},[n("td",Eo,[a(T,{to:`/test-cases/${h.testCaseId}`,class:"text-primary hover:underline font-medium"},{default:t(()=>[d(c(h.title),1)]),_:2},1032,["to"]),n("div",Bo,c(h.rationale),1)]),n("td",Vo,[a(B,{size:"xs",color:"neutral",variant:"soft",loading:e(m)===h.testCaseId,onClick:j=>_(h.testCaseId,h.rationale)},{default:t(()=>[...p[4]||(p[4]=[d(" Quarantine ",-1)])]),_:1},8,["loading","onClick"])])]))),128))])])]),_:1})]),_:1},8,["count"])):R("",!0)])}}}),No=Object.assign(Lo,{__name:"QuarantineTable"}),Ko={class:"space-y-4"},Oo={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},qo={id:"marker-environments"},Ho=["value"],Qo=ie({__name:"MarkerFormModal",props:{open:{type:Boolean},projectId:{},marker:{},environments:{}},emits:["update:open","saved"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=vn.map(_=>({label:_.label,value:_.id,icon:_.icon})),i=Ps({label:"",occurredAt:"",category:Tt,environment:"",description:""}),M=N(()=>!!k.marker),D=I(!1);function A(_){const b=new Date(_),z=p=>String(p).padStart(2,"0");return`${b.getFullYear()}-${z(b.getMonth()+1)}-${z(b.getDate())}T${z(b.getHours())}:${z(b.getMinutes())}`}ye(()=>k.open,_=>{_&&(k.marker?(i.label=k.marker.label,i.occurredAt=A(k.marker.occurredAt),i.category=k.marker.category||Tt,i.environment=k.marker.environment??"",i.description=k.marker.description??""):(i.label="",i.occurredAt=A(new Date),i.category=Tt,i.environment="",i.description=""))});async function v(){if(!i.label.trim()){x.add({title:"Label is required",color:"error"});return}if(!i.occurredAt){x.add({title:"Date is required",color:"error"});return}D.value=!0;const _={label:i.label.trim(),occurredAt:new Date(i.occurredAt).toISOString(),category:i.category,environment:i.environment.trim()||null,description:i.description.trim()||null};try{k.marker?(await $fetch(`/api/markers/${k.marker.id}`,{method:"PUT",body:_}),x.add({title:"Marker updated",color:"success"})):(await $fetch(`/api/projects/${k.projectId}/markers`,{method:"POST",body:_}),x.add({title:"Marker created",color:"success"})),C("update:open",!1),C("saved")}catch(b){x.add({title:M.value?"Failed to update marker":"Failed to create marker",description:ts(b),color:"error"})}finally{D.value=!1}}return(_,b)=>{const z=Ht,p=Qt,y=Be,P=_n,K=ke,S=zt,g=Dt;return s(),f(g,null,{default:t(()=>[a(S,{open:U.open,title:e(M)?"Edit marker":"Add marker","onUpdate:open":b[6]||(b[6]=T=>C("update:open",T))},{body:t(()=>[n("div",Ko,[a(p,{label:"Label",name:"label",required:""},{default:t(()=>[a(z,{modelValue:e(i).label,"onUpdate:modelValue":b[0]||(b[0]=T=>e(i).label=T),placeholder:"e.g. Migrated CI to new runners",class:"w-full"},null,8,["modelValue"])]),_:1}),n("div",Oo,[a(p,{label:"Date & time",name:"occurredAt",required:""},{default:t(()=>[a(z,{modelValue:e(i).occurredAt,"onUpdate:modelValue":b[1]||(b[1]=T=>e(i).occurredAt=T),type:"datetime-local",class:"w-full"},null,8,["modelValue"])]),_:1}),a(p,{label:"Category",name:"category"},{default:t(()=>[a(y,{modelValue:e(i).category,"onUpdate:modelValue":b[2]||(b[2]=T=>e(i).category=T),items:e(m),class:"w-full"},null,8,["modelValue","items"])]),_:1})]),a(p,{label:"Environment",name:"environment",help:"Optional. Leave empty to apply to all environments."},{default:t(()=>[a(z,{modelValue:e(i).environment,"onUpdate:modelValue":b[3]||(b[3]=T=>e(i).environment=T),list:"marker-environments",placeholder:"e.g. production",class:"w-full"},null,8,["modelValue"]),n("datalist",qo,[(s(!0),r(X,null,ae(U.environments||[],T=>(s(),r("option",{key:T,value:T},null,8,Ho))),128))])]),_:1}),a(p,{label:"Description",name:"description"},{default:t(()=>[a(P,{modelValue:e(i).description,"onUpdate:modelValue":b[4]||(b[4]=T=>e(i).description=T),rows:3,placeholder:"Optional details",class:"w-full"},null,8,["modelValue"])]),_:1})])]),footer:t(()=>[a(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:b[5]||(b[5]=T=>C("update:open",!1))}),a(K,{label:e(M)?"Save changes":"Add marker",icon:e(M)?"i-lucide-check":"i-lucide-plus",loading:e(D),onClick:v},null,8,["label","icon","loading"])]),_:1},8,["open","title"])]),_:1})}}}),Go=Object.assign(Qo,{__name:"MarkerFormModal"}),Xo={class:"md:hidden space-y-3"},Jo={class:"flex items-start justify-between gap-2"},Wo={key:0,class:"flex gap-1 shrink-0"},Yo={class:"text-sm text-muted"},Zo={key:0,class:"text-xs"},el={key:1,class:"text-sm text-muted"},tl={class:"whitespace-nowrap"},sl={class:"text-sm"},nl={class:"text-xs text-muted"},al={class:"font-medium flex items-center gap-1"},ol={key:0,class:"text-xs text-muted line-clamp-1"},ll={key:1,class:"text-xs text-muted"},rl={key:0,class:"flex gap-1 justify-end"},il=ie({__name:"ProjectTimeline",props:{projectId:{},markers:{},environments:{},canEdit:{type:Boolean},focusMarkerId:{}},emits:["changed","clear-focus"],setup(U,{emit:$}){const k=U,C=$,x=Ae(),m=N(()=>[...k.markers].sort((y,P)=>+new Date(P.occurredAt)-+new Date(y.occurredAt))),i=[{accessorKey:"occurredAt",header:"When"},{accessorKey:"category",header:"Category"},{accessorKey:"label",header:"Label"},{accessorKey:"environment",header:"Environment"},{accessorKey:"actions",header:""}],M=I(!1),D=I(null);function A(){D.value=null,M.value=!0}function v(y){D.value=y,M.value=!0}ye(()=>k.focusMarkerId,y=>{if(y==null)return;const P=k.markers.find(K=>K.id===y);P&&v(P),C("clear-focus")},{immediate:!0});const _=I(!1),b=I(null);function z(y){b.value=y,_.value=!0}async function p(){const y=b.value;if(_.value=!1,b.value=null,!!y)try{await $fetch(`/api/markers/${y.id}`,{method:"DELETE"}),x.add({title:"Marker deleted",color:"success"}),C("changed")}catch(P){x.add({title:"Failed to delete marker",description:ts(P),color:"error"})}}return(y,P)=>{const K=ke,S=Ce,g=fn,T=$e,Q=Pe,w=Ve,H=Go,B=zt,ue=Dt,ge=ct;return s(),f(ge,{title:"Timeline markers",count:U.markers.length,icon:"i-lucide-milestone",help:"project.timeline",subtitle:"Dated events overlaid on the analytics charts"},{actions:t(()=>[U.canEdit?(s(),f(K,{key:0,label:"Add marker",icon:"i-lucide-plus",size:"sm",onClick:A})):R("",!0)]),default:t(()=>[U.markers.length===0?(s(),f(S,{key:0,icon:"i-lucide-milestone",text:"No markers yet. Add a deploy, config change, or incident to see it on the charts."})):(s(),r(X,{key:1},[n("div",Xo,[(s(!0),r(X,null,ae(e(m),h=>(s(),r("div",{key:h.id,class:"rounded-lg border border-default p-3 space-y-2"},[n("div",Jo,[a(g,{marker:h},null,8,["marker"]),U.canEdit?(s(),r("div",Wo,[a(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"xs",onClick:j=>v(h)},null,8,["onClick"]),a(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"xs",onClick:j=>z(h)},null,8,["onClick"])])):R("",!0)]),n("div",Yo,c(("prettyDateFormat"in y?y.prettyDateFormat:e(it))(h.occurredAt)),1),h.environment?(s(),r("div",Zo,[a(T,{color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.environment),1)]),_:2},1024)])):R("",!0),h.description?(s(),r("p",el,c(h.description),1)):R("",!0)]))),128))]),a(w,{data:e(m),columns:i,class:"hidden md:block"},{"occurredAt-cell":t(({row:h})=>[n("div",tl,[n("div",sl,c(("prettyDateFormat"in y?y.prettyDateFormat:e(it))(h.original.occurredAt)),1),n("div",nl,c(("formatRelativeTime"in y?y.formatRelativeTime:e(At))(h.original.occurredAt)),1)])]),"category-cell":t(({row:h})=>[a(T,{color:e(jt)(h.original.category).color,variant:"subtle",size:"sm",class:"gap-1"},{default:t(()=>[a(Q,{name:e(jt)(h.original.category).icon,class:"size-3"},null,8,["name"]),d(" "+c(e(jt)(h.original.category).label),1)]),_:2},1032,["color"])]),"label-cell":t(({row:h})=>[n("div",null,[n("div",al,[d(c(h.original.label)+" ",1),h.original.source==="auto"?(s(),f(Q,{key:0,name:"i-lucide-sparkles",class:"size-3 text-muted",title:"Automatically detected"})):R("",!0)]),h.original.description?(s(),r("div",ol,c(h.original.description),1)):R("",!0)])]),"environment-cell":t(({row:h})=>[h.original.environment?(s(),f(T,{key:0,color:"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(h.original.environment),1)]),_:2},1024)):(s(),r("span",ll,"All"))]),"actions-cell":t(({row:h})=>[U.canEdit?(s(),r("div",rl,[a(K,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:j=>v(h.original)},null,8,["onClick"]),a(K,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:j=>z(h.original)},null,8,["onClick"])])):R("",!0)]),_:1},8,["data"])],64)),a(H,{open:e(M),"onUpdate:open":P[0]||(P[0]=h=>J(M)?M.value=h:null),"project-id":U.projectId,marker:e(D),environments:U.environments,onSaved:P[1]||(P[1]=h=>C("changed"))},null,8,["open","project-id","marker","environments"]),a(ue,null,{default:t(()=>[a(B,{open:e(_),title:"Delete marker","onUpdate:open":P[3]||(P[3]=h=>_.value=h)},{body:t(()=>[n("p",null,[P[4]||(P[4]=d(" Delete marker ",-1)),e(b)?(s(),f(g,{key:0,marker:e(b),class:"inline-flex align-middle"},null,8,["marker"])):R("",!0),P[5]||(P[5]=d("? This can't be undone. ",-1))])]),footer:t(()=>[a(K,{color:"neutral",variant:"ghost",label:"Cancel",onClick:P[2]||(P[2]=h=>_.value=!1)}),a(K,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:p})]),_:1},8,["open"])]),_:1})]),_:1},8,["count"])}}}),cl=Object.assign(il,{__name:"ProjectTimeline"}),ul={class:"flex flex-col h-full overflow-y-auto gap-4"},dl={key:0,class:"pb-0 space-y-4"},ml={key:0,class:"text-gray-600"},pl={key:1,class:"flex flex-wrap gap-1 mt-2"},gl={class:"flex flex-wrap items-center gap-3 mb-4"},fl={class:"inline-flex items-center gap-1"},_l=["onClick"],vl={key:0,class:"flex items-center gap-3 px-3 py-2 mb-3 rounded-lg bg-primary-50 dark:bg-primary-900/20 border border-primary-200 dark:border-primary-800"},yl={class:"text-sm text-primary-700 dark:text-primary-300"},hl={key:1,class:"text-xs text-primary-500"},xl=["checked","onClick"],bl={class:"flex items-center gap-2"},kl=["href","onClick"],$l={key:0,class:"text-xs text-gray-500 dark:text-gray-400 truncate max-w-32"},Cl={class:"inline-flex items-center gap-1"},Tl={key:0,class:"flex items-center gap-1"},jl={class:"text-xs text-gray-600"},Sl={key:0,class:"flex items-center gap-1 flex-wrap"},wl={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},Rl={key:1,class:"text-xs text-gray-500"},Dl={class:"space-y-1"},Al={class:"flex justify-end gap-2"},zl={key:2,class:"text-center py-8 text-gray-500"},Ul={class:"text-xs text-gray-400 max-w-sm"},Il={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Ml={class:"flex flex-wrap items-center gap-3"},Fl={class:"text-xl font-semibold inline-flex items-center gap-1"},Pl={class:"font-medium"},El={class:"mt-1"},Bl={key:0,class:"text-red-600 font-medium"},Vl={key:1,class:"text-green-600 font-medium"},Ll={key:2,class:"text-gray-500"},Nl={key:2,class:"text-center py-8 text-red-500"},Kl={key:3,class:"text-center py-8 text-gray-500"},Ol={class:"flex items-center justify-between"},ql={class:"text-xl font-semibold inline-flex items-center gap-1"},Hl={class:"space-y-4"},Ql={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Gl={key:0,class:"text-center py-4 text-gray-500"},Xl={key:1,class:"space-y-4"},Jl={class:"flex gap-4 text-sm"},Wl={key:0,class:"text-gray-400"},Yl={key:0,class:"text-gray-400"},Zl={key:1,class:"text-gray-400"},er={key:1,class:"text-gray-400"},tr={key:0,class:"text-gray-400"},sr={key:0,class:"text-gray-400"},nr={key:2,class:"text-center py-8 text-gray-500"},ar={key:3,class:"text-center py-8 text-gray-500"},or={class:"flex items-center justify-between"},lr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},rr={class:"space-y-4"},ir={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},cr={key:0,class:"text-center py-8 text-gray-500"},ur={key:1,class:"space-y-4"},dr={class:"space-y-2"},mr={class:"flex flex-wrap gap-4 text-sm"},pr={key:3,class:"text-sm text-gray-500"},gr={class:"flex flex-wrap gap-4 text-sm"},fr={key:0,class:"text-gray-400"},_r={key:0,class:"text-gray-400"},vr={key:1,class:"text-gray-400"},yr={key:1,class:"text-gray-400"},hr={key:0,class:"text-gray-400"},xr={key:0,class:"text-gray-400"},br={key:2,class:"text-center py-8 text-gray-500"},kr={key:3,class:"text-center py-8 text-gray-500"},$r={class:"flex items-center justify-between"},Cr={class:"text-sm text-gray-600 inline-flex items-center gap-1"},Tr={key:0,class:"space-y-2"},jr={class:"font-medium text-sm"},Sr={class:"text-xs text-muted flex items-center gap-2"},wr={key:0,class:"italic"},Rr={key:1,class:"text-xs text-muted italic"},Dr={key:1,class:"text-center py-8 text-muted text-sm"},Ar={class:"space-y-4"},zr={class:"text-sm text-gray-600 dark:text-gray-400"},Ur={class:"block text-sm font-medium mb-1"},Ir={class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},Vi=ie({__name:"index",async setup(U){let $,k;const C=Es(),x=Bs(),m=C.params.id,{data:i,refresh:M}=([$,k]=xe(()=>be(`/api/projects/${m}`,"$F60FKvNOBL")),$=await $,k(),$);Vs(N(()=>({title:`${i.value?.label||i.value?.name||"Project"} — Piwi Dashboard`})));const D=Ae(),A=I(null),v=I(null),{isAdmin:_,isReporter:b}=Ot(),z=wt(),p=N(()=>!z.public.authEnabled||_.value),y=p,P=I(!1),K=I(""),S=I(!1),g=N(()=>K.value===i.value?.name);async function T(){if(g.value){S.value=!0;try{await $fetch(`/api/projects/${m}`,{method:"DELETE"}),D.add({title:"Project deleted",color:"success"}),await Ns(),await x.push("/")}catch(u){const o=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;D.add({title:"Delete failed",description:o||"An error occurred",color:"error"}),S.value=!1}}}xn(M);async function Q(u){v.value=null,A.value=u;try{await $fetch(`/api/test-runs/${u}`,{method:"DELETE"}),D.add({title:"Test run deleted",color:"success"}),await M()}catch(o){const E=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;D.add({title:"Delete failed",description:E||"An error occurred",color:"error"})}finally{A.value=null}}const w=I([]),H=I([]),B=I([]),ue=N(()=>{const u=new Map(w.value.map(E=>[E.id,E])),o=[];for(const E of H.value){if(E.role==="administrator")continue;const G=u.get(E.id);o.push({id:E.id,username:E.username,name:E.name??null,role:E.role,global:G?.global??!1,hasAccess:!!G})}for(const E of w.value)E.role==="administrator"&&o.push({...E,hasAccess:!0});return o}),ge=N(()=>{const u=w.value.filter(E=>E.role!=="administrator"&&!E.global).map(E=>E.id).sort(),o=[...B.value].sort();return JSON.stringify(u)!==JSON.stringify(o)});ye(()=>i.value?.id,async u=>{if(!(!u||!_.value))try{const[o,E]=await Promise.all([$fetch(`/api/projects/${m}/members`),$fetch("/api/users")]);w.value=o.users,H.value=E.users,B.value=o.users.filter(G=>G.role!=="administrator"&&!G.global).map(G=>G.id)}catch{w.value=[],H.value=[],B.value=[]}},{immediate:!0});function h(u){const o=B.value.indexOf(u);o>=0?B.value.splice(o,1):B.value.push(u)}async function j(){try{await $fetch(`/api/projects/${m}/members`,{method:"PUT",body:{userIds:B.value}}),D.add({title:"Members updated",color:"success"});const u=await $fetch(`/api/projects/${m}/members`);w.value=u.users}catch(u){const o=u&&typeof u=="object"&&"data"in u?u.data?.message:void 0;D.add({title:"Update failed",description:o||"An error occurred",color:"error"})}}const q=I("test-runs"),de=I(0),ze=["test-runs","failure-clusters","flaky-tests","performance","test-cases","compare","spec-health","quarantine","timeline","members"],me=C.query.tab;typeof me=="string"&&ze.includes(me)&&(q.value=me),ye(q,u=>{C.query.tab!==u&&ze.includes(u)&&x.replace({query:{...C.query,tab:u}})});const he=N(()=>i.value?.testRuns?.some(u=>u.failedTests>0)??!1),fe=N(()=>[{label:"Results",items:[{label:`Test runs (${L.value.length})`,icon:"i-lucide-play-circle",value:"test-runs",slot:"test-runs"},{label:`Test cases${qe.value!=null?` (${qe.value})`:""}`,icon:"i-lucide-list-checks",value:"test-cases",slot:"test-cases"},{label:"Compare",icon:"i-lucide-git-compare-arrows",value:"compare",slot:"compare"}]},{label:"Failures",items:[...he.value?[{label:"Failure clusters",icon:"i-lucide-layers",value:"failure-clusters",slot:"failure-clusters"}]:[],{label:"Flaky tests",icon:"i-lucide-shuffle",value:"flaky-tests",slot:"flaky-tests"},{label:"Quarantine",icon:"i-lucide-shield-alert",value:"quarantine",slot:"quarantine"}]},{label:"Health",items:[{label:"Spec health",icon:"i-lucide-table-2",value:"spec-health",slot:"spec-health"},{label:"Performance",icon:"i-lucide-trending-up",value:"performance",slot:"performance"},{label:`Timeline${Te.value.length?` (${Te.value.length})`:""}`,icon:"i-lucide-milestone",value:"timeline",slot:"timeline"}]},..._.value?[{label:"Admin",items:[{label:"Members",icon:"i-lucide-users",value:"members",slot:"members"}]}]:[]]),Ue=N(()=>fe.value.flatMap(u=>u.items)),mt=N(()=>fe.value.map(u=>u.items).filter(u=>u.length>0)),pt=N(()=>Ue.value.find(u=>u.value===q.value)?.icon),Y=I([]),Je=u=>Y.value.includes(u);function Le(u){const o=Y.value.indexOf(u);if(o>=0)Y.value.splice(o,1);else{if(Y.value.length>=2){D.add({title:"Maximum 2 runs",description:"Select at most 2 runs to compare. Deselect one first.",color:"warning"});return}Y.value.push(u)}}const Ne=I(null);function gt(){Y.value.length===2&&(Ne.value=[Y.value[0],Y.value[1]],q.value="compare")}const ne=I([]),pe=I(!0),Ke=N(()=>{const u=new Set;for(const o of i.value?.testRuns||[])o.environment&&u.add(o.environment);return[...u].sort()});function ft(u){const o=ne.value.indexOf(u);o===-1?ne.value.push(u):ne.value.splice(o,1)}function Oe(u){return ne.value.includes(u)}const L=N(()=>{let u=i.value?.testRuns||[];return pe.value&&(u=u.filter(o=>o.isFullRun!==!1)),ne.value.length===0?u:u.filter(o=>o.environment&&ne.value.includes(o.environment))}),F=N(()=>ne.value.length===1?ne.value[0]:void 0),{data:Z,refresh:_t}=([$,k]=xe(()=>be(`/api/projects/${m}/markers`,{default:()=>({markers:[]})},"$jubPXy8o3y")),$=await $,k(),$),Te=N(()=>Z.value?.markers??[]),We=N(()=>!z.public.authEnabled||_.value||b.value),Ye=N(()=>ne.value.length===0?Te.value:Te.value.filter(u=>u.environment==null||ne.value.includes(u.environment))),Ie=I(null);function je(u){Ie.value=u,q.value="timeline"}const vt=N(()=>{const u=i.value?.testRuns||[];return pe.value?u.filter(o=>o.isFullRun!==!1):u});function O(u){if(u.isFullRun!==!1)return"Full run — the complete test suite ran";const o=[],E=u.filterDetails?.grep?.trim(),G=u.filterDetails?.grepInvert?.trim(),_e=u.filterDetails?.files;return E&&E!==".*"&&o.push(`grep: ${E}`),G&&o.push(`grep-invert: ${G}`),_e?.length&&o.push(`files: ${_e.join(", ")}`),o.length?`Partial run — ${o.join(" · ")}`:"Partial run — only a filtered subset of tests ran (grep, file, or line filter)"}const oe=[{accessorKey:"select",header:""},{accessorKey:"id",header:V("Run")},{accessorKey:"status",header:V("Status")},{accessorKey:"isFullRun",header:"Scope"},{id:"browsers",accessorFn:u=>u.browsers,header:""},{accessorKey:"startTime",header:V("Started")},{accessorKey:"environment",header:V("Environment")},{accessorKey:"metadata",header:"Branch / Commit"},{accessorKey:"duration",header:V("Test status / Dur.")},{accessorKey:"reports",header:"Reports"},{id:"actions",header:"Actions"}],qe=I(null),Se=I(""),we=I(""),ns=N(()=>{const u={};return Se.value&&(u.from=Se.value),we.value&&(u.to=we.value),u}),yt=I(null),ht=I(!1),Me=I(null),xt=I(!1),Ze=I(!1),as=N(()=>ht.value&&yt.value===null);ye([q,ns,pe],async([u,o])=>{if(u!=="performance")return;ht.value=!0,Me.value||(Ze.value=!0);const E=new URLSearchParams(o).toString(),G=pe.value?`${E?"&":""}fullRunsOnly=true`:"",_e=E||G?`?${E}${G}`:"";yt.value=await $fetch(`/api/projects/${m}/performance${_e}`).catch(ve=>(console.warn("[PerformanceTab] Failed to fetch performance trend:",ve),null)),ht.value=!1,Ze.value&&(xt.value=!1,Me.value=await $fetch(`/api/projects/${m}/slow-tests`).catch(ve=>(xt.value=!0,console.warn("[PerformanceTab] Failed to fetch slow tests:",ve),null)),Ze.value=!1)},{immediate:!0});const os=[{accessorKey:"title",header:V("Test case")},{accessorKey:"avgDuration",header:V("Avg duration")},{accessorKey:"maxDuration",header:V("Max")},{accessorKey:"minDuration",header:V("Min")},{accessorKey:"latestDuration",header:V("Latest")},{accessorKey:"trend",header:V("Trend")},{accessorKey:"runCount",header:V("Runs")}];function ls(u){const o=it(u.startTime,{dateOnly:!0}),E=u.metadata?.scm?.commit?` (${u.metadata.scm.commit.substring(0,7)})`:"";return`Run #${u.id} — ${o}${E}`}const ce=N(()=>i.value?.testRuns?[...i.value.testRuns].reverse().map(u=>({label:ls(u),value:u.id})):[]),ee=I(void 0),te=I(void 0),Ut=N(()=>C.query.runA?Number(C.query.runA):null),It=N(()=>C.query.runB?Number(C.query.runB):null);ye(ce,u=>{if(Ut.value){const o=u.find(E=>E.value===Ut.value);o&&(ee.value=o)}if(It.value){const o=u.find(E=>E.value===It.value);o&&(te.value=o)}},{immediate:!0}),ye(Ne,u=>{if(u){const o=ce.value.find(G=>G.value===u[0]),E=ce.value.find(G=>G.value===u[1]);o&&(ee.value=o),E&&(te.value=E),Ne.value=null}});function Mt(){ce.value.length>=2&&(ee.value=ce.value[1],te.value=ce.value[0])}const bt=I(null),kt=I(null),et=I(!1);async function rs(){const u=ee.value,o=te.value;if(!(!u?.value&&!o?.value)){et.value=!0;try{const E=[];u?.value&&E.push(u.value),o?.value&&E.push(o.value);const G=await Promise.all(E.map(ve=>$fetch(`/api/test-runs/${ve}/summary`))),_e=new Map;for(const ve of G)_e.set(ve.id,ve);bt.value=u?.value?_e.get(u.value)??null:null,kt.value=o?.value?_e.get(o.value)??null:null}catch{bt.value=null,kt.value=null}finally{et.value=!1}}}ye([ee,te],()=>{rs()});const{comparisonData:tt,comparisonSummary:W}=hn(bt,kt),Ft=[{accessorKey:"title",header:V("Test case")},{accessorKey:"statusA",header:V("Status A")},{accessorKey:"statusB",header:V("Status B")},{accessorKey:"durationA",header:V("Duration A")},{accessorKey:"durationB",header:V("Duration B")},{accessorKey:"delta",header:V("Delta")},{accessorKey:"percentChange",header:V("Change")}];return(u,o)=>{const E=Is,G=Ms,_e=Qn,ve=Hs,is=Gs,cs=Gt,us=ea,ds=Be,ms=ca,Pt=Ws,ps=Ys,Fe=Qe,le=ke,gs=Zs,$t=Pe,fs=es,_s=en,se=$e,vs=tn,Re=sn,ys=nn,st=Ve,hs=Os,xs=Ce,He=Ge,bs=ha,ks=Ua,$s=Ja,Ct=Ht,Et=dt,Cs=lo,Ts=ut,js=yo,nt=cn,Ss=un,ws=jo,Rs=No,Ds=gn,As=cl,zs=yn,Us=Qs,Bt=zt,Vt=Dt;return s(),r(X,null,[a(Us,{id:"project-detail"},{header:t(()=>[a(is,null,{leading:t(()=>[a(E),a(G,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:e(i)?.label||e(i)?.name||"Project"}]},null,8,["items"])]),right:t(()=>[a(ve,{size:"sm",actions:[...e(p)?[{label:"Delete",icon:"i-lucide-trash-2",color:"error",variant:"ghost",onClick:()=>{K.value="",P.value=!0}}]:[],...e(y)?[{label:"Import",icon:"i-lucide-import",variant:"outline",to:`/projects/${e(m)}/import`}]:[],{label:"Test functions",icon:"i-lucide-function-square",variant:"outline",to:`/projects/${e(m)}/test-functions`},{label:"Edit",icon:"i-lucide-pencil",variant:"outline",to:`/projects/${e(m)}/edit`},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>e(M)()}]},{leading:t(()=>[a(_e,{"project-id":parseInt(e(m)),"project-label":e(i)?.label||e(i)?.name},null,8,["project-id","project-label"])]),_:1},8,["actions"])]),_:1})]),body:t(()=>[n("div",ul,[e(i)?.description||e(i)?.tags&&e(i).tags.length>0?(s(),r("div",dl,[e(i)?.description?(s(),r("p",ml,c(e(i).description),1)):R("",!0),e(i)?.tags&&e(i).tags.length>0?(s(),r("div",pl,[(s(!0),r(X,null,ae(e(i).tags,l=>(s(),f(cs,{key:l.id,text:l.text,color:l.color},null,8,["text","color"]))),128))])):R("",!0)])):R("",!0),a(us,{"project-id":e(m)},null,8,["project-id"]),a(ds,{modelValue:e(q),"onUpdate:modelValue":o[0]||(o[0]=l=>J(q)?q.value=l:null),items:e(mt),icon:e(pt),size:"md",class:"w-full mx-1 mb-1 sm:hidden"},null,8,["modelValue","items","icon"]),a(zs,{modelValue:e(q),"onUpdate:modelValue":o[14]||(o[14]=l=>J(q)?q.value=l:null),items:e(Ue),size:"sm",class:"p-1",ui:{list:"max-sm:hidden overflow-x-auto",trigger:"shrink-0"}},{"test-runs":t(()=>[e(i)?.testRuns&&e(i).testRuns.length>0?(s(),f(Pt,{key:0,title:"Run trend",subtitle:`Test run statistics over time for ${e(i)?.label||e(i)?.name}`,help:"project.runs-trend"},{default:t(()=>[a(ms,{"test-runs":e(vt),height:200,markers:e(Ye),onMarkerClick:je},null,8,["test-runs","markers"])]),_:1},8,["subtitle"])):R("",!0),a(He,{class:"mt-4"},{default:t(()=>[n("div",gl,[n("div",fl,[a(ps,{modelValue:e(pe),"onUpdate:modelValue":o[1]||(o[1]=l=>J(pe)?pe.value=l:null),label:"Full runs only",ui:{label:"text-sm"}},null,8,["modelValue"]),a(Fe,{topic:"project.run-scope"})]),e(Ke).length>0?(s(),r(X,{key:0},[o[21]||(o[21]=n("span",{class:"text-sm text-muted shrink-0"},"Environment:",-1)),(s(!0),r(X,null,ae(e(Ke),l=>(s(),r("button",{key:l,type:"button",class:re(["text-xs font-medium px-2 py-1 rounded border cursor-pointer focus:outline-none transition-colors",Oe(l)?"bg-blue-100 text-blue-700 border-blue-300 dark:bg-blue-900/40 dark:text-blue-300 dark:border-blue-700":"bg-zinc-100 text-zinc-500 border-zinc-200 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-400 dark:border-zinc-700 dark:hover:bg-zinc-700"]),onClick:De=>ft(l)},c(l),11,_l))),128)),e(ne).length>0?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filter",onClick:o[2]||(o[2]=l=>ne.value=[])})):R("",!0)],64)):R("",!0)]),e(Y).length>0?(s(),r("div",vl,[n("span",yl,c(e(Y).length)+" run"+c(e(Y).length>1?"s":"")+" selected ",1),e(Y).length===2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",color:"primary",label:"Compare selected runs",onClick:gt})):(s(),r("span",hl," Select another run to compare ")),a(le,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[3]||(o[3]=l=>Y.value=[])})])):R("",!0),e(L).length>0?(s(),f(st,{key:1,data:e(L),columns:oe,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"select-cell":t(({row:l})=>[n("input",{type:"checkbox",checked:Je(l.original.id),class:"cursor-pointer size-4 accent-primary",onClick:Kt(De=>Le(l.original.id),["stop"])},null,8,xl)]),"id-cell":t(({row:l})=>[n("div",bl,[n("a",{href:`/test-runs/${l.original.id}`,class:"text-primary hover:underline font-medium",onClick:Kt(De=>("navigateTo"in u?u.navigateTo:e(Rt))(`/test-runs/${l.original.id}`),["prevent"])}," Run #"+c(l.original.id),9,kl),l.original.label?(s(),r("span",$l,c(l.original.label),1)):R("",!0)])]),"status-cell":t(({row:l})=>[a(gs,{status:l.original.status},null,8,["status"])]),"isFullRun-header":t(()=>[n("span",Cl,[o[22]||(o[22]=d("Scope ",-1)),a(Fe,{topic:"run.partial"})])]),"isFullRun-cell":t(({row:l})=>[a(fs,{text:O(l.original)},{default:t(()=>[a($t,{name:l.original.isFullRun===!1?"i-lucide-list-filter":"i-lucide-list-checks",class:re(["size-4 shrink-0 cursor-help",l.original.isFullRun===!1?"text-amber-500":"text-green-500"])},null,8,["name","class"])]),_:2},1032,["text"])]),"browsers-cell":t(({row:l})=>[l.original.browsers?.length?(s(),r("div",Tl,[(s(!0),r(X,null,ae(l.original.browsers,De=>(s(),f(_s,{key:De,browser:{projectName:De},size:"sm"},null,8,["browser"]))),128))])):R("",!0)]),"startTime-cell":t(({row:l})=>[n("span",jl,c(("prettyDateFormat"in u?u.prettyDateFormat:e(it))(l.original.startTime)),1)]),"environment-cell":t(({row:l})=>[l.original.environment?(s(),f(se,{key:0,color:"info",variant:"subtle",size:"sm"},{default:t(()=>[d(c(l.original.environment),1)]),_:2},1024)):R("",!0)]),"metadata-cell":t(({row:l})=>[l.original.metadata?.scm?(s(),r("div",Sl,[l.original.metadata.scm.branch?(s(),r("span",wl,c(l.original.metadata.scm.branch),1)):R("",!0),l.original.metadata.scm.commit?(s(),r("code",Rl,c(l.original.metadata.scm.commit.substring(0,7)),1)):R("",!0)])):R("",!0)]),"duration-cell":t(({row:l})=>[n("div",Dl,[a(vs,{passed:l.original.passedTests,failed:l.original.failedTests,skipped:l.original.skippedTests,flaky:l.original.flakyTests,"did-not-run":l.original.didNotRunTests??0,total:l.original.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"]),a(Re,{ms:l.original.duration,class:"text-xs text-gray-500"},null,8,["ms"])])]),"reports-cell":t(({row:l})=>[a(ys,{reports:l.original.reports},null,8,["reports"])]),"actions-header":t(()=>[...o[23]||(o[23]=[n("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":t(({row:l})=>[n("div",Al,[a(le,{to:`/test-runs/${l.original.id}`,size:"sm",variant:"outline"},{default:t(()=>[...o[24]||(o[24]=[d(" View ",-1)])]),_:1},8,["to"]),a(le,{size:"sm",color:"error",variant:"soft",icon:"i-lucide-trash-2",loading:e(A)===l.original.id,onClick:De=>v.value=l.original.id},{default:t(()=>[...o[25]||(o[25]=[d(" Delete ",-1)])]),_:1},8,["loading","onClick"])])]),_:1},8,["data"])):e(i)?.testRuns&&e(i).testRuns.length>0?(s(),r("div",zl," No test runs match the selected environment filter. ")):(s(),f(xs,{key:3,icon:"i-lucide-rocket",text:"No test runs yet for this project."},{default:t(()=>[n("p",Ul,[o[27]||(o[27]=d(" Point the reporter's ",-1)),o[28]||(o[28]=n("code",{class:"bg-gray-100 dark:bg-gray-800 px-1 rounded"},"projectName",-1)),o[29]||(o[29]=d(" at ",-1)),n("code",Il,c(e(i)?.name),1),o[30]||(o[30]=d(" to send results here — see the ",-1)),a(hs,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:t(()=>[...o[26]||(o[26]=[d("reporter docs",-1)])]),_:1}),o[31]||(o[31]=d(" for setup instructions. ",-1))])]),_:1}))]),_:1})]),"failure-clusters":t(()=>[e(q)==="failure-clusters"?(s(),r(X,{key:0},[(s(),f(bs,{key:`sug-${e(de)}`,"project-id":String(e(m)),onMerged:o[4]||(o[4]=l=>de.value++)},null,8,["project-id"])),(s(),f(ks,{key:e(de),"project-id":String(e(m))},null,8,["project-id"]))],64)):R("",!0)]),"flaky-tests":t(()=>[e(q)==="flaky-tests"?(s(),f($s,{key:0,"project-id":String(e(m)),environment:e(F),"project-name":e(i)?.name},null,8,["project-id","environment","project-name"])):R("",!0)]),performance:t(()=>[n("div",Ml,[o[32]||(o[32]=n("span",{class:"text-sm text-muted shrink-0"},"Date range:",-1)),a(Ct,{modelValue:e(Se),"onUpdate:modelValue":o[5]||(o[5]=l=>J(Se)?Se.value=l:null),type:"date",size:"sm",placeholder:"From",class:"w-40"},null,8,["modelValue"]),o[33]||(o[33]=n("span",{class:"text-sm text-muted"},"to",-1)),a(Ct,{modelValue:e(we),"onUpdate:modelValue":o[6]||(o[6]=l=>J(we)?we.value=l:null),type:"date",size:"sm",placeholder:"To",class:"w-40"},null,8,["modelValue"]),e(Se)||e(we)?(s(),f(le,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear",onClick:o[7]||(o[7]=l=>{Se.value="",we.value=""})})):R("",!0)]),a(Pt,{title:"Performance trend",subtitle:"Duration metrics over time",help:"project.performance"},{default:t(()=>[e(as)?(s(),f(Et,{key:0,text:"Loading chart…"})):(s(),f(Cs,{key:1,data:e(yt)||[],height:350,markers:e(Ye),onMarkerClick:je},null,8,["data","markers"]))]),_:1}),a(He,null,{header:t(()=>[n("h2",Fl,[o[34]||(o[34]=d(" Slowest tests ",-1)),a(Fe,{topic:"project.slowest-tests"})]),o[35]||(o[35]=n("p",{class:"text-sm text-gray-600 mt-1"},"Top 20 slowest test cases across recent runs",-1))]),default:t(()=>[e(Ze)&&e(Me)===null?(s(),f(Et,{key:0,text:"Loading…"})):e(Me)&&e(Me).length>0?(s(),f(st,{key:1,data:e(Me),columns:os,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"title-cell":t(({row:l})=>[n("div",null,[n("div",Pl,c(l.original.title),1),n("div",El,[a(Ts,{"file-path":l.original.filePath,"project-key":e(m),"project-name":e(i)?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])])])]),"trend-cell":t(({row:l})=>[l.original.trend==="slower"?(s(),r("span",Bl,"▲ Slower")):l.original.trend==="faster"?(s(),r("span",Vl,"▼ Faster")):(s(),r("span",Ll,"— Stable"))]),_:1},8,["data"])):e(xt)?(s(),r("div",Nl," Couldn't load the slowest tests — try refreshing. ")):(s(),r("div",Kl,"No slow test data available yet."))]),_:1}),a(js,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"]),a(He,null,{header:t(()=>[n("div",Ol,[n("div",null,[n("h2",ql,[o[36]||(o[36]=d(" Run comparison ",-1)),a(Fe,{topic:"project.run-compare"})]),o[37]||(o[37]=n("p",{class:"text-sm text-gray-600 mt-1"},"Compare duration changes between two runs",-1))]),e(ce).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Compare latest vs previous",onClick:Mt})):R("",!0)])]),default:t(()=>[n("div",Hl,[n("div",Ql,[n("div",null,[o[38]||(o[38]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),a(nt,{modelValue:e(ee),"onUpdate:modelValue":o[8]||(o[8]=l=>J(ee)?ee.value=l:null),items:e(ce),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[o[39]||(o[39]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),a(nt,{modelValue:e(te),"onUpdate:modelValue":o[9]||(o[9]=l=>J(te)?te.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(et)?(s(),r("div",Gl,[a($t,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[40]||(o[40]=d(" Loading run data… ",-1))])):e(ee)&&e(te)&&e(tt).length>0?(s(),r("div",Xl,[n("div",Jl,[a(se,{color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).improved)+" improved",1)]),_:1}),a(se,{color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).regressed)+" regressed",1)]),_:1}),a(se,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).unchanged)+" unchanged",1)]),_:1})]),a(st,{data:e(tt),columns:Ft,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",Wl,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",Yl,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Re,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",Zl,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Re,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",er,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",tr,"—")):(s(),r("span",{key:1,class:re(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(c(l.original.delta>0?"+":""),1),a(Re,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",sr,"—")):(s(),r("span",{key:1,class:re(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(l.original.percentChange>0?"+":"")+c(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(ee)||!e(te)?(s(),r("div",nr," Select two runs to compare their performance. ")):(s(),r("div",ar," No overlapping test cases found between the selected runs. "))])]),_:1})]),"test-cases":t(()=>[a(Ss,{"project-id":e(m),"project-name":e(i)?.name,"sync-query":"",onTotal:o[10]||(o[10]=l=>qe.value=l)},null,8,["project-id","project-name"])]),compare:t(()=>[a(He,null,{header:t(()=>[n("div",or,[n("p",lr,[o[41]||(o[41]=d(" Compare two test runs side-by-side — status changes and duration deltas ",-1)),a(Fe,{topic:"project.compare"})]),e(ce).length>=2?(s(),f(le,{key:0,icon:"i-lucide-git-compare-arrows",size:"sm",variant:"outline",label:"Latest vs previous",onClick:Mt})):R("",!0)])]),default:t(()=>[n("div",rr,[n("div",ir,[n("div",null,[o[42]||(o[42]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run A (baseline)",-1)),a(nt,{modelValue:e(ee),"onUpdate:modelValue":o[11]||(o[11]=l=>J(ee)?ee.value=l:null),items:e(ce),placeholder:"Select run A..."},null,8,["modelValue","items"])]),n("div",null,[o[43]||(o[43]=n("label",{class:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"},"Run B (comparison)",-1)),a(nt,{modelValue:e(te),"onUpdate:modelValue":o[12]||(o[12]=l=>J(te)?te.value=l:null),items:e(ce),placeholder:"Select run B..."},null,8,["modelValue","items"])])]),e(et)?(s(),r("div",cr,[a($t,{name:"i-lucide-loader-2",class:"animate-spin mr-2"}),o[44]||(o[44]=d(" Loading run data… ",-1))])):e(ee)&&e(te)&&e(tt).length>0?(s(),r("div",ur,[n("div",dr,[n("div",mr,[o[45]||(o[45]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Status changes",-1)),e(W).newFailures>0?(s(),f(se,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).newFailures)+" new failure"+c(e(W).newFailures>1?"s":""),1)]),_:1})):R("",!0),e(W).recovered>0?(s(),f(se,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).recovered)+" recovered ",1)]),_:1})):R("",!0),e(W).stillFailing>0?(s(),f(se,{key:2,color:"warning",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).stillFailing)+" still failing ",1)]),_:1})):R("",!0),e(W).newFailures===0&&e(W).recovered===0&&e(W).stillFailing===0?(s(),r("span",pr,"No status changes")):R("",!0)]),n("div",gr,[o[46]||(o[46]=n("span",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mr-1"},"Duration changes",-1)),e(W).regressed>0?(s(),f(se,{key:0,color:"error",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).regressed)+" regressed ",1)]),_:1})):R("",!0),e(W).improved>0?(s(),f(se,{key:1,color:"success",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).improved)+" improved ",1)]),_:1})):R("",!0),a(se,{color:"neutral",variant:"soft",size:"lg"},{default:t(()=>[d(c(e(W).unchanged)+" unchanged ",1)]),_:1})])]),a(st,{data:e(tt),columns:Ft,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"statusA-cell":t(({row:l})=>[l.original.statusA?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusA),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusA),1)]),_:2},1032,["color"])):(s(),r("span",fr,"—"))]),"statusB-cell":t(({row:l})=>[l.original.statusB?(s(),f(se,{key:1,color:("getStatusColor"in u?u.getStatusColor:e(at))(l.original.statusB),variant:"subtle",class:"capitalize"},{default:t(()=>[d(c(l.original.statusB),1)]),_:2},1032,["color"])):(s(),r("span",_r,"—"))]),"durationA-cell":t(({row:l})=>[l.original.durationA!==null?(s(),f(Re,{key:0,ms:l.original.durationA},null,8,["ms"])):(s(),r("span",vr,"—"))]),"durationB-cell":t(({row:l})=>[l.original.durationB!==null?(s(),f(Re,{key:0,ms:l.original.durationB},null,8,["ms"])):(s(),r("span",yr,"—"))]),"delta-cell":t(({row:l})=>[l.original.delta===null?(s(),r("span",hr,"—")):(s(),r("span",{key:1,class:re(l.original.delta>0?"text-red-600":l.original.delta<0?"text-green-600":"text-gray-500")},[d(c(l.original.delta>0?"+":""),1),a(Re,{ms:l.original.delta,"unit-class":"opacity-60"},null,8,["ms"])],2))]),"percentChange-cell":t(({row:l})=>[l.original.percentChange===null?(s(),r("span",xr,"—")):(s(),r("span",{key:1,class:re(l.original.percentChange>10?"text-red-600 font-medium":l.original.percentChange<-10?"text-green-600 font-medium":"text-gray-500")},c(l.original.percentChange>0?"+":"")+c(l.original.percentChange)+"% ",3))]),_:1},8,["data"])])):!e(ee)||!e(te)?(s(),r("div",br," Select two runs to compare test results. ")):(s(),r("div",kr," No overlapping test cases found between the selected runs. "))])]),_:1})]),"spec-health":t(()=>[a(ws,{"project-id":String(e(m))},null,8,["project-id"])]),quarantine:t(()=>[a(Rs,{"project-id":String(e(m)),"project-name":e(i)?.name},null,8,["project-id","project-name"])]),members:t(()=>[a(He,null,{header:t(()=>[n("div",$r,[n("p",Cr,[o[47]||(o[47]=d(" Users with access to this project ",-1)),a(Fe,{topic:"project.members"})]),a(le,{label:"Save changes",icon:"i-lucide-check",size:"sm",disabled:!e(ge),onClick:j},null,8,["disabled"])])]),default:t(()=>[e(ue).length>0?(s(),r("div",Tr,[(s(!0),r(X,null,ae(e(ue),l=>(s(),r("div",{key:l.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[n("div",null,[n("div",jr,c(l.name||l.username),1),n("div",Sr,[n("span",null,"@"+c(l.username),1),a(se,{color:l.role==="administrator"?"primary":l.role==="reporter"?"info":"neutral",variant:"subtle",size:"xs"},{default:t(()=>[d(c(l.role),1)]),_:2},1032,["color"]),l.global?(s(),r("span",wr,"Global access")):R("",!0)])]),l.role!=="administrator"?(s(),f(Ds,{key:0,"model-value":e(B).includes(l.id),disabled:l.global,title:l.global?"Has global access — remove global assignment first":"",onChange:De=>h(l.id)},null,8,["model-value","disabled","title","onChange"])):(s(),r("span",Rr,"Admin"))]))),128))])):(s(),r("div",Dr,"Loading members…"))]),_:1})]),timeline:t(()=>[a(As,{"project-id":Number(e(m)),markers:e(Te),environments:e(Ke),"can-edit":e(We),"focus-marker-id":e(Ie),onChanged:e(_t),onClearFocus:o[13]||(o[13]=l=>Ie.value=null)},null,8,["project-id","markers","environments","can-edit","focus-marker-id","onChanged"])]),_:1},8,["modelValue","items"])])]),_:1}),a(Vt,null,{default:t(()=>[a(Bt,{open:e(P),title:"Delete project","onUpdate:open":o[17]||(o[17]=l=>{l||(P.value=!1)})},{body:t(()=>[n("div",Ar,[n("p",zr,[o[48]||(o[48]=d(" This will permanently delete ",-1)),n("strong",null,c(e(i)?.label||e(i)?.name),1),o[49]||(o[49]=d(" and all its test runs, reports, traces, and failure clusters. This action cannot be undone. ",-1))]),n("div",null,[n("label",Ur,[o[50]||(o[50]=d(" Type the project key ",-1)),n("code",Ir,c(e(i)?.name),1),o[51]||(o[51]=d(" to confirm: ",-1))]),a(Ct,{modelValue:e(K),"onUpdate:modelValue":o[15]||(o[15]=l=>J(K)?K.value=l:null),placeholder:e(i)?.name,autofocus:"",onKeydown:Ls(T,["enter"])},null,8,["modelValue","placeholder"])])])]),footer:t(()=>[a(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:o[16]||(o[16]=l=>P.value=!1)}),a(le,{color:"error",label:"Delete project",icon:"i-lucide-trash-2",disabled:!e(g),loading:e(S),onClick:T},null,8,["disabled","loading"])]),_:1},8,["open"])]),_:1}),a(Vt,null,{default:t(()=>[a(Bt,{open:e(v)!==null,title:"Delete test run","onUpdate:open":o[20]||(o[20]=l=>{l||(v.value=null)})},{body:t(()=>[n("p",null,[o[52]||(o[52]=d(" Are you sure you want to delete ",-1)),n("strong",null,"Run #"+c(e(v)),1),o[53]||(o[53]=d("? This will also remove all associated test results, reports, and traces. This action cannot be undone. ",-1))])]),footer:t(()=>[a(le,{color:"neutral",variant:"ghost",label:"Cancel",onClick:o[18]||(o[18]=l=>v.value=null)}),a(le,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:e(A)===e(v),onClick:o[19]||(o[19]=l=>Q(e(v)))},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{Vi as default};
@@ -1,4 +0,0 @@
1
- import{_ as Le}from"./C9p0YCAi.js";import{_ as Pe}from"./BTvE9qca.js";import{_ as _e,a as De,b as Oe,c as He,d as qe,e as Ke,f as Ge,g as ke,u as We,h as Je,i as Qe,j as Ze,k as Xe,l as Ye,m as et}from"./Bb7Uckln.js";import{d as ee,o as s,f as S,g as p,i as t,j as r,c as l,t as o,v as d,s as ce,k as e,m as b,p as te,G as be,F as B,y as Z,_ as ie,h as D,H as tt,q as Y,I as st,r as x,J as ae,B as nt,l as Q,E as $e,K as at,L as ot,C as fe,M as lt,b as rt,u as it,w as ct,e as ut,N as dt}from"./h49q_GXF.js";import{_ as Ce}from"./CRPt9SfB.js";import{_ as mt,a as ft}from"./B_mN5eMV.js";import{_ as ge}from"./BtSJxOdh.js";import{_ as pt}from"./C0v6l4pr.js";import{_ as gt}from"./DLNNAYfu.js";import{_ as we}from"./CScusXhF.js";import{_ as xt,a as vt,i as ht,b as yt,s as ve,c as _t}from"./DBhdObsO.js";import{c as he,f as re,a as kt,b as bt,d as $t,g as Se,s as pe,e as de,r as ye,h as Ct}from"./CD3R-ggS.js";import{_ as xe}from"./PdEEuEsg.js";import{_ as wt}from"./CDh_Qt7h.js";import{_ as St}from"./BH-ym1CI.js";import{_ as Tt}from"./DHUT-BKj.js";import{_ as It}from"./CWw9WGlv.js";import{_ as Te}from"./jjOqY9Tv.js";import{u as jt,p as Rt,_ as zt}from"./6-ivqM_I.js";import{b as Ut}from"./BZnfiR67.js";import{a as Et,u as Vt}from"./Cd8r0xk5.js";import"./BhH0TNTi.js";import"./DOLeth7M.js";import"./BDQCwxpX.js";import"./BaDhDBCV.js";import"./9N6hSApy.js";import"./Dj-TetcW.js";import"./D-c8ZSws.js";import"./CWoSSKhQ.js";import"./BjaRappk.js";import"./Hot1UcKY.js";import"./xbO0VmDX.js";import"./BNAHBHbY.js";import"./B6s20NbT.js";import"./Cf52zHyB.js";import"./t-juTK3X.js";const At={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Mt={class:"flex items-center gap-3 min-w-0"},Nt={class:"font-mono text-sm truncate text-gray-600 dark:text-gray-400 min-w-0"},Ft={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Bt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Lt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Pt={key:1,class:"text-xs text-gray-400 whitespace-nowrap"},Dt={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ot={class:"lg:col-span-9"},Ht={class:"space-y-3"},qt={key:0,class:"text-sm font-medium break-words text-gray-500 dark:text-gray-400"},Kt={class:"flex flex-wrap gap-2"},Gt={class:"text-sm text-gray-500"},Wt={key:1,class:"rounded-md border border-default p-3 space-y-1.5"},Jt={class:"flex items-center gap-2 flex-wrap"},Qt={key:0,class:"text-xs text-gray-500"},Zt={class:"text-xs text-gray-500"},Xt={class:"text-sm text-gray-500"},Yt={class:"font-mono text-xs"},es={class:"flex items-start gap-3"},ts={class:"flex flex-col gap-1 shrink-0"},ss={class:"flex-1 min-w-0 space-y-1.5"},ns={class:"flex justify-end"},as=ee({__name:"ClusterSummary",props:{cluster:{},triageStatus:{},triageNote:{},triageSaving:{type:Boolean},triageChanged:{type:Boolean}},emits:["update:triageStatus","update:triageNote","save-triage"],setup(a,{emit:j}){const f=a,$=j,m=D(()=>$t(f.cluster.fixVerification)),C=[{label:"Open",value:"open",color:"warning"},{label:"Resolved",value:"resolved",color:"success"},{label:"Ignored",value:"ignored",color:"neutral"}];return(n,u)=>{const y=ce,U=te,E=ge,R=be,T=pt,h=gt,I=ie,v=we,A=xt;return s(),S(A,{"storage-key":"failure-cluster"},{folded:p(()=>[t("div",At,[t("div",Mt,[r(y,{color:("clusterStatusColor"in n?n.clusterStatusColor:e(bt))(a.cluster.status),variant:"solid",size:"sm",class:"shrink-0 capitalize"},{default:p(()=>[b(o(a.cluster.status),1)]),_:1},8,["color"]),t("span",Nt,o(a.cluster.signature),1),a.cluster.errorType?(s(),S(y,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(he))(a.cluster.errorType),variant:"subtle",size:"sm"},{default:p(()=>[b(o(a.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),e(m)?(s(),S(y,{key:1,color:e(m).color,variant:"subtle",size:"sm",class:"gap-1 shrink-0"},{default:p(()=>[r(U,{name:e(m).icon,class:"size-3"},null,8,["name"]),b(" "+o(e(m).label),1)]),_:1},8,["color"])):d("",!0)]),t("div",Ft,[t("span",Bt,o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1),t("span",Lt,o(a.cluster.affectedTests)+" "+o(a.cluster.affectedTests===1?"test":"tests"),1),a.cluster.diagnosis?.status==="completed"&&a.cluster.diagnosis?.category?(s(),S(y,{key:0,color:"neutral",variant:"outline",size:"sm",class:"gap-1 whitespace-nowrap"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),b(" "+o(a.cluster.diagnosis.category),1)]),_:1})):d("",!0),a.cluster.lastSeenAt?(s(),l("span",Pt," last seen "+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.lastSeenAt)),1)):d("",!0)])])]),default:p(()=>[t("div",Dt,[t("div",Ot,[r(h,{title:a.cluster.signature},{default:p(()=>[t("div",Ht,[a.cluster.title?(s(),l("p",qt,o(a.cluster.title),1)):d("",!0),t("div",Kt,[a.cluster.errorType?(s(),S(y,{key:0,color:("clusterErrorTypeColor"in n?n.clusterErrorTypeColor:e(he))(a.cluster.errorType),variant:"subtle"},{default:p(()=>[b(o(a.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),r(y,{color:"neutral",variant:"subtle"},{default:p(()=>[b(o(a.cluster.occurrences)+" occurrence"+o(a.cluster.occurrences===1?"":"s"),1)]),_:1}),r(y,{color:"neutral",variant:"subtle"},{default:p(()=>[b(o(a.cluster.affectedTests)+" "+o(a.cluster.affectedTests===1?"test":"tests")+" affected ",1)]),_:1}),a.cluster.diagnosis?.status==="completed"&&a.cluster.diagnosis?.category?(s(),S(y,{key:1,color:"neutral",variant:"outline",class:"gap-1"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),b(" "+o(a.cluster.diagnosis.category),1)]),_:1})):d("",!0),r(E,{topic:"cluster.concept"})]),t("p",Gt,[u[2]||(u[2]=b(" First seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[b(" run #"+o(a.cluster.firstSeenRunId),1)]),_:1},8,["to"]),a.cluster.firstSeenAt?(s(),l(B,{key:0},[b(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.firstSeenAt))+") ",1)],64)):d("",!0),u[3]||(u[3]=b(" · Last seen in ",-1)),r(R,{to:`/test-runs/${a.cluster.lastSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[b(" run #"+o(a.cluster.lastSeenRunId),1)]),_:1},8,["to"]),a.cluster.lastSeenAt?(s(),l(B,{key:1},[b(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.lastSeenAt))+") ",1)],64)):d("",!0),a.cluster.lastSeenRunStatus?(s(),S(T,{key:2,status:a.cluster.lastSeenRunStatus,size:"sm",class:"ml-1 align-middle"},null,8,["status"])):d("",!0)]),e(m)?(s(),l("div",Wt,[t("div",Jt,[r(y,{color:e(m).color,variant:"subtle",class:"gap-1"},{default:p(()=>[r(U,{name:e(m).icon,class:"size-3"},null,8,["name"]),b(" "+o(e(m).label),1)]),_:1},8,["color"]),a.cluster.timeToResolutionMs!=null?(s(),l("span",Qt," open for "+o(("formatDuration"in n?n.formatDuration:e(kt))(a.cluster.timeToResolutionMs)),1)):d("",!0),r(E,{topic:"cluster.resolution"})]),t("p",Zt,o(e(m).hint),1),t("p",Xt,[a.cluster.fixLandedRunId?(s(),l(B,{key:0},[u[4]||(u[4]=b(" Fix landed in ",-1)),r(R,{to:`/test-runs/${a.cluster.fixLandedRunId}`,class:"text-primary hover:underline"},{default:p(()=>[b(" run #"+o(a.cluster.fixLandedRunId),1)]),_:1},8,["to"])],64)):d("",!0),a.cluster.fixLandedAt?(s(),l(B,{key:1},[b(" ("+o(("formatRelativeTime"in n?n.formatRelativeTime:e(re))(a.cluster.fixLandedAt))+")",1)],64)):d("",!0),a.cluster.fixCommit?(s(),l(B,{key:2},[u[5]||(u[5]=b(" · commit ",-1)),t("code",Yt,o(a.cluster.fixCommit.slice(0,8)),1)],64)):d("",!0)])])):d("",!0)])]),_:1},8,["title"])]),r(h,{class:"lg:col-span-3",icon:"i-lucide-triangle-alert","icon-class":"text-amber-500",title:"Triage",help:"cluster.triage"},{default:p(()=>[t("div",es,[t("div",ts,[(s(),l(B,null,Z(C,M=>r(I,{key:M.value,size:"xs",class:"justify-start",color:a.triageStatus===M.value?M.color:"neutral",variant:a.triageStatus===M.value?"solid":"outline",onClick:O=>$("update:triageStatus",M.value)},{default:p(()=>[b(o(M.label),1)]),_:2},1032,["color","variant","onClick"])),64))]),t("div",ss,[r(v,{"model-value":a.triageNote,placeholder:"Optional note…",rows:3,class:"text-sm w-full","onUpdate:modelValue":u[0]||(u[0]=M=>$("update:triageNote",M))},null,8,["model-value"]),t("div",ns,[a.triageChanged?(s(),S(I,{key:0,size:"xs",icon:"i-lucide-check",loading:a.triageSaving,onClick:u[1]||(u[1]=M=>$("save-triage"))},{default:p(()=>[...u[6]||(u[6]=[b(" Save ",-1)])]),_:1},8,["loading"])):d("",!0)])])])]),_:1})])]),_:1})}}}),os=Object.assign(as,{__name:"ClusterSummary"}),ls={class:"divide-y divide-default"},rs={class:"text-xs font-mono text-gray-700 dark:text-gray-300 break-all whitespace-pre-wrap"},is={class:"text-xs font-mono text-gray-600 dark:text-gray-400 truncate"},cs=ee({__name:"TestEvidenceSignals",props:st({consoleLogs:{},networkRequests:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(a){const j=a,f=D(()=>Array.isArray(j.consoleLogs)?j.consoleLogs.filter(u=>u.type==="error"||u.type==="warning"):[]),$=D(()=>Array.isArray(j.networkRequests)?j.networkRequests.filter(u=>u.status&&u.status>=400):[]),m=D(()=>f.value.length>0||$.value.length>0),C=D(()=>{const u=[];return f.value.length&&u.push(`${f.value.length} console`),$.value.length&&u.push(`${$.value.length} network`),u.join(", ")}),n=tt(a,"open");return(u,y)=>{const U=te,E=ce,R=_e;return e(m)?(s(),S(R,{key:0,icon:"i-lucide-triangle-alert",label:`Signals (${e(C)})`,open:n.value,"onUpdate:open":y[0]||(y[0]=T=>n.value=T)},{default:p(()=>[t("div",ls,[e(f).length>0?(s(),l(B,{key:0},[y[1]||(y[1]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Console")],-1)),(s(!0),l(B,null,Z(e(f),(T,h)=>(s(),l("div",{key:"log-"+h,class:"px-3 py-1.5 flex items-start gap-2"},[r(U,{name:T.type==="error"?"i-lucide-x-circle":"i-lucide-alert-triangle",class:Y(["size-3.5 mt-0.5 shrink-0",T.type==="error"?"text-red-500":"text-yellow-500"])},null,8,["name","class"]),t("p",rs,o(T.text),1)]))),128))],64)):d("",!0),e($).length>0?(s(),l(B,{key:1},[y[2]||(y[2]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Network")],-1)),(s(!0),l(B,null,Z(e($),(T,h)=>(s(),l("div",{key:"req-"+h,class:"px-3 py-1.5 flex items-center gap-2"},[r(E,{color:T.status>=500?"error":"warning",variant:"subtle",size:"sm",class:"shrink-0 font-mono"},{default:p(()=>[b(o(T.status),1)]),_:2},1032,["color"]),t("p",is,o(T.url),1)]))),128))],64)):d("",!0)])]),_:1},8,["label","open"])):d("",!0)}}}),us=Object.assign(cs,{__name:"TestEvidenceSignals"}),ds={class:"space-y-3"},ms={key:0,class:"flex gap-0 border-b border-default overflow-x-auto"},fs=["title","onClick"],ps={key:0,class:"opacity-60 ml-1"},gs={key:1,class:"flex items-start justify-between gap-2 flex-wrap"},xs={class:"min-w-0"},vs={class:"text-sm font-medium break-words"},hs={key:2,class:"flex items-center justify-center py-10"},ys={key:0,class:"flex flex-wrap gap-1.5"},_s={class:"divide-y divide-default"},ks={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},bs={key:0,class:"text-xs font-mono text-red-500 whitespace-pre-wrap break-all"},$s={class:"overflow-x-auto max-h-72"},Cs={class:"max-h-64 overflow-auto"},ws=ee({__name:"ClusterTestEvidence",props:{affectedTestCases:{},projectKey:{},projectName:{}},setup(a){const j=a,f=x(j.affectedTestCases[0]?.recentTestRunsCaseId??null),$=D(()=>j.affectedTestCases.find(i=>i.recentTestRunsCaseId===f.value)),m=x(null),C=x([]),n=x(!1),u=x(!1),y=x(!1),U=x(!1),E=x(!1),R=x(!1),T=x(!1),h=new Map;function I(){y.value=!1,U.value=!1,E.value=!1,R.value=!1,T.value=!1}async function v(i){I();const w=h.get(i);if(w){m.value=w.detail,C.value=w.traces,n.value=!1,u.value=!1;return}n.value=!0,u.value=!0,m.value=null,C.value=[];const[P,q]=await Promise.allSettled([$fetch(`/api/test-run-cases/${i}`),$fetch(`/api/test-run-cases/${i}/traces`)]);P.status==="fulfilled"&&(m.value=P.value),n.value=!1,q.status==="fulfilled"&&(C.value=q.value),u.value=!1,P.status==="fulfilled"&&q.status==="fulfilled"&&h.set(i,{detail:P.value,traces:q.value})}const A=new Map,M=x(null),O=x("trace"),N=D(()=>M.value?.frames??[]);async function H(i){if(M.value=A.get(i)??null,A.has(i)||C.value.length===0)return;const w=m.value?.testRun?.id;if(w)try{const P=await $fetch(`/api/test-runs/${w}/cases/${i}/trace-stacks`),q=P.status==="ok"&&P.frames?.length?P:null;A.set(i,q),f.value===i&&(M.value=q)}catch{A.set(i,null)}}ae([m,C],()=>{O.value="trace",f.value&&H(f.value)}),ae(f,i=>{i&&v(i)}),nt(()=>{f.value&&v(f.value)});const V=D(()=>{const i=m.value?.steps;return Array.isArray(i)?i.filter(w=>w.error):[]}),L=D(()=>m.value?.testSource?m.value.testSource.split(`
2
- `).length:0),z=D(()=>{const i=m.value;if(!i)return[];const w=i.attachments.filter(_=>ht(_.path,_.contentType)).length,P=i.attachments.filter(_=>yt(_.path,_.contentType)).length,q=Array.isArray(i.consoleLogs)?i.consoleLogs.filter(_=>_.type==="error"||_.type==="warning").length:0,X=Array.isArray(i.networkRequests)?i.networkRequests.filter(_=>(_.status??0)>=400).length:0;return[{icon:"i-lucide-image",label:"screenshots",count:w},{icon:"i-lucide-video",label:"videos",count:P},{icon:"i-lucide-bug-play",label:"traces",count:C.value.length},{icon:"i-lucide-list-checks",label:"failing steps",count:V.value.length},{icon:"i-lucide-triangle-alert",label:"signals",count:q+X},{icon:"i-lucide-code",label:"source",count:i.testSourceFrames?.length||(i.testSource?1:0)},{icon:"i-lucide-accessibility",label:"ARIA",count:i.ariaSnapshot?1:0}].filter(_=>_.count>0)});return(i,w)=>{const P=xe,q=ie,X=te,_=ce,c=De,k=Oe,F=He,K=_e,G=us,W=wt,J=qe,se=Ke,ne=vt,ue=Ge;return s(),l("div",ds,[a.affectedTestCases.length>1?(s(),l("div",ms,[(s(!0),l(B,null,Z(a.affectedTestCases,g=>(s(),l("button",{key:g.recentTestRunsCaseId,class:Y(["px-3 py-1.5 text-xs whitespace-nowrap border-b-2 -mb-px transition-colors",e(f)===g.recentTestRunsCaseId?"border-primary text-primary font-medium":"border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"]),title:g.title,onClick:oe=>f.value=g.recentTestRunsCaseId},[b(o(g.title.split(" › ").pop())+" ",1),g.runCount>1?(s(),l("span",ps,o(g.runCount)+"×",1)):d("",!0)],10,fs))),128))])):d("",!0),e($)?(s(),l("div",gs,[t("div",xs,[t("p",vs,o(e($).title),1),r(P,{"file-path":e($).filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])]),r(q,{to:`/test-run-cases/${e($).recentTestRunsCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:p(()=>[...w[6]||(w[6]=[b(" Open execution ",-1)])]),_:1},8,["to"])])):d("",!0),e(n)?(s(),l("div",hs,[r(X,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(m)?(s(),l(B,{key:3},[e(z).length?(s(),l("div",ys,[(s(!0),l(B,null,Z(e(z),g=>(s(),S(_,{key:g.label,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:p(()=>[r(X,{name:g.icon,class:"size-3"},null,8,["name"]),b(" "+o(g.count)+" "+o(g.label),1)]),_:2},1024))),128))])):d("",!0),r(c,{attachments:e(m).attachments},null,8,["attachments"]),r(k,{attachments:e(m).attachments},null,8,["attachments"]),r(F,{traces:e(C),loading:e(u)},null,8,["traces","loading"]),e(V).length>0?(s(),S(K,{key:1,icon:"i-lucide-list-checks",label:"Failing steps",count:e(V).length,open:e(y),"onUpdate:open":w[0]||(w[0]=g=>Q(y)?y.value=g:null)},{default:p(()=>[t("div",_s,[(s(!0),l(B,null,Z(e(V),(g,oe)=>(s(),l("div",{key:oe,class:"px-3 py-2 space-y-0.5"},[t("p",ks,o(oe+1)+". "+o(g.title),1),g.error?.message?(s(),l("p",bs,o(g.error.message),1)):d("",!0)]))),128))])]),_:1},8,["count","open"])):d("",!0),r(G,{"console-logs":e(m).consoleLogs,"network-requests":e(m).networkRequests,open:e(U),"onUpdate:open":w[1]||(w[1]=g=>Q(U)?U.value=g:null)},null,8,["console-logs","network-requests","open"]),e(m).testSourceFrames?.length||e(m).testSource||e(N).length?(s(),S(K,{key:2,icon:"i-lucide-code",label:"Test source",count:e(N).length||e(m).testSourceFrames?.length||e(L),open:e(E),"onUpdate:open":w[3]||(w[3]=g=>Q(E)?E.value=g:null)},{default:p(()=>[e(N).length&&(e(m).testSourceFrames?.length||e(m).testSource)?(s(),S(W,{key:0,modelValue:e(O),"onUpdate:modelValue":w[2]||(w[2]=g=>Q(O)?O.value=g:null),items:[{label:`Full stack (${e(N).length})`,value:"trace"},{label:`Captured (${e(m).testSourceFrames?.length||1})`,value:"captured"}],size:"xs",variant:"link",class:"mb-1.5",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"])):d("",!0),t("div",$s,[e(O)==="trace"&&e(N).length?(s(),S(J,{key:0,frames:e(N),"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(m).testSourceFrames?.length?(s(),S(se,{key:1,frames:e(m).testSourceFrames,"project-key":a.projectKey,"project-name":a.projectName},null,8,["frames","project-key","project-name"])):e(m).testSource?(s(),S(ne,{key:2,text:"```typescript\n"+e(m).testSource+"\n```"},null,8,["text"])):d("",!0)])]),_:1},8,["count","open"])):d("",!0),e(m).ariaSnapshot?(s(),S(K,{key:3,icon:"i-lucide-accessibility",label:"ARIA snapshot",open:e(R),"onUpdate:open":w[4]||(w[4]=g=>Q(R)?R.value=g:null)},{default:p(()=>[t("div",Cs,[r(ne,{text:"```yaml\n"+e(m).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},8,["open"])):d("",!0),e(m).pageState?(s(),S(K,{key:4,icon:"i-lucide-database",label:"App state",open:e(T),"onUpdate:open":w[5]||(w[5]=g=>Q(T)?T.value=g:null)},{default:p(()=>[r(ue,{"page-state":e(m).pageState,plain:""},null,8,["page-state"])]),_:1},8,["open"])):d("",!0)],64)):d("",!0)])}}}),Ss=Object.assign(ws,{__name:"ClusterTestEvidence"}),Ts={key:0,class:"flex items-center gap-1.5 overflow-hidden min-w-0"},Is={class:"text-primary shrink-0"},js={class:"text-gray-500 truncate text-xs font-sans"},Rs={key:1,class:"text-primary text-xs"},zs={key:2,class:"text-gray-400 font-sans text-xs"},Us={class:"w-96 p-2 space-y-2"},Es={class:"flex items-center gap-1"},Vs={class:"flex items-center gap-1"},As={key:0,class:"flex items-center gap-2 px-2 py-1.5 text-xs rounded-md bg-primary/5 text-gray-600 dark:text-gray-300"},Ms={class:"font-medium text-green-600 dark:text-green-400"},Ns={class:"font-medium text-red-600 dark:text-red-400"},Fs={class:"text-gray-400"},Bs={key:1,class:"flex items-center justify-center gap-2 py-6 text-gray-400"},Ls={key:2,class:"py-4 text-center text-sm text-red-500"},Ps={key:3,class:"flex items-start gap-2 px-2 py-2 text-xs text-amber-700 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 rounded-md"},Ds={key:4,class:"max-h-80 overflow-y-auto space-y-px"},Os={class:"text-xs text-primary"},Hs={key:1,class:"py-4 text-center text-sm text-gray-400"},qs=["onClick"],Ks={class:"text-xs text-primary shrink-0 w-14 pt-px"},Gs={class:"flex-1 min-w-0"},Ws={class:"text-xs font-medium leading-snug truncate"},Js={class:"text-xs text-gray-400 leading-snug truncate"},Qs=ee({__name:"CommitPicker",props:{modelValue:{},clusterId:{}},emits:["update:modelValue"],setup(a,{emit:j}){const f=a,$=j,m=x(!1),C=x(""),n=x([]),u=x(null),y=x(null),U=x(!1),E=x(!1),R=x(null),T=x(null),h=x([]),I=x(!1),v=x(void 0),A=D(()=>{if(!f.modelValue)return null;const z=f.modelValue.trim();return n.value.find(w=>w.sha===z||w.sha.startsWith(z))??{sha:z,shortSha:z.slice(0,7),message:"",author:"",date:""}});async function M(){if(!h.value.length){I.value=!0;try{const z=await $fetch(`/api/failure-clusters/${f.clusterId}/branches`);h.value=z.branches}catch{}finally{I.value=!1}}}async function O(){const z=f.modelValue||"";U.value=!0,E.value=!1,T.value=null;try{const i={};z&&(i.baseline=z),v.value&&(i.branch=v.value);const w=await $fetch(`/api/failure-clusters/${f.clusterId}/commits`,{query:i});n.value=w.commits,y.value=w.aggregate,u.value=w.error??null,T.value=z}catch{E.value=!0}finally{U.value=!1}}ae(v,()=>{n.value=[],T.value=null,O()}),ae(m,async z=>{if(z){await Promise.all([M(),O()]),await ot();const i=R.value?.$el?.querySelector("input")??R.value?.$el;i instanceof HTMLElement&&i.focus()}else C.value=""});const N=D(()=>Se(n.value,C.value)),H=D(()=>{const z=C.value.trim();return!/^[0-9a-f]{7,40}$/i.test(z)||N.value.some(i=>i.sha.startsWith(z.toLowerCase()))?null:z});function V(z){$("update:modelValue",z),m.value=!1}function L(z){z.stopPropagation(),u.value=null,y.value=null,$("update:modelValue",""),m.value=!1}return(z,i)=>{const w=ie,P=te,q=St,X=$e,_=at;return s(),S(_,{open:e(m),"onUpdate:open":i[4]||(i[4]=c=>Q(m)?m.value=c:null)},{content:p(()=>[t("div",Us,[t("div",Es,[r(P,{name:"i-lucide-git-branch",class:"size-3.5 text-gray-400 shrink-0"}),r(q,{modelValue:e(v),"onUpdate:modelValue":i[0]||(i[0]=c=>Q(v)?v.value=c:null),items:e(h),placeholder:"Default branch",size:"xs",class:"flex-1",loading:e(I),disabled:e(I)},null,8,["modelValue","items","loading","disabled"])]),t("div",Vs,[r(X,{ref_key:"searchInputRef",ref:R,modelValue:e(C),"onUpdate:modelValue":i[1]||(i[1]=c=>Q(C)?C.value=c:null),placeholder:"Search message, author, SHA…",size:"xs",icon:"i-lucide-search",class:"flex-1"},null,8,["modelValue"]),a.modelValue?(s(),S(w,{key:0,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Clear baseline",onClick:i[2]||(i[2]=c=>L(c))})):d("",!0)]),e(y)&&a.modelValue&&!e(U)?(s(),l("div",As,[r(P,{name:"i-lucide-git-compare-arrows",class:"size-3.5 shrink-0 text-primary"}),i[5]||(i[5]=t("span",null,"Since baseline:",-1)),t("span",Ms,"+"+o(e(y).linesAdded),1),t("span",Ns,"-"+o(e(y).linesRemoved),1),t("span",Fs,"across "+o(e(y).filesChanged)+" file"+o(e(y).filesChanged===1?"":"s"),1)])):d("",!0),e(U)?(s(),l("div",Bs,[r(P,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),i[6]||(i[6]=t("span",{class:"text-sm"},"Loading commits…",-1))])):e(E)?(s(),l("div",Ls," Failed to load commits — check your SCM token in Settings → AI ")):e(u)&&!e(U)&&e(n).length===0?(s(),l("div",Ps,[r(P,{name:"i-lucide-triangle-alert",class:"size-3.5 shrink-0 mt-0.5"}),t("span",null,o(e(u)),1)])):(s(),l("div",Ds,[e(H)?(s(),l("button",{key:0,class:"w-full text-left px-2 py-1.5 rounded flex items-center gap-2 hover:bg-elevated transition-colors border border-dashed border-default",onClick:i[3]||(i[3]=c=>V(e(H)))},[r(P,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),i[7]||(i[7]=t("span",{class:"text-xs text-gray-500"},"Use commit",-1)),t("code",Os,o(e(H).slice(0,7)),1)])):d("",!0),e(N).length===0&&!e(H)?(s(),l("div",Hs,o(e(C)?"No commits match":"No commits available"),1)):d("",!0),(s(!0),l(B,null,Z(e(N),c=>(s(),l("button",{key:c.sha,class:Y(["w-full text-left px-2 py-1.5 rounded flex items-start gap-2 hover:bg-elevated transition-colors",a.modelValue===c.sha?"bg-primary/10 ring-1 ring-inset ring-primary/30":""]),onClick:k=>V(c.sha)},[t("code",Ks,o(c.shortSha),1),t("div",Gs,[t("p",Ws,o(c.message),1),t("p",Js,[b(o(c.author),1),c.date?(s(),l(B,{key:0},[b(" · "+o(e(re)(c.date)),1)],64)):d("",!0)])]),a.modelValue===c.sha?(s(),S(P,{key:0,name:"i-lucide-check",class:"size-3.5 text-primary shrink-0 mt-0.5"})):d("",!0)],10,qs))),128))]))])]),default:p(()=>[r(w,{size:"xs",color:"neutral",variant:"outline",icon:a.modelValue?"i-lucide-git-branch-plus":"i-lucide-git-branch","trailing-icon":"i-lucide-chevron-down",class:"min-w-36 max-w-48 font-mono"},{default:p(()=>[e(A)?.message?(s(),l("span",Ts,[t("code",Is,o(e(A).shortSha),1),t("span",js,o(e(A).message),1)])):a.modelValue?(s(),l("span",Rs,o(a.modelValue.slice(0,7))+"…",1)):(s(),l("span",zs,"baseline commit…"))]),_:1},8,["icon"])]),_:1},8,["open"])}}}),Zs=Object.assign(Qs,{__name:"CommitPicker"}),Xs={class:"space-y-3"},Ys={key:0,class:"space-y-1"},en={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},tn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},sn={class:"text-xs text-gray-400 shrink-0"},nn={class:"text-xs text-gray-700 dark:text-gray-300 truncate"},an={class:"space-y-1"},on={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},ln={key:0,class:"text-yellow-500 font-normal normal-case"},rn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},cn=["onClick"],un={class:"text-xs font-mono flex-1 truncate text-gray-700 dark:text-gray-300"},dn={class:"text-xs text-gray-400 shrink-0 tabular-nums"},mn={key:0,class:"text-green-500"},fn={key:1,class:"text-gray-300 mx-0.5"},pn={key:2,class:"text-red-500"},gn={key:0,class:"border-t border-default overflow-x-auto max-h-96"},xn=ee({__name:"ScmChangesView",props:{changes:{}},setup(a){const j=x(new Set);function f($){const m=new Set(j.value);m.has($)?m.delete($):m.add($),j.value=m}return($,m)=>{const C=te,n=ke;return s(),l("div",Xs,[a.changes.commits.length>0?(s(),l("div",Ys,[t("p",en,o(a.changes.commits.length)+" commit"+o(a.changes.commits.length===1?"":"s"),1),t("div",tn,[(s(!0),l(B,null,Z(a.changes.commits,u=>(s(),l("div",{key:u.sha,class:"flex items-center gap-2 px-3 py-1.5"},[r(C,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),t("code",sn,o(u.sha.slice(0,7)),1),t("span",nn,o(u.message),1)]))),128))])])):d("",!0),t("div",an,[t("p",on,[b(o(a.changes.files.length)+" file"+o(a.changes.files.length===1?"":"s")+" changed ",1),a.changes.patchesOmitted?(s(),l("span",ln," — diff too large, file names only ")):d("",!0)]),t("div",rn,[(s(!0),l(B,null,Z(a.changes.files,u=>(s(),l("div",{key:u.filename},[t("button",{class:Y(["w-full flex items-center gap-2 px-3 py-1.5 text-left hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",u.patch?"cursor-pointer":"cursor-default"]),onClick:y=>u.patch&&f(u.filename)},[r(C,{name:("scmFileStatusMeta"in $?$.scmFileStatusMeta:e(pe))(u.status).icon,class:Y(["size-3.5 shrink-0",("scmFileStatusMeta"in $?$.scmFileStatusMeta:e(pe))(u.status).color])},null,8,["name","class"]),t("span",un,o(u.filename),1),t("span",dn,[u.additions?(s(),l("span",mn,"+"+o(u.additions),1)):d("",!0),u.additions&&u.deletions?(s(),l("span",fn,"/")):d("",!0),u.deletions?(s(),l("span",pn,"-"+o(u.deletions),1)):d("",!0)]),u.patch?(s(),S(C,{key:0,name:e(j).has(u.filename)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400 shrink-0"},null,8,["name"])):d("",!0)],10,cn),u.patch&&e(j).has(u.filename)?(s(),l("div",gn,[r(n,{patch:u.patch},null,8,["patch"])])):d("",!0)]))),128))])])])}}}),vn=Object.assign(xn,{__name:"ScmChangesView"}),hn={class:"border border-default rounded-lg overflow-clip text-xs font-mono"},yn={class:"sticky top-0 z-10 flex items-center justify-between px-3 py-1.5 bg-elevated border-b border-default text-gray-600 dark:text-gray-300"},_n={class:"font-medium truncate"},kn={class:"shrink-0 flex items-center gap-1.5 ml-2 text-[11px]"},bn={key:0,class:"text-green-600 dark:text-green-400"},$n={key:1,class:"text-red-600 dark:text-red-400"},Cn={key:1,class:"px-3 py-2 text-gray-400 text-[11px]"},wn=ee({__name:"DiffFile",props:{file:{}},setup(a){return(j,f)=>{const $=ce,m=ke;return s(),l("div",hn,[t("div",yn,[t("span",_n,o(a.file.filename),1),t("span",kn,[a.file.additions?(s(),l("span",bn,"+"+o(a.file.additions),1)):d("",!0),a.file.deletions?(s(),l("span",$n,"-"+o(a.file.deletions),1)):d("",!0),r($,{label:a.file.status,size:"xs",variant:"subtle",color:("scmFileStatusMeta"in j?j.scmFileStatusMeta:e(pe))(a.file.status).badgeColor},null,8,["label","color"])])]),a.file.patch?(s(),S(m,{key:0,patch:a.file.patch},null,8,["patch"])):(s(),l("div",Cn,"No patch available"))])}}}),Sn=Object.assign(wn,{__name:"DiffFile"}),Tn={class:"inline-flex items-center gap-1"},In={class:"flex h-[72vh] overflow-hidden"},jn={class:"w-72 shrink-0 border-r border-default flex flex-col"},Rn={class:"p-2 border-b border-default space-y-2 shrink-0"},zn={class:"flex items-center gap-2 text-xs text-gray-500"},Un={class:"ml-auto"},En={key:2,class:"flex-1 overflow-y-auto flex flex-col"},Vn={key:0,class:"py-6 text-center text-sm text-gray-400 flex-1"},An=["onClick"],Mn=["checked","onChange"],Nn={class:"flex-1 min-w-0"},Fn={class:"text-xs font-medium leading-snug truncate"},Bn={class:"text-[10px] text-gray-400 leading-snug mt-0.5 flex items-center gap-1 min-w-0"},Ln={class:"text-primary shrink-0"},Pn={class:"truncate"},Dn={key:0,class:"shrink-0"},On={key:1,class:"p-2 shrink-0 space-y-1.5"},Hn={key:0,class:"flex items-center gap-1.5 text-xs text-red-500 px-1"},qn={class:"flex-1 overflow-y-auto flex flex-col min-w-0"},Kn={key:0,class:"flex-1 flex items-center justify-center text-gray-400 text-sm"},Gn={key:2,class:"flex-1 p-4 space-y-3"},Wn={key:0,class:"space-y-0.5 pb-3 border-b border-default"},Jn={class:"flex items-center gap-2"},Qn={class:"text-xs font-mono text-primary"},Zn={class:"text-xs text-gray-400"},Xn={class:"text-sm font-semibold"},Yn={key:1,class:"text-sm text-gray-400 pt-2"},ea={key:4,class:"flex-1 flex items-center justify-center text-sm text-gray-400"},ta={class:"flex items-center gap-3 w-full"},sa={class:"flex-1 flex items-center gap-2 text-sm text-gray-500 min-w-0"},na={class:"font-medium text-gray-700 dark:text-gray-200 shrink-0"},aa={class:"shrink-0"},oa={class:"text-green-600 dark:text-green-400 shrink-0 font-medium"},la={class:"text-red-600 dark:text-red-400 shrink-0 font-medium"},ra={key:1,class:"text-gray-400 text-xs shrink-0"},ia={key:1},me=50,ca=ee({__name:"CommitBrowserModal",props:{open:{type:Boolean},clusterId:{},initialSelected:{},autoSelectedShas:{}},emits:["update:open","confirm"],setup(a,{emit:j}){const f=a,$=D(()=>new Set(f.autoSelectedShas??[])),m=j,C=x(""),n=x([]),u=x(me),y=x(!1),U=x(!1),E=x(!1),R=x(null),T=x(null),h=x(new Set),I=x(null),v=lt({}),A=x(null),M=x(!1),O=x(null),N=D(()=>n.value.find(_=>_.sha===I.value)??null),H=D(()=>Se(n.value,C.value)),V=D(()=>{let _=0,c=0,k=0,F=0;for(const K of h.value){if(!(K in v)){F++;continue}const G=v[K];G&&(_+=G.files.length,c+=G.files.reduce((W,J)=>W+J.additions,0),k+=G.files.reduce((W,J)=>W+J.deletions,0))}return{files:_,linesAdded:c,linesRemoved:k,unreviewed:F}});async function L(_){_?(U.value=!0,R.value=null):(E.value=!0,T.value=null);try{const c=await $fetch(`/api/failure-clusters/${f.clusterId}/commits`,{query:{limit:u.value}});n.value=c.commits,y.value=c.hasMore??!1,c.error&&!c.commits.length&&(_?R.value=c.error:T.value=c.error),_&&c.commits[0]&&i(c.commits[0].sha)}catch(c){_?R.value=de(c):T.value=de(c)}finally{U.value=!1,E.value=!1}}async function z(){u.value+=me,await L(!1)}ae(()=>f.open,async _=>{if(_){if(h.value=new Set(f.initialSelected??[]),n.value.length){!I.value&&n.value[0]&&i(n.value[0].sha);return}u.value=me,await L(!0)}});async function i(_){if(I.value!==_){if(I.value=_,O.value=null,_ in v){A.value=v[_],M.value=!1;return}A.value=null,M.value=!0;try{const c=await $fetch(`/api/failure-clusters/${f.clusterId}/commit-diff`,{query:{sha:_}});v[_]=c,I.value===_&&(A.value=c)}catch(c){I.value===_&&(O.value=de(c))}finally{I.value===_&&(M.value=!1)}}}function w(_){const c=new Set(h.value);c.has(_)?c.delete(_):c.add(_),h.value=c}function P(){h.value=new Set(H.value.map(_=>_.sha))}function q(){h.value=new Set}function X(){m("confirm",[...h.value]),m("update:open",!1)}return(_,c)=>{const k=ge,F=$e,K=Tt,G=ie,W=It,J=ce,se=te,ne=Sn,ue=Te;return s(),S(ue,{open:a.open,title:"Browse commits",ui:{content:"max-w-6xl",body:"p-0 overflow-hidden"},"onUpdate:open":c[4]||(c[4]=g=>m("update:open",g))},{title:p(()=>[t("span",Tn,[c[5]||(c[5]=b("Browse commits ",-1)),r(k,{topic:"cluster.commit-browser"})])]),body:p(()=>[t("div",In,[t("div",jn,[t("div",Rn,[r(F,{modelValue:e(C),"onUpdate:modelValue":c[0]||(c[0]=g=>Q(C)?C.value=g:null),placeholder:"Search commits…",size:"xs",icon:"i-lucide-search"},null,8,["modelValue"]),t("div",zn,[t("button",{class:"hover:text-primary transition-colors",onClick:P},"All"),c[6]||(c[6]=t("span",null,"·",-1)),t("button",{class:"hover:text-primary transition-colors",onClick:q},"None"),t("span",Un,o(e(h).size>0?`${e(h).size} selected`:"none selected"),1)])]),e(U)?(s(),S(K,{key:0,text:"Loading…",padded:!1,class:"flex-1"})):e(R)?(s(),S(W,{key:1,text:e(R),padded:!1,class:"flex-1 p-4"},{action:p(()=>[r(G,{size:"xs",color:"neutral",variant:"outline",onClick:c[1]||(c[1]=g=>L(!0))},{default:p(()=>[...c[7]||(c[7]=[b(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):(s(),l("div",En,[e(H).length===0?(s(),l("div",Vn,o(e(C)?"No commits match":"No commits"),1)):d("",!0),(s(!0),l(B,null,Z(e(H),g=>(s(),l("button",{key:g.sha,class:Y(["w-full text-left px-2.5 py-2 flex items-start gap-2.5 hover:bg-elevated transition-colors border-b border-default/50 last:border-0 shrink-0",e(I)===g.sha?"bg-elevated":""]),onClick:oe=>i(g.sha)},[t("input",{type:"checkbox",checked:e(h).has(g.sha),class:"mt-0.5 shrink-0 cursor-pointer accent-primary",onClick:c[2]||(c[2]=fe(()=>{},["stop"])),onChange:oe=>w(g.sha)},null,40,Mn),t("div",Nn,[t("p",Fn,o(g.message||"(no message)"),1),t("p",Bn,[t("code",Ln,o(g.shortSha),1),t("span",Pn,o(g.author),1),g.date?(s(),l("span",Dn,"· "+o(e(re)(g.date)),1)):d("",!0),e($).has(g.sha)?(s(),S(J,{key:1,size:"xs",color:"info",variant:"soft",class:"shrink-0"},{default:p(()=>[...c[8]||(c[8]=[b(" auto ",-1)])]),_:1})):d("",!0)])])],10,An))),128)),e(y)&&!e(C)?(s(),l("div",On,[e(T)?(s(),l("p",Hn,[r(se,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),b(" "+o(e(T)),1)])):d("",!0),r(G,{size:"xs",color:"neutral",variant:"outline",block:"",loading:e(E),onClick:z},{default:p(()=>[...c[9]||(c[9]=[b(" Load more ",-1)])]),_:1},8,["loading"])])):d("",!0)]))]),t("div",qn,[e(I)?e(M)?(s(),S(K,{key:1,text:"Loading diff…",padded:!1,class:"flex-1"})):e(A)?(s(),l("div",Gn,[e(N)?(s(),l("div",Wn,[t("div",Jn,[t("code",Qn,o(e(N).shortSha),1),t("span",Zn,[b(o(e(N).author),1),e(N).date?(s(),l(B,{key:0},[b(" · "+o(e(re)(e(N).date)),1)],64)):d("",!0)])]),t("p",Xn,o(e(N).message),1)])):d("",!0),e(A).files.length===0?(s(),l("div",Yn,"No file changes in this commit")):d("",!0),(s(!0),l(B,null,Z(e(A).files,g=>(s(),S(ne,{key:g.filename,file:g},null,8,["file"]))),128))])):e(O)?(s(),S(W,{key:3,text:e(O),padded:!1,class:"flex-1 p-6"},{action:p(()=>[...c[10]||(c[10]=[t("p",{class:"text-xs text-gray-400"},"Click the commit again to retry",-1)])]),_:1},8,["text"])):(s(),l("div",ea," Diff not available for this commit ")):(s(),l("div",Kn," Select a commit to view its diff "))])])]),footer:p(()=>[t("div",ta,[t("div",sa,[e(h).size>0?(s(),l(B,{key:0},[t("span",na,o(e(h).size)+" commit"+o(e(h).size===1?"":"s"),1),e(V).files>0||e(V).linesAdded>0||e(V).linesRemoved>0?(s(),l(B,{key:0},[c[11]||(c[11]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("span",aa,o(e(V).files)+" file"+o(e(V).files===1?"":"s"),1),t("span",oa,"+"+o(e(V).linesAdded),1),t("span",la,"-"+o(e(V).linesRemoved),1)],64)):d("",!0),e(V).unreviewed>0?(s(),l("span",ra," ("+o(e(V).unreviewed)+" unreviewed) ",1)):d("",!0)],64)):(s(),l("span",ia,"No commits selected"))]),r(G,{color:"neutral",variant:"ghost",onClick:c[3]||(c[3]=g=>m("update:open",!1))},{default:p(()=>[...c[12]||(c[12]=[b(" Cancel ",-1)])]),_:1}),r(G,{color:"primary",disabled:e(h).size===0,onClick:X},{default:p(()=>[...c[13]||(c[13]=[b(" Add to context ",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),ua=Object.assign(ca,{__name:"CommitBrowserModal"});function Ie(a){return{scmStatus:D(()=>{const f=a.value?.scm;if(!f)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"Git context unavailable",detail:""};if(f.baseCommitUsed){if(f.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${f.baseCommitUsed.slice(0,7)} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};const C=f.patchesOmitted?", no patches (diff too large)":f.patchesTruncated?`, ${f.patchedFilesCount} with patches (some cut)`:`, ${f.patchedFilesCount} with patches`;return{color:"text-blue-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${f.baseCommitUsed.slice(0,7)} · ${f.filesCount} files${C}`,detail:f.hasLastGreen?"overrides last passing run baseline":"no last passing run"}}if(!f.hasLastGreen)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No last passing run",detail:"enter a baseline commit below to enable diff"};if(!f.hasCommitRange)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No commit range",detail:"reporter did not send SCM metadata"};if(!f.provider)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:"Unsupported SCM host",detail:"only GitHub, GitLab and Bitbucket are supported"};if(f.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${f.provider} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};if(f.patchesOmitted)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${f.provider} · ${f.filesCount} files`,detail:"diff too large — file list only, no patches"};const $=f.patchesTruncated?", some patches cut (budget)":"",m=f.commitsCount>0?` · ${f.commitsCount} commit${f.commitsCount>1?"s":""}`:"";return{color:"text-green-500",icon:"i-lucide-git-branch",text:`${f.provider} · ${f.filesCount} files · ${f.patchedFilesCount} with patches${$}${m}`,detail:""}})}}const da={class:"space-y-3"},ma={class:"pb-2 border-b border-default"},fa={class:"flex items-center gap-2 flex-wrap"},pa={class:"text-xs text-gray-500 font-medium shrink-0 inline-flex items-center gap-1"},ga={class:"flex items-center gap-1.5 ml-auto"},xa={key:0,class:"flex items-center gap-1 px-2 py-0.5 rounded-full bg-primary/10 text-primary text-xs font-medium"},va={key:0,class:"flex items-start gap-1.5 text-xs px-2 py-1.5 rounded-md bg-elevated border border-default"},ha={key:0,class:"text-gray-400 ml-1"},ya={key:1,class:"flex items-center justify-center py-6"},_a={key:3,class:"text-xs text-gray-400 text-center py-4"},ka=ee({__name:"ClusterInvestigation",setup(a){const{clusterId:j,baseCommit:f,selectedCommitShas:$,autoSelectedCommits:m,baseCommitIsPinned:C,coverage:n,scmChanges:u,contextLoading:y,refreshContext:U}=jt(),E=x(!1),{scmStatus:R}=Ie(n);return(T,h)=>{const I=ge,v=Zs,A=te,M=Ce,O=ie,N=vn,H=ua;return s(),l(B,null,[t("div",da,[t("div",ma,[t("div",fa,[t("span",pa,[h[5]||(h[5]=b(" Baseline ",-1)),r(I,{topic:"cluster.baseline"})]),r(v,{modelValue:e(f),"onUpdate:modelValue":h[0]||(h[0]=V=>Q(f)?f.value=V:null),"cluster-id":e(j)},null,8,["modelValue","cluster-id"]),e(C)?(s(),S(M,{key:0,text:"Baseline commit pinned for this cluster"},{default:p(()=>[r(A,{name:"i-lucide-pin",class:"size-3.5 text-primary shrink-0"})]),_:1})):d("",!0),t("div",ga,[e($).length?(s(),l("div",xa,[r(A,{name:"i-lucide-git-commit-horizontal",class:"size-3"}),t("span",null,o(e($).length)+" commit"+o(e($).length===1?"":"s"),1),t("button",{class:"ml-0.5 hover:opacity-70 transition-opacity",onClick:h[1]||(h[1]=V=>$.value=[])},[r(A,{name:"i-lucide-x",class:"size-3"})])])):d("",!0),r(O,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list",onClick:h[2]||(h[2]=V=>E.value=!0)},{default:p(()=>[...h[6]||(h[6]=[b(" Browse ",-1)])]),_:1}),r(O,{icon:"i-lucide-refresh-cw",size:"xs",color:"neutral",variant:"outline",loading:e(y),onClick:e(U)},null,8,["loading","onClick"])])])]),e(n)?(s(),l("div",va,[r(A,{name:e(R).icon,class:Y(["size-3.5 mt-0.5 shrink-0",e(R).color])},null,8,["name","class"]),t("div",null,[t("span",{class:Y(e(R).color)},o(e(R).text),3),e(R).detail?(s(),l("span",ha,"— "+o(e(R).detail),1)):d("",!0)])])):d("",!0),e(y)&&!e(u)?(s(),l("div",ya,[r(A,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):e(u)?(s(),S(N,{key:2,changes:e(u)},null,8,["changes"])):e(n)&&!e(y)&&!e(u)?(s(),l("p",_a," No changes found in this range. ")):d("",!0)]),r(H,{open:e(E),"onUpdate:open":h[3]||(h[3]=V=>Q(E)?E.value=V:null),"cluster-id":e(j),"initial-selected":e($),"auto-selected-shas":e(m),onConfirm:h[4]||(h[4]=V=>$.value=V)},null,8,["open","cluster-id","initial-selected","auto-selected-shas"])],64)}}}),ba=Object.assign(ka,{__name:"ClusterInvestigation"}),$a={class:"flex flex-col h-[60vh]"},Ca={class:"flex items-center gap-3 px-4 py-2.5 border-b border-default text-sm shrink-0"},wa={key:0,class:"ml-auto text-xs text-gray-500"},Sa={class:"flex-1 overflow-y-auto"},Ta={class:"w-full text-sm"},Ia=["onClick"],ja={class:"px-4 py-2.5"},Ra=["checked","onChange"],za={class:"px-2 py-2.5 min-w-0"},Ua={class:"truncate font-medium text-gray-800 dark:text-gray-200 max-w-[24rem]"},Ea={class:"px-2 py-2.5 text-gray-500 text-xs max-w-[16rem] hidden sm:table-cell"},Va={class:"px-2 py-2.5 text-right text-gray-500 text-xs"},Aa={key:0},Ma={class:"shrink-0 border-t border-default px-4 py-3 space-y-1.5"},Na={key:0,class:"shrink-0 px-4 pb-3 flex items-center gap-1.5 text-xs text-red-500"},Fa={class:"flex items-center gap-3 w-full"},Ba=ee({__name:"ClusterExtractCasesModal",props:{open:{type:Boolean},clusterId:{},affectedTestCases:{},projectKey:{},projectName:{}},emits:["update:open","extracted"],setup(a,{emit:j}){const f=a,$=j,m=rt(),C=x(new Set),n=x(""),u=x(!1),y=x(null);function U(){C.value=new Set(f.affectedTestCases.map(I=>I.testCaseId))}function E(){C.value=new Set}function R(I){const v=new Set(C.value);v.has(I)?v.delete(I):v.add(I),C.value=v}ae(()=>f.open,I=>{I&&(E(),n.value="",y.value=null)});const T=D(()=>C.value.size);async function h(){if(T.value!==0){u.value=!0,y.value=null;try{await $fetch(`/api/failure-clusters/${f.clusterId}/extract-cases`,{method:"POST",body:{testCaseIds:[...C.value],triageNote:n.value.trim()||void 0}}),m.add({title:`Extracted ${T.value} test ${T.value===1?"case":"cases"}`,color:"success"}),$("extracted"),$("update:open",!1)}catch(I){y.value=de(I)}finally{u.value=!1}}}return(I,v)=>{const A=be,M=xe,O=we,N=te,H=ie,V=Te;return s(),S(V,{open:a.open,title:"Extract test cases",ui:{content:"max-w-4xl",body:"p-0 flex flex-col overflow-hidden"},"onUpdate:open":v[4]||(v[4]=L=>$("update:open",L))},{body:p(()=>[t("div",$a,[t("div",Ca,[t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:U},"Select all"),v[5]||(v[5]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:E},"Deselect all"),e(T)>0?(s(),l("span",wa,o(e(T))+" selected ",1)):d("",!0)]),t("div",Sa,[t("table",Ta,[v[8]||(v[8]=t("thead",{class:"sticky top-0 bg-gray-50 dark:bg-gray-800 border-b border-default"},[t("tr",null,[t("th",{class:"w-10 px-4 py-2.5"}),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide"},"Test"),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide hidden sm:table-cell"}," File "),t("th",{class:"text-right px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide w-20"}," Occurrences ")])],-1)),t("tbody",null,[(s(!0),l(B,null,Z(a.affectedTestCases,L=>(s(),l("tr",{key:L.testCaseId,class:"border-b border-default/50 hover:bg-elevated transition-colors cursor-pointer",onClick:z=>R(L.testCaseId)},[t("td",ja,[t("input",{type:"checkbox",checked:e(C).has(L.testCaseId),class:"shrink-0 cursor-pointer accent-primary",onClick:v[0]||(v[0]=fe(()=>{},["stop"])),onChange:z=>R(L.testCaseId)},null,40,Ra)]),t("td",za,[t("p",Ua,o(L.title),1),r(A,{to:`/test-cases/${L.testCaseId}`,class:"text-[10px] text-primary hover:underline mt-0.5 inline-block",onClick:v[1]||(v[1]=fe(()=>{},["stop"]))},{default:p(()=>[...v[6]||(v[6]=[b(" View details ",-1)])]),_:1},8,["to"])]),t("td",Ea,[r(M,{"file-path":L.filePath,"project-key":a.projectKey,"project-name":a.projectName,class:"max-w-full"},null,8,["file-path","project-key","project-name"])]),t("td",Va,o(L.runCount),1)],8,Ia))),128)),a.affectedTestCases.length===0?(s(),l("tr",Aa,[...v[7]||(v[7]=[t("td",{colspan:"4",class:"px-4 py-8 text-center text-gray-400 text-sm"},"No test cases in this cluster.",-1)])])):d("",!0)])])]),t("div",Ma,[v[9]||(v[9]=t("label",{class:"text-xs font-medium text-gray-500 uppercase tracking-wide"},"Triage note (optional)",-1)),r(O,{modelValue:e(n),"onUpdate:modelValue":v[2]||(v[2]=L=>Q(n)?n.value=L:null),placeholder:"Add a note explaining why these tests were extracted…",rows:2,class:"text-sm w-full"},null,8,["modelValue"])]),e(y)?(s(),l("p",Na,[r(N,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),b(" "+o(e(y)),1)])):d("",!0)])]),footer:p(()=>[t("div",Fa,[v[11]||(v[11]=t("div",{class:"flex-1"},null,-1)),r(H,{color:"neutral",variant:"ghost",disabled:e(u),onClick:v[3]||(v[3]=L=>$("update:open",!1))},{default:p(()=>[...v[10]||(v[10]=[b(" Cancel ",-1)])]),_:1},8,["disabled"]),r(H,{color:"warning",disabled:e(T)===0,loading:e(u),onClick:h},{default:p(()=>[b(" Extract"+o(e(T)>0?` ${e(T)}`:""),1)]),_:1},8,["disabled","loading"])])]),_:1},8,["open"])}}}),La=Object.assign(Ba,{__name:"ClusterExtractCasesModal"}),Pa={key:0,class:"flex flex-col h-full min-h-0 max-xl:overflow-y-auto xl:overflow-hidden"},Da={class:"border-b border-default shrink-0"},Oa={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4 p-1 xl:flex-1 xl:min-h-0 xl:overflow-hidden"},Ha={class:"space-y-4 xl:overflow-y-auto"},qa={class:"font-mono text-xs"},Ka=["innerHTML"],Ga={class:"inline-flex items-center gap-1.5"},Wa={class:"xl:overflow-y-auto"},Ja={key:1,class:"flex items-center justify-center h-64 text-gray-500"},Eo=ee({__name:"[id]",async setup(a){let j,f;const $=it(),m=parseInt(String($.params.id)),C=Rt(m),{data:n,refresh:u}=([j,f]=ct(()=>Vt(`/api/failure-clusters/${m}`,"$Io0yQjh0TH")),j=await j,f(),j);ut(D(()=>({title:`${n.value?.signature??"Failure cluster"} — Piwi Dashboard`})));const y=x(n.value?.status??"open"),U=x(n.value?.triageNote??""),E=x(!1);ae(()=>n.value?.status,k=>{k&&(y.value=k)}),ae(()=>n.value?.triageNote,k=>{U.value=k??""});const R=D(()=>y.value!==(n.value?.status??"open")||U.value.trim()!==(n.value?.triageNote??""));async function T(){E.value=!0;try{await $fetch(`/api/failure-clusters/${m}/status`,{method:"PATCH",body:{status:y.value,triageNote:U.value.trim()||null}}),u()}finally{E.value=!1}}const h=x(!1);function I(){h.value=!1,u()}const{copyRich:v,copied:A}=We();function M(){const k=n.value;if(!k)return;const F=window.location.href,K=ne=>ne.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),G=[k.errorType,`${k.occurrences} occurrence${k.occurrences===1?"":"s"}`,`${k.affectedTests} test${k.affectedTests===1?"":"s"} affected`,k.status!=="open"?k.status:null].filter(Boolean).join(" · "),W=k.diagnosis?.status==="completed"&&k.diagnosis.summary?`AI diagnosis (${k.diagnosis.category??"unknown"}, ${k.diagnosis.confidence??"?"} confidence): ${k.diagnosis.summary}`:null,J=[`❌ Failure cluster: ${k.signature}`,G,"",...k.sampleError?["Sample error:",ve(k.sampleError),""]:[],...W?[W,""]:[],`Cluster: ${F}`].join(`
3
- `),se=[`<p><strong>❌ Failure cluster</strong>: <code>${K(k.signature)}</code></p>`,`<p><em>${K(G)}</em></p>`,k.sampleError?`<p><strong>Sample error:</strong></p><pre>${ye(k.sampleError)}</pre>`:"",W?`<p><strong>AI diagnosis</strong> (${K(k.diagnosis?.category??"unknown")}, ${K(k.diagnosis?.confidence??"?")} confidence):<br>${K(k.diagnosis.summary)}</p>`:"",`<p>🔗 <a href="${F}">View failure cluster</a></p>`].join("");v(J,se,{toast:"Failure cluster copied"})}const O=D(()=>{const k=n.value?.sampleError;return k?ve(k).split(`
4
- `).find(F=>F.trim())??"":""}),{scmStatus:N}=Ie(C.coverage),H=D(()=>Ut((n.value?.affectedTestCases??[]).map(k=>({filePath:k.filePath,title:k.title,line:null,projectName:null})))),{copy:V,copied:L}=Et(),z=x(null),i=x(null),w=x(null),P=x(null),q=x(null),X=x(null),_={sampleError:()=>z.value,executionError:()=>z.value,environmentDiff:()=>P.value,visualDiff:()=>q.value,domSnapshot:()=>X.value,scmInvestigation:()=>w.value,selectedCommits:()=>w.value,topSuspectedCommit:()=>w.value,failingAction:()=>w.value,affectedTests:()=>i.value,testSource:()=>i.value,sourceFiles:()=>i.value,steps:()=>i.value,failingSteps:()=>i.value,console:()=>i.value,networkRequests:()=>i.value,serverTraces:()=>i.value,ariaSnapshot:()=>i.value,screenshots:()=>i.value,tracePointers:()=>i.value,artifacts:()=>i.value};dt(_t,{canLocate:k=>k in _,open:k=>_[k]?.()?.reveal()});const c=D(()=>[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...n.value?.project?[{label:n.value.project.label||n.value.project.name||"Project",to:`/projects/${n.value.project.id}?tab=failure-clusters`}]:[{label:"Project"}],{label:`Failure cluster #${m}`}]);return(k,F)=>{const K=Le,G=Pe,W=et,J=ie,se=Ce,ne=ft,ue=os,g=Je,oe=Qe,je=Ze,Re=Xe,ze=Ye,Ue=xe,Ee=ce,Ve=Ss,Ae=te,Me=ba,Ne=zt,Fe=mt,Be=La;return s(),l(B,null,[r(Fe,{id:"failure-cluster-detail"},{header:p(()=>[r(ne,null,{leading:p(()=>[r(K),r(G,{items:e(c)},null,8,["items"])]),right:p(()=>[e(n)?(s(),S(W,{key:0,endpoint:`/api/failure-clusters/${e(n).id}/export`,"base-name":`piwi-cluster-${e(n).id}`},null,8,["endpoint","base-name"])):d("",!0),e(n)?(s(),S(se,{key:1,text:e(A)?"Copied!":"Copy failure cluster"},{default:p(()=>[r(J,{size:"sm",variant:"ghost",color:"neutral",icon:e(A)?"i-lucide-check":"i-lucide-clipboard",onClick:M},null,8,["icon"])]),_:1},8,["text"])):d("",!0)]),_:1})]),body:p(()=>[e(n)?(s(),l("div",Pa,[t("div",Da,[r(ue,{cluster:e(n),"triage-status":e(y),"triage-note":e(U),"triage-saving":e(E),"triage-changed":e(R),"onUpdate:triageStatus":F[0]||(F[0]=le=>y.value=le),"onUpdate:triageNote":F[1]||(F[1]=le=>U.value=le),onSaveTriage:T},null,8,["cluster","triage-status","triage-note","triage-saving","triage-changed"])]),t("div",Oa,[t("div",Ha,[e(n).sampleError?(s(),S(g,{key:0,ref_key:"errorSection",ref:z,"storage-key":"cluster-error",icon:"i-lucide-circle-x","icon-class":"text-red-500",title:"Error message"},{folded:p(()=>[t("span",qa,o(e(O)),1)]),default:p(()=>[t("div",{class:"text-xs font-mono overflow-x-auto whitespace-pre-wrap",innerHTML:e(ye)(e(n).sampleError)},null,8,Ka)]),_:1},512)):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(oe,{key:1,ref:"locatorSection","storage-key":"cluster-locators","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId,"affected-count":e(n).affectedTestCases.length},null,8,["run-id","test-runs-case-id","affected-count"])):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(je,{key:2,ref_key:"envDiffSection",ref:P,"storage-key":"cluster-env-diff","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Re,{key:3,ref_key:"visualDiffSection",ref:q,"storage-key":"cluster-visual-diff","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(n).affectedTestCases?.length&&e(n).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(ze,{key:4,ref_key:"domSnapshotSection",ref:X,"storage-key":"cluster-dom-snapshot","run-id":e(n).lastSeenRunId,"test-runs-case-id":e(n).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(n).affectedTestCases?.length?(s(),S(g,{key:5,ref_key:"evidenceSection",ref:i,"storage-key":"cluster-evidence",icon:"i-lucide-flask-conical",title:"Test evidence",help:"cluster.evidence"},{folded:p(()=>[b(o(e(n).affectedTests)+" "+o(e(n).affectedTests===1?"test":"tests")+" · "+o(e(n).occurrences)+" occurrence"+o(e(n).occurrences===1?"":"s")+" · ",1),e(n).affectedTestCases[0]?.filePath?(s(),S(Ue,{key:0,"file-path":e(n).affectedTestCases[0].filePath,"project-key":e(n).project?.id,"project-name":e(n).project?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])):d("",!0)]),actions:p(()=>[r(Ee,{color:"neutral",variant:"subtle",size:"sm"},{default:p(()=>[b(o(e(n).affectedTestCases.length)+" "+o(e(n).affectedTestCases.length===1?"test":"tests"),1)]),_:1}),r(J,{size:"xs",variant:"outline",color:"neutral",icon:e(L)?"i-lucide-check":"i-lucide-play",title:e(L)?"Copied!":("copyPreview"in k?k.copyPreview:e(Ct))(e(H)),onClick:F[2]||(F[2]=le=>e(V)(e(H),{toast:"Retry command copied"}))},{default:p(()=>[...F[5]||(F[5]=[b(" Copy retry command ",-1)])]),_:1},8,["icon","title"]),r(se,{text:"Unlink incorrectly clustered test cases from this group"},{default:p(()=>[r(J,{size:"xs",color:"warning",variant:"outline",icon:"i-lucide-arrow-up-from-line",onClick:F[3]||(F[3]=le=>h.value=!0)},{default:p(()=>[...F[6]||(F[6]=[b(" Extract ",-1)])]),_:1})]),_:1})]),default:p(()=>[r(Ve,{"affected-test-cases":e(n).affectedTestCases,"project-key":e(n).project?.id,"project-name":e(n).project?.name},null,8,["affected-test-cases","project-key","project-name"])]),_:1},512)):d("",!0),r(g,{ref_key:"scmSection",ref:w,"storage-key":"cluster-scm",icon:"i-lucide-git-compare-arrows",title:"What changed",help:"cluster.scm"},{folded:p(()=>[t("span",Ga,[r(Ae,{name:e(N).icon,class:Y(["size-3.5 shrink-0",e(N).color])},null,8,["name","class"]),t("span",{class:Y(e(N).color)},o(e(N).text),3)])]),default:p(()=>[r(Me)]),_:1},512)]),t("div",Wa,[r(Ne,{"cluster-id":e(m),"last-seen-run-id":e(n)?.lastSeenRunId,"affected-test-cases":e(n)?.affectedTestCases??[]},null,8,["cluster-id","last-seen-run-id","affected-test-cases"])])])])):(s(),l("div",Ja,"Cluster not found."))]),_:1}),e(n)?(s(),S(Be,{key:0,open:e(h),"cluster-id":e(m),"affected-test-cases":e(n).affectedTestCases??[],"project-key":e(n).project?.id,"project-name":e(n).project?.name,"onUpdate:open":F[4]||(F[4]=le=>h.value=le),onExtracted:I},null,8,["open","cluster-id","affected-test-cases","project-key","project-name"])):d("",!0)],64)}}});export{Eo as default};
@@ -1 +0,0 @@
1
- import{_ as Ee,a as Re}from"./BfS8BZTO.js";import{d as H,H as le,J as se,o as l,f as T,g as c,i as s,j as r,E as G,l as W,k as a,c as m,p as ne,F as U,y as F,q as ie,m as I,t as w,v as x,I as q,r as R,h as D,L as $e,_ as re,w as oe,b as Oe,ac as Le,M as z}from"./h49q_GXF.js";import{_ as Be}from"./BtSJxOdh.js";import{_ as pe}from"./B0hK-xDF.js";import{_ as fe}from"./DDN2tt0a.js";import{_ as ve}from"./BKJetfRH.js";import{_ as ge}from"./3xlGO1qT.js";import{_ as Fe}from"./jjOqY9Tv.js";import{h as We}from"./BjaRappk.js";import{_ as ye}from"./DLNNAYfu.js";import{_ as Ne}from"./DWEkQ7bl.js";import{u as ae}from"./Cd8r0xk5.js";import{_ as De}from"./CScusXhF.js";import{p as qe,g as Xe}from"./CobveFaj.js";import"./9N6hSApy.js";import"./D4UlSVir.js";import"./xbO0VmDX.js";import"./B9FSuKdA.js";import"./BNAHBHbY.js";import"./CRPt9SfB.js";import"./CWoSSKhQ.js";import"./CD3R-ggS.js";const je={class:"space-y-3"},Ke={key:0,class:"flex items-center justify-center gap-2 py-8 text-gray-400"},ze={key:1,class:"py-8 text-center text-sm text-gray-400"},He={key:2,class:"max-h-96 overflow-y-auto space-y-px"},Ge=["onClick"],Qe={class:"flex-1 min-w-0"},Ye={class:"text-sm font-medium leading-snug truncate"},Ze={key:0,class:"text-gray-500 font-normal"},Je={class:"text-xs text-gray-400 leading-snug mt-0.5"},et={key:3,class:"italic text-gray-500"},tt={key:0,class:"flex items-center gap-1 shrink-0 pt-0.5"},st=["title"],ot=["title"],at={key:0,class:"py-8 text-center text-sm text-gray-400"},lt=H({__name:"ModelPickerModal",props:q({models:{},selected:{},loading:{type:Boolean}},{open:{type:Boolean,required:!0},openModifiers:{}}),emits:q(["select"],["update:open"]),setup(o,{emit:M}){function C(y){return y?y>=1e6?`${(y/1e6).toFixed(1)}M`:y>=1e3?`${Math.round(y/1e3)}K`:String(y):""}const v=o,i=M,A=le(o,"open"),_=R(null),d=R("");se(A,y=>{y&&$e(()=>_.value?.focus())});const n=D(()=>{const y=d.value.toLowerCase();return y?v.models.filter(h=>h.id.toLowerCase().includes(y)||(h.label?.toLowerCase()??"").includes(y)):v.models}),k={image:{icon:"i-lucide-image",label:"Image input"},pdf:{icon:"i-lucide-file-text",label:"PDF input"},code:{icon:"i-lucide-code",label:"Code execution"},thinking:{icon:"i-lucide-brain",label:"Extended thinking"},json:{icon:"i-lucide-braces",label:"Structured output"},text:{icon:"i-lucide-type",label:"Text"},audio:{icon:"i-lucide-music",label:"Audio"}};function V(y){return y.map(h=>{const g=h.indexOf("→");if(g!==-1){const E=h.slice(0,g),O=h.slice(g+1);return{inputs:E.split("+").filter(Boolean),outputs:O.split("+").filter(Boolean)}}return{inputs:[h],outputs:[]}})}function $(y){i("select",y),A.value=!1,d.value=""}return(y,h)=>{const g=G,E=ne,O=Fe;return l(),T(O,{open:A.value,"onUpdate:open":h[1]||(h[1]=f=>A.value=f),title:"Select a model",ui:{content:"max-w-2xl"}},{body:c(()=>[s("div",je,[r(g,{ref_key:"searchInput",ref:_,modelValue:a(d),"onUpdate:modelValue":h[0]||(h[0]=f=>W(d)?d.value=f:null),placeholder:"Search models…",icon:"i-lucide-search",size:"sm"},null,8,["modelValue"]),o.models.length===0&&o.loading?(l(),m("div",Ke,[r(E,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),h[2]||(h[2]=s("span",{class:"text-sm"},"Loading models…",-1))])):o.models.length===0?(l(),m("div",ze," No models available — check your provider configuration ")):(l(),m("div",He,[(l(!0),m(U,null,F(a(n),f=>(l(),m("button",{key:f.id,class:ie(["w-full text-left px-4 py-3 rounded-lg hover:bg-elevated transition-colors border border-transparent hover:border-default flex items-start gap-4",o.selected===f.id?"bg-primary/10 ring-1 ring-inset ring-primary/30 border-primary/30":""]),onClick:b=>$(f.id)},[s("div",Qe,[s("p",Ye,[I(w(f.id)+" ",1),f.label&&f.label!==f.id?(l(),m("span",Ze," — "+w(f.label),1)):x("",!0)]),s("p",Je,[f.contextLength?(l(),m(U,{key:0},[I(w(C(f.contextLength))+" ctx",1)],64)):x("",!0),f.maxTokens?(l(),m(U,{key:1},[I(" · up to "+w(C(f.maxTokens))+" out",1)],64)):x("",!0),f.pricing?.prompt?(l(),m(U,{key:2},[I(" · $"+w(f.pricing.prompt)+" / $"+w(f.pricing.completion??"?")+" per 1M",1)],64)):x("",!0),!f.contextLength&&!f.maxTokens&&!f.pricing?.prompt?(l(),m("span",et,"No additional info")):x("",!0)])]),f.modalities?.length?(l(),m("div",tt,[(l(!0),m(U,null,F(V(f.modalities),b=>(l(),m(U,{key:b.inputs.join()+"→"+b.outputs.join()},[(l(!0),m(U,null,F(b.inputs,P=>(l(),m("span",{key:"in-"+P,title:k[P]?.label??P,class:"inline-flex items-center justify-center size-6 rounded-md bg-gray-100 dark:bg-gray-800 text-gray-500 hover:text-primary transition-colors"},[r(E,{name:k[P]?.icon??"i-lucide-cpu",class:"size-3.5"},null,8,["name"])],8,st))),128)),b.outputs.length?(l(),T(E,{key:0,name:"i-lucide-arrow-right",class:"size-3 text-gray-400 shrink-0"})):x("",!0),(l(!0),m(U,null,F(b.outputs,P=>(l(),m("span",{key:"out-"+P,title:k[P]?.label??P,class:"inline-flex items-center justify-center size-6 rounded-md bg-gray-100 dark:bg-gray-800 text-gray-500 hover:text-primary transition-colors"},[r(E,{name:k[P]?.icon??"i-lucide-cpu",class:"size-3.5"},null,8,["name"])],8,ot))),128))],64))),128))])):x("",!0)],10,Ge))),128)),a(n).length===0?(l(),m("div",at,' No models match "'+w(a(d))+'" ',1)):x("",!0)]))])]),_:1},8,["open"])}}}),nt=Object.assign(lt,{__name:"ModelPickerModal"}),it={class:"flex gap-2"},rt=H({__name:"ModelFieldInput",props:q({provider:{},providerResolved:{},reuse:{type:Boolean},models:{},loadingModels:{type:Boolean},placeholderAnthropic:{},placeholderOpenai:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:q(["loadModels"],["update:modelValue"]),setup(o,{emit:M}){const C=M,v=le(o,"modelValue"),i=R(!1);return(A,_)=>{const d=G,n=re,k=nt;return l(),m(U,null,[s("div",it,[r(d,{modelValue:v.value,"onUpdate:modelValue":_[0]||(_[0]=V=>v.value=V),placeholder:o.providerResolved==="anthropic"?o.placeholderAnthropic:o.placeholderOpenai,class:"flex-1"},null,8,["modelValue","placeholder"]),o.providerResolved?(l(),T(n,{key:0,size:"sm",variant:"soft",onClick:_[1]||(_[1]=V=>{C("loadModels"),i.value=!0})},{default:c(()=>[..._[4]||(_[4]=[I(" Choose model… ",-1)])]),_:1})):x("",!0)]),r(k,{open:a(i),"onUpdate:open":_[2]||(_[2]=V=>W(i)?i.value=V:null),models:o.models,selected:v.value,loading:o.loadingModels,onSelect:_[3]||(_[3]=V=>v.value=V)},null,8,["open","models","selected","loading"])],64)}}}),dt=Object.assign(rt,{__name:"ModelFieldInput"}),ct={class:"flex items-start justify-between gap-3"},ut={class:"flex items-start gap-2"},mt={class:"font-medium inline-flex items-center gap-1"},pt={class:"text-sm text-gray-500"},ft={class:"inline-flex items-center gap-1"},vt={class:"inline-flex items-center gap-1"},gt={class:"inline-flex items-center gap-1"},yt={key:3,class:"flex justify-end"},ht=H({__name:"AiRoleConfigForm",props:q({meta:{},hasApiKey:{type:Boolean},reuseOptions:{},providerOptions:{},presetOptions:{},disabled:{type:Boolean},envManaged:{type:Boolean},models:{},loadingModels:{type:Boolean},providerResolved:{},testing:{type:Boolean}},{modelValue:{required:!0},modelModifiers:{}}),emits:q(["applyPreset","loadModels","test"],["update:modelValue"]),setup(o,{emit:M}){const C=o,v=M,i=le(o,"modelValue"),A=D({get:()=>i.value.reuse??"own",set:d=>i.value.reuse=d==="own"?null:d}),_=D(()=>We(C.meta.help));return(d,n)=>{const k=ne,V=Be,$=pe,y=fe,h=ve,g=ge,E=G,O=dt,f=re;return l(),m("div",{class:ie(["rounded-lg border border-default p-4 space-y-4",o.meta.optional&&!i.value.enabled?"opacity-80":""])},[s("div",ct,[s("div",ut,[r(k,{name:o.meta.icon,class:"size-5 mt-0.5 text-primary"},null,8,["name"]),s("div",null,[s("p",mt,[I(w(o.meta.title)+" ",1),r(V,{topic:o.meta.help},null,8,["topic"])]),s("p",pt,w(o.meta.blurb),1)])]),o.meta.optional?(l(),T($,{key:0,modelValue:i.value.enabled,"onUpdate:modelValue":n[0]||(n[0]=b=>i.value.enabled=b),disabled:o.disabled&&!o.envManaged,"aria-label":o.meta.enableLabel},null,8,["modelValue","disabled","aria-label"])):x("",!0)]),!o.meta.optional||i.value.enabled?(l(),m(U,{key:0},[o.meta.reuseTargets.length?(l(),T(h,{key:0,label:"Provider source"},{default:c(()=>[r(y,{modelValue:a(A),"onUpdate:modelValue":n[1]||(n[1]=b=>W(A)?A.value=b:null),items:o.reuseOptions,disabled:o.disabled&&!o.envManaged,class:"w-full"},null,8,["modelValue","items","disabled"])]),_:1})):x("",!0),i.value.reuse?x("",!0):(l(),m(U,{key:1},[r(h,{label:"Provider"},{label:c(()=>[s("span",ft,[n[9]||(n[9]=I(" Provider ",-1)),o.disabled?(l(),T(g,{key:0,"env-vars":a(_)},null,8,["env-vars"])):x("",!0)])]),default:c(()=>[r(y,{modelValue:i.value.provider,"onUpdate:modelValue":n[2]||(n[2]=b=>i.value.provider=b),items:o.providerOptions,disabled:o.disabled,placeholder:"Choose a provider…",class:"w-full"},null,8,["modelValue","items","disabled"])]),_:1}),i.value.provider==="openai"?(l(),T(h,{key:0,label:"Preset",description:"Pick a known provider to auto-fill the URL and model, then adjust as needed"},{default:c(()=>[r(y,{items:o.presetOptions,placeholder:"Choose a preset…",disabled:o.disabled,class:"w-full","onUpdate:modelValue":n[3]||(n[3]=b=>v("applyPreset",b))},null,8,["items","disabled"])]),_:1})):x("",!0),i.value.provider?(l(),T(h,{key:1,label:"API key",description:o.hasApiKey?"Leave empty to keep the stored key, clear and save to remove it":"Required for Anthropic; optional for local OpenAI-compatible servers"},{label:c(()=>[s("span",vt,[n[10]||(n[10]=I(" API key ",-1)),o.disabled?(l(),T(g,{key:0,"env-vars":a(_)},null,8,["env-vars"])):x("",!0)])]),default:c(()=>[r(E,{modelValue:i.value.apiKey,"onUpdate:modelValue":n[4]||(n[4]=b=>i.value.apiKey=b),type:"password",placeholder:o.hasApiKey?"•••••••• (unchanged)":"sk-…",disabled:o.disabled,class:"w-full font-mono"},null,8,["modelValue","placeholder","disabled"])]),_:1},8,["description"])):x("",!0),i.value.provider==="openai"?(l(),T(h,{key:2,label:"Base URL",description:"Required, e.g. http://localhost:11434/v1"},{label:c(()=>[s("span",gt,[n[11]||(n[11]=I(" Base URL ",-1)),o.disabled?(l(),T(g,{key:0,"env-vars":a(_)},null,8,["env-vars"])):x("",!0)])]),default:c(()=>[r(E,{modelValue:i.value.baseUrl,"onUpdate:modelValue":n[5]||(n[5]=b=>i.value.baseUrl=b),placeholder:"http://localhost:11434/v1",disabled:o.disabled,class:"w-full"},null,8,["modelValue","disabled"])]),_:1})):x("",!0)],64)),i.value.reuse||i.value.provider?(l(),T(h,{key:2,label:"Model",description:i.value.reuse?"Leave empty to use the reused role's model":void 0},{default:c(()=>[r(O,{modelValue:i.value.model,"onUpdate:modelValue":n[6]||(n[6]=b=>i.value.model=b),provider:i.value.provider,"provider-resolved":o.providerResolved,reuse:!!i.value.reuse,models:o.models,"loading-models":o.loadingModels,"placeholder-anthropic":o.meta.modelPlaceholderAnthropic,"placeholder-openai":o.meta.modelPlaceholderOpenai,onLoadModels:n[7]||(n[7]=b=>v("loadModels"))},null,8,["modelValue","provider","provider-resolved","reuse","models","loading-models","placeholder-anthropic","placeholder-openai"])]),_:1},8,["description"])):x("",!0),o.providerResolved?(l(),m("div",yt,[r(f,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-plug",loading:o.testing,onClick:n[8]||(n[8]=b=>v("test"))},{default:c(()=>[...n[12]||(n[12]=[I(" Test connection ",-1)])]),_:1},8,["loading"])])):x("",!0)],64)):x("",!0)],2)}}}),bt=Object.assign(ht,{__name:"AiRoleConfigForm"}),_t={key:0,class:"space-y-3"},xt={class:"text-sm text-gray-500"},kt={key:0,class:"text-sm text-gray-500"},At={key:1,class:"overflow-x-auto"},It={class:"w-full text-sm"},Mt={class:"px-2 py-2"},St={class:"font-mono text-xs"},Vt={class:"text-xs text-gray-400"},wt={class:"text-right px-2 py-2"},Pt=["title"],Tt=["title"],Ct={class:"text-right px-2 py-2"},Ut={key:1,class:"flex items-center gap-2 py-4 text-muted"},Et=H({__name:"AiUsagePanel",async setup(o){let M,C;const v=R(30),i=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90}],{data:A,pending:_}=([M,C]=oe(()=>ae("/api/settings/ai/usage",{query:{days:v}},"$Q4bVv0_V0W")),M=await M,C(),M);function d(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}return(n,k)=>{const V=fe,$=Ne,y=ne,h=ye;return l(),T(h,{icon:"i-lucide-activity",title:"AI usage"},{actions:c(()=>[r(V,{modelValue:a(v),"onUpdate:modelValue":k[0]||(k[0]=g=>W(v)?v.value=g:null),items:i,size:"sm",class:"w-36"},null,8,["modelValue"])]),default:c(()=>[a(A)?(l(),m("div",_t,[s("p",xt,w(d(a(A).totals.diagnoses))+" diagnoses · "+w(d(a(A).totals.inputTokens))+" input tokens · "+w(d(a(A).totals.outputTokens))+" output tokens ",1),a(A).byModel.length===0?(l(),m("p",kt,"No AI calls recorded in this period.")):(l(),m("div",At,[s("table",It,[k[1]||(k[1]=s("thead",null,[s("tr",{class:"text-xs text-gray-500 uppercase tracking-wider border-b border-default"},[s("th",{class:"text-left px-2 py-2 font-medium"},"Model"),s("th",{class:"text-right px-2 py-2 font-medium"},"Diagnoses"),s("th",{class:"text-right px-2 py-2 font-medium"},"Failed"),s("th",{class:"text-right px-2 py-2 font-medium"},"Input tokens"),s("th",{class:"text-right px-2 py-2 font-medium"},"Output tokens"),s("th",{class:"text-right px-2 py-2 font-medium"},"Avg duration")])],-1)),s("tbody",null,[(l(!0),m(U,null,F(a(A).byModel,g=>(l(),m("tr",{key:`${g.provider??"unknown"}/${g.model}`,class:"border-b last:border-b-0 border-default"},[s("td",Mt,[s("span",St,w(g.model),1),s("span",Vt," · "+w(g.provider??"unknown"),1)]),s("td",wt,w(g.diagnoses),1),s("td",{class:ie(["text-right px-2 py-2",g.failed>0?"text-red-600 dark:text-red-400":""])},w(g.failed),3),s("td",{class:"text-right px-2 py-2",title:g.inputTokens.toLocaleString()},w(d(g.inputTokens)),9,Pt),s("td",{class:"text-right px-2 py-2",title:g.outputTokens.toLocaleString()},w(d(g.outputTokens)),9,Tt),s("td",Ct,[r($,{ms:g.avgDurationMs},null,8,["ms"])])]))),128))])])]))])):a(_)?(l(),m("div",Ut,[r(y,{name:"i-lucide-loader-circle",class:"size-4 animate-spin"}),k[2]||(k[2]=s("span",{class:"text-sm"},"Loading usage…",-1))])):x("",!0)]),_:1})}}}),Rt=Object.assign(Et,{__name:"AiUsagePanel"}),$t=[{key:"sampleErrorChars",label:"Error text characters",envVar:"PIWI_AI_MAX_SAMPLE_ERROR_CHARS",description:"Max characters of raw error text (per error block).",min:200,max:5e4},{key:"scmPatchBudget",label:"SCM patch budget",envVar:"PIWI_AI_MAX_SCM_PATCH_BUDGET",description:"Total characters of diff patches across changed files.",min:0,max:5e4},{key:"affectedTests",label:"Affected tests",envVar:"PIWI_AI_MAX_AFFECTED_TESTS",description:"Max affected tests listed.",min:1,max:200},{key:"steps",label:"Test steps",envVar:"PIWI_AI_MAX_STEPS",description:"Max recent test steps included.",min:1,max:200},{key:"consoleEntries",label:"Console entries",envVar:"PIWI_AI_MAX_CONSOLE_ENTRIES",description:"Max console error/warning entries included.",min:0,max:200},{key:"consoleEntryChars",label:"Console entry characters",envVar:"PIWI_AI_MAX_CONSOLE_ENTRY_CHARS",description:"Max characters per console entry.",min:50,max:5e3},{key:"networkRequests",label:"Network requests",envVar:"PIWI_AI_MAX_NETWORK_REQUESTS",description:"Max failed network requests included.",min:0,max:200},{key:"ariaSnapshotChars",label:"ARIA snapshot characters",envVar:"PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS",description:"Max characters of the page ARIA snapshot.",min:0,max:5e4},{key:"testSourceChars",label:"Test source characters",envVar:"PIWI_AI_MAX_TEST_SOURCE_CHARS",description:"Max characters of the test source snippet.",min:0,max:5e4},{key:"maxSourceFiles",label:"Full source files",envVar:"PIWI_AI_MAX_SOURCE_FILES",description:"Max full source files fetched from SCM to ground patches (0 disables).",min:0,max:20},{key:"sourceFileChars",label:"Source file characters",envVar:"PIWI_AI_MAX_SOURCE_FILE_CHARS",description:"Max characters per fetched full source file.",min:0,max:5e4},{key:"serverLogEntries",label:"Server log entries",envVar:"PIWI_AI_MAX_SERVER_LOG_ENTRIES",description:"Max backend server log entries (from X-Piwi-Logs header) included.",min:0,max:200},{key:"serverLogEntryChars",label:"Server log entry characters",envVar:"PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS",description:"Max characters per backend server log entry.",min:50,max:5e3},{key:"serverTraceSpans",label:"Server trace spans",envVar:"PIWI_AI_MAX_SERVER_TRACE_SPANS",description:"Max backend server spans (from X-Piwi-Trace header) included (0 disables).",min:0,max:500},{key:"maxImages",label:"Max screenshots",envVar:"PIWI_AI_MAX_IMAGES",description:"Max screenshots auto-included in the diagnosis context.",min:0,max:20},{key:"maxPassedPeers",label:"Max passed peers",envVar:"PIWI_AI_MAX_PASSED_PEERS",description:"Max peer tests in the same file listed when they passed.",min:0,max:100},{key:"maxConsoleWindow",label:"Console window entries",envVar:"PIWI_AI_MAX_CONSOLE_WINDOW",description:"Max console entries of any type in the window before failure.",min:0,max:200},{key:"slowRequestMs",label:"Slow request threshold (ms)",envVar:"PIWI_AI_SLOW_REQUEST_MS",description:"Network request duration threshold for flagging as slow.",min:100,max:3e4},{key:"maxTraceActions",label:"Trace actions",envVar:"PIWI_AI_MAX_TRACE_ACTIONS",description:"Max actions extracted from trace ZIP for failing-action context (0 disables).",min:0,max:50},{key:"traceDomChars",label:"Trace DOM excerpt characters",envVar:"PIWI_AI_TRACE_DOM_CHARS",description:"Max characters for the trace-derived DOM/ARIA excerpt in failing-action context.",min:0,max:2e4},{key:"traceStackFrames",label:"Trace stack frames",envVar:"PIWI_AI_MAX_TRACE_STACK_FRAMES",description:"Max call-stack frames (with source windows) from the trace (0 disables).",min:0,max:50},{key:"traceNetworkRequests",label:"Trace network requests",envVar:"PIWI_AI_MAX_TRACE_NETWORK_REQUESTS",description:"Max requests from the trace network stream (0 disables).",min:0,max:200},{key:"domSnapshotChars",label:"DOM snapshot characters",envVar:"PIWI_AI_MAX_DOM_SNAPSHOT_CHARS",description:"Max characters of the failure-time DOM snapshot rendered from the trace (0 disables).",min:0,max:5e4},{key:"imageMaxEdge",label:"Screenshot max edge (px)",envVar:"PIWI_AI_IMAGE_MAX_EDGE",description:"Screenshots are downscaled to at most this many pixels on the long edge before being sent.",min:512,max:8192}],Ot={class:"space-y-6"},Lt={class:"space-y-5"},Bt={class:"flex items-center gap-3"},Ft={class:"flex items-center gap-2 justify-end"},Wt={class:"flex justify-end"},Nt={class:"flex justify-end"},Dt={class:"grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-3"},qt={class:"flex justify-end gap-2"},ms=H({__name:"ai",async setup(o){let M,C;const v=Oe(),{data:i,refresh:A}=([M,C]=oe(()=>ae("/api/settings/ai","$5FSQHzGDZ4")),M=await M,C(),M);function _(){return{enabled:!1,reuse:null,provider:"",model:"",baseUrl:"",apiKey:""}}const d=z({diagnosis:_(),research:_(),embedding:_()}),n=R(!1),k=R(""),V=R(""),$=R(!1),y=R(!1),h=R(!1),g=z({diagnosis:!1,research:!1,embedding:!1}),E=z({diagnosis:[],research:[],embedding:[]}),O=z({diagnosis:!1,research:!1,embedding:!1});function f(t){const e=d[t];return e.reuse?d[e.reuse]?.provider||"":e.provider}async function b(t){const e=d[t],p=f(t),S=e.reuse?d[e.reuse]:e,ee=S.apiKey||void 0;O[t]=!0;try{const te=await $fetch("/api/settings/ai/models",{method:"POST",body:{role:t,provider:p,baseUrl:S.baseUrl||void 0,apiKey:ee}});E[t]=te.models}catch{E[t]=[]}finally{O[t]=!1}}const P=[{key:"diagnosis",title:"Diagnosis model",icon:"i-lucide-stethoscope",help:"settings.ai-provider",optional:!1,enableLabel:"",blurb:"The main model that writes the final diagnosis. Required to enable AI features.",reuseTargets:[],modelPlaceholderAnthropic:"claude-opus-4-8",modelPlaceholderOpenai:"e.g. gpt-4o, llama3.1"},{key:"research",title:"Research model",icon:"i-lucide-search",help:"settings.ai-research",optional:!0,enableLabel:"Two-stage diagnosis",blurb:"A cheaper/faster model that pre-analyzes the failure before the diagnosis model writes the final answer. Also used for cluster naming and merge adjudication.",reuseTargets:["diagnosis"],modelPlaceholderAnthropic:"e.g. claude-haiku-4-5",modelPlaceholderOpenai:"e.g. llama-3.1-8b-instant"},{key:"embedding",title:"Embedding model",icon:"i-lucide-vector-square",help:"settings.embedding-model",optional:!0,enableLabel:"Semantic clustering",blurb:"Embeds failures so semantically-similar errors group together (used by failure clustering).",reuseTargets:["diagnosis","research"],modelPlaceholderAnthropic:"— Anthropic has no embeddings API —",modelPlaceholderOpenai:"e.g. text-embedding-3-small"}],de=[{label:"Anthropic API",value:"anthropic"},{label:"OpenAI-compatible",value:"openai"}],he=de.filter(t=>t.value!=="anthropic"),be=D(()=>{const t={};for(const e of P)t[e.key]=[{label:"Configure its own provider",value:"own"},...e.reuseTargets.filter(p=>d[p].enabled||p==="diagnosis").filter(p=>e.key!=="embedding"||d[p].provider==="openai").map(p=>({label:`Reuse ${P.find(S=>S.key===p).title.toLowerCase()}`,value:p}))];return t}),N=D(()=>!!i.value?.envManaged),_e=qe(Xe("ai"));se(i,t=>{if(t){for(const e of P){const p=t.roles[e.key],S=d[e.key];S.enabled=!!p,S.reuse=p?.reuse??null,S.provider=p?.provider??"",S.model=p?.model??"",S.baseUrl=p?.baseUrl??"",S.apiKey=""}n.value=t.autoDiagnose,k.value=t.customInstructions||""}},{immediate:!0});function xe(t){return!!i.value?.roles[t]?.hasApiKey}const ce=[{label:"ollama (local)",baseUrl:"http://localhost:11434/v1",model:"llama3.1"},{label:"LM Studio (local)",baseUrl:"http://localhost:1234/v1",model:""},{label:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",model:"meta-llama/llama-3.1-8b-instruct"},{label:"Groq",baseUrl:"https://api.groq.com/openai/v1",model:"llama-3.1-8b-instant"},{label:"OpenAI",baseUrl:"https://api.openai.com/v1",model:"gpt-4o"},{label:"Mistral AI",baseUrl:"https://api.mistral.ai/v1",model:"mistral-small-latest"},{label:"Custom",baseUrl:"",model:""}],ke=ce.map(t=>({label:t.label,value:t.label}));function Ae(t,e){const p=ce.find(S=>S.label===e);!p||p.label==="Custom"||(d[t].baseUrl=p.baseUrl,d[t].model=p.model)}function Q(t){const e=d[t];if(!e.enabled)return null;if(e.reuse)return{reuse:e.reuse,model:e.model||void 0};const p={provider:e.provider,model:e.model||void 0,baseUrl:e.baseUrl||void 0};return e.apiKey!==""&&(p.apiKey=e.apiKey),p}async function Ie(){$.value=!0;try{!N&&(!d.diagnosis.enabled||!d.diagnosis.provider)?await $fetch("/api/settings/ai",{method:"PUT",body:{roles:null,autoDiagnose:n.value}}):await $fetch("/api/settings/ai",{method:"PUT",body:{roles:{diagnosis:Q("diagnosis"),research:Q("research"),embedding:Q("embedding")},autoDiagnose:n.value}}),await A();for(const t of P)d[t.key].apiKey="";v.add({title:"Settings saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{$.value=!1}}async function Me(){h.value=!0;try{await $fetch("/api/settings/ai",{method:"PUT",body:{scmToken:V.value||null}}),await A(),V.value="",v.add({title:"SCM token saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{h.value=!1}}async function Se(){y.value=!0;try{await $fetch("/api/settings/ai",{method:"PUT",body:{customInstructions:k.value||null}}),await A(),v.add({title:"Instructions saved",color:"success"})}catch(t){v.add({title:"Save failed",description:String(t?.message??t),color:"error"})}finally{y.value=!1}}async function Ve(t){g[t]=!0;try{const e=d[t],p=e.reuse?d[e.reuse]:e,S=await $fetch("/api/settings/ai/test",{method:"POST",body:{role:t,provider:p.provider||void 0,apiKey:p.apiKey||void 0,model:e.model||(e.reuse?p.model:"")||void 0,baseUrl:p.baseUrl||void 0}});S.success?v.add({title:"Connection successful",description:`Model: ${S.model}`,color:"success"}):v.add({title:"Connection failed",description:S.error||"Unknown error",color:"error"})}catch(e){v.add({title:"Connection failed",description:String(e?.message??e),color:"error"})}finally{g[t]=!1}}const{data:L}=([M,C]=oe(()=>ae("/api/settings/ai/limits","$qHhpP8mBYb")),M=await M,C(),M),Y=$t,X=z({}),Z=R(!1),J=D(()=>new Set(L.value?.envManaged??[]));se(L,t=>{if(t)for(const e of Y)X[e.key]=t.limits[e.key]},{immediate:!0});async function we(){Z.value=!0;try{L.value=await $fetch("/api/settings/ai/limits",{method:"PUT",body:{limits:X}}),v.add({title:"Context limits saved",color:"success"})}catch(t){v.add({title:"Failed to save context limits",description:String(t?.message??t),color:"error"})}finally{Z.value=!1}}function Pe(){if(L.value)for(const t of Y)J.value.has(t.key)||(X[t.key]=L.value.defaults[t.key])}return(t,e)=>{const p=Ee,S=bt,ee=pe,te=Re,j=re,K=ye,Te=Rt,ue=G,me=ve,Ce=De,Ue=ge;return l(),m("div",Ot,[a(N)?(l(),T(p,{key:0,"env-vars":a(_e)},null,8,["env-vars"])):x("",!0),r(K,{icon:"i-lucide-sparkles",title:"Model providers",help:"settings.ai-provider"},{subtitle:c(()=>[...e[3]||(e[3]=[I(" Configure a complete provider for each model role. Optional roles can reuse another role's provider so you don't re-enter credentials. ",-1)])]),footer:c(()=>[s("div",Ft,[r(j,{color:"primary",loading:a($),icon:"i-lucide-save",onClick:Ie},{default:c(()=>[...e[5]||(e[5]=[I(" Save ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[s("div",Lt,[(l(),m(U,null,F(P,u=>r(S,{key:u.key,modelValue:a(d)[u.key],"onUpdate:modelValue":B=>a(d)[u.key]=B,meta:u,"has-api-key":xe(u.key),"reuse-options":a(be)[u.key],"provider-options":u.key==="embedding"?a(he):de,"preset-options":a(ke),disabled:a(N),"env-managed":a(N),"provider-resolved":f(u.key),models:a(E)[u.key],"loading-models":a(O)[u.key],testing:a(g)[u.key],onApplyPreset:B=>Ae(u.key,B),onLoadModels:B=>b(u.key),onTest:B=>Ve(u.key)},null,8,["modelValue","onUpdate:modelValue","meta","has-api-key","reuse-options","provider-options","preset-options","disabled","env-managed","provider-resolved","models","loading-models","testing","onApplyPreset","onLoadModels","onTest"])),64)),r(te,{label:"Auto-diagnose",help:"settings.auto-diagnose","env-managed":a(N)},{default:c(()=>[s("div",Bt,[r(ee,{modelValue:a(n),"onUpdate:modelValue":e[0]||(e[0]=u=>W(n)?n.value=u:null),disabled:a(N)||!a(d).diagnosis.enabled},null,8,["modelValue","disabled"]),e[4]||(e[4]=s("span",{class:"text-sm text-gray-500"}," Automatically diagnose new failure clusters when a run finishes — up to 3 clusters per run (research + diagnosis call each), plus one batched call to title new clusters ",-1))])]),_:1},8,["env-managed"])])]),_:1}),r(Te),r(K,{title:"Repository access",help:"project.scm-token"},{subtitle:c(()=>[...e[6]||(e[6]=[I(" Optional — required for private repositories. Per-project tokens override this. ",-1)])]),footer:c(()=>[s("div",Wt,[r(j,{color:"primary",loading:a(h),icon:"i-lucide-save",onClick:Me},{default:c(()=>[...e[7]||(e[7]=[I(" Save token ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[r(me,{label:"SCM token",description:a(i)?.hasScmToken?"Leave empty to keep the stored token, enter a new value to replace it, or save empty to remove it":"Personal access token with read access to repository contents. Supports GitHub (ghp_), GitLab (glpat-), and Bitbucket tokens."},{default:c(()=>[r(ue,{modelValue:a(V),"onUpdate:modelValue":e[1]||(e[1]=u=>W(V)?V.value=u:null),type:"password",placeholder:a(i)?.hasScmToken?"•••••••• (unchanged)":"ghp_..., glpat-..., or Bitbucket token",class:"w-full font-mono"},null,8,["modelValue","placeholder"])]),_:1},8,["description"])]),_:1}),r(K,{title:"Global analysis instructions",help:"settings.ai-instructions"},{footer:c(()=>[s("div",Nt,[r(j,{color:"primary",loading:a(y),icon:"i-lucide-save",onClick:Se},{default:c(()=>[...e[8]||(e[8]=[I(" Save instructions ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[r(Ce,{modelValue:a(k),"onUpdate:modelValue":e[2]||(e[2]=u=>W(k)?k.value=u:null),rows:6,placeholder:"e.g. Always suggest running failing tests with --repeat-each 5 to confirm flakiness. Prefer network-level evidence over ARIA snapshots. Recommend git bisect when a commit range is available.",class:"w-full font-mono text-sm"},null,8,["modelValue"]),e[9]||(e[9]=s("p",{class:"text-xs text-gray-400 mt-2"}," These instructions are appended to the base system prompt. They shape how the AI analyzes failures but cannot override the response schema or confidence requirement. ",-1))]),_:1}),r(K,{title:"Diagnosis context limits",help:"settings.ai-limits"},{subtitle:c(()=>[...e[10]||(e[10]=[I(" Leave a field empty to use its default; env-managed fields are read-only. ",-1)])]),footer:c(()=>[s("div",qt,[r(j,{color:"neutral",variant:"ghost",size:"sm",onClick:Pe},{default:c(()=>[...e[11]||(e[11]=[I("Reset to defaults",-1)])]),_:1}),r(j,{color:"primary",loading:a(Z),icon:"i-lucide-save",size:"sm",onClick:we},{default:c(()=>[...e[12]||(e[12]=[I(" Save limits ",-1)])]),_:1},8,["loading"])])]),default:c(()=>[s("div",Dt,[(l(!0),m(U,null,F(a(Y),u=>(l(),T(me,{key:u.key,label:u.label,description:u.description,hint:`default ${a(L)?.defaults[u.key]??""}`},{default:c(()=>[r(ue,{modelValue:a(X)[u.key],"onUpdate:modelValue":B=>a(X)[u.key]=B,modelModifiers:{number:!0},type:"number",min:u.min,max:u.max,disabled:a(J).has(u.key),placeholder:`default ${a(L)?.defaults[u.key]??""}`,class:"w-full"},Le({_:2},[a(J).has(u.key)?{name:"trailing",fn:c(()=>[r(Ue,{"env-vars":[u.envVar]},null,8,["env-vars"])]),key:"0"}:void 0]),1032,["modelValue","onUpdate:modelValue","min","max","disabled","placeholder"])]),_:2},1032,["label","description","hint"]))),128))])]),_:1}),r(K,{icon:"i-lucide-shield-check",title:"Privacy notice",help:"settings.privacy"},{default:c(()=>[...e[13]||(e[13]=[s("div",{class:"space-y-2 text-sm text-gray-600 dark:text-gray-400"},[s("p",null,"When diagnosing a failure cluster, the following data is sent to the configured LLM provider:"),s("ul",{class:"list-disc list-inside space-y-1 ml-2"},[s("li",null,"Normalized error signature and sample raw error text"),s("li",null,"Test titles and file paths for affected tests"),s("li",null,"Browser info, test steps, console error/warning entries (excerpts)"),s("li",null,"Failed network request URLs and status codes"),s("li",null,"ARIA page snapshot (if collected)"),s("li",null," Commit SHA range since last passing run, plus changed file names and diff patches fetched from GitHub/GitLab/Bitbucket (if a repository token is configured or the repo is public) ")]),s("p",{class:"mt-2"},[I(" API keys are stored encrypted in the application database (admin-only access). For stricter setups, use the "),s("code",{class:"font-mono text-xs"},"PIWI_AI_*"),I(" environment variables instead of the UI. ")])],-1)])]),_:1})])}}});export{ms as default};
@@ -1 +0,0 @@
1
- import{_ as W}from"./C9p0YCAi.js";import{_ as X}from"./BTvE9qca.js";import{_ as Y}from"./CBZD8ym8.js";import{_ as Z,a as tt}from"./B_mN5eMV.js";import{_ as et}from"./PdEEuEsg.js";import{d as st,u as at,w as T,J as ot,e as nt,f as u,g as a,h as w,o as n,i,t as l,k as t,v as d,c as _,j as o,s as rt,m,G as it,_ as lt,F as S,y as D,q as ct,p as ut,r as dt,n as _t}from"./h49q_GXF.js";import{_ as mt}from"./CkyMZI-0.js";import{_ as pt}from"./DWEkQ7bl.js";import{_ as ft}from"./BtSJxOdh.js";import{_ as gt}from"./DtSn2Q9-.js";import{_ as ht}from"./b_yFgp5S.js";import{_ as yt}from"./DQnsFoJn.js";import{_ as xt}from"./CRPt9SfB.js";import{_ as bt}from"./DGyGmFem.js";import{_ as kt}from"./BVN50jIb.js";import{_ as vt}from"./DLNNAYfu.js";import{_ as $t}from"./9P8iHISX.js";import{f as jt,j as Rt}from"./CD3R-ggS.js";import{u as I}from"./Cd8r0xk5.js";import"./BhH0TNTi.js";import"./DOLeth7M.js";import"./BZnfiR67.js";import"./BjaRappk.js";import"./Sgis3xif.js";import"./Cwwe5bRS.js";import"./D7W_4Sqc.js";import"./czXrP7NB.js";import"./B6s20NbT.js";import"./CWoSSKhQ.js";const Ct={class:"flex flex-col gap-4 p-4"},Tt={class:"flex items-start gap-4 flex-wrap"},wt={class:"flex-1 min-w-0"},St={class:"text-xl font-bold truncate"},Dt={key:1,class:"flex items-center gap-2 mt-2"},It={key:0,class:"grid grid-cols-1 lg:grid-cols-2 gap-4"},zt={class:"flex items-center gap-1 flex-wrap max-h-[200px] overflow-y-auto py-1"},Lt={key:0,class:"text-sm text-gray-400"},Nt={key:1,class:"text-center py-6 text-gray-400"},Ut={class:"text-xs whitespace-nowrap"},Et={class:"text-gray-500"},Pt={class:"text-gray-400 ml-1"},At={key:1,class:"text-gray-400"},Vt=["title"],Bt={class:"flex justify-end"},Ft={class:"space-y-2"},Kt={class:"flex items-center gap-2 min-w-0"},Ht={class:"text-sm truncate"},Gt={key:0,class:"text-xs text-gray-400 shrink-0"},$e=st({__name:"[id]",async setup(Mt){let p,y;const h=at().params.id,{data:s,refresh:z}=([p,y]=T(()=>I(`/api/test-cases/${h}`,"$IiVoRdAdzb")),p=await p,y(),p),{data:f}=([p,y]=T(()=>I(`/api/test-cases/${h}/history`,"$cuQ0G6KeIS")),p=await p,y(),p),j=dt([]);ot(()=>s.value?.project?.id,async r=>{if(r)try{j.value=(await $fetch(`/api/projects/${r}/markers`)).markers??[]}catch{}},{immediate:!0});function L(){const r=s.value?.project?.id;r&&_t(`/projects/${r}?tab=timeline`)}nt(w(()=>({title:`${s.value?.title||`Test case #${h}`} — Piwi Dashboard`})));const x=w(()=>{const r=s.value;return!r||!r.totalRuns?null:Math.round((r.passedRuns+r.skippedRuns)/r.totalRuns*100)}),N=r=>r==="open"?"error":r==="resolved"?"success":"neutral",U=[{accessorKey:"startTime",header:"Date"},{accessorKey:"status",header:"Status"},{accessorKey:"duration",header:"Duration"},{accessorKey:"retries",header:"Retries"},{accessorKey:"runId",header:"Run"},{accessorKey:"error",header:"Error"},{id:"actions",header:"Actions"}];return(r,c)=>{const E=W,P=X,A=Y,V=tt,B=et,b=rt,k=lt,v=it,g=mt,R=pt,F=ft,K=gt,H=ht,C=yt,G=xt,M=ut,O=bt,q=kt,$=vt,J=$t,Q=Z;return n(),u(Q,{id:"test-case-evolution"},{header:a(()=>[o(V,null,{leading:a(()=>[o(E),o(P,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...t(s)?.project?.id?[{label:t(s).project.name||"Project",to:`/projects/${t(s).project.id}`}]:[{label:"Project"}],{label:t(s)?.title||`Test case #${t(h)}`}]},null,8,["items"])]),right:a(()=>[o(A,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>t(z)()}]},null,8,["actions"])]),_:1})]),body:a(()=>[i("div",Ct,[i("div",Tt,[i("div",wt,[i("h1",St,l(t(s)?.title),1),t(s)?.filePath?(n(),u(B,{key:0,"file-path":t(s).filePath,"project-key":t(s)?.project?.id,"project-name":t(s)?.project?.name,class:"text-sm text-gray-500 mt-0.5"},null,8,["file-path","project-key","project-name"])):d("",!0),t(s)?.project?(n(),_("div",Dt,[o(b,{color:"neutral",variant:"soft",size:"xs",class:"font-mono"},{default:a(()=>[m(l(t(s).project.name),1)]),_:1}),t(s)?.flakyRuns>0?(n(),u(b,{key:0,color:"warning",variant:"soft",size:"xs"},{default:a(()=>[m(l(t(s).flakyRuns)+" flaky run"+l(t(s).flakyRuns===1?"":"s"),1)]),_:1})):d("",!0)])):d("",!0)]),t(s)?.lastExecutionId?(n(),u(v,{key:0,to:`/test-run-cases/${t(s).lastExecutionId}`,class:"shrink-0"},{default:a(()=>[o(k,{size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:a(()=>[...c[0]||(c[0]=[m(" Latest execution ",-1)])]),_:1})]),_:1},8,["to"])):d("",!0)]),o(K,null,{default:a(()=>[o(g,{label:"Total runs",value:t(s)?.totalRuns??0},null,8,["value"]),o(g,{label:"Pass rate",value:t(x)!==null?`${t(x)}%`:"—","value-class":(t(x)??0)>=80?"text-green-600":(t(x)??0)>=50?"text-yellow-600":"text-red-600"},null,8,["value","value-class"]),o(g,{label:"Failed",value:t(s)?.failedRuns??0,"value-class":"text-red-600"},null,8,["value"]),o(g,{label:"Avg duration"},{default:a(()=>[o(R,{ms:t(s)?.avgDuration},null,8,["ms"])]),_:1}),o(g,{label:"Flaky",value:t(s)?.flakyRuns??0,"value-class":(t(s)?.flakyRuns??0)>0?"text-purple-600":""},{label:a(()=>[c[1]||(c[1]=m(" Flaky ",-1)),o(F,{topic:"case.flaky-count"})]),_:1},8,["value","value-class"]),o(g,{label:"Last run",size:"sm",value:t(s)?.lastRunAt?("formatRelativeTime"in r?r.formatRelativeTime:t(jt))(t(s).lastRunAt):"—"},null,8,["value"])]),_:1}),t(f)&&t(f).length>1?(n(),_("div",It,[o(C,{title:"Duration trend",icon:"i-lucide-trending-up",help:"case.history-chart"},{default:a(()=>[o(H,{data:t(f),height:200,markers:t(j),onMarkerClick:L},null,8,["data","markers"])]),_:1}),o(C,{title:"Status history",icon:"i-lucide-check-circle",help:"case.sparkline"},{default:a(()=>[i("div",zt,[(n(!0),_(S,null,D(t(f),(e,qt)=>(n(),u(G,{key:e.id,text:`Run #${e.runId}: ${e.status} — ${new Date(e.startTime).toLocaleDateString("en-US",{month:"short",day:"numeric"})}`},{default:a(()=>[o(v,{to:`/test-run-cases/${e.id}`,class:ct([{"bg-red-500 hover:bg-red-600":e.status==="failed"||e.status==="timedOut","bg-green-500 hover:bg-green-600":e.status==="passed","bg-yellow-500 hover:bg-yellow-600":e.status==="skipped","bg-gray-400 hover:bg-gray-500":!["passed","failed","skipped","timedOut"].includes(e.status)},"size-3.5 rounded-sm inline-block transition-colors"]),title:`Run #${e.runId}: ${e.status}`},null,8,["to","class","title"])]),_:2},1032,["text"]))),128)),t(f).length===0?(n(),_("span",Lt,"No history yet")):d("",!0)])]),_:1})])):t(f)&&t(f).length<=1?(n(),_("div",Nt,[o(M,{name:"i-lucide-trending-up",class:"size-6 mx-auto mb-1"}),c[2]||(c[2]=i("p",{class:"text-sm"},"Need at least 2 runs to show trends.",-1))])):d("",!0),o($,{icon:"i-lucide-list-checks",title:`Recent executions (${t(s)?.recentExecutions?.length??0})`},{default:a(()=>[t(s)?.recentExecutions?.length?(n(),u(O,{key:0,data:t(s).recentExecutions,columns:U,ui:{base:"table-fixed border-separate border-spacing-0",thead:"[&>tr]:bg-elevated/50 [&>tr]:after:content-none",tbody:"[&>tr]:last:[&>td]:border-b-0",th:"first:rounded-l-lg last:rounded-r-lg border-y border-default first:border-l last:border-r",td:"border-b border-default"}},{"startTime-cell":a(({row:e})=>[i("span",Ut,[i("span",Et,l(new Date(e.original.startTime).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),i("span",Pt,l(new Date(e.original.startTime).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})),1)])]),"status-cell":a(({row:e})=>[o(b,{color:("getStatusColor"in r?r.getStatusColor:t(Rt))(e.original.status),variant:"subtle",class:"capitalize"},{default:a(()=>[m(l(e.original.status),1)]),_:2},1032,["color"])]),"duration-cell":a(({row:e})=>[e.original.duration!==null?(n(),u(R,{key:0,ms:e.original.duration},null,8,["ms"])):(n(),_("span",At,"—"))]),"retries-cell":a(({row:e})=>[m(l(e.original.retries&&e.original.retries>0?e.original.retries:""),1)]),"runId-cell":a(({row:e})=>[o(v,{to:`/test-runs/${e.original.runId}`,class:"text-primary hover:underline"},{default:a(()=>[m(l(e.original.runLabel?`${e.original.runLabel} (#${e.original.runId})`:`#${e.original.runId}`),1)]),_:2},1032,["to"])]),"error-cell":a(({row:e})=>[e.original.error?(n(),_("span",{key:0,class:"text-red-600 text-xs truncate max-w-xs block",title:e.original.error},l(e.original.error.length>80?`${e.original.error.substring(0,80)}…`:e.original.error),9,Vt)):d("",!0)]),"actions-header":a(()=>[...c[3]||(c[3]=[i("div",{class:"text-right"},"Actions",-1)])]),"actions-cell":a(({row:e})=>[i("div",Bt,[o(k,{to:`/test-run-cases/${e.original.id}`,size:"sm",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:a(()=>[...c[4]||(c[4]=[m(" View ",-1)])]),_:1},8,["to"])])]),_:1},8,["data"])):(n(),u(q,{key:1,icon:"i-lucide-inbox",text:"No executions yet"}))]),_:1},8,["title"]),t(s)?.failureClusters?.length?(n(),u($,{key:2,icon:"i-lucide-bug",title:`Failure clusters (${t(s).failureClusters.length})`,help:"cluster.concept"},{default:a(()=>[i("div",Ft,[(n(!0),_(S,null,D(t(s).failureClusters,e=>(n(),_("div",{key:e.id,class:"flex items-center justify-between py-2 px-2 rounded hover:bg-gray-50 dark:hover:bg-gray-800"},[i("div",Kt,[o(b,{color:N(e.status),variant:"soft",size:"xs",class:"capitalize"},{default:a(()=>[m(l(e.status),1)]),_:2},1032,["color"]),i("span",Ht,l(e.signature),1),e.occurrences>1?(n(),_("span",Gt,l(e.occurrences)+" occurrences ",1)):d("",!0)]),o(k,{to:`/failure-clusters/${e.id}`,size:"xs",variant:"outline","trailing-icon":"i-lucide-arrow-right"},{default:a(()=>[...c[5]||(c[5]=[m(" View ",-1)])]),_:1},8,["to"])]))),128))])]),_:1},8,["title"])):d("",!0),t(s)?.links?.length?(n(),u($,{key:3,icon:"i-lucide-link",title:"Links",help:"shared.entity-links"},{default:a(()=>[o(J,{"entity-type":"test_case","entity-id":Number(t(h)),links:t(s).links??null},null,8,["entity-id","links"])]),_:1})):d("",!0)])]),_:1})}}});export{$e as default};
@@ -1 +0,0 @@
1
- {"id":"28bca36d-5571-4157-b1b8-7f62c934eed6","timestamp":1785469653361,"prerendered":[]}