@piwitests/server 0.22.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{By5qkOq8.js → -COcylA_.js} +1 -1
  3. package/.output/public/_nuxt/03FA4-rI.js +1 -0
  4. package/.output/public/_nuxt/{2VtBYkNh.js → 5a7jHE9s.js} +1 -1
  5. package/.output/public/_nuxt/6Z_ZwH8I.js +1 -0
  6. package/.output/public/_nuxt/7ZHq6PCI.js +1 -0
  7. package/.output/public/_nuxt/{cSeAgciy.js → 98sAB6Gu.js} +1 -1
  8. package/.output/public/_nuxt/{CoPntblj.js → B--J7VNt.js} +1 -1
  9. package/.output/public/_nuxt/{Dj-TetcW.js → B1LUinhp.js} +1 -1
  10. package/.output/public/_nuxt/{CCP6Tyle.js → B33YjaHr.js} +1 -1
  11. package/.output/public/_nuxt/B69RP95P.js +1 -0
  12. package/.output/public/_nuxt/{x8YSyy4c.js → B8H4XydJ.js} +1 -1
  13. package/.output/public/_nuxt/{DpalT0nH.js → B8Xm4_S_.js} +1 -1
  14. package/.output/public/_nuxt/{9N6hSApy.js → BBhrClA9.js} +1 -1
  15. package/.output/public/_nuxt/{BhH0TNTi.js → BCGljaM0.js} +1 -1
  16. package/.output/public/_nuxt/{BVN50jIb.js → BFxvHlO9.js} +1 -1
  17. package/.output/public/_nuxt/{DsX5CCb5.js → BKrWWV14.js} +1 -1
  18. package/.output/public/_nuxt/BN1zZw5b.js +9 -0
  19. package/.output/public/_nuxt/{iubpj2qv.js → BPXqL9vK.js} +1 -1
  20. package/.output/public/_nuxt/{CAZpjzvB.js → BUnwEAjq.js} +1 -1
  21. package/.output/public/_nuxt/{D6Mo5HeX.js → BVLqydCr.js} +1 -1
  22. package/.output/public/_nuxt/{9P8iHISX.js → BWMSVSNM.js} +1 -1
  23. package/.output/public/_nuxt/B_r0xHVS.js +1 -0
  24. package/.output/public/_nuxt/{DtSn2Q9-.js → BakMHV79.js} +1 -1
  25. package/.output/public/_nuxt/{_VzR8bwc.js → Bd8B-yeR.js} +1 -1
  26. package/.output/public/_nuxt/{BUMoU50-.js → BevElZaK.js} +1 -1
  27. package/.output/public/_nuxt/BfA6lfg4.js +1 -0
  28. package/.output/public/_nuxt/{DGyGmFem.js → Bg93Rnts.js} +1 -1
  29. package/.output/public/_nuxt/BgABj4Ty.js +4 -0
  30. package/.output/public/_nuxt/{CkKCKAYp.js → BkM2KXUo.js} +2 -2
  31. package/.output/public/_nuxt/{DQnsFoJn.js → BkxRbXIj.js} +1 -1
  32. package/.output/public/_nuxt/{CNcu4khZ.js → Bme1UkOl.js} +1 -1
  33. package/.output/public/_nuxt/{CobveFaj.js → BmzxRbcg.js} +1 -1
  34. package/.output/public/_nuxt/Bn0jaRxI.js +1 -0
  35. package/.output/public/_nuxt/{SBmMTKQb.js → BoNKdx5o.js} +1 -1
  36. package/.output/public/_nuxt/{BQzG26t0.js → Bp3FRuEm.js} +1 -1
  37. package/.output/public/_nuxt/{DOLeth7M.js → BrUBOQ0y.js} +1 -1
  38. package/.output/public/_nuxt/{nANaAHCd.js → BtSGUY-7.js} +1 -1
  39. package/.output/public/_nuxt/{BfS8BZTO.js → BtbpLWDs.js} +1 -1
  40. package/.output/public/_nuxt/{Cwwe5bRS.js → BvAfKk6C.js} +1 -1
  41. package/.output/public/_nuxt/{BqCiYSVY.js → BwEN1fJ1.js} +1 -1
  42. package/.output/public/_nuxt/{B0hK-xDF.js → C-XjxjG5.js} +1 -1
  43. package/.output/public/_nuxt/{kfFeu9tK.js → C3W_wyr9.js} +1 -1
  44. package/.output/public/_nuxt/{h49q_GXF.js → C5TrTuWv.js} +42 -42
  45. package/.output/public/_nuxt/{B2a-Phk3.js → C7D5Wl7T.js} +1 -1
  46. package/.output/public/_nuxt/{B09ddw9C.js → C7fq_rHE.js} +1 -1
  47. package/.output/public/_nuxt/{CWoSSKhQ.js → C8Paf_V1.js} +1 -1
  48. package/.output/public/_nuxt/{BQOWm9mQ.js → CD8ZzAFC.js} +1 -1
  49. package/.output/public/_nuxt/{DwyFnMoY.js → CDTeSrLO.js} +1 -1
  50. package/.output/public/_nuxt/{Cf52zHyB.js → CGHV0Y2d.js} +1 -1
  51. package/.output/public/_nuxt/{BtaTvcz6.js → CIpF9l75.js} +1 -1
  52. package/.output/public/_nuxt/{CkyMZI-0.js → CJ1rmnk4.js} +1 -1
  53. package/.output/public/_nuxt/{DOBSrxzY.js → CMuzkARi.js} +1 -1
  54. package/.output/public/_nuxt/{3xlGO1qT.js → COuZu9FO.js} +1 -1
  55. package/.output/public/_nuxt/{BZnfiR67.js → CX5Q0dZ8.js} +1 -1
  56. package/.output/public/_nuxt/{DBhdObsO.js → CX_G-FHC.js} +14 -14
  57. package/.output/public/_nuxt/{DDN2tt0a.js → Ce5_Tq63.js} +1 -1
  58. package/.output/public/_nuxt/{BlRWlfdD.js → Cf4MFOuf.js} +1 -1
  59. package/.output/public/_nuxt/{BYB8NVJZ.js → CgkXEZMo.js} +1 -1
  60. package/.output/public/_nuxt/{BFcdtAzg.js → CjBktNrC.js} +1 -1
  61. package/.output/public/_nuxt/{DXXnDejN.js → CjtjQV60.js} +1 -1
  62. package/.output/public/_nuxt/{x8w_1_rn.js → CpcrljrH.js} +1 -1
  63. package/.output/public/_nuxt/{C0v6l4pr.js → Cq33x7yV.js} +1 -1
  64. package/.output/public/_nuxt/{BDQCwxpX.js → CsV7pmcT.js} +1 -1
  65. package/.output/public/_nuxt/{C9p0YCAi.js → Cu2Q4iPh.js} +1 -1
  66. package/.output/public/_nuxt/CyLcEDg2.js +2 -0
  67. package/.output/public/_nuxt/{PdEEuEsg.js → D0Kop4bS.js} +1 -1
  68. package/.output/public/_nuxt/D1Y43xM1.js +2 -0
  69. package/.output/public/_nuxt/{DK7xciFW.js → D1vqYZsL.js} +1 -1
  70. package/.output/public/_nuxt/{BmJUhCIO.js → D2rZosKf.js} +1 -1
  71. package/.output/public/_nuxt/D7jpwkRG.js +5 -0
  72. package/.output/public/_nuxt/{CZ9ThISn.js → D8NAb7VE.js} +1 -1
  73. package/.output/public/_nuxt/{6-ivqM_I.js → D8vguZKg.js} +1 -1
  74. package/.output/public/_nuxt/{Hot1UcKY.js → DEvYVl9M.js} +1 -1
  75. package/.output/public/_nuxt/{CMhK1PvI.js → DF6Mes5z.js} +1 -1
  76. package/.output/public/_nuxt/{Sgis3xif.js → DGq4A2Pd.js} +1 -1
  77. package/.output/public/_nuxt/{BKJetfRH.js → DH5H1DJh.js} +1 -1
  78. package/.output/public/_nuxt/{Gik813Ek.js → DL8knjzi.js} +1 -1
  79. package/.output/public/_nuxt/{b_yFgp5S.js → DM3bDZC6.js} +1 -1
  80. package/.output/public/_nuxt/{DLNNAYfu.js → DMAiMrNr.js} +1 -1
  81. package/.output/public/_nuxt/{DLn-VPtK.js → DMWfVJCj.js} +1 -1
  82. package/.output/public/_nuxt/{BNAHBHbY.js → DMsm-RGQ.js} +1 -1
  83. package/.output/public/_nuxt/{CD3R-ggS.js → DMtrFQqi.js} +1 -1
  84. package/.output/public/_nuxt/{B9kt7ySS.js → DPZBpFOX.js} +1 -1
  85. package/.output/public/_nuxt/DVEGfqtt.js +2 -0
  86. package/.output/public/_nuxt/{D4UlSVir.js → D_y2VS8k.js} +1 -1
  87. package/.output/public/_nuxt/DaNC-xl1.js +1 -0
  88. package/.output/public/_nuxt/{DzM9oeLa.js → DbmGeOus.js} +1 -1
  89. package/.output/public/_nuxt/{DHUT-BKj.js → DcLbz6DV.js} +1 -1
  90. package/.output/public/_nuxt/{CWw9WGlv.js → DcR0Mmdl.js} +1 -1
  91. package/.output/public/_nuxt/{CDh_Qt7h.js → DhYznn-U.js} +1 -1
  92. package/.output/public/_nuxt/DhuRRlmK.js +1 -0
  93. package/.output/public/_nuxt/{CBZD8ym8.js → Drw8yQg6.js} +1 -1
  94. package/.output/public/_nuxt/{Bt4FLbe0.js → DuO5wfAC.js} +1 -1
  95. package/.output/public/_nuxt/{CRPt9SfB.js → DuOH5jcQ.js} +1 -1
  96. package/.output/public/_nuxt/{BH-ym1CI.js → DvEsAuE9.js} +1 -1
  97. package/.output/public/_nuxt/Dz6g_QJT.js +1 -0
  98. package/.output/public/_nuxt/{4yvOL9PC.js → DzZpIs4W.js} +1 -1
  99. package/.output/public/_nuxt/DzzNS-K1.js +1 -0
  100. package/.output/public/_nuxt/{COP3KBCA.js → Fsw2W4TA.js} +1 -1
  101. package/.output/public/_nuxt/{DWEkQ7bl.js → LwoTUb-r.js} +1 -1
  102. package/.output/public/_nuxt/{BjU3HZuS.js → OfPjZaky.js} +1 -1
  103. package/.output/public/_nuxt/{czXrP7NB.js → P5uOaRUZ.js} +1 -1
  104. package/.output/public/_nuxt/{BTvE9qca.js → Qo6oszaF.js} +1 -1
  105. package/.output/public/_nuxt/{Cd8r0xk5.js → T5UuMUxA.js} +1 -1
  106. package/.output/public/_nuxt/UY8pjaZA.js +1 -0
  107. package/.output/public/_nuxt/{B6s20NbT.js → V9p3z39z.js} +1 -1
  108. package/.output/public/_nuxt/{CJEp4i0N.js → VACXezo0.js} +1 -1
  109. package/.output/public/_nuxt/{CrOA9onF.js → YmCeJkZ2.js} +1 -1
  110. package/.output/public/_nuxt/builds/latest.json +1 -1
  111. package/.output/public/_nuxt/builds/meta/70224ee0-4d1f-45d2-b380-2ecb18064bf1.json +1 -0
  112. package/.output/public/_nuxt/entry.DzPSf_u5.css +1 -0
  113. package/.output/public/_nuxt/fXUwH_3d.js +1 -0
  114. package/.output/public/_nuxt/{t-juTK3X.js → opwuUqHG.js} +1 -1
  115. package/.output/public/_nuxt/{B_mN5eMV.js → opyDpgSw.js} +1 -1
  116. package/.output/public/_nuxt/{HwFFbACq.js → sVV8xB9f.js} +1 -1
  117. package/.output/public/_nuxt/{DSvBQHzW.js → xa5UHCot.js} +1 -1
  118. package/.output/server/chunks/_/collect.mjs +1 -1
  119. package/.output/server/chunks/_/markers.mjs +1 -1
  120. package/.output/server/chunks/_/quarantine.mjs +1 -1
  121. package/.output/server/chunks/_/users.mjs +1 -1
  122. package/.output/server/chunks/build/{Alert-DAb8nKVs.mjs → Alert-He-UxEt6.mjs} +2 -2
  123. package/.output/server/chunks/build/Alert-He-UxEt6.mjs.map +1 -0
  124. package/.output/server/chunks/build/{Breadcrumb-DJp5WvUM.mjs → Breadcrumb-DEP2dVCZ.mjs} +3 -3
  125. package/.output/server/chunks/build/Breadcrumb-DEP2dVCZ.mjs.map +1 -0
  126. package/.output/server/chunks/build/{BreadcrumbNav-BrQwfL8G.mjs → BreadcrumbNav-y6nMDYcR.mjs} +3 -3
  127. package/.output/server/chunks/build/BreadcrumbNav-y6nMDYcR.mjs.map +1 -0
  128. package/.output/server/chunks/build/{BrowserBadge-Djw_e_I9.mjs → BrowserBadge-DIASU8Gf.mjs} +6 -66
  129. package/.output/server/chunks/build/BrowserBadge-DIASU8Gf.mjs.map +1 -0
  130. package/.output/server/chunks/build/{ChartCard-B2gd_8HP.mjs → ChartCard-ZTsCvItQ.mjs} +2 -2
  131. package/.output/server/chunks/build/ChartCard-ZTsCvItQ.mjs.map +1 -0
  132. package/.output/server/chunks/build/{Checkbox-C1khEdTh.mjs → Checkbox-BisdHf8n.mjs} +7 -7
  133. package/.output/server/chunks/build/Checkbox-BisdHf8n.mjs.map +1 -0
  134. package/.output/server/chunks/build/{CodeBlock-CjnDrO3Y.mjs → CodeBlock-B8BNtZAe.mjs} +3 -3
  135. package/.output/server/chunks/build/CodeBlock-B8BNtZAe.mjs.map +1 -0
  136. package/.output/server/chunks/build/{DashboardNavbar-DYtmVlhy.mjs → DashboardNavbar-D7-3zBUU.mjs} +3 -3
  137. package/.output/server/chunks/build/DashboardNavbar-D7-3zBUU.mjs.map +1 -0
  138. package/.output/server/chunks/build/{DashboardSidebarToggle-BPNxODwj.mjs → DashboardSidebarToggle-C3HdHvlE.mjs} +3 -3
  139. package/.output/server/chunks/build/DashboardSidebarToggle-C3HdHvlE.mjs.map +1 -0
  140. package/.output/server/chunks/build/{DataLocationCard-2B-sVSMr.mjs → DataLocationCard-CC2-lHiP.mjs} +3 -3
  141. package/.output/server/chunks/build/DataLocationCard-CC2-lHiP.mjs.map +1 -0
  142. package/.output/server/chunks/build/{MetaStripGroup-BBByVvpR.mjs → DesktopRunLocallyButton-iNzrDsEs.mjs} +601 -623
  143. package/.output/server/chunks/build/DesktopRunLocallyButton-iNzrDsEs.mjs.map +1 -0
  144. package/.output/server/chunks/build/{DiagnosisPanel-D6QO30FQ.mjs → DiagnosisPanel-BVb2LgHu.mjs} +6 -6
  145. package/.output/server/chunks/build/DiagnosisPanel-BVb2LgHu.mjs.map +1 -0
  146. package/.output/server/chunks/build/{DiagnosisResult-ujB5Lt2A.mjs → DiagnosisResult-xVgZlfKK.mjs} +9 -9
  147. package/.output/server/chunks/build/DiagnosisResult-xVgZlfKK.mjs.map +1 -0
  148. package/.output/server/chunks/build/{EntityLinks-F8_kC-IH.mjs → EntityLinks-Dzn73fbq.mjs} +3 -3
  149. package/.output/server/chunks/build/EntityLinks-Dzn73fbq.mjs.map +1 -0
  150. package/.output/server/chunks/build/{EnvManagedBadge-D6e-10M9.mjs → EnvManagedBadge-C-agmABK.mjs} +3 -3
  151. package/.output/server/chunks/build/EnvManagedBadge-C-agmABK.mjs.map +1 -0
  152. package/.output/server/chunks/build/{FeatureUnavailable-BMw4euTk.mjs → FeatureUnavailable-DHFkwI7t.mjs} +2 -2
  153. package/.output/server/chunks/build/FeatureUnavailable-DHFkwI7t.mjs.map +1 -0
  154. package/.output/server/chunks/build/{FormField-QptK0rPg.mjs → FormField-GYHKiSI6.mjs} +2 -2
  155. package/.output/server/chunks/build/FormField-GYHKiSI6.mjs.map +1 -0
  156. package/.output/server/chunks/build/{GetStartedWizard-DxT8T14Y.mjs → GetStartedWizard-BpcGYsm2.mjs} +3 -3
  157. package/.output/server/chunks/build/GetStartedWizard-BpcGYsm2.mjs.map +1 -0
  158. package/.output/server/chunks/build/{HelpHint-C5Ru8BCc.mjs → HelpHint-plioHKA0.mjs} +29 -2
  159. package/.output/server/chunks/build/HelpHint-plioHKA0.mjs.map +1 -0
  160. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs +193 -0
  161. package/.output/server/chunks/build/MetaStripGroup-A0a72vt5.mjs.map +1 -0
  162. package/.output/server/chunks/build/{Modal-BacZmQCX.mjs → Modal-hKLvVFNp.mjs} +2 -2
  163. package/.output/server/chunks/build/Modal-hKLvVFNp.mjs.map +1 -0
  164. package/.output/server/chunks/build/{NavigationMenu-sTiKSWDm.mjs → NavigationMenu-RfBOyS32.mjs} +5 -5
  165. package/.output/server/chunks/build/NavigationMenu-RfBOyS32.mjs.map +1 -0
  166. package/.output/server/chunks/build/{OpenInIdeLink-Crc8y0Yx.mjs → OpenInIdeLink-Jp6SzEtD.mjs} +5 -5
  167. package/.output/server/chunks/build/{OpenInIdeLink-Crc8y0Yx.mjs.map → OpenInIdeLink-Jp6SzEtD.mjs.map} +1 -1
  168. package/.output/server/chunks/build/{ProjectTestCasesTable-DwjqZ2i5.mjs → ProjectTestCasesTable-DxOTfhi4.mjs} +8 -8
  169. package/.output/server/chunks/build/{ProjectTestCasesTable-DwjqZ2i5.mjs.map → ProjectTestCasesTable-DxOTfhi4.mjs.map} +1 -1
  170. package/.output/server/chunks/build/{RovingFocusItem--OEHI2P3.mjs → RovingFocusItem-BOSx1Z9Z.mjs} +2 -2
  171. package/.output/server/chunks/build/RovingFocusItem-BOSx1Z9Z.mjs.map +1 -0
  172. package/.output/server/chunks/build/RunReports-nuLb-Nm3.mjs +1 -1
  173. package/.output/server/chunks/build/{SectionCard-C753B3Yo.mjs → SectionCard-DHAFvJxm.mjs} +2 -2
  174. package/.output/server/chunks/build/SectionCard-DHAFvJxm.mjs.map +1 -0
  175. package/.output/server/chunks/build/{Select-BAyYwPuo.mjs → Select-CEyw7HGK.mjs} +4 -4
  176. package/.output/server/chunks/build/Select-CEyw7HGK.mjs.map +1 -0
  177. package/.output/server/chunks/build/{SelectMenu-zE_AhMX8.mjs → SelectMenu-C02Hs2_F.mjs} +5 -5
  178. package/.output/server/chunks/build/{SelectMenu-zE_AhMX8.mjs.map → SelectMenu-C02Hs2_F.mjs.map} +1 -1
  179. package/.output/server/chunks/build/{Separator-BbgCfKKJ.mjs → Separator-lrN70ODV.mjs} +2 -2
  180. package/.output/server/chunks/build/Separator-lrN70ODV.mjs.map +1 -0
  181. package/.output/server/chunks/build/{SettingsField-D-VriK9X.mjs → SettingsField-tRmytcEJ.mjs} +5 -5
  182. package/.output/server/chunks/build/SettingsField-tRmytcEJ.mjs.map +1 -0
  183. package/.output/server/chunks/build/{Slideover-CNbGvbUF.mjs → Slideover-D6cRIqch.mjs} +3 -3
  184. package/.output/server/chunks/build/Slideover-D6cRIqch.mjs.map +1 -0
  185. package/.output/server/chunks/build/{Switch-DdkA3Fii.mjs → Switch-R2n82ncQ.mjs} +4 -4
  186. package/.output/server/chunks/build/Switch-R2n82ncQ.mjs.map +1 -0
  187. package/.output/server/chunks/build/{Table-CfDVAuUJ.mjs → Table-qZdnm9t2.mjs} +3 -3
  188. package/.output/server/chunks/build/Table-qZdnm9t2.mjs.map +1 -0
  189. package/.output/server/chunks/build/{Tabs-BCOhHEB9.mjs → Tabs-BDP7MWl4.mjs} +3 -3
  190. package/.output/server/chunks/build/Tabs-BDP7MWl4.mjs.map +1 -0
  191. package/.output/server/chunks/build/{TestStatusBar-wquHQqtp.mjs → TestStatusBar-CvsmKJ4D.mjs} +2 -2
  192. package/.output/server/chunks/build/TestStatusBar-CvsmKJ4D.mjs.map +1 -0
  193. package/.output/server/chunks/build/{Textarea-Ohs6QTXf.mjs → Textarea-DpmpM-lN.mjs} +2 -2
  194. package/.output/server/chunks/build/Textarea-DpmpM-lN.mjs.map +1 -0
  195. package/.output/server/chunks/build/{Tooltip-BRBnl4pE.mjs → Tooltip-BI3WQErw.mjs} +3 -3
  196. package/.output/server/chunks/build/Tooltip-BI3WQErw.mjs.map +1 -0
  197. package/.output/server/chunks/build/{VisuallyHiddenInput-BHvzNumK.mjs → VisuallyHiddenInput-D4E5aJCQ.mjs} +2 -2
  198. package/.output/server/chunks/build/VisuallyHiddenInput-D4E5aJCQ.mjs.map +1 -0
  199. package/.output/server/chunks/build/{_id_-BesWjK_d.mjs → _id_-26komi8G.mjs} +47 -37
  200. package/.output/server/chunks/build/{_id_-BesWjK_d.mjs.map → _id_-26komi8G.mjs.map} +1 -1
  201. package/.output/server/chunks/build/{_id_-CQ0lolEK.mjs → _id_-T965GKYC.mjs} +58 -15
  202. package/.output/server/chunks/build/_id_-T965GKYC.mjs.map +1 -0
  203. package/.output/server/chunks/build/{_id_-CGs0u8Fr.mjs → _id_-w7YCSiiy.mjs} +70 -41
  204. package/.output/server/chunks/build/{_id_-CGs0u8Fr.mjs.map → _id_-w7YCSiiy.mjs.map} +1 -1
  205. package/.output/server/chunks/build/{_id_-D1-06Fcl.mjs → _id_-wiULjAVc.mjs} +44 -40
  206. package/.output/server/chunks/build/{_id_-D1-06Fcl.mjs.map → _id_-wiULjAVc.mjs.map} +1 -1
  207. package/.output/server/chunks/build/{about-DdyOj-dj.mjs → about-B3V_OEiu.mjs} +5 -5
  208. package/.output/server/chunks/build/about-B3V_OEiu.mjs.map +1 -0
  209. package/.output/server/chunks/build/{account-7aVMKekZ.mjs → account-DpBdYE46.mjs} +6 -6
  210. package/.output/server/chunks/build/account-DpBdYE46.mjs.map +1 -0
  211. package/.output/server/chunks/build/{ai-zw3T9b5u.mjs → ai-DYhpzbqp.mjs} +16 -16
  212. package/.output/server/chunks/build/{ai-zw3T9b5u.mjs.map → ai-DYhpzbqp.mjs.map} +1 -1
  213. package/.output/server/chunks/build/{analytics-CeCzKwEX.mjs → analytics-CZJEU0an.mjs} +17 -17
  214. package/.output/server/chunks/build/{analytics-CeCzKwEX.mjs.map → analytics-CZJEU0an.mjs.map} +1 -1
  215. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  216. package/.output/server/chunks/build/{db.client-Bdqk_eYQ.mjs → db.client-DijpEH6i.mjs} +3 -1
  217. package/.output/server/chunks/build/db.client-DijpEH6i.mjs.map +1 -0
  218. package/.output/server/chunks/build/{default-CkyAx_Mu.mjs → default-CQa_bmAf.mjs} +505 -89
  219. package/.output/server/chunks/build/default-CQa_bmAf.mjs.map +1 -0
  220. package/.output/server/chunks/build/{docs-Dhj-wEks.mjs → docs-C8bndVXg.mjs} +11 -11
  221. package/.output/server/chunks/build/{docs-Dhj-wEks.mjs.map → docs-C8bndVXg.mjs.map} +1 -1
  222. package/.output/server/chunks/build/{edit-CVz_gdoe.mjs → edit-BdfF9er2.mjs} +12 -12
  223. package/.output/server/chunks/build/edit-BdfF9er2.mjs.map +1 -0
  224. package/.output/server/chunks/build/{fetch-Be-j7hF1.mjs → fetch-tkz5_OA-.mjs} +3 -3
  225. package/.output/server/chunks/build/fetch-tkz5_OA-.mjs.map +1 -0
  226. package/.output/server/chunks/build/{forgot-password-CwdjL7BO.mjs → forgot-password-swZRcvXE.mjs} +3 -3
  227. package/.output/server/chunks/build/forgot-password-swZRcvXE.mjs.map +1 -0
  228. package/.output/server/chunks/build/{import-DyQEw4V3.mjs → import-B27Sv7h5.mjs} +11 -11
  229. package/.output/server/chunks/build/import-B27Sv7h5.mjs.map +1 -0
  230. package/.output/server/chunks/build/{index-DcnICCZU.mjs → index-BdZmxLtC.mjs} +17 -17
  231. package/.output/server/chunks/build/{index-DcnICCZU.mjs.map → index-BdZmxLtC.mjs.map} +1 -1
  232. package/.output/server/chunks/build/{index-D7Bmj6bq.mjs → index-C7m32bRI.mjs} +9 -9
  233. package/.output/server/chunks/build/index-C7m32bRI.mjs.map +1 -0
  234. package/.output/server/chunks/build/{index-DghAFpNR.mjs → index-Dq6nk6OB.mjs} +385 -104
  235. package/.output/server/chunks/build/index-Dq6nk6OB.mjs.map +1 -0
  236. package/.output/server/chunks/build/{isValueEqualOrExist-D2qw9YEr.mjs → isValueEqualOrExist-D4lZ8uRY.mjs} +3 -3
  237. package/.output/server/chunks/build/isValueEqualOrExist-D4lZ8uRY.mjs.map +1 -0
  238. package/.output/server/chunks/build/{login-rXKF63j6.mjs → login-hxCF06JT.mjs} +5 -5
  239. package/.output/server/chunks/build/login-hxCF06JT.mjs.map +1 -0
  240. package/.output/server/chunks/build/{mcp-ByNvFy4o.mjs → mcp-BVW1llyW.mjs} +12 -12
  241. package/.output/server/chunks/build/mcp-BVW1llyW.mjs.map +1 -0
  242. package/.output/server/chunks/build/{notifications-CbLAZnKJ.mjs → notifications-Dn-evqXM.mjs} +11 -11
  243. package/.output/server/chunks/build/notifications-Dn-evqXM.mjs.map +1 -0
  244. package/.output/server/chunks/build/{performance-C93MEPaZ.mjs → performance-CV8qm94u.mjs} +10 -10
  245. package/.output/server/chunks/build/performance-CV8qm94u.mjs.map +1 -0
  246. package/.output/server/chunks/build/{pr-feedback-DKCB0bDE.mjs → pr-feedback-gKDz8LyA.mjs} +9 -9
  247. package/.output/server/chunks/build/pr-feedback-gKDz8LyA.mjs.map +1 -0
  248. package/.output/server/chunks/build/{reset-password-BBoHKMqD.mjs → reset-password-DtEISa1I.mjs} +3 -3
  249. package/.output/server/chunks/build/reset-password-DtEISa1I.mjs.map +1 -0
  250. package/.output/server/chunks/build/server.mjs +87 -33
  251. package/.output/server/chunks/build/{settings-DiG0JjzC.mjs → settings-BJDnuLpc.mjs} +8 -8
  252. package/.output/server/chunks/build/settings-BJDnuLpc.mjs.map +1 -0
  253. package/.output/server/chunks/build/settings-metadata-DnAK4Rzg.mjs +1 -1
  254. package/.output/server/chunks/build/{setup-0-1O6Hjz.mjs → setup-BO9tXa_G.mjs} +14 -14
  255. package/.output/server/chunks/build/{setup-0-1O6Hjz.mjs.map → setup-BO9tXa_G.mjs.map} +1 -1
  256. package/.output/server/chunks/build/{storage-3JiFJ843.mjs → storage-zN92cA9q.mjs} +11 -11
  257. package/.output/server/chunks/build/storage-zN92cA9q.mjs.map +1 -0
  258. package/.output/server/chunks/build/{tags-CqYcp7js.mjs → tags-CJFnoyQc.mjs} +5 -5
  259. package/.output/server/chunks/build/tags-CJFnoyQc.mjs.map +1 -0
  260. package/.output/server/chunks/build/{test-cases-y1HSgPX2.mjs → test-cases-0Q6rT73d.mjs} +18 -18
  261. package/.output/server/chunks/build/test-cases-0Q6rT73d.mjs.map +1 -0
  262. package/.output/server/chunks/build/{test-functions-D2ju95Ly.mjs → test-functions-DVRJgiWo.mjs} +9 -9
  263. package/.output/server/chunks/build/test-functions-DVRJgiWo.mjs.map +1 -0
  264. package/.output/server/chunks/build/{useCopyRich-CVFeYfkG.mjs → useCopyRich-BM9GTjJi.mjs} +75 -29
  265. package/.output/server/chunks/build/{useCopyRich-CVFeYfkG.mjs.map → useCopyRich-BM9GTjJi.mjs.map} +1 -1
  266. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs +319 -0
  267. package/.output/server/chunks/build/useDesktopLocalRuns-k7Gw3Fv3.mjs.map +1 -0
  268. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs +67 -0
  269. package/.output/server/chunks/build/useDesktopProjectLink-WwLte59P.mjs.map +1 -0
  270. package/.output/server/chunks/build/{useFormControl-CZ9So7iX.mjs → useFormControl-8skMOTIf.mjs} +2 -2
  271. package/.output/server/chunks/build/useFormControl-8skMOTIf.mjs.map +1 -0
  272. package/.output/server/chunks/build/{useOpenInIde--6Me0WlL.mjs → useOpenInIde-D74FmDNg.mjs} +2 -2
  273. package/.output/server/chunks/build/useOpenInIde-D74FmDNg.mjs.map +1 -0
  274. package/.output/server/chunks/build/{users-IdmY9JZV.mjs → users-C9bjOBde.mjs} +6 -6
  275. package/.output/server/chunks/build/users-C9bjOBde.mjs.map +1 -0
  276. package/.output/server/chunks/nitro/nitro.mjs +982 -664
  277. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  278. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs +88 -0
  280. package/.output/server/chunks/routes/api/ai/step-resolution.post.mjs.map +1 -0
  281. package/.output/server/chunks/routes/api/analytics/_widget_.get.mjs +1 -1
  282. package/.output/server/chunks/routes/api/auth/change-password.post.mjs +1 -1
  283. package/.output/server/chunks/routes/api/auth/forgot-password.post.mjs +1 -1
  284. package/.output/server/chunks/routes/api/auth/login.post.mjs +1 -1
  285. package/.output/server/chunks/routes/api/auth/logout.post.mjs +1 -1
  286. package/.output/server/chunks/routes/api/auth/me.get.mjs +1 -1
  287. package/.output/server/chunks/routes/api/auth/oauth/_provider/callback.get.mjs +1 -1
  288. package/.output/server/chunks/routes/api/auth/oauth/_provider/login.get.mjs +1 -1
  289. package/.output/server/chunks/routes/api/auth/oauth/_provider/unlink.post.mjs +1 -1
  290. package/.output/server/chunks/routes/api/auth/reset-password.post.mjs +1 -1
  291. package/.output/server/chunks/routes/api/auth/send-verify-email.post.mjs +1 -1
  292. package/.output/server/chunks/routes/api/auth/setup.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/auth/setup.post.mjs +1 -1
  294. package/.output/server/chunks/routes/api/auth/verify-email.get.mjs +1 -1
  295. package/.output/server/chunks/routes/api/channels/_id/test.post.mjs +1 -1
  296. package/.output/server/chunks/routes/api/channels/_id_.delete.mjs +1 -1
  297. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/approve.post.mjs +1 -1
  298. package/.output/server/chunks/routes/api/cluster-merge-suggestions/_id/reject.post.mjs +1 -1
  299. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +1 -1
  300. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
  301. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
  302. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
  304. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
  306. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
  307. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
  308. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
  309. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
  310. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
  311. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
  312. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
  313. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
  315. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/index.get.mjs +1 -1
  318. package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
  319. package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
  320. package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
  321. package/.output/server/chunks/routes/api/index.get5.mjs +1 -1
  322. package/.output/server/chunks/routes/api/index.post.mjs +1 -1
  323. package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
  324. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  325. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  326. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  327. package/.output/server/chunks/routes/api/index.post6.mjs +1 -1
  328. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
  329. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
  330. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
  331. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
  332. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
  333. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
  334. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs +63 -0
  335. package/.output/server/chunks/routes/api/projects/_id/ai-steps.get.mjs.map +1 -0
  336. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
  337. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
  338. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
  340. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
  341. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
  342. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
  343. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
  344. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
  345. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
  346. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
  347. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
  348. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
  349. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
  350. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
  351. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
  352. package/.output/server/chunks/routes/api/projects/_id/test-functions/extract.post.mjs +1 -1
  353. package/.output/server/chunks/routes/api/projects/_id/test-functions/validate-proposal.post.mjs +1 -1
  354. package/.output/server/chunks/routes/api/projects/_id/test-functions.get.mjs +1 -1
  355. package/.output/server/chunks/routes/api/projects/_id/test-functions.post.mjs +1 -1
  356. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
  357. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
  358. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
  359. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
  360. package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
  361. package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
  362. package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
  363. package/.output/server/chunks/routes/api/search.get.mjs +1 -1
  364. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
  365. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
  366. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
  367. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
  368. package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
  369. package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
  370. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
  371. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
  372. package/.output/server/chunks/routes/api/settings/smtp/test.post.mjs +1 -1
  373. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
  374. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
  375. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
  376. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
  377. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
  378. package/.output/server/chunks/routes/api/setup-status.get.mjs +1 -1
  379. package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
  380. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
  381. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  382. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
  383. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  384. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
  385. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
  386. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
  387. package/.output/server/chunks/routes/api/test-functions/_id_.delete.mjs +1 -1
  388. package/.output/server/chunks/routes/api/test-functions/_id_.put.mjs +1 -1
  389. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
  390. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
  391. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
  392. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
  393. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
  394. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
  395. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
  396. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
  397. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +1 -1
  398. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
  399. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
  400. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
  401. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
  402. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
  403. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
  404. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
  405. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  406. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  407. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
  408. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  409. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  410. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  411. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  412. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  413. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
  414. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  415. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
  416. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
  417. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
  418. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -1
  419. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +1 -1
  420. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  421. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
  422. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
  423. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +3 -1
  424. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs.map +1 -1
  425. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +2 -1
  426. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs.map +1 -1
  427. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +2 -1
  428. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  429. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  430. package/.output/server/chunks/routes/api/users/_id/api-keys/_keyId_.delete.mjs +1 -1
  431. package/.output/server/chunks/routes/api/users/_id/index.get.mjs +1 -1
  432. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  433. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  434. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  435. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  436. package/.output/server/chunks/routes/api/users/_id_.delete.mjs +1 -1
  437. package/.output/server/chunks/routes/api/users/_id_.patch.mjs +1 -1
  438. package/.output/server/chunks/routes/api/version.get.mjs +1 -1
  439. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  440. package/.output/server/chunks/routes/renderer.mjs +1 -1
  441. package/.output/server/database/migrations/0045_productive_stingray.sql +1 -0
  442. package/.output/server/database/migrations/meta/0045_snapshot.json +3779 -0
  443. package/.output/server/database/migrations/meta/_journal.json +7 -0
  444. package/.output/server/database/migrations-pg/0046_gorgeous_hercules.sql +1 -0
  445. package/.output/server/database/migrations-pg/meta/0046_snapshot.json +4486 -0
  446. package/.output/server/database/migrations-pg/meta/_journal.json +7 -0
  447. package/.output/server/index.mjs +1 -1
  448. package/.output/server/package.json +1 -1
  449. package/package.json +1 -1
  450. package/.output/public/_nuxt/B-6GGrhr.js +0 -1
  451. package/.output/public/_nuxt/B9FSuKdA.js +0 -1
  452. package/.output/public/_nuxt/BaDhDBCV.js +0 -1
  453. package/.output/public/_nuxt/Bb7Uckln.js +0 -5
  454. package/.output/public/_nuxt/Be4c943G.js +0 -2
  455. package/.output/public/_nuxt/BpUXqOVj.js +0 -2
  456. package/.output/public/_nuxt/BtSJxOdh.js +0 -1
  457. package/.output/public/_nuxt/CI_q0F1O.js +0 -9
  458. package/.output/public/_nuxt/CScusXhF.js +0 -1
  459. package/.output/public/_nuxt/Cot8fIp5.js +0 -2
  460. package/.output/public/_nuxt/D0ROfwV0.js +0 -1
  461. package/.output/public/_nuxt/D4oheDIm.js +0 -4
  462. package/.output/public/_nuxt/DS2ANCQh.js +0 -1
  463. package/.output/public/_nuxt/DslnXfcH.js +0 -1
  464. package/.output/public/_nuxt/builds/meta/28bca36d-5571-4157-b1b8-7f62c934eed6.json +0 -1
  465. package/.output/public/_nuxt/entry.BAvBQY-h.css +0 -1
  466. package/.output/public/_nuxt/hzsG6cAc.js +0 -1
  467. package/.output/public/_nuxt/jjOqY9Tv.js +0 -1
  468. package/.output/public/_nuxt/xbO0VmDX.js +0 -1
  469. package/.output/server/chunks/build/Alert-DAb8nKVs.mjs.map +0 -1
  470. package/.output/server/chunks/build/Breadcrumb-DJp5WvUM.mjs.map +0 -1
  471. package/.output/server/chunks/build/BreadcrumbNav-BrQwfL8G.mjs.map +0 -1
  472. package/.output/server/chunks/build/BrowserBadge-Djw_e_I9.mjs.map +0 -1
  473. package/.output/server/chunks/build/ChartCard-B2gd_8HP.mjs.map +0 -1
  474. package/.output/server/chunks/build/Checkbox-C1khEdTh.mjs.map +0 -1
  475. package/.output/server/chunks/build/CodeBlock-CjnDrO3Y.mjs.map +0 -1
  476. package/.output/server/chunks/build/DashboardNavbar-DYtmVlhy.mjs.map +0 -1
  477. package/.output/server/chunks/build/DashboardSidebarToggle-BPNxODwj.mjs.map +0 -1
  478. package/.output/server/chunks/build/DataLocationCard-2B-sVSMr.mjs.map +0 -1
  479. package/.output/server/chunks/build/DiagnosisPanel-D6QO30FQ.mjs.map +0 -1
  480. package/.output/server/chunks/build/DiagnosisResult-ujB5Lt2A.mjs.map +0 -1
  481. package/.output/server/chunks/build/EntityLinks-F8_kC-IH.mjs.map +0 -1
  482. package/.output/server/chunks/build/EnvManagedBadge-D6e-10M9.mjs.map +0 -1
  483. package/.output/server/chunks/build/FeatureUnavailable-BMw4euTk.mjs.map +0 -1
  484. package/.output/server/chunks/build/FormField-QptK0rPg.mjs.map +0 -1
  485. package/.output/server/chunks/build/GetStartedWizard-DxT8T14Y.mjs.map +0 -1
  486. package/.output/server/chunks/build/HelpHint-C5Ru8BCc.mjs.map +0 -1
  487. package/.output/server/chunks/build/MetaStripGroup-BBByVvpR.mjs.map +0 -1
  488. package/.output/server/chunks/build/Modal-BacZmQCX.mjs.map +0 -1
  489. package/.output/server/chunks/build/NavigationMenu-sTiKSWDm.mjs.map +0 -1
  490. package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +0 -1
  491. package/.output/server/chunks/build/SectionCard-C753B3Yo.mjs.map +0 -1
  492. package/.output/server/chunks/build/Select-BAyYwPuo.mjs.map +0 -1
  493. package/.output/server/chunks/build/Separator-BbgCfKKJ.mjs.map +0 -1
  494. package/.output/server/chunks/build/SettingsField-D-VriK9X.mjs.map +0 -1
  495. package/.output/server/chunks/build/Slideover-CNbGvbUF.mjs.map +0 -1
  496. package/.output/server/chunks/build/Switch-DdkA3Fii.mjs.map +0 -1
  497. package/.output/server/chunks/build/Table-CfDVAuUJ.mjs.map +0 -1
  498. package/.output/server/chunks/build/Tabs-BCOhHEB9.mjs.map +0 -1
  499. package/.output/server/chunks/build/TestStatusBar-wquHQqtp.mjs.map +0 -1
  500. package/.output/server/chunks/build/Textarea-Ohs6QTXf.mjs.map +0 -1
  501. package/.output/server/chunks/build/Tooltip-BRBnl4pE.mjs.map +0 -1
  502. package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +0 -1
  503. package/.output/server/chunks/build/_id_-CQ0lolEK.mjs.map +0 -1
  504. package/.output/server/chunks/build/about-DdyOj-dj.mjs.map +0 -1
  505. package/.output/server/chunks/build/account-7aVMKekZ.mjs.map +0 -1
  506. package/.output/server/chunks/build/db.client-Bdqk_eYQ.mjs.map +0 -1
  507. package/.output/server/chunks/build/default-CkyAx_Mu.mjs.map +0 -1
  508. package/.output/server/chunks/build/edit-CVz_gdoe.mjs.map +0 -1
  509. package/.output/server/chunks/build/fetch-Be-j7hF1.mjs.map +0 -1
  510. package/.output/server/chunks/build/forgot-password-CwdjL7BO.mjs.map +0 -1
  511. package/.output/server/chunks/build/import-DyQEw4V3.mjs.map +0 -1
  512. package/.output/server/chunks/build/index-D7Bmj6bq.mjs.map +0 -1
  513. package/.output/server/chunks/build/index-DghAFpNR.mjs.map +0 -1
  514. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs.map +0 -1
  515. package/.output/server/chunks/build/login-rXKF63j6.mjs.map +0 -1
  516. package/.output/server/chunks/build/mcp-ByNvFy4o.mjs.map +0 -1
  517. package/.output/server/chunks/build/notifications-CbLAZnKJ.mjs.map +0 -1
  518. package/.output/server/chunks/build/performance-C93MEPaZ.mjs.map +0 -1
  519. package/.output/server/chunks/build/pr-feedback-DKCB0bDE.mjs.map +0 -1
  520. package/.output/server/chunks/build/reset-password-BBoHKMqD.mjs.map +0 -1
  521. package/.output/server/chunks/build/settings-DiG0JjzC.mjs.map +0 -1
  522. package/.output/server/chunks/build/storage-3JiFJ843.mjs.map +0 -1
  523. package/.output/server/chunks/build/tags-CqYcp7js.mjs.map +0 -1
  524. package/.output/server/chunks/build/test-cases-y1HSgPX2.mjs.map +0 -1
  525. package/.output/server/chunks/build/test-functions-D2ju95Ly.mjs.map +0 -1
  526. package/.output/server/chunks/build/useFormControl-CZ9So7iX.mjs.map +0 -1
  527. package/.output/server/chunks/build/useOpenInIde--6Me0WlL.mjs.map +0 -1
  528. package/.output/server/chunks/build/users-IdmY9JZV.mjs.map +0 -1
