@piwitests/server 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (773) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BlnwU1OO.js → -09h6CA9.js} +1 -1
  3. package/.output/public/_nuxt/279D2RYp.js +1 -0
  4. package/.output/public/_nuxt/81InBX9v.js +1 -0
  5. package/.output/public/_nuxt/{CUvGJXY3.js → Ar3IelOY.js} +1 -1
  6. package/.output/public/_nuxt/B33iXw77.js +1 -0
  7. package/.output/public/_nuxt/B3B9Ii2A.js +1 -0
  8. package/.output/public/_nuxt/B3HO8kuh.js +1 -0
  9. package/.output/public/_nuxt/B44A4LSJ.js +1 -0
  10. package/.output/public/_nuxt/{C8OCrfDP.js → B7NBP1C-.js} +1 -1
  11. package/.output/public/_nuxt/{DZ3Vfcpz.js → B9WhzpKO.js} +1 -1
  12. package/.output/public/_nuxt/{DWowvnwc.js → BCMuIgP5.js} +1 -1
  13. package/.output/public/_nuxt/BDicZ1gQ.js +1 -0
  14. package/.output/public/_nuxt/BJ0XQElc.js +1 -0
  15. package/.output/public/_nuxt/{xqiPI_FQ.js → BMvCSA6h.js} +1 -1
  16. package/.output/public/_nuxt/BPQoBGg5.js +1 -0
  17. package/.output/public/_nuxt/BPRffDuo.js +1 -0
  18. package/.output/public/_nuxt/BSIxhGsh.js +1 -0
  19. package/.output/public/_nuxt/BVaxh6Nl.js +4 -0
  20. package/.output/public/_nuxt/{hgHc4teu.js → BX9ZXe98.js} +1 -1
  21. package/.output/public/_nuxt/{CcXaak_K.js → BYDaY0Z7.js} +1 -1
  22. package/.output/public/_nuxt/{S5DLdEpg.js → Bc8mOoz9.js} +2 -2
  23. package/.output/public/_nuxt/BccXfBfI.js +1 -0
  24. package/.output/public/_nuxt/{Bd3HqPMF.js → BeLWlVK0.js} +1 -1
  25. package/.output/public/_nuxt/{D5oNv2cB.js → BfTuX0wq.js} +1 -1
  26. package/.output/public/_nuxt/BjaRappk.js +1 -0
  27. package/.output/public/_nuxt/{By4YL7mx.js → Bn0YQDyy.js} +1 -1
  28. package/.output/public/_nuxt/Bp5ELvx9.js +1 -0
  29. package/.output/public/_nuxt/BpUaY9nH.js +2 -0
  30. package/.output/public/_nuxt/BqV0l12c.js +1 -0
  31. package/.output/public/_nuxt/{BjCHB89N.js → Bti38m-M.js} +1 -1
  32. package/.output/public/_nuxt/{QmMoMxLM.js → Bu2aaVIY.js} +3 -3
  33. package/.output/public/_nuxt/{DZUgX70W.js → BuMC3WjZ.js} +1 -1
  34. package/.output/public/_nuxt/{BJtlcTrb.js → BxCKKeYs.js} +1 -1
  35. package/.output/public/_nuxt/{CfOLBbW9.js → C-elpgyr.js} +1 -1
  36. package/.output/public/_nuxt/C2_3mdPC.js +1 -0
  37. package/.output/public/_nuxt/{BLIRKrbM.js → C5iG7O4O.js} +4 -4
  38. package/.output/public/_nuxt/C7P1UCO2.js +1 -0
  39. package/.output/public/_nuxt/{hH1UFE3Z.js → C95YAaJq.js} +1 -1
  40. package/.output/public/_nuxt/{BXY_PWcx.js → C9_jrmk9.js} +2 -2
  41. package/.output/public/_nuxt/CDk0q2hV.js +2 -0
  42. package/.output/public/_nuxt/{kjYMoWWx.js → CGNkHojN.js} +3 -3
  43. package/.output/public/_nuxt/CHEFCN8Q.js +1 -0
  44. package/.output/public/_nuxt/CHNwfU1y.js +1 -0
  45. package/.output/public/_nuxt/CK_2LZBS.js +1 -0
  46. package/.output/public/_nuxt/CNFYDQmj.js +1 -0
  47. package/.output/public/_nuxt/{DZOS7Fh7.js → CTxDO9fB.js} +1 -1
  48. package/.output/public/_nuxt/{kS3boz40.js → CU5S9GCh.js} +1 -1
  49. package/.output/public/_nuxt/{DZ1zNBVM.js → CUtJobDm.js} +1 -1
  50. package/.output/public/_nuxt/CV9-fTmY.js +1 -0
  51. package/.output/public/_nuxt/{e7zD3uJ0.js → CYsTqbBS.js} +1 -1
  52. package/.output/public/_nuxt/{C9YzQCiq.js → CZfMdzfk.js} +1 -1
  53. package/.output/public/_nuxt/{B-IcwqZ2.js → Cdff9XNh.js} +1 -1
  54. package/.output/public/_nuxt/{CNMoZYMv.js → ClOqkAcc.js} +1 -1
  55. package/.output/public/_nuxt/{DXbPFI1d.js → CpjgB2aY.js} +1 -1
  56. package/.output/public/_nuxt/CrwJAwhk.js +1 -0
  57. package/.output/public/_nuxt/CtQBsNUb.js +1 -0
  58. package/.output/public/_nuxt/CuSVQEkS.js +3 -0
  59. package/.output/public/_nuxt/{Df7kUO0m.js → CylWPruw.js} +1 -1
  60. package/.output/public/_nuxt/CzGyac8q.js +1 -0
  61. package/.output/public/_nuxt/D-c8ZSws.js +1 -0
  62. package/.output/public/_nuxt/{B2oUeBbA.js → D0HNloZ9.js} +1 -1
  63. package/.output/public/_nuxt/{DBtBvrYc.js → D55D4EYo.js} +1 -1
  64. package/.output/public/_nuxt/{CfPSts5n.js → DDDpCFpF.js} +1 -1
  65. package/.output/public/_nuxt/{CPLJeOCb.js → DEFEpYzn.js} +1 -1
  66. package/.output/public/_nuxt/DGfAxLHV.js +1 -0
  67. package/.output/public/_nuxt/DHDtnj7p.js +1 -0
  68. package/.output/public/_nuxt/DLSrtpsA.js +1 -0
  69. package/.output/public/_nuxt/DP8hfJ9h.js +1 -0
  70. package/.output/public/_nuxt/DS636elg.js +1 -0
  71. package/.output/public/_nuxt/{Cng9gj7q.js → DT53RWbC.js} +1 -1
  72. package/.output/public/_nuxt/DVDXJYq2.js +2 -0
  73. package/.output/public/_nuxt/DW0xl3I6.js +17 -0
  74. package/.output/public/_nuxt/{4TxgDGVa.js → DX-MDGb3.js} +1 -1
  75. package/.output/public/_nuxt/DcmZRa_F.js +1 -0
  76. package/.output/public/_nuxt/DgE2YE3R.js +1 -0
  77. package/.output/public/_nuxt/Dgf5N4Ng.js +1 -0
  78. package/.output/public/_nuxt/DiOLdHBC.js +1 -0
  79. package/.output/public/_nuxt/DiZyJYez.js +1 -0
  80. package/.output/public/_nuxt/Dk9fwOCm.js +34 -0
  81. package/.output/public/_nuxt/{BlA8mIS-.js → Dnpkl-1q.js} +1 -1
  82. package/.output/public/_nuxt/DoUy4UHi.js +44 -0
  83. package/.output/public/_nuxt/{CN1mJlvD.js → DprVVyUQ.js} +1 -1
  84. package/.output/public/_nuxt/{DD5HpaW9.js → DslPMqfa.js} +1 -1
  85. package/.output/public/_nuxt/{BFP6M-20.js → FUXhyidq.js} +1 -1
  86. package/.output/public/_nuxt/HXerICAi.js +79 -0
  87. package/.output/public/_nuxt/{gnCL8GjZ.js → IvQlbZk6.js} +1 -1
  88. package/.output/public/_nuxt/{BOCwBVnz.js → Jo8kRmHz.js} +1 -1
  89. package/.output/public/_nuxt/{oFM1KLWA.js → KnfsST6Y.js} +1 -1
  90. package/.output/public/_nuxt/NQikbhmK.js +253 -0
  91. package/.output/public/_nuxt/OSduWzyz.js +1 -0
  92. package/.output/public/_nuxt/SfMRXW25.js +5 -0
  93. package/.output/public/_nuxt/{BBK2-Krn.js → SlIRLREZ.js} +2 -2
  94. package/.output/public/_nuxt/TagBadge.By1E6r4y.css +1 -0
  95. package/.output/public/_nuxt/WsxFTEFq.js +10 -0
  96. package/.output/public/_nuxt/YVN7WG7q.js +1 -0
  97. package/.output/public/_nuxt/{rTvJTef_.js → ZFiQCMUB.js} +1 -1
  98. package/.output/public/_nuxt/aQgs_c6e.js +9 -0
  99. package/.output/public/_nuxt/builds/latest.json +1 -1
  100. package/.output/public/_nuxt/builds/meta/ab473028-4b37-4884-b243-b8f6e5046e5e.json +1 -0
  101. package/.output/public/_nuxt/{B1X__ilH.js → cHAnlQbv.js} +1 -1
  102. package/.output/public/_nuxt/dYCKgE-3.js +5 -0
  103. package/.output/public/_nuxt/{BeFDVhpA.js → eaVkJRSa.js} +1 -1
  104. package/.output/public/_nuxt/entry.CPhW41mh.css +1 -0
  105. package/.output/public/_nuxt/{Dwws9U0D.js → eptP4pGv.js} +1 -1
  106. package/.output/public/_nuxt/fVcG504p.js +1 -0
  107. package/.output/public/_nuxt/g26aVPxc.js +1 -0
  108. package/.output/public/_nuxt/{CsUoYK75.js → ndShiWE8.js} +1 -1
  109. package/.output/public/_nuxt/nv9-6vBK.js +1 -0
  110. package/.output/public/_nuxt/rWNTSFD6.js +3 -0
  111. package/.output/public/_nuxt/tvgqrYDd.js +1 -0
  112. package/.output/public/_nuxt/{wHnZ9OaL.js → y17lMTFy.js} +1 -1
  113. package/.output/public/_nuxt/{qpI-_f9Q.js → ybDYeNxd.js} +1 -1
  114. package/.output/public/_nuxt/{D0cnIs93.js → zQyPuvV1.js} +1 -1
  115. package/.output/public/demo/seed.version.json +2 -2
  116. package/.output/server/chunks/_/ai-prompt-preview.mjs +38 -0
  117. package/.output/server/chunks/_/ai-prompt-preview.mjs.map +1 -0
  118. package/.output/server/chunks/_/collect.mjs +122 -0
  119. package/.output/server/chunks/_/collect.mjs.map +1 -0
  120. package/.output/server/chunks/_/import-runs.mjs +351 -0
  121. package/.output/server/chunks/_/import-runs.mjs.map +1 -0
  122. package/.output/server/chunks/_/markers.mjs +1 -1
  123. package/.output/server/chunks/_/quarantine.mjs +112 -0
  124. package/.output/server/chunks/_/quarantine.mjs.map +1 -0
  125. package/.output/server/chunks/_/users.mjs +1 -1
  126. package/.output/server/chunks/build/{Alert-Bp1Wz_sq.mjs → Alert-C4xq8lao.mjs} +2 -2
  127. package/.output/server/chunks/build/Alert-C4xq8lao.mjs.map +1 -0
  128. package/.output/server/chunks/build/{Breadcrumb-C9ZPTLym.mjs → Breadcrumb-Ak2Lg3oM.mjs} +3 -3
  129. package/.output/server/chunks/build/Breadcrumb-Ak2Lg3oM.mjs.map +1 -0
  130. package/.output/server/chunks/build/{BreadcrumbNav-C3y42Vun.mjs → BreadcrumbNav-DO7I_z-n.mjs} +3 -3
  131. package/.output/server/chunks/build/BreadcrumbNav-DO7I_z-n.mjs.map +1 -0
  132. package/.output/server/chunks/build/{BrowserBadge-DNCp9pF-.mjs → BrowserBadge-D33lqUcj.mjs} +5 -5
  133. package/.output/server/chunks/build/BrowserBadge-D33lqUcj.mjs.map +1 -0
  134. package/.output/server/chunks/build/{ChartCard-Fr557IbV.mjs → ChartCard-Y1UKwMsf.mjs} +2 -2
  135. package/.output/server/chunks/build/ChartCard-Y1UKwMsf.mjs.map +1 -0
  136. package/.output/server/chunks/build/{Checkbox-cVOSIY93.mjs → Checkbox-DvUBGagc.mjs} +8 -8
  137. package/.output/server/chunks/build/Checkbox-DvUBGagc.mjs.map +1 -0
  138. package/.output/server/chunks/build/{CiEnvCard-DXPOhdSG.mjs → CiEnvCard-CrjOM17n.mjs} +25 -34
  139. package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs.map +1 -0
  140. package/.output/server/chunks/build/{CodeBlock-BGwNmJ8J.mjs → CodeBlock-BgE-NSmE.mjs} +7 -22
  141. package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs.map +1 -0
  142. package/.output/server/chunks/build/{DashboardNavbar-Bdp-OwTN.mjs → DashboardNavbar-BHmMSPX7.mjs} +3 -3
  143. package/.output/server/chunks/build/DashboardNavbar-BHmMSPX7.mjs.map +1 -0
  144. package/.output/server/chunks/build/{DashboardSidebarToggle-Ji6ADuqF.mjs → DashboardSidebarToggle-DCTnHiIv.mjs} +3 -3
  145. package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs.map +1 -0
  146. package/.output/server/chunks/build/{DataLocationCard-D6xSOrme.mjs → DataLocationCard-B_YHdzSz.mjs} +3 -3
  147. package/.output/server/chunks/build/DataLocationCard-B_YHdzSz.mjs.map +1 -0
  148. package/.output/server/chunks/build/{DiagnosisPanel-DV1xwGu4.mjs → DiagnosisPanel-B646dK4p.mjs} +17 -528
  149. package/.output/server/chunks/build/DiagnosisPanel-B646dK4p.mjs.map +1 -0
  150. package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs +43 -0
  151. package/.output/server/chunks/build/DurationValue-D20oGbnc.mjs.map +1 -0
  152. package/.output/server/chunks/build/{EmptyState-DV3oT_xz.mjs → EmptyState-Dtlab7S9.mjs} +3 -3
  153. package/.output/server/chunks/build/EmptyState-Dtlab7S9.mjs.map +1 -0
  154. package/.output/server/chunks/build/{EntityLinks-DeOP13Kr.mjs → EntityLinks-D3fp57pR.mjs} +6 -6
  155. package/.output/server/chunks/build/EntityLinks-D3fp57pR.mjs.map +1 -0
  156. package/.output/server/chunks/build/{EnvManagedBadge-Qpn58Nmr.mjs → EnvManagedBadge-Bg3FSiU1.mjs} +3 -3
  157. package/.output/server/chunks/build/EnvManagedBadge-Bg3FSiU1.mjs.map +1 -0
  158. package/.output/server/chunks/build/{FormField-B-GSn_VR.mjs → FormField-B0HKsdMd.mjs} +3 -3
  159. package/.output/server/chunks/build/FormField-B0HKsdMd.mjs.map +1 -0
  160. package/.output/server/chunks/build/{HelpHint-YEMWtKu1.mjs → HelpHint-DrcIv-Oj.mjs} +53 -6
  161. package/.output/server/chunks/build/HelpHint-DrcIv-Oj.mjs.map +1 -0
  162. package/.output/server/chunks/build/{Label-DBvbHd3A.mjs → Label-DYDR1Oeh.mjs} +2 -2
  163. package/.output/server/chunks/build/Label-DYDR1Oeh.mjs.map +1 -0
  164. package/.output/server/chunks/build/{MiniRunBars-C3HG-EYm.mjs → MiniRunBars-CZMugDrh.mjs} +2 -2
  165. package/.output/server/chunks/build/MiniRunBars-CZMugDrh.mjs.map +1 -0
  166. package/.output/server/chunks/build/{Modal-CfA78Hm1.mjs → Modal-Ck2XLt8d.mjs} +2 -2
  167. package/.output/server/chunks/build/Modal-Ck2XLt8d.mjs.map +1 -0
  168. package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs → OpenInIdeLink-C4MXA8ya.mjs} +6 -6
  169. package/.output/server/chunks/build/{OpenInIdeLink-B92wosXu.mjs.map → OpenInIdeLink-C4MXA8ya.mjs.map} +1 -1
  170. package/.output/server/chunks/build/{ProjectTestCasesTable-9Ia825h8.mjs → ProjectTestCasesTable-CxfQ5wtN.mjs} +120 -45
  171. package/.output/server/chunks/build/ProjectTestCasesTable-CxfQ5wtN.mjs.map +1 -0
  172. package/.output/server/chunks/build/{RovingFocusItem-CxhHdNGo.mjs → RovingFocusItem-BJSzTBjy.mjs} +2 -2
  173. package/.output/server/chunks/build/RovingFocusItem-BJSzTBjy.mjs.map +1 -0
  174. package/.output/server/chunks/build/{RunReports-BpJqLHY9.mjs → RunReports-DFLv51TX.mjs} +8 -6
  175. package/.output/server/chunks/build/RunReports-DFLv51TX.mjs.map +1 -0
  176. package/.output/server/chunks/build/{RunStatusBadge-BhmJ_RKM.mjs → RunStatusBadge-FfGb6bkW.mjs} +3 -2
  177. package/.output/server/chunks/build/RunStatusBadge-FfGb6bkW.mjs.map +1 -0
  178. package/.output/server/chunks/build/{SectionCard-COd9TuDq.mjs → SectionCard-CN-v0FZ_.mjs} +2 -2
  179. package/.output/server/chunks/build/SectionCard-CN-v0FZ_.mjs.map +1 -0
  180. package/.output/server/chunks/build/{Select-ppPz926C.mjs → Select-CUqj50wi.mjs} +4 -4
  181. package/.output/server/chunks/build/Select-CUqj50wi.mjs.map +1 -0
  182. package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs → SelectMenu-Db7osY7J.mjs} +4 -4
  183. package/.output/server/chunks/build/{SelectMenu-799c_Ils.mjs.map → SelectMenu-Db7osY7J.mjs.map} +1 -1
  184. package/.output/server/chunks/build/{Separator-CxZdx8kw.mjs → Separator-CR4WcEKD.mjs} +2 -2
  185. package/.output/server/chunks/build/Separator-CR4WcEKD.mjs.map +1 -0
  186. package/.output/server/chunks/build/{SettingsField-DDD4oqys.mjs → SettingsField-D6iEYbEc.mjs} +6 -6
  187. package/.output/server/chunks/build/SettingsField-D6iEYbEc.mjs.map +1 -0
  188. package/.output/server/chunks/build/{Slideover-B95Rj237.mjs → Slideover-DgCa80mf.mjs} +3 -3
  189. package/.output/server/chunks/build/Slideover-DgCa80mf.mjs.map +1 -0
  190. package/.output/server/chunks/build/{Switch-xQQ3_ME1.mjs → Switch-CgUioOYB.mjs} +5 -5
  191. package/.output/server/chunks/build/Switch-CgUioOYB.mjs.map +1 -0
  192. package/.output/server/chunks/build/{Table-CPhhVzDv.mjs → Table-BRk04Hd2.mjs} +3 -3
  193. package/.output/server/chunks/build/Table-BRk04Hd2.mjs.map +1 -0
  194. package/.output/server/chunks/build/{Tabs-BV9XqjoO.mjs → Tabs-Bbsg9wag.mjs} +3 -3
  195. package/.output/server/chunks/build/Tabs-Bbsg9wag.mjs.map +1 -0
  196. package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs +31 -0
  197. package/.output/server/chunks/build/TagBadge-DwzoFCBb.mjs.map +1 -0
  198. package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs +8 -0
  199. package/.output/server/chunks/build/TagBadge-styles.jhuZ4NjP.mjs.map +1 -0
  200. package/.output/server/chunks/build/{TestCaseHistoryChart-DMb-xSJa.mjs → TestCaseHistoryChart-nMLPhdvD.mjs} +6 -6
  201. package/.output/server/chunks/build/TestCaseHistoryChart-nMLPhdvD.mjs.map +1 -0
  202. package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs +200 -0
  203. package/.output/server/chunks/build/TestMetaBadges-D5_yUtIP.mjs.map +1 -0
  204. package/.output/server/chunks/build/{TestStatusBar-CEzt76wk.mjs → TestStatusBar-j6h2Jp6A.mjs} +15 -15
  205. package/.output/server/chunks/build/TestStatusBar-j6h2Jp6A.mjs.map +1 -0
  206. package/.output/server/chunks/build/{Textarea-DrrqQUVG.mjs → Textarea-Dv2-lOvW.mjs} +2 -2
  207. package/.output/server/chunks/build/Textarea-Dv2-lOvW.mjs.map +1 -0
  208. package/.output/server/chunks/build/{Tooltip-7vwuDPrZ.mjs → Tooltip-BOazooWP.mjs} +3 -3
  209. package/.output/server/chunks/build/Tooltip-BOazooWP.mjs.map +1 -0
  210. package/.output/server/chunks/build/{VisuallyHiddenInput-C9eJVpPW.mjs → VisuallyHiddenInput-D6kBJxVd.mjs} +2 -2
  211. package/.output/server/chunks/build/VisuallyHiddenInput-D6kBJxVd.mjs.map +1 -0
  212. package/.output/server/chunks/build/{_id_-B2yirIuA.mjs → _id_-B78ky13D.mjs} +798 -358
  213. package/.output/server/chunks/build/_id_-B78ky13D.mjs.map +1 -0
  214. package/.output/server/chunks/build/{_id_-bWcP2xFl.mjs → _id_-BHh65pfg.mjs} +690 -443
  215. package/.output/server/chunks/build/_id_-BHh65pfg.mjs.map +1 -0
  216. package/.output/server/chunks/build/{_id_-B4V5fop6.mjs → _id_-Rzkqx55x.mjs} +297 -60
  217. package/.output/server/chunks/build/{_id_-B4V5fop6.mjs.map → _id_-Rzkqx55x.mjs.map} +1 -1
  218. package/.output/server/chunks/build/{_id_-CE0Gso6i.mjs → _id_-z5N6HPyC.mjs} +89 -40
  219. package/.output/server/chunks/build/_id_-z5N6HPyC.mjs.map +1 -0
  220. package/.output/server/chunks/build/{about-CoJjvUwM.mjs → about-CvSP73Ug.mjs} +100 -52
  221. package/.output/server/chunks/build/about-CvSP73Ug.mjs.map +1 -0
  222. package/.output/server/chunks/build/{account-Cn-eZqXM.mjs → account-DAfvaD-F.mjs} +21 -9
  223. package/.output/server/chunks/build/account-DAfvaD-F.mjs.map +1 -0
  224. package/.output/server/chunks/build/{ai-7jdaPOmj.mjs → ai-B4VJ9K1K.mjs} +45 -23
  225. package/.output/server/chunks/build/{ai-7jdaPOmj.mjs.map → ai-B4VJ9K1K.mjs.map} +1 -1
  226. package/.output/server/chunks/build/{analytics-B276WPeU.mjs → analytics-CJPC6t4L.mjs} +65 -39
  227. package/.output/server/chunks/build/{analytics-B276WPeU.mjs.map → analytics-CJPC6t4L.mjs.map} +1 -1
  228. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  229. package/.output/server/chunks/build/compare-RxHSOdsO.mjs +12 -0
  230. package/.output/server/chunks/build/{db.client-aHcD0wyX.mjs → db.client-CQoVTYB9.mjs} +83 -5
  231. package/.output/server/chunks/build/db.client-CQoVTYB9.mjs.map +1 -0
  232. package/.output/server/chunks/build/{default-BSzdkM_L.mjs → default-zvbFgDJG.mjs} +36 -24
  233. package/.output/server/chunks/build/default-zvbFgDJG.mjs.map +1 -0
  234. package/.output/server/chunks/build/{docs-BN_x1OW3.mjs → docs-DyuVEgtB.mjs} +30 -49
  235. package/.output/server/chunks/build/{docs-BN_x1OW3.mjs.map → docs-DyuVEgtB.mjs.map} +1 -1
  236. package/.output/server/chunks/build/{edit-C9Z7oZeu.mjs → edit-CFR5g2Qf.mjs} +30 -18
  237. package/.output/server/chunks/build/edit-CFR5g2Qf.mjs.map +1 -0
  238. package/.output/server/chunks/build/{fetch-8kznMtBM.mjs → fetch-B4FwBOzu.mjs} +3 -3
  239. package/.output/server/chunks/build/fetch-B4FwBOzu.mjs.map +1 -0
  240. package/.output/server/chunks/build/{forgot-password-BqPF4Rxs.mjs → forgot-password-CC__1OnV.mjs} +17 -5
  241. package/.output/server/chunks/build/forgot-password-CC__1OnV.mjs.map +1 -0
  242. package/.output/server/chunks/build/{help-content-DmFnuhNu.mjs → help-content-C876a9WD.mjs} +37 -8
  243. package/.output/server/chunks/build/help-content-C876a9WD.mjs.map +1 -0
  244. package/.output/server/chunks/build/import-CZo3djDi.mjs +1021 -0
  245. package/.output/server/chunks/build/import-CZo3djDi.mjs.map +1 -0
  246. package/.output/server/chunks/build/{index-CULN3-en.mjs → index-CU2nZhAa.mjs} +113 -42
  247. package/.output/server/chunks/build/index-CU2nZhAa.mjs.map +1 -0
  248. package/.output/server/chunks/build/{index-DVUtBexc.mjs → index-D7fe97l3.mjs} +1305 -281
  249. package/.output/server/chunks/build/index-D7fe97l3.mjs.map +1 -0
  250. package/.output/server/chunks/build/{index-BR9hw6qk.mjs → index-Stqw0dEI.mjs} +50 -30
  251. package/.output/server/chunks/build/index-Stqw0dEI.mjs.map +1 -0
  252. package/.output/server/chunks/build/{index-BK9PTRpd.mjs → index-gCw_y4ZJ.mjs} +87 -70
  253. package/.output/server/chunks/build/{index-BK9PTRpd.mjs.map → index-gCw_y4ZJ.mjs.map} +1 -1
  254. package/.output/server/chunks/build/{index-Ba-Fifra.mjs → index-tR6owKzj.mjs} +18 -6
  255. package/.output/server/chunks/build/index-tR6owKzj.mjs.map +1 -0
  256. package/.output/server/chunks/build/{isValueEqualOrExist-DBZjbD_3.mjs → isValueEqualOrExist-D2qw9YEr.mjs} +3 -3
  257. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs.map +1 -0
  258. package/.output/server/chunks/build/{login-D2XZDuek.mjs → login-Da4u1IlW.mjs} +19 -7
  259. package/.output/server/chunks/build/login-Da4u1IlW.mjs.map +1 -0
  260. package/.output/server/chunks/build/{mcp-_o6cMS6m.mjs → mcp-B3IUvRgD.mjs} +27 -21
  261. package/.output/server/chunks/build/mcp-B3IUvRgD.mjs.map +1 -0
  262. package/.output/server/chunks/build/{notifications-Dzm9c0u_.mjs → notifications-abDv0id8.mjs} +27 -21
  263. package/.output/server/chunks/build/notifications-abDv0id8.mjs.map +1 -0
  264. package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs +368 -0
  265. package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs.map +1 -0
  266. package/.output/server/chunks/build/{reset-password-gpFzIEDj.mjs → reset-password-BmrUS4ZD.mjs} +17 -5
  267. package/.output/server/chunks/build/reset-password-BmrUS4ZD.mjs.map +1 -0
  268. package/.output/server/chunks/build/server.mjs +238 -36
  269. package/.output/server/chunks/build/{settings-pNyPBXVa.mjs → settings-Du7YqF8i.mjs} +23 -10
  270. package/.output/server/chunks/build/settings-Du7YqF8i.mjs.map +1 -0
  271. package/.output/server/chunks/build/{settings-metadata-B0wo5R-W.mjs → settings-metadata-DrEqWcW-.mjs} +11 -2
  272. package/.output/server/chunks/build/settings-metadata-DrEqWcW-.mjs.map +1 -0
  273. package/.output/server/chunks/build/{storage-XelzuyPy.mjs → storage-B4vzxd8G.mjs} +41 -31
  274. package/.output/server/chunks/build/storage-B4vzxd8G.mjs.map +1 -0
  275. package/.output/server/chunks/build/styles.mjs +1 -0
  276. package/.output/server/chunks/build/{tags-DrCQ7QSw.mjs → tags-DauTe_F-.mjs} +22 -10
  277. package/.output/server/chunks/build/tags-DauTe_F-.mjs.map +1 -0
  278. package/.output/server/chunks/build/{test-cases-pmOxi-AN.mjs → test-cases-DUvaO1He.mjs} +38 -24
  279. package/.output/server/chunks/build/test-cases-DUvaO1He.mjs.map +1 -0
  280. package/.output/server/chunks/build/{timeout-hygiene-CNs71Iah.mjs → timeout-hygiene-CbnSaVbK.mjs} +20 -8
  281. package/.output/server/chunks/build/timeout-hygiene-CbnSaVbK.mjs.map +1 -0
  282. package/.output/server/chunks/build/{useAiStatus-ZO987RY7.mjs → useAiStatus-CWvIo32Q.mjs} +89 -89
  283. package/.output/server/chunks/build/useAiStatus-CWvIo32Q.mjs.map +1 -0
  284. package/.output/server/chunks/build/{useCopy-BQQKcwlq.mjs → useCopy-CeKWgHyT.mjs} +2 -2
  285. package/.output/server/chunks/build/useCopy-CeKWgHyT.mjs.map +1 -0
  286. package/.output/server/chunks/build/{PageStateCard-Bwee6JTk.mjs → useCopyRich-BemRsKgv.mjs} +418 -39
  287. package/.output/server/chunks/build/useCopyRich-BemRsKgv.mjs.map +1 -0
  288. package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs +46 -0
  289. package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs.map +1 -0
  290. package/.output/server/chunks/build/{useFormControl-BLpq1s4O.mjs → useFormControl-CZ9So7iX.mjs} +2 -2
  291. package/.output/server/chunks/build/useFormControl-CZ9So7iX.mjs.map +1 -0
  292. package/.output/server/chunks/build/{useOpenInIde-kMZ7Jw5c.mjs → useOpenInIde-4GFf-kdi.mjs} +2 -2
  293. package/.output/server/chunks/build/useOpenInIde-4GFf-kdi.mjs.map +1 -0
  294. package/.output/server/chunks/build/{useSettingsNav-NjI2seBy.mjs → useSettingsNav-C3O866KC.mjs} +6 -6
  295. package/.output/server/chunks/build/useSettingsNav-C3O866KC.mjs.map +1 -0
  296. package/.output/server/chunks/build/{useTreeViewCookie-DVYpxW-p.mjs → useTreeViewCookie-CQjQdTkH.mjs} +2 -2
  297. package/.output/server/chunks/build/useTreeViewCookie-CQjQdTkH.mjs.map +1 -0
  298. package/.output/server/chunks/build/{users-NmAUZs3i.mjs → users-CTUqXyGh.mjs} +22 -10
  299. package/.output/server/chunks/build/users-CTUqXyGh.mjs.map +1 -0
  300. package/.output/server/chunks/build/{virtualizer-ZaqK4guJ.mjs → virtualizer-Cd1hhlxC.mjs} +5 -5
  301. package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs.map +1 -0
  302. package/.output/server/chunks/build/{wasted-time-CguAF9zc.mjs → wasted-time-lYkx5YO4.mjs} +26 -14
  303. package/.output/server/chunks/build/wasted-time-lYkx5YO4.mjs.map +1 -0
  304. package/.output/server/chunks/nitro/nitro.mjs +4960 -1155
  305. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  306. package/.output/server/chunks/routes/__piwi/session.get.mjs +13 -1
  307. package/.output/server/chunks/routes/__piwi/session.get.mjs.map +1 -1
  308. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs +12 -0
  309. package/.output/server/chunks/routes/api/admin/cleanup.delete.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/admin/stats.get.mjs +12 -0
  311. package/.output/server/chunks/routes/api/admin/stats.get.mjs.map +1 -1
  312. package/.output/server/chunks/routes/api/ai/status.get.mjs +12 -0
  313. package/.output/server/chunks/routes/api/ai/status.get.mjs.map +1 -1
  314. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +12 -0
  315. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs.map +1 -1
  316. package/.output/server/chunks/routes/api/auth/change-password.post.mjs +12 -0
  317. package/.output/server/chunks/routes/api/auth/change-password.post.mjs.map +1 -1
  318. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +12 -0
  319. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs.map +1 -1
  320. package/.output/server/chunks/routes/api/auth/login.post.mjs +12 -0
  321. package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -1
  322. package/.output/server/chunks/routes/api/auth/logout.post.mjs +12 -0
  323. package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -1
  324. package/.output/server/chunks/routes/api/auth/me.get.mjs +12 -0
  325. package/.output/server/chunks/routes/api/auth/me.get.mjs.map +1 -1
  326. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +12 -0
  327. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs.map +1 -1
  328. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +12 -0
  329. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs.map +1 -1
  330. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +12 -0
  331. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs.map +1 -1
  332. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +12 -0
  333. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs.map +1 -1
  334. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +12 -0
  335. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs.map +1 -1
  336. package/.output/server/chunks/routes/api/auth/setup.get.mjs +12 -0
  337. package/.output/server/chunks/routes/api/auth/setup.get.mjs.map +1 -1
  338. package/.output/server/chunks/routes/api/auth/setup.post.mjs +12 -0
  339. package/.output/server/chunks/routes/api/auth/setup.post.mjs.map +1 -1
  340. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +12 -0
  341. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs.map +1 -1
  342. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +12 -0
  343. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs.map +1 -1
  344. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +12 -0
  345. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs.map +1 -1
  346. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +12 -0
  347. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs.map +1 -1
  348. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +12 -0
  349. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs.map +1 -1
  350. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs +12 -0
  351. package/.output/server/chunks/routes/api/desktop/reporter-config.get.mjs.map +1 -1
  352. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +12 -0
  353. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs.map +1 -1
  354. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +12 -0
  355. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs.map +1 -1
  356. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +12 -0
  357. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs.map +1 -1
  358. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +12 -0
  359. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs.map +1 -1
  360. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +24 -1
  361. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs.map +1 -1
  362. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +13 -1
  363. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs.map +1 -1
  364. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +13 -1
  365. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs.map +1 -1
  366. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +13 -1
  367. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs.map +1 -1
  368. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +13 -1
  369. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs.map +1 -1
  370. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +64 -0
  371. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs.map +1 -0
  372. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +13 -1
  373. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs.map +1 -1
  374. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +56 -0
  375. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs.map +1 -0
  376. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +13 -1
  377. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs.map +1 -1
  378. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +12 -0
  379. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs.map +1 -1
  380. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +13 -1
  381. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs.map +1 -1
  382. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +13 -32
  383. package/.output/server/chunks/routes/api/files/_...path_.get.mjs.map +1 -1
  384. package/.output/server/chunks/routes/api/health.get.mjs +13 -1
  385. package/.output/server/chunks/routes/api/health.get.mjs.map +1 -1
  386. package/.output/server/chunks/routes/api/index.get.mjs +12 -0
  387. package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
  388. package/.output/server/chunks/routes/api/index.get2.mjs +13 -1
  389. package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
  390. package/.output/server/chunks/routes/api/index.get3.mjs +13 -1
  391. package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
  392. package/.output/server/chunks/routes/api/index.get4.mjs +13 -1
  393. package/.output/server/chunks/routes/api/index.get4.mjs.map +1 -1
  394. package/.output/server/chunks/routes/api/index.get5.mjs +12 -0
  395. package/.output/server/chunks/routes/api/index.get5.mjs.map +1 -1
  396. package/.output/server/chunks/routes/api/index.post.mjs +12 -0
  397. package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
  398. package/.output/server/chunks/routes/api/index.post2.mjs +13 -1
  399. package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
  400. package/.output/server/chunks/routes/api/index.post3.mjs +13 -1
  401. package/.output/server/chunks/routes/api/index.post3.mjs.map +1 -1
  402. package/.output/server/chunks/routes/api/index.post4.mjs +13 -1
  403. package/.output/server/chunks/routes/api/index.post4.mjs.map +1 -1
  404. package/.output/server/chunks/routes/api/index.post5.mjs +13 -1
  405. package/.output/server/chunks/routes/api/index.post5.mjs.map +1 -1
  406. package/.output/server/chunks/routes/api/index.post6.mjs +12 -0
  407. package/.output/server/chunks/routes/api/index.post6.mjs.map +1 -1
  408. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +13 -1
  409. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs.map +1 -1
  410. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +13 -1
  411. package/.output/server/chunks/routes/api/links/_id_.delete.mjs.map +1 -1
  412. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +13 -1
  413. package/.output/server/chunks/routes/api/links/_id_.patch.mjs.map +1 -1
  414. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +13 -1
  415. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs.map +1 -1
  416. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +13 -1
  417. package/.output/server/chunks/routes/api/markers/_id_.put.mjs.map +1 -1
  418. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +13 -1
  419. package/.output/server/chunks/routes/api/notifications/stream.get.mjs.map +1 -1
  420. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +13 -1
  421. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs.map +1 -1
  422. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +13 -1
  423. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs.map +1 -1
  424. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +13 -1
  425. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs.map +1 -1
  426. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +22 -2
  427. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs.map +1 -1
  428. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +13 -1
  429. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs.map +1 -1
  430. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +13 -1
  431. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs.map +1 -1
  432. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +13 -1
  433. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs.map +1 -1
  434. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +13 -1
  435. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs.map +1 -1
  436. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +13 -1
  437. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs.map +1 -1
  438. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +13 -1
  439. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs.map +1 -1
  440. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +58 -0
  441. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs.map +1 -0
  442. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +57 -0
  443. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs.map +1 -0
  444. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +72 -0
  445. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs.map +1 -0
  446. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +13 -1
  447. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs.map +1 -1
  448. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +13 -1
  449. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs.map +1 -1
  450. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +13 -1
  451. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs.map +1 -1
  452. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +13 -1
  453. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs.map +1 -1
  454. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +13 -1
  455. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs.map +1 -1
  456. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +13 -1
  457. package/.output/server/chunks/routes/api/projects/_id_.get.mjs.map +1 -1
  458. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +13 -1
  459. package/.output/server/chunks/routes/api/projects/_id_.put.mjs.map +1 -1
  460. package/.output/server/chunks/routes/api/projects/menu.get.mjs +13 -1
  461. package/.output/server/chunks/routes/api/projects/menu.get.mjs.map +1 -1
  462. package/.output/server/chunks/routes/api/projects/overview.get.mjs +13 -1
  463. package/.output/server/chunks/routes/api/projects/overview.get.mjs.map +1 -1
  464. package/.output/server/chunks/routes/api/projects.get.mjs +13 -1
  465. package/.output/server/chunks/routes/api/projects.get.mjs.map +1 -1
  466. package/.output/server/chunks/routes/api/search.get.mjs +13 -1
  467. package/.output/server/chunks/routes/api/search.get.mjs.map +1 -1
  468. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +13 -1
  469. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs.map +1 -1
  470. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +13 -1
  471. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs.map +1 -1
  472. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs +12 -0
  473. package/.output/server/chunks/routes/api/settings/ai/models.post.mjs.map +1 -1
  474. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +13 -1
  475. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs.map +1 -1
  476. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +13 -1
  477. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs.map +1 -1
  478. package/.output/server/chunks/routes/api/settings/ai.get.mjs +13 -1
  479. package/.output/server/chunks/routes/api/settings/ai.get.mjs.map +1 -1
  480. package/.output/server/chunks/routes/api/settings/ai.put.mjs +13 -1
  481. package/.output/server/chunks/routes/api/settings/ai.put.mjs.map +1 -1
  482. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +57 -0
  483. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs.map +1 -0
  484. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +63 -0
  485. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs.map +1 -0
  486. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +12 -0
  487. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs.map +1 -1
  488. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +13 -1
  489. package/.output/server/chunks/routes/api/settings/smtp.get.mjs.map +1 -1
  490. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +13 -1
  491. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs.map +1 -1
  492. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +13 -1
  493. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs.map +1 -1
  494. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +13 -1
  495. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs.map +1 -1
  496. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +13 -1
  497. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs.map +1 -1
  498. package/.output/server/chunks/routes/api/stream.get.mjs +13 -1
  499. package/.output/server/chunks/routes/api/stream.get.mjs.map +1 -1
  500. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +13 -1
  501. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs.map +1 -1
  502. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +13 -1
  503. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs.map +1 -1
  504. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +13 -1
  505. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs.map +1 -1
  506. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +13 -1
  507. package/.output/server/chunks/routes/api/tags/_id_.put.mjs.map +1 -1
  508. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +13 -1
  509. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs.map +1 -1
  510. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +13 -1
  511. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs.map +1 -1
  512. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +13 -1
  513. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs.map +1 -1
  514. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +13 -1
  515. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs.map +1 -1
  516. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +25 -3
  517. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs.map +1 -1
  518. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +13 -1
  519. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs.map +1 -1
  520. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +60 -0
  521. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs.map +1 -0
  522. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +13 -1
  523. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs.map +1 -1
  524. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +13 -1
  525. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs.map +1 -1
  526. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +13 -1
  527. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs.map +1 -1
  528. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +13 -1
  529. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
  530. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +13 -1
  531. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
  532. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +13 -1
  533. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs.map +1 -1
  534. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +13 -1
  535. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs.map +1 -1
  536. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +13 -1
  537. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs.map +1 -1
  538. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +13 -1
  539. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs.map +1 -1
  540. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +13 -1
  541. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs.map +1 -1
  542. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +13 -1
  543. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs.map +1 -1
  544. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +13 -1
  545. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs.map +1 -1
  546. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +13 -1
  547. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs.map +1 -1
  548. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +13 -1
  549. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs.map +1 -1
  550. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +15 -1
  551. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
  552. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +196 -0
  553. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs.map +1 -0
  554. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +13 -1
  555. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs.map +1 -1
  556. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +13 -1
  557. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs.map +1 -1
  558. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +13 -1
  559. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs.map +1 -1
  560. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +13 -1
  561. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs.map +1 -1
  562. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +13 -1
  563. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs.map +1 -1
  564. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +13 -1
  565. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs.map +1 -1
  566. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +13 -1
  567. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs.map +1 -1
  568. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +13 -1
  569. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs.map +1 -1
  570. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +13 -1
  571. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs.map +1 -1
  572. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +78 -0
  573. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -0
  574. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +201 -0
  575. package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -0
  576. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +13 -1
  577. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs.map +1 -1
  578. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +13 -1
  579. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs.map +1 -1
  580. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +13 -1
  581. package/.output/server/chunks/routes/api/test-runs/start.post.mjs.map +1 -1
  582. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +32 -15
  583. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  584. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +21 -6
  585. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  586. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +154 -3
  587. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  588. package/.output/server/chunks/routes/api/traces/check.post.mjs +13 -1
  589. package/.output/server/chunks/routes/api/traces/check.post.mjs.map +1 -1
  590. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +12 -0
  591. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs.map +1 -1
  592. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +12 -0
  593. package/.output/server/chunks/routes/api/users/_id/index.get.mjs.map +1 -1
  594. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +13 -1
  595. package/.output/server/chunks/routes/api/users/_id/index.post.mjs.map +1 -1
  596. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +13 -1
  597. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs.map +1 -1
  598. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +13 -1
  599. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs.map +1 -1
  600. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +13 -1
  601. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs.map +1 -1
  602. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +12 -0
  603. package/.output/server/chunks/routes/api/users/_id_.delete.mjs.map +1 -1
  604. package/.output/server/chunks/routes/api/users/_id_.patch.mjs +12 -0
  605. package/.output/server/chunks/routes/api/users/_id_.patch.mjs.map +1 -1
  606. package/.output/server/chunks/routes/api/version.get.mjs +13 -1
  607. package/.output/server/chunks/routes/api/version.get.mjs.map +1 -1
  608. package/.output/server/chunks/routes/mcp.post.mjs +13 -1
  609. package/.output/server/chunks/routes/mcp.post.mjs.map +1 -1
  610. package/.output/server/chunks/routes/renderer.mjs +1 -1
  611. package/.output/server/chunks/tasks/sweep.mjs +12 -0
  612. package/.output/server/chunks/tasks/sweep.mjs.map +1 -1
  613. package/.output/server/chunks/tasks/sweep2.mjs +12 -0
  614. package/.output/server/chunks/tasks/sweep2.mjs.map +1 -1
  615. package/.output/server/database/migrations/0039_remarkable_jean_grey.sql +2 -0
  616. package/.output/server/database/migrations/0040_organic_phalanx.sql +8 -0
  617. package/.output/server/database/migrations/0041_tense_gravity.sql +5 -0
  618. package/.output/server/database/migrations/0042_burly_hemingway.sql +19 -0
  619. package/.output/server/database/migrations/meta/0039_snapshot.json +3403 -0
  620. package/.output/server/database/migrations/meta/0040_snapshot.json +3457 -0
  621. package/.output/server/database/migrations/meta/0041_snapshot.json +3492 -0
  622. package/.output/server/database/migrations/meta/0042_snapshot.json +3618 -0
  623. package/.output/server/database/migrations/meta/_journal.json +28 -0
  624. package/.output/server/database/migrations-pg/0040_lazy_layla_miller.sql +2 -0
  625. package/.output/server/database/migrations-pg/0041_light_screwball.sql +8 -0
  626. package/.output/server/database/migrations-pg/0042_serious_layla_miller.sql +5 -0
  627. package/.output/server/database/migrations-pg/0043_wonderful_mordo.sql +19 -0
  628. package/.output/server/database/migrations-pg/meta/0040_snapshot.json +4060 -0
  629. package/.output/server/database/migrations-pg/meta/0041_snapshot.json +4123 -0
  630. package/.output/server/database/migrations-pg/meta/0042_snapshot.json +4153 -0
  631. package/.output/server/database/migrations-pg/meta/0043_snapshot.json +4308 -0
  632. package/.output/server/database/migrations-pg/meta/_journal.json +28 -0
  633. package/.output/server/index.mjs +13 -1
  634. package/.output/server/index.mjs.map +1 -1
  635. package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
  636. package/.output/server/node_modules/fflate/package.json +128 -0
  637. package/.output/server/node_modules/highlight.js/es/languages/yaml.js +213 -0
  638. package/.output/server/node_modules/marked/lib/marked.esm.js +72 -0
  639. package/.output/server/node_modules/marked/package.json +103 -0
  640. package/.output/server/package.json +3 -1
  641. package/package.json +2 -2
  642. package/.output/public/_nuxt/9-wVZMur.js +0 -4
  643. package/.output/public/_nuxt/B-5GukRk.js +0 -1
  644. package/.output/public/_nuxt/B1G3GGhQ.js +0 -1
  645. package/.output/public/_nuxt/B1zMFx24.js +0 -1
  646. package/.output/public/_nuxt/B4jvLMfS.js +0 -1
  647. package/.output/public/_nuxt/BBnX5xw4.js +0 -2
  648. package/.output/public/_nuxt/BHpUiv6j.js +0 -3
  649. package/.output/public/_nuxt/BLOUs6AE.js +0 -5
  650. package/.output/public/_nuxt/BT6p4Pgt.js +0 -2
  651. package/.output/public/_nuxt/BUXSUkJ_.js +0 -1
  652. package/.output/public/_nuxt/BVf6Yx9V.js +0 -26
  653. package/.output/public/_nuxt/BbS6Bwby.js +0 -1
  654. package/.output/public/_nuxt/BeKvLsja.js +0 -2
  655. package/.output/public/_nuxt/BeUm5UNV.js +0 -1
  656. package/.output/public/_nuxt/BfV444H3.js +0 -3
  657. package/.output/public/_nuxt/BjKamgHq.js +0 -1
  658. package/.output/public/_nuxt/BoJdjCVl.js +0 -4
  659. package/.output/public/_nuxt/BreO2PiA.js +0 -1
  660. package/.output/public/_nuxt/BvIDC_R-.js +0 -1
  661. package/.output/public/_nuxt/ByuJWADR.js +0 -34
  662. package/.output/public/_nuxt/C1dyLp_j.js +0 -1
  663. package/.output/public/_nuxt/CAUgpKsF.js +0 -2
  664. package/.output/public/_nuxt/CL9-VLTJ.js +0 -1
  665. package/.output/public/_nuxt/CazDIG_m.js +0 -1
  666. package/.output/public/_nuxt/CdMuck_X.js +0 -1
  667. package/.output/public/_nuxt/CfROFPse.js +0 -1
  668. package/.output/public/_nuxt/Cnapl7lZ.js +0 -1
  669. package/.output/public/_nuxt/CscWZxCi.js +0 -1
  670. package/.output/public/_nuxt/CuicKV-B.js +0 -34
  671. package/.output/public/_nuxt/Cyiu1VQD.js +0 -1
  672. package/.output/public/_nuxt/D6PUPmRC.js +0 -1
  673. package/.output/public/_nuxt/DCl2yo4g.js +0 -8
  674. package/.output/public/_nuxt/DHXWp5yD.js +0 -1
  675. package/.output/public/_nuxt/DHltYerF.js +0 -114
  676. package/.output/public/_nuxt/DLXydYJb.js +0 -47
  677. package/.output/public/_nuxt/DRPSi76A.js +0 -1
  678. package/.output/public/_nuxt/DS53kyHJ.js +0 -1
  679. package/.output/public/_nuxt/DWhBqv_7.js +0 -1
  680. package/.output/public/_nuxt/Dd0kK5WH.js +0 -1
  681. package/.output/public/_nuxt/Dga3Av-m.js +0 -1
  682. package/.output/public/_nuxt/DgwTpwfB.js +0 -1
  683. package/.output/public/_nuxt/DkI145a5.js +0 -1
  684. package/.output/public/_nuxt/DoFBTaDR.js +0 -1
  685. package/.output/public/_nuxt/Dr_dI5hB.js +0 -1
  686. package/.output/public/_nuxt/EPZOxdgq.js +0 -1
  687. package/.output/public/_nuxt/R1nNqTru.js +0 -1
  688. package/.output/public/_nuxt/builds/meta/7caf3cb3-d272-4dbd-bb3f-1eeb64fab5d1.json +0 -1
  689. package/.output/public/_nuxt/entry.ChQMshd4.css +0 -1
  690. package/.output/public/_nuxt/gCELhaU9.js +0 -1
  691. package/.output/public/_nuxt/ipDzNHcs.js +0 -5
  692. package/.output/public/_nuxt/qH_j2A3a.js +0 -1
  693. package/.output/public/_nuxt/r3SBLxtE.js +0 -1
  694. package/.output/public/_nuxt/rsiRgrVM.js +0 -1
  695. package/.output/public/_nuxt/swrbBdtB.js +0 -1
  696. package/.output/public/sw.js +0 -1
  697. package/.output/public/workbox-2fbc6a65.js +0 -1
  698. package/.output/server/chunks/build/Alert-Bp1Wz_sq.mjs.map +0 -1
  699. package/.output/server/chunks/build/Breadcrumb-C9ZPTLym.mjs.map +0 -1
  700. package/.output/server/chunks/build/BreadcrumbNav-C3y42Vun.mjs.map +0 -1
  701. package/.output/server/chunks/build/BrowserBadge-DNCp9pF-.mjs.map +0 -1
  702. package/.output/server/chunks/build/ChartCard-Fr557IbV.mjs.map +0 -1
  703. package/.output/server/chunks/build/Checkbox-cVOSIY93.mjs.map +0 -1
  704. package/.output/server/chunks/build/CiEnvCard-DXPOhdSG.mjs.map +0 -1
  705. package/.output/server/chunks/build/CodeBlock-BGwNmJ8J.mjs.map +0 -1
  706. package/.output/server/chunks/build/DashboardNavbar-Bdp-OwTN.mjs.map +0 -1
  707. package/.output/server/chunks/build/DashboardSidebarToggle-Ji6ADuqF.mjs.map +0 -1
  708. package/.output/server/chunks/build/DataLocationCard-D6xSOrme.mjs.map +0 -1
  709. package/.output/server/chunks/build/DiagnosisPanel-DV1xwGu4.mjs.map +0 -1
  710. package/.output/server/chunks/build/EmptyState-DV3oT_xz.mjs.map +0 -1
  711. package/.output/server/chunks/build/EntityLinks-DeOP13Kr.mjs.map +0 -1
  712. package/.output/server/chunks/build/EnvManagedBadge-Qpn58Nmr.mjs.map +0 -1
  713. package/.output/server/chunks/build/FormField-B-GSn_VR.mjs.map +0 -1
  714. package/.output/server/chunks/build/HelpHint-YEMWtKu1.mjs.map +0 -1
  715. package/.output/server/chunks/build/Label-DBvbHd3A.mjs.map +0 -1
  716. package/.output/server/chunks/build/MiniRunBars-C3HG-EYm.mjs.map +0 -1
  717. package/.output/server/chunks/build/Modal-CfA78Hm1.mjs.map +0 -1
  718. package/.output/server/chunks/build/PageStateCard-Bwee6JTk.mjs.map +0 -1
  719. package/.output/server/chunks/build/ProjectTestCasesTable-9Ia825h8.mjs.map +0 -1
  720. package/.output/server/chunks/build/RovingFocusItem-CxhHdNGo.mjs.map +0 -1
  721. package/.output/server/chunks/build/RunReports-BpJqLHY9.mjs.map +0 -1
  722. package/.output/server/chunks/build/RunStatusBadge-BhmJ_RKM.mjs.map +0 -1
  723. package/.output/server/chunks/build/SectionCard-COd9TuDq.mjs.map +0 -1
  724. package/.output/server/chunks/build/Select-ppPz926C.mjs.map +0 -1
  725. package/.output/server/chunks/build/Separator-CxZdx8kw.mjs.map +0 -1
  726. package/.output/server/chunks/build/SettingsField-DDD4oqys.mjs.map +0 -1
  727. package/.output/server/chunks/build/Slideover-B95Rj237.mjs.map +0 -1
  728. package/.output/server/chunks/build/Switch-xQQ3_ME1.mjs.map +0 -1
  729. package/.output/server/chunks/build/Table-CPhhVzDv.mjs.map +0 -1
  730. package/.output/server/chunks/build/Tabs-BV9XqjoO.mjs.map +0 -1
  731. package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs +0 -47
  732. package/.output/server/chunks/build/TagBadge-BDcvvGxw.mjs.map +0 -1
  733. package/.output/server/chunks/build/TestCaseHistoryChart-DMb-xSJa.mjs.map +0 -1
  734. package/.output/server/chunks/build/TestStatusBar-CEzt76wk.mjs.map +0 -1
  735. package/.output/server/chunks/build/Textarea-DrrqQUVG.mjs.map +0 -1
  736. package/.output/server/chunks/build/Tooltip-7vwuDPrZ.mjs.map +0 -1
  737. package/.output/server/chunks/build/VisuallyHiddenInput-C9eJVpPW.mjs.map +0 -1
  738. package/.output/server/chunks/build/_id_-B2yirIuA.mjs.map +0 -1
  739. package/.output/server/chunks/build/_id_-CE0Gso6i.mjs.map +0 -1
  740. package/.output/server/chunks/build/_id_-bWcP2xFl.mjs.map +0 -1
  741. package/.output/server/chunks/build/about-CoJjvUwM.mjs.map +0 -1
  742. package/.output/server/chunks/build/account-Cn-eZqXM.mjs.map +0 -1
  743. package/.output/server/chunks/build/db.client-aHcD0wyX.mjs.map +0 -1
  744. package/.output/server/chunks/build/default-BSzdkM_L.mjs.map +0 -1
  745. package/.output/server/chunks/build/edit-C9Z7oZeu.mjs.map +0 -1
  746. package/.output/server/chunks/build/fetch-8kznMtBM.mjs.map +0 -1
  747. package/.output/server/chunks/build/forgot-password-BqPF4Rxs.mjs.map +0 -1
  748. package/.output/server/chunks/build/help-content-DmFnuhNu.mjs.map +0 -1
  749. package/.output/server/chunks/build/index-BR9hw6qk.mjs.map +0 -1
  750. package/.output/server/chunks/build/index-Ba-Fifra.mjs.map +0 -1
  751. package/.output/server/chunks/build/index-CULN3-en.mjs.map +0 -1
  752. package/.output/server/chunks/build/index-DVUtBexc.mjs.map +0 -1
  753. package/.output/server/chunks/build/isValueEqualOrExist-DBZjbD_3.mjs.map +0 -1
  754. package/.output/server/chunks/build/login-D2XZDuek.mjs.map +0 -1
  755. package/.output/server/chunks/build/mcp-_o6cMS6m.mjs.map +0 -1
  756. package/.output/server/chunks/build/notifications-Dzm9c0u_.mjs.map +0 -1
  757. package/.output/server/chunks/build/reset-password-gpFzIEDj.mjs.map +0 -1
  758. package/.output/server/chunks/build/settings-metadata-B0wo5R-W.mjs.map +0 -1
  759. package/.output/server/chunks/build/settings-pNyPBXVa.mjs.map +0 -1
  760. package/.output/server/chunks/build/storage-XelzuyPy.mjs.map +0 -1
  761. package/.output/server/chunks/build/tags-DrCQ7QSw.mjs.map +0 -1
  762. package/.output/server/chunks/build/test-cases-pmOxi-AN.mjs.map +0 -1
  763. package/.output/server/chunks/build/timeout-hygiene-CNs71Iah.mjs.map +0 -1
  764. package/.output/server/chunks/build/useAiStatus-ZO987RY7.mjs.map +0 -1
  765. package/.output/server/chunks/build/useCopy-BQQKcwlq.mjs.map +0 -1
  766. package/.output/server/chunks/build/useFormControl-BLpq1s4O.mjs.map +0 -1
  767. package/.output/server/chunks/build/useOpenInIde-kMZ7Jw5c.mjs.map +0 -1
  768. package/.output/server/chunks/build/useSettingsNav-NjI2seBy.mjs.map +0 -1
  769. package/.output/server/chunks/build/useTreeViewCookie-DVYpxW-p.mjs.map +0 -1
  770. package/.output/server/chunks/build/users-NmAUZs3i.mjs.map +0 -1
  771. package/.output/server/chunks/build/virtualizer-ZaqK4guJ.mjs.map +0 -1
  772. package/.output/server/chunks/build/wasted-time-CguAF9zc.mjs.map +0 -1
  773. /package/.output/public/_nuxt/{PageStateCard.BrM5HWjY.css → useCopyRich.BrM5HWjY.css} +0 -0
