@piwitests/server 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{DZECGgZm.js → 5nOoVJzL.js} +1 -1
  3. package/.output/public/_nuxt/6DSY_93j.js +1 -0
  4. package/.output/public/_nuxt/7vRR5W2L.js +1 -0
  5. package/.output/public/_nuxt/{CC8wk-N0.js → 9Dtlg-K4.js} +1 -1
  6. package/.output/public/_nuxt/9Yziijlb.js +1 -0
  7. package/.output/public/_nuxt/{DAhv9aNg.js → B-onBCAB.js} +1 -1
  8. package/.output/public/_nuxt/B2bK5uNR.js +1 -0
  9. package/.output/public/_nuxt/{B2L0-Lzp.js → B63B19Iv.js} +2 -2
  10. package/.output/public/_nuxt/{oSLbl-p0.js → B77w1Eib.js} +1 -1
  11. package/.output/public/_nuxt/{pZbe82l5.js → BC5bqlfM.js} +1 -1
  12. package/.output/public/_nuxt/{jR2xm3_t.js → BF5JDf9_.js} +1 -1
  13. package/.output/public/_nuxt/BFVrl1ss.js +1 -0
  14. package/.output/public/_nuxt/{Bj_v57Zu.js → BIHMeNW-.js} +1 -1
  15. package/.output/public/_nuxt/BKqOGcst.js +1 -0
  16. package/.output/public/_nuxt/{Bsc11YIJ.js → BLqooxh5.js} +1 -1
  17. package/.output/public/_nuxt/{Ce_j5NtN.js → BMfTUMYy.js} +1 -1
  18. package/.output/public/_nuxt/{CmTzxoQt.js → BOrnSpTA.js} +1 -1
  19. package/.output/public/_nuxt/{Bq4_kqIp.js → BPQNVV4M.js} +1 -1
  20. package/.output/public/_nuxt/{FJTsZ5Aa.js → BSKLNgre.js} +1 -1
  21. package/.output/public/_nuxt/BTCWUyBX.js +1 -0
  22. package/.output/public/_nuxt/BUYmGTVP.js +1 -0
  23. package/.output/public/_nuxt/{mi22nGUC.js → BWddBCom.js} +1 -1
  24. package/.output/public/_nuxt/{axj2iIDK.js → BYQ9lXQb.js} +1 -1
  25. package/.output/public/_nuxt/BYWQ47QQ.js +5 -0
  26. package/.output/public/_nuxt/{Bag08cIY.js → BYnqoVCE.js} +1 -1
  27. package/.output/public/_nuxt/{Clg2Qx0r.js → BaU2hm4B.js} +1 -1
  28. package/.output/public/_nuxt/{roaTZkYi.js → BbXvpkBp.js} +1 -1
  29. package/.output/public/_nuxt/Bb_925DD.js +1 -0
  30. package/.output/public/_nuxt/BcHU1KNK.js +1 -0
  31. package/.output/public/_nuxt/BdUGUwvE.js +1 -0
  32. package/.output/public/_nuxt/{D1Ucra3E.js → BeQq85yJ.js} +2 -2
  33. package/.output/public/_nuxt/Bg8yOdSf.js +1 -0
  34. package/.output/public/_nuxt/BhzfJaPC.js +1 -0
  35. package/.output/public/_nuxt/{499RbBSX.js → Bkb-0yS0.js} +4 -4
  36. package/.output/public/_nuxt/BmweLu9g.js +2 -0
  37. package/.output/public/_nuxt/Boyv6hLW.js +1 -0
  38. package/.output/public/_nuxt/{DXkFgrsT.js → Bq4xEWLF.js} +4 -4
  39. package/.output/public/_nuxt/{7_9fts7T.js → BraJd4EA.js} +1 -1
  40. package/.output/public/_nuxt/BvXrhZ8k.js +1 -0
  41. package/.output/public/_nuxt/{DNKZmhbX.js → Bw4oIhct.js} +1 -1
  42. package/.output/public/_nuxt/BxSrScjV.js +1 -0
  43. package/.output/public/_nuxt/Byqt8JHG.js +1 -0
  44. package/.output/public/_nuxt/{CNu3kken.js → BzBaMPgu.js} +4 -4
  45. package/.output/public/_nuxt/{PDSNX4Te.js → C1-8_6cB.js} +1 -1
  46. package/.output/public/_nuxt/{Ce89VyHE.js → C7SG50jD.js} +1 -1
  47. package/.output/public/_nuxt/{CBJFORiZ.js → C8WgBDU1.js} +1 -1
  48. package/.output/public/_nuxt/C8uZoJVq.js +1 -0
  49. package/.output/public/_nuxt/{D3SJGdl4.js → CBQXv4bU.js} +2 -2
  50. package/.output/public/_nuxt/CDEmotIt.js +1 -0
  51. package/.output/public/_nuxt/CIBOv3Ge.js +2 -0
  52. package/.output/public/_nuxt/CO7j4p5r.js +1 -0
  53. package/.output/public/_nuxt/COMhp7lz.js +1 -0
  54. package/.output/public/_nuxt/{jxc14CqP.js → CPiLUjjx.js} +1 -1
  55. package/.output/public/_nuxt/{DZ-KbUZi.js → CTYlay1H.js} +1 -1
  56. package/.output/public/_nuxt/{5QBnDbs_.js → CVEk4D8I.js} +1 -1
  57. package/.output/public/_nuxt/{LTMoFvEY.js → CbuK1HIv.js} +1 -1
  58. package/.output/public/_nuxt/{2yLW7WU0.js → CdLqOMvN.js} +1 -1
  59. package/.output/public/_nuxt/CdM2qNYM.js +2 -0
  60. package/.output/public/_nuxt/Ch8sGLqE.js +1 -0
  61. package/.output/public/_nuxt/CkdznmkX.js +1 -0
  62. package/.output/public/_nuxt/{DJzFYrBt.js → Cmuwgbf4.js} +1 -1
  63. package/.output/public/_nuxt/{C9I1Dp3S.js → CnRNwiuE.js} +1 -1
  64. package/.output/public/_nuxt/{Bb2mDqKr.js → CnsaoeEq.js} +1 -1
  65. package/.output/public/_nuxt/{DgEa6_av.js → Cp0V2FeW.js} +1 -1
  66. package/.output/public/_nuxt/Cvw4EFTy.js +17 -0
  67. package/.output/public/_nuxt/CwDej2Lz.js +1 -0
  68. package/.output/public/_nuxt/D-wlhH6J.js +1 -0
  69. package/.output/public/_nuxt/D5Mhpp98.js +1 -0
  70. package/.output/public/_nuxt/{CTTmX4gy.js → D8ixf-ZR.js} +5 -5
  71. package/.output/public/_nuxt/{HbnAkiyK.js → DBvdRbTA.js} +2 -2
  72. package/.output/public/_nuxt/DDho3MJD.js +1 -0
  73. package/.output/public/_nuxt/DEGHW4pO.js +1 -0
  74. package/.output/public/_nuxt/{C77tM5Hz.js → DHSYRMJp.js} +1 -1
  75. package/.output/public/_nuxt/DH_LEqhd.js +2 -0
  76. package/.output/public/_nuxt/{CUOS6S13.js → DIqik40e.js} +1 -1
  77. package/.output/public/_nuxt/DLwuL-qR.js +1 -0
  78. package/.output/public/_nuxt/{AQ86C4c2.js → DPDFGVb_.js} +2 -2
  79. package/.output/public/_nuxt/DRNHuVn4.js +2 -0
  80. package/.output/public/_nuxt/{B_MVJP17.js → DUtYU4Sb.js} +1 -1
  81. package/.output/public/_nuxt/{CAoQUDI4.js → DWl73MJR.js} +1 -1
  82. package/.output/public/_nuxt/{BZFiz2UB.js → DWz_bHNP.js} +1 -1
  83. package/.output/public/_nuxt/{CGDPUNcO.js → D_SCB-z2.js} +1 -1
  84. package/.output/public/_nuxt/{Ce47NgZw.js → D_j436ND.js} +1 -1
  85. package/.output/public/_nuxt/DamzjN7l.js +1 -0
  86. package/.output/public/_nuxt/Db5xe__T.js +1 -0
  87. package/.output/public/_nuxt/{BuGAn4f7.js → DcUBmKKE.js} +1 -1
  88. package/.output/public/_nuxt/DiP18sFE.js +1 -0
  89. package/.output/public/_nuxt/Die1200X.js +1 -0
  90. package/.output/public/_nuxt/DihSeDlY.js +9 -0
  91. package/.output/public/_nuxt/{BAbrtVp3.js → DkGXOZRW.js} +1 -1
  92. package/.output/public/_nuxt/{ZLfZolDM.js → DnOtRv65.js} +1 -1
  93. package/.output/public/_nuxt/DnV-BkUA.js +1 -0
  94. package/.output/public/_nuxt/DpeRrg68.js +1 -0
  95. package/.output/public/_nuxt/Dq6_-84R.js +1 -0
  96. package/.output/public/_nuxt/DqKFKS1b.js +1 -0
  97. package/.output/public/_nuxt/DrbO0dl5.js +6 -0
  98. package/.output/public/_nuxt/{B3G-TIoP.js → Ds8_6Fzl.js} +1 -1
  99. package/.output/public/_nuxt/{QZYo3ErV.js → DvewDI9t.js} +1 -1
  100. package/.output/public/_nuxt/E26Y1NWH.js +1 -0
  101. package/.output/public/_nuxt/Hp-_W7z4.js +1 -0
  102. package/.output/public/_nuxt/OanUGF_v.js +1 -0
  103. package/.output/public/_nuxt/{9_aJhhcm.js → RSS6R9Te.js} +12 -12
  104. package/.output/public/_nuxt/{BfcMJBTf.js → VqLetC2g.js} +1 -1
  105. package/.output/public/_nuxt/WCZdf9Ln.js +1 -0
  106. package/.output/public/_nuxt/{DBWM_xs-.js → Yl6iqHwK.js} +4 -4
  107. package/.output/public/_nuxt/builds/latest.json +1 -1
  108. package/.output/public/_nuxt/builds/meta/03f2d81b-8c58-4ea8-9a9d-7553c8ca4af6.json +1 -0
  109. package/.output/public/_nuxt/entry.DVKh2Fd6.css +1 -0
  110. package/.output/public/_nuxt/iUf7K_JR.js +1 -0
  111. package/.output/public/_nuxt/{B_JSV0yG.js → kDEwM7SQ.js} +1 -1
  112. package/.output/public/_nuxt/{BDUfBn3i.js → knaDbxMJ.js} +1 -1
  113. package/.output/public/_nuxt/lnpLc047.js +1 -0
  114. package/.output/public/_nuxt/{C2_7XZo0.js → mhvG7mu8.js} +1 -1
  115. package/.output/public/_nuxt/{Ck_fTH5z.js → qUaN2ZW8.js} +4 -4
  116. package/.output/public/_nuxt/qeqzb80l.js +1 -0
  117. package/.output/public/_nuxt/{BwwfasRt.js → uj92NYTx.js} +2 -2
  118. package/.output/public/_nuxt/vOZZ2cLi.js +1 -0
  119. package/.output/public/_nuxt/{CLWMETf9.js → zAFiz2Mg.js} +1 -1
  120. package/.output/public/demo/seed.version.json +2 -2
  121. package/.output/server/chunks/_/collect.mjs +1 -1
  122. package/.output/server/chunks/_/markers.mjs +1 -1
  123. package/.output/server/chunks/_/quarantine.mjs +1 -1
  124. package/.output/server/chunks/_/users.mjs +1 -1
  125. package/.output/server/chunks/build/{Alert-He-UxEt6.mjs → Alert-BhTWQzM5.mjs} +2 -2
  126. package/.output/server/chunks/build/Alert-BhTWQzM5.mjs.map +1 -0
  127. package/.output/server/chunks/build/{Breadcrumb-DEP2dVCZ.mjs → Breadcrumb-BJnPB2AW.mjs} +3 -3
  128. package/.output/server/chunks/build/Breadcrumb-BJnPB2AW.mjs.map +1 -0
  129. package/.output/server/chunks/build/{BreadcrumbNav-y6nMDYcR.mjs → BreadcrumbNav-C6Cun6tF.mjs} +3 -3
  130. package/.output/server/chunks/build/BreadcrumbNav-C6Cun6tF.mjs.map +1 -0
  131. package/.output/server/chunks/build/{BrowserBadge-DIASU8Gf.mjs → BrowserBadge-T1KRMIXA.mjs} +4 -4
  132. package/.output/server/chunks/build/BrowserBadge-T1KRMIXA.mjs.map +1 -0
  133. package/.output/server/chunks/build/{ChartCard-ZTsCvItQ.mjs → ChartCard-D_asI_WF.mjs} +2 -2
  134. package/.output/server/chunks/build/ChartCard-D_asI_WF.mjs.map +1 -0
  135. package/.output/server/chunks/build/{ChartMarkerTooltip-u_1DUHh-.mjs → ChartMarkerTooltip-DscESDg7.mjs} +3 -3
  136. package/.output/server/chunks/build/ChartMarkerTooltip-DscESDg7.mjs.map +1 -0
  137. package/.output/server/chunks/build/{Checkbox-BisdHf8n.mjs → Checkbox-Y9ZiIRkJ.mjs} +7 -7
  138. package/.output/server/chunks/build/Checkbox-Y9ZiIRkJ.mjs.map +1 -0
  139. package/.output/server/chunks/build/{CodeBlock-B8BNtZAe.mjs → CodeBlock-Bnn_ps9O.mjs} +5 -5
  140. package/.output/server/chunks/build/CodeBlock-Bnn_ps9O.mjs.map +1 -0
  141. package/.output/server/chunks/build/{DashboardNavbar-D7-3zBUU.mjs → DashboardNavbar-D37dPEtR.mjs} +3 -3
  142. package/.output/server/chunks/build/DashboardNavbar-D37dPEtR.mjs.map +1 -0
  143. package/.output/server/chunks/build/{DashboardSidebarToggle-C3HdHvlE.mjs → DashboardSidebarToggle-DzwsZHVx.mjs} +3 -3
  144. package/.output/server/chunks/build/DashboardSidebarToggle-DzwsZHVx.mjs.map +1 -0
  145. package/.output/server/chunks/build/{DataLocationCard-CC2-lHiP.mjs → DataLocationCard-CUXgZQEs.mjs} +4 -4
  146. package/.output/server/chunks/build/DataLocationCard-CUXgZQEs.mjs.map +1 -0
  147. package/.output/server/chunks/build/{DesktopRunLocallyButton-iNzrDsEs.mjs → DesktopRunLocallyButton-BCmQklj6.mjs} +15 -76
  148. package/.output/server/chunks/build/DesktopRunLocallyButton-BCmQklj6.mjs.map +1 -0
  149. package/.output/server/chunks/build/{DiagnosisPanel-BVb2LgHu.mjs → DiagnosisPanel-haHS2azn.mjs} +8 -8
  150. package/.output/server/chunks/build/DiagnosisPanel-haHS2azn.mjs.map +1 -0
  151. package/.output/server/chunks/build/{DiagnosisResult-xVgZlfKK.mjs → DiagnosisResult-DqTIOelM.mjs} +11 -11
  152. package/.output/server/chunks/build/DiagnosisResult-DqTIOelM.mjs.map +1 -0
  153. package/.output/server/chunks/build/{DurationValue-UX9uajQJ.mjs → DurationValue-D6fQEi5S.mjs} +2 -2
  154. package/.output/server/chunks/build/DurationValue-D6fQEi5S.mjs.map +1 -0
  155. package/.output/server/chunks/build/{EmptyState-DC2q_7TD.mjs → EmptyState-C-mCzGhO.mjs} +2 -2
  156. package/.output/server/chunks/build/EmptyState-C-mCzGhO.mjs.map +1 -0
  157. package/.output/server/chunks/build/{EntityLinks-Dzn73fbq.mjs → EntityLinks-CRJQM9Vy.mjs} +4 -4
  158. package/.output/server/chunks/build/EntityLinks-CRJQM9Vy.mjs.map +1 -0
  159. package/.output/server/chunks/build/{EnvManagedBadge-C-agmABK.mjs → EnvManagedBadge-hyelwXrw.mjs} +4 -4
  160. package/.output/server/chunks/build/EnvManagedBadge-hyelwXrw.mjs.map +1 -0
  161. package/.output/server/chunks/build/{ErrorState-CktYyeEZ.mjs → ErrorState-9UPssp7w.mjs} +2 -2
  162. package/.output/server/chunks/build/ErrorState-9UPssp7w.mjs.map +1 -0
  163. package/.output/server/chunks/build/{FeatureUnavailable-DHFkwI7t.mjs → FeatureUnavailable-CDw3__eq.mjs} +3 -3
  164. package/.output/server/chunks/build/FeatureUnavailable-CDw3__eq.mjs.map +1 -0
  165. package/.output/server/chunks/build/{FormField-GYHKiSI6.mjs → FormField-8vSc-3mb.mjs} +2 -2
  166. package/.output/server/chunks/build/FormField-8vSc-3mb.mjs.map +1 -0
  167. package/.output/server/chunks/build/{GetStartedWizard-BpcGYsm2.mjs → GetStartedWizard-Dp_tjhry.mjs} +4 -4
  168. package/.output/server/chunks/build/GetStartedWizard-Dp_tjhry.mjs.map +1 -0
  169. package/.output/server/chunks/build/{HelpHint-plioHKA0.mjs → HelpHint-Bfyo3ar6.mjs} +31 -4
  170. package/.output/server/chunks/build/HelpHint-Bfyo3ar6.mjs.map +1 -0
  171. package/.output/server/chunks/build/{LoadingState-CwpfmI0W.mjs → LoadingState-CxfFwac9.mjs} +2 -2
  172. package/.output/server/chunks/build/LoadingState-CxfFwac9.mjs.map +1 -0
  173. package/.output/server/chunks/build/{MarkerBadge-Biz5--h2.mjs → MarkerBadge-DmubzeuF.mjs} +2 -2
  174. package/.output/server/chunks/build/MarkerBadge-DmubzeuF.mjs.map +1 -0
  175. package/.output/server/chunks/build/{MetaStripGroup-A0a72vt5.mjs → MetaStripGroup-C-cNBfC9.mjs} +6 -6
  176. package/.output/server/chunks/build/MetaStripGroup-C-cNBfC9.mjs.map +1 -0
  177. package/.output/server/chunks/build/{Modal-hKLvVFNp.mjs → Modal-DcNzjvnm.mjs} +2 -2
  178. package/.output/server/chunks/build/Modal-DcNzjvnm.mjs.map +1 -0
  179. package/.output/server/chunks/build/{NavbarActions-_YjrSUat.mjs → NavbarActions-VCHW0u67.mjs} +2 -2
  180. package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +1 -0
  181. package/.output/server/chunks/build/{NavigationMenu-RfBOyS32.mjs → NavigationMenu-DG6V0R9Y.mjs} +5 -5
  182. package/.output/server/chunks/build/NavigationMenu-DG6V0R9Y.mjs.map +1 -0
  183. package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs → OpenInIdeLink-CLj2cTkc.mjs} +6 -6
  184. package/.output/server/chunks/build/{OpenInIdeLink-Jp6SzEtD.mjs.map → OpenInIdeLink-CLj2cTkc.mjs.map} +1 -1
  185. package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs → ProjectTestCasesTable-BNd5Fn_G.mjs} +15 -15
  186. package/.output/server/chunks/build/{ProjectTestCasesTable-DxOTfhi4.mjs.map → ProjectTestCasesTable-BNd5Fn_G.mjs.map} +1 -1
  187. package/.output/server/chunks/build/{RovingFocusItem-BOSx1Z9Z.mjs → RovingFocusItem-DkZadRuK.mjs} +2 -2
  188. package/.output/server/chunks/build/RovingFocusItem-DkZadRuK.mjs.map +1 -0
  189. package/.output/server/chunks/build/{RunReports-nuLb-Nm3.mjs → RunReports-CnyGcU8K.mjs} +4 -4
  190. package/.output/server/chunks/build/RunReports-CnyGcU8K.mjs.map +1 -0
  191. package/.output/server/chunks/build/{RunStatusBadge-CvWmcFYM.mjs → RunStatusBadge-DTqX18X-.mjs} +3 -3
  192. package/.output/server/chunks/build/RunStatusBadge-DTqX18X-.mjs.map +1 -0
  193. package/.output/server/chunks/build/{SectionCard-DHAFvJxm.mjs → SectionCard-taTpPtua.mjs} +3 -3
  194. package/.output/server/chunks/build/SectionCard-taTpPtua.mjs.map +1 -0
  195. package/.output/server/chunks/build/{Select-CEyw7HGK.mjs → Select-BChKOOsc.mjs} +4 -4
  196. package/.output/server/chunks/build/Select-BChKOOsc.mjs.map +1 -0
  197. package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs → SelectMenu-DLkMyBsW.mjs} +5 -5
  198. package/.output/server/chunks/build/{SelectMenu-C02Hs2_F.mjs.map → SelectMenu-DLkMyBsW.mjs.map} +1 -1
  199. package/.output/server/chunks/build/{Separator-lrN70ODV.mjs → Separator-Dn-4PN3P.mjs} +2 -2
  200. package/.output/server/chunks/build/Separator-Dn-4PN3P.mjs.map +1 -0
  201. package/.output/server/chunks/build/{SettingsField-tRmytcEJ.mjs → SettingsField-BLO1C7uY.mjs} +6 -6
  202. package/.output/server/chunks/build/SettingsField-BLO1C7uY.mjs.map +1 -0
  203. package/.output/server/chunks/build/{Slideover-D6cRIqch.mjs → Slideover-BiDJaQrt.mjs} +3 -3
  204. package/.output/server/chunks/build/Slideover-BiDJaQrt.mjs.map +1 -0
  205. package/.output/server/chunks/build/{Switch-R2n82ncQ.mjs → Switch-Ca3fYrSH.mjs} +4 -4
  206. package/.output/server/chunks/build/Switch-Ca3fYrSH.mjs.map +1 -0
  207. package/.output/server/chunks/build/{Table-qZdnm9t2.mjs → Table-DQb34a0A.mjs} +3 -3
  208. package/.output/server/chunks/build/Table-DQb34a0A.mjs.map +1 -0
  209. package/.output/server/chunks/build/{Tabs-BDP7MWl4.mjs → Tabs-_ALhm_oG.mjs} +3 -3
  210. package/.output/server/chunks/build/Tabs-_ALhm_oG.mjs.map +1 -0
  211. package/.output/server/chunks/build/{TestCaseHistoryChart-CKDXQ2GI.mjs → TestCaseHistoryChart-D-TEUsZ8.mjs} +3 -3
  212. package/.output/server/chunks/build/TestCaseHistoryChart-D-TEUsZ8.mjs.map +1 -0
  213. package/.output/server/chunks/build/{TestMetaBadges-BlyKmfeP.mjs → TestMetaBadges-G2dAHnT-.mjs} +2 -2
  214. package/.output/server/chunks/build/TestMetaBadges-G2dAHnT-.mjs.map +1 -0
  215. package/.output/server/chunks/build/{TestStatusBar-CvsmKJ4D.mjs → TestStatusBar-CseETAdn.mjs} +2 -2
  216. package/.output/server/chunks/build/TestStatusBar-CseETAdn.mjs.map +1 -0
  217. package/.output/server/chunks/build/{Textarea-DpmpM-lN.mjs → Textarea-CXOoRq7y.mjs} +2 -2
  218. package/.output/server/chunks/build/Textarea-CXOoRq7y.mjs.map +1 -0
  219. package/.output/server/chunks/build/{Tooltip-BI3WQErw.mjs → Tooltip-trltUr5c.mjs} +3 -3
  220. package/.output/server/chunks/build/Tooltip-trltUr5c.mjs.map +1 -0
  221. package/.output/server/chunks/build/{VisuallyHiddenInput-D4E5aJCQ.mjs → VisuallyHiddenInput-CGURvg3N.mjs} +2 -2
  222. package/.output/server/chunks/build/VisuallyHiddenInput-CGURvg3N.mjs.map +1 -0
  223. package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs → _id_-B-G4eG5U.mjs} +40 -40
  224. package/.output/server/chunks/build/{_id_-CrGTZymJ.mjs.map → _id_-B-G4eG5U.mjs.map} +1 -1
  225. package/.output/server/chunks/build/{_id_-T965GKYC.mjs → _id_-Cnzg8n21.mjs} +41 -38
  226. package/.output/server/chunks/build/_id_-Cnzg8n21.mjs.map +1 -0
  227. package/.output/server/chunks/build/{_id_-wiULjAVc.mjs → _id_-Dp_d6gT7.mjs} +63 -55
  228. package/.output/server/chunks/build/{_id_-wiULjAVc.mjs.map → _id_-Dp_d6gT7.mjs.map} +1 -1
  229. package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs → _id_-t2AWaYuK.mjs} +59 -52
  230. package/.output/server/chunks/build/{_id_-D7UtAIPR.mjs.map → _id_-t2AWaYuK.mjs.map} +1 -1
  231. package/.output/server/chunks/build/{about-B3V_OEiu.mjs → about-BFsHkJwE.mjs} +8 -8
  232. package/.output/server/chunks/build/about-BFsHkJwE.mjs.map +1 -0
  233. package/.output/server/chunks/build/{account-DpBdYE46.mjs → account-CZAq8kVg.mjs} +8 -8
  234. package/.output/server/chunks/build/account-CZAq8kVg.mjs.map +1 -0
  235. package/.output/server/chunks/build/{ai-DYhpzbqp.mjs → ai-BGP3GcCR.mjs} +21 -21
  236. package/.output/server/chunks/build/{ai-DYhpzbqp.mjs.map → ai-BGP3GcCR.mjs.map} +1 -1
  237. package/.output/server/chunks/build/{analytics-CZJEU0an.mjs → analytics-CXl5OWV-.mjs} +25 -25
  238. package/.output/server/chunks/build/{analytics-CZJEU0an.mjs.map → analytics-CXl5OWV-.mjs.map} +1 -1
  239. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  240. package/.output/server/chunks/build/{db.client-Bdqk_eYQ.mjs → db.client-DijpEH6i.mjs} +3 -1
  241. package/.output/server/chunks/build/db.client-DijpEH6i.mjs.map +1 -0
  242. package/.output/server/chunks/build/{default-DO1izI2V.mjs → default-4ixAePum.mjs} +209 -77
  243. package/.output/server/chunks/build/default-4ixAePum.mjs.map +1 -0
  244. package/.output/server/chunks/build/{docs-C8bndVXg.mjs → docs-Cgsd01H9.mjs} +16 -16
  245. package/.output/server/chunks/build/{docs-C8bndVXg.mjs.map → docs-Cgsd01H9.mjs.map} +1 -1
  246. package/.output/server/chunks/build/{edit-BdfF9er2.mjs → edit-BEQ-ozj9.mjs} +436 -40
  247. package/.output/server/chunks/build/edit-BEQ-ozj9.mjs.map +1 -0
  248. package/.output/server/chunks/build/{fetch-tkz5_OA-.mjs → fetch-B5TVXZ1s.mjs} +3 -3
  249. package/.output/server/chunks/build/fetch-B5TVXZ1s.mjs.map +1 -0
  250. package/.output/server/chunks/build/{forgot-password-swZRcvXE.mjs → forgot-password-mqE1mpDI.mjs} +4 -4
  251. package/.output/server/chunks/build/forgot-password-mqE1mpDI.mjs.map +1 -0
  252. package/.output/server/chunks/build/{help-content-C876a9WD.mjs → help-content-Bc99BajS.mjs} +6 -1
  253. package/.output/server/chunks/build/help-content-Bc99BajS.mjs.map +1 -0
  254. package/.output/server/chunks/build/{import-B27Sv7h5.mjs → import-DqDDTcSc.mjs} +15 -15
  255. package/.output/server/chunks/build/import-DqDDTcSc.mjs.map +1 -0
  256. package/.output/server/chunks/build/{index-ID913tUa.mjs → index-Bpdj6TXV.mjs} +5 -5
  257. package/.output/server/chunks/build/index-Bpdj6TXV.mjs.map +1 -0
  258. package/.output/server/chunks/build/{index-vRwzDXLs.mjs → index-DBFsIsjA.mjs} +534 -262
  259. package/.output/server/chunks/build/index-DBFsIsjA.mjs.map +1 -0
  260. package/.output/server/chunks/build/{index-C7m32bRI.mjs → index-DSufXCZq.mjs} +22 -18
  261. package/.output/server/chunks/build/index-DSufXCZq.mjs.map +1 -0
  262. package/.output/server/chunks/build/{index-BdZmxLtC.mjs → index-WXE60AXk.mjs} +24 -24
  263. package/.output/server/chunks/build/{index-BdZmxLtC.mjs.map → index-WXE60AXk.mjs.map} +1 -1
  264. package/.output/server/chunks/build/{index-ByWTzqF6.mjs → index-okKjrRhL.mjs} +15 -4
  265. package/.output/server/chunks/build/index-okKjrRhL.mjs.map +1 -0
  266. package/.output/server/chunks/build/{isValueEqualOrExist-D4lZ8uRY.mjs → isValueEqualOrExist-C-9DzL4K.mjs} +3 -3
  267. package/.output/server/chunks/build/isValueEqualOrExist-C-9DzL4K.mjs.map +1 -0
  268. package/.output/server/chunks/build/{login-hxCF06JT.mjs → login-eQ88UoBW.mjs} +7 -7
  269. package/.output/server/chunks/build/login-eQ88UoBW.mjs.map +1 -0
  270. package/.output/server/chunks/build/{mcp-BVW1llyW.mjs → mcp-frcSP2Zg.mjs} +14 -14
  271. package/.output/server/chunks/build/mcp-frcSP2Zg.mjs.map +1 -0
  272. package/.output/server/chunks/build/{notifications-Dn-evqXM.mjs → notifications-DAtRd5V6.mjs} +14 -14
  273. package/.output/server/chunks/build/notifications-DAtRd5V6.mjs.map +1 -0
  274. package/.output/server/chunks/build/{performance-CV8qm94u.mjs → performance-BcQzGXE7.mjs} +13 -13
  275. package/.output/server/chunks/build/performance-BcQzGXE7.mjs.map +1 -0
  276. package/.output/server/chunks/build/{pr-feedback-gKDz8LyA.mjs → pr-feedback-BHtgvegy.mjs} +11 -11
  277. package/.output/server/chunks/build/pr-feedback-BHtgvegy.mjs.map +1 -0
  278. package/.output/server/chunks/build/{reset-password-DtEISa1I.mjs → reset-password-DMHrp14-.mjs} +4 -4
  279. package/.output/server/chunks/build/reset-password-DMHrp14-.mjs.map +1 -0
  280. package/.output/server/chunks/build/server.mjs +34 -34
  281. package/.output/server/chunks/build/{settings-BJDnuLpc.mjs → settings-Bo5OETop.mjs} +11 -11
  282. package/.output/server/chunks/build/settings-Bo5OETop.mjs.map +1 -0
  283. package/.output/server/chunks/build/{settings-metadata-DnAK4Rzg.mjs → settings-metadata-BHbsWQ2g.mjs} +3 -3
  284. package/.output/server/chunks/build/settings-metadata-BHbsWQ2g.mjs.map +1 -0
  285. package/.output/server/chunks/build/{setup-BO9tXa_G.mjs → setup-DAXcxuNY.mjs} +18 -18
  286. package/.output/server/chunks/build/{setup-BO9tXa_G.mjs.map → setup-DAXcxuNY.mjs.map} +1 -1
  287. package/.output/server/chunks/build/{storage-zN92cA9q.mjs → storage-BPK0fVwx.mjs} +13 -13
  288. package/.output/server/chunks/build/storage-BPK0fVwx.mjs.map +1 -0
  289. package/.output/server/chunks/build/{tags-CJFnoyQc.mjs → tags-CoxErA5m.mjs} +8 -8
  290. package/.output/server/chunks/build/tags-CoxErA5m.mjs.map +1 -0
  291. package/.output/server/chunks/build/{test-cases-0Q6rT73d.mjs → test-cases-D8rn-0le.mjs} +27 -27
  292. package/.output/server/chunks/build/test-cases-D8rn-0le.mjs.map +1 -0
  293. package/.output/server/chunks/build/{test-functions-DVRJgiWo.mjs → test-functions-pWs9mhbJ.mjs} +13 -13
  294. package/.output/server/chunks/build/test-functions-pWs9mhbJ.mjs.map +1 -0
  295. package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs → useCopyRich-BqVfhnoH.mjs} +90 -33
  296. package/.output/server/chunks/build/{useCopyRich-CZxJ7IY_.mjs.map → useCopyRich-BqVfhnoH.mjs.map} +1 -1
  297. package/.output/server/chunks/build/{useDesktopDownload-Dyf0fR47.mjs → useDesktopDownload-l80DQJ9e.mjs} +2 -2
  298. package/.output/server/chunks/build/useDesktopDownload-l80DQJ9e.mjs.map +1 -0
  299. package/.output/server/chunks/build/{useDesktopLocalRuns-k7Gw3Fv3.mjs → useDesktopLocalRuns-Dil3YzyU.mjs} +68 -6
  300. package/.output/server/chunks/build/useDesktopLocalRuns-Dil3YzyU.mjs.map +1 -0
  301. package/.output/server/chunks/build/{useDesktopProjectLink-WwLte59P.mjs → useDesktopProjectLink-BnIONB--.mjs} +21 -4
  302. package/.output/server/chunks/build/useDesktopProjectLink-BnIONB--.mjs.map +1 -0
  303. package/.output/server/chunks/build/{useFormControl-8skMOTIf.mjs → useFormControl-CXKztoWk.mjs} +2 -2
  304. package/.output/server/chunks/build/useFormControl-CXKztoWk.mjs.map +1 -0
  305. package/.output/server/chunks/build/{useOpenInIde-D74FmDNg.mjs → useOpenInIde-CbbYW3pd.mjs} +2 -2
  306. package/.output/server/chunks/build/useOpenInIde-CbbYW3pd.mjs.map +1 -0
  307. package/.output/server/chunks/build/{useSettingsNav-BLTHducV.mjs → useSettingsNav-C6NpD4Ab.mjs} +2 -2
  308. package/.output/server/chunks/build/useSettingsNav-C6NpD4Ab.mjs.map +1 -0
  309. package/.output/server/chunks/build/{users-C9bjOBde.mjs → users-C2MuCf5G.mjs} +9 -9
  310. package/.output/server/chunks/build/users-C2MuCf5G.mjs.map +1 -0
  311. package/.output/server/chunks/nitro/nitro.mjs +1032 -721
  312. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  313. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs +88 -0
  315. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs.map +1 -0
  316. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
  319. package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
  322. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
  323. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
  325. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
  326. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
  327. package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
  328. package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
  330. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
  331. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
  332. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
  333. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
  334. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -1
  335. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
  336. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
  337. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
  339. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
  341. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
  343. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
  345. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
  346. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
  347. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
  348. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
  349. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
  350. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  352. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  353. package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
  354. package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
  355. package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
  356. package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
  357. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  358. package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
  359. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  360. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  361. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  362. package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
  363. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
  364. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
  365. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
  366. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
  367. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
  368. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
  369. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs +63 -0
  370. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs.map +1 -0
  371. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
  372. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
  373. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
  374. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
  375. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
  376. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
  377. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
  378. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
  379. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
  380. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
  381. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
  382. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
  383. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
  384. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
  385. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
  386. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
  387. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +1 -1
  388. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +1 -1
  389. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +1 -1
  390. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +1 -1
  391. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
  392. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
  393. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
  394. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
  395. package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
  396. package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
  397. package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
  398. package/.output/server/chunks/routes/api/search.get.mjs +1 -1
  399. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
  400. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
  401. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
  402. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
  403. package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
  404. package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
  405. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
  406. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
  407. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
  408. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
  409. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
  410. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
  411. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
  412. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
  413. package/.output/server/chunks/routes/api/setup-status.get.mjs +1 -1
  414. package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
  416. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  417. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
  418. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  419. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
  420. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
  422. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +1 -1
  423. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +1 -1
  424. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
  425. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
  426. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
  427. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
  428. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
  429. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
  430. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
  431. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
  432. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
  433. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
  434. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
  436. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
  437. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
  438. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
  439. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
  440. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  441. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  442. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
  443. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  444. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  445. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  446. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  447. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  448. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
  449. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  450. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
  451. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
  452. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
  453. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
  454. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +1 -1
  455. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  456. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
  457. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
  458. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
  459. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
  461. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +2 -1
  463. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  465. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
  466. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
  467. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  468. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  469. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  470. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  471. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  472. package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
  473. package/.output/server/chunks/routes/api/version.get.mjs +1 -1
  474. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  475. package/.output/server/chunks/routes/renderer.mjs +1 -1
  476. package/.output/server/database/migrations/0045_productive_stingray.sql +1 -0
  477. package/.output/server/database/migrations/meta/0045_snapshot.json +3779 -0
  478. package/.output/server/database/migrations/meta/_journal.json +7 -0
  479. package/.output/server/database/migrations-pg/0046_gorgeous_hercules.sql +1 -0
  480. package/.output/server/database/migrations-pg/meta/0046_snapshot.json +4486 -0
  481. package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
  482. package/.output/server/index.mjs +1 -1
  483. package/.output/server/package.json +1 -1
  484. package/package.json +1 -1
  485. package/.output/public/_nuxt/5SkLJHl8.js +0 -1
  486. package/.output/public/_nuxt/6sA-GK37.js +0 -1
  487. package/.output/public/_nuxt/6vX5JdHr.js +0 -1
  488. package/.output/public/_nuxt/B070fjS-.js +0 -1
  489. package/.output/public/_nuxt/B0tmRAhY.js +0 -1
  490. package/.output/public/_nuxt/B3AG2m76.js +0 -1
  491. package/.output/public/_nuxt/B4mZElvM.js +0 -1
  492. package/.output/public/_nuxt/B7tiBVLW.js +0 -1
  493. package/.output/public/_nuxt/BFYkWpPx.js +0 -1
  494. package/.output/public/_nuxt/BM5BPKlc.js +0 -1
  495. package/.output/public/_nuxt/BNyTWIad.js +0 -9
  496. package/.output/public/_nuxt/BOvtXn3m.js +0 -1
  497. package/.output/public/_nuxt/BVyjw9Bi.js +0 -1
  498. package/.output/public/_nuxt/BZOykMLD.js +0 -1
  499. package/.output/public/_nuxt/BjMo2tKC.js +0 -6
  500. package/.output/public/_nuxt/BjOFxi54.js +0 -1
  501. package/.output/public/_nuxt/BjaRappk.js +0 -1
  502. package/.output/public/_nuxt/BtZNYmZO.js +0 -1
  503. package/.output/public/_nuxt/C6t4kxaa.js +0 -1
  504. package/.output/public/_nuxt/CEai-PWF.js +0 -1
  505. package/.output/public/_nuxt/CF_eDZHu.js +0 -1
  506. package/.output/public/_nuxt/CIQeRUSy.js +0 -17
  507. package/.output/public/_nuxt/CPQRQqXU.js +0 -1
  508. package/.output/public/_nuxt/CYhm2FBS.js +0 -5
  509. package/.output/public/_nuxt/CdEzDaDI.js +0 -1
  510. package/.output/public/_nuxt/CfhOanaF.js +0 -1
  511. package/.output/public/_nuxt/CvVbKrcH.js +0 -1
  512. package/.output/public/_nuxt/Cz7SCzdW.js +0 -1
  513. package/.output/public/_nuxt/D7fxV-UA.js +0 -1
  514. package/.output/public/_nuxt/D7t0Dn3h.js +0 -1
  515. package/.output/public/_nuxt/DCE2_MKD.js +0 -2
  516. package/.output/public/_nuxt/DFfqRQxk.js +0 -1
  517. package/.output/public/_nuxt/DNqm5cWU.js +0 -1
  518. package/.output/public/_nuxt/DTrPCv7R.js +0 -1
  519. package/.output/public/_nuxt/DYjxDsYC.js +0 -1
  520. package/.output/public/_nuxt/Dbf8eT28.js +0 -1
  521. package/.output/public/_nuxt/DeewM3Wg.js +0 -2
  522. package/.output/public/_nuxt/DiWxW-w3.js +0 -2
  523. package/.output/public/_nuxt/DmqCquDx.js +0 -1
  524. package/.output/public/_nuxt/DnxrNGE_.js +0 -1
  525. package/.output/public/_nuxt/DprkT7rM.js +0 -1
  526. package/.output/public/_nuxt/DuBtaw3j.js +0 -1
  527. package/.output/public/_nuxt/DylyATWU.js +0 -2
  528. package/.output/public/_nuxt/HIGGZ_c-.js +0 -1
  529. package/.output/public/_nuxt/RkNtgoTD.js +0 -1
  530. package/.output/public/_nuxt/Wk7ZKG4B.js +0 -1
  531. package/.output/public/_nuxt/Ya8ZzWuY.js +0 -1
  532. package/.output/public/_nuxt/a8Z6VC7V.js +0 -2
  533. package/.output/public/_nuxt/builds/meta/6d1766a0-0aba-46b8-9d97-7dd174130359.json +0 -1
  534. package/.output/public/_nuxt/dUPMBJ4f.js +0 -1
  535. package/.output/public/_nuxt/eT2oObCh.js +0 -1
  536. package/.output/public/_nuxt/entry.D_eWXrnD.css +0 -1
  537. package/.output/public/_nuxt/kWnH8yJq.js +0 -1
  538. package/.output/public/_nuxt/sqqg4oXL.js +0 -1
  539. package/.output/public/_nuxt/xZQGtnVA.js +0 -1
  540. package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +0 -1
  541. package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +0 -1
  542. package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +0 -1
  543. package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +0 -1
  544. package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +0 -1
  545. package/.output/server/chunks/build/ChartMarkerTooltip-u_1DUHh-.mjs.map +0 -1
  546. package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +0 -1
  547. package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +0 -1
  548. package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +0 -1
  549. package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +0 -1
  550. package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +0 -1
  551. package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +0 -1
  552. package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +0 -1
  553. package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +0 -1
  554. package/.output/server/chunks/build/DurationValue-UX9uajQJ.mjs.map +0 -1
  555. package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +0 -1
  556. package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +0 -1
  557. package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +0 -1
  558. package/.output/server/chunks/build/ErrorState-CktYyeEZ.mjs.map +0 -1
  559. package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +0 -1
  560. package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +0 -1
  561. package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +0 -1
  562. package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +0 -1
  563. package/.output/server/chunks/build/LoadingState-CwpfmI0W.mjs.map +0 -1
  564. package/.output/server/chunks/build/MarkerBadge-Biz5--h2.mjs.map +0 -1
  565. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +0 -1
  566. package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +0 -1
  567. package/.output/server/chunks/build/NavbarActions-_YjrSUat.mjs.map +0 -1
  568. package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +0 -1
  569. package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +0 -1
  570. package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs.map +0 -1
  571. package/.output/server/chunks/build/RunStatusBadge-CvWmcFYM.mjs.map +0 -1
  572. package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +0 -1
  573. package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +0 -1
  574. package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +0 -1
  575. package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +0 -1
  576. package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +0 -1
  577. package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +0 -1
  578. package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +0 -1
  579. package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +0 -1
  580. package/.output/server/chunks/build/TestCaseHistoryChart-CKDXQ2GI.mjs.map +0 -1
  581. package/.output/server/chunks/build/TestMetaBadges-BlyKmfeP.mjs.map +0 -1
  582. package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +0 -1
  583. package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +0 -1
  584. package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +0 -1
  585. package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +0 -1
  586. package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +0 -1
  587. package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +0 -1
  588. package/.output/server/chunks/build/account-DpBdYE46.mjs.map +0 -1
  589. package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +0 -1
  590. package/.output/server/chunks/build/default-DO1izI2V.mjs.map +0 -1
  591. package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +0 -1
  592. package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +0 -1
  593. package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +0 -1
  594. package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +0 -1
  595. package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +0 -1
  596. package/.output/server/chunks/build/index-ByWTzqF6.mjs.map +0 -1
  597. package/.output/server/chunks/build/index-C7m32bRI.mjs.map +0 -1
  598. package/.output/server/chunks/build/index-ID913tUa.mjs.map +0 -1
  599. package/.output/server/chunks/build/index-vRwzDXLs.mjs.map +0 -1
  600. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +0 -1
  601. package/.output/server/chunks/build/login-hxCF06JT.mjs.map +0 -1
  602. package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +0 -1
  603. package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +0 -1
  604. package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +0 -1
  605. package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +0 -1
  606. package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +0 -1
  607. package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +0 -1
  608. package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs.map +0 -1
  609. package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +0 -1
  610. package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +0 -1
  611. package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +0 -1
  612. package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +0 -1
  613. package/.output/server/chunks/build/useDesktopDownload-Dyf0fR47.mjs.map +0 -1
  614. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +0 -1
  615. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +0 -1
  616. package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +0 -1
  617. package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +0 -1
  618. package/.output/server/chunks/build/useSettingsNav-BLTHducV.mjs.map +0 -1
  619. package/.output/server/chunks/build/users-C9bjOBde.mjs.map +0 -1