@@ -1,183 +1,122 @@
1
- import { _ as _sfc_main$8 } from './Tooltip-BRBnl4pE.mjs';
2
- import { o as _sfc_main$p, m as _sfc_main$k, n as _sfc_main$7$1, _ as _sfc_main$d } from './server.mjs';
3
- import { _ as _sfc_main$9 } from './Modal-BacZmQCX.mjs';
4
- import { _ as _sfc_main$a } from './Alert-DAb8nKVs.mjs';
5
- import { _ as _sfc_main$b } from './FormField-QptK0rPg.mjs';
6
- import { _ as _sfc_main$6 } from './Select-BAyYwPuo.mjs';
7
- import { _ as _sfc_main$c } from './Switch-DdkA3Fii.mjs';
8
- import { _ as __nuxt_component_5 } from './CodeBlock-CjnDrO3Y.mjs';
9
- import { defineComponent, useModel, ref, computed, mergeProps, unref, mergeModels, withCtx, createTextVNode, createVNode, isRef, toDisplayString, watch, nextTick, openBlock, createBlock, createCommentVNode, Fragment, renderList, onScopeDispose, useSSRContext } from 'vue';
10
- import { ssrRenderAttrs, ssrRenderClass, ssrRenderSlot, ssrRenderComponent, ssrInterpolate, ssrRenderList } from 'vue/server-renderer';
11
- import { e as escapeGrep, t as toPosixPath } from './useOpenInIde--6Me0WlL.mjs';
12
- import { u as useDesktopProjectLink } from './BrowserBadge-Djw_e_I9.mjs';
13
- import { t as tauriCore, a as tauriEvent } from './useTauri-Kf3HE_42.mjs';
14
- import { v as getStatusColor, D as isStatusInFlight, E as getStatusIcon, a as formatStatusLabel, e as errorMessage } from './index-ByWTzqF6.mjs';
15
- import { _ as _sfc_main$7 } from './Tabs-BCOhHEB9.mjs';
16
- import { _ as __nuxt_component_2$1 } from './HelpHint-C5Ru8BCc.mjs';
1
+ import { defineComponent, ref, watch, computed, unref, mergeProps, withCtx, createTextVNode, toDisplayString, createVNode, openBlock, createBlock, createCommentVNode, isRef, toValue, provide, renderSlot, useModel, Fragment, mergeModels, useSSRContext } from 'vue';
2
+ import { ssrRenderAttrs, ssrRenderComponent, ssrInterpolate, ssrRenderSlot } from 'vue/server-renderer';
3
+ import { L as useTimestamp, m as _sfc_main$k, M as _sfc_main$a, a as useComponentProps, b as useAppConfig, t as tv, K as fieldGroupInjectionKey, P as Primitive, o as _sfc_main$p, _ as _sfc_main$d, n as _sfc_main$7$1 } from './server.mjs';
4
+ import { _ as _sfc_main$3 } from './Tooltip-BI3WQErw.mjs';
5
+ import { _ as _sfc_main$4 } from './Modal-hKLvVFNp.mjs';
6
+ import { _ as _sfc_main$5 } from './Alert-He-UxEt6.mjs';
7
+ import { _ as _sfc_main$6 } from './FormField-GYHKiSI6.mjs';
8
+ import { _ as _sfc_main$7 } from './Select-CEyw7HGK.mjs';
9
+ import { _ as _sfc_main$8 } from './Switch-R2n82ncQ.mjs';
10
+ import { _ as __nuxt_component_5 } from './CodeBlock-B8BNtZAe.mjs';
11
+ import { u as useDesktopLocalRuns, L as LOCAL_RUN_MODE_ITEMS, l as localRunProgressLabel, R as RETRY_MODE_ITEMS, b as buildLocalRunPlan } from './useDesktopLocalRuns-k7Gw3Fv3.mjs';
12
+ import { u as useDesktopProjectLink } from './useDesktopProjectLink-WwLte59P.mjs';
13
+ import { t as tauriCore } from './useTauri-Kf3HE_42.mjs';
14
+ import { a as useCopy } from './fetch-tkz5_OA-.mjs';
15
+ import { b as buildRetryCommand } from './useOpenInIde-D74FmDNg.mjs';
17
16
 
