@piwitests/server 0.19.0 → 0.20.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 (418) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{eptP4pGv.js → -f7BAm1H.js} +1 -1
  3. package/.output/public/_nuxt/{Bti38m-M.js → 4gYNA-d4.js} +1 -1
  4. package/.output/public/_nuxt/{CHEFCN8Q.js → 5A6ITZXj.js} +1 -1
  5. package/.output/public/_nuxt/{DoUy4UHi.js → 8PUUncmO.js} +2 -2
  6. package/.output/public/_nuxt/{DS636elg.js → A1pj0VnG.js} +1 -1
  7. package/.output/public/_nuxt/{B9WhzpKO.js → AbmKWFQQ.js} +1 -1
  8. package/.output/public/_nuxt/{rWNTSFD6.js → B3obW6cw.js} +3 -3
  9. package/.output/public/_nuxt/{Bu2aaVIY.js → B7FTvFWq.js} +1 -1
  10. package/.output/public/_nuxt/{CpjgB2aY.js → B8zkOmwo.js} +1 -1
  11. package/.output/public/_nuxt/B96M2gdj.js +1 -0
  12. package/.output/public/_nuxt/{FUXhyidq.js → B99fbi73.js} +1 -1
  13. package/.output/public/_nuxt/{DslPMqfa.js → B9OLmp0f.js} +1 -1
  14. package/.output/public/_nuxt/{BccXfBfI.js → BKkF4pPD.js} +1 -1
  15. package/.output/public/_nuxt/{DP8hfJ9h.js → BT3wGCTI.js} +1 -1
  16. package/.output/public/_nuxt/{B3B9Ii2A.js → BUa0V0Ly.js} +1 -1
  17. package/.output/public/_nuxt/{B3HO8kuh.js → BUkim3TM.js} +1 -1
  18. package/.output/public/_nuxt/{BVaxh6Nl.js → BVc14Ncz.js} +3 -3
  19. package/.output/public/_nuxt/{DW0xl3I6.js → BY0HxR3t.js} +1 -1
  20. package/.output/public/_nuxt/B_xAMWQS.js +2 -0
  21. package/.output/public/_nuxt/{C2_3mdPC.js → BdQoBaOv.js} +1 -1
  22. package/.output/public/_nuxt/{DT53RWbC.js → BdfhYr-u.js} +1 -1
  23. package/.output/public/_nuxt/{CtQBsNUb.js → BgRu_3tT.js} +1 -1
  24. package/.output/public/_nuxt/{SlIRLREZ.js → BiO7RBWb.js} +1 -1
  25. package/.output/public/_nuxt/BicAJ6U8.js +1 -0
  26. package/.output/public/_nuxt/{C7P1UCO2.js → Bm62iDV5.js} +1 -1
  27. package/.output/public/_nuxt/{CZfMdzfk.js → BmUfSNMV.js} +1 -1
  28. package/.output/public/_nuxt/{tvgqrYDd.js → Bnxf8nbZ.js} +1 -1
  29. package/.output/public/_nuxt/{ndShiWE8.js → Bow4tTR0.js} +1 -1
  30. package/.output/public/_nuxt/{D0HNloZ9.js → BrQEE053.js} +1 -1
  31. package/.output/public/_nuxt/{CV9-fTmY.js → BzRRzmwm.js} +1 -1
  32. package/.output/public/_nuxt/{DprVVyUQ.js → C0_yH0N7.js} +1 -1
  33. package/.output/public/_nuxt/{DLSrtpsA.js → C1gTN4Q8.js} +1 -1
  34. package/.output/public/_nuxt/{ClOqkAcc.js → C2hkrSey.js} +1 -1
  35. package/.output/public/_nuxt/{ZFiQCMUB.js → C8e1EbJI.js} +1 -1
  36. package/.output/public/_nuxt/{nv9-6vBK.js → CA9B2HE5.js} +1 -1
  37. package/.output/public/_nuxt/{KnfsST6Y.js → CAAwCT7H.js} +1 -1
  38. package/.output/public/_nuxt/{ybDYeNxd.js → CAvY22RE.js} +1 -1
  39. package/.output/public/_nuxt/{C5iG7O4O.js → CEfS4-oS.js} +1 -1
  40. package/.output/public/_nuxt/{Bp5ELvx9.js → CIoSMkpp.js} +1 -1
  41. package/.output/public/_nuxt/{C95YAaJq.js → CIrFl3MW.js} +1 -1
  42. package/.output/public/_nuxt/{DiOLdHBC.js → CJFtzlQ4.js} +1 -1
  43. package/.output/public/_nuxt/{BX9ZXe98.js → CNyV9YpI.js} +1 -1
  44. package/.output/public/_nuxt/CSJ-eOQM.js +1 -0
  45. package/.output/public/_nuxt/{fVcG504p.js → CTU1mrhq.js} +1 -1
  46. package/.output/public/_nuxt/{279D2RYp.js → CXEH9OPk.js} +1 -1
  47. package/.output/public/_nuxt/CahpB9Z2.js +5 -0
  48. package/.output/public/_nuxt/{B7NBP1C-.js → Cbh--1MW.js} +1 -1
  49. package/.output/public/_nuxt/CeG9pBAD.js +1 -0
  50. package/.output/public/_nuxt/{D55D4EYo.js → CeW8v31b.js} +1 -1
  51. package/.output/public/_nuxt/{BuMC3WjZ.js → CjPfj7ya.js} +1 -1
  52. package/.output/public/_nuxt/{HXerICAi.js → Cnsmicv2.js} +1 -1
  53. package/.output/public/_nuxt/{DgE2YE3R.js → CsLojMwR.js} +1 -1
  54. package/.output/public/_nuxt/{C9_jrmk9.js → Cus22Ud3.js} +2 -2
  55. package/.output/public/_nuxt/{DX-MDGb3.js → CwGWJbiy.js} +1 -1
  56. package/.output/public/_nuxt/{BJ0XQElc.js → Cx6gc2VW.js} +1 -1
  57. package/.output/public/_nuxt/{cHAnlQbv.js → CxyAzHr3.js} +1 -1
  58. package/.output/public/_nuxt/{BxCKKeYs.js → CzAPFPpL.js} +1 -1
  59. package/.output/public/_nuxt/{B33iXw77.js → D--H4jLI.js} +1 -1
  60. package/.output/public/_nuxt/D1POo6S4.js +10 -0
  61. package/.output/public/_nuxt/{BDicZ1gQ.js → D5tke0B5.js} +1 -1
  62. package/.output/public/_nuxt/D8nkF-OO.js +3 -0
  63. package/.output/public/_nuxt/{CzGyac8q.js → DA25RkyK.js} +1 -1
  64. package/.output/public/_nuxt/{CUtJobDm.js → DIB-5fUJ.js} +1 -1
  65. package/.output/public/_nuxt/{BPRffDuo.js → DJmoLeVt.js} +1 -1
  66. package/.output/public/_nuxt/{DGfAxLHV.js → DJxlKFGb.js} +1 -1
  67. package/.output/public/_nuxt/{81InBX9v.js → DMec-OLo.js} +1 -1
  68. package/.output/public/_nuxt/{CK_2LZBS.js → DPCxhHri.js} +1 -1
  69. package/.output/public/_nuxt/{Bn0YQDyy.js → DSqHUrvO.js} +1 -1
  70. package/.output/public/_nuxt/{BqV0l12c.js → DabzhQB1.js} +1 -1
  71. package/.output/public/_nuxt/{BfTuX0wq.js → DdwHkKfV.js} +1 -1
  72. package/.output/public/_nuxt/{C-elpgyr.js → DeY2JkR2.js} +1 -1
  73. package/.output/public/_nuxt/{DEFEpYzn.js → DfgOx_ou.js} +1 -1
  74. package/.output/public/_nuxt/DmkUdSS4.js +1 -0
  75. package/.output/public/_nuxt/{Ar3IelOY.js → DoIREDVb.js} +1 -1
  76. package/.output/public/_nuxt/DpZ1r1HA.js +1 -0
  77. package/.output/public/_nuxt/{Jo8kRmHz.js → Dpd16JVI.js} +1 -1
  78. package/.output/public/_nuxt/{BSIxhGsh.js → DqcKngf3.js} +1 -1
  79. package/.output/public/_nuxt/{BMvCSA6h.js → DrfE8IY0.js} +1 -1
  80. package/.output/public/_nuxt/{eaVkJRSa.js → DsesNydr.js} +1 -1
  81. package/.output/public/_nuxt/{zQyPuvV1.js → DtHJgCS8.js} +1 -1
  82. package/.output/public/_nuxt/Dtd4rC58.js +9 -0
  83. package/.output/public/_nuxt/{NQikbhmK.js → Du2W7Jne.js} +37 -36
  84. package/.output/public/_nuxt/{CDk0q2hV.js → DuwtTfO8.js} +1 -1
  85. package/.output/public/_nuxt/{B44A4LSJ.js → Dy-TJ0Mt.js} +1 -1
  86. package/.output/public/_nuxt/{-09h6CA9.js → Dy86h-7P.js} +1 -1
  87. package/.output/public/_nuxt/{Cdff9XNh.js → Dyeqn3aG.js} +1 -1
  88. package/.output/public/_nuxt/{Dnpkl-1q.js → FaFoMVKo.js} +1 -1
  89. package/.output/public/_nuxt/GPNI1ffD.js +4 -0
  90. package/.output/public/_nuxt/{BCMuIgP5.js → H94BMf3L.js} +1 -1
  91. package/.output/public/_nuxt/HPNQD6v3.js +1 -0
  92. package/.output/public/_nuxt/HXadJrHu.js +2 -0
  93. package/.output/public/_nuxt/{YVN7WG7q.js → KyA_4Ks-.js} +1 -1
  94. package/.output/public/_nuxt/{CYsTqbBS.js → L3kAWB2a.js} +1 -1
  95. package/.output/public/_nuxt/{Dk9fwOCm.js → McL25vkx.js} +2 -2
  96. package/.output/public/_nuxt/Nn93e_Mz.js +1 -0
  97. package/.output/public/_nuxt/UdR3DBPS.js +1 -0
  98. package/.output/public/_nuxt/{SfMRXW25.js → Und3xXFc.js} +1 -1
  99. package/.output/public/_nuxt/_mj6CfPa.js +1 -0
  100. package/.output/public/_nuxt/{BPQoBGg5.js → b-GYfcrQ.js} +1 -1
  101. package/.output/public/_nuxt/{DHDtnj7p.js → bLcjFslv.js} +1 -1
  102. package/.output/public/_nuxt/builds/latest.json +1 -1
  103. package/.output/public/_nuxt/builds/meta/e659b3e1-0e61-4971-940e-10063f9f4763.json +1 -0
  104. package/.output/public/_nuxt/entry.DmptwB51.css +1 -0
  105. package/.output/public/_nuxt/{y17lMTFy.js → hC_z4G8p.js} +1 -1
  106. package/.output/public/_nuxt/{CTxDO9fB.js → hNh4CIL0.js} +1 -1
  107. package/.output/public/_nuxt/{CGNkHojN.js → l5WKbU4h.js} +1 -1
  108. package/.output/public/_nuxt/{DcmZRa_F.js → oAClCn_h.js} +1 -1
  109. package/.output/public/_nuxt/{IvQlbZk6.js → pQqGiNch.js} +1 -1
  110. package/.output/public/_nuxt/ryMzSDUj.js +2 -0
  111. package/.output/server/chunks/_/collect.mjs +1 -1
  112. package/.output/server/chunks/_/markers.mjs +1 -1
  113. package/.output/server/chunks/_/quarantine.mjs +1 -1
  114. package/.output/server/chunks/_/users.mjs +1 -1
  115. package/.output/server/chunks/build/{BrowserBadge-D33lqUcj.mjs → BrowserBadge-MFvBwxmD.mjs} +66 -6
  116. package/.output/server/chunks/build/BrowserBadge-MFvBwxmD.mjs.map +1 -0
  117. package/.output/server/chunks/build/{Checkbox-DvUBGagc.mjs → Checkbox-4Q5d0fa0.mjs} +4 -4
  118. package/.output/server/chunks/build/Checkbox-4Q5d0fa0.mjs.map +1 -0
  119. package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs +1492 -0
  120. package/.output/server/chunks/build/CiEnvCard-DB5DvBh1.mjs.map +1 -0
  121. package/.output/server/chunks/build/CodeBlock-BgE-NSmE.mjs +1 -1
  122. package/.output/server/chunks/build/DashboardSidebarToggle-DCTnHiIv.mjs +1 -1
  123. package/.output/server/chunks/build/{DiagnosisPanel-B646dK4p.mjs → DiagnosisPanel-CALyEmcJ.mjs} +3 -3
  124. package/.output/server/chunks/build/DiagnosisPanel-CALyEmcJ.mjs.map +1 -0
  125. package/.output/server/chunks/build/{EmptyState-Dtlab7S9.mjs → EmptyState-DC2q_7TD.mjs} +3 -3
  126. package/.output/server/chunks/build/EmptyState-DC2q_7TD.mjs.map +1 -0
  127. package/.output/server/chunks/build/{EntityLinks-D3fp57pR.mjs → EntityLinks-BBHWssHH.mjs} +4 -4
  128. package/.output/server/chunks/build/EntityLinks-BBHWssHH.mjs.map +1 -0
  129. package/.output/server/chunks/build/{EnvManagedBadge-Bg3FSiU1.mjs → EnvManagedBadge-UwD2b9v2.mjs} +2 -2
  130. package/.output/server/chunks/build/EnvManagedBadge-UwD2b9v2.mjs.map +1 -0
  131. package/.output/server/chunks/build/{Modal-Ck2XLt8d.mjs → Modal-pSDlXzT3.mjs} +2 -2
  132. package/.output/server/chunks/build/Modal-pSDlXzT3.mjs.map +1 -0
  133. package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs → OpenInIdeLink-CQWKKChd.mjs} +3 -3
  134. package/.output/server/chunks/build/{OpenInIdeLink-C4MXA8ya.mjs.map → OpenInIdeLink-CQWKKChd.mjs.map} +1 -1
  135. package/.output/server/chunks/build/{ProjectTestCasesTable-CxfQ5wtN.mjs → ProjectTestCasesTable-Bo61P5K1.mjs} +8 -8
  136. package/.output/server/chunks/build/{ProjectTestCasesTable-CxfQ5wtN.mjs.map → ProjectTestCasesTable-Bo61P5K1.mjs.map} +1 -1
  137. package/.output/server/chunks/build/{RovingFocusItem-BJSzTBjy.mjs → RovingFocusItem--OEHI2P3.mjs} +2 -2
  138. package/.output/server/chunks/build/RovingFocusItem--OEHI2P3.mjs.map +1 -0
  139. package/.output/server/chunks/build/RunReports-DFLv51TX.mjs +1 -1
  140. package/.output/server/chunks/build/{Select-CUqj50wi.mjs → Select-5DK9frQ7.mjs} +3 -3
  141. package/.output/server/chunks/build/Select-5DK9frQ7.mjs.map +1 -0
  142. package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs → SelectMenu-D-2FSqBU.mjs} +939 -7
  143. package/.output/server/chunks/build/{SelectMenu-Db7osY7J.mjs.map → SelectMenu-D-2FSqBU.mjs.map} +1 -1
  144. package/.output/server/chunks/build/{SettingsField-D6iEYbEc.mjs → SettingsField-BZfx4ma1.mjs} +2 -2
  145. package/.output/server/chunks/build/SettingsField-BZfx4ma1.mjs.map +1 -0
  146. package/.output/server/chunks/build/{Slideover-DgCa80mf.mjs → Slideover-D270EZZD.mjs} +3 -3
  147. package/.output/server/chunks/build/Slideover-D270EZZD.mjs.map +1 -0
  148. package/.output/server/chunks/build/{Switch-CgUioOYB.mjs → Switch-B5Fp8ULt.mjs} +2 -2
  149. package/.output/server/chunks/build/Switch-B5Fp8ULt.mjs.map +1 -0
  150. package/.output/server/chunks/build/Table-BRk04Hd2.mjs +1 -1
  151. package/.output/server/chunks/build/{Tabs-Bbsg9wag.mjs → Tabs-BkSOnbaB.mjs} +2 -2
  152. package/.output/server/chunks/build/Tabs-BkSOnbaB.mjs.map +1 -0
  153. package/.output/server/chunks/build/{TestCaseHistoryChart-nMLPhdvD.mjs → TestCaseHistoryChart-CSi64vVA.mjs} +5 -5
  154. package/.output/server/chunks/build/TestCaseHistoryChart-CSi64vVA.mjs.map +1 -0
  155. package/.output/server/chunks/build/{TestStatusBar-j6h2Jp6A.mjs → TestStatusBar-DX3EhlyP.mjs} +2 -2
  156. package/.output/server/chunks/build/TestStatusBar-DX3EhlyP.mjs.map +1 -0
  157. package/.output/server/chunks/build/{Tooltip-BOazooWP.mjs → Tooltip-Dv4htNP6.mjs} +3 -3
  158. package/.output/server/chunks/build/Tooltip-Dv4htNP6.mjs.map +1 -0
  159. package/.output/server/chunks/build/{VisuallyHiddenInput-D6kBJxVd.mjs → VisuallyHiddenInput-BHvzNumK.mjs} +2 -2
  160. package/.output/server/chunks/build/VisuallyHiddenInput-BHvzNumK.mjs.map +1 -0
  161. package/.output/server/chunks/build/{_id_-z5N6HPyC.mjs → _id_-BdG37K7s.mjs} +12 -12
  162. package/.output/server/chunks/build/_id_-BdG37K7s.mjs.map +1 -0
  163. package/.output/server/chunks/build/{_id_-BHh65pfg.mjs → _id_-BdJs7BJZ.mjs} +57 -33
  164. package/.output/server/chunks/build/{_id_-BHh65pfg.mjs.map → _id_-BdJs7BJZ.mjs.map} +1 -1
  165. package/.output/server/chunks/build/{_id_-B78ky13D.mjs → _id_-BxA6IgWr.mjs} +96 -73
  166. package/.output/server/chunks/build/_id_-BxA6IgWr.mjs.map +1 -0
  167. package/.output/server/chunks/build/{_id_-Rzkqx55x.mjs → _id_-C_uSBiyU.mjs} +22 -23
  168. package/.output/server/chunks/build/{_id_-Rzkqx55x.mjs.map → _id_-C_uSBiyU.mjs.map} +1 -1
  169. package/.output/server/chunks/build/{about-CvSP73Ug.mjs → about-BE0UV-8-.mjs} +365 -18
  170. package/.output/server/chunks/build/about-BE0UV-8-.mjs.map +1 -0
  171. package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs → ai-Cn05ch0u.mjs} +9 -9
  172. package/.output/server/chunks/build/{ai-B4VJ9K1K.mjs.map → ai-Cn05ch0u.mjs.map} +1 -1
  173. package/.output/server/chunks/build/{analytics-CJPC6t4L.mjs → analytics-Bo_B_jko.mjs} +20 -21
  174. package/.output/server/chunks/build/analytics-Bo_B_jko.mjs.map +1 -0
  175. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  176. package/.output/server/chunks/build/{default-zvbFgDJG.mjs → default-CbNHaFsy.mjs} +603 -71
  177. package/.output/server/chunks/build/default-CbNHaFsy.mjs.map +1 -0
  178. package/.output/server/chunks/build/{docs-DyuVEgtB.mjs → docs-B_llWMxx.mjs} +6 -6
  179. package/.output/server/chunks/build/{docs-DyuVEgtB.mjs.map → docs-B_llWMxx.mjs.map} +1 -1
  180. package/.output/server/chunks/build/{edit-CFR5g2Qf.mjs → edit-J0asTFg8.mjs} +4 -5
  181. package/.output/server/chunks/build/edit-J0asTFg8.mjs.map +1 -0
  182. package/.output/server/chunks/build/fetch-B4FwBOzu.mjs +1 -1
  183. package/.output/server/chunks/build/{import-CZo3djDi.mjs → import-CS9oylTN.mjs} +4 -4
  184. package/.output/server/chunks/build/import-CS9oylTN.mjs.map +1 -0
  185. package/.output/server/chunks/build/{index-Stqw0dEI.mjs → index-DE45ycdZ.mjs} +9 -9
  186. package/.output/server/chunks/build/index-DE45ycdZ.mjs.map +1 -0
  187. package/.output/server/chunks/build/{index-gCw_y4ZJ.mjs → index-e9skCi-V.mjs} +10 -11
  188. package/.output/server/chunks/build/{index-gCw_y4ZJ.mjs.map → index-e9skCi-V.mjs.map} +1 -1
  189. package/.output/server/chunks/build/{index-D7fe97l3.mjs → index-hGHlmyxj.mjs} +299 -91
  190. package/.output/server/chunks/build/index-hGHlmyxj.mjs.map +1 -0
  191. package/.output/server/chunks/build/isValueEqualOrExist-D2qw9YEr.mjs +1 -1
  192. package/.output/server/chunks/build/login-Da4u1IlW.mjs +1 -1
  193. package/.output/server/chunks/build/{mcp-B3IUvRgD.mjs → mcp-uhVCCwQM.mjs} +339 -10
  194. package/.output/server/chunks/build/mcp-uhVCCwQM.mjs.map +1 -0
  195. package/.output/server/chunks/build/{notifications-abDv0id8.mjs → notifications-fx_qnKGA.mjs} +4 -4
  196. package/.output/server/chunks/build/notifications-fx_qnKGA.mjs.map +1 -0
  197. package/.output/server/chunks/build/{pr-feedback-DjZID6q-.mjs → pr-feedback-X6-70iF0.mjs} +3 -3
  198. package/.output/server/chunks/build/pr-feedback-X6-70iF0.mjs.map +1 -0
  199. package/.output/server/chunks/build/server.mjs +24 -24
  200. package/.output/server/chunks/build/{settings-Du7YqF8i.mjs → settings-CCYe7rsc.mjs} +3 -3
  201. package/.output/server/chunks/build/settings-CCYe7rsc.mjs.map +1 -0
  202. package/.output/server/chunks/build/{storage-B4vzxd8G.mjs → storage-CJEmviCD.mjs} +5 -5
  203. package/.output/server/chunks/build/storage-CJEmviCD.mjs.map +1 -0
  204. package/.output/server/chunks/build/{test-cases-DUvaO1He.mjs → test-cases-thBbAykw.mjs} +9 -9
  205. package/.output/server/chunks/build/test-cases-thBbAykw.mjs.map +1 -0
  206. package/.output/server/chunks/build/{useAiStatus-CWvIo32Q.mjs → useAiStatus-CxjMmDDY.mjs} +8 -8
  207. package/.output/server/chunks/build/useAiStatus-CxjMmDDY.mjs.map +1 -0
  208. package/.output/server/chunks/build/{useCopyRich-BemRsKgv.mjs → useCopyRich-RJKhWoyj.mjs} +74 -44
  209. package/.output/server/chunks/build/useCopyRich-RJKhWoyj.mjs.map +1 -0
  210. package/.output/server/chunks/build/{useDesktopDownload-D49JRQSw.mjs → useDesktopDownload-BepjqxOt.mjs} +2 -2
  211. package/.output/server/chunks/build/useDesktopDownload-BepjqxOt.mjs.map +1 -0
  212. package/.output/server/chunks/build/{useOpenInIde-4GFf-kdi.mjs → useOpenInIde-BbTnPhFA.mjs} +2 -2
  213. package/.output/server/chunks/build/useOpenInIde-BbTnPhFA.mjs.map +1 -0
  214. package/.output/server/chunks/build/{useSettingsNav-C3O866KC.mjs → useSettingsNav-DnQKacz8.mjs} +4 -4
  215. package/.output/server/chunks/build/useSettingsNav-DnQKacz8.mjs.map +1 -0
  216. package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs +11 -0
  217. package/.output/server/chunks/build/useTauri-Kf3HE_42.mjs.map +1 -0
  218. package/.output/server/chunks/build/{wasted-time-lYkx5YO4.mjs → wasted-time-BNTPIyrC.mjs} +4 -4
  219. package/.output/server/chunks/build/wasted-time-BNTPIyrC.mjs.map +1 -0
  220. package/.output/server/chunks/nitro/nitro.mjs +3471 -2802
  221. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  222. package/.output/server/chunks/routes/__piwi/session.get.mjs +1 -1
  223. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs +88 -0
  224. package/.output/server/chunks/routes/api/desktop/import-local.post.mjs.map +1 -0
  225. package/.output/server/chunks/routes/api/failure-clusters/_id/base-commit.patch.mjs +1 -1
  226. package/.output/server/chunks/routes/api/failure-clusters/_id/branches.get.mjs +1 -1
  227. package/.output/server/chunks/routes/api/failure-clusters/_id/commit-diff.get.mjs +1 -1
  228. package/.output/server/chunks/routes/api/failure-clusters/_id/commits.get.mjs +1 -1
  229. package/.output/server/chunks/routes/api/failure-clusters/_id/context.get.mjs +1 -1
  230. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose/stream.post.mjs +1 -1
  231. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnose.post.mjs +1 -1
  232. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnoses.get.mjs +1 -1
  233. package/.output/server/chunks/routes/api/failure-clusters/_id/diagnosis.get.mjs +1 -1
  234. package/.output/server/chunks/routes/api/failure-clusters/_id/export.get.mjs +1 -1
  235. package/.output/server/chunks/routes/api/failure-clusters/_id/extract-cases.post.mjs +1 -1
  236. package/.output/server/chunks/routes/api/failure-clusters/_id/fix-plan.get.mjs +1 -1
  237. package/.output/server/chunks/routes/api/failure-clusters/_id/status.patch.mjs +1 -1
  238. package/.output/server/chunks/routes/api/failure-clusters/_id_.get.mjs +1 -1
  239. package/.output/server/chunks/routes/api/failure-diagnoses/_id/feedback.patch.mjs +1 -1
  240. package/.output/server/chunks/routes/api/files/_...path_.get.mjs +1 -1
  241. package/.output/server/chunks/routes/api/health.get.mjs +1 -1
  242. package/.output/server/chunks/routes/api/index.get2.mjs +1 -1
  243. package/.output/server/chunks/routes/api/index.get3.mjs +1 -1
  244. package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
  245. package/.output/server/chunks/routes/api/index.post2.mjs +1 -1
  246. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  247. package/.output/server/chunks/routes/api/index.post4.mjs +1 -1
  248. package/.output/server/chunks/routes/api/index.post5.mjs +1 -1
  249. package/.output/server/chunks/routes/api/links/_id/refresh.post.mjs +1 -1
  250. package/.output/server/chunks/routes/api/links/_id_.delete.mjs +1 -1
  251. package/.output/server/chunks/routes/api/links/_id_.patch.mjs +1 -1
  252. package/.output/server/chunks/routes/api/markers/_id_.delete.mjs +1 -1
  253. package/.output/server/chunks/routes/api/markers/_id_.put.mjs +1 -1
  254. package/.output/server/chunks/routes/api/notifications/stream.get.mjs +1 -1
  255. package/.output/server/chunks/routes/api/projects/_id/cluster-merge-suggestions.get.mjs +1 -1
  256. package/.output/server/chunks/routes/api/projects/_id/failure-clusters.get.mjs +1 -1
  257. package/.output/server/chunks/routes/api/projects/_id/flaky-classify.post.mjs +1 -1
  258. package/.output/server/chunks/routes/api/projects/_id/flaky-tests.get.mjs +1 -1
  259. package/.output/server/chunks/routes/api/projects/_id/latest-run.get.mjs +1 -1
  260. package/.output/server/chunks/routes/api/projects/_id/markers.get.mjs +1 -1
  261. package/.output/server/chunks/routes/api/projects/_id/markers.post.mjs +1 -1
  262. package/.output/server/chunks/routes/api/projects/_id/members.get.mjs +1 -1
  263. package/.output/server/chunks/routes/api/projects/_id/members.put.mjs +1 -1
  264. package/.output/server/chunks/routes/api/projects/_id/performance.get.mjs +1 -1
  265. package/.output/server/chunks/routes/api/projects/_id/quarantine/_testCaseId_.delete.mjs +1 -1
  266. package/.output/server/chunks/routes/api/projects/_id/quarantine.get.mjs +1 -1
  267. package/.output/server/chunks/routes/api/projects/_id/quarantine.post.mjs +1 -1
  268. package/.output/server/chunks/routes/api/projects/_id/slow-tests.get.mjs +1 -1
  269. package/.output/server/chunks/routes/api/projects/_id/spec-health.get.mjs +1 -1
  270. package/.output/server/chunks/routes/api/projects/_id/test-cases.get.mjs +1 -1
  271. package/.output/server/chunks/routes/api/projects/_id/timeout-opportunities.get.mjs +1 -1
  272. package/.output/server/chunks/routes/api/projects/_id_.delete.mjs +1 -1
  273. package/.output/server/chunks/routes/api/projects/_id_.get.mjs +1 -1
  274. package/.output/server/chunks/routes/api/projects/_id_.put.mjs +1 -1
  275. package/.output/server/chunks/routes/api/projects/menu.get.mjs +1 -1
  276. package/.output/server/chunks/routes/api/projects/overview.get.mjs +1 -1
  277. package/.output/server/chunks/routes/api/projects.get.mjs +1 -1
  278. package/.output/server/chunks/routes/api/search.get.mjs +1 -1
  279. package/.output/server/chunks/routes/api/settings/ai/limits.get.mjs +1 -1
  280. package/.output/server/chunks/routes/api/settings/ai/limits.put.mjs +1 -1
  281. package/.output/server/chunks/routes/api/settings/ai/test.post.mjs +1 -1
  282. package/.output/server/chunks/routes/api/settings/ai/usage.get.mjs +1 -1
  283. package/.output/server/chunks/routes/api/settings/ai.get.mjs +1 -1
  284. package/.output/server/chunks/routes/api/settings/ai.put.mjs +1 -1
  285. package/.output/server/chunks/routes/api/settings/pr-feedback.get.mjs +1 -1
  286. package/.output/server/chunks/routes/api/settings/pr-feedback.put.mjs +1 -1
  287. package/.output/server/chunks/routes/api/settings/smtp.get.mjs +1 -1
  288. package/.output/server/chunks/routes/api/settings/timeout-hygiene.get.mjs +1 -1
  289. package/.output/server/chunks/routes/api/settings/timeout-hygiene.put.mjs +1 -1
  290. package/.output/server/chunks/routes/api/settings/wasted-waits.get.mjs +1 -1
  291. package/.output/server/chunks/routes/api/settings/wasted-waits.put.mjs +1 -1
  292. package/.output/server/chunks/routes/api/stream.get.mjs +1 -1
  293. package/.output/server/chunks/routes/api/subscriptions/_id_.delete.mjs +1 -1
  294. package/.output/server/chunks/routes/api/subscriptions/_id_.patch.mjs +1 -1
  295. package/.output/server/chunks/routes/api/tags/_id_.delete.mjs +1 -1
  296. package/.output/server/chunks/routes/api/tags/_id_.put.mjs +1 -1
  297. package/.output/server/chunks/routes/api/test-cases/_id/history.get.mjs +1 -1
  298. package/.output/server/chunks/routes/api/test-cases/_id/stability-trend.get.mjs +1 -1
  299. package/.output/server/chunks/routes/api/test-cases/_id_.get.mjs +1 -1
  300. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnose.post.mjs +1 -1
  301. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis-context.get.mjs +1 -1
  302. package/.output/server/chunks/routes/api/test-run-cases/_id/diagnosis.get.mjs +1 -1
  303. package/.output/server/chunks/routes/api/test-run-cases/_id/export.get.mjs +1 -1
  304. package/.output/server/chunks/routes/api/test-run-cases/_id/traces.get.mjs +1 -1
  305. package/.output/server/chunks/routes/api/test-run-cases/_id_.get.mjs +1 -1
  306. package/.output/server/chunks/routes/api/test-runs/_id/begin.post.mjs +1 -1
  307. package/.output/server/chunks/routes/api/test-runs/_id/case-files.post.mjs +1 -1
  308. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs +5 -3
  309. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/dom-snapshot.get.mjs.map +1 -1
  310. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/environment-diff.get.mjs +1 -1
  311. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-healing.get.mjs +1 -1
  312. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/locator-pick.post.mjs +1 -1
  313. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network-body.get.mjs +1 -1
  314. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-network.get.mjs +1 -1
  315. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/trace-stacks.get.mjs +1 -1
  316. package/.output/server/chunks/routes/api/test-runs/_id/cases/_caseId/visual-diff.get.mjs +1 -1
  317. package/.output/server/chunks/routes/api/test-runs/_id/events.post.mjs +1 -1
  318. package/.output/server/chunks/routes/api/test-runs/_id/failure-groups.get.mjs +1 -1
  319. package/.output/server/chunks/routes/api/test-runs/_id/finish.post.mjs +1 -1
  320. package/.output/server/chunks/routes/api/test-runs/_id/gate.post.mjs +1 -1
  321. package/.output/server/chunks/routes/api/test-runs/_id/heartbeat.post.mjs +1 -1
  322. package/.output/server/chunks/routes/api/test-runs/_id/insights.get.mjs +1 -1
  323. package/.output/server/chunks/routes/api/test-runs/_id/network-requests.get.mjs +1 -1
  324. package/.output/server/chunks/routes/api/test-runs/_id/regression-context.get.mjs +1 -1
  325. package/.output/server/chunks/routes/api/test-runs/_id/stream.get.mjs +1 -1
  326. package/.output/server/chunks/routes/api/test-runs/_id/summary.get.mjs +1 -1
  327. package/.output/server/chunks/routes/api/test-runs/_id_.delete.mjs +1 -1
  328. package/.output/server/chunks/routes/api/test-runs/_id_.get.mjs +1 -1
  329. package/.output/server/chunks/routes/api/test-runs/_id_.patch.mjs +1 -1
  330. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs +1 -2
  331. package/.output/server/chunks/routes/api/test-runs/import/check.post.mjs.map +1 -1
  332. package/.output/server/chunks/routes/api/test-runs/import.post.mjs +4 -128
  333. package/.output/server/chunks/routes/api/test-runs/import.post.mjs.map +1 -1
  334. package/.output/server/chunks/routes/api/test-runs/recent.get.mjs +1 -1
  335. package/.output/server/chunks/routes/api/test-runs/setup.post.mjs +1 -1
  336. package/.output/server/chunks/routes/api/test-runs/start.post.mjs +1 -1
  337. package/.output/server/chunks/routes/api/test-runs/submit.post.mjs +1 -1
  338. package/.output/server/chunks/routes/api/test-runs/upload.post.mjs +1 -1
  339. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs +3 -1
  340. package/.output/server/chunks/routes/api/tests/cleanup.delete.mjs.map +1 -1
  341. package/.output/server/chunks/routes/api/traces/check.post.mjs +1 -1
  342. package/.output/server/chunks/routes/api/users/_id/index.post.mjs +1 -1
  343. package/.output/server/chunks/routes/api/users/_id/invite.post.mjs +1 -1
  344. package/.output/server/chunks/routes/api/users/_id/projects.get.mjs +1 -1
  345. package/.output/server/chunks/routes/api/users/_id/projects.put.mjs +1 -1
  346. package/.output/server/chunks/routes/api/version.get.mjs +1 -1
  347. package/.output/server/chunks/routes/mcp.post.mjs +1 -1
  348. package/.output/server/chunks/routes/renderer.mjs +1 -1
  349. package/.output/server/index.mjs +1 -1
  350. package/.output/server/package.json +1 -1
  351. package/package.json +1 -1
  352. package/.output/public/_nuxt/BYDaY0Z7.js +0 -1
  353. package/.output/public/_nuxt/Bc8mOoz9.js +0 -4
  354. package/.output/public/_nuxt/BeLWlVK0.js +0 -1
  355. package/.output/public/_nuxt/BpUaY9nH.js +0 -2
  356. package/.output/public/_nuxt/CHNwfU1y.js +0 -1
  357. package/.output/public/_nuxt/CNFYDQmj.js +0 -1
  358. package/.output/public/_nuxt/CU5S9GCh.js +0 -1
  359. package/.output/public/_nuxt/CrwJAwhk.js +0 -1
  360. package/.output/public/_nuxt/CuSVQEkS.js +0 -3
  361. package/.output/public/_nuxt/CylWPruw.js +0 -1
  362. package/.output/public/_nuxt/DDDpCFpF.js +0 -1
  363. package/.output/public/_nuxt/DVDXJYq2.js +0 -2
  364. package/.output/public/_nuxt/Dgf5N4Ng.js +0 -1
  365. package/.output/public/_nuxt/DiZyJYez.js +0 -1
  366. package/.output/public/_nuxt/OSduWzyz.js +0 -1
  367. package/.output/public/_nuxt/WsxFTEFq.js +0 -10
  368. package/.output/public/_nuxt/aQgs_c6e.js +0 -9
  369. package/.output/public/_nuxt/builds/meta/ab473028-4b37-4884-b243-b8f6e5046e5e.json +0 -1
  370. package/.output/public/_nuxt/dYCKgE-3.js +0 -5
  371. package/.output/public/_nuxt/entry.CPhW41mh.css +0 -1
  372. package/.output/public/_nuxt/g26aVPxc.js +0 -1
  373. package/.output/server/chunks/_/import-runs.mjs +0 -351
  374. package/.output/server/chunks/_/import-runs.mjs.map +0 -1
  375. package/.output/server/chunks/build/BrowserBadge-D33lqUcj.mjs.map +0 -1
  376. package/.output/server/chunks/build/Checkbox-DvUBGagc.mjs.map +0 -1
  377. package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs +0 -631
  378. package/.output/server/chunks/build/CiEnvCard-CrjOM17n.mjs.map +0 -1
  379. package/.output/server/chunks/build/DiagnosisPanel-B646dK4p.mjs.map +0 -1
  380. package/.output/server/chunks/build/EmptyState-Dtlab7S9.mjs.map +0 -1
  381. package/.output/server/chunks/build/EntityLinks-D3fp57pR.mjs.map +0 -1
  382. package/.output/server/chunks/build/EnvManagedBadge-Bg3FSiU1.mjs.map +0 -1
  383. package/.output/server/chunks/build/Modal-Ck2XLt8d.mjs.map +0 -1
  384. package/.output/server/chunks/build/RovingFocusItem-BJSzTBjy.mjs.map +0 -1
  385. package/.output/server/chunks/build/Select-CUqj50wi.mjs.map +0 -1
  386. package/.output/server/chunks/build/SettingsField-D6iEYbEc.mjs.map +0 -1
  387. package/.output/server/chunks/build/Slideover-DgCa80mf.mjs.map +0 -1
  388. package/.output/server/chunks/build/Switch-CgUioOYB.mjs.map +0 -1
  389. package/.output/server/chunks/build/Tabs-Bbsg9wag.mjs.map +0 -1
  390. package/.output/server/chunks/build/TestCaseHistoryChart-nMLPhdvD.mjs.map +0 -1
  391. package/.output/server/chunks/build/TestStatusBar-j6h2Jp6A.mjs.map +0 -1
  392. package/.output/server/chunks/build/Tooltip-BOazooWP.mjs.map +0 -1
  393. package/.output/server/chunks/build/VisuallyHiddenInput-D6kBJxVd.mjs.map +0 -1
  394. package/.output/server/chunks/build/_id_-B78ky13D.mjs.map +0 -1
  395. package/.output/server/chunks/build/_id_-z5N6HPyC.mjs.map +0 -1
  396. package/.output/server/chunks/build/about-CvSP73Ug.mjs.map +0 -1
  397. package/.output/server/chunks/build/analytics-CJPC6t4L.mjs.map +0 -1
  398. package/.output/server/chunks/build/default-zvbFgDJG.mjs.map +0 -1
  399. package/.output/server/chunks/build/edit-CFR5g2Qf.mjs.map +0 -1
  400. package/.output/server/chunks/build/import-CZo3djDi.mjs.map +0 -1
  401. package/.output/server/chunks/build/index-D7fe97l3.mjs.map +0 -1
  402. package/.output/server/chunks/build/index-Stqw0dEI.mjs.map +0 -1
  403. package/.output/server/chunks/build/mcp-B3IUvRgD.mjs.map +0 -1
  404. package/.output/server/chunks/build/notifications-abDv0id8.mjs.map +0 -1
  405. package/.output/server/chunks/build/pr-feedback-DjZID6q-.mjs.map +0 -1
  406. package/.output/server/chunks/build/settings-Du7YqF8i.mjs.map +0 -1
  407. package/.output/server/chunks/build/storage-B4vzxd8G.mjs.map +0 -1
  408. package/.output/server/chunks/build/test-cases-DUvaO1He.mjs.map +0 -1
  409. package/.output/server/chunks/build/useAiStatus-CWvIo32Q.mjs.map +0 -1
  410. package/.output/server/chunks/build/useCopyRich-BemRsKgv.mjs.map +0 -1
  411. package/.output/server/chunks/build/useDesktopDownload-D49JRQSw.mjs.map +0 -1
  412. package/.output/server/chunks/build/useOpenInIde-4GFf-kdi.mjs.map +0 -1
  413. package/.output/server/chunks/build/useSettingsNav-C3O866KC.mjs.map +0 -1
  414. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs +0 -7
  415. package/.output/server/chunks/build/useTauri-lRT8zkLv.mjs.map +0 -1
  416. package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs +0 -940
  417. package/.output/server/chunks/build/virtualizer-Cd1hhlxC.mjs.map +0 -1
  418. package/.output/server/chunks/build/wasted-time-lYkx5YO4.mjs.map +0 -1