@@ -0,0 +1,17 @@
1
+ import{q as ie,a as H,C as ye,an as he,r as x,v as Q,ao as be,N as Ve,d as _e,b as e,o as m,c as h,h as u,_ as Ce,k,g as a,t as $,f as B,j as ke,F as K,z as oe,i as J,l as T,B as qe,e as G,x as He,H as We,L as Ye}from"./BzBaMPgu.js";import{_ as Xe}from"./qeqzb80l.js";import{i as Ge,g as Ke,f as Qe,d as Je,e as Ze,h as et}from"./RSS6R9Te.js";import{_ as tt}from"./Die1200X.js";import{f as we,n as st}from"./CdM2qNYM.js";import{_ as nt}from"./Db5xe__T.js";import{f as at}from"./D-c8ZSws.js";import{u as ot}from"./zAFiz2Mg.js";import{u as it}from"./DWl73MJR.js";const rt=globalThis.setInterval,re=Symbol("cluster-diagnosis");function lt(g){const b=ie(),o=x(""),r=x(""),C=x([]),S=x([]),_=Q(()=>!!r.value),R=x(null),P=x([]),E=x(0),U=x(0),O=x(null),l=x(null),p=x(!1),s=x(null),i=x(!1);let c=null,f=null,d=!0;function z(){const n={};return o.value.trim()&&(n.baseCommit=o.value.trim()),C.value.length&&(n.selectedCommitShas=C.value),n}async function D(){p.value=!0;try{const n=await $fetch(`/api/failure-clusters/${g}/context`,{query:{...z(),format:"json"}});R.value=n.text,P.value=n.sections,E.value=n.tokenEstimate,U.value=n.imageTokenEstimate??0,O.value=n.coverage,l.value=n.scmChanges??null}catch{R.value="(failed to load context)",P.value=[],E.value=0,U.value=0,O.value=null,l.value=null}finally{p.value=!1}}async function I(n){try{await $fetch(`/api/failure-clusters/${g}/base-commit`,{method:"PATCH",body:{commit:n||null}}),r.value=n}catch{}}function L(){c&&(clearInterval(c),c=null)}function j(){if(c)return;let n=0;c=rt(async()=>{n+=3e3,await q(),(!s.value||s.value.status!=="running"||n>=12e4)&&L()},3e3)}async function q(){try{const n=await $fetch(`/api/failure-clusters/${g}/diagnosis`);s.value=n.diagnosis}catch{}}async function W(n={}){i.value=!0;try{const w=n.force?`/api/failure-clusters/${g}/diagnose?force=true`:`/api/failure-clusters/${g}/diagnose`,F={};n.additionalContext&&(F.additionalContext=n.additionalContext),o.value.trim()&&(F.baseCommit=o.value.trim()),C.value.length&&(F.selectedCommitShas=C.value),n.images?.length&&(F.images=n.images),s.value=await $fetch(w,{method:"POST",body:Object.keys(F).length?F:void 0}),s.value?.status==="running"&&j()}catch(w){w?.statusCode===409?j():b.add({title:"Diagnosis failed",description:String(w?.message??w),color:"error"})}finally{i.value=!1}}return H(o,n=>{d||(f&&clearTimeout(f),f=setTimeout(()=>D(),900),n!==r.value&&I(n))}),H(C,()=>{d||D()},{deep:!0}),H(s,n=>{n?.status==="running"?j():L()}),ye(async()=>{try{const n=await $fetch(`/api/failure-clusters/${g}/diagnosis`);s.value=n.diagnosis,n.manualBaseCommit&&(r.value=n.manualBaseCommit,o.value=n.manualBaseCommit);const w=n.diagnosis?.details;w?.selectedCommitShas&&Array.isArray(w.selectedCommitShas)&&(C.value=w.selectedCommitShas),w?.autoSelectedCommits&&Array.isArray(w.autoSelectedCommits)&&(S.value=w.autoSelectedCommits)}catch{}d=!1,D(),s.value?.status==="running"&&j()}),he(()=>{L(),f&&clearTimeout(f)}),{clusterId:g,baseCommit:o,savedBaseCommit:r,selectedCommitShas:C,autoSelectedCommits:S,baseCommitIsPinned:_,contextText:R,contextSections:P,tokenEstimate:E,imageTokenEstimate:U,coverage:O,scmChanges:l,contextLoading:p,refreshContext:D,diagnosis:s,posting:i,runDiagnosis:W}}function ct(g){const b=lt(g);return Ve(re,b),b}function zs(){const g=be(re);if(!g)throw new Error("useClusterDiagnosis() must be used under a page that called provideClusterDiagnosis()");return g}function ut(g){const b=be(re,null);if(b)return b;if(g==null)throw new Error("useOrProvideClusterDiagnosis() requires a clusterId when used outside provideClusterDiagnosis()");return ct(g)}const dt={key:0,class:"flex items-center gap-1.5 text-xs text-gray-400 py-1"},ft={key:1,class:"space-y-1.5"},mt={class:"flex items-center justify-between"},gt={class:"text-xs font-medium text-gray-500"},pt={class:"text-gray-400 font-normal"},vt={class:"flex gap-0.5"},xt={class:"grid grid-cols-4 gap-1.5"},yt=["onClick"],ht={class:"relative"},bt=["src","alt"],_t={class:"absolute top-0.5 right-0.5"},Ct={class:"px-1 py-0.5 bg-elevated space-y-0.5"},kt=["title"],wt={class:"flex items-center gap-1 flex-wrap"},St={key:0,class:"text-[8px] text-gray-400 leading-tight"},Tt={key:1,class:"text-[8px] text-gray-400 leading-tight truncate"},$t={key:2,class:"text-[8px] text-gray-400 leading-tight ml-auto"},xe=8,Dt=_e({__name:"DiagnosisScreenshots",props:{affectedTestCases:{}},emits:["update:images"],setup(g,{emit:b}){const o=g,r=b,C=qe();async function S(s){const i=(s.type||"image/webp").split(";")[0].trim();return new Promise((c,f)=>{const d=new FileReader;d.onload=()=>{const z=d.result.split(",")[1];z!=null?c({data:z,mediaType:i}):f(new Error("Failed to read blob"))},d.onerror=f,d.readAsDataURL(s)})}const _=x([]),R=x(!1);async function P(){if(!o.affectedTestCases.length)return;R.value=!0,_.value=[];const s=[];for(const i of o.affectedTestCases){if(s.length>=xe)break;try{const c=await $fetch(`/api/test-run-cases/${i.recentTestRunsCaseId}`);for(const f of c.attachments??[]){if(!Ge(f.path,f.contentType))continue;if(s.length>=xe)break;const d=f.name||f.path.split("/").pop()||"screenshot",z=st(f.path,f.contentType,C.app?.baseURL,!0);try{const D=await fetch(z);if(!D.ok)continue;const I=await D.blob(),{data:L,mediaType:j}=await S(I);s.push({src:`data:${j};base64,${L}`,data:L,mediaType:j,name:d,selected:!0,caseTitle:i.title,status:c.status,retries:c.retries,browser:c.browser,startTime:c.testRun?.startTime??null})}catch{}}}catch{}}_.value=s,R.value=!1,E()}function E(){r("update:images",_.value.filter(s=>s.selected).map(({name:s,mediaType:i,data:c})=>({name:s,mediaType:i,data:c})))}function U(s){_.value[s].selected=!_.value[s].selected,E()}function O(){_.value.forEach(s=>s.selected=!0),E()}function l(){_.value.forEach(s=>s.selected=!1),E()}const p=Q(()=>_.value.filter(s=>s.selected).length);return ye(P),(s,i)=>{const c=Ce,f=ke;return e(R)?(m(),h("div",dt,[u(c,{name:"i-lucide-loader-2",class:"size-3 animate-spin"}),i[0]||(i[0]=k(" Loading screenshots from test evidence… ",-1))])):e(_).length?(m(),h("div",ft,[a("div",mt,[a("span",gt,[i[1]||(i[1]=k(" Test screenshots ",-1)),a("span",pt,"("+$(e(p))+"/"+$(e(_).length)+" will be sent to AI)",1)]),a("div",vt,[u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:O},{default:B(()=>[...i[2]||(i[2]=[k("All",-1)])]),_:1}),u(f,{size:"xs",color:"neutral",variant:"ghost",onClick:l},{default:B(()=>[...i[3]||(i[3]=[k("None",-1)])]),_:1})])]),a("div",xt,[(m(!0),h(K,null,oe(e(_),(d,z)=>(m(),h("div",{key:z,class:J(["cursor-pointer rounded overflow-hidden border-2 transition-all",d.selected?"border-primary":"border-default opacity-50"]),onClick:D=>U(z)},[a("div",ht,[a("img",{src:d.src,alt:d.name,class:"w-full h-14 object-cover object-top"},null,8,bt),a("div",_t,[u(c,{name:d.selected?"i-lucide-check-circle-2":"i-lucide-circle",class:J(["size-3.5 drop-shadow",d.selected?"text-primary":"text-gray-300"])},null,8,["name","class"])])]),a("div",Ct,[a("p",{class:"text-[9px] text-gray-700 dark:text-gray-300 truncate font-medium leading-tight",title:d.caseTitle},$(d.caseTitle),9,kt),a("div",wt,[a("span",{class:J(["text-[8px] px-1 rounded leading-tight font-medium",d.status==="passed"?"bg-success/15 text-success":d.status==="failed"?"bg-error/15 text-error":"bg-neutral/15 text-gray-500"])},$(d.status),3),d.retries>0?(m(),h("span",St,"retry "+$(d.retries),1)):T("",!0),d.browser?(m(),h("span",Tt,$(d.browser),1)):T("",!0),d.startTime?(m(),h("span",$t,$(e(we)(d.startTime)),1)):T("",!0)])])],10,yt))),128))])])):T("",!0)}}}),At=Object.assign(Dt,{__name:"DiagnosisScreenshots"});function zt(g){const b=x(""),o=x(null),r=x("idle"),C=x(null),S=x(null);let _=null;function R(){_&&(_.abort(),_=null),r.value==="streaming"&&(r.value="cancelled")}function P(){R(),b.value="",o.value=null,r.value="idle",C.value=null,S.value=null}async function E(l={}){b.value="",o.value=null,S.value=null,C.value=null,r.value="streaming";const p=e(g);_=new AbortController;const s=new URLSearchParams;l.force&&s.set("force","true");const i=`/api/failure-clusters/${p}/diagnose/stream${s.toString()?"?"+s.toString():""}`;try{const c=await $fetch.raw(i,{method:"POST",body:{additionalContext:l.additionalContext,images:l.images,baseCommit:l.baseCommit,selectedCommitShas:l.selectedCommitShas,scope:l.scope,testRunsCaseId:l.testRunsCaseId},responseType:"stream",signal:_.signal,ignoreResponseError:!0}),f=c._data??c.body;if(!f)throw new Error("No response body from streaming endpoint");let d;if(f instanceof ReadableStream)d=f.getReader();else if(f instanceof Uint8Array||f instanceof ArrayBuffer){const L=new TextDecoder().decode(f instanceof ArrayBuffer?new Uint8Array(f):f);O(L),r.value==="streaming"&&(r.value="error",S.value="Stream ended without a result event");return}else if(typeof f?.getReader=="function")d=f.getReader();else if(f?.pipeThrough)d=f.getReader();else throw new Error("Unsupported stream response format");const z=new TextDecoder;let D="";for(;;){const{done:I,value:L}=await d.read();if(I)break;D+=z.decode(L,{stream:!0});const j=D.split(`
2
+
3
+ `);D=j.pop()||"";let q=!1;for(const W of j){const n=U(W);if(n){if(n.event==="result")C.value=n.data,r.value="complete",q=!0;else if(n.event==="thinking"){const w=n.data;b.value+=w.text}else if(n.event==="stage")o.value=n.data.stage;else if(n.event==="error"){const w=n.data;S.value=w.message,r.value="error"}}}if(q)break}if(D.trim()){const I=U(D.trim());I&&(I.event==="result"?(C.value=I.data,r.value="complete"):I.event==="error"&&(S.value=I.data.message,r.value="error"))}r.value==="streaming"&&(S.value||(r.value="complete"))}catch(c){if(c?.name==="AbortError"){r.value="cancelled";return}S.value=String(c?.message??c),r.value="error"}finally{_=null}}function U(l){if(!l.trim())return null;const p=l.split(`
4
+ `);let s="message",i="";for(const c of p)c.startsWith("event: ")?s=c.slice(7).trim():c.startsWith("data: ")?i+=c.slice(6):c.startsWith(":");if(!i)return null;try{return{event:s,data:JSON.parse(i)}}catch{return{event:s,data:i}}}function O(l){const p=l.split(`
5
+
6
+ `);for(const s of p){const i=U(s);if(i)if(i.event==="result")C.value=i.data,r.value="complete";else if(i.event==="thinking"){const c=i.data;b.value+=c.text}else i.event==="stage"?o.value=i.data.stage:i.event==="error"&&(S.value=i.data.message,r.value="error")}}return he(()=>{R()}),{thinkingText:b,stage:o,status:r,result:C,error:S,startStream:E,cancel:R,reset:P}}const Rt=200*1024,Et=5*1024*1024,It=["image/jpeg","image/png","image/gif","image/webp"];function Bt(g){return new Promise((b,o)=>{const r=new FileReader;r.onload=()=>{const C=r.result.split(",")[1];C!==void 0?b(C):o(new Error("Failed to read file"))},r.onerror=o,r.readAsDataURL(g)})}function Pt(){const g=ie(),b=x([]),o=x([]),r=x(!1);async function C(l){for(const p of Array.from(l))if(It.includes(p.type)){if(p.size>Et){g.add({title:"Image too large",description:`${p.name} exceeds 5 MB`,color:"error"});continue}const s=await Bt(p),i=`data:${p.type};base64,${s}`;o.value.push({name:p.name,mediaType:p.type,data:s,preview:i,size:p.size})}else{if(p.size>Rt){g.add({title:"File too large",description:`${p.name} exceeds 200 KB`,color:"error"});continue}const s=await p.text();b.value.push({name:p.name,content:s,size:p.size})}}function S(l){l.preventDefault(),r.value=!0}function _(l){l.currentTarget?.contains(l.relatedTarget)||(r.value=!1)}function R(l){l.preventDefault(),r.value=!1,l.dataTransfer?.files?.length&&C(l.dataTransfer.files)}function P(l){b.value.splice(l,1)}function E(l){o.value.splice(l,1)}function U(){return b.value.length?`## Attached Files
7
+
8
+ ${b.value.map(p=>`### ${p.name}
9
+ \`\`\`
10
+ ${p.content}
11
+ \`\`\``).join(`
12
+
13
+ `)}`:""}function O(){return o.value.map(l=>({name:l.name,mediaType:l.mediaType,data:l.data}))}return{files:b,images:o,dragOver:r,processFiles:C,onDragOver:S,onDragLeave:_,onDrop:R,removeFile:P,removeImage:E,filesMarkdown:U,imagesPayload:O}}const Ut={class:"space-y-4"},jt={class:"pb-2 border-b border-default"},Ft={class:"flex items-center justify-between gap-2"},Ot={class:"flex items-center gap-1.5"},Lt={class:"text-xs text-gray-400"},Nt={class:"flex items-center gap-1.5"},Mt={key:0,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-elevated/50 border border-default text-xs"},Vt={class:"text-gray-500"},qt={key:1,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-elevated/50 border border-default text-xs"},Ht={class:"flex items-center gap-1 mb-1"},Wt={key:0,class:"text-primary"},Yt={key:0},Xt={class:"flex items-center gap-2 px-3 pb-2 pt-1 border-t border-default"},Gt={key:0,class:"text-xs text-primary"},Kt={key:1,class:"text-xs text-gray-400"},Qt={key:0,class:"flex flex-wrap gap-2"},Jt={class:"max-w-40 truncate"},Zt={class:"text-gray-400"},es=["onClick"],ts={key:1,class:"flex flex-wrap gap-2"},ss=["src","alt"],ns={class:"absolute inset-0 bg-black/40 opacity-0 group-hover:opacity-100 transition-opacity rounded-lg flex items-center justify-center"},as=["onClick"],os={class:"text-xs text-gray-500 text-center mt-0.5 w-16 truncate"},is={key:3,class:"pt-1"},rs={key:4,class:"rounded-lg border border-default overflow-hidden"},ls={class:"flex items-center justify-between gap-2 px-3 py-2 bg-elevated/30 border-b border-default"},cs={class:"flex items-center gap-2 text-sm text-gray-500"},us={key:0,class:"inline-flex items-center gap-1 text-xs text-gray-400"},ds={key:1,class:"text-gray-400 italic"},fs={class:"px-3 py-1.5 border-t border-default text-xs text-gray-400 flex items-center gap-2"},ms={key:5,class:"rounded-lg border border-warning/40 bg-warning/5 p-3 space-y-2"},gs={class:"flex items-center gap-2 text-sm"},ps={class:"flex items-center gap-2 pt-1"},vs={class:"text-xs text-gray-400"},xs={key:4,class:"flex flex-col items-center justify-center p-8 text-center text-gray-400 border border-dashed border-default rounded-lg"},ys={class:"text-sm inline-flex items-center gap-1"},hs={class:"pt-1 text-center"},bs=_e({__name:"DiagnosisPanel",props:{clusterId:{},lastSeenRunId:{},affectedTestCases:{}},setup(g){const b=g,{diagnosis:o,posting:r,contextText:C,contextSections:S,tokenEstimate:_,imageTokenEstimate:R,contextLoading:P,coverage:E,baseCommit:U,selectedCommitShas:O,refreshContext:l,runDiagnosis:p}=ut(b.clusterId),{aiStatus:s}=ot();ie();const{permission:i,active:c,requestPermission:f,toggleEnabled:d}=it(),{thinkingText:z,stage:D,status:I,result:L,error:j,startStream:q,cancel:W}=zt(Q(()=>b.clusterId??0)),n=Pt(),{files:w,images:F,dragOver:le,processFiles:Se,onDragOver:ce,onDragLeave:ue,onDrop:de,removeFile:Te,removeImage:$e}=n,N=x(""),fe=x(null),me=x([]),Z=Q(()=>[...me.value,...F.value.length?n.imagesPayload():[]]),V=x(!1),Y=x(!1),se=x(null),ee=x(null);function ge(v){se.value=v,V.value=!0}const De=Q(()=>{const v=o.value?.details;if(!v)return[];const t=[];if(Array.isArray(v.evidence)&&t.push(...v.evidence),Array.isArray(v.hypotheses))for(const A of v.hypotheses)Array.isArray(A?.evidence)&&t.push(...A.evidence);return et(t)});H(z,()=>{Ye(()=>{ee.value&&(ee.value.scrollTop=ee.value.scrollHeight)})}),H(L,v=>{v&&(o.value=v)}),H(()=>o.value?.details,v=>{if(!v)return;const t=v;typeof t.additionalContext=="string"&&t.additionalContext.trim()&&!N.value&&(N.value=t.additionalContext)},{immediate:!0});function Ae(v){N.value=N.value?`${N.value}
14
+
15
+ ${v}`:v,Y.value=!0}function pe(){const v=[];N.value.trim()&&v.push(N.value.trim());const t=n.filesMarkdown();return t&&v.push(t),v.join(`
16
+
17
+ `)}async function ne(v=!1){await q({force:v,additionalContext:pe()||void 0,baseCommit:U.value.trim()||void 0,selectedCommitShas:O.value.length?[...O.value]:void 0,images:Z.value.length?Z.value:void 0})}async function ze(v=!1){await p({force:v,additionalContext:pe()||void 0,images:Z.value.length?Z.value:void 0})}function Re(){o.value=null}function ve(v){return v.status==="running"&&Date.now()-new Date(v.updatedAt).getTime()>300*1e3}function te(){return I.value==="streaming"}function Ee(){return!te()&&(!o.value||o.value.status==="failed"||ve(o.value))}function Ie(){return!te()&&o.value&&(o.value.status==="completed"||o.value.status==="failed")}return(v,t)=>{const A=Ce,ae=Xe,Be=Ke,M=ke,Pe=Je,Ue=Qe,je=tt,Fe=At,Oe=nt,Le=Ze,Ne=We;return m(),h("div",Ut,[a("div",jt,[a("div",Ft,[a("div",Ot,[u(A,{name:"i-lucide-sparkles",class:"size-4 text-primary shrink-0"}),t[17]||(t[17]=a("span",{class:"text-sm font-semibold"},"Diagnosis",-1)),u(ae,{topic:"cluster.diagnosis"}),a("span",Lt,[t[15]||(t[15]=k(" — ",-1)),u(A,{name:"i-lucide-triangle-alert",class:"size-3 shrink-0 inline"}),t[16]||(t[16]=k(" AI-generated, verify before applying ",-1))])]),a("div",Nt,[u(Be,{"context-endpoint":`/api/failure-clusters/${g.clusterId}/context`},null,8,["context-endpoint"]),u(M,{icon:e(V)?"i-lucide-eye-off":"i-lucide-eye",size:"xs",color:"neutral",variant:"outline",loading:e(P),onClick:t[0]||(t[0]=y=>V.value=!e(V))},{default:B(()=>[k($(e(V)?"Hide context":"Show context"),1)]),_:1},8,["icon","loading"]),e(o)&&e(o).status==="completed"?(m(),G(M,{key:0,icon:"i-lucide-refresh-cw",size:"xs",color:"primary",variant:"soft",loading:e(r),onClick:t[1]||(t[1]=y=>ne(!0))},{default:B(()=>[...t[18]||(t[18]=[k(" Re-diagnose ",-1)])]),_:1},8,["loading"])):T("",!0)])])]),e(i)==="granted"&&e(s)?.configured?(m(),h("div",Mt,[u(A,{name:"i-lucide-bell",class:J(["size-3.5 shrink-0",e(c)?"text-primary":"text-gray-400"])},null,8,["class"]),a("span",Vt,$(e(c)?"Diagnosis notifications on":"Diagnosis notifications off"),1),u(M,{size:"xs",color:e(c)?"neutral":"primary",variant:"outline",onClick:e(d)},{default:B(()=>[k($(e(c)?"Disable":"Enable"),1)]),_:1},8,["color","onClick"])])):e(i)==="default"&&e(s)?.configured?(m(),h("div",qt,[u(A,{name:"i-lucide-bell",class:"size-3.5 text-gray-400 shrink-0"}),t[20]||(t[20]=a("span",{class:"text-gray-500"},"Notify when diagnosis completes?",-1)),u(M,{size:"xs",color:"neutral",variant:"outline",onClick:e(f)},{default:B(()=>[...t[19]||(t[19]=[k("Enable",-1)])]),_:1},8,["onClick"])])):T("",!0),e(s)?.configured?(m(),G(Pe,{key:2,sections:e(S),"not-applicable":e(E)?.notApplicable,"token-estimate":e(_),loading:e(P),onViewSection:ge,onOpen:t[2]||(t[2]=y=>V.value=!0)},null,8,["sections","not-applicable","token-estimate","loading"])):T("",!0),u(Ue,{open:e(V),sections:e(S),"token-estimate":e(_),"image-token-estimate":e(R),loading:e(P),"focus-section":e(se),"cited-sections":e(De),"not-applicable-sections":e(E)?.notApplicable,"onUpdate:open":t[3]||(t[3]=y=>{V.value=y,y||(se.value=null)}),onRefresh:e(l)},null,8,["open","sections","token-estimate","image-token-estimate","loading","focus-section","cited-sections","not-applicable-sections","onRefresh"]),e(s)?.configured?(m(),h(K,{key:3},[a("div",null,[a("div",Ht,[a("button",{class:"flex items-center gap-1.5 text-xs font-medium text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 text-left",onClick:t[4]||(t[4]=y=>Y.value=!e(Y))},[u(A,{name:e(Y)?"i-lucide-chevron-down":"i-lucide-chevron-right",class:"size-3.5"},null,8,["name"]),t[21]||(t[21]=k(" Additional context ",-1)),e(w).length||e(F).length||e(N).trim()?(m(),h("span",Wt," ("+$(e(w).length+e(F).length+(e(N).trim()?1:0))+") ",1)):T("",!0)]),u(ae,{topic:"cluster.context-input"})]),e(Y)?(m(),h("div",Yt,[a("div",{class:J(["rounded-lg border-2 transition-colors",e(le)?"border-primary bg-primary/5 border-solid":"border-dashed border-default"]),onDragover:t[8]||(t[8]=(...y)=>e(ce)&&e(ce)(...y)),onDragleave:t[9]||(t[9]=(...y)=>e(ue)&&e(ue)(...y)),onDrop:t[10]||(t[10]=(...y)=>e(de)&&e(de)(...y))},[u(je,{modelValue:e(N),"onUpdate:modelValue":t[5]||(t[5]=y=>He(N)?N.value=y:null),placeholder:"e.g. We deployed a new auth middleware yesterday\\u2026",rows:3,class:"w-full text-sm border-0 bg-transparent focus:ring-0"},null,8,["modelValue"]),a("div",Xt,[a("input",{ref_key:"fileInputRef",ref:fe,type:"file",multiple:"",class:"hidden",accept:".txt,.log,.md,.json,.ts,.js,.py,.sql,.xml,.yaml,.yml,.html,.css,.env,image/*",onChange:t[6]||(t[6]=y=>e(Se)(y.target.files))},null,544),u(M,{icon:"i-lucide-paperclip",size:"xs",color:"neutral",variant:"ghost",onClick:t[7]||(t[7]=y=>e(fe)?.click())},{default:B(()=>[...t[22]||(t[22]=[k(" Attach files ",-1)])]),_:1}),e(le)?(m(),h("span",Gt,"Drop files here\\u2026")):(m(),h("span",Kt,"or drag & drop text files and images"))])],34)])):T("",!0)]),e(w).length?(m(),h("div",Qt,[(m(!0),h(K,null,oe(e(w),(y,X)=>(m(),h("div",{key:X,class:"flex items-center gap-1.5 bg-elevated rounded-full px-2.5 py-1 text-xs border border-default"},[u(A,{name:"i-lucide-file-text",class:"size-3 text-gray-500 shrink-0"}),a("span",Jt,$(y.name),1),a("span",Zt,$(("formatBytes"in v?v.formatBytes:e(at))(y.size)),1),a("button",{class:"text-gray-400 hover:text-error ml-0.5",onClick:Me=>e(Te)(X)},[u(A,{name:"i-lucide-x",class:"size-3"})],8,es)]))),128))])):T("",!0),e(F).length?(m(),h("div",ts,[(m(!0),h(K,null,oe(e(F),(y,X)=>(m(),h("div",{key:X,class:"relative group"},[a("img",{src:y.preview,alt:y.name,class:"h-16 w-16 object-cover rounded-lg border border-default"},null,8,ss),a("div",ns,[a("button",{class:"text-white",onClick:Me=>e($e)(X)},[u(A,{name:"i-lucide-x",class:"size-4"})],8,as)]),a("p",os,$(y.name),1)]))),128))])):T("",!0),g.affectedTestCases?.length?(m(),G(Fe,{key:2,"affected-test-cases":g.affectedTestCases,"onUpdate:images":t[11]||(t[11]=y=>me.value=y)},null,8,["affected-test-cases"])):T("",!0),Ee()?(m(),h("div",is,[u(M,{icon:"i-lucide-sparkles",size:"sm",color:"primary",variant:"solid",loading:e(r),onClick:t[12]||(t[12]=y=>ne())},{default:B(()=>[...t[23]||(t[23]=[k(" Diagnose with AI ",-1)])]),_:1},8,["loading"])])):T("",!0),te()?(m(),h("div",rs,[a("div",ls,[a("div",cs,[u(A,{name:"i-lucide-loader-2",class:"size-4 animate-spin text-primary"}),t[24]||(t[24]=a("span",null,"Analyzing failure cluster",-1)),e(D)?(m(),h("span",us,[u(A,{name:"i-lucide-workflow",class:"size-3"}),k(" "+$(e(D)==="research"?"Researching patterns":"Diagnosing root cause"),1)])):T("",!0)]),u(M,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Cancel diagnosis",onClick:e(W)},null,8,["onClick"])]),a("div",{ref_key:"thinkingContainer",ref:ee,class:"max-h-64 overflow-y-auto p-3 text-xs font-mono leading-relaxed whitespace-pre-wrap break-words text-gray-600 dark:text-gray-400 bg-elevated/10"},[e(z)?(m(),h(K,{key:0},[k($(e(z))+" ",1),t[25]||(t[25]=a("span",{class:"inline-block w-2 h-4 bg-primary/60 animate-pulse ml-0.5 align-text-bottom"},null,-1))],64)):(m(),h("span",ds,"Waiting for model response\\u2026"))],512),a("div",fs,[u(A,{name:"i-lucide-file-text",class:"size-3"}),a("span",null,$(e(z).length.toLocaleString())+" characters received",1)])])):T("",!0),e(o)?.status==="running"&&!ve(e(o))&&!te()?(m(),h("div",ms,[a("div",gs,[u(A,{name:"i-lucide-alert-triangle",class:"size-4 text-warning shrink-0"}),t[26]||(t[26]=a("span",{class:"font-medium text-warning-700 dark:text-warning-400"},"Diagnosis was interrupted",-1))]),t[29]||(t[29]=a("p",{class:"text-xs text-gray-500"}," A previous diagnosis started but never completed — the server may have restarted. You can restart it below. ",-1)),a("div",ps,[u(M,{icon:"i-lucide-refresh-cw",size:"xs",color:"warning",variant:"solid",loading:e(r),onClick:t[13]||(t[13]=y=>ne(!0))},{default:B(()=>[...t[27]||(t[27]=[k(" Restart diagnosis ",-1)])]),_:1},8,["loading"]),u(M,{size:"xs",color:"neutral",variant:"ghost",loading:e(r),onClick:Re},{default:B(()=>[...t[28]||(t[28]=[k(" Dismiss ",-1)])]),_:1},8,["loading"])]),a("p",vs,"Started "+$(e(we)(e(o).updatedAt)),1)])):T("",!0),e(j)?(m(),G(Oe,{key:6,color:"error",icon:"i-lucide-alert-circle",title:"Streaming diagnosis failed",description:e(j),class:"mt-2"},{actions:B(()=>[u(M,{size:"xs",color:"neutral",variant:"outline",onClick:t[14]||(t[14]=y=>ze(!0))},{default:B(()=>[...t[30]||(t[30]=[k(" Retry (fallback) ",-1)])]),_:1})]),_:1},8,["description"])):T("",!0),Ie()?(m(),G(Le,{key:7,diagnosis:e(o),"last-seen-run-id":g.lastSeenRunId,onViewSection:ge,onPrefillContext:Ae},null,8,["diagnosis","last-seen-run-id"])):T("",!0)],64)):(m(),h("div",xs,[u(A,{name:"i-lucide-sparkles",class:"size-8 mb-2 opacity-30"}),a("p",ys,[t[31]||(t[31]=k(" AI diagnosis is not configured ",-1)),u(ae,{topic:"cluster.ai-setup"})]),u(M,{to:"/settings/ai",size:"xs",color:"neutral",variant:"outline",class:"mt-3"},{default:B(()=>[...t[32]||(t[32]=[k(" Configure in Settings ",-1)])]),_:1}),t[33]||(t[33]=a("p",{class:"text-xs text-gray-400 mt-4 max-w-xs"},[k(" Use the "),a("strong",null,"Show context"),k(" button above to inspect the full diagnosis context and copy it for use with your own AI tool. ")],-1))])),a("div",hs,[u(Ne,{to:"/mcp",class:"inline-flex items-center gap-1 text-xs text-gray-400 hover:text-primary transition-colors"},{default:B(()=>[u(A,{name:"i-lucide-bot",class:"size-3"}),t[34]||(t[34]=k(" Query this cluster from your AI agent via the MCP server ",-1))]),_:1})])])}}}),Rs=Object.assign(bs,{__name:"DiagnosisPanel"});export{Rs as _,ct as p,zs as u};
@@ -0,0 +1 @@
1
+ import{d as T,q as N,o as i,e as C,f as c,g as f,R as A,c as u,F as I,z as F,I as y,h as s,G as B,l as w,k as V,J as P,i as M,_ as D,t as h,b,j as z,v}from"./BzBaMPgu.js";import{_ as L}from"./Bg8yOdSf.js";import{_ as O}from"./Die1200X.js";import{_ as H,a as q}from"./qeqzb80l.js";import{_ as E}from"./C7SG50jD.js";import{_ as G}from"./BUYmGTVP.js";import{F as R}from"./CdM2qNYM.js";import{a as J}from"./CDEmotIt.js";const K={key:0,class:"flex flex-wrap gap-1 py-0.5"},Q={key:1,class:"text-[var(--ui-text-muted)]"},W=T({__name:"TagsSelect",props:{modelValue:{},allTags:{}},emits:["update:modelValue","tagCreated"],setup(o,{emit:g}){const p=o,m=g,_=N();async function x(l){const t=l.trim();if(!t)return;const d=p.allTags.find(n=>n.text.toLowerCase()===t.toLowerCase());if(d){p.modelValue.some(n=>n.id===d.id)||m("update:modelValue",[...p.modelValue,d]);return}try{const n=await $fetch("/api/tags",{method:"POST",body:{text:t,color:R()}});m("tagCreated",n.tag),m("update:modelValue",[...p.modelValue,n.tag])}catch(n){const e=n&&typeof n=="object"&&"data"in n?n.data?.message:void 0;_.add({title:"Failed to create tag",description:e||"An error occurred",color:"error"})}}return(l,t)=>{const d=E,n=G;return i(),C(n,{"model-value":o.modelValue,items:o.allTags,multiple:"","create-item":"always","label-key":"text",by:"id",placeholder:"Select or create tags…",class:"w-full","onUpdate:modelValue":t[0]||(t[0]=e=>m("update:modelValue",e)),onCreate:x},{default:c(({modelValue:e})=>[e.length?(i(),u("div",K,[(i(!0),u(I,null,F(e,a=>(i(),C(d,{key:a.id,text:a.text,color:a.color},null,8,["text","color"]))),128))])):(i(),u("span",Q,"Select or create tags…"))]),"item-leading":c(({item:e})=>[f("span",{class:"inline-block size-2 rounded-full shrink-0",style:A({backgroundColor:e.color})},null,4)]),_:1},8,["model-value","items"])}}}),X=Object.assign(W,{__name:"TagsSelect"}),Y={class:"space-y-5"},Z={class:"inline-flex items-center gap-1"},ee={class:"inline-flex items-center gap-1"},te=T({__name:"ProjectFormFields",props:P({mode:{},allTags:{},hasToken:{type:Boolean,default:!1}},{name:{default:""},nameModifiers:{},label:{default:""},labelModifiers:{},description:{default:""},descriptionModifiers:{},diagnosisInstructions:{default:""},diagnosisInstructionsModifiers:{},scmToken:{default:""},scmTokenModifiers:{},tags:{default:()=>[]},tagsModifiers:{}}),emits:P(["tag-created"],["update:name","update:label","update:description","update:diagnosisInstructions","update:scmToken","update:tags"]),setup(o,{emit:g}){const p=g,m=y(o,"name"),_=y(o,"label"),x=y(o,"description"),l=y(o,"diagnosisInstructions"),t=y(o,"scmToken"),d=y(o,"tags");return(n,e)=>{const a=B,k=L,$=O,j=H,U=X;return i(),u("div",Y,[o.mode==="create"?(i(),C(k,{key:0,label:"Project name",name:"name",required:"",description:"A unique identifier used to match test results from the reporter."},{default:c(()=>[s(a,{modelValue:m.value,"onUpdate:modelValue":e[0]||(e[0]=r=>m.value=r),placeholder:"e.g. my-app",class:"w-full"},null,8,["modelValue"])]),_:1})):w("",!0),s(k,{label:"Display label",name:"label",description:"A friendly name shown in the UI (defaults to project name if not set)."},{default:c(()=>[s(a,{modelValue:_.value,"onUpdate:modelValue":e[1]||(e[1]=r=>_.value=r),placeholder:"e.g. My Application",class:"w-full"},null,8,["modelValue"])]),_:1}),s(k,{label:"Description",name:"description",description:"Optional description of this project."},{default:c(()=>[s($,{modelValue:x.value,"onUpdate:modelValue":e[2]||(e[2]=r=>x.value=r),placeholder:"Enter project description",rows:3,class:"w-full"},null,8,["modelValue"])]),_:1}),o.mode==="edit"?(i(),u(I,{key:1},[s(k,{name:"diagnosisInstructions",description:"Combined with the global instructions from Settings → AI."},{label:c(()=>[f("span",Z,[e[7]||(e[7]=V(" AI diagnosis instructions ",-1)),s(j,{topic:"project.ai-instructions"})])]),default:c(()=>[s($,{modelValue:l.value,"onUpdate:modelValue":e[3]||(e[3]=r=>l.value=r),placeholder:"e.g. This project tests the payment checkout flow. The backend uses Stripe for payments and the payment API is at /api/v2/payments. Database errors are usually caused by connection pool exhaustion under load.",rows:5,class:"w-full font-mono text-sm"},null,8,["modelValue"])]),_:1}),s(k,{name:"scmToken",description:o.hasToken?"Leave empty to keep the stored token, enter a new value to replace it, or save empty to remove it":"For GitHub, GitLab, or Bitbucket. Falls back to the global SCM token if not set."},{label:c(()=>[f("span",ee,[e[8]||(e[8]=V("SCM token ",-1)),s(j,{topic:"project.scm-token"})])]),default:c(()=>[s(a,{modelValue:t.value,"onUpdate:modelValue":e[4]||(e[4]=r=>t.value=r),type:"password",placeholder:o.hasToken?"•••••••• (unchanged)":"ghp_..., glpat-..., or bitbucket token",class:"w-full font-mono"},null,8,["modelValue","placeholder"])]),_:1},8,["description"])],64)):w("",!0),s(k,{label:"Tags",name:"tags",description:"Select existing tags or type a new name and press Enter to create one."},{default:c(()=>[s(U,{modelValue:d.value,"onUpdate:modelValue":e[5]||(e[5]=r=>d.value=r),"all-tags":o.allTags,class:"w-full",onTagCreated:e[6]||(e[6]=r=>p("tag-created"))},null,8,["modelValue","all-tags"])]),_:1})])}}}),xe=Object.assign(te,{__name:"ProjectFormFields"}),oe={class:"space-y-2"},ae={class:"space-y-1.5"},se=["title"],le={key:0,class:"flex flex-wrap items-center gap-1.5 text-xs text-muted"},ne={class:"inline-flex items-center gap-0.5"},ie={key:1,class:"flex items-center gap-1.5 text-xs text-muted"},S="npx @piwitests/reporter init",re=T({__name:"DesktopFolderChecklist",props:{inspection:{}},setup(o){const g=o,{copy:p}=J(),m=v(()=>{const l=g.inspection;return[l.playwrightConfig?{ok:!0,label:"Playwright config found",detail:l.playwrightConfig}:{ok:!1,label:"No Playwright config at the folder root"},l.playwrightInstalled?{ok:!0,label:"Playwright is installed"}:{ok:!1,label:"Playwright is not installed",detail:"run your package manager’s install first"},l.reporterInstalled?{ok:!0,label:"Piwi reporter is installed",detail:"@piwitests/reporter"}:{ok:!1,label:"Piwi reporter is not installed"},l.reporterConfigured?{ok:!0,label:"Config sends results to Piwi",detail:l.configuredProjectName?`projectName: ${l.configuredProjectName}`:void 0}:{ok:!1,label:"Config does not use the Piwi reporter"}]}),_=v(()=>m.value.every(l=>l.ok)),x=v(()=>!g.inspection.reporterInstalled||!g.inspection.reporterConfigured);return(l,t)=>{const d=D,n=z,e=q;return i(),u("div",oe,[f("ul",ae,[(i(!0),u(I,null,F(b(m),a=>(i(),u("li",{key:a.label,class:"flex items-center gap-2 text-sm"},[s(d,{name:a.ok?"i-lucide-circle-check-big":"i-lucide-triangle-alert",class:M(["size-4 shrink-0",a.ok?"text-success":"text-warning"])},null,8,["name","class"]),f("span",{class:M(a.ok?"":"text-warning")},h(a.label),3),a.detail?(i(),u("span",{key:0,class:"text-xs text-muted truncate",title:a.detail},h(a.detail),9,se)):w("",!0)]))),128))]),b(x)?(i(),u("p",le,[t[2]||(t[2]=f("span",null,"Set it up from a terminal in that folder:",-1)),f("span",ne,[f("code",{class:"px-1.5 py-0.5 rounded bg-elevated font-mono"},h(S)),s(n,{icon:"i-lucide-copy",color:"neutral",variant:"ghost",size:"xs","aria-label":"Copy setup command",onClick:t[0]||(t[0]=a=>b(p)(S,{toast:!0}))})]),s(e,{to:"reporter",class:"text-xs"},{default:c(()=>[...t[1]||(t[1]=[V("Reporter docs",-1)])]),_:1})])):b(_)?(i(),u("p",ie,[s(d,{name:"i-lucide-sparkles",class:"size-3.5 text-success"}),t[3]||(t[3]=V(" Runs from this folder will report to Piwi. ",-1))])):w("",!0)])}}}),ke=Object.assign(re,{__name:"DesktopFolderChecklist"});export{ke as _,xe as a};
@@ -0,0 +1 @@
1
+ import{_ as f}from"./D5Mhpp98.js";import{_ as b}from"./Ds8_6Fzl.js";import{_ as h}from"./BC5bqlfM.js";import{_ as j,a as v}from"./CdLqOMvN.js";import{_ as x}from"./knaDbxMJ.js";import{d as $,u as w,w as y,s as C,e as P,f as a,v as B,o as N,g,h as e,b as o,r as k}from"./BzBaMPgu.js";import{u as D}from"./CDEmotIt.js";import"./DWz_bHNP.js";import"./CnRNwiuE.js";import"./DDho3MJD.js";import"./Bw4oIhct.js";import"./Hp-_W7z4.js";import"./DUtYU4Sb.js";import"./B77w1Eib.js";import"./Db5xe__T.js";import"./CVEk4D8I.js";import"./BSKLNgre.js";import"./Ch8sGLqE.js";import"./CdM2qNYM.js";import"./BraJd4EA.js";import"./BMfTUMYy.js";import"./BTCWUyBX.js";import"./7vRR5W2L.js";import"./vOZZ2cLi.js";import"./CBQXv4bU.js";import"./BOrnSpTA.js";import"./D_j436ND.js";import"./qeqzb80l.js";import"./BcHU1KNK.js";import"./kDEwM7SQ.js";import"./DkGXOZRW.js";const R={class:"p-4"},lo=$({__name:"test-cases",async setup(T){let r,n;const i=w(),s=String(i.params.id),{data:t}=([r,n]=y(()=>D(`/api/projects/${s}`,"$GBv2haQFFX")),r=await r,n(),r),c=k(null);return C(B(()=>({title:`${t.value?.label||t.value?.name||"Project"} — Test cases — Piwi Dashboard`}))),(F,U)=>{const m=f,p=b,_=h,l=v,u=x,d=j;return N(),P(d,{id:"project-test-cases"},{header:a(()=>[e(l,null,{leading:a(()=>[e(m),e(p,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(t)?.label||o(t)?.name||"Project",to:`/projects/${o(s)}`},{label:"Test cases"}]},null,8,["items"])]),right:a(()=>[e(_,{actions:[{label:"Refresh",icon:"i-lucide-refresh-cw",onClick:()=>o(c)?.refresh()}]},null,8,["actions"])]),_:1})]),body:a(()=>[g("div",R,[e(u,{ref_key:"tableRef",ref:c,"project-id":o(s),"project-name":o(t)?.name,"sync-query":""},null,8,["project-id","project-name"])])]),_:1})}}});export{lo as default};
@@ -0,0 +1 @@
1
+ import{a3 as S,a6 as V,ba as P,a4 as A,a5 as B,r as O,o as r,e as v,W as b,b as a,j,v as q,a8 as w,a2 as F,f as k,g as L,i as u,c as f,F as C,z as N,h as y,y as D,bb as K,bc as T,V as d,_ as $,aJ as U,l as m,aI as I,k as E,t as J,X as R}from"./BzBaMPgu.js";import{a as W}from"./DWz_bHNP.js";const X={base:"hidden lg:flex",variants:{side:{left:"",right:""}}},Q={__name:"UDashboardSidebarCollapse",props:{color:{type:null,required:!1,default:"neutral"},variant:{type:null,required:!1,default:"ghost"},side:{type:String,required:!1,default:"left"},ui:{type:Object,required:!1},label:{type:String,required:!1},activeColor:{type:null,required:!1},activeVariant:{type:null,required:!1},size:{type:null,required:!1},square:{type:Boolean,required:!1},block:{type:Boolean,required:!1},loadingAuto:{type:Boolean,required:!1},onClick:{type:[Function,Array],required:!1},class:{type:null,required:!1},icon:{type:null,required:!1},avatar:{type:Object,required:!1},leading:{type:Boolean,required:!1},leadingIcon:{type:null,required:!1},trailing:{type:Boolean,required:!1},trailingIcon:{type:null,required:!1},loading:{type:Boolean,required:!1},loadingIcon:{type:null,required:!1},as:{type:null,required:!1},type:{type:null,required:!1},disabled:{type:Boolean,required:!1},exactActiveClass:{type:String,required:!1},viewTransition:{type:Boolean,required:!1}},setup(g){const i=S("dashboardSidebarCollapse",g),l=V(P(i,"icon","side","class")),{t:p}=A(),o=B(),{sidebarCollapsed:c,collapseSidebar:s}=W({sidebarCollapsed:O(!1),collapseSidebar:()=>{}}),n=q(()=>w({extend:X,...o.ui?.dashboardSidebarCollapse||{}}));return(_,e)=>(r(),v(j,b({...a(l),icon:a(i).icon||(a(c)?a(o).ui.icons.panelOpen:a(o).ui.icons.panelClose),"aria-label":a(c)?a(p)("dashboardSidebarCollapse.expand"):a(p)("dashboardSidebarCollapse.collapse"),..._.$attrs},{class:n.value({class:[a(i).ui?.base,a(i).class],side:a(i).side}),onClick:e[0]||(e[0]=t=>a(s)?.(!a(c)))}),null,16,["class"]))}},G={slots:{root:"relative min-w-0",list:"flex items-center gap-1.5",item:"flex min-w-0",link:"group relative flex items-center gap-1.5 text-sm min-w-0 rounded-md",linkLeadingIcon:"shrink-0 size-5",linkLeadingAvatar:"shrink-0",linkLeadingAvatarSize:"2xs",linkLabel:"truncate",separator:"flex",separatorIcon:"shrink-0 size-5 text-muted"},variants:{active:{true:{link:"font-semibold"},false:{link:"text-muted font-medium"}},disabled:{true:{link:"cursor-not-allowed opacity-75"}},to:{true:""},color:{primary:{link:"outline-primary/25 focus-visible:outline-3"},secondary:{link:"outline-secondary/25 focus-visible:outline-3"},success:{link:"outline-success/25 focus-visible:outline-3"},info:{link:"outline-info/25 focus-visible:outline-3"},warning:{link:"outline-warning/25 focus-visible:outline-3"},error:{link:"outline-error/25 focus-visible:outline-3"},neutral:{link:"outline-inverted/25 focus-visible:outline-3"}}},compoundVariants:[{disabled:!1,active:!1,to:!0,class:{link:["hover:text-default","transition-colors"]}},{color:"primary",active:!0,class:{link:"text-primary"}},{color:"secondary",active:!0,class:{link:"text-secondary"}},{color:"success",active:!0,class:{link:"text-success"}},{color:"info",active:!0,class:{link:"text-info"}},{color:"warning",active:!0,class:{link:"text-warning"}},{color:"error",active:!0,class:{link:"text-error"}},{color:"neutral",active:!0,class:{link:"text-highlighted"}}],defaultVariants:{color:"primary"}},Y={__name:"UBreadcrumb",props:{as:{type:null,required:!1,default:"nav"},items:{type:Array,required:!1},separatorIcon:{type:null,required:!1},color:{type:null,required:!1},labelKey:{type:null,required:!1,default:"label"},class:{type:null,required:!1},ui:{type:Object,required:!1}},setup(g){const h=g,i=F(),l=S("breadcrumb",h),{dir:p}=A(),o=B(),c=q(()=>l.separatorIcon||(p.value==="rtl"?o.ui.icons.chevronLeft:o.ui.icons.chevronRight)),s=q(()=>w({extend:G,...o.ui?.breadcrumb||{}})({color:l.color}));return(n,_)=>(r(),v(a(R),{as:a(l).as,"aria-label":"breadcrumb","data-slot":"root",class:u(s.value.root({class:[a(l).ui?.root,a(l).class]}))},{default:k(()=>[L("ol",{"data-slot":"list",class:u(s.value.list({class:a(l).ui?.list}))},[(r(!0),f(C,null,N(a(l).items,(e,t)=>(r(),f(C,{key:t},[L("li",{"data-slot":"item",class:u(s.value.item({class:[a(l).ui?.item,e.ui?.item]}))},[y(D,b({ref_for:!0},a(K)(e),{custom:""}),{default:k(({active:x,...z})=>[y(T,b({ref_for:!0},z,{as:"span","aria-current":(e.active??x)&&t===a(l).items.length-1?"page":void 0,"data-slot":"link",class:s.value.link({class:[a(l).ui?.link,e.ui?.link,e.class],active:e.active??t===a(l).items.length-1,disabled:!!e.disabled,to:!!e.to})}),{default:k(()=>[d(n.$slots,e.slot||"item",{item:e,active:e.active??t===a(l).items.length-1,index:t,ui:s.value},()=>[d(n.$slots,e.slot?`${e.slot}-leading`:"item-leading",{item:e,active:e.active??t===a(l).items.length-1,index:t,ui:s.value},()=>[e.icon?(r(),v($,{key:0,name:e.icon,"data-slot":"linkLeadingIcon",class:u(s.value.linkLeadingIcon({class:[a(l).ui?.linkLeadingIcon,e.ui?.linkLeadingIcon],active:e.active??t===a(l).items.length-1}))},null,8,["name","class"])):e.avatar?(r(),v(U,b({key:1,size:a(l).ui?.linkLeadingAvatarSize||s.value.linkLeadingAvatarSize()},{ref_for:!0},e.avatar,{"data-slot":"linkLeadingAvatar",class:s.value.linkLeadingAvatar({class:[a(l).ui?.linkLeadingAvatar,e.ui?.linkLeadingAvatar],active:e.active??t===a(l).items.length-1})}),null,16,["size","class"])):m("",!0)]),a(I)(e,a(l).labelKey)||i[e.slot?`${e.slot}-label`:"item-label"]?(r(),f("span",{key:0,"data-slot":"linkLabel",class:u(s.value.linkLabel({class:[a(l).ui?.linkLabel,e.ui?.linkLabel]}))},[d(n.$slots,e.slot?`${e.slot}-label`:"item-label",{item:e,active:e.active??t===a(l).items.length-1,index:t},()=>[E(J(a(I)(e,a(l).labelKey)),1)])],2)):m("",!0),d(n.$slots,e.slot?`${e.slot}-trailing`:"item-trailing",{item:e,active:e.active??t===a(l).items.length-1,index:t})])]),_:2},1040,["aria-current","class"])]),_:2},1040)],2),t<a(l).items.length-1?(r(),f("li",{key:0,role:"presentation","aria-hidden":"true","data-slot":"separator",class:u(s.value.separator({class:[a(l).ui?.separator,e.ui?.separator]}))},[d(n.$slots,"separator",{ui:s.value},()=>[y($,{name:c.value,"data-slot":"separatorIcon",class:u(s.value.separatorIcon({class:[a(l).ui?.separatorIcon,e.ui?.separatorIcon]}))},null,8,["name","class"])])],2)):m("",!0)],64))),128))],2)]),_:3},8,["as","class"]))}};export{Q as _,Y as a};
@@ -1,4 +1,4 @@
1
- import{d as F,B as W,o,f as u,g as n,i as e,c,F as E,y as N,k as a,q as C,p as O,t as y,v as m,s as R,m as s,_ as V,j as i,r as I,h as g,A as G}from"./CNu3kken.js";import{a as T,d as K,_ as L}from"./CfhOanaF.js";import{_ as Y}from"./DJzFYrBt.js";import{_ as q}from"./B_JSV0yG.js";import{u as H}from"./DFfqRQxk.js";const M={class:"flex items-center gap-3"},J={class:"p-2 bg-primary/10 rounded-lg shrink-0"},Q={class:"text-xl font-semibold inline-flex items-center gap-1"},X={class:"text-sm text-gray-500 dark:text-gray-400"},Z={class:"flex flex-col items-center shrink-0"},tt={key:1},et={key:0,class:"w-px flex-1 mt-2 min-h-6 bg-gray-200 dark:bg-gray-700"},st={class:"flex-1 pb-6"},rt={class:"flex items-center gap-2 mb-1"},ot={class:"font-medium"},it={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},nt={class:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-2"},at={key:0,class:"mt-4 space-y-6"},lt={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},dt={class:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400"},pt=`// tests/fixtures.ts
1
+ import{d as F,C as W,o,e as u,f as n,g as e,c,F as E,z as N,b as a,i as C,_ as O,t as y,l as m,m as R,k as s,j as V,h as i,r as I,v as g,B as G}from"./BzBaMPgu.js";import{a as T,d as K,_ as L}from"./qeqzb80l.js";import{_ as Y}from"./Cmuwgbf4.js";import{_ as H}from"./kDEwM7SQ.js";import{u as q}from"./E26Y1NWH.js";const M={class:"flex items-center gap-3"},J={class:"p-2 bg-primary/10 rounded-lg shrink-0"},Q={class:"text-xl font-semibold inline-flex items-center gap-1"},X={class:"text-sm text-gray-500 dark:text-gray-400"},Z={class:"flex flex-col items-center shrink-0"},tt={key:1},et={key:0,class:"w-px flex-1 mt-2 min-h-6 bg-gray-200 dark:bg-gray-700"},st={class:"flex-1 pb-6"},rt={class:"flex items-center gap-2 mb-1"},ot={class:"font-medium"},it={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},nt={class:"border-t border-gray-200 dark:border-gray-700 pt-4 mt-2"},at={key:0,class:"mt-4 space-y-6"},lt={class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},dt={class:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400"},pt=`// tests/fixtures.ts
2
2
  import { test as base, expect } from '@playwright/test'
3
3
  import { piwiFixtures } from '@piwitests/reporter'
4
4
 
@@ -15,8 +15,8 @@ import { test as base } from '@playwright/test'
15
15
  import { extendPiwiFixtures } from '@piwitests/reporter'
16
16
 
17
17
  export const test = extendPiwiFixtures(base)
18
- export { expect } from '@playwright/test'`,mt=F({__name:"GetStartedWizard",setup(gt){const P=G(),h=g(()=>!!P.public.authEnabled),b=H(),_=I("http://localhost:3000");W(()=>{_.value=window.location.origin});function k(d){const t=["projectName: 'my-project',"];return b||(t.unshift(`serverUrl: '${_.value}',`),h.value&&t.push("apiKey: process.env.PIWI_API_KEY,")),t.map(l=>`${d}${l}`).join(`
19
- `)}const A=g(()=>`import { defineConfig } from '@playwright/test'
18
+ export { expect } from '@playwright/test'`,mt=F({__name:"GetStartedWizard",setup(gt){const P=G(),h=g(()=>!!P.public.authEnabled),b=q(),_=I("http://localhost:3000");W(()=>{_.value=window.location.origin});function k(d){const t=["projectName: 'my-project',"];return b||(t.unshift(`serverUrl: '${_.value}',`),h.value&&t.push("apiKey: process.env.PIWI_API_KEY,")),t.map(l=>`${d}${l}`).join(`
19
+ `)}const z=g(()=>`import { defineConfig } from '@playwright/test'
20
20
 
21
21
  export default defineConfig({
22
22
  reporter: [
@@ -28,7 +28,7 @@ ${k(" ")}
28
28
  use: {
29
29
  trace: 'retain-on-failure',
30
30
  },
31
- })`),z=g(()=>`import { defineConfig } from '@playwright/test'
31
+ })`),A=g(()=>`import { defineConfig } from '@playwright/test'
32
32
  import PiwiDashboard from '@piwitests/reporter'