18
- const RUN_MODE_FLAGS = {
19
- normal: [],
20
- headed: ["--headed"],
21
- debug: ["--debug"],
22
- ui: ["--ui"]
23
- };
24
- function groupByProject(cases) {
25
- const groups = /* @__PURE__ */ new Map();
26
- for (const c of cases) {
27
- const key = c.projectName || "";
28
- if (!groups.has(key)) groups.set(key, []);
29
- groups.get(key).push(c);
30
- }
31
- return groups;
32
- }
33
- function specArgs(cases, mode) {
34
- if (mode === "grep") {
35
- const escaped = cases.map((c) => escapeGrep(c.title));
36
- return ["--grep", escaped.length === 1 ? escaped[0] : `(${escaped.join("|")})`];
37
- }
38
- const seen = /* @__PURE__ */ new Set();
39
- const specs = [];
40
- for (const c of cases) {
41
- const spec = mode === "file-line" && c.line ? `${toPosixPath(c.filePath)}:${c.line}` : toPosixPath(c.filePath);
42
- if (seen.has(spec)) continue;
43
- seen.add(spec);
44
- specs.push(spec);
45
- }
46
- return specs;
47
- }
48
- function displayArg(arg) {
49
- return /[\s"'()|]/.test(arg) ? `"${arg.replace(/"/g, '\\"')}"` : arg;
50
- }
51
- function buildLocalRunPlan(cases, options = {}) {
52
- if (cases.length === 0) return [];
53
- const mode = options.mode ?? "file-line";
54
- const runMode = options.runMode ?? "normal";
55
- const repeatEach = Math.min(1e3, Math.max(1, Math.floor(options.repeatEach ?? 1)));
56
- const steps = [];
57
- for (const [project, projectCases] of groupByProject(cases)) {
58
- const args = specArgs(projectCases, mode);
59
- if (project) args.push(`--project=${project}`);
60
- args.push(...RUN_MODE_FLAGS[runMode]);
61
- if (options.trace) args.push("--trace=on");
62
- if (repeatEach > 1) args.push(`--repeat-each=${repeatEach}`);
63
- steps.push({ args, display: ["playwright", "test", ...args.map(displayArg)].join(" ") });
64
- }
65
- return steps;
66
- }
67
- const MAX_LINES = 2e3;
68
- function useDesktopLocalRunner() {
69
- const status = ref("idle");
70
- const lines = ref([]);
71
- const exitCode = ref(null);
72
- const stepIndex = ref(0);
73
- const stepCount = ref(0);
74
- const running = computed(() => status.value === "running");
75
- let currentRunId = null;
76
- let starting = false;
77
- let stopped = false;
78
- let pending = [];
79
- let unlisten = null;
80
- let resolveExit = null;
81
- function pushLine(text, error) {
82
- lines.value.push({ text, error });
83
- if (lines.value.length > MAX_LINES) lines.value.splice(0, lines.value.length - MAX_LINES);
84
- }
85
- function handleEvent(payload) {
86
- if (payload.kind === "exit") {
87
- resolveExit?.(payload.code);
88
- return;
17
+ const theme = {
18
+ "base": "relative",
19
+ "variants": {
20
+ "size": {
21
+ "xs": "",
22
+ "sm": "",
23
+ "md": "",
24
+ "lg": "",
25
+ "xl": ""
26
+ },
27
+ "orientation": {
28
+ "horizontal": "inline-flex -space-x-px",
29
+ "vertical": "flex flex-col -space-y-px"
89
30
  }
90
- pushLine(payload.line ?? "", payload.kind !== "stdout");
91
31
  }
92
- async function ensureListener() {
93
- if (unlisten) return;
94
- const events = tauriEvent();
95
- if (!events) throw new Error("The desktop bridge is unavailable.");
96
- unlisten = await events.listen("piwi:local-run", ({ payload }) => {
97
- if (payload.id === currentRunId) {
98
- handleEvent(payload);
99
- } else if (starting) {
100
- pending.push(payload);
101
- }
102
- });
32
+ };
33
+ const _sfc_main$2 = {
34
+ __name: "UFieldGroup",
35
+ __ssrInlineRender: true,
36
+ props: {
37
+ as: { type: null, required: false },
38
+ size: { type: null, required: false },
39
+ orientation: { type: null, required: false, default: "horizontal" },
40
+ class: { type: null, required: false },
41
+ ui: { type: Object, required: false }
42
+ },
43
+ setup(__props) {
44
+ const _props = __props;
45
+ const props = useComponentProps("fieldGroup", _props);
46
+ const appConfig = useAppConfig();
47
+ const ui = computed(() => tv({ extend: theme, ...appConfig.ui?.fieldGroup || {} }));
48
+ provide(fieldGroupInjectionKey, computed(() => ({
49
+ orientation: props.orientation,
50
+ size: props.size
51
+ })));
52
+ return (_ctx, _push, _parent, _attrs) => {
53
+ _push(ssrRenderComponent(unref(Primitive), mergeProps({
54
+ as: unref(props).as,
55
+ "data-orientation": unref(props).orientation,
56
+ class: ui.value({ orientation: unref(props).orientation, class: [unref(props).ui?.base, unref(props).class] })
57
+ }, _attrs), {
58
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
59
+ if (_push2) {
60
+ ssrRenderSlot(_ctx.$slots, "default", {}, null, _push2, _parent2, _scopeId);
61
+ } else {
62
+ return [
63
+ renderSlot(_ctx.$slots, "default")
64
+ ];
65
+ }
66
+ }),
67
+ _: 3
68
+ }, _parent));
69
+ };
103
70
  }
104
- async function runStep(projectId, step) {
71
+ };
72
+ const _sfc_setup$2 = _sfc_main$2.setup;
73
+ _sfc_main$2.setup = (props, ctx) => {
74
+ const ssrContext = useSSRContext();
75
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("../../../node_modules/@nuxt/ui/dist/runtime/components/FieldGroup.vue");
76
+ return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
77
+ };
78
+ function useDesktopSpecCheck(projectId, cases) {
79
+ const specFiles = computed(() => [
80
+ ...new Set(
81
+ toValue(cases).map((c) => c.filePath).filter(Boolean)
82
+ )
83
+ ]);
84
+ const missingSpecs = ref([]);
85
+ const wrongFolder = computed(
86
+ () => specFiles.value.length > 0 && missingSpecs.value.length === specFiles.value.length
87
+ );
88
+ async function checkSpecs(linkedFolderExists) {
105
89
  const core = tauriCore();
106
- if (!core) throw new Error("The desktop bridge is unavailable.");
107
- const exit = new Promise((resolve) => {
108
- resolveExit = resolve;
109
- });
110
- starting = true;
111
- pending = [];
90
+ const id = toValue(projectId);
91
+ missingSpecs.value = [];
92
+ if (!core || !linkedFolderExists || id == null || specFiles.value.length === 0) return;
112
93
  try {
113
- currentRunId = await core.invoke("desktop_run_local_tests", {
114
- projectId: String(projectId),
115
- args: step.args
94
+ const result = await core.invoke("desktop_check_local_specs", {
95
+ projectId: String(id),
96
+ files: specFiles.value
116
97
  });
117
- } finally {
118
- starting = false;
119
- }
120
- for (const event of pending) {
121
- if (event.id === currentRunId) handleEvent(event);
122
- }
123
- pending = [];
124
- const code = await exit;
125
- currentRunId = null;
126
- resolveExit = null;
127
- return code;
128
- }
129
- async function start(projectId, steps) {
130
- if (running.value || steps.length === 0) return;
131
- stopped = false;
132
- lines.value = [];
133
- exitCode.value = null;
134
- stepCount.value = steps.length;
135
- stepIndex.value = 0;
136
- status.value = "running";
137
- try {
138
- await ensureListener();
139
- let worst = 0;
140
- for (const [index, step] of steps.entries()) {
141
- if (stopped) break;
142
- stepIndex.value = index;
143
- if (steps.length > 1) pushLine(`$ ${step.display}`, false);
144
- const code = await runStep(projectId, step);
145
- if (stopped) break;
146
- if (code !== 0) worst = code ?? 1;
147
- }
148
- if (stopped) {
149
- status.value = "stopped";
150
- } else {
151
- exitCode.value = typeof worst === "number" ? worst : 1;
152
- status.value = worst === 0 ? "passed" : "failed";
153
- }
154
- } catch (error) {
155
- pushLine(errorMessage(error), true);
156
- status.value = "error";
98
+ missingSpecs.value = result?.missing ?? [];
99
+ } catch {
157
100
  }
158
101
  }
159
- async function stop() {
160
- if (!running.value) return;
161
- stopped = true;
102
+ return { specFiles, missingSpecs, wrongFolder, checkSpecs };
103
+ }
104
+ function useDesktopEnvCheck(projectId) {
105
+ const env = ref(null);
106
+ const playwrightMissing = computed(() => !!env.value?.exists && env.value.playwrightCli == null);
107
+ async function checkEnv() {
162
108
  const core = tauriCore();
163
- const id = currentRunId;
164
- if (core && id != null) {
165
- try {
166
- await core.invoke("desktop_stop_local_tests", { runId: id });
167
- } catch {
168
- }
109
+ const id = toValue(projectId);
110
+ env.value = null;
111
+ if (!core || id == null) return;
112
+ try {
113
+ env.value = await core.invoke("desktop_check_local_env", { projectId: String(id) });
114
+ } catch {
169
115
  }
170
- resolveExit?.(null);
171
- status.value = "stopped";
172
116
  }
173
- onScopeDispose(() => {
174
- if (running.value) void stop();
175
- unlisten?.();
176
- unlisten = null;
177
- });
178
- return { status, running, lines, exitCode, stepIndex, stepCount, start, stop };
117
+ return { env, playwrightMissing, checkEnv };
179
118
  }
180
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
119
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
181
120
  __name: "DesktopRunLocallyModal",
182
121
  __ssrInlineRender: true,
183
122
  props: /* @__PURE__ */ mergeModels({
@@ -192,95 +131,61 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
192
131
  setup(__props) {
193
132
  const props = __props;
194
133
  const open = useModel(__props, "open");
134
+ const store = useDesktopLocalRuns();
195
135
  const { link, busy, pickAndLink } = useDesktopProjectLink(() => props.projectId);
196
- const { status, running, lines, exitCode, stepIndex, stepCount, start, stop } = useDesktopLocalRunner();
197
- const mode = ref("file-line");
198
- const runMode = ref("normal");
199
- const trace = ref(false);
200
- const repeatEach = ref(1);
201
- const modeItems = [
202
- { label: "File:line", value: "file-line" },
203
- { label: "Title (grep)", value: "grep" },
204
- { label: "File only", value: "file" }
205
- ];
206
- const runModeItems = [
207
- { label: "Headless", value: "normal" },
208
- { label: "Headed", value: "headed" },
209
- { label: "Debug (inspector)", value: "debug" },
210
- { label: "UI mode", value: "ui" }
211
- ];
136
+ const { missingSpecs, wrongFolder, checkSpecs } = useDesktopSpecCheck(
137
+ () => props.projectId,
138
+ () => props.cases
139
+ );
140
+ const { playwrightMissing, checkEnv } = useDesktopEnvCheck(() => props.projectId);
212
141
  const linked = computed(() => !!link.value?.exists);
213
- const specFiles = computed(() => [...new Set(props.cases.map((c) => c.filePath).filter(Boolean))]);
214
- const missingSpecs = ref([]);
215
- async function checkSpecs() {
216
- const core = tauriCore();
217
- missingSpecs.value = [];
218
- if (!core || !linked.value || specFiles.value.length === 0) return;
219
- try {
220
- const result = await core.invoke("desktop_check_local_specs", {
221
- projectId: String(props.projectId),
222
- files: specFiles.value
223
- });
224
- missingSpecs.value = result?.missing ?? [];
225
- } catch {
226
- }
227
- }
142
+ const options = computed({
143
+ get: () => store.getProjectOptions(props.projectId),
144
+ set: (value) => store.saveProjectOptions(props.projectId, value)
145
+ });
146
+ const mode = computed({
147
+ get: () => options.value.mode,
148
+ set: (value) => options.value = { ...options.value, mode: value }
149
+ });
150
+ const runMode = computed({
151
+ get: () => options.value.runMode,
152
+ set: (value) => options.value = { ...options.value, runMode: value }
153
+ });
154
+ const trace = computed({
155
+ get: () => options.value.trace,
156
+ set: (value) => options.value = { ...options.value, trace: value }
157
+ });
158
+ const repeatEach = computed({
159
+ get: () => options.value.repeatEach,
160
+ set: (value) => options.value = { ...options.value, repeatEach: value }
161
+ });
162
+ const modeItems = RETRY_MODE_ITEMS;
163
+ const runModeItems = LOCAL_RUN_MODE_ITEMS;
228
164
  watch([open, () => link.value?.path, linked], () => {
229
- if (open.value) void checkSpecs();
165
+ if (!open.value) return;
166
+ void checkSpecs(linked.value);
167
+ void checkEnv();
230
168
  });
231
- const wrongFolder = computed(() => specFiles.value.length > 0 && missingSpecs.value.length === specFiles.value.length);
232
- const plan = computed(
233
- () => buildLocalRunPlan(props.cases, {
234
- mode: mode.value,
235
- runMode: runMode.value,
236
- trace: trace.value,
237
- repeatEach: repeatEach.value
238
- })
239
- );
169
+ const plan = computed(() => buildLocalRunPlan(props.cases, options.value));
240
170
  const preview = computed(() => plan.value.map((s) => s.display).join("\n"));
241
- const statusBadge = computed(() => {
242
- switch (status.value) {
243
- case "running":
244
- return {
245
- label: stepCount.value > 1 ? `Running ${stepIndex.value + 1}/${stepCount.value}…` : "Running…",
246
- color: "info"
247
- };
248
- case "passed":
249
- return { label: "Passed", color: "success" };
250
- case "failed":
251
- return { label: exitCode.value != null ? `Failed (exit ${exitCode.value})` : "Failed", color: "error" };
252
- case "stopped":
253
- return { label: "Stopped", color: "neutral" };
254
- case "error":
255
- return { label: "Could not run", color: "error" };
256
- default:
257
- return null;
258
- }
259
- });
260
- async function run() {
261
- await start(props.projectId, plan.value);
171
+ function run() {
172
+ store.startRun({
173
+ projectId: props.projectId,
174
+ projectLabel: props.projectLabel,
175
+ cases: props.cases
176
+ });
177
+ open.value = false;
262
178
  }
263
- watch(open, (value) => {
264
- if (!value && running.value) void stop();
265
- });
266
- const outputEl = ref(null);
267
- watch(
268
- () => lines.value.length,
269
- async () => {
270
- await nextTick();
271
- outputEl.value?.scrollTo({ top: outputEl.value.scrollHeight });
272
- }
273
- );
274
179
  return (_ctx, _push, _parent, _attrs) => {
275
- const _component_UModal = _sfc_main$9;
180
+ const _component_UModal = _sfc_main$4;
276
181
  const _component_UIcon = _sfc_main$p;
277
182
  const _component_UBadge = _sfc_main$7$1;
278
- const _component_UAlert = _sfc_main$a;
183
+ const _component_UAlert = _sfc_main$5;
279
184
  const _component_UButton = _sfc_main$k;
280
- const _component_UFormField = _sfc_main$b;
281
- const _component_USelect = _sfc_main$6;
185
+ const _component_UFormField = _sfc_main$6;
186
+ const _component_USelect = _sfc_main$7;
282
187
  const _component_UInput = _sfc_main$d;
283
- const _component_USwitch = _sfc_main$c;
188
+ const _component_USwitch = _sfc_main$8;
284
189
  const _component_CodeBlock = __nuxt_component_5;
285
190
  _push(ssrRenderComponent(_component_UModal, mergeProps({
286
191
  open: open.value,
@@ -380,7 +285,6 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
380
285
  variant: "ghost",
381
286
  icon: "i-lucide-folder-search",
382
287
  loading: unref(busy),
383
- disabled: unref(running),
384
288
  onClick: unref(pickAndLink)
385
289
  }, {
386
290
  default: withCtx((_2, _push3, _parent3, _scopeId2) => {
@@ -404,8 +308,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
404
308
  _push3(ssrRenderComponent(_component_USelect, {
405
309
  modelValue: unref(mode),
406
310
  "onUpdate:modelValue": ($event) => isRef(mode) ? mode.value = $event : null,
407
- items: modeItems,
408
- disabled: unref(running),
311
+ items: unref(modeItems),
409
312
  class: "w-full"
410
313
  }, null, _parent3, _scopeId2));
411
314
  } else {
@@ -413,10 +316,9 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
413
316
  createVNode(_component_USelect, {
414
317
  modelValue: unref(mode),
415
318
  "onUpdate:modelValue": ($event) => isRef(mode) ? mode.value = $event : null,
416
- items: modeItems,
417
- disabled: unref(running),
319
+ items: unref(modeItems),
418
320
  class: "w-full"
419
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
321
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "items"])
420
322
  ];
421
323
  }
422
324
  }),
@@ -431,8 +333,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
431
333
  _push3(ssrRenderComponent(_component_USelect, {
432
334
  modelValue: unref(runMode),
433
335
  "onUpdate:modelValue": ($event) => isRef(runMode) ? runMode.value = $event : null,
434
- items: runModeItems,
435
- disabled: unref(running),
336
+ items: unref(runModeItems),
436
337
  class: "w-full"
437
338
  }, null, _parent3, _scopeId2));
438
339
  } else {
@@ -440,10 +341,9 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
440
341
  createVNode(_component_USelect, {
441
342
  modelValue: unref(runMode),
442
343
  "onUpdate:modelValue": ($event) => isRef(runMode) ? runMode.value = $event : null,
443
- items: runModeItems,
444
- disabled: unref(running),
344
+ items: unref(runModeItems),
445
345
  class: "w-full"
446
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
346
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "items"])
447
347
  ];
448
348
  }
449
349
  }),
@@ -463,7 +363,6 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
463
363
  type: "number",
464
364
  min: "1",
465
365
  max: "1000",
466
- disabled: unref(running),
467
366
  class: "w-full"
468
367
  }, null, _parent3, _scopeId2));
469
368
  } else {
@@ -475,9 +374,8 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
475
374
  type: "number",
476
375
  min: "1",
477
376
  max: "1000",
478
- disabled: unref(running),
479
377
  class: "w-full"
480
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
378
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
481
379
  ];
482
380
  }
483
381
  }),
@@ -492,22 +390,45 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
492
390
  if (_push3) {
493
391
  _push3(ssrRenderComponent(_component_USwitch, {
494
392
  modelValue: unref(trace),
495
- "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null,
496
- disabled: unref(running)
393
+ "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null
497
394
  }, null, _parent3, _scopeId2));
498
395
  } else {
499
396
  return [
500
397
  createVNode(_component_USwitch, {
501
398
  modelValue: unref(trace),
502
- "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null,
503
- disabled: unref(running)
504
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
399
+ "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null
400
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
505
401
  ];
506
402
  }
507
403
  }),
508
404
  _: 1
509
405
  }, _parent2, _scopeId));
510
406
  _push2(`</div>`);
407
+ if (unref(playwrightMissing)) {
408
+ _push2(ssrRenderComponent(_component_UAlert, {
409
+ color: "warning",
410
+ variant: "soft",
411
+ icon: "i-lucide-package-x",
412
+ title: "No Playwright installation found"
413
+ }, {
414
+ description: withCtx((_2, _push3, _parent3, _scopeId2) => {
415
+ if (_push3) {
416
+ _push3(` Neither <code class="text-xs"${_scopeId2}>${ssrInterpolate(unref(link)?.path)}</code> nor its parents hold a <code class="text-xs"${_scopeId2}>node_modules</code> with Playwright. Run your package manager&#39;s install in the checkout first — the app executes that folder&#39;s own Playwright. `);
417
+ } else {
418
+ return [
419
+ createTextVNode(" Neither "),
420
+ createVNode("code", { class: "text-xs" }, toDisplayString(unref(link)?.path), 1),
421
+ createTextVNode(" nor its parents hold a "),
422
+ createVNode("code", { class: "text-xs" }, "node_modules"),
423
+ createTextVNode(" with Playwright. Run your package manager's install in the checkout first — the app executes that folder's own Playwright. ")
424
+ ];
425
+ }
426
+ }),
427
+ _: 1
428
+ }, _parent2, _scopeId));
429
+ } else {
430
+ _push2(`<!---->`);
431
+ }
511
432
  if (unref(missingSpecs).length > 0) {
512
433
  _push2(ssrRenderComponent(_component_UAlert, {
513
434
  color: "warning",
@@ -538,7 +459,6 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
538
459
  icon: "i-lucide-folder-search",
539
460
  class: "mt-2",
540
461
  loading: unref(busy),
541
- disabled: unref(running),
542
462
  onClick: unref(pickAndLink)
543
463
  }, {
544
464
  default: withCtx((_3, _push4, _parent4, _scopeId3) => {
@@ -580,14 +500,13 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
580
500
  icon: "i-lucide-folder-search",
581
501
  class: "mt-2",
582
502
  loading: unref(busy),
583
- disabled: unref(running),
584
503
  onClick: unref(pickAndLink)
585
504
  }, {
586
505
  default: withCtx(() => [
587
506
  createTextVNode(" Choose the right folder… ")
588
507
  ]),
589
508
  _: 1
590
- }, 8, ["loading", "disabled", "onClick"])) : createCommentVNode("", true)
509
+ }, 8, ["loading", "onClick"])) : createCommentVNode("", true)
591
510
  ];
592
511
  }
593
512
  }),
