@piwitests/server 0.26.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BdQ7kfxJ.js → 1QWBzxLM.js} +4 -4
  3. package/.output/public/_nuxt/{CY1UsEbI.js → 4hW9LHwA.js} +1 -1
  4. package/.output/public/_nuxt/96uxfdYT.js +1 -0
  5. package/.output/public/_nuxt/{HGYIpJtg.js → AbnDY6Zr.js} +1 -1
  6. package/.output/public/_nuxt/{CZ6WR7uw.js → B-1zt4pp.js} +1 -1
  7. package/.output/public/_nuxt/{Sx5-c-bZ.js → B1iYmAt_.js} +1 -1
  8. package/.output/public/_nuxt/{CbzgEkmW.js → B2bxEmbR.js} +1 -1
  9. package/.output/public/_nuxt/B3hAvaCe.js +4 -0
  10. package/.output/public/_nuxt/{CyWOerIG.js → B4lvHjBe.js} +1 -1
  11. package/.output/public/_nuxt/B5S7BkC3.js +1 -0
  12. package/.output/public/_nuxt/{Bb_1uAHn.js → B6j5Ornu.js} +1 -1
  13. package/.output/public/_nuxt/{CrsaY0R_.js → B82vqOZe.js} +1 -1
  14. package/.output/public/_nuxt/{CTFUlsXp.js → B9oXlGro.js} +1 -1
  15. package/.output/public/_nuxt/{CsJ9Ce4U.js → BABCH5kE.js} +1 -1
  16. package/.output/public/_nuxt/{Gn1Ns00e.js → BF5qB58w.js} +1 -1
  17. package/.output/public/_nuxt/{CsGsLxHg.js → BFLa9ZEP.js} +1 -1
  18. package/.output/public/_nuxt/BIlohx1E.js +1 -0
  19. package/.output/public/_nuxt/{B6djubIK.js → BM5C-Oec.js} +1 -1
  20. package/.output/public/_nuxt/{CrZhoZuI.js → BOA-I6S9.js} +1 -1
  21. package/.output/public/_nuxt/{Bp2zrrkV.js → BQUhoGCh.js} +1 -1
  22. package/.output/public/_nuxt/{DUC3QnqW.js → BQYLGX9o.js} +1 -1
  23. package/.output/public/_nuxt/{CUjzhXN1.js → BRMeEHXd.js} +1 -1
  24. package/.output/public/_nuxt/{Cf_a8ynB.js → BRtaKOKv.js} +2 -2
  25. package/.output/public/_nuxt/{B7uPoZ7T.js → BS91Og__.js} +1 -1
  26. package/.output/public/_nuxt/{DKgbchez.js → BTGAvMoT.js} +1 -1
  27. package/.output/public/_nuxt/{BIamiwb7.js → BaLX92Wz.js} +1 -1
  28. package/.output/public/_nuxt/{LWIyaZKe.js → Bc6Zr-Xn.js} +1 -1
  29. package/.output/public/_nuxt/{R7AVOWi_.js → BceMEnJt.js} +1 -1
  30. package/.output/public/_nuxt/{Q2oJNyXL.js → BeCAVtCK.js} +1 -1
  31. package/.output/public/_nuxt/{D_SD71Qf.js → Bf119e7x.js} +1 -1
  32. package/.output/public/_nuxt/BfRcdz11.js +9 -0
  33. package/.output/public/_nuxt/{CxwnFFD0.js → Bl0xzETD.js} +1 -1
  34. package/.output/public/_nuxt/{C_eXufkv.js → BnUQ3i5l.js} +1 -1
  35. package/.output/public/_nuxt/{rPG7kzfL.js → Bp1WeQ0_.js} +1 -1
  36. package/.output/public/_nuxt/{BL8cYWsR.js → Bp31ZRcA.js} +1 -1
  37. package/.output/public/_nuxt/{Drh1_ASq.js → BrxUH8qL.js} +1 -1
  38. package/.output/public/_nuxt/{D72Ce8Ff.js → BsdfEbVC.js} +1 -1
  39. package/.output/public/_nuxt/BtGI4ZbP.js +1 -0
  40. package/.output/public/_nuxt/{BV8EzO8q.js → BuMX-4RF.js} +1 -1
  41. package/.output/public/_nuxt/{DPPhFZOr.js → BuXJR5tn.js} +1 -1
  42. package/.output/public/_nuxt/{Bh2WA4IJ.js → Bx_lfKHl.js} +1 -1
  43. package/.output/public/_nuxt/{vcSKeWsW.js → C4UKyPQn.js} +1 -1
  44. package/.output/public/_nuxt/{IoE3eJ9F.js → C9XCTbtQ.js} +1 -1
  45. package/.output/public/_nuxt/{BilJoEne.js → CEPU6VkU.js} +1 -1
  46. package/.output/public/_nuxt/CHz7LJIX.js +1 -0
  47. package/.output/public/_nuxt/{BPhGDGAR.js → CMhd8IBr.js} +1 -1
  48. package/.output/public/_nuxt/{C5X_N4R7.js → CN1M6i4K.js} +33 -33
  49. package/.output/public/_nuxt/CQLkowA3.js +1 -0
  50. package/.output/public/_nuxt/{DTtizz85.js → CU_2YLhT.js} +1 -1
  51. package/.output/public/_nuxt/{CMVTTE_g.js → CXkXHtcx.js} +1 -1
  52. package/.output/public/_nuxt/{igDJCTgt.js → CZeKW-zP.js} +1 -1
  53. package/.output/public/_nuxt/{9oKY4Zb7.js → CapSEET7.js} +1 -1
  54. package/.output/public/_nuxt/{j2eGYaRa.js → CeExxGSu.js} +1 -1
  55. package/.output/public/_nuxt/{CEgRB8H9.js → CfwpqSe7.js} +1 -1
  56. package/.output/public/_nuxt/{CFKbXp6V.js → ChOtLYkd.js} +1 -1
  57. package/.output/public/_nuxt/ChuJzPWz.js +1 -0
  58. package/.output/public/_nuxt/{Bo73sAu8.js → CiCUZGFZ.js} +1 -1
  59. package/.output/public/_nuxt/{C6R4tyud.js → CkL_oDa8.js} +1 -1
  60. package/.output/public/_nuxt/{DtGJeysS.js → CkhOMiiO.js} +1 -1
  61. package/.output/public/_nuxt/ClmHMP65.js +2 -0
  62. package/.output/public/_nuxt/{BtcDY0Du.js → Cnm0d_7S.js} +1 -1
  63. package/.output/public/_nuxt/{CK2AMqz_.js → CtQMagSz.js} +1 -1
  64. package/.output/public/_nuxt/{B1KjIR-q.js → Ctnn3S3-.js} +1 -1
  65. package/.output/public/_nuxt/{DCeZxpxe.js → CywiLuOD.js} +4 -4
  66. package/.output/public/_nuxt/{oA84LLqO.js → CzRkZLB4.js} +1 -1
  67. package/.output/public/_nuxt/CzyCEdYP.js +1 -0
  68. package/.output/public/_nuxt/{D56yp7m9.js → D-F0Rhjj.js} +1 -1
  69. package/.output/public/_nuxt/D4mPjHHR.js +2 -0
  70. package/.output/public/_nuxt/{BsGvSoPC.js → D4v7lLm3.js} +1 -1
  71. package/.output/public/_nuxt/{CxRTKV-K.js → D6B0WKO0.js} +1 -1
  72. package/.output/public/_nuxt/{jv8U_Tup.js → DAg6jtav.js} +1 -1
  73. package/.output/public/_nuxt/DBXXb0w8.js +1 -0
  74. package/.output/public/_nuxt/{ChlP20A5.js → DHN2t5Vt.js} +1 -1
  75. package/.output/public/_nuxt/{B8tezsWe.js → DJKHXfNS.js} +1 -1
  76. package/.output/public/_nuxt/{CFg5qdS0.js → DMqAUHFN.js} +1 -1
  77. package/.output/public/_nuxt/{C9A3sPDo.js → DURme_kn.js} +1 -1
  78. package/.output/public/_nuxt/{C2hIM5f9.js → DVo_e_uj.js} +1 -1
  79. package/.output/public/_nuxt/{DKhqIou2.js → DXh8q5KY.js} +1 -1
  80. package/.output/public/_nuxt/{CZXeJs2k.js → DXz1Kb4-.js} +1 -1
  81. package/.output/public/_nuxt/{CPrVhXJk.js → DYdwHaco.js} +1 -1
  82. package/.output/public/_nuxt/{WZXZeGYt.js → D_ZAGxCQ.js} +1 -1
  83. package/.output/public/_nuxt/{D5SN7rPK.js → D_dhjJvR.js} +1 -1
  84. package/.output/public/_nuxt/{DR1jFptD.js → DamZHy5M.js} +1 -1
  85. package/.output/public/_nuxt/{xKX9IHe3.js → DbtjJCra.js} +1 -1
  86. package/.output/public/_nuxt/{r6zkA1SE.js → DcOlL-oi.js} +1 -1
  87. package/.output/public/_nuxt/{CxspCKpR.js → DeQ9sIia.js} +1 -1
  88. package/.output/public/_nuxt/{BkHJoHpc.js → DjX1bLZD.js} +1 -1
  89. package/.output/public/_nuxt/{Be0bwdsi.js → Dly7wCCl.js} +1 -1
  90. package/.output/public/_nuxt/DmeogbGY.js +1 -0
  91. package/.output/public/_nuxt/{CfV2N201.js → Dn_-RkxP.js} +1 -1
  92. package/.output/public/_nuxt/{dg6uXTyR.js → DoDo3VF2.js} +1 -1
  93. package/.output/public/_nuxt/{BMlKQMjM.js → DoVHTl-K.js} +1 -1
  94. package/.output/public/_nuxt/DpM8IgHL.js +1 -0
  95. package/.output/public/_nuxt/{B4NjylBn.js → Dpwj_1H5.js} +1 -1
  96. package/.output/public/_nuxt/{DzJa19LG.js → DvSHenmZ.js} +1 -1
  97. package/.output/public/_nuxt/DvYU87_a.js +1 -0
  98. package/.output/public/_nuxt/{G2J1dVVb.js → Dx41arC8.js} +1 -1
  99. package/.output/public/_nuxt/DxBrlj7b.js +1 -0
  100. package/.output/public/_nuxt/{r-HZNbp3.js → JNpNdV-o.js} +1 -1
  101. package/.output/public/_nuxt/Lz9MmwKY.js +1 -0
  102. package/.output/public/_nuxt/OMI0cmZ0.js +1 -0
  103. package/.output/public/_nuxt/{CUWrUpTl.js → UAmyrRCI.js} +1 -1
  104. package/.output/public/_nuxt/{EJllK0wm.js → VBTxfbqU.js} +1 -1
  105. package/.output/public/_nuxt/VbedPPFH.js +1 -0
  106. package/.output/public/_nuxt/{BY9A1aOT.js → _okd7MfH.js} +1 -1
  107. package/.output/public/_nuxt/{BOn5q0rT.js → bmAf49LT.js} +1 -1
  108. package/.output/public/_nuxt/builds/latest.json +1 -1
  109. package/.output/public/_nuxt/builds/meta/0174ebd8-8fa5-4698-aa79-7a8dd2f6527f.json +1 -0
  110. package/.output/public/_nuxt/{D0XWJGhG.js → e-GZmCeP.js} +1 -1
  111. package/.output/public/_nuxt/entry.Dv52uAyn.css +1 -0
  112. package/.output/public/_nuxt/{DVIIj6Vv.js → f9TbT3AM.js} +1 -1
  113. package/.output/public/_nuxt/gdlHFfN6.js +1 -0
  114. package/.output/public/_nuxt/{BTG_PmM5.js → huBoAZeM.js} +1 -1
  115. package/.output/public/_nuxt/{DadksxQ9.js → mYw4b7uY.js} +1 -1
  116. package/.output/public/_nuxt/{B0eHOux4.js → mi7tdFxN.js} +1 -1
  117. package/.output/public/_nuxt/sFe4Zr5j.js +1 -0
  118. package/.output/public/_nuxt/{CLrLFf3s.js → uspGXbik.js} +1 -1
  119. package/.output/public/_nuxt/{DLN-CQXF.js → w7KxwWEv.js} +1 -1
  120. package/.output/public/_nuxt/{Bp55g9gr.js → wa4k1aDz.js} +1 -1
  121. package/.output/public/_nuxt/{C2yZcDch.js → xuB8n0QL.js} +1 -1
  122. package/.output/public/favicon.ico +0 -0
  123. package/.output/public/trace-viewer/assets/codeMirrorModule-LEHpjmcn.js +32 -0
  124. package/.output/public/trace-viewer/assets/defaultSettingsView-BNmKHKpQ.js +264 -0
  125. package/.output/public/trace-viewer/assets/urlMatch-BYQrIQwR.js +1 -0
  126. package/.output/public/trace-viewer/assets/xtermModule-CsJ4vdCR.js +9 -0
  127. package/.output/public/trace-viewer/codeMirrorModule.DYBRYzYX.css +1 -0
  128. package/.output/public/trace-viewer/codicon.DCmgc-ay.ttf +0 -0
  129. package/.output/public/trace-viewer/defaultSettingsView.CjdS-WJx.css +1 -0
  130. package/.output/public/trace-viewer/index.CzXZzn5A.css +1 -0
  131. package/.output/public/trace-viewer/index.DMMX1gXU.js +2 -0
  132. package/.output/public/trace-viewer/index.html +44 -0
  133. package/.output/public/trace-viewer/manifest.webmanifest +16 -0
  134. package/.output/public/trace-viewer/playwright-logo.svg +9 -0
  135. package/.output/public/trace-viewer/snapshot.html +10 -0
  136. package/.output/public/trace-viewer/snapshot.v8KI4P3m.js +2 -0
  137. package/.output/public/trace-viewer/sw.bundle.js +5 -0
  138. package/.output/public/trace-viewer/uiMode.BZQ54Kgt.css +1 -0
  139. package/.output/public/trace-viewer/uiMode.Ut8wwJNp.js +6 -0
  140. package/.output/public/trace-viewer/uiMode.html +18 -0
  141. package/.output/public/trace-viewer/xtermModule.DYP7pi_n.css +32 -0
  142. package/.output/server/chunks/_/users.mjs +1 -1
  143. package/.output/server/chunks/build/{BreadcrumbNav-DBnGj5Jq.mjs → BreadcrumbNav-Bg4QGX0k.mjs} +11 -4
  144. package/.output/server/chunks/build/BreadcrumbNav-Bg4QGX0k.mjs.map +1 -0
  145. package/.output/server/chunks/build/{BrowserBadge-vFb1ERG_.mjs → BrowserBadge-yMgLTBUu.mjs} +17 -9
  146. package/.output/server/chunks/build/BrowserBadge-yMgLTBUu.mjs.map +1 -0
  147. package/.output/server/chunks/build/{ChartMarkerLines-BXqUpUcs.mjs → ChartMarkerLines-D0cTRlxF.mjs} +3 -3
  148. package/.output/server/chunks/build/ChartMarkerLines-D0cTRlxF.mjs.map +1 -0
  149. package/.output/server/chunks/build/{ChartTooltip-DoF6Smyc.mjs → ChartTooltip-B2t6VYYH.mjs} +3 -3
  150. package/.output/server/chunks/build/ChartTooltip-B2t6VYYH.mjs.map +1 -0
  151. package/.output/server/chunks/build/Checkbox-ChSYhiUz.mjs +1 -1
  152. package/.output/server/chunks/build/ClientDate-U97Z1p6-.mjs +32 -0
  153. package/.output/server/chunks/build/ClientDate-U97Z1p6-.mjs.map +1 -0
  154. package/.output/server/chunks/build/{CodeBlock-CmvKHaq8.mjs → CodeBlock-DuWhmcI2.mjs} +3 -3
  155. package/.output/server/chunks/build/CodeBlock-DuWhmcI2.mjs.map +1 -0
  156. package/.output/server/chunks/build/DashboardSidebarToggle-a5KYecZ0.mjs +1 -1
  157. package/.output/server/chunks/build/DashboardToolbar-BZoGc0ri.mjs +72 -0
  158. package/.output/server/chunks/build/DashboardToolbar-BZoGc0ri.mjs.map +1 -0
  159. package/.output/server/chunks/build/{DataLocationCard-ChV02QJj.mjs → DataLocationCard-DCdhQBIY.mjs} +2 -2
  160. package/.output/server/chunks/build/DataLocationCard-DCdhQBIY.mjs.map +1 -0
  161. package/.output/server/chunks/build/{DesktopRunLocallyButton-BfmbZpiL.mjs → DesktopRunLocallyButton-ChHg3GqK.mjs} +5 -5
  162. package/.output/server/chunks/build/{DesktopRunLocallyButton-BfmbZpiL.mjs.map → DesktopRunLocallyButton-ChHg3GqK.mjs.map} +1 -1
  163. package/.output/server/chunks/build/{DiagnosisPanel-C_ndadzP.mjs → DiagnosisPanel-DE-r2UV8.mjs} +5 -5
  164. package/.output/server/chunks/build/DiagnosisPanel-DE-r2UV8.mjs.map +1 -0
  165. package/.output/server/chunks/build/{DiagnosisResult-GAjo6Lt3.mjs → DiagnosisResult-CrGK--xh.mjs} +16 -10
  166. package/.output/server/chunks/build/DiagnosisResult-CrGK--xh.mjs.map +1 -0
  167. package/.output/server/chunks/build/{DurationValue-CObiBDnH.mjs → DurationValue-Dn06XQk3.mjs} +2 -2
  168. package/.output/server/chunks/build/DurationValue-Dn06XQk3.mjs.map +1 -0
  169. package/.output/server/chunks/build/EntityLinks-BcpvMt_V.mjs +1 -1
  170. package/.output/server/chunks/build/EnvManagedBadge-_8GfjWjE.mjs +1 -1
  171. package/.output/server/chunks/build/{FeatureUnavailable-Buoyoqx1.mjs → FeatureUnavailable-IaBjVCqQ.mjs} +2 -2
  172. package/.output/server/chunks/build/FeatureUnavailable-IaBjVCqQ.mjs.map +1 -0
  173. package/.output/server/chunks/build/{GetStartedWizard-tL3U_qM1.mjs → GetStartedWizard-BiyxEXWP.mjs} +3 -3
  174. package/.output/server/chunks/build/GetStartedWizard-BiyxEXWP.mjs.map +1 -0
  175. package/.output/server/chunks/build/{HelpHint-C96TlqxY.mjs → HelpHint-CdBz6deq.mjs} +2 -2
  176. package/.output/server/chunks/build/HelpHint-CdBz6deq.mjs.map +1 -0
  177. package/.output/server/chunks/build/{MetaStripGroup-Cp2WCQf7.mjs → MetaStripGroup-CDyGlsNt.mjs} +94 -21
  178. package/.output/server/chunks/build/MetaStripGroup-CDyGlsNt.mjs.map +1 -0
  179. package/.output/server/chunks/build/{NavbarActions-VCHW0u67.mjs → NavbarActions-BTWxKCVI.mjs} +2 -2
  180. package/.output/server/chunks/build/NavbarActions-BTWxKCVI.mjs.map +1 -0
  181. package/.output/server/chunks/build/NavigationMenu-D4ZpdCm_.mjs +1 -1
  182. package/.output/server/chunks/build/OpenInIdeLink-Bnl-_som.mjs +1 -1
  183. package/.output/server/chunks/build/{ProjectTestCasesTable-saHYJoyQ.mjs → ProjectTestCasesTable-DJDAZ9NQ.mjs} +9 -9
  184. package/.output/server/chunks/build/ProjectTestCasesTable-DJDAZ9NQ.mjs.map +1 -0
  185. package/.output/server/chunks/build/{RunReports-CKYYRC59.mjs → RunReports-BSo2cCNx.mjs} +4 -4
  186. package/.output/server/chunks/build/RunReports-BSo2cCNx.mjs.map +1 -0
  187. package/.output/server/chunks/build/{RunStatusBadge-CWhmAmKb.mjs → RunStatusBadge-zfeSwcTx.mjs} +2 -2
  188. package/.output/server/chunks/build/RunStatusBadge-zfeSwcTx.mjs.map +1 -0
  189. package/.output/server/chunks/build/{SectionCard-BB1O3uXd.mjs → SectionCard-CKD1s0eF.mjs} +2 -2
  190. package/.output/server/chunks/build/SectionCard-CKD1s0eF.mjs.map +1 -0
  191. package/.output/server/chunks/build/Select-COU8NARj.mjs +1 -1
  192. package/.output/server/chunks/build/SelectMenu-BUwwc3Qt.mjs +1 -1
  193. package/.output/server/chunks/build/{SettingsField-CEasBHu3.mjs → SettingsField-CDnUtiCM.mjs} +3 -3
  194. package/.output/server/chunks/build/SettingsField-CDnUtiCM.mjs.map +1 -0
  195. package/.output/server/chunks/build/Table-BET-DOtX.mjs +1 -1
  196. package/.output/server/chunks/build/{TestCaseHistoryChart-BgI6P_zS.mjs → TestCaseHistoryChart-Do7WK-ZY.mjs} +16 -17
  197. package/.output/server/chunks/build/TestCaseHistoryChart-Do7WK-ZY.mjs.map +1 -0
  198. package/.output/server/chunks/build/{TestStatusBar-DR8jM5th.mjs → TestStatusBar-BipoEOzd.mjs} +15 -6
  199. package/.output/server/chunks/build/TestStatusBar-BipoEOzd.mjs.map +1 -0
  200. package/.output/server/chunks/build/Tooltip-CK0ucuXC.mjs +1 -1
  201. package/.output/server/chunks/build/{_id_-rQhFY0fN.mjs → _id_-BLPB189b.mjs} +16 -16
  202. package/.output/server/chunks/build/{_id_-rQhFY0fN.mjs.map → _id_-BLPB189b.mjs.map} +1 -1
  203. package/.output/server/chunks/build/{_id_-kkexEH_q.mjs → _id_-BeGJOSxY.mjs} +16 -16
  204. package/.output/server/chunks/build/_id_-BeGJOSxY.mjs.map +1 -0
  205. package/.output/server/chunks/build/{_id_-B7Dw490u.mjs → _id_-CfLEW45H.mjs} +472 -304
  206. package/.output/server/chunks/build/_id_-CfLEW45H.mjs.map +1 -0
  207. package/.output/server/chunks/build/{_id_-DVPb1S93.mjs → _id_-DxHe32cW.mjs} +654 -453
  208. package/.output/server/chunks/build/_id_-DxHe32cW.mjs.map +1 -0
  209. package/.output/server/chunks/build/{about-C4AbyQ4q.mjs → about-FLAssVsA.mjs} +5 -5
  210. package/.output/server/chunks/build/about-FLAssVsA.mjs.map +1 -0
  211. package/.output/server/chunks/build/{account-B45bYZd1.mjs → account-Cvz6KkYu.mjs} +4 -4
  212. package/.output/server/chunks/build/account-Cvz6KkYu.mjs.map +1 -0
  213. package/.output/server/chunks/build/{ai-CgN9xXFf.mjs → ai-DR9Zry7B.mjs} +8 -8
  214. package/.output/server/chunks/build/{ai-CgN9xXFf.mjs.map → ai-DR9Zry7B.mjs.map} +1 -1
  215. package/.output/server/chunks/build/{analytics-BRkiUpwa.mjs → analytics-CCAQayhv.mjs} +9 -9
  216. package/.output/server/chunks/build/{analytics-BRkiUpwa.mjs.map → analytics-CCAQayhv.mjs.map} +1 -1
  217. package/.output/server/chunks/build/{auto-heal-BnTdKHQq.mjs → auto-heal-ngiiiVmq.mjs} +4 -4
  218. package/.output/server/chunks/build/auto-heal-ngiiiVmq.mjs.map +1 -0
  219. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  220. package/.output/server/chunks/build/{default-BGOdM_zA.mjs → default-wYpdMMvh.mjs} +15 -13
  221. package/.output/server/chunks/build/{default-BGOdM_zA.mjs.map → default-wYpdMMvh.mjs.map} +1 -1
  222. package/.output/server/chunks/build/{docs-D7R5eJ1Z.mjs → docs-BX9DoKOI.mjs} +4 -4
  223. package/.output/server/chunks/build/{docs-D7R5eJ1Z.mjs.map → docs-BX9DoKOI.mjs.map} +1 -1
  224. package/.output/server/chunks/build/{edit-BbL3k6c3.mjs → edit-DnyBC4uC.mjs} +7 -7
  225. package/.output/server/chunks/build/{edit-BbL3k6c3.mjs.map → edit-DnyBC4uC.mjs.map} +1 -1
  226. package/.output/server/chunks/build/fetch-DOcN2mHf.mjs +1 -1
  227. package/.output/server/chunks/build/{help-content-BK3jcgLw.mjs → help-content-3QLSe6Vd.mjs} +3 -3
  228. package/.output/server/chunks/build/help-content-3QLSe6Vd.mjs.map +1 -0
  229. package/.output/server/chunks/build/{import-ibAn_HB9.mjs → import-S-w3MXez.mjs} +8 -8
  230. package/.output/server/chunks/build/import-S-w3MXez.mjs.map +1 -0
  231. package/.output/server/chunks/build/{index-D5A0DW7Y.mjs → index-BFr7JW_2.mjs} +4 -4
  232. package/.output/server/chunks/build/index-BFr7JW_2.mjs.map +1 -0
  233. package/.output/server/chunks/build/{index-CqinXTVs.mjs → index-CdzYiYiu.mjs} +9 -9
  234. package/.output/server/chunks/build/{index-CqinXTVs.mjs.map → index-CdzYiYiu.mjs.map} +1 -1
  235. package/.output/server/chunks/build/{index-DreB_S-d.mjs → index-CgYJur1z.mjs} +31 -23
  236. package/.output/server/chunks/build/index-CgYJur1z.mjs.map +1 -0
  237. package/.output/server/chunks/build/{index-2GmuPNF-.mjs → index-CjnZ521K.mjs} +22 -4
  238. package/.output/server/chunks/build/index-CjnZ521K.mjs.map +1 -0
  239. package/.output/server/chunks/build/{index-KsRegEjT.mjs → index-xgA4P1ht.mjs} +3218 -4087
  240. package/.output/server/chunks/build/index-xgA4P1ht.mjs.map +1 -0
  241. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs +1 -1
  242. package/.output/server/chunks/build/login-DueFS2RU.mjs +1 -1
  243. package/.output/server/chunks/build/{mcp-Dwj29-uG.mjs → mcp-DlZzubUF.mjs} +7 -7
  244. package/.output/server/chunks/build/mcp-DlZzubUF.mjs.map +1 -0
  245. package/.output/server/chunks/build/{notifications-CjAn5FJj.mjs → notifications-ByPVhyPX.mjs} +6 -6
  246. package/.output/server/chunks/build/notifications-ByPVhyPX.mjs.map +1 -0
  247. package/.output/server/chunks/build/{performance-DRzcu_c7.mjs → performance-Dc9FhaJr.mjs} +6 -6
  248. package/.output/server/chunks/build/performance-Dc9FhaJr.mjs.map +1 -0
  249. package/.output/server/chunks/build/{pr-feedback-DR60oGBf.mjs → pr-feedback-5kC_UmKG.mjs} +4 -4
  250. package/.output/server/chunks/build/pr-feedback-5kC_UmKG.mjs.map +1 -0
  251. package/.output/server/chunks/build/{selections-BjjolRZ9.mjs → selections-C6J9mI0s.mjs} +9 -9
  252. package/.output/server/chunks/build/selections-C6J9mI0s.mjs.map +1 -0
  253. package/.output/server/chunks/build/server.mjs +33 -33
  254. package/.output/server/chunks/build/{settings-B3NWV9tu.mjs → settings-DcCAv0U4.mjs} +17 -81
  255. package/.output/server/chunks/build/settings-DcCAv0U4.mjs.map +1 -0
  256. package/.output/server/chunks/build/{settings-metadata-DwJk8uSt.mjs → settings-metadata-B684YiW4.mjs} +2 -2
  257. package/.output/server/chunks/build/settings-metadata-B684YiW4.mjs.map +1 -0
  258. package/.output/server/chunks/build/{setup-BlgFTixN.mjs → setup-Cf3Mzf-W.mjs} +8 -8
  259. package/.output/server/chunks/build/{setup-BlgFTixN.mjs.map → setup-Cf3Mzf-W.mjs.map} +1 -1
  260. package/.output/server/chunks/build/{storage-C1O-FC0U.mjs → storage-B4VySiv3.mjs} +7 -7
  261. package/.output/server/chunks/build/storage-B4VySiv3.mjs.map +1 -0
  262. package/.output/server/chunks/build/{tags-dsvYrnii.mjs → tags-BvWdsd1F.mjs} +25 -11
  263. package/.output/server/chunks/build/tags-BvWdsd1F.mjs.map +1 -0
  264. package/.output/server/chunks/build/{test-cases-CFiOuyK6.mjs → test-cases-LIIu7dMu.mjs} +11 -11
  265. package/.output/server/chunks/build/test-cases-LIIu7dMu.mjs.map +1 -0
  266. package/.output/server/chunks/build/{test-functions-CbmBi6az.mjs → test-functions-Dv8nezrM.mjs} +8 -8
  267. package/.output/server/chunks/build/test-functions-Dv8nezrM.mjs.map +1 -0
  268. package/.output/server/chunks/build/{useCopyRich-DPKZKHvZ.mjs → useCopyRich-DRRKIts2.mjs} +17 -14
  269. package/.output/server/chunks/build/{useCopyRich-DPKZKHvZ.mjs.map → useCopyRich-DRRKIts2.mjs.map} +1 -1
  270. package/.output/server/chunks/build/{useDesktopDownload-R_RWSgUV.mjs → useDesktopDownload-CK-5nATq.mjs} +2 -2
  271. package/.output/server/chunks/build/useDesktopDownload-CK-5nATq.mjs.map +1 -0
  272. package/.output/server/chunks/build/{useDesktopLocalRuns-BdELBy0Y.mjs → useDesktopLocalRuns-BHZic4MJ.mjs} +3 -3
  273. package/.output/server/chunks/build/useDesktopLocalRuns-BHZic4MJ.mjs.map +1 -0
  274. package/.output/server/chunks/build/{useDesktopProjectLink-IUN7SIP2.mjs → useDesktopProjectLink-CqBvnXwG.mjs} +2 -2
  275. package/.output/server/chunks/build/useDesktopProjectLink-CqBvnXwG.mjs.map +1 -0
  276. package/.output/server/chunks/build/useOpenInIde-DS4YXevu.mjs +1 -1
  277. package/.output/server/chunks/build/{useSettingsNav-Dg87E7kY.mjs → useSettingsNav-dyHz-2Bz.mjs} +2 -2
  278. package/.output/server/chunks/build/useSettingsNav-dyHz-2Bz.mjs.map +1 -0
  279. package/.output/server/chunks/build/{users-DgsoiXxQ.mjs → users-CluLB8DL.mjs} +31 -13
  280. package/.output/server/chunks/build/users-CluLB8DL.mjs.map +1 -0
  281. package/.output/server/chunks/nitro/nitro.mjs +839 -680
  282. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  283. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +5 -2
  284. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs.map +1 -1
  285. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  286. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  287. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +42 -26
  288. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs.map +1 -1
  289. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  292. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  294. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  297. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +1 -1
  299. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +1 -0
  300. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  301. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  302. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  303. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  304. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  306. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  307. package/.output/server/chunks/routes/renderer.mjs +1 -1
  308. package/.output/server/chunks/routes/share/_token_.get.mjs +1 -1
  309. package/.output/server/index.mjs +1 -1
  310. package/.output/server/package.json +1 -1
  311. package/package.json +1 -1
  312. package/.output/public/_nuxt/3HmftUHT.js +0 -1
  313. package/.output/public/_nuxt/B7zo6PK8.js +0 -1
  314. package/.output/public/_nuxt/BO4sfkbw.js +0 -1
  315. package/.output/public/_nuxt/BdyXNI2_.js +0 -1
  316. package/.output/public/_nuxt/Bg63qh8W.js +0 -1
  317. package/.output/public/_nuxt/BnhWd06P.js +0 -1
  318. package/.output/public/_nuxt/CHWW6xiX.js +0 -1
  319. package/.output/public/_nuxt/CIPvUOic.js +0 -2
  320. package/.output/public/_nuxt/CVcFbORW.js +0 -9
  321. package/.output/public/_nuxt/CZlz5y13.js +0 -1
  322. package/.output/public/_nuxt/CkV_UG8j.js +0 -1
  323. package/.output/public/_nuxt/D0TpBpCc.js +0 -1
  324. package/.output/public/_nuxt/D3LyIeiJ.js +0 -1
  325. package/.output/public/_nuxt/DcccidY5.js +0 -4
  326. package/.output/public/_nuxt/DqkCbAzo.js +0 -1
  327. package/.output/public/_nuxt/DwH4SIZE.js +0 -1
  328. package/.output/public/_nuxt/DwZS0oRm.js +0 -2
  329. package/.output/public/_nuxt/DxPZIuWy.js +0 -1
  330. package/.output/public/_nuxt/Dyb1FouX.js +0 -1
  331. package/.output/public/_nuxt/builds/meta/a5fb24cc-65e3-4e55-aa12-038fe2de4754.json +0 -1
  332. package/.output/public/_nuxt/entry.BFe0Ua9k.css +0 -1
  333. package/.output/public/_nuxt/i7znB42v.js +0 -1
  334. package/.output/server/chunks/build/BreadcrumbNav-DBnGj5Jq.mjs.map +0 -1
  335. package/.output/server/chunks/build/BrowserBadge-vFb1ERG_.mjs.map +0 -1
  336. package/.output/server/chunks/build/ChartMarkerLines-BXqUpUcs.mjs.map +0 -1
  337. package/.output/server/chunks/build/ChartTooltip-DoF6Smyc.mjs.map +0 -1
  338. package/.output/server/chunks/build/CodeBlock-CmvKHaq8.mjs.map +0 -1
  339. package/.output/server/chunks/build/DataLocationCard-ChV02QJj.mjs.map +0 -1
  340. package/.output/server/chunks/build/DiagnosisPanel-C_ndadzP.mjs.map +0 -1
  341. package/.output/server/chunks/build/DiagnosisResult-GAjo6Lt3.mjs.map +0 -1
  342. package/.output/server/chunks/build/DurationValue-CObiBDnH.mjs.map +0 -1
  343. package/.output/server/chunks/build/FeatureUnavailable-Buoyoqx1.mjs.map +0 -1
  344. package/.output/server/chunks/build/GetStartedWizard-tL3U_qM1.mjs.map +0 -1
  345. package/.output/server/chunks/build/HelpHint-C96TlqxY.mjs.map +0 -1
  346. package/.output/server/chunks/build/MetaStripGroup-Cp2WCQf7.mjs.map +0 -1
  347. package/.output/server/chunks/build/NavbarActions-VCHW0u67.mjs.map +0 -1
  348. package/.output/server/chunks/build/ProjectTestCasesTable-saHYJoyQ.mjs.map +0 -1
  349. package/.output/server/chunks/build/RunReports-CKYYRC59.mjs.map +0 -1
  350. package/.output/server/chunks/build/RunStatusBadge-CWhmAmKb.mjs.map +0 -1
  351. package/.output/server/chunks/build/SectionCard-BB1O3uXd.mjs.map +0 -1
  352. package/.output/server/chunks/build/SettingsField-CEasBHu3.mjs.map +0 -1
  353. package/.output/server/chunks/build/TestCaseHistoryChart-BgI6P_zS.mjs.map +0 -1
  354. package/.output/server/chunks/build/TestStatusBar-DR8jM5th.mjs.map +0 -1
  355. package/.output/server/chunks/build/_id_-B7Dw490u.mjs.map +0 -1
  356. package/.output/server/chunks/build/_id_-DVPb1S93.mjs.map +0 -1
  357. package/.output/server/chunks/build/_id_-kkexEH_q.mjs.map +0 -1
  358. package/.output/server/chunks/build/about-C4AbyQ4q.mjs.map +0 -1
  359. package/.output/server/chunks/build/account-B45bYZd1.mjs.map +0 -1
  360. package/.output/server/chunks/build/auto-heal-BnTdKHQq.mjs.map +0 -1
  361. package/.output/server/chunks/build/help-content-BK3jcgLw.mjs.map +0 -1
  362. package/.output/server/chunks/build/import-ibAn_HB9.mjs.map +0 -1
  363. package/.output/server/chunks/build/index-2GmuPNF-.mjs.map +0 -1
  364. package/.output/server/chunks/build/index-D5A0DW7Y.mjs.map +0 -1
  365. package/.output/server/chunks/build/index-DreB_S-d.mjs.map +0 -1
  366. package/.output/server/chunks/build/index-KsRegEjT.mjs.map +0 -1
  367. package/.output/server/chunks/build/mcp-Dwj29-uG.mjs.map +0 -1
  368. package/.output/server/chunks/build/notifications-CjAn5FJj.mjs.map +0 -1
  369. package/.output/server/chunks/build/performance-DRzcu_c7.mjs.map +0 -1
  370. package/.output/server/chunks/build/pr-feedback-DR60oGBf.mjs.map +0 -1
  371. package/.output/server/chunks/build/selections-BjjolRZ9.mjs.map +0 -1
  372. package/.output/server/chunks/build/settings-B3NWV9tu.mjs.map +0 -1
  373. package/.output/server/chunks/build/settings-metadata-DwJk8uSt.mjs.map +0 -1
  374. package/.output/server/chunks/build/storage-C1O-FC0U.mjs.map +0 -1
  375. package/.output/server/chunks/build/tags-dsvYrnii.mjs.map +0 -1
  376. package/.output/server/chunks/build/test-cases-CFiOuyK6.mjs.map +0 -1
  377. package/.output/server/chunks/build/test-functions-CbmBi6az.mjs.map +0 -1
  378. package/.output/server/chunks/build/useDesktopDownload-R_RWSgUV.mjs.map +0 -1
  379. package/.output/server/chunks/build/useDesktopLocalRuns-BdELBy0Y.mjs.map +0 -1
  380. package/.output/server/chunks/build/useDesktopProjectLink-IUN7SIP2.mjs.map +0 -1
  381. package/.output/server/chunks/build/useSettingsNav-Dg87E7kY.mjs.map +0 -1
  382. package/.output/server/chunks/build/users-DgsoiXxQ.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import{x as St,az as vt,a as nt,r as Ct,aJ as wt,d as Rt,aa as ht,b as C,a2 as _t,a3 as Ft,a4 as yt,a5 as xt,b$ as $t,b1 as We,K as H,aM as Je,a6 as Pt,a7 as Vt,o as y,c as M,h as le,f as Fe,g as k,a1 as J,i as D,F as G,z as T,U as N,V as de,l as X,k as Ye,t as Qe,e as ee,W as Mt,L as It,v as L,b2 as Dt,bL as zt,a8 as At}from"./BdQ7kfxJ.js";import{u as Ot}from"./EJllK0wm.js";function Et(e){return e?e[0].toUpperCase()+e.slice(1):""}function K(e,o){return typeof e=="function"?e(o):e}function q(e,o){return t=>{o.setState(n=>({...n,[e]:K(t,n[e])}))}}function Se(e){return e instanceof Function}function Ht(e){return Array.isArray(e)&&e.every(o=>typeof o=="number")}function Gt(e,o){const t=[],n=i=>{i.forEach(r=>{t.push(r);const l=o(r);l!=null&&l.length&&n(l)})};return n(e),t}function w(e,o,t){let n=[],i;return r=>{let l;t.key&&t.debug&&(l=Date.now());const u=e(r);if(!(u.length!==n.length||u.some((c,S)=>n[S]!==c)))return i;n=u;let d;if(t.key&&t.debug&&(d=Date.now()),i=o(...u),t==null||t.onChange==null||t.onChange(i),t.key&&t.debug&&t!=null&&t.debug()){const c=Math.round((Date.now()-l)*100)/100,S=Math.round((Date.now()-d)*100)/100,g=S/16,s=(f,p)=>{for(f=String(f);f.length<p;)f=" "+f;return f};console.info(`%c⏱ ${s(S,5)} /${s(c,5)} ms`,`
1
+ import{x as St,az as vt,a as nt,r as Ct,aJ as wt,d as Rt,aa as ht,b as C,a2 as _t,a3 as Ft,a4 as yt,a5 as xt,b$ as $t,b1 as We,K as H,aM as Je,a6 as Pt,a7 as Vt,o as y,c as M,h as le,f as Fe,g as k,a1 as J,i as D,F as G,z as T,U as N,V as de,l as X,k as Ye,t as Qe,e as ee,W as Mt,L as It,v as L,b2 as Dt,bL as zt,a8 as At}from"./1QWBzxLM.js";import{u as Ot}from"./VBTxfbqU.js";function Et(e){return e?e[0].toUpperCase()+e.slice(1):""}function K(e,o){return typeof e=="function"?e(o):e}function q(e,o){return t=>{o.setState(n=>({...n,[e]:K(t,n[e])}))}}function Se(e){return e instanceof Function}function Ht(e){return Array.isArray(e)&&e.every(o=>typeof o=="number")}function Gt(e,o){const t=[],n=i=>{i.forEach(r=>{t.push(r);const l=o(r);l!=null&&l.length&&n(l)})};return n(e),t}function w(e,o,t){let n=[],i;return r=>{let l;t.key&&t.debug&&(l=Date.now());const u=e(r);if(!(u.length!==n.length||u.some((c,S)=>n[S]!==c)))return i;n=u;let d;if(t.key&&t.debug&&(d=Date.now()),i=o(...u),t==null||t.onChange==null||t.onChange(i),t.key&&t.debug&&t!=null&&t.debug()){const c=Math.round((Date.now()-l)*100)/100,S=Math.round((Date.now()-d)*100)/100,g=S/16,s=(f,p)=>{for(f=String(f);f.length<p;)f=" "+f;return f};console.info(`%c⏱ ${s(S,5)} /${s(c,5)} ms`,`
2
2
  font-size: .6rem;
3
3
  font-weight: bold;
4
4
  color: hsl(${Math.max(0,Math.min(120-120*g,120))}deg 100% 31%);`,t?.key)}return i}}function R(e,o,t,n){return{debug:()=>{var i;return(i=e?.debugAll)!=null?i:e[o]},key:!1,onChange:n}}function Lt(e,o,t,n){const i=()=>{var l;return(l=r.getValue())!=null?l:e.options.renderFallbackValue},r={id:`${o.id}_${t.id}`,row:o,column:t,getValue:()=>o.getValue(n),renderValue:i,getContext:w(()=>[e,t,o,r],(l,u,a,d)=>({table:l,column:u,row:a,cell:d,getValue:d.getValue,renderValue:d.renderValue}),R(e.options,"debugCells"))};return e._features.forEach(l=>{l.createCell==null||l.createCell(r,t,o,e)},{}),r}function qt(e,o,t,n){var i,r;const u={...e._getDefaultColumnDef(),...o},a=u.accessorKey;let d=(i=(r=u.id)!=null?r:a?typeof String.prototype.replaceAll=="function"?a.replaceAll(".","_"):a.replace(/\./g,"_"):void 0)!=null?i:typeof u.header=="string"?u.header:void 0,c;if(u.accessorFn?c=u.accessorFn:a&&(a.includes(".")?c=g=>{let s=g;for(const p of a.split(".")){var f;s=(f=s)==null?void 0:f[p]}return s}:c=g=>g[u.accessorKey]),!d)throw new Error;let S={id:`${String(d)}`,accessorFn:c,parent:n,depth:t,columnDef:u,columns:[],getFlatColumns:w(()=>[!0],()=>{var g;return[S,...(g=S.columns)==null?void 0:g.flatMap(s=>s.getFlatColumns())]},R(e.options,"debugColumns")),getLeafColumns:w(()=>[e._getOrderColumnsFn()],g=>{var s;if((s=S.columns)!=null&&s.length){let f=S.columns.flatMap(p=>p.getLeafColumns());return g(f)}return[S]},R(e.options,"debugColumns"))};for(const g of e._features)g.createColumn==null||g.createColumn(S,e);return S}const z="debugHeaders";function Ze(e,o,t){var n;let r={id:(n=t.id)!=null?n:o.id,column:o,index:t.index,isPlaceholder:!!t.isPlaceholder,placeholderId:t.placeholderId,depth:t.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{const l=[],u=a=>{a.subHeaders&&a.subHeaders.length&&a.subHeaders.map(u),l.push(a)};return u(r),l},getContext:()=>({table:e,header:r,column:o})};return e._features.forEach(l=>{l.createHeader==null||l.createHeader(r,e)}),r}const kt={createTable:e=>{e.getHeaderGroups=w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(o,t,n,i)=>{var r,l;const u=(r=n?.map(S=>t.find(g=>g.id===S)).filter(Boolean))!=null?r:[],a=(l=i?.map(S=>t.find(g=>g.id===S)).filter(Boolean))!=null?l:[],d=t.filter(S=>!(n!=null&&n.includes(S.id))&&!(i!=null&&i.includes(S.id)));return ce(o,[...u,...d,...a],e)},R(e.options,z)),e.getCenterHeaderGroups=w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(o,t,n,i)=>(t=t.filter(r=>!(n!=null&&n.includes(r.id))&&!(i!=null&&i.includes(r.id))),ce(o,t,e,"center")),R(e.options,z)),e.getLeftHeaderGroups=w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(o,t,n)=>{var i;const r=(i=n?.map(l=>t.find(u=>u.id===l)).filter(Boolean))!=null?i:[];return ce(o,r,e,"left")},R(e.options,z)),e.getRightHeaderGroups=w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(o,t,n)=>{var i;const r=(i=n?.map(l=>t.find(u=>u.id===l)).filter(Boolean))!=null?i:[];return ce(o,r,e,"right")},R(e.options,z)),e.getFooterGroups=w(()=>[e.getHeaderGroups()],o=>[...o].reverse(),R(e.options,z)),e.getLeftFooterGroups=w(()=>[e.getLeftHeaderGroups()],o=>[...o].reverse(),R(e.options,z)),e.getCenterFooterGroups=w(()=>[e.getCenterHeaderGroups()],o=>[...o].reverse(),R(e.options,z)),e.getRightFooterGroups=w(()=>[e.getRightHeaderGroups()],o=>[...o].reverse(),R(e.options,z)),e.getFlatHeaders=w(()=>[e.getHeaderGroups()],o=>o.map(t=>t.headers).flat(),R(e.options,z)),e.getLeftFlatHeaders=w(()=>[e.getLeftHeaderGroups()],o=>o.map(t=>t.headers).flat(),R(e.options,z)),e.getCenterFlatHeaders=w(()=>[e.getCenterHeaderGroups()],o=>o.map(t=>t.headers).flat(),R(e.options,z)),e.getRightFlatHeaders=w(()=>[e.getRightHeaderGroups()],o=>o.map(t=>t.headers).flat(),R(e.options,z)),e.getCenterLeafHeaders=w(()=>[e.getCenterFlatHeaders()],o=>o.filter(t=>{var n;return!((n=t.subHeaders)!=null&&n.length)}),R(e.options,z)),e.getLeftLeafHeaders=w(()=>[e.getLeftFlatHeaders()],o=>o.filter(t=>{var n;return!((n=t.subHeaders)!=null&&n.length)}),R(e.options,z)),e.getRightLeafHeaders=w(()=>[e.getRightFlatHeaders()],o=>o.filter(t=>{var n;return!((n=t.subHeaders)!=null&&n.length)}),R(e.options,z)),e.getLeafHeaders=w(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(o,t,n)=>{var i,r,l,u,a,d;return[...(i=(r=o[0])==null?void 0:r.headers)!=null?i:[],...(l=(u=t[0])==null?void 0:u.headers)!=null?l:[],...(a=(d=n[0])==null?void 0:d.headers)!=null?a:[]].map(c=>c.getLeafHeaders()).flat()},R(e.options,z))}};function ce(e,o,t,n){var i,r;let l=0;const u=function(g,s){s===void 0&&(s=1),l=Math.max(l,s),g.filter(f=>f.getIsVisible()).forEach(f=>{var p;(p=f.columns)!=null&&p.length&&u(f.columns,s+1)},0)};u(e);let a=[];const d=(g,s)=>{const f={depth:s,id:[n,`${s}`].filter(Boolean).join("_"),headers:[]},p=[];g.forEach(h=>{const F=[...p].reverse()[0],$=h.column.depth===f.depth;let P,A=!1;if($&&h.column.parent?P=h.column.parent:(P=h.column,A=!0),F&&F?.column===P)F.subHeaders.push(h);else{const I=Ze(t,P,{id:[n,s,P.id,h?.id].filter(Boolean).join("_"),isPlaceholder:A,placeholderId:A?`${p.filter(b=>b.column===P).length}`:void 0,depth:s,index:p.length});I.subHeaders.push(h),p.push(I)}f.headers.push(h),h.headerGroup=f}),a.push(f),s>0&&d(p,s-1)},c=o.map((g,s)=>Ze(t,g,{depth:l,index:s}));d(c,l-1),a.reverse();const S=g=>g.filter(f=>f.column.getIsVisible()).map(f=>{let p=0,h=0,F=[0];f.subHeaders&&f.subHeaders.length?(F=[],S(f.subHeaders).forEach(P=>{let{colSpan:A,rowSpan:I}=P;p+=A,F.push(I)})):p=1;const $=Math.min(...F);return h=h+$,f.colSpan=p,f.rowSpan=h,{colSpan:p,rowSpan:h}});return S((i=(r=a[0])==null?void 0:r.headers)!=null?i:[]),a}const Le=(e,o,t,n,i,r,l)=>{let u={id:o,index:n,original:t,depth:i,parentId:l,_valuesCache:{},_uniqueValuesCache:{},getValue:a=>{if(u._valuesCache.hasOwnProperty(a))return u._valuesCache[a];const d=e.getColumn(a);if(d!=null&&d.accessorFn)return u._valuesCache[a]=d.accessorFn(u.original,n),u._valuesCache[a]},getUniqueValues:a=>{if(u._uniqueValuesCache.hasOwnProperty(a))return u._uniqueValuesCache[a];const d=e.getColumn(a);if(d!=null&&d.accessorFn)return d.columnDef.getUniqueValues?(u._uniqueValuesCache[a]=d.columnDef.getUniqueValues(u.original,n),u._uniqueValuesCache[a]):(u._uniqueValuesCache[a]=[u.getValue(a)],u._uniqueValuesCache[a])},renderValue:a=>{var d;return(d=u.getValue(a))!=null?d:e.options.renderFallbackValue},subRows:[],getLeafRows:()=>Gt(u.subRows,a=>a.subRows),getParentRow:()=>u.parentId?e.getRow(u.parentId,!0):void 0,getParentRows:()=>{let a=[],d=u;for(;;){const c=d.getParentRow();if(!c)break;a.push(c),d=c}return a.reverse()},getAllCells:w(()=>[e.getAllLeafColumns()],a=>a.map(d=>Lt(e,u,d,d.id)),R(e.options,"debugRows")),_getAllCellsByColumnId:w(()=>[u.getAllCells()],a=>a.reduce((d,c)=>(d[c.column.id]=c,d),{}),R(e.options,"debugRows"))};for(let a=0;a<e._features.length;a++){const d=e._features[a];d==null||d.createRow==null||d.createRow(u,e)}return u},Bt={createColumn:(e,o)=>{e._getFacetedRowModel=o.options.getFacetedRowModel&&o.options.getFacetedRowModel(o,e.id),e.getFacetedRowModel=()=>e._getFacetedRowModel?e._getFacetedRowModel():o.getPreFilteredRowModel(),e._getFacetedUniqueValues=o.options.getFacetedUniqueValues&&o.options.getFacetedUniqueValues(o,e.id),e.getFacetedUniqueValues=()=>e._getFacetedUniqueValues?e._getFacetedUniqueValues():new Map,e._getFacetedMinMaxValues=o.options.getFacetedMinMaxValues&&o.options.getFacetedMinMaxValues(o,e.id),e.getFacetedMinMaxValues=()=>{if(e._getFacetedMinMaxValues)return e._getFacetedMinMaxValues()}}},ot=(e,o,t)=>{var n,i;const r=t==null||(n=t.toString())==null?void 0:n.toLowerCase();return!!(!((i=e.getValue(o))==null||(i=i.toString())==null||(i=i.toLowerCase())==null)&&i.includes(r))};ot.autoRemove=e=>B(e);const it=(e,o,t)=>{var n;return!!(!((n=e.getValue(o))==null||(n=n.toString())==null)&&n.includes(t))};it.autoRemove=e=>B(e);const rt=(e,o,t)=>{var n;return((n=e.getValue(o))==null||(n=n.toString())==null?void 0:n.toLowerCase())===t?.toLowerCase()};rt.autoRemove=e=>B(e);const lt=(e,o,t)=>{var n;return(n=e.getValue(o))==null?void 0:n.includes(t)};lt.autoRemove=e=>B(e);const st=(e,o,t)=>!t.some(n=>{var i;return!((i=e.getValue(o))!=null&&i.includes(n))});st.autoRemove=e=>B(e)||!(e!=null&&e.length);const ut=(e,o,t)=>t.some(n=>{var i;return(i=e.getValue(o))==null?void 0:i.includes(n)});ut.autoRemove=e=>B(e)||!(e!=null&&e.length);const at=(e,o,t)=>e.getValue(o)===t;at.autoRemove=e=>B(e);const gt=(e,o,t)=>e.getValue(o)==t;gt.autoRemove=e=>B(e);const qe=(e,o,t)=>{let[n,i]=t;const r=e.getValue(o);return r>=n&&r<=i};qe.resolveFilterValue=e=>{let[o,t]=e,n=typeof o!="number"?parseFloat(o):o,i=typeof t!="number"?parseFloat(t):t,r=o===null||Number.isNaN(n)?-1/0:n,l=t===null||Number.isNaN(i)?1/0:i;if(r>l){const u=r;r=l,l=u}return[r,l]};qe.autoRemove=e=>B(e)||B(e[0])&&B(e[1]);const U={includesString:ot,includesStringSensitive:it,equalsString:rt,arrIncludes:lt,arrIncludesAll:st,arrIncludesSome:ut,equals:at,weakEquals:gt,inNumberRange:qe};function B(e){return e==null||e===""}const bt={getDefaultColumnDef:()=>({filterFn:"auto"}),getInitialState:e=>({columnFilters:[],...e}),getDefaultOptions:e=>({onColumnFiltersChange:q("columnFilters",e),filterFromLeafRows:!1,maxLeafRowFilterDepth:100}),createColumn:(e,o)=>{e.getAutoFilterFn=()=>{const t=o.getCoreRowModel().flatRows[0],n=t?.getValue(e.id);return typeof n=="string"?U.includesString:typeof n=="number"?U.inNumberRange:typeof n=="boolean"||n!==null&&typeof n=="object"?U.equals:Array.isArray(n)?U.arrIncludes:U.weakEquals},e.getFilterFn=()=>{var t,n;return Se(e.columnDef.filterFn)?e.columnDef.filterFn:e.columnDef.filterFn==="auto"?e.getAutoFilterFn():(t=(n=o.options.filterFns)==null?void 0:n[e.columnDef.filterFn])!=null?t:U[e.columnDef.filterFn]},e.getCanFilter=()=>{var t,n,i;return((t=e.columnDef.enableColumnFilter)!=null?t:!0)&&((n=o.options.enableColumnFilters)!=null?n:!0)&&((i=o.options.enableFilters)!=null?i:!0)&&!!e.accessorFn},e.getIsFiltered=()=>e.getFilterIndex()>-1,e.getFilterValue=()=>{var t;return(t=o.getState().columnFilters)==null||(t=t.find(n=>n.id===e.id))==null?void 0:t.value},e.getFilterIndex=()=>{var t,n;return(t=(n=o.getState().columnFilters)==null?void 0:n.findIndex(i=>i.id===e.id))!=null?t:-1},e.setFilterValue=t=>{o.setColumnFilters(n=>{const i=e.getFilterFn(),r=n?.find(c=>c.id===e.id),l=K(t,r?r.value:void 0);if(et(i,l,e)){var u;return(u=n?.filter(c=>c.id!==e.id))!=null?u:[]}const a={id:e.id,value:l};if(r){var d;return(d=n?.map(c=>c.id===e.id?a:c))!=null?d:[]}return n!=null&&n.length?[...n,a]:[a]})}},createRow:(e,o)=>{e.columnFilters={},e.columnFiltersMeta={}},createTable:e=>{e.setColumnFilters=o=>{const t=e.getAllLeafColumns(),n=i=>{var r;return(r=K(o,i))==null?void 0:r.filter(l=>{const u=t.find(a=>a.id===l.id);if(u){const a=u.getFilterFn();if(et(a,l.value,u))return!1}return!0})};e.options.onColumnFiltersChange==null||e.options.onColumnFiltersChange(n)},e.resetColumnFilters=o=>{var t,n;e.setColumnFilters(o?[]:(t=(n=e.initialState)==null?void 0:n.columnFilters)!=null?t:[])},e.getPreFilteredRowModel=()=>e.getCoreRowModel(),e.getFilteredRowModel=()=>(!e._getFilteredRowModel&&e.options.getFilteredRowModel&&(e._getFilteredRowModel=e.options.getFilteredRowModel(e)),e.options.manualFiltering||!e._getFilteredRowModel?e.getPreFilteredRowModel():e._getFilteredRowModel())}};function et(e,o,t){return(e&&e.autoRemove?e.autoRemove(o,t):!1)||typeof o>"u"||typeof o=="string"&&!o}const jt=(e,o,t)=>t.reduce((n,i)=>{const r=i.getValue(e);return n+(typeof r=="number"?r:0)},0),Tt=(e,o,t)=>{let n;return t.forEach(i=>{const r=i.getValue(e);r!=null&&(n>r||n===void 0&&r>=r)&&(n=r)}),n},Nt=(e,o,t)=>{let n;return t.forEach(i=>{const r=i.getValue(e);r!=null&&(n<r||n===void 0&&r>=r)&&(n=r)}),n},Ut=(e,o,t)=>{let n,i;return t.forEach(r=>{const l=r.getValue(e);l!=null&&(n===void 0?l>=l&&(n=i=l):(n>l&&(n=l),i<l&&(i=l)))}),[n,i]},Xt=(e,o)=>{let t=0,n=0;if(o.forEach(i=>{let r=i.getValue(e);r!=null&&(r=+r)>=r&&(++t,n+=r)}),t)return n/t},Kt=(e,o)=>{if(!o.length)return;const t=o.map(r=>r.getValue(e));if(!Ht(t))return;if(t.length===1)return t[0];const n=Math.floor(t.length/2),i=t.sort((r,l)=>r-l);return t.length%2!==0?i[n]:(i[n-1]+i[n])/2},Wt=(e,o)=>Array.from(new Set(o.map(t=>t.getValue(e))).values()),Jt=(e,o)=>new Set(o.map(t=>t.getValue(e))).size,Yt=(e,o)=>o.length,ye={sum:jt,min:Tt,max:Nt,extent:Ut,mean:Xt,median:Kt,unique:Wt,uniqueCount:Jt,count:Yt},Qt={getDefaultColumnDef:()=>({aggregatedCell:e=>{var o,t;return(o=(t=e.getValue())==null||t.toString==null?void 0:t.toString())!=null?o:null},aggregationFn:"auto"}),getInitialState:e=>({grouping:[],...e}),getDefaultOptions:e=>({onGroupingChange:q("grouping",e),groupedColumnMode:"reorder"}),createColumn:(e,o)=>{e.toggleGrouping=()=>{o.setGrouping(t=>t!=null&&t.includes(e.id)?t.filter(n=>n!==e.id):[...t??[],e.id])},e.getCanGroup=()=>{var t,n;return((t=e.columnDef.enableGrouping)!=null?t:!0)&&((n=o.options.enableGrouping)!=null?n:!0)&&(!!e.accessorFn||!!e.columnDef.getGroupingValue)},e.getIsGrouped=()=>{var t;return(t=o.getState().grouping)==null?void 0:t.includes(e.id)},e.getGroupedIndex=()=>{var t;return(t=o.getState().grouping)==null?void 0:t.indexOf(e.id)},e.getToggleGroupingHandler=()=>{const t=e.getCanGroup();return()=>{t&&e.toggleGrouping()}},e.getAutoAggregationFn=()=>{const t=o.getCoreRowModel().flatRows[0],n=t?.getValue(e.id);if(typeof n=="number")return ye.sum;if(Object.prototype.toString.call(n)==="[object Date]")return ye.extent},e.getAggregationFn=()=>{var t,n;if(!e)throw new Error;return Se(e.columnDef.aggregationFn)?e.columnDef.aggregationFn:e.columnDef.aggregationFn==="auto"?e.getAutoAggregationFn():(t=(n=o.options.aggregationFns)==null?void 0:n[e.columnDef.aggregationFn])!=null?t:ye[e.columnDef.aggregationFn]}},createTable:e=>{e.setGrouping=o=>e.options.onGroupingChange==null?void 0:e.options.onGroupingChange(o),e.resetGrouping=o=>{var t,n;e.setGrouping(o?[]:(t=(n=e.initialState)==null?void 0:n.grouping)!=null?t:[])},e.getPreGroupedRowModel=()=>e.getFilteredRowModel(),e.getGroupedRowModel=()=>(!e._getGroupedRowModel&&e.options.getGroupedRowModel&&(e._getGroupedRowModel=e.options.getGroupedRowModel(e)),e.options.manualGrouping||!e._getGroupedRowModel?e.getPreGroupedRowModel():e._getGroupedRowModel())},createRow:(e,o)=>{e.getIsGrouped=()=>!!e.groupingColumnId,e.getGroupingValue=t=>{if(e._groupingValuesCache.hasOwnProperty(t))return e._groupingValuesCache[t];const n=o.getColumn(t);return n!=null&&n.columnDef.getGroupingValue?(e._groupingValuesCache[t]=n.columnDef.getGroupingValue(e.original),e._groupingValuesCache[t]):e.getValue(t)},e._groupingValuesCache={}},createCell:(e,o,t,n)=>{e.getIsGrouped=()=>o.getIsGrouped()&&o.id===t.groupingColumnId,e.getIsPlaceholder=()=>!e.getIsGrouped()&&o.getIsGrouped(),e.getIsAggregated=()=>{var i;return!e.getIsGrouped()&&!e.getIsPlaceholder()&&!!((i=t.subRows)!=null&&i.length)}}};function Zt(e,o,t){if(!(o!=null&&o.length)||!t)return e;const n=e.filter(r=>!o.includes(r.id));return t==="remove"?n:[...o.map(r=>e.find(l=>l.id===r)).filter(Boolean),...n]}const en={getInitialState:e=>({columnOrder:[],...e}),getDefaultOptions:e=>({onColumnOrderChange:q("columnOrder",e)}),createColumn:(e,o)=>{e.getIndex=w(t=>[ae(o,t)],t=>t.findIndex(n=>n.id===e.id),R(o.options,"debugColumns")),e.getIsFirstColumn=t=>{var n;return((n=ae(o,t)[0])==null?void 0:n.id)===e.id},e.getIsLastColumn=t=>{var n;const i=ae(o,t);return((n=i[i.length-1])==null?void 0:n.id)===e.id}},createTable:e=>{e.setColumnOrder=o=>e.options.onColumnOrderChange==null?void 0:e.options.onColumnOrderChange(o),e.resetColumnOrder=o=>{var t;e.setColumnOrder(o?[]:(t=e.initialState.columnOrder)!=null?t:[])},e._getOrderColumnsFn=w(()=>[e.getState().columnOrder,e.getState().grouping,e.options.groupedColumnMode],(o,t,n)=>i=>{let r=[];if(!(o!=null&&o.length))r=i;else{const l=[...o],u=[...i];for(;u.length&&l.length;){const a=l.shift(),d=u.findIndex(c=>c.id===a);d>-1&&r.push(u.splice(d,1)[0])}r=[...r,...u]}return Zt(r,t,n)},R(e.options,"debugTable"))}},xe=()=>({left:[],right:[]}),tn={getInitialState:e=>({columnPinning:xe(),...e}),getDefaultOptions:e=>({onColumnPinningChange:q("columnPinning",e)}),createColumn:(e,o)=>{e.pin=t=>{const n=e.getLeafColumns().map(i=>i.id).filter(Boolean);o.setColumnPinning(i=>{var r,l;if(t==="right"){var u,a;return{left:((u=i?.left)!=null?u:[]).filter(S=>!(n!=null&&n.includes(S))),right:[...((a=i?.right)!=null?a:[]).filter(S=>!(n!=null&&n.includes(S))),...n]}}if(t==="left"){var d,c;return{left:[...((d=i?.left)!=null?d:[]).filter(S=>!(n!=null&&n.includes(S))),...n],right:((c=i?.right)!=null?c:[]).filter(S=>!(n!=null&&n.includes(S)))}}return{left:((r=i?.left)!=null?r:[]).filter(S=>!(n!=null&&n.includes(S))),right:((l=i?.right)!=null?l:[]).filter(S=>!(n!=null&&n.includes(S)))}})},e.getCanPin=()=>e.getLeafColumns().some(n=>{var i,r,l;return((i=n.columnDef.enablePinning)!=null?i:!0)&&((r=(l=o.options.enableColumnPinning)!=null?l:o.options.enablePinning)!=null?r:!0)}),e.getIsPinned=()=>{const t=e.getLeafColumns().map(u=>u.id),{left:n,right:i}=o.getState().columnPinning,r=t.some(u=>n?.includes(u)),l=t.some(u=>i?.includes(u));return r?"left":l?"right":!1},e.getPinnedIndex=()=>{var t,n;const i=e.getIsPinned();return i?(t=(n=o.getState().columnPinning)==null||(n=n[i])==null?void 0:n.indexOf(e.id))!=null?t:-1:0}},createRow:(e,o)=>{e.getCenterVisibleCells=w(()=>[e._getAllVisibleCells(),o.getState().columnPinning.left,o.getState().columnPinning.right],(t,n,i)=>{const r=[...n??[],...i??[]];return t.filter(l=>!r.includes(l.column.id))},R(o.options,"debugRows")),e.getLeftVisibleCells=w(()=>[e._getAllVisibleCells(),o.getState().columnPinning.left],(t,n)=>(n??[]).map(r=>t.find(l=>l.column.id===r)).filter(Boolean).map(r=>({...r,position:"left"})),R(o.options,"debugRows")),e.getRightVisibleCells=w(()=>[e._getAllVisibleCells(),o.getState().columnPinning.right],(t,n)=>(n??[]).map(r=>t.find(l=>l.column.id===r)).filter(Boolean).map(r=>({...r,position:"right"})),R(o.options,"debugRows"))},createTable:e=>{e.setColumnPinning=o=>e.options.onColumnPinningChange==null?void 0:e.options.onColumnPinningChange(o),e.resetColumnPinning=o=>{var t,n;return e.setColumnPinning(o?xe():(t=(n=e.initialState)==null?void 0:n.columnPinning)!=null?t:xe())},e.getIsSomeColumnsPinned=o=>{var t;const n=e.getState().columnPinning;if(!o){var i,r;return!!((i=n.left)!=null&&i.length||(r=n.right)!=null&&r.length)}return!!((t=n[o])!=null&&t.length)},e.getLeftLeafColumns=w(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left],(o,t)=>(t??[]).map(n=>o.find(i=>i.id===n)).filter(Boolean),R(e.options,"debugColumns")),e.getRightLeafColumns=w(()=>[e.getAllLeafColumns(),e.getState().columnPinning.right],(o,t)=>(t??[]).map(n=>o.find(i=>i.id===n)).filter(Boolean),R(e.options,"debugColumns")),e.getCenterLeafColumns=w(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(o,t,n)=>{const i=[...t??[],...n??[]];return o.filter(r=>!i.includes(r.id))},R(e.options,"debugColumns"))}};function nn(e){return e||(typeof document<"u"?document:null)}const fe={size:150,minSize:20,maxSize:Number.MAX_SAFE_INTEGER},$e=()=>({startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,isResizingColumn:!1,columnSizingStart:[]}),on={getDefaultColumnDef:()=>fe,getInitialState:e=>({columnSizing:{},columnSizingInfo:$e(),...e}),getDefaultOptions:e=>({columnResizeMode:"onEnd",columnResizeDirection:"ltr",onColumnSizingChange:q("columnSizing",e),onColumnSizingInfoChange:q("columnSizingInfo",e)}),createColumn:(e,o)=>{e.getSize=()=>{var t,n,i;const r=o.getState().columnSizing[e.id];return Math.min(Math.max((t=e.columnDef.minSize)!=null?t:fe.minSize,(n=r??e.columnDef.size)!=null?n:fe.size),(i=e.columnDef.maxSize)!=null?i:fe.maxSize)},e.getStart=w(t=>[t,ae(o,t),o.getState().columnSizing],(t,n)=>n.slice(0,e.getIndex(t)).reduce((i,r)=>i+r.getSize(),0),R(o.options,"debugColumns")),e.getAfter=w(t=>[t,ae(o,t),o.getState().columnSizing],(t,n)=>n.slice(e.getIndex(t)+1).reduce((i,r)=>i+r.getSize(),0),R(o.options,"debugColumns")),e.resetSize=()=>{o.setColumnSizing(t=>{let{[e.id]:n,...i}=t;return i})},e.getCanResize=()=>{var t,n;return((t=e.columnDef.enableResizing)!=null?t:!0)&&((n=o.options.enableColumnResizing)!=null?n:!0)},e.getIsResizing=()=>o.getState().columnSizingInfo.isResizingColumn===e.id},createHeader:(e,o)=>{e.getSize=()=>{let t=0;const n=i=>{if(i.subHeaders.length)i.subHeaders.forEach(n);else{var r;t+=(r=i.column.getSize())!=null?r:0}};return n(e),t},e.getStart=()=>{if(e.index>0){const t=e.headerGroup.headers[e.index-1];return t.getStart()+t.getSize()}return 0},e.getResizeHandler=t=>{const n=o.getColumn(e.column.id),i=n?.getCanResize();return r=>{if(!n||!i||(r.persist==null||r.persist(),Pe(r)&&r.touches&&r.touches.length>1))return;const l=e.getSize(),u=e?e.getLeafHeaders().map(F=>[F.column.id,F.column.getSize()]):[[n.id,n.getSize()]],a=Pe(r)?Math.round(r.touches[0].clientX):r.clientX,d={},c=(F,$)=>{typeof $=="number"&&(o.setColumnSizingInfo(P=>{var A,I;const b=o.options.columnResizeDirection==="rtl"?-1:1,Y=($-((A=P?.startOffset)!=null?A:0))*b,Q=Math.max(Y/((I=P?.startSize)!=null?I:0),-.999999);return P.columnSizingStart.forEach(te=>{let[ne,Z]=te;d[ne]=Math.round(Math.max(Z+Z*Q,0)*100)/100}),{...P,deltaOffset:Y,deltaPercentage:Q}}),(o.options.columnResizeMode==="onChange"||F==="end")&&o.setColumnSizing(P=>({...P,...d})))},S=F=>c("move",F),g=F=>{c("end",F),o.setColumnSizingInfo($=>({...$,isResizingColumn:!1,startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,columnSizingStart:[]}))},s=nn(t),f={moveHandler:F=>S(F.clientX),upHandler:F=>{s?.removeEventListener("mousemove",f.moveHandler),s?.removeEventListener("mouseup",f.upHandler),g(F.clientX)}},p={moveHandler:F=>(F.cancelable&&(F.preventDefault(),F.stopPropagation()),S(F.touches[0].clientX),!1),upHandler:F=>{var $;s?.removeEventListener("touchmove",p.moveHandler),s?.removeEventListener("touchend",p.upHandler),F.cancelable&&(F.preventDefault(),F.stopPropagation()),g(($=F.touches[0])==null?void 0:$.clientX)}},h=rn()?{passive:!1}:!1;Pe(r)?(s?.addEventListener("touchmove",p.moveHandler,h),s?.addEventListener("touchend",p.upHandler,h)):(s?.addEventListener("mousemove",f.moveHandler,h),s?.addEventListener("mouseup",f.upHandler,h)),o.setColumnSizingInfo(F=>({...F,startOffset:a,startSize:l,deltaOffset:0,deltaPercentage:0,columnSizingStart:u,isResizingColumn:n.id}))}}},createTable:e=>{e.setColumnSizing=o=>e.options.onColumnSizingChange==null?void 0:e.options.onColumnSizingChange(o),e.setColumnSizingInfo=o=>e.options.onColumnSizingInfoChange==null?void 0:e.options.onColumnSizingInfoChange(o),e.resetColumnSizing=o=>{var t;e.setColumnSizing(o?{}:(t=e.initialState.columnSizing)!=null?t:{})},e.resetHeaderSizeInfo=o=>{var t;e.setColumnSizingInfo(o?$e():(t=e.initialState.columnSizingInfo)!=null?t:$e())},e.getTotalSize=()=>{var o,t;return(o=(t=e.getHeaderGroups()[0])==null?void 0:t.headers.reduce((n,i)=>n+i.getSize(),0))!=null?o:0},e.getLeftTotalSize=()=>{var o,t;return(o=(t=e.getLeftHeaderGroups()[0])==null?void 0:t.headers.reduce((n,i)=>n+i.getSize(),0))!=null?o:0},e.getCenterTotalSize=()=>{var o,t;return(o=(t=e.getCenterHeaderGroups()[0])==null?void 0:t.headers.reduce((n,i)=>n+i.getSize(),0))!=null?o:0},e.getRightTotalSize=()=>{var o,t;return(o=(t=e.getRightHeaderGroups()[0])==null?void 0:t.headers.reduce((n,i)=>n+i.getSize(),0))!=null?o:0}}};let pe=null;function rn(){if(typeof pe=="boolean")return pe;let e=!1;try{const o={get passive(){return e=!0,!1}},t=()=>{};window.addEventListener("test",t,o),window.removeEventListener("test",t)}catch{e=!1}return pe=e,pe}function Pe(e){return e.type==="touchstart"}const ln={getInitialState:e=>({columnVisibility:{},...e}),getDefaultOptions:e=>({onColumnVisibilityChange:q("columnVisibility",e)}),createColumn:(e,o)=>{e.toggleVisibility=t=>{e.getCanHide()&&o.setColumnVisibility(n=>({...n,[e.id]:t??!e.getIsVisible()}))},e.getIsVisible=()=>{var t,n;const i=e.columns;return(t=i.length?i.some(r=>r.getIsVisible()):(n=o.getState().columnVisibility)==null?void 0:n[e.id])!=null?t:!0},e.getCanHide=()=>{var t,n;return((t=e.columnDef.enableHiding)!=null?t:!0)&&((n=o.options.enableHiding)!=null?n:!0)},e.getToggleVisibilityHandler=()=>t=>{e.toggleVisibility==null||e.toggleVisibility(t.target.checked)}},createRow:(e,o)=>{e._getAllVisibleCells=w(()=>[e.getAllCells(),o.getState().columnVisibility],t=>t.filter(n=>n.column.getIsVisible()),R(o.options,"debugRows")),e.getVisibleCells=w(()=>[e.getLeftVisibleCells(),e.getCenterVisibleCells(),e.getRightVisibleCells()],(t,n,i)=>[...t,...n,...i],R(o.options,"debugRows"))},createTable:e=>{const o=(t,n)=>w(()=>[n(),n().filter(i=>i.getIsVisible()).map(i=>i.id).join("_")],i=>i.filter(r=>r.getIsVisible==null?void 0:r.getIsVisible()),R(e.options,"debugColumns"));e.getVisibleFlatColumns=o("getVisibleFlatColumns",()=>e.getAllFlatColumns()),e.getVisibleLeafColumns=o("getVisibleLeafColumns",()=>e.getAllLeafColumns()),e.getLeftVisibleLeafColumns=o("getLeftVisibleLeafColumns",()=>e.getLeftLeafColumns()),e.getRightVisibleLeafColumns=o("getRightVisibleLeafColumns",()=>e.getRightLeafColumns()),e.getCenterVisibleLeafColumns=o("getCenterVisibleLeafColumns",()=>e.getCenterLeafColumns()),e.setColumnVisibility=t=>e.options.onColumnVisibilityChange==null?void 0:e.options.onColumnVisibilityChange(t),e.resetColumnVisibility=t=>{var n;e.setColumnVisibility(t?{}:(n=e.initialState.columnVisibility)!=null?n:{})},e.toggleAllColumnsVisible=t=>{var n;t=(n=t)!=null?n:!e.getIsAllColumnsVisible(),e.setColumnVisibility(e.getAllLeafColumns().reduce((i,r)=>({...i,[r.id]:t||!(r.getCanHide!=null&&r.getCanHide())}),{}))},e.getIsAllColumnsVisible=()=>!e.getAllLeafColumns().some(t=>!(t.getIsVisible!=null&&t.getIsVisible())),e.getIsSomeColumnsVisible=()=>e.getAllLeafColumns().some(t=>t.getIsVisible==null?void 0:t.getIsVisible()),e.getToggleAllColumnsVisibilityHandler=()=>t=>{var n;e.toggleAllColumnsVisible((n=t.target)==null?void 0:n.checked)}}};function ae(e,o){return o?o==="center"?e.getCenterVisibleLeafColumns():o==="left"?e.getLeftVisibleLeafColumns():e.getRightVisibleLeafColumns():e.getVisibleLeafColumns()}const sn={createTable:e=>{e._getGlobalFacetedRowModel=e.options.getFacetedRowModel&&e.options.getFacetedRowModel(e,"__global__"),e.getGlobalFacetedRowModel=()=>e.options.manualFiltering||!e._getGlobalFacetedRowModel?e.getPreFilteredRowModel():e._getGlobalFacetedRowModel(),e._getGlobalFacetedUniqueValues=e.options.getFacetedUniqueValues&&e.options.getFacetedUniqueValues(e,"__global__"),e.getGlobalFacetedUniqueValues=()=>e._getGlobalFacetedUniqueValues?e._getGlobalFacetedUniqueValues():new Map,e._getGlobalFacetedMinMaxValues=e.options.getFacetedMinMaxValues&&e.options.getFacetedMinMaxValues(e,"__global__"),e.getGlobalFacetedMinMaxValues=()=>{if(e._getGlobalFacetedMinMaxValues)return e._getGlobalFacetedMinMaxValues()}}},un={getInitialState:e=>({globalFilter:void 0,...e}),getDefaultOptions:e=>({onGlobalFilterChange:q("globalFilter",e),globalFilterFn:"auto",getColumnCanGlobalFilter:o=>{var t;const n=(t=e.getCoreRowModel().flatRows[0])==null||(t=t._getAllCellsByColumnId()[o.id])==null?void 0:t.getValue();return typeof n=="string"||typeof n=="number"}}),createColumn:(e,o)=>{e.getCanGlobalFilter=()=>{var t,n,i,r;return((t=e.columnDef.enableGlobalFilter)!=null?t:!0)&&((n=o.options.enableGlobalFilter)!=null?n:!0)&&((i=o.options.enableFilters)!=null?i:!0)&&((r=o.options.getColumnCanGlobalFilter==null?void 0:o.options.getColumnCanGlobalFilter(e))!=null?r:!0)&&!!e.accessorFn}},createTable:e=>{e.getGlobalAutoFilterFn=()=>U.includesString,e.getGlobalFilterFn=()=>{var o,t;const{globalFilterFn:n}=e.options;return Se(n)?n:n==="auto"?e.getGlobalAutoFilterFn():(o=(t=e.options.filterFns)==null?void 0:t[n])!=null?o:U[n]},e.setGlobalFilter=o=>{e.options.onGlobalFilterChange==null||e.options.onGlobalFilterChange(o)},e.resetGlobalFilter=o=>{e.setGlobalFilter(o?void 0:e.initialState.globalFilter)}}},an={getInitialState:e=>({expanded:{},...e}),getDefaultOptions:e=>({onExpandedChange:q("expanded",e),paginateExpandedRows:!0}),createTable:e=>{let o=!1,t=!1;e._autoResetExpanded=()=>{var n,i;if(!o){e._queue(()=>{o=!0});return}if((n=(i=e.options.autoResetAll)!=null?i:e.options.autoResetExpanded)!=null?n:!e.options.manualExpanding){if(t)return;t=!0,e._queue(()=>{e.resetExpanded(),t=!1})}},e.setExpanded=n=>e.options.onExpandedChange==null?void 0:e.options.onExpandedChange(n),e.toggleAllRowsExpanded=n=>{n??!e.getIsAllRowsExpanded()?e.setExpanded(!0):e.setExpanded({})},e.resetExpanded=n=>{var i,r;e.setExpanded(n?{}:(i=(r=e.initialState)==null?void 0:r.expanded)!=null?i:{})},e.getCanSomeRowsExpand=()=>e.getPrePaginationRowModel().flatRows.some(n=>n.getCanExpand()),e.getToggleAllRowsExpandedHandler=()=>n=>{n.persist==null||n.persist(),e.toggleAllRowsExpanded()},e.getIsSomeRowsExpanded=()=>{const n=e.getState().expanded;return n===!0||Object.values(n).some(Boolean)},e.getIsAllRowsExpanded=()=>{const n=e.getState().expanded;return typeof n=="boolean"?n===!0:!(!Object.keys(n).length||e.getRowModel().flatRows.some(i=>!i.getIsExpanded()))},e.getExpandedDepth=()=>{let n=0;return(e.getState().expanded===!0?Object.keys(e.getRowModel().rowsById):Object.keys(e.getState().expanded)).forEach(r=>{const l=r.split(".");n=Math.max(n,l.length)}),n},e.getPreExpandedRowModel=()=>e.getSortedRowModel(),e.getExpandedRowModel=()=>(!e._getExpandedRowModel&&e.options.getExpandedRowModel&&(e._getExpandedRowModel=e.options.getExpandedRowModel(e)),e.options.manualExpanding||!e._getExpandedRowModel?e.getPreExpandedRowModel():e._getExpandedRowModel())},createRow:(e,o)=>{e.toggleExpanded=t=>{o.setExpanded(n=>{var i;const r=n===!0?!0:!!(n!=null&&n[e.id]);let l={};if(n===!0?Object.keys(o.getRowModel().rowsById).forEach(u=>{l[u]=!0}):l=n,t=(i=t)!=null?i:!r,!r&&t)return{...l,[e.id]:!0};if(r&&!t){const{[e.id]:u,...a}=l;return a}return n})},e.getIsExpanded=()=>{var t;const n=o.getState().expanded;return!!((t=o.options.getIsRowExpanded==null?void 0:o.options.getIsRowExpanded(e))!=null?t:n===!0||n?.[e.id])},e.getCanExpand=()=>{var t,n,i;return(t=o.options.getRowCanExpand==null?void 0:o.options.getRowCanExpand(e))!=null?t:((n=o.options.enableExpanding)!=null?n:!0)&&!!((i=e.subRows)!=null&&i.length)},e.getIsAllParentsExpanded=()=>{let t=!0,n=e;for(;t&&n.parentId;)n=o.getRow(n.parentId,!0),t=n.getIsExpanded();return t},e.getToggleExpandedHandler=()=>{const t=e.getCanExpand();return()=>{t&&e.toggleExpanded()}}}},Ae=0,Oe=10,Ve=()=>({pageIndex:Ae,pageSize:Oe}),gn={getInitialState:e=>({...e,pagination:{...Ve(),...e?.pagination}}),getDefaultOptions:e=>({onPaginationChange:q("pagination",e)}),createTable:e=>{let o=!1,t=!1;e._autoResetPageIndex=()=>{var n,i;if(!o){e._queue(()=>{o=!0});return}if((n=(i=e.options.autoResetAll)!=null?i:e.options.autoResetPageIndex)!=null?n:!e.options.manualPagination){if(t)return;t=!0,e._queue(()=>{e.resetPageIndex(),t=!1})}},e.setPagination=n=>{const i=r=>K(n,r);return e.options.onPaginationChange==null?void 0:e.options.onPaginationChange(i)},e.resetPagination=n=>{var i;e.setPagination(n?Ve():(i=e.initialState.pagination)!=null?i:Ve())},e.setPageIndex=n=>{e.setPagination(i=>{let r=K(n,i.pageIndex);const l=typeof e.options.pageCount>"u"||e.options.pageCount===-1?Number.MAX_SAFE_INTEGER:e.options.pageCount-1;return r=Math.max(0,Math.min(r,l)),{...i,pageIndex:r}})},e.resetPageIndex=n=>{var i,r;e.setPageIndex(n?Ae:(i=(r=e.initialState)==null||(r=r.pagination)==null?void 0:r.pageIndex)!=null?i:Ae)},e.resetPageSize=n=>{var i,r;e.setPageSize(n?Oe:(i=(r=e.initialState)==null||(r=r.pagination)==null?void 0:r.pageSize)!=null?i:Oe)},e.setPageSize=n=>{e.setPagination(i=>{const r=Math.max(1,K(n,i.pageSize)),l=i.pageSize*i.pageIndex,u=Math.floor(l/r);return{...i,pageIndex:u,pageSize:r}})},e.setPageCount=n=>e.setPagination(i=>{var r;let l=K(n,(r=e.options.pageCount)!=null?r:-1);return typeof l=="number"&&(l=Math.max(-1,l)),{...i,pageCount:l}}),e.getPageOptions=w(()=>[e.getPageCount()],n=>{let i=[];return n&&n>0&&(i=[...new Array(n)].fill(null).map((r,l)=>l)),i},R(e.options,"debugTable")),e.getCanPreviousPage=()=>e.getState().pagination.pageIndex>0,e.getCanNextPage=()=>{const{pageIndex:n}=e.getState().pagination,i=e.getPageCount();return i===-1?!0:i===0?!1:n<i-1},e.previousPage=()=>e.setPageIndex(n=>n-1),e.nextPage=()=>e.setPageIndex(n=>n+1),e.firstPage=()=>e.setPageIndex(0),e.lastPage=()=>e.setPageIndex(e.getPageCount()-1),e.getPrePaginationRowModel=()=>e.getExpandedRowModel(),e.getPaginationRowModel=()=>(!e._getPaginationRowModel&&e.options.getPaginationRowModel&&(e._getPaginationRowModel=e.options.getPaginationRowModel(e)),e.options.manualPagination||!e._getPaginationRowModel?e.getPrePaginationRowModel():e._getPaginationRowModel()),e.getPageCount=()=>{var n;return(n=e.options.pageCount)!=null?n:Math.ceil(e.getRowCount()/e.getState().pagination.pageSize)},e.getRowCount=()=>{var n;return(n=e.options.rowCount)!=null?n:e.getPrePaginationRowModel().rows.length}}},Me=()=>({top:[],bottom:[]}),dn={getInitialState:e=>({rowPinning:Me(),...e}),getDefaultOptions:e=>({onRowPinningChange:q("rowPinning",e)}),createRow:(e,o)=>{e.pin=(t,n,i)=>{const r=n?e.getLeafRows().map(a=>{let{id:d}=a;return d}):[],l=i?e.getParentRows().map(a=>{let{id:d}=a;return d}):[],u=new Set([...l,e.id,...r]);o.setRowPinning(a=>{var d,c;if(t==="bottom"){var S,g;return{top:((S=a?.top)!=null?S:[]).filter(p=>!(u!=null&&u.has(p))),bottom:[...((g=a?.bottom)!=null?g:[]).filter(p=>!(u!=null&&u.has(p))),...Array.from(u)]}}if(t==="top"){var s,f;return{top:[...((s=a?.top)!=null?s:[]).filter(p=>!(u!=null&&u.has(p))),...Array.from(u)],bottom:((f=a?.bottom)!=null?f:[]).filter(p=>!(u!=null&&u.has(p)))}}return{top:((d=a?.top)!=null?d:[]).filter(p=>!(u!=null&&u.has(p))),bottom:((c=a?.bottom)!=null?c:[]).filter(p=>!(u!=null&&u.has(p)))}})},e.getCanPin=()=>{var t;const{enableRowPinning:n,enablePinning:i}=o.options;return typeof n=="function"?n(e):(t=n??i)!=null?t:!0},e.getIsPinned=()=>{const t=[e.id],{top:n,bottom:i}=o.getState().rowPinning,r=t.some(u=>n?.includes(u)),l=t.some(u=>i?.includes(u));return r?"top":l?"bottom":!1},e.getPinnedIndex=()=>{var t,n;const i=e.getIsPinned();if(!i)return-1;const r=(t=i==="top"?o.getTopRows():o.getBottomRows())==null?void 0:t.map(l=>{let{id:u}=l;return u});return(n=r?.indexOf(e.id))!=null?n:-1}},createTable:e=>{e.setRowPinning=o=>e.options.onRowPinningChange==null?void 0:e.options.onRowPinningChange(o),e.resetRowPinning=o=>{var t,n;return e.setRowPinning(o?Me():(t=(n=e.initialState)==null?void 0:n.rowPinning)!=null?t:Me())},e.getIsSomeRowsPinned=o=>{var t;const n=e.getState().rowPinning;if(!o){var i,r;return!!((i=n.top)!=null&&i.length||(r=n.bottom)!=null&&r.length)}return!!((t=n[o])!=null&&t.length)},e._getPinnedRows=(o,t,n)=>{var i;return((i=e.options.keepPinnedRows)==null||i?(t??[]).map(l=>{const u=e.getRow(l,!0);return u.getIsAllParentsExpanded()?u:null}):(t??[]).map(l=>o.find(u=>u.id===l))).filter(Boolean).map(l=>({...l,position:n}))},e.getTopRows=w(()=>[e.getRowModel().rows,e.getState().rowPinning.top],(o,t)=>e._getPinnedRows(o,t,"top"),R(e.options,"debugRows")),e.getBottomRows=w(()=>[e.getRowModel().rows,e.getState().rowPinning.bottom],(o,t)=>e._getPinnedRows(o,t,"bottom"),R(e.options,"debugRows")),e.getCenterRows=w(()=>[e.getRowModel().rows,e.getState().rowPinning.top,e.getState().rowPinning.bottom],(o,t,n)=>{const i=new Set([...t??[],...n??[]]);return o.filter(r=>!i.has(r.id))},R(e.options,"debugRows"))}},cn={getInitialState:e=>({rowSelection:{},...e}),getDefaultOptions:e=>({onRowSelectionChange:q("rowSelection",e),enableRowSelection:!0,enableMultiRowSelection:!0,enableSubRowSelection:!0}),createTable:e=>{e.setRowSelection=o=>e.options.onRowSelectionChange==null?void 0:e.options.onRowSelectionChange(o),e.resetRowSelection=o=>{var t;return e.setRowSelection(o?{}:(t=e.initialState.rowSelection)!=null?t:{})},e.toggleAllRowsSelected=o=>{e.setRowSelection(t=>{o=typeof o<"u"?o:!e.getIsAllRowsSelected();const n={...t},i=e.getPreGroupedRowModel().flatRows;return o?i.forEach(r=>{r.getCanSelect()&&(n[r.id]=!0)}):i.forEach(r=>{delete n[r.id]}),n})},e.toggleAllPageRowsSelected=o=>e.setRowSelection(t=>{const n=typeof o<"u"?o:!e.getIsAllPageRowsSelected(),i={...t};return e.getRowModel().rows.forEach(r=>{Ee(i,r.id,n,!0,e)}),i}),e.getPreSelectedRowModel=()=>e.getCoreRowModel(),e.getSelectedRowModel=w(()=>[e.getState().rowSelection,e.getCoreRowModel()],(o,t)=>Object.keys(o).length?Ie(e,t):{rows:[],flatRows:[],rowsById:{}},R(e.options,"debugTable")),e.getFilteredSelectedRowModel=w(()=>[e.getState().rowSelection,e.getFilteredRowModel()],(o,t)=>Object.keys(o).length?Ie(e,t):{rows:[],flatRows:[],rowsById:{}},R(e.options,"debugTable")),e.getGroupedSelectedRowModel=w(()=>[e.getState().rowSelection,e.getSortedRowModel()],(o,t)=>Object.keys(o).length?Ie(e,t):{rows:[],flatRows:[],rowsById:{}},R(e.options,"debugTable")),e.getIsAllRowsSelected=()=>{const o=e.getFilteredRowModel().flatRows,{rowSelection:t}=e.getState();let n=!!(o.length&&Object.keys(t).length);return n&&o.some(i=>i.getCanSelect()&&!t[i.id])&&(n=!1),n},e.getIsAllPageRowsSelected=()=>{const o=e.getPaginationRowModel().flatRows.filter(i=>i.getCanSelect()),{rowSelection:t}=e.getState();let n=!!o.length;return n&&o.some(i=>!t[i.id])&&(n=!1),n},e.getIsSomeRowsSelected=()=>{var o;const t=Object.keys((o=e.getState().rowSelection)!=null?o:{}).length;return t>0&&t<e.getFilteredRowModel().flatRows.length},e.getIsSomePageRowsSelected=()=>{const o=e.getPaginationRowModel().flatRows;return e.getIsAllPageRowsSelected()?!1:o.filter(t=>t.getCanSelect()).some(t=>t.getIsSelected()||t.getIsSomeSelected())},e.getToggleAllRowsSelectedHandler=()=>o=>{e.toggleAllRowsSelected(o.target.checked)},e.getToggleAllPageRowsSelectedHandler=()=>o=>{e.toggleAllPageRowsSelected(o.target.checked)}},createRow:(e,o)=>{e.toggleSelected=(t,n)=>{const i=e.getIsSelected();o.setRowSelection(r=>{var l;if(t=typeof t<"u"?t:!i,e.getCanSelect()&&i===t)return r;const u={...r};return Ee(u,e.id,t,(l=n?.selectChildren)!=null?l:!0,o),u})},e.getIsSelected=()=>{const{rowSelection:t}=o.getState();return ke(e,t)},e.getIsSomeSelected=()=>{const{rowSelection:t}=o.getState();return He(e,t)==="some"},e.getIsAllSubRowsSelected=()=>{const{rowSelection:t}=o.getState();return He(e,t)==="all"},e.getCanSelect=()=>{var t;return typeof o.options.enableRowSelection=="function"?o.options.enableRowSelection(e):(t=o.options.enableRowSelection)!=null?t:!0},e.getCanSelectSubRows=()=>{var t;return typeof o.options.enableSubRowSelection=="function"?o.options.enableSubRowSelection(e):(t=o.options.enableSubRowSelection)!=null?t:!0},e.getCanMultiSelect=()=>{var t;return typeof o.options.enableMultiRowSelection=="function"?o.options.enableMultiRowSelection(e):(t=o.options.enableMultiRowSelection)!=null?t:!0},e.getToggleSelectedHandler=()=>{const t=e.getCanSelect();return n=>{var i;t&&e.toggleSelected((i=n.target)==null?void 0:i.checked)}}}},Ee=(e,o,t,n,i)=>{var r;const l=i.getRow(o,!0);t?(l.getCanMultiSelect()||Object.keys(e).forEach(u=>delete e[u]),l.getCanSelect()&&(e[o]=!0)):delete e[o],n&&(r=l.subRows)!=null&&r.length&&l.getCanSelectSubRows()&&l.subRows.forEach(u=>Ee(e,u.id,t,n,i))};function Ie(e,o){const t=e.getState().rowSelection,n=[],i={},r=function(l,u){return l.map(a=>{var d;const c=ke(a,t);if(c&&(n.push(a),i[a.id]=a),(d=a.subRows)!=null&&d.length&&(a={...a,subRows:r(a.subRows)}),c)return a}).filter(Boolean)};return{rows:r(o.rows),flatRows:n,rowsById:i}}function ke(e,o){var t;return(t=o[e.id])!=null?t:!1}function He(e,o,t){var n;if(!((n=e.subRows)!=null&&n.length))return!1;let i=!0,r=!1;return e.subRows.forEach(l=>{if(!(r&&!i)&&(l.getCanSelect()&&(ke(l,o)?r=!0:i=!1),l.subRows&&l.subRows.length)){const u=He(l,o);u==="all"?r=!0:(u==="some"&&(r=!0),i=!1)}}),i?"all":r?"some":!1}const Ge=/([0-9]+)/gm,fn=(e,o,t)=>dt(W(e.getValue(t)).toLowerCase(),W(o.getValue(t)).toLowerCase()),pn=(e,o,t)=>dt(W(e.getValue(t)),W(o.getValue(t))),mn=(e,o,t)=>Be(W(e.getValue(t)).toLowerCase(),W(o.getValue(t)).toLowerCase()),Sn=(e,o,t)=>Be(W(e.getValue(t)),W(o.getValue(t))),vn=(e,o,t)=>{const n=e.getValue(t),i=o.getValue(t);return n>i?1:n<i?-1:0},Cn=(e,o,t)=>Be(e.getValue(t),o.getValue(t));function Be(e,o){return e===o?0:e>o?1:-1}function W(e){return typeof e=="number"?isNaN(e)||e===1/0||e===-1/0?"":String(e):typeof e=="string"?e:""}function dt(e,o){const t=e.split(Ge).filter(Boolean),n=o.split(Ge).filter(Boolean);for(;t.length&&n.length;){const i=t.shift(),r=n.shift(),l=parseInt(i,10),u=parseInt(r,10),a=[l,u].sort();if(isNaN(a[0])){if(i>r)return 1;if(r>i)return-1;continue}if(isNaN(a[1]))return isNaN(l)?-1:1;if(l>u)return 1;if(u>l)return-1}return t.length-n.length}const se={alphanumeric:fn,alphanumericCaseSensitive:pn,text:mn,textCaseSensitive:Sn,datetime:vn,basic:Cn},wn={getInitialState:e=>({sorting:[],...e}),getDefaultColumnDef:()=>({sortingFn:"auto",sortUndefined:1}),getDefaultOptions:e=>({onSortingChange:q("sorting",e),isMultiSortEvent:o=>o.shiftKey}),createColumn:(e,o)=>{e.getAutoSortingFn=()=>{const t=o.getFilteredRowModel().flatRows.slice(10);let n=!1;for(const i of t){const r=i?.getValue(e.id);if(Object.prototype.toString.call(r)==="[object Date]")return se.datetime;if(typeof r=="string"&&(n=!0,r.split(Ge).length>1))return se.alphanumeric}return n?se.text:se.basic},e.getAutoSortDir=()=>{const t=o.getFilteredRowModel().flatRows[0];return typeof t?.getValue(e.id)=="string"?"asc":"desc"},e.getSortingFn=()=>{var t,n;if(!e)throw new Error;return Se(e.columnDef.sortingFn)?e.columnDef.sortingFn:e.columnDef.sortingFn==="auto"?e.getAutoSortingFn():(t=(n=o.options.sortingFns)==null?void 0:n[e.columnDef.sortingFn])!=null?t:se[e.columnDef.sortingFn]},e.toggleSorting=(t,n)=>{const i=e.getNextSortingOrder(),r=typeof t<"u"&&t!==null;o.setSorting(l=>{const u=l?.find(s=>s.id===e.id),a=l?.findIndex(s=>s.id===e.id);let d=[],c,S=r?t:i==="desc";if(l!=null&&l.length&&e.getCanMultiSort()&&n?u?c="toggle":c="add":l!=null&&l.length&&a!==l.length-1?c="replace":u?c="toggle":c="replace",c==="toggle"&&(r||i||(c="remove")),c==="add"){var g;d=[...l,{id:e.id,desc:S}],d.splice(0,d.length-((g=o.options.maxMultiSortColCount)!=null?g:Number.MAX_SAFE_INTEGER))}else c==="toggle"?d=l.map(s=>s.id===e.id?{...s,desc:S}:s):c==="remove"?d=l.filter(s=>s.id!==e.id):d=[{id:e.id,desc:S}];return d})},e.getFirstSortDir=()=>{var t,n;return((t=(n=e.columnDef.sortDescFirst)!=null?n:o.options.sortDescFirst)!=null?t:e.getAutoSortDir()==="desc")?"desc":"asc"},e.getNextSortingOrder=t=>{var n,i;const r=e.getFirstSortDir(),l=e.getIsSorted();return l?l!==r&&((n=o.options.enableSortingRemoval)==null||n)&&(!(t&&(i=o.options.enableMultiRemove)!=null)||i)?!1:l==="desc"?"asc":"desc":r},e.getCanSort=()=>{var t,n;return((t=e.columnDef.enableSorting)!=null?t:!0)&&((n=o.options.enableSorting)!=null?n:!0)&&!!e.accessorFn},e.getCanMultiSort=()=>{var t,n;return(t=(n=e.columnDef.enableMultiSort)!=null?n:o.options.enableMultiSort)!=null?t:!!e.accessorFn},e.getIsSorted=()=>{var t;const n=(t=o.getState().sorting)==null?void 0:t.find(i=>i.id===e.id);return n?n.desc?"desc":"asc":!1},e.getSortIndex=()=>{var t,n;return(t=(n=o.getState().sorting)==null?void 0:n.findIndex(i=>i.id===e.id))!=null?t:-1},e.clearSorting=()=>{o.setSorting(t=>t!=null&&t.length?t.filter(n=>n.id!==e.id):[])},e.getToggleSortingHandler=()=>{const t=e.getCanSort();return n=>{t&&(n.persist==null||n.persist(),e.toggleSorting==null||e.toggleSorting(void 0,e.getCanMultiSort()?o.options.isMultiSortEvent==null?void 0:o.options.isMultiSortEvent(n):!1))}}},createTable:e=>{e.setSorting=o=>e.options.onSortingChange==null?void 0:e.options.onSortingChange(o),e.resetSorting=o=>{var t,n;e.setSorting(o?[]:(t=(n=e.initialState)==null?void 0:n.sorting)!=null?t:[])},e.getPreSortedRowModel=()=>e.getGroupedRowModel(),e.getSortedRowModel=()=>(!e._getSortedRowModel&&e.options.getSortedRowModel&&(e._getSortedRowModel=e.options.getSortedRowModel(e)),e.options.manualSorting||!e._getSortedRowModel?e.getPreSortedRowModel():e._getSortedRowModel())}},Rn=[kt,ln,en,tn,Bt,bt,sn,un,wn,Qt,an,gn,dn,cn,on];function hn(e){var o,t;const n=[...Rn,...(o=e._features)!=null?o:[]];let i={_features:n};const r=i._features.reduce((g,s)=>Object.assign(g,s.getDefaultOptions==null?void 0:s.getDefaultOptions(i)),{}),l=g=>i.options.mergeOptions?i.options.mergeOptions(r,g):{...r,...g};let a={...{},...(t=e.initialState)!=null?t:{}};i._features.forEach(g=>{var s;a=(s=g.getInitialState==null?void 0:g.getInitialState(a))!=null?s:a});const d=[];let c=!1;const S={_features:n,options:{...r,...e},initialState:a,_queue:g=>{d.push(g),c||(c=!0,Promise.resolve().then(()=>{for(;d.length;)d.shift()();c=!1}).catch(s=>setTimeout(()=>{throw s})))},reset:()=>{i.setState(i.initialState)},setOptions:g=>{const s=K(g,i.options);i.options=l(s)},getState:()=>i.options.state,setState:g=>{i.options.onStateChange==null||i.options.onStateChange(g)},_getRowId:(g,s,f)=>{var p;return(p=i.options.getRowId==null?void 0:i.options.getRowId(g,s,f))!=null?p:`${f?[f.id,s].join("."):s}`},getCoreRowModel:()=>(i._getCoreRowModel||(i._getCoreRowModel=i.options.getCoreRowModel(i)),i._getCoreRowModel()),getRowModel:()=>i.getPaginationRowModel(),getRow:(g,s)=>{let f=(s?i.getPrePaginationRowModel():i.getRowModel()).rowsById[g];if(!f&&(f=i.getCoreRowModel().rowsById[g],!f))throw new Error;return f},_getDefaultColumnDef:w(()=>[i.options.defaultColumn],g=>{var s;return g=(s=g)!=null?s:{},{header:f=>{const p=f.header.column.columnDef;return p.accessorKey?p.accessorKey:p.accessorFn?p.id:null},cell:f=>{var p,h;return(p=(h=f.renderValue())==null||h.toString==null?void 0:h.toString())!=null?p:null},...i._features.reduce((f,p)=>Object.assign(f,p.getDefaultColumnDef==null?void 0:p.getDefaultColumnDef()),{}),...g}},R(e,"debugColumns")),_getColumnDefs:()=>i.options.columns,getAllColumns:w(()=>[i._getColumnDefs()],g=>{const s=function(f,p,h){return h===void 0&&(h=0),f.map(F=>{const $=qt(i,F,h,p),P=F;return $.columns=P.columns?s(P.columns,$,h+1):[],$})};return s(g)},R(e,"debugColumns")),getAllFlatColumns:w(()=>[i.getAllColumns()],g=>g.flatMap(s=>s.getFlatColumns()),R(e,"debugColumns")),_getAllFlatColumnsById:w(()=>[i.getAllFlatColumns()],g=>g.reduce((s,f)=>(s[f.id]=f,s),{}),R(e,"debugColumns")),getAllLeafColumns:w(()=>[i.getAllColumns(),i._getOrderColumnsFn()],(g,s)=>{let f=g.flatMap(p=>p.getLeafColumns());return s(f)},R(e,"debugColumns")),getColumn:g=>i._getAllFlatColumnsById()[g]};Object.assign(i,S);for(let g=0;g<i._features.length;g++){const s=i._features[g];s==null||s.createTable==null||s.createTable(i)}return i}function _n(){return e=>w(()=>[e.options.data],o=>{const t={rows:[],flatRows:[],rowsById:{}},n=function(i,r,l){r===void 0&&(r=0);const u=[];for(let d=0;d<i.length;d++){const c=Le(e,e._getRowId(i[d],d,l),i[d],d,r,void 0,l?.id);if(t.flatRows.push(c),t.rowsById[c.id]=c,u.push(c),e.options.getSubRows){var a;c.originalSubRows=e.options.getSubRows(i[d],d),(a=c.originalSubRows)!=null&&a.length&&(c.subRows=n(c.originalSubRows,r+1,c))}}return u};return t.rows=n(o),t},R(e.options,"debugTable","getRowModel",()=>e._autoResetPageIndex()))}function Fn(){return e=>w(()=>[e.getState().expanded,e.getPreExpandedRowModel(),e.options.paginateExpandedRows],(o,t,n)=>!t.rows.length||o!==!0&&!Object.keys(o??{}).length||!n?t:yn(t),R(e.options,"debugTable"))}function yn(e){const o=[],t=n=>{var i;o.push(n),(i=n.subRows)!=null&&i.length&&n.getIsExpanded()&&n.subRows.forEach(t)};return e.rows.forEach(t),{rows:o,flatRows:e.flatRows,rowsById:e.rowsById}}function xn(e,o,t){return t.options.filterFromLeafRows?$n(e,o,t):Pn(e,o,t)}function $n(e,o,t){var n;const i=[],r={},l=(n=t.options.maxLeafRowFilterDepth)!=null?n:100,u=function(a,d){d===void 0&&(d=0);const c=[];for(let g=0;g<a.length;g++){var S;let s=a[g];const f=Le(t,s.id,s.original,s.index,s.depth,void 0,s.parentId);if(f.columnFilters=s.columnFilters,(S=s.subRows)!=null&&S.length&&d<l){if(f.subRows=u(s.subRows,d+1),s=f,o(s)&&!f.subRows.length){c.push(s),r[s.id]=s,i.push(s);continue}if(o(s)||f.subRows.length){c.push(s),r[s.id]=s,i.push(s);continue}}else s=f,o(s)&&(c.push(s),r[s.id]=s,i.push(s))}return c};return{rows:u(e),flatRows:i,rowsById:r}}function Pn(e,o,t){var n;const i=[],r={},l=(n=t.options.maxLeafRowFilterDepth)!=null?n:100,u=function(a,d){d===void 0&&(d=0);const c=[];for(let g=0;g<a.length;g++){let s=a[g];if(o(s)){var S;if((S=s.subRows)!=null&&S.length&&d<l){const p=Le(t,s.id,s.original,s.index,s.depth,void 0,s.parentId);p.subRows=u(s.subRows,d+1),s=p}c.push(s),i.push(s),r[s.id]=s}}return c};return{rows:u(e),flatRows:i,rowsById:r}}function Vn(){return e=>w(()=>[e.getPreFilteredRowModel(),e.getState().columnFilters,e.getState().globalFilter],(o,t,n)=>{if(!o.rows.length||!(t!=null&&t.length)&&!n){for(let g=0;g<o.flatRows.length;g++)o.flatRows[g].columnFilters={},o.flatRows[g].columnFiltersMeta={};return o}const i=[],r=[];(t??[]).forEach(g=>{var s;const f=e.getColumn(g.id);if(!f)return;const p=f.getFilterFn();p&&i.push({id:g.id,filterFn:p,resolvedValue:(s=p.resolveFilterValue==null?void 0:p.resolveFilterValue(g.value))!=null?s:g.value})});const l=(t??[]).map(g=>g.id),u=e.getGlobalFilterFn(),a=e.getAllLeafColumns().filter(g=>g.getCanGlobalFilter());n&&u&&a.length&&(l.push("__global__"),a.forEach(g=>{var s;r.push({id:g.id,filterFn:u,resolvedValue:(s=u.resolveFilterValue==null?void 0:u.resolveFilterValue(n))!=null?s:n})}));let d,c;for(let g=0;g<o.flatRows.length;g++){const s=o.flatRows[g];if(s.columnFilters={},i.length)for(let f=0;f<i.length;f++){d=i[f];const p=d.id;s.columnFilters[p]=d.filterFn(s,p,d.resolvedValue,h=>{s.columnFiltersMeta[p]=h})}if(r.length){for(let f=0;f<r.length;f++){c=r[f];const p=c.id;if(c.filterFn(s,p,c.resolvedValue,h=>{s.columnFiltersMeta[p]=h})){s.columnFilters.__global__=!0;break}}s.columnFilters.__global__!==!0&&(s.columnFilters.__global__=!1)}}const S=g=>{for(let s=0;s<l.length;s++)if(g.columnFilters[l[s]]===!1)return!1;return!0};return xn(o.rows,S,e)},R(e.options,"debugTable","getFilteredRowModel",()=>e._autoResetPageIndex()))}function Mn(){return e=>w(()=>[e.getState().sorting,e.getPreSortedRowModel()],(o,t)=>{if(!t.rows.length||!(o!=null&&o.length))return t;const n=e.getState().sorting,i=[],r=n.filter(a=>{var d;return(d=e.getColumn(a.id))==null?void 0:d.getCanSort()}),l={};r.forEach(a=>{const d=e.getColumn(a.id);d&&(l[a.id]={sortUndefined:d.columnDef.sortUndefined,invertSorting:d.columnDef.invertSorting,sortingFn:d.getSortingFn()})});const u=a=>{const d=a.map(c=>({...c}));return d.sort((c,S)=>{for(let s=0;s<r.length;s+=1){var g;const f=r[s],p=l[f.id],h=p.sortUndefined,F=(g=f?.desc)!=null?g:!1;let $=0;if(h){const P=c.getValue(f.id),A=S.getValue(f.id),I=P===void 0,b=A===void 0;if(I||b){if(h==="first")return I?-1:1;if(h==="last")return I?1:-1;$=I&&b?0:I?h:-h}}if($===0&&($=p.sortingFn(c,S,f.id)),$!==0)return F&&($*=-1),p.invertSorting&&($*=-1),$}return c.index-S.index}),d.forEach(c=>{var S;i.push(c),(S=c.subRows)!=null&&S.length&&(c.subRows=u(c.subRows))}),d};return{rows:u(t.rows),flatRows:i,rowsById:t.rowsById}},R(e.options,"debugTable","getSortedRowModel",()=>e._autoResetPageIndex()))}function me(){return!0}const In=Symbol("merge-proxy"),Dn={get(e,o,t){return o===In?t:e.get(o)},has(e,o){return e.has(o)},set:me,deleteProperty:me,getOwnPropertyDescriptor(e,o){return{configurable:!0,enumerable:!0,get(){return e.get(o)},set:me,deleteProperty:me}},ownKeys(e){return e.keys()}};function De(e){return"value"in e?e.value:e}function ue(){for(var e=arguments.length,o=new Array(e),t=0;t<e;t++)o[t]=arguments[t];return new Proxy({get(n){for(let i=o.length-1;i>=0;i--){const r=De(o[i])[n];if(r!==void 0)return r}},has(n){for(let i=o.length-1;i>=0;i--)if(n in De(o[i]))return!0;return!1},keys(){const n=[];for(let i=0;i<o.length;i++)n.push(...Object.keys(De(o[i])));return[...Array.from(new Set(n))]}},Dn)}const ze=Rt({props:["render","props"],setup:e=>()=>typeof e.render=="function"||typeof e.render=="object"?ht(e.render,e.props):e.render});function tt(e){return ue(e,{data:C(e.data)})}function zn(e){const o=St(e.data),t=ue({state:{},onStateChange:()=>{},renderFallbackValue:null,mergeOptions(r,l){return o?{...r,...l}:ue(r,l)}},o?tt(e):e),n=hn(t);if(o){const r=vt(e.data);nt(r,()=>{n.setState(l=>({...l,data:r.value}))},{immediate:!0})}const i=Ct(n.initialState);return wt(()=>{n.setOptions(r=>{var l;const u=new Proxy({},{get:(a,d)=>i.value[d]});return ue(r,o?tt(e):e,{state:ue(u,(l=e.state)!=null?l:{}),onStateChange:a=>{a instanceof Function?i.value=a(i.value):i.value=a,e.onStateChange==null||e.onStateChange(a)}})})}),n}const An={slots:{root:"relative overflow-auto outline-primary/25 focus-visible:outline-3",base:"min-w-full overflow-clip",caption:"sr-only",thead:"relative",tbody:"isolate [&>tr]:data-[selectable=true]:hover:bg-elevated/50 [&>tr]:data-[selectable=true]:outline-primary/25 [&>tr]:data-[selectable=true]:focus-visible:outline-3 divide-y divide-default",tfoot:"relative",tr:"data-[selected=true]:bg-elevated/50",th:"px-4 py-3.5 text-sm text-highlighted text-start font-semibold [&:has([role=checkbox])]:pe-0",td:"p-4 text-sm text-muted whitespace-nowrap [&:has([role=checkbox])]:pe-0",separator:"absolute z-1 start-0 w-full h-px bg-(--ui-border-accented)",empty:"py-6 text-center text-sm text-muted",loading:"py-6 text-center"},variants:{pinned:{true:{th:"sticky bg-default/75 z-1",td:"sticky bg-default/75 z-1"}},sticky:{true:{thead:"sticky top-0 inset-x-0 bg-default/75 backdrop-blur z-1",tfoot:"sticky bottom-0 inset-x-0 bg-default/75 backdrop-blur z-1"},header:{thead:"sticky top-0 inset-x-0 bg-default/75 backdrop-blur z-1"},footer:{tfoot:"sticky bottom-0 inset-x-0 bg-default/75 backdrop-blur z-1"}},loading:{true:{thead:"after:absolute after:z-1 after:h-px motion-reduce:after:inset-x-0 motion-reduce:after:animate-pulse"}},externalScroll:{true:{root:"overflow-visible"}},loadingAnimation:{carousel:"","carousel-inverse":"",swing:"",elastic:""},loadingColor:{primary:"",secondary:"",success:"",info:"",warning:"",error:"",neutral:""}},compoundVariants:[{loading:!0,loadingColor:"primary",class:{thead:"after:bg-primary"}},{loading:!0,loadingColor:"secondary",class:{thead:"after:bg-secondary"}},{loading:!0,loadingColor:"success",class:{thead:"after:bg-success"}},{loading:!0,loadingColor:"info",class:{thead:"after:bg-info"}},{loading:!0,loadingColor:"warning",class:{thead:"after:bg-warning"}},{loading:!0,loadingColor:"error",class:{thead:"after:bg-error"}},{loading:!0,loadingColor:"neutral",class:{thead:"after:bg-inverted"}},{loading:!0,loadingAnimation:"carousel",class:{thead:"motion-safe:after:animate-[carousel_2s_ease-in-out_infinite] motion-safe:rtl:after:animate-[carousel-rtl_2s_ease-in-out_infinite]"}},{loading:!0,loadingAnimation:"carousel-inverse",class:{thead:"motion-safe:after:animate-[carousel-inverse_2s_ease-in-out_infinite] motion-safe:rtl:after:animate-[carousel-inverse-rtl_2s_ease-in-out_infinite]"}},{loading:!0,loadingAnimation:"swing",class:{thead:"motion-safe:after:animate-[swing_2s_ease-in-out_infinite]"}},{loading:!0,loadingAnimation:"elastic",class:{thead:"motion-safe:after:animate-[elastic_2s_ease-in-out_infinite]"}}],defaultVariants:{loadingColor:"primary",loadingAnimation:"carousel"}},On=["data-selected","data-selectable","data-expanded","data-pinned","role","tabindex","onClick","onPointerenter","onContextmenu"],En=["data-pinned","colspan","rowspan"],Hn=["colspan"],Gn=["data-pinned","scope","colspan","rowspan"],Ln=["colspan"],qn=["colspan"],kn={key:1},Bn=["colspan"],bn={key:2},jn=["colspan"],Tn=["data-pinned","colspan","rowspan"],Xn=Object.assign({inheritAttrs:!1},{__name:"UTable",props:It({as:{type:null,required:!1},data:{type:Array,required:!1},columns:{type:Array,required:!1},caption:{type:String,required:!1},meta:{type:Object,required:!1},virtualize:{type:[Boolean,Object],required:!1,default:!1},empty:{type:String,required:!1},sticky:{type:[Boolean,String],required:!1},loading:{type:Boolean,required:!1},loadingColor:{type:null,required:!1},loadingAnimation:{type:null,required:!1},watchOptions:{type:Object,required:!1,default:()=>({deep:!0})},globalFilterOptions:{type:Object,required:!1},columnFiltersOptions:{type:Object,required:!1},columnPinningOptions:{type:Object,required:!1},columnSizingOptions:{type:Object,required:!1},visibilityOptions:{type:Object,required:!1},sortingOptions:{type:Object,required:!1},groupingOptions:{type:Object,required:!1},expandedOptions:{type:Object,required:!1},rowSelectionOptions:{type:Object,required:!1},rowPinningOptions:{type:Object,required:!1},paginationOptions:{type:Object,required:!1},facetedOptions:{type:Object,required:!1},onSelect:{type:Function,required:!1},onHover:{type:Function,required:!1},onContextmenu:{type:[Function,Array],required:!1},class:{type:null,required:!1},ui:{type:Object,required:!1},state:{type:Object,required:!1},onStateChange:{type:Function,required:!1},renderFallbackValue:{type:null,required:!1},_features:{type:Array,required:!1},autoResetAll:{type:Boolean,required:!1},debugAll:{type:Boolean,required:!1},debugCells:{type:Boolean,required:!1},debugColumns:{type:Boolean,required:!1},debugHeaders:{type:Boolean,required:!1},debugRows:{type:Boolean,required:!1},debugTable:{type:Boolean,required:!1},defaultColumn:{type:Object,required:!1},getRowId:{type:Function,required:!1},getSubRows:{type:Function,required:!1},initialState:{type:Object,required:!1},mergeOptions:{type:Function,required:!1}},{globalFilter:{type:String},globalFilterModifiers:{},columnFilters:{type:Array},columnFiltersModifiers:{},columnOrder:{type:Array},columnOrderModifiers:{},columnVisibility:{type:Object},columnVisibilityModifiers:{},columnPinning:{type:Object},columnPinningModifiers:{},columnSizing:{type:Object},columnSizingModifiers:{},columnSizingInfo:{type:Object},columnSizingInfoModifiers:{},rowSelection:{type:Object},rowSelectionModifiers:{},rowPinning:{type:Object},rowPinningModifiers:{},sorting:{type:Array},sortingModifiers:{},grouping:{type:Array},groupingModifiers:{},expanded:{type:[Boolean,Object]},expandedModifiers:{},pagination:{type:Object},paginationModifiers:{}}),emits:["update:globalFilter","update:columnFilters","update:columnOrder","update:columnVisibility","update:columnPinning","update:columnSizing","update:columnSizingInfo","update:rowSelection","update:rowPinning","update:sorting","update:grouping","update:expanded","update:pagination"],setup(e,{expose:o}){const t=e,n=_t(),i=Ft("table",t),{t:r}=yt(),l=xt(),u=$t(i.data??[],i.watchOptions?.deep!==!1),a=L(()=>i.meta??{}),d=L(()=>c(i.columns??Object.keys(u.value[0]??{}).map(m=>({accessorKey:m,header:Et(m)}))));function c(m){return m.map(V=>{const v={...V};return"columns"in v&&v.columns&&(v.columns=c(v.columns)),v.cell||(v.cell=({getValue:_})=>{const x=_();return x===""||x===null||x===void 0?" ":String(x)}),v})}const S=L(()=>typeof i.virtualize=="object"&&!!i.virtualize.getScrollElement),g=L(()=>At({extend:An,...l.ui?.table||{}})({sticky:i.sticky,loading:i.loading,loadingColor:i.loadingColor,loadingAnimation:i.loadingAnimation,externalScroll:S.value})),[s,f]=We(),[p,h]=We({props:{row:{type:Object,required:!0},style:{type:Object,required:!1}}}),F=L(()=>{function m(V){for(const v of V)if("footer"in v||"columns"in v&&m(v.columns))return!0;return!1}return m(d.value)}),$=H(e,"globalFilter"),P=H(e,"columnFilters"),A=H(e,"columnOrder"),I=H(e,"columnVisibility"),b=H(e,"columnPinning"),Y=H(e,"columnSizing"),Q=H(e,"columnSizingInfo"),te=H(e,"rowSelection"),ne=H(e,"rowPinning"),Z=H(e,"sorting"),ve=H(e,"grouping"),Ce=H(e,"expanded"),we=H(e,"pagination"),Re=Je("rootRef"),be=Je("tableRef"),ct=Pt(Vt(i,"_features","autoResetAll","debugAll","debugCells","debugColumns","debugHeaders","debugRows","debugTable","defaultColumn","getRowId","getSubRows","initialState","mergeOptions","renderFallbackValue")),O=zn({...ct.value,get data(){return u.value},get columns(){return d.value},meta:a.value,getCoreRowModel:_n(),...i.globalFilterOptions||{},...$.value!==void 0&&{onGlobalFilterChange:m=>E(m,$)},...i.columnFiltersOptions||{},getFilteredRowModel:Vn(),...P.value!==void 0&&{onColumnFiltersChange:m=>E(m,P)},...A.value!==void 0&&{onColumnOrderChange:m=>E(m,A)},...i.visibilityOptions||{},...I.value!==void 0&&{onColumnVisibilityChange:m=>E(m,I)},...i.columnPinningOptions||{},...b.value!==void 0&&{onColumnPinningChange:m=>E(m,b)},...i.columnSizingOptions||{},...Y.value!==void 0&&{onColumnSizingChange:m=>E(m,Y)},...Q.value!==void 0&&{onColumnSizingInfoChange:m=>E(m,Q)},...i.rowSelectionOptions||{},...te.value!==void 0&&{onRowSelectionChange:m=>E(m,te)},...i.rowPinningOptions||{},...ne.value!==void 0&&{onRowPinningChange:m=>E(m,ne)},...i.sortingOptions||{},getSortedRowModel:Mn(),...Z.value!==void 0&&{onSortingChange:m=>E(m,Z)},...i.groupingOptions||{},...ve.value!==void 0&&{onGroupingChange:m=>E(m,ve)},...i.expandedOptions||{},getExpandedRowModel:Fn(),...Ce.value!==void 0&&{onExpandedChange:m=>E(m,Ce)},...i.paginationOptions||{},...we.value!==void 0&&{onPaginationChange:m=>E(m,we)},...i.facetedOptions||{},state:{get globalFilter(){return $.value},get columnFilters(){return P.value},get columnOrder(){return A.value},get columnVisibility(){return I.value},get columnPinning(){return b.value},get expanded(){return Ce.value},get rowSelection(){return te.value},get sorting(){return Z.value},get grouping(){return ve.value},get rowPinning(){return ne.value},get columnSizing(){return Y.value},get columnSizingInfo(){return Q.value},get pagination(){return we.value}}}),je=L(()=>O.getRowModel().rows),Te=L(()=>i.virtualize?[]:O.getTopRows()),Ne=L(()=>i.virtualize?[]:O.getBottomRows()),oe=L(()=>Te.value.length||Ne.value.length?O.getCenterRows():je.value),ge=Dt(()=>zt(typeof i.virtualize=="boolean"?{}:i.virtualize,{estimateSize:65,overscan:12})),ft=()=>(S.value?ge.value.getScrollElement?.():Re.value?.$el)??null,he=L(()=>ge.value.scrollMargin??0),ie=!!i.virtualize&&Ot({...ge.value,get count(){return oe.value.length},get scrollMargin(){return he.value},getScrollElement:ft,estimateSize:m=>{const V=ge.value.estimateSize;return typeof V=="function"?V(m):V}}),re=L(()=>ie?ie.value.getVirtualItems():[]),Ue=L(()=>(re.value[0]?.start??0)-he.value),Xe=L(()=>!ie||!re.value.length?0:ie.value.getTotalSize()-(re.value[re.value.length-1]?.end??0)+he.value);function E(m,V){V.value=typeof m=="function"?m(V.value):m}function pt(m,V){if(!i.onSelect)return;const v=m.target;v.closest("button")||v.closest("a")||(m.preventDefault(),m.stopPropagation(),i.onSelect(m,V))}function Ke(m,V){i.onHover&&i.onHover(m,V)}function mt(m,V){i.onContextmenu&&(Array.isArray(i.onContextmenu)?i.onContextmenu.forEach(v=>v(m,V)):i.onContextmenu(m,V))}function j(m,V){return typeof m=="function"?m(V):m}function _e(m){const V={},v=m.getIsPinned();return v==="left"?V.left=`${m.getStart("left")}px`:v==="right"&&(V.right=`${m.getAfter("right")}px`),V}return nt(()=>i.data,()=>{u.value=i.data?[...i.data]:[]},i.watchOptions),o({get $el(){return Re.value?.$el},tableRef:be,tableApi:O}),(m,V)=>(y(),M(G,null,[le(C(p),null,{default:Fe(({row:v,style:_})=>[k("tr",{"data-selected":v.getIsSelected(),"data-selectable":!!C(i).onSelect||!!C(i).onHover||!!C(i).onContextmenu,"data-expanded":v.getIsExpanded(),"data-pinned":v.getIsPinned()||void 0,role:C(i).onSelect?"button":void 0,tabindex:C(i).onSelect?0:void 0,"data-slot":"tr",class:D(g.value.tr({class:[C(i).ui?.tr,j(C(O).options.meta?.class?.tr,v)]})),style:J([j(C(O).options.meta?.style?.tr,v),_]),onClick:x=>pt(x,v),onPointerenter:x=>Ke(x,v),onPointerleave:V[0]||(V[0]=x=>Ke(x,null)),onContextmenu:x=>mt(x,v)},[(y(!0),M(G,null,T(v.getVisibleCells(),x=>(y(),M("td",{key:x.id,"data-pinned":x.column.getIsPinned(),colspan:j(x.column.columnDef.meta?.colspan?.td,x),rowspan:j(x.column.columnDef.meta?.rowspan?.td,x),"data-slot":"td",class:D(g.value.td({class:[C(i).ui?.td,j(x.column.columnDef.meta?.class?.td,x)],pinned:!!x.column.getIsPinned()})),style:J([_e(x.column),j(x.column.columnDef.meta?.style?.td,x)])},[N(m.$slots,`${x.column.id}-cell`,de({ref_for:!0},x.getContext()),()=>[le(C(ze),{render:x.column.columnDef.cell,props:x.getContext()},null,8,["render","props"])])],14,En))),128))],46,On),v.getIsExpanded()?(y(),M("tr",{key:0,"data-slot":"tr",class:D(g.value.tr({class:[C(i).ui?.tr]}))},[k("td",{colspan:v.getAllCells().length,"data-slot":"td",class:D(g.value.td({class:[C(i).ui?.td]}))},[N(m.$slots,"expanded",{row:v})],10,Hn)],2)):X("",!0)]),_:3}),le(C(s),null,{default:Fe(()=>[k("table",{ref_key:"tableRef",ref:be,"data-slot":"base",class:D(g.value.base({class:[C(i).ui?.base]}))},[C(i).caption||n.caption?(y(),M("caption",{key:0,"data-slot":"caption",class:D(g.value.caption({class:[C(i).ui?.caption]}))},[N(m.$slots,"caption",{},()=>[Ye(Qe(C(i).caption),1)])],2)):X("",!0),k("thead",{"data-slot":"thead",class:D(g.value.thead({class:[C(i).ui?.thead]}))},[(y(!0),M(G,null,T(C(O).getHeaderGroups(),v=>(y(),M("tr",{key:v.id,"data-slot":"tr",class:D(g.value.tr({class:[C(i).ui?.tr]}))},[(y(!0),M(G,null,T(v.headers,_=>(y(),M("th",{key:_.id,"data-pinned":_.column.getIsPinned(),scope:_.colSpan>1?"colgroup":"col",colspan:_.colSpan>1?_.colSpan:void 0,rowspan:_.rowSpan>1?_.rowSpan:void 0,"data-slot":"th",class:D(g.value.th({class:[C(i).ui?.th,j(_.column.columnDef.meta?.class?.th,_)],pinned:!!_.column.getIsPinned()})),style:J([_e(_.column),j(_.column.columnDef.meta?.style?.th,_)])},[N(m.$slots,`${_.id}-header`,de({ref_for:!0},_.getContext()),()=>[_.isPlaceholder?X("",!0):(y(),ee(C(ze),{key:0,render:_.column.columnDef.header,props:_.getContext()},null,8,["render","props"]))])],14,Gn))),128))],2))),128)),k("tr",{"data-slot":"separator",class:D(g.value.separator({class:[C(i).ui?.separator]}))},null,2)],2),k("tbody",{"data-slot":"tbody",class:D(g.value.tbody({class:[C(i).ui?.tbody]}))},[N(m.$slots,"body-top"),je.value.length?(y(),M(G,{key:0},[(y(!0),M(G,null,T(Te.value,v=>(y(),ee(C(h),{key:v.id,row:v},null,8,["row"]))),128)),C(ie)?(y(),M(G,{key:0},[Ue.value>0?(y(),M("tr",{key:0,style:J({height:`${Ue.value}px`}),"aria-hidden":"true"},[k("td",{colspan:C(O).getAllLeafColumns().length},null,8,Ln)],4)):X("",!0),(y(!0),M(G,null,T(re.value,v=>(y(),M(G,{key:oe.value[v.index]?.id??`virtual-${v.index}`},[oe.value[v.index]?(y(),ee(C(h),{key:0,row:oe.value[v.index],style:J({height:`${v.size}px`})},null,8,["row","style"])):X("",!0)],64))),128)),Xe.value>0?(y(),M("tr",{key:1,style:J({height:`${Xe.value}px`}),"aria-hidden":"true"},[k("td",{colspan:C(O).getAllLeafColumns().length},null,8,qn)],4)):X("",!0)],64)):(y(!0),M(G,{key:1},T(oe.value,v=>(y(),ee(C(h),{key:v.id,row:v},null,8,["row"]))),128)),(y(!0),M(G,null,T(Ne.value,v=>(y(),ee(C(h),{key:v.id,row:v},null,8,["row"]))),128))],64)):C(i).loading&&n.loading?(y(),M("tr",kn,[k("td",{colspan:C(O).getAllLeafColumns().length,"data-slot":"loading",class:D(g.value.loading({class:C(i).ui?.loading}))},[N(m.$slots,"loading")],10,Bn)])):(y(),M("tr",bn,[k("td",{colspan:C(O).getAllLeafColumns().length,"data-slot":"empty",class:D(g.value.empty({class:C(i).ui?.empty}))},[N(m.$slots,"empty",{},()=>[Ye(Qe(C(i).empty||C(r)("table.noData")),1)])],10,jn)])),N(m.$slots,"body-bottom")],2),F.value?(y(),M("tfoot",{key:1,"data-slot":"tfoot",class:D(g.value.tfoot({class:[C(i).ui?.tfoot]}))},[k("tr",{"data-slot":"separator",class:D(g.value.separator({class:[C(i).ui?.separator]}))},null,2),(y(!0),M(G,null,T(C(O).getFooterGroups(),v=>(y(),M("tr",{key:v.id,"data-slot":"tr",class:D(g.value.tr({class:[C(i).ui?.tr]}))},[(y(!0),M(G,null,T(v.headers,_=>(y(),M("th",{key:_.id,"data-pinned":_.column.getIsPinned(),colspan:_.colSpan>1?_.colSpan:void 0,rowspan:_.rowSpan>1?_.rowSpan:void 0,"data-slot":"th",class:D(g.value.th({class:[C(i).ui?.th,j(_.column.columnDef.meta?.class?.th,_)],pinned:!!_.column.getIsPinned()})),style:J([_e(_.column),j(_.column.columnDef.meta?.style?.th,_)])},[N(m.$slots,`${_.id}-footer`,de({ref_for:!0},_.getContext()),()=>[_.isPlaceholder?X("",!0):(y(),ee(C(ze),{key:0,render:_.column.columnDef.footer,props:_.getContext()},null,8,["render","props"]))])],14,Tn))),128))],2))),128))],2)):X("",!0)],2)]),_:3}),le(C(Mt),de({ref_key:"rootRef",ref:Re,as:C(i).as,"data-slot":"root"},m.$attrs,{class:g.value.root({class:[C(i).ui?.root,C(i).class]})}),{default:Fe(()=>[le(C(f))]),_:1},16,["as","class"])],64))}});export{Xn as _};
@@ -1,4 +1,4 @@
1
- import{_ as Te}from"./BV8EzO8q.js";import{_ as Re}from"./B7zo6PK8.js";import{_ as Fe,a as Oe}from"./B7uPoZ7T.js";import{d as ze,u as Me,q as De,w as le,s as Be,c as m,h as l,f as d,F as E,E as Le,v as M,o as i,g as u,b as o,e as w,z as D,t as h,m as qe,k as j,l as _,j as He,x as K,_ as We,I as Ke,r as f}from"./BdQ7kfxJ.js";import{_ as Ge}from"./Bh2WA4IJ.js";import{_ as Je}from"./CfV2N201.js";import{_ as Qe}from"./BOn5q0rT.js";import{_ as Ye}from"./dg6uXTyR.js";import{_ as Xe}from"./CZ6WR7uw.js";import{_ as Ze}from"./CyWOerIG.js";import{_ as et}from"./D0XWJGhG.js";import{_ as tt}from"./CK2AMqz_.js";import{b as at,L as lt}from"./DWwiVTZX.js";import{u as ot}from"./Sx5-c-bZ.js";import{u as oe}from"./DTtizz85.js";import{e as T}from"./DwZS0oRm.js";import"./Bo73sAu8.js";import"./CrsaY0R_.js";import"./Bg63qh8W.js";import"./HGYIpJtg.js";import"./CxwnFFD0.js";import"./i7znB42v.js";import"./DGnQ69wW.js";const nt={class:"p-4 space-y-4"},st={key:2,class:"divide-y divide-gray-200 dark:divide-gray-800"},rt={class:"min-w-0 space-y-1"},it={class:"flex items-center gap-2 flex-wrap"},ut={class:"font-mono text-sm font-medium"},dt={class:"text-xs text-gray-500 dark:text-gray-400 font-mono truncate"},ct={key:0},mt={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},pt={key:0,class:"text-xs text-gray-500 dark:text-gray-400"},ft={class:"flex items-center gap-1 shrink-0"},vt={class:"space-y-4"},gt={class:"border border-dashed border-gray-300 dark:border-gray-700 rounded-lg p-3 space-y-2"},ht={key:0,class:"space-y-2"},_t={class:"flex items-center gap-2 flex-wrap"},bt={key:1,class:"text-xs text-gray-500"},xt={key:1,class:"text-xs text-gray-500 dark:text-gray-400"},yt={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},kt={key:0,class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},wt={class:"space-y-2"},Vt={class:"space-y-2"},Pt={class:"text-xs text-gray-500 w-4"},Ct={class:"space-y-2"},Ut={class:"font-mono"},Zt=ze({__name:"test-functions",async setup(It){let x,R;const P=Me().params.id,p=De(),{aiStatus:ne}=ot(),{data:F}=([x,R]=le(()=>oe(`/api/projects/${P}`,"$hHDWk2vBQV")),x=await x,R(),x),{data:se,refresh:G,status:re}=([x,R]=le(()=>oe(`/api/projects/${P}/test-functions`,"$l0yitekV_H")),x=await x,R(),x);Be(M(()=>({title:`Test functions — ${F.value?.label||F.value?.name||"Project"} — Piwi Dashboard`})));const B=M(()=>se.value?.items??[]),ie=[{label:"Page-object method",value:"page-object-method"},{label:"Helper function",value:"helper"},{label:"Fixture",value:"fixture"}],ue=[{label:"string",value:"string"},{label:"number",value:"number"},{label:"boolean",value:"boolean"},{label:"object",value:"object"}],de=[{label:"goto",value:"goto"},{label:"click",value:"click"},{label:"fill",value:"fill"},{label:"check",value:"check"},{label:"uncheck",value:"uncheck"},{label:"selectOption",value:"selectOption"},{label:"press",value:"press"},{label:"assertVisible",value:"assertVisible"}],ce=[{label:"element text",value:"text"},{label:"field value",value:"value"},{label:"test id",value:"testId"}],V=f(!1),L=f(!1),C=f(null);function O(){return{name:"",kind:"page-object-method",module:"",receiver:"",importName:"",urlPattern:"",params:[],steps:[{action:"click",role:"",name:"",testId:""}],paramSources:[]}}const a=f(O()),S=f(!1),y=f(""),q=f(!1),U=f(!1),k=f(null),N=f(null),I=f(""),H=f(!1),J=M(()=>U.value&&k.value!=null&&k.value<lt),me=M(()=>new Set(a.value.params.filter(n=>n.type==="object"&&n.name.trim()).map(n=>n.name.trim())));function Q(){S.value=!1,y.value="",I.value="",U.value=!1,k.value=null,N.value=null}function pe(){a.value=O(),C.value=null,Q(),V.value=!0}function fe(n){const e=n.entry;a.value={name:e.name,kind:e.kind,module:e.module,receiver:e.receiver??"",importName:e.importName??"",urlPattern:e.urlPattern??"",params:e.params.map(s=>({name:s.name,type:s.type,fields:(s.fields??[]).join(", ")})),steps:e.steps.map(s=>({action:s.action,role:s.target.role??"",name:s.target.name??"",testId:s.target.testId??""})),paramSources:e.paramSources.map(s=>({param:s.param,path:s.path??"",stepIndex:s.stepIndex,from:s.from}))},a.value.steps.length===0&&(a.value.steps=O().steps),C.value=n.id,Q(),V.value=!0}function Y(n){a.value.name=n.name,a.value.kind=n.kind,a.value.receiver=n.receiver??"",a.value.importName=n.importName??"",a.value.params=n.params.map(e=>({name:e.name,type:e.type,fields:(e.fields??[]).join(", ")})),a.value.steps=n.steps.map(e=>({action:e.action,role:e.target.role??"",name:e.target.name??"",testId:e.target.testId??""})),a.value.steps.length===0&&(a.value.steps=O().steps),a.value.paramSources=n.paramSources.map(e=>({param:e.param,path:e.path??"",stepIndex:e.stepIndex,from:e.from})),U.value=!0,k.value=n.confidence,N.value=n.notes}async function ve(){if(!y.value.trim()){p.add({title:"Paste some function code first",color:"error"});return}q.value=!0;try{const{proposal:n}=await $fetch(`/api/projects/${P}/test-functions/extract`,{method:"POST",body:{code:y.value}});Y(n),p.add({title:"Extracted — review the fields below before saving",color:"success"})}catch(n){p.add({title:"Extraction failed",description:T(n),color:"error"})}finally{q.value=!1}}async function ge(){if(!y.value.trim()){p.add({title:"Paste some function code first",color:"error"});return}try{await navigator.clipboard.writeText(at(y.value)),p.add({title:"Prompt copied",description:"Paste it into your AI chat, then paste the reply below.",color:"success"})}catch(n){p.add({title:"Failed to copy the prompt",description:T(n),color:"error"})}}async function he(){if(!I.value.trim()){p.add({title:"Paste the AI response first",color:"error"});return}H.value=!0;try{const{proposal:n}=await $fetch(`/api/projects/${P}/test-functions/validate-proposal`,{method:"POST",body:{responseText:I.value}});Y(n),p.add({title:"Applied — review the fields below before saving",color:"success"})}catch(n){p.add({title:"Couldn't apply that response",description:T(n),color:"error"})}finally{H.value=!1}}function _e(){a.value.params.push({name:"",type:"string",fields:""})}function be(n){a.value.params.splice(n,1)}function xe(){a.value.steps.push({action:"click",role:"",name:"",testId:""})}function ye(n){a.value.steps.length<=1||a.value.steps.splice(n,1)}function ke(){a.value.paramSources.push({param:"",path:"",stepIndex:0,from:"value"})}function we(n){a.value.paramSources.splice(n,1)}async function Ve(){if(!a.value.name.trim()){p.add({title:"Name is required",color:"error"});return}if(!a.value.module.trim()){p.add({title:"Module is required",color:"error"});return}L.value=!0;const n={name:a.value.name.trim(),kind:a.value.kind,module:a.value.module.trim(),receiver:a.value.kind==="page-object-method"&&a.value.receiver.trim()||null,importName:a.value.kind==="page-object-method"&&a.value.importName.trim()||null,urlPattern:a.value.urlPattern.trim()||null,params:a.value.params.filter(s=>s.name.trim()).map(s=>({name:s.name.trim(),type:s.type,...s.type==="object"?{fields:s.fields.split(",").map(W=>W.trim()).filter(Boolean)}:{}})),steps:a.value.steps.map(s=>({action:s.action,target:{role:s.role.trim()||null,name:s.name.trim()||null,testId:s.testId.trim()||null}})),paramSources:a.value.paramSources.filter(s=>s.param.trim()).map(s=>({param:s.param.trim(),path:s.path.trim()||null,stepIndex:s.stepIndex,from:s.from})),source:U.value?"ai-extracted":void 0,confidence:U.value?k.value??void 0:void 0},e=C.value!=null;try{e?await $fetch(`/api/test-functions/${C.value}`,{method:"PATCH",body:n}):await $fetch(`/api/projects/${P}/test-functions`,{method:"POST",body:n}),p.add({title:e?"Function updated":"Function added",color:"success"}),V.value=!1,await G()}catch(s){p.add({title:e?"Failed to update function":"Failed to add function",description:T(s),color:"error"})}finally{L.value=!1}}const z=f(null),A=f(!1);function Pe(n){z.value=n,A.value=!0}async function Ce(){const n=z.value;if(n){A.value=!1;try{await $fetch(`/api/test-functions/${n.id}`,{method:"DELETE"}),p.add({title:"Function removed",color:"success"}),await G()}catch(e){p.add({title:"Failed to remove function",description:T(e),color:"error"})}finally{z.value=null}}}function Ue(n){return n.entry.steps.map(e=>`${e.action}(${e.target.role??e.target.testId??e.target.name??"?"})`).join(" → ")}return(n,e)=>{const s=Te,W=Re,Ie=Oe,c=He,$e=Ge,je=Je,X=qe,Se=Qe,Ne=Fe,Z=We,ee=Ye,Ae=Xe,v=Ke,b=Ze,$=et,te=tt,Ee=Le;return i(),m(E,null,[l(Ne,{id:"project-test-functions"},{header:d(()=>[l(Ie,null,{leading:d(()=>[l(s),l(W,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(F)?.label||o(F)?.name||"Project",to:`/projects/${o(P)}`},{label:"Test functions"}]},null,8,["items"])]),_:1})]),body:d(()=>[u("div",nt,[l(Se,{title:"Test function catalog",icon:"i-lucide-function-square",count:o(B).length||null,subtitle:"Page-object methods and helpers the Piwi Picker extension matches a recording against, to generate calls to your own code instead of raw locator lines."},{actions:d(()=>[l(c,{label:"Add function",icon:"i-lucide-plus",size:"sm",onClick:pe})]),default:d(()=>[o(re)==="pending"?(i(),w($e,{key:0})):o(B).length===0?(i(),w(je,{key:1,icon:"i-lucide-function-square",text:"No functions registered yet — add one, or extract one from a recording in the extension."})):(i(),m("div",st,[(i(!0),m(E,null,D(o(B),t=>(i(),m("div",{key:t.id,class:"py-3 flex items-start justify-between gap-3"},[u("div",rt,[u("div",it,[u("span",ut,h(t.name),1),l(X,{color:"neutral",variant:"subtle",size:"sm"},{default:d(()=>[j(h(t.kind),1)]),_:2},1024),t.source!=="manual"?(i(),w(X,{key:0,color:"primary",variant:"subtle",size:"sm"},{default:d(()=>[j(h(t.source),1)]),_:2},1024)):_("",!0)]),u("div",dt,[j(h(t.module),1),t.receiver?(i(),m("span",ct,"#"+h(t.receiver),1)):_("",!0)]),u("div",mt,h(Ue(t)),1),t.urlPattern?(i(),m("div",pt,[e[13]||(e[13]=j(" on ",-1)),u("code",null,h(t.urlPattern),1)])):_("",!0)]),u("div",ft,[l(c,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm","aria-label":`Edit ${t.name}`,onClick:g=>fe(t)},null,8,["aria-label","onClick"]),l(c,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm","aria-label":`Remove ${t.name}`,onClick:g=>Pe(t)},null,8,["aria-label","onClick"])])]))),128))]))]),_:1},8,["count"])])]),_:1}),l(Ee,null,{default:d(()=>[l(te,{open:o(V),"onUpdate:open":e[10]||(e[10]=t=>K(V)?V.value=t:null),title:o(C)==null?"Add test function":"Edit test function",ui:{content:"max-w-2xl"}},{body:d(()=>[u("div",vt,[u("div",gt,[u("button",{type:"button",class:"flex items-center gap-2 text-sm font-medium w-full text-left",onClick:e[0]||(e[0]=t=>S.value=!o(S))},[l(Z,{name:"i-lucide-sparkles",class:"text-primary"}),e[14]||(e[14]=u("span",null,"Paste from code (AI)",-1)),l(Z,{name:o(S)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"ml-auto text-gray-400"},null,8,["name"])]),o(S)?(i(),m("div",ht,[e[15]||(e[15]=u("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," Paste a page-object method or helper function's source — the fields below are filled in from it, for you to review and edit before saving. Module and URL pattern aren't inferred; fill those in yourself. ",-1)),l(ee,{modelValue:o(y),"onUpdate:modelValue":e[1]||(e[1]=t=>K(y)?y.value=t:null),rows:8,placeholder:`async login(username: string, password: string) {
1
+ import{_ as Te}from"./BuMX-4RF.js";import{_ as Re}from"./OMI0cmZ0.js";import{_ as Fe,a as Oe}from"./BS91Og__.js";import{d as ze,u as Me,q as De,w as le,s as Be,c as m,h as l,f as d,F as E,E as Le,v as M,o as i,g as u,b as o,e as w,z as D,t as h,m as qe,k as j,l as _,j as He,x as K,_ as We,I as Ke,r as f}from"./1QWBzxLM.js";import{_ as Ge}from"./Bx_lfKHl.js";import{_ as Je}from"./Dn_-RkxP.js";import{_ as Qe}from"./bmAf49LT.js";import{_ as Ye}from"./DoDo3VF2.js";import{_ as Xe}from"./B-1zt4pp.js";import{_ as Ze}from"./B4lvHjBe.js";import{_ as et}from"./e-GZmCeP.js";import{_ as tt}from"./CtQMagSz.js";import{b as at,L as lt}from"./DWwiVTZX.js";import{u as ot}from"./B1iYmAt_.js";import{u as oe}from"./CU_2YLhT.js";import{e as T}from"./D4mPjHHR.js";import"./CiCUZGFZ.js";import"./B82vqOZe.js";import"./CHz7LJIX.js";import"./AbnDY6Zr.js";import"./Bl0xzETD.js";import"./DpM8IgHL.js";import"./DGnQ69wW.js";const nt={class:"p-4 space-y-4"},st={key:2,class:"divide-y divide-gray-200 dark:divide-gray-800"},rt={class:"min-w-0 space-y-1"},it={class:"flex items-center gap-2 flex-wrap"},ut={class:"font-mono text-sm font-medium"},dt={class:"text-xs text-gray-500 dark:text-gray-400 font-mono truncate"},ct={key:0},mt={class:"text-xs text-gray-500 dark:text-gray-400 truncate"},pt={key:0,class:"text-xs text-gray-500 dark:text-gray-400"},ft={class:"flex items-center gap-1 shrink-0"},vt={class:"space-y-4"},gt={class:"border border-dashed border-gray-300 dark:border-gray-700 rounded-lg p-3 space-y-2"},ht={key:0,class:"space-y-2"},_t={class:"flex items-center gap-2 flex-wrap"},bt={key:1,class:"text-xs text-gray-500"},xt={key:1,class:"text-xs text-gray-500 dark:text-gray-400"},yt={class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},kt={key:0,class:"grid grid-cols-1 sm:grid-cols-2 gap-4"},wt={class:"space-y-2"},Vt={class:"space-y-2"},Pt={class:"text-xs text-gray-500 w-4"},Ct={class:"space-y-2"},Ut={class:"font-mono"},Zt=ze({__name:"test-functions",async setup(It){let x,R;const P=Me().params.id,p=De(),{aiStatus:ne}=ot(),{data:F}=([x,R]=le(()=>oe(`/api/projects/${P}`,"$hHDWk2vBQV")),x=await x,R(),x),{data:se,refresh:G,status:re}=([x,R]=le(()=>oe(`/api/projects/${P}/test-functions`,"$l0yitekV_H")),x=await x,R(),x);Be(M(()=>({title:`Test functions — ${F.value?.label||F.value?.name||"Project"} — Piwi Dashboard`})));const B=M(()=>se.value?.items??[]),ie=[{label:"Page-object method",value:"page-object-method"},{label:"Helper function",value:"helper"},{label:"Fixture",value:"fixture"}],ue=[{label:"string",value:"string"},{label:"number",value:"number"},{label:"boolean",value:"boolean"},{label:"object",value:"object"}],de=[{label:"goto",value:"goto"},{label:"click",value:"click"},{label:"fill",value:"fill"},{label:"check",value:"check"},{label:"uncheck",value:"uncheck"},{label:"selectOption",value:"selectOption"},{label:"press",value:"press"},{label:"assertVisible",value:"assertVisible"}],ce=[{label:"element text",value:"text"},{label:"field value",value:"value"},{label:"test id",value:"testId"}],V=f(!1),L=f(!1),C=f(null);function O(){return{name:"",kind:"page-object-method",module:"",receiver:"",importName:"",urlPattern:"",params:[],steps:[{action:"click",role:"",name:"",testId:""}],paramSources:[]}}const a=f(O()),S=f(!1),y=f(""),q=f(!1),U=f(!1),k=f(null),N=f(null),I=f(""),H=f(!1),J=M(()=>U.value&&k.value!=null&&k.value<lt),me=M(()=>new Set(a.value.params.filter(n=>n.type==="object"&&n.name.trim()).map(n=>n.name.trim())));function Q(){S.value=!1,y.value="",I.value="",U.value=!1,k.value=null,N.value=null}function pe(){a.value=O(),C.value=null,Q(),V.value=!0}function fe(n){const e=n.entry;a.value={name:e.name,kind:e.kind,module:e.module,receiver:e.receiver??"",importName:e.importName??"",urlPattern:e.urlPattern??"",params:e.params.map(s=>({name:s.name,type:s.type,fields:(s.fields??[]).join(", ")})),steps:e.steps.map(s=>({action:s.action,role:s.target.role??"",name:s.target.name??"",testId:s.target.testId??""})),paramSources:e.paramSources.map(s=>({param:s.param,path:s.path??"",stepIndex:s.stepIndex,from:s.from}))},a.value.steps.length===0&&(a.value.steps=O().steps),C.value=n.id,Q(),V.value=!0}function Y(n){a.value.name=n.name,a.value.kind=n.kind,a.value.receiver=n.receiver??"",a.value.importName=n.importName??"",a.value.params=n.params.map(e=>({name:e.name,type:e.type,fields:(e.fields??[]).join(", ")})),a.value.steps=n.steps.map(e=>({action:e.action,role:e.target.role??"",name:e.target.name??"",testId:e.target.testId??""})),a.value.steps.length===0&&(a.value.steps=O().steps),a.value.paramSources=n.paramSources.map(e=>({param:e.param,path:e.path??"",stepIndex:e.stepIndex,from:e.from})),U.value=!0,k.value=n.confidence,N.value=n.notes}async function ve(){if(!y.value.trim()){p.add({title:"Paste some function code first",color:"error"});return}q.value=!0;try{const{proposal:n}=await $fetch(`/api/projects/${P}/test-functions/extract`,{method:"POST",body:{code:y.value}});Y(n),p.add({title:"Extracted — review the fields below before saving",color:"success"})}catch(n){p.add({title:"Extraction failed",description:T(n),color:"error"})}finally{q.value=!1}}async function ge(){if(!y.value.trim()){p.add({title:"Paste some function code first",color:"error"});return}try{await navigator.clipboard.writeText(at(y.value)),p.add({title:"Prompt copied",description:"Paste it into your AI chat, then paste the reply below.",color:"success"})}catch(n){p.add({title:"Failed to copy the prompt",description:T(n),color:"error"})}}async function he(){if(!I.value.trim()){p.add({title:"Paste the AI response first",color:"error"});return}H.value=!0;try{const{proposal:n}=await $fetch(`/api/projects/${P}/test-functions/validate-proposal`,{method:"POST",body:{responseText:I.value}});Y(n),p.add({title:"Applied — review the fields below before saving",color:"success"})}catch(n){p.add({title:"Couldn't apply that response",description:T(n),color:"error"})}finally{H.value=!1}}function _e(){a.value.params.push({name:"",type:"string",fields:""})}function be(n){a.value.params.splice(n,1)}function xe(){a.value.steps.push({action:"click",role:"",name:"",testId:""})}function ye(n){a.value.steps.length<=1||a.value.steps.splice(n,1)}function ke(){a.value.paramSources.push({param:"",path:"",stepIndex:0,from:"value"})}function we(n){a.value.paramSources.splice(n,1)}async function Ve(){if(!a.value.name.trim()){p.add({title:"Name is required",color:"error"});return}if(!a.value.module.trim()){p.add({title:"Module is required",color:"error"});return}L.value=!0;const n={name:a.value.name.trim(),kind:a.value.kind,module:a.value.module.trim(),receiver:a.value.kind==="page-object-method"&&a.value.receiver.trim()||null,importName:a.value.kind==="page-object-method"&&a.value.importName.trim()||null,urlPattern:a.value.urlPattern.trim()||null,params:a.value.params.filter(s=>s.name.trim()).map(s=>({name:s.name.trim(),type:s.type,...s.type==="object"?{fields:s.fields.split(",").map(W=>W.trim()).filter(Boolean)}:{}})),steps:a.value.steps.map(s=>({action:s.action,target:{role:s.role.trim()||null,name:s.name.trim()||null,testId:s.testId.trim()||null}})),paramSources:a.value.paramSources.filter(s=>s.param.trim()).map(s=>({param:s.param.trim(),path:s.path.trim()||null,stepIndex:s.stepIndex,from:s.from})),source:U.value?"ai-extracted":void 0,confidence:U.value?k.value??void 0:void 0},e=C.value!=null;try{e?await $fetch(`/api/test-functions/${C.value}`,{method:"PATCH",body:n}):await $fetch(`/api/projects/${P}/test-functions`,{method:"POST",body:n}),p.add({title:e?"Function updated":"Function added",color:"success"}),V.value=!1,await G()}catch(s){p.add({title:e?"Failed to update function":"Failed to add function",description:T(s),color:"error"})}finally{L.value=!1}}const z=f(null),A=f(!1);function Pe(n){z.value=n,A.value=!0}async function Ce(){const n=z.value;if(n){A.value=!1;try{await $fetch(`/api/test-functions/${n.id}`,{method:"DELETE"}),p.add({title:"Function removed",color:"success"}),await G()}catch(e){p.add({title:"Failed to remove function",description:T(e),color:"error"})}finally{z.value=null}}}function Ue(n){return n.entry.steps.map(e=>`${e.action}(${e.target.role??e.target.testId??e.target.name??"?"})`).join(" → ")}return(n,e)=>{const s=Te,W=Re,Ie=Oe,c=He,$e=Ge,je=Je,X=qe,Se=Qe,Ne=Fe,Z=We,ee=Ye,Ae=Xe,v=Ke,b=Ze,$=et,te=tt,Ee=Le;return i(),m(E,null,[l(Ne,{id:"project-test-functions"},{header:d(()=>[l(Ie,null,{leading:d(()=>[l(s),l(W,{items:[{label:"Home",icon:"i-lucide-house",to:"/"},{label:"Projects",to:"/projects"},{label:o(F)?.label||o(F)?.name||"Project",to:`/projects/${o(P)}`},{label:"Test functions"}]},null,8,["items"])]),_:1})]),body:d(()=>[u("div",nt,[l(Se,{title:"Test function catalog",icon:"i-lucide-function-square",count:o(B).length||null,subtitle:"Page-object methods and helpers the Piwi Picker extension matches a recording against, to generate calls to your own code instead of raw locator lines."},{actions:d(()=>[l(c,{label:"Add function",icon:"i-lucide-plus",size:"sm",onClick:pe})]),default:d(()=>[o(re)==="pending"?(i(),w($e,{key:0})):o(B).length===0?(i(),w(je,{key:1,icon:"i-lucide-function-square",text:"No functions registered yet — add one, or extract one from a recording in the extension."})):(i(),m("div",st,[(i(!0),m(E,null,D(o(B),t=>(i(),m("div",{key:t.id,class:"py-3 flex items-start justify-between gap-3"},[u("div",rt,[u("div",it,[u("span",ut,h(t.name),1),l(X,{color:"neutral",variant:"subtle",size:"sm"},{default:d(()=>[j(h(t.kind),1)]),_:2},1024),t.source!=="manual"?(i(),w(X,{key:0,color:"primary",variant:"subtle",size:"sm"},{default:d(()=>[j(h(t.source),1)]),_:2},1024)):_("",!0)]),u("div",dt,[j(h(t.module),1),t.receiver?(i(),m("span",ct,"#"+h(t.receiver),1)):_("",!0)]),u("div",mt,h(Ue(t)),1),t.urlPattern?(i(),m("div",pt,[e[13]||(e[13]=j(" on ",-1)),u("code",null,h(t.urlPattern),1)])):_("",!0)]),u("div",ft,[l(c,{icon:"i-lucide-pencil",color:"neutral",variant:"ghost",size:"sm","aria-label":`Edit ${t.name}`,onClick:g=>fe(t)},null,8,["aria-label","onClick"]),l(c,{icon:"i-lucide-trash-2",color:"error",variant:"ghost",size:"sm","aria-label":`Remove ${t.name}`,onClick:g=>Pe(t)},null,8,["aria-label","onClick"])])]))),128))]))]),_:1},8,["count"])])]),_:1}),l(Ee,null,{default:d(()=>[l(te,{open:o(V),"onUpdate:open":e[10]||(e[10]=t=>K(V)?V.value=t:null),title:o(C)==null?"Add test function":"Edit test function",ui:{content:"max-w-2xl"}},{body:d(()=>[u("div",vt,[u("div",gt,[u("button",{type:"button",class:"flex items-center gap-2 text-sm font-medium w-full text-left",onClick:e[0]||(e[0]=t=>S.value=!o(S))},[l(Z,{name:"i-lucide-sparkles",class:"text-primary"}),e[14]||(e[14]=u("span",null,"Paste from code (AI)",-1)),l(Z,{name:o(S)?"i-lucide-chevron-up":"i-lucide-chevron-down",class:"ml-auto text-gray-400"},null,8,["name"])]),o(S)?(i(),m("div",ht,[e[15]||(e[15]=u("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," Paste a page-object method or helper function's source — the fields below are filled in from it, for you to review and edit before saving. Module and URL pattern aren't inferred; fill those in yourself. ",-1)),l(ee,{modelValue:o(y),"onUpdate:modelValue":e[1]||(e[1]=t=>K(y)?y.value=t:null),rows:8,placeholder:`async login(username: string, password: string) {
2
2
  await this.page.getByRole('textbox', { name: 'Username' }).fill(username);
3
3
  await this.page.getByRole('textbox', { name: 'Password' }).fill(password);
4
4
  await this.page.getByRole('button', { name: 'Log in' }).click();
@@ -1,4 +1,4 @@
1
- import{_ as ee,a as te}from"./B7uPoZ7T.js";import{_ as se}from"./CZ6WR7uw.js";import{d as B,q as re,C as ie,am as T,b as i,o as r,e as k,f as d,c as a,h as c,_ as E,k as s,F as _,z as O,i as oe,g as t,t as l,m as ne,l as g,j as F,r as U,w as ae,s as ce,B as pe,v as x}from"./BdQ7kfxJ.js";import{_ as G}from"./BOn5q0rT.js";import{e as N}from"./DwZS0oRm.js";import{_ as de}from"./Gn1Ns00e.js";import{_ as le}from"./DadksxQ9.js";import{E as ue}from"./DWwiVTZX.js";import{u as me}from"./DqkCbAzo.js";import{a as ge,u as fe}from"./DTtizz85.js";import"./Bo73sAu8.js";import"./CrsaY0R_.js";import"./Bg63qh8W.js";import"./HGYIpJtg.js";import"./WZXZeGYt.js";import"./DGnQ69wW.js";const ye={key:0,class:"flex items-center gap-2 text-sm text-muted"},he={key:1,class:"space-y-2"},be=["data-testid"],xe={class:"min-w-0 flex-1"},_e={class:"flex items-center gap-2"},ve={class:"text-sm font-medium"},we={key:0,class:"text-xs text-muted truncate"},ke={key:1,class:"text-xs text-warning"},Ie={class:"flex items-center gap-1.5 shrink-0"},je=B({__name:"DesktopMcpClientsCard",setup(M){const v=re(),C=U(!1),S=U(!0),I=U([]),f=U(null);async function R(){const n=T();if(n)try{I.value=await n.invoke("desktop_mcp_clients"),C.value=!0}catch{C.value=!1}finally{S.value=!1}}ie(()=>{T()?R():S.value=!1});async function y(n,p){const h=T();if(h){f.value=n.id;try{const w=await h.invoke(p?"desktop_mcp_connect":"desktop_mcp_disconnect",{clientId:n.id});I.value=I.value.map(b=>b.id===w.id?w:b),v.add({title:p?`${n.label} connected`:`${n.label} disconnected`,description:p?`Restart ${n.label} to pick up the new server.`:void 0,color:"success",icon:"i-lucide-plug"})}catch(w){v.add({title:`Could not update ${n.label}`,description:N(w),color:"error"})}finally{f.value=null}}}async function u(n){const p=T();if(p)try{await p.invoke("desktop_mcp_reveal",{clientId:n.id})}catch(h){v.add({title:"Could not open the file",description:N(h),color:"error"})}}function q(n){switch(n.status){case"connected":return{label:"Connected",color:"success"};case"stale":return{label:"Needs update",color:"warning"};case"manual":return{label:"Manual setup",color:"warning"};case"not_installed":return{label:"Not detected",color:"neutral"};default:return null}}return(n,p)=>{const h=E,w=ne,b=F,z=G;return i(C)?(r(),k(z,{key:0,icon:"i-lucide-plug-zap",title:"Connect a client on this machine"},{subtitle:d(()=>[...p[0]||(p[0]=[s(" One click writes the ",-1),t("code",null,"piwi",-1),s(" entry into the client's own config file (a backup is kept next to it), and entries are kept current when this app's address changes. Restart the client after connecting. ",-1)])]),default:d(()=>[i(S)?(r(),a("div",ye,[c(h,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),p[1]||(p[1]=s(" Detecting clients… ",-1))])):(r(),a("div",he,[(r(!0),a(_,null,O(i(I),o=>(r(),a("div",{key:o.id,"data-testid":`mcp-client-${o.id}`,class:oe(["flex items-center gap-3 rounded-md border border-default p-2.5",o.status==="not_installed"?"opacity-60":""])},[c(h,{name:"i-lucide-bot",class:"size-4 text-gray-400 shrink-0"}),t("div",xe,[t("div",_e,[t("p",ve,l(o.label),1),q(o)?(r(),k(w,{key:0,color:q(o).color,variant:"subtle",size:"sm"},{default:d(()=>[s(l(q(o).label),1)]),_:2},1032,["color"])):g("",!0)]),o.config_path?(r(),a("p",we,l(o.config_path),1)):g("",!0),o.detail?(r(),a("p",ke,l(o.detail),1)):g("",!0)]),t("div",Ie,[o.status==="not_connected"?(r(),k(b,{key:0,size:"xs",icon:"i-lucide-plug",loading:i(f)===o.id,onClick:P=>y(o,!0)},{default:d(()=>[...p[2]||(p[2]=[s(" Connect ",-1)])]),_:1},8,["loading","onClick"])):o.status==="stale"?(r(),k(b,{key:1,size:"xs",color:"warning",icon:"i-lucide-refresh-cw",loading:i(f)===o.id,onClick:P=>y(o,!0)},{default:d(()=>[...p[3]||(p[3]=[s(" Update ",-1)])]),_:1},8,["loading","onClick"])):g("",!0),o.status==="connected"||o.status==="stale"?(r(),k(b,{key:2,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-unplug",loading:i(f)===o.id,onClick:P=>y(o,!1)},{default:d(()=>[...p[4]||(p[4]=[s(" Disconnect ",-1)])]),_:1},8,["loading","onClick"])):g("",!0),o.status!=="not_installed"&&o.config_path?(r(),k(b,{key:3,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-folder-open","aria-label":"Reveal config file",title:"Reveal config file",onClick:P=>u(o)},null,8,["onClick"])):g("",!0)])],10,be))),128)),p[5]||(p[5]=t("p",{class:"text-xs text-muted"}," A client that is not listed — or marked manual — can always be connected with the snippets below. ",-1))]))]),_:1})):g("",!0)}}}),Ce=Object.assign(je,{__name:"DesktopMcpClientsCard"}),Se=[{name:"list_projects",description:"List all projects with stats: total runs, test cases, latest run status and branch. Use this first to discover available projects and their IDs.",inputSchema:{type:"object",properties:{}}},{name:"get_project",description:"Get project details and its recent test runs with pass/fail counts. Results are paginated — use pageSize and cursor for the runs list.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID from list_projects"},pageSize:{type:"number",description:"Runs per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of runs"}},required:["projectId"]}},{name:"list_runs",description:"List test runs for a project with filters.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["passed","failed","timedout","interrupted","running","cancelled","initializing","finalizing"],description:"Filter by run status (exact match against the stored value)"},branch:{type:"string",description:"Filter by branch name (exact match against the run branch)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_run",description:"Get a test run summary plus its test cases (paginated), with status, truncated error text, and failure cluster IDs. Filter by status and page with pageSize/cursor.",inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"},statusFilter:{type:"string",enum:["failed","flaky","all"],description:'Which test cases to include (default: "failed" — only failed+timedOut; "flaky" — only flaky; "all" — every case)'},pageSize:{type:"number",description:"Cases per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response for the next page of cases"}},required:["runId"]}},{name:"list_failed_cases",description:"List failed and timed-out test cases across recent runs for a project.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"},runId:{type:"number",description:"Optional: restrict to a specific run"}},required:["projectId"]}},{name:"list_flaky_tests",description:"List flaky tests for a project with flakiness scores.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Number of recent runs to analyze (default 50, max 200)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response. Cursor is the flakyScore value (descending)."}},required:["projectId"]}},{name:"get_test_case",description:"Get test case details including aggregated pass/fail stats, flakiness metrics, and recent executions (paginated). Use testCaseId (stable identity), not the per-run caseId.",inputSchema:{type:"object",properties:{testCaseId:{type:"number",description:"Test case ID (testCaseId from list_failed_cases or list_flaky_tests)"},pageSize:{type:"number",description:"Executions per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of executions"}},required:["testCaseId"]}},{name:"list_clusters",description:"List failure clusters for a project. Each cluster groups similar failures by error fingerprint.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"Filter by triage status (default: all statuses)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_cluster",description:"Get full details for a failure cluster including all affected test cases, a compact diagnosis summary, and locator healing suggestions for up to 5 affected cases. Each healing entry includes the failing locator, the recommended fix, and the number of alternatives available. Use get_cluster_diagnosis for the full diagnosis text, or get_cluster_context for the raw AI evidence.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID from list_clusters"}},required:["clusterId"]}},{name:"get_fix_plan",description:"Everything needed to fix one failure cluster, in a single answer: the diagnosis and its validated patch, ranked locator replacements each with the exact file and line and a ready-to-apply `edit` (the rewritten line plus a unified diff `git apply` accepts), the failing tests, the owning team, and the command that verifies the work. `verify.expectation` states what the dashboard records once those tests pass, so you can confirm the fix landed rather than guessing. Prefer this over assembling get_cluster + get_cluster_diagnosis + get_locator_healing yourself.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID from list_clusters or list_open_clusters"}},required:["clusterId"]}},{name:"get_cluster_diagnosis",description:"Get the stored AI diagnosis for a failure cluster. Returns category, confidence, root cause, evidence, and suggested fix. Returns null if no diagnosis has been run yet.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"}},required:["clusterId"]}},{name:"get_test_case_context",description:"Get the AI evidence context for a specific test-run-case (execution scope). Use this when debugging a single test failure — it provides the execution-scoped evidence including steps, console, network, and SCM diff.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID"}},required:["executionId"]}},{name:"get_case_screenshots",description:"Get screenshots for a test-run-case. By default returns metadata only (name, type, size). Set content=true to include base64-encoded image data (max 3, capped at ~100 KB each). Call metadata-only first to discover what exists, then request content for the ones you need.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID"},content:{type:"boolean",description:"Include base64 image data (default false — metadata only)"}},required:["executionId"]}},{name:"get_cluster_context",description:"Get the full AI evidence context for a failure cluster — the same data sent to the diagnosis AI. Includes error samples, stack traces, test steps, console logs, network failures, ARIA snapshots, SCM diff (changed files since last green run), and a per-section breakdown with char counts and truncation flags. This is the richest available evidence for debugging a failure.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},baseCommit:{type:"string",description:"Optional: override the baseline commit SHA for SCM diff comparison"},selectedCommitShas:{type:"array",items:{type:"string"},description:"Optional: specific commit SHAs to include in the diff context (max 10)"}},required:["clusterId"]}},{name:"search_test_cases",description:"Search test cases by title or file path within a project. Accepts a free-text query and returns matching test cases with basic stats. Use this to find a test case when you don't know its ID.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},q:{type:"string",description:"Search query — matched against title and file path (case-insensitive)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId","q"]}},{name:"get_test_run_case",description:"Get a single test-run-case execution record with full (untruncated) error text plus steps, console logs, web vitals, and ARIA snapshot. Use include to fetch only the blobs you need. The ID is the executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases)"},include:{type:"array",items:{type:"string",enum:["steps","console","webVitals","aria","source"]},description:"Optional: which heavy blobs to include (default: all). The error, status, and summary are always returned."}},required:["executionId"]}},{name:"list_recent_activity",description:"List the most recent test runs across all projects. No projectId required — returns a cross-project view of recent CI activity. Paginated by startTime descending.",inputSchema:{type:"object",properties:{pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_repo_commits",description:"List recent commits for a project's repository. Requires SCM token configuration (per-project or global). Returns commit details (SHA, message, author, date).",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},branch:{type:"string",description:"Branch name (default: repository default branch)"},limit:{type:"number",description:"Max commits (default 20, max 100)"}},required:["projectId"]}},{name:"get_repo_diff",description:"Get the diff (changed files with patches) for a single commit in a project's repository. Requires SCM token configuration (per-project or global). Useful for inspecting what code changed in a specific commit suspected of causing a failure.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},sha:{type:"string",description:"Full commit SHA"}},required:["projectId","sha"]}},{name:"get_run_insights",description:'Compare a run to its last green baseline: pass-rate delta, new regressions, recurrences, recovered tests, new flaky tests, biggest perf improvements/regressions, worker imbalance, and newly opened clusters. Use this to answer "what changed?" and "did my fix work?".',inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"}},required:["runId"]}},{name:"get_spec_health",description:"Per-spec-file health for a project: pass rate, flaky rate, failure count, test count, and average duration grouped by spec-file prefix over the last N days. Use to find which areas of the suite are unhealthy.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},days:{type:"number",description:"Lookback window in days (default 30, max 90)"}},required:["projectId"]}},{name:"get_slow_tests",description:"Slowest test cases in a project by average duration, with max/min and trend direction across recent runs. Use to target performance work.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Recent runs to analyze (default 50, max 100)"}},required:["projectId"]}},{name:"get_performance_trend",description:'Time series of run duration, average test duration, and p90 test duration for a project. Use to answer "is the suite getting slower?".',inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},limit:{type:"number",description:"Number of recent runs (default 30, max 100)"}},required:["projectId"]}},{name:"get_test_stability_trend",description:'Time-series stability for a single test case: flaky rate, pass rate, and average duration bucketed over its recent execution history. Use to answer "is this test getting flakier?".',inputSchema:{type:"object",properties:{testCaseId:{type:"number",description:"Test case ID (stable testCaseId)"},buckets:{type:"number",description:"Number of time buckets (default 20, 5–50)"}},required:["testCaseId"]}},{name:"get_network_requests",description:"A run's network requests aggregated by method + normalized route, sorted by average duration, with status codes and captured backend server logs. Use to pin a UI failure on a slow or failing endpoint.",inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"}},required:["runId"]}},{name:"get_failure_groups",description:"One run's failures grouped by failure cluster, with per-group affected cases and worker correlation. Run-scoped counterpart to list_clusters.",inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"}},required:["runId"]}},{name:"get_locator_healing",description:"Ranked alternative locators for a failing test-run-case: the failing locator, the recommended durable fix, and the full alternative lists (from prior success, element match, and ARIA snapshot). Includes `location` (file:line:col), the failing `sourceLine`, and a ready-to-apply `edit` — the rewritten line plus a unified diff `git apply` accepts. Use when fixing a broken selector.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId)"}},required:["executionId"]}},{name:"search",description:"Global search across all in-scope projects, runs (by label or numeric id), and test cases (by title). Use to find a run by its label or locate an entity across projects.",inputSchema:{type:"object",properties:{q:{type:"string",description:"Search query (min 2 chars)"}},required:["q"]}},{name:"list_case_traces",description:"List Playwright trace files for a test-run-case, with a download path for each. Fetch the bytes via GET /api/files/<path>.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId)"}},required:["executionId"]}},{name:"list_links",description:"List external entity links (Jira, GitHub PR/issue, etc.) attached to a run, test-run-case, or test case, with provider and unfurled status.",inputSchema:{type:"object",properties:{entityType:{type:"string",enum:["test_run","test_runs_case","test_case"],description:"Which entity the links are attached to"},entityId:{type:"number",description:"The entity ID matching entityType"}},required:["entityType","entityId"]}},{name:"list_tags",description:"List every tag defined on this instance (id, text, color). Tags are instance-wide, not per-project.",inputSchema:{type:"object",properties:{}}},{name:"get_project_test_catalog",description:"The full test-case catalog for a project with aggregated pass/fail/flaky counts, average duration, and last status per test. Offset-paginated bulk companion to get_test_case.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},offset:{type:"number",description:"Row offset for paging (default 0)"},query:{type:"string",description:"Optional case-insensitive substring filter on title or file path"},tags:{type:"string",description:"Comma-separated tags; a test must carry every one of them. A leading @ is optional."},owner:{type:"string",description:"Exact owner declared via the piwi:owner annotation"},priority:{type:"string",enum:["critical","high","medium","low"],description:"Priority declared via the piwi:priority annotation"}},required:["projectId"]}},{name:"list_selections",description:"A project's saved test selections plus the built-in ones (failed, quarantine-free). A selection is a named, declarative subset of the suite resolved from run history. Use resolve_selection to turn one into the tests to run.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID from list_projects"}},required:["projectId"]}},{name:"resolve_selection",description:"Resolve a saved (or built-in) selection to the tests it currently matches and a ready-to-run `playwright test` command. Just landed a fix? Resolve the relevant selection to get the exact command that verifies it.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},key:{type:"string",description:'Selection key, e.g. "smoke" (or a built-in: failed, quarantine-free)'},format:{type:"string",enum:["args","grep","files","json"],description:"Materialization of the command: args = file:line (default), grep, files, or json (no command)"},budgetMs:{type:"number",description:"Optional time budget in ms — take the best tests that fit"}},required:["projectId","key"]}},{name:"preview_selection",description:"Resolve an ad-hoc selection definition without saving it — the dry-run behind the builder. Supply a definition (include/exclude predicate groups, pins, budget, limit) and get back the matching tests, an estimate, warnings and a command. An unknown predicate is an error, not ignored.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},definition:{type:"object",description:"A SelectionDefinition: { include?: group[], exclude?: group[], pins?, budget?, limit? }. A group ANDs predicates like tags, priority, files (globs), flaky, minPassRate, maxAvgDurationMs, lastStatus, failedInLastRuns."},format:{type:"string",enum:["args","grep","files","json"],description:"Command materialization (default args)"}},required:["projectId","definition"]}},{name:"suggest_selections",description:"Suggest tags and a smoke suite for a project from observed history (suggest-only, with evidence). Returns `slow` tags for duration outliers, `feature` tags from the route families tests hit, and a mined smoke suite — a budgeted set cover over observed routes, each pick buying fewer new routes than the last. `budgetMs` caps the smoke suite (default 5 min).",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},budgetMs:{type:"number",description:"Time budget in ms for the mined smoke suite (default 300000)"}},required:["projectId"]}},{name:"analyze_selections",description:`Health and drift for a project's selections. For each: what it resolves to now (count, quarantined members, duration, warnings) and whether that differs from what its most recent stamped run recorded — a silent drift a green build can hide. Plus coverage: how many tests are matched by no stored selection (the "unselected" gap), with a sample. Read-only.`,inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"}},required:["projectId"]}},{name:"list_open_clusters",description:"Open failure clusters across all in-scope projects, ranked by occurrences — a cross-project triage queue. Filter by status; paginate with pageSize/cursor.",inputSchema:{type:"object",properties:{status:{type:"string",enum:["open","resolved","ignored"],description:"Triage status (default: open)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_instance_stats",description:"Instance-wide counts (projects, runs, test cases, executions, files) and total storage size. Admin only.",inputSchema:{type:"object",properties:{}}},{name:"explain_failure",description:"One-call evidence bundle for a single failing execution: error, steps, console, ARIA snapshot, the recommended locator fix, a screenshot count, and the AI diagnosis context. Prefer this over chaining get_test_run_case + get_locator_healing + get_test_case_context.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId)"}},required:["executionId"]}},{name:"set_cluster_status",description:"Triage a failure cluster: set its status to open, resolved, or ignored with an optional note. Requires reporter or admin access. Use after fixing the underlying issue.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"New triage status"},triageNote:{type:"string",description:"Optional note explaining the status change"}},required:["clusterId","status"]}},{name:"set_cluster_base_commit",description:'Pin the baseline commit SHA a cluster uses for its SCM-diff diagnosis context, so "what changed since green" is accurate. Requires reporter or admin access.',inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},commit:{type:"string",description:"Baseline commit SHA (empty to clear)"}},required:["clusterId","commit"]}},{name:"submit_diagnosis_feedback",description:"Record thumbs up/down feedback on a stored diagnosis, with an optional note. Requires reporter or admin access.",inputSchema:{type:"object",properties:{diagnosisId:{type:"number",description:"Diagnosis ID"},feedback:{type:"string",enum:["up","down"],description:"Rating (omit to clear)"},feedbackNote:{type:"string",description:"Optional note"}},required:["diagnosisId"]}},{name:"run_cluster_diagnosis",description:"Trigger an AI diagnosis for a failure cluster and return the result (category, confidence, root cause, suggested fix). Returns the existing completed diagnosis unless force is set. Requires reporter or admin access and a configured AI provider.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},force:{type:"boolean",description:"Re-run even if a completed diagnosis exists (default false)"},baseCommit:{type:"string",description:"Optional baseline commit SHA for SCM-diff context"}},required:["clusterId"]}},{name:"create_test_function",description:`Register a page-object method or helper in a project's test-function catalog, so the Piwi Picker browser extension (and its recorder) can match a live page or a recorded session against it and substitute a call to your own code instead of raw locator lines. This tool does not call an AI itself — you (the calling agent) read the function's real source in your own context and fill in these fields directly; the tool only validates the shape and persists it. Follow these extraction rules when deciding the field values:
1
+ import{_ as ee,a as te}from"./BS91Og__.js";import{_ as se}from"./B-1zt4pp.js";import{d as B,q as re,C as ie,am as T,b as i,o as r,e as k,f as d,c as a,h as c,_ as E,k as s,F as _,z as O,i as oe,g as t,t as l,m as ne,l as g,j as F,r as U,w as ae,s as ce,B as pe,v as x}from"./1QWBzxLM.js";import{_ as G}from"./bmAf49LT.js";import{e as N}from"./D4mPjHHR.js";import{_ as de}from"./BF5qB58w.js";import{_ as le}from"./mYw4b7uY.js";import{E as ue}from"./DWwiVTZX.js";import{u as me}from"./CzyCEdYP.js";import{a as ge,u as fe}from"./CU_2YLhT.js";import"./CiCUZGFZ.js";import"./B82vqOZe.js";import"./CHz7LJIX.js";import"./AbnDY6Zr.js";import"./D_ZAGxCQ.js";import"./DGnQ69wW.js";const ye={key:0,class:"flex items-center gap-2 text-sm text-muted"},he={key:1,class:"space-y-2"},be=["data-testid"],xe={class:"min-w-0 flex-1"},_e={class:"flex items-center gap-2"},ve={class:"text-sm font-medium"},we={key:0,class:"text-xs text-muted truncate"},ke={key:1,class:"text-xs text-warning"},Ie={class:"flex items-center gap-1.5 shrink-0"},je=B({__name:"DesktopMcpClientsCard",setup(M){const v=re(),C=U(!1),S=U(!0),I=U([]),f=U(null);async function R(){const n=T();if(n)try{I.value=await n.invoke("desktop_mcp_clients"),C.value=!0}catch{C.value=!1}finally{S.value=!1}}ie(()=>{T()?R():S.value=!1});async function y(n,p){const h=T();if(h){f.value=n.id;try{const w=await h.invoke(p?"desktop_mcp_connect":"desktop_mcp_disconnect",{clientId:n.id});I.value=I.value.map(b=>b.id===w.id?w:b),v.add({title:p?`${n.label} connected`:`${n.label} disconnected`,description:p?`Restart ${n.label} to pick up the new server.`:void 0,color:"success",icon:"i-lucide-plug"})}catch(w){v.add({title:`Could not update ${n.label}`,description:N(w),color:"error"})}finally{f.value=null}}}async function u(n){const p=T();if(p)try{await p.invoke("desktop_mcp_reveal",{clientId:n.id})}catch(h){v.add({title:"Could not open the file",description:N(h),color:"error"})}}function q(n){switch(n.status){case"connected":return{label:"Connected",color:"success"};case"stale":return{label:"Needs update",color:"warning"};case"manual":return{label:"Manual setup",color:"warning"};case"not_installed":return{label:"Not detected",color:"neutral"};default:return null}}return(n,p)=>{const h=E,w=ne,b=F,z=G;return i(C)?(r(),k(z,{key:0,icon:"i-lucide-plug-zap",title:"Connect a client on this machine"},{subtitle:d(()=>[...p[0]||(p[0]=[s(" One click writes the ",-1),t("code",null,"piwi",-1),s(" entry into the client's own config file (a backup is kept next to it), and entries are kept current when this app's address changes. Restart the client after connecting. ",-1)])]),default:d(()=>[i(S)?(r(),a("div",ye,[c(h,{name:"i-lucide-loader-2",class:"size-4 animate-spin"}),p[1]||(p[1]=s(" Detecting clients… ",-1))])):(r(),a("div",he,[(r(!0),a(_,null,O(i(I),o=>(r(),a("div",{key:o.id,"data-testid":`mcp-client-${o.id}`,class:oe(["flex items-center gap-3 rounded-md border border-default p-2.5",o.status==="not_installed"?"opacity-60":""])},[c(h,{name:"i-lucide-bot",class:"size-4 text-gray-400 shrink-0"}),t("div",xe,[t("div",_e,[t("p",ve,l(o.label),1),q(o)?(r(),k(w,{key:0,color:q(o).color,variant:"subtle",size:"sm"},{default:d(()=>[s(l(q(o).label),1)]),_:2},1032,["color"])):g("",!0)]),o.config_path?(r(),a("p",we,l(o.config_path),1)):g("",!0),o.detail?(r(),a("p",ke,l(o.detail),1)):g("",!0)]),t("div",Ie,[o.status==="not_connected"?(r(),k(b,{key:0,size:"xs",icon:"i-lucide-plug",loading:i(f)===o.id,onClick:P=>y(o,!0)},{default:d(()=>[...p[2]||(p[2]=[s(" Connect ",-1)])]),_:1},8,["loading","onClick"])):o.status==="stale"?(r(),k(b,{key:1,size:"xs",color:"warning",icon:"i-lucide-refresh-cw",loading:i(f)===o.id,onClick:P=>y(o,!0)},{default:d(()=>[...p[3]||(p[3]=[s(" Update ",-1)])]),_:1},8,["loading","onClick"])):g("",!0),o.status==="connected"||o.status==="stale"?(r(),k(b,{key:2,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-unplug",loading:i(f)===o.id,onClick:P=>y(o,!1)},{default:d(()=>[...p[4]||(p[4]=[s(" Disconnect ",-1)])]),_:1},8,["loading","onClick"])):g("",!0),o.status!=="not_installed"&&o.config_path?(r(),k(b,{key:3,size:"xs",color:"neutral",variant:"ghost",icon:"i-lucide-folder-open","aria-label":"Reveal config file",title:"Reveal config file",onClick:P=>u(o)},null,8,["onClick"])):g("",!0)])],10,be))),128)),p[5]||(p[5]=t("p",{class:"text-xs text-muted"}," A client that is not listed — or marked manual — can always be connected with the snippets below. ",-1))]))]),_:1})):g("",!0)}}}),Ce=Object.assign(je,{__name:"DesktopMcpClientsCard"}),Se=[{name:"list_projects",description:"List all projects with stats: total runs, test cases, latest run status and branch. Use this first to discover available projects and their IDs.",inputSchema:{type:"object",properties:{}}},{name:"get_project",description:"Get project details and its recent test runs with pass/fail counts. Results are paginated — use pageSize and cursor for the runs list.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID from list_projects"},pageSize:{type:"number",description:"Runs per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of runs"}},required:["projectId"]}},{name:"list_runs",description:"List test runs for a project with filters.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["passed","failed","timedout","interrupted","running","cancelled","initializing","finalizing"],description:"Filter by run status (exact match against the stored value)"},branch:{type:"string",description:"Filter by branch name (exact match against the run branch)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_run",description:"Get a test run summary plus its test cases (paginated), with status, truncated error text, and failure cluster IDs. Filter by status and page with pageSize/cursor.",inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"},statusFilter:{type:"string",enum:["failed","flaky","all"],description:'Which test cases to include (default: "failed" — only failed+timedOut; "flaky" — only flaky; "all" — every case)'},pageSize:{type:"number",description:"Cases per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response for the next page of cases"}},required:["runId"]}},{name:"list_failed_cases",description:"List failed and timed-out test cases across recent runs for a project.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"},runId:{type:"number",description:"Optional: restrict to a specific run"}},required:["projectId"]}},{name:"list_flaky_tests",description:"List flaky tests for a project with flakiness scores.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Number of recent runs to analyze (default 50, max 200)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response. Cursor is the flakyScore value (descending)."}},required:["projectId"]}},{name:"get_test_case",description:"Get test case details including aggregated pass/fail stats, flakiness metrics, and recent executions (paginated). Use testCaseId (stable identity), not the per-run caseId.",inputSchema:{type:"object",properties:{testCaseId:{type:"number",description:"Test case ID (testCaseId from list_failed_cases or list_flaky_tests)"},pageSize:{type:"number",description:"Executions per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page of executions"}},required:["testCaseId"]}},{name:"list_clusters",description:"List failure clusters for a project. Each cluster groups similar failures by error fingerprint.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"Filter by triage status (default: all statuses)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId"]}},{name:"get_cluster",description:"Get full details for a failure cluster including all affected test cases, a compact diagnosis summary, and locator healing suggestions for up to 5 affected cases. Each healing entry includes the failing locator, the recommended fix, and the number of alternatives available. Use get_cluster_diagnosis for the full diagnosis text, or get_cluster_context for the raw AI evidence.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID from list_clusters"}},required:["clusterId"]}},{name:"get_fix_plan",description:"Everything needed to fix one failure cluster, in a single answer: the diagnosis and its validated patch, ranked locator replacements each with the exact file and line and a ready-to-apply `edit` (the rewritten line plus a unified diff `git apply` accepts), the failing tests, the owning team, and the command that verifies the work. `verify.expectation` states what the dashboard records once those tests pass, so you can confirm the fix landed rather than guessing. Prefer this over assembling get_cluster + get_cluster_diagnosis + get_locator_healing yourself.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID from list_clusters or list_open_clusters"}},required:["clusterId"]}},{name:"get_cluster_diagnosis",description:"Get the stored AI diagnosis for a failure cluster. Returns category, confidence, root cause, evidence, and suggested fix. Returns null if no diagnosis has been run yet.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"}},required:["clusterId"]}},{name:"get_test_case_context",description:"Get the AI evidence context for a specific test-run-case (execution scope). Use this when debugging a single test failure — it provides the execution-scoped evidence including steps, console, network, and SCM diff.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID"}},required:["executionId"]}},{name:"get_case_screenshots",description:"Get screenshots for a test-run-case. By default returns metadata only (name, type, size). Set content=true to include base64-encoded image data (max 3, capped at ~100 KB each). Call metadata-only first to discover what exists, then request content for the ones you need.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID"},content:{type:"boolean",description:"Include base64 image data (default false — metadata only)"}},required:["executionId"]}},{name:"get_cluster_context",description:"Get the full AI evidence context for a failure cluster — the same data sent to the diagnosis AI. Includes error samples, stack traces, test steps, console logs, network failures, ARIA snapshots, SCM diff (changed files since last green run), and a per-section breakdown with char counts and truncation flags. This is the richest available evidence for debugging a failure.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},baseCommit:{type:"string",description:"Optional: override the baseline commit SHA for SCM diff comparison"},selectedCommitShas:{type:"array",items:{type:"string"},description:"Optional: specific commit SHAs to include in the diff context (max 10)"}},required:["clusterId"]}},{name:"search_test_cases",description:"Search test cases by title or file path within a project. Accepts a free-text query and returns matching test cases with basic stats. Use this to find a test case when you don't know its ID.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},q:{type:"string",description:"Search query — matched against title and file path (case-insensitive)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}},required:["projectId","q"]}},{name:"get_test_run_case",description:"Get a single test-run-case execution record with full (untruncated) error text plus steps, console logs, web vitals, and ARIA snapshot. Use include to fetch only the blobs you need. The ID is the executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId from get_run.cases or testRunsCaseId from get_cluster.affectedTestCases)"},include:{type:"array",items:{type:"string",enum:["steps","console","webVitals","aria","source"]},description:"Optional: which heavy blobs to include (default: all). The error, status, and summary are always returned."}},required:["executionId"]}},{name:"list_recent_activity",description:"List the most recent test runs across all projects. No projectId required — returns a cross-project view of recent CI activity. Paginated by startTime descending.",inputSchema:{type:"object",properties:{pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_repo_commits",description:"List recent commits for a project's repository. Requires SCM token configuration (per-project or global). Returns commit details (SHA, message, author, date).",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},branch:{type:"string",description:"Branch name (default: repository default branch)"},limit:{type:"number",description:"Max commits (default 20, max 100)"}},required:["projectId"]}},{name:"get_repo_diff",description:"Get the diff (changed files with patches) for a single commit in a project's repository. Requires SCM token configuration (per-project or global). Useful for inspecting what code changed in a specific commit suspected of causing a failure.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},sha:{type:"string",description:"Full commit SHA"}},required:["projectId","sha"]}},{name:"get_run_insights",description:'Compare a run to its last green baseline: pass-rate delta, new regressions, recurrences, recovered tests, new flaky tests, biggest perf improvements/regressions, worker imbalance, and newly opened clusters. Use this to answer "what changed?" and "did my fix work?".',inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"}},required:["runId"]}},{name:"get_spec_health",description:"Per-spec-file health for a project: pass rate, flaky rate, failure count, test count, and average duration grouped by spec-file prefix over the last N days. Use to find which areas of the suite are unhealthy.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},days:{type:"number",description:"Lookback window in days (default 30, max 90)"}},required:["projectId"]}},{name:"get_slow_tests",description:"Slowest test cases in a project by average duration, with max/min and trend direction across recent runs. Use to target performance work.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},runs:{type:"number",description:"Recent runs to analyze (default 50, max 100)"}},required:["projectId"]}},{name:"get_performance_trend",description:'Time series of run duration, average test duration, and p90 test duration for a project. Use to answer "is the suite getting slower?".',inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},limit:{type:"number",description:"Number of recent runs (default 30, max 100)"}},required:["projectId"]}},{name:"get_test_stability_trend",description:'Time-series stability for a single test case: flaky rate, pass rate, and average duration bucketed over its recent execution history. Use to answer "is this test getting flakier?".',inputSchema:{type:"object",properties:{testCaseId:{type:"number",description:"Test case ID (stable testCaseId)"},buckets:{type:"number",description:"Number of time buckets (default 20, 5–50)"}},required:["testCaseId"]}},{name:"get_network_requests",description:"A run's network requests aggregated by method + normalized route, sorted by average duration, with status codes and captured backend server logs. Use to pin a UI failure on a slow or failing endpoint.",inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"}},required:["runId"]}},{name:"get_failure_groups",description:"One run's failures grouped by failure cluster, with per-group affected cases and worker correlation. Run-scoped counterpart to list_clusters.",inputSchema:{type:"object",properties:{runId:{type:"number",description:"Test run ID"}},required:["runId"]}},{name:"get_locator_healing",description:"Ranked alternative locators for a failing test-run-case: the failing locator, the recommended durable fix, and the full alternative lists (from prior success, element match, and ARIA snapshot). Includes `location` (file:line:col), the failing `sourceLine`, and a ready-to-apply `edit` — the rewritten line plus a unified diff `git apply` accepts. Use when fixing a broken selector.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId)"}},required:["executionId"]}},{name:"search",description:"Global search across all in-scope projects, runs (by label or numeric id), and test cases (by title). Use to find a run by its label or locate an entity across projects.",inputSchema:{type:"object",properties:{q:{type:"string",description:"Search query (min 2 chars)"}},required:["q"]}},{name:"list_case_traces",description:"List Playwright trace files for a test-run-case, with a download path for each. Fetch the bytes via GET /api/files/<path>.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId)"}},required:["executionId"]}},{name:"list_links",description:"List external entity links (Jira, GitHub PR/issue, etc.) attached to a run, test-run-case, or test case, with provider and unfurled status.",inputSchema:{type:"object",properties:{entityType:{type:"string",enum:["test_run","test_runs_case","test_case"],description:"Which entity the links are attached to"},entityId:{type:"number",description:"The entity ID matching entityType"}},required:["entityType","entityId"]}},{name:"list_tags",description:"List every tag defined on this instance (id, text, color). Tags are instance-wide, not per-project.",inputSchema:{type:"object",properties:{}}},{name:"get_project_test_catalog",description:"The full test-case catalog for a project with aggregated pass/fail/flaky counts, average duration, and last status per test. Offset-paginated bulk companion to get_test_case.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},offset:{type:"number",description:"Row offset for paging (default 0)"},query:{type:"string",description:"Optional case-insensitive substring filter on title or file path"},tags:{type:"string",description:"Comma-separated tags; a test must carry every one of them. A leading @ is optional."},owner:{type:"string",description:"Exact owner declared via the piwi:owner annotation"},priority:{type:"string",enum:["critical","high","medium","low"],description:"Priority declared via the piwi:priority annotation"}},required:["projectId"]}},{name:"list_selections",description:"A project's saved test selections plus the built-in ones (failed, quarantine-free). A selection is a named, declarative subset of the suite resolved from run history. Use resolve_selection to turn one into the tests to run.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID from list_projects"}},required:["projectId"]}},{name:"resolve_selection",description:"Resolve a saved (or built-in) selection to the tests it currently matches and a ready-to-run `playwright test` command. Just landed a fix? Resolve the relevant selection to get the exact command that verifies it.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},key:{type:"string",description:'Selection key, e.g. "smoke" (or a built-in: failed, quarantine-free)'},format:{type:"string",enum:["args","grep","files","json"],description:"Materialization of the command: args = file:line (default), grep, files, or json (no command)"},budgetMs:{type:"number",description:"Optional time budget in ms — take the best tests that fit"}},required:["projectId","key"]}},{name:"preview_selection",description:"Resolve an ad-hoc selection definition without saving it — the dry-run behind the builder. Supply a definition (include/exclude predicate groups, pins, budget, limit) and get back the matching tests, an estimate, warnings and a command. An unknown predicate is an error, not ignored.",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},definition:{type:"object",description:"A SelectionDefinition: { include?: group[], exclude?: group[], pins?, budget?, limit? }. A group ANDs predicates like tags, priority, files (globs), flaky, minPassRate, maxAvgDurationMs, lastStatus, failedInLastRuns."},format:{type:"string",enum:["args","grep","files","json"],description:"Command materialization (default args)"}},required:["projectId","definition"]}},{name:"suggest_selections",description:"Suggest tags and a smoke suite for a project from observed history (suggest-only, with evidence). Returns `slow` tags for duration outliers, `feature` tags from the route families tests hit, and a mined smoke suite — a budgeted set cover over observed routes, each pick buying fewer new routes than the last. `budgetMs` caps the smoke suite (default 5 min).",inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"},budgetMs:{type:"number",description:"Time budget in ms for the mined smoke suite (default 300000)"}},required:["projectId"]}},{name:"analyze_selections",description:`Health and drift for a project's selections. For each: what it resolves to now (count, quarantined members, duration, warnings) and whether that differs from what its most recent stamped run recorded — a silent drift a green build can hide. Plus coverage: how many tests are matched by no stored selection (the "unselected" gap), with a sample. Read-only.`,inputSchema:{type:"object",properties:{projectId:{type:"number",description:"Project ID"}},required:["projectId"]}},{name:"list_open_clusters",description:"Open failure clusters across all in-scope projects, ranked by occurrences — a cross-project triage queue. Filter by status; paginate with pageSize/cursor.",inputSchema:{type:"object",properties:{status:{type:"string",enum:["open","resolved","ignored"],description:"Triage status (default: open)"},pageSize:{type:"number",description:"Results per page (default 10, max 50)"},cursor:{type:"string",description:"Opaque cursor from a previous response to get the next page"}}}},{name:"get_instance_stats",description:"Instance-wide counts (projects, runs, test cases, executions, files) and total storage size. Admin only.",inputSchema:{type:"object",properties:{}}},{name:"explain_failure",description:"One-call evidence bundle for a single failing execution: error, steps, console, ARIA snapshot, the recommended locator fix, a screenshot count, and the AI diagnosis context. Prefer this over chaining get_test_run_case + get_locator_healing + get_test_case_context.",inputSchema:{type:"object",properties:{executionId:{type:"number",description:"Test run case ID (executionId)"}},required:["executionId"]}},{name:"set_cluster_status",description:"Triage a failure cluster: set its status to open, resolved, or ignored with an optional note. Requires reporter or admin access. Use after fixing the underlying issue.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},status:{type:"string",enum:["open","resolved","ignored"],description:"New triage status"},triageNote:{type:"string",description:"Optional note explaining the status change"}},required:["clusterId","status"]}},{name:"set_cluster_base_commit",description:'Pin the baseline commit SHA a cluster uses for its SCM-diff diagnosis context, so "what changed since green" is accurate. Requires reporter or admin access.',inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},commit:{type:"string",description:"Baseline commit SHA (empty to clear)"}},required:["clusterId","commit"]}},{name:"submit_diagnosis_feedback",description:"Record thumbs up/down feedback on a stored diagnosis, with an optional note. Requires reporter or admin access.",inputSchema:{type:"object",properties:{diagnosisId:{type:"number",description:"Diagnosis ID"},feedback:{type:"string",enum:["up","down"],description:"Rating (omit to clear)"},feedbackNote:{type:"string",description:"Optional note"}},required:["diagnosisId"]}},{name:"run_cluster_diagnosis",description:"Trigger an AI diagnosis for a failure cluster and return the result (category, confidence, root cause, suggested fix). Returns the existing completed diagnosis unless force is set. Requires reporter or admin access and a configured AI provider.",inputSchema:{type:"object",properties:{clusterId:{type:"number",description:"Cluster ID"},force:{type:"boolean",description:"Re-run even if a completed diagnosis exists (default false)"},baseCommit:{type:"string",description:"Optional baseline commit SHA for SCM-diff context"}},required:["clusterId"]}},{name:"create_test_function",description:`Register a page-object method or helper in a project's test-function catalog, so the Piwi Picker browser extension (and its recorder) can match a live page or a recorded session against it and substitute a call to your own code instead of raw locator lines. This tool does not call an AI itself — you (the calling agent) read the function's real source in your own context and fill in these fields directly; the tool only validates the shape and persists it. Follow these extraction rules when deciding the field values:
2
2
 
3
3
  ${ue}
4
4
 
@@ -1 +1 @@
1
- import{_ as I}from"./j2eGYaRa.js";import{d as L,q as O,w as P,c as u,g as t,b as s,e as j,l as w,h as a,f as r,F as x,E as M,o as c,_ as N,k as p,z as A,t as i,j as q,x as W,r as y}from"./BdQ7kfxJ.js";import{_ as G}from"./CbzgEkmW.js";import{_ as K}from"./BOn5q0rT.js";import{_ as Z}from"./D0XWJGhG.js";import{_ as H}from"./CyWOerIG.js";import{_ as J}from"./CK2AMqz_.js";import{f as B}from"./D-c8ZSws.js";import{e as Q,g as X}from"./CrsaY0R_.js";import{u as Y}from"./DTtizz85.js";import"./C_eXufkv.js";import"./HGYIpJtg.js";import"./i7znB42v.js";import"./CxwnFFD0.js";import"./Bg63qh8W.js";const ee={class:"space-y-6"},te={class:"space-y-3"},se={class:"flex items-center gap-2 text-sm text-muted"},oe={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm"},ae={class:"text-muted"},ne={class:"flex items-center gap-2 font-mono"},le={class:"text-xs"},ie={key:0,class:"flex items-center gap-2 py-4 text-muted"},re={key:1,class:"grid grid-cols-2 sm:grid-cols-3 gap-4"},de={class:"space-y-1"},ce={class:"text-2xl font-semibold"},me={class:"space-y-1"},ue={class:"text-2xl font-semibold"},pe={class:"space-y-1"},_e={class:"text-2xl font-semibold"},fe={class:"space-y-1"},ge={class:"text-2xl font-semibold"},ve={class:"space-y-1"},xe={class:"text-2xl font-semibold"},ye={class:"space-y-1"},be={class:"text-2xl font-semibold"},he={class:"space-y-1"},Ce={class:"text-2xl font-semibold"},ke={class:"flex flex-col sm:flex-row items-start sm:items-center gap-4"},je=L({__name:"storage",async setup(Se){let _,b;const h=O(),{data:n,refresh:C,pending:k}=([_,b]=P(()=>Y("/api/admin/stats","$phmoZI6KTi")),_=await _,b(),_),T=Q("storage").map(o=>({name:o,...X(o)})),$=[{label:"7 days",value:7},{label:"14 days",value:14},{label:"30 days",value:30},{label:"60 days",value:60},{label:"90 days",value:90},{label:"180 days",value:180},{label:"1 year",value:365}],d=y(30),m=y(!1),f=y(!1);async function E(){m.value=!1,f.value=!0;try{const o=await $fetch("/api/admin/cleanup",{method:"DELETE",body:{olderThanDays:d.value}});h.add({title:"Cleanup complete",description:`Deleted ${o.deletedRuns} test run(s) older than ${d.value} days.`,color:"success"}),await C()}catch(o){const e=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;h.add({title:"Cleanup failed",description:e||"An error occurred",color:"error"})}finally{f.value=!1}}return(o,e)=>{const V=I,S=N,D=G,v=K,g=q,F=Z,R=H,U=J,z=M;return c(),u(x,null,[t("div",ee,[s(n)?(c(),j(V,{key:0,database:s(n).databaseLocation,storage:s(n).storageLocation},null,8,["database","storage"])):w("",!0),a(v,{icon:"i-lucide-server",title:"Storage backend",help:"settings.storage-backend"},{subtitle:r(()=>[...e[5]||(e[5]=[p(" Configured through environment variables. The active backend is shown read-only. ",-1)])]),default:r(()=>[t("div",te,[t("div",se,[a(S,{name:"i-lucide-info",class:"size-4"}),e[6]||(e[6]=p(" Storage backend selection (local disk or S3) and its credentials are set via the environment. Each variable below is shown read-only — hover the lock to see what it controls. ",-1))]),t("div",oe,[(c(!0),u(x,null,A(s(T),l=>(c(),u(x,{key:l.name},[t("div",ae,i(l.name.replace("PIWI_S3_","S3 ").replace("PIWI_STORAGE_","Storage ")),1),t("div",ne,[t("code",le,i(l.name),1),a(D,{"env-vars":[l.name]},null,8,["env-vars"])])],64))),128))])])]),_:1}),a(v,{icon:"i-lucide-database",title:"Storage statistics",help:"settings.storage-stats"},{footer:r(()=>[a(g,{icon:"i-lucide-refresh-cw",variant:"outline",size:"sm",loading:s(k),label:"Refresh",onClick:e[0]||(e[0]=l=>s(C)())},null,8,["loading"])]),default:r(()=>[s(k)?(c(),u("div",ie,[a(S,{name:"i-lucide-loader-2",class:"animate-spin"}),e[7]||(e[7]=p(" Loading… ",-1))])):s(n)?(c(),u("div",re,[t("div",de,[e[8]||(e[8]=t("p",{class:"text-sm text-muted"},"Projects",-1)),t("p",ce,i(s(n).totalProjects),1)]),t("div",me,[e[9]||(e[9]=t("p",{class:"text-sm text-muted"},"Test runs",-1)),t("p",ue,i(s(n).totalRuns),1)]),t("div",pe,[e[10]||(e[10]=t("p",{class:"text-sm text-muted"},"Test cases (unique)",-1)),t("p",_e,i(s(n).totalTestCases),1)]),t("div",fe,[e[11]||(e[11]=t("p",{class:"text-sm text-muted"},"Test results",-1)),t("p",ge,i(s(n).totalRunsCases),1)]),t("div",ve,[e[12]||(e[12]=t("p",{class:"text-sm text-muted"},"Stored files",-1)),t("p",xe,i(s(n).totalFiles),1)]),t("div",ye,[e[13]||(e[13]=t("p",{class:"text-sm text-muted"},"File size (DB)",-1)),t("p",be,i(("formatBytes"in o?o.formatBytes:s(B))(s(n).totalFileSize)),1)]),t("div",he,[e[14]||(e[14]=t("p",{class:"text-sm text-muted"},"Storage on disk",-1)),t("p",Ce,i(("formatBytes"in o?o.formatBytes:s(B))(s(n).storageSizeOnDisk)),1)])])):w("",!0)]),_:1}),a(v,{icon:"i-lucide-trash-2",title:"Cleanup old test runs",help:"settings.cleanup"},{default:r(()=>[t("div",ke,[a(R,{label:"Delete runs older than",name:"period"},{default:r(()=>[a(F,{modelValue:s(d),"onUpdate:modelValue":e[1]||(e[1]=l=>W(d)?d.value=l:null),items:$},null,8,["modelValue"])]),_:1}),a(g,{icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:s(f),label:"Run cleanup",class:"mt-4 sm:mt-5",onClick:e[2]||(e[2]=l=>m.value=!0)},null,8,["loading"])])]),_:1})]),a(z,null,{default:r(()=>[a(U,{open:s(m),title:"Confirm cleanup","onUpdate:open":e[4]||(e[4]=l=>m.value=l)},{body:r(()=>[t("p",null,[e[15]||(e[15]=p(" This will permanently delete all test runs older than ",-1)),t("strong",null,i(s(d))+" days",1),e[16]||(e[16]=p(", along with their associated reports, traces, and test results. This action cannot be undone. ",-1))])]),footer:r(()=>[a(g,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[3]||(e[3]=l=>m.value=!1)}),a(g,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:s(f),onClick:E},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{je as default};
1
+ import{_ as I}from"./CeExxGSu.js";import{d as L,q as O,w as P,c as u,g as t,b as s,e as j,l as w,h as a,f as r,F as x,E as M,o as c,_ as N,k as p,z as A,t as i,j as q,x as W,r as y}from"./1QWBzxLM.js";import{_ as G}from"./B2bxEmbR.js";import{_ as K}from"./bmAf49LT.js";import{_ as Z}from"./e-GZmCeP.js";import{_ as H}from"./B4lvHjBe.js";import{_ as J}from"./CtQMagSz.js";import{f as B}from"./D-c8ZSws.js";import{e as Q,g as X}from"./B82vqOZe.js";import{u as Y}from"./CU_2YLhT.js";import"./BnUQ3i5l.js";import"./AbnDY6Zr.js";import"./DpM8IgHL.js";import"./Bl0xzETD.js";import"./CHz7LJIX.js";const ee={class:"space-y-6"},te={class:"space-y-3"},se={class:"flex items-center gap-2 text-sm text-muted"},oe={class:"grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm"},ae={class:"text-muted"},ne={class:"flex items-center gap-2 font-mono"},le={class:"text-xs"},ie={key:0,class:"flex items-center gap-2 py-4 text-muted"},re={key:1,class:"grid grid-cols-2 sm:grid-cols-3 gap-4"},de={class:"space-y-1"},ce={class:"text-2xl font-semibold"},me={class:"space-y-1"},ue={class:"text-2xl font-semibold"},pe={class:"space-y-1"},_e={class:"text-2xl font-semibold"},fe={class:"space-y-1"},ge={class:"text-2xl font-semibold"},ve={class:"space-y-1"},xe={class:"text-2xl font-semibold"},ye={class:"space-y-1"},be={class:"text-2xl font-semibold"},he={class:"space-y-1"},Ce={class:"text-2xl font-semibold"},ke={class:"flex flex-col sm:flex-row items-start sm:items-center gap-4"},je=L({__name:"storage",async setup(Se){let _,b;const h=O(),{data:n,refresh:C,pending:k}=([_,b]=P(()=>Y("/api/admin/stats","$phmoZI6KTi")),_=await _,b(),_),T=Q("storage").map(o=>({name:o,...X(o)})),$=[{label:"7 days",value:7},{label:"14 days",value:14},{label:"30 days",value:30},{label:"60 days",value:60},{label:"90 days",value:90},{label:"180 days",value:180},{label:"1 year",value:365}],d=y(30),m=y(!1),f=y(!1);async function E(){m.value=!1,f.value=!0;try{const o=await $fetch("/api/admin/cleanup",{method:"DELETE",body:{olderThanDays:d.value}});h.add({title:"Cleanup complete",description:`Deleted ${o.deletedRuns} test run(s) older than ${d.value} days.`,color:"success"}),await C()}catch(o){const e=o&&typeof o=="object"&&"data"in o?o.data?.message:void 0;h.add({title:"Cleanup failed",description:e||"An error occurred",color:"error"})}finally{f.value=!1}}return(o,e)=>{const V=I,S=N,D=G,v=K,g=q,F=Z,R=H,U=J,z=M;return c(),u(x,null,[t("div",ee,[s(n)?(c(),j(V,{key:0,database:s(n).databaseLocation,storage:s(n).storageLocation},null,8,["database","storage"])):w("",!0),a(v,{icon:"i-lucide-server",title:"Storage backend",help:"settings.storage-backend"},{subtitle:r(()=>[...e[5]||(e[5]=[p(" Configured through environment variables. The active backend is shown read-only. ",-1)])]),default:r(()=>[t("div",te,[t("div",se,[a(S,{name:"i-lucide-info",class:"size-4"}),e[6]||(e[6]=p(" Storage backend selection (local disk or S3) and its credentials are set via the environment. Each variable below is shown read-only — hover the lock to see what it controls. ",-1))]),t("div",oe,[(c(!0),u(x,null,A(s(T),l=>(c(),u(x,{key:l.name},[t("div",ae,i(l.name.replace("PIWI_S3_","S3 ").replace("PIWI_STORAGE_","Storage ")),1),t("div",ne,[t("code",le,i(l.name),1),a(D,{"env-vars":[l.name]},null,8,["env-vars"])])],64))),128))])])]),_:1}),a(v,{icon:"i-lucide-database",title:"Storage statistics",help:"settings.storage-stats"},{footer:r(()=>[a(g,{icon:"i-lucide-refresh-cw",variant:"outline",size:"sm",loading:s(k),label:"Refresh",onClick:e[0]||(e[0]=l=>s(C)())},null,8,["loading"])]),default:r(()=>[s(k)?(c(),u("div",ie,[a(S,{name:"i-lucide-loader-2",class:"animate-spin"}),e[7]||(e[7]=p(" Loading… ",-1))])):s(n)?(c(),u("div",re,[t("div",de,[e[8]||(e[8]=t("p",{class:"text-sm text-muted"},"Projects",-1)),t("p",ce,i(s(n).totalProjects),1)]),t("div",me,[e[9]||(e[9]=t("p",{class:"text-sm text-muted"},"Test runs",-1)),t("p",ue,i(s(n).totalRuns),1)]),t("div",pe,[e[10]||(e[10]=t("p",{class:"text-sm text-muted"},"Test cases (unique)",-1)),t("p",_e,i(s(n).totalTestCases),1)]),t("div",fe,[e[11]||(e[11]=t("p",{class:"text-sm text-muted"},"Test results",-1)),t("p",ge,i(s(n).totalRunsCases),1)]),t("div",ve,[e[12]||(e[12]=t("p",{class:"text-sm text-muted"},"Stored files",-1)),t("p",xe,i(s(n).totalFiles),1)]),t("div",ye,[e[13]||(e[13]=t("p",{class:"text-sm text-muted"},"File size (DB)",-1)),t("p",be,i(("formatBytes"in o?o.formatBytes:s(B))(s(n).totalFileSize)),1)]),t("div",he,[e[14]||(e[14]=t("p",{class:"text-sm text-muted"},"Storage on disk",-1)),t("p",Ce,i(("formatBytes"in o?o.formatBytes:s(B))(s(n).storageSizeOnDisk)),1)])])):w("",!0)]),_:1}),a(v,{icon:"i-lucide-trash-2",title:"Cleanup old test runs",help:"settings.cleanup"},{default:r(()=>[t("div",ke,[a(R,{label:"Delete runs older than",name:"period"},{default:r(()=>[a(F,{modelValue:s(d),"onUpdate:modelValue":e[1]||(e[1]=l=>W(d)?d.value=l:null),items:$},null,8,["modelValue"])]),_:1}),a(g,{icon:"i-lucide-trash-2",color:"error",variant:"soft",loading:s(f),label:"Run cleanup",class:"mt-4 sm:mt-5",onClick:e[2]||(e[2]=l=>m.value=!0)},null,8,["loading"])])]),_:1})]),a(z,null,{default:r(()=>[a(U,{open:s(m),title:"Confirm cleanup","onUpdate:open":e[4]||(e[4]=l=>m.value=l)},{body:r(()=>[t("p",null,[e[15]||(e[15]=p(" This will permanently delete all test runs older than ",-1)),t("strong",null,i(s(d))+" days",1),e[16]||(e[16]=p(", along with their associated reports, traces, and test results. This action cannot be undone. ",-1))])]),footer:r(()=>[a(g,{color:"neutral",variant:"ghost",label:"Cancel",onClick:e[3]||(e[3]=l=>m.value=!1)}),a(g,{color:"error",label:"Delete",icon:"i-lucide-trash-2",loading:s(f),onClick:E},null,8,["loading"])]),_:1},8,["open"])]),_:1})],64)}}});export{je as default};
Binary file