@@ -0,0 +1,1492 @@
1
+ import { _ as _sfc_main$9 } from './Tooltip-Dv4htNP6.mjs';
2
+ import { o as _sfc_main$p, m as _sfc_main$k, n as _sfc_main$7$1, _ as _sfc_main$d$1 } from './server.mjs';
3
+ import { _ as _sfc_main$b } from './Modal-pSDlXzT3.mjs';
4
+ import { _ as _sfc_main$c } from './Alert-C4xq8lao.mjs';
5
+ import { _ as _sfc_main$d } from './FormField-B0HKsdMd.mjs';
6
+ import { _ as _sfc_main$7 } from './Select-5DK9frQ7.mjs';
7
+ import { _ as _sfc_main$e } from './Switch-B5Fp8ULt.mjs';
8
+ import { _ as __nuxt_component_5 } from './CodeBlock-BgE-NSmE.mjs';
9
+ import { defineComponent, useModel, ref, computed, mergeProps, unref, mergeModels, withCtx, createTextVNode, createVNode, isRef, openBlock, createBlock, createCommentVNode, toDisplayString, createSlots, renderSlot, watch, nextTick, Fragment, renderList, onScopeDispose, useSSRContext } from 'vue';
10
+ import { ssrRenderAttrs, ssrRenderClass, ssrRenderSlot, ssrRenderComponent, ssrInterpolate, ssrRenderList, ssrRenderAttr } from 'vue/server-renderer';
11
+ import { e as escapeGrep, t as toPosixPath } from './useOpenInIde-BbTnPhFA.mjs';
12
+ import { _ as __nuxt_component_3, u as useDesktopProjectLink } from './BrowserBadge-MFvBwxmD.mjs';
13
+ import { t as tauriCore, a as tauriEvent } from './useTauri-Kf3HE_42.mjs';
14
+ import { D as isStatusInFlight, E as getStatusIcon, v as getStatusColor, a as formatStatusLabel, e as errorMessage } from './index-CU2nZhAa.mjs';
15
+ import { _ as _sfc_main$8 } from './Tabs-BkSOnbaB.mjs';
16
+ import { _ as _sfc_main$a } from './Card-BQP_oZkQ.mjs';
17
+ import { _ as __nuxt_component_2$1 } from './HelpHint-DrcIv-Oj.mjs';
18
+
19
+ const RUN_MODE_FLAGS = {
20
+ normal: [],
21
+ headed: ["--headed"],
22
+ debug: ["--debug"],
23
+ ui: ["--ui"]
24
+ };
25
+ function groupByProject(cases) {
26
+ const groups = /* @__PURE__ */ new Map();
27
+ for (const c of cases) {
28
+ const key = c.projectName || "";
29
+ if (!groups.has(key)) groups.set(key, []);
30
+ groups.get(key).push(c);
31
+ }
32
+ return groups;
33
+ }
34
+ function specArgs(cases, mode) {
35
+ if (mode === "grep") {
36
+ const escaped = cases.map((c) => escapeGrep(c.title));
37
+ return ["--grep", escaped.length === 1 ? escaped[0] : `(${escaped.join("|")})`];
38
+ }
39
+ const seen = /* @__PURE__ */ new Set();
40
+ const specs = [];
41
+ for (const c of cases) {
42
+ const spec = mode === "file-line" && c.line ? `${toPosixPath(c.filePath)}:${c.line}` : toPosixPath(c.filePath);
43
+ if (seen.has(spec)) continue;
44
+ seen.add(spec);
45
+ specs.push(spec);
46
+ }
47
+ return specs;
48
+ }
49
+ function displayArg(arg) {
50
+ return /[\s"'()|]/.test(arg) ? `"${arg.replace(/"/g, '\\"')}"` : arg;
51
+ }
52
+ function buildLocalRunPlan(cases, options = {}) {
53
+ if (cases.length === 0) return [];
54
+ const mode = options.mode ?? "file-line";
55
+ const runMode = options.runMode ?? "normal";
56
+ const repeatEach = Math.min(1e3, Math.max(1, Math.floor(options.repeatEach ?? 1)));
57
+ const steps = [];
58
+ for (const [project, projectCases] of groupByProject(cases)) {
59
+ const args = specArgs(projectCases, mode);
60
+ if (project) args.push(`--project=${project}`);
61
+ args.push(...RUN_MODE_FLAGS[runMode]);
62
+ if (options.trace) args.push("--trace=on");
63
+ if (repeatEach > 1) args.push(`--repeat-each=${repeatEach}`);
64
+ steps.push({ args, display: ["playwright", "test", ...args.map(displayArg)].join(" ") });
65
+ }
66
+ return steps;
67
+ }
68
+ const MAX_LINES = 2e3;
69
+ function useDesktopLocalRunner() {
70
+ const status = ref("idle");
71
+ const lines = ref([]);
72
+ const exitCode = ref(null);
73
+ const stepIndex = ref(0);
74
+ const stepCount = ref(0);
75
+ const running = computed(() => status.value === "running");
76
+ let currentRunId = null;
77
+ let starting = false;
78
+ let stopped = false;
79
+ let pending = [];
80
+ let unlisten = null;
81
+ let resolveExit = null;
82
+ function pushLine(text, error) {
83
+ lines.value.push({ text, error });
84
+ if (lines.value.length > MAX_LINES) lines.value.splice(0, lines.value.length - MAX_LINES);
85
+ }
86
+ function handleEvent(payload) {
87
+ if (payload.kind === "exit") {
88
+ resolveExit?.(payload.code);
89
+ return;
90
+ }
91
+ pushLine(payload.line ?? "", payload.kind !== "stdout");
92
+ }
93
+ async function ensureListener() {
94
+ if (unlisten) return;
95
+ const events = tauriEvent();
96
+ if (!events) throw new Error("The desktop bridge is unavailable.");
97
+ unlisten = await events.listen("piwi:local-run", ({ payload }) => {
98
+ if (payload.id === currentRunId) {
99
+ handleEvent(payload);
100
+ } else if (starting) {
101
+ pending.push(payload);
102
+ }
103
+ });
104
+ }
105
+ async function runStep(projectId, step) {
106
+ const core = tauriCore();
107
+ if (!core) throw new Error("The desktop bridge is unavailable.");
108
+ const exit = new Promise((resolve) => {
109
+ resolveExit = resolve;
110
+ });
111
+ starting = true;
112
+ pending = [];
113
+ try {
114
+ currentRunId = await core.invoke("desktop_run_local_tests", {
115
+ projectId: String(projectId),
116
+ args: step.args
117
+ });
118
+ } finally {
119
+ starting = false;
120
+ }
121
+ for (const event of pending) {
122
+ if (event.id === currentRunId) handleEvent(event);
123
+ }
124
+ pending = [];
125
+ const code = await exit;
126
+ currentRunId = null;
127
+ resolveExit = null;
128
+ return code;
129
+ }
130
+ async function start(projectId, steps) {
131
+ if (running.value || steps.length === 0) return;
132
+ stopped = false;
133
+ lines.value = [];
134
+ exitCode.value = null;
135
+ stepCount.value = steps.length;
136
+ stepIndex.value = 0;
137
+ status.value = "running";
138
+ try {
139
+ await ensureListener();
140
+ let worst = 0;
141
+ for (const [index, step] of steps.entries()) {
142
+ if (stopped) break;
143
+ stepIndex.value = index;
144
+ if (steps.length > 1) pushLine(`$ ${step.display}`, false);
145
+ const code = await runStep(projectId, step);
146
+ if (stopped) break;
147
+ if (code !== 0) worst = code ?? 1;
148
+ }
149
+ if (stopped) {
150
+ status.value = "stopped";
151
+ } else {
152
+ exitCode.value = typeof worst === "number" ? worst : 1;
153
+ status.value = worst === 0 ? "passed" : "failed";
154
+ }
155
+ } catch (error) {
156
+ pushLine(errorMessage(error), true);
157
+ status.value = "error";
158
+ }
159
+ }
160
+ async function stop() {
161
+ if (!running.value) return;
162
+ stopped = true;
163
+ const core = tauriCore();
164
+ const id = currentRunId;
165
+ if (core && id != null) {
166
+ try {
167
+ await core.invoke("desktop_stop_local_tests", { runId: id });
168
+ } catch {
169
+ }
170
+ }
171
+ resolveExit?.(null);
172
+ status.value = "stopped";
173
+ }
174
+ onScopeDispose(() => {
175
+ if (running.value) void stop();
176
+ unlisten?.();
177
+ unlisten = null;
178
+ });
179
+ return { status, running, lines, exitCode, stepIndex, stepCount, start, stop };
180
+ }
181
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
182
+ __name: "DesktopRunLocallyModal",
183
+ __ssrInlineRender: true,
184
+ props: /* @__PURE__ */ mergeModels({
185
+ projectId: {},
186
+ projectLabel: {},
187
+ cases: {}
188
+ }, {
189
+ "open": { type: Boolean, ...{ default: false } },
190
+ "openModifiers": {}
191
+ }),
192
+ emits: ["update:open"],
193
+ setup(__props) {
194
+ const props = __props;
195
+ const open = useModel(__props, "open");
196
+ const { link, busy, pickAndLink } = useDesktopProjectLink(() => props.projectId);
197
+ const { status, running, lines, exitCode, stepIndex, stepCount, start, stop } = useDesktopLocalRunner();
198
+ const mode = ref("file-line");
199
+ const runMode = ref("normal");
200
+ const trace = ref(false);
201
+ const repeatEach = ref(1);
202
+ const modeItems = [
203
+ { label: "File:line", value: "file-line" },
204
+ { label: "Title (grep)", value: "grep" },
205
+ { label: "File only", value: "file" }
206
+ ];
207
+ const runModeItems = [
208
+ { label: "Headless", value: "normal" },
209
+ { label: "Headed", value: "headed" },
210
+ { label: "Debug (inspector)", value: "debug" },
211
+ { label: "UI mode", value: "ui" }
212
+ ];
213
+ const linked = computed(() => !!link.value?.exists);
214
+ const plan = computed(
215
+ () => buildLocalRunPlan(props.cases, {
216
+ mode: mode.value,
217
+ runMode: runMode.value,
218
+ trace: trace.value,
219
+ repeatEach: repeatEach.value
220
+ })
221
+ );
222
+ const preview = computed(() => plan.value.map((s) => s.display).join("\n"));
223
+ const statusBadge = computed(() => {
224
+ switch (status.value) {
225
+ case "running":
226
+ return {
227
+ label: stepCount.value > 1 ? `Running ${stepIndex.value + 1}/${stepCount.value}…` : "Running…",
228
+ color: "info"
229
+ };
230
+ case "passed":
231
+ return { label: "Passed", color: "success" };
232
+ case "failed":
233
+ return { label: exitCode.value != null ? `Failed (exit ${exitCode.value})` : "Failed", color: "error" };
234
+ case "stopped":
235
+ return { label: "Stopped", color: "neutral" };
236
+ case "error":
237
+ return { label: "Could not run", color: "error" };
238
+ default:
239
+ return null;
240
+ }
241
+ });
242
+ async function run() {
243
+ await start(props.projectId, plan.value);
244
+ }
245
+ watch(open, (value) => {
246
+ if (!value && running.value) void stop();
247
+ });
248
+ const outputEl = ref(null);
249
+ watch(
250
+ () => lines.value.length,
251
+ async () => {
252
+ await nextTick();
253
+ outputEl.value?.scrollTo({ top: outputEl.value.scrollHeight });
254
+ }
255
+ );
256
+ return (_ctx, _push, _parent, _attrs) => {
257
+ const _component_UModal = _sfc_main$b;
258
+ const _component_UIcon = _sfc_main$p;
259
+ const _component_UBadge = _sfc_main$7$1;
260
+ const _component_UAlert = _sfc_main$c;
261
+ const _component_UButton = _sfc_main$k;
262
+ const _component_UFormField = _sfc_main$d;
263
+ const _component_USelect = _sfc_main$7;
264
+ const _component_UInput = _sfc_main$d$1;
265
+ const _component_USwitch = _sfc_main$e;
266
+ const _component_CodeBlock = __nuxt_component_5;
267
+ _push(ssrRenderComponent(_component_UModal, mergeProps({
268
+ open: open.value,
269
+ "onUpdate:open": ($event) => open.value = $event,
270
+ ui: { content: "max-w-2xl" }
271
+ }, _attrs), {
272
+ header: withCtx((_, _push2, _parent2, _scopeId) => {
273
+ if (_push2) {
274
+ _push2(`<div class="flex items-center gap-2 min-w-0"${_scopeId}>`);
275
+ _push2(ssrRenderComponent(_component_UIcon, {
276
+ name: "i-lucide-monitor-play",
277
+ class: "size-5 text-primary shrink-0"
278
+ }, null, _parent2, _scopeId));
279
+ _push2(`<h2 class="text-base font-semibold truncate"${_scopeId}>Run tests locally</h2>`);
280
+ _push2(ssrRenderComponent(_component_UBadge, {
281
+ color: "neutral",
282
+ variant: "subtle",
283
+ size: "sm"
284
+ }, {
285
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
286
+ if (_push3) {
287
+ _push3(`${ssrInterpolate(__props.cases.length)} test${ssrInterpolate(__props.cases.length === 1 ? "" : "s")}`);
288
+ } else {
289
+ return [
290
+ createTextVNode(toDisplayString(__props.cases.length) + " test" + toDisplayString(__props.cases.length === 1 ? "" : "s"), 1)
291
+ ];
292
+ }
293
+ }),
294
+ _: 1
295
+ }, _parent2, _scopeId));
296
+ _push2(`</div>`);
297
+ } else {
298
+ return [
299
+ createVNode("div", { class: "flex items-center gap-2 min-w-0" }, [
300
+ createVNode(_component_UIcon, {
301
+ name: "i-lucide-monitor-play",
302
+ class: "size-5 text-primary shrink-0"
303
+ }),
304
+ createVNode("h2", { class: "text-base font-semibold truncate" }, "Run tests locally"),
305
+ createVNode(_component_UBadge, {
306
+ color: "neutral",
307
+ variant: "subtle",
308
+ size: "sm"
309
+ }, {
310
+ default: withCtx(() => [
311
+ createTextVNode(toDisplayString(__props.cases.length) + " test" + toDisplayString(__props.cases.length === 1 ? "" : "s"), 1)
312
+ ]),
313
+ _: 1
314
+ })
315
+ ])
316
+ ];
317
+ }
318
+ }),
319
+ body: withCtx((_, _push2, _parent2, _scopeId) => {
320
+ if (_push2) {
321
+ _push2(`<div class="space-y-4"${_scopeId}>`);
322
+ if (!unref(linked)) {
323
+ _push2(`<div class="space-y-3"${_scopeId}><p class="text-sm text-muted"${_scopeId}> Link ${ssrInterpolate(__props.projectLabel || "this project")} to its local checkout — the folder that contains these tests. Piwi runs that folder&#39;s own Playwright with the app&#39;s bundled Node, so nothing else needs to be installed. </p>`);
324
+ if (unref(link) && !unref(link).exists) {
325
+ _push2(ssrRenderComponent(_component_UAlert, {
326
+ color: "warning",
327
+ variant: "soft",
328
+ icon: "i-lucide-folder-x",
329
+ title: "The linked folder no longer exists",
330
+ description: unref(link).path
331
+ }, null, _parent2, _scopeId));
332
+ } else {
333
+ _push2(`<!---->`);
334
+ }
335
+ _push2(ssrRenderComponent(_component_UButton, {
336
+ icon: "i-lucide-folder-plus",
337
+ loading: unref(busy),
338
+ onClick: unref(pickAndLink)
339
+ }, {
340
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
341
+ if (_push3) {
342
+ _push3(`Choose folder…`);
343
+ } else {
344
+ return [
345
+ createTextVNode("Choose folder…")
346
+ ];
347
+ }
348
+ }),
349
+ _: 1
350
+ }, _parent2, _scopeId));
351
+ _push2(`</div>`);
352
+ } else {
353
+ _push2(`<!--[--><div class="flex items-center justify-between gap-3"${_scopeId}><div class="flex items-center gap-2 min-w-0 text-sm"${_scopeId}>`);
354
+ _push2(ssrRenderComponent(_component_UIcon, {
355
+ name: "i-lucide-folder-check",
356
+ class: "size-4 text-success shrink-0"
357
+ }, null, _parent2, _scopeId));
358
+ _push2(`<code class="text-xs break-all"${_scopeId}>${ssrInterpolate(unref(link)?.path)}</code></div>`);
359
+ _push2(ssrRenderComponent(_component_UButton, {
360
+ size: "xs",
361
+ color: "neutral",
362
+ variant: "ghost",
363
+ icon: "i-lucide-folder-search",
364
+ loading: unref(busy),
365
+ disabled: unref(running),
366
+ onClick: unref(pickAndLink)
367
+ }, {
368
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
369
+ if (_push3) {
370
+ _push3(` Change `);
371
+ } else {
372
+ return [
373
+ createTextVNode(" Change ")
374
+ ];
375
+ }
376
+ }),
377
+ _: 1
378
+ }, _parent2, _scopeId));
379
+ _push2(`</div><div class="grid grid-cols-2 gap-3"${_scopeId}>`);
380
+ _push2(ssrRenderComponent(_component_UFormField, {
381
+ label: "Select tests by",
382
+ name: "mode"
383
+ }, {
384
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
385
+ if (_push3) {
386
+ _push3(ssrRenderComponent(_component_USelect, {
387
+ modelValue: unref(mode),
388
+ "onUpdate:modelValue": ($event) => isRef(mode) ? mode.value = $event : null,
389
+ items: modeItems,
390
+ disabled: unref(running),
391
+ class: "w-full"
392
+ }, null, _parent3, _scopeId2));
393
+ } else {
394
+ return [
395
+ createVNode(_component_USelect, {
396
+ modelValue: unref(mode),
397
+ "onUpdate:modelValue": ($event) => isRef(mode) ? mode.value = $event : null,
398
+ items: modeItems,
399
+ disabled: unref(running),
400
+ class: "w-full"
401
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
402
+ ];
403
+ }
404
+ }),
405
+ _: 1
406
+ }, _parent2, _scopeId));
407
+ _push2(ssrRenderComponent(_component_UFormField, {
408
+ label: "Browser",
409
+ name: "runMode"
410
+ }, {
411
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
412
+ if (_push3) {
413
+ _push3(ssrRenderComponent(_component_USelect, {
414
+ modelValue: unref(runMode),
415
+ "onUpdate:modelValue": ($event) => isRef(runMode) ? runMode.value = $event : null,
416
+ items: runModeItems,
417
+ disabled: unref(running),
418
+ class: "w-full"
419
+ }, null, _parent3, _scopeId2));
420
+ } else {
421
+ return [
422
+ createVNode(_component_USelect, {
423
+ modelValue: unref(runMode),
424
+ "onUpdate:modelValue": ($event) => isRef(runMode) ? runMode.value = $event : null,
425
+ items: runModeItems,
426
+ disabled: unref(running),
427
+ class: "w-full"
428
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
429
+ ];
430
+ }
431
+ }),
432
+ _: 1
433
+ }, _parent2, _scopeId));
434
+ _push2(ssrRenderComponent(_component_UFormField, {
435
+ label: "Repeat each",
436
+ name: "repeatEach",
437
+ description: "Run every test N times — flake reproduction."
438
+ }, {
439
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
440
+ if (_push3) {
441
+ _push3(ssrRenderComponent(_component_UInput, {
442
+ modelValue: unref(repeatEach),
443
+ "onUpdate:modelValue": ($event) => isRef(repeatEach) ? repeatEach.value = $event : null,
444
+ modelModifiers: { number: true },
445
+ type: "number",
446
+ min: "1",
447
+ max: "1000",
448
+ disabled: unref(running),
449
+ class: "w-full"
450
+ }, null, _parent3, _scopeId2));
451
+ } else {
452
+ return [
453
+ createVNode(_component_UInput, {
454
+ modelValue: unref(repeatEach),
455
+ "onUpdate:modelValue": ($event) => isRef(repeatEach) ? repeatEach.value = $event : null,
456
+ modelModifiers: { number: true },
457
+ type: "number",
458
+ min: "1",
459
+ max: "1000",
460
+ disabled: unref(running),
461
+ class: "w-full"
462
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
463
+ ];
464
+ }
465
+ }),
466
+ _: 1
467
+ }, _parent2, _scopeId));
468
+ _push2(ssrRenderComponent(_component_UFormField, {
469
+ label: "Trace",
470
+ name: "trace",
471
+ description: "Force trace recording (--trace=on)."
472
+ }, {
473
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
474
+ if (_push3) {
475
+ _push3(ssrRenderComponent(_component_USwitch, {
476
+ modelValue: unref(trace),
477
+ "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null,
478
+ disabled: unref(running)
479
+ }, null, _parent3, _scopeId2));
480
+ } else {
481
+ return [
482
+ createVNode(_component_USwitch, {
483
+ modelValue: unref(trace),
484
+ "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null,
485
+ disabled: unref(running)
486
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
487
+ ];
488
+ }
489
+ }),
490
+ _: 1
491
+ }, _parent2, _scopeId));
492
+ _push2(`</div><div class="space-y-1"${_scopeId}><div class="text-xs text-muted"${_scopeId}>Runs in the linked folder</div>`);
493
+ _push2(ssrRenderComponent(_component_CodeBlock, {
494
+ code: unref(preview),
495
+ lang: "sh"
496
+ }, null, _parent2, _scopeId));
497
+ _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>`);
498
+ if (unref(status) !== "idle") {
499
+ _push2(`<div class="space-y-2"${_scopeId}><div class="h-64 overflow-y-auto rounded-md bg-zinc-950 p-3"${_scopeId}><!--[-->`);
500
+ ssrRenderList(unref(lines), (line, i) => {
501
+ _push2(`<p class="${ssrRenderClass([line.error ? "text-red-400" : "text-zinc-300", "font-mono text-xs whitespace-pre-wrap"])}"${_scopeId}>${ssrInterpolate(line.text || " ")}</p>`);
502
+ });
503
+ _push2(`<!--]--></div></div>`);
504
+ } else {
505
+ _push2(`<!---->`);
506
+ }
507
+ _push2(`<!--]-->`);
508
+ }
509
+ _push2(`</div>`);
510
+ } else {
511
+ return [
512
+ createVNode("div", { class: "space-y-4" }, [
513
+ !unref(linked) ? (openBlock(), createBlock("div", {
514
+ key: 0,
515
+ class: "space-y-3"
516
+ }, [
517
+ createVNode("p", { class: "text-sm text-muted" }, " Link " + toDisplayString(__props.projectLabel || "this project") + " to its local checkout — the folder that contains these tests. Piwi runs that folder's own Playwright with the app's bundled Node, so nothing else needs to be installed. ", 1),
518
+ unref(link) && !unref(link).exists ? (openBlock(), createBlock(_component_UAlert, {
519
+ key: 0,
520
+ color: "warning",
521
+ variant: "soft",
522
+ icon: "i-lucide-folder-x",
523
+ title: "The linked folder no longer exists",
524
+ description: unref(link).path
525
+ }, null, 8, ["description"])) : createCommentVNode("", true),
526
+ createVNode(_component_UButton, {
527
+ icon: "i-lucide-folder-plus",
528
+ loading: unref(busy),
529
+ onClick: unref(pickAndLink)
530
+ }, {
531
+ default: withCtx(() => [
532
+ createTextVNode("Choose folder…")
533
+ ]),
534
+ _: 1
535
+ }, 8, ["loading", "onClick"])
536
+ ])) : (openBlock(), createBlock(Fragment, { key: 1 }, [
537
+ createVNode("div", { class: "flex items-center justify-between gap-3" }, [
538
+ createVNode("div", { class: "flex items-center gap-2 min-w-0 text-sm" }, [
539
+ createVNode(_component_UIcon, {
540
+ name: "i-lucide-folder-check",
541
+ class: "size-4 text-success shrink-0"
542
+ }),
543
+ createVNode("code", { class: "text-xs break-all" }, toDisplayString(unref(link)?.path), 1)
544
+ ]),
545
+ createVNode(_component_UButton, {
546
+ size: "xs",
547
+ color: "neutral",
548
+ variant: "ghost",
549
+ icon: "i-lucide-folder-search",
550
+ loading: unref(busy),
551
+ disabled: unref(running),
552
+ onClick: unref(pickAndLink)
553
+ }, {
554
+ default: withCtx(() => [
555
+ createTextVNode(" Change ")
556
+ ]),
557
+ _: 1
558
+ }, 8, ["loading", "disabled", "onClick"])
559
+ ]),
560
+ createVNode("div", { class: "grid grid-cols-2 gap-3" }, [
561
+ createVNode(_component_UFormField, {
562
+ label: "Select tests by",
563
+ name: "mode"
564
+ }, {
565
+ default: withCtx(() => [
566
+ createVNode(_component_USelect, {
567
+ modelValue: unref(mode),
568
+ "onUpdate:modelValue": ($event) => isRef(mode) ? mode.value = $event : null,
569
+ items: modeItems,
570
+ disabled: unref(running),
571
+ class: "w-full"
572
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
573
+ ]),
574
+ _: 1
575
+ }),
576
+ createVNode(_component_UFormField, {
577
+ label: "Browser",
578
+ name: "runMode"
579
+ }, {
580
+ default: withCtx(() => [
581
+ createVNode(_component_USelect, {
582
+ modelValue: unref(runMode),
583
+ "onUpdate:modelValue": ($event) => isRef(runMode) ? runMode.value = $event : null,
584
+ items: runModeItems,
585
+ disabled: unref(running),
586
+ class: "w-full"
587
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
588
+ ]),
589
+ _: 1
590
+ }),
591
+ createVNode(_component_UFormField, {
592
+ label: "Repeat each",
593
+ name: "repeatEach",
594
+ description: "Run every test N times — flake reproduction."
595
+ }, {
596
+ default: withCtx(() => [
597
+ createVNode(_component_UInput, {
598
+ modelValue: unref(repeatEach),
599
+ "onUpdate:modelValue": ($event) => isRef(repeatEach) ? repeatEach.value = $event : null,
600
+ modelModifiers: { number: true },
601
+ type: "number",
602
+ min: "1",
603
+ max: "1000",
604
+ disabled: unref(running),
605
+ class: "w-full"
606
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
607
+ ]),
608
+ _: 1
609
+ }),
610
+ createVNode(_component_UFormField, {
611
+ label: "Trace",
612
+ name: "trace",
613
+ description: "Force trace recording (--trace=on)."
614
+ }, {
615
+ default: withCtx(() => [
616
+ createVNode(_component_USwitch, {
617
+ modelValue: unref(trace),
618
+ "onUpdate:modelValue": ($event) => isRef(trace) ? trace.value = $event : null,
619
+ disabled: unref(running)
620
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "disabled"])
621
+ ]),
622
+ _: 1
623
+ })
624
+ ]),
625
+ createVNode("div", { class: "space-y-1" }, [
626
+ createVNode("div", { class: "text-xs text-muted" }, "Runs in the linked folder"),
627
+ createVNode(_component_CodeBlock, {
628
+ code: unref(preview),
629
+ lang: "sh"
630
+ }, null, 8, ["code"])
631
+ ]),
632
+ 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. "),
633
+ unref(status) !== "idle" ? (openBlock(), createBlock("div", {
634
+ key: 0,
635
+ class: "space-y-2"
636
+ }, [
637
+ createVNode("div", {
638
+ ref_key: "outputEl",
639
+ ref: outputEl,
640
+ class: "h-64 overflow-y-auto rounded-md bg-zinc-950 p-3"
641
+ }, [
642
+ (openBlock(true), createBlock(Fragment, null, renderList(unref(lines), (line, i) => {
643
+ return openBlock(), createBlock("p", {
644
+ key: i,
645
+ class: ["font-mono text-xs whitespace-pre-wrap", line.error ? "text-red-400" : "text-zinc-300"]
646
+ }, toDisplayString(line.text || " "), 3);
647
+ }), 128))
648
+ ], 512)
649
+ ])) : createCommentVNode("", true)
650
+ ], 64))
651
+ ])
652
+ ];
653
+ }
654
+ }),
655
+ footer: withCtx((_, _push2, _parent2, _scopeId) => {
656
+ if (_push2) {
657
+ _push2(`<div class="flex items-center justify-between w-full gap-3"${_scopeId}>`);
658
+ if (unref(statusBadge)) {
659
+ _push2(ssrRenderComponent(_component_UBadge, {
660
+ color: unref(statusBadge).color,
661
+ variant: "subtle"
662
+ }, {
663
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
664
+ if (_push3) {
665
+ _push3(`${ssrInterpolate(unref(statusBadge).label)}`);
666
+ } else {
667
+ return [
668
+ createTextVNode(toDisplayString(unref(statusBadge).label), 1)
669
+ ];
670
+ }
671
+ }),
672
+ _: 1
673
+ }, _parent2, _scopeId));
674
+ } else {
675
+ _push2(`<span${_scopeId}></span>`);
676
+ }
677
+ _push2(`<div class="flex items-center gap-2"${_scopeId}>`);
678
+ _push2(ssrRenderComponent(_component_UButton, {
679
+ color: "neutral",
680
+ variant: "ghost",
681
+ onClick: ($event) => open.value = false
682
+ }, {
683
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
684
+ if (_push3) {
685
+ _push3(`Close`);
686
+ } else {
687
+ return [
688
+ createTextVNode("Close")
689
+ ];
690
+ }
691
+ }),
692
+ _: 1
693
+ }, _parent2, _scopeId));
694
+ if (unref(running)) {
695
+ _push2(ssrRenderComponent(_component_UButton, {
696
+ color: "error",
697
+ icon: "i-lucide-square",
698
+ onClick: ($event) => unref(stop)()
699
+ }, {
700
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
701
+ if (_push3) {
702
+ _push3(`Stop`);
703
+ } else {
704
+ return [
705
+ createTextVNode("Stop")
706
+ ];
707
+ }
708
+ }),
709
+ _: 1
710
+ }, _parent2, _scopeId));
711
+ } else {
712
+ _push2(ssrRenderComponent(_component_UButton, {
713
+ icon: "i-lucide-play",
714
+ disabled: !unref(linked) || unref(plan).length === 0 || unref(busy),
715
+ onClick: ($event) => run()
716
+ }, {
717
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
718
+ if (_push3) {
719
+ _push3(`${ssrInterpolate(unref(status) === "idle" ? "Run" : "Run again")}`);
720
+ } else {
721
+ return [
722
+ createTextVNode(toDisplayString(unref(status) === "idle" ? "Run" : "Run again"), 1)
723
+ ];
724
+ }
725
+ }),
726
+ _: 1
727
+ }, _parent2, _scopeId));
728
+ }
729
+ _push2(`</div></div>`);
730
+ } else {
731
+ return [
732
+ createVNode("div", { class: "flex items-center justify-between w-full gap-3" }, [
733
+ unref(statusBadge) ? (openBlock(), createBlock(_component_UBadge, {
734
+ key: 0,
735
+ color: unref(statusBadge).color,
736
+ variant: "subtle"
737
+ }, {
738
+ default: withCtx(() => [
739
+ createTextVNode(toDisplayString(unref(statusBadge).label), 1)
740
+ ]),
741
+ _: 1
742
+ }, 8, ["color"])) : (openBlock(), createBlock("span", { key: 1 })),
743
+ createVNode("div", { class: "flex items-center gap-2" }, [
744
+ createVNode(_component_UButton, {
745
+ color: "neutral",
746
+ variant: "ghost",
747
+ onClick: ($event) => open.value = false
748
+ }, {
749
+ default: withCtx(() => [
750
+ createTextVNode("Close")
751
+ ]),
752
+ _: 1
753
+ }, 8, ["onClick"]),
754
+ unref(running) ? (openBlock(), createBlock(_component_UButton, {
755
+ key: 0,
756
+ color: "error",
757
+ icon: "i-lucide-square",
758
+ onClick: ($event) => unref(stop)()
759
+ }, {
760
+ default: withCtx(() => [
761
+ createTextVNode("Stop")
762
+ ]),
763
+ _: 1
764
+ }, 8, ["onClick"])) : (openBlock(), createBlock(_component_UButton, {
765
+ key: 1,
766
+ icon: "i-lucide-play",
767
+ disabled: !unref(linked) || unref(plan).length === 0 || unref(busy),
768
+ onClick: ($event) => run()
769
+ }, {
770
+ default: withCtx(() => [
771
+ createTextVNode(toDisplayString(unref(status) === "idle" ? "Run" : "Run again"), 1)
772
+ ]),
773
+ _: 1
774
+ }, 8, ["disabled", "onClick"]))
775
+ ])
776
+ ])
777
+ ];
778
+ }
779
+ }),
780
+ _: 1
781
+ }, _parent));
782
+ };
783
+ }
784
+ });
785
+ const _sfc_setup$6 = _sfc_main$6.setup;
786
+ _sfc_main$6.setup = (props, ctx) => {
787
+ const ssrContext = useSSRContext();
788
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/desktop/DesktopRunLocallyModal.vue");
789
+ return _sfc_setup$6 ? _sfc_setup$6(props, ctx) : void 0;
790
+ };
791
+ const __nuxt_component_2 = Object.assign(_sfc_main$6, { __name: "DesktopRunLocallyModal" });
792
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
793
+ __name: "DesktopRunLocallyButton",
794
+ __ssrInlineRender: true,
795
+ props: {
796
+ projectId: {},
797
+ projectLabel: {},
798
+ cases: {}
799
+ },
800
+ setup(__props) {
801
+ const props = __props;
802
+ const available = ref(false);
803
+ const open = ref(false);
804
+ const canRun = computed(() => available.value && props.projectId != null && props.cases.length > 0);
805
+ return (_ctx, _push, _parent, _attrs) => {
806
+ const _component_UTooltip = _sfc_main$9;
807
+ const _component_UButton = _sfc_main$k;
808
+ const _component_DesktopRunLocallyModal = __nuxt_component_2;
809
+ if (unref(canRun)) {
810
+ _push(`<span${ssrRenderAttrs(mergeProps({ class: "inline-flex" }, _attrs))}>`);
811
+ _push(ssrRenderComponent(_component_UTooltip, { text: "Run these tests on this machine" }, {
812
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
813
+ if (_push2) {
814
+ _push2(ssrRenderComponent(_component_UButton, {
815
+ size: "xs",
816
+ color: "warning",
817
+ variant: "subtle",
818
+ icon: "i-lucide-monitor-play",
819
+ onClick: ($event) => open.value = true
820
+ }, {
821
+ default: withCtx((_2, _push3, _parent3, _scopeId2) => {
822
+ if (_push3) {
823
+ _push3(` Run locally `);
824
+ } else {
825
+ return [
826
+ createTextVNode(" Run locally ")
827
+ ];
828
+ }
829
+ }),
830
+ _: 1
831
+ }, _parent2, _scopeId));
832
+ } else {
833
+ return [
834
+ createVNode(_component_UButton, {
835
+ size: "xs",
836
+ color: "warning",
837
+ variant: "subtle",
838
+ icon: "i-lucide-monitor-play",
839
+ onClick: ($event) => open.value = true
840
+ }, {
841
+ default: withCtx(() => [
842
+ createTextVNode(" Run locally ")
843
+ ]),
844
+ _: 1
845
+ }, 8, ["onClick"])
846
+ ];
847
+ }
848
+ }),
849
+ _: 1
850
+ }, _parent));
851
+ _push(ssrRenderComponent(_component_DesktopRunLocallyModal, {
852
+ open: unref(open),
853
+ "onUpdate:open": ($event) => isRef(open) ? open.value = $event : null,
854
+ "project-id": __props.projectId,
855
+ "project-label": __props.projectLabel,
856
+ cases: __props.cases
857
+ }, null, _parent));
858
+ _push(`</span>`);
859
+ } else {
860
+ _push(`<!---->`);
861
+ }
862
+ };
863
+ }
864
+ });
865
+ const _sfc_setup$5 = _sfc_main$5.setup;
866
+ _sfc_main$5.setup = (props, ctx) => {
867
+ const ssrContext = useSSRContext();
868
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/desktop/DesktopRunLocallyButton.vue");
869
+ return _sfc_setup$5 ? _sfc_setup$5(props, ctx) : void 0;
870
+ };
871
+ const __nuxt_component_13 = Object.assign(_sfc_main$5, { __name: "DesktopRunLocallyButton" });
872
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
873
+ __name: "DetailPageLayout",
874
+ __ssrInlineRender: true,
875
+ props: /* @__PURE__ */ mergeModels({
876
+ tabItems: {},
877
+ tabPanelClass: {}
878
+ }, {
879
+ "modelValue": { required: true },
880
+ "modelModifiers": {}
881
+ }),
882
+ emits: ["update:modelValue"],
883
+ setup(__props) {
884
+ const props = __props;
885
+ const activeTab = useModel(__props, "modelValue");
886
+ const summaryCollapsed = ref(false);
887
+ const activeTabIcon = computed(() => props.tabItems.find((t) => t.value === activeTab.value)?.icon);
888
+ function panelClasses(value) {
889
+ const desktop = props.tabPanelClass?.[value] ?? "overflow-y-auto";
890
+ return ["min-h-0", "lg:flex-1", desktop, "max-lg:!block", "max-lg:!overflow-visible"];
891
+ }
892
+ return (_ctx, _push, _parent, _attrs) => {
893
+ const _component_UIcon = _sfc_main$p;
894
+ const _component_USelect = _sfc_main$7;
895
+ const _component_UTabs = _sfc_main$8;
896
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex flex-col h-full gap-4 p-1 max-lg:overflow-y-auto lg:overflow-hidden" }, _attrs))}>`);
897
+ if (_ctx.$slots.summary) {
898
+ _push(`<div class="lg:shrink-0"><div class="${ssrRenderClass(unref(summaryCollapsed) ? "max-lg:hidden" : "")}">`);
899
+ ssrRenderSlot(_ctx.$slots, "summary", {}, null, _push, _parent);
900
+ _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">`);
901
+ _push(ssrRenderComponent(_component_UIcon, {
902
+ name: unref(summaryCollapsed) ? "i-lucide-chevron-down" : "i-lucide-chevron-up",
903
+ class: "size-3.5"
904
+ }, null, _parent));
905
+ _push(` ${ssrInterpolate(unref(summaryCollapsed) ? "Show summary" : "Hide summary")}</button></div>`);
906
+ } else {
907
+ _push(`<!---->`);
908
+ }
909
+ _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">`);
910
+ _push(ssrRenderComponent(_component_USelect, {
911
+ modelValue: activeTab.value,
912
+ "onUpdate:modelValue": ($event) => activeTab.value = $event,
913
+ items: __props.tabItems,
914
+ icon: unref(activeTabIcon),
915
+ size: "md",
916
+ class: "w-full sm:hidden"
917
+ }, null, _parent));
918
+ _push(ssrRenderComponent(_component_UTabs, {
919
+ modelValue: activeTab.value,
920
+ "onUpdate:modelValue": ($event) => activeTab.value = $event,
921
+ items: __props.tabItems,
922
+ size: "sm",
923
+ class: "hidden sm:flex",
924
+ ui: { list: "overflow-x-auto", trigger: "shrink-0" }
925
+ }, null, _parent));
926
+ _push(`</div><!--[-->`);
927
+ ssrRenderList(__props.tabItems, (item) => {
928
+ _push(`<!--[-->`);
929
+ if (activeTab.value === item.value) {
930
+ _push(`<div class="${ssrRenderClass(panelClasses(item.value))}">`);
931
+ ssrRenderSlot(_ctx.$slots, `tab-${item.slot ?? item.value}`, {}, null, _push, _parent);
932
+ _push(`</div>`);
933
+ } else {
934
+ _push(`<!---->`);
935
+ }
936
+ _push(`<!--]-->`);
937
+ });
938
+ _push(`<!--]--></div>`);
939
+ };
940
+ }
941
+ });
942
+ const _sfc_setup$4 = _sfc_main$4.setup;
943
+ _sfc_main$4.setup = (props, ctx) => {
944
+ const ssrContext = useSSRContext();
945
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/DetailPageLayout.vue");
946
+ return _sfc_setup$4 ? _sfc_setup$4(props, ctx) : void 0;
947
+ };
948
+ const __nuxt_component_8 = Object.assign(_sfc_main$4, { __name: "DetailPageLayout" });
949
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
950
+ __name: "StatusBlock",
951
+ __ssrInlineRender: true,
952
+ props: {
953
+ status: {},
954
+ size: {}
955
+ },
956
+ setup(__props) {
957
+ return (_ctx, _push, _parent, _attrs) => {
958
+ const _component_UIcon = _sfc_main$p;
959
+ const _component_UBadge = _sfc_main$7$1;
960
+ _push(`<div${ssrRenderAttrs(mergeProps({ class: "flex items-center gap-2.5" }, _attrs))}><div class="${ssrRenderClass([[
961
+ __props.size === "sm" ? "size-7" : "size-8",
962
+ {
963
+ "bg-emerald-100 text-emerald-700 dark:bg-emerald-900/40 dark:text-emerald-400": __props.status === "passed",
964
+ "bg-rose-100 text-rose-700 dark:bg-rose-900/40 dark:text-rose-400": __props.status === "failed" || __props.status === "timedout",
965
+ "bg-zinc-100 text-zinc-600 dark:bg-zinc-800 dark:text-zinc-400": __props.status === "cancelled" || __props.status === "skipped",
966
+ "bg-amber-100 text-amber-700 dark:bg-amber-900/40 dark:text-amber-400": __props.status === "didnotrun",
967
+ "bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-400": __props.status === "running" || __props.status === "initialising" || __props.status === "finalizing"
968
+ }
969
+ ], "shrink-0 rounded-lg flex items-center justify-center"])}">`);
970
+ _push(ssrRenderComponent(_component_UIcon, {
971
+ name: ("getStatusIcon" in _ctx ? _ctx.getStatusIcon : unref(getStatusIcon))(__props.status),
972
+ class: [__props.size === "sm" ? "size-3.5" : "size-4.5", { "animate-spin": ("isStatusInFlight" in _ctx ? _ctx.isStatusInFlight : unref(isStatusInFlight))(__props.status) }]
973
+ }, null, _parent));
974
+ _push(`</div>`);
975
+ _push(ssrRenderComponent(_component_UBadge, {
976
+ color: ("getStatusColor" in _ctx ? _ctx.getStatusColor : unref(getStatusColor))(__props.status),
977
+ variant: "subtle",
978
+ class: "capitalize gap-1 items-center"
979
+ }, {
980
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
981
+ if (_push2) {
982
+ if (("isStatusInFlight" in _ctx ? _ctx.isStatusInFlight : unref(isStatusInFlight))(__props.status)) {
983
+ _push2(ssrRenderComponent(_component_UIcon, {
984
+ name: "i-lucide-loader-circle",
985
+ class: "size-3 animate-spin shrink-0"
986
+ }, null, _parent2, _scopeId));
987
+ } else {
988
+ _push2(`<!---->`);
989
+ }
990
+ _push2(` ${ssrInterpolate(("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(__props.status))}`);
991
+ } else {
992
+ return [
993
+ ("isStatusInFlight" in _ctx ? _ctx.isStatusInFlight : unref(isStatusInFlight))(__props.status) ? (openBlock(), createBlock(_component_UIcon, {
994
+ key: 0,
995
+ name: "i-lucide-loader-circle",
996
+ class: "size-3 animate-spin shrink-0"
997
+ })) : createCommentVNode("", true),
998
+ createTextVNode(" " + toDisplayString(("formatStatusLabel" in _ctx ? _ctx.formatStatusLabel : unref(formatStatusLabel))(__props.status)), 1)
999
+ ];
1000
+ }
1001
+ }),
1002
+ _: 1
1003
+ }, _parent));
1004
+ _push(`</div>`);
1005
+ };
1006
+ }
1007
+ });
1008
+ const _sfc_setup$3 = _sfc_main$3.setup;
1009
+ _sfc_main$3.setup = (props, ctx) => {
1010
+ const ssrContext = useSSRContext();
1011
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/StatusBlock.vue");
1012
+ return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
1013
+ };
1014
+ const __nuxt_component_1 = Object.assign(_sfc_main$3, { __name: "StatusBlock" });
1015
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1016
+ __name: "BlockCard",
1017
+ __ssrInlineRender: true,
1018
+ props: {
1019
+ title: {},
1020
+ icon: {},
1021
+ subtitle: {},
1022
+ iconClass: { default: "text-primary" },
1023
+ help: {}
1024
+ },
1025
+ setup(__props) {
1026
+ return (_ctx, _push, _parent, _attrs) => {
1027
+ const _component_UCard = _sfc_main$a;
1028
+ const _component_UIcon = _sfc_main$p;
1029
+ const _component_HelpHint = __nuxt_component_2$1;
1030
+ _push(ssrRenderComponent(_component_UCard, mergeProps({
1031
+ class: "shadow-xs",
1032
+ ui: { header: "px-3 py-2.5 sm:px-3", body: "p-3 sm:p-3" }
1033
+ }, _attrs), createSlots({
1034
+ header: withCtx((_, _push2, _parent2, _scopeId) => {
1035
+ if (_push2) {
1036
+ _push2(`<div class="flex items-start justify-between gap-2"${_scopeId}><div class="flex items-center gap-2 min-w-0"${_scopeId}>`);
1037
+ if (__props.icon) {
1038
+ _push2(ssrRenderComponent(_component_UIcon, {
1039
+ name: __props.icon,
1040
+ class: ["w-4 h-4 shrink-0", __props.iconClass]
1041
+ }, null, _parent2, _scopeId));
1042
+ } else {
1043
+ _push2(`<!---->`);
1044
+ }
1045
+ _push2(`<div class="min-w-0"${_scopeId}><span class="text-sm font-medium inline-flex items-center gap-1"${_scopeId}>${ssrInterpolate(__props.title)}`);
1046
+ if (__props.help) {
1047
+ _push2(ssrRenderComponent(_component_HelpHint, { topic: __props.help }, null, _parent2, _scopeId));
1048
+ } else {
1049
+ _push2(`<!---->`);
1050
+ }
1051
+ _push2(`</span>`);
1052
+ if (__props.subtitle || _ctx.$slots.subtitle) {
1053
+ _push2(`<p class="text-xs text-gray-400 mt-0.5"${_scopeId}>`);
1054
+ ssrRenderSlot(_ctx.$slots, "subtitle", {}, () => {
1055
+ _push2(`${ssrInterpolate(__props.subtitle)}`);
1056
+ }, _push2, _parent2, _scopeId);
1057
+ _push2(`</p>`);
1058
+ } else {
1059
+ _push2(`<!---->`);
1060
+ }
1061
+ _push2(`</div></div>`);
1062
+ if (_ctx.$slots.actions) {
1063
+ _push2(`<div class="flex items-center gap-1 shrink-0"${_scopeId}>`);
1064
+ ssrRenderSlot(_ctx.$slots, "actions", {}, null, _push2, _parent2, _scopeId);
1065
+ _push2(`</div>`);
1066
+ } else {
1067
+ _push2(`<!---->`);
1068
+ }
1069
+ _push2(`</div>`);
1070
+ } else {
1071
+ return [
1072
+ createVNode("div", { class: "flex items-start justify-between gap-2" }, [
1073
+ createVNode("div", { class: "flex items-center gap-2 min-w-0" }, [
1074
+ __props.icon ? (openBlock(), createBlock(_component_UIcon, {
1075
+ key: 0,
1076
+ name: __props.icon,
1077
+ class: ["w-4 h-4 shrink-0", __props.iconClass]
1078
+ }, null, 8, ["name", "class"])) : createCommentVNode("", true),
1079
+ createVNode("div", { class: "min-w-0" }, [
1080
+ createVNode("span", { class: "text-sm font-medium inline-flex items-center gap-1" }, [
1081
+ createTextVNode(toDisplayString(__props.title), 1),
1082
+ __props.help ? (openBlock(), createBlock(_component_HelpHint, {
1083
+ key: 0,
1084
+ topic: __props.help
1085
+ }, null, 8, ["topic"])) : createCommentVNode("", true)
1086
+ ]),
1087
+ __props.subtitle || _ctx.$slots.subtitle ? (openBlock(), createBlock("p", {
1088
+ key: 0,
1089
+ class: "text-xs text-gray-400 mt-0.5"
1090
+ }, [
1091
+ renderSlot(_ctx.$slots, "subtitle", {}, () => [
1092
+ createTextVNode(toDisplayString(__props.subtitle), 1)
1093
+ ])
1094
+ ])) : createCommentVNode("", true)
1095
+ ])
1096
+ ]),
1097
+ _ctx.$slots.actions ? (openBlock(), createBlock("div", {
1098
+ key: 0,
1099
+ class: "flex items-center gap-1 shrink-0"
1100
+ }, [
1101
+ renderSlot(_ctx.$slots, "actions")
1102
+ ])) : createCommentVNode("", true)
1103
+ ])
1104
+ ];
1105
+ }
1106
+ }),
1107
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1108
+ if (_push2) {
1109
+ ssrRenderSlot(_ctx.$slots, "default", {}, null, _push2, _parent2, _scopeId);
1110
+ } else {
1111
+ return [
1112
+ renderSlot(_ctx.$slots, "default")
1113
+ ];
1114
+ }
1115
+ }),
1116
+ _: 2
1117
+ }, [
1118
+ _ctx.$slots.footer ? {
1119
+ name: "footer",
1120
+ fn: withCtx((_, _push2, _parent2, _scopeId) => {
1121
+ if (_push2) {
1122
+ ssrRenderSlot(_ctx.$slots, "footer", {}, null, _push2, _parent2, _scopeId);
1123
+ } else {
1124
+ return [
1125
+ renderSlot(_ctx.$slots, "footer")
1126
+ ];
1127
+ }
1128
+ }),
1129
+ key: "0"
1130
+ } : void 0
1131
+ ]), _parent));
1132
+ };
1133
+ }
1134
+ });
1135
+ const _sfc_setup$2 = _sfc_main$2.setup;
1136
+ _sfc_main$2.setup = (props, ctx) => {
1137
+ const ssrContext = useSSRContext();
1138
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/BlockCard.vue");
1139
+ return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
1140
+ };
1141
+ const __nuxt_component_16 = Object.assign(_sfc_main$2, { __name: "BlockCard" });
1142
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1143
+ __name: "SourceInfoCard",
1144
+ __ssrInlineRender: true,
1145
+ props: {
1146
+ scm: {},
1147
+ class: {}
1148
+ },
1149
+ setup(__props) {
1150
+ return (_ctx, _push, _parent, _attrs) => {
1151
+ const _component_BlockCard = __nuxt_component_16;
1152
+ const _component_UIcon = _sfc_main$p;
1153
+ _push(ssrRenderComponent(_component_BlockCard, mergeProps({
1154
+ class: _ctx.$props.class,
1155
+ title: "Source",
1156
+ icon: "i-lucide-git-branch"
1157
+ }, _attrs), {
1158
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1159
+ if (_push2) {
1160
+ _push2(`<div class="space-y-1.5 text-sm"${_scopeId}>`);
1161
+ if (__props.scm.branch || __props.scm.commit || __props.scm.author) {
1162
+ _push2(`<div class="flex items-center gap-x-3 gap-y-1 flex-wrap"${_scopeId}>`);
1163
+ if (__props.scm.branch) {
1164
+ _push2(`<span class="flex items-center gap-1.5"${_scopeId}>`);
1165
+ _push2(ssrRenderComponent(_component_UIcon, {
1166
+ name: "i-lucide-git-branch",
1167
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1168
+ }, null, _parent2, _scopeId));
1169
+ _push2(`<span class="font-medium"${_scopeId}>${ssrInterpolate(__props.scm.branch)}</span></span>`);
1170
+ } else {
1171
+ _push2(`<!---->`);
1172
+ }
1173
+ if (__props.scm.commit) {
1174
+ _push2(`<span class="flex items-center gap-1.5"${_scopeId}>`);
1175
+ _push2(ssrRenderComponent(_component_UIcon, {
1176
+ name: "i-lucide-git-commit-horizontal",
1177
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1178
+ }, null, _parent2, _scopeId));
1179
+ _push2(`<code class="text-xs font-mono bg-gray-100 dark:bg-gray-800 px-1 rounded"${_scopeId}>${ssrInterpolate(__props.scm.commit.length >= 8 ? __props.scm.commit.substring(0, 8) : __props.scm.commit)}</code></span>`);
1180
+ } else {
1181
+ _push2(`<!---->`);
1182
+ }
1183
+ if (__props.scm.author) {
1184
+ _push2(`<span class="flex items-center gap-1.5"${_scopeId}>`);
1185
+ _push2(ssrRenderComponent(_component_UIcon, {
1186
+ name: "i-lucide-user",
1187
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1188
+ }, null, _parent2, _scopeId));
1189
+ _push2(`<span class="text-gray-600 dark:text-gray-400"${_scopeId}>${ssrInterpolate(__props.scm.author)}</span></span>`);
1190
+ } else {
1191
+ _push2(`<!---->`);
1192
+ }
1193
+ _push2(`</div>`);
1194
+ } else {
1195
+ _push2(`<!---->`);
1196
+ }
1197
+ if (__props.scm.commitMessage) {
1198
+ _push2(`<p class="text-gray-400 text-xs break-words"${_scopeId}>${ssrInterpolate(__props.scm.commitMessage)}</p>`);
1199
+ } else {
1200
+ _push2(`<!---->`);
1201
+ }
1202
+ _push2(`</div>`);
1203
+ } else {
1204
+ return [
1205
+ createVNode("div", { class: "space-y-1.5 text-sm" }, [
1206
+ __props.scm.branch || __props.scm.commit || __props.scm.author ? (openBlock(), createBlock("div", {
1207
+ key: 0,
1208
+ class: "flex items-center gap-x-3 gap-y-1 flex-wrap"
1209
+ }, [
1210
+ __props.scm.branch ? (openBlock(), createBlock("span", {
1211
+ key: 0,
1212
+ class: "flex items-center gap-1.5"
1213
+ }, [
1214
+ createVNode(_component_UIcon, {
1215
+ name: "i-lucide-git-branch",
1216
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1217
+ }),
1218
+ createVNode("span", { class: "font-medium" }, toDisplayString(__props.scm.branch), 1)
1219
+ ])) : createCommentVNode("", true),
1220
+ __props.scm.commit ? (openBlock(), createBlock("span", {
1221
+ key: 1,
1222
+ class: "flex items-center gap-1.5"
1223
+ }, [
1224
+ createVNode(_component_UIcon, {
1225
+ name: "i-lucide-git-commit-horizontal",
1226
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1227
+ }),
1228
+ createVNode("code", { class: "text-xs font-mono bg-gray-100 dark:bg-gray-800 px-1 rounded" }, toDisplayString(__props.scm.commit.length >= 8 ? __props.scm.commit.substring(0, 8) : __props.scm.commit), 1)
1229
+ ])) : createCommentVNode("", true),
1230
+ __props.scm.author ? (openBlock(), createBlock("span", {
1231
+ key: 2,
1232
+ class: "flex items-center gap-1.5"
1233
+ }, [
1234
+ createVNode(_component_UIcon, {
1235
+ name: "i-lucide-user",
1236
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1237
+ }),
1238
+ createVNode("span", { class: "text-gray-600 dark:text-gray-400" }, toDisplayString(__props.scm.author), 1)
1239
+ ])) : createCommentVNode("", true)
1240
+ ])) : createCommentVNode("", true),
1241
+ __props.scm.commitMessage ? (openBlock(), createBlock("p", {
1242
+ key: 1,
1243
+ class: "text-gray-400 text-xs break-words"
1244
+ }, toDisplayString(__props.scm.commitMessage), 1)) : createCommentVNode("", true)
1245
+ ])
1246
+ ];
1247
+ }
1248
+ }),
1249
+ _: 1
1250
+ }, _parent));
1251
+ };
1252
+ }
1253
+ });
1254
+ const _sfc_setup$1 = _sfc_main$1.setup;
1255
+ _sfc_main$1.setup = (props, ctx) => {
1256
+ const ssrContext = useSSRContext();
1257
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/SourceInfoCard.vue");
1258
+ return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
1259
+ };
1260
+ const __nuxt_component_15 = Object.assign(_sfc_main$1, { __name: "SourceInfoCard" });
1261
+ const _sfc_main = /* @__PURE__ */ defineComponent({
1262
+ __name: "CiEnvCard",
1263
+ __ssrInlineRender: true,
1264
+ props: {
1265
+ ci: {},
1266
+ environment: {},
1267
+ playwrightVersion: {},
1268
+ reporterVersion: {},
1269
+ browser: {},
1270
+ class: {}
1271
+ },
1272
+ setup(__props) {
1273
+ return (_ctx, _push, _parent, _attrs) => {
1274
+ const _component_BlockCard = __nuxt_component_16;
1275
+ const _component_UIcon = _sfc_main$p;
1276
+ const _component_BrowserBadge = __nuxt_component_3;
1277
+ _push(ssrRenderComponent(_component_BlockCard, mergeProps({
1278
+ class: _ctx.$props.class,
1279
+ title: "CI / Env",
1280
+ icon: "i-lucide-cloud",
1281
+ help: "run.ci-env"
1282
+ }, _attrs), {
1283
+ default: withCtx((_, _push2, _parent2, _scopeId) => {
1284
+ if (_push2) {
1285
+ _push2(`<div class="space-y-1.5 text-sm"${_scopeId}>`);
1286
+ if (__props.environment || __props.ci?.provider) {
1287
+ _push2(`<div class="flex items-center gap-x-2 gap-y-1 flex-wrap"${_scopeId}>`);
1288
+ _push2(ssrRenderComponent(_component_UIcon, {
1289
+ name: "i-lucide-cloud",
1290
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1291
+ }, null, _parent2, _scopeId));
1292
+ if (__props.environment) {
1293
+ _push2(`<span class="rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"${_scopeId}>${ssrInterpolate(__props.environment)}</span>`);
1294
+ } else {
1295
+ _push2(`<!---->`);
1296
+ }
1297
+ if (__props.ci?.provider) {
1298
+ _push2(`<span${_scopeId}>${ssrInterpolate(__props.ci.provider)}</span>`);
1299
+ } else {
1300
+ _push2(`<!---->`);
1301
+ }
1302
+ _push2(`</div>`);
1303
+ } else {
1304
+ _push2(`<!---->`);
1305
+ }
1306
+ if (__props.ci?.buildNumber || __props.ci?.buildUrl) {
1307
+ _push2(`<div class="flex items-center gap-1.5"${_scopeId}>`);
1308
+ _push2(ssrRenderComponent(_component_UIcon, {
1309
+ name: "i-lucide-hash",
1310
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1311
+ }, null, _parent2, _scopeId));
1312
+ if (__props.ci?.buildUrl) {
1313
+ _push2(`<a${ssrRenderAttr("href", __props.ci.buildUrl)} target="_blank" class="text-primary hover:underline"${_scopeId}>${ssrInterpolate(__props.ci?.buildNumber ? `Build #${__props.ci.buildNumber}` : "View build")}</a>`);
1314
+ } else {
1315
+ _push2(`<span${_scopeId}>Build #${ssrInterpolate(__props.ci.buildNumber)}</span>`);
1316
+ }
1317
+ _push2(`</div>`);
1318
+ } else {
1319
+ _push2(`<!---->`);
1320
+ }
1321
+ if (__props.ci?.workflow || __props.ci?.jobName) {
1322
+ _push2(`<div class="flex items-center gap-x-1.5 gap-y-1 flex-wrap"${_scopeId}>`);
1323
+ _push2(ssrRenderComponent(_component_UIcon, {
1324
+ name: "i-lucide-workflow",
1325
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1326
+ }, null, _parent2, _scopeId));
1327
+ if (__props.ci?.workflow) {
1328
+ _push2(`<span${_scopeId}>${ssrInterpolate(__props.ci.workflow)}</span>`);
1329
+ } else {
1330
+ _push2(`<!---->`);
1331
+ }
1332
+ if (__props.ci?.workflow && __props.ci?.jobName) {
1333
+ _push2(`<span class="text-gray-300 dark:text-gray-600"${_scopeId}>·</span>`);
1334
+ } else {
1335
+ _push2(`<!---->`);
1336
+ }
1337
+ if (__props.ci?.jobName) {
1338
+ _push2(`<span${_scopeId}>${ssrInterpolate(__props.ci.jobName)}</span>`);
1339
+ } else {
1340
+ _push2(`<!---->`);
1341
+ }
1342
+ _push2(`</div>`);
1343
+ } else {
1344
+ _push2(`<!---->`);
1345
+ }
1346
+ if (__props.playwrightVersion || __props.reporterVersion) {
1347
+ _push2(`<div class="flex items-center gap-x-1.5 gap-y-1 flex-wrap"${_scopeId}>`);
1348
+ _push2(ssrRenderComponent(_component_UIcon, {
1349
+ name: "i-lucide-tag",
1350
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1351
+ }, null, _parent2, _scopeId));
1352
+ if (__props.playwrightVersion) {
1353
+ _push2(`<span${_scopeId}>Playwright v${ssrInterpolate(__props.playwrightVersion)}</span>`);
1354
+ } else {
1355
+ _push2(`<!---->`);
1356
+ }
1357
+ if (__props.playwrightVersion && __props.reporterVersion) {
1358
+ _push2(`<span class="text-gray-300 dark:text-gray-600"${_scopeId}>·</span>`);
1359
+ } else {
1360
+ _push2(`<!---->`);
1361
+ }
1362
+ if (__props.reporterVersion) {
1363
+ _push2(`<span${_scopeId}>Piwi v${ssrInterpolate(__props.reporterVersion)}</span>`);
1364
+ } else {
1365
+ _push2(`<!---->`);
1366
+ }
1367
+ _push2(`</div>`);
1368
+ } else {
1369
+ _push2(`<!---->`);
1370
+ }
1371
+ if (__props.browser) {
1372
+ _push2(`<div class="flex items-center gap-1.5"${_scopeId}>`);
1373
+ _push2(ssrRenderComponent(_component_BrowserBadge, {
1374
+ browser: { ...__props.browser, viewport: void 0 },
1375
+ size: "sm"
1376
+ }, null, _parent2, _scopeId));
1377
+ if (__props.browser.viewport) {
1378
+ _push2(`<span class="tabular-nums"${_scopeId}>${ssrInterpolate(__props.browser.viewport.width)}×${ssrInterpolate(__props.browser.viewport.height)} `);
1379
+ if (__props.browser.deviceScaleFactor && __props.browser.deviceScaleFactor !== 1) {
1380
+ _push2(`<span class="text-gray-400"${_scopeId}>@${ssrInterpolate(__props.browser.deviceScaleFactor)}x</span>`);
1381
+ } else {
1382
+ _push2(`<!---->`);
1383
+ }
1384
+ _push2(`</span>`);
1385
+ } else {
1386
+ _push2(`<!---->`);
1387
+ }
1388
+ _push2(`</div>`);
1389
+ } else {
1390
+ _push2(`<!---->`);
1391
+ }
1392
+ _push2(`</div>`);
1393
+ } else {
1394
+ return [
1395
+ createVNode("div", { class: "space-y-1.5 text-sm" }, [
1396
+ __props.environment || __props.ci?.provider ? (openBlock(), createBlock("div", {
1397
+ key: 0,
1398
+ class: "flex items-center gap-x-2 gap-y-1 flex-wrap"
1399
+ }, [
1400
+ createVNode(_component_UIcon, {
1401
+ name: "i-lucide-cloud",
1402
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1403
+ }),
1404
+ __props.environment ? (openBlock(), createBlock("span", {
1405
+ key: 0,
1406
+ class: "rounded-full border border-default px-2 py-0.5 text-xs bg-elevated/60"
1407
+ }, toDisplayString(__props.environment), 1)) : createCommentVNode("", true),
1408
+ __props.ci?.provider ? (openBlock(), createBlock("span", { key: 1 }, toDisplayString(__props.ci.provider), 1)) : createCommentVNode("", true)
1409
+ ])) : createCommentVNode("", true),
1410
+ __props.ci?.buildNumber || __props.ci?.buildUrl ? (openBlock(), createBlock("div", {
1411
+ key: 1,
1412
+ class: "flex items-center gap-1.5"
1413
+ }, [
1414
+ createVNode(_component_UIcon, {
1415
+ name: "i-lucide-hash",
1416
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1417
+ }),
1418
+ __props.ci?.buildUrl ? (openBlock(), createBlock("a", {
1419
+ key: 0,
1420
+ href: __props.ci.buildUrl,
1421
+ target: "_blank",
1422
+ class: "text-primary hover:underline"
1423
+ }, toDisplayString(__props.ci?.buildNumber ? `Build #${__props.ci.buildNumber}` : "View build"), 9, ["href"])) : (openBlock(), createBlock("span", { key: 1 }, "Build #" + toDisplayString(__props.ci.buildNumber), 1))
1424
+ ])) : createCommentVNode("", true),
1425
+ __props.ci?.workflow || __props.ci?.jobName ? (openBlock(), createBlock("div", {
1426
+ key: 2,
1427
+ class: "flex items-center gap-x-1.5 gap-y-1 flex-wrap"
1428
+ }, [
1429
+ createVNode(_component_UIcon, {
1430
+ name: "i-lucide-workflow",
1431
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1432
+ }),
1433
+ __props.ci?.workflow ? (openBlock(), createBlock("span", { key: 0 }, toDisplayString(__props.ci.workflow), 1)) : createCommentVNode("", true),
1434
+ __props.ci?.workflow && __props.ci?.jobName ? (openBlock(), createBlock("span", {
1435
+ key: 1,
1436
+ class: "text-gray-300 dark:text-gray-600"
1437
+ }, "·")) : createCommentVNode("", true),
1438
+ __props.ci?.jobName ? (openBlock(), createBlock("span", { key: 2 }, toDisplayString(__props.ci.jobName), 1)) : createCommentVNode("", true)
1439
+ ])) : createCommentVNode("", true),
1440
+ __props.playwrightVersion || __props.reporterVersion ? (openBlock(), createBlock("div", {
1441
+ key: 3,
1442
+ class: "flex items-center gap-x-1.5 gap-y-1 flex-wrap"
1443
+ }, [
1444
+ createVNode(_component_UIcon, {
1445
+ name: "i-lucide-tag",
1446
+ class: "w-3.5 h-3.5 text-gray-400 shrink-0"
1447
+ }),
1448
+ __props.playwrightVersion ? (openBlock(), createBlock("span", { key: 0 }, "Playwright v" + toDisplayString(__props.playwrightVersion), 1)) : createCommentVNode("", true),
1449
+ __props.playwrightVersion && __props.reporterVersion ? (openBlock(), createBlock("span", {
1450
+ key: 1,
1451
+ class: "text-gray-300 dark:text-gray-600"
1452
+ }, "·")) : createCommentVNode("", true),
1453
+ __props.reporterVersion ? (openBlock(), createBlock("span", { key: 2 }, "Piwi v" + toDisplayString(__props.reporterVersion), 1)) : createCommentVNode("", true)
1454
+ ])) : createCommentVNode("", true),
1455
+ __props.browser ? (openBlock(), createBlock("div", {
1456
+ key: 4,
1457
+ class: "flex items-center gap-1.5"
1458
+ }, [
1459
+ createVNode(_component_BrowserBadge, {
1460
+ browser: { ...__props.browser, viewport: void 0 },
1461
+ size: "sm"
1462
+ }, null, 8, ["browser"]),
1463
+ __props.browser.viewport ? (openBlock(), createBlock("span", {
1464
+ key: 0,
1465
+ class: "tabular-nums"
1466
+ }, [
1467
+ createTextVNode(toDisplayString(__props.browser.viewport.width) + "×" + toDisplayString(__props.browser.viewport.height) + " ", 1),
1468
+ __props.browser.deviceScaleFactor && __props.browser.deviceScaleFactor !== 1 ? (openBlock(), createBlock("span", {
1469
+ key: 0,
1470
+ class: "text-gray-400"
1471
+ }, "@" + toDisplayString(__props.browser.deviceScaleFactor) + "x", 1)) : createCommentVNode("", true)
1472
+ ])) : createCommentVNode("", true)
1473
+ ])) : createCommentVNode("", true)
1474
+ ])
1475
+ ];
1476
+ }
1477
+ }),
1478
+ _: 1
1479
+ }, _parent));
1480
+ };
1481
+ }
1482
+ });
1483
+ const _sfc_setup = _sfc_main.setup;
1484
+ _sfc_main.setup = (props, ctx) => {
1485
+ const ssrContext = useSSRContext();
1486
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/shared/CiEnvCard.vue");
1487
+ return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
1488
+ };
1489
+ const __nuxt_component_14 = Object.assign(_sfc_main, { __name: "CiEnvCard" });
1490
+
1491
+ export { __nuxt_component_8 as _, __nuxt_component_13 as a, __nuxt_component_1 as b, __nuxt_component_15 as c, __nuxt_component_14 as d, __nuxt_component_16 as e };
1492
+ //# sourceMappingURL=CiEnvCard-DB5DvBh1.mjs.map