@@ -601,17 +520,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
601
520
  code: unref(preview),
602
521
  lang: "sh"
603
522
  }, null, _parent2, _scopeId));
604
- _push2(`</div><p class="text-xs text-muted"${_scopeId}> Results are reported by the folder&#39;s own Playwright config — with the Piwi reporter set up, the new run appears in this app automatically. </p>`);
605
- if (unref(status) !== "idle") {
606
- _push2(`<div class="space-y-2"${_scopeId}><div class="h-64 overflow-y-auto rounded-md bg-zinc-950 p-3"${_scopeId}><!--[-->`);
607
- ssrRenderList(unref(lines), (line, i) => {
608
- _push2(`<p class="${ssrRenderClass([line.error ? "text-red-400" : "text-zinc-300", "font-mono text-xs whitespace-pre-wrap"])}"${_scopeId}>${ssrInterpolate(line.text || " ")}</p>`);
609
- });
610
- _push2(`<!--]--></div></div>`);
611
- } else {
612
- _push2(`<!---->`);
613
- }
614
- _push2(`<!--]-->`);
523
+ _push2(`</div><p class="text-xs text-muted"${_scopeId}> The run streams into the Local runs tray and keeps going while you browse. Results are reported by the folder&#39;s own Playwright config — with the Piwi reporter set up, the new run appears in this app automatically. </p><!--]-->`);
615
524
  }