@@ -0,0 +1,4 @@
1
+ import{_ as Le}from"./279D2RYp.js";import{_ as De}from"./BqV0l12c.js";import{_ as _e,a as Pe,b as Oe,c as He,d as qe,e as Ge,f as Ke,g as ke,u as We,h as Je,i as Ze,j as Qe,k as Xe,l as Ye,m as et}from"./dYCKgE-3.js";import{d as ee,o as s,f as S,g as p,i as t,q as Y,k as e,j as r,c as l,t as a,v as d,s as ce,m as $,p as te,D as be,F as B,y as Q,_ as ie,h as P,E as tt,G as st,r as v,H as ae,B as nt,l as Z,I as $e,J as at,K as ot,C as fe,L as lt,b as rt,u as it,w as ct,e as ut,M as dt}from"./NQikbhmK.js";import{_ as Ce}from"./DP8hfJ9h.js";import{_ as mt,a as ft}from"./CHEFCN8Q.js";import{_ as ge}from"./C7P1UCO2.js";import{_ as pt}from"./tvgqrYDd.js";import{_ as gt}from"./DprVVyUQ.js";import{_ as we}from"./eaVkJRSa.js";import{u as xt,_ as vt,a as yt,i as ht,b as _t,s as ve,c as kt}from"./HXerICAi.js";import{c as ye,f as re,a as bt,b as $t,d as Ct,e as Se,s as pe,g as de,r as he,h as wt}from"./CDk0q2hV.js";import{_ as xe}from"./BPRffDuo.js";import{_ as St}from"./cHAnlQbv.js";import{_ as Tt}from"./DiZyJYez.js";import{_ as It}from"./BxCKKeYs.js";import{_ as jt}from"./ybDYeNxd.js";import{_ as Te}from"./B3HO8kuh.js";import{u as Rt,p as zt,_ as Ut}from"./DW0xl3I6.js";import{b as Et}from"./CylWPruw.js";import{u as Vt}from"./CpjgB2aY.js";import{u as At}from"./Bn0YQDyy.js";import"./YVN7WG7q.js";import"./B44A4LSJ.js";import"./CtQBsNUb.js";import"./CHNwfU1y.js";import"./D0HNloZ9.js";import"./rWNTSFD6.js";import"./D-c8ZSws.js";import"./eptP4pGv.js";import"./BjaRappk.js";import"./IvQlbZk6.js";import"./BeLWlVK0.js";import"./g26aVPxc.js";import"./BYDaY0Z7.js";import"./FUXhyidq.js";import"./C95YAaJq.js";const Mt={class:"flex items-center gap-3 flex-1 min-w-0 justify-between"},Nt={class:"flex items-center gap-3 min-w-0"},Ft={class:"font-mono text-sm truncate text-gray-600 dark:text-gray-400 min-w-0"},Bt={class:"flex items-center gap-3 shrink-0 max-sm:hidden"},Lt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Dt={class:"text-xs text-gray-500 tabular-nums whitespace-nowrap"},Pt={key:1,class:"text-xs text-gray-400 whitespace-nowrap"},Ot={class:"grid grid-cols-1 lg:grid-cols-12 gap-4"},Ht={class:"space-y-3"},qt={key:0,class:"text-sm font-medium break-words text-gray-500 dark:text-gray-400"},Gt={class:"flex flex-wrap gap-2"},Kt={class:"text-sm text-gray-500"},Wt={key:1,class:"rounded-md border border-default p-3 space-y-1.5"},Jt={class:"flex items-center gap-2 flex-wrap"},Zt={key:0,class:"text-xs text-gray-500"},Qt={class:"text-xs text-gray-500"},Xt={class:"text-sm text-gray-500"},Yt={class:"font-mono text-xs"},es={class:"flex items-start gap-3"},ts={class:"flex flex-col gap-1 shrink-0"},ss={class:"flex-1 min-w-0 space-y-1.5"},ns={class:"flex justify-end"},as=ee({__name:"ClusterSummary",props:{cluster:{},triageStatus:{},triageNote:{},triageSaving:{type:Boolean},triageChanged:{type:Boolean}},emits:["update:triageStatus","update:triageNote","save-triage"],setup(n,{emit:R}){const m=n,C=R,{summaryColSpanClass:f}=xt(()=>1),y=P(()=>Ct(m.cluster.fixVerification)),o=[{label:"Open",value:"open",color:"warning"},{label:"Resolved",value:"resolved",color:"success"},{label:"Ignored",value:"ignored",color:"neutral"}];return(i,g)=>{const I=ce,U=te,E=ge,T=be,_=pt,j=gt,h=ie,M=we,O=vt;return s(),S(O,{"storage-key":"failure-cluster"},{folded:p(()=>[t("div",Mt,[t("div",Nt,[r(I,{color:("clusterStatusColor"in i?i.clusterStatusColor:e($t))(n.cluster.status),variant:"solid",size:"sm",class:"shrink-0 capitalize"},{default:p(()=>[$(a(n.cluster.status),1)]),_:1},8,["color"]),t("span",Ft,a(n.cluster.signature),1),n.cluster.errorType?(s(),S(I,{key:0,color:("clusterErrorTypeColor"in i?i.clusterErrorTypeColor:e(ye))(n.cluster.errorType),variant:"subtle",size:"sm"},{default:p(()=>[$(a(n.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),e(y)?(s(),S(I,{key:1,color:e(y).color,variant:"subtle",size:"sm",class:"gap-1 shrink-0"},{default:p(()=>[r(U,{name:e(y).icon,class:"size-3"},null,8,["name"]),$(" "+a(e(y).label),1)]),_:1},8,["color"])):d("",!0)]),t("div",Bt,[t("span",Lt,a(n.cluster.occurrences)+" occurrence"+a(n.cluster.occurrences===1?"":"s"),1),t("span",Dt,a(n.cluster.affectedTests)+" "+a(n.cluster.affectedTests===1?"test":"tests"),1),n.cluster.diagnosis?.status==="completed"&&n.cluster.diagnosis?.category?(s(),S(I,{key:0,color:"neutral",variant:"outline",size:"sm",class:"gap-1 whitespace-nowrap"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+a(n.cluster.diagnosis.category),1)]),_:1})):d("",!0),n.cluster.lastSeenAt?(s(),l("span",Pt," last seen "+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.lastSeenAt)),1)):d("",!0)])])]),default:p(()=>[t("div",Ot,[t("div",{class:Y(e(f))},[r(j,{title:n.cluster.signature},{default:p(()=>[t("div",Ht,[n.cluster.title?(s(),l("p",qt,a(n.cluster.title),1)):d("",!0),t("div",Gt,[n.cluster.errorType?(s(),S(I,{key:0,color:("clusterErrorTypeColor"in i?i.clusterErrorTypeColor:e(ye))(n.cluster.errorType),variant:"subtle"},{default:p(()=>[$(a(n.cluster.errorType),1)]),_:1},8,["color"])):d("",!0),r(I,{color:"neutral",variant:"subtle"},{default:p(()=>[$(a(n.cluster.occurrences)+" occurrence"+a(n.cluster.occurrences===1?"":"s"),1)]),_:1}),r(I,{color:"neutral",variant:"subtle"},{default:p(()=>[$(a(n.cluster.affectedTests)+" "+a(n.cluster.affectedTests===1?"test":"tests")+" affected ",1)]),_:1}),n.cluster.diagnosis?.status==="completed"&&n.cluster.diagnosis?.category?(s(),S(I,{key:1,color:"neutral",variant:"outline",class:"gap-1"},{default:p(()=>[r(U,{name:"i-lucide-sparkles",class:"size-3"}),$(" "+a(n.cluster.diagnosis.category),1)]),_:1})):d("",!0),r(E,{topic:"cluster.concept"})]),t("p",Kt,[g[2]||(g[2]=$(" First seen in ",-1)),r(T,{to:`/test-runs/${n.cluster.firstSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+a(n.cluster.firstSeenRunId),1)]),_:1},8,["to"]),n.cluster.firstSeenAt?(s(),l(B,{key:0},[$(" ("+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.firstSeenAt))+") ",1)],64)):d("",!0),g[3]||(g[3]=$(" · Last seen in ",-1)),r(T,{to:`/test-runs/${n.cluster.lastSeenRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+a(n.cluster.lastSeenRunId),1)]),_:1},8,["to"]),n.cluster.lastSeenAt?(s(),l(B,{key:1},[$(" ("+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.lastSeenAt))+") ",1)],64)):d("",!0),n.cluster.lastSeenRunStatus?(s(),S(_,{key:2,status:n.cluster.lastSeenRunStatus,size:"sm",class:"ml-1 align-middle"},null,8,["status"])):d("",!0)]),e(y)?(s(),l("div",Wt,[t("div",Jt,[r(I,{color:e(y).color,variant:"subtle",class:"gap-1"},{default:p(()=>[r(U,{name:e(y).icon,class:"size-3"},null,8,["name"]),$(" "+a(e(y).label),1)]),_:1},8,["color"]),n.cluster.timeToResolutionMs!=null?(s(),l("span",Zt," open for "+a(("formatDuration"in i?i.formatDuration:e(bt))(n.cluster.timeToResolutionMs)),1)):d("",!0),r(E,{topic:"cluster.resolution"})]),t("p",Qt,a(e(y).hint),1),t("p",Xt,[n.cluster.fixLandedRunId?(s(),l(B,{key:0},[g[4]||(g[4]=$(" Fix landed in ",-1)),r(T,{to:`/test-runs/${n.cluster.fixLandedRunId}`,class:"text-primary hover:underline"},{default:p(()=>[$(" run #"+a(n.cluster.fixLandedRunId),1)]),_:1},8,["to"])],64)):d("",!0),n.cluster.fixLandedAt?(s(),l(B,{key:1},[$(" ("+a(("formatRelativeTime"in i?i.formatRelativeTime:e(re))(n.cluster.fixLandedAt))+")",1)],64)):d("",!0),n.cluster.fixCommit?(s(),l(B,{key:2},[g[5]||(g[5]=$(" · commit ",-1)),t("code",Yt,a(n.cluster.fixCommit.slice(0,8)),1)],64)):d("",!0)])])):d("",!0)])]),_:1},8,["title"])],2),r(j,{class:"lg:col-span-3",icon:"i-lucide-triangle-alert","icon-class":"text-amber-500",title:"Triage",help:"cluster.triage"},{default:p(()=>[t("div",es,[t("div",ts,[(s(),l(B,null,Q(o,V=>r(h,{key:V.value,size:"xs",class:"justify-start",color:n.triageStatus===V.value?V.color:"neutral",variant:n.triageStatus===V.value?"solid":"outline",onClick:N=>C("update:triageStatus",V.value)},{default:p(()=>[$(a(V.label),1)]),_:2},1032,["color","variant","onClick"])),64))]),t("div",ss,[r(M,{"model-value":n.triageNote,placeholder:"Optional note…",rows:3,class:"text-sm w-full","onUpdate:modelValue":g[0]||(g[0]=V=>C("update:triageNote",V))},null,8,["model-value"]),t("div",ns,[n.triageChanged?(s(),S(h,{key:0,size:"xs",icon:"i-lucide-check",loading:n.triageSaving,onClick:g[1]||(g[1]=V=>C("save-triage"))},{default:p(()=>[...g[6]||(g[6]=[$(" Save ",-1)])]),_:1},8,["loading"])):d("",!0)])])])]),_:1})])]),_:1})}}}),os=Object.assign(as,{__name:"ClusterSummary"}),ls={class:"divide-y divide-default"},rs={class:"text-xs font-mono text-gray-700 dark:text-gray-300 break-all whitespace-pre-wrap"},is={class:"text-xs font-mono text-gray-600 dark:text-gray-400 truncate"},cs=ee({__name:"TestEvidenceSignals",props:st({consoleLogs:{},networkRequests:{}},{open:{type:Boolean,default:!1},openModifiers:{}}),emits:["update:open"],setup(n){const R=n,m=P(()=>Array.isArray(R.consoleLogs)?R.consoleLogs.filter(i=>i.type==="error"||i.type==="warning"):[]),C=P(()=>Array.isArray(R.networkRequests)?R.networkRequests.filter(i=>i.status&&i.status>=400):[]),f=P(()=>m.value.length>0||C.value.length>0),y=P(()=>{const i=[];return m.value.length&&i.push(`${m.value.length} console`),C.value.length&&i.push(`${C.value.length} network`),i.join(", ")}),o=tt(n,"open");return(i,g)=>{const I=te,U=ce,E=_e;return e(f)?(s(),S(E,{key:0,icon:"i-lucide-triangle-alert",label:`Signals (${e(y)})`,open:o.value,"onUpdate:open":g[0]||(g[0]=T=>o.value=T)},{default:p(()=>[t("div",ls,[e(m).length>0?(s(),l(B,{key:0},[g[1]||(g[1]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Console")],-1)),(s(!0),l(B,null,Q(e(m),(T,_)=>(s(),l("div",{key:"log-"+_,class:"px-3 py-1.5 flex items-start gap-2"},[r(I,{name:T.type==="error"?"i-lucide-x-circle":"i-lucide-alert-triangle",class:Y(["size-3.5 mt-0.5 shrink-0",T.type==="error"?"text-red-500":"text-yellow-500"])},null,8,["name","class"]),t("p",rs,a(T.text),1)]))),128))],64)):d("",!0),e(C).length>0?(s(),l(B,{key:1},[g[2]||(g[2]=t("div",{class:"px-3 py-1 bg-gray-50 dark:bg-gray-800/40"},[t("p",{class:"text-[10px] font-semibold text-gray-400 uppercase tracking-wide"},"Network")],-1)),(s(!0),l(B,null,Q(e(C),(T,_)=>(s(),l("div",{key:"req-"+_,class:"px-3 py-1.5 flex items-center gap-2"},[r(U,{color:T.status>=500?"error":"warning",variant:"subtle",size:"sm",class:"shrink-0 font-mono"},{default:p(()=>[$(a(T.status),1)]),_:2},1032,["color"]),t("p",is,a(T.url),1)]))),128))],64)):d("",!0)])]),_:1},8,["label","open"])):d("",!0)}}}),us=Object.assign(cs,{__name:"TestEvidenceSignals"}),ds={class:"space-y-3"},ms={key:0,class:"flex gap-0 border-b border-default overflow-x-auto"},fs=["title","onClick"],ps={key:0,class:"opacity-60 ml-1"},gs={key:1,class:"flex items-start justify-between gap-2 flex-wrap"},xs={class:"min-w-0"},vs={class:"text-sm font-medium break-words"},ys={key:2,class:"flex items-center justify-center py-10"},hs={key:0,class:"flex flex-wrap gap-1.5"},_s={class:"divide-y divide-default"},ks={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},bs={key:0,class:"text-xs font-mono text-red-500 whitespace-pre-wrap break-all"},$s={class:"overflow-x-auto max-h-72"},Cs={class:"max-h-64 overflow-auto"},ws=ee({__name:"ClusterTestEvidence",props:{affectedTestCases:{},projectKey:{},projectName:{}},setup(n){const R=n,m=v(R.affectedTestCases[0]?.recentTestRunsCaseId??null),C=P(()=>R.affectedTestCases.find(c=>c.recentTestRunsCaseId===m.value)),f=v(null),y=v([]),o=v(!1),i=v(!1),g=v(!1),I=v(!1),U=v(!1),E=v(!1),T=v(!1),_=new Map;function j(){g.value=!1,I.value=!1,U.value=!1,E.value=!1,T.value=!1}async function h(c){j();const w=_.get(c);if(w){f.value=w.detail,y.value=w.traces,o.value=!1,i.value=!1;return}o.value=!0,i.value=!0,f.value=null,y.value=[];const[D,q]=await Promise.allSettled([$fetch(`/api/test-run-cases/${c}`),$fetch(`/api/test-run-cases/${c}/traces`)]);D.status==="fulfilled"&&(f.value=D.value),o.value=!1,q.status==="fulfilled"&&(y.value=q.value),i.value=!1,D.status==="fulfilled"&&q.status==="fulfilled"&&_.set(c,{detail:D.value,traces:q.value})}const M=new Map,O=v(null),V=v("trace"),N=P(()=>O.value?.frames??[]);async function H(c){if(O.value=M.get(c)??null,M.has(c)||y.value.length===0)return;const w=f.value?.testRun?.id;if(w)try{const D=await $fetch(`/api/test-runs/${w}/cases/${c}/trace-stacks`),q=D.status==="ok"&&D.frames?.length?D:null;M.set(c,q),m.value===c&&(O.value=q)}catch{M.set(c,null)}}ae([f,y],()=>{V.value="trace",m.value&&H(m.value)}),ae(m,c=>{c&&h(c)}),nt(()=>{m.value&&h(m.value)});const A=P(()=>{const c=f.value?.steps;return Array.isArray(c)?c.filter(w=>w.error):[]}),L=P(()=>f.value?.testSource?f.value.testSource.split(`
2
+ `).length:0),z=P(()=>{const c=f.value;if(!c)return[];const w=c.attachments.filter(k=>ht(k.path,k.contentType)).length,D=c.attachments.filter(k=>_t(k.path,k.contentType)).length,q=Array.isArray(c.consoleLogs)?c.consoleLogs.filter(k=>k.type==="error"||k.type==="warning").length:0,X=Array.isArray(c.networkRequests)?c.networkRequests.filter(k=>(k.status??0)>=400).length:0;return[{icon:"i-lucide-image",label:"screenshots",count:w},{icon:"i-lucide-video",label:"videos",count:D},{icon:"i-lucide-bug-play",label:"traces",count:y.value.length},{icon:"i-lucide-list-checks",label:"failing steps",count:A.value.length},{icon:"i-lucide-triangle-alert",label:"signals",count:q+X},{icon:"i-lucide-code",label:"source",count:c.testSourceFrames?.length||(c.testSource?1:0)},{icon:"i-lucide-accessibility",label:"ARIA",count:c.ariaSnapshot?1:0}].filter(k=>k.count>0)});return(c,w)=>{const D=xe,q=ie,X=te,k=ce,u=Pe,b=Oe,F=He,G=_e,K=us,W=St,J=qe,se=Ge,ne=yt,ue=Ke;return s(),l("div",ds,[n.affectedTestCases.length>1?(s(),l("div",ms,[(s(!0),l(B,null,Q(n.affectedTestCases,x=>(s(),l("button",{key:x.recentTestRunsCaseId,class:Y(["px-3 py-1.5 text-xs whitespace-nowrap border-b-2 -mb-px transition-colors",e(m)===x.recentTestRunsCaseId?"border-primary text-primary font-medium":"border-transparent text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"]),title:x.title,onClick:oe=>m.value=x.recentTestRunsCaseId},[$(a(x.title.split(" › ").pop())+" ",1),x.runCount>1?(s(),l("span",ps,a(x.runCount)+"×",1)):d("",!0)],10,fs))),128))])):d("",!0),e(C)?(s(),l("div",gs,[t("div",xs,[t("p",vs,a(e(C).title),1),r(D,{"file-path":e(C).filePath,"project-key":n.projectKey,"project-name":n.projectName,class:"text-xs text-gray-400"},null,8,["file-path","project-key","project-name"])]),r(q,{to:`/test-run-cases/${e(C).recentTestRunsCaseId}`,size:"xs",variant:"outline",color:"neutral","trailing-icon":"i-lucide-arrow-right"},{default:p(()=>[...w[6]||(w[6]=[$(" Open test run case ",-1)])]),_:1},8,["to"])])):d("",!0),e(o)?(s(),l("div",ys,[r(X,{name:"i-lucide-loader-circle",class:"size-5 animate-spin text-gray-400"})])):e(f)?(s(),l(B,{key:3},[e(z).length?(s(),l("div",hs,[(s(!0),l(B,null,Q(e(z),x=>(s(),S(k,{key:x.label,color:"neutral",variant:"subtle",size:"sm",class:"gap-1"},{default:p(()=>[r(X,{name:x.icon,class:"size-3"},null,8,["name"]),$(" "+a(x.count)+" "+a(x.label),1)]),_:2},1024))),128))])):d("",!0),r(u,{attachments:e(f).attachments},null,8,["attachments"]),r(b,{attachments:e(f).attachments},null,8,["attachments"]),r(F,{traces:e(y),loading:e(i)},null,8,["traces","loading"]),e(A).length>0?(s(),S(G,{key:1,icon:"i-lucide-list-checks",label:"Failing steps",count:e(A).length,open:e(g),"onUpdate:open":w[0]||(w[0]=x=>Z(g)?g.value=x:null)},{default:p(()=>[t("div",_s,[(s(!0),l(B,null,Q(e(A),(x,oe)=>(s(),l("div",{key:oe,class:"px-3 py-2 space-y-0.5"},[t("p",ks,a(oe+1)+". "+a(x.title),1),x.error?.message?(s(),l("p",bs,a(x.error.message),1)):d("",!0)]))),128))])]),_:1},8,["count","open"])):d("",!0),r(K,{"console-logs":e(f).consoleLogs,"network-requests":e(f).networkRequests,open:e(I),"onUpdate:open":w[1]||(w[1]=x=>Z(I)?I.value=x:null)},null,8,["console-logs","network-requests","open"]),e(f).testSourceFrames?.length||e(f).testSource||e(N).length?(s(),S(G,{key:2,icon:"i-lucide-code",label:"Test source",count:e(N).length||e(f).testSourceFrames?.length||e(L),open:e(U),"onUpdate:open":w[3]||(w[3]=x=>Z(U)?U.value=x:null)},{default:p(()=>[e(N).length&&(e(f).testSourceFrames?.length||e(f).testSource)?(s(),S(W,{key:0,modelValue:e(V),"onUpdate:modelValue":w[2]||(w[2]=x=>Z(V)?V.value=x:null),items:[{label:`Full stack (${e(N).length})`,value:"trace"},{label:`Captured (${e(f).testSourceFrames?.length||1})`,value:"captured"}],size:"xs",variant:"link",class:"mb-1.5",ui:{list:"gap-2",trigger:"px-1.5"}},null,8,["modelValue","items"])):d("",!0),t("div",$s,[e(V)==="trace"&&e(N).length?(s(),S(J,{key:0,frames:e(N),"project-key":n.projectKey,"project-name":n.projectName},null,8,["frames","project-key","project-name"])):e(f).testSourceFrames?.length?(s(),S(se,{key:1,frames:e(f).testSourceFrames,"project-key":n.projectKey,"project-name":n.projectName},null,8,["frames","project-key","project-name"])):e(f).testSource?(s(),S(ne,{key:2,text:"```typescript\n"+e(f).testSource+"\n```"},null,8,["text"])):d("",!0)])]),_:1},8,["count","open"])):d("",!0),e(f).ariaSnapshot?(s(),S(G,{key:3,icon:"i-lucide-accessibility",label:"ARIA snapshot",open:e(E),"onUpdate:open":w[4]||(w[4]=x=>Z(E)?E.value=x:null)},{default:p(()=>[t("div",Cs,[r(ne,{text:"```yaml\n"+e(f).ariaSnapshot+"\n```"},null,8,["text"])])]),_:1},8,["open"])):d("",!0),e(f).pageState?(s(),S(G,{key:4,icon:"i-lucide-database",label:"App state",open:e(T),"onUpdate:open":w[5]||(w[5]=x=>Z(T)?T.value=x:null)},{default:p(()=>[r(ue,{"page-state":e(f).pageState,plain:""},null,8,["page-state"])]),_:1},8,["open"])):d("",!0)],64)):d("",!0)])}}}),Ss=Object.assign(ws,{__name:"ClusterTestEvidence"}),Ts={key:0,class:"flex items-center gap-1.5 overflow-hidden min-w-0"},Is={class:"text-primary shrink-0"},js={class:"text-gray-500 truncate text-xs font-sans"},Rs={key:1,class:"text-primary text-xs"},zs={key:2,class:"text-gray-400 font-sans text-xs"},Us={class:"w-96 p-2 space-y-2"},Es={class:"flex items-center gap-1"},Vs={class:"flex items-center gap-1"},As={key:0,class:"flex items-center gap-2 px-2 py-1.5 text-xs rounded-md bg-primary/5 text-gray-600 dark:text-gray-300"},Ms={class:"font-medium text-green-600 dark:text-green-400"},Ns={class:"font-medium text-red-600 dark:text-red-400"},Fs={class:"text-gray-400"},Bs={key:1,class:"flex items-center justify-center gap-2 py-6 text-gray-400"},Ls={key:2,class:"py-4 text-center text-sm text-red-500"},Ds={key:3,class:"flex items-start gap-2 px-2 py-2 text-xs text-amber-700 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 rounded-md"},Ps={key:4,class:"max-h-80 overflow-y-auto space-y-px"},Os={class:"text-xs text-primary"},Hs={key:1,class:"py-4 text-center text-sm text-gray-400"},qs=["onClick"],Gs={class:"text-xs text-primary shrink-0 w-14 pt-px"},Ks={class:"flex-1 min-w-0"},Ws={class:"text-xs font-medium leading-snug truncate"},Js={class:"text-xs text-gray-400 leading-snug truncate"},Zs=ee({__name:"CommitPicker",props:{modelValue:{},clusterId:{}},emits:["update:modelValue"],setup(n,{emit:R}){const m=n,C=R,f=v(!1),y=v(""),o=v([]),i=v(null),g=v(null),I=v(!1),U=v(!1),E=v(null),T=v(null),_=v([]),j=v(!1),h=v(void 0),M=P(()=>{if(!m.modelValue)return null;const z=m.modelValue.trim();return o.value.find(w=>w.sha===z||w.sha.startsWith(z))??{sha:z,shortSha:z.slice(0,7),message:"",author:"",date:""}});async function O(){if(!_.value.length){j.value=!0;try{const z=await $fetch(`/api/failure-clusters/${m.clusterId}/branches`);_.value=z.branches}catch{}finally{j.value=!1}}}async function V(){const z=m.modelValue||"";I.value=!0,U.value=!1,T.value=null;try{const c={};z&&(c.baseline=z),h.value&&(c.branch=h.value);const w=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:c});o.value=w.commits,g.value=w.aggregate,i.value=w.error??null,T.value=z}catch{U.value=!0}finally{I.value=!1}}ae(h,()=>{o.value=[],T.value=null,V()}),ae(f,async z=>{if(z){await Promise.all([O(),V()]),await ot();const c=E.value?.$el?.querySelector("input")??E.value?.$el;c instanceof HTMLElement&&c.focus()}else y.value=""});const N=P(()=>Se(o.value,y.value)),H=P(()=>{const z=y.value.trim();return!/^[0-9a-f]{7,40}$/i.test(z)||N.value.some(c=>c.sha.startsWith(z.toLowerCase()))?null:z});function A(z){C("update:modelValue",z),f.value=!1}function L(z){z.stopPropagation(),i.value=null,g.value=null,C("update:modelValue",""),f.value=!1}return(z,c)=>{const w=ie,D=te,q=Tt,X=$e,k=at;return s(),S(k,{open:e(f),"onUpdate:open":c[4]||(c[4]=u=>Z(f)?f.value=u:null)},{content:p(()=>[t("div",Us,[t("div",Es,[r(D,{name:"i-lucide-git-branch",class:"size-3.5 text-gray-400 shrink-0"}),r(q,{modelValue:e(h),"onUpdate:modelValue":c[0]||(c[0]=u=>Z(h)?h.value=u:null),items:e(_),placeholder:"Default branch",size:"xs",class:"flex-1",loading:e(j),disabled:e(j)},null,8,["modelValue","items","loading","disabled"])]),t("div",Vs,[r(X,{ref_key:"searchInputRef",ref:E,modelValue:e(y),"onUpdate:modelValue":c[1]||(c[1]=u=>Z(y)?y.value=u:null),placeholder:"Search message, author, SHA…",size:"xs",icon:"i-lucide-search",class:"flex-1"},null,8,["modelValue"]),n.modelValue?(s(),S(w,{key:0,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-x",title:"Clear baseline",onClick:c[2]||(c[2]=u=>L(u))})):d("",!0)]),e(g)&&n.modelValue&&!e(I)?(s(),l("div",As,[r(D,{name:"i-lucide-git-compare-arrows",class:"size-3.5 shrink-0 text-primary"}),c[5]||(c[5]=t("span",null,"Since baseline:",-1)),t("span",Ms,"+"+a(e(g).linesAdded),1),t("span",Ns,"-"+a(e(g).linesRemoved),1),t("span",Fs,"across "+a(e(g).filesChanged)+" file"+a(e(g).filesChanged===1?"":"s"),1)])):d("",!0),e(I)?(s(),l("div",Bs,[r(D,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),c[6]||(c[6]=t("span",{class:"text-sm"},"Loading commits…",-1))])):e(U)?(s(),l("div",Ls," Failed to load commits — check your SCM token in Settings → AI ")):e(i)&&!e(I)&&e(o).length===0?(s(),l("div",Ds,[r(D,{name:"i-lucide-triangle-alert",class:"size-3.5 shrink-0 mt-0.5"}),t("span",null,a(e(i)),1)])):(s(),l("div",Ps,[e(H)?(s(),l("button",{key:0,class:"w-full text-left px-2 py-1.5 rounded flex items-center gap-2 hover:bg-elevated transition-colors border border-dashed border-default",onClick:c[3]||(c[3]=u=>A(e(H)))},[r(D,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),c[7]||(c[7]=t("span",{class:"text-xs text-gray-500"},"Use commit",-1)),t("code",Os,a(e(H).slice(0,7)),1)])):d("",!0),e(N).length===0&&!e(H)?(s(),l("div",Hs,a(e(y)?"No commits match":"No commits available"),1)):d("",!0),(s(!0),l(B,null,Q(e(N),u=>(s(),l("button",{key:u.sha,class:Y(["w-full text-left px-2 py-1.5 rounded flex items-start gap-2 hover:bg-elevated transition-colors",n.modelValue===u.sha?"bg-primary/10 ring-1 ring-inset ring-primary/30":""]),onClick:b=>A(u.sha)},[t("code",Gs,a(u.shortSha),1),t("div",Ks,[t("p",Ws,a(u.message),1),t("p",Js,[$(a(u.author),1),u.date?(s(),l(B,{key:0},[$(" · "+a(e(re)(u.date)),1)],64)):d("",!0)])]),n.modelValue===u.sha?(s(),S(D,{key:0,name:"i-lucide-check",class:"size-3.5 text-primary shrink-0 mt-0.5"})):d("",!0)],10,qs))),128))]))])]),default:p(()=>[r(w,{size:"xs",color:"neutral",variant:"outline",icon:n.modelValue?"i-lucide-git-branch-plus":"i-lucide-git-branch","trailing-icon":"i-lucide-chevron-down",class:"min-w-36 max-w-48 font-mono"},{default:p(()=>[e(M)?.message?(s(),l("span",Ts,[t("code",Is,a(e(M).shortSha),1),t("span",js,a(e(M).message),1)])):n.modelValue?(s(),l("span",Rs,a(n.modelValue.slice(0,7))+"…",1)):(s(),l("span",zs,"baseline commit…"))]),_:1},8,["icon"])]),_:1},8,["open"])}}}),Qs=Object.assign(Zs,{__name:"CommitPicker"}),Xs={class:"space-y-3"},Ys={key:0,class:"space-y-1"},en={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},tn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},sn={class:"text-xs text-gray-400 shrink-0"},nn={class:"text-xs text-gray-700 dark:text-gray-300 truncate"},an={class:"space-y-1"},on={class:"text-xs font-semibold text-gray-500 uppercase tracking-wide px-1"},ln={key:0,class:"text-yellow-500 font-normal normal-case"},rn={class:"rounded-md border border-default overflow-hidden divide-y divide-default"},cn=["onClick"],un={class:"text-xs font-mono flex-1 truncate text-gray-700 dark:text-gray-300"},dn={class:"text-xs text-gray-400 shrink-0 tabular-nums"},mn={key:0,class:"text-green-500"},fn={key:1,class:"text-gray-300 mx-0.5"},pn={key:2,class:"text-red-500"},gn={key:0,class:"border-t border-default overflow-x-auto max-h-96"},xn=ee({__name:"ScmChangesView",props:{changes:{}},setup(n){const R=v(new Set);function m(C){const f=new Set(R.value);f.has(C)?f.delete(C):f.add(C),R.value=f}return(C,f)=>{const y=te,o=ke;return s(),l("div",Xs,[n.changes.commits.length>0?(s(),l("div",Ys,[t("p",en,a(n.changes.commits.length)+" commit"+a(n.changes.commits.length===1?"":"s"),1),t("div",tn,[(s(!0),l(B,null,Q(n.changes.commits,i=>(s(),l("div",{key:i.sha,class:"flex items-center gap-2 px-3 py-1.5"},[r(y,{name:"i-lucide-git-commit-horizontal",class:"size-3.5 text-gray-400 shrink-0"}),t("code",sn,a(i.sha.slice(0,7)),1),t("span",nn,a(i.message),1)]))),128))])])):d("",!0),t("div",an,[t("p",on,[$(a(n.changes.files.length)+" file"+a(n.changes.files.length===1?"":"s")+" changed ",1),n.changes.patchesOmitted?(s(),l("span",ln," — diff too large, file names only ")):d("",!0)]),t("div",rn,[(s(!0),l(B,null,Q(n.changes.files,i=>(s(),l("div",{key:i.filename},[t("button",{class:Y(["w-full flex items-center gap-2 px-3 py-1.5 text-left hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",i.patch?"cursor-pointer":"cursor-default"]),onClick:g=>i.patch&&m(i.filename)},[r(y,{name:("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(i.status).icon,class:Y(["size-3.5 shrink-0",("scmFileStatusMeta"in C?C.scmFileStatusMeta:e(pe))(i.status).color])},null,8,["name","class"]),t("span",un,a(i.filename),1),t("span",dn,[i.additions?(s(),l("span",mn,"+"+a(i.additions),1)):d("",!0),i.additions&&i.deletions?(s(),l("span",fn,"/")):d("",!0),i.deletions?(s(),l("span",pn,"-"+a(i.deletions),1)):d("",!0)]),i.patch?(s(),S(y,{key:0,name:e(R).has(i.filename)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"size-3.5 text-gray-400 shrink-0"},null,8,["name"])):d("",!0)],10,cn),i.patch&&e(R).has(i.filename)?(s(),l("div",gn,[r(o,{patch:i.patch},null,8,["patch"])])):d("",!0)]))),128))])])])}}}),vn=Object.assign(xn,{__name:"ScmChangesView"}),yn={class:"border border-default rounded-lg overflow-clip text-xs font-mono"},hn={class:"sticky top-0 z-10 flex items-center justify-between px-3 py-1.5 bg-elevated border-b border-default text-gray-600 dark:text-gray-300"},_n={class:"font-medium truncate"},kn={class:"shrink-0 flex items-center gap-1.5 ml-2 text-[11px]"},bn={key:0,class:"text-green-600 dark:text-green-400"},$n={key:1,class:"text-red-600 dark:text-red-400"},Cn={key:1,class:"px-3 py-2 text-gray-400 text-[11px]"},wn=ee({__name:"DiffFile",props:{file:{}},setup(n){return(R,m)=>{const C=ce,f=ke;return s(),l("div",yn,[t("div",hn,[t("span",_n,a(n.file.filename),1),t("span",kn,[n.file.additions?(s(),l("span",bn,"+"+a(n.file.additions),1)):d("",!0),n.file.deletions?(s(),l("span",$n,"-"+a(n.file.deletions),1)):d("",!0),r(C,{label:n.file.status,size:"xs",variant:"subtle",color:("scmFileStatusMeta"in R?R.scmFileStatusMeta:e(pe))(n.file.status).badgeColor},null,8,["label","color"])])]),n.file.patch?(s(),S(f,{key:0,patch:n.file.patch},null,8,["patch"])):(s(),l("div",Cn,"No patch available"))])}}}),Sn=Object.assign(wn,{__name:"DiffFile"}),Tn={class:"inline-flex items-center gap-1"},In={class:"flex h-[72vh] overflow-hidden"},jn={class:"w-72 shrink-0 border-r border-default flex flex-col"},Rn={class:"p-2 border-b border-default space-y-2 shrink-0"},zn={class:"flex items-center gap-2 text-xs text-gray-500"},Un={class:"ml-auto"},En={key:2,class:"flex-1 overflow-y-auto flex flex-col"},Vn={key:0,class:"py-6 text-center text-sm text-gray-400 flex-1"},An=["onClick"],Mn=["checked","onChange"],Nn={class:"flex-1 min-w-0"},Fn={class:"text-xs font-medium leading-snug truncate"},Bn={class:"text-[10px] text-gray-400 leading-snug mt-0.5 flex items-center gap-1 min-w-0"},Ln={class:"text-primary shrink-0"},Dn={class:"truncate"},Pn={key:0,class:"shrink-0"},On={key:1,class:"p-2 shrink-0 space-y-1.5"},Hn={key:0,class:"flex items-center gap-1.5 text-xs text-red-500 px-1"},qn={class:"flex-1 overflow-y-auto flex flex-col min-w-0"},Gn={key:0,class:"flex-1 flex items-center justify-center text-gray-400 text-sm"},Kn={key:2,class:"flex-1 p-4 space-y-3"},Wn={key:0,class:"space-y-0.5 pb-3 border-b border-default"},Jn={class:"flex items-center gap-2"},Zn={class:"text-xs font-mono text-primary"},Qn={class:"text-xs text-gray-400"},Xn={class:"text-sm font-semibold"},Yn={key:1,class:"text-sm text-gray-400 pt-2"},ea={key:4,class:"flex-1 flex items-center justify-center text-sm text-gray-400"},ta={class:"flex items-center gap-3 w-full"},sa={class:"flex-1 flex items-center gap-2 text-sm text-gray-500 min-w-0"},na={class:"font-medium text-gray-700 dark:text-gray-200 shrink-0"},aa={class:"shrink-0"},oa={class:"text-green-600 dark:text-green-400 shrink-0 font-medium"},la={class:"text-red-600 dark:text-red-400 shrink-0 font-medium"},ra={key:1,class:"text-gray-400 text-xs shrink-0"},ia={key:1},me=50,ca=ee({__name:"CommitBrowserModal",props:{open:{type:Boolean},clusterId:{},initialSelected:{},autoSelectedShas:{}},emits:["update:open","confirm"],setup(n,{emit:R}){const m=n,C=P(()=>new Set(m.autoSelectedShas??[])),f=R,y=v(""),o=v([]),i=v(me),g=v(!1),I=v(!1),U=v(!1),E=v(null),T=v(null),_=v(new Set),j=v(null),h=lt({}),M=v(null),O=v(!1),V=v(null),N=P(()=>o.value.find(k=>k.sha===j.value)??null),H=P(()=>Se(o.value,y.value)),A=P(()=>{let k=0,u=0,b=0,F=0;for(const G of _.value){if(!(G in h)){F++;continue}const K=h[G];K&&(k+=K.files.length,u+=K.files.reduce((W,J)=>W+J.additions,0),b+=K.files.reduce((W,J)=>W+J.deletions,0))}return{files:k,linesAdded:u,linesRemoved:b,unreviewed:F}});async function L(k){k?(I.value=!0,E.value=null):(U.value=!0,T.value=null);try{const u=await $fetch(`/api/failure-clusters/${m.clusterId}/commits`,{query:{limit:i.value}});o.value=u.commits,g.value=u.hasMore??!1,u.error&&!u.commits.length&&(k?E.value=u.error:T.value=u.error),k&&u.commits[0]&&c(u.commits[0].sha)}catch(u){k?E.value=de(u):T.value=de(u)}finally{I.value=!1,U.value=!1}}async function z(){i.value+=me,await L(!1)}ae(()=>m.open,async k=>{if(k){if(_.value=new Set(m.initialSelected??[]),o.value.length){!j.value&&o.value[0]&&c(o.value[0].sha);return}i.value=me,await L(!0)}});async function c(k){if(j.value!==k){if(j.value=k,V.value=null,k in h){M.value=h[k],O.value=!1;return}M.value=null,O.value=!0;try{const u=await $fetch(`/api/failure-clusters/${m.clusterId}/commit-diff`,{query:{sha:k}});h[k]=u,j.value===k&&(M.value=u)}catch(u){j.value===k&&(V.value=de(u))}finally{j.value===k&&(O.value=!1)}}}function w(k){const u=new Set(_.value);u.has(k)?u.delete(k):u.add(k),_.value=u}function D(){_.value=new Set(H.value.map(k=>k.sha))}function q(){_.value=new Set}function X(){f("confirm",[..._.value]),f("update:open",!1)}return(k,u)=>{const b=ge,F=$e,G=It,K=ie,W=jt,J=ce,se=te,ne=Sn,ue=Te;return s(),S(ue,{open:n.open,title:"Browse commits",ui:{content:"max-w-6xl",body:"p-0 overflow-hidden"},"onUpdate:open":u[4]||(u[4]=x=>f("update:open",x))},{title:p(()=>[t("span",Tn,[u[5]||(u[5]=$("Browse commits ",-1)),r(b,{topic:"cluster.commit-browser"})])]),body:p(()=>[t("div",In,[t("div",jn,[t("div",Rn,[r(F,{modelValue:e(y),"onUpdate:modelValue":u[0]||(u[0]=x=>Z(y)?y.value=x:null),placeholder:"Search commits…",size:"xs",icon:"i-lucide-search"},null,8,["modelValue"]),t("div",zn,[t("button",{class:"hover:text-primary transition-colors",onClick:D},"All"),u[6]||(u[6]=t("span",null,"·",-1)),t("button",{class:"hover:text-primary transition-colors",onClick:q},"None"),t("span",Un,a(e(_).size>0?`${e(_).size} selected`:"none selected"),1)])]),e(I)?(s(),S(G,{key:0,text:"Loading…",padded:!1,class:"flex-1"})):e(E)?(s(),S(W,{key:1,text:e(E),padded:!1,class:"flex-1 p-4"},{action:p(()=>[r(K,{size:"xs",color:"neutral",variant:"outline",onClick:u[1]||(u[1]=x=>L(!0))},{default:p(()=>[...u[7]||(u[7]=[$(" Retry ",-1)])]),_:1})]),_:1},8,["text"])):(s(),l("div",En,[e(H).length===0?(s(),l("div",Vn,a(e(y)?"No commits match":"No commits"),1)):d("",!0),(s(!0),l(B,null,Q(e(H),x=>(s(),l("button",{key:x.sha,class:Y(["w-full text-left px-2.5 py-2 flex items-start gap-2.5 hover:bg-elevated transition-colors border-b border-default/50 last:border-0 shrink-0",e(j)===x.sha?"bg-elevated":""]),onClick:oe=>c(x.sha)},[t("input",{type:"checkbox",checked:e(_).has(x.sha),class:"mt-0.5 shrink-0 cursor-pointer accent-primary",onClick:u[2]||(u[2]=fe(()=>{},["stop"])),onChange:oe=>w(x.sha)},null,40,Mn),t("div",Nn,[t("p",Fn,a(x.message||"(no message)"),1),t("p",Bn,[t("code",Ln,a(x.shortSha),1),t("span",Dn,a(x.author),1),x.date?(s(),l("span",Pn,"· "+a(e(re)(x.date)),1)):d("",!0),e(C).has(x.sha)?(s(),S(J,{key:1,size:"xs",color:"info",variant:"soft",class:"shrink-0"},{default:p(()=>[...u[8]||(u[8]=[$(" auto ",-1)])]),_:1})):d("",!0)])])],10,An))),128)),e(g)&&!e(y)?(s(),l("div",On,[e(T)?(s(),l("p",Hn,[r(se,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+a(e(T)),1)])):d("",!0),r(K,{size:"xs",color:"neutral",variant:"outline",block:"",loading:e(U),onClick:z},{default:p(()=>[...u[9]||(u[9]=[$(" Load more ",-1)])]),_:1},8,["loading"])])):d("",!0)]))]),t("div",qn,[e(j)?e(O)?(s(),S(G,{key:1,text:"Loading diff…",padded:!1,class:"flex-1"})):e(M)?(s(),l("div",Kn,[e(N)?(s(),l("div",Wn,[t("div",Jn,[t("code",Zn,a(e(N).shortSha),1),t("span",Qn,[$(a(e(N).author),1),e(N).date?(s(),l(B,{key:0},[$(" · "+a(e(re)(e(N).date)),1)],64)):d("",!0)])]),t("p",Xn,a(e(N).message),1)])):d("",!0),e(M).files.length===0?(s(),l("div",Yn,"No file changes in this commit")):d("",!0),(s(!0),l(B,null,Q(e(M).files,x=>(s(),S(ne,{key:x.filename,file:x},null,8,["file"]))),128))])):e(V)?(s(),S(W,{key:3,text:e(V),padded:!1,class:"flex-1 p-6"},{action:p(()=>[...u[10]||(u[10]=[t("p",{class:"text-xs text-gray-400"},"Click the commit again to retry",-1)])]),_:1},8,["text"])):(s(),l("div",ea," Diff not available for this commit ")):(s(),l("div",Gn," Select a commit to view its diff "))])])]),footer:p(()=>[t("div",ta,[t("div",sa,[e(_).size>0?(s(),l(B,{key:0},[t("span",na,a(e(_).size)+" commit"+a(e(_).size===1?"":"s"),1),e(A).files>0||e(A).linesAdded>0||e(A).linesRemoved>0?(s(),l(B,{key:0},[u[11]||(u[11]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("span",aa,a(e(A).files)+" file"+a(e(A).files===1?"":"s"),1),t("span",oa,"+"+a(e(A).linesAdded),1),t("span",la,"-"+a(e(A).linesRemoved),1)],64)):d("",!0),e(A).unreviewed>0?(s(),l("span",ra," ("+a(e(A).unreviewed)+" unreviewed) ",1)):d("",!0)],64)):(s(),l("span",ia,"No commits selected"))]),r(K,{color:"neutral",variant:"ghost",onClick:u[3]||(u[3]=x=>f("update:open",!1))},{default:p(()=>[...u[12]||(u[12]=[$(" Cancel ",-1)])]),_:1}),r(K,{color:"primary",disabled:e(_).size===0,onClick:X},{default:p(()=>[...u[13]||(u[13]=[$(" Add to context ",-1)])]),_:1},8,["disabled"])])]),_:1},8,["open"])}}}),ua=Object.assign(ca,{__name:"CommitBrowserModal"});function Ie(n){return{scmStatus:P(()=>{const m=n.value?.scm;if(!m)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"Git context unavailable",detail:""};if(m.baseCommitUsed){if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};const y=m.patchesOmitted?", no patches (diff too large)":m.patchesTruncated?`, ${m.patchedFilesCount} with patches (some cut)`:`, ${m.patchedFilesCount} with patches`;return{color:"text-blue-500",icon:"i-lucide-git-branch-plus",text:`Manual baseline ${m.baseCommitUsed.slice(0,7)} · ${m.filesCount} files${y}`,detail:m.hasLastGreen?"overrides last passing run baseline":"no last passing run"}}if(!m.hasLastGreen)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No last passing run",detail:"enter a baseline commit below to enable diff"};if(!m.hasCommitRange)return{color:"text-gray-400",icon:"i-lucide-git-branch",text:"No commit range",detail:"reporter did not send SCM metadata"};if(!m.provider)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:"Unsupported SCM host",detail:"only GitHub, GitLab and Bitbucket are supported"};if(m.filesCount===0)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · fetch failed`,detail:"network error or missing SCM token (check AI settings)"};if(m.patchesOmitted)return{color:"text-yellow-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files`,detail:"diff too large — file list only, no patches"};const C=m.patchesTruncated?", some patches cut (budget)":"",f=m.commitsCount>0?` · ${m.commitsCount} commit${m.commitsCount>1?"s":""}`:"";return{color:"text-green-500",icon:"i-lucide-git-branch",text:`${m.provider} · ${m.filesCount} files · ${m.patchedFilesCount} with patches${C}${f}`,detail:""}})}}const da={class:"space-y-3"},ma={class:"pb-2 border-b border-default"},fa={class:"flex items-center gap-2 flex-wrap"},pa={class:"text-xs text-gray-500 font-medium shrink-0 inline-flex items-center gap-1"},ga={class:"flex items-center gap-1.5 ml-auto"},xa={key:0,class:"flex items-center gap-1 px-2 py-0.5 rounded-full bg-primary/10 text-primary text-xs font-medium"},va={key:0,class:"flex items-start gap-1.5 text-xs px-2 py-1.5 rounded-md bg-elevated border border-default"},ya={key:0,class:"text-gray-400 ml-1"},ha={key:1,class:"flex items-center justify-center py-6"},_a={key:3,class:"text-xs text-gray-400 text-center py-4"},ka=ee({__name:"ClusterInvestigation",setup(n){const{clusterId:R,baseCommit:m,selectedCommitShas:C,autoSelectedCommits:f,baseCommitIsPinned:y,coverage:o,scmChanges:i,contextLoading:g,refreshContext:I}=Rt(),U=v(!1),{scmStatus:E}=Ie(o);return(T,_)=>{const j=ge,h=Qs,M=te,O=Ce,V=ie,N=vn,H=ua;return s(),l(B,null,[t("div",da,[t("div",ma,[t("div",fa,[t("span",pa,[_[5]||(_[5]=$(" Baseline ",-1)),r(j,{topic:"cluster.baseline"})]),r(h,{modelValue:e(m),"onUpdate:modelValue":_[0]||(_[0]=A=>Z(m)?m.value=A:null),"cluster-id":e(R)},null,8,["modelValue","cluster-id"]),e(y)?(s(),S(O,{key:0,text:"Baseline commit pinned for this cluster"},{default:p(()=>[r(M,{name:"i-lucide-pin",class:"size-3.5 text-primary shrink-0"})]),_:1})):d("",!0),t("div",ga,[e(C).length?(s(),l("div",xa,[r(M,{name:"i-lucide-git-commit-horizontal",class:"size-3"}),t("span",null,a(e(C).length)+" commit"+a(e(C).length===1?"":"s"),1),t("button",{class:"ml-0.5 hover:opacity-70 transition-opacity",onClick:_[1]||(_[1]=A=>C.value=[])},[r(M,{name:"i-lucide-x",class:"size-3"})])])):d("",!0),r(V,{size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-list",onClick:_[2]||(_[2]=A=>U.value=!0)},{default:p(()=>[..._[6]||(_[6]=[$(" Browse ",-1)])]),_:1}),r(V,{icon:"i-lucide-refresh-cw",size:"xs",color:"neutral",variant:"outline",loading:e(g),onClick:e(I)},null,8,["loading","onClick"])])])]),e(o)?(s(),l("div",va,[r(M,{name:e(E).icon,class:Y(["size-3.5 mt-0.5 shrink-0",e(E).color])},null,8,["name","class"]),t("div",null,[t("span",{class:Y(e(E).color)},a(e(E).text),3),e(E).detail?(s(),l("span",ya,"— "+a(e(E).detail),1)):d("",!0)])])):d("",!0),e(g)&&!e(i)?(s(),l("div",ha,[r(M,{name:"i-lucide-loader-circle",class:"size-4 animate-spin text-gray-400"})])):e(i)?(s(),S(N,{key:2,changes:e(i)},null,8,["changes"])):e(o)&&!e(g)&&!e(i)?(s(),l("p",_a," No changes found in this range. ")):d("",!0)]),r(H,{open:e(U),"onUpdate:open":_[3]||(_[3]=A=>Z(U)?U.value=A:null),"cluster-id":e(R),"initial-selected":e(C),"auto-selected-shas":e(f),onConfirm:_[4]||(_[4]=A=>C.value=A)},null,8,["open","cluster-id","initial-selected","auto-selected-shas"])],64)}}}),ba=Object.assign(ka,{__name:"ClusterInvestigation"}),$a={class:"flex flex-col h-[60vh]"},Ca={class:"flex items-center gap-3 px-4 py-2.5 border-b border-default text-sm shrink-0"},wa={key:0,class:"ml-auto text-xs text-gray-500"},Sa={class:"flex-1 overflow-y-auto"},Ta={class:"w-full text-sm"},Ia=["onClick"],ja={class:"px-4 py-2.5"},Ra=["checked","onChange"],za={class:"px-2 py-2.5 min-w-0"},Ua={class:"truncate font-medium text-gray-800 dark:text-gray-200 max-w-[24rem]"},Ea={class:"px-2 py-2.5 text-gray-500 text-xs max-w-[16rem] hidden sm:table-cell"},Va={class:"px-2 py-2.5 text-right text-gray-500 text-xs"},Aa={key:0},Ma={class:"shrink-0 border-t border-default px-4 py-3 space-y-1.5"},Na={key:0,class:"shrink-0 px-4 pb-3 flex items-center gap-1.5 text-xs text-red-500"},Fa={class:"flex items-center gap-3 w-full"},Ba=ee({__name:"ClusterExtractCasesModal",props:{open:{type:Boolean},clusterId:{},affectedTestCases:{},projectKey:{},projectName:{}},emits:["update:open","extracted"],setup(n,{emit:R}){const m=n,C=R,f=rt(),y=v(new Set),o=v(""),i=v(!1),g=v(null);function I(){y.value=new Set(m.affectedTestCases.map(j=>j.testCaseId))}function U(){y.value=new Set}function E(j){const h=new Set(y.value);h.has(j)?h.delete(j):h.add(j),y.value=h}ae(()=>m.open,j=>{j&&(U(),o.value="",g.value=null)});const T=P(()=>y.value.size);async function _(){if(T.value!==0){i.value=!0,g.value=null;try{await $fetch(`/api/failure-clusters/${m.clusterId}/extract-cases`,{method:"POST",body:{testCaseIds:[...y.value],triageNote:o.value.trim()||void 0}}),f.add({title:`Extracted ${T.value} test ${T.value===1?"case":"cases"}`,color:"success"}),C("extracted"),C("update:open",!1)}catch(j){g.value=de(j)}finally{i.value=!1}}}return(j,h)=>{const M=be,O=xe,V=we,N=te,H=ie,A=Te;return s(),S(A,{open:n.open,title:"Extract test cases",ui:{content:"max-w-4xl",body:"p-0 flex flex-col overflow-hidden"},"onUpdate:open":h[4]||(h[4]=L=>C("update:open",L))},{body:p(()=>[t("div",$a,[t("div",Ca,[t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:I},"Select all"),h[5]||(h[5]=t("span",{class:"text-gray-300 dark:text-gray-600"},"·",-1)),t("button",{class:"text-xs font-medium text-primary hover:underline",onClick:U},"Deselect all"),e(T)>0?(s(),l("span",wa,a(e(T))+" selected ",1)):d("",!0)]),t("div",Sa,[t("table",Ta,[h[8]||(h[8]=t("thead",{class:"sticky top-0 bg-gray-50 dark:bg-gray-800 border-b border-default"},[t("tr",null,[t("th",{class:"w-10 px-4 py-2.5"}),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide"},"Test"),t("th",{class:"text-left px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide hidden sm:table-cell"}," File "),t("th",{class:"text-right px-2 py-2.5 font-medium text-gray-500 text-xs uppercase tracking-wide w-20"}," Occurrences ")])],-1)),t("tbody",null,[(s(!0),l(B,null,Q(n.affectedTestCases,L=>(s(),l("tr",{key:L.testCaseId,class:"border-b border-default/50 hover:bg-elevated transition-colors cursor-pointer",onClick:z=>E(L.testCaseId)},[t("td",ja,[t("input",{type:"checkbox",checked:e(y).has(L.testCaseId),class:"shrink-0 cursor-pointer accent-primary",onClick:h[0]||(h[0]=fe(()=>{},["stop"])),onChange:z=>E(L.testCaseId)},null,40,Ra)]),t("td",za,[t("p",Ua,a(L.title),1),r(M,{to:`/test-cases/${L.testCaseId}`,class:"text-[10px] text-primary hover:underline mt-0.5 inline-block",onClick:h[1]||(h[1]=fe(()=>{},["stop"]))},{default:p(()=>[...h[6]||(h[6]=[$(" View details ",-1)])]),_:1},8,["to"])]),t("td",Ea,[r(O,{"file-path":L.filePath,"project-key":n.projectKey,"project-name":n.projectName,class:"max-w-full"},null,8,["file-path","project-key","project-name"])]),t("td",Va,a(L.runCount),1)],8,Ia))),128)),n.affectedTestCases.length===0?(s(),l("tr",Aa,[...h[7]||(h[7]=[t("td",{colspan:"4",class:"px-4 py-8 text-center text-gray-400 text-sm"},"No test cases in this cluster.",-1)])])):d("",!0)])])]),t("div",Ma,[h[9]||(h[9]=t("label",{class:"text-xs font-medium text-gray-500 uppercase tracking-wide"},"Triage note (optional)",-1)),r(V,{modelValue:e(o),"onUpdate:modelValue":h[2]||(h[2]=L=>Z(o)?o.value=L:null),placeholder:"Add a note explaining why these tests were extracted…",rows:2,class:"text-sm w-full"},null,8,["modelValue"])]),e(g)?(s(),l("p",Na,[r(N,{name:"i-lucide-circle-alert",class:"size-3.5 shrink-0"}),$(" "+a(e(g)),1)])):d("",!0)])]),footer:p(()=>[t("div",Fa,[h[11]||(h[11]=t("div",{class:"flex-1"},null,-1)),r(H,{color:"neutral",variant:"ghost",disabled:e(i),onClick:h[3]||(h[3]=L=>C("update:open",!1))},{default:p(()=>[...h[10]||(h[10]=[$(" Cancel ",-1)])]),_:1},8,["disabled"]),r(H,{color:"warning",disabled:e(T)===0,loading:e(i),onClick:_},{default:p(()=>[$(" Extract"+a(e(T)>0?` ${e(T)}`:""),1)]),_:1},8,["disabled","loading"])])]),_:1},8,["open"])}}}),La=Object.assign(Ba,{__name:"ClusterExtractCasesModal"}),Da={key:0,class:"flex flex-col h-full min-h-0 max-xl:overflow-y-auto xl:overflow-hidden"},Pa={class:"border-b border-default shrink-0"},Oa={class:"grid grid-cols-1 xl:grid-cols-[3fr_2fr] gap-4 p-1 xl:flex-1 xl:min-h-0 xl:overflow-hidden"},Ha={class:"space-y-4 xl:overflow-y-auto"},qa={class:"font-mono text-xs"},Ga=["innerHTML"],Ka={class:"inline-flex items-center gap-1.5"},Wa={class:"xl:overflow-y-auto"},Ja={key:1,class:"flex items-center justify-center h-64 text-gray-500"},Vo=ee({__name:"[id]",async setup(n){let R,m;const C=it(),f=parseInt(String(C.params.id)),y=zt(f),{data:o,refresh:i}=([R,m]=ct(()=>Vt(`/api/failure-clusters/${f}`,"$y4C0kntcH9")),R=await R,m(),R);ut(P(()=>({title:`${o.value?.signature??"Failure cluster"} — Piwi Dashboard`})));const g=v(o.value?.status??"open"),I=v(o.value?.triageNote??""),U=v(!1);ae(()=>o.value?.status,b=>{b&&(g.value=b)}),ae(()=>o.value?.triageNote,b=>{I.value=b??""});const E=P(()=>g.value!==(o.value?.status??"open")||I.value.trim()!==(o.value?.triageNote??""));async function T(){U.value=!0;try{await $fetch(`/api/failure-clusters/${f}/status`,{method:"PATCH",body:{status:g.value,triageNote:I.value.trim()||null}}),i()}finally{U.value=!1}}const _=v(!1);function j(){_.value=!1,i()}const{copyRich:h,copied:M}=We();function O(){const b=o.value;if(!b)return;const F=window.location.href,G=ne=>ne.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),K=[b.errorType,`${b.occurrences} occurrence${b.occurrences===1?"":"s"}`,`${b.affectedTests} test${b.affectedTests===1?"":"s"} affected`,b.status!=="open"?b.status:null].filter(Boolean).join(" · "),W=b.diagnosis?.status==="completed"&&b.diagnosis.summary?`AI diagnosis (${b.diagnosis.category??"unknown"}, ${b.diagnosis.confidence??"?"} confidence): ${b.diagnosis.summary}`:null,J=[`❌ Failure cluster: ${b.signature}`,K,"",...b.sampleError?["Sample error:",ve(b.sampleError),""]:[],...W?[W,""]:[],`Cluster: ${F}`].join(`
3
+ `),se=[`<p><strong>❌ Failure cluster</strong>: <code>${G(b.signature)}</code></p>`,`<p><em>${G(K)}</em></p>`,b.sampleError?`<p><strong>Sample error:</strong></p><pre>${he(b.sampleError)}</pre>`:"",W?`<p><strong>AI diagnosis</strong> (${G(b.diagnosis?.category??"unknown")}, ${G(b.diagnosis?.confidence??"?")} confidence):<br>${G(b.diagnosis.summary)}</p>`:"",`<p>🔗 <a href="${F}">View failure cluster</a></p>`].join("");h(J,se,{toast:"Failure cluster copied"})}const V=P(()=>{const b=o.value?.sampleError;return b?ve(b).split(`
4
+ `).find(F=>F.trim())??"":""}),{scmStatus:N}=Ie(y.coverage),H=P(()=>Et((o.value?.affectedTestCases??[]).map(b=>({filePath:b.filePath,title:b.title,line:null,projectName:null})))),{copy:A,copied:L}=At(),z=v(null),c=v(null),w=v(null),D=v(null),q=v(null),X=v(null),k={sampleError:()=>z.value,executionError:()=>z.value,environmentDiff:()=>D.value,visualDiff:()=>q.value,domSnapshot:()=>X.value,scmInvestigation:()=>w.value,selectedCommits:()=>w.value,topSuspectedCommit:()=>w.value,failingAction:()=>w.value,affectedTests:()=>c.value,testSource:()=>c.value,sourceFiles:()=>c.value,steps:()=>c.value,failingSteps:()=>c.value,console:()=>c.value,networkRequests:()=>c.value,serverTraces:()=>c.value,ariaSnapshot:()=>c.value,screenshots:()=>c.value,tracePointers:()=>c.value,artifacts:()=>c.value};dt(kt,{canLocate:b=>b in k,open:b=>k[b]?.()?.reveal()});const u=P(()=>[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},...o.value?.project?[{label:o.value.project.label||o.value.project.name||"Project",to:`/projects/${o.value.project.id}?tab=failure-clusters`}]:[{label:"Project"}],{label:`Failure cluster #${f}`}]);return(b,F)=>{const G=Le,K=De,W=et,J=ie,se=Ce,ne=ft,ue=os,x=Je,oe=Ze,je=Qe,Re=Xe,ze=Ye,Ue=xe,Ee=ce,Ve=Ss,Ae=te,Me=ba,Ne=Ut,Fe=mt,Be=La;return s(),l(B,null,[r(Fe,{id:"failure-cluster-detail"},{header:p(()=>[r(ne,null,{leading:p(()=>[r(G),r(K,{items:e(u)},null,8,["items"])]),right:p(()=>[e(o)?(s(),S(W,{key:0,endpoint:`/api/failure-clusters/${e(o).id}/export`,"base-name":`piwi-cluster-${e(o).id}`},null,8,["endpoint","base-name"])):d("",!0),e(o)?(s(),S(se,{key:1,text:e(M)?"Copied!":"Copy failure cluster"},{default:p(()=>[r(J,{size:"sm",variant:"ghost",color:"neutral",icon:e(M)?"i-lucide-check":"i-lucide-clipboard",onClick:O},null,8,["icon"])]),_:1},8,["text"])):d("",!0)]),_:1})]),body:p(()=>[e(o)?(s(),l("div",Da,[t("div",Pa,[r(ue,{cluster:e(o),"triage-status":e(g),"triage-note":e(I),"triage-saving":e(U),"triage-changed":e(E),"onUpdate:triageStatus":F[0]||(F[0]=le=>g.value=le),"onUpdate:triageNote":F[1]||(F[1]=le=>I.value=le),onSaveTriage:T},null,8,["cluster","triage-status","triage-note","triage-saving","triage-changed"])]),t("div",Oa,[t("div",Ha,[e(o).sampleError?(s(),S(x,{key:0,ref_key:"errorSection",ref:z,"storage-key":"cluster-error",icon:"i-lucide-circle-x","icon-class":"text-red-500",title:"Error message"},{folded:p(()=>[t("span",qa,a(e(V)),1)]),default:p(()=>[t("div",{class:"text-xs font-mono overflow-x-auto whitespace-pre-wrap",innerHTML:e(he)(e(o).sampleError)},null,8,Ga)]),_:1},512)):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(oe,{key:1,ref:"locatorSection","storage-key":"cluster-locators","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId,"affected-count":e(o).affectedTestCases.length},null,8,["run-id","test-runs-case-id","affected-count"])):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(je,{key:2,ref_key:"envDiffSection",ref:D,"storage-key":"cluster-env-diff","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(Re,{key:3,ref_key:"visualDiffSection",ref:q,"storage-key":"cluster-visual-diff","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(o).affectedTestCases?.length&&e(o).affectedTestCases[0]?.recentTestRunsCaseId?(s(),S(ze,{key:4,ref_key:"domSnapshotSection",ref:X,"storage-key":"cluster-dom-snapshot","run-id":e(o).lastSeenRunId,"test-runs-case-id":e(o).affectedTestCases[0].recentTestRunsCaseId},null,8,["run-id","test-runs-case-id"])):d("",!0),e(o).affectedTestCases?.length?(s(),S(x,{key:5,ref_key:"evidenceSection",ref:c,"storage-key":"cluster-evidence",icon:"i-lucide-flask-conical",title:"Test evidence",help:"cluster.evidence"},{folded:p(()=>[$(a(e(o).affectedTests)+" "+a(e(o).affectedTests===1?"test":"tests")+" · "+a(e(o).occurrences)+" occurrence"+a(e(o).occurrences===1?"":"s")+" · ",1),e(o).affectedTestCases[0]?.filePath?(s(),S(Ue,{key:0,"file-path":e(o).affectedTestCases[0].filePath,"project-key":e(o).project?.id,"project-name":e(o).project?.name,class:"text-xs"},null,8,["file-path","project-key","project-name"])):d("",!0)]),actions:p(()=>[r(Ee,{color:"neutral",variant:"subtle",size:"sm"},{default:p(()=>[$(a(e(o).affectedTestCases.length)+" "+a(e(o).affectedTestCases.length===1?"test":"tests"),1)]),_:1}),r(J,{size:"xs",variant:"outline",color:"neutral",icon:e(L)?"i-lucide-check":"i-lucide-play",title:e(L)?"Copied!":("copyPreview"in b?b.copyPreview:e(wt))(e(H)),onClick:F[2]||(F[2]=le=>e(A)(e(H),{toast:"Retry command copied"}))},{default:p(()=>[...F[5]||(F[5]=[$(" Copy retry command ",-1)])]),_:1},8,["icon","title"]),r(se,{text:"Unlink incorrectly clustered test cases from this group"},{default:p(()=>[r(J,{size:"xs",color:"warning",variant:"outline",icon:"i-lucide-arrow-up-from-line",onClick:F[3]||(F[3]=le=>_.value=!0)},{default:p(()=>[...F[6]||(F[6]=[$(" Extract ",-1)])]),_:1})]),_:1})]),default:p(()=>[r(Ve,{"affected-test-cases":e(o).affectedTestCases,"project-key":e(o).project?.id,"project-name":e(o).project?.name},null,8,["affected-test-cases","project-key","project-name"])]),_:1},512)):d("",!0),r(x,{ref_key:"scmSection",ref:w,"storage-key":"cluster-scm",icon:"i-lucide-git-compare-arrows",title:"What changed",help:"cluster.scm"},{folded:p(()=>[t("span",Ka,[r(Ae,{name:e(N).icon,class:Y(["size-3.5 shrink-0",e(N).color])},null,8,["name","class"]),t("span",{class:Y(e(N).color)},a(e(N).text),3)])]),default:p(()=>[r(Me)]),_:1},512)]),t("div",Wa,[r(Ne,{"cluster-id":e(f),"last-seen-run-id":e(o)?.lastSeenRunId,"affected-test-cases":e(o)?.affectedTestCases??[]},null,8,["cluster-id","last-seen-run-id","affected-test-cases"])])])])):(s(),l("div",Ja,"Cluster not found."))]),_:1}),e(o)?(s(),S(Be,{key:0,open:e(_),"cluster-id":e(f),"affected-test-cases":e(o).affectedTestCases??[],"project-key":e(o).project?.id,"project-name":e(o).project?.name,"onUpdate:open":F[4]||(F[4]=le=>_.value=le),onExtracted:j},null,8,["open","cluster-id","affected-test-cases","project-key","project-name"])):d("",!0)],64)}}});export{Vo as default};
@@ -1 +1 @@
1
- import{_ as l}from"./CN1mJlvD.js";import{d as a,o as i,f as c,aa as r,g as n,T as s}from"./DHltYerF.js";const u=a({__name:"ChartCard",props:{title:{},subtitle:{},icon:{},iconClass:{},help:{}},setup(e){return(t,m)=>{const o=l;return i(),c(o,{title:e.title,subtitle:e.subtitle,icon:e.icon,"icon-class":e.iconClass,help:e.help},r({default:n(()=>[s(t.$slots,"default")]),_:2},[t.$slots.subtitle?{name:"subtitle",fn:n(()=>[s(t.$slots,"subtitle")]),key:"0"}:void 0,t.$slots.legend||t.$slots.actions?{name:"actions",fn:n(()=>[s(t.$slots,"legend"),s(t.$slots,"actions")]),key:"1"}:void 0]),1032,["title","subtitle","icon","icon-class","help"])}}}),C=Object.assign(u,{__name:"ChartCard"});export{C as _};
1
+ import{_ as l}from"./DprVVyUQ.js";import{d as a,o as i,f as c,ac as r,g as n,V as s}from"./NQikbhmK.js";const u=a({__name:"ChartCard",props:{title:{},subtitle:{},icon:{},iconClass:{},help:{}},setup(e){return(t,m)=>{const o=l;return i(),c(o,{title:e.title,subtitle:e.subtitle,icon:e.icon,"icon-class":e.iconClass,help:e.help},r({default:n(()=>[s(t.$slots,"default")]),_:2},[t.$slots.subtitle?{name:"subtitle",fn:n(()=>[s(t.$slots,"subtitle")]),key:"0"}:void 0,t.$slots.legend||t.$slots.actions?{name:"actions",fn:n(()=>[s(t.$slots,"legend"),s(t.$slots,"actions")]),key:"1"}:void 0]),1032,["title","subtitle","icon","icon-class","help"])}}}),C=Object.assign(u,{__name:"ChartCard"});export{C as _};
@@ -1 +1 @@
1
- import{d as m,B as h,o as n,f as o,U as p,bH as g,bb as B,h as d,c as f,q as E,F as y,y as V}from"./DHltYerF.js";var k=m({inheritAttrs:!1,__name:"VisuallyHiddenInputBubble",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,{primitiveElement:s,currentElement:l}=B(),t=d(()=>e.checked??e.value);return h(t,(r,a)=>{if(!l.value)return;const u=l.value,b=window.HTMLInputElement.prototype,v=Object.getOwnPropertyDescriptor(b,"value").set;if(v&&r!==a){const _=new Event("input",{bubbles:!0}),q=new Event("change",{bubbles:!0});v.call(u,r),u.dispatchEvent(_),u.dispatchEvent(q)}}),(r,a)=>(n(),o(g,p({ref_key:"primitiveElement",ref:s},{...e,...r.$attrs},{as:"input"}),null,16))}}),c=k,A=m({inheritAttrs:!1,__name:"VisuallyHiddenInput",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,s=d(()=>typeof e.value=="object"&&Array.isArray(e.value)&&e.value.length===0&&e.required),l=d(()=>typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"||e.value===null||e.value===void 0?[{name:e.name,value:e.value}]:typeof e.value=="object"&&Array.isArray(e.value)?e.value.flatMap((t,r)=>typeof t=="object"?Object.entries(t).map(([a,u])=>({name:`${e.name}[${r}][${a}]`,value:u})):{name:`${e.name}[${r}]`,value:t}):e.value!==null&&typeof e.value=="object"&&!Array.isArray(e.value)?Object.entries(e.value).map(([t,r])=>({name:`${e.name}[${t}]`,value:r})):[]);return(t,r)=>(n(),f(y,null,[E(" We render single input if it's required "),s.value?(n(),o(c,p({key:t.name},{...e,...t.$attrs},{name:t.name,value:t.value}),null,16,["name","value"])):(n(!0),f(y,{key:1},V(l.value,a=>(n(),o(c,p({key:a.name},{ref_for:!0},{...e,...t.$attrs},{name:a.name,value:a.value}),null,16,["name","value"]))),128))],2112))}}),I=A;export{I as V};
1
+ import{d as m,H as h,o as n,f as o,W as p,bH as g,bb as E,h as d,c as f,v as B,F as y,y as V}from"./NQikbhmK.js";var k=m({inheritAttrs:!1,__name:"VisuallyHiddenInputBubble",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,{primitiveElement:s,currentElement:l}=E(),t=d(()=>e.checked??e.value);return h(t,(r,a)=>{if(!l.value)return;const u=l.value,b=window.HTMLInputElement.prototype,v=Object.getOwnPropertyDescriptor(b,"value").set;if(v&&r!==a){const _=new Event("input",{bubbles:!0}),q=new Event("change",{bubbles:!0});v.call(u,r),u.dispatchEvent(_),u.dispatchEvent(q)}}),(r,a)=>(n(),o(g,p({ref_key:"primitiveElement",ref:s},{...e,...r.$attrs},{as:"input"}),null,16))}}),c=k,A=m({inheritAttrs:!1,__name:"VisuallyHiddenInput",props:{name:{type:String,required:!0},value:{type:null,required:!0},checked:{type:Boolean,required:!1,default:void 0},required:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},feature:{type:String,required:!1,default:"fully-hidden"}},setup(i){const e=i,s=d(()=>typeof e.value=="object"&&Array.isArray(e.value)&&e.value.length===0&&e.required),l=d(()=>typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"||e.value===null||e.value===void 0?[{name:e.name,value:e.value}]:typeof e.value=="object"&&Array.isArray(e.value)?e.value.flatMap((t,r)=>typeof t=="object"?Object.entries(t).map(([a,u])=>({name:`${e.name}[${r}][${a}]`,value:u})):{name:`${e.name}[${r}]`,value:t}):e.value!==null&&typeof e.value=="object"&&!Array.isArray(e.value)?Object.entries(e.value).map(([t,r])=>({name:`${e.name}[${t}]`,value:r})):[]);return(t,r)=>(n(),f(y,null,[B(" We render single input if it's required "),s.value?(n(),o(c,p({key:t.name},{...e,...t.$attrs},{name:t.name,value:t.value}),null,16,["name","value"])):(n(!0),f(y,{key:1},V(l.value,a=>(n(),o(c,p({key:a.name},{ref_for:!0},{...e,...t.$attrs},{name:a.name,value:a.value}),null,16,["name","value"]))),128))],2112))}}),I=A;export{I as V};
@@ -1,4 +1,4 @@
1
- import{_ as ra}from"./B2oUeBbA.js";import{aK as oa,d as oe,X as Ve,W as Re,S as pe,o as i,c as y,j as s,g as o,T as M,k as e,U as J,H as Pe,V as ge,f as w,q as k,F as re,h as K,ay as ia,aF as na,Y as ze,aL as qe,Q as da,r as b,aM as ua,aB as ca,a0 as pa,a1 as ma,a3 as fa,a4 as va,a5 as ya,aN as ba,aO as ha,i as d,p as D,m as V,t as _,y as je,ae as $e,a6 as ga,aG as be,w as _a,b as ka,L as wa,C as Ca,P as xa,ak as Aa,_ as qa,s as $a,v as Ua,D as Ia,l as he,I as Va,K as Ra}from"./DHltYerF.js";import{_ as Pa}from"./BXY_PWcx.js";import{_ as za}from"./DWhBqv_7.js";import{_ as ja}from"./CN1mJlvD.js";import{_ as Sa}from"./DZ3Vfcpz.js";import{_ as Ka}from"./B1zMFx24.js";import{o as Da,s as ue,l as Ue,a as Ea,u as Fa,_ as Ba}from"./BLIRKrbM.js";import{_ as Ga}from"./B-5GukRk.js";import{_ as Ma}from"./DHXWp5yD.js";import{_ as Oa}from"./BHpUiv6j.js";import{L as Ie}from"./e7zD3uJ0.js";import{u as Se}from"./qH_j2A3a.js";import{V as Ke}from"./CcXaak_K.js";import{u as De}from"./DkI145a5.js";import{R as Ta}from"./gnCL8GjZ.js";import{_ as La}from"./EPZOxdgq.js";import{p as ce,g as le}from"./BeKvLsja.js";import{u as Na}from"./DXbPFI1d.js";import{u as Ha}from"./By4YL7mx.js";import"./BFP6M-20.js";import"./Dwws9U0D.js";import"./r3SBLxtE.js";import"./Bd3HqPMF.js";const Wa="radio.select";function Ya(S,A,u){oa(Wa,u,{originalEvent:S,value:A})}var Qa=oe({inheritAttrs:!1,__name:"Radio",props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},checked:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:checked","select"],setup(S,{emit:A}){const u=S,h=A,g=Ve(u,"checked",h,{passive:u.checked===void 0}),{value:l}=Re(u),{forwardRef:I,currentElement:x}=pe(),R=Se(x),C=De(),P=K(()=>u.id&&x.value?document.querySelector(`[for="${u.id}"]`)?.innerText??u.value:void 0);function q(p){u.disabled||Ya(p,u.value,z=>{h("select",z),!z?.defaultPrevented&&(g.value=!0,R.value&&z.stopPropagation())})}return(p,z)=>(i(),y(re,null,[s(e(ge),J({id:p.id,ref:e(I),role:"radio",type:p.as==="button"?"button":void 0,as:p.as,"aria-checked":e(g)??!1,"aria-label":P.value,"as-child":p.asChild,disabled:p.disabled?"":void 0,"data-state":e(g)?"checked":"unchecked","data-disabled":p.disabled?"":void 0,value:e(l),required:p.required,name:p.name},{...e(C),...p.$attrs},{onClick:Pe(q,["stop"])}),{default:o(()=>[M(p.$slots,"default",{checked:e(g)})]),_:3},16,["id","type","as","aria-checked","aria-label","as-child","disabled","data-state","data-disabled","value","required","name"]),e(R)&&p.name?(i(),w(e(Ke),J({key:0,type:"radio",tabindex:"-1",value:e(l),checked:!!e(g),name:p.name,disabled:p.disabled,required:p.required},e(C)),null,16,["value","checked","name","disabled","required"])):k("v-if",!0)],64))}}),Xa=Qa;const[Ja,Za]=ze("RadioGroupRoot");var et=oe({__name:"RadioGroupRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1,default:!1}},emits:["update:modelValue"],setup(S,{emit:A}){const u=S,h=A,{forwardRef:g,currentElement:l}=pe(),I=Ve(u,"modelValue",h,{defaultValue:u.defaultValue,passive:u.modelValue===void 0}),{disabled:x,loop:R,orientation:C,name:P,required:q,dir:p}=Re(u),z=ia(p),$=Se(l);return Za({modelValue:I,changeModelValue:m=>{I.value=m},disabled:x,loop:R,orientation:C,name:P?.value,required:q}),(m,c)=>(i(),w(e(na),{"as-child":"",orientation:e(C),dir:e(z),loop:e(R)},{default:o(()=>[s(e(ge),{ref:e(g),role:"radiogroup","data-disabled":e(x)?"":void 0,"as-child":m.asChild,as:m.as,"aria-orientation":e(C),"aria-required":e(q),dir:e(z)},{default:o(()=>[M(m.$slots,"default",{modelValue:e(I)}),e($)&&e(P)?(i(),w(e(Ke),{key:0,required:e(q),disabled:e(x),value:e(I),name:e(P)},null,8,["required","disabled","value","name"])):k("v-if",!0)]),_:3},8,["data-disabled","as-child","as","aria-orientation","aria-required","dir"])]),_:3},8,["orientation","dir","loop"]))}}),at=et;const[tt,st]=ze("RadioGroupItem");var lt=oe({inheritAttrs:!1,__name:"RadioGroupItem",props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["select"],setup(S,{emit:A}){const u=S,h=A,{forwardRef:g,currentElement:l}=pe(),I=Ja(),x=K(()=>I.disabled.value||u.disabled),R=K(()=>I.required.value||u.required),C=K(()=>ua(I.modelValue?.value,u.value));st({disabled:x,checked:C});const P=b(!1),q=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];qe("keydown",$=>{q.includes($.key)&&(P.value=!0)}),qe("keyup",()=>{P.value=!1});function p(){setTimeout(()=>{P.value&&l.value?.click()},0)}const z=De();return($,m)=>(i(),w(e(Ta),{checked:C.value,disabled:x.value,"as-child":"",focusable:!x.value,active:C.value},{default:o(()=>[s(Xa,J({...e(z),...$.$attrs,...u},{ref:e(g),checked:C.value,required:R.value,disabled:x.value,"onUpdate:checked":m[0]||(m[0]=c=>e(I).changeModelValue($.value)),onSelect:m[1]||(m[1]=c=>h("select",c)),onKeydown:m[2]||(m[2]=da(Pe(()=>{},["prevent"]),["enter"])),onFocus:p}),{default:o(()=>[M($.$slots,"default",{checked:C.value,required:R.value,disabled:x.value})]),_:3},16,["checked","required","disabled"])]),_:3},8,["checked","disabled","focusable","active"]))}}),rt=lt,ot=oe({__name:"RadioGroupIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(S){const{forwardRef:A}=pe(),u=tt();return(h,g)=>(i(),w(e(ca),{present:h.forceMount||e(u).checked.value},{default:o(()=>[s(e(ge),J({ref:e(A),"data-state":e(u).checked.value?"checked":"unchecked","data-disabled":e(u).disabled.value?"":void 0,"as-child":h.asChild,as:h.as},h.$attrs),{default:o(()=>[M(h.$slots,"default")]),_:3},16,["data-state","data-disabled","as-child","as"])]),_:3},8,["present"]))}}),it=ot;const nt={slots:{root:"relative",fieldset:"flex gap-x-2",legend:"mb-1 block font-medium text-default",item:"flex items-start",container:"flex items-center",base:"rounded-full ring ring-inset ring-accented overflow-hidden focus-visible:outline-3",indicator:"flex items-center justify-center size-full after:bg-default after:rounded-full",wrapper:"w-full",label:"block font-medium text-default",description:"text-muted"},variants:{color:{primary:{base:"outline-primary/25 focus-visible:ring-primary",indicator:"bg-primary"},secondary:{base:"outline-secondary/25 focus-visible:ring-secondary",indicator:"bg-secondary"},success:{base:"outline-success/25 focus-visible:ring-success",indicator:"bg-success"},info:{base:"outline-info/25 focus-visible:ring-info",indicator:"bg-info"},warning:{base:"outline-warning/25 focus-visible:ring-warning",indicator:"bg-warning"},error:{base:"outline-error/25 focus-visible:ring-error",indicator:"bg-error"},neutral:{base:"outline-inverted/25 focus-visible:ring-inverted",indicator:"bg-inverted"}},variant:{list:{item:""},card:{item:"border border-muted rounded-lg"},table:{item:"border border-muted"}},orientation:{horizontal:{fieldset:"flex-row"},vertical:{fieldset:"flex-col"}},indicator:{start:{item:"flex-row",wrapper:"ms-2"},end:{item:"flex-row-reverse",wrapper:"me-2"},hidden:{base:"sr-only",wrapper:"text-center"}},size:{xs:{fieldset:"gap-y-0.5",legend:"text-xs",base:"size-3",item:"text-xs",container:"h-4",indicator:"after:size-1"},sm:{fieldset:"gap-y-0.5",legend:"text-xs",base:"size-3.5",item:"text-xs",container:"h-4",indicator:"after:size-1"},md:{fieldset:"gap-y-1",legend:"text-sm",base:"size-4",item:"text-sm",container:"h-5",indicator:"after:size-1.5"},lg:{fieldset:"gap-y-1",legend:"text-sm",base:"size-4.5",item:"text-sm",container:"h-5",indicator:"after:size-1.5"},xl:{fieldset:"gap-y-1.5",legend:"text-base",base:"size-5",item:"text-base",container:"h-6",indicator:"after:size-2"}},highlight:{true:""},disabled:{true:{item:"opacity-75",base:"cursor-not-allowed",label:"cursor-not-allowed",description:"cursor-not-allowed"}},required:{true:{legend:"after:content-['*'] after:ms-0.5 after:text-error"}}},compoundVariants:[{size:"xs",variant:["card","table"],class:{item:"p-2.5"}},{size:"sm",variant:["card","table"],class:{item:"p-3"}},{size:"md",variant:["card","table"],class:{item:"p-3.5"}},{size:"lg",variant:["card","table"],class:{item:"p-4"}},{size:"xl",variant:["card","table"],class:{item:"p-4.5"}},{orientation:"horizontal",variant:"table",class:{item:"first-of-type:rounded-s-lg last-of-type:rounded-e-lg",fieldset:"gap-0 -space-x-px"}},{orientation:"vertical",variant:"table",class:{item:"first-of-type:rounded-t-lg last-of-type:rounded-b-lg",fieldset:"gap-0 -space-y-px"}},{color:"primary",variant:"card",class:{item:"has-data-[state=checked]:border-primary"}},{color:"secondary",variant:"card",class:{item:"has-data-[state=checked]:border-secondary"}},{color:"success",variant:"card",class:{item:"has-data-[state=checked]:border-success"}},{color:"info",variant:"card",class:{item:"has-data-[state=checked]:border-info"}},{color:"warning",variant:"card",class:{item:"has-data-[state=checked]:border-warning"}},{color:"error",variant:"card",class:{item:"has-data-[state=checked]:border-error"}},{color:"neutral",variant:"card",class:{item:"has-data-[state=checked]:border-inverted"}},{color:"primary",variant:"table",class:{item:"has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]"}},{color:"secondary",variant:"table",class:{item:"has-data-[state=checked]:bg-secondary/10 has-data-[state=checked]:border-secondary/50 has-data-[state=checked]:z-[1]"}},{color:"success",variant:"table",class:{item:"has-data-[state=checked]:bg-success/10 has-data-[state=checked]:border-success/50 has-data-[state=checked]:z-[1]"}},{color:"info",variant:"table",class:{item:"has-data-[state=checked]:bg-info/10 has-data-[state=checked]:border-info/50 has-data-[state=checked]:z-[1]"}},{color:"warning",variant:"table",class:{item:"has-data-[state=checked]:bg-warning/10 has-data-[state=checked]:border-warning/50 has-data-[state=checked]:z-[1]"}},{color:"error",variant:"table",class:{item:"has-data-[state=checked]:bg-error/10 has-data-[state=checked]:border-error/50 has-data-[state=checked]:z-[1]"}},{color:"neutral",variant:"table",class:{item:"has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]"}},{variant:["card","table"],disabled:!0,class:{item:"cursor-not-allowed"}},{color:"primary",highlight:!0,class:{base:"ring-primary"}},{color:"secondary",highlight:!0,class:{base:"ring-secondary"}},{color:"success",highlight:!0,class:{base:"ring-success"}},{color:"info",highlight:!0,class:{base:"ring-info"}},{color:"warning",highlight:!0,class:{base:"ring-warning"}},{color:"error",highlight:!0,class:{base:"ring-error"}},{color:"neutral",highlight:!0,class:{base:"ring-inverted"}}],defaultVariants:{size:"md",color:"primary",variant:"list",indicator:"start"}},dt={__name:"URadioGroup",props:{as:{type:null,required:!1},legend:{type:String,required:!1},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},descriptionKey:{type:null,required:!1,default:"description"},items:{type:null,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},size:{type:null,required:!1},variant:{type:null,required:!1},color:{type:null,required:!1},highlight:{type:Boolean,required:!1},orientation:{type:null,required:!1,default:"vertical"},indicator:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["change","update:modelValue"],setup(S,{emit:A}){const u=S,h=A,g=pa(),l=ma("radioGroup",u),I=fa(),x=va(ya(l,"as","loop","required"),h),{emitFormChange:R,emitFormInput:C,color:P,name:q,size:p,highlight:z,id:$,disabled:m,ariaAttrs:c}=ba(u,{bind:!1}),O=$.value??ha(),j=K(()=>ga({extend:nt,...I.ui?.radioGroup||{}})({size:p.value??l.size,color:P.value??l.color,highlight:z.value??l.highlight,disabled:m.value,required:l.required,orientation:l.orientation,variant:l.variant,indicator:l.indicator}));function me(f){if(f===null)return{id:`${O}:null`,value:void 0,label:void 0};if(typeof f=="string"||typeof f=="number"||typeof f=="bigint")return{id:`${O}:${f}`,value:String(f),label:String(f)};const G=be(f,l.valueKey),n=be(f,l.labelKey),T=be(f,l.descriptionKey);return{...f,value:G,label:n,description:T,id:`${O}:${G}`}}const fe=K(()=>l.items?l.items.map(me):[]);function B(f){const G=new Event("change",{target:{value:f}});h("change",G),R(),C()}return(f,G)=>(i(),w(e(at),J({id:e(O)},e(x),{"model-value":e(l).modelValue,"default-value":e(l).defaultValue,orientation:e(l).orientation,name:e(q),disabled:e(m),"data-slot":"root",class:j.value.root({class:[e(l).ui?.root,e(l).class]}),"onUpdate:modelValue":B}),{default:o(()=>[d("fieldset",J({"data-slot":"fieldset",class:j.value.fieldset({class:e(l).ui?.fieldset})},e(c)),[e(l).legend||g.legend?(i(),y("legend",{key:0,"data-slot":"legend",class:D(j.value.legend({class:e(l).ui?.legend}))},[M(f.$slots,"legend",{},()=>[V(_(e(l).legend),1)])],2)):k("",!0),(i(!0),y(re,null,je(fe.value,n=>(i(),w($e(!e(l).variant||e(l).variant==="list"?"div":e(Ie)),{key:n.value,"data-slot":"item",class:D(j.value.item({class:[e(l).ui?.item,n.ui?.item,n.class],disabled:n.disabled||e(m)}))},{default:o(()=>[d("div",{"data-slot":"container",class:D(j.value.container({class:[e(l).ui?.container,n.ui?.container]}))},[s(e(rt),{id:n.id,value:n.value,disabled:n.disabled||e(m),"data-slot":"base",class:D(j.value.base({class:[e(l).ui?.base,n.ui?.base],disabled:n.disabled||e(m)}))},{default:o(()=>[s(e(it),{"data-slot":"indicator",class:D(j.value.indicator({class:[e(l).ui?.indicator,n.ui?.indicator]}))},null,8,["class"])]),_:2},1032,["id","value","disabled","class"])],2),n.label||g.label||n.description||g.description?(i(),y("div",{key:0,"data-slot":"wrapper",class:D(j.value.wrapper({class:[e(l).ui?.wrapper,n.ui?.wrapper]}))},[n.label||g.label?(i(),w($e(!e(l).variant||e(l).variant==="list"?e(Ie):"p"),{key:0,for:n.id,"data-slot":"label",class:D(j.value.label({class:[e(l).ui?.label,n.ui?.label],disabled:n.disabled||e(m)}))},{default:o(()=>[M(f.$slots,"label",{item:n,modelValue:e(l).modelValue},()=>[V(_(n.label),1)])]),_:2},1032,["for","class"])):k("",!0),n.description||g.description?(i(),y("p",{key:1,"data-slot":"description",class:D(j.value.description({class:[e(l).ui?.description,n.ui?.description],disabled:n.disabled||e(m)}))},[M(f.$slots,"description",{item:n,modelValue:e(l).modelValue},()=>[V(_(n.description),1)])],2)):k("",!0)],2)):k("",!0)]),_:2},1032,["class"]))),128))],16)]),_:3},16,["id","model-value","default-value","orientation","name","disabled","class"]))}},ut={class:"space-y-6"},ct={class:"text-muted"},pt={key:0,class:"flex items-center gap-1 text-sm"},mt={key:1,class:"text-muted"},ft={class:"text-sm text-muted"},vt={class:"flex items-center gap-1 justify-end"},yt={class:"text-center py-12"},bt={class:"flex justify-center mb-4"},ht={class:"flex w-full justify-end gap-2"},gt={class:"inline-flex items-center gap-1"},_t={class:"space-y-4"},kt={key:0,class:"rounded-lg border border-primary/30 bg-primary/5 p-4 space-y-4"},wt={key:0,class:"space-y-4"},Ct={class:"rounded-lg bg-elevated p-3 font-mono text-sm break-all select-all"},xt={class:"flex gap-2"},At={key:1,class:"space-y-3"},qt={class:"flex gap-2"},$t={key:1,class:"space-y-2"},Ut={class:"flex-1 min-w-0"},It={class:"flex items-center gap-2"},Vt={class:"font-medium truncate"},Rt={class:"text-xs text-muted mt-1 flex flex-wrap gap-x-4"},Pt={class:"font-mono"},zt={key:0},jt={key:1,class:"italic"},St={key:2,class:"text-center text-muted py-6 text-sm"},Kt={class:"inline-flex items-center gap-1"},Dt={class:"space-y-6"},Et={key:0,class:"text-[var(--ui-text-muted)]"},Ft={key:1},us=oe({__name:"users",async setup(S){let A,u;const{data:h,refresh:g}=([A,u]=_a(()=>Na("/api/users","$0NE568_-ln")),A=await A,u(),A),l=ka(),{copy:I}=Ha(),{authState:x}=wa(),R=Ra(),C=K(()=>h.value?.users||[]),P=K(()=>h.value?.authEnabled||!1),q=K(()=>R.public.authEnabled?x.value.user?.role==="administrator":!0),p=K(()=>x.value.user?.id??null),z=[{accessorKey:"username",header:le("Username")},{accessorKey:"name",header:le("Name")},{accessorKey:"email",header:le("Email")},{accessorKey:"role",header:le("Role")},{accessorKey:"createdAt",header:le("Created")},{accessorKey:"actions",header:""}],$=b(!1),m=Da({username:ue().min(3,"Username must be at least 3 characters"),password:Fa([ue().min(6,"Password must be at least 6 characters"),Ue("").transform(()=>{})]).optional(),role:Ea(["administrator","reporter","user"]),name:ue().optional(),email:ue().email().optional().or(Ue(""))}),c=Va({username:"",password:"",role:"user",name:"",email:""}),O=[{label:"Administrator",value:"administrator"},{label:"Reporter",value:"reporter"},{label:"User",value:"user"}];async function j(){try{const r={...c,password:c.password||void 0};await $fetch("/api/users",{method:"POST",body:r}),l.add({title:"User created",description:`User ${c.username} has been created successfully`,color:"success"}),$.value=!1,c.username="",c.password="",c.role="user",c.name="",c.email="",await g()}catch(r){const a=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;l.add({title:"Failed to create user",description:a||"An error occurred",color:"error"})}}async function me(r){f.value=r,B.value=!0}async function fe(){const r=f.value;if(r){B.value=!1,f.value=null;try{await $fetch(`/api/users/${r.id}`,{method:"DELETE"}),l.add({title:"User deleted",description:`User ${r.username} has been deleted`,color:"success"}),await g()}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to delete user",description:U||"An error occurred",color:"error"})}}}const B=b(!1),f=b(null);function G(r){switch(r){case"administrator":return"primary";case"reporter":return"info";case"user":return"neutral";default:return"neutral"}}const n=b(null),T=b(!1),ie=b([]);async function Ee(r){n.value=r,T.value=!0,await _e(r.id)}async function _e(r){try{const a=await $fetch(`/api/users/${r}/api-keys`);ie.value=a.apiKeys}catch{ie.value=[]}}async function ke(){n.value&&await _e(n.value.id)}const L=b(!1),N=b(""),H=b(""),E=b(null),we=b("http://localhost:3000");Ca(()=>{we.value=window.location.origin});const Fe=K(()=>`['@piwitests/reporter', {
1
+ import{_ as ra}from"./D0HNloZ9.js";import{aK as oa,d as oe,Z as Ve,Y as Re,U as pe,o as i,c as y,j as s,g as o,V as M,k as e,W as J,C as ze,X as ge,f as w,v as k,F as re,h as K,az as ia,aG as na,$ as Pe,aL as qe,S as da,r as b,aM as ua,aC as ca,a2 as pa,a3 as ma,a5 as fa,a6 as va,a7 as ya,aN as ba,aO as ha,i as d,q as D,m as V,t as _,y as je,ag as $e,a8 as ga,aH as be,w as _a,b as ka,N as wa,B as Ca,R as xa,al as Aa,_ as qa,s as $a,p as Ua,I as Ia,l as he,L as Va,A as Ra}from"./NQikbhmK.js";import{_ as za}from"./C9_jrmk9.js";import{_ as Pa}from"./DiOLdHBC.js";import{_ as ja}from"./DprVVyUQ.js";import{_ as Sa}from"./B9WhzpKO.js";import{_ as Ka}from"./DS636elg.js";import{o as Da,s as ue,l as Ue,a as Ea,u as Fa,_ as Ba}from"./C5iG7O4O.js";import{_ as Ga}from"./B3HO8kuh.js";import{_ as Ma}from"./C7P1UCO2.js";import{_ as Oa}from"./rWNTSFD6.js";import{L as Ie}from"./CYsTqbBS.js";import{u as Se}from"./g26aVPxc.js";import{V as Ke}from"./BYDaY0Z7.js";import{u as De}from"./CNFYDQmj.js";import{R as Ta}from"./IvQlbZk6.js";import{_ as La}from"./DiZyJYez.js";import{p as ce,i as le}from"./CDk0q2hV.js";import{u as Na}from"./CpjgB2aY.js";import{u as Ha}from"./Bn0YQDyy.js";import"./FUXhyidq.js";import"./eptP4pGv.js";import"./BjaRappk.js";import"./BeLWlVK0.js";const Wa="radio.select";function Ya(S,A,u){oa(Wa,u,{originalEvent:S,value:A})}var Xa=oe({inheritAttrs:!1,__name:"Radio",props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},checked:{type:Boolean,required:!1,default:void 0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:checked","select"],setup(S,{emit:A}){const u=S,h=A,g=Ve(u,"checked",h,{passive:u.checked===void 0}),{value:l}=Re(u),{forwardRef:I,currentElement:x}=pe(),R=Se(x),C=De(),z=K(()=>u.id&&x.value?document.querySelector(`[for="${u.id}"]`)?.innerText??u.value:void 0);function q(p){u.disabled||Ya(p,u.value,P=>{h("select",P),!P?.defaultPrevented&&(g.value=!0,R.value&&P.stopPropagation())})}return(p,P)=>(i(),y(re,null,[s(e(ge),J({id:p.id,ref:e(I),role:"radio",type:p.as==="button"?"button":void 0,as:p.as,"aria-checked":e(g)??!1,"aria-label":z.value,"as-child":p.asChild,disabled:p.disabled?"":void 0,"data-state":e(g)?"checked":"unchecked","data-disabled":p.disabled?"":void 0,value:e(l),required:p.required,name:p.name},{...e(C),...p.$attrs},{onClick:ze(q,["stop"])}),{default:o(()=>[M(p.$slots,"default",{checked:e(g)})]),_:3},16,["id","type","as","aria-checked","aria-label","as-child","disabled","data-state","data-disabled","value","required","name"]),e(R)&&p.name?(i(),w(e(Ke),J({key:0,type:"radio",tabindex:"-1",value:e(l),checked:!!e(g),name:p.name,disabled:p.disabled,required:p.required},e(C)),null,16,["value","checked","name","disabled","required"])):k("v-if",!0)],64))}}),Za=Xa;const[Ja,Qa]=Pe("RadioGroupRoot");var et=oe({__name:"RadioGroupRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},orientation:{type:String,required:!1,default:void 0},dir:{type:String,required:!1},loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1,default:!1}},emits:["update:modelValue"],setup(S,{emit:A}){const u=S,h=A,{forwardRef:g,currentElement:l}=pe(),I=Ve(u,"modelValue",h,{defaultValue:u.defaultValue,passive:u.modelValue===void 0}),{disabled:x,loop:R,orientation:C,name:z,required:q,dir:p}=Re(u),P=ia(p),$=Se(l);return Qa({modelValue:I,changeModelValue:m=>{I.value=m},disabled:x,loop:R,orientation:C,name:z?.value,required:q}),(m,c)=>(i(),w(e(na),{"as-child":"",orientation:e(C),dir:e(P),loop:e(R)},{default:o(()=>[s(e(ge),{ref:e(g),role:"radiogroup","data-disabled":e(x)?"":void 0,"as-child":m.asChild,as:m.as,"aria-orientation":e(C),"aria-required":e(q),dir:e(P)},{default:o(()=>[M(m.$slots,"default",{modelValue:e(I)}),e($)&&e(z)?(i(),w(e(Ke),{key:0,required:e(q),disabled:e(x),value:e(I),name:e(z)},null,8,["required","disabled","value","name"])):k("v-if",!0)]),_:3},8,["data-disabled","as-child","as","aria-orientation","aria-required","dir"])]),_:3},8,["orientation","dir","loop"]))}}),at=et;const[tt,st]=Pe("RadioGroupItem");var lt=oe({inheritAttrs:!1,__name:"RadioGroupItem",props:{id:{type:String,required:!1},value:{type:null,required:!1},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"button"},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["select"],setup(S,{emit:A}){const u=S,h=A,{forwardRef:g,currentElement:l}=pe(),I=Ja(),x=K(()=>I.disabled.value||u.disabled),R=K(()=>I.required.value||u.required),C=K(()=>ua(I.modelValue?.value,u.value));st({disabled:x,checked:C});const z=b(!1),q=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"];qe("keydown",$=>{q.includes($.key)&&(z.value=!0)}),qe("keyup",()=>{z.value=!1});function p(){setTimeout(()=>{z.value&&l.value?.click()},0)}const P=De();return($,m)=>(i(),w(e(Ta),{checked:C.value,disabled:x.value,"as-child":"",focusable:!x.value,active:C.value},{default:o(()=>[s(Za,J({...e(P),...$.$attrs,...u},{ref:e(g),checked:C.value,required:R.value,disabled:x.value,"onUpdate:checked":m[0]||(m[0]=c=>e(I).changeModelValue($.value)),onSelect:m[1]||(m[1]=c=>h("select",c)),onKeydown:m[2]||(m[2]=da(ze(()=>{},["prevent"]),["enter"])),onFocus:p}),{default:o(()=>[M($.$slots,"default",{checked:C.value,required:R.value,disabled:x.value})]),_:3},16,["checked","required","disabled"])]),_:3},8,["checked","disabled","focusable","active"]))}}),rt=lt,ot=oe({__name:"RadioGroupIndicator",props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(S){const{forwardRef:A}=pe(),u=tt();return(h,g)=>(i(),w(e(ca),{present:h.forceMount||e(u).checked.value},{default:o(()=>[s(e(ge),J({ref:e(A),"data-state":e(u).checked.value?"checked":"unchecked","data-disabled":e(u).disabled.value?"":void 0,"as-child":h.asChild,as:h.as},h.$attrs),{default:o(()=>[M(h.$slots,"default")]),_:3},16,["data-state","data-disabled","as-child","as"])]),_:3},8,["present"]))}}),it=ot;const nt={slots:{root:"relative",fieldset:"flex gap-x-2",legend:"mb-1 block font-medium text-default",item:"flex items-start",container:"flex items-center",base:"rounded-full ring ring-inset ring-accented overflow-hidden focus-visible:outline-3",indicator:"flex items-center justify-center size-full after:bg-default after:rounded-full",wrapper:"w-full",label:"block font-medium text-default",description:"text-muted"},variants:{color:{primary:{base:"outline-primary/25 focus-visible:ring-primary",indicator:"bg-primary"},secondary:{base:"outline-secondary/25 focus-visible:ring-secondary",indicator:"bg-secondary"},success:{base:"outline-success/25 focus-visible:ring-success",indicator:"bg-success"},info:{base:"outline-info/25 focus-visible:ring-info",indicator:"bg-info"},warning:{base:"outline-warning/25 focus-visible:ring-warning",indicator:"bg-warning"},error:{base:"outline-error/25 focus-visible:ring-error",indicator:"bg-error"},neutral:{base:"outline-inverted/25 focus-visible:ring-inverted",indicator:"bg-inverted"}},variant:{list:{item:""},card:{item:"border border-muted rounded-lg"},table:{item:"border border-muted"}},orientation:{horizontal:{fieldset:"flex-row"},vertical:{fieldset:"flex-col"}},indicator:{start:{item:"flex-row",wrapper:"ms-2"},end:{item:"flex-row-reverse",wrapper:"me-2"},hidden:{base:"sr-only",wrapper:"text-center"}},size:{xs:{fieldset:"gap-y-0.5",legend:"text-xs",base:"size-3",item:"text-xs",container:"h-4",indicator:"after:size-1"},sm:{fieldset:"gap-y-0.5",legend:"text-xs",base:"size-3.5",item:"text-xs",container:"h-4",indicator:"after:size-1"},md:{fieldset:"gap-y-1",legend:"text-sm",base:"size-4",item:"text-sm",container:"h-5",indicator:"after:size-1.5"},lg:{fieldset:"gap-y-1",legend:"text-sm",base:"size-4.5",item:"text-sm",container:"h-5",indicator:"after:size-1.5"},xl:{fieldset:"gap-y-1.5",legend:"text-base",base:"size-5",item:"text-base",container:"h-6",indicator:"after:size-2"}},highlight:{true:""},disabled:{true:{item:"opacity-75",base:"cursor-not-allowed",label:"cursor-not-allowed",description:"cursor-not-allowed"}},required:{true:{legend:"after:content-['*'] after:ms-0.5 after:text-error"}}},compoundVariants:[{size:"xs",variant:["card","table"],class:{item:"p-2.5"}},{size:"sm",variant:["card","table"],class:{item:"p-3"}},{size:"md",variant:["card","table"],class:{item:"p-3.5"}},{size:"lg",variant:["card","table"],class:{item:"p-4"}},{size:"xl",variant:["card","table"],class:{item:"p-4.5"}},{orientation:"horizontal",variant:"table",class:{item:"first-of-type:rounded-s-lg last-of-type:rounded-e-lg",fieldset:"gap-0 -space-x-px"}},{orientation:"vertical",variant:"table",class:{item:"first-of-type:rounded-t-lg last-of-type:rounded-b-lg",fieldset:"gap-0 -space-y-px"}},{color:"primary",variant:"card",class:{item:"has-data-[state=checked]:border-primary"}},{color:"secondary",variant:"card",class:{item:"has-data-[state=checked]:border-secondary"}},{color:"success",variant:"card",class:{item:"has-data-[state=checked]:border-success"}},{color:"info",variant:"card",class:{item:"has-data-[state=checked]:border-info"}},{color:"warning",variant:"card",class:{item:"has-data-[state=checked]:border-warning"}},{color:"error",variant:"card",class:{item:"has-data-[state=checked]:border-error"}},{color:"neutral",variant:"card",class:{item:"has-data-[state=checked]:border-inverted"}},{color:"primary",variant:"table",class:{item:"has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]"}},{color:"secondary",variant:"table",class:{item:"has-data-[state=checked]:bg-secondary/10 has-data-[state=checked]:border-secondary/50 has-data-[state=checked]:z-[1]"}},{color:"success",variant:"table",class:{item:"has-data-[state=checked]:bg-success/10 has-data-[state=checked]:border-success/50 has-data-[state=checked]:z-[1]"}},{color:"info",variant:"table",class:{item:"has-data-[state=checked]:bg-info/10 has-data-[state=checked]:border-info/50 has-data-[state=checked]:z-[1]"}},{color:"warning",variant:"table",class:{item:"has-data-[state=checked]:bg-warning/10 has-data-[state=checked]:border-warning/50 has-data-[state=checked]:z-[1]"}},{color:"error",variant:"table",class:{item:"has-data-[state=checked]:bg-error/10 has-data-[state=checked]:border-error/50 has-data-[state=checked]:z-[1]"}},{color:"neutral",variant:"table",class:{item:"has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]"}},{variant:["card","table"],disabled:!0,class:{item:"cursor-not-allowed"}},{color:"primary",highlight:!0,class:{base:"ring-primary"}},{color:"secondary",highlight:!0,class:{base:"ring-secondary"}},{color:"success",highlight:!0,class:{base:"ring-success"}},{color:"info",highlight:!0,class:{base:"ring-info"}},{color:"warning",highlight:!0,class:{base:"ring-warning"}},{color:"error",highlight:!0,class:{base:"ring-error"}},{color:"neutral",highlight:!0,class:{base:"ring-inverted"}}],defaultVariants:{size:"md",color:"primary",variant:"list",indicator:"start"}},dt={__name:"URadioGroup",props:{as:{type:null,required:!1},legend:{type:String,required:!1},valueKey:{type:null,required:!1,default:"value"},labelKey:{type:null,required:!1,default:"label"},descriptionKey:{type:null,required:!1,default:"description"},items:{type:null,required:!1},modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},size:{type:null,required:!1},variant:{type:null,required:!1},color:{type:null,required:!1},highlight:{type:Boolean,required:!1},orientation:{type:null,required:!1,default:"vertical"},indicator:{type:null,required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},disabled:{type:Boolean,required:!1},loop:{type:Boolean,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["change","update:modelValue"],setup(S,{emit:A}){const u=S,h=A,g=pa(),l=ma("radioGroup",u),I=fa(),x=va(ya(l,"as","loop","required"),h),{emitFormChange:R,emitFormInput:C,color:z,name:q,size:p,highlight:P,id:$,disabled:m,ariaAttrs:c}=ba(u,{bind:!1}),O=$.value??ha(),j=K(()=>ga({extend:nt,...I.ui?.radioGroup||{}})({size:p.value??l.size,color:z.value??l.color,highlight:P.value??l.highlight,disabled:m.value,required:l.required,orientation:l.orientation,variant:l.variant,indicator:l.indicator}));function me(f){if(f===null)return{id:`${O}:null`,value:void 0,label:void 0};if(typeof f=="string"||typeof f=="number"||typeof f=="bigint")return{id:`${O}:${f}`,value:String(f),label:String(f)};const G=be(f,l.valueKey),n=be(f,l.labelKey),T=be(f,l.descriptionKey);return{...f,value:G,label:n,description:T,id:`${O}:${G}`}}const fe=K(()=>l.items?l.items.map(me):[]);function B(f){const G=new Event("change",{target:{value:f}});h("change",G),R(),C()}return(f,G)=>(i(),w(e(at),J({id:e(O)},e(x),{"model-value":e(l).modelValue,"default-value":e(l).defaultValue,orientation:e(l).orientation,name:e(q),disabled:e(m),"data-slot":"root",class:j.value.root({class:[e(l).ui?.root,e(l).class]}),"onUpdate:modelValue":B}),{default:o(()=>[d("fieldset",J({"data-slot":"fieldset",class:j.value.fieldset({class:e(l).ui?.fieldset})},e(c)),[e(l).legend||g.legend?(i(),y("legend",{key:0,"data-slot":"legend",class:D(j.value.legend({class:e(l).ui?.legend}))},[M(f.$slots,"legend",{},()=>[V(_(e(l).legend),1)])],2)):k("",!0),(i(!0),y(re,null,je(fe.value,n=>(i(),w($e(!e(l).variant||e(l).variant==="list"?"div":e(Ie)),{key:n.value,"data-slot":"item",class:D(j.value.item({class:[e(l).ui?.item,n.ui?.item,n.class],disabled:n.disabled||e(m)}))},{default:o(()=>[d("div",{"data-slot":"container",class:D(j.value.container({class:[e(l).ui?.container,n.ui?.container]}))},[s(e(rt),{id:n.id,value:n.value,disabled:n.disabled||e(m),"data-slot":"base",class:D(j.value.base({class:[e(l).ui?.base,n.ui?.base],disabled:n.disabled||e(m)}))},{default:o(()=>[s(e(it),{"data-slot":"indicator",class:D(j.value.indicator({class:[e(l).ui?.indicator,n.ui?.indicator]}))},null,8,["class"])]),_:2},1032,["id","value","disabled","class"])],2),n.label||g.label||n.description||g.description?(i(),y("div",{key:0,"data-slot":"wrapper",class:D(j.value.wrapper({class:[e(l).ui?.wrapper,n.ui?.wrapper]}))},[n.label||g.label?(i(),w($e(!e(l).variant||e(l).variant==="list"?e(Ie):"p"),{key:0,for:n.id,"data-slot":"label",class:D(j.value.label({class:[e(l).ui?.label,n.ui?.label],disabled:n.disabled||e(m)}))},{default:o(()=>[M(f.$slots,"label",{item:n,modelValue:e(l).modelValue},()=>[V(_(n.label),1)])]),_:2},1032,["for","class"])):k("",!0),n.description||g.description?(i(),y("p",{key:1,"data-slot":"description",class:D(j.value.description({class:[e(l).ui?.description,n.ui?.description],disabled:n.disabled||e(m)}))},[M(f.$slots,"description",{item:n,modelValue:e(l).modelValue},()=>[V(_(n.description),1)])],2)):k("",!0)],2)):k("",!0)]),_:2},1032,["class"]))),128))],16)]),_:3},16,["id","model-value","default-value","orientation","name","disabled","class"]))}},ut={class:"space-y-6"},ct={class:"text-muted"},pt={key:0,class:"flex items-center gap-1 text-sm"},mt={key:1,class:"text-muted"},ft={class:"text-sm text-muted"},vt={class:"flex items-center gap-1 justify-end"},yt={class:"text-center py-12"},bt={class:"flex justify-center mb-4"},ht={class:"flex w-full justify-end gap-2"},gt={class:"inline-flex items-center gap-1"},_t={class:"space-y-4"},kt={key:0,class:"rounded-lg border border-primary/30 bg-primary/5 p-4 space-y-4"},wt={key:0,class:"space-y-4"},Ct={class:"rounded-lg bg-elevated p-3 font-mono text-sm break-all select-all"},xt={class:"flex gap-2"},At={key:1,class:"space-y-3"},qt={class:"flex gap-2"},$t={key:1,class:"space-y-2"},Ut={class:"flex-1 min-w-0"},It={class:"flex items-center gap-2"},Vt={class:"font-medium truncate"},Rt={class:"text-xs text-muted mt-1 flex flex-wrap gap-x-4"},zt={class:"font-mono"},Pt={key:0},jt={key:1,class:"italic"},St={key:2,class:"text-center text-muted py-6 text-sm"},Kt={class:"inline-flex items-center gap-1"},Dt={class:"space-y-6"},Et={key:0,class:"text-[var(--ui-text-muted)]"},Ft={key:1},us=oe({__name:"users",async setup(S){let A,u;const{data:h,refresh:g}=([A,u]=_a(()=>Na("/api/users","$0NE568_-ln")),A=await A,u(),A),l=ka(),{copy:I}=Ha(),{authState:x}=wa(),R=Ra(),C=K(()=>h.value?.users||[]),z=K(()=>h.value?.authEnabled||!1),q=K(()=>R.public.authEnabled?x.value.user?.role==="administrator":!0),p=K(()=>x.value.user?.id??null),P=[{accessorKey:"username",header:le("Username")},{accessorKey:"name",header:le("Name")},{accessorKey:"email",header:le("Email")},{accessorKey:"role",header:le("Role")},{accessorKey:"createdAt",header:le("Created")},{accessorKey:"actions",header:""}],$=b(!1),m=Da({username:ue().min(3,"Username must be at least 3 characters"),password:Fa([ue().min(6,"Password must be at least 6 characters"),Ue("").transform(()=>{})]).optional(),role:Ea(["administrator","reporter","user"]),name:ue().optional(),email:ue().email().optional().or(Ue(""))}),c=Va({username:"",password:"",role:"user",name:"",email:""}),O=[{label:"Administrator",value:"administrator"},{label:"Reporter",value:"reporter"},{label:"User",value:"user"}];async function j(){try{const r={...c,password:c.password||void 0};await $fetch("/api/users",{method:"POST",body:r}),l.add({title:"User created",description:`User ${c.username} has been created successfully`,color:"success"}),$.value=!1,c.username="",c.password="",c.role="user",c.name="",c.email="",await g()}catch(r){const a=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;l.add({title:"Failed to create user",description:a||"An error occurred",color:"error"})}}async function me(r){f.value=r,B.value=!0}async function fe(){const r=f.value;if(r){B.value=!1,f.value=null;try{await $fetch(`/api/users/${r.id}`,{method:"DELETE"}),l.add({title:"User deleted",description:`User ${r.username} has been deleted`,color:"success"}),await g()}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to delete user",description:U||"An error occurred",color:"error"})}}}const B=b(!1),f=b(null);function G(r){switch(r){case"administrator":return"primary";case"reporter":return"info";case"user":return"neutral";default:return"neutral"}}const n=b(null),T=b(!1),ie=b([]);async function Ee(r){n.value=r,T.value=!0,await _e(r.id)}async function _e(r){try{const a=await $fetch(`/api/users/${r}/api-keys`);ie.value=a.apiKeys}catch{ie.value=[]}}async function ke(){n.value&&await _e(n.value.id)}const L=b(!1),N=b(""),H=b(""),E=b(null),we=b("http://localhost:3000");Ca(()=>{we.value=window.location.origin});const Fe=K(()=>`['@piwitests/reporter', {
2
2
  serverUrl: '${we.value}',
3
3
  apiKey: '${E.value??""}', // or set PIWI_API_KEY and use apiKey: process.env.PIWI_API_KEY
4
- }]`);function Be(){N.value="",H.value="",E.value=null,L.value=!0}function Ce(){L.value=!1,E.value=null}async function Ge(){if(n.value)try{const r={name:N.value};H.value&&(r.expiresAt=new Date(H.value).toISOString());const a=await $fetch(`/api/users/${n.value.id}/api-keys`,{method:"POST",body:r});E.value=a.key,await ke()}catch(r){const a=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;l.add({title:"Failed to create API key",description:a||"An error occurred",color:"error"})}}function Me(){I(E.value,{toast:"API key copied to clipboard"})}function Oe(){E.value=null,L.value=!1}const Z=b(!1),ee=b(null);function Te(r){ee.value=r,Z.value=!0}async function Le(){if(!n.value||!ee.value)return;const r=ee.value;Z.value=!1,ee.value=null;try{await $fetch(`/api/users/${n.value.id}/api-keys/${r.id}`,{method:"DELETE"}),l.add({title:"API key revoked",description:`Key "${r.name}" has been revoked`,color:"success"}),await ke()}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to revoke API key",description:U||"An error occurred",color:"error"})}}function Ne(r){return R.public.authEnabled?q.value||p.value===r.id:!0}const ne=b(null),ae=b(!1),W=b(!1),Y=b([]),Q=b([]);async function He(r){ne.value=r,ae.value=!0;try{const a=await $fetch("/api/projects/menu");Q.value=a.map(U=>({...U,label:U.label||U.name}))}catch{Q.value=[]}try{const a=await $fetch(`/api/users/${r.id}/projects`);W.value=a.global,Y.value=Q.value.filter(U=>a.projectIds.includes(U.id))}catch{W.value=!1,Y.value=[]}}async function We(){const r=ne.value;if(r)try{await $fetch(`/api/users/${r.id}/projects`,{method:"PUT",body:{global:W.value,projectIds:Y.value.map(a=>a.id)}}),l.add({title:"Project access updated",description:`Access for ${r.username} has been updated`,color:"success"}),ae.value=!1}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to update project access",description:U||"An error occurred",color:"error"})}}const ve=b(null);async function Ye(r){if(!r.email){l.add({title:"No email address",description:"Set an email address for this user first.",color:"error"});return}ve.value=r.id;try{await $fetch(`/api/users/${r.id}/invite`,{method:"POST"}),l.add({title:"Invite sent",description:`Invitation sent to ${r.email}`,color:"success"})}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to send invite",description:U||"An error occurred",color:"error"})}finally{ve.value=null}}return(r,a)=>{const U=ra,v=qa,ye=Ua,Qe=$a,Xe=Pa,Je=za,xe=ja,X=Ia,F=Sa,Ze=Ka,ea=Ba,te=Ga,se=xa,Ae=Ma,aa=Oa,ta=dt,sa=Aa("UDivider"),la=La;return i(),y(re,null,[d("div",ut,[e(P)?k("",!0):(i(),w(U,{key:0,icon:"i-lucide-info",color:"primary",variant:"subtle",title:"Authentication is disabled",description:"Authentication is currently disabled. You can manage users here, but they will only be used when authentication is enabled via the PIWI_AUTH_ENABLED environment variable."})),e(C).length>0?(i(),w(xe,{key:1,title:"Users",count:e(C).length,help:"settings.users"},{actions:o(()=>[e(q)?(i(),w(v,{key:0,label:"Add user",icon:"i-lucide-user-plus",size:"sm",onClick:a[0]||(a[0]=t=>$.value=!0)})):k("",!0)]),default:o(()=>[s(Je,{"min-width":"44rem",bleed:!1},{default:o(()=>[s(Xe,{data:e(C),columns:z,sticky:"",class:"max-h-[32rem]"},{"username-cell":o(({row:t})=>[V(_(t.original.username),1)]),"name-cell":o(({row:t})=>[d("span",ct,_(t.original.name||"-"),1)]),"email-cell":o(({row:t})=>[t.original.email?(i(),y("span",pt,[V(_(t.original.email)+" ",1),t.original.emailVerified?(i(),w(ye,{key:0,name:"i-lucide-circle-check-big",class:"size-3.5 text-success-500",title:"Email verified"})):k("",!0)])):(i(),y("span",mt,"—"))]),"role-cell":o(({row:t})=>[s(Qe,{color:G(t.original.role),variant:"subtle"},{default:o(()=>[V(_(t.original.role),1)]),_:2},1032,["color"])]),"createdAt-cell":o(({row:t})=>[d("span",ft,_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.original.createdAt,{dateOnly:!0})),1)]),"actions-cell":o(({row:t})=>[d("div",vt,[e(q)&&t.original.email&&!t.original.oauthProvider?(i(),w(v,{key:0,icon:"i-lucide-send",color:"neutral",variant:"ghost",size:"sm",title:"Send invite email","aria-label":"Send invite email",loading:e(ve)===t.original.id,onClick:de=>Ye(t.original)},null,8,["loading","onClick"])):k("",!0),e(q)&&t.original.role!=="administrator"?(i(),w(v,{key:1,icon:"i-lucide-folder-lock",color:"neutral",variant:"ghost",size:"sm",title:"Project access","aria-label":"Project access",onClick:de=>He(t.original)},null,8,["onClick"])):k("",!0),Ne(t.original)?(i(),w(v,{key:2,icon:"i-lucide-key",color:"neutral",variant:"ghost",size:"sm",title:"Manage API keys","aria-label":"Manage API keys",onClick:de=>Ee(t.original)},null,8,["onClick"])):k("",!0),e(q)?(i(),w(v,{key:3,icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",title:"Delete user","aria-label":"Delete user",onClick:de=>me(t.original)},null,8,["onClick"])):k("",!0)])]),_:1},8,["data"])]),_:1})]),_:1},8,["count"])):(i(),w(xe,{key:2,title:"Users",count:0,help:"settings.users"},{default:o(()=>[d("div",yt,[d("div",bt,[s(ye,{name:"i-lucide-users",class:"text-4xl text-muted"})]),a[21]||(a[21]=d("h3",{class:"text-lg font-semibold mb-2"},"No users yet",-1)),a[22]||(a[22]=d("p",{class:"text-muted mb-4"},"Create your first user to get started with authentication",-1)),e(q)?(i(),w(v,{key:0,label:"Add user",icon:"i-lucide-user-plus",onClick:a[1]||(a[1]=t=>$.value=!0)})):k("",!0)])]),_:1}))]),s(se,null,{default:o(()=>[s(te,{open:e($),title:"Add new user","onUpdate:open":a[8]||(a[8]=t=>$.value=t)},{body:o(()=>[s(ea,{schema:e(m),state:e(c),class:"space-y-5"},{default:o(()=>[s(F,{label:"Username",name:"username",required:""},{default:o(()=>[s(X,{modelValue:e(c).username,"onUpdate:modelValue":a[2]||(a[2]=t=>e(c).username=t),placeholder:"Enter username",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Password",name:"password",description:"Leave blank to let the user set their own password via invite email"},{default:o(()=>[s(X,{modelValue:e(c).password,"onUpdate:modelValue":a[3]||(a[3]=t=>e(c).password=t),type:"password",placeholder:"Leave blank to send invite",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Display name",name:"name"},{default:o(()=>[s(X,{modelValue:e(c).name,"onUpdate:modelValue":a[4]||(a[4]=t=>e(c).name=t),placeholder:"Enter display name (optional)",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Email",name:"email",description:"Optional — needed for invites and notifications"},{default:o(()=>[s(X,{modelValue:e(c).email,"onUpdate:modelValue":a[5]||(a[5]=t=>e(c).email=t),type:"email",placeholder:"user@example.com (optional)",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Role",name:"role",required:""},{default:o(()=>[s(Ze,{modelValue:e(c).role,"onUpdate:modelValue":a[6]||(a[6]=t=>e(c).role=t),items:O,class:"w-full"},null,8,["modelValue"])]),_:1})]),_:1},8,["schema","state"])]),footer:o(()=>[d("div",ht,[s(v,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:a[7]||(a[7]=t=>$.value=!1)}),s(v,{type:"submit",label:"Create user",icon:"i-lucide-user-plus",onClick:j})])]),_:1},8,["open"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(T),title:`API keys – ${e(n)?.username}`,size:"xl","onUpdate:open":a[12]||(a[12]=t=>{T.value=t,t||Ce()})},{title:o(()=>[d("span",gt,[V(" API keys – "+_(e(n)?.username)+" ",1),s(Ae,{topic:"settings.api-keys"})])]),body:o(()=>[d("div",_t,[a[26]||(a[26]=d("p",{class:"text-sm text-muted"},[V(" API keys allow the Playwright reporter (and other CI tools) to submit test results without a username/password login. Each key is shown "),d("strong",null,"only once"),V(" at creation time — store it in a CI secret immediately. ")],-1)),e(L)?(i(),y("div",kt,[e(E)?(i(),y("div",wt,[s(U,{icon:"i-lucide-triangle-alert",color:"warning",variant:"subtle",title:"Save your API key now",description:"This key will never be shown again. Copy it and store it in your CI secret manager immediately."}),d("div",Ct,_(e(E)),1),d("div",xt,[s(v,{label:"Copy to clipboard",icon:"i-lucide-clipboard",color:"primary",size:"sm",onClick:Me}),s(v,{label:"Done",variant:"ghost",size:"sm",onClick:Oe})]),d("div",null,[a[23]||(a[23]=d("p",{class:"text-xs font-semibold uppercase tracking-wide text-muted mb-2"}," Use it in your reporter config ",-1)),s(aa,{code:e(Fe),lang:"typescript"},null,8,["code"])])])):(i(),y("div",At,[a[24]||(a[24]=d("h4",{class:"font-medium text-sm"},"Create new API key",-1)),s(F,{label:"Key name",name:"name",required:""},{default:o(()=>[s(X,{modelValue:e(N),"onUpdate:modelValue":a[9]||(a[9]=t=>he(N)?N.value=t:null),placeholder:"e.g. GitHub Actions CI",size:"sm"},null,8,["modelValue"])]),_:1}),s(F,{label:"Expires at (optional)",name:"expiresAt"},{default:o(()=>[s(X,{modelValue:e(H),"onUpdate:modelValue":a[10]||(a[10]=t=>he(H)?H.value=t:null),type:"date",size:"sm",min:new Date().toISOString().split("T")[0]},null,8,["modelValue","min"])]),_:1}),d("div",qt,[s(v,{label:"Generate key",icon:"i-lucide-key",size:"sm",disabled:!e(N).trim(),onClick:Ge},null,8,["disabled"]),s(v,{color:"neutral",variant:"ghost",label:"Cancel",size:"sm",onClick:Ce})])]))])):k("",!0),e(ie).length>0?(i(),y("div",$t,[(i(!0),y(re,null,je(e(ie),t=>(i(),y("div",{key:t.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[d("div",Ut,[d("div",It,[s(ye,{name:"i-lucide-key",class:"text-muted shrink-0"}),d("span",Vt,_(t.name),1)]),d("div",Rt,[d("span",null,[a[25]||(a[25]=V("Prefix: ",-1)),d("code",Pt,"pd_"+_(t.keyPrefix)+"…",1)]),d("span",null,"Created: "+_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.createdAt,{dateOnly:!0})),1),t.lastUsedAt?(i(),y("span",zt,"Last used: "+_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.lastUsedAt,{dateOnly:!0})),1)):(i(),y("span",jt,"Never used")),t.expiresAt?(i(),y("span",{key:2,class:D(new Date(t.expiresAt)<new Date?"text-error":"")}," Expires: "+_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.expiresAt,{dateOnly:!0})),3)):k("",!0)])]),s(v,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",title:"Revoke key",onClick:de=>Te(t)},null,8,["onClick"])]))),128))])):e(L)?k("",!0):(i(),y("div",St," No API keys yet. Create one to allow CI access. "))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Close",onClick:a[11]||(a[11]=t=>T.value=!1)}),e(L)?k("",!0):(i(),w(v,{key:0,label:"Create API key",icon:"i-lucide-plus",onClick:Be}))]),_:1},8,["open","title"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(B),title:"Delete user","onUpdate:open":a[14]||(a[14]=t=>B.value=t)},{body:o(()=>[d("p",null,[a[27]||(a[27]=V(" Are you sure you want to delete user ",-1)),d("strong",null,_(e(f)?.username),1),a[28]||(a[28]=V("? This action cannot be undone. ",-1))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[13]||(a[13]=t=>B.value=!1)}),s(v,{color:"error",label:"Delete user",icon:"i-lucide-trash-2",onClick:fe})]),_:1},8,["open"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(Z),title:"Revoke API key","onUpdate:open":a[16]||(a[16]=t=>Z.value=t)},{body:o(()=>[d("p",null,[a[29]||(a[29]=V(" Revoke API key ",-1)),d("strong",null,'"'+_(e(ee)?.name)+'"',1),a[30]||(a[30]=V("? Any CI pipeline using it will stop working immediately. ",-1))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[15]||(a[15]=t=>Z.value=!1)}),s(v,{color:"error",label:"Revoke",icon:"i-lucide-trash-2",onClick:Le})]),_:1},8,["open"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(ae),title:`Project access – ${e(ne)?.username}`,size:"xl","onUpdate:open":a[20]||(a[20]=t=>ae.value=t)},{title:o(()=>[d("span",Kt,[V(" Project access – "+_(e(ne)?.username)+" ",1),s(Ae,{topic:"project.members"})])]),body:o(()=>[d("div",Dt,[a[31]||(a[31]=d("p",{class:"text-sm text-muted"}," Control which projects this user can access. Users without any project access will see no projects. ",-1)),s(ta,{"model-value":e(W)?"global":"specific",items:[{value:"global",label:"Global access",description:"Access to all projects (current and future)"},{value:"specific",label:"Specific projects",description:"Access only to selected projects"}],"onUpdate:modelValue":a[17]||(a[17]=t=>W.value=t==="global")},null,8,["model-value"]),e(W)?k("",!0):(i(),y(re,{key:0},[s(sa),s(F,{label:"Specific projects",description:`Select from ${e(Q).length>0?e(Q).length:"0"} available projects`},{default:o(()=>[s(la,{modelValue:e(Y),"onUpdate:modelValue":a[18]||(a[18]=t=>he(Y)?Y.value=t:null),items:e(Q),by:"id",multiple:"",searchable:"",class:"w-full",placeholder:"Search and select projects…"},{default:o(({modelValue:t})=>[t.length===0?(i(),y("span",Et,"Select projects…")):(i(),y("span",Ft,_(t.length)+" project(s) selected",1))]),_:1},8,["modelValue","items"])]),_:1},8,["description"])],64))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[19]||(a[19]=t=>ae.value=!1)}),s(v,{label:"Save",icon:"i-lucide-check",onClick:We})]),_:1},8,["open","title"])]),_:1})],64)}}});export{us as default};
4
+ }]`);function Be(){N.value="",H.value="",E.value=null,L.value=!0}function Ce(){L.value=!1,E.value=null}async function Ge(){if(n.value)try{const r={name:N.value};H.value&&(r.expiresAt=new Date(H.value).toISOString());const a=await $fetch(`/api/users/${n.value.id}/api-keys`,{method:"POST",body:r});E.value=a.key,await ke()}catch(r){const a=r&&typeof r=="object"&&"data"in r?r.data?.message:void 0;l.add({title:"Failed to create API key",description:a||"An error occurred",color:"error"})}}function Me(){I(E.value,{toast:"API key copied to clipboard"})}function Oe(){E.value=null,L.value=!1}const Q=b(!1),ee=b(null);function Te(r){ee.value=r,Q.value=!0}async function Le(){if(!n.value||!ee.value)return;const r=ee.value;Q.value=!1,ee.value=null;try{await $fetch(`/api/users/${n.value.id}/api-keys/${r.id}`,{method:"DELETE"}),l.add({title:"API key revoked",description:`Key "${r.name}" has been revoked`,color:"success"}),await ke()}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to revoke API key",description:U||"An error occurred",color:"error"})}}function Ne(r){return R.public.authEnabled?q.value||p.value===r.id:!0}const ne=b(null),ae=b(!1),W=b(!1),Y=b([]),X=b([]);async function He(r){ne.value=r,ae.value=!0;try{const a=await $fetch("/api/projects/menu");X.value=a.map(U=>({...U,label:U.label||U.name}))}catch{X.value=[]}try{const a=await $fetch(`/api/users/${r.id}/projects`);W.value=a.global,Y.value=X.value.filter(U=>a.projectIds.includes(U.id))}catch{W.value=!1,Y.value=[]}}async function We(){const r=ne.value;if(r)try{await $fetch(`/api/users/${r.id}/projects`,{method:"PUT",body:{global:W.value,projectIds:Y.value.map(a=>a.id)}}),l.add({title:"Project access updated",description:`Access for ${r.username} has been updated`,color:"success"}),ae.value=!1}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to update project access",description:U||"An error occurred",color:"error"})}}const ve=b(null);async function Ye(r){if(!r.email){l.add({title:"No email address",description:"Set an email address for this user first.",color:"error"});return}ve.value=r.id;try{await $fetch(`/api/users/${r.id}/invite`,{method:"POST"}),l.add({title:"Invite sent",description:`Invitation sent to ${r.email}`,color:"success"})}catch(a){const U=a&&typeof a=="object"&&"data"in a?a.data?.message:void 0;l.add({title:"Failed to send invite",description:U||"An error occurred",color:"error"})}finally{ve.value=null}}return(r,a)=>{const U=ra,v=qa,ye=Ua,Xe=$a,Ze=za,Je=Pa,xe=ja,Z=Ia,F=Sa,Qe=Ka,ea=Ba,te=Ga,se=xa,Ae=Ma,aa=Oa,ta=dt,sa=Aa("UDivider"),la=La;return i(),y(re,null,[d("div",ut,[e(z)?k("",!0):(i(),w(U,{key:0,icon:"i-lucide-info",color:"primary",variant:"subtle",title:"Authentication is disabled",description:"Authentication is currently disabled. You can manage users here, but they will only be used when authentication is enabled via the PIWI_AUTH_ENABLED environment variable."})),e(C).length>0?(i(),w(xe,{key:1,title:"Users",count:e(C).length,help:"settings.users"},{actions:o(()=>[e(q)?(i(),w(v,{key:0,label:"Add user",icon:"i-lucide-user-plus",size:"sm",onClick:a[0]||(a[0]=t=>$.value=!0)})):k("",!0)]),default:o(()=>[s(Je,{"min-width":"44rem",bleed:!1},{default:o(()=>[s(Ze,{data:e(C),columns:P,sticky:"",class:"max-h-[32rem]"},{"username-cell":o(({row:t})=>[V(_(t.original.username),1)]),"name-cell":o(({row:t})=>[d("span",ct,_(t.original.name||"-"),1)]),"email-cell":o(({row:t})=>[t.original.email?(i(),y("span",pt,[V(_(t.original.email)+" ",1),t.original.emailVerified?(i(),w(ye,{key:0,name:"i-lucide-circle-check-big",class:"size-3.5 text-success-500",title:"Email verified"})):k("",!0)])):(i(),y("span",mt,"—"))]),"role-cell":o(({row:t})=>[s(Xe,{color:G(t.original.role),variant:"subtle"},{default:o(()=>[V(_(t.original.role),1)]),_:2},1032,["color"])]),"createdAt-cell":o(({row:t})=>[d("span",ft,_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.original.createdAt,{dateOnly:!0})),1)]),"actions-cell":o(({row:t})=>[d("div",vt,[e(q)&&t.original.email&&!t.original.oauthProvider?(i(),w(v,{key:0,icon:"i-lucide-send",color:"neutral",variant:"ghost",size:"sm",title:"Send invite email","aria-label":"Send invite email",loading:e(ve)===t.original.id,onClick:de=>Ye(t.original)},null,8,["loading","onClick"])):k("",!0),e(q)&&t.original.role!=="administrator"?(i(),w(v,{key:1,icon:"i-lucide-folder-lock",color:"neutral",variant:"ghost",size:"sm",title:"Project access","aria-label":"Project access",onClick:de=>He(t.original)},null,8,["onClick"])):k("",!0),Ne(t.original)?(i(),w(v,{key:2,icon:"i-lucide-key",color:"neutral",variant:"ghost",size:"sm",title:"Manage API keys","aria-label":"Manage API keys",onClick:de=>Ee(t.original)},null,8,["onClick"])):k("",!0),e(q)?(i(),w(v,{key:3,icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",title:"Delete user","aria-label":"Delete user",onClick:de=>me(t.original)},null,8,["onClick"])):k("",!0)])]),_:1},8,["data"])]),_:1})]),_:1},8,["count"])):(i(),w(xe,{key:2,title:"Users",count:0,help:"settings.users"},{default:o(()=>[d("div",yt,[d("div",bt,[s(ye,{name:"i-lucide-users",class:"text-4xl text-muted"})]),a[21]||(a[21]=d("h3",{class:"text-lg font-semibold mb-2"},"No users yet",-1)),a[22]||(a[22]=d("p",{class:"text-muted mb-4"},"Create your first user to get started with authentication",-1)),e(q)?(i(),w(v,{key:0,label:"Add user",icon:"i-lucide-user-plus",onClick:a[1]||(a[1]=t=>$.value=!0)})):k("",!0)])]),_:1}))]),s(se,null,{default:o(()=>[s(te,{open:e($),title:"Add new user","onUpdate:open":a[8]||(a[8]=t=>$.value=t)},{body:o(()=>[s(ea,{schema:e(m),state:e(c),class:"space-y-5"},{default:o(()=>[s(F,{label:"Username",name:"username",required:""},{default:o(()=>[s(Z,{modelValue:e(c).username,"onUpdate:modelValue":a[2]||(a[2]=t=>e(c).username=t),placeholder:"Enter username",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Password",name:"password",description:"Leave blank to let the user set their own password via invite email"},{default:o(()=>[s(Z,{modelValue:e(c).password,"onUpdate:modelValue":a[3]||(a[3]=t=>e(c).password=t),type:"password",placeholder:"Leave blank to send invite",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Display name",name:"name"},{default:o(()=>[s(Z,{modelValue:e(c).name,"onUpdate:modelValue":a[4]||(a[4]=t=>e(c).name=t),placeholder:"Enter display name (optional)",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Email",name:"email",description:"Optional — needed for invites and notifications"},{default:o(()=>[s(Z,{modelValue:e(c).email,"onUpdate:modelValue":a[5]||(a[5]=t=>e(c).email=t),type:"email",placeholder:"user@example.com (optional)",class:"w-full"},null,8,["modelValue"])]),_:1}),s(F,{label:"Role",name:"role",required:""},{default:o(()=>[s(Qe,{modelValue:e(c).role,"onUpdate:modelValue":a[6]||(a[6]=t=>e(c).role=t),items:O,class:"w-full"},null,8,["modelValue"])]),_:1})]),_:1},8,["schema","state"])]),footer:o(()=>[d("div",ht,[s(v,{type:"button",color:"neutral",variant:"ghost",label:"Cancel",onClick:a[7]||(a[7]=t=>$.value=!1)}),s(v,{type:"submit",label:"Create user",icon:"i-lucide-user-plus",onClick:j})])]),_:1},8,["open"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(T),title:`API keys – ${e(n)?.username}`,size:"xl","onUpdate:open":a[12]||(a[12]=t=>{T.value=t,t||Ce()})},{title:o(()=>[d("span",gt,[V(" API keys – "+_(e(n)?.username)+" ",1),s(Ae,{topic:"settings.api-keys"})])]),body:o(()=>[d("div",_t,[a[26]||(a[26]=d("p",{class:"text-sm text-muted"},[V(" API keys allow the Playwright reporter (and other CI tools) to submit test results without a username/password login. Each key is shown "),d("strong",null,"only once"),V(" at creation time — store it in a CI secret immediately. ")],-1)),e(L)?(i(),y("div",kt,[e(E)?(i(),y("div",wt,[s(U,{icon:"i-lucide-triangle-alert",color:"warning",variant:"subtle",title:"Save your API key now",description:"This key will never be shown again. Copy it and store it in your CI secret manager immediately."}),d("div",Ct,_(e(E)),1),d("div",xt,[s(v,{label:"Copy to clipboard",icon:"i-lucide-clipboard",color:"primary",size:"sm",onClick:Me}),s(v,{label:"Done",variant:"ghost",size:"sm",onClick:Oe})]),d("div",null,[a[23]||(a[23]=d("p",{class:"text-xs font-semibold uppercase tracking-wide text-muted mb-2"}," Use it in your reporter config ",-1)),s(aa,{code:e(Fe),lang:"typescript"},null,8,["code"])])])):(i(),y("div",At,[a[24]||(a[24]=d("h4",{class:"font-medium text-sm"},"Create new API key",-1)),s(F,{label:"Key name",name:"name",required:""},{default:o(()=>[s(Z,{modelValue:e(N),"onUpdate:modelValue":a[9]||(a[9]=t=>he(N)?N.value=t:null),placeholder:"e.g. GitHub Actions CI",size:"sm"},null,8,["modelValue"])]),_:1}),s(F,{label:"Expires at (optional)",name:"expiresAt"},{default:o(()=>[s(Z,{modelValue:e(H),"onUpdate:modelValue":a[10]||(a[10]=t=>he(H)?H.value=t:null),type:"date",size:"sm",min:new Date().toISOString().split("T")[0]},null,8,["modelValue","min"])]),_:1}),d("div",qt,[s(v,{label:"Generate key",icon:"i-lucide-key",size:"sm",disabled:!e(N).trim(),onClick:Ge},null,8,["disabled"]),s(v,{color:"neutral",variant:"ghost",label:"Cancel",size:"sm",onClick:Ce})])]))])):k("",!0),e(ie).length>0?(i(),y("div",$t,[(i(!0),y(re,null,je(e(ie),t=>(i(),y("div",{key:t.id,class:"flex items-center justify-between rounded-lg border border-default px-4 py-3"},[d("div",Ut,[d("div",It,[s(ye,{name:"i-lucide-key",class:"text-muted shrink-0"}),d("span",Vt,_(t.name),1)]),d("div",Rt,[d("span",null,[a[25]||(a[25]=V("Prefix: ",-1)),d("code",zt,"pd_"+_(t.keyPrefix)+"…",1)]),d("span",null,"Created: "+_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.createdAt,{dateOnly:!0})),1),t.lastUsedAt?(i(),y("span",Pt,"Last used: "+_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.lastUsedAt,{dateOnly:!0})),1)):(i(),y("span",jt,"Never used")),t.expiresAt?(i(),y("span",{key:2,class:D(new Date(t.expiresAt)<new Date?"text-error":"")}," Expires: "+_(("prettyDateFormat"in r?r.prettyDateFormat:e(ce))(t.expiresAt,{dateOnly:!0})),3)):k("",!0)])]),s(v,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm",title:"Revoke key",onClick:de=>Te(t)},null,8,["onClick"])]))),128))])):e(L)?k("",!0):(i(),y("div",St," No API keys yet. Create one to allow CI access. "))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Close",onClick:a[11]||(a[11]=t=>T.value=!1)}),e(L)?k("",!0):(i(),w(v,{key:0,label:"Create API key",icon:"i-lucide-plus",onClick:Be}))]),_:1},8,["open","title"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(B),title:"Delete user","onUpdate:open":a[14]||(a[14]=t=>B.value=t)},{body:o(()=>[d("p",null,[a[27]||(a[27]=V(" Are you sure you want to delete user ",-1)),d("strong",null,_(e(f)?.username),1),a[28]||(a[28]=V("? This action cannot be undone. ",-1))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[13]||(a[13]=t=>B.value=!1)}),s(v,{color:"error",label:"Delete user",icon:"i-lucide-trash-2",onClick:fe})]),_:1},8,["open"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(Q),title:"Revoke API key","onUpdate:open":a[16]||(a[16]=t=>Q.value=t)},{body:o(()=>[d("p",null,[a[29]||(a[29]=V(" Revoke API key ",-1)),d("strong",null,'"'+_(e(ee)?.name)+'"',1),a[30]||(a[30]=V("? Any CI pipeline using it will stop working immediately. ",-1))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[15]||(a[15]=t=>Q.value=!1)}),s(v,{color:"error",label:"Revoke",icon:"i-lucide-trash-2",onClick:Le})]),_:1},8,["open"])]),_:1}),s(se,null,{default:o(()=>[s(te,{open:e(ae),title:`Project access – ${e(ne)?.username}`,size:"xl","onUpdate:open":a[20]||(a[20]=t=>ae.value=t)},{title:o(()=>[d("span",Kt,[V(" Project access – "+_(e(ne)?.username)+" ",1),s(Ae,{topic:"project.members"})])]),body:o(()=>[d("div",Dt,[a[31]||(a[31]=d("p",{class:"text-sm text-muted"}," Control which projects this user can access. Users without any project access will see no projects. ",-1)),s(ta,{"model-value":e(W)?"global":"specific",items:[{value:"global",label:"Global access",description:"Access to all projects (current and future)"},{value:"specific",label:"Specific projects",description:"Access only to selected projects"}],"onUpdate:modelValue":a[17]||(a[17]=t=>W.value=t==="global")},null,8,["model-value"]),e(W)?k("",!0):(i(),y(re,{key:0},[s(sa),s(F,{label:"Specific projects",description:`Select from ${e(X).length>0?e(X).length:"0"} available projects`},{default:o(()=>[s(la,{modelValue:e(Y),"onUpdate:modelValue":a[18]||(a[18]=t=>he(Y)?Y.value=t:null),items:e(X),by:"id",multiple:"",searchable:"",class:"w-full",placeholder:"Search and select projects…"},{default:o(({modelValue:t})=>[t.length===0?(i(),y("span",Et,"Select projects…")):(i(),y("span",Ft,_(t.length)+" project(s) selected",1))]),_:1},8,["modelValue","items"])]),_:1},8,["description"])],64))])]),footer:o(()=>[s(v,{color:"neutral",variant:"ghost",label:"Cancel",onClick:a[19]||(a[19]=t=>ae.value=!1)}),s(v,{label:"Save",icon:"i-lucide-check",onClick:We})]),_:1},8,["open","title"])]),_:1})],64)}}});export{us as default};
@@ -0,0 +1 @@
1
+ import{d as c,o as n,c as o,F as l,y as m,f as p,g as f,m as _,t as u,k as t,v as g,A as d,_ as h}from"./NQikbhmK.js";import{y,n as k}from"./CDk0q2hV.js";import{f as x}from"./D-c8ZSws.js";const R={key:0,class:"flex flex-wrap gap-1"},b=c({__name:"RunReports",props:{reports:{}},setup(a){const r=d();return(s,B)=>{const i=h;return a.reports?.length?(n(),o("div",R,[(n(!0),o(l,null,m(a.reports,e=>(n(),p(i,{key:`${e.type}-${e.path}`,href:t(k)(e.path,null,t(r).app?.baseURL),icon:("reportIcon"in s?s.reportIcon:t(y))(e.type),title:e.size?t(x)(e.size):e.label,target:"_blank",size:"xs",variant:"outline"},{default:f(()=>[_(u(e.label),1)]),_:2},1032,["href","icon","title"]))),128))])):g("",!0)}}}),I=Object.assign(b,{__name:"RunReports"});export{I as _};
@@ -1 +1 @@
1
- import{aM as Z,Y as ee,d as B,W as Ie,b6 as G,bX as Se,ay as qe,X as fe,B as Le,o as w,f as L,g as K,T as D,k as n,q as pe,G as z,V as P,bb as ve,r as S,bc as J,b7 as Ke,bU as Ve,bT as me,j as he,Q as O,H as ge,c7 as Te,C as He,ab as Be,h as H,bp as Re,az as ye,U as te,S as be,bq as De,aK as Pe,a0 as Me,c8 as Ne,c9 as ze,bj as Oe,ca as $e,c as re,F as ue,y as Ge,ae as Ue,O as We,cb as je,aG as Xe}from"./DHltYerF.js";import{u as Ye}from"./qH_j2A3a.js";import{V as Qe}from"./CcXaak_K.js";import{u as Je}from"./BFP6M-20.js";function $(o,a,i){const t=o.findIndex(v=>Z(v,a)),p=o.findIndex(v=>Z(v,i));if(t===-1||p===-1)return[];const[d,g]=[t,p].sort((v,m)=>v-m);return o.slice(d,g+1)}function Ze(){return{ALT:"Alt",ARROW_DOWN:"ArrowDown",ARROW_LEFT:"ArrowLeft",ARROW_RIGHT:"ArrowRight",ARROW_UP:"ArrowUp",BACKSPACE:"Backspace",CAPS_LOCK:"CapsLock",CONTROL:"Control",DELETE:"Delete",END:"End",ENTER:"Enter",ESCAPE:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",HOME:"Home",META:"Meta",PAGE_DOWN:"PageDown",PAGE_UP:"PageUp",SHIFT:"Shift",SPACE:" ",TAB:"Tab",CTRL:"Control",ASTERISK:"*",SPACE_CODE:"Space"}}function de(o){return o?.querySelector("[data-state=checked]")}function et(o,a,i){return o===void 0?!1:Array.isArray(o)?o.some(t=>q(t,a,i)):q(o,a,i)}function q(o,a,i){return o===void 0||a===void 0?!1:typeof o=="string"?o===a:typeof i=="function"?i(o,a):typeof i=="string"?o?.[i]===a?.[i]:Z(o,a)}const[U,tt]=ee("ListboxRoot");var at=B({__name:"ListboxRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},multiple:{type:Boolean,required:!1},orientation:{type:String,required:!1,default:"vertical"},dir:{type:String,required:!1},disabled:{type:Boolean,required:!1},selectionBehavior:{type:String,required:!1,default:"toggle"},highlightOnHover:{type:Boolean,required:!1},by:{type:[String,Function],required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","highlight","entryFocus","leave"],setup(o,{expose:a,emit:i}){const t=o,p=i,{multiple:d,highlightOnHover:g,orientation:v,disabled:m,selectionBehavior:k,dir:E}=Ie(t),{getItems:x}=G({isProvider:!0}),{handleTypeaheadSearch:l}=Se(),{primitiveElement:u,currentElement:c}=ve(),r=Ze(),_=qe(E),h=Ye(c),A=S(),V=S(!1),T=S(!0),y=fe(t,"modelValue",p,{defaultValue:t.defaultValue??(d.value?[]:void 0),passive:t.modelValue===void 0,deep:!0});function xe(e){if(V.value=!0,t.multiple){const s=Array.isArray(y.value)?[...y.value]:[],f=s.findIndex(b=>q(b,e,t.by));t.selectionBehavior==="toggle"?(f===-1?s.push(e):s.splice(f,1),y.value=s):(y.value=[e],A.value=e)}else t.selectionBehavior==="toggle"&&q(y.value,e,t.by)?y.value=void 0:y.value=e;setTimeout(()=>{V.value=!1},1)}const C=S(null),W=S(null),R=S(!1),j=S(!1),ae=J(),X=J(),ie=J();function Y(){return x().map(e=>e.ref).filter(e=>e.dataset.disabled!=="")}function I(e,s=!0,f){if(!e)return;C.value=e,(f??T.value)&&C.value.focus(),s&&C.value.scrollIntoView({block:"nearest"});const b=x().find(F=>F.ref===e);p("highlight",b)}function _e(e){if(R.value)ie.trigger(e);else{const s=x().find(f=>q(f.value,e,t.by));s&&(C.value=s.ref,I(s.ref))}}function Ce(e){if(C.value&&C.value.isConnected){if(e.ctrlKey||e.metaKey||e.altKey)return;e.preventDefault(),e.stopPropagation(),j.value||C.value.click()}}function Ee(e){if(T.value){if(V.value=!0,R.value)X.trigger(e);else{const s=e.altKey||e.ctrlKey||e.metaKey;if(s&&e.key==="a"&&d.value){const f=x(),b=f.map(M=>M.value);y.value=[...b],e.preventDefault();const F=f.at(-1);F&&I(F.ref)}else if(!s){const f=l(e.key,x());f&&I(f)}}setTimeout(()=>{V.value=!1},1)}}function Fe(){j.value=!0}function ke(){z(()=>{j.value=!1})}function ne(){z(()=>{const e=new KeyboardEvent("keydown",{key:"PageUp"});oe(e)})}function Q(e){const s=C.value;s?.isConnected&&(W.value=s),C.value=null,p("leave",e)}function Ae(e){const s=new CustomEvent("listbox.entryFocus",{bubbles:!1,cancelable:!0});if(e.currentTarget?.dispatchEvent(s),p("entryFocus",s),!s.defaultPrevented)if(W.value)I(W.value);else{const f=Y()?.[0];I(f)}}function oe(e){const s=Ke(e,v.value,_.value);if(!s)return;let f=Y();if(C.value){if(s==="last")f.reverse();else if(s==="prev"||s==="next"){s==="prev"&&f.reverse();const b=f.indexOf(C.value);f=f.slice(b+1)}we(e,f[0])}if(f.length){const b=!C.value&&s==="prev"?f.length-1:0;I(f[b])}if(R.value)return X.trigger(e)}function we(e,s){if(!(R.value||t.selectionBehavior!=="replace"||!d.value||!Array.isArray(y.value)||(e.altKey||e.ctrlKey||e.metaKey)&&!e.shiftKey)&&e.shiftKey){const b=x().filter(N=>N.ref.dataset.disabled!=="");let F=b.find(N=>N.ref===s)?.value;if(e.key===r.END?F=b.at(-1)?.value:e.key===r.HOME&&(F=b[0]?.value),!F||!A.value)return;const M=$(b.map(N=>N.value),A.value,F);y.value=M}}async function le(e,s=!0){if(Ve)if(await z(),R.value)ae.trigger({event:e,scroll:s});else{const f=Y(),b=f.find(M=>M.dataset.state==="checked"),F=s?void 0:!1;b?I(b,s,F):f.length&&I(f[0],s,F)}}let se=!1;return Le(y,()=>{if(!V.value){const e=se;se=!0,z(()=>{le(void 0,e)})}},{immediate:!0,deep:!0}),a({highlightedElement:C,highlightItem:_e,highlightFirstItem:ne,highlightSelected:le,getItems:x}),tt({modelValue:y,onValueChange:xe,multiple:d,orientation:v,dir:_,disabled:m,highlightOnHover:g,highlightedElement:C,isVirtual:R,virtualFocusHook:ae,virtualKeydownHook:X,virtualHighlightHook:ie,by:t.by,firstValue:A,selectionBehavior:k,focusable:T,onLeave:Q,onEnter:Ae,changeHighlight:I,onKeydownEnter:Ce,onKeydownNavigation:oe,onKeydownTypeAhead:Ee,onCompositionStart:Fe,onCompositionEnd:ke,highlightFirstItem:ne}),(e,s)=>(w(),L(n(P),{ref_key:"primitiveElement",ref:u,as:e.as,"as-child":e.asChild,dir:n(_),"data-disabled":n(m)?"":void 0,onPointerleave:Q,onFocusout:s[0]||(s[0]=async f=>{const b=f.relatedTarget||f.target;await z(),C.value&&n(c)&&!n(c).contains(b)&&Q(f)})},{default:K(()=>[D(e.$slots,"default",{modelValue:n(y)}),n(h)&&e.name?(w(),L(n(Qe),{key:0,name:e.name,value:n(y),disabled:n(m),required:e.required},null,8,["name","value","disabled","required"])):pe("v-if",!0)]),_:3},8,["as","as-child","dir","data-disabled"]))}}),yt=at,it=B({__name:"ListboxContent",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(o){const{CollectionSlot:a}=G(),i=U(),t=me(!1,10);return(p,d)=>(w(),L(n(a),null,{default:K(()=>[he(n(P),{role:"listbox",as:p.as,"as-child":p.asChild,tabindex:n(i).focusable.value?n(i).highlightedElement.value?"-1":"0":"-1","aria-orientation":n(i).orientation.value,"aria-multiselectable":!!n(i).multiple.value,"data-orientation":n(i).orientation.value,onMousedown:d[0]||(d[0]=ge(g=>t.value=!0,["left"])),onFocus:d[1]||(d[1]=g=>{n(t)||n(i).onEnter(g)}),onKeydown:[d[2]||(d[2]=O(g=>{n(i).orientation.value==="vertical"&&(g.key==="ArrowLeft"||g.key==="ArrowRight")||n(i).orientation.value==="horizontal"&&(g.key==="ArrowUp"||g.key==="ArrowDown")||(g.preventDefault(),n(i).focusable.value&&n(i).onKeydownNavigation(g))},["down","up","left","right","home","end"])),O(n(i).onKeydownEnter,["enter"]),n(i).onKeydownTypeAhead]},{default:K(()=>[D(p.$slots,"default")]),_:3},8,["as","as-child","tabindex","aria-orientation","aria-multiselectable","data-orientation","onKeydown"])]),_:3}))}}),bt=it,nt=B({__name:"ListboxFilter",props:{modelValue:{type:String,required:!1},autoFocus:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"input"}},emits:["update:modelValue"],setup(o,{emit:a}){const i=o,p=fe(i,"modelValue",a,{defaultValue:"",passive:i.modelValue===void 0}),d=U(),{primitiveElement:g,currentElement:v}=ve(),m=H(()=>i.disabled||d.disabled.value||!1),k=S();Te(()=>k.value=d.highlightedElement.value?.id),He(()=>{d.focusable.value=!1,setTimeout(()=>{i.autoFocus&&v.value?.focus()},1)}),Be(()=>{d.focusable.value=!0});const{isComposing:E,handleCompositionStart:x,handleCompositionEnd:l}=Re(h=>{p.value=h.target.value,d.onCompositionEnd(),d.highlightFirstItem()});function u(){d.onCompositionStart(),x()}function c(h){E.value||(p.value=h.target.value,d.highlightFirstItem())}function r(h){E.value||(h.preventDefault(),d.onKeydownNavigation(h))}function _(h){E.value||d.onKeydownEnter(h)}return(h,A)=>(w(),L(n(P),{ref_key:"primitiveElement",ref:g,as:h.as,"as-child":h.asChild,value:n(p),disabled:m.value?"":void 0,"data-disabled":m.value?"":void 0,"aria-disabled":m.value??void 0,"aria-activedescendant":k.value,type:"text",onKeydown:[O(r,["down","up","home","end"]),O(_,["enter"])],onInput:c,onCompositionstart:u,onCompositionend:n(l)},{default:K(()=>[D(h.$slots,"default",{modelValue:n(p)})]),_:3},8,["as","as-child","value","disabled","data-disabled","aria-disabled","aria-activedescendant","onCompositionend"]))}}),xt=nt;const[_t,ot]=ee("ListboxGroup");var lt=B({__name:"ListboxGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(o){const a=o,i=ye(void 0,"reka-listbox-group");return ot({id:i}),(t,p)=>(w(),L(n(P),te({role:"group"},a,{"aria-labelledby":n(i)}),{default:K(()=>[D(t.$slots,"default")]),_:3},16,["aria-labelledby"]))}}),Ct=lt;const st="listbox.select",[rt,ut]=ee("ListboxItem");var dt=B({__name:"ListboxItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},emits:["select"],setup(o,{emit:a}){const i=o,t=a,p=ye(void 0,"reka-listbox-item"),{CollectionItem:d}=G(),{forwardRef:g,currentElement:v}=be(),m=U(),k=H(()=>v.value!=null&&v.value===m.highlightedElement.value),E=H(()=>et(m.modelValue.value,i.value,m.by)),x=H(()=>m.disabled.value||i.disabled);async function l(c){t("select",c),!c?.defaultPrevented&&!x.value&&c&&(m.onValueChange(i.value),m.changeHighlight(v.value))}function u(c){const r={originalEvent:c,value:i.value};Pe(st,l,r)}return ut({isSelected:E}),(c,r)=>(w(),L(n(d),{value:c.value},{default:K(()=>[De([k.value,E.value,x.value,n(m).focusable.value],()=>he(n(P),te({id:n(p)},c.$attrs,{ref:n(g),role:"option",tabindex:n(m).focusable.value?k.value?"0":"-1":-1,"aria-selected":E.value,as:c.as,"as-child":c.asChild,disabled:x.value?"":void 0,"data-disabled":x.value?"":void 0,"data-highlighted":k.value?"":void 0,"data-state":E.value?"checked":"unchecked",onClick:u,onKeydown:O(ge(u,["prevent"]),["space"]),onPointermove:r[0]||(r[0]=()=>{n(m).highlightedElement.value!==n(v)&&n(m).highlightOnHover.value&&n(m).changeHighlight(n(v),!1,!1)})}),{default:K(()=>[D(c.$slots,"default")]),_:3},16,["id","tabindex","aria-selected","as","as-child","disabled","data-disabled","data-highlighted","data-state","onKeydown"]),r,1)]),_:3},8,["value"]))}}),Et=dt,ct=B({__name:"ListboxItemIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(o){const a=o;be();const i=rt();return(t,p)=>n(i).isSelected.value?(w(),L(n(P),te({key:0,"aria-hidden":"true"},a),{default:K(()=>[D(t.$slots,"default")]),_:3},16)):pe("v-if",!0)}}),Ft=ct,ft=B({__name:"ListboxVirtualizer",props:{options:{type:Array,required:!0},overscan:{type:Number,required:!1},estimateSize:{type:[Number,Function],required:!1},textContent:{type:Function,required:!1}},setup(o){const a=o,i=Me(),t=U(),p=Ne(),{getItems:d}=G();t.isVirtual.value=!0;const g=H(()=>{const l=p.value;if(l){const u=window.getComputedStyle(l);return{start:Number.parseFloat(u.paddingBlockStart||u.paddingTop),end:Number.parseFloat(u.paddingBlockEnd||u.paddingBottom)}}else return{start:0,end:0}}),v=Je({get scrollPaddingStart(){return g.value.start},get scrollPaddingEnd(){return g.value.end},get count(){return a.options.length},get horizontal(){return t.orientation.value==="horizontal"},estimateSize(l){return typeof a.estimateSize=="function"?a.estimateSize(l):a.estimateSize??28},getScrollElement(){return p.value},overscan:a.overscan??12}),m=H(()=>v.value.getVirtualItems().map(l=>{const u=i.default({option:a.options[l.index],virtualizer:v.value,virtualItem:l})[0],c=u.type===ue&&Array.isArray(u.children)?u.children.find(r=>typeof r.type!="symbol"):u;return{item:l,is:je(c,{key:`${l.key}`,"data-index":l.index,"aria-setsize":a.options.length,"aria-posinset":l.index+1,style:{position:"absolute",top:0,left:0,transform:`translateY(${l.start}px)`,overflowAnchor:"none"}})}}));t.virtualFocusHook.on(({event:l,scroll:u})=>{const c=a.options.findIndex(r=>Array.isArray(t.modelValue.value)?q(r,t.modelValue.value[0],t.by):q(r,t.modelValue.value,t.by));c!==-1?(l?.preventDefault(),v.value.scrollToIndex(c,{align:"start"}),requestAnimationFrame(()=>{const r=de(p.value);r&&(t.changeHighlight(r,u,u?void 0:!1),l&&r?.focus())})):u?t.highlightFirstItem():requestAnimationFrame(()=>{const r=d().find(_=>_.ref.dataset.disabled!=="")?.ref;r&&t.changeHighlight(r,!1,!1)})}),t.virtualHighlightHook.on(l=>{const u=a.options.findIndex(c=>q(c,l,t.by));v.value.scrollToIndex(u,{align:"start"}),requestAnimationFrame(()=>{const c=de(p.value);c&&t.changeHighlight(c)})});const k=me("",1e3),E=H(()=>{const l=u=>a.textContent?a.textContent(u):u?.toString().toLowerCase();return a.options.map((u,c)=>({index:c,textContent:l(u)}))});function x(l,u){if(!t.firstValue?.value||!t.multiple.value||!Array.isArray(t.modelValue.value))return;const r=d().filter(h=>h.ref.dataset.disabled!=="").find(h=>h.ref===t.highlightedElement.value)?.value;if(!r)return;let _=null;switch(u){case"prev":case"next":{_=$(a.options,t.firstValue.value,r);break}case"first":{_=$(a.options,t.firstValue.value,a.options?.[0]);break}case"last":{_=$(a.options,t.firstValue.value,a.options.at(-1));break}}t.modelValue.value=_}return t.virtualKeydownHook.on(l=>{const u=l.altKey||l.ctrlKey||l.metaKey;if(l.key==="Tab"&&!u)return;let r=ze[l.key];if(u&&l.key==="a"&&t.multiple.value?(l.preventDefault(),t.modelValue.value=[...a.options],r="last"):l.shiftKey&&r&&x(l,r),["first","last"].includes(r)){l.preventDefault();const _=r==="first"?0:a.options.length-1;v.value.scrollToIndex(_),requestAnimationFrame(()=>{const h=d(),A=r==="first"?h[0]:h.at(-1);A&&t.changeHighlight(A.ref)})}else if(!r&&!u){k.value+=l.key;const _=Number(Oe()?.getAttribute("data-index")),h=E.value[_].textContent,A=E.value.map(y=>y.textContent??""),V=$e(A,k.value,h),T=E.value.find(y=>y.textContent===V);T&&(v.value.scrollToIndex(T.index,{align:"start"}),requestAnimationFrame(()=>{const y=p.value.querySelector(`[data-index="${T.index}"]`);y instanceof HTMLElement&&t.changeHighlight(y)}))}}),(l,u)=>(w(),re("div",{"data-reka-virtualizer":"",style:We({position:"relative",width:"100%",height:`${n(v).getTotalSize()}px`})},[(w(!0),re(ue,null,Ge(m.value,({is:c,item:r})=>(w(),L(Ue(c),{key:r.index}))),128))],4))}}),kt=ft;function pt(o,a){if(typeof o!="object"||o===null)return!1;const i=Xe(o,a);return i!=null&&i!==""}function ce(o,a){return a?{xs:44,sm:48,md:52,lg:56,xl:60}[o]:{xs:24,sm:28,md:32,lg:36,xl:40}[o]}function At(o,a,i,t){const p=ce(a,!0),d=ce(a,!1);return t?()=>p:i?g=>pt(o[g],i)?p:d:()=>d}export{yt as L,bt as a,Ct as b,xt as c,Et as d,Ft as e,kt as f,At as g,_t as h,U as i};
1
+ import{aM as J,$ as ee,d as B,Y as Ie,b6 as U,bX as Se,az as qe,Z as fe,H as Ke,o as w,f as K,g as L,V as D,k as n,v as ve,K as z,X as P,bb as pe,r as S,bc as Z,b7 as Le,bU as Ve,bT as me,j as he,S as O,C as ge,c7 as Te,B as He,ad as Be,h as H,bp as Re,aA as ye,W as te,U as be,bq as De,aK as Pe,a2 as Me,c8 as Ne,c9 as ze,bj as Oe,ca as $e,c as re,F as ue,y as Ue,ag as We,Q as Ge,cb as je,aH as Xe}from"./NQikbhmK.js";import{u as Ye}from"./g26aVPxc.js";import{V as Qe}from"./BYDaY0Z7.js";import{u as Ze}from"./FUXhyidq.js";function $(o,a,i){const t=o.findIndex(p=>J(p,a)),v=o.findIndex(p=>J(p,i));if(t===-1||v===-1)return[];const[d,g]=[t,v].sort((p,m)=>p-m);return o.slice(d,g+1)}function Je(){return{ALT:"Alt",ARROW_DOWN:"ArrowDown",ARROW_LEFT:"ArrowLeft",ARROW_RIGHT:"ArrowRight",ARROW_UP:"ArrowUp",BACKSPACE:"Backspace",CAPS_LOCK:"CapsLock",CONTROL:"Control",DELETE:"Delete",END:"End",ENTER:"Enter",ESCAPE:"Escape",F1:"F1",F10:"F10",F11:"F11",F12:"F12",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",HOME:"Home",META:"Meta",PAGE_DOWN:"PageDown",PAGE_UP:"PageUp",SHIFT:"Shift",SPACE:" ",TAB:"Tab",CTRL:"Control",ASTERISK:"*",SPACE_CODE:"Space"}}function de(o){return o?.querySelector("[data-state=checked]")}function et(o,a,i){return o===void 0?!1:Array.isArray(o)?o.some(t=>q(t,a,i)):q(o,a,i)}function q(o,a,i){return o===void 0||a===void 0?!1:typeof o=="string"?o===a:typeof i=="function"?i(o,a):typeof i=="string"?o?.[i]===a?.[i]:J(o,a)}const[W,tt]=ee("ListboxRoot");var at=B({__name:"ListboxRoot",props:{modelValue:{type:null,required:!1},defaultValue:{type:null,required:!1},multiple:{type:Boolean,required:!1},orientation:{type:String,required:!1,default:"vertical"},dir:{type:String,required:!1},disabled:{type:Boolean,required:!1},selectionBehavior:{type:String,required:!1,default:"toggle"},highlightOnHover:{type:Boolean,required:!1},by:{type:[String,Function],required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:["update:modelValue","highlight","entryFocus","leave"],setup(o,{expose:a,emit:i}){const t=o,v=i,{multiple:d,highlightOnHover:g,orientation:p,disabled:m,selectionBehavior:A,dir:E}=Ie(t),{getItems:x}=U({isProvider:!0}),{handleTypeaheadSearch:l}=Se(),{primitiveElement:u,currentElement:c}=pe(),r=Je(),_=qe(E),h=Ye(c),k=S(),V=S(!1),T=S(!0),y=fe(t,"modelValue",v,{defaultValue:t.defaultValue??(d.value?[]:void 0),passive:t.modelValue===void 0,deep:!0});function xe(e){if(V.value=!0,t.multiple){const s=Array.isArray(y.value)?[...y.value]:[],f=s.findIndex(b=>q(b,e,t.by));t.selectionBehavior==="toggle"?(f===-1?s.push(e):s.splice(f,1),y.value=s):(y.value=[e],k.value=e)}else t.selectionBehavior==="toggle"&&q(y.value,e,t.by)?y.value=void 0:y.value=e;setTimeout(()=>{V.value=!1},1)}const C=S(null),G=S(null),R=S(!1),j=S(!1),ae=Z(),X=Z(),ie=Z();function Y(){return x().map(e=>e.ref).filter(e=>e.dataset.disabled!=="")}function I(e,s=!0,f){if(!e)return;C.value=e,(f??T.value)&&C.value.focus(),s&&C.value.scrollIntoView({block:"nearest"});const b=x().find(F=>F.ref===e);v("highlight",b)}function _e(e){if(R.value)ie.trigger(e);else{const s=x().find(f=>q(f.value,e,t.by));s&&(C.value=s.ref,I(s.ref))}}function Ce(e){if(C.value&&C.value.isConnected){if(e.ctrlKey||e.metaKey||e.altKey)return;e.preventDefault(),e.stopPropagation(),j.value||C.value.click()}}function Ee(e){if(T.value){if(V.value=!0,R.value)X.trigger(e);else{const s=e.altKey||e.ctrlKey||e.metaKey;if(s&&e.key==="a"&&d.value){const f=x(),b=f.map(M=>M.value);y.value=[...b],e.preventDefault();const F=f.at(-1);F&&I(F.ref)}else if(!s){const f=l(e.key,x());f&&I(f)}}setTimeout(()=>{V.value=!1},1)}}function Fe(){j.value=!0}function Ae(){z(()=>{j.value=!1})}function ne(){z(()=>{const e=new KeyboardEvent("keydown",{key:"PageUp"});oe(e)})}function Q(e){const s=C.value;s?.isConnected&&(G.value=s),C.value=null,v("leave",e)}function ke(e){const s=new CustomEvent("listbox.entryFocus",{bubbles:!1,cancelable:!0});if(e.currentTarget?.dispatchEvent(s),v("entryFocus",s),!s.defaultPrevented)if(G.value)I(G.value);else{const f=Y()?.[0];I(f)}}function oe(e){const s=Le(e,p.value,_.value);if(!s)return;let f=Y();if(C.value){if(s==="last")f.reverse();else if(s==="prev"||s==="next"){s==="prev"&&f.reverse();const b=f.indexOf(C.value);f=f.slice(b+1)}we(e,f[0])}if(f.length){const b=!C.value&&s==="prev"?f.length-1:0;I(f[b])}if(R.value)return X.trigger(e)}function we(e,s){if(!(R.value||t.selectionBehavior!=="replace"||!d.value||!Array.isArray(y.value)||(e.altKey||e.ctrlKey||e.metaKey)&&!e.shiftKey)&&e.shiftKey){const b=x().filter(N=>N.ref.dataset.disabled!=="");let F=b.find(N=>N.ref===s)?.value;if(e.key===r.END?F=b.at(-1)?.value:e.key===r.HOME&&(F=b[0]?.value),!F||!k.value)return;const M=$(b.map(N=>N.value),k.value,F);y.value=M}}async function le(e,s=!0){if(Ve)if(await z(),R.value)ae.trigger({event:e,scroll:s});else{const f=Y(),b=f.find(M=>M.dataset.state==="checked"),F=s?void 0:!1;b?I(b,s,F):f.length&&I(f[0],s,F)}}let se=!1;return Ke(y,()=>{if(!V.value){const e=se;se=!0,z(()=>{le(void 0,e)})}},{immediate:!0,deep:!0}),a({highlightedElement:C,highlightItem:_e,highlightFirstItem:ne,highlightSelected:le,getItems:x}),tt({modelValue:y,onValueChange:xe,multiple:d,orientation:p,dir:_,disabled:m,highlightOnHover:g,highlightedElement:C,isVirtual:R,virtualFocusHook:ae,virtualKeydownHook:X,virtualHighlightHook:ie,by:t.by,firstValue:k,selectionBehavior:A,focusable:T,onLeave:Q,onEnter:ke,changeHighlight:I,onKeydownEnter:Ce,onKeydownNavigation:oe,onKeydownTypeAhead:Ee,onCompositionStart:Fe,onCompositionEnd:Ae,highlightFirstItem:ne}),(e,s)=>(w(),K(n(P),{ref_key:"primitiveElement",ref:u,as:e.as,"as-child":e.asChild,dir:n(_),"data-disabled":n(m)?"":void 0,onPointerleave:Q,onFocusout:s[0]||(s[0]=async f=>{const b=f.relatedTarget||f.target;await z(),C.value&&n(c)&&!n(c).contains(b)&&Q(f)})},{default:L(()=>[D(e.$slots,"default",{modelValue:n(y)}),n(h)&&e.name?(w(),K(n(Qe),{key:0,name:e.name,value:n(y),disabled:n(m),required:e.required},null,8,["name","value","disabled","required"])):ve("v-if",!0)]),_:3},8,["as","as-child","dir","data-disabled"]))}}),yt=at,it=B({__name:"ListboxContent",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(o){const{CollectionSlot:a}=U(),i=W(),t=me(!1,10);return(v,d)=>(w(),K(n(a),null,{default:L(()=>[he(n(P),{role:"listbox",as:v.as,"as-child":v.asChild,tabindex:n(i).focusable.value?n(i).highlightedElement.value?"-1":"0":"-1","aria-orientation":n(i).orientation.value,"aria-multiselectable":!!n(i).multiple.value,"data-orientation":n(i).orientation.value,onMousedown:d[0]||(d[0]=ge(g=>t.value=!0,["left"])),onFocus:d[1]||(d[1]=g=>{n(t)||n(i).onEnter(g)}),onKeydown:[d[2]||(d[2]=O(g=>{n(i).orientation.value==="vertical"&&(g.key==="ArrowLeft"||g.key==="ArrowRight")||n(i).orientation.value==="horizontal"&&(g.key==="ArrowUp"||g.key==="ArrowDown")||(g.preventDefault(),n(i).focusable.value&&n(i).onKeydownNavigation(g))},["down","up","left","right","home","end"])),O(n(i).onKeydownEnter,["enter"]),n(i).onKeydownTypeAhead]},{default:L(()=>[D(v.$slots,"default")]),_:3},8,["as","as-child","tabindex","aria-orientation","aria-multiselectable","data-orientation","onKeydown"])]),_:3}))}}),bt=it,nt=B({__name:"ListboxFilter",props:{modelValue:{type:String,required:!1},autoFocus:{type:Boolean,required:!1},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"input"}},emits:["update:modelValue"],setup(o,{emit:a}){const i=o,v=fe(i,"modelValue",a,{defaultValue:"",passive:i.modelValue===void 0}),d=W(),{primitiveElement:g,currentElement:p}=pe(),m=H(()=>i.disabled||d.disabled.value||!1),A=S();Te(()=>A.value=d.highlightedElement.value?.id),He(()=>{d.focusable.value=!1,setTimeout(()=>{i.autoFocus&&p.value?.focus()},1)}),Be(()=>{d.focusable.value=!0});const{isComposing:E,handleCompositionStart:x,handleCompositionEnd:l}=Re(h=>{v.value=h.target.value,d.onCompositionEnd(),d.highlightFirstItem()});function u(){d.onCompositionStart(),x()}function c(h){E.value||(v.value=h.target.value,d.highlightFirstItem())}function r(h){E.value||(h.preventDefault(),d.onKeydownNavigation(h))}function _(h){E.value||d.onKeydownEnter(h)}return(h,k)=>(w(),K(n(P),{ref_key:"primitiveElement",ref:g,as:h.as,"as-child":h.asChild,value:n(v),disabled:m.value?"":void 0,"data-disabled":m.value?"":void 0,"aria-disabled":m.value??void 0,"aria-activedescendant":A.value,type:"text",onKeydown:[O(r,["down","up","home","end"]),O(_,["enter"])],onInput:c,onCompositionstart:u,onCompositionend:n(l)},{default:L(()=>[D(h.$slots,"default",{modelValue:n(v)})]),_:3},8,["as","as-child","value","disabled","data-disabled","aria-disabled","aria-activedescendant","onCompositionend"]))}}),xt=nt;const[_t,ot]=ee("ListboxGroup");var lt=B({__name:"ListboxGroup",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(o){const a=o,i=ye(void 0,"reka-listbox-group");return ot({id:i}),(t,v)=>(w(),K(n(P),te({role:"group"},a,{"aria-labelledby":n(i)}),{default:L(()=>[D(t.$slots,"default")]),_:3},16,["aria-labelledby"]))}}),Ct=lt;const st="listbox.select",[rt,ut]=ee("ListboxItem");var dt=B({__name:"ListboxItem",props:{value:{type:null,required:!0},disabled:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"div"}},emits:["select"],setup(o,{emit:a}){const i=o,t=a,v=ye(void 0,"reka-listbox-item"),{CollectionItem:d}=U(),{forwardRef:g,currentElement:p}=be(),m=W(),A=H(()=>p.value!=null&&p.value===m.highlightedElement.value),E=H(()=>et(m.modelValue.value,i.value,m.by)),x=H(()=>m.disabled.value||i.disabled);async function l(c){t("select",c),!c?.defaultPrevented&&!x.value&&c&&(m.onValueChange(i.value),m.changeHighlight(p.value))}function u(c){const r={originalEvent:c,value:i.value};Pe(st,l,r)}return ut({isSelected:E}),(c,r)=>(w(),K(n(d),{value:c.value},{default:L(()=>[De([A.value,E.value,x.value,n(m).focusable.value],()=>he(n(P),te({id:n(v)},c.$attrs,{ref:n(g),role:"option",tabindex:n(m).focusable.value?A.value?"0":"-1":-1,"aria-selected":E.value,as:c.as,"as-child":c.asChild,disabled:x.value?"":void 0,"data-disabled":x.value?"":void 0,"data-highlighted":A.value?"":void 0,"data-state":E.value?"checked":"unchecked",onClick:u,onKeydown:O(ge(u,["prevent"]),["space"]),onPointermove:r[0]||(r[0]=()=>{n(m).highlightedElement.value!==n(p)&&n(m).highlightOnHover.value&&n(m).changeHighlight(n(p),!1,!1)})}),{default:L(()=>[D(c.$slots,"default")]),_:3},16,["id","tabindex","aria-selected","as","as-child","disabled","data-disabled","data-highlighted","data-state","onKeydown"]),r,1)]),_:3},8,["value"]))}}),Et=dt,ct=B({__name:"ListboxItemIndicator",props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:"span"}},setup(o){const a=o;be();const i=rt();return(t,v)=>n(i).isSelected.value?(w(),K(n(P),te({key:0,"aria-hidden":"true"},a),{default:L(()=>[D(t.$slots,"default")]),_:3},16)):ve("v-if",!0)}}),Ft=ct,ft=B({__name:"ListboxVirtualizer",props:{options:{type:Array,required:!0},overscan:{type:Number,required:!1},estimateSize:{type:[Number,Function],required:!1},textContent:{type:Function,required:!1}},setup(o){const a=o,i=Me(),t=W(),v=Ne(),{getItems:d}=U();t.isVirtual.value=!0;const g=H(()=>{const l=v.value;if(l){const u=window.getComputedStyle(l);return{start:Number.parseFloat(u.paddingBlockStart||u.paddingTop),end:Number.parseFloat(u.paddingBlockEnd||u.paddingBottom)}}else return{start:0,end:0}}),p=Ze({get scrollPaddingStart(){return g.value.start},get scrollPaddingEnd(){return g.value.end},get count(){return a.options.length},get horizontal(){return t.orientation.value==="horizontal"},estimateSize(l){return typeof a.estimateSize=="function"?a.estimateSize(l):a.estimateSize??28},getScrollElement(){return v.value},overscan:a.overscan??12}),m=H(()=>p.value.getVirtualItems().map(l=>{const u=i.default({option:a.options[l.index],virtualizer:p.value,virtualItem:l})[0],c=u.type===ue&&Array.isArray(u.children)?u.children.find(r=>typeof r.type!="symbol"):u;return{item:l,is:je(c,{key:`${l.key}`,"data-index":l.index,"aria-setsize":a.options.length,"aria-posinset":l.index+1,style:{position:"absolute",top:0,left:0,transform:`translateY(${l.start}px)`,overflowAnchor:"none"}})}}));t.virtualFocusHook.on(({event:l,scroll:u})=>{const c=a.options.findIndex(r=>Array.isArray(t.modelValue.value)?q(r,t.modelValue.value[0],t.by):q(r,t.modelValue.value,t.by));c!==-1?(l?.preventDefault(),p.value.scrollToIndex(c,{align:"start"}),requestAnimationFrame(()=>{const r=de(v.value);r&&(t.changeHighlight(r,u,u?void 0:!1),l&&r?.focus())})):u?t.highlightFirstItem():requestAnimationFrame(()=>{const r=d().find(_=>_.ref.dataset.disabled!=="")?.ref;r&&t.changeHighlight(r,!1,!1)})}),t.virtualHighlightHook.on(l=>{const u=a.options.findIndex(c=>q(c,l,t.by));p.value.scrollToIndex(u,{align:"start"}),requestAnimationFrame(()=>{const c=de(v.value);c&&t.changeHighlight(c)})});const A=me("",1e3),E=H(()=>{const l=u=>a.textContent?a.textContent(u):u?.toString().toLowerCase();return a.options.map((u,c)=>({index:c,textContent:l(u)}))});function x(l,u){if(!t.firstValue?.value||!t.multiple.value||!Array.isArray(t.modelValue.value))return;const r=d().filter(h=>h.ref.dataset.disabled!=="").find(h=>h.ref===t.highlightedElement.value)?.value;if(!r)return;let _=null;switch(u){case"prev":case"next":{_=$(a.options,t.firstValue.value,r);break}case"first":{_=$(a.options,t.firstValue.value,a.options?.[0]);break}case"last":{_=$(a.options,t.firstValue.value,a.options.at(-1));break}}t.modelValue.value=_}return t.virtualKeydownHook.on(l=>{const u=l.altKey||l.ctrlKey||l.metaKey;if(l.key==="Tab"&&!u)return;let r=ze[l.key];if(u&&l.key==="a"&&t.multiple.value?(l.preventDefault(),t.modelValue.value=[...a.options],r="last"):l.shiftKey&&r&&x(l,r),["first","last"].includes(r)){l.preventDefault();const _=r==="first"?0:a.options.length-1;p.value.scrollToIndex(_),requestAnimationFrame(()=>{const h=d(),k=r==="first"?h[0]:h.at(-1);k&&t.changeHighlight(k.ref)})}else if(!r&&!u){A.value+=l.key;const _=Number(Oe()?.getAttribute("data-index")),h=E.value[_].textContent,k=E.value.map(y=>y.textContent??""),V=$e(k,A.value,h),T=E.value.find(y=>y.textContent===V);T&&(p.value.scrollToIndex(T.index,{align:"start"}),requestAnimationFrame(()=>{const y=v.value.querySelector(`[data-index="${T.index}"]`);y instanceof HTMLElement&&t.changeHighlight(y)}))}}),(l,u)=>(w(),re("div",{"data-reka-virtualizer":"",style:Ge({position:"relative",width:"100%",height:`${n(p).getTotalSize()}px`})},[(w(!0),re(ue,null,Ue(m.value,({is:c,item:r})=>(w(),K(We(c),{key:r.index}))),128))],4))}}),At=ft;function vt(o,a){if(typeof o!="object"||o===null)return!1;const i=Xe(o,a);return i!=null&&i!==""}function ce(o,a){return a?{xs:44,sm:48,md:52,lg:56,xl:60}[o]:{xs:24,sm:28,md:32,lg:36,xl:40}[o]}function kt(o,a,i,t){const v=ce(a,!0),d=ce(a,!1);return t?()=>v:i?g=>vt(o[g],i)?v:d:()=>d}export{yt as L,bt as a,Ct as b,xt as c,Et as d,Ft as e,At as f,kt as g,_t as h,W as i};
@@ -1 +1 @@
1
- import{d as h,b as U,c as r,j as t,g as s,o as i,k as l,F as _,i as o,x as $,m,H as B,D as V,l as F,_ as C,v as N,r as c}from"./DHltYerF.js";import{_ as S}from"./B2oUeBbA.js";import{_ as E}from"./DZ3Vfcpz.js";import{_ as I}from"./Dwws9U0D.js";import"./e7zD3uJ0.js";const T={class:"min-h-screen flex items-center justify-center bg-elevated/50"},j={class:"flex items-center gap-2"},P={class:"mt-4 text-center"},q={class:"mt-4 text-center"},R=h({__name:"forgot-password",setup(z){const f=U(),a=c(""),n=c(!1),d=c(!1);async function p(){if(a.value){n.value=!0;try{await $fetch("/api/auth/forgot-password",{method:"POST",body:{email:a.value}}),d.value=!0}catch{f.add({title:"Something went wrong",description:"Please try again.",color:"error"})}finally{n.value=!1}}}return(A,e)=>{const x=N,g=S,u=$,y=V,k=E,v=C,w=I;return i(),r("div",T,[t(w,{class:"w-full max-w-md"},{header:s(()=>[o("div",j,[t(x,{name:"i-lucide-key-round",class:"size-6"}),e[1]||(e[1]=o("h1",{class:"text-2xl font-bold"},"Forgot password",-1))])]),default:s(()=>[l(d)?(i(),r(_,{key:0},[t(g,{color:"success",icon:"i-lucide-mail-check",title:"Check your email",description:"If an account with that email exists, a reset link has been sent."}),o("div",P,[t(u,{to:"/login",class:"text-sm text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"},{default:s(()=>[...e[2]||(e[2]=[m(" Back to login ",-1)])]),_:1})])],64)):(i(),r(_,{key:1},[e[5]||(e[5]=o("p",{class:"text-sm text-gray-500 mb-4"}," Enter your email address and we'll send you a link to reset your password. ",-1)),o("form",{class:"space-y-4",onSubmit:B(p,["prevent"])},[t(k,{label:"Email",name:"email",required:""},{default:s(()=>[t(y,{modelValue:l(a),"onUpdate:modelValue":e[0]||(e[0]=b=>F(a)?a.value=b:null),type:"email",placeholder:"you@example.com",autocomplete:"email",disabled:l(n),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),t(v,{type:"submit",block:"",loading:l(n)},{default:s(()=>[...e[3]||(e[3]=[m("Send reset link",-1)])]),_:1},8,["loading"])],32),o("div",q,[t(u,{to:"/login",class:"text-sm text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"},{default:s(()=>[...e[4]||(e[4]=[m(" Back to login ",-1)])]),_:1})])],64))]),_:1})])}}});export{R as default};
1
+ import{d as h,b as U,c as r,j as t,g as s,o as i,k as l,F as _,i as o,D as $,m,C as B,I as V,l as C,_ as F,p as I,r as c}from"./NQikbhmK.js";import{_ as N}from"./D0HNloZ9.js";import{_ as S}from"./B9WhzpKO.js";import{_ as E}from"./eptP4pGv.js";import"./CYsTqbBS.js";const T={class:"min-h-screen flex items-center justify-center bg-elevated/50"},j={class:"flex items-center gap-2"},P={class:"mt-4 text-center"},q={class:"mt-4 text-center"},G=h({__name:"forgot-password",setup(z){const f=U(),a=c(""),n=c(!1),d=c(!1);async function p(){if(a.value){n.value=!0;try{await $fetch("/api/auth/forgot-password",{method:"POST",body:{email:a.value}}),d.value=!0}catch{f.add({title:"Something went wrong",description:"Please try again.",color:"error"})}finally{n.value=!1}}}return(A,e)=>{const x=I,g=N,u=$,y=V,k=S,v=F,w=E;return i(),r("div",T,[t(w,{class:"w-full max-w-md"},{header:s(()=>[o("div",j,[t(x,{name:"i-lucide-key-round",class:"size-6"}),e[1]||(e[1]=o("h1",{class:"text-2xl font-bold"},"Forgot password",-1))])]),default:s(()=>[l(d)?(i(),r(_,{key:0},[t(g,{color:"success",icon:"i-lucide-mail-check",title:"Check your email",description:"If an account with that email exists, a reset link has been sent."}),o("div",P,[t(u,{to:"/login",class:"text-sm text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"},{default:s(()=>[...e[2]||(e[2]=[m(" Back to login ",-1)])]),_:1})])],64)):(i(),r(_,{key:1},[e[5]||(e[5]=o("p",{class:"text-sm text-gray-500 mb-4"}," Enter your email address and we'll send you a link to reset your password. ",-1)),o("form",{class:"space-y-4",onSubmit:B(p,["prevent"])},[t(k,{label:"Email",name:"email",required:""},{default:s(()=>[t(y,{modelValue:l(a),"onUpdate:modelValue":e[0]||(e[0]=b=>C(a)?a.value=b:null),type:"email",placeholder:"you@example.com",autocomplete:"email",disabled:l(n),class:"w-full"},null,8,["modelValue","disabled"])]),_:1}),t(v,{type:"submit",block:"",loading:l(n)},{default:s(()=>[...e[3]||(e[3]=[m("Send reset link",-1)])]),_:1},8,["loading"])],32),o("div",q,[t(u,{to:"/login",class:"text-sm text-gray-500 hover:text-gray-700 dark:hover:text-gray-300"},{default:s(()=>[...e[4]||(e[4]=[m(" Back to login ",-1)])]),_:1})])],64))]),_:1})])}}});export{G as default};
@@ -0,0 +1 @@
1
+ const t={"home.flaky":{title:"Flaky tests",text:"Tests that pass and fail without code changes. This counts how many were detected across your projects recently.",doc:"flaky-tests#flaky-test-detection"},"home.trend-bars":{title:"Run history bars",text:"One bar per full run (up to 20), oldest left → newest right. Green = pass, red = fail, amber = passed with flaky tests, gray = skipped/unknown. Click a bar to open that run.",doc:"ui-overview#home"},"home.tendency":{title:"Tendency",text:"Derived from the last 5 full runs. Failing = latest run failed; flaky = pass/fail mixed or flaky tests seen in the window; passing = all recent runs green.",doc:"ui-overview#home"},"home.project-health":{title:"Project health",text:"Every project at a glance — run history bars and a tendency badge so you can immediately see which project needs attention. Only full runs count.",doc:"ui-overview#home"},"home.get-started":{title:"Get started",text:"Wire the Piwi reporter into your Playwright config to start sending results here. The wizard generates the snippet for you.",doc:"getting-started#using-the-piwi-dashboard-reporter"},"analytics.insights":{title:"Insights",text:"Auto-generated findings over the selected period — pass-rate drops, failing streaks, stale clusters, wasted CI time. Ranked by severity; click one to jump to the source."},"analytics.portfolio":{title:"Portfolio health",text:"Every project over the selected period: pass rate with its change vs the previous period, flaky volume, open failure clusters, and the latest run. Worst health sorts first."},"analytics.heatmap":{title:"Pass rate heatmap",text:"Each cell is the aggregate pass rate of one project over one time bucket — green is healthy, red is broken, gray means no runs. Longer periods use wider buckets."},"analytics.ci-time":{title:"CI time",text:"Total minutes your test runs consumed, over time, with the change vs the previous equal-length period. Steady growth here is a capacity conversation."},"analytics.wasted-time":{title:"Wasted CI time",text:"Minutes that produced no signal: time inside wait steps plus time executing attempts that ended failed or timed out. The strongest argument for fixing slow waits and flaky tests."},"analytics.flaky-leaderboard":{title:"Flakiest tests",text:"The worst flaky tests across all projects, using the same scoring as each project’s Flaky tests tab, sorted by wasted-CI impact.",doc:"flaky-tests#flaky-test-detection"},"analytics.cluster-landscape":{title:"Failure clusters",text:"Open failure clusters across all projects — the biggest and oldest unresolved root causes. Clusters outlive run retention, so this works on long horizons.",doc:"ai-diagnosis#failure-clustering"},"analytics.regression-velocity":{title:"Regression velocity",text:"How much new breakage each period introduces: tests that passed in a baseline and now fail (regressions), plus tests that turned flaky. Rising bars mean quality debt is accumulating.",doc:"flaky-tests#regression-signals"},"analytics.browser-matrix":{title:"Browser matrix",text:"Pass rate per project × browser, so a suite that is green on one browser but failing on another (a browser-specific bug) stands out immediately."},"analytics.slow-endpoints":{title:"Slow endpoints",text:"Backend calls captured during tests, aggregated across all projects by route: p50/p90 latency, error rate, and how many projects hit each one — a shared endpoint regressing shows up here first.",doc:"capture-fixtures"},"projects.tag-filter":{text:"Filter projects by tag. Selecting several tags uses OR logic — a project matching any of them is shown."},"projects.table":{title:"Projects",text:"Every project that has reported results, with its latest run, pass rate and activity. Click a row to drill in.",doc:"ui-overview#projects"},"project.import":{title:"Importing past runs",text:"Upload the archives Playwright writes to blob-report/ to backfill runs from before you adopted Piwi. One archive becomes one run, complete with traces and screenshots, and re-uploading the same archive changes nothing. Imports are silent by design — no notifications, AI diagnosis or regression signals, so a backfill never pages the team about months-old failures.",doc:"importing-runs",envVars:["PIWI_IMPORT_MAX_BYTES"]},"project.run-scope":{title:"Full vs partial runs",text:"A partial run executed only a subset of the suite (a shard, a retry, or a filtered selection). Trends use full runs so partial results don’t skew the numbers.",doc:"ui-overview#test-run-detail"},"project.runs-trend":{title:"Run trend",text:"Pass/fail counts per run over time. Hover a point for the exact run; sudden drops mark where things broke.",doc:"ui-overview#project-detail"},"project.flaky-tests":{title:"Flaky tests",text:"Tests that fail intermittently across runs. Impact estimates wasted CI time; the score (0–100) rates severity and root cause explains why.",doc:"flaky-tests#flaky-test-detection"},"project.quarantine":{title:"Quarantine",text:"A quarantined test still runs and still reports — it is only excluded from the CI gate’s verdict. Passing runs accumulate as a streak, so a test that recovers is flagged ready to release instead of staying quarantined forever.",doc:"flaky-tests#quarantine-with-a-way-out"},"project.performance":{title:"Performance",text:"Duration trends for the suite — average and P90 (the slowest 10% threshold). Use it to catch tests getting steadily slower.",doc:"flaky-tests#performance"},"project.timeline":{title:"Timeline markers",text:"Dated events — deploys, config changes, infra migrations, incidents — overlaid as vertical lines on the trend charts, so you can tell whether a change moved your results or performance. Markers can be scoped to an environment; some are detected automatically when tooling versions change between runs.",doc:"timeline-markers",envVars:["PIWI_AUTO_MARKERS"]},"project.slowest-tests":{title:"Slowest tests",text:"The tests taking the most time, ranked. Optimizing the top entries shortens your overall run the fastest.",doc:"flaky-tests#performance"},"project.run-compare":{title:"Run comparison",text:"Diff two runs to see which tests changed status or duration between them — handy for confirming a fix or spotting a regression.",doc:"ui-overview#test-run-detail"},"project.test-cases":{title:"Test cases",text:'Every distinct test in the project with its executed-only pass rate, result breakdown and average duration across runs. Search by title or file, filter by status, and switch to a per-spec tree. Cases not run within the selected age window are hidden by default (last 30 days) — pick "All time" to see obsolete ones. Click a test to see its full history.',doc:"ui-overview#project-detail"},"project.compare":{title:"Compare runs",text:"Pick two runs to see a side-by-side summary and a per-test status diff between them.",doc:"ui-overview#test-run-detail"},"project.spec-health":{title:"Spec health",text:"A heatmap grouped by spec file: pass rate, flaky rate and average time per spec, so you can find the riskiest files at a glance.",doc:"flaky-tests#spec-health-heatmap"},"project.members":{title:"Project access",text:"Who can see this project. Admins always have access; reporters and users see only the projects assigned to them.",doc:"authentication#user-management"},"project.ai-instructions":{title:"AI diagnosis instructions",text:"Extra guidance handed to the AI when diagnosing this project’s failures — e.g. domain terms, known-flaky areas, or where to look first.",doc:"ai-diagnosis#custom-instructions"},"project.scm-token":{title:"Repository access token",text:"A read-only Git host token lets diagnosis pull the actual commit diffs behind a failure for SCM-grounded analysis. Stored encrypted.",doc:"ai-diagnosis#scm-grounded-context"},"run.summary":{title:"Run summary",text:"Headline outcome of this run — overall status, test counts and total duration.",doc:"ui-overview#test-run-detail"},"run.partial":{title:"Partial run",text:"This run covered only part of the suite (a shard, retry or filtered selection), so its totals aren’t a full picture.",doc:"ui-overview#test-run-detail"},"run.live":{title:"Live run",text:"This run is still streaming results in real time. Results and counts update as each test finishes.",doc:"reporter#live-streaming"},"run.ci-env":{title:"CI & environment",text:"Where this run executed — CI provider, pipeline and machine details — collected automatically by the reporter.",doc:"reporter#automatic-metadata-collection"},"run.reports":{title:"Storage & reports",text:"HTML reports, traces and attachments uploaded with this run. A run can carry several reports (e.g. per shard).",doc:"reporter#multiple-reports"},"run.metadata":{title:"Tags, links & custom data",text:"Extra context attached to the run: tags for grouping, links to external issues, and any custom key/value data your reporter sent."},"run.test-cases":{title:"Test cases",text:"Per-test results for this run. Filter by status, or by the NEW (new regression) and FLAKY signal badges.",doc:"ui-overview#test-run-detail"},"run.insights":{title:"Run insights",text:"Automatic highlights for this run — newly failing, flaky and slow tests — surfaced so you don’t have to hunt for them.",doc:"flaky-tests#run-insights"},"run.regression":{title:"Regression signals",text:"Tests that newly started failing in this run versus the project baseline — the most likely fallout from the latest change.",doc:"flaky-tests#regression-signals"},"run.timeline":{title:"Workers timeline",text:"When each test ran on each parallel worker. Gaps and long bars reveal poor parallelization or a single slow test stalling a shard.",doc:"ui-overview#test-run-detail"},"case.diagnosis-tab":{title:"Diagnosis",text:"Everything you need to understand and fix this failure in one place — the error, a verdict on what kind of failure it is, the captured evidence, and an AI diagnosis.",doc:"ui-overview#test-case-detail"},"case.verdict":{title:"Failure verdict",text:"An at-a-glance read on this failure: whether it newly regressed or is flaky, how many times it retried, and how long the test has been failing.",doc:"flaky-tests#regression-signals"},"case.evidence":{title:"Failure evidence",text:"What was captured at the moment of failure — screenshots, video and traces — grouped so you can see exactly what the browser saw.",doc:"ui-overview#trace-viewer"},"case.test-source":{title:"Test source",text:"The source around the failing line and the callers above it — captured from the failure’s call stack — so you can read where it broke, and the code that led there, without opening your editor. When the execution has a trace, this deepens into the complete call stack with the real source of every frame, read from the trace’s embedded files.",doc:"ui-overview#trace-powered-deep-views"},"export.offline":{title:"Reading this offline",text:"Takes this investigation out of the dashboard as a file that needs no network and no Piwi server. HTML is one self-contained page with screenshots and video embedded; ZIP adds the raw artifacts — trace archives, full-size video, logs — plus a machine-readable data.json; PDF is the HTML printed from your browser. Evidence past the size budget is listed in the report as omitted rather than dropped quietly.",envVars:["PIWI_EXPORT_MAX_INLINE_BYTES","PIWI_EXPORT_MAX_BYTES","PIWI_EXPORT_MAX_CASES"]},"case.artifacts":{title:"Artifacts",text:"Traces, attachments, console output and network requests captured for this execution — the raw material behind the result.",doc:"ui-overview#trace-viewer"},"case.steps":{title:"Steps",text:"Each step Playwright ran, with its duration. A failed step is highlighted with its error, and slow steps are color-coded.",doc:"ui-overview#test-case-detail"},"case.wasted-time":{title:"Wasted time",text:"Time spent in fixed waits (waitForTimeout and matching patterns) that could usually be replaced with a web-first assertion.",doc:"flaky-tests#performance"},"case.ai":{title:"AI diagnosis for this execution",text:"Diagnose just this failing execution, or copy the full evidence context to paste into your own AI assistant.",doc:"ai-diagnosis#diagnosing-one-execution"},"case.web-vitals":{title:"Web Vitals",text:"Core Web Vitals (LCP, CLS, etc.) captured during the test, measuring real loading and responsiveness of the page under test.",doc:"capture-fixtures"},"case.traces":{title:"Traces",text:`Playwright trace files for this execution. "View trace" opens them in the dashboard's own trace viewer — the trace stays on your server, it is never sent to a third party.`,doc:"ui-overview#trace-viewer"},"case.console":{title:"Console output",text:"Browser console messages logged while this test ran — often the first clue for a JavaScript error behind a failure.",doc:"capture-fixtures"},"case.network":{title:"Network requests",text:"HTTP requests the page made during the test, with timing and status — useful for spotting failed or slow calls. When the execution has a trace, the Full trace view shows every request (all resource types) with headers, timing phases, a waterfall and capped body previews; sensitive header values are masked.",doc:"ui-overview#trace-powered-deep-views"},"case.backend-logs":{title:"Backend server logs",text:"Server-side warnings and errors captured during the test, correlated with this execution via a Piwi backend integration.",doc:"backend-logs"},"case.aria":{title:"ARIA snapshot",text:"A snapshot of the accessibility tree at the moment of failure — what assistive tech saw, and useful grounding for AI diagnosis.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"case.flaky-count":{title:"Flaky runs",text:"How many of this test’s recent executions flipped between pass and fail without a code change.",doc:"flaky-tests#flaky-test-detection"},"case.history-chart":{title:"Duration trend",text:"This test’s duration across recent runs. Rising times or spikes hint at a slowdown or instability.",doc:"flaky-tests#flaky-test-detection"},"case.sparkline":{title:"Status history",text:"Pass/fail outcome of this test over its recent runs, oldest to newest — a quick read on its stability.",doc:"flaky-tests#flaky-test-detection"},"cluster.concept":{title:"Failure clusters",text:"Failures with the same error fingerprint are grouped into one cluster, so a single root cause shows up once instead of N times.",doc:"ai-diagnosis#failure-clustering"},"cluster.new-vs-known":{title:"New vs known failure",text:"Whether this failure matches an existing cluster (a known issue) or opened a new one — a fresh signature worth a closer look.",doc:"ai-diagnosis#failure-clustering"},"cluster.triage":{text:"Track a cluster’s state: set its status, add triage notes, or extract a subset of failures into a separate cluster."},"cluster.resolution":{title:"Resolution",text:"Recorded when a full run turns this cluster green: when the fix landed, how long the cluster stayed open, and whether the change matched the diagnosed files. If the failure comes back, the cluster is marked as regressed rather than quietly reopened.",doc:"ai-diagnosis#did-the-fix-work"},"cluster.evidence":{title:"Test evidence",text:"The concrete artifacts behind this cluster — screenshots, signals and traces from affected tests — gathered for review and AI diagnosis.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.scm":{title:"What changed",text:"Recent commits and diffs around when this failure started, so you can connect the break to the change that caused it.",doc:"ai-diagnosis#scm-grounded-context"},"cluster.baseline":{title:"Baseline commit",text:"The last known-good commit. Diffs are computed from here forward to scope the search for the offending change.",doc:"ai-diagnosis#scm-grounded-context"},"cluster.commit-browser":{title:"Commit browser",text:"Browse the repository’s recent commits and inspect each diff to pick a baseline or find the suspect change.",doc:"ai-diagnosis#scm-grounded-context"},"cluster.diagnosis":{title:"AI diagnosis",text:"Runs the configured AI model over the failure plus its evidence and code changes to propose a root cause and fix.",doc:"ai-diagnosis#enabling-ai-diagnosis"},"cluster.context-input":{title:"Additional context",text:"Extra notes, files or screenshots you add to steer the diagnosis — anything the model can’t infer from the captured evidence.",doc:"ai-diagnosis#custom-instructions"},"cluster.context-preview":{title:"Context preview",text:"Exactly what will be sent to the AI, including how much was trimmed to fit the token budget. Review it before spending tokens.",doc:"ai-diagnosis#context-limits-and-token-cost"},"cluster.result":{title:"Diagnosis result",text:"The AI’s proposed root cause, fix and confidence. Treat it as a lead to verify, not proof — confirm against the evidence before acting.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.ai-setup":{title:"AI not configured",text:"Diagnosis needs an AI provider and API key. Configure one in Settings → AI to enable automatic and on-demand analysis.",doc:"ai-diagnosis#enabling-ai-diagnosis"},"cluster.confidence":{title:"Confidence score",text:"How sure the model is of the top hypothesis (0–100). It is lowered when key evidence is missing or truncated, so treat a low score as “gather more before acting”.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.hypotheses":{title:"Other hypotheses",text:"Alternative root causes the model weighed, ranked by likelihood. Useful when the evidence is ambiguous and the top pick is not conclusive.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"cluster.coverage":{title:"Data coverage",text:"Which evidence sections were present, truncated or absent for this diagnosis — the same map the model sees. Absent or trimmed evidence lowers confidence; the quote icon marks sections the diagnosis cited.",doc:"ai-diagnosis#context-limits-and-token-cost"},"notifications.subscribe":{title:"Project notifications",text:"Get notified about this project’s runs through your channels. Choose which events trigger an alert.",doc:"notifications#subscriptions"},"settings.general":{title:"General settings",text:"Central place for account, users, AI diagnosis, notifications, storage and tags. Settings that can be overridden by environment variables show a lock badge naming the variable."},"settings.storage-stats":{title:"Storage statistics",text:"How much disk your reports, traces and attachments use, broken down so you can see what to clean up.",doc:"storage#storage-architecture"},"settings.cleanup":{title:"Cleanup old runs",text:"Delete runs (and their reports, traces and attachments) older than a chosen age to reclaim storage. This cannot be undone.",doc:"storage#storage-management"},"account.email":{title:"Email & verification",text:"Your account email is used for password resets and notifications. Verifying it confirms you own the address.",doc:"authentication#user-management"},"settings.smtp":{title:"SMTP status",text:"Outbound email (resets, invites, notifications) is configured through environment variables and shown here read-only.",doc:"notifications#smtp-configuration",envVars:["PIWI_SMTP_HOST","PIWI_SMTP_PORT","PIWI_SMTP_USER","PIWI_SMTP_PASS","PIWI_SMTP_FROM","PIWI_SMTP_FROM_NAME","PIWI_SMTP_SECURE"]},"notifications.channels":{title:"Channels",text:"Destinations an alert can go to — email, Slack or webhook. Create a channel, then subscribe events to it.",doc:"notifications#channels"},"notifications.subscriptions":{title:"Subscriptions",text:"Which events (run failed, new cluster, etc.) notify which channel, optionally scoped to one project and filtered.",doc:"notifications#subscriptions"},"settings.ai-provider":{title:"AI provider",text:"Configure the model providers behind the three AI roles — diagnosis, research and embedding. Each role has its own provider config, or reuses another role’s provider and credentials. Keys are stored encrypted and never returned by the API.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_PROVIDER","PIWI_AI_MODEL","PIWI_AI_API_KEY","PIWI_AI_BASE_URL"]},"settings.ai-instructions":{title:"Global analysis instructions",text:"Guidance applied to every diagnosis across all projects — house style, terminology, or things to always check. Per-project instructions add to this.",doc:"ai-diagnosis#custom-instructions"},"settings.ai-research":{title:"Research model",text:"An optional cheaper/faster model that pre-analyzes the failure (on a lean view) before the main model writes the final diagnosis. It can use its own provider, and the costly SCM diff is only fetched when it flags a likely regression. It also handles cluster naming and merge adjudication, so configuring a cheap research model routes those utility calls away from the expensive diagnosis model.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_RESEARCH_PROVIDER","PIWI_AI_RESEARCH_MODEL","PIWI_AI_RESEARCH_BASE_URL","PIWI_AI_RESEARCH_API_KEY"]},"settings.ai-limits":{title:"Diagnosis context limits",text:"Caps on how much evidence (and how many tokens) go into each diagnosis. Higher limits give the model more to work with but cost more. Each field can be pinned individually by its env var.",doc:"ai-diagnosis#context-limits-and-token-cost",envVars:["PIWI_AI_MAX_SAMPLE_ERROR_CHARS","PIWI_AI_MAX_SCM_PATCH_BUDGET","PIWI_AI_MAX_AFFECTED_TESTS","PIWI_AI_MAX_STEPS","PIWI_AI_MAX_CONSOLE_ENTRIES","PIWI_AI_MAX_CONSOLE_ENTRY_CHARS","PIWI_AI_MAX_NETWORK_REQUESTS","PIWI_AI_MAX_ARIA_SNAPSHOT_CHARS","PIWI_AI_MAX_TEST_SOURCE_CHARS","PIWI_AI_MAX_SERVER_LOG_ENTRIES","PIWI_AI_MAX_SERVER_LOG_ENTRY_CHARS","PIWI_AI_MAX_IMAGES","PIWI_AI_MAX_PASSED_PEERS","PIWI_AI_MAX_CONSOLE_WINDOW","PIWI_AI_SLOW_REQUEST_MS","PIWI_AI_MAX_TRACE_STACK_FRAMES","PIWI_AI_MAX_TRACE_NETWORK_REQUESTS"]},"settings.users":{title:"Users & roles",text:"Manage accounts and their role. Administrators control everything; reporters submit results; users have read-only access.",doc:"authentication#roles"},"settings.api-keys":{title:"API keys",text:"Tokens (prefixed pd_) that let the reporter or scripts authenticate without a password. Shown once at creation; revoke anytime.",doc:"authentication#api-keys"},"settings.tags":{text:"Reusable labels you can attach to projects for grouping and filtering across the dashboard."},"settings.wasted-time":{title:"Wasted-time patterns",text:"Define which wait steps count as wasted time. A wait is wasted when any pattern matches its step title or source location. Patterns are case-insensitive and support * and ? wildcards. Changes apply to existing runs immediately.",doc:"flaky-tests#performance",envVars:["PIWI_WASTED_WAIT_PATTERNS"]},"settings.timeout-hygiene":{title:"Timeout hygiene",text:"Thresholds for flagging oversized per-test timeouts and stale test.slow() marks. Opportunities are recomputed at read time, so changes apply to existing runs immediately.",doc:"flaky-tests#performance"},"settings.pr-feedback":{title:"Pull-request feedback",text:"When a run finishes on a branch with an open pull request, Piwi can post a summary comment — new failures separated from pre-existing ones, with suggested locators — and set a commit status. Needs PIWI_SITE_URL and an SCM token with write access.",doc:"ci#pull-request-feedback",envVars:["PIWI_SITE_URL"]},"settings.auto-diagnose":{title:"Auto-diagnose",text:"When a run finishes, up to 3 new failure clusters are diagnosed automatically — each diagnosis is one research call (when a research model is configured) plus one diagnosis call — and new clusters get human-readable titles in one batched call. Requires the diagnosis model to be configured.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_AUTO_DIAGNOSE"]},"settings.embedding-model":{title:"Embedding model",text:"Embeds failures so semantically-similar errors group together (used by failure clustering). Can reuse another role’s provider or configure its own.",doc:"ai-diagnosis#enabling-ai-diagnosis",envVars:["PIWI_AI_EMBEDDING_PROVIDER","PIWI_AI_EMBEDDING_MODEL","PIWI_AI_EMBEDDING_BASE_URL","PIWI_AI_EMBEDDING_API_KEY"]},"settings.privacy":{title:"Privacy notice",text:"What data is sent to the configured LLM provider when diagnosing a failure, and how secrets are stored. API keys are encrypted at rest; env vars keep them out of the DB entirely.",doc:"ai-diagnosis#what-a-diagnosis-contains"},"settings.storage-backend":{title:"Storage backend",text:"Where test artifacts (HTML reports, traces, attachments) are stored — local disk or S3. Configured entirely through environment variables; shown here read-only.",doc:"storage#storage-architecture",envVars:["PIWI_STORAGE_TYPE","PIWI_STORAGE_PATH","PIWI_S3_BUCKET","PIWI_S3_REGION","PIWI_S3_ACCESS_KEY_ID","PIWI_S3_SECRET_ACCESS_KEY","PIWI_S3_ENDPOINT","PIWI_S3_FORCE_PATH_STYLE"]},"settings.auth-toggle":{title:"Authentication",text:"Role-based access control and API keys. Off by default — when disabled, every endpoint behaves as a single virtual administrator.",doc:"authentication",envVars:["PIWI_AUTH_ENABLED","PIWI_AUTH_SECRET"]},"account.display-name":{title:"Display name",text:"A friendly name shown alongside your account. Optional, and visible only within the dashboard."},"account.connected-accounts":{title:"Connected accounts",text:"Sign in with an OAuth provider (Google or GitHub). Providers are configured by an operator through environment variables; one provider can be linked per account.",doc:"authentication#oauth-google-github",envVars:["PIWI_OAUTH_GOOGLE_CLIENT_ID","PIWI_OAUTH_GOOGLE_CLIENT_SECRET","PIWI_OAUTH_GITHUB_CLIENT_ID","PIWI_OAUTH_GITHUB_CLIENT_SECRET","PIWI_OAUTH_ALLOWED_DOMAINS","PIWI_OAUTH_GITHUB_ALLOWED_ORGS"]},"account.password":{title:"Password",text:"Change the password you sign in with. OAuth-only accounts manage their password through their provider.",doc:"authentication#user-management"},"notifications.test-email":{title:"Send test email",text:"Send a test message through the configured SMTP server to verify delivery. Uses the environment-configured SMTP connection.",doc:"notifications#smtp-configuration"},"mcp.tools":{title:"What it provides",text:"The tools this MCP server exposes to AI agents, letting them query your projects, runs and failures directly.",doc:"mcp#what-it-provides"},"mcp.auth":{title:"Authentication",text:"How an MCP client authenticates to this server — uses the same API keys as the rest of the dashboard.",doc:"mcp#authentication"},"mcp.client-setup":{title:"Client setup",text:"Copy-paste configuration to connect Claude Code, Cursor, VS Code and other MCP clients to this server.",doc:"mcp#client-setup"},"shared.entity-links":{title:"Entity links",text:"Links to external systems (Jira, GitHub, etc.) attached to this item. The provider is detected automatically from the URL."},"ide.open":{title:"Open in IDE",text:"Click a source path to open it in your local editor. Set your local workspace folder (so VS Code gets an absolute path) or a JetBrains project name, then pick a method. Auto probes the JetBrains local server first (the only one it can confirm) before falling back to a vscode:// or jetbrains:// launch. These preferences live in this browser only.",doc:"ide-integration"},"locator-healing":{title:"Alternative locators",text:'When a locator breaks after a UI change, Piwi suggests pre-captured alternatives from the last passing run — or from another test in the project that uses the same locator. Each alternative is ranked by stability score — prefer data-testid (100) over CSS classes (10–40). The recommended fix shows the exact one-line edit for the failing test, with a "Copy fix prompt" for an AI coding agent. A "Your pick" badge marks a replacement you confirmed on the failing page: "Pick from snapshot" opens the failure-time DOM and lets you click the intended element, and "Pick from trace" opens the failure trace in the trace viewer, whose Pick locator tool works on the recorded page snapshots.',doc:"reporter#locator-healing"},"environment-diff":{title:"Environment diff",text:"Compares this execution’s environment (Playwright version, browser config, locale, viewport, CI provider, …) against the same test’s last passing run on the same browser. Only changed keys are shown — an empty diff rules out environment drift as the cause."},"visual-diff":{title:"Visual diff",text:"Pixel-compares the failing screenshot against the same test’s last passing screenshot (same browser). Red pixels in the overlay mark what changed. When the two screenshots have different dimensions the ratio is flagged as unreliable."},"dom-snapshot":{title:"DOM snapshot",text:"The page’s HTML around the failing action, rendered from the uploaded Playwright trace — nothing extra is captured. Input values, inline handlers and script bodies are removed; token-shaped strings are masked."},"page-state":{title:"App state at test end",text:"URL, history state, storage key names + value lengths, and cookie names + flags captured when the test ended. Values are never captured. Disable with the reporter’s capturePageState option.",doc:"capture-fixtures"}};function s(e){return t[e].envVars??[]}export{t as H,s as h};
@@ -1 +1 @@
1
- import{ci as u,b as n}from"./DHltYerF.js";function d(c={}){const{copy:i,copied:r,isSupported:a}=u({copiedDuring:c.duration??2e3,legacy:!0}),e=n();async function s(t,o={}){if(t){try{await i(t)}catch{return}o.toast&&e.add({title:typeof o.toast=="string"?o.toast:"Copied to clipboard",icon:"i-lucide-check",color:"success",duration:2e3})}}return{copy:s,copied:r,isSupported:a}}export{d as u};
1
+ import{ci as u,b as n}from"./NQikbhmK.js";function d(c={}){const{copy:i,copied:r,isSupported:a}=u({copiedDuring:c.duration??2e3,legacy:!0}),e=n();async function s(t,o={}){if(t){try{await i(t)}catch{return}o.toast&&e.add({title:typeof o.toast=="string"?o.toast:"Copied to clipboard",icon:"i-lucide-check",color:"success",duration:2e3})}}return{copy:s,copied:r,isSupported:a}}export{d as u};