33
33
 
34
34
  export default PiwiDashboard.wrapConfig(
@@ -41,4 +41,4 @@ export default PiwiDashboard.wrapConfig(
41
41
  {
42
42
  ${k(" ")}
43
43
  },
44
- )`),x=g(()=>{const d=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return h.value&&d.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),d.push({title:"Configure Playwright",description:b?"Add the reporter to your playwright.config.ts. While this app is running it needs no URL or token — the reporter finds it automatically.":"Add the reporter to your playwright.config.ts.",code:A.value,lang:"typescript"},{title:"Run your tests",description:"Results appear in the dashboard automatically. The project is created on first submit.",code:"npx playwright test",lang:"bash"}),d.map((t,l)=>({id:l+1,...t}))}),S=["zero","one","two","three","four","five","six"],j=g(()=>S[x.value.length]??String(x.value.length)),f=I(!1);return(d,t)=>{const l=O,U=L,$=R,w=V,p=Y,v=T,B=q;return o(),u(B,null,{header:n(()=>[e("div",M,[e("div",J,[i(l,{name:"i-lucide-rocket",class:"size-5 text-primary"})]),e("div",null,[e("h2",Q,[t[1]||(t[1]=s(" Get started in 60 seconds ",-1)),i(U,{topic:"home.get-started"})]),e("p",X,"Send your first test run in "+y(a(j))+" steps",1)])])]),footer:n(()=>[e("div",dt,[e("span",null,[t[18]||(t[18]=s("Need more options? See the ",-1)),i(v,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[17]||(t[17]=[s("full reporter docs",-1)])]),_:1}),t[19]||(t[19]=s(".",-1))]),i(w,{to:a(K)("demo/"),target:"_blank",variant:"ghost",size:"sm",color:"neutral","trailing-icon":"i-lucide-external-link"},{default:n(()=>[...t[20]||(t[20]=[s(" View demo with sample data ",-1)])]),_:1},8,["to"])])]),default:n(()=>[e("div",null,[(o(!0),c(E,null,N(a(x),(r,D)=>(o(),c("div",{key:r.id,class:"flex gap-4"},[e("div",Z,[e("div",{class:C(["flex size-8 items-center justify-center rounded-full text-sm font-semibold",r.done?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-primary/10 text-primary"])},[r.done?(o(),u(l,{key:0,name:"i-lucide-check",class:"size-4"})):(o(),c("span",tt,y(r.id),1))],2),D<a(x).length-1?(o(),c("div",et)):m("",!0)]),e("div",st,[e("div",rt,[e("h3",ot,y(r.title),1),r.done?(o(),u($,{key:0,color:"success",variant:"subtle",size:"xs"},{default:n(()=>[...t[2]||(t[2]=[s("Done",-1)])]),_:1})):m("",!0)]),e("p",it,y(r.description),1),r.action==="create-api-key"?(o(),u(w,{key:0,to:"/settings/users",icon:"i-lucide-key-round",size:"sm",variant:"soft"},{default:n(()=>[...t[3]||(t[3]=[s(" Create an API key ",-1)])]),_:1})):m("",!0),r.code?(o(),u(p,{key:1,code:r.code,lang:r.lang},null,8,["code","lang"])):m("",!0)])]))),128)),e("div",nt,[e("button",{class:"flex items-center gap-2 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-primary dark:hover:text-primary transition-colors w-full text-left",onClick:t[0]||(t[0]=r=>f.value=!a(f))},[i(l,{name:"i-lucide-chevron-right",class:C(["size-4 transition-transform duration-200",a(f)?"rotate-90":""])},null,8,["class"]),t[4]||(t[4]=s(" Go further — simpler config & capture fixtures ",-1))]),a(f)?(o(),c("div",at,[e("div",null,[t[5]||(t[5]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Simpler config with "),e("code",{class:"text-primary text-xs"},"wrapConfig")],-1)),t[6]||(t[6]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},[s(" Instead of manually adding the reporter array entry, "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"wrapConfig"),s(" auto-injects the reporter and chains the global setup in one call. It also registers the run on the dashboard "),e("em",null,"before"),s(" your "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"globalSetup"),s(" runs, so the dashboard shows an initializing state during setup. ")],-1)),i(p,{code:a(z),lang:"typescript"},null,8,["code"])]),e("div",null,[t[14]||(t[14]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Capture fixtures — network, Web Vitals, console & locator healing with "),e("code",{class:"text-primary text-xs"},"piwiFixtures")],-1)),e("p",lt,[t[8]||(t[8]=s(" Extend your Playwright ",-1)),t[9]||(t[9]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"test",-1)),t[10]||(t[10]=s(" with ",-1)),t[11]||(t[11]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"piwiFixtures",-1)),t[12]||(t[12]=s(" to automatically capture network timing, browser Web Vitals, console errors, ARIA snapshots on failure, and the locator snapshots that power locator healing. See the ",-1)),i(v,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[7]||(t[7]=[s("capture fixtures guide",-1)])]),_:1}),t[13]||(t[13]=s(". ",-1))]),t[15]||(t[15]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option A — extend your existing fixtures ",-1)),i(p,{code:pt,lang:"typescript",class:"mb-3"}),i(p,{code:ut,lang:"typescript",class:"mb-4"}),t[16]||(t[16]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option B — one-line extend ",-1)),i(p,{code:ct,lang:"typescript"})])])):m("",!0)])])]),_:1})}}}),_t=Object.assign(mt,{__name:"GetStartedWizard"});export{_t as _};
44
+ )`),x=g(()=>{const d=[{title:"Start the dashboard",description:"You're already here — the dashboard is running.",done:!0},{title:"Install the reporter",description:"Add the Piwi reporter to your Playwright project.",code:"npm install --save-dev @piwitests/reporter",lang:"bash"}];return h.value&&d.push({title:"Create an API key",description:"Authentication is enabled on this instance, so the reporter needs a key to submit results. Create one, then set it as PIWI_API_KEY in your CI secrets (used by the snippet below).",action:"create-api-key"}),d.push({title:"Configure Playwright",description:b?"Add the reporter to your playwright.config.ts. While this app is running it needs no URL or token — the reporter finds it automatically.":"Add the reporter to your playwright.config.ts.",code:z.value,lang:"typescript"},{title:"Run your tests",description:"Results appear in the dashboard automatically. The project is created on first submit.",code:"npx playwright test",lang:"bash"}),d.map((t,l)=>({id:l+1,...t}))}),S=["zero","one","two","three","four","five","six"],j=g(()=>S[x.value.length]??String(x.value.length)),f=I(!1);return(d,t)=>{const l=O,U=L,$=R,w=V,p=Y,v=T,B=H;return o(),u(B,null,{header:n(()=>[e("div",M,[e("div",J,[i(l,{name:"i-lucide-rocket",class:"size-5 text-primary"})]),e("div",null,[e("h2",Q,[t[1]||(t[1]=s(" Get started in 60 seconds ",-1)),i(U,{topic:"home.get-started"})]),e("p",X,"Send your first test run in "+y(a(j))+" steps",1)])])]),footer:n(()=>[e("div",dt,[e("span",null,[t[18]||(t[18]=s("Need more options? See the ",-1)),i(v,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[17]||(t[17]=[s("full reporter docs",-1)])]),_:1}),t[19]||(t[19]=s(".",-1))]),i(w,{to:a(K)("demo/"),target:"_blank",variant:"ghost",size:"sm",color:"neutral","trailing-icon":"i-lucide-external-link"},{default:n(()=>[...t[20]||(t[20]=[s(" View demo with sample data ",-1)])]),_:1},8,["to"])])]),default:n(()=>[e("div",null,[(o(!0),c(E,null,N(a(x),(r,D)=>(o(),c("div",{key:r.id,class:"flex gap-4"},[e("div",Z,[e("div",{class:C(["flex size-8 items-center justify-center rounded-full text-sm font-semibold",r.done?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":"bg-primary/10 text-primary"])},[r.done?(o(),u(l,{key:0,name:"i-lucide-check",class:"size-4"})):(o(),c("span",tt,y(r.id),1))],2),D<a(x).length-1?(o(),c("div",et)):m("",!0)]),e("div",st,[e("div",rt,[e("h3",ot,y(r.title),1),r.done?(o(),u($,{key:0,color:"success",variant:"subtle",size:"xs"},{default:n(()=>[...t[2]||(t[2]=[s("Done",-1)])]),_:1})):m("",!0)]),e("p",it,y(r.description),1),r.action==="create-api-key"?(o(),u(w,{key:0,to:"/settings/users",icon:"i-lucide-key-round",size:"sm",variant:"soft"},{default:n(()=>[...t[3]||(t[3]=[s(" Create an API key ",-1)])]),_:1})):m("",!0),r.code?(o(),u(p,{key:1,code:r.code,lang:r.lang},null,8,["code","lang"])):m("",!0)])]))),128)),e("div",nt,[e("button",{class:"flex items-center gap-2 text-sm font-medium text-gray-600 dark:text-gray-300 hover:text-primary dark:hover:text-primary transition-colors w-full text-left",onClick:t[0]||(t[0]=r=>f.value=!a(f))},[i(l,{name:"i-lucide-chevron-right",class:C(["size-4 transition-transform duration-200",a(f)?"rotate-90":""])},null,8,["class"]),t[4]||(t[4]=s(" Go further — simpler config & capture fixtures ",-1))]),a(f)?(o(),c("div",at,[e("div",null,[t[5]||(t[5]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Simpler config with "),e("code",{class:"text-primary text-xs"},"wrapConfig")],-1)),t[6]||(t[6]=e("p",{class:"text-sm text-gray-600 dark:text-gray-400 mb-3"},[s(" Instead of manually adding the reporter array entry, "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"wrapConfig"),s(" auto-injects the reporter and chains the global setup in one call. It also registers the run on the dashboard "),e("em",null,"before"),s(" your "),e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"globalSetup"),s(" runs, so the dashboard shows an initializing state during setup. ")],-1)),i(p,{code:a(A),lang:"typescript"},null,8,["code"])]),e("div",null,[t[14]||(t[14]=e("h4",{class:"font-medium text-sm mb-1"},[s(" Capture fixtures — network, Web Vitals, console & locator healing with "),e("code",{class:"text-primary text-xs"},"piwiFixtures")],-1)),e("p",lt,[t[8]||(t[8]=s(" Extend your Playwright ",-1)),t[9]||(t[9]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"test",-1)),t[10]||(t[10]=s(" with ",-1)),t[11]||(t[11]=e("code",{class:"text-xs bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded"},"piwiFixtures",-1)),t[12]||(t[12]=s(" to automatically capture network timing, browser Web Vitals, console errors, ARIA snapshots on failure, and the locator snapshots that power locator healing. See the ",-1)),i(v,{to:"capture-fixtures","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[7]||(t[7]=[s("capture fixtures guide",-1)])]),_:1}),t[13]||(t[13]=s(". ",-1))]),t[15]||(t[15]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option A — extend your existing fixtures ",-1)),i(p,{code:pt,lang:"typescript",class:"mb-3"}),i(p,{code:ut,lang:"typescript",class:"mb-4"}),t[16]||(t[16]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-gray-400 dark:text-gray-500 mb-2"}," Option B — one-line extend ",-1)),i(p,{code:ct,lang:"typescript"})])])):m("",!0)])])]),_:1})}}}),_t=Object.assign(mt,{__name:"GetStartedWizard"});export{_t as _};
@@ -1,4 +1,4 @@
1
- import{_ as At,a as Lt}from"./DTrPCv7R.js";import{_ as Ot,a as Bt}from"./2yLW7WU0.js";import{_ as zt}from"./C9I1Dp3S.js";import{d as z,ao as Ut,B as Ft,L as qt,ad as Wt,J as vt,o as s,c as v,h as E,r as ft,j as $,l as at,k as t,f as k,g as f,i as a,p as lt,q as A,t as h,v as P,m as D,_ as q,w as F,F as N,y as L,ag as wt,G as Q,R as ot,s as Mt,e as Gt}from"./CNu3kken.js";import{_ as Ht}from"./BM5BPKlc.js";import{_ as Yt}from"./BtZNYmZO.js";import{u as Xt}from"./BZFiz2UB.js";import{u as _t}from"./DprkT7rM.js";import{_ as Jt}from"./DNKZmhbX.js";import{_ as Qt}from"./Ya8ZzWuY.js";import{e as W,f as it,c as Zt}from"./DeewM3Wg.js";import{_ as G}from"./HIGGZ_c-.js";import{_ as H}from"./B_MVJP17.js";import{_ as X}from"./oSLbl-p0.js";import{_ as K}from"./Ce47NgZw.js";import{_ as Kt}from"./C6t4kxaa.js";import{_ as Rt}from"./Ce89VyHE.js";import{_ as te}from"./CdEzDaDI.js";import{_ as ee}from"./6vX5JdHr.js";import{_ as ct}from"./DZECGgZm.js";import{X as se,b as Tt,c as dt,d as ae,i as ne,e as re,f as oe,g as et,m as mt,h as ie,j as kt,k as le,l as $t,s as st,n as St,o as ce,p as de,q as ue,r as me,t as pe,P as _e,v as ye,_ as bt,u as jt,a as xt,C as yt,w as he,O as Z}from"./LTMoFvEY.js";import{_ as ut}from"./CBJFORiZ.js";import{N as Dt}from"./DBWM_xs-.js";import{_ as ge}from"./jR2xm3_t.js";import{_ as fe}from"./DAhv9aNg.js";import{_ as be}from"./C2_7XZo0.js";import"./BVyjw9Bi.js";import"./B3AG2m76.js";import"./CmTzxoQt.js";import"./BuGAn4f7.js";import"./BZOykMLD.js";import"./Bq4_kqIp.js";import"./DZ-KbUZi.js";import"./CfhOanaF.js";import"./BjaRappk.js";import"./B_JSV0yG.js";import"./D7W_4Sqc.js";function xe({x:C,y:e,w:i,h:_,tl:n=!1,tr:M=!1,bl:u=!1,br:R=!1,r:b=0}){let p;p=`M${C+b},${e}h${i-2*b}`;let r=M?b:0,l=M?0:b;return p+=`a${r},${r} 0 0 1 ${r},${r}`,p+=`h${l}v${l}`,p+=`v${_-2*b}`,r=R?b:0,l=R?0:b,p+=`a${r},${r} 0 0 1 ${-r},${r}`,p+=`v${l}h${-l}`,p+=`h${2*b-i}`,r=u?b:0,l=u?0:b,p+=`a${r},${r} 0 0 1 ${-r},${-r}`,p+=`h${-l}v${-l}`,p+=`v${2*b-_}`,r=n?b:0,l=n?0:b,p+=`a${r},${r} 0 0 1 ${r},${-r}`,p+=`v${-l}h${l}`,p+="z",p}const ve=Object.assign(Object.assign({},se),{color:void 0,barMaxWidth:void 0,barWidth:void 0,dataStep:void 0,barPadding:0,roundedCorners:2,cursor:null,barMinHeight1Px:!1,barMinHeightZeroValue:null,orientation:Tt.Vertical}),Et=dt`
1
+ import{_ as At,a as Lt}from"./D5Mhpp98.js";import{_ as Ot,a as zt}from"./CdLqOMvN.js";import{_ as Bt}from"./CnRNwiuE.js";import{d as B,ao as Ut,C as Ft,L as qt,ad as Wt,a as vt,o as s,c as v,v as E,r as ft,h as $,x as at,b as t,e as k,f,g as a,_ as lt,i as A,t as h,l as P,k as D,j as q,w as F,F as N,z as L,ag as wt,H as Q,R as ot,m as Mt,s as Gt}from"./BzBaMPgu.js";import{_ as Ht}from"./BUYmGTVP.js";import{_ as Yt}from"./6DSY_93j.js";import{u as Xt}from"./DWz_bHNP.js";import{u as _t}from"./CDEmotIt.js";import{_ as Jt}from"./Bw4oIhct.js";import{_ as Qt}from"./Db5xe__T.js";import{e as W,f as it,c as Zt}from"./CdM2qNYM.js";import{_ as G}from"./Hp-_W7z4.js";import{_ as H}from"./DUtYU4Sb.js";import{_ as X}from"./B77w1Eib.js";import{_ as K}from"./D_j436ND.js";import{_ as Kt}from"./BxSrScjV.js";import{_ as Rt}from"./C7SG50jD.js";import{_ as te}from"./Ch8sGLqE.js";import{_ as ee}from"./BvXrhZ8k.js";import{_ as ct}from"./5nOoVJzL.js";import{X as se,b as Tt,c as dt,d as ae,i as ne,e as re,f as oe,g as et,m as mt,h as ie,j as kt,k as le,l as $t,s as st,n as St,o as ce,p as de,q as ue,r as me,t as pe,P as _e,v as ye,_ as bt,u as jt,a as xt,C as yt,w as he,O as Z}from"./CbuK1HIv.js";import{_ as ut}from"./C8WgBDU1.js";import{N as Dt}from"./Yl6iqHwK.js";import{_ as ge}from"./BF5JDf9_.js";import{_ as fe}from"./B-onBCAB.js";import{_ as be}from"./mhvG7mu8.js";import"./DDho3MJD.js";import"./Boyv6hLW.js";import"./BOrnSpTA.js";import"./DcUBmKKE.js";import"./WCZdf9Ln.js";import"./BPQNVV4M.js";import"./CTYlay1H.js";import"./qeqzb80l.js";import"./BcHU1KNK.js";import"./kDEwM7SQ.js";import"./D7W_4Sqc.js";function xe({x:C,y:e,w:i,h:_,tl:n=!1,tr:M=!1,bl:u=!1,br:R=!1,r:b=0}){let p;p=`M${C+b},${e}h${i-2*b}`;let r=M?b:0,l=M?0:b;return p+=`a${r},${r} 0 0 1 ${r},${r}`,p+=`h${l}v${l}`,p+=`v${_-2*b}`,r=R?b:0,l=R?0:b,p+=`a${r},${r} 0 0 1 ${-r},${r}`,p+=`v${l}h${-l}`,p+=`h${2*b-i}`,r=u?b:0,l=u?0:b,p+=`a${r},${r} 0 0 1 ${-r},${-r}`,p+=`h${-l}v${-l}`,p+=`v${2*b-_}`,r=n?b:0,l=n?0:b,p+=`a${r},${r} 0 0 1 ${r},${-r}`,p+=`v${-l}h${l}`,p+="z",p}const ve=Object.assign(Object.assign({},se),{color:void 0,barMaxWidth:void 0,barWidth:void 0,dataStep:void 0,barPadding:0,roundedCorners:2,cursor:null,barMinHeight1Px:!1,barMinHeightZeroValue:null,orientation:Tt.Vertical}),Et=dt`
2
2
  label: stacked-bar-component;
3
3
  `,ke=ne`
4
4
  :root {
@@ -31,4 +31,4 @@ import{_ as At,a as Lt}from"./DTrPCv7R.js";import{_ as Ot,a as Bt}from"./2yLW7WU
31
31
  label: barGroup;
32
32
  `,Vt=dt`
33
33
  label: barGroupExit;
34
- `,$e=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:ht,barGroupExit:Vt,globalStyles:ke,root:Et},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=ve,this.config=this._defaultConfig,this.getAccessors=()=>oe(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],i=this.dataScale.domain(),_=this._getBarWidth()/2,n=this._barData.map((x,m)=>et(x,this.config.x,m)),M=mt(n),u=ie(n),R=this.dataScale(M),b=this.dataScale(u),p=this.dataScale.invert(R+(e?_:-_)),r=this.dataScale.invert(b+(e?-_:_)),l=p<=i[0]?this.dataScale(i[0])-this.dataScale(p):0,j=r>i[1]?this.dataScale(r)-this.dataScale(i[1]):0;return{top:this.isVertical()?0:e?-j:l,bottom:this.isVertical()?0:e?-l:j,left:this.isVertical()?l:0,right:this.isVertical()?j:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Tt.Vertical}_render(e){const{config:i}=this,_=kt(e)?e:i.duration,n=this.getAccessors(),M=le(this._barData,0,n,this._prevNegative);this._prevNegative=M.map(m=>!!m.isMostlyNegative);const u=this.g.selectAll(`.${ht}`).data(this._barData,(m,g)=>{var c;return`${(c=$t(m,i.id,g))!==null&&c!==void 0?c:g}`}),R=(m,g)=>{const c=this.dataScale(et(m,i.x,g)),S=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${S},${o})`},p=u.enter().append("g").attr("class",ht).attr("transform",R).style("opacity",1).merge(u);st(p,_).attr("transform",R).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,_).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),_).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const l=p.selectAll(`.${rt}`).data((m,g)=>{const c=M.map((S,o)=>({datum:m,index:g,stacked:S[g],stackIndex:o})).filter(S=>S.stacked[0]!==S.stacked[1]);return c.forEach((S,o)=>{S.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==S.stacked[1]}),c},m=>m.stackIndex),x=l.enter().append("path").attr("class",rt).attr("d",m=>this._getBarPath(m,!0)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).merge(l);st(x,_).attr("d",m=>this._getBarPath(m)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).style("cursor",m=>$t(m.datum,i.cursor,m.stackIndex)),st(l.exit(),_).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:i}}=this;if(ce(i))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const _=this.dataScale.bandwidth,n=this.dataScale.domain?this.dataScale.domain():[];let u=1+(_?n.length:n[1]-n[0])/e.dataStep||!_&&i.filter((p,r)=>{const l=et(p,e.x,r);return l>=n[0]&&l<=n[1]}).length||i.length;!_&&u>=2&&(u+=1);const b=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return mt([b,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:i}}=this,_=this._getBarWidth(),n=i.length<2?0:_/2,M=this.dataScale,u=Math.abs(M.invert(n)-M.invert(0));return i?.filter((b,p)=>{const r=et(b,e.x,p),l=M.domain(),j=+l[0],x=+l[1];return r>=j-u&&r<=x+u})}_getBarPath(e,i=!1){const{config:_}=this,n=this.getAccessors(),M=this._getBarWidth(),u=e.stacked[1]<0,R=e.isEnding,b=et(e.datum,n[e.stackIndex],e.index),p=i?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!i&&_.barMinHeight1Px&&p<1&&isFinite(b)&&b!==_.barMinHeightZeroValue?1:p,l=i?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(p<1&&_.barMinHeight1Px?1:0),j=-M/2,x=M,m=_.roundedCorners?kt(_.roundedCorners)?+_.roundedCorners:x/2:0,g=me(m,0,Math.min(p,x)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return xe({x:this.isVertical()?j:l-r,y:this.isVertical()?l+(c?0:-r):j,w:this.isVertical()?x:r,h:this.isVertical()?r:x,tl:R&&(this.isVertical()?!u&&c||u&&!c:u),tr:R&&(this.isVertical()?!u&&c||u&&!c:!u),br:R&&(this.isVertical()?u&&c||!u&&!c:!u),bl:R&&(this.isVertical()?u&&c||!u&&!c:u),r:g})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:i}=this,_=this.getAccessors(),n=e?this._getVisibleData():i.data;return de(n,..._)}getDataScaleExtent(){const{config:e,datamodel:i}=this;return ue(i.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=$e;const Se={"data-vis-component":""},Ce=z({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(C,{expose:e}){const i=Ut(pe),_=C,n=E(()=>i.data.value??_.data),M=_e(_),u=ft();return Ft(()=>{qt(()=>{u.value=new It(M.value),u.value?.setData(n.value),i.update(u.value)})}),Wt(()=>{u.value?.destroy(),i.destroy()}),vt(M,(R,b)=>{ye(R,b)||(u.value?.setConfig(M.value),u.value?.render())}),vt(n,()=>{u.value?.setData(n.value)}),e({component:u}),(R,b)=>(s(),v("div",Se))}}),we=30,gt=3650;function Me(C){const e={days:String(C.days)};return C.projectIds&&C.projectIds.length>0&&(e.projects=C.projectIds.join(",")),C.environment&&(e.environment=C.environment),C.fullRunsOnly||(e.fullRunsOnly="false"),e}const J={days:we,projectIds:[],environment:null,fullRunsOnly:!0};function Re(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:_=>JSON.stringify(_),decode:_=>{try{return _?{...J,...JSON.parse(_)}:{...J}}catch{return{...J}}}}),e=E(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),i=E(()=>Me(e.value));return{state:C,scope:e,scopeQuery:i}}function Y(C,e){return _t(`/api/analytics/${C}`,{query:E(e),lazy:!0,server:!1},"$UlG3SHNJJg")}const Te={class:"flex items-center gap-3 flex-wrap"},je={class:"flex items-center gap-1.5"},De={key:0,class:"text-gray-500"},Ee={key:1,class:"truncate"},Ve={key:2},Ie={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},pt="All environments",Ne=z({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const i=C,_=e,n=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:gt}],M=E({get:()=>i.modelValue.days,set:m=>_("update:modelValue",{...i.modelValue,days:m})}),u=E(()=>i.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),R=E({get:()=>i.modelValue.projectIds,set:m=>_("update:modelValue",{...i.modelValue,projectIds:m})});function b(m){return u.value.find(g=>g.value===m)?.label??`#${m}`}const p=E({get:()=>i.modelValue.environment??pt,set:m=>_("update:modelValue",{...i.modelValue,environment:m===pt?null:m})}),r=E(()=>[pt,...i.availableEnvironments]),l=E({get:()=>i.modelValue.fullRunsOnly,set:m=>_("update:modelValue",{...i.modelValue,fullRunsOnly:m})}),j=E(()=>i.modelValue.days===J.days&&i.modelValue.projectIds.length===0&&i.modelValue.environment===null&&i.modelValue.fullRunsOnly===J.fullRunsOnly);function x(){_("update:modelValue",{...J})}return(m,g)=>{const c=zt,S=lt,o=Ht,d=Yt,y=q;return s(),v("div",Te,[$(c,{modelValue:t(M),"onUpdate:modelValue":g[0]||(g[0]=T=>at(M)?M.value=T:null),items:n,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),k(o,{key:0,modelValue:t(R),"onUpdate:modelValue":g[1]||(g[1]=T=>at(R)?R.value=T:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:T})=>[a("div",je,[$(S,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",T.length?"text-primary":"text-gray-400"])},null,8,["class"]),T.length?T.length===1?(s(),v("span",Ee,h(b(T[0])),1)):(s(),v("span",Ve,h(T.length)+" projects",1)):(s(),v("span",De,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),k(c,{key:1,modelValue:t(p),"onUpdate:modelValue":g[2]||(g[2]=T=>at(p)?p.value=T:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),a("label",Ie,[$(d,{modelValue:t(l),"onUpdate:modelValue":g[3]||(g[3]=T=>at(l)?l.value=T:null),size:"sm"},null,8,["modelValue"]),g[4]||(g[4]=D(" Full runs only ",-1))]),t(j)?P("",!0):(s(),k(y,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:x},{default:f(()=>[...g[5]||(g[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ne,{__name:"AnalyticsScopeBar"}),Ae=[{id:"health",label:"Where things stand",description:"The state of every project right now."},{id:"pain",label:"Where the pain is",description:"What is costing you the most time and attention."},{id:"trends",label:"Which way it is going",description:"Movement over the selected period."},{id:"detail",label:"Detail",description:"Breakdowns to reach for once you know what you are chasing."}],Nt=[{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full",band:"health"},{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half",band:"health"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half",band:"health"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half",band:"pain"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half",band:"pain"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half",band:"pain"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half",band:"trends"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half",band:"trends"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half",band:"detail"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full",band:"detail"}];new Set(Nt.map(C=>C.id));const Le={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Oe={class:"min-w-0"},Be={class:"text-sm font-medium"},ze={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},Ue=z({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("insights",()=>_.query)),e=await e,i(),e),b=Q,p={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(r,l)=>{const j=G,x=q,m=H,g=X,c=lt,S=K;return s(),k(S,{icon:"i-lucide-lightbulb",title:"Insights",count:t(n)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=o=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Le,[(s(!0),v(N,null,L(t(n),o=>(s(),k(wt(o.to?t(b):"div"),{key:o.id,to:o.to,class:A(["flex items-start gap-3 py-3 pl-3 border-l-2",[p[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[$(c,{name:p[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",p[o.severity].class])},null,8,["name","class"]),a("div",Oe,[a("p",Be,h(o.message),1),o.detail?(s(),v("p",ze,h(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Fe=Object.assign(Ue,{__name:"InsightsFeed"}),qe={class:"md:hidden space-y-3"},We={class:"flex items-center justify-between gap-2"},Ge={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},He={key:0},Ye={class:"hidden md:block"},Xe={class:"w-full text-sm"},Je={class:"divide-y divide-gray-100 dark:divide-gray-800"},Qe={class:"py-2.5 pr-4"},Ze={class:"flex items-center gap-2 min-w-0"},Ke={class:"py-2.5 pr-4"},ts={class:"w-36"},es={class:"py-2.5 pr-4 text-right"},ss={class:"py-2.5 pr-4 text-right tabular-nums"},as={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ns={class:"py-2.5 text-right"},rs={class:"text-xs text-gray-500 dark:text-gray-400"},os={key:1,class:"text-xs text-gray-400"},is=z({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("portfolio",()=>_.query)),e=await e,i(),e);function b(r){return r===null?"text-gray-400":r>=90?"text-green-600 dark:text-green-400":r>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function p(r){return r===null||Math.abs(r)<1?null:r>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Q,S=Kt,o=Rt,d=lt,y=te,T=ee,V=ct,I=K;return s(),k(I,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(n)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=w=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No projects with runs in this period."})):(s(),v(N,{key:3},[a("div",qe,[(s(!0),v(N,null,L(t(n),w=>(s(),v("div",{key:w.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[a("div",We,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),a("span",{class:A(["tabular-nums font-semibold shrink-0",b(w.passRate)])},h(w.passRate!==null?`${w.passRate}%`:"—"),3)]),$(S,{runs:w.recentRuns,height:20},null,8,["runs"]),a("div",Ge,[a("span",null,h(w.runCount)+" runs · "+h(w.flakyTests)+" flaky · "+h(w.openClusters)+" open clusters",1),w.latestRun?(s(),v("span",He,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)):P("",!0)])]))),128))]),a("div",Ye,[$(V,{"min-width":"52rem"},{default:f(()=>[a("table",Xe,[l[2]||(l[2]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Project"),a("th",{class:"py-2 pr-4 font-medium"},"Trend"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),a("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),a("tbody",Je,[(s(!0),v(N,null,L(t(n),w=>(s(),v("tr",{key:w.projectId},[a("td",Qe,[a("div",Ze,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),(s(!0),v(N,null,L(w.tags.slice(0,2),U=>(s(),k(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),a("td",Ke,[a("div",ts,[$(S,{runs:w.recentRuns,height:22},null,8,["runs"])])]),a("td",es,[a("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(w.passRate)])},[D(h(w.passRate!==null?`${w.passRate}%`:"—")+" ",1),p(w.passRateDelta)?(s(),k(d,{key:0,name:p(w.passRateDelta).icon,class:A(["size-3.5",p(w.passRateDelta).class]),title:`${w.passRateDelta>0?"+":""}${w.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),a("td",ss,h(w.runCount),1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},h(w.flakyTests),3),a("td",as,[$(y,{ms:w.avgRunDurationMs},null,8,["ms"])]),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.openClusters>0?"text-red-600 dark:text-red-400":""])},h(w.openClusters),3),a("td",ns,[w.latestRun?(s(),k(c,{key:0,to:`/test-runs/${w.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[$(T,{status:w.latestRun.status},null,8,["status"]),a("span",rs,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",os,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ls=Object.assign(is,{__name:"PortfolioScorecard"}),cs={class:"space-y-1"},ds={class:"flex gap-px"},us=["title"],ms={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},ps={class:"relative h-4"},_s=z({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("pass-rate-heatmap",()=>_.query)),e=await e,i(),e);function b(c){return c===null?{}:c>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:c>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:c>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:c>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function p(c,S,o){const d=n.value?.buckets[S]??"",y=(n.value?.bucketDays??1)>1?` (${n.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${y}: ${o!==null?`${o}% passed`:"no runs"}`}const r=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],l=E(()=>{const c=n.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),j=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],x=E(()=>{const c=n.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function m(c){const[S,o,d]=c.split("-"),y=j[Number(o)-1];return x.value?`${y} ${S}`:`${y} ${Number(d)}`}const g=E(()=>{const c=n.value?.buckets??[],S=c.length;if(S===0)return[];const o=Math.min(x.value?4:5,S),d=new Set,y=[];for(let T=0;T<o;T++){const V=o===1?0:Math.round(T*(S-1)/(o-1));if(d.has(V))continue;d.add(V);const I=V===0?0:V===S-1?100:(V+.5)/S*100,w=V===0?"translateX(0)":V===S-1?"translateX(-100%)":"translateX(-50%)";y.push({index:V,label:m(c[V]),left:I,transform:w})}return y});return(c,S)=>{const o=G,d=q,y=H,T=X,V=Q,I=bt,w=ct,U=ut;return s(),k(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(l),help:"analytics.heatmap"},{default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:S[0]||(S[0]=O=>t(R)())},{default:f(()=>[...S[1]||(S[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(T,{key:2,text:"No runs in this period."})):(s(),k(w,{key:3,"min-width":"22rem"},{default:f(()=>[a("div",cs,[(s(!0),v(N,null,L(t(n).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[$(V,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(h(O.label||O.name),1)]),_:2},1032,["to","title"]),a("div",ds,[(s(!0),v(N,null,L(O.cells,(nt,tt)=>(s(),v("div",{key:tt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:ot(b(nt)),title:p(O,tt,nt)},null,12,us))),128))])]))),128)),a("div",ms,[S[2]||(S[2]=a("span",null,null,-1)),a("div",ps,[(s(!0),v(N,null,L(t(g),O=>(s(),v("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:ot({left:`${O.left}%`,transform:O.transform})},h(O.label),5))),128))])]),$(I,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ys=Object.assign(_s,{__name:"PassRateHeatmap"}),hs={key:3,class:"w-full relative"},gs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},fs={class:"font-semibold mb-1"},bs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",xs=z({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("ci-time-trend",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),p=E(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,l=o=>o.totalMinutes,j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const o=n.value.deltaPct;return{label:`${o>0?"+":""}${o}% vs previous period`,class:o>25?"text-red-600 dark:text-red-400":o<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),S=E(()=>{if(!n.value)return;const o=n.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${n.value.runCount} runs`});return(o,d)=>{const y=G,T=q,V=H,I=X,w=ut;return s(),k(w,{icon:"i-lucide-timer",title:"CI time",subtitle:t(S),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},h(t(c).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(y,{key:0})):t(u)?(s(),k(V,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(T,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(R)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",hs,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:l,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),$(t(he),{x:r,y:l,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),$(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("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-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",gs,[a("div",fs,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,h(t(x).totalMinutes)+" minutes",1),a("div",bs,h(t(x).runCount)+" runs",1)])],4)):P("",!0)])):(s(),k(I,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),vs=Object.assign(xs,{__name:"CiTimeTrendChart"}),ks={key:3,class:"w-full relative"},$s={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ss={class:"font-semibold mb-1"},Cs={key:1,class:"mt-4 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2.5 text-sm dark:border-amber-900/50 dark:bg-amber-950/30"},ws={class:"text-gray-700 dark:text-gray-300"},Ms={class:"font-semibold"},Rs={key:2,class:"mt-4 space-y-1"},Ts={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},js=z({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("wasted-time",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(y=>({date:new Date(y.date),waitMinutes:y.waitMinutes,failedExecMinutes:y.failedExecMinutes}))??[]),p=E(()=>b.value.some(y=>y.waitMinutes>0||y.failedExecMinutes>0)),r=y=>y.date,l=["rgb(245, 158, 11)","rgb(239, 68, 68)"],j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:y=>y.date,series:[{y:y=>y.waitMinutes,color:l[0]},{y:y=>y.failedExecMinutes,color:l[1]}]}),c=[{color:l[0],label:"Wait steps"},{color:l[1],label:"Failed attempts"}],S=E(()=>{if(!n.value)return;const y=n.value.totalWaitMinutes+n.value.totalFailedExecMinutes;return`${y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`} of CI time produced no signal`}),o=E(()=>n.value?.timeoutReclaimable??null),d=E(()=>{const y=o.value?.estimatedMinutes??0;return y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`});return(y,T)=>{const V=bt,I=G,w=q,U=H,O=X,nt=lt,tt=Q,Pt=ut;return s(),k(Pt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t(S),help:"analytics.wasted-time"},{legend:f(()=>[$(V,{items:c,dense:""})]),default:f(()=>[t(M)?(s(),k(I,{key:0})):t(u)?(s(),k(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in y?y.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:T[0]||(T[0]=B=>t(R)())},{default:f(()=>[...T[1]||(T[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",ks,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:[B=>B.waitMinutes,B=>B.failedExecMinutes],color:l,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),$(t(Z),{type:"x","tick-format":B=>new Date(B).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":B=>B.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("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-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",$s,[a("div",Ss,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,[T[2]||(T[2]=a("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+h(t(x).waitMinutes)+" min",1)]),a("div",null,[T[3]||(T[3]=a("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+h(t(x).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",Cs,[$(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),a("div",ws,[T[5]||(T[5]=D(" Up to ",-1)),a("span",Ms,"≈"+h(t(d)),1),D(" of this is avoidable — "+h(t(o).oversizedCount)+" oversized "+h(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+h(t(o).staleSlowCount)+" stale ",1),T[6]||(T[6]=a("code",{class:"text-xs"},"test.slow()",-1)),D(" "+h(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),k(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...T[4]||(T[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(n)&&t(n).byProject.length>0?(s(),v("div",Rs,[(s(!0),v(N,null,L(t(n).byProject.slice(0,5),B=>(s(),v("div",{key:B.projectId,class:"flex items-center justify-between text-sm"},[$(tt,{to:`/projects/${B.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(h(B.label||B.name),1)]),_:2},1032,["to"]),a("span",Ts,h(Math.round(B.waitMinutes+B.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),k(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Ds=Object.assign(js,{__name:"WastedTimeChart"}),Es={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Vs={class:"flex-1 min-w-0"},Is={class:"text-sm font-medium truncate"},Ns={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ps={class:"text-right shrink-0"},As=z({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("flaky-leaderboard",()=>_.query)),e=await e,i(),e);function b(r){return r>=60?"text-red-600 dark:text-red-400":r>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function p(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Rt,S=Q,o=K;return s(),k(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(n)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",Es,[(s(!0),v(N,null,L(t(n),d=>(s(),k(S,{key:`${d.projectId}-${d.testCaseId}`,to:`/test-cases/${d.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},h(d.score),3),a("div",Vs,[a("p",Is,h(d.title),1),a("p",Ns,[D(h(d.projectLabel||d.projectName)+" · "+h(p(d))+" ",1),d.lastFlakeAt?(s(),v(N,{key:0},[D(" · last "+h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(d.lastFlakeAt)),1)],64)):P("",!0)])]),a("div",Ps,[a("p",{class:A(["text-sm tabular-nums",d.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":d.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},h(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),k(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ls=Object.assign(As,{__name:"GlobalFlakyLeaderboard"}),Os={key:3,class:"space-y-4"},Bs={key:0,class:"flex flex-wrap gap-1.5"},zs={class:"divide-y divide-gray-100 dark:divide-gray-800"},Us={class:"flex-1 min-w-0"},Fs={class:"text-sm font-medium truncate"},qs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ws={class:"text-right text-xs shrink-0"},Gs={class:"tabular-nums font-medium"},Hs=z({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("cluster-landscape",()=>_.query)),e=await e,i(),e);function b(p){return p>=30?"text-red-600 dark:text-red-400":p>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=ge,c=fe,S=Mt,o=Q,d=K;return s(),k(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load clusters: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=y=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).totalOpen===0&&t(n).resolvedInPeriod===0?(s(),k(m,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",Os,[$(c,null,{default:f(()=>[$(g,{label:"Open",value:t(n).totalOpen,"value-class":t(n).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),$(g,{label:"Resolved this period",value:t(n).resolvedInPeriod},null,8,["value"]),$(g,{label:"Oldest open",value:t(n).clusters.length>0?`${Math.max(...t(n).clusters.map(y=>y.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(n).byErrorType.length>0?(s(),v("div",Bs,[(s(!0),v(N,null,L(t(n).byErrorType,y=>(s(),k(S,{key:y.errorType,color:("clusterErrorTypeColor"in p?p.clusterErrorTypeColor:t(Zt))(y.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(h(y.errorType)+" · "+h(y.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),a("div",zs,[(s(!0),v(N,null,L(t(n).clusters.slice(0,8),y=>(s(),k(o,{key:y.id,to:`/failure-clusters/${y.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("div",Us,[a("p",Fs,h(y.title||y.signature),1),a("p",qs,[D(h(y.projectLabel||y.projectName)+" ",1),y.errorType?(s(),v(N,{key:0},[D(" · "+h(y.errorType),1)],64)):P("",!0)])]),a("div",Ws,[a("p",Gs,h(y.occurrences)+"×",1),a("p",{class:A(["tabular-nums",b(y.ageDays)])},h(y.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Ys=Object.assign(Hs,{__name:"ClusterLandscape"}),Xs={key:3,class:"w-full"},Js=z({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("regression-velocity",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(g=>({date:new Date(g.date),regressions:g.regressions,newFlaky:g.newFlaky}))??[]),p=E(()=>b.value.some(g=>g.regressions>0||g.newFlaky>0)),r=g=>g.date,l=["rgb(239, 68, 68)","rgb(147, 51, 234)"],j=[{color:l[0],label:"New regressions"},{color:l[1],label:"Newly flaky"}],x=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const g=n.value.deltaPct;return{label:`${g>0?"+":""}${g}% vs previous period`,class:g>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),m=E(()=>{if(n.value)return`${n.value.totalRegressions} new regressions, ${n.value.totalNewFlaky} newly flaky`});return(g,c)=>{const S=bt,o=G,d=q,y=H,T=X,V=ut;return s(),k(V,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(m),help:"analytics.regression-velocity"},{legend:f(()=>[$(S,{items:j,dense:""})]),actions:f(()=>[t(x)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(x).class])},h(t(x).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in g?g.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=I=>t(R)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",Xs,[$(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[$(t(Ce),{x:r,y:[I=>I.regressions,I=>I.newFlaky],color:l,"rounded-corners":2},null,8,["y"]),$(t(Z),{type:"x","tick-format":I=>new Date(I).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Count","tick-format":I=>I.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),k(T,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Qs=Object.assign(Js,{__name:"RegressionVelocityChart"}),Zs={class:"w-full text-sm border-separate border-spacing-1"},Ks={class:"pr-2 max-w-[12rem]"},ta=["title"],ea=z({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("browser-matrix",()=>_.query)),e=await e,i(),e);function b(p){return p===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":p>=99.5?"bg-green-500/85 text-white":p>=90?"bg-green-500/45":p>=75?"bg-amber-500/50":p>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=Q,c=ct,S=K;return s(),k(S,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(m,{key:2,text:"No runs with browser data in this period."})):(s(),k(c,{key:3,"min-width":"30rem"},{default:f(()=>[a("table",Zs,[a("thead",null,[a("tr",null,[r[2]||(r[2]=a("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(N,null,L(t(n).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},h(o),1))),128))])]),a("tbody",null,[(s(!0),v(N,null,L(t(n).rows,o=>(s(),v("tr",{key:o.projectId},[a("td",Ks,[$(g,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(h(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(N,null,L(o.cells,(d,y)=>(s(),v("td",{key:y,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(n).browsers[y]}: ${d!==null?`${d}% passed`:"no tests"}`},h(d!==null?`${Math.round(d)}%`:"—"),11,ta))),128))]))),128))])])]),_:1}))]),_:1})}}}),sa=Object.assign(ea,{__name:"BrowserMatrix"}),aa={class:"md:hidden space-y-3"},na={class:"flex items-center gap-2 min-w-0"},ra={class:"text-xs truncate"},oa={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ia={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},la={class:"hidden md:block"},ca={class:"w-full text-sm"},da={class:"divide-y divide-gray-100 dark:divide-gray-800"},ua={class:"py-2.5 pr-4"},ma={class:"flex items-center gap-2 min-w-0"},pa=["title"],_a={class:"py-2.5 pr-4 text-right tabular-nums"},ya={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ha={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ga={class:"py-2.5 text-right tabular-nums"},fa=z({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("slow-endpoints",()=>_.query)),e=await e,i(),e);function b(r){return r>=1e3?"text-red-600 dark:text-red-400":r>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function p(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,l)=>{const j=G,x=q,m=H,g=be,c=Mt,S=ct,o=K;return s(),k(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(n)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).endpoints.length===0?(s(),k(g,{key:2,icon:"i-lucide-network",title:"No network requests captured in this period",text:"Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",doc:"capture-fixtures"})):(s(),v(N,{key:3},[a("div",aa,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("div",{key:`${d.method} ${d.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[a("div",na,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",ra,h(d.route),1)]),a("div",oa,[a("span",null,[l[2]||(l[2]=D("p90 ",-1)),a("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms",3)]),a("span",null,h(d.requests)+" reqs · "+h(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ia,h(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),a("div",la,[$(S,{"min-width":"44rem"},{default:f(()=>[a("table",ca,[l[3]||(l[3]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),a("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),a("tbody",da,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[a("td",ua,[a("div",ma,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},h(d.route),9,pa)])]),a("td",_a,h(d.requests),1),a("td",ya,h(d.p50Ms)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms ",3),a("td",ha,h(d.maxMs)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",d.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},h(d.errorRate)+"% ",3),a("td",ga,h(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ba=Object.assign(fa,{__name:"SlowEndpointsTable"}),xa={class:"space-y-6"},va={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ka={class:"text-sm text-muted"},$a={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},ln=z({__name:"analytics",async setup(C){let e,i;Gt({title:"Analytics - Piwi Dashboard"});const{state:_,scopeQuery:n}=Re(),{data:M}=([e,i]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$sFpNat489G")),e=await e,i(),e),{data:u}=([e,i]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$QJEpX0hRMv")),e=await e,i(),e),R=E(()=>{const x=new Set;for(const m of u.value??[])m.environment&&x.add(m.environment);return[...x].sort()}),b=E(()=>{const x=u.value??[];return x.length===0?null:Math.max(...x.map(m=>new Date(m.startTime).getTime()))}),p=E(()=>{if(b.value===null||_.value.days>=gt)return!1;const x=Date.now()-_.value.days*24*60*60*1e3;return b.value<x});function r(){_.value={..._.value,days:gt}}const l={insights:Fe,portfolio:ls,"pass-rate-heatmap":ys,"ci-time-trend":vs,"wasted-time":Ds,"flaky-leaderboard":Ls,"cluster-landscape":Ys,"regression-velocity":Qs,"browser-matrix":sa,"slow-endpoints":ba},j=E(()=>Ae.map(x=>({...x,widgets:Nt.filter(m=>m.band===x.id)})).filter(x=>x.widgets.length>0));return(x,m)=>{const g=At,c=Lt,S=Bt,o=Pe,d=Jt,y=Qt,T=Ot;return s(),k(T,{id:"analytics"},{header:f(()=>[$(S,null,{leading:f(()=>[$(g),$(c,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[a("div",xa,[$(d,null,{default:f(()=>[$(o,{modelValue:t(_),"onUpdate:modelValue":m[0]||(m[0]=V=>at(_)?_.value=V:null),"available-projects":t(M),"available-environments":t(R)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(p)?(s(),k(y,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(_).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:t(it))(t(b))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:r}]},null,8,["title","description","actions"])):P("",!0),(s(!0),v(N,null,L(t(j),V=>(s(),v("section",{key:V.id,class:"space-y-3"},[a("div",null,[a("h2",va,h(V.label),1),a("p",ka,h(V.description),1)]),a("div",$a,[(s(!0),v(N,null,L(V.widgets,I=>(s(),v("div",{key:I.id,class:A(I.size==="full"?"xl:col-span-2":"")},[(s(),k(wt(l[I.id]),{query:t(n)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{ln as default};
34
+ `,$e=Object.freeze(Object.defineProperty({__proto__:null,bar:rt,barGroup:ht,barGroupExit:Vt,globalStyles:ke,root:Et},Symbol.toStringTag,{value:"Module"}));class It extends re{constructor(e){super(),this._defaultConfig=ve,this.config=this._defaultConfig,this.getAccessors=()=>oe(this.config.y)?this.config.y:[this.config.y],this.stacked=!0,this.events={},this._barData=[],e&&this.setConfig(e)}get bleed(){if(this._barData=this._getVisibleData(),this._barData.length===0)return{top:0,bottom:0,left:0,right:0};const e=!this.isVertical()&&this.dataScale.range()[0]>this.dataScale.range()[1],i=this.dataScale.domain(),_=this._getBarWidth()/2,n=this._barData.map((x,m)=>et(x,this.config.x,m)),M=mt(n),u=ie(n),R=this.dataScale(M),b=this.dataScale(u),p=this.dataScale.invert(R+(e?_:-_)),r=this.dataScale.invert(b+(e?-_:_)),l=p<=i[0]?this.dataScale(i[0])-this.dataScale(p):0,j=r>i[1]?this.dataScale(r)-this.dataScale(i[1]):0;return{top:this.isVertical()?0:e?-j:l,bottom:this.isVertical()?0:e?-l:j,left:this.isVertical()?l:0,right:this.isVertical()?j:0}}get dataScale(){return this.isVertical()?this.xScale:this.yScale}get valueScale(){return this.isVertical()?this.yScale:this.xScale}isVertical(){return this.config.orientation===Tt.Vertical}_render(e){const{config:i}=this,_=kt(e)?e:i.duration,n=this.getAccessors(),M=le(this._barData,0,n,this._prevNegative);this._prevNegative=M.map(m=>!!m.isMostlyNegative);const u=this.g.selectAll(`.${ht}`).data(this._barData,(m,g)=>{var c;return`${(c=$t(m,i.id,g))!==null&&c!==void 0?c:g}`}),R=(m,g)=>{const c=this.dataScale(et(m,i.x,g)),S=this.isVertical()?c:0,o=this.isVertical()?0:c;return`translate(${S},${o})`},p=u.enter().append("g").attr("class",ht).attr("transform",R).style("opacity",1).merge(u);st(p,_).attr("transform",R).style("opacity",1);const r=u.exit().attr("class",Vt);st(r,_).style("opacity",0).remove().on("interrupt",function(){this.remove()}),st(r.selectAll(`.${rt}`),_).attr("transform",this.isVertical()?`translate(0,${this._height/3})`:`translate(${this._width/6},0)`);const l=p.selectAll(`.${rt}`).data((m,g)=>{const c=M.map((S,o)=>({datum:m,index:g,stacked:S[g],stackIndex:o})).filter(S=>S.stacked[0]!==S.stacked[1]);return c.forEach((S,o)=>{S.isEnding=o===c.length-1||o<=c.length-1&&c[o+1].stacked[0]!==S.stacked[1]}),c},m=>m.stackIndex),x=l.enter().append("path").attr("class",rt).attr("d",m=>this._getBarPath(m,!0)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).merge(l);st(x,_).attr("d",m=>this._getBarPath(m)).style("fill",m=>St(m.datum,i.color,m.stackIndex)).style("cursor",m=>$t(m.datum,i.cursor,m.stackIndex)),st(l.exit(),_).style("opacity",0).remove().on("interrupt",function(){this.remove()})}_getBarWidth(){const{config:e,datamodel:{data:i}}=this;if(ce(i))return 0;if(e.barWidth)return mt([e.barWidth,e.barMaxWidth]);const _=this.dataScale.bandwidth,n=this.dataScale.domain?this.dataScale.domain():[];let u=1+(_?n.length:n[1]-n[0])/e.dataStep||!_&&i.filter((p,r)=>{const l=et(p,e.x,r);return l>=n[0]&&l<=n[1]}).length||i.length;!_&&u>=2&&(u+=1);const b=(u<2?1:1-e.barPadding)*(this.isVertical()?this._width:this._height)/u;return mt([b,e.barMaxWidth])}_getVisibleData(){const{config:e,datamodel:{data:i}}=this,_=this._getBarWidth(),n=i.length<2?0:_/2,M=this.dataScale,u=Math.abs(M.invert(n)-M.invert(0));return i?.filter((b,p)=>{const r=et(b,e.x,p),l=M.domain(),j=+l[0],x=+l[1];return r>=j-u&&r<=x+u})}_getBarPath(e,i=!1){const{config:_}=this,n=this.getAccessors(),M=this._getBarWidth(),u=e.stacked[1]<0,R=e.isEnding,b=et(e.datum,n[e.stackIndex],e.index),p=i?0:Math.abs(this.valueScale(e.stacked[0])-this.valueScale(e.stacked[1])),r=!i&&_.barMinHeight1Px&&p<1&&isFinite(b)&&b!==_.barMinHeightZeroValue?1:p,l=i?this.valueScale(0):this.valueScale(u?e.stacked[0]:e.stacked[1])-(p<1&&_.barMinHeight1Px?1:0),j=-M/2,x=M,m=_.roundedCorners?kt(_.roundedCorners)?+_.roundedCorners:x/2:0,g=me(m,0,Math.min(p,x)/2),c=this.yScale.range()[0]>this.yScale.range()[1];return xe({x:this.isVertical()?j:l-r,y:this.isVertical()?l+(c?0:-r):j,w:this.isVertical()?x:r,h:this.isVertical()?r:x,tl:R&&(this.isVertical()?!u&&c||u&&!c:u),tr:R&&(this.isVertical()?!u&&c||u&&!c:!u),br:R&&(this.isVertical()?u&&c||!u&&!c:!u),bl:R&&(this.isVertical()?u&&c||!u&&!c:u),r:g})}_mapEventDatum(e){return{datum:Object.assign(Object.assign({},e),e.datum),index:e.index}}getValueScaleExtent(e){const{datamodel:i}=this,_=this.getAccessors(),n=e?this._getVisibleData():i.data;return de(n,..._)}getDataScaleExtent(){const{config:e,datamodel:i}=this;return ue(i.data,e.x)}getYDataExtent(e){return this.isVertical()?this.getValueScaleExtent(e):this.getDataScaleExtent()}getXDataExtent(){return this.isVertical()?this.getDataScaleExtent():this.getValueScaleExtent(!1)}}It.selectors=$e;const Se={"data-vis-component":""},Ce=B({__name:"index",props:{color:{type:[Function,String,Array,null]},barWidth:{},barMaxWidth:{},dataStep:{},barPadding:{},roundedCorners:{type:[Number,Boolean]},cursor:{type:[Function,String,null]},barMinHeight1Px:{type:Boolean},barMinHeightZeroValue:{},orientation:{},x:{type:[Function,Number,null]},y:{type:[Function,Number,null,Array]},id:{type:Function},xScale:{type:[Object,Function]},yScale:{type:[Object,Function]},excludeFromDomainCalculation:{type:Boolean},duration:{},events:{},attributes:{},data:{}},setup(C,{expose:e}){const i=Ut(pe),_=C,n=E(()=>i.data.value??_.data),M=_e(_),u=ft();return Ft(()=>{qt(()=>{u.value=new It(M.value),u.value?.setData(n.value),i.update(u.value)})}),Wt(()=>{u.value?.destroy(),i.destroy()}),vt(M,(R,b)=>{ye(R,b)||(u.value?.setConfig(M.value),u.value?.render())}),vt(n,()=>{u.value?.setData(n.value)}),e({component:u}),(R,b)=>(s(),v("div",Se))}}),we=30,gt=3650;function Me(C){const e={days:String(C.days)};return C.projectIds&&C.projectIds.length>0&&(e.projects=C.projectIds.join(",")),C.environment&&(e.environment=C.environment),C.fullRunsOnly||(e.fullRunsOnly="false"),e}const J={days:we,projectIds:[],environment:null,fullRunsOnly:!0};function Re(){const C=Xt("piwi-analytics-scope",{default:()=>({...J}),encode:_=>JSON.stringify(_),decode:_=>{try{return _?{...J,...JSON.parse(_)}:{...J}}catch{return{...J}}}}),e=E(()=>({days:C.value.days,projectIds:C.value.projectIds.length>0?C.value.projectIds:void 0,environment:C.value.environment,fullRunsOnly:C.value.fullRunsOnly})),i=E(()=>Me(e.value));return{state:C,scope:e,scopeQuery:i}}function Y(C,e){return _t(`/api/analytics/${C}`,{query:E(e),lazy:!0,server:!1},"$UlG3SHNJJg")}const Te={class:"flex items-center gap-3 flex-wrap"},je={class:"flex items-center gap-1.5"},De={key:0,class:"text-gray-500"},Ee={key:1,class:"truncate"},Ve={key:2},Ie={class:"flex items-center gap-1.5 cursor-pointer select-none text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors"},pt="All environments",Ne=B({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{}},emits:["update:modelValue"],setup(C,{emit:e}){const i=C,_=e,n=[{label:"Last 7 days",value:7},{label:"Last 30 days",value:30},{label:"Last 90 days",value:90},{label:"Last year",value:365},{label:"All time",value:gt}],M=E({get:()=>i.modelValue.days,set:m=>_("update:modelValue",{...i.modelValue,days:m})}),u=E(()=>i.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),R=E({get:()=>i.modelValue.projectIds,set:m=>_("update:modelValue",{...i.modelValue,projectIds:m})});function b(m){return u.value.find(g=>g.value===m)?.label??`#${m}`}const p=E({get:()=>i.modelValue.environment??pt,set:m=>_("update:modelValue",{...i.modelValue,environment:m===pt?null:m})}),r=E(()=>[pt,...i.availableEnvironments]),l=E({get:()=>i.modelValue.fullRunsOnly,set:m=>_("update:modelValue",{...i.modelValue,fullRunsOnly:m})}),j=E(()=>i.modelValue.days===J.days&&i.modelValue.projectIds.length===0&&i.modelValue.environment===null&&i.modelValue.fullRunsOnly===J.fullRunsOnly);function x(){_("update:modelValue",{...J})}return(m,g)=>{const c=Bt,S=lt,o=Ht,d=Yt,y=q;return s(),v("div",Te,[$(c,{modelValue:t(M),"onUpdate:modelValue":g[0]||(g[0]=T=>at(M)?M.value=T:null),items:n,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),t(u).length>0?(s(),k(o,{key:0,modelValue:t(R),"onUpdate:modelValue":g[1]||(g[1]=T=>at(R)?R.value=T:null),items:t(u),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:f(({modelValue:T})=>[a("div",je,[$(S,{name:"i-lucide-folder",class:A(["size-3.5 shrink-0",T.length?"text-primary":"text-gray-400"])},null,8,["class"]),T.length?T.length===1?(s(),v("span",Ee,h(b(T[0])),1)):(s(),v("span",Ve,h(T.length)+" projects",1)):(s(),v("span",De,"All projects"))])]),_:1},8,["modelValue","items"])):P("",!0),C.availableEnvironments.length>0?(s(),k(c,{key:1,modelValue:t(p),"onUpdate:modelValue":g[2]||(g[2]=T=>at(p)?p.value=T:null),items:t(r),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):P("",!0),a("label",Ie,[$(d,{modelValue:t(l),"onUpdate:modelValue":g[3]||(g[3]=T=>at(l)?l.value=T:null),size:"sm"},null,8,["modelValue"]),g[4]||(g[4]=D(" Full runs only ",-1))]),t(j)?P("",!0):(s(),k(y,{key:2,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:x},{default:f(()=>[...g[5]||(g[5]=[D(" Reset ",-1)])]),_:1}))])}}}),Pe=Object.assign(Ne,{__name:"AnalyticsScopeBar"}),Ae=[{id:"health",label:"Where things stand",description:"The state of every project right now."},{id:"pain",label:"Where the pain is",description:"What is costing you the most time and attention."},{id:"trends",label:"Which way it is going",description:"Movement over the selected period."},{id:"detail",label:"Detail",description:"Breakdowns to reach for once you know what you are chasing."}],Nt=[{id:"portfolio",title:"Portfolio health",icon:"i-lucide-table-properties",size:"full",band:"health"},{id:"insights",title:"Insights",icon:"i-lucide-lightbulb",size:"half",band:"health"},{id:"pass-rate-heatmap",title:"Pass rate heatmap",icon:"i-lucide-grid-3x3",size:"half",band:"health"},{id:"cluster-landscape",title:"Failure clusters",icon:"i-lucide-layers",size:"half",band:"pain"},{id:"flaky-leaderboard",title:"Flakiest tests",icon:"i-lucide-repeat",size:"half",band:"pain"},{id:"wasted-time",title:"Wasted CI time",icon:"i-lucide-hourglass",size:"half",band:"pain"},{id:"regression-velocity",title:"Regression velocity",icon:"i-lucide-git-pull-request-arrow",size:"half",band:"trends"},{id:"ci-time-trend",title:"CI time",icon:"i-lucide-timer",size:"half",band:"trends"},{id:"browser-matrix",title:"Browser matrix",icon:"i-lucide-monitor-smartphone",size:"half",band:"detail"},{id:"slow-endpoints",title:"Slow endpoints",icon:"i-lucide-gauge",size:"full",band:"detail"}];new Set(Nt.map(C=>C.id));const Le={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Oe={class:"min-w-0"},ze={class:"text-sm font-medium"},Be={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},Ue=B({__name:"InsightsFeed",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("insights",()=>_.query)),e=await e,i(),e),b=Q,p={critical:{icon:"i-lucide-octagon-alert",class:"text-red-500",border:"border-l-red-500"},warning:{icon:"i-lucide-triangle-alert",class:"text-amber-500",border:"border-l-amber-400"},info:{icon:"i-lucide-info",class:"text-blue-500",border:"border-l-blue-400"},positive:{icon:"i-lucide-trending-up",class:"text-green-500",border:"border-l-green-500"}};return(r,l)=>{const j=G,x=q,m=H,g=X,c=lt,S=K;return s(),k(S,{icon:"i-lucide-lightbulb",title:"Insights",count:t(n)?.length||void 0,help:"analytics.insights"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load insights: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=o=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(s(),v("div",Le,[(s(!0),v(N,null,L(t(n),o=>(s(),k(wt(o.to?t(b):"div"),{key:o.id,to:o.to,class:A(["flex items-start gap-3 py-3 pl-3 border-l-2",[p[o.severity].border,o.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:f(()=>[$(c,{name:p[o.severity].icon,class:A(["size-4 mt-0.5 shrink-0",p[o.severity].class])},null,8,["name","class"]),a("div",Oe,[a("p",ze,h(o.message),1),o.detail?(s(),v("p",Be,h(o.detail),1)):P("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),Fe=Object.assign(Ue,{__name:"InsightsFeed"}),qe={class:"md:hidden space-y-3"},We={class:"flex items-center justify-between gap-2"},Ge={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},He={key:0},Ye={class:"hidden md:block"},Xe={class:"w-full text-sm"},Je={class:"divide-y divide-gray-100 dark:divide-gray-800"},Qe={class:"py-2.5 pr-4"},Ze={class:"flex items-center gap-2 min-w-0"},Ke={class:"py-2.5 pr-4"},ts={class:"w-36"},es={class:"py-2.5 pr-4 text-right"},ss={class:"py-2.5 pr-4 text-right tabular-nums"},as={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},ns={class:"py-2.5 text-right"},rs={class:"text-xs text-gray-500 dark:text-gray-400"},os={key:1,class:"text-xs text-gray-400"},is=B({__name:"PortfolioScorecard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("portfolio",()=>_.query)),e=await e,i(),e);function b(r){return r===null?"text-gray-400":r>=90?"text-green-600 dark:text-green-400":r>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function p(r){return r===null||Math.abs(r)<1?null:r>0?{icon:"i-lucide-trending-up",class:"text-green-600 dark:text-green-400"}:{icon:"i-lucide-trending-down",class:"text-red-600 dark:text-red-400"}}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Q,S=Kt,o=Rt,d=lt,y=te,T=ee,V=ct,I=K;return s(),k(I,{icon:"i-lucide-table-properties",title:"Portfolio health",count:t(n)?.length||void 0,help:"analytics.portfolio"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=w=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No projects with runs in this period."})):(s(),v(N,{key:3},[a("div",qe,[(s(!0),v(N,null,L(t(n),w=>(s(),v("div",{key:w.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[a("div",We,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),a("span",{class:A(["tabular-nums font-semibold shrink-0",b(w.passRate)])},h(w.passRate!==null?`${w.passRate}%`:"—"),3)]),$(S,{runs:w.recentRuns,height:20},null,8,["runs"]),a("div",Ge,[a("span",null,h(w.runCount)+" runs · "+h(w.flakyTests)+" flaky · "+h(w.openClusters)+" open clusters",1),w.latestRun?(s(),v("span",He,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)):P("",!0)])]))),128))]),a("div",Ye,[$(V,{"min-width":"52rem"},{default:f(()=>[a("table",Xe,[l[2]||(l[2]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Project"),a("th",{class:"py-2 pr-4 font-medium"},"Trend"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),a("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),a("tbody",Je,[(s(!0),v(N,null,L(t(n),w=>(s(),v("tr",{key:w.projectId},[a("td",Qe,[a("div",Ze,[$(c,{to:`/projects/${w.projectId}`,class:"font-medium truncate hover:text-primary"},{default:f(()=>[D(h(w.label||w.name),1)]),_:2},1032,["to"]),(s(!0),v(N,null,L(w.tags.slice(0,2),U=>(s(),k(o,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])]),a("td",Ke,[a("div",ts,[$(S,{runs:w.recentRuns,height:22},null,8,["runs"])])]),a("td",es,[a("span",{class:A(["inline-flex items-center gap-1 tabular-nums font-semibold",b(w.passRate)])},[D(h(w.passRate!==null?`${w.passRate}%`:"—")+" ",1),p(w.passRateDelta)?(s(),k(d,{key:0,name:p(w.passRateDelta).icon,class:A(["size-3.5",p(w.passRateDelta).class]),title:`${w.passRateDelta>0?"+":""}${w.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):P("",!0)],2)]),a("td",ss,h(w.runCount),1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},h(w.flakyTests),3),a("td",as,[$(y,{ms:w.avgRunDurationMs},null,8,["ms"])]),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",w.openClusters>0?"text-red-600 dark:text-red-400":""])},h(w.openClusters),3),a("td",ns,[w.latestRun?(s(),k(c,{key:0,to:`/test-runs/${w.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:f(()=>[$(T,{status:w.latestRun.status},null,8,["status"]),a("span",rs,h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(w.latestRun.startTime)),1)]),_:2},1032,["to"])):(s(),v("span",os,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ls=Object.assign(is,{__name:"PortfolioScorecard"}),cs={class:"space-y-1"},ds={class:"flex gap-px"},us=["title"],ms={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},ps={class:"relative h-4"},_s=B({__name:"PassRateHeatmap",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("pass-rate-heatmap",()=>_.query)),e=await e,i(),e);function b(c){return c===null?{}:c>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:c>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:c>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:c>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function p(c,S,o){const d=n.value?.buckets[S]??"",y=(n.value?.bucketDays??1)>1?` (${n.value.bucketDays} days)`:"";return`${c.label||c.name} · ${d}${y}: ${o!==null?`${o}% passed`:"no runs"}`}const r=[{color:"rgba(34, 197, 94, 0.85)",label:"100%"},{color:"rgba(34, 197, 94, 0.5)",label:"≥ 90%"},{color:"rgba(245, 158, 11, 0.55)",label:"≥ 75%"},{color:"rgba(249, 115, 22, 0.65)",label:"≥ 50%"},{color:"rgba(239, 68, 68, 0.75)",label:"< 50%"}],l=E(()=>{const c=n.value?.bucketDays??1;return c>1?`One cell = ${c} days`:"One cell = one day"}),j=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],x=E(()=>{const c=n.value?.buckets??[];return c.length>1&&c[0].slice(0,4)!==c[c.length-1].slice(0,4)});function m(c){const[S,o,d]=c.split("-"),y=j[Number(o)-1];return x.value?`${y} ${S}`:`${y} ${Number(d)}`}const g=E(()=>{const c=n.value?.buckets??[],S=c.length;if(S===0)return[];const o=Math.min(x.value?4:5,S),d=new Set,y=[];for(let T=0;T<o;T++){const V=o===1?0:Math.round(T*(S-1)/(o-1));if(d.has(V))continue;d.add(V);const I=V===0?0:V===S-1?100:(V+.5)/S*100,w=V===0?"translateX(0)":V===S-1?"translateX(-100%)":"translateX(-50%)";y.push({index:V,label:m(c[V]),left:I,transform:w})}return y});return(c,S)=>{const o=G,d=q,y=H,T=X,V=Q,I=bt,w=ct,U=ut;return s(),k(U,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:t(l),help:"analytics.heatmap"},{default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in c?c.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:S[0]||(S[0]=O=>t(R)())},{default:f(()=>[...S[1]||(S[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(T,{key:2,text:"No runs in this period."})):(s(),k(w,{key:3,"min-width":"22rem"},{default:f(()=>[a("div",cs,[(s(!0),v(N,null,L(t(n).rows,O=>(s(),v("div",{key:O.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[$(V,{to:`/projects/${O.projectId}`,class:"text-sm truncate hover:text-primary",title:O.label||O.name},{default:f(()=>[D(h(O.label||O.name),1)]),_:2},1032,["to","title"]),a("div",ds,[(s(!0),v(N,null,L(O.cells,(nt,tt)=>(s(),v("div",{key:tt,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:ot(b(nt)),title:p(O,tt,nt)},null,12,us))),128))])]))),128)),a("div",ms,[S[2]||(S[2]=a("span",null,null,-1)),a("div",ps,[(s(!0),v(N,null,L(t(g),O=>(s(),v("span",{key:O.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:ot({left:`${O.left}%`,transform:O.transform})},h(O.label),5))),128))])]),$(I,{items:r,dense:""})])]),_:1}))]),_:1},8,["subtitle"])}}}),ys=Object.assign(_s,{__name:"PassRateHeatmap"}),hs={key:3,class:"w-full relative"},gs={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},fs={class:"font-semibold mb-1"},bs={class:"text-gray-400 text-xs"},Ct="rgb(59, 130, 246)",xs=B({__name:"CiTimeTrendChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("ci-time-trend",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(o=>({date:new Date(o.date),totalMinutes:o.totalMinutes,runCount:o.runCount}))??[]),p=E(()=>b.value.some(o=>o.runCount>0)),r=o=>o.date,l=o=>o.totalMinutes,j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:o=>o.date,series:[{y:o=>o.totalMinutes,color:Ct}]}),c=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const o=n.value.deltaPct;return{label:`${o>0?"+":""}${o}% vs previous period`,class:o>25?"text-red-600 dark:text-red-400":o<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),S=E(()=>{if(!n.value)return;const o=n.value.totalMinutes;return`${o<60?`${Math.round(o)} min`:`${Math.round(o/60*10)/10} h`} across ${n.value.runCount} runs`});return(o,d)=>{const y=G,T=q,V=H,I=X,w=ut;return s(),k(w,{icon:"i-lucide-timer",title:"CI time",subtitle:t(S),help:"analytics.ci-time"},{actions:f(()=>[t(c)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(c).class])},h(t(c).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(y,{key:0})):t(u)?(s(),k(V,{key:1,text:`Couldn't load CI time: ${("errorMessage"in o?o.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(T,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=U=>t(R)())},{default:f(()=>[...d[1]||(d[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",hs,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:l,color:"rgba(59, 130, 246, 0.15)","curve-type":t(yt).MonotoneX},null,8,["curve-type"]),$(t(he),{x:r,y:l,color:Ct,"curve-type":t(yt).MonotoneX,"line-width":2},null,8,["curve-type"]),$(t(Z),{type:"x","tick-format":U=>new Date(U).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":U=>U.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("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-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",gs,[a("div",fs,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,h(t(x).totalMinutes)+" minutes",1),a("div",bs,h(t(x).runCount)+" runs",1)])],4)):P("",!0)])):(s(),k(I,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),vs=Object.assign(xs,{__name:"CiTimeTrendChart"}),ks={key:3,class:"w-full relative"},$s={class:"p-2 text-sm text-gray-900 dark:text-gray-100"},Ss={class:"font-semibold mb-1"},Cs={key:1,class:"mt-4 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2.5 text-sm dark:border-amber-900/50 dark:bg-amber-950/30"},ws={class:"text-gray-700 dark:text-gray-300"},Ms={class:"font-semibold"},Rs={key:2,class:"mt-4 space-y-1"},Ts={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},js=B({__name:"WastedTimeChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("wasted-time",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(y=>({date:new Date(y.date),waitMinutes:y.waitMinutes,failedExecMinutes:y.failedExecMinutes}))??[]),p=E(()=>b.value.some(y=>y.waitMinutes>0||y.failedExecMinutes>0)),r=y=>y.date,l=["rgb(245, 158, 11)","rgb(239, 68, 68)"],j=ft(null),{tooltipData:x,tooltipPos:m,onRenderComplete:g}=jt(j,b,{x:y=>y.date,series:[{y:y=>y.waitMinutes,color:l[0]},{y:y=>y.failedExecMinutes,color:l[1]}]}),c=[{color:l[0],label:"Wait steps"},{color:l[1],label:"Failed attempts"}],S=E(()=>{if(!n.value)return;const y=n.value.totalWaitMinutes+n.value.totalFailedExecMinutes;return`${y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`} of CI time produced no signal`}),o=E(()=>n.value?.timeoutReclaimable??null),d=E(()=>{const y=o.value?.estimatedMinutes??0;return y<60?`${Math.round(y)} min`:`${Math.round(y/60*10)/10} h`});return(y,T)=>{const V=bt,I=G,w=q,U=H,O=X,nt=lt,tt=Q,Pt=ut;return s(),k(Pt,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:t(S),help:"analytics.wasted-time"},{legend:f(()=>[$(V,{items:c,dense:""})]),default:f(()=>[t(M)?(s(),k(I,{key:0})):t(u)?(s(),k(U,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in y?y.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(w,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:T[0]||(T[0]=z=>t(R)())},{default:f(()=>[...T[1]||(T[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",ks,[$(t(xt),{ref_key:"xyContainerRef",ref:j,data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0},"on-render-complete":t(g)},{default:f(()=>[$(t(Dt),{x:r,y:[z=>z.waitMinutes,z=>z.failedExecMinutes],color:l,"curve-type":t(yt).MonotoneX},null,8,["y","curve-type"]),$(t(Z),{type:"x","tick-format":z=>new Date(z).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Minutes","tick-format":z=>z.toString()},null,8,["tick-format"])]),_:1},8,["data","on-render-complete"]),t(x)?(s(),v("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-[240px]",style:ot({left:`${t(m).x}px`,top:`${t(m).y}px`})},[a("div",$s,[a("div",Ss,h(new Date(t(x).date).toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),a("div",null,[T[2]||(T[2]=a("span",{class:"text-amber-500"},"●",-1)),D(" Wait steps: "+h(t(x).waitMinutes)+" min",1)]),a("div",null,[T[3]||(T[3]=a("span",{class:"text-red-500"},"●",-1)),D(" Failed attempts: "+h(t(x).failedExecMinutes)+" min",1)])])],4)):P("",!0),t(o)?(s(),v("div",Cs,[$(nt,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),a("div",ws,[T[5]||(T[5]=D(" Up to ",-1)),a("span",Ms,"≈"+h(t(d)),1),D(" of this is avoidable — "+h(t(o).oversizedCount)+" oversized "+h(t(o).oversizedCount===1?"timeout":"timeouts")+" and "+h(t(o).staleSlowCount)+" stale ",1),T[6]||(T[6]=a("code",{class:"text-xs"},"test.slow()",-1)),D(" "+h(t(o).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),t(o).topProjectId?(s(),k(tt,{key:0,to:`/projects/${t(o).topProjectId}#performance`,class:"text-primary hover:underline"},{default:f(()=>[...T[4]||(T[4]=[D("Review",-1)])]),_:1},8,["to"])):P("",!0)])])):P("",!0),t(n)&&t(n).byProject.length>0?(s(),v("div",Rs,[(s(!0),v(N,null,L(t(n).byProject.slice(0,5),z=>(s(),v("div",{key:z.projectId,class:"flex items-center justify-between text-sm"},[$(tt,{to:`/projects/${z.projectId}`,class:"truncate hover:text-primary"},{default:f(()=>[D(h(z.label||z.name),1)]),_:2},1032,["to"]),a("span",Ts,h(Math.round(z.waitMinutes+z.failedExecMinutes))+" min ",1)]))),128))])):P("",!0)])):(s(),k(O,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),Ds=Object.assign(js,{__name:"WastedTimeChart"}),Es={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},Vs={class:"flex-1 min-w-0"},Is={class:"text-sm font-medium truncate"},Ns={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ps={class:"text-right shrink-0"},As=B({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("flaky-leaderboard",()=>_.query)),e=await e,i(),e);function b(r){return r>=60?"text-red-600 dark:text-red-400":r>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function p(r){return r.retryPassRuns>0?`flaked ${r.retryPassRuns}/${r.totalRuns} runs`:`${r.alternations} status flips in ${r.totalRuns} runs`}return(r,l)=>{const j=G,x=q,m=H,g=X,c=Rt,S=Q,o=K;return s(),k(o,{icon:"i-lucide-repeat",title:"Flakiest tests",count:t(n)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).length===0?(s(),k(g,{key:2,text:"No flaky tests detected. Nice and stable."})):(s(),v("div",Es,[(s(!0),v(N,null,L(t(n),d=>(s(),k(S,{key:`${d.projectId}-${d.testCaseId}`,to:`/test-cases/${d.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("span",{class:A(["tabular-nums font-bold text-sm w-10 text-right shrink-0",b(d.score)])},h(d.score),3),a("div",Vs,[a("p",Is,h(d.title),1),a("p",Ns,[D(h(d.projectLabel||d.projectName)+" · "+h(p(d))+" ",1),d.lastFlakeAt?(s(),v(N,{key:0},[D(" · last "+h(("formatRelativeTime"in r?r.formatRelativeTime:t(it))(d.lastFlakeAt)),1)],64)):P("",!0)])]),a("div",Ps,[a("p",{class:A(["text-sm tabular-nums",d.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":d.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},h(Math.round(d.wastedCiMinutes))+" min ",3),d.rootCause?(s(),k(c,{key:0,text:d.rootCause,color:"neutral"},null,8,["text"])):P("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),Ls=Object.assign(As,{__name:"GlobalFlakyLeaderboard"}),Os={key:3,class:"space-y-4"},zs={key:0,class:"flex flex-wrap gap-1.5"},Bs={class:"divide-y divide-gray-100 dark:divide-gray-800"},Us={class:"flex-1 min-w-0"},Fs={class:"text-sm font-medium truncate"},qs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},Ws={class:"text-right text-xs shrink-0"},Gs={class:"tabular-nums font-medium"},Hs=B({__name:"ClusterLandscape",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("cluster-landscape",()=>_.query)),e=await e,i(),e);function b(p){return p>=30?"text-red-600 dark:text-red-400":p>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=ge,c=fe,S=Mt,o=Q,d=K;return s(),k(d,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load clusters: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=y=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).totalOpen===0&&t(n).resolvedInPeriod===0?(s(),k(m,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(s(),v("div",Os,[$(c,null,{default:f(()=>[$(g,{label:"Open",value:t(n).totalOpen,"value-class":t(n).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),$(g,{label:"Resolved this period",value:t(n).resolvedInPeriod},null,8,["value"]),$(g,{label:"Oldest open",value:t(n).clusters.length>0?`${Math.max(...t(n).clusters.map(y=>y.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),t(n).byErrorType.length>0?(s(),v("div",zs,[(s(!0),v(N,null,L(t(n).byErrorType,y=>(s(),k(S,{key:y.errorType,color:("clusterErrorTypeColor"in p?p.clusterErrorTypeColor:t(Zt))(y.errorType),variant:"subtle",size:"sm"},{default:f(()=>[D(h(y.errorType)+" · "+h(y.count),1)]),_:2},1032,["color"]))),128))])):P("",!0),a("div",Bs,[(s(!0),v(N,null,L(t(n).clusters.slice(0,8),y=>(s(),k(o,{key:y.id,to:`/failure-clusters/${y.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:f(()=>[a("div",Us,[a("p",Fs,h(y.title||y.signature),1),a("p",qs,[D(h(y.projectLabel||y.projectName)+" ",1),y.errorType?(s(),v(N,{key:0},[D(" · "+h(y.errorType),1)],64)):P("",!0)])]),a("div",Ws,[a("p",Gs,h(y.occurrences)+"×",1),a("p",{class:A(["tabular-nums",b(y.ageDays)])},h(y.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),Ys=Object.assign(Hs,{__name:"ClusterLandscape"}),Xs={key:3,class:"w-full"},Js=B({__name:"RegressionVelocityChart",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("regression-velocity",()=>_.query)),e=await e,i(),e),b=E(()=>n.value?.points.map(g=>({date:new Date(g.date),regressions:g.regressions,newFlaky:g.newFlaky}))??[]),p=E(()=>b.value.some(g=>g.regressions>0||g.newFlaky>0)),r=g=>g.date,l=["rgb(239, 68, 68)","rgb(147, 51, 234)"],j=[{color:l[0],label:"New regressions"},{color:l[1],label:"Newly flaky"}],x=E(()=>{if(!n.value||n.value.deltaPct===null)return null;const g=n.value.deltaPct;return{label:`${g>0?"+":""}${g}% vs previous period`,class:g>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),m=E(()=>{if(n.value)return`${n.value.totalRegressions} new regressions, ${n.value.totalNewFlaky} newly flaky`});return(g,c)=>{const S=bt,o=G,d=q,y=H,T=X,V=ut;return s(),k(V,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:t(m),help:"analytics.regression-velocity"},{legend:f(()=>[$(S,{items:j,dense:""})]),actions:f(()=>[t(x)?(s(),v("span",{key:0,class:A(["text-xs font-medium tabular-nums",t(x).class])},h(t(x).label),3)):P("",!0)]),default:f(()=>[t(M)?(s(),k(o,{key:0})):t(u)?(s(),k(y,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in g?g.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(d,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:c[0]||(c[0]=I=>t(R)())},{default:f(()=>[...c[1]||(c[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):t(p)?(s(),v("div",Xs,[$(t(xt),{data:t(b),height:220,padding:{top:10,right:10,bottom:0,left:0}},{default:f(()=>[$(t(Ce),{x:r,y:[I=>I.regressions,I=>I.newFlaky],color:l,"rounded-corners":2},null,8,["y"]),$(t(Z),{type:"x","tick-format":I=>new Date(I).toLocaleDateString("en-US",{month:"short",day:"numeric"})},null,8,["tick-format"]),$(t(Z),{type:"y",label:"Count","tick-format":I=>I.toString()},null,8,["tick-format"])]),_:1},8,["data"])])):(s(),k(T,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),Qs=Object.assign(Js,{__name:"RegressionVelocityChart"}),Zs={class:"w-full text-sm border-separate border-spacing-1"},Ks={class:"pr-2 max-w-[12rem]"},ta=["title"],ea=B({__name:"BrowserMatrix",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("browser-matrix",()=>_.query)),e=await e,i(),e);function b(p){return p===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":p>=99.5?"bg-green-500/85 text-white":p>=90?"bg-green-500/45":p>=75?"bg-amber-500/50":p>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(p,r)=>{const l=G,j=q,x=H,m=X,g=Q,c=ct,S=K;return s(),k(S,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:f(()=>[t(M)?(s(),k(l,{key:0})):t(u)?(s(),k(x,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in p?p.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(j,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:r[0]||(r[0]=o=>t(R)())},{default:f(()=>[...r[1]||(r[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).rows.length===0?(s(),k(m,{key:2,text:"No runs with browser data in this period."})):(s(),k(c,{key:3,"min-width":"30rem"},{default:f(()=>[a("table",Zs,[a("thead",null,[a("tr",null,[r[2]||(r[2]=a("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(s(!0),v(N,null,L(t(n).browsers,o=>(s(),v("th",{key:o,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},h(o),1))),128))])]),a("tbody",null,[(s(!0),v(N,null,L(t(n).rows,o=>(s(),v("tr",{key:o.projectId},[a("td",Ks,[$(g,{to:`/projects/${o.projectId}`,class:"truncate hover:text-primary block",title:o.label||o.name},{default:f(()=>[D(h(o.label||o.name),1)]),_:2},1032,["to","title"])]),(s(!0),v(N,null,L(o.cells,(d,y)=>(s(),v("td",{key:y,class:A(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",b(d)]),title:`${o.label||o.name} · ${t(n).browsers[y]}: ${d!==null?`${d}% passed`:"no tests"}`},h(d!==null?`${Math.round(d)}%`:"—"),11,ta))),128))]))),128))])])]),_:1}))]),_:1})}}}),sa=Object.assign(ea,{__name:"BrowserMatrix"}),aa={class:"md:hidden space-y-3"},na={class:"flex items-center gap-2 min-w-0"},ra={class:"text-xs truncate"},oa={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ia={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},la={class:"hidden md:block"},ca={class:"w-full text-sm"},da={class:"divide-y divide-gray-100 dark:divide-gray-800"},ua={class:"py-2.5 pr-4"},ma={class:"flex items-center gap-2 min-w-0"},pa=["title"],_a={class:"py-2.5 pr-4 text-right tabular-nums"},ya={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ha={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},ga={class:"py-2.5 text-right tabular-nums"},fa=B({__name:"SlowEndpointsTable",props:{query:{}},async setup(C){let e,i;const _=C,{data:n,pending:M,error:u,refresh:R}=([e,i]=F(()=>Y("slow-endpoints",()=>_.query)),e=await e,i(),e);function b(r){return r>=1e3?"text-red-600 dark:text-red-400":r>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function p(r){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[r.toUpperCase()]??"neutral"}return(r,l)=>{const j=G,x=q,m=H,g=be,c=Mt,S=ct,o=K;return s(),k(o,{icon:"i-lucide-gauge",title:"Slow endpoints",count:t(n)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:f(()=>[t(M)?(s(),k(j,{key:0})):t(u)?(s(),k(m,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in r?r.errorMessage:t(W))(t(u))}`},{action:f(()=>[$(x,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:l[0]||(l[0]=d=>t(R)())},{default:f(()=>[...l[1]||(l[1]=[D(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!t(n)||t(n).endpoints.length===0?(s(),k(g,{key:2,icon:"i-lucide-network",title:"No network requests captured in this period",text:"Slow endpoints need the Piwi capture fixtures — extend your Playwright test with piwiFixtures and request timing rides along with every run.",doc:"capture-fixtures"})):(s(),v(N,{key:3},[a("div",aa,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("div",{key:`${d.method} ${d.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[a("div",na,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",ra,h(d.route),1)]),a("div",oa,[a("span",null,[l[2]||(l[2]=D("p90 ",-1)),a("span",{class:A(["tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms",3)]),a("span",null,h(d.requests)+" reqs · "+h(d.projectCount)+" proj",1),d.errorRate>0?(s(),v("span",ia,h(d.errorRate)+"% err",1)):P("",!0)])]))),128))]),a("div",la,[$(S,{"min-width":"44rem"},{default:f(()=>[a("table",ca,[l[3]||(l[3]=a("thead",null,[a("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[a("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),a("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),a("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),a("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),a("tbody",da,[(s(!0),v(N,null,L(t(n).endpoints,d=>(s(),v("tr",{key:`${d.method} ${d.route}`},[a("td",ua,[a("div",ma,[$(c,{color:p(d.method),variant:"subtle",size:"sm"},{default:f(()=>[D(h(d.method),1)]),_:2},1032,["color"]),a("code",{class:"text-xs truncate max-w-[22rem]",title:d.route},h(d.route),9,pa)])]),a("td",_a,h(d.requests),1),a("td",ya,h(d.p50Ms)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums font-medium",b(d.p90Ms)])},h(d.p90Ms)+" ms ",3),a("td",ha,h(d.maxMs)+" ms",1),a("td",{class:A(["py-2.5 pr-4 text-right tabular-nums",d.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},h(d.errorRate)+"% ",3),a("td",ga,h(d.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),ba=Object.assign(fa,{__name:"SlowEndpointsTable"}),xa={class:"space-y-6"},va={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},ka={class:"text-sm text-muted"},$a={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},ln=B({__name:"analytics",async setup(C){let e,i;Gt({title:"Analytics - Piwi Dashboard"});const{state:_,scopeQuery:n}=Re(),{data:M}=([e,i]=F(()=>_t("/api/projects/menu",{lazy:!0,server:!1,default:()=>[]},"$sFpNat489G")),e=await e,i(),e),{data:u}=([e,i]=F(()=>_t("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[]},"$QJEpX0hRMv")),e=await e,i(),e),R=E(()=>{const x=new Set;for(const m of u.value??[])m.environment&&x.add(m.environment);return[...x].sort()}),b=E(()=>{const x=u.value??[];return x.length===0?null:Math.max(...x.map(m=>new Date(m.startTime).getTime()))}),p=E(()=>{if(b.value===null||_.value.days>=gt)return!1;const x=Date.now()-_.value.days*24*60*60*1e3;return b.value<x});function r(){_.value={..._.value,days:gt}}const l={insights:Fe,portfolio:ls,"pass-rate-heatmap":ys,"ci-time-trend":vs,"wasted-time":Ds,"flaky-leaderboard":Ls,"cluster-landscape":Ys,"regression-velocity":Qs,"browser-matrix":sa,"slow-endpoints":ba},j=E(()=>Ae.map(x=>({...x,widgets:Nt.filter(m=>m.band===x.id)})).filter(x=>x.widgets.length>0));return(x,m)=>{const g=At,c=Lt,S=zt,o=Pe,d=Jt,y=Qt,T=Ot;return s(),k(T,{id:"analytics"},{header:f(()=>[$(S,null,{leading:f(()=>[$(g),$(c,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:f(()=>[a("div",xa,[$(d,null,{default:f(()=>[$(o,{modelValue:t(_),"onUpdate:modelValue":m[0]||(m[0]=V=>at(_)?_.value=V:null),"available-projects":t(M),"available-environments":t(R)},null,8,["modelValue","available-projects","available-environments"])]),_:1}),t(p)?(s(),k(y,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${t(_).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:t(it))(t(b))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:r}]},null,8,["title","description","actions"])):P("",!0),(s(!0),v(N,null,L(t(j),V=>(s(),v("section",{key:V.id,class:"space-y-3"},[a("div",null,[a("h2",va,h(V.label),1),a("p",ka,h(V.description),1)]),a("div",$a,[(s(!0),v(N,null,L(V.widgets,I=>(s(),v("div",{key:I.id,class:A(I.size==="full"?"xl:col-span-2":"")},[(s(),k(wt(l[I.id]),{query:t(n)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{ln as default};
@@ -0,0 +1 @@
1
+ import{v as e,ab as r,bW as t}from"./BzBaMPgu.js";function a(o){return e(()=>r(o)?!!t(o)?.closest("form"):!0)}export{a as u};
@@ -0,0 +1 @@
1
+ import{_ as be,a as he}from"./D5Mhpp98.js";import{_ as ke,a as je}from"./qeqzb80l.js";import{_ as $e}from"./BC5bqlfM.js";import{_ as Re,a as Ce}from"./CdLqOMvN.js";import{d as G,I as Pe,q as J,C as De,ak as Ne,a as Q,b as i,o,c as l,h as s,_ as we,g as r,f as n,k as m,j as Z,t as R,e as x,l as y,J as Te,r as v,s as Fe,F as S,E as Ue,G as Se,z as K,H as ze,v as M,M as Le,n as Be}from"./BzBaMPgu.js";import{_ as Ke}from"./C7SG50jD.js";import{_ as Me}from"./Ch8sGLqE.js";import{_ as Ve}from"./BvXrhZ8k.js";import{_ as Ie}from"./CVEk4D8I.js";import{_ as Ee}from"./9Yziijlb.js";import{_ as He}from"./CBQXv4bU.js";import{_ as Oe}from"./5nOoVJzL.js";import{_ as qe}from"./Cp0V2FeW.js";import{_ as Ae}from"./B77w1Eib.js";import{_ as Ge,a as Je}from"./CwDej2Lz.js";import{p as Qe,a as Ze,s as We}from"./vOZZ2cLi.js";import{e as W,p as Xe,i as D}from"./CdM2qNYM.js";import{_ as Ye}from"./Bb_925DD.js";import{_ as et}from"./BbXvpkBp.js";import{u as A}from"./CDEmotIt.js";import{o as tt,s as V}from"./DGnQ69wW.js";import"./DWz_bHNP.js";import"./BcHU1KNK.js";import"./BSKLNgre.js";import"./D-c8ZSws.js";import"./BOrnSpTA.js";import"./Bg8yOdSf.js";import"./CTYlay1H.js";import"./Die1200X.js";import"./BUYmGTVP.js";import"./DDho3MJD.js";import"./Boyv6hLW.js";const ot={key:0},st={key:0,class:"rounded-lg border border-dashed border-default p-3 flex flex-wrap items-center gap-3"},at={key:1,class:"rounded-lg border border-default p-3 space-y-3"},nt={class:"flex items-center justify-between gap-3"},lt={class:"flex items-center gap-2 min-w-0 text-sm"},rt={class:"text-xs break-all"},it={class:"flex items-center gap-1.5 shrink-0"},ct=G({__name:"DesktopNewProjectFolder",props:{folder:{default:null},folderModifiers:{}},emits:Te(["detected"],["update:folder"]),setup(I,{emit:k}){const b=Pe(I,"folder"),z=k,L=J(),N=v(!1);De(()=>{N.value=!!Ne()});const _=v(null),f=v(!1);async function w(){f.value=!0;try{const c=await Qe();c&&(b.value=c)}catch(c){L.add({title:"Could not open the folder picker",description:W(c),color:"error"})}finally{f.value=!1}}function j(){b.value=null}return Q(b,async c=>{_.value=c?await Ze(c):null,_.value&&z("detected",_.value)},{immediate:!0}),(c,u)=>{const T=we,C=Z,g=Ge;return i(N)?(o(),l("div",ot,[b.value?(o(),l("div",at,[r("div",nt,[r("div",lt,[s(T,{name:"i-lucide-folder-check",class:"size-4 shrink-0 text-primary"}),r("code",rt,R(b.value),1)]),r("div",it,[s(C,{size:"xs",color:"neutral",variant:"soft",icon:"i-lucide-folder-search",loading:i(f),onClick:w},{default:n(()=>[...u[2]||(u[2]=[m(" Change ",-1)])]),_:1},8,["loading"]),s(C,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",disabled:i(f),onClick:j},{default:n(()=>[...u[3]||(u[3]=[m(" Clear ",-1)])]),_:1},8,["disabled"])])]),i(_)?(o(),x(g,{key:0,inspection:i(_)},null,8,["inspection"])):y("",!0),u[4]||(u[4]=r("p",{class:"text-xs text-muted"},"The folder is linked to the new project for local runs and IDE links.",-1))])):(o(),l("div",st,[s(T,{name:"i-lucide-folder-search",class:"size-5 shrink-0 text-muted"}),u[1]||(u[1]=r("div",{class:"min-w-0 flex-1 text-sm"},[r("p",{class:"font-medium"},"Start from a folder on this machine"),r("p",{class:"text-xs text-muted"},"Detects the project name and checks the Playwright + Piwi reporter setup.")],-1)),s(C,{color:"neutral",variant:"soft",size:"sm",icon:"i-lucide-folder-open",loading:i(f),onClick:w},{default:n(()=>[...u[0]||(u[0]=[m(" Choose folder… ",-1)])]),_:1},8,["loading"])]))])):y("",!0)}}}),dt=Object.assign(ct,{__name:"DesktopNewProjectFolder"}),ut={class:"flex flex-wrap items-center gap-3 mb-4"},pt={key:0,class:"flex flex-wrap items-center gap-2"},mt={class:"text-sm text-muted shrink-0 inline-flex items-center gap-1"},_t=["onClick"],ft={class:"flex flex-col gap-1"},gt={class:"flex items-center gap-2"},xt={key:0,class:"flex flex-wrap gap-1"},yt={key:0,class:"text-xs text-gray-600 italic"},vt={key:1},bt={key:0,class:"text-xs text-gray-600"},ht={key:1,class:"text-xs text-gray-600 italic"},kt={key:0,class:"flex items-center gap-1 flex-wrap"},jt={key:0,class:"text-xs font-medium bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded"},$t={key:1,class:"text-xs text-gray-500"},Rt={key:1,class:"text-xs text-gray-600 italic"},Ct={key:1,class:"text-xs text-gray-600 italic"},Pt={key:1,class:"text-xs text-gray-600 italic"},Dt={class:"flex justify-end gap-2"},Nt={key:1,class:"space-y-2","aria-busy":"true"},wt={key:2,class:"text-center py-12 text-gray-500"},Tt={class:"text-xs text-gray-400 max-w-sm"},Ft={class:"space-y-5"},Ut={class:"flex w-full justify-end gap-2"},mo=G({__name:"index",setup(I){Fe({title:"Projects — Piwi Dashboard"});const{data:k,refresh:b,status:z}=A("/api/projects",{key:"projects",lazy:!0,default:()=>[]},"$6DHNZL9pIE"),{data:L,refresh:N}=A("/api/tags",{lazy:!0},"$FLI1EBmEg_"),_=J(),f=M(()=>L.value?.tags||[]),w=M(()=>z.value==="pending"&&!k.value?.length),j=v(""),c=v([]),u=M(()=>{let a=k.value||[];if(j.value.trim()){const t=j.value.trim().toLowerCase();a=a.filter(p=>(p.label||p.name).toLowerCase().includes(t)||p.name.toLowerCase().includes(t))}return c.value.length>0&&(a=a.filter(t=>c.value.some(p=>(t.tags||[]).some(h=>h.id===p)))),a});function T(a){const t=c.value.indexOf(a);t===-1?c.value.push(a):c.value.splice(t,1)}function C(a){return c.value.includes(a)}const g=v(!1),X=tt({name:V().min(1,"Project name is required").max(100),label:V().optional(),description:V().optional()}),d=Le({name:"",label:"",description:""}),F=v([]),B=v(!1),P=v(null);function Y(a){a.suggestedName&&(d.name=a.suggestedName)}Q(g,a=>{a||(P.value=null)});function ee(){d.name="",d.label="",d.description="",F.value=[],P.value=null}async function te(){if(d.name?.trim())try{B.value=!0;const a=await $fetch("/api/projects",{method:"POST",body:{name:d.name.trim(),label:d.label?.trim()||null,description:d.description?.trim()||null,tagIds:F.value.map(h=>h.id)}}),t=P.value;let p=!1;if(t&&a?.project?.id!=null)try{await We(a.project.id,t),p=!0}catch(h){_.add({title:"Project created, but the folder could not be linked",description:W(h),color:"warning"})}if(_.add({title:"Project created",description:p?`Project "${d.name}" has been created and linked to its folder`:`Project "${d.name}" has been created`,color:"success"}),g.value=!1,ee(),p&&a?.project?.id!=null){await Be(`/projects/${a.project.id}`);return}await b()}catch(a){const t=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;_.add({title:"Failed to create project",description:t||"An error occurred",color:"error"})}finally{B.value=!1}}const oe=[{header:"Project",columns:[{accessorKey:"name",header:D("Name")},{accessorKey:"totalRuns",header:D("Runs")}]},{accessorKey:"latestRunData",header:"Latest run",columns:[{accessorKey:"latestRun",header:D("Date")},{accessorKey:"branch",header:"Branch"},{accessorKey:"duration",header:D("Duration")},{accessorKey:"status",header:D("Status")},{accessorKey:"testRatio",header:"Test status"},{accessorKey:"report",header:"Reports"}]},{accessorKey:"actions",header:"Project actions"}];return(a,t)=>{const p=be,h=he,E=ke,se=$e,ae=Ce,ne=Se,H=Ke,$=Z,O=ze,le=Me,re=Ve,ie=Ie,ce=Ee,de=He,ue=Oe,q=qe,pe=je,me=Ae,_e=Re,fe=dt,ge=Je,xe=Ye,ye=et,ve=Ue;return o(),l(S,null,[s(_e,{id:"projects"},{header:n(()=>[s(ae,null,{leading:n(()=>[s(p),s(h,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects"}]})]),right:n(()=>[s(se,{actions:[{label:"New project",icon:"i-lucide-plus",onClick:()=>g.value=!0},{label:"Refresh",icon:"i-lucide-refresh-cw",variant:"outline",onClick:()=>i(b)()}]},{leading:n(()=>[s(E,{topic:"projects.table",size:"sm"})]),_:1},8,["actions"])]),_:1})]),body:n(()=>[r("div",ut,[s(ne,{modelValue:j.value,"onUpdate:modelValue":t[0]||(t[0]=e=>j.value=e),icon:"i-lucide-search",placeholder:"Search projects by name...",class:"min-w-48 flex-1",ui:{base:"w-full"}},null,8,["modelValue"]),f.value.length>0?(o(),l("div",pt,[r("span",mt,[t[11]||(t[11]=m(" Filter by tag (any match): ",-1)),s(E,{topic:"projects.tag-filter"})]),(o(!0),l(S,null,K(f.value,e=>(o(),l("button",{key:e.id,type:"button",class:"cursor-pointer focus:outline-none",onClick:U=>T(e.id)},[s(H,{text:e.text,color:e.color,variant:C(e.id)?"solid":"outline"},null,8,["text","color","variant"])],8,_t))),128)),c.value.length>0?(o(),x($,{key:0,size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-x",label:"Clear filters",onClick:t[1]||(t[1]=e=>c.value=[])})):y("",!0)])):y("",!0)]),u.value.length>0?(o(),x(ue,{key:0,"min-width":"60rem",bleed:!1},{default:n(()=>[s(de,{data:u.value,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"}},{"name-cell":n(({row:e})=>[r("div",ft,[r("div",gt,[s(O,{to:`/projects/${e.original.id}`,class:"text-primary hover:underline font-medium"},{default:n(()=>[m(R(e.original.label||e.original.name),1)]),_:2},1032,["to"])]),e.original.tags?.length?(o(),l("div",xt,[(o(!0),l(S,null,K(e.original.tags,U=>(o(),x(H,{key:U.id,text:U.text,color:U.color},null,8,["text","color"]))),128))])):y("",!0)])]),"totalRuns-cell":n(({row:e})=>[e.original.totalRuns===0?(o(),l("span",yt,"No data")):(o(),l("span",vt,R(e.original.totalRuns)+" runs",1))]),"latestRun-cell":n(({row:e})=>[e.original.latestRun?(o(),l("span",bt,R(("prettyDateFormat"in a?a.prettyDateFormat:i(Xe))(e.original.latestRun.startTime)),1)):(o(),l("span",ht,"No data"))]),"branch-cell":n(({row:e})=>[e.original.latestRun?.metadata?.scm?(o(),l("div",kt,[e.original.latestRun.metadata.scm.branch?(o(),l("span",jt,R(e.original.latestRun.metadata.scm.branch),1)):y("",!0),e.original.latestRun.metadata.scm.commit?(o(),l("code",$t,R(e.original.latestRun.metadata.scm.commit.substring(0,7)),1)):y("",!0)])):y("",!0)]),"duration-cell":n(({row:e})=>[e.original.latestRun?.duration!=null?(o(),x(le,{key:0,ms:e.original.latestRun.duration,class:"text-sm text-gray-600"},null,8,["ms"])):(o(),l("span",Rt,"No data"))]),"status-cell":n(({row:e})=>[e.original.latestRun?(o(),x(re,{key:0,status:e.original.latestRun.status},null,8,["status"])):(o(),l("span",Ct,"No data"))]),"testRatio-cell":n(({row:e})=>[e.original.latestRun?(o(),x(ie,{key:0,passed:e.original.latestRun.passedTests,failed:e.original.latestRun.failedTests,skipped:e.original.latestRun.skippedTests,flaky:e.original.latestRun.flakyTests,"did-not-run":e.original.latestRun.didNotRunTests??0,total:e.original.latestRun.totalTests},null,8,["passed","failed","skipped","flaky","did-not-run","total"])):(o(),l("span",Pt,"No data"))]),"report-cell":n(({row:e})=>[e.original.latestRun?(o(),x(ce,{key:0,reports:e.original.latestRun.reports},null,8,["reports"])):y("",!0)]),"actions-header":n(()=>[...t[12]||(t[12]=[r("div",{class:"text-right"},"Project actions",-1)])]),"actions-cell":n(({row:e})=>[r("div",Dt,[s($,{to:`/projects/${e.original.id}`,size:"sm",variant:"outline"},{default:n(()=>[...t[13]||(t[13]=[m("View details",-1)])]),_:1},8,["to"]),s($,{to:`/projects/${e.original.id}/edit`,size:"sm",variant:"ghost",icon:"i-lucide-pencil"},null,8,["to"])])]),_:1},8,["data"])]),_:1})):w.value?(o(),l("div",Nt,[t[14]||(t[14]=r("span",{class:"sr-only",role:"status"},"Loading projects…",-1)),s(q,{class:"h-10 w-full rounded-lg"}),(o(),l(S,null,K(6,e=>s(q,{key:e,class:"h-14 w-full rounded-lg"})),64))])):i(k)&&i(k).length>0?(o(),l("div",wt,[...t[15]||(t[15]=[r("p",{class:"text-lg mb-2"},"No projects match your search",-1),r("p",{class:"text-sm"},"Try adjusting your search or filters",-1)])])):(o(),x(me,{key:3,icon:"i-lucide-rocket",text:"No projects yet"},{default:n(()=>[r("p",Tt,[t[18]||(t[18]=m(" Projects are created automatically once the reporter submits its first run — see the ",-1)),s(O,{to:"/",class:"text-primary hover:underline"},{default:n(()=>[...t[16]||(t[16]=[m("home page",-1)])]),_:1}),t[19]||(t[19]=m(" for a copy-paste setup snippet, or the ",-1)),s(pe,{to:"reporter","no-icon":"",class:"text-primary hover:underline"},{default:n(()=>[...t[17]||(t[17]=[m("reporter docs",-1)])]),_:1}),t[20]||(t[20]=m(". ",-1))]),s($,{icon:"i-lucide-plus",label:"New project",variant:"ghost",size:"sm",class:"mt-2",onClick:t[2]||(t[2]=e=>g.value=!0)})]),_:1}))]),_:1}),s(ve,null,{default:n(()=>[s(ye,{open:g.value,title:"Create new project","onUpdate:open":t[10]||(t[10]=e=>g.value=e)},{body:n(()=>[r("div",Ft,[s(fe,{folder:P.value,"onUpdate:folder":t[3]||(t[3]=e=>P.value=e),onDetected:Y},null,8,["folder"]),s(xe,{schema:i(X),state:i(d)},{default:n(()=>[s(ge,{mode:"create",name:i(d).name,"onUpdate:name":t[4]||(t[4]=e=>i(d).name=e),label:i(d).label,"onUpdate:label":t[5]||(t[5]=e=>i(d).label=e),description:i(d).description,"onUpdate:description":t[6]||(t[6]=e=>i(d).description=e),tags:F.value,"onUpdate:tags":t[7]||(t[7]=e=>F.value=e),"all-tags":f.value,onTagCreated:t[8]||(t[8]=e=>i(N)())},null,8,["name","label","description","tags","all-tags"])]),_:1},8,["schema","state"])])]),footer:n(()=>[r("div",Ut,[s($,{color:"neutral",variant:"ghost",label:"Cancel",onClick:t[9]||(t[9]=e=>g.value=!1)}),s($,{label:"Create project",icon:"i-lucide-plus",loading:B.value,onClick:te},null,8,["loading"])])]),_:1},8,["open"])]),_:1})],64)}}});export{mo as default};
@@ -1 +1 @@
1
- import{d as ee,w as te,b as oe,O as ae,c as w,i as n,k as t,f as u,g as s,j as a,F as le,D as se,o as d,_ as ne,v as m,t as O,R as re,p as ie,E as ce,P as S,al as M,m as q,h as P,r as v,M as B,A as de}from"./CNu3kken.js";import{_ as ue}from"./Ce89VyHE.js";import{_ as me}from"./D3SJGdl4.js";import{_ as pe}from"./Ce47NgZw.js";import{_ as ge}from"./CF_eDZHu.js";import{_ as fe}from"./Wk7ZKG4B.js";import{_ as xe}from"./roaTZkYi.js";import{p as _e}from"./DeewM3Wg.js";import{u as ve}from"./DprkT7rM.js";import{o as be,s as z}from"./DGnQ69wW.js";import"./CmTzxoQt.js";import"./CfhOanaF.js";import"./BjaRappk.js";import"./B_JSV0yG.js";import"./DZ-KbUZi.js";const ye={class:"space-y-6"},Te={class:"flex items-center gap-2"},Ce={class:"text-sm font-mono text-muted"},ke={class:"text-sm text-muted"},he={class:"flex gap-1 justify-end"},$e={class:"text-center py-12"},Ve={class:"flex justify-center mb-4"},Ae={class:"flex items-center gap-3"},Ue={key:0,class:"mt-2"},we={class:"flex items-center gap-3"},De={key:0,class:"mt-2"},b="#6366f1",He=ee({__name:"tags",async setup(Fe){let y,D;const{data:N,refresh:V}=([y,D]=te(()=>ve("/api/tags","$F3fVqC3Sbv")),y=await y,D(),y),p=oe(),{authState:K}=ae(),I=de(),A=P(()=>N.value?.tags||[]),T=P(()=>I.public.authEnabled?K.value.user?.role==="administrator":!0),L=[{accessorKey:"text",header:"Tag"},{accessorKey:"color",header:"Color"},{accessorKey:"createdAt",header:"Created"},{accessorKey:"actions",header:""}],g=v(!1),F=be({text:z().min(1,"Tag text is required").max(50,"Tag text must be at most 50 characters"),color:z().min(1,"Color is required")}),r=B({text:"",color:b}),x=v(!1),C=v(null),i=B({text:"",color:b});function R(l){C.value=l,i.text=l.text,i.color=l.color,x.value=!0}async function G(){try{await $fetch("/api/tags",{method:"POST",body:r}),p.add({title:"Tag created",description:`Tag "${r.text}" has been created successfully`,color:"success"}),g.value=!1,r.text="",r.color=b,await V()}catch(l){const e=l&&typeof l=="object"&&"data"in l?l.data?.message:void 0;p.add({title:"Failed to create tag",description:e||"An error occurred",color:"error"})}}async function H(){if(C.value)try{await $fetch(`/api/tags/${C.value.id}`,{method:"PUT",body:{text:i.text,color:i.color}}),p.add({title:"Tag updated",description:"Tag has been updated successfully",color:"success"}),x.value=!1,C.value=null,await V()}catch(l){const e=l&&typeof l=="object"&&"data"in l?l.data?.message:void 0;p.add({title:"Failed to update tag",description:e||"An error occurred",color:"error"})}}const _=v(!1),f=v(null);function J(l){f.value=l,_.value=!0}async function Q(){const l=f.value;if(l){_.value=!1,f.value=null;try{await $fetch(`/api/tags/${l.id}`,{method:"DELETE"}),p.add({title:"Tag deleted",description:`Tag "${l.text}" has been deleted`,color:"success"}),await V()}catch(e){const c=e&&typeof e=="object"&&"data"in e?e.data?.message:void 0;p.add({title:"Failed to delete tag",description:c||"An error occurred",color:"error"})}}}return(l,e)=>{const c=ne,k=ue,W=me,E=pe,X=ie,h=ce,$=ge,j=fe,U=xe,Y=se;return d(),w(le,null,[n("div",ye,[t(A).length>0?(d(),u(E,{key:0,title:"Tags",count:t(A).length,help:"settings.tags"},{actions:s(()=>[t(T)?(d(),u(c,{key:0,label:"Add tag",icon:"i-lucide-tag",size:"sm",onClick:e[0]||(e[0]=o=>g.value=!0)})):m("",!0)]),default:s(()=>[a(W,{data:t(A),columns:L},{"text-cell":s(({row:o})=>[a(k,{text:o.original.text,color:o.original.color},null,8,["text","color"])]),"color-cell":s(({row:o})=>[n("div",Te,[n("span",{class:"inline-block w-4 h-4 rounded-full border border-black/10",style:re({backgroundColor:o.original.color})},null,4),n("span",Ce,O(o.original.color),1)])]),"createdAt-cell":s(({row:o})=>[n("span",ke,O(("prettyDateFormat"in l?l.prettyDateFormat:t(_e))(o.original.createdAt,{dateOnly:!0})),1)]),"actions-cell":s(({row:o})=>[n("div",he,[t(T)?(d(),u(c,{key:0,icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:Z=>R(o.original)},null,8,["onClick"])):m("",!0),t(T)?(d(),u(c,{key:1,icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:Z=>J(o.original)},null,8,["onClick"])):m("",!0)])]),_:1},8,["data"])]),_:1},8,["count"])):(d(),u(E,{key:1,title:"Tags",count:0,help:"settings.tags"},{default:s(()=>[n("div",$e,[n("div",Ve,[a(X,{name:"i-lucide-tags",class:"text-4xl text-muted"})]),e[14]||(e[14]=n("h3",{class:"text-lg font-semibold mb-2"},"No tags yet",-1)),e[15]||(e[15]=n("p",{class:"text-muted mb-4"},"Create tags to categorize and filter your projects",-1)),t(T)?(d(),u(c,{key:0,label:"Add tag",icon:"i-lucide-tag",onClick:e[1]||(e[1]=o=>g.value=!0)})):m("",!0)])]),_:1}))]),a(Y,null,{default:s(()=>[a(U,{open:t(g),title:"Add new tag","onUpdate:open":e[6]||(e[6]=o=>g.value=o)},{body:s(()=>[a(j,{schema:t(F),state:t(r)},{default:s(()=>[a($,{label:"Tag text",name:"text",required:"",class:"mb-4"},{default:s(()=>[a(h,{modelValue:t(r).text,"onUpdate:modelValue":e[2]||(e[2]=o=>t(r).text=o),placeholder:"Enter tag name"},null,8,["modelValue"])]),_:1}),a($,{label:"Color",name:"color",required:"",class:"mb-4"},{default:s(()=>[n("div",Ae,[S(n("input",{"onUpdate:modelValue":e[3]||(e[3]=o=>t(r).color=o),type:"color",class:"w-10 h-10 rounded cursor-pointer border border-default","aria-label":"Pick tag color"},null,512),[[M,t(r).color]]),a(h,{modelValue:t(r).color,"onUpdate:modelValue":e[4]||(e[4]=o=>t(r).color=o),class:"flex-1 font-mono",placeholder:"#6366f1"},null,8,["modelValue"])])]),_:1}),t(r).text?(d(),w("div",Ue,[e[16]||(e[16]=n("span",{class:"text-sm text-muted mr-2"},"Preview:",-1)),a(k,{text:t(r).text,color:t(r).color||b},null,8,["text","color"])])):m("",!0)]),_:1},8,["schema","state"])]),footer:s(()=>[a(c,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:e[5]||(e[5]=o=>g.value=!1)}),a(c,{type:"submit",label:"Create tag",icon:"i-lucide-tag",onClick:G})]),_:1},8,["open"]),a(U,{open:t(x),title:"Edit tag","onUpdate:open":e[11]||(e[11]=o=>x.value=o)},{body:s(()=>[a(j,{schema:t(F),state:t(i)},{default:s(()=>[a($,{label:"Tag text",name:"text",required:"",class:"mb-4"},{default:s(()=>[a(h,{modelValue:t(i).text,"onUpdate:modelValue":e[7]||(e[7]=o=>t(i).text=o),placeholder:"Enter tag name"},null,8,["modelValue"])]),_:1}),a($,{label:"Color",name:"color",required:"",class:"mb-4"},{default:s(()=>[n("div",we,[S(n("input",{"onUpdate:modelValue":e[8]||(e[8]=o=>t(i).color=o),type:"color",class:"w-10 h-10 rounded cursor-pointer border border-default","aria-label":"Pick tag color"},null,512),[[M,t(i).color]]),a(h,{modelValue:t(i).color,"onUpdate:modelValue":e[9]||(e[9]=o=>t(i).color=o),class:"flex-1 font-mono",placeholder:"#6366f1"},null,8,["modelValue"])])]),_:1}),t(i).text?(d(),w("div",De,[e[17]||(e[17]=n("span",{class:"text-sm text-muted mr-2"},"Preview:",-1)),a(k,{text:t(i).text,color:t(i).color||b},null,8,["text","color"])])):m("",!0)]),_:1},8,["schema","state"])]),footer:s(()=>[a(c,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:e[10]||(e[10]=o=>x.value=!1)}),a(c,{type:"submit",label:"Save changes",icon:"i-lucide-check",onClick:H})]),_:1},8,["open"]),a(U,{open:t(_),title:"Delete tag","onUpdate:open":e[13]||(e[13]=o=>_.value=o)},{body:s(()=>[n("p",null,[e[18]||(e[18]=q(" Are you sure you want to delete tag ",-1)),t(f)?(d(),u(k,{key:0,text:t(f).text,color:t(f).color,class:"inline-flex"},null,8,["text","color"])):m("",!0),e[19]||(e[19]=q("? It will be removed from all projects. ",-1))])]),footer:s(()=>[a(c,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[12]||(e[12]=o=>_.value=!1)}),a(c,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:Q})]),_:1},8,["open"])]),_:1})],64)}}});export{He as default};
1
+ import{d as ee,w as te,q as oe,O as ae,c as A,g as n,b as t,e as u,f as s,h as a,F as le,E as se,o as d,j as ne,l as m,t as O,R as re,_ as ie,G as ce,P as S,al as q,k as M,v as B,r as v,M as P,B as de}from"./BzBaMPgu.js";import{_ as ue}from"./C7SG50jD.js";import{_ as me}from"./CBQXv4bU.js";import{_ as pe}from"./D_j436ND.js";import{_ as ge}from"./Bg8yOdSf.js";import{_ as fe}from"./Bb_925DD.js";import{_ as xe}from"./BbXvpkBp.js";import{p as _e}from"./CdM2qNYM.js";import{u as ve}from"./CDEmotIt.js";import{o as be,s as z}from"./DGnQ69wW.js";import"./BOrnSpTA.js";import"./qeqzb80l.js";import"./BcHU1KNK.js";import"./kDEwM7SQ.js";import"./CTYlay1H.js";const ye={class:"space-y-6"},Te={class:"flex items-center gap-2"},Ce={class:"text-sm font-mono text-muted"},ke={class:"text-sm text-muted"},he={class:"flex gap-1 justify-end"},$e={class:"text-center py-12"},Ve={class:"flex justify-center mb-4"},Ue={class:"flex items-center gap-3"},we={key:0,class:"mt-2"},Ae={class:"flex items-center gap-3"},De={key:0,class:"mt-2"},b="#6366f1",He=ee({__name:"tags",async setup(Fe){let y,D;const{data:N,refresh:V}=([y,D]=te(()=>ve("/api/tags","$F3fVqC3Sbv")),y=await y,D(),y),p=oe(),{authState:K}=ae(),I=de(),U=B(()=>N.value?.tags||[]),T=B(()=>I.public.authEnabled?K.value.user?.role==="administrator":!0),L=[{accessorKey:"text",header:"Tag"},{accessorKey:"color",header:"Color"},{accessorKey:"createdAt",header:"Created"},{accessorKey:"actions",header:""}],g=v(!1),F=be({text:z().min(1,"Tag text is required").max(50,"Tag text must be at most 50 characters"),color:z().min(1,"Color is required")}),r=P({text:"",color:b}),x=v(!1),C=v(null),i=P({text:"",color:b});function R(l){C.value=l,i.text=l.text,i.color=l.color,x.value=!0}async function G(){try{await $fetch("/api/tags",{method:"POST",body:r}),p.add({title:"Tag created",description:`Tag "${r.text}" has been created successfully`,color:"success"}),g.value=!1,r.text="",r.color=b,await V()}catch(l){const e=l&&typeof l=="object"&&"data"in l?l.data?.message:void 0;p.add({title:"Failed to create tag",description:e||"An error occurred",color:"error"})}}async function H(){if(C.value)try{await $fetch(`/api/tags/${C.value.id}`,{method:"PUT",body:{text:i.text,color:i.color}}),p.add({title:"Tag updated",description:"Tag has been updated successfully",color:"success"}),x.value=!1,C.value=null,await V()}catch(l){const e=l&&typeof l=="object"&&"data"in l?l.data?.message:void 0;p.add({title:"Failed to update tag",description:e||"An error occurred",color:"error"})}}const _=v(!1),f=v(null);function J(l){f.value=l,_.value=!0}async function Q(){const l=f.value;if(l){_.value=!1,f.value=null;try{await $fetch(`/api/tags/${l.id}`,{method:"DELETE"}),p.add({title:"Tag deleted",description:`Tag "${l.text}" has been deleted`,color:"success"}),await V()}catch(e){const c=e&&typeof e=="object"&&"data"in e?e.data?.message:void 0;p.add({title:"Failed to delete tag",description:c||"An error occurred",color:"error"})}}}return(l,e)=>{const c=ne,k=ue,W=me,E=pe,X=ie,h=ce,$=ge,j=fe,w=xe,Y=se;return d(),A(le,null,[n("div",ye,[t(U).length>0?(d(),u(E,{key:0,title:"Tags",count:t(U).length,help:"settings.tags"},{actions:s(()=>[t(T)?(d(),u(c,{key:0,label:"Add tag",icon:"i-lucide-tag",size:"sm",onClick:e[0]||(e[0]=o=>g.value=!0)})):m("",!0)]),default:s(()=>[a(W,{data:t(U),columns:L},{"text-cell":s(({row:o})=>[a(k,{text:o.original.text,color:o.original.color},null,8,["text","color"])]),"color-cell":s(({row:o})=>[n("div",Te,[n("span",{class:"inline-block w-4 h-4 rounded-full border border-black/10",style:re({backgroundColor:o.original.color})},null,4),n("span",Ce,O(o.original.color),1)])]),"createdAt-cell":s(({row:o})=>[n("span",ke,O(("prettyDateFormat"in l?l.prettyDateFormat:t(_e))(o.original.createdAt,{dateOnly:!0})),1)]),"actions-cell":s(({row:o})=>[n("div",he,[t(T)?(d(),u(c,{key:0,icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm",onClick:Z=>R(o.original)},null,8,["onClick"])):m("",!0),t(T)?(d(),u(c,{key:1,icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",onClick:Z=>J(o.original)},null,8,["onClick"])):m("",!0)])]),_:1},8,["data"])]),_:1},8,["count"])):(d(),u(E,{key:1,title:"Tags",count:0,help:"settings.tags"},{default:s(()=>[n("div",$e,[n("div",Ve,[a(X,{name:"i-lucide-tags",class:"text-4xl text-muted"})]),e[14]||(e[14]=n("h3",{class:"text-lg font-semibold mb-2"},"No tags yet",-1)),e[15]||(e[15]=n("p",{class:"text-muted mb-4"},"Create tags to categorize and filter your projects",-1)),t(T)?(d(),u(c,{key:0,label:"Add tag",icon:"i-lucide-tag",onClick:e[1]||(e[1]=o=>g.value=!0)})):m("",!0)])]),_:1}))]),a(Y,null,{default:s(()=>[a(w,{open:t(g),title:"Add new tag","onUpdate:open":e[6]||(e[6]=o=>g.value=o)},{body:s(()=>[a(j,{schema:t(F),state:t(r)},{default:s(()=>[a($,{label:"Tag text",name:"text",required:"",class:"mb-4"},{default:s(()=>[a(h,{modelValue:t(r).text,"onUpdate:modelValue":e[2]||(e[2]=o=>t(r).text=o),placeholder:"Enter tag name"},null,8,["modelValue"])]),_:1}),a($,{label:"Color",name:"color",required:"",class:"mb-4"},{default:s(()=>[n("div",Ue,[S(n("input",{"onUpdate:modelValue":e[3]||(e[3]=o=>t(r).color=o),type:"color",class:"w-10 h-10 rounded cursor-pointer border border-default","aria-label":"Pick tag color"},null,512),[[q,t(r).color]]),a(h,{modelValue:t(r).color,"onUpdate:modelValue":e[4]||(e[4]=o=>t(r).color=o),class:"flex-1 font-mono",placeholder:"#6366f1"},null,8,["modelValue"])])]),_:1}),t(r).text?(d(),A("div",we,[e[16]||(e[16]=n("span",{class:"text-sm text-muted mr-2"},"Preview:",-1)),a(k,{text:t(r).text,color:t(r).color||b},null,8,["text","color"])])):m("",!0)]),_:1},8,["schema","state"])]),footer:s(()=>[a(c,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:e[5]||(e[5]=o=>g.value=!1)}),a(c,{type:"submit",label:"Create tag",icon:"i-lucide-tag",onClick:G})]),_:1},8,["open"]),a(w,{open:t(x),title:"Edit tag","onUpdate:open":e[11]||(e[11]=o=>x.value=o)},{body:s(()=>[a(j,{schema:t(F),state:t(i)},{default:s(()=>[a($,{label:"Tag text",name:"text",required:"",class:"mb-4"},{default:s(()=>[a(h,{modelValue:t(i).text,"onUpdate:modelValue":e[7]||(e[7]=o=>t(i).text=o),placeholder:"Enter tag name"},null,8,["modelValue"])]),_:1}),a($,{label:"Color",name:"color",required:"",class:"mb-4"},{default:s(()=>[n("div",Ae,[S(n("input",{"onUpdate:modelValue":e[8]||(e[8]=o=>t(i).color=o),type:"color",class:"w-10 h-10 rounded cursor-pointer border border-default","aria-label":"Pick tag color"},null,512),[[q,t(i).color]]),a(h,{modelValue:t(i).color,"onUpdate:modelValue":e[9]||(e[9]=o=>t(i).color=o),class:"flex-1 font-mono",placeholder:"#6366f1"},null,8,["modelValue"])])]),_:1}),t(i).text?(d(),A("div",De,[e[17]||(e[17]=n("span",{class:"text-sm text-muted mr-2"},"Preview:",-1)),a(k,{text:t(i).text,color:t(i).color||b},null,8,["text","color"])])):m("",!0)]),_:1},8,["schema","state"])]),footer:s(()=>[a(c,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:e[10]||(e[10]=o=>x.value=!1)}),a(c,{type:"submit",label:"Save changes",icon:"i-lucide-check",onClick:H})]),_:1},8,["open"]),a(w,{open:t(_),title:"Delete tag","onUpdate:open":e[13]||(e[13]=o=>_.value=o)},{body:s(()=>[n("p",null,[e[18]||(e[18]=M(" Are you sure you want to delete tag ",-1)),t(f)?(d(),u(k,{key:0,text:t(f).text,color:t(f).color,class:"inline-flex"},null,8,["text","color"])):m("",!0),e[19]||(e[19]=M("? It will be removed from all projects. ",-1))])]),footer:s(()=>[a(c,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[12]||(e[12]=o=>_.value=!1)}),a(c,{color:"error",label:"Delete",icon:"i-lucide-trash-2",onClick:Q})]),_:1},8,["open"])]),_:1})],64)}}});export{He as default};