616
525
  _push2(`</div>`);
617
526
  } else {
@@ -655,14 +564,13 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
655
564
  variant: "ghost",
656
565
  icon: "i-lucide-folder-search",
657
566
  loading: unref(busy),
658
- disabled: unref(running),
659
567
  onClick: unref(pickAndLink)
660
568
  }, {
661
569
  default: withCtx(() => [
662
570
  createTextVNode(" Change ")
663
571
  ]),
664
572
  _: 1
665
- }, 8, ["loading", "disabled", "onClick"])
573
+ }, 8, ["loading", "onClick"])
666
574
  ]),
667
575
  createVNode("div", { class: "grid grid-cols-2 gap-3" }, [
668
576
  createVNode(_component_UFormField, {
@@ -673,10 +581,9 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
673
581
  createVNode(_component_USelect, {
674
582
  modelValue: unref(mode),
675
583
  "onUpdate:modelValue": ($event) => isRef(mode) ? mode.value = $event : null,
676
- items: modeItems,
677
- disabled: unref(running),
584
+ items: unref(modeItems),
678
585
  class: "w-full"
679
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
586
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "items"])
680
587
  ]),
681
588
  _: 1
682
589
  }),
@@ -688,10 +595,9 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
688
595
  createVNode(_component_USelect, {
689
596
  modelValue: unref(runMode),
690
597
  "onUpdate:modelValue": ($event) => isRef(runMode) ? runMode.value = $event : null,
691
- items: runModeItems,
692
- disabled: unref(running),
598
+ items: unref(runModeItems),
693
599
  class: "w-full"
694
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
600
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "items"])
695
601
  ]),
