@piwitests/server 0.26.0 → 0.26.1

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 (382) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BdQ7kfxJ.js → 1QWBzxLM.js} +4 -4
  3. package/.output/public/_nuxt/{CY1UsEbI.js → 4hW9LHwA.js} +1 -1
  4. package/.output/public/_nuxt/96uxfdYT.js +1 -0
  5. package/.output/public/_nuxt/{HGYIpJtg.js → AbnDY6Zr.js} +1 -1
  6. package/.output/public/_nuxt/{CZ6WR7uw.js → B-1zt4pp.js} +1 -1
  7. package/.output/public/_nuxt/{Sx5-c-bZ.js → B1iYmAt_.js} +1 -1
  8. package/.output/public/_nuxt/{CbzgEkmW.js → B2bxEmbR.js} +1 -1
  9. package/.output/public/_nuxt/B3hAvaCe.js +4 -0
  10. package/.output/public/_nuxt/{CyWOerIG.js → B4lvHjBe.js} +1 -1
  11. package/.output/public/_nuxt/B5S7BkC3.js +1 -0
  12. package/.output/public/_nuxt/{Bb_1uAHn.js → B6j5Ornu.js} +1 -1
  13. package/.output/public/_nuxt/{CrsaY0R_.js → B82vqOZe.js} +1 -1
  14. package/.output/public/_nuxt/{CTFUlsXp.js → B9oXlGro.js} +1 -1
  15. package/.output/public/_nuxt/{CsJ9Ce4U.js → BABCH5kE.js} +1 -1
  16. package/.output/public/_nuxt/{Gn1Ns00e.js → BF5qB58w.js} +1 -1
  17. package/.output/public/_nuxt/{CsGsLxHg.js → BFLa9ZEP.js} +1 -1
  18. package/.output/public/_nuxt/BIlohx1E.js +1 -0
  19. package/.output/public/_nuxt/{B6djubIK.js → BM5C-Oec.js} +1 -1
  20. package/.output/public/_nuxt/{CrZhoZuI.js → BOA-I6S9.js} +1 -1
  21. package/.output/public/_nuxt/{Bp2zrrkV.js → BQUhoGCh.js} +1 -1
  22. package/.output/public/_nuxt/{DUC3QnqW.js → BQYLGX9o.js} +1 -1
  23. package/.output/public/_nuxt/{CUjzhXN1.js → BRMeEHXd.js} +1 -1
  24. package/.output/public/_nuxt/{Cf_a8ynB.js → BRtaKOKv.js} +2 -2
  25. package/.output/public/_nuxt/{B7uPoZ7T.js → BS91Og__.js} +1 -1
  26. package/.output/public/_nuxt/{DKgbchez.js → BTGAvMoT.js} +1 -1
  27. package/.output/public/_nuxt/{BIamiwb7.js → BaLX92Wz.js} +1 -1
  28. package/.output/public/_nuxt/{LWIyaZKe.js → Bc6Zr-Xn.js} +1 -1
  29. package/.output/public/_nuxt/{R7AVOWi_.js → BceMEnJt.js} +1 -1
  30. package/.output/public/_nuxt/{Q2oJNyXL.js → BeCAVtCK.js} +1 -1
  31. package/.output/public/_nuxt/{D_SD71Qf.js → Bf119e7x.js} +1 -1
  32. package/.output/public/_nuxt/BfRcdz11.js +9 -0
  33. package/.output/public/_nuxt/{CxwnFFD0.js → Bl0xzETD.js} +1 -1
  34. package/.output/public/_nuxt/{C_eXufkv.js → BnUQ3i5l.js} +1 -1
  35. package/.output/public/_nuxt/{rPG7kzfL.js → Bp1WeQ0_.js} +1 -1
  36. package/.output/public/_nuxt/{BL8cYWsR.js → Bp31ZRcA.js} +1 -1
  37. package/.output/public/_nuxt/{Drh1_ASq.js → BrxUH8qL.js} +1 -1
  38. package/.output/public/_nuxt/{D72Ce8Ff.js → BsdfEbVC.js} +1 -1
  39. package/.output/public/_nuxt/BtGI4ZbP.js +1 -0
  40. package/.output/public/_nuxt/{BV8EzO8q.js → BuMX-4RF.js} +1 -1
  41. package/.output/public/_nuxt/{DPPhFZOr.js → BuXJR5tn.js} +1 -1
  42. package/.output/public/_nuxt/{Bh2WA4IJ.js → Bx_lfKHl.js} +1 -1
  43. package/.output/public/_nuxt/{vcSKeWsW.js → C4UKyPQn.js} +1 -1
  44. package/.output/public/_nuxt/{IoE3eJ9F.js → C9XCTbtQ.js} +1 -1
  45. package/.output/public/_nuxt/{BilJoEne.js → CEPU6VkU.js} +1 -1
  46. package/.output/public/_nuxt/CHz7LJIX.js +1 -0
  47. package/.output/public/_nuxt/{BPhGDGAR.js → CMhd8IBr.js} +1 -1
  48. package/.output/public/_nuxt/{C5X_N4R7.js → CN1M6i4K.js} +33 -33
  49. package/.output/public/_nuxt/CQLkowA3.js +1 -0
  50. package/.output/public/_nuxt/{DTtizz85.js → CU_2YLhT.js} +1 -1
  51. package/.output/public/_nuxt/{CMVTTE_g.js → CXkXHtcx.js} +1 -1
  52. package/.output/public/_nuxt/{igDJCTgt.js → CZeKW-zP.js} +1 -1
  53. package/.output/public/_nuxt/{9oKY4Zb7.js → CapSEET7.js} +1 -1
  54. package/.output/public/_nuxt/{j2eGYaRa.js → CeExxGSu.js} +1 -1
  55. package/.output/public/_nuxt/{CEgRB8H9.js → CfwpqSe7.js} +1 -1
  56. package/.output/public/_nuxt/{CFKbXp6V.js → ChOtLYkd.js} +1 -1
  57. package/.output/public/_nuxt/ChuJzPWz.js +1 -0
  58. package/.output/public/_nuxt/{Bo73sAu8.js → CiCUZGFZ.js} +1 -1
  59. package/.output/public/_nuxt/{C6R4tyud.js → CkL_oDa8.js} +1 -1
  60. package/.output/public/_nuxt/{DtGJeysS.js → CkhOMiiO.js} +1 -1
  61. package/.output/public/_nuxt/ClmHMP65.js +2 -0
  62. package/.output/public/_nuxt/{BtcDY0Du.js → Cnm0d_7S.js} +1 -1
  63. package/.output/public/_nuxt/{CK2AMqz_.js → CtQMagSz.js} +1 -1
  64. package/.output/public/_nuxt/{B1KjIR-q.js → Ctnn3S3-.js} +1 -1
  65. package/.output/public/_nuxt/{DCeZxpxe.js → CywiLuOD.js} +4 -4
  66. package/.output/public/_nuxt/{oA84LLqO.js → CzRkZLB4.js} +1 -1
  67. package/.output/public/_nuxt/CzyCEdYP.js +1 -0
  68. package/.output/public/_nuxt/{D56yp7m9.js → D-F0Rhjj.js} +1 -1
  69. package/.output/public/_nuxt/D4mPjHHR.js +2 -0
  70. package/.output/public/_nuxt/{BsGvSoPC.js → D4v7lLm3.js} +1 -1
  71. package/.output/public/_nuxt/{CxRTKV-K.js → D6B0WKO0.js} +1 -1
  72. package/.output/public/_nuxt/{jv8U_Tup.js → DAg6jtav.js} +1 -1
  73. package/.output/public/_nuxt/DBXXb0w8.js +1 -0
  74. package/.output/public/_nuxt/{ChlP20A5.js → DHN2t5Vt.js} +1 -1
  75. package/.output/public/_nuxt/{B8tezsWe.js → DJKHXfNS.js} +1 -1
  76. package/.output/public/_nuxt/{CFg5qdS0.js → DMqAUHFN.js} +1 -1
  77. package/.output/public/_nuxt/{C9A3sPDo.js → DURme_kn.js} +1 -1
  78. package/.output/public/_nuxt/{C2hIM5f9.js → DVo_e_uj.js} +1 -1
  79. package/.output/public/_nuxt/{DKhqIou2.js → DXh8q5KY.js} +1 -1
  80. package/.output/public/_nuxt/{CZXeJs2k.js → DXz1Kb4-.js} +1 -1
  81. package/.output/public/_nuxt/{CPrVhXJk.js → DYdwHaco.js} +1 -1
  82. package/.output/public/_nuxt/{WZXZeGYt.js → D_ZAGxCQ.js} +1 -1
  83. package/.output/public/_nuxt/{D5SN7rPK.js → D_dhjJvR.js} +1 -1
  84. package/.output/public/_nuxt/{DR1jFptD.js → DamZHy5M.js} +1 -1
  85. package/.output/public/_nuxt/{xKX9IHe3.js → DbtjJCra.js} +1 -1
  86. package/.output/public/_nuxt/{r6zkA1SE.js → DcOlL-oi.js} +1 -1
  87. package/.output/public/_nuxt/{CxspCKpR.js → DeQ9sIia.js} +1 -1
  88. package/.output/public/_nuxt/{BkHJoHpc.js → DjX1bLZD.js} +1 -1
  89. package/.output/public/_nuxt/{Be0bwdsi.js → Dly7wCCl.js} +1 -1
  90. package/.output/public/_nuxt/DmeogbGY.js +1 -0
  91. package/.output/public/_nuxt/{CfV2N201.js → Dn_-RkxP.js} +1 -1
  92. package/.output/public/_nuxt/{dg6uXTyR.js → DoDo3VF2.js} +1 -1
  93. package/.output/public/_nuxt/{BMlKQMjM.js → DoVHTl-K.js} +1 -1
  94. package/.output/public/_nuxt/DpM8IgHL.js +1 -0
  95. package/.output/public/_nuxt/{B4NjylBn.js → Dpwj_1H5.js} +1 -1
  96. package/.output/public/_nuxt/{DzJa19LG.js → DvSHenmZ.js} +1 -1
  97. package/.output/public/_nuxt/DvYU87_a.js +1 -0
  98. package/.output/public/_nuxt/{G2J1dVVb.js → Dx41arC8.js} +1 -1
  99. package/.output/public/_nuxt/DxBrlj7b.js +1 -0
  100. package/.output/public/_nuxt/{r-HZNbp3.js → JNpNdV-o.js} +1 -1
  101. package/.output/public/_nuxt/Lz9MmwKY.js +1 -0
  102. package/.output/public/_nuxt/OMI0cmZ0.js +1 -0
  103. package/.output/public/_nuxt/{CUWrUpTl.js → UAmyrRCI.js} +1 -1
  104. package/.output/public/_nuxt/{EJllK0wm.js → VBTxfbqU.js} +1 -1
  105. package/.output/public/_nuxt/VbedPPFH.js +1 -0
  106. package/.output/public/_nuxt/{BY9A1aOT.js → _okd7MfH.js} +1 -1
  107. package/.output/public/_nuxt/{BOn5q0rT.js → bmAf49LT.js} +1 -1
  108. package/.output/public/_nuxt/builds/latest.json +1 -1
  109. package/.output/public/_nuxt/builds/meta/0174ebd8-8fa5-4698-aa79-7a8dd2f6527f.json +1 -0
  110. package/.output/public/_nuxt/{D0XWJGhG.js → e-GZmCeP.js} +1 -1
  111. package/.output/public/_nuxt/entry.Dv52uAyn.css +1 -0
  112. package/.output/public/_nuxt/{DVIIj6Vv.js → f9TbT3AM.js} +1 -1
  113. package/.output/public/_nuxt/gdlHFfN6.js +1 -0
  114. package/.output/public/_nuxt/{BTG_PmM5.js → huBoAZeM.js} +1 -1
  115. package/.output/public/_nuxt/{DadksxQ9.js → mYw4b7uY.js} +1 -1
  116. package/.output/public/_nuxt/{B0eHOux4.js → mi7tdFxN.js} +1 -1
  117. package/.output/public/_nuxt/sFe4Zr5j.js +1 -0
  118. package/.output/public/_nuxt/{CLrLFf3s.js → uspGXbik.js} +1 -1
  119. package/.output/public/_nuxt/{DLN-CQXF.js → w7KxwWEv.js} +1 -1
  120. package/.output/public/_nuxt/{Bp55g9gr.js → wa4k1aDz.js} +1 -1
  121. package/.output/public/_nuxt/{C2yZcDch.js → xuB8n0QL.js} +1 -1
  122. package/.output/public/favicon.ico +0 -0
  123. package/.output/public/trace-viewer/assets/codeMirrorModule-LEHpjmcn.js +32 -0
  124. package/.output/public/trace-viewer/assets/defaultSettingsView-BNmKHKpQ.js +264 -0
  125. package/.output/public/trace-viewer/assets/urlMatch-BYQrIQwR.js +1 -0
  126. package/.output/public/trace-viewer/assets/xtermModule-CsJ4vdCR.js +9 -0
  127. package/.output/public/trace-viewer/codeMirrorModule.DYBRYzYX.css +1 -0
  128. package/.output/public/trace-viewer/codicon.DCmgc-ay.ttf +0 -0
  129. package/.output/public/trace-viewer/defaultSettingsView.CjdS-WJx.css +1 -0
  130. package/.output/public/trace-viewer/index.CzXZzn5A.css +1 -0
  131. package/.output/public/trace-viewer/index.DMMX1gXU.js +2 -0
  132. package/.output/public/trace-viewer/index.html +44 -0
  133. package/.output/public/trace-viewer/manifest.webmanifest +16 -0
  134. package/.output/public/trace-viewer/playwright-logo.svg +9 -0
  135. package/.output/public/trace-viewer/snapshot.html +10 -0
  136. package/.output/public/trace-viewer/snapshot.v8KI4P3m.js +2 -0
  137. package/.output/public/trace-viewer/sw.bundle.js +5 -0
  138. package/.output/public/trace-viewer/uiMode.BZQ54Kgt.css +1 -0
  139. package/.output/public/trace-viewer/uiMode.Ut8wwJNp.js +6 -0
  140. package/.output/public/trace-viewer/uiMode.html +18 -0
  141. package/.output/public/trace-viewer/xtermModule.DYP7pi_n.css +32 -0
  142. package/.output/server/chunks/_/users.mjs +1 -1
  143. package/.output/server/chunks/build/{BreadcrumbNav-DBnGj5Jq.mjs → BreadcrumbNav-Bg4QGX0k.mjs} +11 -4
  144. package/.output/server/chunks/build/BreadcrumbNav-Bg4QGX0k.mjs.map +1 -0
  145. package/.output/server/chunks/build/{BrowserBadge-vFb1ERG_.mjs → BrowserBadge-yMgLTBUu.mjs} +17 -9
  146. package/.output/server/chunks/build/BrowserBadge-yMgLTBUu.mjs.map +1 -0
  147. package/.output/server/chunks/build/{ChartMarkerLines-BXqUpUcs.mjs → ChartMarkerLines-D0cTRlxF.mjs} +3 -3
  148. package/.output/server/chunks/build/ChartMarkerLines-D0cTRlxF.mjs.map +1 -0
  149. package/.output/server/chunks/build/{ChartTooltip-DoF6Smyc.mjs → ChartTooltip-B2t6VYYH.mjs} +3 -3
  150. package/.output/server/chunks/build/ChartTooltip-B2t6VYYH.mjs.map +1 -0
  151. package/.output/server/chunks/build/Checkbox-ChSYhiUz.mjs +1 -1
  152. package/.output/server/chunks/build/ClientDate-U97Z1p6-.mjs +32 -0
  153. package/.output/server/chunks/build/ClientDate-U97Z1p6-.mjs.map +1 -0
  154. package/.output/server/chunks/build/{CodeBlock-CmvKHaq8.mjs → CodeBlock-DuWhmcI2.mjs} +3 -3
  155. package/.output/server/chunks/build/CodeBlock-DuWhmcI2.mjs.map +1 -0
  156. package/.output/server/chunks/build/DashboardSidebarToggle-a5KYecZ0.mjs +1 -1
  157. package/.output/server/chunks/build/DashboardToolbar-BZoGc0ri.mjs +72 -0
  158. package/.output/server/chunks/build/DashboardToolbar-BZoGc0ri.mjs.map +1 -0
  159. package/.output/server/chunks/build/{DataLocationCard-ChV02QJj.mjs → DataLocationCard-DCdhQBIY.mjs} +2 -2
  160. package/.output/server/chunks/build/DataLocationCard-DCdhQBIY.mjs.map +1 -0
  161. package/.output/server/chunks/build/{DesktopRunLocallyButton-BfmbZpiL.mjs → DesktopRunLocallyButton-ChHg3GqK.mjs} +5 -5
  162. package/.output/server/chunks/build/{DesktopRunLocallyButton-BfmbZpiL.mjs.map → DesktopRunLocallyButton-ChHg3GqK.mjs.map} +1 -1
  163. package/.output/server/chunks/build/{DiagnosisPanel-C_ndadzP.mjs → DiagnosisPanel-DE-r2UV8.mjs} +5 -5
  164. package/.output/server/chunks/build/DiagnosisPanel-DE-r2UV8.mjs.map +1 -0
  165. package/.output/server/chunks/build/{DiagnosisResult-GAjo6Lt3.mjs → DiagnosisResult-CrGK--xh.mjs} +16 -10
  166. package/.output/server/chunks/build/DiagnosisResult-CrGK--xh.mjs.map +1 -0
  167. package/.output/server/chunks/build/{DurationValue-CObiBDnH.mjs → DurationValue-Dn06XQk3.mjs} +2 -2
  168. package/.output/server/chunks/build/DurationValue-Dn06XQk3.mjs.map +1 -0
  169. package/.output/server/chunks/build/EntityLinks-BcpvMt_V.mjs +1 -1
  170. package/.output/server/chunks/build/EnvManagedBadge-_8GfjWjE.mjs +1 -1
  171. package/.output/server/chunks/build/{FeatureUnavailable-Buoyoqx1.mjs → FeatureUnavailable-IaBjVCqQ.mjs} +2 -2
  172. package/.output/server/chunks/build/FeatureUnavailable-IaBjVCqQ.mjs.map +1 -0
  173. package/.output/server/chunks/build/{GetStartedWizard-tL3U_qM1.mjs → GetStartedWizard-BiyxEXWP.mjs} +3 -3
  174. package/.output/server/chunks/build/GetStartedWizard-BiyxEXWP.mjs.map +1 -0
  175. package/.output/server/chunks/build/{HelpHint-C96TlqxY.mjs → HelpHint-CdBz6deq.mjs} +2 -2
  176. package/.output/server/chunks/build/HelpHint-CdBz6deq.mjs.map +1 -0
  177. package/.output/server/chunks/build/{MetaStripGroup-Cp2WCQf7.mjs → MetaStripGroup-CDyGlsNt.mjs} +94 -21
  178. package/.output/server/chunks/build/MetaStripGroup-CDyGlsNt.mjs.map +1 -0
  179. package/.output/server/chunks/build/{NavbarActions-VCHW0u67.mjs → NavbarActions-BTWxKCVI.mjs} +2 -2
  180. package/.output/server/chunks/build/NavbarActions-BTWxKCVI.mjs.map +1 -0
  181. package/.output/server/chunks/build/NavigationMenu-D4ZpdCm_.mjs +1 -1
  182. package/.output/server/chunks/build/OpenInIdeLink-Bnl-_som.mjs +1 -1
  183. package/.output/server/chunks/build/{ProjectTestCasesTable-saHYJoyQ.mjs → ProjectTestCasesTable-DJDAZ9NQ.mjs} +9 -9
  184. package/.output/server/chunks/build/ProjectTestCasesTable-DJDAZ9NQ.mjs.map +1 -0
  185. package/.output/server/chunks/build/{RunReports-CKYYRC59.mjs → RunReports-BSo2cCNx.mjs} +4 -4
  186. package/.output/server/chunks/build/RunReports-BSo2cCNx.mjs.map +1 -0
  187. package/.output/server/chunks/build/{RunStatusBadge-CWhmAmKb.mjs → RunStatusBadge-zfeSwcTx.mjs} +2 -2
  188. package/.output/server/chunks/build/RunStatusBadge-zfeSwcTx.mjs.map +1 -0
  189. package/.output/server/chunks/build/{SectionCard-BB1O3uXd.mjs → SectionCard-CKD1s0eF.mjs} +2 -2
  190. package/.output/server/chunks/build/SectionCard-CKD1s0eF.mjs.map +1 -0
  191. package/.output/server/chunks/build/Select-COU8NARj.mjs +1 -1
  192. package/.output/server/chunks/build/SelectMenu-BUwwc3Qt.mjs +1 -1
  193. package/.output/server/chunks/build/{SettingsField-CEasBHu3.mjs → SettingsField-CDnUtiCM.mjs} +3 -3
  194. package/.output/server/chunks/build/SettingsField-CDnUtiCM.mjs.map +1 -0
  195. package/.output/server/chunks/build/Table-BET-DOtX.mjs +1 -1
  196. package/.output/server/chunks/build/{TestCaseHistoryChart-BgI6P_zS.mjs → TestCaseHistoryChart-Do7WK-ZY.mjs} +16 -17
  197. package/.output/server/chunks/build/TestCaseHistoryChart-Do7WK-ZY.mjs.map +1 -0
  198. package/.output/server/chunks/build/{TestStatusBar-DR8jM5th.mjs → TestStatusBar-BipoEOzd.mjs} +15 -6
  199. package/.output/server/chunks/build/TestStatusBar-BipoEOzd.mjs.map +1 -0
  200. package/.output/server/chunks/build/Tooltip-CK0ucuXC.mjs +1 -1
  201. package/.output/server/chunks/build/{_id_-rQhFY0fN.mjs → _id_-BLPB189b.mjs} +16 -16
  202. package/.output/server/chunks/build/{_id_-rQhFY0fN.mjs.map → _id_-BLPB189b.mjs.map} +1 -1
  203. package/.output/server/chunks/build/{_id_-kkexEH_q.mjs → _id_-BeGJOSxY.mjs} +16 -16
  204. package/.output/server/chunks/build/_id_-BeGJOSxY.mjs.map +1 -0
  205. package/.output/server/chunks/build/{_id_-B7Dw490u.mjs → _id_-CfLEW45H.mjs} +472 -304
  206. package/.output/server/chunks/build/_id_-CfLEW45H.mjs.map +1 -0
  207. package/.output/server/chunks/build/{_id_-DVPb1S93.mjs → _id_-DxHe32cW.mjs} +654 -453
  208. package/.output/server/chunks/build/_id_-DxHe32cW.mjs.map +1 -0
  209. package/.output/server/chunks/build/{about-C4AbyQ4q.mjs → about-FLAssVsA.mjs} +5 -5
  210. package/.output/server/chunks/build/about-FLAssVsA.mjs.map +1 -0
  211. package/.output/server/chunks/build/{account-B45bYZd1.mjs → account-Cvz6KkYu.mjs} +4 -4
  212. package/.output/server/chunks/build/account-Cvz6KkYu.mjs.map +1 -0
  213. package/.output/server/chunks/build/{ai-CgN9xXFf.mjs → ai-DR9Zry7B.mjs} +8 -8
  214. package/.output/server/chunks/build/{ai-CgN9xXFf.mjs.map → ai-DR9Zry7B.mjs.map} +1 -1
  215. package/.output/server/chunks/build/{analytics-BRkiUpwa.mjs → analytics-CCAQayhv.mjs} +9 -9
  216. package/.output/server/chunks/build/{analytics-BRkiUpwa.mjs.map → analytics-CCAQayhv.mjs.map} +1 -1
  217. package/.output/server/chunks/build/{auto-heal-BnTdKHQq.mjs → auto-heal-ngiiiVmq.mjs} +4 -4
  218. package/.output/server/chunks/build/auto-heal-ngiiiVmq.mjs.map +1 -0
  219. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  220. package/.output/server/chunks/build/{default-BGOdM_zA.mjs → default-wYpdMMvh.mjs} +15 -13
  221. package/.output/server/chunks/build/{default-BGOdM_zA.mjs.map → default-wYpdMMvh.mjs.map} +1 -1
  222. package/.output/server/chunks/build/{docs-D7R5eJ1Z.mjs → docs-BX9DoKOI.mjs} +4 -4
  223. package/.output/server/chunks/build/{docs-D7R5eJ1Z.mjs.map → docs-BX9DoKOI.mjs.map} +1 -1
  224. package/.output/server/chunks/build/{edit-BbL3k6c3.mjs → edit-DnyBC4uC.mjs} +7 -7
  225. package/.output/server/chunks/build/{edit-BbL3k6c3.mjs.map → edit-DnyBC4uC.mjs.map} +1 -1
  226. package/.output/server/chunks/build/fetch-DOcN2mHf.mjs +1 -1
  227. package/.output/server/chunks/build/{help-content-BK3jcgLw.mjs → help-content-3QLSe6Vd.mjs} +3 -3
  228. package/.output/server/chunks/build/help-content-3QLSe6Vd.mjs.map +1 -0
  229. package/.output/server/chunks/build/{import-ibAn_HB9.mjs → import-S-w3MXez.mjs} +8 -8
  230. package/.output/server/chunks/build/import-S-w3MXez.mjs.map +1 -0
  231. package/.output/server/chunks/build/{index-D5A0DW7Y.mjs → index-BFr7JW_2.mjs} +4 -4
  232. package/.output/server/chunks/build/index-BFr7JW_2.mjs.map +1 -0
  233. package/.output/server/chunks/build/{index-CqinXTVs.mjs → index-CdzYiYiu.mjs} +9 -9
  234. package/.output/server/chunks/build/{index-CqinXTVs.mjs.map → index-CdzYiYiu.mjs.map} +1 -1
  235. package/.output/server/chunks/build/{index-DreB_S-d.mjs → index-CgYJur1z.mjs} +31 -23
  236. package/.output/server/chunks/build/index-CgYJur1z.mjs.map +1 -0
  237. package/.output/server/chunks/build/{index-2GmuPNF-.mjs → index-CjnZ521K.mjs} +22 -4
  238. package/.output/server/chunks/build/index-CjnZ521K.mjs.map +1 -0
  239. package/.output/server/chunks/build/{index-KsRegEjT.mjs → index-xgA4P1ht.mjs} +3218 -4087
  240. package/.output/server/chunks/build/index-xgA4P1ht.mjs.map +1 -0
  241. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs +1 -1
  242. package/.output/server/chunks/build/login-DueFS2RU.mjs +1 -1
  243. package/.output/server/chunks/build/{mcp-Dwj29-uG.mjs → mcp-DlZzubUF.mjs} +7 -7
  244. package/.output/server/chunks/build/mcp-DlZzubUF.mjs.map +1 -0
  245. package/.output/server/chunks/build/{notifications-CjAn5FJj.mjs → notifications-ByPVhyPX.mjs} +6 -6
  246. package/.output/server/chunks/build/notifications-ByPVhyPX.mjs.map +1 -0
  247. package/.output/server/chunks/build/{performance-DRzcu_c7.mjs → performance-Dc9FhaJr.mjs} +6 -6
  248. package/.output/server/chunks/build/performance-Dc9FhaJr.mjs.map +1 -0
  249. package/.output/server/chunks/build/{pr-feedback-DR60oGBf.mjs → pr-feedback-5kC_UmKG.mjs} +4 -4
  250. package/.output/server/chunks/build/pr-feedback-5kC_UmKG.mjs.map +1 -0
  251. package/.output/server/chunks/build/{selections-BjjolRZ9.mjs → selections-C6J9mI0s.mjs} +9 -9
  252. package/.output/server/chunks/build/selections-C6J9mI0s.mjs.map +1 -0
  253. package/.output/server/chunks/build/server.mjs +33 -33
  254. package/.output/server/chunks/build/{settings-B3NWV9tu.mjs → settings-DcCAv0U4.mjs} +17 -81
  255. package/.output/server/chunks/build/settings-DcCAv0U4.mjs.map +1 -0
  256. package/.output/server/chunks/build/{settings-metadata-DwJk8uSt.mjs → settings-metadata-B684YiW4.mjs} +2 -2
  257. package/.output/server/chunks/build/settings-metadata-B684YiW4.mjs.map +1 -0
  258. package/.output/server/chunks/build/{setup-BlgFTixN.mjs → setup-Cf3Mzf-W.mjs} +8 -8
  259. package/.output/server/chunks/build/{setup-BlgFTixN.mjs.map → setup-Cf3Mzf-W.mjs.map} +1 -1
  260. package/.output/server/chunks/build/{storage-C1O-FC0U.mjs → storage-B4VySiv3.mjs} +7 -7
  261. package/.output/server/chunks/build/storage-B4VySiv3.mjs.map +1 -0
  262. package/.output/server/chunks/build/{tags-dsvYrnii.mjs → tags-BvWdsd1F.mjs} +25 -11
  263. package/.output/server/chunks/build/tags-BvWdsd1F.mjs.map +1 -0
  264. package/.output/server/chunks/build/{test-cases-CFiOuyK6.mjs → test-cases-LIIu7dMu.mjs} +11 -11
  265. package/.output/server/chunks/build/test-cases-LIIu7dMu.mjs.map +1 -0
  266. package/.output/server/chunks/build/{test-functions-CbmBi6az.mjs → test-functions-Dv8nezrM.mjs} +8 -8
  267. package/.output/server/chunks/build/test-functions-Dv8nezrM.mjs.map +1 -0
  268. package/.output/server/chunks/build/{useCopyRich-DPKZKHvZ.mjs → useCopyRich-DRRKIts2.mjs} +17 -14
  269. package/.output/server/chunks/build/{useCopyRich-DPKZKHvZ.mjs.map → useCopyRich-DRRKIts2.mjs.map} +1 -1
  270. package/.output/server/chunks/build/{useDesktopDownload-R_RWSgUV.mjs → useDesktopDownload-CK-5nATq.mjs} +2 -2
  271. package/.output/server/chunks/build/useDesktopDownload-CK-5nATq.mjs.map +1 -0
  272. package/.output/server/chunks/build/{useDesktopLocalRuns-BdELBy0Y.mjs → useDesktopLocalRuns-BHZic4MJ.mjs} +3 -3
  273. package/.output/server/chunks/build/useDesktopLocalRuns-BHZic4MJ.mjs.map +1 -0
  274. package/.output/server/chunks/build/{useDesktopProjectLink-IUN7SIP2.mjs → useDesktopProjectLink-CqBvnXwG.mjs} +2 -2
  275. package/.output/server/chunks/build/useDesktopProjectLink-CqBvnXwG.mjs.map +1 -0
  276. package/.output/server/chunks/build/useOpenInIde-DS4YXevu.mjs +1 -1
  277. package/.output/server/chunks/build/{useSettingsNav-Dg87E7kY.mjs → useSettingsNav-dyHz-2Bz.mjs} +2 -2
  278. package/.output/server/chunks/build/useSettingsNav-dyHz-2Bz.mjs.map +1 -0
  279. package/.output/server/chunks/build/{users-DgsoiXxQ.mjs → users-CluLB8DL.mjs} +31 -13
  280. package/.output/server/chunks/build/users-CluLB8DL.mjs.map +1 -0
  281. package/.output/server/chunks/nitro/nitro.mjs +839 -680
  282. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  283. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +5 -2
  284. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  286. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  287. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +42 -26
  288. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  292. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  294. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  297. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +1 -1
  299. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +1 -0
  300. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  302. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  303. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  304. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  306. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  307. package/.output/server/chunks/routes/renderer.mjs +1 -1
  308. package/.output/server/chunks/routes/share/_token_.get.mjs +1 -1
  309. package/.output/server/index.mjs +1 -1
  310. package/.output/server/package.json +1 -1
  311. package/package.json +1 -1
  312. package/.output/public/_nuxt/3HmftUHT.js +0 -1
  313. package/.output/public/_nuxt/B7zo6PK8.js +0 -1
  314. package/.output/public/_nuxt/BO4sfkbw.js +0 -1
  315. package/.output/public/_nuxt/BdyXNI2_.js +0 -1
  316. package/.output/public/_nuxt/Bg63qh8W.js +0 -1
  317. package/.output/public/_nuxt/BnhWd06P.js +0 -1
  318. package/.output/public/_nuxt/CHWW6xiX.js +0 -1
  319. package/.output/public/_nuxt/CIPvUOic.js +0 -2
  320. package/.output/public/_nuxt/CVcFbORW.js +0 -9
  321. package/.output/public/_nuxt/CZlz5y13.js +0 -1
  322. package/.output/public/_nuxt/CkV_UG8j.js +0 -1
  323. package/.output/public/_nuxt/D0TpBpCc.js +0 -1
  324. package/.output/public/_nuxt/D3LyIeiJ.js +0 -1
  325. package/.output/public/_nuxt/DcccidY5.js +0 -4
  326. package/.output/public/_nuxt/DqkCbAzo.js +0 -1
  327. package/.output/public/_nuxt/DwH4SIZE.js +0 -1
  328. package/.output/public/_nuxt/DwZS0oRm.js +0 -2
  329. package/.output/public/_nuxt/DxPZIuWy.js +0 -1
  330. package/.output/public/_nuxt/Dyb1FouX.js +0 -1
  331. package/.output/public/_nuxt/builds/meta/a5fb24cc-65e3-4e55-aa12-038fe2de4754.json +0 -1
  332. package/.output/public/_nuxt/entry.BFe0Ua9k.css +0 -1
  333. package/.output/public/_nuxt/i7znB42v.js +0 -1
  334. package/.output/server/chunks/build/BreadcrumbNav-DBnGj5Jq.mjs.map +0 -1
  335. package/.output/server/chunks/build/BrowserBadge-vFb1ERG_.mjs.map +0 -1
  336. package/.output/server/chunks/build/ChartMarkerLines-BXqUpUcs.mjs.map +0 -1
  337. package/.output/server/chunks/build/ChartTooltip-DoF6Smyc.mjs.map +0 -1
  338. package/.output/server/chunks/build/CodeBlock-CmvKHaq8.mjs.map +0 -1
  339. package/.output/server/chunks/build/DataLocationCard-ChV02QJj.mjs.map +0 -1
  340. package/.output/server/chunks/build/DiagnosisPanel-C_ndadzP.mjs.map +0 -1
  341. package/.output/server/chunks/build/DiagnosisResult-GAjo6Lt3.mjs.map +0 -1
  342. package/.output/server/chunks/build/DurationValue-CObiBDnH.mjs.map +0 -1
  343. package/.output/server/chunks/build/FeatureUnavailable-Buoyoqx1.mjs.map +0 -1
  344. package/.output/server/chunks/build/GetStartedWizard-tL3U_qM1.mjs.map +0 -1
  345. package/.output/server/chunks/build/HelpHint-C96TlqxY.mjs.map +0 -1
  346. package/.output/server/chunks/build/MetaStripGroup-Cp2WCQf7.mjs.map +0 -1
  347. package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +0 -1
  348. package/.output/server/chunks/build/ProjectTestCasesTable-saHYJoyQ.mjs.map +0 -1
  349. package/.output/server/chunks/build/RunReports-CKYYRC59.mjs.map +0 -1
  350. package/.output/server/chunks/build/RunStatusBadge-CWhmAmKb.mjs.map +0 -1
  351. package/.output/server/chunks/build/SectionCard-BB1O3uXd.mjs.map +0 -1
  352. package/.output/server/chunks/build/SettingsField-CEasBHu3.mjs.map +0 -1
  353. package/.output/server/chunks/build/TestCaseHistoryChart-BgI6P_zS.mjs.map +0 -1
  354. package/.output/server/chunks/build/TestStatusBar-DR8jM5th.mjs.map +0 -1
  355. package/.output/server/chunks/build/_id_-B7Dw490u.mjs.map +0 -1
  356. package/.output/server/chunks/build/_id_-DVPb1S93.mjs.map +0 -1
  357. package/.output/server/chunks/build/_id_-kkexEH_q.mjs.map +0 -1
  358. package/.output/server/chunks/build/about-C4AbyQ4q.mjs.map +0 -1
  359. package/.output/server/chunks/build/account-B45bYZd1.mjs.map +0 -1
  360. package/.output/server/chunks/build/auto-heal-BnTdKHQq.mjs.map +0 -1
  361. package/.output/server/chunks/build/help-content-BK3jcgLw.mjs.map +0 -1
  362. package/.output/server/chunks/build/import-ibAn_HB9.mjs.map +0 -1
  363. package/.output/server/chunks/build/index-2GmuPNF-.mjs.map +0 -1
  364. package/.output/server/chunks/build/index-D5A0DW7Y.mjs.map +0 -1
  365. package/.output/server/chunks/build/index-DreB_S-d.mjs.map +0 -1
  366. package/.output/server/chunks/build/index-KsRegEjT.mjs.map +0 -1
  367. package/.output/server/chunks/build/mcp-Dwj29-uG.mjs.map +0 -1
  368. package/.output/server/chunks/build/notifications-CjAn5FJj.mjs.map +0 -1
  369. package/.output/server/chunks/build/performance-DRzcu_c7.mjs.map +0 -1
  370. package/.output/server/chunks/build/pr-feedback-DR60oGBf.mjs.map +0 -1
  371. package/.output/server/chunks/build/selections-BjjolRZ9.mjs.map +0 -1
  372. package/.output/server/chunks/build/settings-B3NWV9tu.mjs.map +0 -1
  373. package/.output/server/chunks/build/settings-metadata-DwJk8uSt.mjs.map +0 -1
  374. package/.output/server/chunks/build/storage-C1O-FC0U.mjs.map +0 -1
  375. package/.output/server/chunks/build/tags-dsvYrnii.mjs.map +0 -1
  376. package/.output/server/chunks/build/test-cases-CFiOuyK6.mjs.map +0 -1
  377. package/.output/server/chunks/build/test-functions-CbmBi6az.mjs.map +0 -1
  378. package/.output/server/chunks/build/useDesktopDownload-R_RWSgUV.mjs.map +0 -1
  379. package/.output/server/chunks/build/useDesktopLocalRuns-BdELBy0Y.mjs.map +0 -1
  380. package/.output/server/chunks/build/useDesktopProjectLink-IUN7SIP2.mjs.map +0 -1
  381. package/.output/server/chunks/build/useSettingsNav-Dg87E7kY.mjs.map +0 -1
  382. package/.output/server/chunks/build/users-DgsoiXxQ.mjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{aa as I,_ as oe}from"./1QWBzxLM.js";const V=6048e5,se=864e5,ue=6e4,ce=36e5,W=43200,A=1440,H=Symbol.for("constructDateFrom");function y(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&H in e?e[H](t):e instanceof Date?new e.constructor(t):new Date(t)}function g(e,t){return y(t||e,e)}function de(e,t,n){const r=g(e,n?.in);return isNaN(t)?y(e,NaN):(t&&r.setDate(r.getDate()+t),r)}function fe(e,t,n){const r=g(e,n?.in);if(isNaN(t))return y(e,NaN);if(!t)return r;const a=r.getDate(),i=y(e,r.getTime());i.setMonth(r.getMonth()+t+1,0);const o=i.getDate();return a>=o?i:(r.setFullYear(i.getFullYear(),i.getMonth(),a),r)}function O(e,t,n){const{years:r=0,months:a=0,weeks:i=0,days:o=0,hours:s=0,minutes:u=0,seconds:m=0}=t,f=g(e,n?.in),d=a||r?fe(f,a+r*12):f,l=o||i?de(d,o+i*7):d,c=u+s*60,p=(m+c*60)*1e3;return y(e,+l+p)}let le={};function k(){return le}function T(e,t){const n=k(),r=t?.weekStartsOn??t?.locale?.options?.weekStartsOn??n.weekStartsOn??n.locale?.options?.weekStartsOn??0,a=g(e,t?.in),i=a.getDay(),o=(i<r?7:0)+i-r;return a.setDate(a.getDate()-o),a.setHours(0,0,0,0),a}function Y(e,t){return T(e,{...t,weekStartsOn:1})}function U(e,t){const n=g(e,t?.in),r=n.getFullYear(),a=y(n,0);a.setFullYear(r+1,0,4),a.setHours(0,0,0,0);const i=Y(a),o=y(n,0);o.setFullYear(r,0,4),o.setHours(0,0,0,0);const s=Y(o);return n.getTime()>=i.getTime()?r+1:n.getTime()>=s.getTime()?r:r-1}function F(e){const t=g(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}function b(e,...t){const n=y.bind(null,e||t.find(r=>typeof r=="object"));return t.map(n)}function L(e,t){const n=g(e,t?.in);return n.setHours(0,0,0,0),n}function J(e,t,n){const[r,a]=b(n?.in,e,t),i=L(r),o=L(a),s=+i-F(i),u=+o-F(o);return Math.round((s-u)/se)}function he(e,t){const n=U(e,t),r=y(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),Y(r)}function v(e,t){const n=+g(e)-+g(t);return n<0?-1:n>0?1:n}function me(e){return y(e,Date.now())}function ge(e){return e instanceof Date||typeof e=="object"&&Object.prototype.toString.call(e)==="[object Date]"}function we(e){return!(!ge(e)&&typeof e!="number"||isNaN(+g(e)))}function ye(e,t,n){const[r,a]=b(n?.in,e,t),i=r.getFullYear()-a.getFullYear(),o=r.getMonth()-a.getMonth();return i*12+o}function be(e,t,n){const[r,a]=b(n?.in,e,t);return r.getFullYear()-a.getFullYear()}function pe(e,t,n){const[r,a]=b(n?.in,e,t),i=q(r,a),o=Math.abs(J(r,a));r.setDate(r.getDate()-i*o);const s=+(q(r,a)===-i),u=i*(o-s);return u===0?0:u}function q(e,t){const n=e.getFullYear()-t.getFullYear()||e.getMonth()-t.getMonth()||e.getDate()-t.getDate()||e.getHours()-t.getHours()||e.getMinutes()-t.getMinutes()||e.getSeconds()-t.getSeconds()||e.getMilliseconds()-t.getMilliseconds();return n<0?-1:n>0?1:n}function N(e){return t=>{const r=(e?Math[e]:Math.trunc)(t);return r===0?0:r}}function Me(e,t,n){const[r,a]=b(n?.in,e,t),i=(+r-+a)/ce;return N(n?.roundingMethod)(i)}function K(e,t){return+g(e)-+g(t)}function xe(e,t,n){const r=K(e,t)/ue;return N(n?.roundingMethod)(r)}function De(e,t){const n=g(e,t?.in);return n.setHours(23,59,59,999),n}function ve(e,t){const n=g(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function ke(e,t){const n=g(e,t?.in);return+De(n,t)==+ve(n,t)}function Z(e,t,n){const[r,a,i]=b(n?.in,e,e,t),o=v(a,i),s=Math.abs(ye(a,i));if(s<1)return 0;a.getMonth()===1&&a.getDate()>27&&a.setDate(30),a.setMonth(a.getMonth()-o*s);let u=v(a,i)===-o;ke(r)&&s===1&&v(r,i)===1&&(u=!1);const m=o*(s-+u);return m===0?0:m}function ee(e,t,n){const r=K(e,t)/1e3;return N(n?.roundingMethod)(r)}function Oe(e,t,n){const[r,a]=b(n?.in,e,t),i=v(r,a),o=Math.abs(be(r,a));r.setFullYear(1584),a.setFullYear(1584);const s=v(r,a)===-i,u=i*(o-+s);return u===0?0:u}function Pe(e,t){const[n,r]=b(e,t.start,t.end);return{start:n,end:r}}function Se(e,t){const n=g(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}const Te={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},We=(e,t,n)=>{let r;const a=Te[e];return typeof a=="string"?r=a:t===1?r=a.one:r=a.other.replace("{{count}}",t.toString()),n?.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r};function C(e){return(t={})=>{const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const Ye={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Fe={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ce={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ne={date:C({formats:Ye,defaultWidth:"full"}),time:C({formats:Fe,defaultWidth:"full"}),dateTime:C({formats:Ce,defaultWidth:"full"})},Ee={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},_e=(e,t,n,r)=>Ee[e];function P(e){return(t,n)=>{const r=n?.context?String(n.context):"standalone";let a;if(r==="formatting"&&e.formattingValues){const o=e.defaultFormattingWidth||e.defaultWidth,s=n?.width?String(n.width):o;a=e.formattingValues[s]||e.formattingValues[o]}else{const o=e.defaultWidth,s=n?.width?String(n.width):e.defaultWidth;a=e.values[s]||e.values[o]}const i=e.argumentCallback?e.argumentCallback(t):t;return a[i]}}const Ie={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Ae={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},He={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Le={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},qe={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Re={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Xe=(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},$e={ordinalNumber:Xe,era:P({values:Ie,defaultWidth:"wide"}),quarter:P({values:Ae,defaultWidth:"wide",argumentCallback:e=>e-1}),month:P({values:He,defaultWidth:"wide"}),day:P({values:Le,defaultWidth:"wide"}),dayPeriod:P({values:qe,defaultWidth:"wide",formattingValues:Re,defaultFormattingWidth:"wide"})};function S(e){return(t,n={})=>{const r=n.width,a=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],i=t.match(a);if(!i)return null;const o=i[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],u=Array.isArray(s)?je(s,d=>d.test(o)):Ge(s,d=>d.test(o));let m;m=e.valueCallback?e.valueCallback(u):u,m=n.valueCallback?n.valueCallback(m):m;const f=t.slice(o.length);return{value:m,rest:f}}}function Ge(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n}function je(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return n}function Be(e){return(t,n={})=>{const r=t.match(e.matchPattern);if(!r)return null;const a=r[0],i=t.match(e.parsePattern);if(!i)return null;let o=e.valueCallback?e.valueCallback(i[0]):i[0];o=n.valueCallback?n.valueCallback(o):o;const s=t.slice(a.length);return{value:o,rest:s}}}const Qe=/^(\d+)(th|st|nd|rd)?/i,ze=/\d+/i,Ve={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Ue={any:[/^b/i,/^(a|c)/i]},Je={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Ke={any:[/1/i,/2/i,/3/i,/4/i]},Ze={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},et={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},tt={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},nt={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},rt={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},at={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},it={ordinalNumber:Be({matchPattern:Qe,parsePattern:ze,valueCallback:e=>parseInt(e,10)}),era:S({matchPatterns:Ve,defaultMatchWidth:"wide",parsePatterns:Ue,defaultParseWidth:"any"}),quarter:S({matchPatterns:Je,defaultMatchWidth:"wide",parsePatterns:Ke,defaultParseWidth:"any",valueCallback:e=>e+1}),month:S({matchPatterns:Ze,defaultMatchWidth:"wide",parsePatterns:et,defaultParseWidth:"any"}),day:S({matchPatterns:tt,defaultMatchWidth:"wide",parsePatterns:nt,defaultParseWidth:"any"}),dayPeriod:S({matchPatterns:rt,defaultMatchWidth:"any",parsePatterns:at,defaultParseWidth:"any"})},E={code:"en-US",formatDistance:We,formatLong:Ne,formatRelative:_e,localize:$e,match:it,options:{weekStartsOn:0,firstWeekContainsDate:1}};function ot(e,t){const n=g(e,t?.in);return J(n,Se(n))+1}function st(e,t){const n=g(e,t?.in),r=+Y(n)-+he(n);return Math.round(r/V)+1}function te(e,t){const n=g(e,t?.in),r=n.getFullYear(),a=k(),i=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??a.firstWeekContainsDate??a.locale?.options?.firstWeekContainsDate??1,o=y(t?.in||e,0);o.setFullYear(r+1,0,i),o.setHours(0,0,0,0);const s=T(o,t),u=y(t?.in||e,0);u.setFullYear(r,0,i),u.setHours(0,0,0,0);const m=T(u,t);return+n>=+s?r+1:+n>=+m?r:r-1}function ut(e,t){const n=k(),r=t?.firstWeekContainsDate??t?.locale?.options?.firstWeekContainsDate??n.firstWeekContainsDate??n.locale?.options?.firstWeekContainsDate??1,a=te(e,t),i=y(t?.in||e,0);return i.setFullYear(a,0,r),i.setHours(0,0,0,0),T(i,t)}function ct(e,t){const n=g(e,t?.in),r=+T(n,t)-+ut(n,t);return Math.round(r/V)+1}function h(e,t){const n=e<0?"-":"",r=Math.abs(e).toString().padStart(t,"0");return n+r}const M={y(e,t){const n=e.getFullYear(),r=n>0?n:1-n;return h(t==="yy"?r%100:r,t.length)},M(e,t){const n=e.getMonth();return t==="M"?String(n+1):h(n+1,2)},d(e,t){return h(e.getDate(),t.length)},a(e,t){const n=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];default:return n==="am"?"a.m.":"p.m."}},h(e,t){return h(e.getHours()%12||12,t.length)},H(e,t){return h(e.getHours(),t.length)},m(e,t){return h(e.getMinutes(),t.length)},s(e,t){return h(e.getSeconds(),t.length)},S(e,t){const n=t.length,r=e.getMilliseconds(),a=Math.trunc(r*Math.pow(10,n-3));return h(a,t.length)}},D={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},R={G:function(e,t,n){const r=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if(t==="yo"){const r=e.getFullYear(),a=r>0?r:1-r;return n.ordinalNumber(a,{unit:"year"})}return M.y(e,t)},Y:function(e,t,n,r){const a=te(e,r),i=a>0?a:1-a;if(t==="YY"){const o=i%100;return h(o,2)}return t==="Yo"?n.ordinalNumber(i,{unit:"year"}):h(i,t.length)},R:function(e,t){const n=U(e);return h(n,t.length)},u:function(e,t){const n=e.getFullYear();return h(n,t.length)},Q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return h(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return h(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){const r=e.getMonth();switch(t){case"M":case"MM":return M.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){const r=e.getMonth();switch(t){case"L":return String(r+1);case"LL":return h(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){const a=ct(e,r);return t==="wo"?n.ordinalNumber(a,{unit:"week"}):h(a,t.length)},I:function(e,t,n){const r=st(e);return t==="Io"?n.ordinalNumber(r,{unit:"week"}):h(r,t.length)},d:function(e,t,n){return t==="do"?n.ordinalNumber(e.getDate(),{unit:"date"}):M.d(e,t)},D:function(e,t,n){const r=ot(e);return t==="Do"?n.ordinalNumber(r,{unit:"dayOfYear"}):h(r,t.length)},E:function(e,t,n){const r=e.getDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){const a=e.getDay(),i=(a-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(i);case"ee":return h(i,2);case"eo":return n.ordinalNumber(i,{unit:"day"});case"eee":return n.day(a,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(a,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(a,{width:"short",context:"formatting"});default:return n.day(a,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){const a=e.getDay(),i=(a-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(i);case"cc":return h(i,t.length);case"co":return n.ordinalNumber(i,{unit:"day"});case"ccc":return n.day(a,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(a,{width:"narrow",context:"standalone"});case"cccccc":return n.day(a,{width:"short",context:"standalone"});default:return n.day(a,{width:"wide",context:"standalone"})}},i:function(e,t,n){const r=e.getDay(),a=r===0?7:r;switch(t){case"i":return String(a);case"ii":return h(a,t.length);case"io":return n.ordinalNumber(a,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){const a=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(a,{width:"narrow",context:"formatting"});default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},b:function(e,t,n){const r=e.getHours();let a;switch(r===12?a=D.noon:r===0?a=D.midnight:a=r/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(a,{width:"narrow",context:"formatting"});default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},B:function(e,t,n){const r=e.getHours();let a;switch(r>=17?a=D.evening:r>=12?a=D.afternoon:r>=4?a=D.morning:a=D.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(a,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(a,{width:"narrow",context:"formatting"});default:return n.dayPeriod(a,{width:"wide",context:"formatting"})}},h:function(e,t,n){if(t==="ho"){let r=e.getHours()%12;return r===0&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return M.h(e,t)},H:function(e,t,n){return t==="Ho"?n.ordinalNumber(e.getHours(),{unit:"hour"}):M.H(e,t)},K:function(e,t,n){const r=e.getHours()%12;return t==="Ko"?n.ordinalNumber(r,{unit:"hour"}):h(r,t.length)},k:function(e,t,n){let r=e.getHours();return r===0&&(r=24),t==="ko"?n.ordinalNumber(r,{unit:"hour"}):h(r,t.length)},m:function(e,t,n){return t==="mo"?n.ordinalNumber(e.getMinutes(),{unit:"minute"}):M.m(e,t)},s:function(e,t,n){return t==="so"?n.ordinalNumber(e.getSeconds(),{unit:"second"}):M.s(e,t)},S:function(e,t){return M.S(e,t)},X:function(e,t,n){const r=e.getTimezoneOffset();if(r===0)return"Z";switch(t){case"X":return $(r);case"XXXX":case"XX":return x(r);default:return x(r,":")}},x:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"x":return $(r);case"xxxx":case"xx":return x(r);default:return x(r,":")}},O:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+X(r,":");default:return"GMT"+x(r,":")}},z:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+X(r,":");default:return"GMT"+x(r,":")}},t:function(e,t,n){const r=Math.trunc(+e/1e3);return h(r,t.length)},T:function(e,t,n){return h(+e,t.length)}};function X(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),a=Math.trunc(r/60),i=r%60;return i===0?n+String(a):n+String(a)+t+h(i,2)}function $(e,t){return e%60===0?(e>0?"-":"+")+h(Math.abs(e)/60,2):x(e,t)}function x(e,t=""){const n=e>0?"-":"+",r=Math.abs(e),a=h(Math.trunc(r/60),2),i=h(r%60,2);return n+a+t+i}const G=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});default:return t.date({width:"full"})}},ne=(e,t)=>{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});default:return t.time({width:"full"})}},dt=(e,t)=>{const n=e.match(/(P+)(p+)?/)||[],r=n[1],a=n[2];if(!a)return G(e,t);let i;switch(r){case"P":i=t.dateTime({width:"short"});break;case"PP":i=t.dateTime({width:"medium"});break;case"PPP":i=t.dateTime({width:"long"});break;default:i=t.dateTime({width:"full"});break}return i.replace("{{date}}",G(r,t)).replace("{{time}}",ne(a,t))},ft={p:ne,P:dt},lt=/^D+$/,ht=/^Y+$/,mt=["D","DD","YY","YYYY"];function gt(e){return lt.test(e)}function wt(e){return ht.test(e)}function yt(e,t,n){const r=bt(e,t,n);if(console.warn(r),mt.includes(e))throw new RangeError(r)}function bt(e,t,n){const r=e[0]==="Y"?"years":"days of the month";return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${r} to the input \`${n}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const pt=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Mt=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,xt=/^'([^]*?)'?$/,Dt=/''/g,vt=/[a-zA-Z]/;function j(e,t,n){const r=k(),a=r.locale??E,i=r.firstWeekContainsDate??r.locale?.options?.firstWeekContainsDate??1,o=r.weekStartsOn??r.locale?.options?.weekStartsOn??0,s=g(e,n?.in);if(!we(s))throw new RangeError("Invalid time value");let u=t.match(Mt).map(f=>{const d=f[0];if(d==="p"||d==="P"){const l=ft[d];return l(f,a.formatLong)}return f}).join("").match(pt).map(f=>{if(f==="''")return{isToken:!1,value:"'"};const d=f[0];if(d==="'")return{isToken:!1,value:kt(f)};if(R[d])return{isToken:!0,value:f};if(d.match(vt))throw new RangeError("Format string contains an unescaped latin alphabet character `"+d+"`");return{isToken:!1,value:f}});a.localize.preprocessor&&(u=a.localize.preprocessor(s,u));const m={firstWeekContainsDate:i,weekStartsOn:o,locale:a};return u.map(f=>{if(!f.isToken)return f.value;const d=f.value;(wt(d)||gt(d))&&yt(d,t,String(e));const l=R[d[0]];return l(s,d,a.localize,m)}).join("")}function kt(e){const t=e.match(xt);return t?t[1].replace(Dt,"'"):e}function Ot(e,t,n){const r=k(),a=n?.locale??r.locale??E,i=2520,o=v(e,t);if(isNaN(o))throw new RangeError("Invalid time value");const s=Object.assign({},n,{addSuffix:n?.addSuffix,comparison:o}),[u,m]=b(n?.in,...o>0?[t,e]:[e,t]),f=ee(m,u),d=(F(m)-F(u))/1e3,l=Math.round((f-d)/60);let c;if(l<2)return n?.includeSeconds?f<5?a.formatDistance("lessThanXSeconds",5,s):f<10?a.formatDistance("lessThanXSeconds",10,s):f<20?a.formatDistance("lessThanXSeconds",20,s):f<40?a.formatDistance("halfAMinute",0,s):f<60?a.formatDistance("lessThanXMinutes",1,s):a.formatDistance("xMinutes",1,s):l===0?a.formatDistance("lessThanXMinutes",1,s):a.formatDistance("xMinutes",l,s);if(l<45)return a.formatDistance("xMinutes",l,s);if(l<90)return a.formatDistance("aboutXHours",1,s);if(l<A){const w=Math.round(l/60);return a.formatDistance("aboutXHours",w,s)}else{if(l<i)return a.formatDistance("xDays",1,s);if(l<W){const w=Math.round(l/A);return a.formatDistance("xDays",w,s)}else if(l<W*2)return c=Math.round(l/W),a.formatDistance("aboutXMonths",c,s)}if(c=Z(m,u),c<12){const w=Math.round(l/W);return a.formatDistance("xMonths",w,s)}else{const w=c%12,p=Math.trunc(c/12);return w<3?a.formatDistance("aboutXYears",p,s):w<9?a.formatDistance("overXYears",p,s):a.formatDistance("almostXYears",p+1,s)}}function Pt(e,t){return Ot(e,me(e),t)}const St=["years","months","weeks","days","hours","minutes","seconds"];function re(e,t){const n=k(),r=t?.locale??n.locale??E,a=t?.format??St,i=t?.zero??!1,o=t?.delimiter??" ";return r.formatDistance?a.reduce((u,m)=>{const f=`x${m.replace(/(^.)/,l=>l.toUpperCase())}`,d=e[m];return d!==void 0&&(i||e[m])?u.concat(r.formatDistance(f,d)):u},[]).join(o):""}function Tt(e,t){const{start:n,end:r}=Pe(t?.in,e),a={},i=Oe(r,n);i&&(a.years=i);const o=O(n,{years:a.years}),s=Z(r,o);s&&(a.months=s);const u=O(o,{months:a.months}),m=pe(r,u);m&&(a.days=m);const f=O(u,{days:a.days}),d=Me(r,f);d&&(a.hours=d);const l=O(f,{hours:a.hours}),c=xe(r,l);c&&(a.minutes=c);const w=O(l,{minutes:a.minutes}),p=ee(r,w);return p&&(a.seconds=p),a}const Wt="piwi:",ae=["critical","high","medium","low"];new Set(ae);function It(e){return typeof e=="string"&&e.trim().toLowerCase().startsWith(Wt)}function At(e){return ae.includes(e)?e:void 0}function Ht(e){return({column:t})=>{const n=t.getIsSorted();return I("button",{class:"flex items-center gap-1 font-semibold select-none cursor-pointer hover:text-highlighted transition-colors",onClick:()=>t.toggleSorting()},[e,I(oe,{name:n==="asc"?"i-lucide-chevron-up":n==="desc"?"i-lucide-chevron-down":"i-lucide-chevrons-up-down",class:["shrink-0 size-3.5",!n&&"opacity-40"]})])}}function Lt(e,t={}){if(e==null||e==="")return"N/A";let n;if(e instanceof Date)n=e;else{const r=typeof e=="number"?e:Number(e);!Number.isNaN(r)&&String(e).trim()!==""?n=new Date(r<1e12?r*1e3:r):n=new Date(e)}return Number.isNaN(n.getTime())?"N/A":t.dateOnly?j(n,"M/d/yyyy"):j(n,"M/d/yyyy, h:mm:ss a")}function qt(e){return e?Pt(new Date(e),{addSuffix:!0}):"N/A"}function Rt(e){if(e==null)return"N/A";const t=Math.round(Math.abs(e));return t===0?"0 seconds":(e<0?"−":"")+re({seconds:t/1e3})}function Xt(e){if(e==null)return"N/A";const t=Math.round(Math.abs(e));if(t<1e3)return"less than a second";const n=Tt({start:0,end:t}),r=["years","months","days","hours","minutes","seconds"].filter(i=>(n[i]??0)>0);return(e<0?"−":"")+re(n,{format:r.slice(0,2),delimiter:" "})}function $t(e){if(e==null)return null;const t=Math.round(Math.abs(e)),n=e<0?"−":"";if(t<1e3)return{value:n+t,unit:"ms"};const r=t/1e3;return r<60?{value:n+Math.round(r*10)/10,unit:"s"}:{value:n+Math.round(r/60*10)/10,unit:"m"}}function Gt(e){switch(e){case"html":return"i-lucide-layout-dashboard";case"monocart":return"i-lucide-bar-chart-2";case"blob":return"i-lucide-download";default:return"i-lucide-file-text"}}function jt(e){if(!e)return"i-lucide-globe";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"i-simple-icons-googlechrome":t.includes("firefox")?"i-simple-icons-firefoxbrowser":t.includes("safari")||t.includes("webkit")?"i-simple-icons-safari":t.includes("edge")?"i-simple-icons-microsoftedge":"i-lucide-globe"}function Bt(e){if(!e)return"#6b7280";const t=e.toLowerCase();return t.includes("chrome")||t.includes("chromium")?"#4285F4":t.includes("firefox")?"#FF7139":t.includes("safari")||t.includes("webkit")?"#007AFF":t.includes("edge")?"#0078D7":"#6b7280"}function Yt(e){switch(e){case"passed":return"success";case"failed":return"error";case"timedout":return"warning";case"timedOut":return"warning";case"interrupted":return"warning";case"cancelled":return"neutral";case"initializing":return"info";case"running":return"info";case"finalizing":return"info";default:return"neutral"}}function _(e){return e==="timedOut"?"timedout":e}function Qt(e){switch(_(e)){case"passed":return"i-lucide-check-circle-2";case"failed":case"timedout":return"i-lucide-x-circle";case"didnotrun":return"i-lucide-circle-slash";case"running":case"initializing":case"finalizing":return"i-lucide-loader-circle";default:return"i-lucide-minus-circle"}}function zt(e){switch(_(e)){case"passed":return"text-emerald-600 dark:text-emerald-400";case"failed":case"timedout":return"text-rose-600 dark:text-rose-400";case"didnotrun":return"text-amber-600 dark:text-amber-400";case"running":case"initializing":case"finalizing":return"text-blue-600 dark:text-blue-400";default:return"text-zinc-400 dark:text-zinc-500"}}function Vt(e){const t=_(e);return t==="running"||t==="initializing"||t==="finalizing"}function Ut(e){return e==="timedOut"||e==="timedout"?"failed":e==="didnotrun"?"didn't run":e==="never-run"?"never run":e}function B(e){return e==="failed"||e==="timedOut"||e==="timedout"}function Jt(e,t){return Number(B(t))-Number(B(e))}function Kt(e){switch(e){case"previous-failure":return"Blocked by an earlier failure";case"global-timeout":return"Global timeout reached";case"max-failures":return"Max failures reached";case"interrupted":return"Run interrupted";default:return"Didn't run"}}function Zt(e){return e&&{open:"warning",resolved:"success",ignored:"neutral"}[e]||"neutral"}function en(e){switch(e){case"open":return"Open";case"resolved":return"Resolved";case"ignored":return"Ignored";default:return e??"—"}}function tn(e){switch(e){case"diagnosis-verified":return{label:"Fix verified",color:"success",icon:"i-lucide-badge-check",hint:"The tests went green and the change touched the files the diagnosis named."};case"stopped-failing":return{label:"Stopped failing",color:"info",icon:"i-lucide-check",hint:"The tests went green. Nothing corroborates which change did it."};case"regressed":return{label:"Regressed",color:"error",icon:"i-lucide-undo-2",hint:"A fix was recorded for this cluster and it did not hold — the failure came back."};default:return null}}function nn(e){return e&&{timeout:"warning",assertion:"error","strict-mode":"info",navigation:"secondary",crash:"error",unknown:"neutral"}[e]||"neutral"}const Q=["#ef4444","#f97316","#f59e0b","#84cc16","#10b981","#14b8a6","#06b6d4","#3b82f6","#6366f1","#8b5cf6","#d946ef","#ec4899"];function rn(){return Q[Math.floor(Math.random()*Q.length)]}function ie(e){return!e.startsWith(".")&&!e.startsWith("/")?e:e.replace(".data/storage/","")}function an(e,t,n="/",r=!1){const a=(n||"/").replace(/\/$/,""),i=new URLSearchParams,o=/\.[a-z0-9]+$/i.test(e);t&&!o&&i.set("contentType",t),r&&i.set("compress","1");const s=i.toString();return`${a}/api/files/${ie(e)}${s?`?${s}`:""}`}function on(e,t="/",n=!1){const r=(t||"/").replace(/\/$/,""),o=`${typeof location>"u"?"":location.origin}${r}/${n?"":"api/files/"}${ie(e)}`;return`${r}/trace-viewer/?trace=${encodeURIComponent(o)}`}function sn(e,t="Unknown error"){if(e&&typeof e=="object"){const n=e;return n.data?.message??n.message??t}return t}function un(e,t){const n=t.trim().toLowerCase();return n?e.filter(r=>r.message.toLowerCase().includes(n)||r.author.toLowerCase().includes(n)||r.sha.includes(n)||r.shortSha.includes(n)):e}function cn(e){switch(e){case"added":return{icon:"i-lucide-file-plus",color:"text-green-500",badgeColor:"success"};case"removed":return{icon:"i-lucide-file-minus",color:"text-red-500",badgeColor:"error"};case"renamed":return{icon:"i-lucide-file-symlink",color:"text-blue-500",badgeColor:"info"};default:return{icon:"i-lucide-file-pen-line",color:"text-gray-400",badgeColor:"neutral"}}}const dn={add:"bg-green-50 dark:bg-green-950/30 text-green-800 dark:text-green-300",remove:"bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-300",hunk:"bg-blue-50 dark:bg-blue-950/20 text-blue-500 dark:text-blue-400",context:"text-gray-600 dark:text-gray-400"};function fn(e){return e.split(`
2
+ `).map(t=>t.startsWith("+")&&!t.startsWith("+++")?{type:"add",text:t}:t.startsWith("-")&&!t.startsWith("---")?{type:"remove",text:t}:t.startsWith("@@")?{type:"hunk",text:t}:{type:"context",text:t})}const Ft="\x1B",Ct={30:"#000000",31:"#dc2626",32:"#16a34a",33:"#d97706",34:"#2563eb",35:"#9333ea",36:"#0891b2",37:"#9ca3af"},Nt={40:"#000000",41:"#dc2626",42:"#16a34a",43:"#d97706",44:"#2563eb",45:"#9333ea",46:"#0891b2",47:"#9ca3af"},z=new RegExp(`${Ft}\\[([0-9;]*)m`,"g");function Et(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ln(e){const t=[];let n=0,r,a,i=!1,o=!1,s=!1,u=!1;const m=l=>{if(!l)return;const c=[];i&&c.push("font-weight:600"),o&&c.push("opacity:.7"),s&&c.push("font-style:italic"),u&&c.push("text-decoration:underline"),r&&c.push(`color:${r}`),a&&c.push(`background:${a}`);const w=Et(l);t.push(c.length?`<span style="${c.join(";")}">${w}</span>`:w)},f=l=>{for(const c of l)c===0?(r=void 0,a=void 0,i=!1,o=!1,s=!1,u=!1):c===1?i=!0:c===2?o=!0:c===3?s=!0:c===4?u=!0:c===22?(i=!1,o=!1):c===23?s=!1:c===24?u=!1:c>=30&&c<=37?r=Ct[c]:c===39?r=void 0:c>=40&&c<=47?a=Nt[c]:c===49&&(a=void 0)};let d;for(;(d=z.exec(e))!==null;){m(e.slice(n,d.index)),n=z.lastIndex;const l=d[1]?d[1].split(";").map(Number):[0];f(l)}return m(e.slice(n)),t.join("")}function hn(e,t=120){if(!e)return"";const n=e.replace(/\n/g," · ");return n.length<=t?n:n.slice(0,t)+"…"}function mn(e){return e.totalTests>0?Math.round(e.passedTests/e.totalTests*100):0}function gn(e){return e==="flaky"?"warning":e==="never-run"?"neutral":e==="didnotrun"?"warning":Yt(e)}function wn(e){switch(e.toUpperCase()){case"GET":return"info";case"POST":return"success";case"DELETE":return"error";case"PUT":case"PATCH":return"warning";default:return"neutral"}}function yn(e){return!e||e<=0?"neutral":e>=500?"error":e>=400?"warning":"success"}export{on as A,ie as B,Gt as C,zt as D,Qt as E,Vt as F,Jt as G,jt as H,Bt as I,rn as J,$t as K,mn as L,qt as a,Xt as b,nn as c,Zt as d,sn as e,Rt as f,tn as g,un as h,hn as i,Ht as j,Yt as k,Ut as l,gn as m,It as n,Kt as o,Lt as p,en as q,ln as r,cn as s,At as t,an as u,wn as v,yn as w,B as x,dn as y,fn as z};
@@ -1 +1 @@
1
- import{d as T,o as r,c as x,h as p,b as a,_ as U,t as E,l as h,g as k,e as _,f as y,k as I,j,v as w,m as N,r as b,a as O,F as D,z as S,D as Z,I as R,x as C,G}from"./BdQ7kfxJ.js";import{a as M}from"./DTtizz85.js";const H=[{provider:"jira",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/browse\//i,/^https:\/\/[^/]+\/jira\/software\/c\/projects\//i,/^https:\/\/[^/]+\/.+\/browse\//i],keyExtract:/\/([A-Z][A-Z0-9_]+-\d+)(?:\?|$|#)/i},{provider:"github-issue",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"github-pr",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\//i],keyExtract:/\/pull\/(\d+)/},{provider:"gitlab-issue",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"gitlab-mr",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/merge_requests\//i],keyExtract:/\/merge_requests\/(\d+)/},{provider:"bitbucket",tests:[/^https:\/\/bitbucket\.org\/[^/]+\/[^/]+\/pull-requests\//i],keyExtract:/\/pull-requests\/(\d+)/},{provider:"confluence",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/wiki\//i]},{provider:"slack",tests:[/^https:\/\/[^/]+\.slack\.com\//i]},{provider:"linear",tests:[/^https:\/\/linear\.app\//i],keyExtract:/\/([A-Za-z]+-\d+)(?:\/|\?|$|#)/},{provider:"notion",tests:[/^https:\/\/(www\.)?notion\.so\//i]}];function J(t){for(const c of H)if(c.tests.some(e=>e.test(t)))return c.provider;return"generic"}function z(t){return{jira:"i-simple-icons-jira","github-issue":"i-simple-icons-github","github-pr":"i-simple-icons-github","gitlab-issue":"i-simple-icons-gitlab","gitlab-mr":"i-simple-icons-gitlab",bitbucket:"i-simple-icons-bitbucket",confluence:"i-simple-icons-confluence",slack:"i-simple-icons-slack",linear:"i-simple-icons-linear",notion:"i-simple-icons-notion",generic:"i-lucide-link"}[t]}const K={class:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 group hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"},Q={key:0,class:"font-mono text-primary font-medium"},W=["title"],X=T({__name:"LinkChip",props:{link:{},removable:{type:Boolean}},emits:["remove"],setup(t,{emit:c}){const e=t,v=c,g=w(()=>e.link.title||e.link.key||e.link.url.replace(/^https?:\/\//,"").slice(0,50)),o=w(()=>z(e.link.provider));return(s,l)=>{const d=U,f=N,m=j;return r(),x("span",K,[p(d,{name:a(o),class:"w-3.5 h-3.5 shrink-0"},null,8,["name"]),t.link.key?(r(),x("span",Q,E(t.link.key),1)):h("",!0),k("span",{class:"max-w-48 truncate",title:t.link.title||t.link.url},E(a(g)),9,W),t.link.statusText?(r(),_(f,{key:1,color:t.link.statusColor||"neutral",variant:"subtle",size:"xs"},{default:y(()=>[I(E(t.link.statusText),1)]),_:1},8,["color"])):h("",!0),p(m,{to:t.link.url,target:"_blank",size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-external-link",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1"},null,8,["to"]),t.removable?(r(),_(m,{key:2,size:"xs",variant:"ghost",color:"error",icon:"i-lucide-x",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1",onClick:l[0]||(l[0]=L=>v("remove",t.link.id))})):h("",!0)])}}}),Y=Object.assign(X,{__name:"LinkChip"}),tt={class:"flex flex-wrap items-center gap-1.5"},et={class:"relative"},it={class:"flex justify-end gap-2"},st=T({__name:"EntityLinks",props:{entityType:{},entityId:{},links:{}},emits:["updated"],setup(t,{emit:c}){const e=t,v=c,{copy:g}=M(),o=b(e.links??[]),s=b(""),l=b(!1),d=b(!1),f=w(()=>{try{return s.value?J(s.value):null}catch{return null}}),m=w(()=>f.value?z(f.value):null);async function L(){const n=await $fetch("/api/links",{params:{entityType:e.entityType,entityId:e.entityId}});o.value=n.items}async function B(){if(!(!s.value||d.value)){d.value=!0;try{const n=await $fetch("/api/links",{method:"POST",body:{entityType:e.entityType,entityId:e.entityId,url:s.value}});o.value.push(n.link),s.value="",l.value=!1,v("updated")}catch(n){g(n?.data?.message||"Failed to add link",{toast:!0})}finally{d.value=!1}}}async function V(n){try{await $fetch(`/api/links/${n}`,{method:"DELETE"}),o.value=o.value.filter(i=>i.id!==n),v("updated")}catch{g("Failed to remove link",{toast:!0})}}return O(()=>[e.entityType,e.entityId],()=>{e.links?o.value=e.links:L()},{immediate:!0}),(n,i)=>{const A=Y,$=j,P=R,q=U,F=G;return r(),x("div",tt,[(r(!0),x(D,null,S(a(o),u=>(r(),_(A,{key:u.id,link:u,removable:"",onRemove:V},null,8,["link"]))),128)),p(F,{open:a(l),"onUpdate:open":i[2]||(i[2]=u=>C(l)?l.value=u:null)},{content:y(()=>[k("form",{class:"p-3 space-y-3 min-w-72",onSubmit:Z(B,["prevent"])},[i[5]||(i[5]=k("p",{class:"text-sm font-medium"},"Add link",-1)),k("div",et,[p(P,{modelValue:a(s),"onUpdate:modelValue":i[0]||(i[0]=u=>C(s)?s.value=u:null),placeholder:"https://...",size:"sm",class:"w-full",autofocus:""},null,8,["modelValue"]),a(m)?(r(),_(q,{key:0,name:a(m),class:"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"},null,8,["name"])):h("",!0)]),k("div",it,[p($,{size:"xs",variant:"ghost",color:"neutral",onClick:i[1]||(i[1]=u=>l.value=!1)},{default:y(()=>[...i[3]||(i[3]=[I(" Cancel ",-1)])]),_:1}),p($,{size:"xs",color:"primary",type:"submit",loading:a(d),disabled:!a(s).trim()},{default:y(()=>[...i[4]||(i[4]=[I(" Add ",-1)])]),_:1},8,["loading","disabled"])])],32)]),default:y(()=>[p($,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-plus",class:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",title:"Add link"})]),_:1},8,["open"])])}}}),ot=Object.assign(st,{__name:"EntityLinks"});export{ot as _};
1
+ import{d as T,o as r,c as x,h as p,b as a,_ as U,t as E,l as h,g as k,e as _,f as y,k as I,j,v as w,m as N,r as b,a as O,F as D,z as S,D as Z,I as R,x as C,G}from"./1QWBzxLM.js";import{a as M}from"./CU_2YLhT.js";const H=[{provider:"jira",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/browse\//i,/^https:\/\/[^/]+\/jira\/software\/c\/projects\//i,/^https:\/\/[^/]+\/.+\/browse\//i],keyExtract:/\/([A-Z][A-Z0-9_]+-\d+)(?:\?|$|#)/i},{provider:"github-issue",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"github-pr",tests:[/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\//i],keyExtract:/\/pull\/(\d+)/},{provider:"gitlab-issue",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/issues\//i],keyExtract:/\/issues\/(\d+)/},{provider:"gitlab-mr",tests:[/^https:\/\/(gitlab\.[^/]+|[^/]+\.gitlab\.io)\/[^/]+\/[^/]+\/-\/merge_requests\//i],keyExtract:/\/merge_requests\/(\d+)/},{provider:"bitbucket",tests:[/^https:\/\/bitbucket\.org\/[^/]+\/[^/]+\/pull-requests\//i],keyExtract:/\/pull-requests\/(\d+)/},{provider:"confluence",tests:[/^https:\/\/([^./]+)\.atlassian\.net\/wiki\//i]},{provider:"slack",tests:[/^https:\/\/[^/]+\.slack\.com\//i]},{provider:"linear",tests:[/^https:\/\/linear\.app\//i],keyExtract:/\/([A-Za-z]+-\d+)(?:\/|\?|$|#)/},{provider:"notion",tests:[/^https:\/\/(www\.)?notion\.so\//i]}];function J(t){for(const c of H)if(c.tests.some(e=>e.test(t)))return c.provider;return"generic"}function z(t){return{jira:"i-simple-icons-jira","github-issue":"i-simple-icons-github","github-pr":"i-simple-icons-github","gitlab-issue":"i-simple-icons-gitlab","gitlab-mr":"i-simple-icons-gitlab",bitbucket:"i-simple-icons-bitbucket",confluence:"i-simple-icons-confluence",slack:"i-simple-icons-slack",linear:"i-simple-icons-linear",notion:"i-simple-icons-notion",generic:"i-lucide-link"}[t]}const K={class:"inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 group hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"},Q={key:0,class:"font-mono text-primary font-medium"},W=["title"],X=T({__name:"LinkChip",props:{link:{},removable:{type:Boolean}},emits:["remove"],setup(t,{emit:c}){const e=t,v=c,g=w(()=>e.link.title||e.link.key||e.link.url.replace(/^https?:\/\//,"").slice(0,50)),o=w(()=>z(e.link.provider));return(s,l)=>{const d=U,f=N,m=j;return r(),x("span",K,[p(d,{name:a(o),class:"w-3.5 h-3.5 shrink-0"},null,8,["name"]),t.link.key?(r(),x("span",Q,E(t.link.key),1)):h("",!0),k("span",{class:"max-w-48 truncate",title:t.link.title||t.link.url},E(a(g)),9,W),t.link.statusText?(r(),_(f,{key:1,color:t.link.statusColor||"neutral",variant:"subtle",size:"xs"},{default:y(()=>[I(E(t.link.statusText),1)]),_:1},8,["color"])):h("",!0),p(m,{to:t.link.url,target:"_blank",size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-external-link",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1"},null,8,["to"]),t.removable?(r(),_(m,{key:2,size:"xs",variant:"ghost",color:"error",icon:"i-lucide-x",class:"opacity-0 group-hover:opacity-100 transition-opacity -my-1",onClick:l[0]||(l[0]=L=>v("remove",t.link.id))})):h("",!0)])}}}),Y=Object.assign(X,{__name:"LinkChip"}),tt={class:"flex flex-wrap items-center gap-1.5"},et={class:"relative"},it={class:"flex justify-end gap-2"},st=T({__name:"EntityLinks",props:{entityType:{},entityId:{},links:{}},emits:["updated"],setup(t,{emit:c}){const e=t,v=c,{copy:g}=M(),o=b(e.links??[]),s=b(""),l=b(!1),d=b(!1),f=w(()=>{try{return s.value?J(s.value):null}catch{return null}}),m=w(()=>f.value?z(f.value):null);async function L(){const n=await $fetch("/api/links",{params:{entityType:e.entityType,entityId:e.entityId}});o.value=n.items}async function B(){if(!(!s.value||d.value)){d.value=!0;try{const n=await $fetch("/api/links",{method:"POST",body:{entityType:e.entityType,entityId:e.entityId,url:s.value}});o.value.push(n.link),s.value="",l.value=!1,v("updated")}catch(n){g(n?.data?.message||"Failed to add link",{toast:!0})}finally{d.value=!1}}}async function V(n){try{await $fetch(`/api/links/${n}`,{method:"DELETE"}),o.value=o.value.filter(i=>i.id!==n),v("updated")}catch{g("Failed to remove link",{toast:!0})}}return O(()=>[e.entityType,e.entityId],()=>{e.links?o.value=e.links:L()},{immediate:!0}),(n,i)=>{const A=Y,$=j,P=R,q=U,F=G;return r(),x("div",tt,[(r(!0),x(D,null,S(a(o),u=>(r(),_(A,{key:u.id,link:u,removable:"",onRemove:V},null,8,["link"]))),128)),p(F,{open:a(l),"onUpdate:open":i[2]||(i[2]=u=>C(l)?l.value=u:null)},{content:y(()=>[k("form",{class:"p-3 space-y-3 min-w-72",onSubmit:Z(B,["prevent"])},[i[5]||(i[5]=k("p",{class:"text-sm font-medium"},"Add link",-1)),k("div",et,[p(P,{modelValue:a(s),"onUpdate:modelValue":i[0]||(i[0]=u=>C(s)?s.value=u:null),placeholder:"https://...",size:"sm",class:"w-full",autofocus:""},null,8,["modelValue"]),a(m)?(r(),_(q,{key:0,name:a(m),class:"absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"},null,8,["name"])):h("",!0)]),k("div",it,[p($,{size:"xs",variant:"ghost",color:"neutral",onClick:i[1]||(i[1]=u=>l.value=!1)},{default:y(()=>[...i[3]||(i[3]=[I(" Cancel ",-1)])]),_:1}),p($,{size:"xs",color:"primary",type:"submit",loading:a(d),disabled:!a(s).trim()},{default:y(()=>[...i[4]||(i[4]=[I(" Add ",-1)])]),_:1},8,["loading","disabled"])])],32)]),default:y(()=>[p($,{size:"xs",variant:"ghost",color:"neutral",icon:"i-lucide-plus",class:"text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",title:"Add link"})]),_:1},8,["open"])])}}}),ot=Object.assign(st,{__name:"EntityLinks"});export{ot as _};
@@ -1,4 +1,4 @@
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"./BdQ7kfxJ.js";import{a as T,d as K,_ as L}from"./CrsaY0R_.js";import{_ as Y}from"./Gn1Ns00e.js";import{_ as H}from"./HGYIpJtg.js";import{u as q}from"./DqkCbAzo.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"./1QWBzxLM.js";import{a as T,d as K,_ as L}from"./B82vqOZe.js";import{_ as Y}from"./BF5qB58w.js";import{_ as H}from"./AbnDY6Zr.js";import{u as q}from"./CzyCEdYP.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
 
@@ -1 +1 @@
1
- import{_ as Ee,a as Ie}from"./BV8EzO8q.js";import{_ as Ve,a as Le}from"./B7uPoZ7T.js";import{_ as Ne}from"./D0XWJGhG.js";import{v as j,d as G,o as t,c as l,h as S,x as le,b as e,e as _,f as p,g as s,_ as pe,i as B,t as c,l as A,k as E,j as J,w as X,F as I,z as V,ai as Me,H as re,a1 as we,m as Se,s as De}from"./BdQ7kfxJ.js";import{_ as Oe}from"./CUWrUpTl.js";import{_ as ze}from"./Bp2zrrkV.js";import{u as Pe}from"./Bo73sAu8.js";import{u as ge}from"./DTtizz85.js";import{_ as Ae}from"./r6zkA1SE.js";import{_ as Be}from"./CZ6WR7uw.js";import{e as Q,a as me,c as Ue}from"./DwZS0oRm.js";import{_ as H}from"./Bh2WA4IJ.js";import{_ as Z}from"./C2hIM5f9.js";import{_ as te}from"./CfV2N201.js";import{_ as ue}from"./BOn5q0rT.js";import{_ as Fe}from"./oA84LLqO.js";import{_ as Te}from"./B0eHOux4.js";import{_ as qe}from"./LWIyaZKe.js";import{_ as We}from"./DzJa19LG.js";import{_ as _e}from"./DPPhFZOr.js";import{e as ye,_ as be,a as ve,b as ie,d as ke,f as $e,u as Ce,s as Re}from"./DtGJeysS.js";import{_ as Xe}from"./C9A3sPDo.js";import{_ as Ge}from"./D56yp7m9.js";import{_ as Ye}from"./vcSKeWsW.js";import"./i7znB42v.js";import"./rPG7kzfL.js";import"./EJllK0wm.js";import"./DKgbchez.js";import"./BO4sfkbw.js";import"./WZXZeGYt.js";import"./CxwnFFD0.js";import"./CrsaY0R_.js";import"./Bg63qh8W.js";import"./HGYIpJtg.js";const Je=30,xe=3650;function Qe(v){const i={days:String(v.days)};return v.projectIds&&v.projectIds.length>0&&(i.projects=v.projectIds.join(",")),v.environment&&(i.environment=v.environment),v.branch&&(i.branch=v.branch),v.fullRunsOnly||(i.fullRunsOnly="false"),i}const oe={days:Je,projectIds:[],environment:null,branch:null,fullRunsOnly:!0};function He(){const v=Pe("piwi-analytics-scope",{default:()=>({...oe}),encode:w=>JSON.stringify(w),decode:w=>{try{return w?{...oe,...JSON.parse(w)}:{...oe}}catch{return{...oe}}}}),i=j(()=>({days:v.value.days,projectIds:v.value.projectIds.length>0?v.value.projectIds:void 0,environment:v.value.environment,branch:v.value.branch,fullRunsOnly:v.value.fullRunsOnly})),h=j(()=>Qe(i.value));return{state:v,scope:i,scopeQuery:h}}function K(v,i){return ge(`/api/analytics/${v}`,{query:j(i),lazy:!0,server:!1},"$UlG3SHNJJg")}const Ze={class:"flex items-center gap-3 flex-wrap"},Ke={class:"flex items-center gap-1.5"},et={key:0,class:"text-gray-500"},tt={key:1,class:"truncate"},st={key:2},nt={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"},he="All environments",fe="All branches",at=G({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{},availableBranches:{}},emits:["update:modelValue"],setup(v,{emit:i}){const h=v,w=i,o=[{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:xe}],O=j({get:()=>h.modelValue.days,set:m=>w("update:modelValue",{...h.modelValue,days:m})}),T=j(()=>h.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),z=j({get:()=>h.modelValue.projectIds,set:m=>w("update:modelValue",{...h.modelValue,projectIds:m})});function C(m){return T.value.find(f=>f.value===m)?.label??`#${m}`}const k=j({get:()=>h.modelValue.environment??he,set:m=>w("update:modelValue",{...h.modelValue,environment:m===he?null:m})}),d=j(()=>[he,...h.availableEnvironments]),$=j({get:()=>h.modelValue.branch??fe,set:m=>w("update:modelValue",{...h.modelValue,branch:m===fe?null:m})}),L=j(()=>[fe,...h.availableBranches??[]]),N=j({get:()=>h.modelValue.fullRunsOnly,set:m=>w("update:modelValue",{...h.modelValue,fullRunsOnly:m})}),x=j(()=>h.modelValue.days===oe.days&&h.modelValue.projectIds.length===0&&h.modelValue.environment===null&&h.modelValue.branch===null&&h.modelValue.fullRunsOnly===oe.fullRunsOnly);function M(){w("update:modelValue",{...oe})}return(m,f)=>{const y=Ne,r=pe,b=Oe,P=ze,u=J;return t(),l("div",Ze,[S(y,{modelValue:e(O),"onUpdate:modelValue":f[0]||(f[0]=n=>le(O)?O.value=n:null),items:o,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),e(T).length>0?(t(),_(b,{key:0,modelValue:e(z),"onUpdate:modelValue":f[1]||(f[1]=n=>le(z)?z.value=n:null),items:e(T),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:p(({modelValue:n})=>[s("div",Ke,[S(r,{name:"i-lucide-folder",class:B(["size-3.5 shrink-0",n.length?"text-primary":"text-gray-400"])},null,8,["class"]),n.length?n.length===1?(t(),l("span",tt,c(C(n[0])),1)):(t(),l("span",st,c(n.length)+" projects",1)):(t(),l("span",et,"All projects"))])]),_:1},8,["modelValue","items"])):A("",!0),v.availableEnvironments.length>0?(t(),_(y,{key:1,modelValue:e(k),"onUpdate:modelValue":f[2]||(f[2]=n=>le(k)?k.value=n:null),items:e(d),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):A("",!0),(v.availableBranches?.length??0)>0?(t(),_(y,{key:2,modelValue:e($),"onUpdate:modelValue":f[3]||(f[3]=n=>le($)?$.value=n:null),items:e(L),size:"sm",class:"min-w-[160px]",icon:"i-lucide-git-branch"},null,8,["modelValue","items"])):A("",!0),s("label",nt,[S(P,{modelValue:e(N),"onUpdate:modelValue":f[4]||(f[4]=n=>le(N)?N.value=n:null),size:"sm"},null,8,["modelValue"]),f[5]||(f[5]=E(" Full runs only ",-1))]),e(x)?A("",!0):(t(),_(u,{key:3,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:M},{default:p(()=>[...f[6]||(f[6]=[E(" Reset ",-1)])]),_:1}))])}}}),ot=Object.assign(at,{__name:"AnalyticsScopeBar"}),rt=[{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."}],je=[{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(je.map(v=>v.id));const lt={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},it={class:"min-w-0"},ut={class:"text-sm font-medium"},ct={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},dt=G({__name:"InsightsFeed",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("insights",()=>w.query)),i=await i,h(),i),C=re,k={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(d,$)=>{const L=H,N=J,x=Z,M=te,m=pe,f=ue;return t(),_(f,{icon:"i-lucide-lightbulb",title:"Insights",count:e(o)?.length||void 0,help:"analytics.insights"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load insights: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=y=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).length===0?(t(),_(M,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(t(),l("div",lt,[(t(!0),l(I,null,V(e(o),y=>(t(),_(Me(y.to?e(C):"div"),{key:y.id,to:y.to,class:B(["flex items-start gap-3 py-3 pl-3 border-l-2",[k[y.severity].border,y.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:p(()=>[S(m,{name:k[y.severity].icon,class:B(["size-4 mt-0.5 shrink-0",k[y.severity].class])},null,8,["name","class"]),s("div",it,[s("p",ut,c(y.message),1),y.detail?(t(),l("p",ct,c(y.detail),1)):A("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),mt=Object.assign(dt,{__name:"InsightsFeed"}),pt={class:"md:hidden space-y-3"},_t={class:"flex items-center justify-between gap-2"},yt={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ht={key:0},ft={class:"hidden md:block"},gt={class:"w-full text-sm"},xt={class:"divide-y divide-gray-100 dark:divide-gray-800"},bt={class:"py-2.5 pr-4"},vt={class:"flex items-center gap-2 min-w-0"},kt={class:"py-2.5 pr-4"},$t={class:"w-36"},Ct={class:"py-2.5 pr-4 text-right"},wt={class:"py-2.5 pr-4 text-right tabular-nums"},Mt={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},St={class:"py-2.5 text-right"},Tt={class:"text-xs text-gray-500 dark:text-gray-400"},Rt={key:1,class:"text-xs text-gray-400"},jt=G({__name:"PortfolioScorecard",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("portfolio",()=>w.query)),i=await i,h(),i);function C(d){return d===null?"text-gray-400":d>=90?"text-green-600 dark:text-green-400":d>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function k(d){return d===null||Math.abs(d)<1?null:d>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(d,$)=>{const L=H,N=J,x=Z,M=te,m=re,f=Fe,y=Te,r=pe,b=qe,P=We,u=_e,n=ue;return t(),_(n,{icon:"i-lucide-table-properties",title:"Portfolio health",count:e(o)?.length||void 0,help:"analytics.portfolio"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=a=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).length===0?(t(),_(M,{key:2,text:"No projects with runs in this period."})):(t(),l(I,{key:3},[s("div",pt,[(t(!0),l(I,null,V(e(o),a=>(t(),l("div",{key:a.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[s("div",_t,[S(m,{to:`/projects/${a.projectId}`,class:"font-medium truncate hover:text-primary"},{default:p(()=>[E(c(a.label||a.name),1)]),_:2},1032,["to"]),s("span",{class:B(["tabular-nums font-semibold shrink-0",C(a.passRate)])},c(a.passRate!==null?`${a.passRate}%`:"—"),3)]),S(f,{runs:a.recentRuns,height:20},null,8,["runs"]),s("div",yt,[s("span",null,c(a.runCount)+" runs · "+c(a.flakyTests)+" flaky · "+c(a.openClusters)+" open clusters",1),a.latestRun?(t(),l("span",ht,c(("formatRelativeTime"in d?d.formatRelativeTime:e(me))(a.latestRun.startTime)),1)):A("",!0)])]))),128))]),s("div",ft,[S(u,{"min-width":"52rem"},{default:p(()=>[s("table",gt,[$[2]||($[2]=s("thead",null,[s("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[s("th",{class:"py-2 pr-4 font-medium"},"Project"),s("th",{class:"py-2 pr-4 font-medium"},"Trend"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),s("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),s("tbody",xt,[(t(!0),l(I,null,V(e(o),a=>(t(),l("tr",{key:a.projectId},[s("td",bt,[s("div",vt,[S(m,{to:`/projects/${a.projectId}`,class:"font-medium truncate hover:text-primary"},{default:p(()=>[E(c(a.label||a.name),1)]),_:2},1032,["to"]),(t(!0),l(I,null,V(a.tags.slice(0,2),g=>(t(),_(y,{key:g.id,text:g.text,color:g.color},null,8,["text","color"]))),128))])]),s("td",kt,[s("div",$t,[S(f,{runs:a.recentRuns,height:22},null,8,["runs"])])]),s("td",Ct,[s("span",{class:B(["inline-flex items-center gap-1 tabular-nums font-semibold",C(a.passRate)])},[E(c(a.passRate!==null?`${a.passRate}%`:"—")+" ",1),k(a.passRateDelta)?(t(),_(r,{key:0,name:k(a.passRateDelta).icon,class:B(["size-3.5",k(a.passRateDelta).class]),title:`${a.passRateDelta>0?"+":""}${a.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):A("",!0)],2)]),s("td",wt,c(a.runCount),1),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums",a.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},c(a.flakyTests),3),s("td",Mt,[S(b,{ms:a.avgRunDurationMs},null,8,["ms"])]),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums",a.openClusters>0?"text-red-600 dark:text-red-400":""])},c(a.openClusters),3),s("td",St,[a.latestRun?(t(),_(m,{key:0,to:`/test-runs/${a.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:p(()=>[S(P,{status:a.latestRun.status},null,8,["status"]),s("span",Tt,c(("formatRelativeTime"in d?d.formatRelativeTime:e(me))(a.latestRun.startTime)),1)]),_:2},1032,["to"])):(t(),l("span",Rt,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),Et=Object.assign(jt,{__name:"PortfolioScorecard"}),It={class:"space-y-1"},Vt={class:"flex gap-px"},Lt=["title"],Nt={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},Dt={class:"relative h-4"},Ot=G({__name:"PassRateHeatmap",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("pass-rate-heatmap",()=>w.query)),i=await i,h(),i);function C(m){return m===null?{}:m>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:m>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:m>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:m>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function k(m,f,y){const r=o.value?.buckets[f]??"",b=(o.value?.bucketDays??1)>1?` (${o.value.bucketDays} days)`:"";return`${m.label||m.name} · ${r}${b}: ${y!==null?`${y}% passed`:"no runs"}`}const d=[{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%"}],$=j(()=>{const m=o.value?.bucketDays??1;return m>1?`One cell = ${m} days`:"One cell = one day"}),L=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],N=j(()=>{const m=o.value?.buckets??[];return m.length>1&&m[0].slice(0,4)!==m[m.length-1].slice(0,4)});function x(m){const[f,y,r]=m.split("-"),b=L[Number(y)-1];return N.value?`${b} ${f}`:`${b} ${Number(r)}`}const M=j(()=>{const m=o.value?.buckets??[],f=m.length;if(f===0)return[];const y=Math.min(N.value?4:5,f),r=new Set,b=[];for(let P=0;P<y;P++){const u=y===1?0:Math.round(P*(f-1)/(y-1));if(r.has(u))continue;r.add(u);const n=u===0?0:u===f-1?100:(u+.5)/f*100,a=u===0?"translateX(0)":u===f-1?"translateX(-100%)":"translateX(-50%)";b.push({index:u,label:x(m[u]),left:n,transform:a})}return b});return(m,f)=>{const y=H,r=J,b=Z,P=te,u=re,n=_e,a=ye;return t(),_(a,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:e($),help:"analytics.heatmap",legend:d},{default:p(()=>[e(O)?(t(),_(y,{key:0})):e(T)?(t(),_(b,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in m?m.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(r,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:f[0]||(f[0]=g=>e(z)())},{default:p(()=>[...f[1]||(f[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).rows.length===0?(t(),_(P,{key:2,text:"No runs in this period."})):(t(),_(n,{key:3,"min-width":"22rem"},{default:p(()=>[s("div",It,[(t(!0),l(I,null,V(e(o).rows,g=>(t(),l("div",{key:g.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[S(u,{to:`/projects/${g.projectId}`,class:"text-sm truncate hover:text-primary",title:g.label||g.name},{default:p(()=>[E(c(g.label||g.name),1)]),_:2},1032,["to","title"]),s("div",Vt,[(t(!0),l(I,null,V(g.cells,(D,F)=>(t(),l("div",{key:F,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:we(C(D)),title:k(g,F,D)},null,12,Lt))),128))])]))),128)),s("div",Nt,[f[2]||(f[2]=s("span",null,null,-1)),s("div",Dt,[(t(!0),l(I,null,V(e(M),g=>(t(),l("span",{key:g.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:we({left:`${g.left}%`,transform:g.transform})},c(g.label),5))),128))])])])]),_:1}))]),_:1},8,["subtitle"])}}}),zt=Object.assign(Ot,{__name:"PassRateHeatmap"}),Pt={key:3,class:"w-full"},At=["d"],Bt=["d"],Ut=["x","y"],Ft=["x","width","height","fill","onMouseenter"],qt={class:"font-semibold mb-1"},Wt={class:"text-gray-400 text-xs"},Xt="rgb(59, 130, 246)",Gt=G({__name:"CiTimeTrendChart",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("ci-time-trend",()=>w.query)),i=await i,h(),i),C=j(()=>o.value?.points.map(u=>({date:new Date(u.date),totalMinutes:u.totalMinutes,runCount:u.runCount}))??[]),k=j(()=>C.value.some(u=>u.runCount>0)),d=j(()=>Math.max(1,...C.value.map(u=>u.totalMinutes)));function $(u){const{centerOf:n}=ie(C.value.length,u);return C.value.map((a,g)=>n(g))}function L(u,n){const a=$(u);return C.value.map((g,D)=>`${D===0?"M":"L"}${a[D]},${n(g.totalMinutes)}`).join("")}function N(u,n,a){const g=$(u);return g.length===0?"":`${L(u,a)}L${g[g.length-1]},${n}L${g[0]},${n}Z`}function x(u){const{centerOf:n}=ie(C.value.length,u),a=C.value.map(g=>g.date);return ke(a,Math.max(2,Math.floor(u/80))).map(g=>({x:n(g),label:$e(a[g])}))}const{data:M,pos:m,show:f,move:y,hide:r}=Ce(240),b=j(()=>{if(!o.value||o.value.deltaPct===null)return null;const u=o.value.deltaPct;return{label:`${u>0?"+":""}${u}% vs previous period`,class:u>25?"text-red-600 dark:text-red-400":u<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),P=j(()=>{if(!o.value)return;const u=o.value.totalMinutes;return`${u<60?`${Math.round(u)} min`:`${Math.round(u/60*10)/10} h`} across ${o.value.runCount} runs`});return(u,n)=>{const a=H,g=J,D=Z,F=te,se=be,ce=ve,de=ye;return t(),_(de,{icon:"i-lucide-timer",title:"CI time",subtitle:e(P),help:"analytics.ci-time"},{actions:p(()=>[e(b)?(t(),l("span",{key:0,class:B(["text-xs font-medium tabular-nums",e(b).class])},c(e(b).label),3)):A("",!0)]),default:p(()=>[e(O)?(t(),_(a,{key:0})):e(T)?(t(),_(D,{key:1,text:`Couldn't load CI time: ${("errorMessage"in u?u.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(g,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:n[0]||(n[0]=q=>e(z)())},{default:p(()=>[...n[3]||(n[3]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):e(k)?(t(),l("div",Pt,[S(se,{height:220,"y-max":e(d),"y-format":q=>`${q}m`},{default:p(({plotWidth:q,plotHeight:Y,yScale:ne})=>[s("path",{d:N(q,Y,ne),fill:"rgba(59, 130, 246, 0.15)"},null,8,At),s("path",{d:L(q,ne),fill:"none",stroke:Xt,"stroke-width":"2"},null,8,Bt),(t(!0),l(I,null,V(x(q),R=>(t(),l("text",{key:R.x,x:R.x,y:Y+14,"text-anchor":"middle",class:"fill-gray-400 dark:fill-gray-500 text-[10px]"},c(R.label),9,Ut))),128)),(t(!0),l(I,null,V(e(C),(R,U)=>(t(),l("rect",{key:`hover-${R.date.getTime()}`,x:U*(q/e(C).length),y:0,width:q/e(C).length,height:Y,fill:e(M)===R?"rgb(148 163 184 / 0.15)":"transparent",onMouseenter:ae=>e(f)(ae,R),onMousemove:n[1]||(n[1]=ae=>e(y)(ae)),onMouseleave:n[2]||(n[2]=ae=>e(r)())},null,40,Ft))),128))]),_:1},8,["y-max","y-format"]),e(M)?(t(),_(ce,{key:0,pos:e(m)},{default:p(()=>[s("div",qt,c(e(M).date.toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),s("div",null,c(e(M).totalMinutes)+" minutes",1),s("div",Wt,c(e(M).runCount)+" runs",1)]),_:1},8,["pos"])):A("",!0)])):(t(),_(F,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),Yt=Object.assign(Gt,{__name:"CiTimeTrendChart"}),Jt={key:3,class:"w-full"},Qt=["x","y","width","height","fill"],Ht=["x","y"],Zt=["x","width","height","fill","onMouseenter"],Kt={class:"font-semibold mb-1"},es={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"},ts={class:"text-gray-700 dark:text-gray-300"},ss={class:"font-semibold"},ns={key:2,class:"mt-4 space-y-1"},as={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},os=G({__name:"WastedTimeChart",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("wasted-time",()=>w.query)),i=await i,h(),i),C=j(()=>o.value?.points.map(n=>({date:new Date(n.date),waitMinutes:n.waitMinutes,failedExecMinutes:n.failedExecMinutes}))??[]),k=j(()=>C.value.some(n=>n.waitMinutes>0||n.failedExecMinutes>0)),d=["rgb(245, 158, 11)","rgb(239, 68, 68)"],$=j(()=>Math.max(1,...C.value.map(n=>n.waitMinutes+n.failedExecMinutes)));function L(n,a,g){const D=ie(C.value.length,n);return C.value.map((F,se)=>({d:F,slotX:se*D.slotWidth,slotWidth:D.slotWidth,barX:D.xOf(se),barWidth:D.barWidth,segments:Re([{color:d[0],value:F.waitMinutes},{color:d[1],value:F.failedExecMinutes}],a,g)}))}function N(n){const{centerOf:a}=ie(C.value.length,n),g=C.value.map(D=>D.date);return ke(g,Math.max(2,Math.floor(n/80))).map(D=>({x:a(D),label:$e(g[D])}))}const{data:x,pos:M,show:m,move:f,hide:y}=Ce(240),r=[{color:d[0],label:"Wait steps"},{color:d[1],label:"Failed attempts"}],b=j(()=>{if(!o.value)return;const n=o.value.totalWaitMinutes+o.value.totalFailedExecMinutes;return`${n<60?`${Math.round(n)} min`:`${Math.round(n/60*10)/10} h`} of CI time produced no signal`}),P=j(()=>o.value?.timeoutReclaimable??null),u=j(()=>{const n=P.value?.estimatedMinutes??0;return n<60?`${Math.round(n)} min`:`${Math.round(n/60*10)/10} h`});return(n,a)=>{const g=H,D=J,F=Z,se=te,ce=be,de=ve,q=pe,Y=re,ne=ye;return t(),_(ne,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:e(b),help:"analytics.wasted-time",legend:r},{default:p(()=>[e(O)?(t(),_(g,{key:0})):e(T)?(t(),_(F,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in n?n.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(D,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:a[0]||(a[0]=R=>e(z)())},{default:p(()=>[...a[3]||(a[3]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):e(k)?(t(),l("div",Jt,[S(ce,{height:220,"y-max":e($),"y-format":R=>`${R}m`},{default:p(({plotWidth:R,plotHeight:U,yScale:ae})=>[(t(!0),l(I,null,V(L(R,U,ae),W=>(t(),l(I,{key:W.d.date.getTime()},[(t(!0),l(I,null,V(W.segments,ee=>(t(),l("rect",{key:ee.color,x:W.barX,y:ee.y,width:W.barWidth,height:ee.height,fill:ee.color},null,8,Qt))),128))],64))),128)),(t(!0),l(I,null,V(N(R),W=>(t(),l("text",{key:W.x,x:W.x,y:U+14,"text-anchor":"middle",class:"fill-gray-400 dark:fill-gray-500 text-[10px]"},c(W.label),9,Ht))),128)),(t(!0),l(I,null,V(L(R,U,ae),W=>(t(),l("rect",{key:`hover-${W.d.date.getTime()}`,x:W.slotX,y:0,width:W.slotWidth,height:U,fill:e(x)===W.d?"rgb(148 163 184 / 0.15)":"transparent",onMouseenter:ee=>e(m)(ee,W.d),onMousemove:a[1]||(a[1]=ee=>e(f)(ee)),onMouseleave:a[2]||(a[2]=ee=>e(y)())},null,40,Zt))),128))]),_:1},8,["y-max","y-format"]),e(x)?(t(),_(de,{key:0,pos:e(M)},{default:p(()=>[s("div",Kt,c(e(x).date.toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),s("div",null,[a[4]||(a[4]=s("span",{class:"text-amber-500"},"●",-1)),E(" Wait steps: "+c(e(x).waitMinutes)+" min",1)]),s("div",null,[a[5]||(a[5]=s("span",{class:"text-red-500"},"●",-1)),E(" Failed attempts: "+c(e(x).failedExecMinutes)+" min",1)])]),_:1},8,["pos"])):A("",!0),e(P)?(t(),l("div",es,[S(q,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),s("div",ts,[a[7]||(a[7]=E(" Up to ",-1)),s("span",ss,"≈"+c(e(u)),1),E(" of this is avoidable — "+c(e(P).oversizedCount)+" oversized "+c(e(P).oversizedCount===1?"timeout":"timeouts")+" and "+c(e(P).staleSlowCount)+" stale ",1),a[8]||(a[8]=s("code",{class:"text-xs"},"test.slow()",-1)),E(" "+c(e(P).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),e(P).topProjectId?(t(),_(Y,{key:0,to:`/projects/${e(P).topProjectId}#performance`,class:"text-primary hover:underline"},{default:p(()=>[...a[6]||(a[6]=[E("Review",-1)])]),_:1},8,["to"])):A("",!0)])])):A("",!0),e(o)&&e(o).byProject.length>0?(t(),l("div",ns,[(t(!0),l(I,null,V(e(o).byProject.slice(0,5),R=>(t(),l("div",{key:R.projectId,class:"flex items-center justify-between text-sm"},[S(Y,{to:`/projects/${R.projectId}`,class:"truncate hover:text-primary"},{default:p(()=>[E(c(R.label||R.name),1)]),_:2},1032,["to"]),s("span",as,c(Math.round(R.waitMinutes+R.failedExecMinutes))+" min ",1)]))),128))])):A("",!0)])):(t(),_(se,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),rs=Object.assign(os,{__name:"WastedTimeChart"}),ls={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},is={class:"flex-1 min-w-0"},us={class:"text-sm font-medium truncate"},cs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},ds={class:"text-right shrink-0"},ms=G({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("flaky-leaderboard",()=>w.query)),i=await i,h(),i);function C(d){return d>=60?"text-red-600 dark:text-red-400":d>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function k(d){return d.retryPassRuns>0?`flaked ${d.retryPassRuns}/${d.totalRuns} runs`:`${d.alternations} status flips in ${d.totalRuns} runs`}return(d,$)=>{const L=H,N=J,x=Z,M=te,m=Te,f=re,y=ue;return t(),_(y,{icon:"i-lucide-repeat",title:"Flakiest tests",count:e(o)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=r=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).length===0?(t(),_(M,{key:2,text:"No flaky tests detected. Nice and stable."})):(t(),l("div",ls,[(t(!0),l(I,null,V(e(o),r=>(t(),_(f,{key:`${r.projectId}-${r.testCaseId}`,to:`/test-cases/${r.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:p(()=>[s("span",{class:B(["tabular-nums font-bold text-sm w-10 text-right shrink-0",C(r.score)])},c(r.score),3),s("div",is,[s("p",us,c(r.title),1),s("p",cs,[E(c(r.projectLabel||r.projectName)+" · "+c(k(r))+" ",1),r.lastFlakeAt?(t(),l(I,{key:0},[E(" · last "+c(("formatRelativeTime"in d?d.formatRelativeTime:e(me))(r.lastFlakeAt)),1)],64)):A("",!0)])]),s("div",ds,[s("p",{class:B(["text-sm tabular-nums",r.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":r.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},c(Math.round(r.wastedCiMinutes))+" min ",3),r.rootCause?(t(),_(m,{key:0,text:r.rootCause,color:"neutral"},null,8,["text"])):A("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),ps=Object.assign(ms,{__name:"GlobalFlakyLeaderboard"}),_s={key:3,class:"space-y-4"},ys={key:0,class:"flex flex-wrap gap-1.5"},hs={class:"divide-y divide-gray-100 dark:divide-gray-800"},fs={class:"flex-1 min-w-0"},gs={class:"text-sm font-medium truncate"},xs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},bs={class:"text-right text-xs shrink-0"},vs={class:"tabular-nums font-medium"},ks=G({__name:"ClusterLandscape",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("cluster-landscape",()=>w.query)),i=await i,h(),i);function C(k){return k>=30?"text-red-600 dark:text-red-400":k>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(k,d)=>{const $=H,L=J,N=Z,x=te,M=Xe,m=Ge,f=Se,y=re,r=ue;return t(),_(r,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:p(()=>[e(O)?(t(),_($,{key:0})):e(T)?(t(),_(N,{key:1,text:`Couldn't load clusters: ${("errorMessage"in k?k.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(L,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=b=>e(z)())},{default:p(()=>[...d[1]||(d[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).totalOpen===0&&e(o).resolvedInPeriod===0?(t(),_(x,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(t(),l("div",_s,[S(m,null,{default:p(()=>[S(M,{label:"Open",value:e(o).totalOpen,"value-class":e(o).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),S(M,{label:"Resolved this period",value:e(o).resolvedInPeriod},null,8,["value"]),S(M,{label:"Oldest open",value:e(o).clusters.length>0?`${Math.max(...e(o).clusters.map(b=>b.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),e(o).byErrorType.length>0?(t(),l("div",ys,[(t(!0),l(I,null,V(e(o).byErrorType,b=>(t(),_(f,{key:b.errorType,color:("clusterErrorTypeColor"in k?k.clusterErrorTypeColor:e(Ue))(b.errorType),variant:"subtle",size:"sm"},{default:p(()=>[E(c(b.errorType)+" · "+c(b.count),1)]),_:2},1032,["color"]))),128))])):A("",!0),s("div",hs,[(t(!0),l(I,null,V(e(o).clusters.slice(0,8),b=>(t(),_(y,{key:b.id,to:`/failure-clusters/${b.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:p(()=>[s("div",fs,[s("p",gs,c(b.title||b.signature),1),s("p",xs,[E(c(b.projectLabel||b.projectName)+" ",1),b.errorType?(t(),l(I,{key:0},[E(" · "+c(b.errorType),1)],64)):A("",!0)])]),s("div",bs,[s("p",vs,c(b.occurrences)+"×",1),s("p",{class:B(["tabular-nums",C(b.ageDays)])},c(b.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),$s=Object.assign(ks,{__name:"ClusterLandscape"}),Cs={key:3,class:"w-full"},ws=["x","y","width","height","fill"],Ms=["x","y"],Ss=["x","width","height","fill","onMouseenter"],Ts={class:"font-semibold mb-1"},Rs=G({__name:"RegressionVelocityChart",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("regression-velocity",()=>w.query)),i=await i,h(),i),C=j(()=>o.value?.points.map(u=>({date:new Date(u.date),regressions:u.regressions,newFlaky:u.newFlaky}))??[]),k=j(()=>C.value.some(u=>u.regressions>0||u.newFlaky>0)),d=["rgb(239, 68, 68)","rgb(147, 51, 234)"],$=j(()=>Math.max(1,...C.value.map(u=>u.regressions+u.newFlaky)));function L(u,n,a){const g=ie(C.value.length,u);return C.value.map((D,F)=>({d:D,slotX:F*g.slotWidth,slotWidth:g.slotWidth,barX:g.xOf(F),barWidth:g.barWidth,segments:Re([{color:d[0],value:D.regressions},{color:d[1],value:D.newFlaky}],n,a)}))}function N(u){const{centerOf:n}=ie(C.value.length,u),a=C.value.map(g=>g.date);return ke(a,Math.max(2,Math.floor(u/80))).map(g=>({x:n(g),label:$e(a[g])}))}const{data:x,pos:M,show:m,move:f,hide:y}=Ce(240),r=[{color:d[0],label:"New regressions"},{color:d[1],label:"Newly flaky"}],b=j(()=>{if(!o.value||o.value.deltaPct===null)return null;const u=o.value.deltaPct;return{label:`${u>0?"+":""}${u}% vs previous period`,class:u>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),P=j(()=>{if(o.value)return`${o.value.totalRegressions} new regressions, ${o.value.totalNewFlaky} newly flaky`});return(u,n)=>{const a=H,g=J,D=Z,F=te,se=be,ce=ve,de=ye;return t(),_(de,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:e(P),help:"analytics.regression-velocity",legend:r},{actions:p(()=>[e(b)?(t(),l("span",{key:0,class:B(["text-xs font-medium tabular-nums",e(b).class])},c(e(b).label),3)):A("",!0)]),default:p(()=>[e(O)?(t(),_(a,{key:0})):e(T)?(t(),_(D,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in u?u.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(g,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:n[0]||(n[0]=q=>e(z)())},{default:p(()=>[...n[3]||(n[3]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):e(k)?(t(),l("div",Cs,[S(se,{height:220,"y-max":e($)},{default:p(({plotWidth:q,plotHeight:Y,yScale:ne})=>[(t(!0),l(I,null,V(L(q,Y,ne),R=>(t(),l(I,{key:R.d.date.getTime()},[(t(!0),l(I,null,V(R.segments,U=>(t(),l("rect",{key:U.color,x:R.barX,y:U.y,width:R.barWidth,height:U.height,fill:U.color},null,8,ws))),128))],64))),128)),(t(!0),l(I,null,V(N(q),R=>(t(),l("text",{key:R.x,x:R.x,y:Y+14,"text-anchor":"middle",class:"fill-gray-400 dark:fill-gray-500 text-[10px]"},c(R.label),9,Ms))),128)),(t(!0),l(I,null,V(L(q,Y,ne),R=>(t(),l("rect",{key:`hover-${R.d.date.getTime()}`,x:R.slotX,y:0,width:R.slotWidth,height:Y,fill:e(x)===R.d?"rgb(148 163 184 / 0.15)":"transparent",onMouseenter:U=>e(m)(U,R.d),onMousemove:n[1]||(n[1]=U=>e(f)(U)),onMouseleave:n[2]||(n[2]=U=>e(y)())},null,40,Ss))),128))]),_:1},8,["y-max"]),e(x)?(t(),_(ce,{key:0,pos:e(M)},{default:p(()=>[s("div",Ts,c(e(x).date.toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),s("div",null,[n[4]||(n[4]=s("span",{class:"text-red-500"},"●",-1)),E(" New regressions: "+c(e(x).regressions),1)]),s("div",null,[n[5]||(n[5]=s("span",{class:"text-purple-500"},"●",-1)),E(" Newly flaky: "+c(e(x).newFlaky),1)])]),_:1},8,["pos"])):A("",!0)])):(t(),_(F,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),js=Object.assign(Rs,{__name:"RegressionVelocityChart"}),Es={class:"w-full text-sm border-separate border-spacing-1"},Is={class:"pr-2 max-w-[12rem]"},Vs=["title"],Ls=G({__name:"BrowserMatrix",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("browser-matrix",()=>w.query)),i=await i,h(),i);function C(k){return k===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":k>=99.5?"bg-green-500/85 text-white":k>=90?"bg-green-500/45":k>=75?"bg-amber-500/50":k>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(k,d)=>{const $=H,L=J,N=Z,x=te,M=re,m=_e,f=ue;return t(),_(f,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:p(()=>[e(O)?(t(),_($,{key:0})):e(T)?(t(),_(N,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in k?k.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(L,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=y=>e(z)())},{default:p(()=>[...d[1]||(d[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).rows.length===0?(t(),_(x,{key:2,text:"No runs with browser data in this period."})):(t(),_(m,{key:3,"min-width":"30rem"},{default:p(()=>[s("table",Es,[s("thead",null,[s("tr",null,[d[2]||(d[2]=s("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(t(!0),l(I,null,V(e(o).browsers,y=>(t(),l("th",{key:y,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},c(y),1))),128))])]),s("tbody",null,[(t(!0),l(I,null,V(e(o).rows,y=>(t(),l("tr",{key:y.projectId},[s("td",Is,[S(M,{to:`/projects/${y.projectId}`,class:"truncate hover:text-primary block",title:y.label||y.name},{default:p(()=>[E(c(y.label||y.name),1)]),_:2},1032,["to","title"])]),(t(!0),l(I,null,V(y.cells,(r,b)=>(t(),l("td",{key:b,class:B(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",C(r)]),title:`${y.label||y.name} · ${e(o).browsers[b]}: ${r!==null?`${r}% passed`:"no tests"}`},c(r!==null?`${Math.round(r)}%`:"—"),11,Vs))),128))]))),128))])])]),_:1}))]),_:1})}}}),Ns=Object.assign(Ls,{__name:"BrowserMatrix"}),Ds={class:"md:hidden space-y-3"},Os={class:"flex items-center gap-2 min-w-0"},zs={class:"text-xs truncate"},Ps={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},As={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},Bs={class:"hidden md:block"},Us={class:"w-full text-sm"},Fs={class:"divide-y divide-gray-100 dark:divide-gray-800"},qs={class:"py-2.5 pr-4"},Ws={class:"flex items-center gap-2 min-w-0"},Xs=["title"],Gs={class:"py-2.5 pr-4 text-right tabular-nums"},Ys={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},Js={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},Qs={class:"py-2.5 text-right tabular-nums"},Hs=G({__name:"SlowEndpointsTable",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("slow-endpoints",()=>w.query)),i=await i,h(),i);function C(d){return d>=1e3?"text-red-600 dark:text-red-400":d>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function k(d){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[d.toUpperCase()]??"neutral"}return(d,$)=>{const L=H,N=J,x=Z,M=Ye,m=Se,f=_e,y=ue;return t(),_(y,{icon:"i-lucide-gauge",title:"Slow endpoints",count:e(o)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=r=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).endpoints.length===0?(t(),_(M,{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"})):(t(),l(I,{key:3},[s("div",Ds,[(t(!0),l(I,null,V(e(o).endpoints,r=>(t(),l("div",{key:`${r.method} ${r.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[s("div",Os,[S(m,{color:k(r.method),variant:"subtle",size:"sm"},{default:p(()=>[E(c(r.method),1)]),_:2},1032,["color"]),s("code",zs,c(r.route),1)]),s("div",Ps,[s("span",null,[$[2]||($[2]=E("p90 ",-1)),s("span",{class:B(["tabular-nums font-medium",C(r.p90Ms)])},c(r.p90Ms)+" ms",3)]),s("span",null,c(r.requests)+" reqs · "+c(r.projectCount)+" proj",1),r.errorRate>0?(t(),l("span",As,c(r.errorRate)+"% err",1)):A("",!0)])]))),128))]),s("div",Bs,[S(f,{"min-width":"44rem"},{default:p(()=>[s("table",Us,[$[3]||($[3]=s("thead",null,[s("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[s("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),s("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),s("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),s("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),s("tbody",Fs,[(t(!0),l(I,null,V(e(o).endpoints,r=>(t(),l("tr",{key:`${r.method} ${r.route}`},[s("td",qs,[s("div",Ws,[S(m,{color:k(r.method),variant:"subtle",size:"sm"},{default:p(()=>[E(c(r.method),1)]),_:2},1032,["color"]),s("code",{class:"text-xs truncate max-w-[22rem]",title:r.route},c(r.route),9,Xs)])]),s("td",Gs,c(r.requests),1),s("td",Ys,c(r.p50Ms)+" ms",1),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums font-medium",C(r.p90Ms)])},c(r.p90Ms)+" ms ",3),s("td",Js,c(r.maxMs)+" ms",1),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums",r.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},c(r.errorRate)+"% ",3),s("td",Qs,c(r.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),Zs=Object.assign(Hs,{__name:"SlowEndpointsTable"}),Ks={class:"space-y-6"},en={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},tn={class:"text-sm text-muted"},sn={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},zn=G({__name:"analytics",async setup(v){let i,h;De({title:"Analytics - Piwi Dashboard"});const{state:w,scopeQuery:o}=He(),{data:O}=([i,h]=X(()=>ge("/api/projects/menu",{lazy:!0,server:!1,default:()=>[],transform:x=>x.items},"$sFpNat489G")),i=await i,h(),i),{data:T}=([i,h]=X(()=>ge("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[],transform:x=>x.items},"$QJEpX0hRMv")),i=await i,h(),i),z=j(()=>{const x=new Set;for(const M of T.value??[])M.environment&&x.add(M.environment);return[...x].sort()}),C=j(()=>{const x=new Set;for(const M of T.value??[])M.branch&&x.add(M.branch);return[...x].sort()}),k=j(()=>{const x=T.value??[];return x.length===0?null:Math.max(...x.map(M=>new Date(M.startTime).getTime()))}),d=j(()=>{if(k.value===null||w.value.days>=xe)return!1;const x=Date.now()-w.value.days*24*60*60*1e3;return k.value<x});function $(){w.value={...w.value,days:xe}}const L={insights:mt,portfolio:Et,"pass-rate-heatmap":zt,"ci-time-trend":Yt,"wasted-time":rs,"flaky-leaderboard":ps,"cluster-landscape":$s,"regression-velocity":js,"browser-matrix":Ns,"slow-endpoints":Zs},N=j(()=>rt.map(x=>({...x,widgets:je.filter(M=>M.band===x.id)})).filter(x=>x.widgets.length>0));return(x,M)=>{const m=Ee,f=Ie,y=Le,r=ot,b=Ae,P=Be,u=Ve;return t(),_(u,{id:"analytics"},{header:p(()=>[S(y,null,{leading:p(()=>[S(m),S(f,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:p(()=>[s("div",Ks,[S(b,null,{default:p(()=>[S(r,{modelValue:e(w),"onUpdate:modelValue":M[0]||(M[0]=n=>le(w)?w.value=n:null),"available-projects":e(O),"available-environments":e(z),"available-branches":e(C)},null,8,["modelValue","available-projects","available-environments","available-branches"])]),_:1}),e(d)?(t(),_(P,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${e(w).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:e(me))(e(k))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:$}]},null,8,["title","description","actions"])):A("",!0),(t(!0),l(I,null,V(e(N),n=>(t(),l("section",{key:n.id,class:"space-y-3"},[s("div",null,[s("h2",en,c(n.label),1),s("p",tn,c(n.description),1)]),s("div",sn,[(t(!0),l(I,null,V(n.widgets,a=>(t(),l("div",{key:a.id,class:B(a.size==="full"?"xl:col-span-2":"")},[(t(),_(Me(L[a.id]),{query:e(o)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{zn as default};
1
+ import{_ as Ee,a as Ie}from"./BuMX-4RF.js";import{_ as Ve,a as Le}from"./BS91Og__.js";import{_ as Ne}from"./e-GZmCeP.js";import{v as j,d as G,o as t,c as l,h as S,x as le,b as e,e as _,f as p,g as s,_ as pe,i as B,t as c,l as A,k as E,j as J,w as X,F as I,z as V,ai as Me,H as re,a1 as we,m as Se,s as De}from"./1QWBzxLM.js";import{_ as Oe}from"./UAmyrRCI.js";import{_ as ze}from"./BQUhoGCh.js";import{u as Pe}from"./CiCUZGFZ.js";import{u as ge}from"./CU_2YLhT.js";import{_ as Ae}from"./DcOlL-oi.js";import{_ as Be}from"./B-1zt4pp.js";import{e as Q,a as me,c as Ue}from"./D4mPjHHR.js";import{_ as H}from"./Bx_lfKHl.js";import{_ as Z}from"./DVo_e_uj.js";import{_ as te}from"./Dn_-RkxP.js";import{_ as ue}from"./bmAf49LT.js";import{_ as Fe}from"./CzRkZLB4.js";import{_ as Te}from"./mi7tdFxN.js";import{_ as qe}from"./Bc6Zr-Xn.js";import{_ as We}from"./DvSHenmZ.js";import{_ as _e}from"./BuXJR5tn.js";import{e as ye,_ as be,a as ve,b as ie,d as ke,f as $e,u as Ce,s as Re}from"./CkhOMiiO.js";import{_ as Xe}from"./DURme_kn.js";import{_ as Ge}from"./D-F0Rhjj.js";import{_ as Ye}from"./C4UKyPQn.js";import"./DpM8IgHL.js";import"./Bp1WeQ0_.js";import"./VBTxfbqU.js";import"./BTGAvMoT.js";import"./DBXXb0w8.js";import"./D_ZAGxCQ.js";import"./Bl0xzETD.js";import"./B82vqOZe.js";import"./CHz7LJIX.js";import"./AbnDY6Zr.js";const Je=30,xe=3650;function Qe(v){const i={days:String(v.days)};return v.projectIds&&v.projectIds.length>0&&(i.projects=v.projectIds.join(",")),v.environment&&(i.environment=v.environment),v.branch&&(i.branch=v.branch),v.fullRunsOnly||(i.fullRunsOnly="false"),i}const oe={days:Je,projectIds:[],environment:null,branch:null,fullRunsOnly:!0};function He(){const v=Pe("piwi-analytics-scope",{default:()=>({...oe}),encode:w=>JSON.stringify(w),decode:w=>{try{return w?{...oe,...JSON.parse(w)}:{...oe}}catch{return{...oe}}}}),i=j(()=>({days:v.value.days,projectIds:v.value.projectIds.length>0?v.value.projectIds:void 0,environment:v.value.environment,branch:v.value.branch,fullRunsOnly:v.value.fullRunsOnly})),h=j(()=>Qe(i.value));return{state:v,scope:i,scopeQuery:h}}function K(v,i){return ge(`/api/analytics/${v}`,{query:j(i),lazy:!0,server:!1},"$UlG3SHNJJg")}const Ze={class:"flex items-center gap-3 flex-wrap"},Ke={class:"flex items-center gap-1.5"},et={key:0,class:"text-gray-500"},tt={key:1,class:"truncate"},st={key:2},nt={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"},he="All environments",fe="All branches",at=G({__name:"AnalyticsScopeBar",props:{modelValue:{},availableProjects:{},availableEnvironments:{},availableBranches:{}},emits:["update:modelValue"],setup(v,{emit:i}){const h=v,w=i,o=[{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:xe}],O=j({get:()=>h.modelValue.days,set:m=>w("update:modelValue",{...h.modelValue,days:m})}),T=j(()=>h.availableProjects.map(m=>({label:m.label||m.name,value:m.id}))),z=j({get:()=>h.modelValue.projectIds,set:m=>w("update:modelValue",{...h.modelValue,projectIds:m})});function C(m){return T.value.find(f=>f.value===m)?.label??`#${m}`}const k=j({get:()=>h.modelValue.environment??he,set:m=>w("update:modelValue",{...h.modelValue,environment:m===he?null:m})}),d=j(()=>[he,...h.availableEnvironments]),$=j({get:()=>h.modelValue.branch??fe,set:m=>w("update:modelValue",{...h.modelValue,branch:m===fe?null:m})}),L=j(()=>[fe,...h.availableBranches??[]]),N=j({get:()=>h.modelValue.fullRunsOnly,set:m=>w("update:modelValue",{...h.modelValue,fullRunsOnly:m})}),x=j(()=>h.modelValue.days===oe.days&&h.modelValue.projectIds.length===0&&h.modelValue.environment===null&&h.modelValue.branch===null&&h.modelValue.fullRunsOnly===oe.fullRunsOnly);function M(){w("update:modelValue",{...oe})}return(m,f)=>{const y=Ne,r=pe,b=Oe,P=ze,u=J;return t(),l("div",Ze,[S(y,{modelValue:e(O),"onUpdate:modelValue":f[0]||(f[0]=n=>le(O)?O.value=n:null),items:o,size:"sm",class:"min-w-[140px]",icon:"i-lucide-calendar-range"},null,8,["modelValue"]),e(T).length>0?(t(),_(b,{key:0,modelValue:e(z),"onUpdate:modelValue":f[1]||(f[1]=n=>le(z)?z.value=n:null),items:e(T),"value-key":"value",multiple:"",searchable:"",size:"sm",class:"min-w-[170px]",placeholder:"All projects"},{default:p(({modelValue:n})=>[s("div",Ke,[S(r,{name:"i-lucide-folder",class:B(["size-3.5 shrink-0",n.length?"text-primary":"text-gray-400"])},null,8,["class"]),n.length?n.length===1?(t(),l("span",tt,c(C(n[0])),1)):(t(),l("span",st,c(n.length)+" projects",1)):(t(),l("span",et,"All projects"))])]),_:1},8,["modelValue","items"])):A("",!0),v.availableEnvironments.length>0?(t(),_(y,{key:1,modelValue:e(k),"onUpdate:modelValue":f[2]||(f[2]=n=>le(k)?k.value=n:null),items:e(d),size:"sm",class:"min-w-[160px]",icon:"i-lucide-server"},null,8,["modelValue","items"])):A("",!0),(v.availableBranches?.length??0)>0?(t(),_(y,{key:2,modelValue:e($),"onUpdate:modelValue":f[3]||(f[3]=n=>le($)?$.value=n:null),items:e(L),size:"sm",class:"min-w-[160px]",icon:"i-lucide-git-branch"},null,8,["modelValue","items"])):A("",!0),s("label",nt,[S(P,{modelValue:e(N),"onUpdate:modelValue":f[4]||(f[4]=n=>le(N)?N.value=n:null),size:"sm"},null,8,["modelValue"]),f[5]||(f[5]=E(" Full runs only ",-1))]),e(x)?A("",!0):(t(),_(u,{key:3,variant:"ghost",size:"sm",color:"neutral",icon:"i-lucide-x",onClick:M},{default:p(()=>[...f[6]||(f[6]=[E(" Reset ",-1)])]),_:1}))])}}}),ot=Object.assign(at,{__name:"AnalyticsScopeBar"}),rt=[{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."}],je=[{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(je.map(v=>v.id));const lt={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},it={class:"min-w-0"},ut={class:"text-sm font-medium"},ct={key:0,class:"text-xs text-gray-500 dark:text-gray-400 mt-0.5"},dt=G({__name:"InsightsFeed",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("insights",()=>w.query)),i=await i,h(),i),C=re,k={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(d,$)=>{const L=H,N=J,x=Z,M=te,m=pe,f=ue;return t(),_(f,{icon:"i-lucide-lightbulb",title:"Insights",count:e(o)?.length||void 0,help:"analytics.insights"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load insights: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=y=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).length===0?(t(),_(M,{key:2,icon:"i-lucide-check-circle",text:"Nothing needs your attention in this period."})):(t(),l("div",lt,[(t(!0),l(I,null,V(e(o),y=>(t(),_(Me(y.to?e(C):"div"),{key:y.id,to:y.to,class:B(["flex items-start gap-3 py-3 pl-3 border-l-2",[k[y.severity].border,y.to?"hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded-r transition-colors":""]])},{default:p(()=>[S(m,{name:k[y.severity].icon,class:B(["size-4 mt-0.5 shrink-0",k[y.severity].class])},null,8,["name","class"]),s("div",it,[s("p",ut,c(y.message),1),y.detail?(t(),l("p",ct,c(y.detail),1)):A("",!0)])]),_:2},1032,["to","class"]))),128))]))]),_:1},8,["count"])}}}),mt=Object.assign(dt,{__name:"InsightsFeed"}),pt={class:"md:hidden space-y-3"},_t={class:"flex items-center justify-between gap-2"},yt={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},ht={key:0},ft={class:"hidden md:block"},gt={class:"w-full text-sm"},xt={class:"divide-y divide-gray-100 dark:divide-gray-800"},bt={class:"py-2.5 pr-4"},vt={class:"flex items-center gap-2 min-w-0"},kt={class:"py-2.5 pr-4"},$t={class:"w-36"},Ct={class:"py-2.5 pr-4 text-right"},wt={class:"py-2.5 pr-4 text-right tabular-nums"},Mt={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500 dark:text-gray-400"},St={class:"py-2.5 text-right"},Tt={class:"text-xs text-gray-500 dark:text-gray-400"},Rt={key:1,class:"text-xs text-gray-400"},jt=G({__name:"PortfolioScorecard",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("portfolio",()=>w.query)),i=await i,h(),i);function C(d){return d===null?"text-gray-400":d>=90?"text-green-600 dark:text-green-400":d>=50?"text-yellow-600 dark:text-yellow-400":"text-red-600 dark:text-red-400"}function k(d){return d===null||Math.abs(d)<1?null:d>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(d,$)=>{const L=H,N=J,x=Z,M=te,m=re,f=Fe,y=Te,r=pe,b=qe,P=We,u=_e,n=ue;return t(),_(n,{icon:"i-lucide-table-properties",title:"Portfolio health",count:e(o)?.length||void 0,help:"analytics.portfolio"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load the portfolio: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=a=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).length===0?(t(),_(M,{key:2,text:"No projects with runs in this period."})):(t(),l(I,{key:3},[s("div",pt,[(t(!0),l(I,null,V(e(o),a=>(t(),l("div",{key:a.projectId,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-2"},[s("div",_t,[S(m,{to:`/projects/${a.projectId}`,class:"font-medium truncate hover:text-primary"},{default:p(()=>[E(c(a.label||a.name),1)]),_:2},1032,["to"]),s("span",{class:B(["tabular-nums font-semibold shrink-0",C(a.passRate)])},c(a.passRate!==null?`${a.passRate}%`:"—"),3)]),S(f,{runs:a.recentRuns,height:20},null,8,["runs"]),s("div",yt,[s("span",null,c(a.runCount)+" runs · "+c(a.flakyTests)+" flaky · "+c(a.openClusters)+" open clusters",1),a.latestRun?(t(),l("span",ht,c(("formatRelativeTime"in d?d.formatRelativeTime:e(me))(a.latestRun.startTime)),1)):A("",!0)])]))),128))]),s("div",ft,[S(u,{"min-width":"52rem"},{default:p(()=>[s("table",gt,[$[2]||($[2]=s("thead",null,[s("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[s("th",{class:"py-2 pr-4 font-medium"},"Project"),s("th",{class:"py-2 pr-4 font-medium"},"Trend"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Pass rate"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Runs"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Flaky"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Avg run"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Open clusters"),s("th",{class:"py-2 font-medium text-right"},"Latest run")])],-1)),s("tbody",xt,[(t(!0),l(I,null,V(e(o),a=>(t(),l("tr",{key:a.projectId},[s("td",bt,[s("div",vt,[S(m,{to:`/projects/${a.projectId}`,class:"font-medium truncate hover:text-primary"},{default:p(()=>[E(c(a.label||a.name),1)]),_:2},1032,["to"]),(t(!0),l(I,null,V(a.tags.slice(0,2),g=>(t(),_(y,{key:g.id,text:g.text,color:g.color},null,8,["text","color"]))),128))])]),s("td",kt,[s("div",$t,[S(f,{runs:a.recentRuns,height:22},null,8,["runs"])])]),s("td",Ct,[s("span",{class:B(["inline-flex items-center gap-1 tabular-nums font-semibold",C(a.passRate)])},[E(c(a.passRate!==null?`${a.passRate}%`:"—")+" ",1),k(a.passRateDelta)?(t(),_(r,{key:0,name:k(a.passRateDelta).icon,class:B(["size-3.5",k(a.passRateDelta).class]),title:`${a.passRateDelta>0?"+":""}${a.passRateDelta} pts vs previous period`},null,8,["name","class","title"])):A("",!0)],2)]),s("td",wt,c(a.runCount),1),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums",a.flakyTests>0?"text-amber-600 dark:text-amber-400":""])},c(a.flakyTests),3),s("td",Mt,[S(b,{ms:a.avgRunDurationMs},null,8,["ms"])]),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums",a.openClusters>0?"text-red-600 dark:text-red-400":""])},c(a.openClusters),3),s("td",St,[a.latestRun?(t(),_(m,{key:0,to:`/test-runs/${a.latestRun.id}`,class:"inline-flex items-center gap-2 hover:text-primary"},{default:p(()=>[S(P,{status:a.latestRun.status},null,8,["status"]),s("span",Tt,c(("formatRelativeTime"in d?d.formatRelativeTime:e(me))(a.latestRun.startTime)),1)]),_:2},1032,["to"])):(t(),l("span",Rt,"No runs"))])]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),Et=Object.assign(jt,{__name:"PortfolioScorecard"}),It={class:"space-y-1"},Vt={class:"flex gap-px"},Lt=["title"],Nt={class:"grid gap-2",style:{"grid-template-columns":"8rem 1fr"}},Dt={class:"relative h-4"},Ot=G({__name:"PassRateHeatmap",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("pass-rate-heatmap",()=>w.query)),i=await i,h(),i);function C(m){return m===null?{}:m>=99.5?{backgroundColor:"rgba(34, 197, 94, 0.85)"}:m>=90?{backgroundColor:"rgba(34, 197, 94, 0.5)"}:m>=75?{backgroundColor:"rgba(245, 158, 11, 0.55)"}:m>=50?{backgroundColor:"rgba(249, 115, 22, 0.65)"}:{backgroundColor:"rgba(239, 68, 68, 0.75)"}}function k(m,f,y){const r=o.value?.buckets[f]??"",b=(o.value?.bucketDays??1)>1?` (${o.value.bucketDays} days)`:"";return`${m.label||m.name} · ${r}${b}: ${y!==null?`${y}% passed`:"no runs"}`}const d=[{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%"}],$=j(()=>{const m=o.value?.bucketDays??1;return m>1?`One cell = ${m} days`:"One cell = one day"}),L=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],N=j(()=>{const m=o.value?.buckets??[];return m.length>1&&m[0].slice(0,4)!==m[m.length-1].slice(0,4)});function x(m){const[f,y,r]=m.split("-"),b=L[Number(y)-1];return N.value?`${b} ${f}`:`${b} ${Number(r)}`}const M=j(()=>{const m=o.value?.buckets??[],f=m.length;if(f===0)return[];const y=Math.min(N.value?4:5,f),r=new Set,b=[];for(let P=0;P<y;P++){const u=y===1?0:Math.round(P*(f-1)/(y-1));if(r.has(u))continue;r.add(u);const n=u===0?0:u===f-1?100:(u+.5)/f*100,a=u===0?"translateX(0)":u===f-1?"translateX(-100%)":"translateX(-50%)";b.push({index:u,label:x(m[u]),left:n,transform:a})}return b});return(m,f)=>{const y=H,r=J,b=Z,P=te,u=re,n=_e,a=ye;return t(),_(a,{icon:"i-lucide-grid-3x3",title:"Pass rate heatmap",subtitle:e($),help:"analytics.heatmap",legend:d},{default:p(()=>[e(O)?(t(),_(y,{key:0})):e(T)?(t(),_(b,{key:1,text:`Couldn't load the heatmap: ${("errorMessage"in m?m.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(r,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:f[0]||(f[0]=g=>e(z)())},{default:p(()=>[...f[1]||(f[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).rows.length===0?(t(),_(P,{key:2,text:"No runs in this period."})):(t(),_(n,{key:3,"min-width":"22rem"},{default:p(()=>[s("div",It,[(t(!0),l(I,null,V(e(o).rows,g=>(t(),l("div",{key:g.projectId,class:"grid items-center gap-2",style:{"grid-template-columns":"8rem 1fr"}},[S(u,{to:`/projects/${g.projectId}`,class:"text-sm truncate hover:text-primary",title:g.label||g.name},{default:p(()=>[E(c(g.label||g.name),1)]),_:2},1032,["to","title"]),s("div",Vt,[(t(!0),l(I,null,V(g.cells,(D,F)=>(t(),l("div",{key:F,class:"h-6 flex-1 rounded-sm min-w-1 bg-gray-100 dark:bg-gray-800",style:we(C(D)),title:k(g,F,D)},null,12,Lt))),128))])]))),128)),s("div",Nt,[f[2]||(f[2]=s("span",null,null,-1)),s("div",Dt,[(t(!0),l(I,null,V(e(M),g=>(t(),l("span",{key:g.index,class:"absolute top-0 text-xs text-gray-400 whitespace-nowrap",style:we({left:`${g.left}%`,transform:g.transform})},c(g.label),5))),128))])])])]),_:1}))]),_:1},8,["subtitle"])}}}),zt=Object.assign(Ot,{__name:"PassRateHeatmap"}),Pt={key:3,class:"w-full"},At=["d"],Bt=["d"],Ut=["x","y"],Ft=["x","width","height","fill","onMouseenter"],qt={class:"font-semibold mb-1"},Wt={class:"text-gray-400 text-xs"},Xt="rgb(59, 130, 246)",Gt=G({__name:"CiTimeTrendChart",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("ci-time-trend",()=>w.query)),i=await i,h(),i),C=j(()=>o.value?.points.map(u=>({date:new Date(u.date),totalMinutes:u.totalMinutes,runCount:u.runCount}))??[]),k=j(()=>C.value.some(u=>u.runCount>0)),d=j(()=>Math.max(1,...C.value.map(u=>u.totalMinutes)));function $(u){const{centerOf:n}=ie(C.value.length,u);return C.value.map((a,g)=>n(g))}function L(u,n){const a=$(u);return C.value.map((g,D)=>`${D===0?"M":"L"}${a[D]},${n(g.totalMinutes)}`).join("")}function N(u,n,a){const g=$(u);return g.length===0?"":`${L(u,a)}L${g[g.length-1]},${n}L${g[0]},${n}Z`}function x(u){const{centerOf:n}=ie(C.value.length,u),a=C.value.map(g=>g.date);return ke(a,Math.max(2,Math.floor(u/80))).map(g=>({x:n(g),label:$e(a[g])}))}const{data:M,pos:m,show:f,move:y,hide:r}=Ce(240),b=j(()=>{if(!o.value||o.value.deltaPct===null)return null;const u=o.value.deltaPct;return{label:`${u>0?"+":""}${u}% vs previous period`,class:u>25?"text-red-600 dark:text-red-400":u<-10?"text-green-600 dark:text-green-400":"text-gray-500"}}),P=j(()=>{if(!o.value)return;const u=o.value.totalMinutes;return`${u<60?`${Math.round(u)} min`:`${Math.round(u/60*10)/10} h`} across ${o.value.runCount} runs`});return(u,n)=>{const a=H,g=J,D=Z,F=te,se=be,ce=ve,de=ye;return t(),_(de,{icon:"i-lucide-timer",title:"CI time",subtitle:e(P),help:"analytics.ci-time"},{actions:p(()=>[e(b)?(t(),l("span",{key:0,class:B(["text-xs font-medium tabular-nums",e(b).class])},c(e(b).label),3)):A("",!0)]),default:p(()=>[e(O)?(t(),_(a,{key:0})):e(T)?(t(),_(D,{key:1,text:`Couldn't load CI time: ${("errorMessage"in u?u.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(g,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:n[0]||(n[0]=q=>e(z)())},{default:p(()=>[...n[3]||(n[3]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):e(k)?(t(),l("div",Pt,[S(se,{height:220,"y-max":e(d),"y-format":q=>`${q}m`},{default:p(({plotWidth:q,plotHeight:Y,yScale:ne})=>[s("path",{d:N(q,Y,ne),fill:"rgba(59, 130, 246, 0.15)"},null,8,At),s("path",{d:L(q,ne),fill:"none",stroke:Xt,"stroke-width":"2"},null,8,Bt),(t(!0),l(I,null,V(x(q),R=>(t(),l("text",{key:R.x,x:R.x,y:Y+14,"text-anchor":"middle",class:"fill-gray-400 dark:fill-gray-500 text-[10px]"},c(R.label),9,Ut))),128)),(t(!0),l(I,null,V(e(C),(R,U)=>(t(),l("rect",{key:`hover-${R.date.getTime()}`,x:U*(q/e(C).length),y:0,width:q/e(C).length,height:Y,fill:e(M)===R?"rgb(148 163 184 / 0.15)":"transparent",onMouseenter:ae=>e(f)(ae,R),onMousemove:n[1]||(n[1]=ae=>e(y)(ae)),onMouseleave:n[2]||(n[2]=ae=>e(r)())},null,40,Ft))),128))]),_:1},8,["y-max","y-format"]),e(M)?(t(),_(ce,{key:0,pos:e(m)},{default:p(()=>[s("div",qt,c(e(M).date.toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),s("div",null,c(e(M).totalMinutes)+" minutes",1),s("div",Wt,c(e(M).runCount)+" runs",1)]),_:1},8,["pos"])):A("",!0)])):(t(),_(F,{key:2,text:"No runs in this period."}))]),_:1},8,["subtitle"])}}}),Yt=Object.assign(Gt,{__name:"CiTimeTrendChart"}),Jt={key:3,class:"w-full"},Qt=["x","y","width","height","fill"],Ht=["x","y"],Zt=["x","width","height","fill","onMouseenter"],Kt={class:"font-semibold mb-1"},es={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"},ts={class:"text-gray-700 dark:text-gray-300"},ss={class:"font-semibold"},ns={key:2,class:"mt-4 space-y-1"},as={class:"tabular-nums text-gray-500 dark:text-gray-400 shrink-0"},os=G({__name:"WastedTimeChart",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("wasted-time",()=>w.query)),i=await i,h(),i),C=j(()=>o.value?.points.map(n=>({date:new Date(n.date),waitMinutes:n.waitMinutes,failedExecMinutes:n.failedExecMinutes}))??[]),k=j(()=>C.value.some(n=>n.waitMinutes>0||n.failedExecMinutes>0)),d=["rgb(245, 158, 11)","rgb(239, 68, 68)"],$=j(()=>Math.max(1,...C.value.map(n=>n.waitMinutes+n.failedExecMinutes)));function L(n,a,g){const D=ie(C.value.length,n);return C.value.map((F,se)=>({d:F,slotX:se*D.slotWidth,slotWidth:D.slotWidth,barX:D.xOf(se),barWidth:D.barWidth,segments:Re([{color:d[0],value:F.waitMinutes},{color:d[1],value:F.failedExecMinutes}],a,g)}))}function N(n){const{centerOf:a}=ie(C.value.length,n),g=C.value.map(D=>D.date);return ke(g,Math.max(2,Math.floor(n/80))).map(D=>({x:a(D),label:$e(g[D])}))}const{data:x,pos:M,show:m,move:f,hide:y}=Ce(240),r=[{color:d[0],label:"Wait steps"},{color:d[1],label:"Failed attempts"}],b=j(()=>{if(!o.value)return;const n=o.value.totalWaitMinutes+o.value.totalFailedExecMinutes;return`${n<60?`${Math.round(n)} min`:`${Math.round(n/60*10)/10} h`} of CI time produced no signal`}),P=j(()=>o.value?.timeoutReclaimable??null),u=j(()=>{const n=P.value?.estimatedMinutes??0;return n<60?`${Math.round(n)} min`:`${Math.round(n/60*10)/10} h`});return(n,a)=>{const g=H,D=J,F=Z,se=te,ce=be,de=ve,q=pe,Y=re,ne=ye;return t(),_(ne,{icon:"i-lucide-hourglass",title:"Wasted CI time",subtitle:e(b),help:"analytics.wasted-time",legend:r},{default:p(()=>[e(O)?(t(),_(g,{key:0})):e(T)?(t(),_(F,{key:1,text:`Couldn't load wasted time: ${("errorMessage"in n?n.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(D,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:a[0]||(a[0]=R=>e(z)())},{default:p(()=>[...a[3]||(a[3]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):e(k)?(t(),l("div",Jt,[S(ce,{height:220,"y-max":e($),"y-format":R=>`${R}m`},{default:p(({plotWidth:R,plotHeight:U,yScale:ae})=>[(t(!0),l(I,null,V(L(R,U,ae),W=>(t(),l(I,{key:W.d.date.getTime()},[(t(!0),l(I,null,V(W.segments,ee=>(t(),l("rect",{key:ee.color,x:W.barX,y:ee.y,width:W.barWidth,height:ee.height,fill:ee.color},null,8,Qt))),128))],64))),128)),(t(!0),l(I,null,V(N(R),W=>(t(),l("text",{key:W.x,x:W.x,y:U+14,"text-anchor":"middle",class:"fill-gray-400 dark:fill-gray-500 text-[10px]"},c(W.label),9,Ht))),128)),(t(!0),l(I,null,V(L(R,U,ae),W=>(t(),l("rect",{key:`hover-${W.d.date.getTime()}`,x:W.slotX,y:0,width:W.slotWidth,height:U,fill:e(x)===W.d?"rgb(148 163 184 / 0.15)":"transparent",onMouseenter:ee=>e(m)(ee,W.d),onMousemove:a[1]||(a[1]=ee=>e(f)(ee)),onMouseleave:a[2]||(a[2]=ee=>e(y)())},null,40,Zt))),128))]),_:1},8,["y-max","y-format"]),e(x)?(t(),_(de,{key:0,pos:e(M)},{default:p(()=>[s("div",Kt,c(e(x).date.toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),s("div",null,[a[4]||(a[4]=s("span",{class:"text-amber-500"},"●",-1)),E(" Wait steps: "+c(e(x).waitMinutes)+" min",1)]),s("div",null,[a[5]||(a[5]=s("span",{class:"text-red-500"},"●",-1)),E(" Failed attempts: "+c(e(x).failedExecMinutes)+" min",1)])]),_:1},8,["pos"])):A("",!0),e(P)?(t(),l("div",es,[S(q,{name:"i-lucide-scissors",class:"mt-0.5 shrink-0 text-amber-500"}),s("div",ts,[a[7]||(a[7]=E(" Up to ",-1)),s("span",ss,"≈"+c(e(u)),1),E(" of this is avoidable — "+c(e(P).oversizedCount)+" oversized "+c(e(P).oversizedCount===1?"timeout":"timeouts")+" and "+c(e(P).staleSlowCount)+" stale ",1),a[8]||(a[8]=s("code",{class:"text-xs"},"test.slow()",-1)),E(" "+c(e(P).staleSlowCount===1?"mark":"marks")+" inflate the failed-attempt time above. ",1),e(P).topProjectId?(t(),_(Y,{key:0,to:`/projects/${e(P).topProjectId}#performance`,class:"text-primary hover:underline"},{default:p(()=>[...a[6]||(a[6]=[E("Review",-1)])]),_:1},8,["to"])):A("",!0)])])):A("",!0),e(o)&&e(o).byProject.length>0?(t(),l("div",ns,[(t(!0),l(I,null,V(e(o).byProject.slice(0,5),R=>(t(),l("div",{key:R.projectId,class:"flex items-center justify-between text-sm"},[S(Y,{to:`/projects/${R.projectId}`,class:"truncate hover:text-primary"},{default:p(()=>[E(c(R.label||R.name),1)]),_:2},1032,["to"]),s("span",as,c(Math.round(R.waitMinutes+R.failedExecMinutes))+" min ",1)]))),128))])):A("",!0)])):(t(),_(se,{key:2,text:"No wasted time recorded in this period."}))]),_:1},8,["subtitle"])}}}),rs=Object.assign(os,{__name:"WastedTimeChart"}),ls={key:3,class:"divide-y divide-gray-100 dark:divide-gray-800"},is={class:"flex-1 min-w-0"},us={class:"text-sm font-medium truncate"},cs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},ds={class:"text-right shrink-0"},ms=G({__name:"GlobalFlakyLeaderboard",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("flaky-leaderboard",()=>w.query)),i=await i,h(),i);function C(d){return d>=60?"text-red-600 dark:text-red-400":d>=30?"text-amber-600 dark:text-amber-400":"text-gray-500"}function k(d){return d.retryPassRuns>0?`flaked ${d.retryPassRuns}/${d.totalRuns} runs`:`${d.alternations} status flips in ${d.totalRuns} runs`}return(d,$)=>{const L=H,N=J,x=Z,M=te,m=Te,f=re,y=ue;return t(),_(y,{icon:"i-lucide-repeat",title:"Flakiest tests",count:e(o)?.length||void 0,subtitle:"Across all projects, sorted by impact",help:"analytics.flaky-leaderboard"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load flaky tests: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=r=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).length===0?(t(),_(M,{key:2,text:"No flaky tests detected. Nice and stable."})):(t(),l("div",ls,[(t(!0),l(I,null,V(e(o),r=>(t(),_(f,{key:`${r.projectId}-${r.testCaseId}`,to:`/test-cases/${r.testCaseId}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:p(()=>[s("span",{class:B(["tabular-nums font-bold text-sm w-10 text-right shrink-0",C(r.score)])},c(r.score),3),s("div",is,[s("p",us,c(r.title),1),s("p",cs,[E(c(r.projectLabel||r.projectName)+" · "+c(k(r))+" ",1),r.lastFlakeAt?(t(),l(I,{key:0},[E(" · last "+c(("formatRelativeTime"in d?d.formatRelativeTime:e(me))(r.lastFlakeAt)),1)],64)):A("",!0)])]),s("div",ds,[s("p",{class:B(["text-sm tabular-nums",r.wastedCiMinutes>=30?"text-red-600 dark:text-red-400":r.wastedCiMinutes>=5?"text-amber-600 dark:text-amber-400":"text-gray-500"])},c(Math.round(r.wastedCiMinutes))+" min ",3),r.rootCause?(t(),_(m,{key:0,text:r.rootCause,color:"neutral"},null,8,["text"])):A("",!0)])]),_:2},1032,["to"]))),128))]))]),_:1},8,["count"])}}}),ps=Object.assign(ms,{__name:"GlobalFlakyLeaderboard"}),_s={key:3,class:"space-y-4"},ys={key:0,class:"flex flex-wrap gap-1.5"},hs={class:"divide-y divide-gray-100 dark:divide-gray-800"},fs={class:"flex-1 min-w-0"},gs={class:"text-sm font-medium truncate"},xs={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},bs={class:"text-right text-xs shrink-0"},vs={class:"tabular-nums font-medium"},ks=G({__name:"ClusterLandscape",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("cluster-landscape",()=>w.query)),i=await i,h(),i);function C(k){return k>=30?"text-red-600 dark:text-red-400":k>=14?"text-amber-600 dark:text-amber-400":"text-gray-500"}return(k,d)=>{const $=H,L=J,N=Z,x=te,M=Xe,m=Ge,f=Se,y=re,r=ue;return t(),_(r,{icon:"i-lucide-layers",title:"Failure clusters",subtitle:"Open root causes across all projects",help:"analytics.cluster-landscape"},{default:p(()=>[e(O)?(t(),_($,{key:0})):e(T)?(t(),_(N,{key:1,text:`Couldn't load clusters: ${("errorMessage"in k?k.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(L,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=b=>e(z)())},{default:p(()=>[...d[1]||(d[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).totalOpen===0&&e(o).resolvedInPeriod===0?(t(),_(x,{key:2,icon:"i-lucide-check-circle",text:"No open failure clusters."})):(t(),l("div",_s,[S(m,null,{default:p(()=>[S(M,{label:"Open",value:e(o).totalOpen,"value-class":e(o).totalOpen>0?"text-red-600 dark:text-red-400":""},null,8,["value","value-class"]),S(M,{label:"Resolved this period",value:e(o).resolvedInPeriod},null,8,["value"]),S(M,{label:"Oldest open",value:e(o).clusters.length>0?`${Math.max(...e(o).clusters.map(b=>b.ageDays))} d`:"—",size:"lg"},null,8,["value"])]),_:1}),e(o).byErrorType.length>0?(t(),l("div",ys,[(t(!0),l(I,null,V(e(o).byErrorType,b=>(t(),_(f,{key:b.errorType,color:("clusterErrorTypeColor"in k?k.clusterErrorTypeColor:e(Ue))(b.errorType),variant:"subtle",size:"sm"},{default:p(()=>[E(c(b.errorType)+" · "+c(b.count),1)]),_:2},1032,["color"]))),128))])):A("",!0),s("div",hs,[(t(!0),l(I,null,V(e(o).clusters.slice(0,8),b=>(t(),_(y,{key:b.id,to:`/failure-clusters/${b.id}`,class:"flex items-center gap-3 py-2.5 hover:bg-gray-50 dark:hover:bg-gray-800/60 rounded transition-colors"},{default:p(()=>[s("div",fs,[s("p",gs,c(b.title||b.signature),1),s("p",xs,[E(c(b.projectLabel||b.projectName)+" ",1),b.errorType?(t(),l(I,{key:0},[E(" · "+c(b.errorType),1)],64)):A("",!0)])]),s("div",bs,[s("p",vs,c(b.occurrences)+"×",1),s("p",{class:B(["tabular-nums",C(b.ageDays)])},c(b.ageDays)+" d open",3)])]),_:2},1032,["to"]))),128))])]))]),_:1})}}}),$s=Object.assign(ks,{__name:"ClusterLandscape"}),Cs={key:3,class:"w-full"},ws=["x","y","width","height","fill"],Ms=["x","y"],Ss=["x","width","height","fill","onMouseenter"],Ts={class:"font-semibold mb-1"},Rs=G({__name:"RegressionVelocityChart",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("regression-velocity",()=>w.query)),i=await i,h(),i),C=j(()=>o.value?.points.map(u=>({date:new Date(u.date),regressions:u.regressions,newFlaky:u.newFlaky}))??[]),k=j(()=>C.value.some(u=>u.regressions>0||u.newFlaky>0)),d=["rgb(239, 68, 68)","rgb(147, 51, 234)"],$=j(()=>Math.max(1,...C.value.map(u=>u.regressions+u.newFlaky)));function L(u,n,a){const g=ie(C.value.length,u);return C.value.map((D,F)=>({d:D,slotX:F*g.slotWidth,slotWidth:g.slotWidth,barX:g.xOf(F),barWidth:g.barWidth,segments:Re([{color:d[0],value:D.regressions},{color:d[1],value:D.newFlaky}],n,a)}))}function N(u){const{centerOf:n}=ie(C.value.length,u),a=C.value.map(g=>g.date);return ke(a,Math.max(2,Math.floor(u/80))).map(g=>({x:n(g),label:$e(a[g])}))}const{data:x,pos:M,show:m,move:f,hide:y}=Ce(240),r=[{color:d[0],label:"New regressions"},{color:d[1],label:"Newly flaky"}],b=j(()=>{if(!o.value||o.value.deltaPct===null)return null;const u=o.value.deltaPct;return{label:`${u>0?"+":""}${u}% vs previous period`,class:u>0?"text-red-600 dark:text-red-400":"text-green-600 dark:text-green-400"}}),P=j(()=>{if(o.value)return`${o.value.totalRegressions} new regressions, ${o.value.totalNewFlaky} newly flaky`});return(u,n)=>{const a=H,g=J,D=Z,F=te,se=be,ce=ve,de=ye;return t(),_(de,{icon:"i-lucide-git-pull-request-arrow",title:"Regression velocity",subtitle:e(P),help:"analytics.regression-velocity",legend:r},{actions:p(()=>[e(b)?(t(),l("span",{key:0,class:B(["text-xs font-medium tabular-nums",e(b).class])},c(e(b).label),3)):A("",!0)]),default:p(()=>[e(O)?(t(),_(a,{key:0})):e(T)?(t(),_(D,{key:1,text:`Couldn't load regression velocity: ${("errorMessage"in u?u.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(g,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:n[0]||(n[0]=q=>e(z)())},{default:p(()=>[...n[3]||(n[3]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):e(k)?(t(),l("div",Cs,[S(se,{height:220,"y-max":e($)},{default:p(({plotWidth:q,plotHeight:Y,yScale:ne})=>[(t(!0),l(I,null,V(L(q,Y,ne),R=>(t(),l(I,{key:R.d.date.getTime()},[(t(!0),l(I,null,V(R.segments,U=>(t(),l("rect",{key:U.color,x:R.barX,y:U.y,width:R.barWidth,height:U.height,fill:U.color},null,8,ws))),128))],64))),128)),(t(!0),l(I,null,V(N(q),R=>(t(),l("text",{key:R.x,x:R.x,y:Y+14,"text-anchor":"middle",class:"fill-gray-400 dark:fill-gray-500 text-[10px]"},c(R.label),9,Ms))),128)),(t(!0),l(I,null,V(L(q,Y,ne),R=>(t(),l("rect",{key:`hover-${R.d.date.getTime()}`,x:R.slotX,y:0,width:R.slotWidth,height:Y,fill:e(x)===R.d?"rgb(148 163 184 / 0.15)":"transparent",onMouseenter:U=>e(m)(U,R.d),onMousemove:n[1]||(n[1]=U=>e(f)(U)),onMouseleave:n[2]||(n[2]=U=>e(y)())},null,40,Ss))),128))]),_:1},8,["y-max"]),e(x)?(t(),_(ce,{key:0,pos:e(M)},{default:p(()=>[s("div",Ts,c(e(x).date.toLocaleDateString("en-US",{month:"short",day:"numeric"})),1),s("div",null,[n[4]||(n[4]=s("span",{class:"text-red-500"},"●",-1)),E(" New regressions: "+c(e(x).regressions),1)]),s("div",null,[n[5]||(n[5]=s("span",{class:"text-purple-500"},"●",-1)),E(" Newly flaky: "+c(e(x).newFlaky),1)])]),_:1},8,["pos"])):A("",!0)])):(t(),_(F,{key:2,icon:"i-lucide-shield-check",text:"No new regressions in this period."}))]),_:1},8,["subtitle"])}}}),js=Object.assign(Rs,{__name:"RegressionVelocityChart"}),Es={class:"w-full text-sm border-separate border-spacing-1"},Is={class:"pr-2 max-w-[12rem]"},Vs=["title"],Ls=G({__name:"BrowserMatrix",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("browser-matrix",()=>w.query)),i=await i,h(),i);function C(k){return k===null?"bg-gray-100 dark:bg-gray-800 text-gray-400":k>=99.5?"bg-green-500/85 text-white":k>=90?"bg-green-500/45":k>=75?"bg-amber-500/50":k>=50?"bg-orange-500/60":"bg-red-500/70 text-white"}return(k,d)=>{const $=H,L=J,N=Z,x=te,M=re,m=_e,f=ue;return t(),_(f,{icon:"i-lucide-monitor-smartphone",title:"Browser matrix",help:"analytics.browser-matrix"},{default:p(()=>[e(O)?(t(),_($,{key:0})):e(T)?(t(),_(N,{key:1,text:`Couldn't load the browser matrix: ${("errorMessage"in k?k.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(L,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:d[0]||(d[0]=y=>e(z)())},{default:p(()=>[...d[1]||(d[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).rows.length===0?(t(),_(x,{key:2,text:"No runs with browser data in this period."})):(t(),_(m,{key:3,"min-width":"30rem"},{default:p(()=>[s("table",Es,[s("thead",null,[s("tr",null,[d[2]||(d[2]=s("th",{class:"text-left text-xs text-gray-500 uppercase tracking-wider font-medium pr-2"},"Project",-1)),(t(!0),l(I,null,V(e(o).browsers,y=>(t(),l("th",{key:y,class:"text-xs text-gray-500 uppercase tracking-wider font-medium px-1 text-center"},c(y),1))),128))])]),s("tbody",null,[(t(!0),l(I,null,V(e(o).rows,y=>(t(),l("tr",{key:y.projectId},[s("td",Is,[S(M,{to:`/projects/${y.projectId}`,class:"truncate hover:text-primary block",title:y.label||y.name},{default:p(()=>[E(c(y.label||y.name),1)]),_:2},1032,["to","title"])]),(t(!0),l(I,null,V(y.cells,(r,b)=>(t(),l("td",{key:b,class:B(["text-center tabular-nums rounded-md px-2 py-1.5 font-medium",C(r)]),title:`${y.label||y.name} · ${e(o).browsers[b]}: ${r!==null?`${r}% passed`:"no tests"}`},c(r!==null?`${Math.round(r)}%`:"—"),11,Vs))),128))]))),128))])])]),_:1}))]),_:1})}}}),Ns=Object.assign(Ls,{__name:"BrowserMatrix"}),Ds={class:"md:hidden space-y-3"},Os={class:"flex items-center gap-2 min-w-0"},zs={class:"text-xs truncate"},Ps={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},As={key:0,class:"text-red-600 dark:text-red-400 tabular-nums"},Bs={class:"hidden md:block"},Us={class:"w-full text-sm"},Fs={class:"divide-y divide-gray-100 dark:divide-gray-800"},qs={class:"py-2.5 pr-4"},Ws={class:"flex items-center gap-2 min-w-0"},Xs=["title"],Gs={class:"py-2.5 pr-4 text-right tabular-nums"},Ys={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},Js={class:"py-2.5 pr-4 text-right tabular-nums text-gray-500"},Qs={class:"py-2.5 text-right tabular-nums"},Hs=G({__name:"SlowEndpointsTable",props:{query:{}},async setup(v){let i,h;const w=v,{data:o,pending:O,error:T,refresh:z}=([i,h]=X(()=>K("slow-endpoints",()=>w.query)),i=await i,h(),i);function C(d){return d>=1e3?"text-red-600 dark:text-red-400":d>=500?"text-amber-600 dark:text-amber-400":"text-gray-600 dark:text-gray-300"}function k(d){return{GET:"info",POST:"success",PUT:"warning",PATCH:"warning",DELETE:"error"}[d.toUpperCase()]??"neutral"}return(d,$)=>{const L=H,N=J,x=Z,M=Ye,m=Se,f=_e,y=ue;return t(),_(y,{icon:"i-lucide-gauge",title:"Slow endpoints",count:e(o)?.endpoints.length||void 0,subtitle:"Backend calls across all projects, slowest first",help:"analytics.slow-endpoints"},{default:p(()=>[e(O)?(t(),_(L,{key:0})):e(T)?(t(),_(x,{key:1,text:`Couldn't load slow endpoints: ${("errorMessage"in d?d.errorMessage:e(Q))(e(T))}`},{action:p(()=>[S(N,{size:"sm",color:"neutral",variant:"outline",icon:"i-lucide-refresh-cw",onClick:$[0]||($[0]=r=>e(z)())},{default:p(()=>[...$[1]||($[1]=[E(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):!e(o)||e(o).endpoints.length===0?(t(),_(M,{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"})):(t(),l(I,{key:3},[s("div",Ds,[(t(!0),l(I,null,V(e(o).endpoints,r=>(t(),l("div",{key:`${r.method} ${r.route}`,class:"rounded-lg border border-gray-200 dark:border-gray-800 p-3 space-y-1.5"},[s("div",Os,[S(m,{color:k(r.method),variant:"subtle",size:"sm"},{default:p(()=>[E(c(r.method),1)]),_:2},1032,["color"]),s("code",zs,c(r.route),1)]),s("div",Ps,[s("span",null,[$[2]||($[2]=E("p90 ",-1)),s("span",{class:B(["tabular-nums font-medium",C(r.p90Ms)])},c(r.p90Ms)+" ms",3)]),s("span",null,c(r.requests)+" reqs · "+c(r.projectCount)+" proj",1),r.errorRate>0?(t(),l("span",As,c(r.errorRate)+"% err",1)):A("",!0)])]))),128))]),s("div",Bs,[S(f,{"min-width":"44rem"},{default:p(()=>[s("table",Us,[$[3]||($[3]=s("thead",null,[s("tr",{class:"text-left text-xs text-gray-500 uppercase tracking-wider border-b border-gray-200 dark:border-gray-800"},[s("th",{class:"py-2 pr-4 font-medium"},"Endpoint"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Requests"),s("th",{class:"py-2 pr-4 font-medium text-right"},"p50"),s("th",{class:"py-2 pr-4 font-medium text-right"},"p90"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Max"),s("th",{class:"py-2 pr-4 font-medium text-right"},"Errors"),s("th",{class:"py-2 font-medium text-right"},"Projects")])],-1)),s("tbody",Fs,[(t(!0),l(I,null,V(e(o).endpoints,r=>(t(),l("tr",{key:`${r.method} ${r.route}`},[s("td",qs,[s("div",Ws,[S(m,{color:k(r.method),variant:"subtle",size:"sm"},{default:p(()=>[E(c(r.method),1)]),_:2},1032,["color"]),s("code",{class:"text-xs truncate max-w-[22rem]",title:r.route},c(r.route),9,Xs)])]),s("td",Gs,c(r.requests),1),s("td",Ys,c(r.p50Ms)+" ms",1),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums font-medium",C(r.p90Ms)])},c(r.p90Ms)+" ms ",3),s("td",Js,c(r.maxMs)+" ms",1),s("td",{class:B(["py-2.5 pr-4 text-right tabular-nums",r.errorRate>0?"text-red-600 dark:text-red-400":"text-gray-400"])},c(r.errorRate)+"% ",3),s("td",Qs,c(r.projectCount),1)]))),128))])])]),_:1})])],64))]),_:1},8,["count"])}}}),Zs=Object.assign(Hs,{__name:"SlowEndpointsTable"}),Ks={class:"space-y-6"},en={class:"text-sm font-semibold uppercase tracking-wide text-dimmed"},tn={class:"text-sm text-muted"},sn={class:"grid grid-cols-1 xl:grid-cols-2 gap-6 items-start"},zn=G({__name:"analytics",async setup(v){let i,h;De({title:"Analytics - Piwi Dashboard"});const{state:w,scopeQuery:o}=He(),{data:O}=([i,h]=X(()=>ge("/api/projects/menu",{lazy:!0,server:!1,default:()=>[],transform:x=>x.items},"$sFpNat489G")),i=await i,h(),i),{data:T}=([i,h]=X(()=>ge("/api/test-runs/recent",{lazy:!0,server:!1,default:()=>[],transform:x=>x.items},"$QJEpX0hRMv")),i=await i,h(),i),z=j(()=>{const x=new Set;for(const M of T.value??[])M.environment&&x.add(M.environment);return[...x].sort()}),C=j(()=>{const x=new Set;for(const M of T.value??[])M.branch&&x.add(M.branch);return[...x].sort()}),k=j(()=>{const x=T.value??[];return x.length===0?null:Math.max(...x.map(M=>new Date(M.startTime).getTime()))}),d=j(()=>{if(k.value===null||w.value.days>=xe)return!1;const x=Date.now()-w.value.days*24*60*60*1e3;return k.value<x});function $(){w.value={...w.value,days:xe}}const L={insights:mt,portfolio:Et,"pass-rate-heatmap":zt,"ci-time-trend":Yt,"wasted-time":rs,"flaky-leaderboard":ps,"cluster-landscape":$s,"regression-velocity":js,"browser-matrix":Ns,"slow-endpoints":Zs},N=j(()=>rt.map(x=>({...x,widgets:je.filter(M=>M.band===x.id)})).filter(x=>x.widgets.length>0));return(x,M)=>{const m=Ee,f=Ie,y=Le,r=ot,b=Ae,P=Be,u=Ve;return t(),_(u,{id:"analytics"},{header:p(()=>[S(y,null,{leading:p(()=>[S(m),S(f,{items:[{label:"Analytics",icon:"i-lucide-chart-line",to:"/analytics"}]})]),_:1})]),body:p(()=>[s("div",Ks,[S(b,null,{default:p(()=>[S(r,{modelValue:e(w),"onUpdate:modelValue":M[0]||(M[0]=n=>le(w)?w.value=n:null),"available-projects":e(O),"available-environments":e(z),"available-branches":e(C)},null,8,["modelValue","available-projects","available-environments","available-branches"])]),_:1}),e(d)?(t(),_(P,{key:0,icon:"i-lucide-calendar-off",color:"warning",variant:"subtle",title:`No test runs in the last ${e(w).days} days`,description:`Your most recent run was ${("formatRelativeTime"in x?x.formatRelativeTime:e(me))(e(k))} — the widgets below look empty because the selected range excludes it.`,actions:[{label:"Show all time",color:"warning",variant:"solid",size:"xs",onClick:$}]},null,8,["title","description","actions"])):A("",!0),(t(!0),l(I,null,V(e(N),n=>(t(),l("section",{key:n.id,class:"space-y-3"},[s("div",null,[s("h2",en,c(n.label),1),s("p",tn,c(n.description),1)]),s("div",sn,[(t(!0),l(I,null,V(n.widgets,a=>(t(),l("div",{key:a.id,class:B(a.size==="full"?"xl:col-span-2":"")},[(t(),_(Me(L[a.id]),{query:e(o)},null,8,["query"]))],2))),128))])]))),128))])]),_:1})}}});export{zn as default};
@@ -0,0 +1 @@
1
+ import{bt as o}from"./1QWBzxLM.js";function t(){const e=o()?.vnode?.scopeId;return e?{[e]:""}:{}}export{t as u};
@@ -1,4 +1,4 @@
1
- import{_ as ce}from"./CbzgEkmW.js";import{d as ue,q as me,O as pe,w as F,c as i,h as a,ac as fe,b as t,f as d,o as n,g as r,I as _e,x as ye,j as ge,k as c,_ as ve,t as f,l as u,e as y,F as v,z as W,m as he,i as be,v as V,r as U,J as ke,B as xe}from"./BdQ7kfxJ.js";import{_ as we}from"./Gn1Ns00e.js";import{_ as Se}from"./CrsaY0R_.js";import{_ as Te}from"./BOn5q0rT.js";import{_ as Pe}from"./CyWOerIG.js";import{_ as Ue}from"./D0XWJGhG.js";import{_ as Ce}from"./Bp2zrrkV.js";import{_ as Ie}from"./C_eXufkv.js";import{u as L}from"./DTtizz85.js";import"./DwZS0oRm.js";import"./Bg63qh8W.js";import"./HGYIpJtg.js";import"./CxwnFFD0.js";import"./i7znB42v.js";import"./DKgbchez.js";import"./BO4sfkbw.js";import"./rPG7kzfL.js";import"./WZXZeGYt.js";const Me={class:"space-y-6"},Ve={class:"space-y-3"},$e={key:0,class:"flex items-center gap-2 text-sm text-success-600 dark:text-success-400"},Ee={key:1,class:"flex items-center gap-2 text-sm text-warning-600 dark:text-warning-400"},ze={key:2,class:"grid grid-cols-2 gap-2 text-sm"},Ne={class:"font-mono"},Oe={class:"font-mono"},Re={key:3,class:"text-sm text-muted space-y-1"},Ae={key:4,class:"text-sm text-muted"},De={class:"flex items-center gap-2 w-full"},Fe={key:0,class:"mb-4 p-4 rounded-lg border border-primary/30 bg-primary/5 space-y-3"},We={class:"grid grid-cols-2 gap-3"},Le={key:3,class:"text-xs text-muted"},Be={key:5,class:"text-xs text-muted"},je={class:"flex justify-end gap-2"},He={key:1,class:"text-sm text-muted py-4 text-center"},qe={class:"space-y-2"},Je={class:"flex-1 min-w-0"},Ye={class:"font-medium text-sm flex items-center gap-1.5"},Ge={class:"text-xs text-muted"},Qe={key:4,class:"ml-1 text-primary text-xs"},Xe={class:"flex items-center gap-1"},Ke={key:0,class:"text-sm text-muted py-4 text-center"},Ze={class:"space-y-2"},et={class:"flex-1 min-w-0 space-y-0.5"},tt={class:"font-medium text-sm flex items-center gap-1.5"},st={key:0,class:"text-primary text-xs"},ot={class:"text-xs text-muted flex flex-wrap gap-x-3"},nt={key:0},lt={key:1},at={key:2,class:"text-warning-500"},it={class:"flex flex-wrap gap-1 mt-1"},rt={key:0,class:"flex items-center gap-1"},It=ue({__name:"notifications",async setup(dt){let _,b;const m=me(),J=xe(),P=V(()=>J.public.authEnabled),{canSeeAdmin:k}=pe(),Y=["PIWI_SMTP_HOST","PIWI_SMTP_PORT","PIWI_SMTP_USER","PIWI_SMTP_PASS","PIWI_SMTP_FROM","PIWI_SMTP_FROM_NAME","PIWI_SMTP_SECURE"],{data:p}=([_,b]=F(()=>L("/api/settings/smtp","$v5NL0FLSog")),_=await _,b(),_),h=U(""),$=U(!1);async function G(){if(h.value){$.value=!0;try{const o=await $fetch("/api/settings/smtp/test",{method:"POST",body:{to:h.value}});o.success?m.add({title:"Test email sent",description:`Check ${h.value}`,color:"success"}):m.add({title:"Send failed",description:o.error||"Unknown error",color:"error"})}catch(o){m.add({title:"Send failed",description:String(o?.message??o),color:"error"})}finally{$.value=!1}}}const{data:Q,refresh:E}=([_,b]=F(()=>L("/api/channels","$rT8YNpmgfl")),_=await _,b(),_),z=V(()=>Q.value?.items??[]),x=U(!1),l=ke({name:"",type:"email",address:"",webhookUrl:"",url:"",secret:"",global:!1}),N=U(!1),O=U(null),X=V(()=>[{label:"Email",value:"email"},{label:"Slack webhook",value:"slack"},{label:"Webhook",value:"webhook"},...P.value?[{label:"Browser",value:"browser"}]:[]]);async function K(){N.value=!0;try{const o={};l.type==="email"?o.address=l.address:l.type==="slack"?o.webhookUrl=l.webhookUrl:l.type==="webhook"&&(o.url=l.url,l.secret&&(o.secret=l.secret)),await $fetch("/api/channels",{method:"POST",body:{name:l.name,type:l.type,config:o,global:l.global}}),x.value=!1,Object.assign(l,{name:"",type:"email",address:"",webhookUrl:"",url:"",secret:"",global:!1}),await E(),m.add({title:"Channel created",color:"success"})}catch(o){m.add({title:"Failed to create channel",description:String(o?.message??o),color:"error"})}finally{N.value=!1}}async function Z(o){try{await $fetch(`/api/channels/${o}`,{method:"DELETE"}),await E(),m.add({title:"Channel deleted",color:"success"})}catch(e){m.add({title:"Failed to delete channel",description:String(e?.message??e),color:"error"})}}async function ee(o){O.value=o;try{const e=await $fetch(`/api/channels/${o}/test`,{method:"POST"});e.success?(m.add({title:"Test notification sent",color:"success"}),await E()):m.add({title:"Test failed",description:e.error,color:"error"})}catch(e){m.add({title:"Test failed",description:String(e?.message??e),color:"error"})}finally{O.value=null}}function B(o){return o.userId!==null||k.value}const{data:te,refresh:j}=([_,b]=F(()=>L("/api/subscriptions","$J_5QzL_eLh")),_=await _,b(),_),R=V(()=>te.value?.items??[]);function se(o){return o.userId!==null||k.value}async function oe(o){try{await $fetch(`/api/subscriptions/${o}`,{method:"DELETE"}),await j(),m.add({title:"Subscription removed",color:"success"})}catch(e){m.add({title:"Failed to remove subscription",description:String(e?.message??e),color:"error"})}}async function ne(o){const e=o.mutedUntil&&new Date(o.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${o.id}`,{method:"PATCH",body:{mutedUntil:e?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await j(),m.add({title:e?"Unmuted":"Muted for 7 days",color:"success"})}catch(I){m.add({title:"Failed to update subscription",description:String(I?.message??I),color:"error"})}}function C(o){return o.mutedUntil&&new Date(o.mutedUntil)>new Date}function H(o){return o==="personal_email"?"i-lucide-user-round":o==="email"?"i-lucide-mail":o==="slack"?"i-lucide-slack":o==="browser"?"i-lucide-monitor":"i-lucide-webhook"}function le(o){return o==="auto_heal.pr_opened"?"Auto-heal › PR opened":o.replace(/\./g," › ")}return(o,e)=>{const I=ce,M=ve,ae=we,ie=Se,w=_e,g=ge,A=Te,S=Pe,re=Ue,de=Ce,D=he,q=Ie;return n(),i("div",Me,[a(A,{icon:"i-lucide-mail",title:"SMTP email delivery",help:"settings.smtp"},fe({subtitle:d(()=>[e[10]||(e[10]=c(" Configure SMTP via environment variables. The connection cannot be changed here. ",-1))]),actions:d(()=>[t(p)?.configured&&t(k)?(n(),y(I,{key:0,"env-vars":Y,size:"md"})):u("",!0)]),default:d(()=>[r("div",Ve,[t(p)?.configured?(n(),i("div",$e,[a(M,{name:"i-lucide-circle-check-big",class:"size-4"}),e[11]||(e[11]=c(" Configured ",-1))])):(n(),i("div",Ee,[a(M,{name:"i-lucide-circle-alert",class:"size-4"}),e[12]||(e[12]=c(" Not configured ",-1))])),t(p)?.host?(n(),i("div",ze,[e[13]||(e[13]=r("div",{class:"text-muted"},"Host",-1)),r("div",Ne,f(t(p)?.host)+":"+f(t(p)?.port),1),e[14]||(e[14]=r("div",{class:"text-muted"},"From",-1)),r("div",null,f(t(p)?.fromName?`${t(p).fromName} <${t(p).from}>`:t(p)?.from),1),e[15]||(e[15]=r("div",{class:"text-muted"},"User",-1)),r("div",Oe,f(t(p)?.user||"— (no authentication)"),1),e[16]||(e[16]=r("div",{class:"text-muted"},"TLS",-1)),r("div",null,f(t(p)?.secure?"Yes (port 465)":"STARTTLS / plain"),1)])):u("",!0),!t(p)?.configured&&t(k)?(n(),i("div",Re,[e[17]||(e[17]=r("p",null," Set these environment variables to enable email notifications — the user and password are only needed when the server requires authentication: ",-1)),a(ae,{code:`PIWI_SMTP_HOST=smtp.example.com
1
+ import{_ as ce}from"./B2bxEmbR.js";import{d as ue,q as me,O as pe,w as F,c as i,h as a,ac as fe,b as t,f as d,o as n,g as r,I as _e,x as ye,j as ge,k as c,_ as ve,t as f,l as u,e as y,F as v,z as W,m as he,i as be,v as V,r as U,J as ke,B as xe}from"./1QWBzxLM.js";import{_ as we}from"./BF5qB58w.js";import{_ as Se}from"./B82vqOZe.js";import{_ as Te}from"./bmAf49LT.js";import{_ as Pe}from"./B4lvHjBe.js";import{_ as Ue}from"./e-GZmCeP.js";import{_ as Ce}from"./BQUhoGCh.js";import{_ as Ie}from"./BnUQ3i5l.js";import{u as L}from"./CU_2YLhT.js";import"./D4mPjHHR.js";import"./CHz7LJIX.js";import"./AbnDY6Zr.js";import"./Bl0xzETD.js";import"./DpM8IgHL.js";import"./BTGAvMoT.js";import"./DBXXb0w8.js";import"./Bp1WeQ0_.js";import"./D_ZAGxCQ.js";const Me={class:"space-y-6"},Ve={class:"space-y-3"},$e={key:0,class:"flex items-center gap-2 text-sm text-success-600 dark:text-success-400"},Ee={key:1,class:"flex items-center gap-2 text-sm text-warning-600 dark:text-warning-400"},ze={key:2,class:"grid grid-cols-2 gap-2 text-sm"},Ne={class:"font-mono"},Oe={class:"font-mono"},Re={key:3,class:"text-sm text-muted space-y-1"},Ae={key:4,class:"text-sm text-muted"},De={class:"flex items-center gap-2 w-full"},Fe={key:0,class:"mb-4 p-4 rounded-lg border border-primary/30 bg-primary/5 space-y-3"},We={class:"grid grid-cols-2 gap-3"},Le={key:3,class:"text-xs text-muted"},Be={key:5,class:"text-xs text-muted"},je={class:"flex justify-end gap-2"},He={key:1,class:"text-sm text-muted py-4 text-center"},qe={class:"space-y-2"},Je={class:"flex-1 min-w-0"},Ye={class:"font-medium text-sm flex items-center gap-1.5"},Ge={class:"text-xs text-muted"},Qe={key:4,class:"ml-1 text-primary text-xs"},Xe={class:"flex items-center gap-1"},Ke={key:0,class:"text-sm text-muted py-4 text-center"},Ze={class:"space-y-2"},et={class:"flex-1 min-w-0 space-y-0.5"},tt={class:"font-medium text-sm flex items-center gap-1.5"},st={key:0,class:"text-primary text-xs"},ot={class:"text-xs text-muted flex flex-wrap gap-x-3"},nt={key:0},lt={key:1},at={key:2,class:"text-warning-500"},it={class:"flex flex-wrap gap-1 mt-1"},rt={key:0,class:"flex items-center gap-1"},It=ue({__name:"notifications",async setup(dt){let _,b;const m=me(),J=xe(),P=V(()=>J.public.authEnabled),{canSeeAdmin:k}=pe(),Y=["PIWI_SMTP_HOST","PIWI_SMTP_PORT","PIWI_SMTP_USER","PIWI_SMTP_PASS","PIWI_SMTP_FROM","PIWI_SMTP_FROM_NAME","PIWI_SMTP_SECURE"],{data:p}=([_,b]=F(()=>L("/api/settings/smtp","$v5NL0FLSog")),_=await _,b(),_),h=U(""),$=U(!1);async function G(){if(h.value){$.value=!0;try{const o=await $fetch("/api/settings/smtp/test",{method:"POST",body:{to:h.value}});o.success?m.add({title:"Test email sent",description:`Check ${h.value}`,color:"success"}):m.add({title:"Send failed",description:o.error||"Unknown error",color:"error"})}catch(o){m.add({title:"Send failed",description:String(o?.message??o),color:"error"})}finally{$.value=!1}}}const{data:Q,refresh:E}=([_,b]=F(()=>L("/api/channels","$rT8YNpmgfl")),_=await _,b(),_),z=V(()=>Q.value?.items??[]),x=U(!1),l=ke({name:"",type:"email",address:"",webhookUrl:"",url:"",secret:"",global:!1}),N=U(!1),O=U(null),X=V(()=>[{label:"Email",value:"email"},{label:"Slack webhook",value:"slack"},{label:"Webhook",value:"webhook"},...P.value?[{label:"Browser",value:"browser"}]:[]]);async function K(){N.value=!0;try{const o={};l.type==="email"?o.address=l.address:l.type==="slack"?o.webhookUrl=l.webhookUrl:l.type==="webhook"&&(o.url=l.url,l.secret&&(o.secret=l.secret)),await $fetch("/api/channels",{method:"POST",body:{name:l.name,type:l.type,config:o,global:l.global}}),x.value=!1,Object.assign(l,{name:"",type:"email",address:"",webhookUrl:"",url:"",secret:"",global:!1}),await E(),m.add({title:"Channel created",color:"success"})}catch(o){m.add({title:"Failed to create channel",description:String(o?.message??o),color:"error"})}finally{N.value=!1}}async function Z(o){try{await $fetch(`/api/channels/${o}`,{method:"DELETE"}),await E(),m.add({title:"Channel deleted",color:"success"})}catch(e){m.add({title:"Failed to delete channel",description:String(e?.message??e),color:"error"})}}async function ee(o){O.value=o;try{const e=await $fetch(`/api/channels/${o}/test`,{method:"POST"});e.success?(m.add({title:"Test notification sent",color:"success"}),await E()):m.add({title:"Test failed",description:e.error,color:"error"})}catch(e){m.add({title:"Test failed",description:String(e?.message??e),color:"error"})}finally{O.value=null}}function B(o){return o.userId!==null||k.value}const{data:te,refresh:j}=([_,b]=F(()=>L("/api/subscriptions","$J_5QzL_eLh")),_=await _,b(),_),R=V(()=>te.value?.items??[]);function se(o){return o.userId!==null||k.value}async function oe(o){try{await $fetch(`/api/subscriptions/${o}`,{method:"DELETE"}),await j(),m.add({title:"Subscription removed",color:"success"})}catch(e){m.add({title:"Failed to remove subscription",description:String(e?.message??e),color:"error"})}}async function ne(o){const e=o.mutedUntil&&new Date(o.mutedUntil)>new Date;try{await $fetch(`/api/subscriptions/${o.id}`,{method:"PATCH",body:{mutedUntil:e?null:new Date(Date.now()+10080*60*1e3).toISOString()}}),await j(),m.add({title:e?"Unmuted":"Muted for 7 days",color:"success"})}catch(I){m.add({title:"Failed to update subscription",description:String(I?.message??I),color:"error"})}}function C(o){return o.mutedUntil&&new Date(o.mutedUntil)>new Date}function H(o){return o==="personal_email"?"i-lucide-user-round":o==="email"?"i-lucide-mail":o==="slack"?"i-lucide-slack":o==="browser"?"i-lucide-monitor":"i-lucide-webhook"}function le(o){return o==="auto_heal.pr_opened"?"Auto-heal › PR opened":o.replace(/\./g," › ")}return(o,e)=>{const I=ce,M=ve,ae=we,ie=Se,w=_e,g=ge,A=Te,S=Pe,re=Ue,de=Ce,D=he,q=Ie;return n(),i("div",Me,[a(A,{icon:"i-lucide-mail",title:"SMTP email delivery",help:"settings.smtp"},fe({subtitle:d(()=>[e[10]||(e[10]=c(" Configure SMTP via environment variables. The connection cannot be changed here. ",-1))]),actions:d(()=>[t(p)?.configured&&t(k)?(n(),y(I,{key:0,"env-vars":Y,size:"md"})):u("",!0)]),default:d(()=>[r("div",Ve,[t(p)?.configured?(n(),i("div",$e,[a(M,{name:"i-lucide-circle-check-big",class:"size-4"}),e[11]||(e[11]=c(" Configured ",-1))])):(n(),i("div",Ee,[a(M,{name:"i-lucide-circle-alert",class:"size-4"}),e[12]||(e[12]=c(" Not configured ",-1))])),t(p)?.host?(n(),i("div",ze,[e[13]||(e[13]=r("div",{class:"text-muted"},"Host",-1)),r("div",Ne,f(t(p)?.host)+":"+f(t(p)?.port),1),e[14]||(e[14]=r("div",{class:"text-muted"},"From",-1)),r("div",null,f(t(p)?.fromName?`${t(p).fromName} <${t(p).from}>`:t(p)?.from),1),e[15]||(e[15]=r("div",{class:"text-muted"},"User",-1)),r("div",Oe,f(t(p)?.user||"— (no authentication)"),1),e[16]||(e[16]=r("div",{class:"text-muted"},"TLS",-1)),r("div",null,f(t(p)?.secure?"Yes (port 465)":"STARTTLS / plain"),1)])):u("",!0),!t(p)?.configured&&t(k)?(n(),i("div",Re,[e[17]||(e[17]=r("p",null," Set these environment variables to enable email notifications — the user and password are only needed when the server requires authentication: ",-1)),a(ae,{code:`PIWI_SMTP_HOST=smtp.example.com
2
2
  PIWI_SMTP_PORT=465
3
3
  PIWI_SMTP_FROM=noreply@example.com
4
4
  PIWI_SMTP_FROM_NAME=Piwi Dashboard
@@ -1,2 +1,2 @@
1
- import{r as f,v as l}from"./BdQ7kfxJ.js";const d="piwi-diagnosis-notifications";function I(){const i=f("default"),s=new Set,t=f(!0);"Notification"in window&&(i.value=Notification.permission),localStorage.getItem(d)==="false"&&(t.value=!1);const n=l(()=>"Notification"in window),c=l(()=>n.value&&i.value==="granted"&&t.value);async function m(){if(!n.value)return;const e=await Notification.requestPermission();i.value=e}function g(){t.value=!t.value,localStorage.setItem(d,String(t.value))}function v(e,o){r({clusterId:o,summary:e.summary,rootCause:e.rootCause,category:e.category,confidence:e.confidence})}function r(e){if(!c.value||s.has(e.clusterId))return;const o=[e.summary||e.rootCause];e.category&&o.push(`Category: ${e.category}`),e.confidence&&o.push(`Confidence: ${e.confidence}`);const u=o.join(`
1
+ import{r as f,v as l}from"./1QWBzxLM.js";const d="piwi-diagnosis-notifications";function I(){const i=f("default"),s=new Set,t=f(!0);"Notification"in window&&(i.value=Notification.permission),localStorage.getItem(d)==="false"&&(t.value=!1);const n=l(()=>"Notification"in window),c=l(()=>n.value&&i.value==="granted"&&t.value);async function m(){if(!n.value)return;const e=await Notification.requestPermission();i.value=e}function g(){t.value=!t.value,localStorage.setItem(d,String(t.value))}function v(e,o){r({clusterId:o,summary:e.summary,rootCause:e.rootCause,category:e.category,confidence:e.confidence})}function r(e){if(!c.value||s.has(e.clusterId))return;const o=[e.summary||e.rootCause];e.category&&o.push(`Category: ${e.category}`),e.confidence&&o.push(`Confidence: ${e.confidence}`);const u=o.join(`
2
2
  `);if(!u)return;const a=new Notification("Piwi diagnosis complete",{body:u,tag:`diagnosis-${e.clusterId}`,icon:"/logo.svg"});a.onclick=()=>{window.focus(),a.close()},s.add(e.clusterId)}return{permission:i,supported:n,active:c,requestPermission:m,toggleEnabled:g,notify:v,notifyFromPayload:r}}export{I as u};