696
602
  _: 1
697
603
  }),
@@ -708,9 +614,8 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
708
614
  type: "number",
709
615
  min: "1",
710
616
  max: "1000",
711
- disabled: unref(running),
712
617
  class: "w-full"
713
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
618
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
714
619
  ]),
715
620
  _: 1
716
621
  }),
@@ -722,17 +627,32 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
722
627
  default: withCtx(() => [
723
628
  createVNode(_component_USwitch, {
724
629
  modelValue: unref(trace),
725
- "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null,
726
- disabled: unref(running)
727
- }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
630
+ "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null
631
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
728
632
  ]),
729
633
  _: 1
730
634
  })
731
635
  ]),
732
- unref(missingSpecs).length > 0 ? (openBlock(), createBlock(_component_UAlert, {
636
+ unref(playwrightMissing) ? (openBlock(), createBlock(_component_UAlert, {
733
637
  key: 0,
734
638
  color: "warning",
735
639
  variant: "soft",
640
+ icon: "i-lucide-package-x",
641
+ title: "No Playwright installation found"
642
+ }, {
643
+ description: withCtx(() => [
644
+ createTextVNode(" Neither "),
645
+ createVNode("code", { class: "text-xs" }, toDisplayString(unref(link)?.path), 1),
646
+ createTextVNode(" nor its parents hold a "),
647
+ createVNode("code", { class: "text-xs" }, "node_modules"),
648
+ createTextVNode(" with Playwright. Run your package manager's install in the checkout first — the app executes that folder's own Playwright. ")
649
+ ]),
650
+ _: 1
651
+ })) : createCommentVNode("", true),
652
+ unref(missingSpecs).length > 0 ? (openBlock(), createBlock(_component_UAlert, {
653
+ key: 1,
654
+ color: "warning",
655
+ variant: "soft",
736
656
  icon: "i-lucide-file-question",
737
657
  title: unref(wrongFolder) ? "None of these tests are in the linked folder" : "Some tests are not in the linked folder"
738
658
  }, {
@@ -760,14 +680,13 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
760
680
  icon: "i-lucide-folder-search",
761
681
  class: "mt-2",
762
682
  loading: unref(busy),
763
- disabled: unref(running),
764
683
  onClick: unref(pickAndLink)
765
684
  }, {
766
685
  default: withCtx(() => [
767
686
  createTextVNode(" Choose the right folder… ")
768
687
  ]),
769
688
  _: 1
770
- }, 8, ["loading", "disabled", "onClick"])) : createCommentVNode("", true)
689
+ }, 8, ["loading", "onClick"])) : createCommentVNode("", true)
771
690
  ]),
772
691
  _: 1
773
692
  }, 8, ["title"])) : createCommentVNode("", true),
@@ -778,24 +697,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
778
697
  lang: "sh"
779
698
  }, null, 8, ["code"])
780
699
  ]),
781
- createVNode("p", { class: "text-xs text-muted" }, " Results are reported by the folder's own Playwright config — with the Piwi reporter set up, the new run appears in this app automatically. "),
782
- unref(status) !== "idle" ? (openBlock(), createBlock("div", {
783
- key: 1,
784
- class: "space-y-2"
785
- }, [
786
- createVNode("div", {
787
- ref_key: "outputEl",
788
- ref: outputEl,
789
- class: "h-64 overflow-y-auto rounded-md bg-zinc-950 p-3"
790
- }, [
791
- (openBlock(true), createBlock(Fragment, null, renderList(unref(lines), (line, i) => {
792
- return openBlock(), createBlock("p", {
793
- key: i,
794
- class: ["font-mono text-xs whitespace-pre-wrap", line.error ? "text-red-400" : "text-zinc-300"]
795
- }, toDisplayString(line.text || " "), 3);
796
- }), 128))
797
- ], 512)
798
- ])) : createCommentVNode("", true)
700
+ createVNode("p", { class: "text-xs text-muted" }, " The run streams into the Local runs tray and keeps going while you browse. Results are reported by the folder's own Playwright config — with the Piwi reporter set up, the new run appears in this app automatically. ")
799
701
  ], 64))
800
702
  ])
801
703
  ];
@@ -803,27 +705,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
803
705
  }),
804
706
  footer: withCtx((_, _push2, _parent2, _scopeId) => {
805
707
  if (_push2) {
806
- _push2(`<div class="flex items-center justify-between w-full gap-3"${_scopeId}>`);
807
- if (unref(statusBadge)) {
808
- _push2(ssrRenderComponent(_component_UBadge, {
809
- color: unref(statusBadge).color,
810
- variant: "subtle"
811
- }, {
812
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
813
- if (_push3) {
814
- _push3(`${ssrInterpolate(unref(statusBadge).label)}`);
815
- } else {
816
- return [
817
- createTextVNode(toDisplayString(unref(statusBadge).label), 1)
818
- ];
819
- }
820
- }),
821
- _: 1
822
- }, _parent2, _scopeId));
823
- } else {
824
- _push2(`<span${_scopeId}></span>`);
825
- }
826
- _push2(`<div class="flex items-center gap-2"${_scopeId}>`);
708
+ _push2(`<div class="flex items-center justify-end w-full gap-2"${_scopeId}>`);
827
709
  _push2(ssrRenderComponent(_component_UButton, {
828
710
  color: "neutral",
829
711
  variant: "ghost",
@@ -840,88 +722,46 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
840
722
  }),
841
723
  _: 1
842
724
  }, _parent2, _scopeId));
843
- if (unref(running)) {
844
- _push2(ssrRenderComponent(_component_UButton, {
845
- color: "error",
846
- icon: "i-lucide-square",
847
- onClick: ($event) => unref(stop)()
848
- }, {
849
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
850
- if (_push3) {
851
- _push3(`Stop`);
852
- } else {
853
- return [
854
- createTextVNode("Stop")
855
- ];
856
- }
857
- }),
858
- _: 1
859
- }, _parent2, _scopeId));
860
- } else {
861
- _push2(ssrRenderComponent(_component_UButton, {
862
- icon: "i-lucide-play",
863
- disabled: !unref(linked) || unref(plan).length === 0 || unref(busy),
864
- onClick: ($event) => run()
865
- }, {
866
- default: withCtx((_2, _push3, _parent3, _scopeId2) => {
867
- if (_push3) {
868
- _push3(`${ssrInterpolate(unref(status) === "idle" ? "Run" : "Run again")}`);
869
- } else {
870
- return [
871
- createTextVNode(toDisplayString(unref(status) === "idle" ? "Run" : "Run again"), 1)
872
- ];
873
- }
874
- }),
875
- _: 1
876
- }, _parent2, _scopeId));
877
- }
878
- _push2(`</div></div>`);
725
+ _push2(ssrRenderComponent(_component_UButton, {
726
+ icon: "i-lucide-play",
727
+ disabled: !unref(linked) || unref(plan).length === 0 || unref(busy),
728
+ onClick: ($event) => run()
729
+ }, {
730
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
731
+ if (_push3) {
732
+ _push3(`Run`);
733
+ } else {
734
+ return [
735
+ createTextVNode("Run")
736
+ ];
737
+ }
738
+ }),
739
+ _: 1
740
+ }, _parent2, _scopeId));
741
+ _push2(`</div>`);
879
742
  } else {
880
743
  return [
881
- createVNode("div", { class: "flex items-center justify-between w-full gap-3" }, [
882
- unref(statusBadge) ? (openBlock(), createBlock(_component_UBadge, {
883
- key: 0,
884
- color: unref(statusBadge).color,
885
- variant: "subtle"
744
+ createVNode("div", { class: "flex items-center justify-end w-full gap-2" }, [
745
+ createVNode(_component_UButton, {
746
+ color: "neutral",
747
+ variant: "ghost",
748
+ onClick: ($event) => open.value = false
886
749
  }, {
887
750
  default: withCtx(() => [
888
- createTextVNode(toDisplayString(unref(statusBadge).label), 1)
751
+ createTextVNode("Close")
889
752
  ]),
890
753
  _: 1
891
- }, 8, ["color"])) : (openBlock(), createBlock("span", { key: 1 })),
892
- createVNode("div", { class: "flex items-center gap-2" }, [
893
- createVNode(_component_UButton, {
894
- color: "neutral",
895
- variant: "ghost",
896
- onClick: ($event) => open.value = false
897
- }, {
898
- default: withCtx(() => [
899
- createTextVNode("Close")
900
- ]),
901
- _: 1
902
- }, 8, ["onClick"]),
903
- unref(running) ? (openBlock(), createBlock(_component_UButton, {
904
- key: 0,
905
- color: "error",
906
- icon: "i-lucide-square",
907
- onClick: ($event) => unref(stop)()
908
- }, {
909
- default: withCtx(() => [
910
- createTextVNode("Stop")
911
- ]),
912
- _: 1
913
- }, 8, ["onClick"])) : (openBlock(), createBlock(_component_UButton, {
914
- key: 1,
915
- icon: "i-lucide-play",
916
- disabled: !unref(linked) || unref(plan).length === 0 || unref(busy),
917
- onClick: ($event) => run()
918
- }, {
919
- default: withCtx(() => [
920
- createTextVNode(toDisplayString(unref(status) === "idle" ? "Run" : "Run again"), 1)
921
- ]),
922
- _: 1
923
- }, 8, ["disabled", "onClick"]))
924
- ])
754
+ }, 8, ["onClick"]),
755
+ createVNode(_component_UButton, {
756
+ icon: "i-lucide-play",
757
+ disabled: !unref(linked) || unref(plan).length === 0 || unref(busy),
758
+ onClick: ($event) => run()
759
+ }, {
760
+ default: withCtx(() => [
761
+ createTextVNode("Run")
762
+ ]),
763
+ _: 1
764
+ }, 8, ["disabled", "onClick"])
925
765
  ])
926
766
  ];
927
767
  }
@@ -931,48 +771,334 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
931
771
  };
932
772
  }
933
773
  });
934
- const _sfc_setup$5 = _sfc_main$5.setup;
935
- _sfc_main$5.setup = (props, ctx) => {
774
+ const _sfc_setup$1 = _sfc_main$1.setup;
775
+ _sfc_main$1.setup = (props, ctx) => {
936
776
  const ssrContext = useSSRContext();
937
777
  (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/desktop/DesktopRunLocallyModal.vue");
938
- return _sfc_setup$5 ? _sfc_setup$5(props, ctx) : void 0;
778
+ return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
939
779
  };
940
- const __nuxt_component_2 = Object.assign(_sfc_main$5, { __name: "DesktopRunLocallyModal" });
941
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
780
+ const __nuxt_component_4 = Object.assign(_sfc_main$1, { __name: "DesktopRunLocallyModal" });
781
+ const FLASH_MS = 8e3;
782
+ const _sfc_main = /* @__PURE__ */ defineComponent({
942
783
  __name: "DesktopRunLocallyButton",
943
784
  __ssrInlineRender: true,
944
785
  props: {
945
786
  projectId: {},
946
787
  projectLabel: {},
947
- cases: {}
788
+ cases: {},
789
+ label: {},
790
+ presetOptions: {}
948
791
  },
949
792
  setup(__props) {
950
793
  const props = __props;
951
794
  const available = ref(false);
952
- const open = ref(false);
795
+ const store = useDesktopLocalRuns();
796
+ const { link, busy, pickAndLink, refresh } = useDesktopProjectLink(() => props.projectId);
797
+ const { missingSpecs, wrongFolder, checkSpecs } = useDesktopSpecCheck(
798
+ () => props.projectId,
799
+ () => props.cases
800
+ );
801
+ const { playwrightMissing, checkEnv } = useDesktopEnvCheck(() => props.projectId);
802
+ const { copy } = useCopy();
803
+ const modalOpen = ref(false);
804
+ watch(modalOpen, (isOpen) => {
805
+ if (!isOpen) void refresh();
806
+ });
953
807
  const canRun = computed(() => available.value && props.projectId != null && props.cases.length > 0);
808
+ const linked = computed(() => !!link.value?.exists);
809
+ const attention = computed(() => !linked.value || wrongFolder.value || playwrightMissing.value);
810
+ watch([available, () => link.value?.path, linked], () => {
811
+ if (!available.value) return;
812
+ void checkSpecs(linked.value);
813
+ void checkEnv();
814
+ });
815
+ const options = computed(() => ({ ...store.getProjectOptions(props.projectId ?? ""), ...props.presetOptions }));
816
+ const contextRun = computed(() => store.latestForProject(props.projectId));
817
+ const running = computed(() => contextRun.value?.status === "running");
818
+ const now = useTimestamp({ interval: 1e3 });
819
+ const flashRun = computed(() => {
820
+ const run = contextRun.value;
821
+ if (!run || !run.finishedAt || run.status !== "passed" && run.status !== "failed") return null;
822
+ return now.value - run.finishedAt < FLASH_MS ? run : null;
823
+ });
824
+ const testsLabel = computed(() => `${props.cases.length} test${props.cases.length === 1 ? "" : "s"}`);
825
+ const runModeLabel = computed(
826
+ () => LOCAL_RUN_MODE_ITEMS.find((i) => i.value === options.value.runMode)?.label ?? "Headless"
827
+ );
828
+ const face = computed(() => {
829
+ const run = contextRun.value;
830
+ if (run && running.value) {
831
+ return {
832
+ label: localRunProgressLabel(run),
833
+ color: "info",
834
+ icon: void 0,
835
+ tooltip: "A local run is going — view its output"
836
+ };
837
+ }
838
+ if (flashRun.value) {
839
+ const passed = flashRun.value.status === "passed";
840
+ return {
841
+ label: passed ? "Passed" : flashRun.value.exitCode != null ? `Failed (exit ${flashRun.value.exitCode})` : "Failed",
842
+ color: passed ? "success" : "error",
843
+ icon: passed ? "i-lucide-check" : "i-lucide-x",
844
+ tooltip: "View the run output"
845
+ };
846
+ }
847
+ if (!linked.value) {
848
+ return {
849
+ label: props.label ?? "Run locally",
850
+ color: "warning",
851
+ icon: "i-lucide-monitor-play",
852
+ tooltip: "Link this project to its local checkout to run tests here"
853
+ };
854
+ }
855
+ return {
856
+ label: props.label ?? "Run locally",
857
+ color: "warning",
858
+ icon: "i-lucide-monitor-play",
859
+ tooltip: `Run ${testsLabel.value} on this machine · ${runModeLabel.value} · in ${link.value?.path}`
860
+ };
861
+ });
862
+ function runNow(patch) {
863
+ if (props.projectId == null) return;
864
+ store.startRun({
865
+ projectId: props.projectId,
866
+ projectLabel: props.projectLabel,
867
+ cases: props.cases,
868
+ options: { ...props.presetOptions, ...patch },
869
+ persistOptions: props.presetOptions ? false : void 0
870
+ });
871
+ }
872
+ function onPrimaryClick() {
873
+ if (running.value || flashRun.value) {
874
+ store.trayOpen.value = true;
875
+ return;
876
+ }
877
+ if (attention.value) {
878
+ modalOpen.value = true;
879
+ return;
880
+ }
881
+ runNow();
882
+ }
883
+ function saveOption(patch) {
884
+ if (props.projectId != null) store.saveProjectOptions(props.projectId, patch);
885
+ }
886
+ const REPEAT_CHOICES = [1, 5, 10, 20, 50, 100];
887
+ const menuItems = computed(() => {
888
+ const groups = [];
889
+ if (!linked.value) {
890
+ groups.push([
891
+ { type: "label", label: link.value ? "The linked folder is missing" : "No folder linked yet" },
892
+ { label: "Choose folder…", icon: "i-lucide-folder-plus", onSelect: () => void pickAndLink() }
893
+ ]);
894
+ } else if (wrongFolder.value) {
895
+ groups.push([
896
+ { type: "label", label: "Tests not found in the linked folder" },
897
+ { label: "Choose the right folder…", icon: "i-lucide-folder-search", onSelect: () => void pickAndLink() },
898
+ { label: "Run anyway", icon: "i-lucide-play", onSelect: () => runNow() }
899
+ ]);
900
+ } else if (playwrightMissing.value) {
901
+ groups.push([
902
+ { type: "label", label: "No Playwright found in the linked folder" },
903
+ {
904
+ label: "Re-check after installing",
905
+ icon: "i-lucide-refresh-cw",
906
+ onSelect: (e) => {
907
+ e.preventDefault();
908
+ void checkEnv();
909
+ }
910
+ },
911
+ { label: "Run anyway", icon: "i-lucide-play", onSelect: () => runNow() }
912
+ ]);
913
+ }
914
+ if (linked.value) {
915
+ groups.push([
916
+ { type: "label", label: `Run ${testsLabel.value}` },
917
+ ...LOCAL_RUN_MODE_ITEMS.map((mode) => ({
918
+ label: mode.label,
919
+ icon: mode.icon,
920
+ type: "checkbox",
921
+ checked: options.value.runMode === mode.value,
922
+ disabled: running.value,
923
+ onSelect: () => runNow({ runMode: mode.value })
924
+ }))
925
+ ]);
926
+ groups.push([
927
+ {
928
+ label: "Record trace",
929
+ icon: "i-lucide-film",
930
+ type: "checkbox",
931
+ checked: options.value.trace,
932
+ onSelect: (e) => {
933
+ e.preventDefault();
934
+ saveOption({ trace: !options.value.trace });
935
+ }
936
+ },
937
+ {
938
+ label: `Repeat each (× ${options.value.repeatEach})`,
939
+ icon: "i-lucide-repeat",
940
+ children: REPEAT_CHOICES.map((n) => ({
941
+ label: `× ${n}`,
942
+ type: "checkbox",
943
+ checked: options.value.repeatEach === n,
944
+ onSelect: (e) => {
945
+ e.preventDefault();
946
+ saveOption({ repeatEach: n });
947
+ }
948
+ }))
949
+ },
950
+ {
951
+ label: "Select tests by",
952
+ icon: "i-lucide-list-filter",
953
+ children: RETRY_MODE_ITEMS.map((mode) => ({
954
+ label: mode.label,
955
+ type: "checkbox",
956
+ checked: options.value.mode === mode.value,
957
+ onSelect: (e) => {
958
+ e.preventDefault();
959
+ saveOption({ mode: mode.value });
960
+ }
961
+ }))
962
+ }
963
+ ]);
964
+ groups.push([
965
+ { label: "Run with options…", icon: "i-lucide-sliders-horizontal", onSelect: () => modalOpen.value = true },
966
+ {
967
+ label: "Copy as command",
968
+ icon: "i-lucide-clipboard",
969
+ onSelect: () => void copy(buildRetryCommand(props.cases, { mode: options.value.mode }), { toast: "Command copied" })
970
+ }
971
+ ]);
972
+ }
973
+ groups.push([
974
+ {
975
+ label: store.activeCount.value > 0 ? `Local runs (${store.activeCount.value} active)` : "Local runs",
976
+ icon: "i-lucide-terminal",
977
+ onSelect: () => store.trayOpen.value = true
978
+ }
979
+ ]);
980
+ if (linked.value && !wrongFolder.value && missingSpecs.value.length > 0) {
981
+ groups[groups.length - 1].unshift({
982
+ type: "label",
983
+ label: `${missingSpecs.value.length} spec${missingSpecs.value.length === 1 ? "" : "s"} not in the linked folder`
984
+ });
985
+ }
986
+ if (linked.value) {
987
+ groups.push([
988
+ { type: "label", label: link.value.path, class: "font-mono text-[11px] break-all font-normal" },
989
+ { label: "Change linked folder…", icon: "i-lucide-folder-search", onSelect: () => void pickAndLink() }
990
+ ]);
991
+ }
992
+ return groups;
993
+ });
954
994
  return (_ctx, _push, _parent, _attrs) => {
955
- const _component_UTooltip = _sfc_main$8;
995
+ const _component_UFieldGroup = _sfc_main$2;
996
+ const _component_UTooltip = _sfc_main$3;
956
997
  const _component_UButton = _sfc_main$k;
957
- const _component_DesktopRunLocallyModal = __nuxt_component_2;
998
+ const _component_UDropdownMenu = _sfc_main$a;
999
+ const _component_DesktopRunLocallyModal = __nuxt_component_4;
958
1000
  if (unref(canRun)) {
959
1001
  _push(`<span${ssrRenderAttrs(mergeProps({ class: "inline-flex" }, _attrs))}>`);
960
- _push(ssrRenderComponent(_component_UTooltip, { text: "Run these tests on this machine" }, {
1002
+ _push(ssrRenderComponent(_component_UFieldGroup, { size: "xs" }, {
961
1003
  default: withCtx((_, _push2, _parent2, _scopeId) => {
962
1004
  if (_push2) {
963
- _push2(ssrRenderComponent(_component_UButton, {
964
- size: "xs",
965
- color: "warning",
966
- variant: "subtle",
967
- icon: "i-lucide-monitor-play",
968
- onClick: ($event) => open.value = true
1005
+ _push2(ssrRenderComponent(_component_UTooltip, {
1006
+ text: unref(face).tooltip
969
1007
  }, {
970
1008
  default: withCtx((_2, _push3, _parent3, _scopeId2) => {
971
1009
  if (_push3) {
972
- _push3(` Run locally `);
1010
+ _push3(ssrRenderComponent(_component_UButton, {
1011
+ size: "xs",
1012
+ color: unref(face).color,
1013
+ variant: "subtle",
1014
+ icon: unref(face).icon,
1015
+ loading: unref(running),
1016
+ disabled: unref(busy),
1017
+ onClick: onPrimaryClick
1018
+ }, {
1019
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1020
+ if (_push4) {
1021
+ _push4(`${ssrInterpolate(unref(face).label)}`);
1022
+ } else {
1023
+ return [
1024
+ createTextVNode(toDisplayString(unref(face).label), 1)
1025
+ ];
1026
+ }
1027
+ }),
1028
+ _: 1
1029
+ }, _parent3, _scopeId2));
973
1030
  } else {
974
1031
  return [
975
- createTextVNode(" Run locally ")
1032
+ createVNode(_component_UButton, {
1033
+ size: "xs",
1034
+ color: unref(face).color,
1035
+ variant: "subtle",
1036
+ icon: unref(face).icon,
1037
+ loading: unref(running),
1038
+ disabled: unref(busy),
1039
+ onClick: onPrimaryClick
1040
+ }, {
1041
+ default: withCtx(() => [
1042
+ createTextVNode(toDisplayString(unref(face).label), 1)
1043
+ ]),
1044
+ _: 1
1045
+ }, 8, ["color", "icon", "loading", "disabled"])
1046
+ ];
1047
+ }
1048
+ }),
1049
+ _: 1
1050
+ }, _parent2, _scopeId));
1051
+ _push2(ssrRenderComponent(_component_UDropdownMenu, {
1052
+ items: unref(menuItems),
1053
+ content: { align: "end" },
1054
+ ui: { content: "min-w-56" }
1055
+ }, {
1056
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
1057
+ if (_push3) {
1058
+ _push3(ssrRenderComponent(_component_UButton, {
1059
+ size: "xs",
1060
+ color: unref(face).color,
1061
+ variant: "subtle",
1062
+ icon: "i-lucide-chevron-down",
1063
+ "aria-label": "Run options",
1064
+ class: "relative"
1065
+ }, {
1066
+ default: withCtx((_3, _push4, _parent4, _scopeId3) => {
1067
+ if (_push4) {
1068
+ if (unref(attention)) {
1069
+ _push4(`<span class="absolute -top-1 -right-1 size-2 rounded-full bg-warning"${_scopeId3}></span>`);
1070
+ } else {
1071
+ _push4(`<!---->`);
1072
+ }
1073
+ } else {
1074
+ return [
1075
+ unref(attention) ? (openBlock(), createBlock("span", {
1076
+ key: 0,
1077
+ class: "absolute -top-1 -right-1 size-2 rounded-full bg-warning"
1078
+ })) : createCommentVNode("", true)
1079
+ ];
1080
+ }
1081
+ }),
1082
+ _: 1
1083
+ }, _parent3, _scopeId2));
1084
+ } else {
1085
+ return [
1086
+ createVNode(_component_UButton, {
1087
+ size: "xs",
1088
+ color: unref(face).color,
1089
+ variant: "subtle",
1090
+ icon: "i-lucide-chevron-down",
1091
+ "aria-label": "Run options",
1092
+ class: "relative"
1093
+ }, {
1094
+ default: withCtx(() => [
1095
+ unref(attention) ? (openBlock(), createBlock("span", {
1096
+ key: 0,
1097
+ class: "absolute -top-1 -right-1 size-2 rounded-full bg-warning"
1098
+ })) : createCommentVNode("", true)
1099
+ ]),
1100
+ _: 1
1101
+ }, 8, ["color"])
976
1102
  ];
977
1103
  }
978
1104
  }),
@@ -980,26 +1106,60 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
980
1106
  }, _parent2, _scopeId));
981
1107
  } else {
982
1108
  return [
983
- createVNode(_component_UButton, {
984
- size: "xs",
985
- color: "warning",
986
- variant: "subtle",
987
- icon: "i-lucide-monitor-play",
988
- onClick: ($event) => open.value = true
1109
+ createVNode(_component_UTooltip, {
1110
+ text: unref(face).tooltip
989
1111
  }, {
990
1112
  default: withCtx(() => [
991
- createTextVNode(" Run locally ")
1113
+ createVNode(_component_UButton, {
1114
+ size: "xs",
1115
+ color: unref(face).color,
1116
+ variant: "subtle",
1117
+ icon: unref(face).icon,
1118
+ loading: unref(running),
1119
+ disabled: unref(busy),
1120
+ onClick: onPrimaryClick
1121
+ }, {
1122
+ default: withCtx(() => [
1123
+ createTextVNode(toDisplayString(unref(face).label), 1)
1124
+ ]),
1125
+ _: 1
1126
+ }, 8, ["color", "icon", "loading", "disabled"])
992
1127
  ]),
993
1128
  _: 1
994
- }, 8, ["onClick"])
1129
+ }, 8, ["text"]),
1130
+ createVNode(_component_UDropdownMenu, {
1131
+ items: unref(menuItems),
1132
+ content: { align: "end" },
1133
+ ui: { content: "min-w-56" }
1134
+ }, {
1135
+ default: withCtx(() => [
1136
+ createVNode(_component_UButton, {
1137
+ size: "xs",
1138
+ color: unref(face).color,
1139
+ variant: "subtle",
1140
+ icon: "i-lucide-chevron-down",
1141
+ "aria-label": "Run options",
1142
+ class: "relative"
1143
+ }, {
1144
+ default: withCtx(() => [
1145
+ unref(attention) ? (openBlock(), createBlock("span", {
1146
+ key: 0,
1147
+ class: "absolute -top-1 -right-1 size-2 rounded-full bg-warning"
1148
+ })) : createCommentVNode("", true)
1149
+ ]),
1150
+ _: 1
1151
+ }, 8, ["color"])
1152
+ ]),
1153
+ _: 1
1154
+ }, 8, ["items"])
995
1155
  ];
996
1156
  }
997
1157
  }),
998
1158
  _: 1
999
1159
  }, _parent));
1000
1160
  _push(ssrRenderComponent(_component_DesktopRunLocallyModal, {
1001
- open: unref(open),
1002
- "onUpdate:open": ($event) => isRef(open) ? open.value = $event : null,
1161
+ open: unref(modalOpen),
1162
+ "onUpdate:open": ($event) => isRef(modalOpen) ? modalOpen.value = $event : null,
1003
1163
  "project-id": __props.projectId,
1004
1164
  "project-label": __props.projectLabel,
1005
1165
  cases: __props.cases
@@ -1011,195 +1171,13 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
1011
1171
  };
1012
1172
  }
1013
1173
  });
1014
- const _sfc_setup$4 = _sfc_main$4.setup;
1015
- _sfc_main$4.setup = (props, ctx) => {
1016
- const ssrContext = useSSRContext();
1017
- (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/desktop/DesktopRunLocallyButton.vue");
1018
- return _sfc_setup$4 ? _sfc_setup$4(props, ctx) : void 0;
1019
- };
1020
- const __nuxt_component_14 = Object.assign(_sfc_main$4, { __name: "DesktopRunLocallyButton" });
1021
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
1022
- __name: "DetailPageLayout",
1023
- __ssrInlineRender: true,
1024
- props: /* @__PURE__ */ mergeModels({
1025
- tabItems: {},
1026
- tabPanelClass: {}
1027
- }, {
1028
- "modelValue": { required: true },
1029
- "modelModifiers": {}
1030
- }),
1031
- emits: ["update:modelValue"],
1032
- setup(__props) {
1033
- const props = __props;
1034
- const activeTab = useModel(__props, "modelValue");
1035
- const summaryCollapsed = ref(false);
1036
- const activeTabIcon = computed(() => props.tabItems.find((t) => t.value === activeTab.value)?.icon);
1037
- function panelClasses(value) {
1038
- const desktop = props.tabPanelClass?.[value] ?? "overflow-y-auto";
1039
- return ["min-h-0", "lg:flex-1", desktop, "max-lg:!block", "max-lg:!overflow-visible"];
1040
- }
1041
- return (_ctx, _push, _parent, _attrs) => {
1042
- const _component_UIcon = _sfc_main$p;
1043
- const _component_USelect = _sfc_main$6;
1044
- const _component_UTabs = _sfc_main$7;
1045
- _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-col h-full gap-4 p-1 max-lg:overflow-y-auto lg:overflow-hidden" }, _attrs))}>`);
1046
- if (_ctx.$slots.summary) {
1047
- _push(`<div class="lg:shrink-0"><div class="${ssrRenderClass(unref(summaryCollapsed) ? "max-lg:hidden" : "")}">`);
1048
- ssrRenderSlot(_ctx.$slots, "summary", {}, null, _push, _parent);
1049
- _push(`</div><button type="button" class="lg:hidden mt-2 w-full flex items-center justify-center gap-1 rounded-md border border-default py-1.5 text-xs font-medium text-muted hover:bg-elevated/60 transition-colors">`);
1050
- _push(ssrRenderComponent(_component_UIcon, {
1051
- name: unref(summaryCollapsed) ? "i-lucide-chevron-down" : "i-lucide-chevron-up",
1052
- class: "size-3.5"
1053
- }, null, _parent));
1054
- _push(` ${ssrInterpolate(unref(summaryCollapsed) ? "Show summary" : "Hide summary")}</button></div>`);
1055
- } else {
1056
- _push(`<!---->`);
1057
- }
1058
- _push(`<div class="lg:shrink-0 max-lg:sticky max-lg:top-0 max-lg:z-10 max-lg:-mx-1 max-lg:bg-(--ui-bg-canvas) max-lg:px-1 max-lg:py-1.5">`);
1059
- _push(ssrRenderComponent(_component_USelect, {
1060
- modelValue: activeTab.value,
1061
- "onUpdate:modelValue": ($event) => activeTab.value = $event,
1062
- items: __props.tabItems,
1063
- icon: unref(activeTabIcon),
1064
- size: "md",
1065
- class: "w-full sm:hidden"
1066
- }, null, _parent));
1067
- _push(ssrRenderComponent(_component_UTabs, {
1068
- modelValue: activeTab.value,
1069
- "onUpdate:modelValue": ($event) => activeTab.value = $event,
1070
- items: __props.tabItems,
1071
- size: "sm",
1072
- class: "hidden sm:flex",
1073
- ui: { list: "overflow-x-auto", trigger: "shrink-0" }
1074
- }, null, _parent));
1075
- _push(`</div><!--[-->`);
1076
- ssrRenderList(__props.tabItems, (item) => {
1077
- _push(`<!--[-->`);
1078
- if (activeTab.value === item.value) {
1079
- _push(`<div class="${ssrRenderClass(panelClasses(item.value))}">`);
1080
- ssrRenderSlot(_ctx.$slots, `tab-${item.slot ?? item.value}`, {}, null, _push, _parent);
1081
- _push(`</div>`);
1082
- } else {
1083
- _push(`<!---->`);
1084
- }
1085
- _push(`<!--]-->`);
1086
- });
1087
- _push(`<!--]--></div>`);
1088
- };
1089
- }
1090
- });
1091
- const _sfc_setup$3 = _sfc_main$3.setup;
1092
- _sfc_main$3.setup = (props, ctx) => {
1093
- const ssrContext = useSSRContext();
1094
- (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/DetailPageLayout.vue");
1095
- return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
1096
- };
1097
- const __nuxt_component_8 = Object.assign(_sfc_main$3, { __name: "DetailPageLayout" });
1098
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1099
- __name: "StatusChip",
1100
- __ssrInlineRender: true,
1101
- props: {
1102
- status: {},
1103
- size: {}
1104
- },
1105
- setup(__props) {
1106
- return (_ctx, _push, _parent, _attrs) => {
1107
- const _component_UBadge = _sfc_main$7$1;
1108
- const _component_UIcon = _sfc_main$p;
1109
- _push(ssrRenderComponent(_component_UBadge, mergeProps({
1110
- color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(__props.status),
1111
- size: __props.size,
1112
- variant: "subtle",
1113
- class: "capitalize gap-1 items-center font-semibold shrink-0"
1114
- }, _attrs), {
1115
- default: withCtx((_, _push2, _parent2, _scopeId) => {
1116
- if (_push2) {
1117
- _push2(ssrRenderComponent(_component_UIcon, {
1118
- name: ("getStatusIcon" in _ctx ? _ctx.getStatusIcon : unref(getStatusIcon))(__props.status),
1119
- class: ["size-3.5 shrink-0", { "animate-spin": ("isStatusInFlight" in _ctx ? _ctx.isStatusInFlight : unref(isStatusInFlight))(__props.status) }]
1120
- }, null, _parent2, _scopeId));
1121
- _push2(` ${ssrInterpolate(("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(__props.status))}`);
1122
- } else {
1123
- return [
1124
- createVNode(_component_UIcon, {
1125
- name: ("getStatusIcon" in _ctx ? _ctx.getStatusIcon : unref(getStatusIcon))(__props.status),
1126
- class: ["size-3.5 shrink-0", { "animate-spin": ("isStatusInFlight" in _ctx ? _ctx.isStatusInFlight : unref(isStatusInFlight))(__props.status) }]
1127
- }, null, 8, ["name", "class"]),
1128
- createTextVNode(" " + toDisplayString(("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(__props.status)), 1)
1129
- ];
1130
- }
1131
- }),
1132
- _: 1
1133
- }, _parent));
1134
- };
1135
- }
1136
- });
1137
- const _sfc_setup$2 = _sfc_main$2.setup;
1138
- _sfc_main$2.setup = (props, ctx) => {
1139
- const ssrContext = useSSRContext();
1140
- (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/StatusChip.vue");
1141
- return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
1142
- };
1143
- const __nuxt_component_1 = Object.assign(_sfc_main$2, { __name: "StatusChip" });
1144
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1145
- __name: "SummaryMetaStrip",
1146
- __ssrInlineRender: true,
1147
- setup(__props) {
1148
- return (_ctx, _push, _parent, _attrs) => {
1149
- _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-wrap items-center gap-y-1 text-sm min-w-0" }, _attrs))}>`);
1150
- ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent);
1151
- _push(`</div>`);
1152
- };
1153
- }
1154
- });
1155
- const _sfc_setup$1 = _sfc_main$1.setup;
1156
- _sfc_main$1.setup = (props, ctx) => {
1157
- const ssrContext = useSSRContext();
1158
- (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/SummaryMetaStrip.vue");
1159
- return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
1160
- };
1161
- const __nuxt_component_16 = Object.assign(_sfc_main$1, { __name: "SummaryMetaStrip" });
1162
- const _sfc_main = /* @__PURE__ */ defineComponent({
1163
- __name: "MetaStripGroup",
1164
- __ssrInlineRender: true,
1165
- props: {
1166
- label: {},
1167
- icon: {},
1168
- help: {}
1169
- },
1170
- setup(__props) {
1171
- return (_ctx, _push, _parent, _attrs) => {
1172
- const _component_UIcon = _sfc_main$p;
1173
- const _component_HelpHint = __nuxt_component_2$1;
1174
- _push(`<div${ssrRenderAttrs(mergeProps({
1175
- class: "inline-flex items-center flex-wrap gap-x-1.5 gap-y-1 min-w-0 py-0.5 mr-3 [&:not(:first-child)]:border-l [&:not(:first-child)]:border-default [&:not(:first-child)]:pl-3",
1176
- title: __props.label
1177
- }, _attrs))}>`);
1178
- if (__props.icon) {
1179
- _push(ssrRenderComponent(_component_UIcon, {
1180
- name: __props.icon,
1181
- class: "w-3.5 h-3.5 text-dimmed shrink-0"
1182
- }, null, _parent));
1183
- } else {
1184
- _push(`<!---->`);
1185
- }
1186
- ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent);
1187
- if (__props.help) {
1188
- _push(ssrRenderComponent(_component_HelpHint, { topic: __props.help }, null, _parent));
1189
- } else {
1190
- _push(`<!---->`);
1191
- }
1192
- _push(`</div>`);
1193
- };
1194
- }
1195
- });
1196
1174
  const _sfc_setup = _sfc_main.setup;
1197
1175
  _sfc_main.setup = (props, ctx) => {
1198
1176
  const ssrContext = useSSRContext();
1199
- (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/MetaStripGroup.vue");
1177
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/desktop/DesktopRunLocallyButton.vue");
1200
1178
  return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
1201
1179
  };
1202
- const __nuxt_component_17 = Object.assign(_sfc_main, { __name: "MetaStripGroup" });
1180
+ const __nuxt_component_14 = Object.assign(_sfc_main, { __name: "DesktopRunLocallyButton" });
1203
1181
 
1204
- export { __nuxt_component_8 as _, __nuxt_component_14 as a, __nuxt_component_1 as b, __nuxt_component_16 as c, __nuxt_component_17 as d };
1205
- //# sourceMappingURL=MetaStripGroup-BBByVvpR.mjs.map
1182
+ export { __nuxt_component_14 as _ };
1183
+ //# sourceMappingURL=DesktopRunLocallyButton-iNzrDsEs.mjs.map